diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..da4f0bd --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +.idea +integration_tests/ +ezp/Io +ezp/Persistence +ezp/PublicAPI +config.php +ezc +/nbproject/private/ +doc/apidoc/ +docblox.xml +composer.phar +/vendor/ +var/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3db191b --- /dev/null +++ b/.travis.yml @@ -0,0 +1,33 @@ +language: php + +# run tests on both php 5.3 and 5.4 +php: +# - "5.4" + - "5.3" + +# execute unit tests, integration test stubs and integration tests using legacy storage engine +env: + - TEST_CONFIG="phpunit.xml" +# - TEST_CONFIG="phpunit-integration.xml" + - TEST_CONFIG="phpunit-integration-legacy.xml" + +# test only master (+ Pull requests) +branches: + only: + - master + +# setup requirements for running unit tests +before_script: + - cp config.php-DEVELOPMENT config.php + - composer install --dev --prefer-dist + +# execute phpunit as the script command +script: "phpunit -d memory_limit=-1 -c $TEST_CONFIG" + +# disable mail notifications +notification: + email: false + +# reduce depth (history) of git checkout +git: + depth: 30 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..ef89455 --- /dev/null +++ b/Readme.md @@ -0,0 +1,121 @@ +# eZ Publish 5.x Kernel +[![Build Status](https://travis-ci.org/ezsystems/ezp-next.png?branch=master)](https://travis-ci.org/ezsystems/ezp-next) + +Welcome to the new eZ Publish 5.x Kernel, this code repository contains several layers of API's and implementation of them. +However it does not contain all parts that make up the eZ Publish 5 install, for the full eZ Publish 5 package including +bundles, Legacy Stack, install doc and more; please see our [ezpublish5](https://github.com/ezsystems/ezpublish5) repository. + +## Legacy Stack (LS) + +Legacy Stack: Legacy kernel (4.x) + extensions + +eZ Publish 5.x is a bottom up rewrite of eZ Publish, so a conservative approach where taken on backwards compatibility +by bundling both Legacy Stack (4.x) and 5.x Stack together in one integrated package (ref ezpublish5 repository above). + +In addition to the BC reason, the second reason is that eZ Publish 5.x does not yet provide own UI's, editor and admin +gui is for the time being still provided by Legacy Stack. + +The legacy integrations are done in many parts of the systems, making it possible to use both kernels in the same request, +hence being able to do a smooth transition from existing 4.x installation to 5.x installation going forward. + +However for performance reasons we recommend trying to use either legacy with "legacy_mode" turned on or pure 5.x Stack +on a siteaccess case by case basis. This will still make sure cache and other integrations work together (something that +is not the case if you point Apache directly to eZ Publish Legacy), but will avoid duplicate lookups ("fallbacks"). + + +## 5.x Stack + +5.x Stack: 5.x kernel + Bundles (former extensions) + +### Bundles +The highest level in the eZ Publish 5 architecture are bundles that builds on top of everything bellow, this is where +most eZ Publish 5 Bundles will be written. They will exist in separate git repositories, and optionally +defined as dependencies in your project composer.json file (see ezpublish5 repository). + +### 5.x Kernel + +#### Kernel Bundles: REST, Core & Legacy +These bundles are important parts of the eZ Publish 5.x kernel. + +* Core Bundle: Provide additional features to a standard Symfony2 distribution like multilingual UrlAlias routing, + siteaccess matching, permissions and helpers for Public API use. +* Legacy Bundle: Integrations with Legacy kernel, like fallbacks and code reuse across 5.x/Legacy Stack. +* REST Bundle: Integration of REST API to 5.x (Symfony) Stack + +You can find these in [eZ/Bundle](/ezsystems/ezp-next/tree/master/eZ/Bundle/) and their lower level parts in: +* [eZ/Publish/Core/REST](/ezsystems/ezp-next/tree/master/eZ/Publish/Core/REST/) *The REST API implementation* +* [eZ/Publish/Core/MVC](/ezsystems/ezp-next/tree/master/eZ/Publish/Core/MVC/) *MVC implementation that integrate with Symfony and Legacy* + + +#### Public API +Public API currently provides access to the Content Repository of eZ Publish, exposing Content, Locations +(former Nodes), Sections, Content Types (former Content Classes), User Groups, Users and Roles. +It also provides a new clear interface for plugging in custom field types (former Datatypes). + +Public API is built on top of a set of SPI's abstracting storage/file/* functionality. +By using Public API your code will be forward compatible to future releases based on enhanced, more scalable and more +performant storage engines. It is also fully backwards compatible by using the included "Legacy" storage engine, which +stores data in the way legacy kernel is used to finding it. + +Important parts of this layer is: +* [eZ/Publish/API](/ezsystems/ezp-next/tree/master/eZ/Publish/API/) *Public API Interfaces* +* [eZ/Publish/Core/Repository](/ezsystems/ezp-next/tree/master/eZ/Publish/Core/Repository/) *Public API Repository implementation* + +#### (Private) SPI(Service Provider Interface) + +Service Provider Interfaces are interfaces that can contain one or several implementations, in some cases Public API +will only be able to use one at a time; Persistence (database), IO (file system). In other cases it expects several +implementations; FieldTypes (former DataTypes), Limitations (permissions system). + +SPI layer is currently considered "private" as it will still undergo changes, it will be made "final" by the time we +have a fully working NoSQL implementation of Persistence and scalable IO storage implementation like S3. +Meaning you can make your own implementation if you want, but we don't guarantee that it will work across versions. + +Currently SPI consists of: +* [eZ/Publish/SPI](/ezsystems/ezp-next/tree/master/eZ/Publish/SPI/) *Service provider interfaces* +* [eZ/Publish/Core/Persistence/Legacy](/ezsystems/ezp-next/tree/master/eZ/Publish/Core/Persistence/Legacy/) *Legacy Storage-Engine (Persistence-handler)* +* [eZ/Publish/Core/Persistence/InMemory](/ezsystems/ezp-next/tree/master/eZ/Publish/Core/Persistence/InMemory/) *InMemory Storage-Engine (for unit testing)* +* [eZ/Publish/Core/IO](/ezsystems/ezp-next/tree/master/eZ/Publish/Core/IO/) *IO (file) Handlers; Legacy, Dispatcher and InMemory (for unit testing)* + + +## Dependencies +* **Composer**: Just run `curl -s http://getcomposer.org/installer | php` to get **composer.phar** +* **PHPUnit 3.6+** +* **PHP 5 Modules**: php5_sqlite +* **Database**: sqlite3 if not installed by above stage + +## How to run tests +* Clone this repo +* Install dependencies with **Composer**: `php composer.phar install --prefer-dist` +* Copy config.php-DEVELOPMENT to config.php +* Execute `phpunit -vc phpunit*.xml` with one of: + * phpunit.xml *unit test xml configuration* + * phpunit-integration-legacy.xml *integration test xml configuration for running integration tests with Legacy Storage engine* + +## Issue tracker +Submitting bugs, improvements and stories is possible on https://jira.ez.no/browse/EZP + +## Contributing +eZ Publish 5.x is a fully open source, community-driven project, and code contributions are simply done via github pull requests. + +Short: +* Remember to first create a issue in our issue tracker and refer to it in commits and pull requests headers, example: + "Fixed EZP-20104: ContentController should return error status when content is not found" +* If you want to contribute implementation specification proposals, place them in [doc/](/ezsystems/ezp-next/tree/master/doc/) folder. +* Keep different changes in different commits in case cherry-pick is preferred instead of a merge later. + * A Pull Request should only cover one issue + * A commit should not contain code changes at the some time as doing coding standards/whitespace/typo fixes +* TDD: Write/Change the test(s) for the change you do and commit it before you do the actual code change + * If a bug affects Public API, write or enhance a integration test to make sure the bug is covered. + * Unit tests should only use mocks/stubs and never test the full stack like integrations tests does. +* Please test/check your commits before pushing even if we have automated checks in place on pull requests: + * Run unit tests and integration test before commits + * Make sure you follow our [coding standards](https://github.com/ezsystems/ezcs) + +For further information please have a look at the [related guidance page](http://share.ez.no/get-involved/develop). You will, amongst other, learn how to make pull-requests. More on this here : ["How to contribute to eZ Publish using GIT"](http://share.ez.no/learn/ez-publish/how-to-contribute-to-ez-publish-using-git). + +## Discussing/Exchanging +A dedicated forum has been set-up to discuss all PHP API-related topics : http://share.ez.no/forums/new-php-api + +## Copyright & license +eZ Systems AS & GPL 2.0 diff --git a/bisect_phpunit.sh b/bisect_phpunit.sh new file mode 100755 index 0000000..70e70dd --- /dev/null +++ b/bisect_phpunit.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Execute phpunit with arguments (use case: directory filter), but stop on first failure / error +phpunit --colors --stop-on-failure --stop-on-error $@ + +EXIT_CODE="$?" + +if [ $EXIT_CODE -eq "255" ]; then + # Wrapping the error code to 1, so bisect marks this build as "bad" and continues. + exit 1 +fi + +if [ $EXIT_CODE -eq "2" ]; then + # The testsuite does not exist, so we skip bisect here. + exit 125 +fi + +exit $EXIT_CODE diff --git a/bootstrap.php b/bootstrap.php new file mode 100644 index 0000000..a238ebf --- /dev/null +++ b/bootstrap.php @@ -0,0 +1,60 @@ +runCallback( + function () + { + eZExecution::setCleanExit(); + } + ); + + // Exposing in env variables in order be able to use them in test cases. + $_ENV['legacyKernel'] = $legacyKernel; + $_ENV['legacyPath'] = $settings['service']['parameters']['legacy_dir']; +} + +return include 'container.php'; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..f718f29 --- /dev/null +++ b/composer.json @@ -0,0 +1,45 @@ +{ + "name": "ezsystems/ezpublish", + "description": "eZ Publish API and kernel. This is the heart of eZ Publish 5.", + "version": "5.1-dev", + "homepage": "http://share.ez.no", + "license": "GPL-2.0", + "require": { + "php": ">=5.3.3", + "zetacomponents/archive": "dev-master", + "zetacomponents/authentication": "dev-master", + "zetacomponents/cache": "dev-master", + "zetacomponents/configuration": "dev-master", + "zetacomponents/console-tools": "dev-master", + "zetacomponents/database": "dev-master", + "zetacomponents/debug": "dev-master", + "zetacomponents/event-log": "1.4", + "zetacomponents/feed": "dev-master", + "zetacomponents/image-conversion": "dev-master", + "zetacomponents/mail": "dev-master", + "zetacomponents/mvc-tools": "dev-master", + "zetacomponents/mvc-authentication-tiein": "dev-master", + "zetacomponents/persistent-object": "dev-master", + "zetacomponents/php-generator": "dev-master", + "zetacomponents/signal-slot": "dev-master", + "zetacomponents/system-information": "dev-master", + "zetacomponents/webdav": "1.1.3", + "symfony/symfony": "2.1.*", + "symfony-cmf/routing": "1.0.*", + "qafoo/rmf": "1.0.0", + "kriswallsmith/buzz": "dev-master" + }, + "require-dev": { + "ezsystems/ezpublish-legacy": "dev-master", + "mikey179/vfsStream": "1.1.0" + }, + "autoload": { + "psr-0": { + "eZ": "" + } + }, + "minimum-stability": "dev", + "config": { + "process-timeout": 3000 + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..3f9a37a --- /dev/null +++ b/composer.lock @@ -0,0 +1,1733 @@ +{ + "hash": "174e0af8e7ef34bc0a4b896ee746df3e", + "packages": [ + { + "name": "doctrine/common", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common", + "reference": "bb0aebbf234db52df476a2b473d434745b34221c" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/common/archive/bb0aebbf234db52df476a2b473d434745b34221c.zip", + "reference": "bb0aebbf234db52df476a2b473d434745b34221c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "time": "2012-09-20 05:55:18", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Doctrine\\Common": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "collections", + "spl", + "eventmanager", + "annotations", + "persistence" + ] + }, + { + "name": "kriswallsmith/buzz", + "version": "dev-master", + "source": { + "type": "git", + "url": "http://github.com/kriswallsmith/Buzz.git", + "reference": "988bf14201ffbed940f23b42f87302e6adec4c21" + }, + "dist": { + "type": "zip", + "url": "https://github.com/kriswallsmith/Buzz/archive/988bf14201ffbed940f23b42f87302e6adec4c21.zip", + "reference": "988bf14201ffbed940f23b42f87302e6adec4c21", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "suggest": { + "ext-curl": "*" + }, + "time": "2012-08-17 12:23:33", + "type": "library", + "installation-source": "source", + "autoload": { + "psr-0": { + "Buzz": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com", + "homepage": "http://kriswallsmith.net/" + } + ], + "description": "Lightweight HTTP client", + "homepage": "https://github.com/kriswallsmith/Buzz", + "keywords": [ + "curl", + "http client" + ] + }, + { + "name": "qafoo/rmf", + "version": "1.0.0", + "source": { + "type": "git", + "url": "git://github.com/Qafoo/REST-Micro-Framework.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/Qafoo/REST-Micro-Framework/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "time": "2012-09-03 11:24:11", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Qafoo\\RMF": "src/main/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "description": "Very simple VC framework which makes it easy to build HTTP applications / REST webservices" + }, + { + "name": "symfony-cmf/routing", + "version": "dev-master", + "target-dir": "Symfony/Cmf/Component/Routing", + "source": { + "type": "git", + "url": "https://github.com/symfony-cmf/Routing", + "reference": "1.0.0-alpha3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony-cmf/Routing/archive/1.0.0-alpha3.zip", + "reference": "1.0.0-alpha3", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "symfony/routing": ">=2.1,<2.3-dev", + "symfony/http-kernel": ">=2.1,<2.3-dev" + }, + "time": "2012-12-16 17:52:57", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Symfony\\Cmf\\Component\\Routing": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony CMF Community", + "homepage": "https://github.com/symfony-cmf/Routing/contributors" + } + ], + "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers", + "homepage": "http://cmf.symfony.com", + "keywords": [ + "database", + "routing" + ] + }, + { + "name": "symfony/symfony", + "version": "2.1.x-dev", + "source": { + "type": "git", + "url": "git://github.com/symfony/symfony.git", + "reference": "4bee2e9d3a043f2f720d84e8d94f70f91e364c80" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony/symfony/archive/4bee2e9d3a043f2f720d84e8d94f70f91e364c80.zip", + "reference": "4bee2e9d3a043f2f720d84e8d94f70f91e364c80", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "doctrine/common": ">2.2,<2.4-dev", + "twig/twig": ">=1.9.1,<2.0-dev" + }, + "replace": { + "symfony/doctrine-bridge": "self.version", + "symfony/monolog-bridge": "self.version", + "symfony/propel1-bridge": "self.version", + "symfony/swiftmailer-bridge": "self.version", + "symfony/twig-bridge": "self.version", + "symfony/framework-bundle": "self.version", + "symfony/security-bundle": "self.version", + "symfony/twig-bundle": "self.version", + "symfony/web-profiler-bundle": "self.version", + "symfony/browser-kit": "self.version", + "symfony/class-loader": "self.version", + "symfony/config": "self.version", + "symfony/console": "self.version", + "symfony/css-selector": "self.version", + "symfony/dependency-injection": "self.version", + "symfony/dom-crawler": "self.version", + "symfony/event-dispatcher": "self.version", + "symfony/filesystem": "self.version", + "symfony/finder": "self.version", + "symfony/form": "self.version", + "symfony/http-foundation": "self.version", + "symfony/http-kernel": "self.version", + "symfony/locale": "self.version", + "symfony/options-resolver": "self.version", + "symfony/process": "self.version", + "symfony/routing": "self.version", + "symfony/security": "self.version", + "symfony/serializer": "self.version", + "symfony/templating": "self.version", + "symfony/translation": "self.version", + "symfony/validator": "self.version", + "symfony/yaml": "self.version" + }, + "require-dev": { + "doctrine/dbal": ">=2.2,<2.4-dev", + "doctrine/orm": ">=2.2.3,<2.4-dev", + "doctrine/data-fixtures": "1.0.*", + "propel/propel1": "dev-master", + "monolog/monolog": "1.*" + }, + "time": "2012-12-20 07:21:29", + "type": "library", + "installation-source": "source", + "autoload": { + "psr-0": { + "Symfony": "src/", + "SessionHandlerInterface": "src/Symfony/Component/HttpFoundation/Resources/stubs" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "The Symfony PHP framework", + "homepage": "http://symfony.com", + "keywords": [ + "framework" + ] + }, + { + "name": "twig/twig", + "version": "dev-master", + "source": { + "type": "git", + "url": "git://github.com/fabpot/Twig.git", + "reference": "f095f3a1777431412954e478f92e8a10cb7b6495" + }, + "dist": { + "type": "zip", + "url": "https://github.com/fabpot/Twig/archive/f095f3a1777431412954e478f92e8a10cb7b6495.zip", + "reference": "f095f3a1777431412954e478f92e8a10cb7b6495", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "time": "2012-12-18 10:01:32", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.12-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ] + }, + { + "name": "zetacomponents/archive", + "version": "dev-master", + "source": { + "type": "git", + "url": "git://github.com/zetacomponents/Archive.git", + "reference": "4b2c4a1c24b1e1f831b015c8ff72181aece7b421" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Archive/archive/4b2c4a1c24b1e1f831b015c8ff72181aece7b421.zip", + "reference": "4b2c4a1c24b1e1f831b015c8ff72181aece7b421", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:54:03", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The component allows you to create, modify, and extract archive files of various formats. The currently supported archives formats are Tar (with the flavours: ustar, v7, pax, and gnu) and Zip.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/authentication", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Authentication.git", + "reference": "c422670d09967491c1c8c98f9334f1a738617bd0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Authentication/archive/c422670d09967491c1c8c98f9334f1a738617bd0.zip", + "reference": "c422670d09967491c1c8c98f9334f1a738617bd0", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:21", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The purpose of the Authentication component is to provide support for different means of identification and authentication of users using different providers and protocols.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/base", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Base.git", + "reference": "642f63a8a72c32996f1aaf8a317fdf746bc32ce7" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Base/archive/642f63a8a72c32996f1aaf8a317fdf746bc32ce7.zip", + "reference": "642f63a8a72c32996f1aaf8a317fdf746bc32ce7", + "shasum": "" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 11:21:36", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The Base package provides the basic infrastructure that all packages rely on. Therefore every component relies on this package.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/cache", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Cache.git", + "reference": "34fa794d0b5aeef67fee609c52c5d24fa4604bbd" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Cache/archive/34fa794d0b5aeef67fee609c52c5d24fa4604bbd.zip", + "reference": "34fa794d0b5aeef67fee609c52c5d24fa4604bbd", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:29", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + }, + { + "name": "Grady Kuhnline" + } + ], + "description": "A solution for caching, supporting multiple backends allowing you to specify the best performing solution for your caching-problem.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/configuration", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Configuration.git", + "reference": "10ae09f42768d4657b2d1a66226ee63cbd8754b2" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Configuration/archive/10ae09f42768d4657b2d1a66226ee63cbd8754b2.zip", + "reference": "10ae09f42768d4657b2d1a66226ee63cbd8754b2", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:32", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "A component that allows you to use configuration files in different formats. The formats include the standard .ini file, and an array based format.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/console-tools", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/ConsoleTools.git", + "reference": "90156abef01e4215fda8b9740f77c322f126fb02" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/ConsoleTools/archive/90156abef01e4215fda8b9740f77c322f126fb02.zip", + "reference": "90156abef01e4215fda8b9740f77c322f126fb02", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:34", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "A set of classes to do different actions with the console (also called shell). It can render a progress bar, tables and a status bar and contains a class for parsing command line options.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/database", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Database.git", + "reference": "0e8ddef8ce616bc18365efa2eef2161de3d7f74f" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Database/archive/0e8ddef8ce616bc18365efa2eef2161de3d7f74f.zip", + "reference": "0e8ddef8ce616bc18365efa2eef2161de3d7f74f", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:40", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + }, + { + "name": "Joel Arvidsson" + }, + { + "name": "Friedel Hill" + }, + { + "name": "Christian Michel" + } + ], + "description": "A lightweight database layer on top of PHP's PDO that allows you to utilize a database without having to take care of differences in SQL dialects.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/debug", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Debug.git", + "reference": "0d8cc8fae2765c22f3f1930e4cf738304fbadbaf" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Debug/archive/0d8cc8fae2765c22f3f1930e4cf738304fbadbaf.zip", + "reference": "0d8cc8fae2765c22f3f1930e4cf738304fbadbaf", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:45", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "This component provides a set of classes that help you to debug an application. It provides timers and report generators for different formats that give a summary of warnings and errors that occurred within your application.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/event-log", + "version": "1.4", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/EventLog.git", + "reference": "1.4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/EventLog/zipball/1.4", + "reference": "1.4", + "shasum": "" + }, + "time": "2009-06-29 03:55:08", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "apache2" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "Allows you to log events or audit trails into files or other storage spaces in different formats.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/feed", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Feed.git", + "reference": "e0190e90caf6f49771410b485fc43ff09a62b725" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Feed/archive/e0190e90caf6f49771410b485fc43ff09a62b725.zip", + "reference": "e0190e90caf6f49771410b485fc43ff09a62b725", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:55:58", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "This component handles parsing and creating RSS1, RSS2 and ATOM feeds, with support for different feed modules (dc, content, creativeCommons, geo, iTunes).", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/image-analysis", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/ImageAnalysis.git", + "reference": "634a30042a0a76fc509ae933fced2c30bacd38b4" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/ImageAnalysis/archive/634a30042a0a76fc509ae933fced2c30bacd38b4.zip", + "reference": "634a30042a0a76fc509ae933fced2c30bacd38b4", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:56:09", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "This class allows you to analyse image files in different ways. At least the MIME type of the file is returned. In some cases (JPEG, TIFF and GIF) additional information is gathered as well.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/image-conversion", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/ImageConversion.git", + "reference": "aed8cf2e3a17b049add7578fa199c02e3af903c1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/ImageConversion/archive/aed8cf2e3a17b049add7578fa199c02e3af903c1.zip", + "reference": "aed8cf2e3a17b049add7578fa199c02e3af903c1", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*", + "zetacomponents/image-analysis": ">=1.1.3" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-28 07:48:05", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "A set of classes to apply different filters on images, such as colour changes, resizing and special effects.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/mail", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Mail.git", + "reference": "e0120aad96efb41bdfac5583d9cb3863bc2823e7" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Mail/archive/e0120aad96efb41bdfac5583d9cb3863bc2823e7.zip", + "reference": "e0120aad96efb41bdfac5583d9cb3863bc2823e7", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:56:15", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + }, + { + "name": "Sinisa Dukaric" + }, + { + "name": "Mikko Koppanen" + }, + { + "name": "Christian Michel" + } + ], + "description": "The component allows you construct and/or parse Mail messages conforming to the mail standard. It has support for attachments, multipart messages and HTML mail. It also interfaces with SMTP to send mail or IMAP, POP3 or mbox to retrieve e-mail.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/mvc-authentication-tiein", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/MvcAuthenticationTiein.git", + "reference": "9bae3a7313e2ef7f53ef1f394276acc3fde0f80e" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/MvcAuthenticationTiein/archive/9bae3a7313e2ef7f53ef1f394276acc3fde0f80e.zip", + "reference": "9bae3a7313e2ef7f53ef1f394276acc3fde0f80e", + "shasum": "" + }, + "time": "2012-05-21 09:46:53", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "apache2" + ], + "authors": [ + { + "name": "Sebastian Bergmann" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "This component provides authentication filters for the MvcTools component.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/mvc-tools", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/MvcTools.git", + "reference": "6f2c1eb079faee98f37643d212cec0aa925313b2" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/MvcTools/archive/6f2c1eb079faee98f37643d212cec0aa925313b2.zip", + "reference": "6f2c1eb079faee98f37643d212cec0aa925313b2", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:56:22", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sebastian Bergmann" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + }, + { + "name": "James Pic" + } + ], + "description": "The MvcTools component provides functionality for request parsing, routing, dispatching, views and response writing. With the tools in this component you can very easily build an MVC framework.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/persistent-object", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/PersistentObject.git", + "reference": "a4c8b95157919d71db0b380ea7c6375be117eca2" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/PersistentObject/archive/a4c8b95157919d71db0b380ea7c6375be117eca2.zip", + "reference": "a4c8b95157919d71db0b380ea7c6375be117eca2", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:56:25", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + }, + { + "name": "Joel Arvidsson" + } + ], + "description": "This component allows you to store an arbitrary data structures to a fixed database table. The component provides all the functionality needed to fetch, list, delete etc these datastructures.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/php-generator", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/PhpGenerator.git", + "reference": "b51935ec5b763e5bad2182d810e1b752fcc83903" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/PhpGenerator/archive/b51935ec5b763e5bad2182d810e1b752fcc83903.zip", + "reference": "b51935ec5b763e5bad2182d810e1b752fcc83903", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:56:30", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "Provides a simple interface for creating PHP files and executing PHP code.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/signal-slot", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/SignalSlot.git", + "reference": "74deb412339a9e9af5937a5d8726f8246b6a9ccc" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/SignalSlot/archive/74deb412339a9e9af5937a5d8726f8246b6a9ccc.zip", + "reference": "74deb412339a9e9af5937a5d8726f8246b6a9ccc", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 14:06:23", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "The SignalSlot component implements a mechanism for inter and intra object communication through the use of signals and slots.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/system-information", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/SystemInformation.git", + "reference": "674336286f189d222a275bec32be9123d9faf477" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/SystemInformation/archive/674336286f189d222a275bec32be9123d9faf477.zip", + "reference": "674336286f189d222a275bec32be9123d9faf477", + "shasum": "" + }, + "require": { + "zetacomponents/base": "*" + }, + "require-dev": { + "zetacomponents/unit-test": "*" + }, + "time": "2012-05-21 09:56:41", + "type": "library", + "installation-source": "source", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "Provides access to common system variables, such as CPU type and speed, and the available amount of memory.", + "homepage": "https://github.com/zetacomponents" + }, + { + "name": "zetacomponents/webdav", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/zetacomponents/Webdav.git", + "reference": "1.1.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/zetacomponents/Webdav/zipball/1.1.3", + "reference": "1.1.3", + "shasum": "" + }, + "time": "2009-11-09 05:34:07", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "src" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "apache2" + ], + "authors": [ + { + "name": "Sergey Alexeev" + }, + { + "name": "Sebastian Bergmann" + }, + { + "name": "Jan Borsodi" + }, + { + "name": "Raymond Bosman" + }, + { + "name": "Frederik Holljen" + }, + { + "name": "Kore Nordmann" + }, + { + "name": "Derick Rethans" + }, + { + "name": "Vadym Savchuk" + }, + { + "name": "Tobias Schlitt" + }, + { + "name": "Alexandru Stanoi" + } + ], + "description": "This component allows you to set up and run your own WebDAV (RFC 2518) server, to enable online content editing for the users of your system through the WebDAV HTTP extension.", + "homepage": "https://github.com/zetacomponents" + } + ], + "packages-dev": [ + { + "name": "ezsystems/ezpublish-legacy", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/ezsystems/ezpublish.git", + "reference": "c7597b880abe2609faec7b379308e09df3c99856" + }, + "dist": { + "type": "zip", + "url": "https://github.com/ezsystems/ezpublish/archive/c7597b880abe2609faec7b379308e09df3c99856.zip", + "reference": "c7597b880abe2609faec7b379308e09df3c99856", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2012-12-18 13:25:42", + "type": "library", + "installation-source": "source", + "notification-url": "https://packagist.org/downloads/", + "description": "eZ Publish LegacyStack (4.x)", + "homepage": "http://share.ez.no" + }, + { + "name": "mikey179/vfsStream", + "version": "v1.1.0", + "source": { + "type": "git", + "url": "https://github.com/mikey179/vfsStream", + "reference": "v1.1.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/mikey179/vfsStream/zipball/v1.1.0", + "reference": "v1.1.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2012-08-25 05:49:29", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "org\\bovigo\\vfs": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "homepage": "http://vfs.bovigo.org/" + } + ], + "aliases": [ + + ], + "minimum-stability": "dev", + "stability-flags": { + "zetacomponents/archive": 20, + "zetacomponents/authentication": 20, + "zetacomponents/cache": 20, + "zetacomponents/configuration": 20, + "zetacomponents/console-tools": 20, + "zetacomponents/database": 20, + "zetacomponents/debug": 20, + "zetacomponents/feed": 20, + "zetacomponents/image-conversion": 20, + "zetacomponents/mail": 20, + "zetacomponents/mvc-tools": 20, + "zetacomponents/mvc-authentication-tiein": 20, + "zetacomponents/persistent-object": 20, + "zetacomponents/php-generator": 20, + "zetacomponents/signal-slot": 20, + "zetacomponents/system-information": 20, + "kriswallsmith/buzz": 20, + "ezsystems/ezpublish-legacy": 20 + } +} diff --git a/config.php-DEVELOPMENT b/config.php-DEVELOPMENT new file mode 100644 index 0000000..fcbc1ff --- /dev/null +++ b/config.php-DEVELOPMENT @@ -0,0 +1,66 @@ + array( + 'Configuration' => array( + // Disable cache, default false + 'UseCache' => false, + + // List of parser classes where key is file suffix + 'Parsers' => array( + '.ini' => 'eZ\\Publish\\Core\\Base\\Configuration\\Parser\\Ini', + '.ini.append.php' => 'eZ\\Publish\\Core\\Base\\Configuration\\Parser\\Ini', + ), + + // Enable strict ini parsing using parse_ini_string(), default false using eZ/Zeta Components INI Reader + 'IniParserStrict' => false, + + // Switch for development mode or not, default false + 'DevelopmentMode' => true, + + // File Permissions, default 0644 + 'CacheFilePermission' => 0644, + + // Dir permissions, default 0755 + 'CacheDirPermission' => 0755, + + // Paths and scopes to read ini settings from + 'Paths' => array( + 'base' => array( 'settings/' ), + 'modules' => array( __DIR__ . '/eZ/Publish/Core/settings/' ), + 'access' => array(), + 'global' => array( 'settings/override/' ), + ), + ), + ), + 'service' => array( + 'parameters' => array( + // The installation directory + 'install_dir' => __DIR__, + + // The Legacy Kernel installation directory, detect legacy location + 'legacy_dir' => ( + is_dir( './ezpublish_legacy' ) ? + getcwd() . '/ezpublish_legacy' : + __DIR__ . '/vendor/ezsystems/ezpublish-legacy' + ), + ) + ) +); diff --git a/container.php b/container.php new file mode 100644 index 0000000..0f5c88f --- /dev/null +++ b/container.php @@ -0,0 +1,38 @@ +getConfiguration( 'service' )->getAll(), + $dependencies +); diff --git a/doc/specifications/api/repository/permissions/design.md b/doc/specifications/api/repository/permissions/design.md new file mode 100644 index 0000000..bede848 --- /dev/null +++ b/doc/specifications/api/repository/permissions/design.md @@ -0,0 +1,205 @@ +eZ Publish: Permissions, Design +=============================== + +API +--- + + +### Model API + +This part has already been defined, and value objects can be found here: +* https://github.com/ezsystems/ezp-next/tree/master/eZ/Publish/API/Repository/Values/User + +For the Service API's that deal with these objects, look here: +* https://github.com/ezsystems/ezp-next/blob/master/eZ/Publish/API/Repository/UserService.php +* https://github.com/ezsystems/ezp-next/blob/master/eZ/Publish/API/Repository/RoleService.php + + +### Authorization API + +#### Prior approach + +Prior work last year consisted of a high level [Repository->canUser()][canUser] api, that +underneath consumed two api's: +* [User->hasAccessTo()][hasAccessTo] +* Model->definition(), examples: + * [Content->definition()][contentDefinition] + * [User->definition()][userDefinition] + +definition() was where the heavy lifting was done, this consisted of the following +closures pr limitation: +* 'compare' to perform permission check against live objects, as needed + when storing new objects. +* 'query' cable of generating criterion for filtering search results and (child) + list operations. The systems also used this criterion inverse for checking if + user has access to delete or move a subtree. + + +#### Updated approach + +Prior approach had downside in that it used closures and was hard to extend. +So in updated approach these permission check functions are moved to a +Limitation SPI interface (since extensions should be able to add their own). + +The SPI interface: + +```php +namespace eZ\Publish\SPI\Limitation; + +use eZ\Publish\API\Repository\Values\ValueObject; +use eZ\Publish\API\Repository\Values\User\Limitation as LimitationValue; +use eZ\Publish\API\Repository\Repository; + +/** + * This interface represent the Limitation Type + */ +interface Type +{ + /** + * Constants for valueSchema() return values + * + * Used in cases where a certain value is accepted but the options are to many to return as a hash of options. + * GUI should typically present option to browse content tree to select limitation value(s). + */ + const VALUE_SCHEMA_LOCATION_ID = 1; + const VALUE_SCHEMA_LOCATION_PATH = 2; + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * @param \eZ\Publish\API\Repository\Repository $repository + * + * @return boolean + */ + public function acceptValue( LimitationValue $limitationValue, Repository $repository ); + + /** + * Create the Limitation Value + * + * The is the api to create values as Limitation type needs value knowledge anyway in acceptValue, + * the reverse relation is provided by means of identifier lookup (Value has identifier, and so does RoleService). + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ); + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * NOTE: Repository is provided because not everything is available via the value object(s), + * but use of repository in limitation functions should be avoided for performance reasons + * if possible, especially when using un-cached parts of the api. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( LimitationValue $value, Repository $repository, ValueObject $object, ValueObject $target = null ); + + /** + * Return Criterion for use in find() query + * + * NOTE: Repository is provided because not everything is available via the limitation value, + * but use of repository in limitation functions should be avoided for performance reasons + * if possible, especially when using un-cached parts of the api. + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Repository $repository + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( LimitationValue $value, Repository $repository ); + + /** + * Return info on valid $limitationValues + * + * @param \eZ\Publish\API\Repository\Repository $repository + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_* constants. + * Note: The hash might be an instance of Traversable, and not a native php array. + */ + public function valueSchema( Repository $repository ); +} +``` + + +Methods on RoleService needs to be added to provide access to these Types, as GUI's will need to at least have access +to valueSchema() to provide admin interfaces where policies can be created / updated. +The added RoleService method is to get them by identifier or list based on module / function: + +```php + /** + * Returns the LimitationType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\SPI\Limitation\Type + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if there is no LimitationType with $identifier + */ + public function getLimitationType( $identifier ); + + /** + * Returns the LimitationType's assigned to a given module/function + * + * Typically used for: + * - Internal validation limitation value use on Policies + * - Role admin gui for editing policy limitations incl list limitation options via valueSchema() + * + * @param string $module Legacy name of "controller", it's a unique identifier like "content" + * @param string $function Legacy name of a controller "action", it's a unique within the controller like "read" + * + * @return \eZ\Publish\SPI\Limitation\Type[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If module/function to limitation type mapping + * refers to a non existing identifier. + */ + public function getLimitationTypesByModuleFunction( $module, $function ); +``` + + + +### Authentication API + +The API needs two ways user can be authenticated: +* Using login/email and password: [UserService->loadUserByCredentials()][login] +* Using user reference for session use: <@todo: TBD> + + + +Implementation notes +-------------------- + +### Extensibility + +This is archived by means of using the dependency injection container system to map +up the different Limitation Types mapped by identifier, and a mapping of module functions +to Limitation identifiers to be able to validate limitations values used on module functions. + +This means identifier needs to be unique! + + + +References +---------- + +[canUser]: https://github.com/ezsystems/ezp-next/blob/9e14c6b3133a2585c103376555849c5fcd8591d2/ezp/Base/Repository.php#L122 +[contentDefinition]: https://github.com/ezsystems/ezp-next/blob/9e14c6b3133a2585c103376555849c5fcd8591d2/ezp/Content/Concrete.php#L235 +[userDefinition]: https://github.com/ezsystems/ezp-next/blob/9e14c6b3133a2585c103376555849c5fcd8591d2/ezp/User/Concrete.php#L96 +[hasAccessTo]: https://github.com/ezsystems/ezp-next/blob/9e14c6b3133a2585c103376555849c5fcd8591d2/ezp/User/Concrete.php#L162 +[login]: https://github.com/ezsystems/ezp-next/blob/master/eZ/Publish/API/Repository/UserService.php#L142 \ No newline at end of file diff --git a/doc/specifications/api/repository/permissions/requirements.md b/doc/specifications/api/repository/permissions/requirements.md new file mode 100644 index 0000000..94ba704 --- /dev/null +++ b/doc/specifications/api/repository/permissions/requirements.md @@ -0,0 +1,56 @@ +eZ Publish: Permissions, Requirements +===================================== + + +Introduction +------------ + +This document is divided into two sections. The first section presents the +permission system in eZ Publish 3/4. The second section discusses the +requirements of the permission system for eZ Publish 5. + +eZ Publish 3/4 +-------------- + +eZ Publish 3.x and by extension 4.x have a permission system witch by +default does not give you permission to anything, but by means of roles +and policies you can grant access to certain or all parts of the system. +These policies can have limitations, meaning they will only be applied +under certain conditions. Role assignments can optionally be applied +with limitations, presumably to be able to reuse roles for different +users. Roles can be assigned to both user groups and directly to users. + +User [ <-> Group ]<-> Role -> Policy -> Limitations + +Available Role assignment limitations are subtree and section, where +subtree refers to a subtree within a node (aka location) structure. + +Issues with permission system: +* There is no way to extend these limitations without hacking the kernel. +* The kernel does not have an api that deal with limitations, so all + kernel & extension code that deals with permissions needs to handle it + on it's own. Leading to code duplication and also some times security + issues caused by uncertainty around which api's check permissions & not. +* The system is not designed to to handle lots of role assignments pr users + like is often the case in for instance eZ Teamroom. +* Some Limitations are implemented as O(n) leading to slower performance the + more Limitations are used. +* user/selfedit is implemented as pure business logic, but should instead use + limitations or some other way to separate the logic so it can be checked by + the permission system like everything else. + +eZ Publish 5 +------------ + +The following requirements have been identified: + +* Must haves: + * Retain full data bc as 5.x and 4.x kernels will live side by side + * Make all part of API deal with permissions internally without duplicating + the permission code. + * Make API to check permissions public for use in custom code as well +* Should haves: + * Make it possible to extend the limitations in new kernel +* Could haves: + * Improved performance where possible, and document limitations that are + slow by design. diff --git a/doc/specifications/rest/REST-API-V2.html b/doc/specifications/rest/REST-API-V2.html new file mode 100644 index 0000000..1eecb85 --- /dev/null +++ b/doc/specifications/rest/REST-API-V2.html @@ -0,0 +1,14940 @@ + + + + + + +eZ Publish REST API V2 RFC + + + +
+

eZ Publish REST API V2 RFC

+ +
+

Table of Contents

+ +
+
+

1   General considerations

+
+

1.1   Media Types

+

The methods on resources provide multiple media types in their responses. A media type can be selected in the Accept Header. +For each xml media type there is a unique name e.g. application/vnd.ez.api.User+xml. In this case the returned xml response +conforms with the complex type definition with name vnd.ez.api.User in the user.xsd (see User) xml schema definition file. +Each JSON schema is implicit derived from the xml schema by making a uniform transformation from XML to JSON as shown below.

+

Example:

+
+<test attr1="attr1">
+   <value attr2="attr2">value</value>
+   <simpleValue>45</simpleValue>
+   <fields>
+     <field>1</field>
+     <field>2</field>
+   </fields>
+</test>
+
+

transforms to:

+
+{
+  "test":{
+    "_attr1":"attr1",
+    "value":{
+      "_attr2":"attr2",
+      "#text":"value"
+    },
+    "simpleValue":"45",
+    "fields": {
+       "field": [ 1, 2 ]
+    }
+  }
+}
+
+

Different schemas which induce different media types one on resource can be used to allow to make specific +representations optimized for purposes of clients. +It is possible to make a new schema for mobile devices for retieving e.g. an article.

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.MobileContent">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="Title" type="xsd:string" />
+          <xsd:element name="Summary" type="xsd:string" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="MobileContent" type="vnd.ez.api.MobileContent"/>
+</xsd:schema>
+
+

so that

+
+GET /content/objects/23 HTTP/1.1
+Accept: application/vnd.ez.api.MobileContent+xml
+
+

returns:

+
+<?xml version="1.0" encoding="UTF-8"?>
+<MobileContent href="/content/objects/23" media-type="application/vnd.ez.api.MobileContent+xml">
+  <Title>Title</Title>
+  <Summary>This is a summary</Summary>
+</MobileContent>
+
+

However in this specification only the standard schemas and media types are defined (see InputOutput). +If there is only one media type defined for xml or json, it is also possible to specify +application/xml or application/json.

+
+
+

1.2   URIs

+

The REST api is designed that the client has not to construct any uri's to resources by itself. +Starting from the root resources (ListRoot) every response includes further links to related resources. +The uris should be used directly as identifiers on the client side and the client should not +contruct an uri by using an id.

+
+
+
+

2   Authentication

+ +
+

2.2   OAuth

+

See http://oauth.net/2/ +TBD - setting up oauth.

+
+
+

2.3   Session based Authentication

+

This approach violates generally the principles of RESTful services. However, +the sessions are only created to reauthenticate the user (and perform authorization, +which has do be done anyway) and not to hold session state in the service. +So we consider this method to support AJAX based applications.

+

If activated the user has to login and the client has to send the session cookie in every request:

+ +++ + + + + + + + + + + + + + + + +
Resource:

/user/sessions

+
Method:

POST

+
Description:

Performs a login for the user and returns the session cookie

+
Request format:

application/x-www-form-urlencoded

+
Parameters: +++ + + + + + +
login:the login of the user
password:the password
+
Response:

200 Set-Cookie: SessionId : <sessionID> A unique session id containing encryped information of client host and expiretime +<Uri of user>

+
Error codes: +++ + + + +
401:If the authorization failed
+
+

In order to logout the user calls:

+ +++ + + + + + + + + + + + + + +
Resource:

/user/sessions/<sessionID>

+
Method:

DELETE

+
Description:

The user session is removed i.e. the user is logged out.

+
Parameters:
Response:

204

+
Error Codes: +++ + + + +
404:If the session does not exist
+
+
+
+

2.4   SSL Client Authentication

+

The REST API provides authenticating a user by a subject in a client certificate delivered by the web server configured as SSL endpoint.

+
+
+
+

3   Content

+
+

3.1   Overview

+

In the content module there are the root collections objects, locations, trash and sections

+ ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+++ + + + +
Resource:
+
POSTGETPATCH/PUTDELETECOPY
/.list root resources.. 
/content/objectscreate new content... 
/content/objects/<ID>.load contentupdate content meta datadelete contentcopy content
/content/objects/<ID>/<lang_code>...delete language +from content 
/content/objects/<ID>/versions.load all versions +(version infos).. 
/content/objects/<ID>/currentversion.redirect to current v...create draft +from current +version
/content/objects/<ID>/versions/<no>.get a specific versionupdate a version/draftdelete versioncreate draft +from version
/content/objects/<ID>/versions/<no>/relationscreate new relationload relations of vers... 
/content/objects/<ID>/versions/<no>/relations/<ID>.load relation details.delete relation 
/content/objects/<ID>/locationscreate locationload locations of cont- +ent.. 
/content/locations.list/find locations.. 
/content/locations/<path>.load a locationupdate locationdelete locationcopy subtree
/content/locations/<path>/children.load children.. 
/content/viewscreate viewlist views.. 
/content/views/<ID>.get view.delete view 
/content/views/<ID>/results.get view results.. 
/content/sectionscreate sectionlist all sections.. 
/content/sections/<ID>.load sectionupdate sectiondelete section 
/content/trash.list trash items.empty trash 
/content/trash/<ID>.load trash itemuntrash itemdelete from trsh 
/content/objectstategroupscreate objectstate +grouplist objectstategroups.. 
/content/objectstategroups/<ID>.get objectstate groupupdate objectstategroupdelete osg. 
/content/objectstategroups/<ID>/objectstatescreate object statelist object states.. 
/content/objectstategroups/<ID>/objectstates/<ID>.get object stateupdate objectstatedelete objectst. 
/content/objects/<ID>/objectstates.get object states of +contentupdate objectstates of +content. 
/content/urlaliasescreate url aliaslist url aliases.. 
/content/urlaliases/<ID>.get url alias.delete url wc. 
/content/urlwildcardscreate url wildcardlist url wildcards.. 
/content/urlwildcards/<ID>.get url wildcard.delete url wc. 
+
+
+

3.2   Specification

+
+

3.2.1   General Error Codes

+

(see also HTTP 1.1 Specification)

+ +++ + + + + + + + + + + + +
500:The server encountered an unexpected condition which prevented it from fulfilling the request - e.g. database down etc.
501:The requested method was not implemented yet
404:Requested resource was not found
405:The request method is not available. The available methods are returned for this resource
406:The request contains an Accept header which is not supported.
+
+
+

3.2.2   List Root Resources

+ +++ + + + + + + + + + + + +
Resource:

/

+
Method:

GET

+
Description:

list the root resources of the ez publish installation

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Root+xml:
 if set the list is return in xml format (see Root)
application/vnd.ez.api.Root+json:
 if set the list is returned in json format (see Root)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Root
+
+
+

3.2.2.1   XML Example

+
+GET / HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.Root+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.Root+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Root>
+  <content href="/content/objects" media-type=""/>
+  <contentTypes href="/content/types" media-type="application/vnd.ez.api.ContentTypeInfoList+xml"/>
+  <users href="/user/users" media-type="application/vnd.ez.api.UserRefList+xml"/>
+  <roles href="/user/roles" media-type="application/vnd.ez.api.RoleList+xml"/>
+  <rootLocation href="/content/locations/1" media-type="application/vnd.ez.api.Location+xml"/>
+  <rootUserGroup href="/user/groups/1/3" media-type="application/vnd.ez.api.UserGroup+xml"/>
+  <rootMediaFolder href="/content/locations/1/43" media-type="application/vnd.ez.api.Location+xml"/>
+  <trash href="/content/trash" media-type="application/vnd.ez.api.LocationList+xml"/>
+  <sections href="/content/sections" media-type="application/vnd.ez.api.SectionList+xml"/>
+  <views href="/content/views" media-type="application/vnd.ez.api.RefList+xml"/>
+</Root>
+
+
+
+

3.2.2.2   JSON Example

+
+GET / HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.Root+json
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.Root+json
+Content-Length: xxx
+
+
+{
+  "Root": {
+    "content": { "_href": "/content/objects" },
+    "contentTypes": {
+      "_href": "/content/types",
+      "_media-type": "application/vnd.ez.api.ContentTypeInfoList+json"
+    },
+    "users": {
+      "_href": "/user/users",
+      "_media-type": "application/vnd.ez.api.UserRefList+json"
+    },
+    "roles": {
+      "_href": "/user/roles",
+      "_media-type": "application/vnd.ez.api.RoleList+json"
+    },
+    "rootLocation": {
+      "_href": "/content/locations/1",
+      "_media-type": "application/vnd.ez.api.Location+json"
+    },
+    "rootUserGroup": {
+      "_href": "/user/groups/1/5",
+      "_media-type": "application/vnd.ez.api.UserGroup+json"
+    },
+    "rootMediaFolder": {
+      "_href": "/content/locations/1/43",
+      "_media-type": "application/vnd.ez.api.Location+json"
+    }
+    "trash": {
+      "_href": "/content/trash",
+      "_media-type": "application/vnd.ez.api.LocationList+json"
+    },
+    "sections": {
+      "_href": "/content/sections",
+      "_media-type": "application/vnd.ez.api.SectionList+json"
+    }
+    "sections": {
+      "_href": "/content/views",
+      "_media-type": "application/vnd.ez.api.ViewList+json"
+    }
+  }
+}
+
+
+
+
+

3.2.3   Managing content

+
+

3.2.3.1   Creating Content

+ +++ + + + + + + + + + + + +
Resource:

/content/objects

+
Method:

POST

+
Description:

Creates a new content draft assigned to the authenticated user. If a different userId is given in the input +it is assigned to the given user but this required special rights for the authenticated user (this is useful +for content staging where the transfer process does not have to authenticate with the user which created the +content object in the source server). +The user has to publish the content if it should be visible.

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.Content+xml:
 if set all informations for the content object including the embedded current version are returned in xml format (see Content)
application/vnd.ez.api.Content+json:
 if set all informations for the content object including the embedded current version are returned in json format (see Content)
application/vnd.ez.api.ContentInfo+xml:
 if set all informations for the content object (excluding the current version) are returned in xml format (see Content)
application/vnd.ez.api.ContentInfo+json:
 if set all informations for the content object (excluding the current version) are returned in json format (see Content)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentCreate+json:
 the ContentCreate schema encoded in json
application/vnd.ez.api.ContentCreate+xml:
 the ContentCreate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objects/<newID>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Content
+
+ +++ + + + +
Error codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition or the validation on a field fails,
401:If the user is not authorized to create this object in this location
404:If a parent location in specified in the request body (see ContentCreate) and it does not exist
+
+
+
3.2.3.1.1   XML Example
+
+POST /content/objects HTTP/1.1
+Host: www.example.net
+Accept: application/vnd.ez.api.Content+xml
+Content-Type: application/vnd.ez.api.ContentCreate+xml
+Content-Length: xxx
+
+
+<ContentCreate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <ContentType href="/content/types/10"/>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <LocationCreate>
+    <ParentLocation href="/content/locations/1/4/89" />
+    <priority>0</priority>
+    <hidden>false</hidden>
+    <sortField>PATH</sortField>
+    <sortOrder>ASC</sortOrder>
+  </LocationCreate>
+  <Section href="/content/sections/4"/>
+  <alwaysAvailable>true</alwaysAvailable>
+  <remoteId>remoteId12345678</remoteId>
+  <fields>
+    <field>
+      <fieldDefinitionIdentifer>title</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>This is a title</fieldValue>
+    </field>
+    <field>
+      <fieldDefinitionIdentifer>summary</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>This is a summary</fieldValue>
+    </field>
+    <field>
+      <fieldDefinitionIdentifer>authors</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>
+        <value>
+          <value key="name">John Doe</value>
+          <value key="email">john.doe@example.net</value>
+        </value>
+        <value>
+          <value key="name">Bruce Willis</value>
+          <value key="email">bruce.willis@example.net</value>
+        </value>
+      </fieldValue>
+    </field>
+  </fields>
+</ContentCreate>
+
+
+HTTP/1.1 201 Created
+Location: /content/objects/23
+ETag: "12345678"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+xml;charset=utf8
+Content-Type: application/vnd.ez.api.Content+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Content href="/content/objects/23" id="23"
+  media-type="application/vnd.ez.api.Content+xml" remoteId="remoteId12345678" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <ContentType href="/content/types/10" media-type="application/vnd.ez.api.ContentType+xml" />
+  <Name>This is a title</Name>
+  <Versions href="/content/objects/23/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+  <CurrentVersion href="/content/objects/23/currentversion"
+    media-type="application/vnd.ez.api.Version+xml">
+    <Version href="/content/objects/23/versions/1" media-type="application/vnd.ez.api.Version+xml">
+      <VersionInfo>
+        <id>123</id>
+        <versionNo>1</versionNo>
+        <status>DRAFT</status>
+        <modificationDate>2012-02-12T12:30:00</modificationDate>
+        <Creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+        <creationDate>2012-02-12T12:30:00</creationDate>
+        <initialLanguageCode>eng-US</initialLanguageCode>
+        <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+      </VersionInfo>
+      <fields>
+        <field>
+          <id>1234</id>
+          <fieldDefinitionIdentifer>title</fieldDefinitionIdentifer>
+          <languageCode>eng-UK</languageCode>
+          <fieldValue>This is a title</fieldValue>
+        </field>
+        <field>
+          <id>1235</id>
+          <fieldDefinitionIdentifer>summary</fieldDefinitionIdentifer>
+          <languageCode>eng-UK</languageCode>
+          <fieldValue>This is a summary</fieldValue>
+        </field>
+        <field>
+          <fieldDefinitionIdentifer>authors</fieldDefinitionIdentifer>
+          <languageCode>eng-US</languageCode>
+          <fieldValue>
+            <value>
+              <value key="name">John Doe</value>
+              <value key="email">john.doe@example.net</value>
+            </value>
+            <value>
+              <value key="name">Bruce Willis</value>
+              <value key="email">bruce.willis@example.net</value>
+            </value>
+          </fieldValue>
+        </field>
+      </fields>
+      <Relations href="/content/objects/23/versions/1/relations" media-type="application/vnd.ez.api.RelationList+xml" />
+    </Version>
+  </CurrentVersion>
+  <Section href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/4/65" media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/23/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+  <lastModificationDate>2012-02-12T12:30:00</lastModificationDate>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+</Content>
+
+
+
+
3.2.3.1.2   JSON Example
+
+POST /content/objects HTTP/1.1
+Host: www.example.net
+Accept: application/vnd.ez.api.Content+json
+Content-Type: application/vnd.ez.api.ContentCreate+json
+Content-Length: xxx
+
+
+{
+  "ContentCreate": {
+    "ContentType": {
+      "_href": "/content/types/10",
+    },
+    "mainLanguageCode": "eng-US",
+    "LocationCreate": {
+      "ParentLocation": {
+        "_href": "/content/locations/1/4/89"
+      },
+      "priority": "0",
+      "hidden": "false",
+      "sortField": "PATH",
+      "sortOrder": "ASC"
+    }
+    "Section": {
+      "_href": "/content/sections/4",
+    },
+    "alwaysAvailable": "true",
+    "remoteId": "remoteId12345678",
+    "fields": {
+      "field": [
+        {
+          "fieldDefinitionIdentifer": "title",
+          "languageCode": "eng-US",
+          "fieldValue": "This is a title"
+        },
+        {
+          "fieldDefinitionIdentifer": "summary",
+          "languageCode": "eng-US",
+          "fieldValue": "This is a summary"
+        },
+        {
+          "fieldDefinitionIdentifer": "authors",
+          "languageCode": "eng-US",
+          "fieldValue": [
+                {
+                  "name": "John Doe",
+                  "email": "john.doe@example.net"
+                },
+                {
+                  "name": "Bruce Willis",
+                  "email": "bruce.willis@example.net"
+                }
+              ]
+        }
+      ]
+    }
+  }
+}
+
+
+HTTP/1.1 201 Created
+Location: /content/objects/23
+ETag: "12345678"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+json;charset=utf8
+Content-Type: application/vnd.ez.api.Content+json
+Content-Length: xxx
+
+
+{
+  "Content": {
+    "_href": "/content/objects/23",
+    "_id": "23",
+    "_media-type": "application/vnd.ez.api.Content+json",
+    "_remoteId": "qwert123",
+    "ContentType": {
+      "_href": "/content/types/10",
+      "_media-type": "application/vnd.ez.api.ContentType+json"
+    },
+    "name": "This is a title",
+    "Versions": {
+      "_href": "/content/objects/23/versions",
+      "_media-type": "application/vnd.ez.api.VersionList+json"
+    },
+    "CurrentVersion": {
+      "_href": "/content/objects/23/currentversion",
+      "_media-type": "application/vnd.ez.api.Version+json",
+      "Version": {
+        "_href": "/content/objects/23/versions/1",
+        "_media-type": "application/vnd.ez.api.Version+json",
+        "VersionInfo": {
+          "id": "123",
+          "versionNo": "1",
+          "status": "DRAFT",
+          "modificationDate": "2012-02-12T12:30:00",
+          "creator": {
+            "_href": "/user/users/14",
+            "_media-type": "application/vnd.ez.api.User+json"
+          },
+          "creationDate": "2012-02-12T12:30:00",
+          "initialLanguageCode": "eng-US",
+          "Content": {
+            "_href": "/content/objects/23",
+            "_media-type": "application/vnd.ez.api.ContentInfo+json"
+          }
+        },
+        "fields": {
+          "field": [
+            {
+              "id": "1234",
+              "fieldDefinitionIdentifer": "title",
+              "languageCode": "eng-UK",
+              "fieldValue": "This is a title"
+            },
+            {
+              "id": "1235",
+              "fieldDefinitionIdentifer": "summary",
+              "languageCode": "eng-UK",
+              "fieldValue": "This is a summary"
+            },
+            {
+              "fieldDefinitionIdentifer": "authors",
+              "languageCode": "eng-US",
+              "fieldValue":
+              [
+                {
+                  "name": "John Doe",
+                  "email": "john.doe@example.net"
+                },
+                {
+                  "name": "Bruce Willis",
+                  "email": "bruce.willis@example.net"
+                }
+              ]
+            }
+          ]
+        }
+      }
+    },
+    "Section": {
+      "_href": "/content/sections/4",
+      "_media-type": "application/vnd.ez.api.Section+json"
+    },
+    "MainLocation": {
+      "_href": "/content/locations/1/4/65",
+      "_media-type": "application/vnd.ez.api.Location+json"
+    },
+    "Locations": {
+      "_href": "/content/objects/23/locations",
+      "_media-type": "application/vnd.ez.api.LocationList+json"
+    },
+    "Owner": {
+      "_href": "/user/users/14",
+      "_media-type": "application/vnd.ez.api.User+json"
+    },
+    "lastModificationDate": "2012-02-12T12:30:00",
+    "mainLanguageCode": "eng-US",
+    "alwaysAvailable": "true"
+  }
+}
+
+
+
+
+

3.2.3.2   List/Search Content

+ +++ + + + + + + + +
Resource:/content/objects
Method:GET (not implemented)
Description:This resource will used in future for searching content by providing a query string as alternative to posting a view to /content/views.
+
+
+

3.2.3.3   Load Content

+ +++ + + + + + + + + + + + + + +
Resource:

/content/objects/<ID>

+
Method:

GET

+
Description:

Loads the content object for the given id. Depending on the Accept header the current version is embedded (i.e the current published version or if not exists the draft of the authenticated user)

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.Content+xml:
 if set all informations for the content object including the embedded current version are returned in xml format (see Content)
application/vnd.ez.api.Content+json:
 if set all informations for the content object including the embedded current version are returned in json format (see Content)
application/vnd.ez.api.ContentInfo+xml:
 if set all informations for the content object (excluding the current version) are returned in xml format (see Content)
application/vnd.ez.api.ContentInfo+json:
 if set all informations for the content object (excluding the current version) are returned in json format (see Content)
+
If-None-Match:

<etag> If the provided etag matches the current etag then a 304 Not Modified is returned. The etag changes if the meta data was changed - this happens also if there is a new published version..

+
+
Parameters: +++ + + + +
languages:(comma separated list) restricts the output of translatable fields to the given languages
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<ETag>"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to read this object. This could also happen if there is no published version yet and another user owns a draft of this content
404:If the ID is not found
+
+
+
3.2.3.3.1   XML Example
+
+GET /content/objects/23 HTTP/1.1
+Accept: application/vnd.ez.api.ContentInfo+xml
+If-None-Match: "12340577"
+
+
+HTTP/1.1 200 OK
+ETag: "12345678"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+xml;charset=utf8
+Content-Type: application/vnd.ez.api.ContentInfo+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Content href="/content/objects/23" id="23"
+  media-type="application/vnd.ez.api.Content+xml" remoteId="qwert123">
+  <ContentType href="/content/types/10" media-type="application/vnd.ez.api.ContentType+xml" />
+  <Name>This is a title</Name>
+  <Versions href="/content/objects/23/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+  <CurrentVersion href="/content/objects/23/currentversion"
+    media-type="application/vnd.ez.api.Version+xml"/>
+  <Section href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/4/65" media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/23/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+  <lastModificationDate>2012-02-12T12:30:00</lastModificationDate>
+  <publishedDate>2012-02-12T15:30:00</publishedDate>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+</Content>
+
+
+
+
+

3.2.3.4   Update Content

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>

+
Method:

PATCH or POST with header: X-HTTP-Method-Override: PATCH

+
Description:

this method updates the content metadata which is independent from a version.

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentInfo+xml:
 if set all informations for the content object (excluding the current version) are returned in xml format (see Content)
application/vnd.ez.api.ContentInfo+json:
 if set all informations for the content object (excluding the current version) are returned in json format (see Content)
+
If-Match:

<etag> Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned.

+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentUpdate+json:
 the ContentUpdate schema encoded in json
application/vnd.ez.api.ContentUpdate+xml:
 the ContentUpdate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + + + +
400:If the Input does not match the input schema definition.
401:If the user is not authorized to update this object
404:If the content id does not exist
412:If the current ETag does not match with the provided one in the If-Match header
415:If the media-type is not one of those specified in Headers
+
+
+
3.2.3.4.1   XML Example
+
+
In this example
+
    +
  • the main language is changed
  • +
  • a new section is assigned
  • +
  • the main location is changed
  • +
  • the always avalable flag is changed
  • +
  • the remoteId is changed
  • +
  • the owner of the content object is changed
  • +
+
+
+
+POST /content/objects/23 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Host: www.example.net
+If-Match: "12345678"
+Accept: application/vnd.ez.api.ContentInfo+xml
+Content-Type: application/vnd.ez.api.ContentCreate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentUpdate>
+  <mainLanguageCode>ger-DE</mainLanguageCode>
+  <Section href="/content/sections/3"/>
+  <MainLocation href="/content/locations/1/13/55"/>
+  <Owner href="/user/users/13"/>
+  <alwaysAvailable>false</alwaysAvailable>
+  <remoteId>qwert4321</remoteId>
+</ContentUpdate>
+
+
+HTTP/1.1 200 OK
+ETag: "12345699"
+Accept-Patch: application/vnd.ez.api.ContentUpdate+xml;charset=utf8
+Content-Type: application/vnd.ez.api.ContentInfo+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Content href="/content/objects/23" id="23"
+  media-type="application/vnd.ez.api.Content+xml" remoteId="qwert4321">
+  <ContentType href="/content/types/10" media-type="application/vnd.ez.api.ContentType+xml" />
+  <Name>This is a title</Name>
+  <Versions href="/content/objects/23/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+  <CurrentVersion href="/content/objects/23/currentversion"
+    media-type="application/vnd.ez.api.Version+xml"/>
+  <Section href="/content/sections/3" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/13/55" media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/23/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/13" media-type="application/vnd.ez.api.User+xml" />
+  <lastModificationDate>2012-02-12T12:30:00</lastModificationDate>
+  <publishedDate>2012-02-12T15:30:00</publishedDate>
+  <mainLanguageCode>ger-DE</mainLanguageCode>
+  <alwaysAvailable>false</alwaysAvailable>
+</Content>
+
+
+
+
+

3.2.3.5   Delete Content

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>

+
Method:

DELETE

+
Description:

The content is deleted. If the content has locations (which is required in 4.x) +on delete all locations assigned the content object are deleted via delete subtree.

+
Response:

204

+
Error Codes: +++ + + + + + +
404:content object was not found
401:If the user is not authorized to delete this object
+
+
+
+

3.2.3.6   Copy content

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>

+
Method:

COPY or POST with header: X-HTTP-Method-Override COPY

+
Description:

Creates a new content object as copy under the given parent location given in the destination header.

+
Headers: +++ + + + +
Destination:A location resource to which the content object should be copied.
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objects/<newId>
+
+ +++ + + + +
Error codes: +++ + + + + + +
401:If the user is not authorized to copy this object to the given location
404:If the source or destination resource do not exist.
+
+
+
3.2.3.6.1   Example
+
+COPY /content/objects/23 HTTP/1.1
+Host: api.example.com
+Destination: /content/locations/1/4/78
+
+HTTP/1.1 201 Created
+Location: /content/objects/74
+
+
+
+
+
+

3.2.4   Managing Versions

+
+

3.2.4.1   Get Current Version

+ +++ + + + + + + + + + +
Resource:/content/objects/<ID>/currentversion
Method:GET
Description:Redirects to the current version of the content object
Response:
+
+HTTP/1.1 307 Temporary Redirect
+Location: /content/objects/<ID>/version/<current_version_no>
+
+ +++ + + + +
Error Codes: +++ + + + +
404:If the resource does not exist
+
+
+
+

3.2.4.2   List Versions

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/versions

+
Method:

GET

+
Description:

Returns a list of all versions of the content. This method does not include fields and relations in the Version elements of the response.

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.VersionList+xml:
 if set the version list is returned in xml format (see VersionList)
application/vnd.ez.api.VersionList+json:
 if set the version list is returned in json format
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+VersionList
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read the versions
+
+
+
3.2.4.2.1   XML Example
+
+GET /content/objects/23/versions HTTP/1.1
+Host: api.example.com
+Accept: application/vnd.ez.api.VersionList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.VersionList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<VersionList href="/content/objects/23/versions" media-type="application/vnd.ez.api.VersionList+xml">
+  <VersionItem>
+    <Version href="/content/objects/23/versions/1" media-type="application/vnd.ez.api.Version+xml"/>
+    <VersionInfo>
+      <id>12</id>
+      <versionNo>1</versionNo>
+      <status>ARCHIVED</status>
+      <modificationDate>2012-02-15T12:00:00</modificationDate>
+      <Creator href="/user/users/8" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>22012-02-15T12:00:00</creationDate>
+      <initialLanguageCode>eng-US</initialLanguageCode>
+      <names>
+        <value languageCode="eng-US">Name</value>
+      </names>
+      <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+  </VersionItem>
+  <VersionItem>
+    <Version href="/content/objects/23/versions/2" media-type="application/vnd.ez.api.Version+xml"/>
+    <VersionInfo>
+      <id>22</id>
+      <versionNo>2</versionNo>
+      <status>PUBLISHED</status>
+      <modificationDate>2012-02-17T12:00:00</modificationDate>
+      <Creator href="/user/users/8" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>22012-02-17T12:00:00</creationDate>
+      <initialLanguageCode>eng-US</initialLanguageCode>
+      <names>
+        <value languageCode="eng-US">Name</value>
+      </names>
+      <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+  </VersionItem>
+  <VersionItem>
+    <Version href="/content/objects/23/versions/3" media-type="application/vnd.ez.api.Version+xml"/>
+    <VersionInfo>
+      <id>44</id>
+      <versionNo>3</versionNo>
+      <status>DRAFT</status>
+      <modificationDate>2012-02-19T12:00:00</modificationDate>
+      <Creator href="/user/users/65" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>22012-02-19T12:00:00</creationDate>
+      <initialLanguageCode>fra-FR</initialLanguageCode>
+      <names>
+        <value languageCode="eng-US">Name</value>
+        <value languageCode="fra-FR">Nom</value>
+      </names>
+      <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+  </VersionItem>
+  <VersionItem>
+    <Version href="/content/objects/23/versions/4" media-type="application/vnd.ez.api.Version+xml"/>
+    <VersionInfo>
+      <id>45</id>
+      <versionNo>4</versionNo>
+      <status>DRAFT</status>
+      <modificationDate>2012-02-20T12:00:00</modificationDate>
+      <Creator href="/user/users/44" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>22012-02-20T12:00:00</creationDate>
+      <initialLanguageCode>ger-DE</initialLanguageCode>
+      <names>
+        <value languageCode="eng-US">Name</value>
+        <value languageCode="ger-DE">Name</value>
+      </names>
+      <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+  </VersionItem>
+</VersionList>
+
+
+
+
+

3.2.4.3   Load Version

+ +++ + + + + + + + + + + + + + +
Resource:

/content/objects/<ID>/versions/<versionNo>

+
Method:

GET

+
Description:

Loads a specific version of a content object. This method returns fields and relations

+
Parameters: +++ + + + + + + + +
fields:comma separated list of fields which should be returned in the response (see Content)
responseGroups:alternative: comma separated lists of predefined field groups (see REST API Spec v1)
languages:(comma separated list) restricts the output of translatable fields to the given languages
+
Headers: +++ + + + + + +
If-None-Match:

<etag> Only return the version if the given <etag> is the not current one otherwise a 304 is returned.

+
Accept: +++ + + + + + + + +
application/vnd.ez.api.Version+xml:
 if set the version list is returned in xml format (see VersionList)
application/vnd.ez.api.Version+json:
 if set the version list is returned in json format
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending_on_accept_header>
+Content-Length: <length>
+ETag: <etag>
+Accept-Patch: application/vnd.ez.api.VersionUpdate+xml (ONLY if version is a draft)
+
+
+Version
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to read this object
404:If the ID or version is not found
304:If the etag does not match the current one
+
+
+
3.2.4.3.1   XML Example
+
+GET /content/objects/23/versions/4 HTTP/1.1
+Host: api.example.com
+If-None-Match: "1758f762"
+Accept: application/vnd.ez.api.Version+xml
+
+
+HTTP/1.1 200 OK
+Accept-Patch: application/vnd.ez.api.VersionUpdate+xml
+ETag: "a3f2e5b7"
+Content-Type: application/vnd.ez.api.Version+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Version href="/content/objects/23/versions/4" media-type="application/vnd.ez.api.Version+xml"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <VersionInfo>
+    <id>45</id>
+    <versionNo>4</versionNo>
+    <status>DRAFT</status>
+    <modificationDate>2012-02-20T12:00:00</modificationDate>
+    <Creator href="/user/users/44" media-type="application/vnd.ez.api.User+xml" />
+    <creationDate>22012-02-20T12:00:00</creationDate>
+    <initialLanguageCode>ger-DE</initialLanguageCode>
+    <names>
+      <value languageCode="ger-DE">Name</value>
+    </names>
+    <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+  </VersionInfo>
+  <Fields>
+    <field>
+      <id>1234</id>
+      <fieldDefinitionIdentifer>title</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>Titel</fieldValue>
+    </field>
+    <field>
+      <id>1235</id>
+      <fieldDefinitionIdentifer>summary</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>Dies ist eine Zusammenfassungy</fieldValue>
+    </field>
+    <field>
+      <fieldDefinitionIdentifer>authors</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>
+        <value>
+          <value key="name">Karl Mustermann</value>
+          <value key="email">karl.mustermann@example.net</value>
+        </value>
+      </fieldValue>
+    </field>
+  </Fields>
+  <Relations  href="/content/objects/23/relations"  media-type="application/vnd.ez.api.RelationList+xml">>
+    <Relation href="/content/objects/23/relations/32" media-type="application/vnd.ez.api.Relation+xml">
+      <SourceContent href="/content/objects/23"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <DestinationContent href="/content/objects/45"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <RelationType>COMMON</RelationType>
+    </Relation>
+  </Relations>
+</Version>
+
+
+
+
+

3.2.4.4   Update Version

+ +++ + + + + + + + + + + + + + +
Resource:

/content/objects/<ID>/version/<versionNo>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

A specific draft is updated.

+
Parameters: +++ + + + +
languages:(comma separated list) restricts the output of translatable fields to the given languages
+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Version+xml:
 if set the updated version is returned in xml format (see Version)
application/vnd.ez.api.Version+json:
 if set the updated version returned in json format (see Version)
+
If-Match:

Causes to patch only if the specified etag is the current one

+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.VersionUpdate+json:
 the VersionUpdate schema encoded in json
application/vnd.ez.api.VersionUpdate+xml:
 the VersionUpdate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.VersionUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Version
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update this version
403:If the version is not allowed to change - i.e is not a DRAFT
404:If the content id or version id does not exist
412:If the current ETag does not match with the provided one in the If-Match header
+
+
+
3.2.4.4.1   XML Example
+
+POST /content/objects/23/versions/4 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Host: www.example.net
+If-Match: "a3f2e5b7"
+Accept: application/vnd.ez.api.Version+xml
+Content-Type: application/vnd.ez.api.VersionUpdate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<VersionUpdate xmlns:p="http://ez.no/API/Values"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://ez.no/API/Values ../VersionUpdate.xsd ">
+  <modificationDate>2001-12-31T12:00:00</modificationDate>
+  <initialLanguageCode>ger-DE</initialLanguageCode>
+  <fields>
+    <field>
+      <id>1234</id>
+      <fieldDefinitionIdentifer>title</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>Neuer Titel</fieldValue>
+    </field>
+    <field>
+      <id>1235</id>
+      <fieldDefinitionIdentifer>summary</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>Dies ist eine neue Zusammenfassungy</fieldValue>
+    </field>
+  </fields>
+</VersionUpdate>
+
+
+HTTP/1.1 200 OK
+Accept-Patch: application/vnd.ez.api.VersionUpdate+xml
+ETag: "a3f2e5b9"
+Content-Type: application/vnd.ez.api.Version+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Version href="/content/objects/23/versions/4" media-type="application/vnd.ez.api.Version+xml">
+  <VersionInfo>
+    <id>45</id>
+    <versionNo>4</versionNo>
+    <status>DRAFT</status>
+    <modificationDate>2012-02-20T12:00:00</modificationDate>
+    <Creator href="/user/users/44" media-type="application/vnd.ez.api.User+xml" />
+    <creationDate>22012-02-20T12:00:00</creationDate>
+    <initialLanguageCode>ger-DE</initialLanguageCode>
+    <names>
+      <value languageCode="ger-DE">Neuer Titel</value>
+    </names>
+    <Content href="/content/objects/23" media-type="application/vnd.ez.api.ContentInfo+xml" />
+  </VersionInfo>
+  <Fields>
+    <field>
+      <id>1234</id>
+      <fieldDefinitionIdentifer>title</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>Neuer Titel</fieldValue>
+    </field>
+    <field>
+      <id>1235</id>
+      <fieldDefinitionIdentifer>summary</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>Dies ist eine neuse Zusammenfassungy</fieldValue>
+    </field>
+    <field>
+      <fieldDefinitionIdentifer>authors</fieldDefinitionIdentifer>
+      <languageCode>ger-DE</languageCode>
+      <fieldValue>
+        <authors>
+          <author name="Klaus Mustermann" email="klaus.mustermann@example.net" />
+        </authors>
+      </fieldValue>
+    </field>
+  </Fields>
+  <Relations>
+    <Relation href="/content/object/32/versions/2/relations/43" media-type="application/vnd.ez.api.Relation+xml">
+      <SourceContent href="/content/objects/23"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <DestinationContent href="/content/objects/45"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <RelationType>COMMON</RelationType>
+    </Relation>
+  </Relations>
+</Version>
+
+
+
+
+

3.2.4.5   Create a Draft from a Version

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/versions/<no>

+
Method:

COPY or POST with header X-HTTP-Method-Override: COPY

+
Description:

The system creates a new draft version as a copy from the given version

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Version+xml:
 if set the updated version is returned in xml format (see Version)
application/vnd.ez.api.Version+json:
 if set the updated version returned in json format (see Version)
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objects/<ID>/versions/<new-versionNo>
+ETag: <etag>
+Accept-Patch: application/vnd.ez.api.VersionUpdate+xml
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Version
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to update this object
404:If the content object was not found
+
+
+
+

3.2.4.6   Create a Draft from current Version

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/currentversion

+
Method:

COPY or POST with header X-HTTP-Method-Override: COPY

+
Description:

The system creates a new draft version as a copy from the current version

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Version+xml:
 if set the updated version is returned in xml format (see Version)
application/vnd.ez.api.Version+json:
 if set the updated version returned in json format (see Version)
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objects/<ID>/versions/<new-versionNo>
+ETag: <etag>
+Accept-Patch: application/vnd.ez.api.VersionUpdate+xml
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Version
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to update this object
403:If the current version is already a draft
404:If the content object was not found
+
+
+
+

3.2.4.7   Delete Content Version

+ +++ + + + + + + + + + +
Resource:/content/objects/<ID>/version/<versionNo>
Method:DELETE
Description:The version is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
404:if the content object or version nr was not found
401:If the user is not authorized to delete this version
403:If the version is in state published
+
+
+
+

3.2.4.8   Publish a content version

+ +++ + + + + + + + + + +
Resource:/content/objects/<ID>/version/<versionNo>
Method:PUBLISH or POST with header X-HTTP-Method-Override: PUBLISH
Description:The content version is published
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
404:if the content object or version nr was not found
401:If the user is not authorized to publish this version
403:If the version is not a draft
+
+
+
+
+

3.2.5   Managing Relations

+
+

3.2.5.1   Load relations of content

+ +++ + + + + + + + + + +
Resource:/content/objects/<ID>/relations
Method:GET
Description:redirects to the relations of the current version
Response:
+
+HTTP/1.1 307 Temporary Redirect
+Location: /content/objects/<ID>/versions/<currentversion>/relations
+
+ +++ + + + + + + + +
Error Codes:
401:If the user is not authorized to read this object
404:If the content object was not found
+
+
+

3.2.5.2   Load relations of version

+ +++ + + + + + + + + + + + + + +
Resource:

/content/objects/<ID>/versions/<no>/relations

+
Method:

GET

+
Description:

loads the relations of the given version

+
Parameters: +++ + + + + + +
offset:the offset of the result set
limit:the number of relations returned
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RelationList+xml:
 if set the relation is returned in xml format (see RelationList)
application/vnd.ez.api.RelationList+json:
 if set the relation is returned in json format (see RelationList)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on Accept header>
+Content-Length: xxx
+
+
+RelationList
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to read this object
404:If the content object was not found
+
+
+
3.2.5.2.1   XML Example
+
+GET /content/objects/23/versions/2/relations HTTP/1.1
+Accept: application/vnd.ez.api.RelationList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.RelationList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Relations href="/content/object/32/versions/2/relations" media-type="application/vnd.ez.api.RelationList+xml">
+    <Relation href="/content/object/32/versions/2/relations/43" media-type="application/vnd.ez.api.Relation+xml">
+      <SourceContent href="/content/objects/23"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <DestinationContent href="/content/objects/45"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <RelationType>COMMON</RelationType>
+    </Relation>
+    <Relation href="/content/object/32/versions/2/relations/98" media-type="application/vnd.ez.api.Relation+xml">
+      <SourceContent href="/content/objects/23"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <DestinationContent href="/content/objects/87"
+        media-type="application/vnd.ez.api.ContentInfo+xml" />
+      <sourceFieldDefinitionIdentifier>body</sourceFieldDefinitionIdentifier>
+      <RelationType>EMBED</RelationType>
+    </Relation>
+</Relations>
+
+
+
+
+

3.2.5.3   Load a relation

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/versions/<no>/relations/<ID>

+
Method:

GET

+
Description:

loads a relation for the given content object

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Relation+xml:
 if set the relation is returned in xml format (see Relation)
application/vnd.ez.api.Relation+json:
 if set the relation is returned in json format (see Relation)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on Accept header>
+Content-Length: xxx
+
+
+Relation (relationValueType(
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the object with the given id or the relation does not exist
401:If the user is not authorized to read this object
+
+
+
+

3.2.5.4   Create a new Relation

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/versions/<no>/relations

+
Method:

POST

+
Description:

Creates a new relation of type COMMON for the given draft.

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Relation+xml:
 if set the updated version is returned in xml format (see RelationCreate)
application/vnd.ez.api.Relation+json:
 if set the updated version returned in json format (see RelationCreate)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.RelationCreate+xml:
 the RelationCreate (see RelationCreate) schema encoded in xml
application/vnd.ez.api.RelationCreate+json:
 the RelationCreate (see RelationCreate) schema encoded in json
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objects/<ID>/versions/<no>/relations/<newId>
+Content-Type: <depending on Accept header>
+Content-Length: xxx
+
+
+Relation (relationValueType(
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to update this content object
403:If a relation to the destId already exists or the destId does not exist or the version is not a draft.
404:If the object or version with the given id does not exist
+
+
+
3.2.5.4.1   XML Example
+
+POST /content/objects/23/versions/4/relations HTTP/1.1
+Accept: application/vnd.ez.api.Relation+xml
+Content-Type: application/vnd.ez.api.RelationCreate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<RelationCreate>
+  <Destination href="/content/objects/66"/>
+</RelationCreate>
+
+
+HTTP/1.1 201 Created
+Location: /content/objects/23/versions/4/relations
+Content-Type: application/vnd.ez.api.RelationCreate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Relation href="/content/object/32/versions/2/relations/66" media-type="application/vnd.ez.api.Relation+xml">
+  <SourceContent href="/content/objects/23"
+    media-type="application/vnd.ez.api.ContentInfo+xml" />
+  <DestinationContent href="/content/objects/66"
+    media-type="application/vnd.ez.api.ContentInfo+xml" />
+  <RelationType>COMMON</RelationType>
+</Relation>
+
+
+
+
+

3.2.5.5   Delete a relation

+ +++ + + + + + + + + + +
Resource:/content/objects/<ID>/versions/<versionNo>/relations/<ID>
Method:DELETE
Description:Deletes a relation of the given draft.
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
404:content object was not found or the relation was not found in the given version
401:If the user is not authorized to delete this relation
403:If the relation is not of type COMMON or the given version is not a draft
+
+
+
+
+

3.2.6   Managing Locations

+
+

3.2.6.1   Create a new location for a content object

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/locations

+
Method:

POST

+
Description:

Creates a new location for the given content object

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Location+xml:
 if set the new location is returned in xml format (see Location)
application/vnd.ez.api.Location+json:
 if set the new location is returned in json format (see Location)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.LocationCreate+json:
 the LocationCreate schema encoded in json
application/vnd.ez.api.LocationCreate+xml:
 the LocationCreate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/locations/<newPath>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.LocationUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Location
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this location
403:If a location under the given parent id already exists
+
+
+
3.2.6.1.1   XML Example
+
+POST /content/objects/23/locations HTTP/1.1
+Accept: application/vnd.ez.api.Location+xml
+Content-Type: application/vnd.ez.api.LocationCreate+xml
+Contnt-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<LocationCreate>
+  <ParentLocation href="/content/locations/1/5/73" />
+  <priority>0</priority>
+  <hidden>false</hidden>
+  <sortField>PATH</sortField>
+  <sortOrder>ASC</sortOrder>
+</LocationCreate>
+
+
+HTTP/1.1 201 Created
+Location: /content/locations/1/5/73/133
+ETag: "2345563422"
+Accept-Patch: application/vnd.ez.api.LocationUpdate+xml
+Content-Type: application/vnd.ez.api.Location+xml
+Contnt-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Location href="/content/locations/1/5/73/133" media-type="application/vnd.ez.api.Location+xml">
+  <id>133</id>
+  <priority>0</priority>
+  <hidden>false</hidden>
+  <invisible>false</invisible>
+  <ParentLocation href="/content/locations/1/5/73" media-type="application/vnd.ez.api.Location+xml"/>
+  <pathString>/1/5/73/133</pathString>
+  <depth>4</depth>
+  <childCount>0</childCount>
+  <remoteId>remoteId-qwert567</remoteId>
+  <Children href="/content/locations/1/5/73/133/children" media-type="application/vnd.ez.api.LocationList+xml"/>
+  <Content href="/content/objects/23" media-type="application/vnd.ez.api.Content+xml"/>
+  <sortField>PATH</sortField>
+  <sortOrder>ASC</sortOrder>
+</Location>
+
+
+
+
+

3.2.6.2   Get locations for a content object

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/locations

+
Method:

GET

+
Description:

loads all locations for the given content object

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.LocationList+xml:
 if set the new location is returned in xml format (see Location)
application/vnd.ez.api.LocationList+json:
 if set the new location is returned in json format (see Location)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Location  (locationListType)
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the object with the given id does not exist
401:If the user is not authorized to read this object
+
+
+
3.2.6.2.1   XML Example
+
+GET /content/objects/23/locations HTTP/1.1
+Accept: application/vnd.ez.api.LocationList+xml
+
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Content-Type:  application/vnd.ez.api.LocationList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<LocationList href="/content/objects/23/locations" media-type="application/vnd.ez.api.LocationList+xml">
+  <Location href="/content/locations/1/2/56" media-type="application/vnd.ez.api.Location+xml"/>
+  <Location href="/content/locations/1/4/73/133" media-type="application/vnd.ez.api.Location+xml"/>
+</LocationList>
+
+
+
+
+

3.2.6.3   Load locations by id

+ +++ + + + + + + + + + + + +
Resource:

/content/locations

+
Method:

GET

+
Description:

loads the location for a given id (x)or remote id

+
Parameters: +++ + + + + + +
id:the id of the location. If present the location is with the given id is returned.
remoteId:the remoteId of the location. If present the location with the given remoteId is returned
+
Response:
+
+HTTP/1.1 307 Temporary Redirect
+Location: /content/locations/<path>
+
+ +++ + + + +
Error Codes: +++ + + + +
404:If the location with the given id (remoteId) does not exist
+
+
+
+

3.2.6.4   Load location

+ +++ + + + + + + + + + + + +
Resource:

/content/locations/<path>

+
Method:

GET

+
Description:

loads the location for the given path

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Location+xml:
 if set the new location is returned in xml format (see Location)
application/vnd.ez.api.Location+json:
 if set the new location is returned in json format (see Location)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Location: /content/locations/<path>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.LocationUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Location
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the location with the given path does not exist
401:If the user is not authorized to read this location
+
+
+
3.2.6.4.1   XML Example
+
+GET /content/locations/1/4/73/133 HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.Location+xml
+If-None-Match: "2345503255"
+
+
+HTTP/1.1 200 OK
+ETag: "2345563422"
+Accept-Patch: application/vnd.ez.api.LocationUpdate+xml
+Content-Type: application/vnd.ez.api.Location+xml
+Contnt-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Location href="/content/locations/1/5/73/133" media-type="application/vnd.ez.api.Location+xml">
+  <id>133</id>
+  <priority>0</priority>
+  <hidden>false</hidden>
+  <invisible>false</invisible>
+  <ParentLocation href="/content/locations/1/5/73" media-type="application/vnd.ez.api.Location+xml"/>
+  <pathString>/1/5/73/133</pathString>
+  <depth>4</depth>
+  <childCount>0</childCount>
+  <remoteId>remoteId-qwert567</remoteId>
+  <Children href="/content/locations/1/5/73/133/children" media-type="application/vnd.ez.api.LocationList+xml"/>
+  <Content href="/content/objects/23" media-type="application/vnd.ez.api.Content+xml"/>
+  <sortField>PATH</sortField>
+  <sortOrder>ASC</sortOrder>
+</Location>
+
+
+
+
+

3.2.6.5   Update location

+ +++ + + + + + + + + + + + +
Resource:

/content/locations/<ID>

+
Method:

PATCH or POST with header: X-HTTP-Method-Override: PATCH

+
Description:

updates the location, this method can also be used to hide/unhide a location via the hidden field in the LocationUpdate

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Location+xml:
 if set the new location is returned in xml format (see Location)
application/vnd.ez.api.Location+json:
 if set the new location is returned in json format (see Location)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.LocationUpdate+json:
 the LocationUpdate schema encoded in json
application/vnd.ez.api.LocationUpdate+xml:
 the LocationUpdate schema encoded in xml
+
If-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Location: /content/locations/<path>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.LocationUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Location
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the location with the given id does not exist
401:If the user is not authorized to update this location
+
+
+
3.2.6.5.1   XML Example
+
+POST /content/locations/1/5/73/133 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Host: www.example.net
+If-Match: "12345678"
+Accept: application/vnd.ez.api.Location+xml
+Content-Type: :application/vnd.ez.api.LocationUpdate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<LocationUpdate>
+  <priority>3</priority>
+  <hidden>true</hidden>
+  <remoteId>remoteId-qwert999</remoteId>
+  <sortField>CLASS</sortField>
+  <sortOrder>DESC</sortOrder>
+</LocationUpdate>
+
+
+HTTP/1.1 200 OK
+ETag: "2345563444"
+Accept-Patch: application/vnd.ez.api.LocationUpdate+xml
+Content-Type: application/vnd.ez.api.Location+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Location href="/content/locations/1/5/73/133" media-type="application/vnd.ez.api.Location+xml">
+  <id>133</id>
+  <priority>3</priority>
+  <hidden>true</hidden>
+  <invisible>true</invisible>
+  <ParentLocation href="/content/locations/1/5/73" media-type="application/vnd.ez.api.Location+xml"/>
+  <pathString>/1/5/73/133</pathString>
+  <depth>4</depth>
+  <childCount>0</childCount>
+  <remoteId>remoteId-qwert999</remoteId>
+  <Children href="/content/locations/1/5/73/133/children" media-type="application/vnd.ez.api.LocationList+xml"/>
+  <Content href="/content/objects/23" media-type="application/vnd.ez.api.Content+xml"/>
+  <sortField>CLASS</sortField>
+  <sortOrder>ASC</sortOrder>
+</Location>
+
+
+
+
+

3.2.6.6   Get child locations

+ +++ + + + + + + + + + + + + + +
Resource:

/content/locations/<path>/children

+
Method:

GET

+
Description:

loads all child locations for the given parent location

+
Parameters: +++ + + + + + +
offset:the offset of the result set
limit:the number of locations returned
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.LocationList+xml:
 if set the new location list is returned in xml format (see Location)
application/vnd.ez.api.LocationList+json:
 if set the new location list is returned in json format (see Location)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Location
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the object with the given id does not exist
401:If the user is not authorized to read this object
+
+
+
3.2.6.6.1   XML Example
+
+GET /content/locations/1/2/54/children HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.LocationList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type:  application/vnd.ez.api.LocationList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<LocationList href="/content/locations/1/2/54" media-type="application/vnd.ez.api.LocationList+xml">
+  <Location href="/content/locations/1/2/54/134" media-type="application/vnd.ez.api.Location+xml"/>
+  <Location href="/content/locations/1/4/54/143" media-type="application/vnd.ez.api.Location+xml"/>
+</LocationList>
+
+
+
+
+

3.2.6.7   Move Subtree

+ +++ + + + + + + + + + + + +
Resource:

/content/locations/<path>

+
Method:

MOVE or POST with header X-HTTP-Method-Override: MOVE

+
Description:

moves the location to another parent. The destination can also be /content/trash where the location is put into the trash.

+
Headers: +++ + + + +
Destination:A parent location resource to which the location is moved
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/locations/<newPath>
+
+

or if destination is /content/trash

+
+HTTP/1.1 201 Created
+Location: /content/trash/<ID>
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the location with the given id does not exist
401:If the user is not authorized to move this location
+
+
+
+

3.2.6.8   Copy Subtree

+ +++ + + + + + + + + + + + +
Resource:

/content/locations/<path>

+
Method:

COPY or POST with header X-HTTP-Method-Override: COPY

+
Description:

copies the subtree to another parent

+
Headers: +++ + + + +
Destination:A parent location resource to which the location is moved
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/locations/<newPath>
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the location with the given id does not exist
401:If the user is not authorized to move this location
+
+
+
+

3.2.6.9   Swap Location

+ +++ + + + + + + + + + + + +
Resource:

/content/locations/<ID>

+
Method:

SWAP or POST with header X-HTTP-Method-Override: SWAP

+
Description:

Swaps the content of the location with the content of the given location

+
Headers: +++ + + + +
Destination:A location resource with which the content is swapped
+
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the location with the given id does not exist
401:If the user is not authorized to swap this location
+
+
+
+

3.2.6.10   Delete Subtree

+ +++ + + + + + + + + + + + +
Resource:/content/locations/<path>
Method:DELETE
Description:Deletes the complete subtree for the given path. Every content object is deleted which does not have any other location. Otherwise the deleted location is removed from the content object. The children a recursively deleted.
Response:204
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
404:If the location with the given id does not exist
401:If the user is not authorized to delete this subtree
+
+
+
+
+

3.2.7   Views

+
+

3.2.7.1   Create View

+ +++ + + + + + + + + + + + +
Resource:

/content/views

+
Method:

POST

+
Description:

executes a query and returns view including the results +The View input reflects the criteria model of the public API.

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.View+xml:
 the view in xml format (see View)
application/vnd.ez.api.View+json:
 the view in xml format (see View)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ViewInput+xml:
 the view input in xml format (see View)
application/vnd.ez.api.ViewInput+json:
 the view input in xml format (see View)
+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<new etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+View
+
+ +++ + + + +
Error codes: +++ + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
+
+
+
3.2.7.1.1   XML Example
+

Perform a query on articles with a specific title.

+
+POST /content/views HTTP/1.1
+Accept: application/vnd.ez.api.View+xml
+Content-Type: application/vnd.ez.api.ViewInput+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ViewInput>
+  <identifier>TitleView</identifier>
+  <Query>
+    <Criteria>
+      <FullTextCritierion>Title</FieldCritierion>
+    </Criteria>
+    <limit>10</limit>
+    <offset>0</offset>
+    <SortClauses>
+      <SortClause>
+        <SortField>NAME</SortField>
+      </SortClause>
+    </SortClauses>
+    <FacetBuilders>
+      <contentTypeFacetBuilder/>
+    </FacetBuilders>
+  </Query>
+</ViewInput>
+
+
+HTTP/1.1 201 Created
+Location: /content/views/view1234
+Content-Type: application/vnd.ez.api.View+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<View href="/content/views/TitleView" media-type="application/vnd.ez.api.View+xml">
+  <identifier>TitleView</identifier>
+  <User href="/user/users/14" media-type="vnd.ez.api.User+xml"/>
+  <public>false</public>
+  <Query>
+    <Criteria>
+      <FullTextCritierion>Title</FieldCritierion>
+    </Criteria>
+    <limit>10</limit>
+    <offset>0</offset>
+    <SortClauses>
+      <SortClause>
+        <SortField>NAME</SortField>
+      </SortClause>
+    </SortClauses>
+    <FacetBuilders>
+      <contentTypeFacetBuilder/>
+    </FacetBuilders>
+  </Query>
+  <Result href="/content/views/view1234/results"
+    media-type="application/vnd.ez.api.ViewResult+xml" count="34" time="31" maxScore="1.0">
+    <searchHits>
+      <searchHit score="1.0" index="installid1234567890">
+        <hightlight/>
+        <value>
+          <Content href="/content/objects/23" id="23"
+            media-type="application/vnd.ez.api.Content+xml" remoteId="qwert123"
+            xmlns:p="http://ez.no/API/Values" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+            xsi:schemaLocation="http://ez.no/API/Values Content.xsd ">
+            <ContentType href="/content/types/10"
+              media-type="application/vnd.ez.api.ContentType+xml" />
+            <Name>Name</Name>
+            <Versions href="/content/objects/23/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+            <CurrentVersion href="/content/objects/23/currentversion"
+              media-type="application/vnd.ez.api.Version+xml">
+              <Version href="/content/objects/23/versions/2"
+                media-type="application/vnd.ez.api.Version+xml">
+                <VersionInfo>
+                  <id>123</id>
+                  <versionNo>2</versionNo>
+                  <status>PUBLISHED</status>
+                  <modificationDate>2001-12-31T12:00:00</modificationDate>
+                  <creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+                  <creationDate>2001-12-31T12:00:00</creationDate>
+                  <initialLanguageCode>eng-UK</initialLanguageCode>
+                  <Content href="/content/objects/23"
+                    media-type="application/vnd.ez.api.ContentInfo+xml" />
+                </VersionInfo>
+                <Fields>
+                  <field>
+                    <id>1234</id>
+                    <fieldDefinitionIdentifer>title</fieldDefinitionIdentifer>
+                    <languageCode>eng-UK</languageCode>
+                    <fieldValue>Title</fieldValue>
+                  </field>
+                  <field>
+                    <id>1235</id>
+                    <fieldDefinitionIdentifer>summary
+                    </fieldDefinitionIdentifer>
+                    <languageCode>eng-UK</languageCode>
+                    <fieldValue>This is a summary</fieldValue>
+                  </field>
+                </Fields>
+                <Relations />
+              </Version>
+            </CurrentVersion>
+            <Section href="/content/objects/23/section" media-type="application/vnd.ez.api.Section+xml" />
+            <MainLocation href="/content/objects/23/mainlocation"
+              media-type="application/vnd.ez.api.Location+xml" />
+            <Locations href="/content/objects/23/locations"
+              media-type="application/vnd.ez.api.LocationList+xml" />
+            <Owner href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+            <PublishDate>2001-12-31T12:00:00</PublishDate>
+            <LastModificationDate>2001-12-31T12:00:00</LastModificationDate>
+            <MainLanguageCode>eng-UK</MainLanguageCode>
+            <AlwaysAvailable>true</AlwaysAvailable>
+          </Content>
+        </value>
+      </searchHit>
+      ....
+    </searchHits>
+    <facets>
+      <contentTypeFacet>
+        <contentTypeFacetEntry>
+          <contentType href="/content/types/1"  media-type="application/vnd.ez.api.ContentType+xml"/>
+          <count>3</count>
+        </contentTypeFacetEntry>
+        <contentTypeFacetEntry>
+          <contentType href="/content/types/7"  media-type="application/vnd.ez.api.ContentType+xml"/>
+          <count>9</count>
+        </contentTypeFacetEntry>
+        <contentTypeFacetEntry>
+          <contentType href="/content/types/11"  media-type="application/vnd.ez.api.ContentType+xml"/>
+          <count>1</count>
+        </contentTypeFacetEntry>
+        <contentTypeFacetEntry>
+          <contentType href="/content/types/15"  media-type="application/vnd.ez.api.ContentType+xml"/>
+          <count>8</count>
+        </contentTypeFacetEntry>
+      </contentTypeFacet>
+    </facets>
+  </Result>
+</View>
+
+
+
+
+

3.2.7.2   List views

+ +++ + + + + + + + + + + + +
Resource:

/content/views

+
Method:

GET

+
Description:

Returns a list of view uris. The list includes public view and private view of the authenticated user.

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RefList+xml:
 the view link list in xml format (see View)
application/vnd.ez.api.RefList+json:
 the view link list in xml format (see View)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Common
+
+
+
+

3.2.7.3   Get View

+ +++ + + + + + + + + + + + +
Resource:

/content/views/<identifier>

+
Method:

GET

+
Description:

Returns the view

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.View+xml:
 the view excluding results in xml format (see View)
application/vnd.ez.api.View+json:
 the view excluding results in json format (see View)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+View
+
+ +++ + + + +
Error Codes: +++ + + + +
401:if the view is not public and from another user
+
+
+
+

3.2.7.4   Get Results of existing View

+ +++ + + + + + + + + + + + +
Resource:

/content/views/<identifier>/results

+
Method:

GET

+
Description:

Returns result of the view

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ViewResult+xml:
 the view excluding results in xml format (see View)
application/vnd.ez.api.ViewResult+json:
 the view excluding results in json format (see View)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+View
+
+ +++ + + + +
Error Codes: +++ + + + +
401:if the view is not public and from another user
+
+
+
+

3.2.7.5   Delete View

+ +++ + + + + + + + + + + + +
Resource:/content/views/<identifier>
Method:DELETE
Description:the given view is deleted
Parameters:
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete this view
404:If the view does not exist
+
+
+
+
+

3.2.8   Managing Sections

+
+

3.2.8.1   Create a new Section

+ +++ + + + + + + + + + + + +
Resource:

/content/sections

+
Method:

POST

+
Description:

Creates a new section

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Section+xml:
 if set the new section is returned in xml format (see Section)
application/vnd.ez.api.Section+json:
 if set the new section is returned in json format (see Section)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.SectionInput+json:
 the Section input schema encoded in json
application/vnd.ez.api.SectionInput+xml:
 the Section input schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/section/<ID>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.SectionInput+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Section
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this section
403:If a section with same identifier already exists
+
+
+
3.2.8.1.1   XML Example
+
+POST /content/sections HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.Section+xml
+Content-Type: application/vnd.ez.api.SectionInput+xml
+Content-Length: xxxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<SectionInput>
+  <identifier>restricted</identifier>
+  <name>Restricted</name>
+</SectionInput>
+
+
+HTTP/1.1 201 Created
+Location: /content/section/5
+ETag: "4567867894564356"
+Accept-Patch: application/vnd.ez.api.SectionInput+(json|xml)
+Content-Type:  application/vnd.ez.api.Section+xml
+Content-Length: xxxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Section href="/content/sections/5" media-type="application/vnd.ez.api.Section+xml">
+  <sectionId>5</sectionId>
+  <identifier>restricted</identifier>
+  <name>Restriced</name>
+</Section>
+
+
+
+
+

3.2.8.2   Get Sections

+ +++ + + + + + + + + + + + + + +
Resource:

/content/sections

+
Method:

GET

+
Description:

Returns a list of all sections

+
Parameters: +++ + + + +
identifer:only the section with the given identifier is returned.
+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.SectionList+xml:
 if set the section list is returned in xml format (see Section)
application/vnd.ez.api.SectionList+json:
 if set the section list is returned in json format (see Section)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Section  (sectionListType)
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read the sections
+
+
+
3.2.8.2.1   XML Example
+
+GET /content/sections
+Host: api.example.net
+If-None-Match: "43450986749098765"
+Accept: application/vnd.ez.api.SectionList+xml
+
+
+HTTP/1.1 200 OK
+ETag: "43450986743098576"
+Content-Type: application/vnd.ez.api.SectionList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<SectionList href="/content/sections" media-type="application/vnd.ez.api.SectionList+xml">
+  <Section href="/content/sections/1" media-type="application/vnd.ez.api.Section+xml">
+    <sectionId>1</sectionId>
+    <identifier>standard</identifier>
+    <name>Standard</name>
+  </Section>
+  <Section href="/content/sections/2" media-type="application/vnd.ez.api.Section+xml">
+    <sectionId>2</sectionId>
+    <identifier>users</identifier>
+    <name>Users</name>
+  </Section>
+  <Section href="/content/sections/3" media-type="application/vnd.ez.api.Section+xml">
+    <sectionId>3</sectionId>
+    <identifier>media</identifier>
+    <name>Media</name>
+  </Section>
+  <Section href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml">
+    <sectionId>4</sectionId>
+    <identifier>setup</identifier>
+    <name>Setup</name>
+  </Section>
+</SectionList>
+
+
+
+
+

3.2.8.3   Get Section

+ +++ + + + + + + + + + + + +
Resource:

/content/sections/<ID>

+
Method:

GET

+
Description:

Returns the section given by id

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Section+xml:
 if set the section is returned in xml format (see Section)
application/vnd.ez.api.Section+json:
 if set the section is returned in json format (see Section)
+
If-None-match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.SectionInput+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Section
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read this section
404:If the section does not exist
+
+
+
3.2.8.3.1   XML Example
+
+GET /content/sections/3 HTTP/1.1
+Host: api.example.net
+If-None-Match: "43450986749098765"
+Accept: application/vnd.ez.api.Section+xml
+
+
+HTTP/1.1 200 OK
+ETag: "4567867894564356"
+Accept-Patch: application/vnd.ez.api.SectionInput+(json|xml)
+Content-Type:  application/vnd.ez.api.Section+xml
+Content-Length: xxxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Section href="/content/sections/3" media-type="application/vnd.ez.api.Section+xml">
+  <sectionId>3</sectionId>
+  <identifier>media</identifier>
+  <name>Media</name>
+</Section>
+
+
+
+
+

3.2.8.4   Update a Section

+ +++ + + + + + + + + + + + +
Resource:

/content/sections/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override

+
Description:

Updates a section

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Section+xml:
 if set the updated section is returned in xml format (see Section)
application/vnd.ez.api.Section+json:
 if set the updated section is returned in json format (see Section)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.SectionInput+json:
 the Section input schema encoded in json
application/vnd.ez.api.SectionInput+xml:
 the Section input schema encoded in xml
+
If-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.SectionInput+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Section  (sectionListType)
+
+ +++ + + + +
Error Codes::400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage +:401: If the user is not authorized to create this section +:403: If a section with the given new identifier already exists +:412: If the current ETag does not match with the provided one in the If-Match header
+
+
+

3.2.8.5   Delete Section

+ +++ + + + + + + + + + + + +
Resource:

/content/sections/<ID>

+
Method:

DELETE

+
Description:

the given section is deleted

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ErrorMessage+xml:
 if set in the case of an error the error message is returned in xml format (see ErrorMessage)
application/vnd.ez.api.ErrorMessage+json:
 if set in the case of an error the error message is returned in json format (see ErrorMessage)
+
+
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete this section
404:If the section does not exist
+
+
+
+
+

3.2.9   Managing Trash

+
+

3.2.9.1   List TrashItems

+ +++ + + + + + + + + + + + + + +
Resource:

/content/trash

+
Method:

GET

+
Description:

Returns a list of all trash items

+
Parameters: +++ + + + + + +
limit:only <limit> items will be returned started by offset
offset:offset of the result set
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Trash+xml:
 if set the new location is returned in xml format (see Trash)
application/vnd.ez.api.Trash+json:
 if set the new location is returned in json format (see Trash)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Trash
+
+ +++ + + + +
ErrorCodes: +++ + + + +
401:If the user has no permission to read the trash
+
+
+
+

3.2.9.2   Get TrashItem

+ +++ + + + + + + + + + + + +
Resource:

/content/trash/<ID>

+
Method:

GET

+
Description:

Returns the trash item given by id

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.TrashItem+xml:
 if set the new trash item is returned in xml format (see Trash)
application/vnd.ez.api.TrashItem+json:
 if set the new trash item is returned in json format (see Trash)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Trash
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read the trash item
404:If the trash item with the given id does not exist
+
+
+
+

3.2.9.3   Untrash Item

+ +++ + + + + + + + + + + + +
Resource:

/content/trash/<ID>

+
Method:

MOVE or POST with header X-HTTP-Method-Override: MOVE

+
Description:

Restores a trashItem

+
Headers: +++ + + + +
Destination:if given the trash item is restored under this location otherwise under its orifinal parent location
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/locations/<newPath>
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to restore this trash item
403:if the given parent location does not exist
404:if the given trash item does not exist
+
+
+
+

3.2.9.4   Empty Trash

+ +++ + + + + + + + + + +
Resource:/content/trash
Method:DELETE
Description:Empties the trash
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user is not authorized to empty all trash items
+
+
+
+

3.2.9.5   Delete TrashItem

+ +++ + + + + + + + + + +
Resource:/content/trash/items/<ID>
Method:DELETE
Description:Deletes the given trash item
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to empty the given trash item
404:if the given trash item does not exist
+
+
+
+
+

3.2.10   Object States

+
+

3.2.10.1   Create ObjectStateGroup

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups

+
Method:

POST

+
Description:

Creates a new objectstategroup

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroup+xml:
 if set the new object state group is returned in xml format (see ObjectStateGroup)
application/vnd.ez.api.ObjectStateGroup+json:
 if set the new object state group is returned in json format (see ObjectStateGroup)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroupCreate+json:
 the ObjectStateGroup input schema encoded in json
application/vnd.ez.api.ObjectStateGroupCreate+xml:
 the ObjectStateGroup input schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objectstategroup/<ID>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.ObjectStateGroupInput+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create an object state group
403:If a object state group with same identifier already exists
+
+
+
+

3.2.10.2   List ObjectStateGroups

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups

+
Method:

GET

+
Description:

Returns a list of all object state groups

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroupList+xml:
 if set the object state group list is returned in xml format (see ObjectStateGroup)
application/vnd.ez.api.ObjectStateGroupList+json:
 if set the object state group list is returned in json format (see ObjectStateGroup)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read object state groups
+
+
+
+

3.2.10.3   Get ObjectStateGroup

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups/<ID>

+
Method:

GET

+
Description:

Returns the object state group given by id

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroup+xml:
 if set the object state group is returned in xml format (see ObjectStateGroup)
application/vnd.ez.api.ObjectStateGroup+json:
 if set the object state group is returned in json format (see ObjectStateGroup)
+
If-None-match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.ObjectStateGroupUpdate+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read object state groups
404:If the sobject state group does not exist
+
+
+
+

3.2.10.4   Update ObjectStateGroup

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates an object state group

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroup+xml:
 if set the updated object state group is returned in xml format (see ObjectStateGroup)
application/vnd.ez.api.ObjectStateGroup+json:
 if set the updated object state group is returned in json format (see ObjectStateGroup)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroupUpdate+json:
 the ObjectStateGroup input schema encoded in json
application/vnd.ez.api.ObjectStateGroupUpdate+xml:
 the ObjectStateGroup input schema encoded in xml
+
If-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.ObjectStateGroupUpdate+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
Error Codes::400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage +:401: If the user is not authorized to update an object state group +:403: If an object state group with the given new identifier already exists +:412: If the current ETag does not match with the provided one in the If-Match header
+
+
+

3.2.10.5   Delete ObjectStateGroup

+ +++ + + + + + + + + + + + +
Resource:/content/objectstategroups/<ID>
Method:DELETE
Description:the given object state group including the object states is deleted
Parameters:
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete an object state group
404:If the object statee group does not exist
+
+
+
+

3.2.10.6   Create ObjectState

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups/<ID>/objectstates

+
Method:

POST

+
Description:

Creates a new objectstate

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectState+xml:
 if set the new object state is returned in xml format (see ObjectState)
application/vnd.ez.api.ObjectState+json:
 if set the new object state is returned in json format (see ObjectState)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateGroupCreate+json:
 the ObjectState input schema encoded in json
application/vnd.ez.api.ObjectStateGroupCreate+xml:
 the ObjectState input schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/objectstategroup/<ID>/objectstate/<ID>
+ETag: "<new etag>"
+Accept-Patch: application/vnd.ez.api.ObjectStateUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create an object state
403:If a object state with same identifier already exists in the given group
+
+
+
+

3.2.10.7   List Objectstates

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups/<ID>/objectstates

+
Method:

GET

+
Description:

Returns a list of all object states of the given group

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateList+xml:
 if set the object state list is returned in xml format (see ObjectState)
application/vnd.ez.api.ObjectStateList+json:
 if set the object state list is returned in json format (see ObjectState)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read object states
+
+
+
+

3.2.10.8   Get ObjectState

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups/<ID>/objectstates/<ID>

+
Method:

GET

+
Description:

Returns the object state

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectState+xml:
 if set the object state is returned in xml format (see ObjectState)
application/vnd.ez.api.ObjectState+json:
 if set the object state is returned in json format (see ObjectState)
+
If-None-match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.ObjectStateUpdate+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read object state groups
404:If the sobject state group does not exist
+
+
+
+

3.2.10.9   Update ObjectState

+ +++ + + + + + + + + + + + +
Resource:

/content/objectstategroups/<ID>/objectstates/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates an object state

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ObjectState+xml:
 if set the updated object state is returned in xml format (see ObjectState)
application/vnd.ez.api.ObjectState+json:
 if set the updated object state is returned in json format (see ObjectState)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ObjectStateUpdate+json:
 the ObjectState input schema encoded in json
application/vnd.ez.api.ObjectStateUpdate+xml:
 the ObjectState input schema encoded in xml
+
If-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.ObjectStateUpdate+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ObjectStateGroup
+
+ +++ + + + +
Error Codes::400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage +:401: If the user is not authorized to update an object state +:403: If an object state with the given new identifier already exists in this group +:412: If the current ETag does not match with the provided one in the If-Match header
+
+
+

3.2.10.10   Delete ObjectState

+ +++ + + + + + + + + + + + +
Resource:/content/objectstategroups/<ID>/objectstates/<ID>
Method:DELETE
Description:the given object state is deleted
Parameters:
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete an object state group
404:If the object state does not exist
+
+
+
+

3.2.10.11   Get ObjectStates of Content

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/objectstates

+
Method:

GET

+
Description:

Returns the object states of content

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentObjectStates+xml:
 if set the object state is returned in xml format (see ContentObjectStates)
application/vnd.ez.api.ContentObjectStates+json:
 if set the object state is returned in json format (see ContentObjectStates)
+
If-None-match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.ContentObjectStates+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentObjectStates
+
+ +++ + + + +
ErrorCodes: +++ + + + +
404:If the content object does not exist
+
+
+
+

3.2.10.12   Set ObjectStates of Content

+ +++ + + + + + + + + + + + +
Resource:

/content/objects/<ID>/objectstates

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates object states of content. An object state in the input overrides the state of the object state group.

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentObjectStates+xml:
 if set the updated object state is returned in xml format (see ContentObjectStates)
application/vnd.ez.api.ContentObjectStates+json:
 if set the updated object state is returned in json format (see ContentObjectStates)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentObjectStates+json:
 the ContentObjectStates input schema encoded in json
application/vnd.ez.api.ContentObjectStates+xml:
 the ContentObjectStates input schema encoded in xml
+
If-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Accept-Patch: application/vnd.ez.api.ContentObjectStates+(xml|json)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentObjectStates
+
+ +++ + + + +
Error Codes::400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage +:401: If the user is not authorized to set an object state +:403: If the input contains multiple object states of the same object state group +:412: If the current ETag does not match with the provided one in the If-Match header
+
+
+
+

3.2.11   Url Alias

+
+

3.2.11.1   Create Url Alias

+ +++ + + + + + + + + + + + +
Resource:

/content/urlaliases

+
Method:

POST

+
Description:

Creates a new url alias

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlAlias+xml:
 if set the new object state group is returned in xml format (see UrlAlias)
application/vnd.ez.api.UrlAlias+json:
 if set the new object state group is returned in json format (see UrlAlias)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.UrlAliasCreate+json:
 the UrlAlias input schema encoded in json
application/vnd.ez.api.UrlAliasCreate+xml:
 the UrlAlias input schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/urlaliases/<ID>
+ETag: "<new etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlAlias
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create an url alias
403:If an url alias same identifier already exists
+
+
+
+

3.2.11.2   List UrlAliases for location

+ +++ + + + + + + + + + + + + + +
Resource:

/content/locations/<path>/urlaliases

+
Method:

GET

+
Description:

Returns the list of url aliases for a location

+
Parameters: +++ + + + +
custom:(default true) this flag indicates wether autogenerated (false) or manual url aliases (true) should be returned.
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlAliasRefList+xml:
 if set the url alias list contains only references and is returned in xml format (see UrlAlias)
application/vnd.ez.api.UrlAliasRefList+json:
 if set the url alias list contains only references is and returned in json format (see UrlAlias)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlAlias
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read urlaliases
401:If the location was not found
+
+
+
+

3.2.11.3   List Global UrlAliases

+ +++ + + + + + + + + + + + +
Resource:

/content/urlaliases

+
Method:

GET

+
Description:

Returns the list of url global aliases

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlAliasRefList+xml:
 if set the url alias list contains only references and is returned in xml format (see UrlAlias)
application/vnd.ez.api.UrlAliasRefList+json:
 if set the url alias list contains only references is and returned in json format (see UrlAlias)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlAlias
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read urlaliases
+
+
+
+

3.2.11.4   Get UrlAlias

+ +++ + + + + + + + + + + + +
Resource:

/content/urlaliases/<ID>

+
Method:

GET

+
Description:

Returns the urlalias with the given id

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlAlias+xml:
 if set the url alias is returned in xml format (see UrlAlias)
application/vnd.ez.api.UrlAlias+json:
 if set the url alias is returned in json format (see UrlAlias)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlAlias
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read url aliases
404:If the url alias does not exist
+
+
+
+

3.2.11.5   Delete UrlAlias

+ +++ + + + + + + + + + + + +
Resource:/content/urlaliases/<ID>
Method:DELETE
Description:the given url alias is deleted
Parameters:
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete an url alias
404:If the url alias does not exist
+
+
+
+
+

3.2.12   Url Wildcards

+
+

3.2.12.1   Create Url Wildcard

+ +++ + + + + + + + + + + + +
Resource:

/content/urlwildcards

+
Method:

POST

+
Description:

Creates a new url wildcard

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlWildcard+xml:
 if set the new object state group is returned in xml format (see UrlWildcard)
application/vnd.ez.api.UrlWildcard+json:
 if set the new object state group is returned in json format (see UrlWildcard)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.UrlWildcardCreate+json:
 the UrlWildcard input schema encoded in json
application/vnd.ez.api.UrlWildcardCreate+xml:
 the UrlWildcard input schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/urlwildcards/<ID>
+ETag: "<new etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlWildcard
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create an url wildcard
403:If an url wildcardsame identifier already exists
+
+
+
+

3.2.12.2   List UrlWildcards

+ +++ + + + + + + + + + + + +
Resource:

/content/urlwildcards

+
Method:

GET

+
Description:

Returns a list of url wildcards

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlWildcardList+xml:
 if set the url wildcard list is returned in xml format (see UrlWildcard)
application/vnd.ez.api.UrlWildcardList+json:
 if set the url wildcard list is returned in json format (see UrlWildcard)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlWildcard
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read urlwildcards
+
+
+
+

3.2.12.3   Get UrlWildcard

+ +++ + + + + + + + + + + + +
Resource:

/content/urlwildcards/<ID>

+
Method:

GET

+
Description:

Returns the urlwildcard with the given id

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UrlWildcard+xml:
 if set the url wildcard is returned in xml format (see UrlWildcard)
application/vnd.ez.api.UrlWildcard+json:
 if set the url wildcard is returned in json format (see UrlWildcard)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UrlWildcard
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read url wildcards
404:If the url wildcard does not exist
+
+
+
+

3.2.12.4   Delete UrlWildcard

+ +++ + + + + + + + + + + + +
Resource:/content/urlwildcards/<ID>
Method:DELETE
Description:the given url wildcard is deleted
Parameters:
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete an url wildcard
404:If the url wildcard does not exist
+
+
+
+
+
+
+

4   Content Types

+
+

4.1   Overview

+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ResourcePOSTGETPUT/PATCHDELETE
/content/typegroupscreate new groupload all groups..
/content/typegroups/<ID>.load groupupdate groupdelete group
/content/typegroups/<ID>/typescreate content typelist content types..
/content/types.list content types..
/content/types/<ID>copy content typeload content typecreate draftdelete content type
/content/types/<ID>/groupslink grouplist groups..
/content/types/<ID>/groups/<ID>...unlink group
/content/types/<ID>/draftpublish draftload draftupdate draftdelete draft
/content/types/<ID>/draft/fieldDefinitionscreate field def....
/content/types/<ID>/draft/fieldDefinitions/<ID>.load field def.update field definitiondelete field definition
+
+
+

4.2   Specification

+
+

4.2.1   Managing Content Type Groups

+
+

4.2.1.1   Create Content Type Group

+ +++ + + + + + + + + + + + +
Resource:

/content/typegroups

+
Method:

POST

+
Description:

Creates a new content type group

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroup+xml:
 if set the new section is returned in xml format (see ContentTypeGroup)
application/vnd.ez.api.ContentTypeGroup+json:
 if set the new section is returned in json format (see ContentTypeGroup)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroupInput+json:
 the ContentTypeGroup input schema encoded in json
application/vnd.ez.api.ContentTypeGroupInput+xml:
 the ContentTypeGroup input schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Loction: /content/typegroups/<newId>
+Accept-Patch:  application/vnd.ez.api.ContentTypeGroupInput+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentTypeGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this content type group
403:If a content type group with same identifier already exists
+
+
+
4.2.1.1.1   XML Example
+
+POST /content/typegroups HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.ContentTypeGroup+xml
+Content-Type: application/vnd.ez.api.ContentTypeGroupInput+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeGroupInput>
+  <identifier>newContentTypeGroup</identifier>
+</ContentTypeGroupInput>
+
+
+HTTP/1.1 201 Created
+Location: /content/typegroups/7
+Accept-Patch:  application/vnd.ez.api.ContentTypeGroupInput+xml
+ETag: "9587649865938675"
+Content-Type: application/vnd.ez.api.ContentTypeGroup+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeGroup href="/content/typesgroups/7" media-type="application/vnd.ez.api.ContentTypeGroup+xml">
+  <id>7</id>
+  <identifier>newContentTypeGroup</identifier>
+  <created>2012-02-31T12:45:00</created>
+  <modified>2012-02-31T12:45:00</modified>
+  <Creator href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <Modifier href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <ContentTypes href="/content/typegroups/7/types" media-type="application/vnd.ez.api.ContentTypeList+xml"/>
+</ContentTypeGroup>
+
+
+
+
+

4.2.1.2   Get Content Type Groups

+ +++ + + + + + + + + + + + +
Resource:

/content/typegroups

+
Method:

GET

+
Description:

Returns a list of all content types groups

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroupList+xml:
 if set the new section is returned in xml format (see ContentTypeGroup)
application/vnd.ez.api.ContentTypeGroupList+json:
 if set the new section is returned in json format (see ContentTypeGroup)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentTypeGroup  (contentTypeGroupListType)
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read the content types
+
+
+
4.2.1.2.1   XML Example
+
+GET /content/typegroups HTTP/1.1
+Host: api.example.net
+Accept: application/vnd.ez.api.ContentTypeGroupList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.ContentTypeGroupList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeGroupList href="/content/typegroups" media-type="application/vnd.ez.api.ContentTypeGroupList+xml">
+  <ContentTypeGroup href="/content/typegroups/1" media-type="application/vnd.ez.api.ContentTypeGroup+xml">
+    <id>1</id>
+    <identifier>Content</identifier>
+    <created>2010-06-31T12:00:00</created>
+    <modified>2010-07-31T12:00:00</modified>
+    <Creator href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+    <Modifier href="/user/users/6" media-type="application/vnd.ez.api.User+xml"/>
+    <ContentTypes href="/content/typegroups/1/types" media-type="application/vnd.ez.api.ContentTypeList+xml"/>
+  </ContentTypeGroup>
+  <ContentTypeGroup href="/content/typegroups/2" media-type="application/vnd.ez.api.ContentTypeGroup+xml">
+    <id>2</id>
+    <identifier>Media</identifier>
+    <created>2010-06-31T14:00:00</created>
+    <modified>2010-09-31T12:00:00</modified>
+    <Creator href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+    <Modifier href="/user/users/9" media-type="application/vnd.ez.api.User+xml"/>
+    <ContentTypes href="/content/typegroups/2/types" media-type="application/vnd.ez.api.ContentTypeList+xml"/>
+  </ContentTypeGroup>
+</ContentTypeGroupList>
+
+
+
+
+

4.2.1.3   Get Content Type Group

+ +++ + + + + + + + + + + + +
Resource:

/content/typegroups/<ID>

+
Method:

GET

+
Description:

Returns the content type given by id

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroup+xml:
 if set the new section is returned in xml format (see ContentTypeGroup)
application/vnd.ez.api.ContentTypeGroup+json:
 if set the new section is returned in json format (see ContentTypeGroup)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.ContentTypeGroupInput+(json|xml)
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentTypeGroup
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read this content type
404:If the content type group does not exist
+
+
+
+

4.2.1.4   Update Content Type Group

+ +++ + + + + + + + + + + + +
Resource:

/content/typegroups/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates a content type group

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroup+xml:
 if set the new section is returned in xml format (see ContentTypeGroup)
application/vnd.ez.api.ContentTypeGroup+json:
 if set the new section is returned in json format (see ContentTypeGroup)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroupInput+json:
 the ContentTypeGroup input schema encoded in json
application/vnd.ez.api.ContentTypeGroupInput+xml:
 the ContentTypeGroup input schema encoded in xml
+
If-Match:

<etag> Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned.

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.ContentTypeGroupInput+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentTypeGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this content type group
403:If a content type group with the given identifier already exists
412:If the current ETag does not match with the provided one in the If-Match header
+
+
+
4.2.1.4.1   XML Example
+
+POST /content/typegroups/7 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Host: api.example.net
+If-Match: "958764986593830900"
+Accept: application/vnd.ez.api.ContentTypeGroup+xml
+Content-Type: application/vnd.ez.api.ContentTypeGroupInput+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeGroupInput>
+  <identifier>updatedIdentifer</identifier>
+</ContentTypeGroupInput>
+
+
+HTTP/1.1 200 OK
+Location: /content/typegroups/7
+Accept-Patch:  application/vnd.ez.api.ContentTypeGroupInput+xml
+ETag: "95876498659383245"
+Content-Type: application/vnd.ez.api.ContentTypeGroup+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeGroup href="/content/typesgroups/7" media-type="application/vnd.ez.api.ContentTypeGroup+xml">
+  <id>7</id>
+  <identifier>updatedIdentifer</identifier>
+  <created>2012-02-31T12:45:00</created>
+  <modified>2012-04-13T12:45:00</modified>
+  <Creator href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <Modifier href="/user/users/8" media-type="application/vnd.ez.api.User+xml"/>
+  <ContentTypes href="/content/typegroups/7/types" media-type="application/vnd.ez.api.ContentTypeList+xml"/>
+</ContentTypeGroup>
+
+
+
+
+

4.2.1.5   Delete Content Type Group

+ +++ + + + + + + + + + +
Resource:/content/typegroups/<ID>
Method:DELETE
Description:the given content type group is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to delete this content type
403:If the content type group is not empty
404:If the content type does not exist
+
+
+
+

4.2.1.6   List Content Types for Group

+ +++ + + + + + + + + + + + +
Resource:

/content/typegroups/<ID>/types

+
Method:

GET

+
Description:

Returns a list of content types of the group

+
Headers: +++ + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.ContentTypeInfoList+xml:
 if set the list of content type info objects is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeInfoList+json:
 if set the list of content type info objects is returned in json format (see ContentType)
application/vnd.ez.api.ContentTypeList+xml:
 if set the list of content type objects (including field definitions) is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeList+json:
 if set the list content type objects (including field definitions) is returned in json format (see ContentType)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read the content types
+
+
+
+
+

4.2.2   Managing Content Types

+
+

4.2.2.1   Create Content Type

+ +++ + + + + + + + + + + + + + +
Resource:

/content/typegroups/<ID>/types

+
Method:

POST

+
Description:

Creates a new content type draft in the given content type group

+
Parameters: +++ + + + +
publish:(default false) If true the content type is published after creating
+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentType+xml:
 if set the new content type or draft is returned in xml format (see ContentType)
application/vnd.ez.api.ContentType+json:
 if set the new content type or draft is returned in json format (see ContentType)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeCreate+json:
 the ContentTypeCreate schema encoded in json
application/vnd.ez.api.ContentTypeCreate+xml:
 the ContentTypeCreate schema encoded in xml
+
+
Response:

If publish = false:

+
+
+HTTP/1.1 201 Created
+Location: /content/types/<newId>/draft
+Accept-Patch:  application/vnd.ez.api.ContentTypeUpdate+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+

If publish = true:

+
+HTTP/1.1 201 Created
+Location: /content/types/<newId>
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:
    +
  • If the Input does not match the input schema definition,
  • +
  • If publish = true and the input is not complete e.g. no field definitions are provided
  • +
+
401:

If the user is not authorized to create this content type

+
403:

If a content type with same identifier already exists

+
+
+
+
4.2.2.1.1   XML Example
+
+POST /content/typegroups/<ID>/types HTTP/1.1
+Accept: application/vnd.ez.api.ContentType
+Content-Type: application/vnd.ez.api.ContentTypeCreate
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeCreate>
+  <identifier>newContentType</identifier>
+  <names>
+    <value languageCode="eng-US">New Content Type</value>
+  </names>
+  <descriptions>
+    <value languageCode="eng-US">This is a description</value>
+  </descriptions>
+  <remoteId>remoteId-qwert548</remoteId>
+  <urlAliasSchema>&lt;title&gt;</urlAliasSchema>
+  <nameSchema>&lt;title&gt;</nameSchema>
+  <isContainer>true</isContainer>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <defaultAlwaysAvailable>true</defaultAlwaysAvailable>
+  <defaultSortField>PATH</defaultSortField>
+  <defaultSortOrder>ASC</defaultSortOrder>
+  <FieldDefinitions>
+    <FieldDefinition>
+      <identifier>title</identifier>
+      <fieldType>ezstring</fieldType>
+      <fieldGroup>content</fieldGroup>
+      <position>1</position>
+      <isTranslatable>true</isTranslatable>
+      <isRequired>true</isRequired>
+      <isInfoCollector>false</isInfoCollector>
+      <defaultValue>New Title</defaultValue>
+      <isSearchable>true</isSearchable>
+      <names>
+        <value languageCode="eng-US">Title</value>
+      </names>
+      <descriptions>
+        <value languageCode="eng-US">This is the title</value>
+      </descriptions>
+    </FieldDefinition>
+   <FieldDefinition>
+      <identifier>summary</identifier>
+      <fieldType>ezxmltext</fieldType>
+      <fieldGroup>content</fieldGroup>
+      <position>2</position>
+      <isTranslatable>true</isTranslatable>
+      <isRequired>false</isRequired>
+      <isInfoCollector>false</isInfoCollector>
+      <defaultValue></defaultValue>
+      <isSearchable>true</isSearchable>
+      <names>
+        <value languageCode="eng-US">Summary</value>
+      </names>
+      <descriptions>
+        <value languageCode="eng-US">This is the summary</value>
+      </descriptions>
+    </FieldDefinition>
+   </FieldDefinitions>
+</ContentTypeCreate>
+
+
+HTTP/1.1 201 Created
+Location: /content/types/32/draft
+Accept-Patch:  application/vnd.ez.api.ContentTypeUpdate+(json|xml)
+ETag: "45674567543546"
+Content-Type: application/vnd.ez.api.ContentType+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentType href="/content/types/32/draft" media-type="application/vnd.ez.api.ContentType+xml">
+  <id>32</id>
+  <status>DRAFT</status>
+  <identifier>newContentType</identifier>
+  <names>
+    <value languageCode="eng-US">New Content Type</value>
+  </names>
+  <descriptions>
+    <value languageCode="eng-US">This is a description</value>
+  </descriptions>
+  <creationDate>2001-01-01T16:37:00</creationDate>
+  <modificationDate>2001-01-01T16:37:00</modificationDate>
+  <Creator href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <Modifier href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <remoteId>remoteId-qwert548</remoteId>
+  <urlAliasSchema>&lt;title&gt;</urlAliasSchema>
+  <nameSchema>&lt;title&gt;</nameSchema>
+  <isContainer>true</isContainer>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <defaultAlwaysAvailable>true</defaultAlwaysAvailable>
+  <defaultSortField>PATH</defaultSortField>
+  <defaultSortOrder>ASC</defaultSortOrder>
+  <FieldDefinitions href="/content/types/32/draft/fielddefinitions" media-type="application/vnd.ez.api.FieldDefinitionList+xml">
+    <FieldDefinition href="/content/types/32/draft/fielddefinitions/34" media-type="application/vnd.ez.api.FieldDefinition+xml">
+      <id>34</id>
+      <identifier>title</identifier>
+      <fieldType>ezstring</fieldType>
+      <fieldGroup>content</fieldGroup>
+      <position>1</position>
+      <isTranslatable>true</isTranslatable>
+      <isRequired>true</isRequired>
+      <isInfoCollector>false</isInfoCollector>
+      <defaultValue>New Title</defaultValue>
+      <isSearchable>true</isSearchable>
+      <names>
+        <value languageCode="eng-US">Title</value>
+      </names>
+      <descriptions>
+        <value languageCode="eng-US">This is the title</value>
+      </descriptions>
+    </FieldDefinition>
+    <FieldDefinition href="/content/types/32/draft/fielddefinitions/36" media-type="application/vnd.ez.api.FieldDefinition+xml">
+      <id>36</id>
+      <identifier>summary</identifier>
+      <fieldType>ezxmltext</fieldType>
+      <fieldGroup>content</fieldGroup>
+      <position>2</position>
+      <isTranslatable>true</isTranslatable>
+      <isRequired>false</isRequired>
+      <isInfoCollector>false</isInfoCollector>
+      <defaultValue></defaultValue>
+      <isSearchable>true</isSearchable>
+      <names>
+        <value languageCode="eng-US">Summary</value>
+      </names>
+      <descriptions>
+        <value languageCode="eng-US">This is the summary</value>
+      </descriptions>
+    </FieldDefinition>
+  </FieldDefinitions>
+</ContentType>
+
+
+
+
+

4.2.2.2   Copy Content Type

+ +++ + + + + + + + + + +
Resource:/content/types/<ID>
Method:COPY or POST with header: X-HTTP-Method-Override COPY
Description:copies a content type. The identifier of the copy is changed to copy_of_<identifier> anda new remoteIdis generated.
Response:
+
+HTTP/1.1 201 Created
+Location: /content/types/<newId>
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user is not authorized to copy this content type
+
+
+
+

4.2.2.3   List Content Types

+ +++ + + + + + + + + + + + + + +
Resource:

/content/types

+
Method:

GET

+
Description:

Returns a list of content types

+
Parameters: +++ + + + + + + + + + + + + + +
identifier:retrieves the content type for the given identifer
remoteId:retieves the content type for the given remoteId
limit:only <limit> items will be returned started by offset
offset:offset of the result set
orderby:one of (name | lastmodified)
sort:one of (asc|desc)
+
Headers: +++ + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.ContentTypeInfoList+xml:
 if set the list of content type info objects is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeInfoList+json:
 if set the list of content type info objects is returned in json format (see ContentType)
application/vnd.ez.api.ContentTypeList+xml:
 if set the list of content type objects (including field definitions) is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeList+json:
 if set the list content type objects (including field definitions) is returned in json format (see ContentType)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read the content types
+
+
+
+

4.2.2.4   Get Content Type

+ +++ + + + + + + + + + + + +
Resource:

/content/types/<ID>

+
Method:

GET

+
Description:

Returns the content type given by id

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentType+xml:
 if set the list is returned in xml format (see ContentType)
application/vnd.ez.api.ContentType+json:
 if set the list is returned in json format (see ContentType)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read this content type
404:If the content type does not exist
+
+
+
+

4.2.2.5   Create Draft

+ +++ + + + + + + + + + + + +
Resource:

/content/types/<ID>

+
Method:

POST

+
Description:

Cretes a draft and updates it with the given data

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeInfo+xml:
 if set the new content type draft is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeInfo+json:
 if set the new content type draft is returned in json format (see ContentType)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeUpdate+json:
 the ContentTypeUpdate schema encoded in json
application/vnd.ez.api.ContentTypeUpdate+xml:
 the ContentTypeUpdate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/types/<ID>/draft
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:

If the Input does not match the input schema definition, In this case the response contains an ErrorMessage

+
401:

If the user is not authorized to create the draft

+
403:
    +
  • If a content type with the given new identifier already exists.
  • +
  • If there exists already a draft.
  • +
+
+
+
+
+

4.2.2.6   Update Draft

+ +++ + + + + + + + + + + + +
Resource:

/content/types/<ID>/draft

+
Method:

PATCH or POST with header: X-HTTP-Method-Override: PATCH

+
Description:

Updates meta data of a draft. This method does not handle field definitions

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeInfo+xml:
 if set the new content type draft is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeInfo+json:
 if set the new content type draft is returned in json format (see ContentType)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeUpdate+json:
 the ContentTypeUpdate schema encoded in json
application/vnd.ez.api.ContentTypeUpdate+xml:
 the ContentTypeUpdate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update the draft.
403:If a content type with the given new identifier already exists.
404:If there is no draft on this content type
+
+
+
4.2.2.6.1   XML Example
+
+POST /content/types/32/draft HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Accept: application/vnd.ez.api.ContentTypeInfo+xml
+Content-Type: application/vnd.ez.api.ContentTypeUpdate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentTypeUpdate>
+  <names>
+    <value languageCode="ger-DE">Neuer Content Typ</value>
+  </names>
+  <descriptions>
+    <value languageCode="ger-DE">Das ist ein neuer Content Typ</value>
+  </descriptions>
+</ContentTypeUpdate>
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.ContentTypeInfo+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<ContentType href="/content/types/32/draft" media-type="application/vnd.ez.api.ContentType+xml">
+  <id>32</id>
+  <status>DRAFT</status>
+  <identifier>newContentType</identifier>
+  <names>
+    <value languageCode="eng-US">New Content Type</value>
+    <value languageCode="ger-DE">Neuer Content Typ</value>
+  </names>
+  <descriptions>
+    <value languageCode="eng-US">This is a description</value>
+    <value languageCode="ger-DE">Das ist ein neuer Content Typ</value>
+  </descriptions>
+  <creationDate>2001-01-01T16:37:00</creationDate>
+  <modificationDate>2001-01-01T16:37:00</modificationDate>
+  <Creator href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <Modifier href="/user/users/13" media-type="application/vnd.ez.api.User+xml"/>
+  <remoteId>remoteId-qwert548</remoteId>
+  <urlAliasSchema>&lt;title&gt;</urlAliasSchema>
+  <nameSchema>&lt;title&gt;</nameSchema>
+  <isContainer>true</isContainer>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <defaultAlwaysAvailable>true</defaultAlwaysAvailable>
+  <defaultSortField>PATH</defaultSortField>
+  <defaultSortOrder>ASC</defaultSortOrder>
+</ContentType>
+
+
+
+
+

4.2.2.7   Add Field definition

+ +++ + + + + + + + + + + + +
Resource:

/content/types/<ID>/draft/fielddefinitions

+
Method:

POST

+
Description:

Creates a new field definition for the given content type

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.FieldDefinition+xml:
 if set the new fielddefinition is returned in xml format (see FieldDefinition)
application/vnd.ez.api.FieldDefinition+json:
 if set the new fielddefinition is returned in json format (see FieldDefinition)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.FieldDefinitionCreate+json:
 the FieldDefinitionCreate schema encoded in json
application/vnd.ez.api.FieldDefinitionCreate+xml:
 the FieldDefinitionCreate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /content/types/<ID>/draft/fielddefinitions/<newId>
+Accept-Patch:  application/vnd.ez.api.FieldDefinitionUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+FieldDefinition
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to add a field definition
403:If a field definition with same identifier already exists in the given content type
+
+
+
+

4.2.2.8   Get Fielddefinition

+ +++ + + + + + + + + + + + +
Resource:

/content/types/<ID>/draft/fielddefinitions/<ID>

+
Method:

GET

+
Description:

Returns the field definition given by id

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.FieldDefinition+xml:
 if set the new fielddefinition is returned in xml format (see FieldDefinition)
application/vnd.ez.api.FieldDefinition+json:
 if set the new fielddefinition is returned in json format (see FieldDefinition)
+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.FieldDefinitionUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+FieldDefinition
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read the content type draft
404:If the content type or draft does not exist
+
+
+
+

4.2.2.9   Update Fielddefinition

+ +++ + + + + + + + + + + + +
Resource:

/content/types/<ID>/draft/fielddefinitions/<ID>

+
Method:

PUT

+
Description:

Updates the attributes of a field definitions

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.FieldDefinition+xml:
 if set the new fielddefinition is returned in xml format (see FieldDefinition)
application/vnd.ez.api.FieldDefinition+json:
 if set the new fielddefinition is returned in json format (see FieldDefinition)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.FieldDefinitionUpdate+json:
 the FieldDefinitionUpdate schema encoded in json
application/vnd.ez.api.FieldDefinitionUpdate+xml:
 the FieldDefinitionUpdate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.FieldDefinitionUpdate+(json|xml)
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+FieldDefinition
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update the field definition
403:If a field definition with the given new identifier already exists in the given content type.
+
+
+
+

4.2.2.10   Delete Fielddefinition

+ +++ + + + + + + + + + +
Resource:/content/types/<ID>/draft/fielddefinitions/<ID>
Method:DELETE
Description:the given field definition is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:

If the user is not authorized to delete this content type

+
403:
    +
  • if there is no draft of the content type assigned to the authenticated user
  • +
+
+
+
+
+

4.2.2.11   Publish content type

+ +++ + + + + + + + + + +
Resource:/content/types/<ID>/draft
Method:PUBLISH or POST with header: X-HTTP-Method-Override: PUBLISH
Description:Publishes a content type draft
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentType
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to publish this content type draft
403:If the content type draft is not complete e.g. there is no field definition provided
404:If there is no draft or content type with the given ID
+
+
+
+

4.2.2.12   Delete Content Type Draft

+ +++ + + + + + + + + + +
Resource:/content/types/<ID>/draft
Method:DELETE
Description:the given content type draft is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete this content type draft
404:If the content type/draft does not exist
+
+
+
+

4.2.2.13   Delete Content Type

+ +++ + + + + + + + + + +
Resource:/content/types/<ID>
Method:DELETE
Description:the given content type is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to delete this content type
403:If there are object instances of this content type - the response should contain an ErrorMessage
404:If the content type does not exist
+
+
+
+

4.2.2.14   Get Groups of Content Type

+ +++ + + + + + + + + + + + +
Resource:

/content/type/<ID>/groups

+
Method:

GET

+
Description:

Returns the content type groups the content type belongs to.

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.ContentTypeGroupRefList+xml:
 if set the list is returned in xml format (see ContentType)
application/vnd.ez.api.ContentTypeGroupRefList+json:
 if set the list is returned in json format (see ContentType)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+ContentTypeGroup
+
+ +++ + + + +
ErrorCodes: +++ + + + + + +
401:If the user is not authorized to read this content type
404:If the content type does not exist
+
+
+
4.2.2.14.1   XML Example
+
+GET /content/types/32/groups HTTP/1.1
+Accept: application/vnd.ez.api.ContentTypeGroupRefList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.ContentTypeGroupRefList+xml
+Gontent-Length: xxx
+
+
+<ContentTypeGroupRefList>
+  <ContentTypeGroupRef href="/content/typegroups/7" media-type="application/vnd.ez.api.ContentTypeGroup+xml"/>
+</ContentTypeGroupRefList>
+
+
+
+ + +
+
+
+
+

5   User Management

+
+

5.1   Overview

+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ResourcePOSTGETPUTDELETE
/user/groups.load all topl. groups..
/user/groups/root.redirect to root..
/user/groups/<path>.load user groupupdate user groupdelete user group
/user/groups/<path>/users.load users of group..
/user/groups/<path>/subgroupscreate user groupload sub groups.remove all sub groups
/user/groups/<path>/rolesassign role to groupload roles of group..
/user/groups/<path>/roles/<ID>...unassign role from group
/user/userscreate userlist users..
/user/users/<ID>.load userupdate userdelete user
/user/users/<ID>/groups.load groups of useradd to group.
/user/users/<ID>/drafts.list all drafts owned +by the user..
/user/users/<ID>/rolesassign role to userload roles of group..
/user/users/<ID>/roles/<ID>.load roleassignment.unassign role from user
/user/rolescreate new roleload all roles..
/user/roles/<ID>.load roleupdate roledelete role
/user/roles/<ID>/policiescreate policyload policies.delete all policies from role
/user/roles/<ID>/policies/<ID>.load policyupdate policydelete policy
+
+

5.1.1   Managing Users and Groups

+
+

5.1.1.1   Get Root User Group

+ +++ + + + + + + + + + +
Resource:/user/groups/root
Method:GET
Description:Redirects to the root user group
Response:
+
+HTTP/1.1 301 Moved Permanently
+Location: /user/groups/<rootPath>
+
+

Example see UserGroupExample

+
+
+

5.1.1.2   Load User Group

+ +++ + + + + + + + + + + + +
Resource:

/user/groups/<path>

+
Method:

GET

+
Description:

loads a user groups for the given <path>

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UserGroup+xml:
 if set the new user group is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroup+json:
 if set the new user group is returned in json format (see UserGroup)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.UserGroupUpdate+(json|xml)
+ETag: "<Etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read user groups
404:If the user group does not exist
+
+

Example see UserGroupExample

+
+
+

5.1.1.3   Load User Groups

+ +++ + + + + + + + + + + + + + +
Resource:

/user/groups

+
Method:

GET

+
Description:

Load user groups for either an id or remoteId or role.

+
Parameters: +++ + + + + + + + +
roleId:lists user groups assigned to the given role
id:retieves the user group for the given Id
remoteId:retieves the user group for the given remoteId
+
Headers: +++ + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.UserGroupList+xml:
 if set the user group list returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupList+json:
 if set the user group list is returned in json format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+xml:
 if set the link list of user groups is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+json:
 if set the link list of user groups is returned in json format (see UserGroup)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read user groups
+
+
+
+

5.1.1.4   Create User Group

+ +++ + + + + + + + + + + + +
Resource:

/user/groups/<path>/subgroups

+
Method:

POST

+
Description:

Creates a new user group under the given parent. To create a top level group use /user/groups/subgroups

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UserGroup+xml:
 if set the new user group is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroup+json:
 if set the new user group is returned in json format (see UserGroup)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.UserGroupCreate+json:
 the UserGroupCreate schema encoded in json
application/vnd.ez.api.UserGroupCreate+xml:
 the UserGroupCreate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /user/groups/<newpath>
+Accept-Patch:  application/vnd.ez.api.UserGroupUpdate+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this user group
+
+
+
5.1.1.4.1   XML Example
+

Creating a top level group

+
+GET /user/groups/1/5 HTTP/1.1
+Accept: application/vnd.ez.api.UserGroup+xml
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroup href="/user/groups/1/5" id="5" media-type="application/vnd.ez.api.UserGroup+xml" remoteId="remoteId-qwert001">
+  <ContentType href="/content/types/5" media-type="application/vnd.ez.api.ContentType+xml" />
+  <name>Users</name>
+  <Versions href="/content/objects/4/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+  <Section href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/5" media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/4/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/13" media-type="application/vnd.ez.api.User+xml" />
+  <publishDate>2011-02-31T16:00:00</publishDate>
+  <lastModificationDate>2011-02-31T16:00:00</lastModificationDate>
+  <mainLanguageCode>eng-UK</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+  <Content>
+    <VersionInfo>
+      <id>22</id>
+      <versionNo>1</versionNo>
+      <status>PUBLISHED</status>
+      <modificationDate>2011-02-31T16:00:00</modificationDate>
+      <Creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>2011-02-31T16:00:00</creationDate>
+      <initialLanguageCode>eng-UK</initialLanguageCode>
+      <Content href="/content/objects/4" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+    <Fields>
+      <field>
+        <id>1234</id>
+        <fieldDefinitionIdentifer>name</fieldDefinitionIdentifer>
+        <languageCode>eng-UK</languageCode>
+        <fieldValue>Users</fieldValue>
+      </field>
+      <field>
+        <id>1235</id>
+        <fieldDefinitionIdentifer>description</fieldDefinitionIdentifer>
+        <languageCode>eng-UK</languageCode>
+        <fieldValue>Main Group</fieldValue>
+      </field>
+    </Fields>
+    <Relations />
+  </Content>
+  <SubGroups href="/user/groups/1/5/subgroups" media-type="application/vnd.ez.api.UserGroupList+xml"/>
+  <Users href="/user/groups/1/5/users" media-type="application/vnd.ez.api.UserList+xml"/>
+  <Roles href="/user/groups/1/5/roles" media-type="application/vnd.ez.api.RoleList+xml"/>
+</UserGroup>
+
+
+POST /user/groups/1/5/subgroups HTTP/1.1
+Accept: application/vnd.ez.api.UserGroup+xml
+Content-Type: application/vnd.ez.api.UserGroupCreate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroupCreate>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <remoteId>remoteId-qwert098</remoteId>
+  <fields>
+    <field>
+      <fieldDefinitionIdentifer>name</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>UserGroup</fieldValue>
+    </field>
+    <field>
+      <fieldDefinitionIdentifer>description</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>This is the description of the user group</fieldValue>
+    </field>
+  </fields>
+</UserGroupCreate>
+
+
+HTTP/1.1 201 Created
+Location: /user/groups/1/5/65
+Accept-Patch:  application/vnd.ez.api.UserGroupUpdate+(json|xml)
+ETag: "348506873565465"
+Content-Type: application/vnd.ez.api.UserGroup+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroup href="/user/groups/1/5/65" id="65" media-type="application/vnd.ez.api.UserGroup+xml" remoteId="remoteId-qwert543">
+  <ContentType href="/content/types/5" media-type="application/vnd.ez.api.ContentType+xml" />
+  <name>UserGroup</name>
+  <Versions href="/content/objects/123/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+  <Section href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/5/65" media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/123/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/13" media-type="application/vnd.ez.api.User+xml" />
+  <publishDate>2012-02-31T16:00:00</publishDate>
+  <lastModificationDate>2012-02-31T16:00:00</lastModificationDate>
+  <mainLanguageCode>eng-UK</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+  <Content>
+    <VersionInfo>
+      <id>123</id>
+      <versionNo>2</versionNo>
+      <status>PUBLISHED</status>
+      <modificationDate>2012-02-31T16:00:00</modificationDate>
+      <Creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>2012-02-31T16:00:00</creationDate>
+      <initialLanguageCode>eng-UK</initialLanguageCode>
+      <Content href="/content/objects/123" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+    <Fields>
+      <field>
+        <id>1234</id>
+        <fieldDefinitionIdentifer>name</fieldDefinitionIdentifer>
+        <languageCode>eng-UK</languageCode>
+        <fieldValue>UserGroup</fieldValue>
+      </field>
+      <field>
+        <id>1235</id>
+        <fieldDefinitionIdentifer>description</fieldDefinitionIdentifer>
+        <languageCode>eng-UK</languageCode>
+        <fieldValue>This is the description of the user group</fieldValue>
+      </field>
+    </Fields>
+    <Relations />
+  </Content>
+  <ParentUserGroup href="/user/groups/1/5" media-type="application/vnd.ez.api.UserGroup+xml" />
+  <SubGroups href="/user/groups/1/5/65/subgroups" media-type="application/vnd.ez.api.UserGroupList+xml"/>
+  <Users href="/user/groups/1/5/65/users" media-type="application/vnd.ez.api.UserList+xml"/>
+  <Roles href="/user/groups/1/5/65/roles" media-type="application/vnd.ez.api.RoleList+xml"/>
+</UserGroup>
+
+
+
+
+

5.1.1.5   Update User Group

+ +++ + + + + + + + + + + + +
Resource:

/user/groups/<path>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates a user group

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UserGroup+xml:
 if set the new user group is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroup+json:
 if set the new user group is returned in json format (see UserGroup)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.UserGroupUpdate+json:
 the UserGroupUpdate schema encoded in json
application/vnd.ez.api.UserGroupUpdate+xml:
 the UserGroupUpdate schema encoded in xml
+
If-Match:

<etag> Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned.

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.UserGroupUpdate+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update the user group
412:If the current ETag does not match with the provided one in the If-Match header
+
+
+
5.1.1.5.1   XML Example
+
+POST /user/groups/1/5/65 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Accept: application/vnd.ez.api.UserGroup+xml
+If-Match: "348506873463455"
+Content-Type: application/vnd.ez.api.UserGroupUpdate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroupUpdate>
+  <fields>
+    <field>
+      <fieldDefinitionIdentifer>description</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>This is another description</fieldValue>
+    </field>
+  </fields>
+</UserGroupUpdate>
+
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.UserGroupUpdate+(json|xml)
+ETag: "348506873465777"
+Content-Type: application/vnd.ez.api.UserGroup+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroup href="/user/groups/1/5/65" id="65" media-type="application/vnd.ez.api.UserGroup+xml" remoteId="remoteId-qwert543">
+  <ContentType href="/content/types/5" media-type="application/vnd.ez.api.ContentType+xml" />
+  <name>UserGroup</name>
+  <Versions href="/content/objects/123/versions" media-type="application/vnd.ez.api.VersionList+xml" />
+  <Section href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/5/65" media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/123/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/13" media-type="application/vnd.ez.api.User+xml" />
+  <publishDate>2012-02-31T16:00:00</publishDate>
+  <lastModificationDate>2012-02-31T16:00:00</lastModificationDate>
+  <mainLanguageCode>eng-UK</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+  <Content>
+    <VersionInfo>
+      <id>125</id>
+      <versionNo>3</versionNo>
+      <status>PUBLISHED</status>
+      <modificationDate>2012-03-31T16:00:00</modificationDate>
+      <Creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>2012-03-31T16:00:00</creationDate>
+      <initialLanguageCode>eng-UK</initialLanguageCode>
+      <Content href="/content/objects/123" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+    <Fields>
+      <field>
+        <id>1234</id>
+        <fieldDefinitionIdentifer>name</fieldDefinitionIdentifer>
+        <languageCode>eng-UK</languageCode>
+        <fieldValue>UserGroup</fieldValue>
+      </field>
+      <field>
+        <id>1235</id>
+        <fieldDefinitionIdentifer>description</fieldDefinitionIdentifer>
+        <languageCode>eng-UK</languageCode>
+        <fieldValue>This is another description of the user group</fieldValue>
+      </field>
+    </Fields>
+    <Relations />
+  </Content>
+  <ParentUserGroup href="/user/groups/1/5" media-type="application/vnd.ez.api.UserGroup+xml" />
+  <SubGroups href="/user/groups/1/5/65/subgroups" media-type="application/vnd.ez.api.UserGroupList+xml"/>
+  <Users href="/user/groups/1/5/65/users" media-type="application/vnd.ez.api.UserList+xml"/>
+  <Roles href="/user/groups/1/5/65/roles" media-type="application/vnd.ez.api.RoleList+xml"/>
+</UserGroup>
+
+
+
+
+

5.1.1.6   Delete User Group

+ +++ + + + + + + + + + +
Resource:/user/groups/<path>
Method:DELETE
Description:the given user group is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete this content type
403:If the user group is not empty
+
+
+
+

5.1.1.7   Load Users of Group

+ +++ + + + + + + + + + + + + + +
Resource:

/user/groups/<ID>/users

+
Method:

GET

+
Description:

loads the users of the group with the given <ID>

+
Headers: +++ + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.UserList+xml:
 if set the user list returned in xml format (see User)
application/vnd.ez.api.UserList+json:
 if set the user list is returned in json format (see User)
application/vnd.ez.api.UserRefList+xml:
 if set the link list of users returned in xml format (see User)
application/vnd.ez.api.UserRefList+json:
 if set the link list of users is returned in json format (see User)
+
+
Parameters: +++ + + + + + +
limit:only <limit> items will be returned started by offset
offset:offset of the result set
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+User
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read user groups
404:If the user group does not exist
+
+
+
+

5.1.1.8   Move user Group

+ +++ + + + + + + + + + + + +
Resource:

/user/groups/<path>

+
Method:

MOVE or POST with header X-HTTP-Method-Override: MOVE

+
Description:

moves the user group to another parent.

+
Headers: +++ + + + +
Destination:A parent group resource to which the location is moved
+
Response:
+
+HTTP/1.1 201 Created
+Location: /user/groups/<newPath>
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to update the user group
403:If the new parenbt does not exist
404:If the user group does not exist
+
+
+
+

5.1.1.9   Load Subgroups

+ +++ + + + + + + + + + + + +
Resource:

/user/groups/<ID>/subgroups

+
Method:

GET

+
Description:

Returns a list of the sub groups

+
Headers: +++ + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.UserGroupList+xml:
 if set the user group list returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupList+json:
 if set the user group list is returned in json format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+xml:
 if set the link list of user groups is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+json:
 if set the link list of user groups is returned in json format (see UserGroup)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read user groups
404:If the user group does not exist
+
+
+
+

5.1.1.10   Create User

+ +++ + + + + + + + + + + + +
Resource:

/user/groups/<path>/users

+
Method:

POST

+
Description:

Creates a new user in the given group

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.User+xml:
 if set the new user is returned in xml format (see User)
application/vnd.ez.api.User+json:
 if set the new user is returned in json format (see User)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.UserCreate+json:
 the UserCreate schema encoded in json
application/vnd.ez.api.UserCreate+xml:
 the UserCreate schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /user/users/<ID>
+Accept-Patch:  application/vnd.ez.api.UserUpdate+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+User
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this user
403:If a user with the same login already exists
404:If the group with the given ID does not exist
+
+
+
5.1.1.10.1   XML Example
+
+POST /user/groups/1/5/65/users HTTP/1.1
+Accept: application/vnd.ez.api.User+xml
+Content-Type: application/vnd.ez.api.UserCreate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserCreate>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <remoteId>remoteId-qwert426</remoteId>
+  <login>john</login>
+  <email>john.doe@example.net</email>
+  <password>john-does-password</password>
+  <fields>
+    <field>
+      <fieldDefinitionIdentifer>first_name</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>John</fieldValue>
+    </field>
+    <field>
+      <fieldDefinitionIdentifer>last_name</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>Doe</fieldValue>
+    </field>
+  </fields>
+</UserCreate>
+
+
+HTTP/1.1 201 Created
+Location: /user/users/99
+Accept-Patch: application/vnd.ez.api.UserUpdate+xml
+ETag: "34567340896734095867"
+Content-Type: application/vnd.ez.api.User+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<User href="/user/users/99" id="99" media-type="application/vnd.ez.api.User+xml"
+  remoteId="remoteId-qwert426">
+  <ContentType href="/content/types/4" media-type="application/vnd.ez.api.ContentType+xml" />
+  <name>John</name>
+  <Versions href="/content/objects/79" media-type="application/vnd.ez.api.VersionList+xml" />
+  <Section href="/content/section/3" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/5/65"
+    media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/79/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+  <publishDate>2001-04-01T12:00:00</publishDate>
+  <lastModificationDate>2001-04-01T12:00:00</lastModificationDate>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+  <login>john</login>
+  <email>john.doe@example.net</email>
+  <enabled>true</enabled>
+  <Content>
+    <VersionInfo>
+      <id>1243</id>
+      <versionNo>1</versionNo>
+      <status>PUBLISHED</status>
+      <modificationDate>2001-04-01T12:00:00</modificationDate>
+      <Creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>2001-04-01T12:00:00</creationDate>
+      <initialLanguageCode>eng-UK</initialLanguageCode>
+      <Content href="/content/objects/79" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+    <fields>
+      <field>
+        <fieldDefinitionIdentifer>first_name</fieldDefinitionIdentifer>
+        <languageCode>eng-US</languageCode>
+        <fieldValue>John</fieldValue>
+      </field>
+      <field>
+        <fieldDefinitionIdentifer>last_name</fieldDefinitionIdentifer>
+        <languageCode>eng-US</languageCode>
+        <fieldValue>Doe</fieldValue>
+      </field>
+    </fields>
+  </Content>
+  <Roles href="/user/users/99/roles" media-type="application/vnd.ez.api.RoleAssignmentList+xml" />
+  <UserGroups href="/user/users/99/group" media-type="vns.ez.api.UserGroupRefList+xml" />
+</User>
+
+
+
+
+

5.1.1.11   List Users

+ +++ + + + + + + + + + + + + + +
Resource:

/user/users

+
Method:

GET

+
Description:

Load users either for a given remoteId or role

+
Parameters: +++ + + + + + +
roleId:lists users assigned to the given role
remoteId:retieves the user for the given remoteId
+
Headers: +++ + + + +
Accept: +++ + + + + + + + + + + + + + +
application/vnd.ez.api.UserList+xml:
 if set the user list returned in xml format (see User)
application/vnd.ez.api.UserList+json:
 if set the user list is returned in json format (see User)
application/vnd.ez.api.UserRefList+xml:
 if set the link list of users returned in xml format (see User)
application/vnd.ez.api.UserRefList+json:
 if set the link list of users is returned in json format (see User)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+User
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read users
+
+
+
+

5.1.1.12   Load User

+ +++ + + + + + + + + + + + +
Resource:

/user/users/<ID>

+
Method:

GET

+
Description:

loads the users of the group with the given <ID>

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.User+xml:
 if set the new user is returned in xml format (see User)
application/vnd.ez.api.User+json:
 if set the new user is returned in json format (see User)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Location: /user/users/<ID>
+Accept-Patch:  application/vnd.ez.api.UserUpdate+(json|xml)
+ETag: "<Etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+User
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read users
404:If the user does not exist
+
+
+
+

5.1.1.13   Update User

+ +++ + + + + + + + + + + + +
Resource:

/user/users/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates a user

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.User+xml:
 if set the new user is returned in xml format (see User)
application/vnd.ez.api.User+json:
 if set the new user is returned in json format (see User)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.UserUpdate+json:
 the UserUpdate schema encoded in json
application/vnd.ez.api.UserUpdate+xml:
 the UserUpdate schema encoded in xml
+
If-Match:

<etag> Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned.

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.UserUpdate+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+User
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update the user
404:If the user does not exist
412:If the current ETag does not match with the provided one in the If-Match header
+
+
+
5.1.1.13.1   XML Example
+
+POST /user/users/99 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Accept: application/vnd.ez.api.User+xml
+Content-Type: application/vnd.ez.api.UserUpdate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserUpdate>
+  <email>john.doe@mooglemail.com</email>
+  <fields>
+    <field>
+      <fieldDefinitionIdentifer>signature</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>
+      John Doe
+      Example Systems
+      john.doe@mooglemail.com
+      skype: johndoe
+      </fieldValue>
+    </field>
+  </fields>
+</UserUpdate>
+
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.UserUpdate+(json|xml)
+ETag: "435908672409561"
+Content-Type: application/vnd.ez.api.User+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<User href="/user/users/99" id="99" media-type="application/vnd.ez.api.User+xml"
+  remoteId="remoteId-qwert426">
+  <ContentType href="/content/types/4" media-type="application/vnd.ez.api.ContentType+xml" />
+  <name>John</name>
+  <Versions href="/content/objects/79" media-type="application/vnd.ez.api.VersionList+xml" />
+  <Section href="/content/section/3" media-type="application/vnd.ez.api.Section+xml" />
+  <MainLocation href="/content/locations/1/5/65"
+    media-type="application/vnd.ez.api.Location+xml" />
+  <Locations href="/content/objects/79/locations" media-type="application/vnd.ez.api.LocationList+xml" />
+  <Owner href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+  <publishDate>2001-04-01T12:00:00</publishDate>
+  <lastModificationDate>2001-04-01T12:00:00</lastModificationDate>
+  <mainLanguageCode>eng-US</mainLanguageCode>
+  <alwaysAvailable>true</alwaysAvailable>
+  <login>john</login>
+  <email>john.doe@mooglemail.com</email>
+  <enabled>true</enabled>
+  <Content>
+    <VersionInfo>
+      <id>1243</id>
+      <versionNo>1</versionNo>
+      <status>PUBLISHED</status>
+      <modificationDate>2001-04-01T12:00:00</modificationDate>
+      <Creator href="/user/users/14" media-type="application/vnd.ez.api.User+xml" />
+      <creationDate>2001-04-01T12:00:00</creationDate>
+      <initialLanguageCode>eng-UK</initialLanguageCode>
+      <Content href="/content/objects/79" media-type="application/vnd.ez.api.ContentInfo+xml" />
+    </VersionInfo>
+    <fields>
+      <field>
+        <fieldDefinitionIdentifer>first_name</fieldDefinitionIdentifer>
+        <languageCode>eng-US</languageCode>
+        <fieldValue>John</fieldValue>
+      </field>
+      <field>
+        <fieldDefinitionIdentifer>last_name</fieldDefinitionIdentifer>
+        <languageCode>eng-US</languageCode>
+        <fieldValue>Doe</fieldValue>
+      </field>
+    </fields>
+    <field>
+      <fieldDefinitionIdentifer>signature</fieldDefinitionIdentifer>
+      <languageCode>eng-US</languageCode>
+      <fieldValue>
+      John Doe
+      Example Systems
+      john.doe@mooglemail.com
+      skype: johndoe
+      </fieldValue>
+    </field>
+  </Content>
+  <Roles href="/user/users/99/roles" media-type="application/vnd.ez.api.RoleAssignmentList+xml" />
+  <UserGroups href="/user/users/99/group" media-type="vns.ez.api.UserGroupRefList+xml" />
+</User>
+
+
+
+
+

5.1.1.14   Delete User

+ +++ + + + + + + + + + +
Resource:/user/users/<ID>
Method:DELETE
Description:the given user is deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to delete this user
403:If the user is the same as the authenticated user
404:If the user does not exist
+
+
+
+

5.1.1.15   Load Groups Of User

+ +++ + + + + + + + + + + + +
Resource:

/user/users/<ID>/groups

+
Method:

GET

+
Description:

Returns a list of user groups the user belongs to. The returned list includes the resources for unassigning a user group if the user is in multiple groups.

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UserGroupRefList+xml:
 if set the link list of user groups is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+json:
 if set the link list of user groups is returned in json format (see UserGroup)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read user groups
404:If the user does not exist
+
+
+
5.1.1.15.1   XML Example
+
+GET /user/users/45/groups HTTP/1.1
+Accept: application/vnd.ez.api.UserGroupRefList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.UserGroupRefList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroupRefList href="/user/users/45/groups"
+  media-type="application/vnd.ez.api.UserGroupRefList">
+  <UserGroup href="/user/groups/1/5/34" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/34" method="DELETE" />
+  </UserGroup>
+  <UserGroup href="/user/groups/1/5/78" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/78" method="DELETE" />
+  </UserGroup>
+</UserGroupRefList>
+
+
+
+
+

5.1.1.16   Assign User Group

+ +++ + + + + + + + + + + + + + +
Resource:

/user/users/<ID>/groups

+
Method:

POST

+
Description:

Assigns the user to a user group

+
Parameters: +++ + + + +
group:the new parent group resource of the user
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UserGroupRefList+xml:
 if set the link list of user groups is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+json:
 if set the link list of user groups is returned in json format (see UserGroup)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:

If the user is not authorized to assign user groups

+
403:
    +
  • If the new user group does not exist
  • +
  • If the user is already in this group
  • +
+
404:

If the user does not exist

+
+
+
+
5.1.1.16.1   XML Example
+
+POST /user/users/45/groups?/user/groups/1/5/88 HTTP/1.1
+Accept: application/vnd.ez.api.UserGroupRefList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.UserGroupRefList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroupRefList href="/user/users/45/groups"
+  media-type="application/vnd.ez.api.UserGroupRefList">
+  <UserGroup href="/user/groups/1/5/34" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/34" method="DELETE" />
+  </UserGroup>
+  <UserGroup href="/user/groups/1/5/78" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/78" method="DELETE" />
+  </UserGroup>
+  <UserGroup href="/user/groups/1/5/88" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/88" method="DELETE" />
+  </UserGroup>
+</UserGroupRefList>
+
+
+
+
+

5.1.1.17   Unassign User Group

+ +++ + + + + + + + + + + + +
Resource:

/user/users/<ID>/groups/<ID>

+
Method:

DELETE

+
Description:

Unassigns the user from a user group

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.UserGroupRefList+xml:
 if set the link list of user groups is returned in xml format (see UserGroup)
application/vnd.ez.api.UserGroupRefList+json:
 if set the link list of user groups is returned in json format (see UserGroup)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+UserGroup
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
401:If the user is not authorized to unassign user groups
403:If the user is not in the given group
404:If the user does not exist
+
+
+
5.1.1.17.1   XML Example
+
+DELETE /user/users/45/groups/78 HTTP/1.1
+Accept: application/vnd.ez.api.UserGroupRefList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.UserGroupRefList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<UserGroupRefList href="/user/users/45/groups"
+  media-type="application/vnd.ez.api.UserGroupRefList">
+  <UserGroup href="/user/groups/1/5/34" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/34" method="DELETE" />
+  </UserGroup>
+  <UserGroup href="/user/groups/1/5/88" media-type="application/vnd.ez.api.UserGroup">
+    <unassign href="/user/users/45/groups/88" method="DELETE" />
+  </UserGroup>
+</UserGroupRefList>
+
+
+
+
+
+

5.1.2   Managing Roles and Policies

+
+

5.1.2.1   Create Role

+ +++ + + + + + + + + + + + +
Resource:

/user/roles

+
Method:

POST

+
Description:

Creates a new role

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Role+xml:
 if set the new user is returned in xml format (see Role)
application/vnd.ez.api.Role+json:
 if set the new user is returned in json format (see Role)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.RoleInput+json:
 the RoleInput schema encoded in json
application/vnd.ez.api.RoleInput+xml:
 the RoleInput schema encoded in xml
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /user/roles/<ID>
+Accept-Patch:  application/vnd.ez.api.RoleUpdate+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create this role
+
+
+
5.1.2.1.1   XML Example
+
+POST /user/roles HTTP/1.1
+Accept: application/vnd.ez.api.Role+xml
+Content-Type: application/vnd.ez.api.RoleInput+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<RoleInput>
+  <identifier>NewRole</identifier>
+</RoleInput>
+
+
+HTTP/1.1 201 Created
+Location: /user/roles/11
+Accept-Patch: application/vnd.ez.api.RoleUpdate+xml
+ETag: "465897639450694836"
+Content-Type: application/vnd.ez.api.Role+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<Role href="/user/roles/11" media-type="application/vnd.ez.api.Role+xml">
+  <identifier>NewRole</identifier>
+  <Policies href="/user/roles/11/policies" media-type="application/vnd.ez.api.PolicyList+xml"/>
+</Role>
+
+
+
+
+

5.1.2.2   Load Roles

+ +++ + + + + + + + + + + + + + +
Resource:

/user/roles

+
Method:

GET

+
Description:

Returns a list of all roles

+
Parameters: +++ + + + + + + + +
identifier:Restricts the result to a list containing the role with the given identifier. If the role is not found an empty list is returned.
limit:only <limit> items will be returned started by offset
offset:offset of the result set
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RoleList+xml:
 if set the user list returned in xml format (see Role)
application/vnd.ez.api.RoleList+json:
 if set the user list is returned in json format (see Role)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+ETag: "<Etag>"
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read roles
+
+
+
+

5.1.2.3   Load Role

+ +++ + + + + + + + + + + + +
Resource:

/user/roles/<ID>

+
Method:

GET

+
Description:

loads a role for the given <ID>

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Role+xml:
 if set the user list returned in xml format (see Role)
application/vnd.ez.api.Role+json:
 if set the user list is returned in json format (see Role)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.RoleInput+(json|xml)
+ETag: "<Etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read roles
404:If the role does not exist
+
+
+
+

5.1.2.4   Update Role

+ +++ + + + + + + + + + + + +
Resource:

/user/roles/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

Updates a role

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Role+xml:
 if set the new user is returned in xml format (see Role)
application/vnd.ez.api.Role+json:
 if set the new user is returned in json format (see Role)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.RoleInput+json:
 the RoleInput schema encoded in json
application/vnd.ez.api.RoleInput+xml:
 the RoleInput schema encoded in xml
+
If-Match:

<etag> Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned.

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch:  application/vnd.ez.api.RoleInput+(json|xml)
+ETag: "<newEtag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update the role
412:If the current ETag does not match with the provided one in the If-Match header
+
+
+
+

5.1.2.5   Delete Role

+ +++ + + + + + + + + + +
Resource:/user/roles/<ID>
Method:DELETE
Description:the given role and all assignments to users or user groups are deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user is not authorized to delete this role
+
+
+
+

5.1.2.6   Load Roles for User or User Group

+ +++ + + + + + + + + + + + +
Resource:
    +
  • /user/groups/<path>/roles for user group
  • +
  • /user/users/<ID>/roles for user
  • +
+
Method:

GET

+
Description:

Returns a list of all roles assigned to the given user group

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RoleAssignmentList+xml:
 if set the role assignment list is returned in xml format (see Role)
application/vnd.ez.api.RoleAssignmentList+json:
 if set the role assignment list is returned in json format (see Role)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read roles
+
+
+
5.1.2.6.1   XML Example
+
+GET /user/groups/1/5/65/roles HTTP/1.1
+Accept: application/vnd.ez.api.RoleAssignmentList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.RoleAssignmentList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<RoleAssignmentList href="/user/groups/1/5/65/roles" media-type="application/vnd.ez.api.RoleAssignmentList+xml">
+  <RoleAssignment href="/user/groups/1/5/65/roles/5" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <Role href="/user/roles/5" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+  <RoleAssignment href="/user/groups/1/5/65/roles/7" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <limitation identifier="Subtree">
+      <values>
+          <ref href="/content/locations/1/23/88" media-type="application/vnd.ez.api.Location+xml" />
+          <ref href="/content/locations/1/32/67" media-type="application/vnd.ez.api.Location+xml" />
+      </values>
+    </limitation>
+    <Role href="/user/roles/7" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+</RoleAssignmentList>
+
+
+
+
+

5.1.2.7   Load Assignment

+ +++ + + + + + + + + + + + +
Resource:
    +
  • /user/groups/<path>/roles/<ID> for user group
  • +
  • /user/users/<ID>/roles/<ID> for user
  • +
+
Method:

GET

+
Description:

Returns a roleassignment to the given user or user group

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RoleAssignment+xml:
 if set the role assignment list is returned in xml format (see Role)
application/vnd.ez.api.RoleAssignment+json:
 if set the role assignment list is returned in json format (see Role)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read roles
+
+
+
+

5.1.2.8   Assign Role to User or User Group

+ +++ + + + + + + + + + + + +
Resource:
    +
  • /user/groups/<path>/roles for user group
  • +
  • /user/users/<ID>/roles for user
  • +
+
Method:

POST

+
Description:

assign a role to a user or user group.

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RoleAssignmentList+xml:
 if set the updated role assignment list is returned in xml format (see Role)
application/vnd.ez.api.RoleAssignmentList+json:
 if set the updated role assignment list is returned in json format (see Role)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.RoleAssignInput+json:
 the RoleAssignInput schema encoded in json
application/vnd.ez.api.RoleAssignInput+xml:
 the RoleAssignInput schema encoded in xml
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user is not authorized to assign this role
+
+
+
5.1.2.8.1   XML Example
+
+POST /user/groups/1/5/65/roles HTTP/1.1
+Accept: application/vnd.ez.api.RoleAssignmentList+xml
+Content-Type:  application/vnd.ez.api.RoleAssignInput+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<RoleAssignInput>
+  <Role href="/user/role/11" media-type="application/vnd.ez.api.RoleAssignInput+xml"/>
+  <limitation identifier="Section">
+      <values>
+          <ref href="/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
+          <ref href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+      </values>
+  </limitation>
+</RoleAssignInput>
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.RoleAssignmentList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<RoleAssignmentList href="/user/groups/1/5/65/roles" media-type="application/vnd.ez.api.RoleAssignmentList+xml">
+  <RoleAssignment href="/user/groups/1/5/65/roles/5" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <Role href="/user/roles/5" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+  <RoleAssignment href="/user/groups/1/5/65/roles/7" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <limitation identifier="Subtree">
+      <values>
+          <ref href="/content/locations/1/23/88" media-type="application/vnd.ez.api.Location+xml" />
+          <ref href="/content/locations/1/32/67" media-type="application/vnd.ez.api.Location+xml" />
+      </values>
+    </limitation>
+    <Role href="/user/roles/7" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+  <RoleAssignment href="/user/groups/1/5/65/roles/11" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <limitation identifier="Section">
+      <values>
+          <ref href="/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
+          <ref href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+      </values>
+    </limitation>
+    <Role href="/user/roles/11" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+</RoleAssignmentList>
+
+
+
+
+

5.1.2.9   Unassign Role from User or User Group

+ +++ + + + + + + + + + + + +
Resource:
    +
  • /user/groups/<path>/roles/<ID> for user group
  • +
  • /user/users/<ID>/roles/<ID> for user
  • +
+
Method:

DELETE

+
Description:

the given role is removed from the user or user group

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.RoleAssignmentList+xml:
 if set the updated role assignment list is returned in xml format (see Role)
application/vnd.ez.api.RoleAssignmentList+json:
 if set the updated role assignment list is returned in json format (see Role)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Role
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user is not authorized to delete this content type
+
+
+
5.1.2.9.1   XML Example
+
+DELETE /user/groups/1/5/65/roles/7 HTTP/1.1
+Accept: application/vnd.ez.api.RoleAssignmentList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.RoleAssignmentList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<RoleAssignmentList href="/user/groups/1/5/65/roles" media-type="application/vnd.ez.api.RoleAssignmentList+xml">
+  <RoleAssignment href="/user/groups/1/5/65/roles/5" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <Role href="/user/roles/5" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+  <RoleAssignment href="/user/groups/1/5/65/roles/11" media-type="application/vnd.ez.api.RoleAssignment+xml">
+    <limitation identifier="Section">
+      <values>
+          <ref href="/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
+          <ref href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+      </values>
+    </limitation>
+    <Role href="/user/roles/11" media-type="application/vnd.ez.api.Role+xml"/>
+  </RoleAssignment>
+</RoleAssignmentList>
+
+
+
+
+

5.1.2.10   Load Policies

+ +++ + + + + + + + + + + + +
Resource:

/user/roles/<ID>/policies

+
Method:

GET

+
Description:

loads policies for the given role

+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.PolicyList+xml:
 if set the policy list is returned in xml format (see Policy)
application/vnd.ez.api.PolicyList+json:
 if set the policy list is returned in json format (see Policy)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Policy
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read roles
404:If the role does not exist
+
+
+
5.1.2.10.1   XML Example
+
+GET /user/roles/7/policies HTTP/1.1
+Accept: application/vnd.ez.api.PolicyList+xml
+
+
+HTTP/1.1 200 OK
+Content-Type: application/vnd.ez.api.PolicyList+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<PolicyList href="/user/roles/11/policies" media-type="application/vnd.ez.api.PolicyList">
+  <Policy href="/user/roles/11/policies/45" media-type="application/vnd.ez.api.Policy+xml">
+    <id>45</id>
+    <module>content</module>
+    <function>create</function>
+    <limitations>
+      <limitation identifier="Class">
+        <values>
+          <ref href="/content/types/10" media-type="application/vnd.ez.api.ContentType+xml" />
+          <ref href="/content/types/11" media-type="application/vnd.ez.api.ContentType+xml" />
+          <ref href="/content/types/12" media-type="application/vnd.ez.api.ContentType+xml" />
+        </values>
+      </limitation>
+      <limitation identifier="ParentClass">
+        <values>
+          <ref href="/content/types/4" media-type="application/vnd.ez.api.ContentType+xml" />
+        </values>
+      </limitation>
+    </limitations>
+  </Policy>
+  <Policy href="/user/roles/11/policies/49" media-type="application/vnd.ez.api.Policy+xml">
+    <id>49</id>
+    <module>content</module>
+    <function>read</function>
+    <limitations>
+      <limitation identifier="Section">
+        <values>
+          <ref href="/content/sections/1" media-type="application/vnd.ez.api.Section+xml" />
+          <ref href="/content/sections/2" media-type="application/vnd.ez.api.Section+xml" />
+          <ref href="/content/sections/4" media-type="application/vnd.ez.api.Section+xml" />
+        </values>
+      </limitation>
+    </limitations>
+  </Policy>
+</PolicyList>
+
+
+
+
+

5.1.2.11   Delete Policies

+ +++ + + + + + + + + + +
Resource:/user/roles/<ID>/policies
Method:DELETE
Description:all policies of the given role are deleted
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user is not authorized to delete this content type
+
+
+
+

5.1.2.12   Load Policy

+ +++ + + + + + + + + + + + +
Resource:

/user/roles/<ID>/policies/<ID>

+
Method:

GET

+
Description:

loads a policy for the given module and function

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Policy+xml:
 if set the policy is returned in xml format (see Policy)
application/vnd.ez.api.Policy+json:
 if set the policy is returned in json format (see Policy)
+
If-None-Match:

<etag>

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json)
+ETag: "<etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Policy
+
+ +++ + + + +
Error Codes: +++ + + + + + +
401:If the user has no permission to read roles
404:If the role or policy does not exist
+
+
+
5.1.2.12.1   XML Example
+
+GET /user/roles/7/policies/45 HTTP/1.1
+Accept: application/vnd.ez.api.Policy+xml
+
+
+HTTP/1.1 200 OK
+Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json)
+ETag: "697850469873045967"
+Content-Type: application/vnd.ez.api.Policy+xml
+Content-Length: xxx
+
+
+<Policy href="/user/roles/11/policies/45" media-type="application/vnd.ez.api.Policy+xml">
+  <id>45</id>
+  <module>content</module>
+  <function>create</function>
+  <limitations>
+    <limitation identifier="Class">
+      <values>
+        <ref href="/content/types/10" media-type="application/vnd.ez.api.ContentType+xml" />
+        <ref href="/content/types/11" media-type="application/vnd.ez.api.ContentType+xml" />
+        <ref href="/content/types/12" media-type="application/vnd.ez.api.ContentType+xml" />
+      </values>
+    </limitation>
+    <limitation identifier="ParentClass">
+      <values>
+        <ref href="/content/types/4" media-type="application/vnd.ez.api.ContentType+xml" />
+      </values>
+    </limitation>
+  </limitations>
+</Policy>
+
+
+
+
+

5.1.2.13   Create Policy

+ +++ + + + + + + + + + + + +
Resource:

/user/roles/<ID>/policies/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

updates a policy

+
Headers: +++ + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Policy+xml:
 if set the updated policy is returned in xml format (see Policy)
application/vnd.ez.api.Policy+json:
 if set the updated policy is returned in json format (see Policy)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.PolicyCreate+xml:
 if set the updated policy is returned in xml format (see Policy)
application/vnd.ez.api.PolicyCreate+json:
 if set the updated policy is returned in json format (see Policy)
+
+
Response:
+
+HTTP/1.1 201 Created
+Location: /user/roles/<ID>/policies/<newId>
+Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json)
+ETag: "<new_etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Policy
+
+ +++ + + + +
Error Codes: +++ + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to create the policy
404:If the role does not exist
+
+
+
5.1.2.13.1   XML Example
+
+POST /user/roles/7/policies HTTP/1.1
+Content-Type: application/vnd.ez.api.PolicyCreate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<PolicyCreate>
+  <module>content</module>
+  <function>create</function>
+  <limitations>
+    <limitation identifier="Class">
+      <values>
+        <ref href="/content/types/13"/>
+      </values>
+    </limitation>
+    <limitation identifier="ParentClass">
+      <values>
+        <ref href="/content/types/12"/>
+      </values>
+    </limitation>
+  </limitations>
+</PolicyCreate>
+
+
+HTTP/1.1 201 Created
+Location: /user/roles/7/policies/55
+Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json)
+ETag: "697850469873043234234"
+Content-Type: application/vnd.ez.api.Policy+xml
+Content-Length: xxx
+
+
+<Policy href="/user/roles/11/policies/55" media-type="application/vnd.ez.api.Policy+xml">
+  <id>55</id>
+  <module>content</module>
+  <function>create</function>
+  <limitations>
+    <limitation identifier="Class">
+      <values>
+        <ref href="/content/types/13"/>
+      </values>
+    </limitation>
+    <limitation identifier="ParentClass">
+      <values>
+        <ref href="/content/types/12"/>
+      </values>
+    </limitation>
+  </limitations>
+ </Policy>
+
+
+
+
+

5.1.2.14   Update Policy

+ +++ + + + + + + + + + + + +
Resource:

/user/roles/<ID>/policies/<ID>

+
Method:

PATCH or POST with header X-HTTP-Method-Override: PATCH

+
Description:

updates a policy

+
Headers: +++ + + + + + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.Policy+xml:
 if set the updated policy is returned in xml format (see Policy)
application/vnd.ez.api.Policy+json:
 if set the updated policy is returned in json format (see Policy)
+
Content-Type: +++ + + + + + + + +
application/vnd.ez.api.PolicyUpdate+xml:
 if set the updated policy is returned in xml format (see Policy)
application/vnd.ez.api.PolicyUpdate+json:
 if set the updated policy is returned in json format (see Policy)
+
If-Match:

<etag> Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned.

+
+
Response:
+
+HTTP/1.1 200 OK
+Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json)
+ETag: "<new_etag>"
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Policy
+
+ +++ + + + +
Error Codes: +++ + + + + + + + + + +
400:If the Input does not match the input schema definition, In this case the response contains an ErrorMessage
401:If the user is not authorized to update the policy
404:If the role does not exist
412:If the current ETag does not match with the provided one in the If-Match header
+
+
+
5.1.2.14.1   XML Example
+
+POST /user/roles/7/policies/55 HTTP/1.1
+X-HTTP-Method-Override: PATCH
+Accept: application/vnd.ez.api.Policy+xml
+If-Match: "697850469873043236666"
+Content-Type: application/vnd.ez.api.PolicyUpdate+xml
+Content-Length: xxx
+
+
+<?xml version="1.0" encoding="UTF-8"?>
+<PolicyUpdate>
+  <limitations>
+    <limitation identifier="Class">
+      <values>
+        <ref href="/content/types/14"/>
+      </values>
+    </limitation>
+    <limitation identifier="ParentClass">
+      <values>
+        <ref href="/content/types/10"/>
+      </values>
+    </limitation>
+  </limitations>
+</PolicyUpdate>
+
+
+HTTP/1.1 200 OK
+Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json)
+ETag: "697850469873043234234"
+Content-Type: application/vnd.ez.api.Policy+xml
+Content-Length: xxx
+
+
+<Policy href="/user/roles/11/policies/55" media-type="application/vnd.ez.api.Policy+xml">
+  <id>55</id>
+  <module>content</module>
+  <function>create</function>
+  <limitations>
+    <limitation identifier="Class">
+      <values>
+        <ref href="/content/types/14"/>
+      </values>
+    </limitation>
+    <limitation identifier="ParentClass">
+      <values>
+        <ref href="/content/types/10"/>
+      </values>
+    </limitation>
+  </limitations>
+ </Policy>
+
+
+
+
+

5.1.2.15   Delete Policy

+ +++ + + + + + + + +
Resource:/user/roles/<ID>/policies/<ID>
Method:DELETE
Response:
+
+HTTP/1.1 204 No Content
+
+ +++ + + + + + +
Description:

the given policy is deleted

+
Error Codes: +++ + + + + + +
401:If the user is not authorized to delete this content type
404:If the role or policy does not exist
+
+
+
+

5.1.2.16   List Policies for user

+ +++ + + + + + + + + + + + + + +
Resource:

/user/policies

+
Method:

GET

+
Description:

search all policies which are applied to a given user

+
Parameters: +++ + + + +
userId:the user id
+
Headers: +++ + + + +
Accept: +++ + + + + + + + +
application/vnd.ez.api.PolicyList+xml:
 if set the policy list is returned in xml format (see Policy)
application/vnd.ez.api.PolicyList+json:
 if set the policy list is returned in json format (see Policy)
+
+
Response:
+
+HTTP/1.1 200 OK
+Content-Type: <depending on accept header>
+Content-Length: <length>
+
+
+Policy
+
+ +++ + + + +
Error Codes: +++ + + + +
401:If the user has no permission to read roles
+
+
+
+
+
+
+

6   Input Output Specification

+
+

6.1   Common Definitions

+

Common definition which are used from multiple schema definitions

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:complexType name="ref">
+    <xsd:annotation>
+      <xsd:documentation>
+        A base schema for referencing resources.
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="href" type="xsd:string" />
+    <xsd:attribute name="media-type" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="refValueList">
+    <xsd:sequence>
+      <xsd:element name="ref" type="ref" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="controllerRef">
+    <xsd:annotation>
+      <xsd:documentation>
+        A base schema for referencing controllers and
+        methods
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:attribute name="href" type="xsd:string" />
+    <xsd:attribute name="method" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="valueType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="value" type="valueType" minOccurs="0" maxOccurs="unbounded"/>
+    </xsd:sequence>
+    <xsd:attribute name="key" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="fieldValueType" mixed="true">
+    <xsd:sequence>
+      <xsd:element name="value" type="valueType" minOccurs="0" maxOccurs="unbounded"></xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="fieldInputValueType">
+    <xsd:annotation>
+      <xsd:documentation>
+        Schema for field inputs in content create and
+        update structures
+      </xsd:documentation>
+    </xsd:annotation>
+    <xsd:all>
+      <xsd:element name="fieldDefinitionIdentifer" type="xsd:string" />
+      <xsd:element name="languageCode" type="xsd:string" />
+      <xsd:element name="fieldValue" type="fieldValueType" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="multiLanguageValuesType">
+    <xsd:sequence>
+      <xsd:element name="value" minOccurs="1" maxOccurs="unbounded">
+        <xsd:complexType>
+          <xsd:simpleContent>
+            <xsd:extension base="xsd:string">
+              <xsd:attribute name="languageCode" type="xsd:string" />
+            </xsd:extension>
+          </xsd:simpleContent>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:simpleType name="sortFieldType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="PATH" />
+      <xsd:enumeration value="PUBLISHED" />
+      <xsd:enumeration value="MODIFIED" />
+      <xsd:enumeration value="SECTION" />
+      <xsd:enumeration value="DEPTH" />
+      <xsd:enumeration value="CLASS_IDENTIFIER" />
+      <xsd:enumeration value="CLASS_NAME" />
+      <xsd:enumeration value="PRIORITY" />
+      <xsd:enumeration value="NAME" />
+      <xsd:enumeration value="MODIFIED_SUBNODE" />
+      <xsd:enumeration value="NODE_ID" />
+      <xsd:enumeration value="CONTENTOBJECT_ID" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="versionStatus">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="DRAFT" />
+      <xsd:enumeration value="PUBLISHED" />
+      <xsd:enumeration value="ARCHIVED" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="contentTypeStatus">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="DRAFT" />
+      <xsd:enumeration value="DEFINED" />
+      <xsd:enumeration value="MODIFIED" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="sortOrderType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="ASC" />
+      <xsd:enumeration value="DESC" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="intList">
+    <xsd:list itemType="xsd:integer" />
+  </xsd:simpleType>
+  <xsd:simpleType name="dateList">
+    <xsd:list itemType="xsd:dateTime" />
+  </xsd:simpleType>
+  <xsd:simpleType name="stringList">
+    <xsd:list itemType="xsd:string" />
+  </xsd:simpleType>
+</xsd:schema>
+
+
+
+

6.2   Root Resources

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.Root">
+    <xsd:all>
+      <xsd:element name="content" type="ref" />
+      <xsd:element name="contentTypes" type="ref" />
+      <xsd:element name="users" type="ref"/>
+      <xsd:element name="roles" type="ref"/>
+      <xsd:element name="rootLocation" type="ref"/>
+      <xsd:element name="rootUserGroup" type="ref"/>
+      <xsd:element name="rootMediaFolder" type="ref"/>
+      <xsd:element name="trash" type="ref"/>
+      <xsd:element name="sections" type="ref"/>
+      <xsd:element name="views" type="ref"/>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="Root" type="vnd.ez.api.Root"/>
+</xsd:schema>
+
+
+
+

6.3   Content XML Schema

+
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="Version.xsd" />
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="embeddedVersionType">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="Version" minOccurs="0" type="versionType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentInfo">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="ContentType" type="ref" />
+          <xsd:element name="name" type="xsd:string" />
+          <xsd:element name="Versions" type="ref" />
+          <xsd:element name="Section" type="ref" />
+          <xsd:element name="MainLocation" type="ref" minOccurs="0" />
+          <xsd:element name="Locations" type="ref" minOccurs="0" />
+          <xsd:element name="Owner" type="ref" />
+          <xsd:element name="publishDate" type="xsd:dateTime"
+            minOccurs="0" />
+          <xsd:element name="lastModificationDate" type="xsd:dateTime" />
+          <xsd:element name="mainLanguageCode" type="xsd:string" />
+          <xsd:element name="alwaysAvailable" type="xsd:boolean" />
+        </xsd:all>
+        <xsd:attribute name="id" type="xsd:int" />
+        <xsd:attribute name="remoteId" type="xsd:string" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.Content">
+    <xsd:complexContent>
+      <xsd:extension base="vnd.ez.api.ContentInfo">
+        <xsd:all>
+          <xsd:element name="CurrentVersion" type="embeddedVersionType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="ContentInfo" type="vnd.ez.api.ContentInfo" />
+</xsd:schema>
+
+
+
+

6.4   Relation XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:simpleType name="relationType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="COMMON" />
+      <xsd:enumeration value="LINK" />
+      <xsd:enumeration value="EMBED" />
+      <xsd:enumeration value="ATTRIBUTE" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:complexType name="relationValueType">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="SourceContent" type="ref" />
+          <xsd:element name="DestinationContent" type="ref" />
+          <xsd:element name="RelationType" type="relationType" />
+          <xsd:element name="SourceFieldDefinitionIdentifier"
+            type="xsd:string" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="relationListType">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="Relation" type="relationValueType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="relationCreateType">
+    <xsd:all>
+      <xsd:element name="Destination" type="ref" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="Relation" type="relationValueType"></xsd:element>
+  <xsd:element name="RelationList" type="relationListType"></xsd:element>
+  <xsd:element name="RelationCreate" type="relationCreateType"></xsd:element>
+</xsd:schema>
+
+
+
+

6.5   Version XML Schema

+
+

6.5.1   VersionInfo

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="versionInfoType">
+    <xsd:all>
+      <xsd:element name="id" type="xsd:int">
+        <xsd:annotation>
+          <xsd:documentation>
+            The version id.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="versionNo" type="xsd:int">
+        <xsd:annotation>
+          <xsd:documentation>
+            The version number.
+            This is the version
+            number, which only
+            increments in scope of a single Content
+            object.
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="status" type="versionStatus" />
+      <xsd:element name="modificationDate" type="xsd:dateTime">
+        <xsd:annotation>
+          <xsd:documentation>
+            The date of the last modification of this
+            version
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="Creator" type="ref">
+        <xsd:annotation>
+          <xsd:documentation>
+            The user which has created this version
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="creationDate" type="xsd:dateTime">
+        <xsd:annotation>
+          <xsd:documentation>
+            The date this version was created
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="initialLanguageCode" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            In 4.x this is the language code which is
+            used for labeling a
+            translation.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="languageCodes" type="xsd:string"
+        minOccurs="0" maxOccurs="1" default="array()">
+        <xsd:annotation>
+          <xsd:documentation>
+            List of languages in this version
+            Reflects
+            which languages fields exists in for this version.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType"/>
+      <xsd:element name="Content" type="ref" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="VersionInfo" type="versionInfoType"/>
+</xsd:schema>
+
+
+
+

6.5.2   Version

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="VersionInfo.xsd" />
+  <xsd:include schemaLocation="Relation.xsd" />
+  <xsd:complexType name="fieldOutputValueType">
+    <xsd:all>
+      <xsd:element name="id" type="xsd:integer" />
+      <xsd:element name="fieldDefinitionIdentifer" type="xsd:string" />
+      <xsd:element name="languageCode" type="xsd:string" />
+      <xsd:element name="value" type="fieldValueType" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.Version">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="VersionInfo" type="versionInfoType" />
+          <xsd:element name="Fields" minOccurs="0">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="field" type="fieldValueType"
+                  minOccurs="1" maxOccurs="unbounded" />
+              </xsd:sequence>
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="Relations" minOccurs="0">
+            <xsd:complexType>
+              <xsd:complexContent>
+                <xsd:extension base="ref">
+                  <xsd:sequence>
+                    <xsd:element name="Relation" type="vnd.ez.api.Relation"
+                      minOccurs="0" maxOccurs="unbounded" />
+                  </xsd:sequence>
+                </xsd:extension>
+              </xsd:complexContent>
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="Version" type="vnd.ez.api.Version"></xsd:element>
+</xsd:schema>
+
+
+
+
+

6.6   VersionList XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="Version.xsd" />
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="versionListItemType">
+    <xsd:all>
+      <xsd:element name="Version" type="ref"></xsd:element>
+      <xsd:element name="VersionInfo" type="versionInfoType"></xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.VersionList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="VersionItem" type="versionListItemType"/>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="VersionList" type="vnd.ez.api.VersionList"></xsd:element>
+</xsd:schema>
+
+
+
+

6.7   VersionUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="versionUpdateType">
+    <xsd:all>
+      <xsd:element name="User" type="ref" minOccurs="0" />
+      <xsd:element name="modificationDate" type="xsd:dateTime"
+      <xsd:element name="initialLanguageCode" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="fields">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="field" type="fieldInputValueType" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="VersionUpdate" type="versionUpdateType"></xsd:element>
+</xsd:schema>
+
+
+
+

6.8   ContentCreate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="contentCreateType">
+    <xsd:all>
+      <xsd:element name="ContentType" type="ref" />
+      <xsd:element name="mainLanguageCode" type="xsd:string" />
+      <xsd:element name="LocationCreate" type="locationCreateType"/>
+      <xsd:element name="Section" type="ref" minOccurs="0" />
+      <xsd:element name="User" type="ref" minOccurs="0" />
+      <xsd:element name="alwaysAvailable" type="xsd:boolean"
+        default="true" minOccurs="0" />
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="modificationDate" type="xsd:dateTime"
+        minOccurs="0" />
+      <xsd:element name="fields">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="field" type="fieldInputValueType" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ContentCreate" type="contentCreateType"></xsd:element>
+</xsd:schema>
+
+
+
+

6.9   ContentUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="contentUpdateType">
+    <xsd:all>
+      <xsd:element name="mainLanguageCode" type="xsd:string" minOccurs="0" />
+      <xsd:element name="Section" type="ref" minOccurs="0" />
+      <xsd:element name="MainLocation" type="ref" minOccurs="0" />
+      <xsd:element name="Owner" type="ref" minOccurs="0" />
+      <xsd:element name="alwaysAvailable" type="xsd:boolean"
+        default="true" minOccurs="0" />
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="modificationDate" type="xsd:dateTime"
+        minOccurs="0" />
+      <xsd:element name="publishDate" type="xsd:dateTime"
+        minOccurs="0" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ContentUpdate" type="contentUpdateType"></xsd:element>
+</xsd:schema>
+
+
+
+

6.10   View XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="Content.xsd" />
+  <xsd:simpleType name="fieldOperatorType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="IN" />
+      <xsd:enumeration value="LIKE" />
+      <xsd:enumeration value="EQ" />
+      <xsd:enumeration value="LT" />
+      <xsd:enumeration value="LTE" />
+      <xsd:enumeration value="GT" />
+      <xsd:enumeration value="GTE" />
+      <xsd:enumeration value="BETWEEN" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="dateOperatorType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="EQ" />
+      <xsd:enumeration value="LT" />
+      <xsd:enumeration value="LTE" />
+      <xsd:enumeration value="GT" />
+      <xsd:enumeration value="GTE" />
+      <xsd:enumeration value="BETWEEN" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="dateMetaDataType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="CREATED" />
+      <xsd:enumeration value="MODIFIED" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="urlAliasOperatorType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="EQ" />
+      <xsd:enumeration value="IN" />
+      <xsd:enumeration value="LIKE" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="userMetaDataType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="CREATOR" />
+      <xsd:enumeration value="MODIFIER" />
+      <xsd:enumeration value="OWNER" />
+      <xsd:enumeration value="GROUP" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="sortClauseEnumType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="PATH" />
+      <xsd:enumeration value="PATHSTRING" />
+      <xsd:enumeration value="MODIFIED" />
+      <xsd:enumeration value="CREATED" />
+      <xsd:enumeration value="SECTIONIDENTIFER" />
+      <xsd:enumeration value="SECTIONID" />
+      <xsd:enumeration value="FIELD" />
+      <xsd:enumeration value="PRIORITY" />
+      <xsd:enumeration value="NAME" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:complexType name="fieldCriterionType">
+    <xsd:all>
+      <xsd:element name="target" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            The identifier of the field i.e identifier
+            of the corresponding field
+            definition
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="operator" type="fieldOperatorType" />
+      <xsd:element name="value" type="xsd:anyType" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="dateCriterionType">
+    <xsd:all>
+      <xsd:element name="target" type="dateMetaDataType">
+      </xsd:element>
+      <xsd:element name="operator" type="dateOperatorType" />
+      <xsd:element name="value" type="dateList" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="urlaliasCriterionType">
+    <xsd:all>
+      <xsd:element name="operator" type="urlAliasOperatorType" />
+      <xsd:element name="value" type="stringList" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="userMetaDataCriterionType">
+    <xsd:all>
+      <xsd:element name="target" type="userMetaDataType">
+      </xsd:element>
+      <xsd:element name="value" type="dateList" />
+    </xsd:all>
+  </xsd:complexType>
+
+
+  <xsd:complexType name="criterionType">
+    <xsd:choice minOccurs="1" maxOccurs="unbounded">
+      <xsd:element name="AND" type="criterionType" />
+      <xsd:element name="OR" type="criterionType" />
+      <xsd:element name="NOT" type="criterionType" />
+      <xsd:element name="ContentIdCriterion" type="intList" />
+      <xsd:element name="ContentRemoteIdCriterion" type="stringList" />
+      <xsd:element name="ContentTypeGroupIdCriterion" type="xsd:int" />
+      <xsd:element name="ContentTypeIdCriterion" type="xsd:int" />
+      <xsd:element name="ContentTypeIdentifierCriterion"
+        type="xsd:string" />
+      <xsd:element name="FieldCritierion" type="fieldCriterionType" />
+      <xsd:element name="DateMetaDataCritierion" type="dateCriterionType" />
+      <xsd:element name="FullTextCriterion" type="xsd:string" />
+      <xsd:element name="LocationIdCriterion" type="intList" />
+      <xsd:element name="LocationRemoteIdCriterion" type="stringList" />
+      <xsd:element name="ParentLocationIdCriterion" type="intList" />
+      <xsd:element name="ParentLocationRemoteIdCriterion"
+        type="stringList" />
+      <xsd:element name="SectionIdCriterion" type="xsd:int" />
+      <xsd:element name="SectionIdentifierCriterion" type="xsd:string" />
+      <xsd:element name="VersionStatusCriterion" type="versionStatus" />
+      <xsd:element name="SubtreeCriterion" type="stringList" />
+      <xsd:element name="URLAliasCriterion" type="urlaliasCriterionType" />
+      <xsd:element name="UserMetaDataCriterion" type="userMetaDataCriterionType" />
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:complexType name="sortClauseType">
+    <xsd:sequence>
+      <xsd:element name="SortClause">
+        <xsd:complexType>
+          <xsd:all>
+            <xsd:element name="SortField" type="sortClauseEnumType" />
+            <xsd:element name="TargetData" type="xsd:anyType"
+              minOccurs="0" />
+          </xsd:all>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="facetBuilderType">
+    <xsd:sequence>
+      <xsd:element name="criterion" type="criterionType"
+        minOccurs="0" maxOccurs="1" />
+    </xsd:sequence>
+    <xsd:attribute name="name" type="xsd:string" />
+    <xsd:attribute name="global" type="xsd:boolean" />
+    <xsd:attribute name="limit" type="xsd:int" />
+    <xsd:attribute name="minCount" type="xsd:int" />
+  </xsd:complexType>
+
+
+  <xsd:simpleType name="dateRangeFacetSelector">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="CREATED" />
+      <xsd:enumeration value="MODIFIED" />
+      <xsd:enumeration value="PUBLISHED" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+
+  <xsd:complexType name="dateRangeType">
+    <xsd:attribute name="from" type="xsd:dateTime" />
+    <xsd:attribute name="to" type="xsd:dateTime" />
+  </xsd:complexType>
+
+  <xsd:complexType name="dateRangeFacetBuilderType">
+    <xsd:complexContent>
+      <xsd:extension base="facetBuilderType">
+        <xsd:sequence>
+          <xsd:element name="unboundedFrom" type="xsd:dateTime"
+            minOccurs="0" maxOccurs="1" />
+          <xsd:element name="range" type="dateRangeType"
+            minOccurs="0" maxOccurs="unbounded" />
+          <xsd:element name="unboundedTo" type="xsd:dateTime"
+            minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+        <xsd:attribute name="select" type="dateRangeFacetSelector"
+          default="PUBLISHED" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:simpleType name="fieldFacetSortType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="TERM_ASC" />
+      <xsd:enumeration value="TERM_DESC" />
+      <xsd:enumeration value="COUNT_ASC" />
+      <xsd:enumeration value="COUNT_DESC" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:complexType name="fieldFacetBuilderType">
+    <xsd:complexContent>
+      <xsd:extension base="facetBuilderType">
+        <xsd:sequence>
+          <xsd:element name="fieldPath" type="xsd:string"
+            minOccurs="1" maxOccurs="unbounded" />
+          <xsd:element name="regExpFilter" type="xsd:string"
+            minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+        <xsd:attribute name="sort" type="fieldFacetSortType" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="fieldRangeType">
+    <xsd:attribute name="from" type="xsd:anySimpleType" />
+    <xsd:attribute name="to" type="xsd:anySimpleType" />
+  </xsd:complexType>
+
+  <xsd:complexType name="fieldRangeFacetBuilderType">
+    <xsd:complexContent>
+      <xsd:extension base="facetBuilderType">
+        <xsd:sequence>
+          <xsd:element name="unboundedFrom" type="xsd:anySimpleType"
+            minOccurs="0" maxOccurs="1" />
+          <xsd:element name="range" type="fieldRangeType"
+            minOccurs="0" maxOccurs="unbounded" />
+          <xsd:element name="unboundedTo" type="xsd:anySimpleType"
+            minOccurs="0" maxOccurs="1" />
+        </xsd:sequence>
+        <xsd:attribute name="fieldPath" type="xsd:string" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="locationFacetBuilderType">
+    <xsd:complexContent>
+      <xsd:extension base="facetBuilderType">
+        <xsd:sequence>
+          <xsd:element name="location" type="ref" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:simpleType name="userFacetSelector">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="OWNER" />
+      <xsd:enumeration value="CREATTOR" />
+      <xsd:enumeration value="MODIFIER" />
+      <xsd:enumeration value="GROUP" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:complexType name="userFacetBuilderType">
+    <xsd:complexContent>
+      <xsd:extension base="facetBuilderType">
+        <xsd:attribute name="select" type="userFacetSelector"
+          default="OWNER" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="facetBuilderListType">
+    <xsd:sequence>
+      <xsd:choice>
+        <xsd:element name="contentTypeFacetBuilder" type="facetBuilderType" />
+        <xsd:element name="criterionFacetBuilder" type="facetBuilderType" />
+        <xsd:element name="dateRangeFacetBulder" type="dateRangeFacetBuilderType" />
+        <xsd:element name="fieldFacetBuilder" type="fieldFacetBuilderType"></xsd:element>
+        <xsd:element name="fieldRangeFacetBuilder" type="fieldRangeFacetBuilderType"></xsd:element>
+        <xsd:element name="locationFacetBuilder" type="locationFacetBuilderType" />
+        <xsd:element name="sectionFacetBuilder" type="facetBuilderType" />
+        <xsd:element name="termFacetBuilder" type="facetBuilderType" />
+        <xsd:element name="userFacetBuilder" type="userFacetBuilderType" />
+      </xsd:choice>
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="queryType">
+    <xsd:all>
+      <xsd:element name="Criterion" type="criterionType" />
+      <xsd:element name="limit" type="xsd:int" />
+      <xsd:element name="offset" type="xsd:int" />
+      <xsd:element name="FacetBuilders" type="facetBuilderListType" />
+      <xsd:element name="SortClauses" type="sortClauseType" />
+      <xsd:element name="spellcheck" type="xsd:boolean" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="facetType">
+    <xsd:attribute name="name" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="contentTypeFacetEntryType">
+    <xsd:all>
+      <xsd:element name="contentType" type="ref" />
+      <xsd:element name="count" type="xsd:int" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="contentTypeFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="contentTypeFacetEntry" type="contentTypeFacetEntryType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="sectionFacetEntryType">
+    <xsd:all>
+      <xsd:element name="section" type="ref" />
+      <xsd:element name="count" type="xsd:int" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="sectionFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="sectionFacetEntry" type="sectionFacetEntryType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="locationFacetEntryType">
+    <xsd:all>
+      <xsd:element name="location" type="ref" />
+      <xsd:element name="count" type="xsd:int" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="locationFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="locationFacetEntry" type="locationFacetEntryType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="userFacetEntryType">
+    <xsd:all>
+      <xsd:element name="user" type="ref" />
+      <xsd:element name="count" type="xsd:int" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="userFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="userFacetEntry" type="userFacetEntryType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+
+  <xsd:complexType name="criterionFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:all>
+          <xsd:element name="criterion" type="criterionType" />
+          <xsd:element name="count" type="xsd:int" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="rangeFacetEntryType">
+    <xsd:all>
+      <xsd:element name="from" type="xsd:anySimpleType" />
+      <xsd:element name="to" type="xsd:anySimpleType" />
+      <xsd:element name="totalCount" type="xsd:int" />
+      <xsd:element name="min" type="xsd:int" />
+      <xsd:element name="max" type="xsd:int" />
+      <xsd:element name="mean" type="xsd:int" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="dateRangeFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="dateRangeFacetEntry" type="rangeFacetEntryType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="fieldRangeFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="fieldRangeFacetEntry" type="rangeFacetEntryType" />
+        </xsd:sequence>
+        <xsd:attribute name="totalCount" type="xsd:int" />
+        <xsd:attribute name="otherCount" type="xsd:int" />
+        <xsd:attribute name="missingCount" type="xsd:int" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="termFacetEntryType">
+    <xsd:all>
+      <xsd:element name="term" type="xsd:string" />
+      <xsd:element name="count" type="xsd:int" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="fieldFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="fieldFacetEntry" type="termFacetEntryType" />
+        </xsd:sequence>
+        <xsd:attribute name="totalCount" type="xsd:int" />
+        <xsd:attribute name="otherCount" type="xsd:int" />
+        <xsd:attribute name="missingCount" type="xsd:int" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="termFacetType">
+    <xsd:complexContent>
+      <xsd:extension base="facetType">
+        <xsd:sequence>
+          <xsd:element name="termFacetEntry" type="termFacetEntryType" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="facetTyoe">
+    <xsd:choice>
+      <xsd:element name="sectionFacet" type="sectionFacetType" />
+      <xsd:element name="locationFacet" type="locationFacetType" />
+      <xsd:element name="userFacet" type="userFacetType" />
+      <xsd:element name="contentTypeFacet" type="contentTypeFacetType" />
+      <xsd:element name="fieldFacet" type="fieldFacetType" />
+      <xsd:element name="fieldRangeFacet" type="fieldRangeFacetType" />
+      <xsd:element name="dateRangeFacet" type="dateRangeFacetType" />
+      <xsd:element name="criterionFacet" type="criterionFacetType" />
+      <xsd:element name="termFacet" type="termFacetType" />
+    </xsd:choice>
+  </xsd:complexType>
+
+  <xsd:complexType name="searchHitType">
+    <xsd:all>
+      <xsd:element name="value" type="xsd:anyType" />
+      <xsd:element name="hightlight" type="xsd:string" />
+    </xsd:all>
+    <xsd:attribute name="score" type="xsd:float" />
+    <xsd:attribute name="index" type="xsd:string" />
+  </xsd:complexType>
+
+  <xsd:complexType name="searchHitListType">
+    <xsd:sequence>
+      <xsd:element name="searchHit" type="searchHitType" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="facetListType">
+    <xsd:sequence>
+      <xsd:element name="facet" type="facetType" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+  <xsd:complexType name="resultType">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="searchHits" type="searchHitListType" />
+          <xsd:element name="facets" type="facetListType" />
+          <xsd:element name="spellcorrection" type="criterionType" />
+        </xsd:all>
+        <xsd:attribute name="count" type="xsd:int" />
+        <xsd:attribute name="time" type="xsd:int" />
+        <xsd:attribute name="timedOut" type="xsd:boolean" />
+        <xsd:attribute name="maxScore" type="xsd:float" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="viewInputType">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="public" type="xsd:boolean" default="false" />
+      <xsd:element name="Query" type="queryType" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="viewType">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="identifier" type="xsd:string" />
+          <xsd:element name="User" type="ref" />
+          <xsd:element name="public" type="xsd:boolean" />
+          <xsd:element name="Query" type="queryType" />
+          <xsd:element name="Result" type="resultType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="ViewInput" type="viewInputType" />
+  <xsd:element name="FacetBuilder" type="facetBuilderListType" />
+  <xsd:element name="View" type="viewType" />
+</xsd:schema>
+
+
+
+

6.11   LocationCreate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.LocationCreate">
+    <xsd:all>
+      <xsd:element name="ParentLocation" type="ref">
+        <xsd:annotation>
+          <xsd:documentation>
+            The parent location where the new location
+            is created
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="priority" type="xsd:int" minOccurs="0" default="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Location priority
+            Position of the
+            Location
+            among its siblings when sorted using priority
+            sort order.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="hidden" type="xsd:boolean"
+        minOccurs="0" default="false">
+        <xsd:annotation>
+          <xsd:documentation>
+            Indicates that the Location entity has
+            been
+            explicitly marked as hidden.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="sortField" type="sortFieldType" />
+      <xsd:element name="sortOrder" type="sortOrderType" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="LocationCreate" type="vnd.ez.api.LocationCreate" />
+</xsd:schema>
+
+
+
+

6.12   LocationUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.LocationUpdate">
+    <xsd:all>
+      <xsd:element name="priority" type="xsd:int" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+             If set the location priority is changed to the given value
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="hidden" type="xsd:boolean"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set to true the location is hidden, if set to false the location is unhidden.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="sortField" type="sortFieldType" />
+      <xsd:element name="sortOrder" type="sortOrderType" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="LocationUpdate" type="vnd.ez.api.LocationUpdate" />
+</xsd:schema>
+
+
+
+

6.13   Location XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.Location">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                Location ID.
+                          </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="priority" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                Location priority
+                Position of the
+                Location among its siblings when sorted using priority
+                sort order.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="hidden" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Indicates that the Location entity has
+                been explicitly marked as hidden.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="invisible" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Indicates that the Location is
+                implicitly marked as hidden by a parent
+                location.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="ParentLocation" type="ref">
+            <xsd:annotation>
+              <xsd:documentation>
+                The parent location
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="pathString" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                The materialized path of the location
+                entry, eg: /1/2/
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="depth" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                Depth location has in the location
+                tree.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="childCount" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                the number of chidren visible to the
+                authenticated user which has
+                loaded this instance.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="remoteId" type="xsd:string"
+            minOccurs="0" />
+          <xsd:element name="Children" type="ref" />
+          <xsd:element name="Content" type="ref" />
+          <xsd:element name="sortField" type="sortFieldType" />
+          <xsd:element name="sortOrder" type="sortOrderType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.LocationList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="Location" type="ref" minOccurs="0"
+            maxOccurs="unbounded"></xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="Location" type="vnd.ez.api.Location" />
+  <xsd:element name="LocationList" type="vnd.ez.api.LocationList" />
+</xsd:schema>
+
+
+
+

6.14   Trash XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="Location.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.TrashItem">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Location ID.
+                          </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="priority" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                Location priority
+                Position of the
+                Location among its siblings when sorted using priority
+                sort order.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="hidden" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Indicates that the Location entity has
+                been explicitly marked as hidden.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="invisible" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Indicates that the Location is
+                implicitly marked as hidden by a parent
+                location.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="ParentLocation" type="ref">
+            <xsd:annotation>
+              <xsd:documentation>
+                The parent location
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="pathString" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                The materialized path of the location
+                entry, eg: /1/2/
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="depth" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                Depth location has in the location
+                tree.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="childCount" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                the number of chidren visible to the
+                authenticated user which has
+                loaded this instance.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="remoteId" type="xsd:string"
+            minOccurs="0" />
+          <xsd:element name="Content" type="ref" />
+          <xsd:element name="sortField" type="sortFieldType" />
+          <xsd:element name="sortOrder" type="sortOrderType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.Trash">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="trashItem" type="vnd.ez.api.TrashItem"></xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="trash" type="vnd.ez.api.Trash" />
+</xsd:schema>
+
+
+
+

6.15   UrlAlias XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:simpleType name="urlAliasType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="LOCATION" />
+      <xsd:enumeration value="RESOURCE" />
+      <xsd:enumeration value="VIRTUAL" />
+    </xsd:restriction>
+  </xsd:simpleType>
+  <xsd:complexType name="vnd.ez.api.UrlAlias">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:choice>
+            <xsd:element name="location" type="ref" />
+            <xsd:element name="resource" type="xsd:string" />
+          </xsd:choice>
+          <xsd:element name="path" type="xsd:string" />
+          <xsd:element name="languageCodes" type="xsd:string" />
+          <xsd:element name="alwaysAvailable" type="xsd:boolean" />
+          <xsd:element name="isHistory" type="xsd:boolean" />
+          <xsd:element name="forward" type="xsd:boolean" />
+          <xsd:element name="custom" type="xsd:boolean" />
+        </xsd:sequence>
+        <xsd:attribute name="id" type="xsd:string" />
+        <xsd:attribute name="type" type="urlAliasType" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UrlAliasList">
+    <xsd:sequence>
+      <xsd:element name="UrlAlias" type="vnd.ez.api.UrlAlias"
+        minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UrlAliasRefList">
+    <xsd:sequence>
+      <xsd:element name="UrlAlias" type="ref"
+        minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+   <xsd:complexType name="vnd.ez.api.UrlAliasCreate">
+    <xsd:sequence>
+      <xsd:choice>
+        <xsd:element name="location" type="ref" />
+        <xsd:element name="resource" type="xsd:string" />
+      </xsd:choice>
+      <xsd:element name="resource" type="xsd:string" />
+      <xsd:element name="path" type="xsd:string" />
+      <xsd:element name="languageCode" type="xsd:string" />
+      <xsd:element name="alwaysAvailable" type="xsd:boolean"
+        default="false" />
+      <xsd:element name="forward" type="xsd:boolean"
+        default="false" />
+    </xsd:sequence>
+    <xsd:attribute name="type" type="urlAliasType" />
+  </xsd:complexType>
+</xsd:schema>
+
+
+
+

6.16   UrlWildcard XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.UrlWildcard">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="sourceUrl" type="xsd:string" />
+          <xsd:element name="destinationUrl" type="xsd:string" />
+          <xsd:element name="forward" type="xsd:boolean" />
+        </xsd:all>
+        <xsd:attribute name="id" type="xsd:string" />
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UrlWildcardList">
+    <xsd:sequence>
+      <xsd:element name="UrlWildcard" type="vnd.ez.api.UrlWildcard"
+        minOccurs="0" maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UrlWildcardCreate">
+    <xsd:all>
+      <xsd:element name="sourceUrl" type="xsd:string" />
+      <xsd:element name="destinationUrl" type="xsd:string" />
+      <xsd:element name="forward" type="xsd:boolean" />
+    </xsd:all>
+  </xsd:complexType>
+</xsd:schema>
+
+
+
+

6.17   Section XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.Section">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+        <xsd:element name="sectionId" type="xsd:int"/>
+        <xsd:element name="identifier" type="xsd:string"/>
+        <xsd:element name="name" type="xsd:string"/>
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.SectionList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="Section" type="vnd.ez.api.Section" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.SectionInput">
+    <xsd:all>
+        <xsd:element name="identifier" type="xsd:string" minOccurs="0"/>
+        <xsd:element name="name" type="xsd:string" minOccurs="0"/>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="Section" type="vnd.ez.api.Section"></xsd:element>
+  <xsd:element name="SectionList" type="vnd.ez.api.SectionList"></xsd:element>
+  <xsd:element name="SectionInput" type="vnd.ez.api.SectionInput"></xsd:element>
+</xsd:schema>
+
+
+
+

6.18   ObjectStateGroup XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.ObjectStateGroup">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:int">
+          </xsd:element>
+          <xsd:element name="identifier" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Readable string identifier of a group
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="defaultLanguageCode" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                the default language code
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="languageCodes" type="xsd:string"
+            minOccurs="0" maxOccurs="1">
+            <xsd:annotation>
+              <xsd:documentation>
+                Comma separated List of language codes
+                present in names and descriptions
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="names" type="multiLanguageValuesType" />
+          <xsd:element name="descriptions" type="multiLanguageValuesType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ObjectStateGroupList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="ObjectStateGroup" type="vnd.ez.api.ObjectStateGroup"
+            maxOccurs="unbounded"></xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ObjectStateGroupCreate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Readable string identifier of a group
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultLanguageCode" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            the default language code
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType" />
+      <xsd:element name="descriptions" type="multiLanguageValuesType" minOccurs="0"/>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ObjectStateGroupUpdate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Readable string identifier of a group
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultLanguageCode" type="xsd:string" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            the default language code
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType" minOccurs="0"/>
+      <xsd:element name="descriptions" type="multiLanguageValuesType" minOccurs="0" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ObjectStateGroupCreate" type="vnd.ez.api.ObjectStateGroupCreate" />
+  <xsd:element name="ObjectStateGroupUpdate" type="vnd.ez.api.ObjectStateGroupUpdate" />
+  <xsd:element name="ObjectStateGroup" type="vnd.ez.api.ObjectStateGroup" />
+  <xsd:element name="ObjectStateGroupList" type="vnd.ez.api.ObjectStateGroupList" />
+</xsd:schema>
+
+
+
+

6.19   ObjectStates XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.ObjectState">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:int">
+          </xsd:element>
+          <xsd:element name="identifier" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Readable string identifier of an object state
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="priority" type="xsd:int">
+          </xsd:element>
+          <xsd:element name="ObjectStateGroup" type="ref">
+          </xsd:element>
+          <xsd:element name="defaultLanguageCode" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                the default language code
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="languageCodes" type="xsd:string"
+            minOccurs="0" maxOccurs="1">
+            <xsd:annotation>
+              <xsd:documentation>
+                Comma separated List of language codes
+                present in names and descriptions
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="names" type="multiLanguageValuesType" />
+          <xsd:element name="descriptions" type="multiLanguageValuesType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ObjectStateList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="ObjectState" type="vnd.ez.api.ObjectState"
+            maxOccurs="unbounded"></xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ObjectStateCreate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Readable string identifier of an object state
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="priority" type="xsd:int">
+      </xsd:element>
+      <xsd:element name="defaultLanguageCode" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            the default language code
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType" />
+      <xsd:element name="descriptions" type="multiLanguageValuesType" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ObjectStateUpdate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Readable string identifier of an object state
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="priority" type="xsd:int"  minOccurs="0">
+      </xsd:element>
+      <xsd:element name="defaultLanguageCode" type="xsd:string" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            the default language code
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType"  minOccurs="0"/>
+      <xsd:element name="descriptions" type="multiLanguageValuesType"  minOccurs="0"/>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ObjectStateCreate" type="vnd.ez.api.ObjectStateCreate" />
+  <xsd:element name="ObjectStateUpdate" type="vnd.ez.api.ObjectStateUpdate" />
+  <xsd:element name="ObjectState" type="vnd.ez.api.ObjectState" />
+  <xsd:element name="ObjectStateList" type="vnd.ez.api.ObjectStateList" />
+</xsd:schema>
+
+
+
+

6.20   ContentObjectStates XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.ContentObjectStates">
+    <xsd:sequence>
+      <xsd:element name="ObjectState" type="ref" minOccurs="0" maxOccurs="unbounded"></xsd:element>
+    </xsd:sequence>
+  </xsd:complexType>
+</xsd:schema>
+
+
+
+

6.21   ContentTypeGroup XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="ContentType.xsd" />
+  <xsd:complexType name="vnd.ez.api.ContentTypeGroup">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:int">
+          </xsd:element>
+          <xsd:element name="identifier" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Readable string identifier of a group
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="created" type="xsd:dateTime">
+            <xsd:annotation>
+              <xsd:documentation>
+                Created date
+                          </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="modified" type="xsd:dateTime">
+            <xsd:annotation>
+              <xsd:documentation>
+                Modified date
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="Creator" type="ref">
+            <xsd:annotation>
+              <xsd:documentation>
+                Creator user
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="Modifier" type="ref">
+            <xsd:annotation>
+              <xsd:documentation>
+                Modifier user
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="ContentTypes" type="vnd.ez.api.ContentTypeInfoList" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentTypeGroupList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="ContentTypeGroup" type="vnd.ez.api.ContentTypeGroup"
+            maxOccurs="unbounded"></xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentTypeGroupRefList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="ContentTypeGroupRef" maxOccurs="unbounded">
+            <xsd:complexType>
+              <xsd:complexContent>
+                <xsd:extension base="ref">
+                  <xsd:all>
+                    <xsd:element name="unlink" type="controllerRef"
+                      minOccurs="0" />
+                  </xsd:all>
+                </xsd:extension>
+              </xsd:complexContent>
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentTypeGroupInput">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string" />
+      <xsd:element name="User" type="ref" minOccurs="0" />
+      <xsd:element name="modificationDate" type="xsd:dateTime"
+        minOccurs="0" />
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ContentTypeGroupInput" type="vnd.ez.api.ContentTypeGroupInput" />
+  <xsd:element name="ContentTypeGroup" type="vnd.ez.api.ContentTypeGroup" />
+  <xsd:element name="ContentTypeGroupList" type="vnd.ez.api.ContentTypeGroupList" />
+  <xsd:element name="ContentTypeGroupRefList" type="vnd.ez.api.ContentTypeGroupRefList" />
+</xsd:schema>
+
+
+
+

6.22   ContentType XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="FieldDefinition.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.ContentTypeInfo">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="id" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                Content type ID
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="status" type="contentTypeStatus">
+            <xsd:annotation>
+              <xsd:documentation>
+                The status of the content type.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="identifier" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                String identifier of a content type
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="names" type="multiLanguageValuesType" />
+          <xsd:element name="descriptions" type="multiLanguageValuesType" />
+          <xsd:element name="creationDate" type="xsd:dateTime">
+            <xsd:annotation>
+              <xsd:documentation>
+                Creation date of the content type
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="modificationDate" type="xsd:dateTime">
+            <xsd:annotation>
+              <xsd:documentation>
+                Last modification date of the content
+                type
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="Creator" type="ref">
+            <xsd:annotation>
+              <xsd:documentation>
+                The user which created the content type
+              </xsd:documentation>
+            </xsd:annotation>
+
+          </xsd:element>
+          <xsd:element name="Modifier" type="ref">
+            <xsd:annotation>
+              <xsd:documentation>
+                The userwhich last modified the content
+                type
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="remoteId" type="xsd:string"
+            minOccurs="0">
+            <xsd:annotation>
+              <xsd:documentation>
+                Unique remote ID of the content type
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="urlAliasSchema" type="xsd:string"
+            minOccurs="0">
+            <xsd:annotation>
+              <xsd:documentation>
+                URL alias schema
+                If nothing is provided,
+                nameSchema will be used
+                instead.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="nameSchema" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Name schema.
+                Can be composed of
+                FieldDefinition
+                identifier place
+                holders.These place
+                holders must comply this
+                pattern :
+                &lt;field_definition_identifier&gt;.
+                An OR condition can
+                be used :
+                &lt;field_def|other_field_def&gt;
+                In this
+                example, field_def will be used if available. If not,
+                other_field_def will be used for content name generation
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="isContainer" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Determines if the type is a container
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="mainLanguageCode" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Main language
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="defaultAlwaysAvailable" type="xsd:boolean"
+            default="true">
+            <xsd:annotation>
+              <xsd:documentation>
+                if an instance of acontent type is
+                created the always available
+                flag is set by default this
+                this value.
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="defaultSortField" type="sortFieldType">
+            <xsd:annotation>
+              <xsd:documentation>
+                Specifies which property the child
+                locations should be sorted on by
+                default when created
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="defaultSortOrder" type="sortOrderType">
+            <xsd:annotation>
+              <xsd:documentation>
+                Specifies whether the sort order should
+                be ascending or descending by
+                default when created
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentTypeInfoList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="ContentTypeInfo" type="vnd.ez.api.ContentTypeInfo"
+            maxOccurs="unbounded" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentType">
+    <xsd:complexContent>
+      <xsd:extension base="vnd.ez.api.ContentTypeInfo">
+        <xsd:sequence>
+          <xsd:element name="FieldDefinitions" type="vnd.ez.api.FieldDefinitionList" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.ContentTypeList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="ContentType" type="vnd.ez.api.ContentType" maxOccurs="unbounded"/>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:element name="ContentTypeInfo" type="vnd.ez.api.ContentTypeInfo"></xsd:element>
+  <xsd:element name="ContentTypeInfoList" type="vnd.ez.api.ContentTypeInfoList"></xsd:element>
+  <xsd:element name="ContentType" type="vnd.ez.api.ContentType"></xsd:element>
+  <xsd:element name="ContentTypeList" type="vnd.ez.api.ContentTypeList"></xsd:element>
+
+</xsd:schema>
+
+
+
+

6.23   ContentTypeCreate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="FieldDefinitionCreate.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.ContentTypeCreate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string"
+        minOccurs="0" maxOccurs="1">
+        <xsd:annotation>
+          <xsd:documentation>
+            String identifier of a content type
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType" />
+      <xsd:element name="descriptions" type="multiLanguageValuesType" />
+      <xsd:element name="modificationDate" type="xsd:dateTime">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set this date is used as modification
+            date
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="User" type="ref">
+        <xsd:annotation>
+          <xsd:documentation>
+            The user under which this creation should
+            be done
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Unique remote ID of the content type
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="urlAliasSchema" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            URL alias schema
+            If nothing is provided,
+            nameSchema will be used
+            instead.
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="nameSchema" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Name schema.
+            Can be composed of
+            FieldDefinition identifier place
+            holders.These place
+            holders
+            must comply this pattern :
+            &lt;field_definition_identifier&gt;.
+            An OR condition can
+            be
+            used :
+            &lt;field_def|other_field_def&gt;
+            In this
+            example,
+            field_def will be used if available. If not,
+            other_field_def
+            will be used for content name generation
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isContainer" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            Determines if the type is a container
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="mainLanguageCode" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Main language
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultAlwaysAvailable" type="xsd:boolean"
+        default="true">
+        <xsd:annotation>
+          <xsd:documentation>
+            if an instance of acontent type is
+            created
+            the always available
+            flag is set by default this
+            this value.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultSortField" type="sortFieldType">
+        <xsd:annotation>
+          <xsd:documentation>
+            Specifies which property the child
+            locations should be sorted on by
+            default when created
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultSortOrder" type="sortOrderType">
+        <xsd:annotation>
+          <xsd:documentation>
+            Specifies whether the sort order should
+            be
+            ascending or descending by
+            default when created
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="FieldDefinitions">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="FieldDefinition" type="vnd.ez.api.FieldDefinitionCreate"></xsd:element>
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ContentTypeCreate" type="vnd.ez.api.ContentTypeCreate"></xsd:element>
+</xsd:schema>
+
+
+
+

6.24   ContentTypeUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.ContentTypeUpdate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            String identifier of a content type
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType"
+        minOccurs="0" />
+      <xsd:element name="descriptions" type="multiLanguageValuesType"
+        minOccurs="0" />
+      <xsd:element name="modificationDate" type="xsd:dateTime"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set this date is used as modification
+            date
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="User" type="ref" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            The user under which this update should be
+            done
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Unique remote ID of the content type
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="urlAliasSchema" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            URL alias schema
+            If nothing is provided,
+            nameSchema will be used
+            instead.
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="nameSchema" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Name schema.
+            Can be composed of
+            FieldDefinition identifier place
+            holders.These place
+            holders
+            must comply this pattern :
+            &lt;field_definition_identifier&gt;.
+            An OR condition can
+            be
+            used :
+            &lt;field_def|other_field_def&gt;
+            In this
+            example,
+            field_def will be used if available. If not,
+            other_field_def
+            will be used for content name generation
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isContainer" type="xsd:boolean"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Determines if the type is a container
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="mainLanguageCode" type="xsd:string"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Main language
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultAlwaysAvailable" type="xsd:boolean"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            if an instance of acontent type is
+            created
+            the always available
+            flag is set by default this
+            this value.
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultSortField" type="sortFieldType"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Specifies which property the child
+            locations should be sorted on by
+            default when created
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultSortOrder" type="sortOrderType"
+        minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            Specifies whether the sort order should
+            be
+            ascending or descending by
+            default when created
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ContentTypeUpdate" type="vnd.ez.api.ContentTypeUpdate"></xsd:element>
+</xsd:schema>
+
+
+
+

6.25   FieldDefinition JSON Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.FieldDefinition">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                the unique id of this field definition
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="identifier" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Readable string identifier of a field
+                definition
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="fieldGroup" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Field group name
+                </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="position" type="xsd:int">
+            <xsd:annotation>
+              <xsd:documentation>
+                the position of the field definition in
+                the content typr
+                </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="fieldType" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                String identifier of the field type
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="isTranslatable" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                If the field type is translatable
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="isRequired" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Is the field required
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="isInfoCollector" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                the flag if this attribute is used for
+                information collection
+                </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="defaultValue" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                Default value of the field
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="isSearchable" type="xsd:boolean">
+            <xsd:annotation>
+              <xsd:documentation>
+                Indicates if th the content is
+                searchable by this attribute
+                </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="names" type="multiLanguageValuesType" />
+          <xsd:element name="descriptions" type="multiLanguageValuesType" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.FieldDefinitionList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="FieldDefinition" type="vnd.ez.api.FieldDefinition"
+            minOccurs="1" maxOccurs="unbounded" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="FieldDefinitionList" type="vnd.ez.api.FieldDefinitionList" />
+  <xsd:element name="FieldDefinition" type="vnd.ez.api.FieldDefinition" />
+</xsd:schema>
+
+
+
+

6.26   FieldDefinitionCreate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.FieldDefinitionCreate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Readable string identifier of a field
+            definition
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="fieldType" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            the field type for this definition
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="fieldGroup" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Field group name
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="position" type="xsd:int">
+        <xsd:annotation>
+          <xsd:documentation>
+            the position of the field definition in
+            the content typr
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isTranslatable" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            If the field type is translatable
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isRequired" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            Is the field required
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isInfoCollector" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            the flag if this attribute is used for
+            information collection
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultValue" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            Default value of the field
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isSearchable" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            Indicates if th the content is
+            searchable by this attribute
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType" />
+      <xsd:element name="descriptions" type="multiLanguageValuesType" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:element name="FieldDefinitionInput" type="vnd.ez.api.FieldDefinitionCreate" />
+</xsd:schema>
+
+
+
+

6.27   FieldDefinitionUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:complexType name="vnd.ez.api.FieldDefinitionUpdate">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string" minOccurs="0">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the identifier of a field
+            definition is changed
+           </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="fieldGroup" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the field group is changed
+           </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="position" type="xsd:int">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the the position of the field definition in
+            the content typr is changed
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isTranslatable" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the translatable flag is set to this value
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isRequired" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the required flag is set to this value
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isInfoCollector" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the info collection flag is set to this value
+                </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="defaultValue" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            If set the default value of the field is changed
+              </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="isSearchable" type="xsd:boolean">
+        <xsd:annotation>
+          <xsd:documentation>
+           If set the searchable flag is set to this value
+                 </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+      <xsd:element name="names" type="multiLanguageValuesType" />
+      <xsd:element name="descriptions" type="multiLanguageValuesType" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:element name="FieldDefinitionInput" type="vnd.ez.api.FieldDefinitionUpdate" />
+</xsd:schema>
+
+
+
+

6.28   UserGroupCreate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.UserGroupCreate">
+    <xsd:all>
+      <xsd:element name="ContentType" type="ref" minOccurs="0" />
+      <xsd:element name="mainLanguageCode" type="xsd:string" />
+      <xsd:element name="Section" type="ref" minOccurs="0"/>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="fields">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="field" type="fieldInputValueType" maxOccurs="unbounded"/>
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="UserGroupCreate" type="vnd.ez.api.UserGroupCreate"></xsd:element>
+</xsd:schema>
+
+
+
+

6.29   UserGroupUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.UserGroupUpdate">
+    <xsd:all>
+      <xsd:element name="mainLanguageCode" type="xsd:string" minOccurs="0"/>
+      <xsd:element name="Section" type="ref" minOccurs="0"/>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="fields">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="field" type="fieldInputValueType" maxOccurs="unbounded"/>
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="UserGroupUpdate" type="vnd.ez.api.UserGroupUpdate"></xsd:element>
+</xsd:schema>
+
+
+
+

6.30   UserGroup XML Schema

+
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="Content.xsd" />
+  <xsd:include schemaLocation="Version.xsd" />
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.UserGroup">
+    <xsd:complexContent>
+      <xsd:extension base="contentInfoType">
+        <xsd:sequence>
+          <xsd:element name="Content" type="vnd.ez.api.Version+xml" />
+          <xsd:element name="ParentUserGroup" type="ref" />
+          <xsd:element name="Subgroups" type="ref" />
+          <xsd:element name="Users" type="ref" />
+          <xsd:element name="Roles" type="ref" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UserGroupList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:eleemnt name="User" type="vnd.ez.api.UserGroup"
+            maxOccurs="unbounded" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UserGroupRefList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:eleemnt name="UserGroup" minOccurs="1" maxOccurs="unbounded">
+            <xsd:complexType>
+              <xsd:all>
+                <xsd:element name="unassign" type="controllerRef" minOccurs="0"/>
+              </xsd:all>
+            </xsd:complexType>
+          </xsd:eleemnt>
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="UserGroupRefList" type="vnd.ez.api.UserGroupRefList" />
+  <xsd:element name="UserGroupList" type="vnd.ez.api.UserGroupList" />
+  <xsd:element name="UserGroup" type="vnd.ez.api.UserGroup" />
+</xsd:schema>
+
+
+
+

6.31   UserCreate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.UserCreate">
+    <xsd:all>
+      <xsd:element name="ContentType" type="ref" minOccurs="0" />
+      <xsd:element name="mainLanguageCode" type="xsd:string" />
+      <xsd:element name="Section" type="ref" minOccurs="0"/>
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="login" type="xsd:string"/>
+      <xsd:element name="email" type="xsd:string" />
+      <xsd:element name="enabled" type="xsd:boolean" default="true" minOccurs="0"  />
+      <xsd:element name="password" type="xsd:string"/>
+      <xsd:element name="fields">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="field" type="fieldInputValueType" maxOccurs="unbounded"/>
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="UserCreate" type="vnd.ez.api.UserCreate"></xsd:element>
+</xsd:schema>
+
+
+
+

6.32   UserUpdate XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.UserUpdate">
+    <xsd:all>
+      <xsd:element name="mainLanguageCode" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="Section" type="ref" minOccurs="0" />
+      <xsd:element name="remoteId" type="xsd:string"
+        minOccurs="0" />
+      <xsd:element name="login" type="xsd:string" minOccurs="0" />
+      <xsd:element name="email" type="xsd:string" minOccurs="0" />
+      <xsd:element name="enabled" type="xsd:boolean" minOccurs="0"  />
+      <xsd:element name="password" type="xsd:string" minOccurs="0"  />
+      <xsd:element name="fields">
+        <xsd:complexType>
+          <xsd:sequence>
+            <xsd:element name="field" type="fieldInputValueType"
+              maxOccurs="unbounded" />
+          </xsd:sequence>
+        </xsd:complexType>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="UserUpdate" type="vnd.ez.api.UserUpdate"></xsd:element>
+</xsd:schema>
+
+
+
+

6.33   User XML Schema

+
+<?xml version="1.0" encoding="utf-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="Content.xsd" />
+  <xsd:include schemaLocation="Version.xsd" />
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.User">
+    <xsd:complexContent>
+      <xsd:extension base="contentInfoType">
+        <xsd:all>
+          <xsd:element name="login" type="xsd:string" />
+          <xsd:element name="email" type="xsd:string" />
+          <xsd:element name="enabled" type="xsd:boolean" />
+          <xsd:element name="Content" type="vnd.ez.api.Version+xml" />
+          <xsd:element name="Roles" type="ref" />
+          <xsd:element name="UserGroups" type="ref" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UserList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:eleemnt name="User" type="vnd.ez.api.User"
+            maxOccurs="unbounded" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:complexType name="vnd.ez.api.UserRefList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:eleemnt name="User" type="ref"
+            maxOccurs="unbounded" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="UserRefList" type="vnd.ez.api.UserRefList" />
+  <xsd:element name="UserList" type="vnd.ez.api.UserList" />
+  <xsd:element name="User" type="vnd.ez.api.User" />
+</xsd:schema>
+
+
+
+

6.34   Limitation XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:simpleType name="limitationIdentifierType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="Class" />
+      <xsd:enumeration value="Language" />
+      <xsd:enumeration value="Node" />
+      <xsd:enumeration value="Owner" />
+      <xsd:enumeration value="ParentOwner" />
+      <xsd:enumeration value="ParentClass" />
+      <xsd:enumeration value="ParentDepth" />
+      <xsd:enumeration value="Section" />
+      <xsd:enumeration value="Siteaccess" />
+      <xsd:enumeration value="State" />
+      <xsd:enumeration value="Subtree" />
+      <xsd:enumeration value="Group" />
+      <xsd:enumeration value="ParentGroup" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:simpleType name="roleLimitationIdentifierType">
+    <xsd:restriction base="xsd:string">
+      <xsd:enumeration value="Section" />
+      <xsd:enumeration value="Subtree" />
+    </xsd:restriction>
+  </xsd:simpleType>
+
+  <xsd:complexType name="roleLimitationType">
+    <xsd:all>
+      <xsd:element name="values" type="stringList" />
+    </xsd:all>
+    <xsd:attribute name="identifier" type="roleLimitationIdentifierType" />
+  </xsd:complexType>
+
+  <xsd:complexType name="limitationType">
+    <xsd:choice>
+      <xsd:element name="values" type="valueType"</xsd:element>
+      <xsd:element name="refs" type="refValueList" />
+    </xsd:choice>
+    <xsd:attribute name="identifier" type="limitationIdentifierType" />
+  </xsd:complexType>
+
+  <xsd:complexType name="limitationListType">
+    <xsd:sequence>
+      <xsd:element name="limitation" type="limitationType"
+        maxOccurs="unbounded" />
+    </xsd:sequence>
+  </xsd:complexType>
+
+</xsd:schema>
+
+
+
+

6.35   Policy XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="Limitation.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.Policy">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="id" type="xsd:string" />
+          <xsd:element name="module" type="xsd:string" />
+          <xsd:element name="function" type="xsd:string" />
+          <xsd:element name="limitations" type="limitationListType"></xsd:element>
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.PolityCreate">
+    <xsd:all>
+      <xsd:element name="module" type="xsd:string" />
+      <xsd:element name="function" type="xsd:string" />
+      <xsd:element name="limitations" type="limitationListType"></xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.PolityUpdate">
+    <xsd:all>
+      <xsd:element name="limitations" type="limitationListType"></xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.PolicyList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="Policy" type="vnd.ez.api.Policy"
+            maxOccurs="unbounded" />
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+  <xsd:element name="Policy" type="vnd.ez.api.Policy"/>
+  <xsd:element name="PolicyList" type="vnd.ez.api.PolicyList"/>
+  <xsd:element name="PolicyCreate" type="vnd.ez.api.PolityCreate"/>
+  <xsd:element name="PolicyUpdate" type="vnd.ez.api.PolityUpdate"/>
+</xsd:schema>
+
+
+
+

6.36   Role XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+  <xsd:include schemaLocation="Limitation.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.RoleInput">
+    <xsd:all>
+      <xsd:element name="identifier" type="xsd:string">
+        <xsd:annotation>
+          <xsd:documentation>
+            String identifier of the role
+          </xsd:documentation>
+        </xsd:annotation>
+      </xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.Role">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="identifier" type="xsd:string">
+            <xsd:annotation>
+              <xsd:documentation>
+                String identifier of the role
+              </xsd:documentation>
+            </xsd:annotation>
+          </xsd:element>
+          <xsd:element name="Policies" type="ref" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.RoleList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:sequence>
+          <xsd:element name="Role" type="vnd.ez.api.Role"></xsd:element>
+        </xsd:sequence>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.RoleAssignInput">
+    <xsd:all>
+      <xsd:element name="Role" type="ref" />
+      <xsd:element name="limitation" type="roleLimitationType" />
+    </xsd:all>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.RoleAssignment">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="limitation" type="roleLimitationType" />
+          <xsd:element name="Role" type="ref"/>
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:complexType name="vnd.ez.api.RoleAssignmentList">
+    <xsd:complexContent>
+      <xsd:extension base="ref">
+        <xsd:all>
+          <xsd:element name="RoleAssignment" type="vnd.ez.api.RoleAssignment" />
+        </xsd:all>
+      </xsd:extension>
+    </xsd:complexContent>
+  </xsd:complexType>
+
+  <xsd:element name="RoleInput" type="vnd.ez.api.RoleInput"/>
+  <xsd:element name="Role" type="vnd.ez.api.Role"/>
+  <xsd:element name="RoleAssignInput" type="vnd.ez.api.RoleAssignInput"/>
+  <xsd:element name="RoleAssignmentList" type="vnd.ez.api.RoleAssignmentList"/>
+</xsd:schema>
+
+
+
+

6.37   ErrorMessage XML Schema

+
+<?xml version="1.0" encoding="UTF-8"?>
+<xsd:schema version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns="http://ez.no/API/Values" targetNamespace="http://ez.no/API/Values">
+  <xsd:include schemaLocation="CommonDefinitions.xsd" />
+
+  <xsd:complexType name="vnd.ez.api.ErrorMessage">
+    <xsd:all>
+      <xsd:element name="errorCode" type="xsd:string"></xsd:element>
+      <xsd:element name="errorMessage" type="xsd:string"></xsd:element>
+      <xsd:element name="errorDescription" type="xsd:string"></xsd:element>
+    </xsd:all>
+  </xsd:complexType>
+  <xsd:element name="ErrorMessage" type="vnd.ez.api.ErrorMessage"></xsd:element>
+</xsd:schema>
+
+
+
+
+ + diff --git a/doc/specifications/rest/REST-API-V2.rst b/doc/specifications/rest/REST-API-V2.rst new file mode 100644 index 0000000..0e1906a --- /dev/null +++ b/doc/specifications/rest/REST-API-V2.rst @@ -0,0 +1,8896 @@ + +========================== +eZ Publish REST API V2 RFC +========================== + +.. sectnum:: + +.. contents:: Table of Contents + +General considerations +====================== + +Media Types +----------- + +The methods on resources provide multiple media types in their responses. A media type can be selected in the Accept Header. +For each xml media type there is a unique name e.g. application/vnd.ez.api.User+xml. In this case the returned xml response +conforms with the complex type definition with name vnd.ez.api.User in the user.xsd (see User_) xml schema definition file. +Each JSON schema is implicit derived from the xml schema by making a uniform transformation from XML to JSON as shown below. + + +Example: + +.. code:: xml + + + value + 45 + + 1 + 2 + + + +transforms to: + +.. code:: javascript + + { + "test":{ + "_attr1":"attr1", + "value":{ + "_attr2":"attr2", + "#text":"value" + }, + "simpleValue":"45", + "fields": { + "field": [ 1, 2 ] + } + } + } + + +Different schemas which induce different media types one on resource can be used to allow to make specific +representations optimized for purposes of clients. +It is possible to make a new schema for mobile devices for retieving e.g. an article. + +.. code:: xml + + + + + + + + + + + + + + + + + + +so that + +.. code:: http + + GET /content/objects/23 HTTP/1.1 + Accept: application/vnd.ez.api.MobileContent+xml + +returns: + +.. code:: xml + + + + Title + This is a summary + + + + +However in this specification only the standard schemas and media types are defined (see InputOutput_). +If there is only one media type defined for xml or json, it is also possible to specify +application/xml or application/json. + +URIs +---- + +The REST api is designed that the client has not to construct any uri's to resources by itself. +Starting from the root resources (ListRoot_) every response includes further links to related resources. +The uris should be used directly as identifiers on the client side and the client should not +contruct an uri by using an id. + + +Authentication +============== + +Basic Authentication +-------------------- + +See http://tools.ietf.org/html/rfc2617 + +OAuth +----- + +See http://oauth.net/2/ +TBD - setting up oauth. + + +Session based Authentication +---------------------------- + +This approach violates generally the principles of RESTful services. However, +the sessions are only created to reauthenticate the user (and perform authorization, +which has do be done anyway) and not to hold session state in the service. +So we consider this method to support AJAX based applications. + +If activated the user has to login and the client has to send the session cookie in every request: + +:Resource: /user/sessions +:Method: POST +:Description: Performs a login for the user and returns the session cookie +:Request format: application/x-www-form-urlencoded +:Parameters: + :login: the login of the user + :password: the password +:Response: 200 Set-Cookie: SessionId : A unique session id containing encryped information of client host and expiretime + +:Error codes: + :401: If the authorization failed + + +In order to logout the user calls: + +:Resource: /user/sessions/ +:Method: DELETE +:Description: The user session is removed i.e. the user is logged out. +:Parameters: +:Response: 204 +:Error Codes: + :404: If the session does not exist + +SSL Client Authentication +------------------------- + +The REST API provides authenticating a user by a subject in a client certificate delivered by the web server configured as SSL endpoint. + + +Content +======= + + +Overview +-------- + +In the content module there are the root collections objects, locations, trash and sections + +===================================================== =================== ======================= ============================ ================ ============== + :Resource: POST GET PATCH/PUT DELETE COPY +----------------------------------------------------- ------------------- ----------------------- ---------------------------- ---------------- -------------- +/ . list root resources . . +/content/objects create new content . . . +/content/objects/ . load content update content meta data delete content copy content +/content/objects// . . . delete language + from content +/content/objects//versions . load all versions . . + (version infos) +/content/objects//currentversion . redirect to current v. . . create draft + from current + version +/content/objects//versions/ . get a specific version update a version/draft delete version create draft + from version +/content/objects//versions//relations create new relation load relations of vers. . . +/content/objects//versions//relations/ . load relation details . delete relation +/content/objects//locations create location load locations of cont- . . + ent +/content/locations . list/find locations . . +/content/locations/ . load a location update location delete location copy subtree +/content/locations//children . load children . . +/content/views create view list views . . +/content/views/ . get view . delete view +/content/views//results . get view results . . +/content/sections create section list all sections . . +/content/sections/ . load section update section delete section +/content/trash . list trash items . empty trash +/content/trash/ . load trash item untrash item delete from trsh +/content/objectstategroups create objectstate list objectstategroups . . + group +/content/objectstategroups/ . get objectstate group update objectstategroup delete osg. +/content/objectstategroups//objectstates create object state list object states . . +/content/objectstategroups//objectstates/ . get object state update objectstate delete objectst. +/content/objects//objectstates . get object states of update objectstates of . + content content +/content/urlaliases create url alias list url aliases . . +/content/urlaliases/ . get url alias . delete url wc. +/content/urlwildcards create url wildcard list url wildcards . . +/content/urlwildcards/ . get url wildcard . delete url wc. +===================================================== =================== ======================= ============================ ================ ============== + + +Specification +------------- + +General Error Codes +~~~~~~~~~~~~~~~~~~~ +(see also HTTP 1.1 Specification) + +:500: The server encountered an unexpected condition which prevented it from fulfilling the request - e.g. database down etc. +:501: The requested method was not implemented yet +:404: Requested resource was not found +:405: The request method is not available. The available methods are returned for this resource +:406: The request contains an Accept header which is not supported. + +.. _ListRoot: + +List Root Resources +~~~~~~~~~~~~~~~~~~~ + +:Resource: / +:Method: GET +:Description: list the root resources of the ez publish installation +:Headers: + :Accept: + :application/vnd.ez.api.Root+xml: if set the list is return in xml format (see Root_) + :application/vnd.ez.api.Root+json: if set the list is returned in json format (see Root_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Root_ + +XML Example +``````````` + +.. code:: http + + GET / HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.Root+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.Root+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + + + +JSON Example +```````````` + +.. code:: http + + GET / HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.Root+json + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.Root+json + Content-Length: xxx + +.. code:: javascript + + { + "Root": { + "content": { "_href": "/content/objects" }, + "contentTypes": { + "_href": "/content/types", + "_media-type": "application/vnd.ez.api.ContentTypeInfoList+json" + }, + "users": { + "_href": "/user/users", + "_media-type": "application/vnd.ez.api.UserRefList+json" + }, + "roles": { + "_href": "/user/roles", + "_media-type": "application/vnd.ez.api.RoleList+json" + }, + "rootLocation": { + "_href": "/content/locations/1", + "_media-type": "application/vnd.ez.api.Location+json" + }, + "rootUserGroup": { + "_href": "/user/groups/1/5", + "_media-type": "application/vnd.ez.api.UserGroup+json" + }, + "rootMediaFolder": { + "_href": "/content/locations/1/43", + "_media-type": "application/vnd.ez.api.Location+json" + } + "trash": { + "_href": "/content/trash", + "_media-type": "application/vnd.ez.api.LocationList+json" + }, + "sections": { + "_href": "/content/sections", + "_media-type": "application/vnd.ez.api.SectionList+json" + } + "sections": { + "_href": "/content/views", + "_media-type": "application/vnd.ez.api.ViewList+json" + } + } + } + + +Managing content +~~~~~~~~~~~~~~~~ + +Creating Content +```````````````` + +:Resource: /content/objects +:Method: POST +:Description: Creates a new content draft assigned to the authenticated user. If a different userId is given in the input + it is assigned to the given user but this required special rights for the authenticated user (this is useful + for content staging where the transfer process does not have to authenticate with the user which created the + content object in the source server). + The user has to publish the content if it should be visible. +:Headers: + :Accept: + :application/vnd.ez.api.Content+xml: if set all informations for the content object including the embedded current version are returned in xml format (see Content_) + :application/vnd.ez.api.Content+json: if set all informations for the content object including the embedded current version are returned in json format (see Content_) + :application/vnd.ez.api.ContentInfo+xml: if set all informations for the content object (excluding the current version) are returned in xml format (see Content_) + :application/vnd.ez.api.ContentInfo+json: if set all informations for the content object (excluding the current version) are returned in json format (see Content_) + :Content-Type: + :application/vnd.ez.api.ContentCreate+json: the ContentCreate_ schema encoded in json + :application/vnd.ez.api.ContentCreate+xml: the ContentCreate_ schema encoded in xml +:Response: + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects/ + ETag: "" + Accept-Patch: application/vnd.ez.api.ContentUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Content_ + +:Error codes: + :400: If the Input does not match the input schema definition or the validation on a field fails, + :401: If the user is not authorized to create this object in this location + :404: If a parent location in specified in the request body (see ContentCreate_) and it does not exist + +XML Example +''''''''''' + +.. code:: http + + POST /content/objects HTTP/1.1 + Host: www.example.net + Accept: application/vnd.ez.api.Content+xml + Content-Type: application/vnd.ez.api.ContentCreate+xml + Content-Length: xxx + +.. code:: xml + + + + eng-US + + + 0 + false + PATH + ASC + +
+ true + remoteId12345678 + + + title + eng-US + This is a title + + + summary + eng-US + This is a summary + + + authors + eng-US + + + John Doe + john.doe@example.net + + + Bruce Willis + bruce.willis@example.net + + + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects/23 + ETag: "12345678" + Accept-Patch: application/vnd.ez.api.ContentUpdate+xml;charset=utf8 + Content-Type: application/vnd.ez.api.Content+xml + Content-Length: xxx + +.. code:: xml + + + + + This is a title + + + + + 123 + 1 + DRAFT + 2012-02-12T12:30:00 + + 2012-02-12T12:30:00 + eng-US + + + + + 1234 + title + eng-UK + This is a title + + + 1235 + summary + eng-UK + This is a summary + + + authors + eng-US + + + John Doe + john.doe@example.net + + + Bruce Willis + bruce.willis@example.net + + + + + + + +
+ + + + 2012-02-12T12:30:00 + eng-US + true + + +JSON Example +'''''''''''' + +.. code:: http + + POST /content/objects HTTP/1.1 + Host: www.example.net + Accept: application/vnd.ez.api.Content+json + Content-Type: application/vnd.ez.api.ContentCreate+json + Content-Length: xxx + +.. code:: javascript + + { + "ContentCreate": { + "ContentType": { + "_href": "/content/types/10", + }, + "mainLanguageCode": "eng-US", + "LocationCreate": { + "ParentLocation": { + "_href": "/content/locations/1/4/89" + }, + "priority": "0", + "hidden": "false", + "sortField": "PATH", + "sortOrder": "ASC" + } + "Section": { + "_href": "/content/sections/4", + }, + "alwaysAvailable": "true", + "remoteId": "remoteId12345678", + "fields": { + "field": [ + { + "fieldDefinitionIdentifer": "title", + "languageCode": "eng-US", + "fieldValue": "This is a title" + }, + { + "fieldDefinitionIdentifer": "summary", + "languageCode": "eng-US", + "fieldValue": "This is a summary" + }, + { + "fieldDefinitionIdentifer": "authors", + "languageCode": "eng-US", + "fieldValue": [ + { + "name": "John Doe", + "email": "john.doe@example.net" + }, + { + "name": "Bruce Willis", + "email": "bruce.willis@example.net" + } + ] + } + ] + } + } + } + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects/23 + ETag: "12345678" + Accept-Patch: application/vnd.ez.api.ContentUpdate+json;charset=utf8 + Content-Type: application/vnd.ez.api.Content+json + Content-Length: xxx + +.. code:: javascript + + { + "Content": { + "_href": "/content/objects/23", + "_id": "23", + "_media-type": "application/vnd.ez.api.Content+json", + "_remoteId": "qwert123", + "ContentType": { + "_href": "/content/types/10", + "_media-type": "application/vnd.ez.api.ContentType+json" + }, + "name": "This is a title", + "Versions": { + "_href": "/content/objects/23/versions", + "_media-type": "application/vnd.ez.api.VersionList+json" + }, + "CurrentVersion": { + "_href": "/content/objects/23/currentversion", + "_media-type": "application/vnd.ez.api.Version+json", + "Version": { + "_href": "/content/objects/23/versions/1", + "_media-type": "application/vnd.ez.api.Version+json", + "VersionInfo": { + "id": "123", + "versionNo": "1", + "status": "DRAFT", + "modificationDate": "2012-02-12T12:30:00", + "creator": { + "_href": "/user/users/14", + "_media-type": "application/vnd.ez.api.User+json" + }, + "creationDate": "2012-02-12T12:30:00", + "initialLanguageCode": "eng-US", + "Content": { + "_href": "/content/objects/23", + "_media-type": "application/vnd.ez.api.ContentInfo+json" + } + }, + "fields": { + "field": [ + { + "id": "1234", + "fieldDefinitionIdentifer": "title", + "languageCode": "eng-UK", + "fieldValue": "This is a title" + }, + { + "id": "1235", + "fieldDefinitionIdentifer": "summary", + "languageCode": "eng-UK", + "fieldValue": "This is a summary" + }, + { + "fieldDefinitionIdentifer": "authors", + "languageCode": "eng-US", + "fieldValue": + [ + { + "name": "John Doe", + "email": "john.doe@example.net" + }, + { + "name": "Bruce Willis", + "email": "bruce.willis@example.net" + } + ] + } + ] + } + } + }, + "Section": { + "_href": "/content/sections/4", + "_media-type": "application/vnd.ez.api.Section+json" + }, + "MainLocation": { + "_href": "/content/locations/1/4/65", + "_media-type": "application/vnd.ez.api.Location+json" + }, + "Locations": { + "_href": "/content/objects/23/locations", + "_media-type": "application/vnd.ez.api.LocationList+json" + }, + "Owner": { + "_href": "/user/users/14", + "_media-type": "application/vnd.ez.api.User+json" + }, + "lastModificationDate": "2012-02-12T12:30:00", + "mainLanguageCode": "eng-US", + "alwaysAvailable": "true" + } + } + + + +List/Search Content +``````````````````` +:Resource: /content/objects +:Method: GET (not implemented) +:Description: This resource will used in future for searching content by providing a query string as alternative to posting a view to /content/views. + +Load Content +```````````` +:Resource: /content/objects/ +:Method: GET +:Description: Loads the content object for the given id. Depending on the Accept header the current version is embedded (i.e the current published version or if not exists the draft of the authenticated user) +:Headers: + :Accept: + :application/vnd.ez.api.Content+xml: if set all informations for the content object including the embedded current version are returned in xml format (see Content_) + :application/vnd.ez.api.Content+json: if set all informations for the content object including the embedded current version are returned in json format (see Content_) + :application/vnd.ez.api.ContentInfo+xml: if set all informations for the content object (excluding the current version) are returned in xml format (see Content_) + :application/vnd.ez.api.ContentInfo+json: if set all informations for the content object (excluding the current version) are returned in json format (see Content_) + :If-None-Match: If the provided etag matches the current etag then a 304 Not Modified is returned. The etag changes if the meta data was changed - this happens also if there is a new published version.. +:Parameters: + :languages: (comma separated list) restricts the output of translatable fields to the given languages +:Response: + + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ContentUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Content_ + +:Error Codes: + :401: If the user is not authorized to read this object. This could also happen if there is no published version yet and another user owns a draft of this content + :404: If the ID is not found + +XML Example +''''''''''' + +.. code:: http + + GET /content/objects/23 HTTP/1.1 + Accept: application/vnd.ez.api.ContentInfo+xml + If-None-Match: "12340577" + +.. code:: http + + HTTP/1.1 200 OK + ETag: "12345678" + Accept-Patch: application/vnd.ez.api.ContentUpdate+xml;charset=utf8 + Content-Type: application/vnd.ez.api.ContentInfo+xml + Content-Length: xxx + +.. code:: xml + + + + + This is a title + + +
+ + + + 2012-02-12T12:30:00 + 2012-02-12T15:30:00 + eng-US + true + + + + +Update Content +`````````````` +:Resource: /content/objects/ +:Method: PATCH or POST with header: X-HTTP-Method-Override: PATCH +:Description: this method updates the content metadata which is independent from a version. +:Headers: + :Accept: + :application/vnd.ez.api.ContentInfo+xml: if set all informations for the content object (excluding the current version) are returned in xml format (see Content_) + :application/vnd.ez.api.ContentInfo+json: if set all informations for the content object (excluding the current version) are returned in json format (see Content_) + :If-Match: Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned. + :Content-Type: + :application/vnd.ez.api.ContentUpdate+json: the ContentUpdate_ schema encoded in json + :application/vnd.ez.api.ContentUpdate+xml: the ContentUpdate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ContentUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Content_ + + +:Error Codes: + :400: If the Input does not match the input schema definition. + :401: If the user is not authorized to update this object + :404: If the content id does not exist + :412: If the current ETag does not match with the provided one in the If-Match header + :415: If the media-type is not one of those specified in Headers + +XML Example +''''''''''' +In this example + - the main language is changed + - a new section is assigned + - the main location is changed + - the always avalable flag is changed + - the remoteId is changed + - the owner of the content object is changed + +.. code:: http + + POST /content/objects/23 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Host: www.example.net + If-Match: "12345678" + Accept: application/vnd.ez.api.ContentInfo+xml + Content-Type: application/vnd.ez.api.ContentCreate+xml + Content-Length: xxx + +.. code:: xml + + + + ger-DE +
+ + + false + qwert4321 + + +.. code:: http + + HTTP/1.1 200 OK + ETag: "12345699" + Accept-Patch: application/vnd.ez.api.ContentUpdate+xml;charset=utf8 + Content-Type: application/vnd.ez.api.ContentInfo+xml + Content-Length: xxx + +.. code:: xml + + + + + This is a title + + +
+ + + + 2012-02-12T12:30:00 + 2012-02-12T15:30:00 + ger-DE + false + + +Delete Content +`````````````` +:Resource: /content/objects/ +:Method: DELETE +:Description: The content is deleted. If the content has locations (which is required in 4.x) + on delete all locations assigned the content object are deleted via delete subtree. +:Response: 204 +:Error Codes: + :404: content object was not found + :401: If the user is not authorized to delete this object + +Copy content +```````````` + +:Resource: /content/objects/ +:Method: COPY or POST with header: X-HTTP-Method-Override COPY +:Description: Creates a new content object as copy under the given parent location given in the destination header. +:Headers: + :Destination: A location resource to which the content object should be copied. +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects/ + +:Error codes: + :401: If the user is not authorized to copy this object to the given location + :404: If the source or destination resource do not exist. + +Example +''''''' + +.. code:: http + + COPY /content/objects/23 HTTP/1.1 + Host: api.example.com + Destination: /content/locations/1/4/78 + + HTTP/1.1 201 Created + Location: /content/objects/74 + + +Managing Versions +~~~~~~~~~~~~~~~~~ + +Get Current Version +``````````````````` +:Resource: /content/objects//currentversion +:Method: GET +:Description: Redirects to the current version of the content object +:Response: + +.. code:: http + + HTTP/1.1 307 Temporary Redirect + Location: /content/objects//version/ + +:Error Codes: + :404: If the resource does not exist + + +List Versions +````````````` +:Resource: /content/objects//versions +:Method: GET +:Description: Returns a list of all versions of the content. This method does not include fields and relations in the Version elements of the response. +:Headers: + :Accept: + :application/vnd.ez.api.VersionList+xml: if set the version list is returned in xml format (see VersionList_) + :application/vnd.ez.api.VersionList+json: if set the version list is returned in json format +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + VersionList_ + +:Error Codes: + :401: If the user has no permission to read the versions + +XML Example +''''''''''' + +.. code:: http + + GET /content/objects/23/versions HTTP/1.1 + Host: api.example.com + Accept: application/vnd.ez.api.VersionList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.VersionList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + 12 + 1 + ARCHIVED + 2012-02-15T12:00:00 + + 22012-02-15T12:00:00 + eng-US + + Name + + + + + + + + 22 + 2 + PUBLISHED + 2012-02-17T12:00:00 + + 22012-02-17T12:00:00 + eng-US + + Name + + + + + + + + 44 + 3 + DRAFT + 2012-02-19T12:00:00 + + 22012-02-19T12:00:00 + fra-FR + + Name + Nom + + + + + + + + 45 + 4 + DRAFT + 2012-02-20T12:00:00 + + 22012-02-20T12:00:00 + ger-DE + + Name + Name + + + + + + +Load Version +```````````` +:Resource: /content/objects//versions/ +:Method: GET +:Description: Loads a specific version of a content object. This method returns fields and relations +:Parameters: + :fields: comma separated list of fields which should be returned in the response (see Content) + :responseGroups: alternative: comma separated lists of predefined field groups (see REST API Spec v1) + :languages: (comma separated list) restricts the output of translatable fields to the given languages +:Headers: + :If-None-Match: Only return the version if the given is the not current one otherwise a 304 is returned. + :Accept: + :application/vnd.ez.api.Version+xml: if set the version list is returned in xml format (see VersionList_) + :application/vnd.ez.api.Version+json: if set the version list is returned in json format +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: + ETag: + Accept-Patch: application/vnd.ez.api.VersionUpdate+xml (ONLY if version is a draft) + +.. parsed-literal:: + Version_ + +:Error Codes: + :401: If the user is not authorized to read this object + :404: If the ID or version is not found + :304: If the etag does not match the current one + +XML Example +''''''''''' + +.. code:: http + + GET /content/objects/23/versions/4 HTTP/1.1 + Host: api.example.com + If-None-Match: "1758f762" + Accept: application/vnd.ez.api.Version+xml + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.VersionUpdate+xml + ETag: "a3f2e5b7" + Content-Type: application/vnd.ez.api.Version+xml + Content-Length: xxx + +.. code:: xml + + + + + 45 + 4 + DRAFT + 2012-02-20T12:00:00 + + 22012-02-20T12:00:00 + ger-DE + + Name + + + + + + 1234 + title + ger-DE + Titel + + + 1235 + summary + ger-DE + Dies ist eine Zusammenfassungy + + + authors + ger-DE + + + Karl Mustermann + karl.mustermann@example.net + + + + + > + + + + COMMON + + + + +Update Version +`````````````` +:Resource: /content/objects//version/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: A specific draft is updated. +:Parameters: + :languages: (comma separated list) restricts the output of translatable fields to the given languages +:Headers: + :Accept: + :application/vnd.ez.api.Version+xml: if set the updated version is returned in xml format (see Version_) + :application/vnd.ez.api.Version+json: if set the updated version returned in json format (see Version_) + :If-Match: Causes to patch only if the specified etag is the current one + :Content-Type: + :application/vnd.ez.api.VersionUpdate+json: the VersionUpdate_ schema encoded in json + :application/vnd.ez.api.VersionUpdate+xml: the VersionUpdate_ schema encoded in xml +:Response: + +.. code:: xml + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.VersionUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Version_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update this version + :403: If the version is not allowed to change - i.e is not a DRAFT + :404: If the content id or version id does not exist + :412: If the current ETag does not match with the provided one in the If-Match header + +XML Example +''''''''''' + +.. code:: http + + POST /content/objects/23/versions/4 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Host: www.example.net + If-Match: "a3f2e5b7" + Accept: application/vnd.ez.api.Version+xml + Content-Type: application/vnd.ez.api.VersionUpdate+xml + Content-Length: xxx + +.. code:: xml + + + + 2001-12-31T12:00:00 + ger-DE + + + 1234 + title + ger-DE + Neuer Titel + + + 1235 + summary + ger-DE + Dies ist eine neue Zusammenfassungy + + + + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.VersionUpdate+xml + ETag: "a3f2e5b9" + Content-Type: application/vnd.ez.api.Version+xml + Content-Length: xxx + +.. code:: xml + + + + + 45 + 4 + DRAFT + 2012-02-20T12:00:00 + + 22012-02-20T12:00:00 + ger-DE + + Neuer Titel + + + + + + 1234 + title + ger-DE + Neuer Titel + + + 1235 + summary + ger-DE + Dies ist eine neuse Zusammenfassungy + + + authors + ger-DE + + + + + + + + + + + + COMMON + + + + + +Create a Draft from a Version +````````````````````````````` + +:Resource: /content/objects//versions/ +:Method: COPY or POST with header X-HTTP-Method-Override: COPY +:Description: The system creates a new draft version as a copy from the given version +:Headers: + :Accept: + :application/vnd.ez.api.Version+xml: if set the updated version is returned in xml format (see Version_) + :application/vnd.ez.api.Version+json: if set the updated version returned in json format (see Version_) +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects//versions/ + ETag: + Accept-Patch: application/vnd.ez.api.VersionUpdate+xml + Content-Type: + Content-Length: +.. parsed-literal:: + Version_ + +:Error Codes: + :401: If the user is not authorized to update this object + :404: If the content object was not found + +Create a Draft from current Version +``````````````````````````````````` + +:Resource: /content/objects//currentversion +:Method: COPY or POST with header X-HTTP-Method-Override: COPY +:Description: The system creates a new draft version as a copy from the current version +:Headers: + :Accept: + :application/vnd.ez.api.Version+xml: if set the updated version is returned in xml format (see Version_) + :application/vnd.ez.api.Version+json: if set the updated version returned in json format (see Version_) +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects//versions/ + ETag: + Accept-Patch: application/vnd.ez.api.VersionUpdate+xml + Content-Type: + Content-Length: +.. parsed-literal:: + Version_ + +:Error Codes: + :401: If the user is not authorized to update this object + :403: If the current version is already a draft + :404: If the content object was not found + +Delete Content Version +`````````````````````` +:Resource: /content/objects//version/ +:Method: DELETE +:Description: The version is deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :404: if the content object or version nr was not found + :401: If the user is not authorized to delete this version + :403: If the version is in state published + +Publish a content version +````````````````````````` +:Resource: /content/objects//version/ +:Method: PUBLISH or POST with header X-HTTP-Method-Override: PUBLISH +:Description: The content version is published +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :404: if the content object or version nr was not found + :401: If the user is not authorized to publish this version + :403: If the version is not a draft + +Managing Relations +~~~~~~~~~~~~~~~~~~ + +Load relations of content +````````````````````````` +:Resource: /content/objects//relations +:Method: GET +:Description: redirects to the relations of the current version +:Response: + +.. code:: http + + HTTP/1.1 307 Temporary Redirect + Location: /content/objects//versions//relations + +:Error Codes: +:401: If the user is not authorized to read this object +:404: If the content object was not found + +Load relations of version +````````````````````````` +:Resource: /content/objects//versions//relations +:Method: GET +:Description: loads the relations of the given version +:Parameters: + :offset: the offset of the result set + :limit: the number of relations returned +:Headers: + :Accept: + :application/vnd.ez.api.RelationList+xml: if set the relation is returned in xml format (see RelationList_) + :application/vnd.ez.api.RelationList+json: if set the relation is returned in json format (see RelationList_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: xxx +.. parsed-literal:: + RelationList_ + +:Error Codes: + :401: If the user is not authorized to read this object + :404: If the content object was not found + +XML Example +''''''''''' + +.. code:: http + + GET /content/objects/23/versions/2/relations HTTP/1.1 + Accept: application/vnd.ez.api.RelationList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.RelationList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + COMMON + + + + + body + EMBED + + + + + +Load a relation +``````````````` +:Resource: /content/objects//versions//relations/ +:Method: GET +:Description: loads a relation for the given content object +:Headers: + :Accept: + :application/vnd.ez.api.Relation+xml: if set the relation is returned in xml format (see Relation_) + :application/vnd.ez.api.Relation+json: if set the relation is returned in json format (see Relation_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: xxx +.. parsed-literal:: + Relation_ (relationValueType( + +:Error Codes: + :404: If the object with the given id or the relation does not exist + :401: If the user is not authorized to read this object + +Create a new Relation +````````````````````` +:Resource: /content/objects//versions//relations +:Method: POST +:Description: Creates a new relation of type COMMON for the given draft. +:Headers: + :Accept: + :application/vnd.ez.api.Relation+xml: if set the updated version is returned in xml format (see RelationCreate_) + :application/vnd.ez.api.Relation+json: if set the updated version returned in json format (see RelationCreate_) + :Content-Type: + :application/vnd.ez.api.RelationCreate+xml: the RelationCreate (see RelationCreate_) schema encoded in xml + :application/vnd.ez.api.RelationCreate+json: the RelationCreate (see RelationCreate_) schema encoded in json +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects//versions//relations/ + Content-Type: + Content-Length: xxx +.. parsed-literal:: + Relation_ (relationValueType( + +:Error Codes: + :401: If the user is not authorized to update this content object + :403: If a relation to the destId already exists or the destId does not exist or the version is not a draft. + :404: If the object or version with the given id does not exist + +XML Example +''''''''''' + +.. code:: http + + POST /content/objects/23/versions/4/relations HTTP/1.1 + Accept: application/vnd.ez.api.Relation+xml + Content-Type: application/vnd.ez.api.RelationCreate+xml + Content-Length: xxx + +.. code:: xml + + + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objects/23/versions/4/relations + Content-Type: application/vnd.ez.api.RelationCreate+xml + Content-Length: xxx + +.. code:: xml + + + + + + COMMON + + + +Delete a relation +````````````````` +:Resource: /content/objects//versions//relations/ +:Method: DELETE +:Description: Deletes a relation of the given draft. +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :404: content object was not found or the relation was not found in the given version + :401: If the user is not authorized to delete this relation + :403: If the relation is not of type COMMON or the given version is not a draft + + + +Managing Locations +~~~~~~~~~~~~~~~~~~ + +Create a new location for a content object +`````````````````````````````````````````` +:Resource: /content/objects//locations +:Method: POST +:Description: Creates a new location for the given content object +:Headers: + :Accept: + :application/vnd.ez.api.Location+xml: if set the new location is returned in xml format (see Location_) + :application/vnd.ez.api.Location+json: if set the new location is returned in json format (see Location_) + :Content-Type: + :application/vnd.ez.api.LocationCreate+json: the LocationCreate_ schema encoded in json + :application/vnd.ez.api.LocationCreate+xml: the LocationCreate_ schema encoded in xml +:Response: + +.. code:: xml + + HTTP/1.1 201 Created + Location: /content/locations/ + ETag: "" + Accept-Patch: application/vnd.ez.api.LocationUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Location_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this location + :403: If a location under the given parent id already exists + +XML Example +''''''''''' + +.. code:: http + + POST /content/objects/23/locations HTTP/1.1 + Accept: application/vnd.ez.api.Location+xml + Content-Type: application/vnd.ez.api.LocationCreate+xml + Contnt-Length: xxx + +.. code:: xml + + + + + 0 + false + PATH + ASC + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/locations/1/5/73/133 + ETag: "2345563422" + Accept-Patch: application/vnd.ez.api.LocationUpdate+xml + Content-Type: application/vnd.ez.api.Location+xml + Contnt-Length: xxx + +.. code:: xml + + + + 133 + 0 + false + false + + /1/5/73/133 + 4 + 0 + remoteId-qwert567 + + + PATH + ASC + + + + +Get locations for a content object +`````````````````````````````````` +:Resource: /content/objects//locations +:Method: GET +:Description: loads all locations for the given content object +:Headers: + :Accept: + :application/vnd.ez.api.LocationList+xml: if set the new location is returned in xml format (see Location_) + :application/vnd.ez.api.LocationList+json: if set the new location is returned in json format (see Location_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Location_ (locationListType) + +:Error Codes: + :404: If the object with the given id does not exist + :401: If the user is not authorized to read this object + +XML Example +''''''''''' + +.. code:: http + + GET /content/objects/23/locations HTTP/1.1 + Accept: application/vnd.ez.api.LocationList+xml + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: application/vnd.ez.api.LocationList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + +Load locations by id +```````````````````` +:Resource: /content/locations +:Method: GET +:Description: loads the location for a given id (x)or remote id +:Parameters: :id: the id of the location. If present the location is with the given id is returned. + :remoteId: the remoteId of the location. If present the location with the given remoteId is returned +:Response: + +.. code:: http + + HTTP/1.1 307 Temporary Redirect + Location: /content/locations/ + +:Error Codes: + :404: If the location with the given id (remoteId) does not exist + +Load location +````````````` +:Resource: /content/locations/ +:Method: GET +:Description: loads the location for the given path +:Headers: + :Accept: + :application/vnd.ez.api.Location+xml: if set the new location is returned in xml format (see Location_) + :application/vnd.ez.api.Location+json: if set the new location is returned in json format (see Location_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Location: /content/locations/ + ETag: "" + Accept-Patch: application/vnd.ez.api.LocationUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Location_ + +:Error Codes: + :404: If the location with the given path does not exist + :401: If the user is not authorized to read this location + +XML Example +''''''''''' + +.. code:: http + + GET /content/locations/1/4/73/133 HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.Location+xml + If-None-Match: "2345503255" + +.. code:: http + + HTTP/1.1 200 OK + ETag: "2345563422" + Accept-Patch: application/vnd.ez.api.LocationUpdate+xml + Content-Type: application/vnd.ez.api.Location+xml + Contnt-Length: xxx + +.. code:: xml + + + + 133 + 0 + false + false + + /1/5/73/133 + 4 + 0 + remoteId-qwert567 + + + PATH + ASC + + + +Update location +``````````````` +:Resource: /content/locations/ +:Method: PATCH or POST with header: X-HTTP-Method-Override: PATCH +:Description: updates the location, this method can also be used to hide/unhide a location via the hidden field in the LocationUpdate_ +:Headers: + :Accept: + :application/vnd.ez.api.Location+xml: if set the new location is returned in xml format (see Location_) + :application/vnd.ez.api.Location+json: if set the new location is returned in json format (see Location_) + :Content-Type: + :application/vnd.ez.api.LocationUpdate+json: the LocationUpdate_ schema encoded in json + :application/vnd.ez.api.LocationUpdate+xml: the LocationUpdate_ schema encoded in xml + :If-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Location: /content/locations/ + ETag: "" + Accept-Patch: application/vnd.ez.api.LocationUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Location_ + +:Error Codes: + :404: If the location with the given id does not exist + :401: If the user is not authorized to update this location + + +XML Example +''''''''''' + +.. code:: http + + POST /content/locations/1/5/73/133 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Host: www.example.net + If-Match: "12345678" + Accept: application/vnd.ez.api.Location+xml + Content-Type: :application/vnd.ez.api.LocationUpdate+xml + Content-Length: xxx + +.. code:: xml + + + + 3 + true + remoteId-qwert999 + CLASS + DESC + + +.. code:: http + + HTTP/1.1 200 OK + ETag: "2345563444" + Accept-Patch: application/vnd.ez.api.LocationUpdate+xml + Content-Type: application/vnd.ez.api.Location+xml + Content-Length: xxx + +.. code:: xml + + + + 133 + 3 + true + true + + /1/5/73/133 + 4 + 0 + remoteId-qwert999 + + + CLASS + ASC + + + +Get child locations +``````````````````` +:Resource: /content/locations//children +:Method: GET +:Description: loads all child locations for the given parent location +:Parameters: + :offset: the offset of the result set + :limit: the number of locations returned +:Headers: + :Accept: + :application/vnd.ez.api.LocationList+xml: if set the new location list is returned in xml format (see Location_) + :application/vnd.ez.api.LocationList+json: if set the new location list is returned in json format (see Location_) +:Response: + +.. code:: xml + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Location_ + +:Error Codes: + :404: If the object with the given id does not exist + :401: If the user is not authorized to read this object + +XML Example +''''''''''' + +.. code:: http + + GET /content/locations/1/2/54/children HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.LocationList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.LocationList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + +Move Subtree +```````````` +:Resource: /content/locations/ +:Method: MOVE or POST with header X-HTTP-Method-Override: MOVE +:Description: moves the location to another parent. The destination can also be /content/trash where the location is put into the trash. +:Headers: + :Destination: A parent location resource to which the location is moved +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/locations/ + +or if destination is /content/trash + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/trash/ + +:Error Codes: + :404: If the location with the given id does not exist + :401: If the user is not authorized to move this location + +Copy Subtree +```````````` +:Resource: /content/locations/ +:Method: COPY or POST with header X-HTTP-Method-Override: COPY +:Description: copies the subtree to another parent +:Headers: + :Destination: A parent location resource to which the location is moved +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/locations/ + +:Error Codes: + :404: If the location with the given id does not exist + :401: If the user is not authorized to move this location + +Swap Location +````````````` +:Resource: /content/locations/ +:Method: SWAP or POST with header X-HTTP-Method-Override: SWAP +:Description: Swaps the content of the location with the content of the given location +:Headers: + :Destination: A location resource with which the content is swapped +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :404: If the location with the given id does not exist + :401: If the user is not authorized to swap this location + +Delete Subtree +`````````````` +:Resource: /content/locations/ +:Method: DELETE +:Description: Deletes the complete subtree for the given path. Every content object is deleted which does not have any other location. Otherwise the deleted location is removed from the content object. The children a recursively deleted. +:Response: 204 +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :404: If the location with the given id does not exist + :401: If the user is not authorized to delete this subtree + +Views +~~~~~ + +Create View +``````````` +:Resource: /content/views +:Method: POST +:Description: executes a query and returns view including the results + The View_ input reflects the criteria model of the public API. +:Headers: + :Accept: + :application/vnd.ez.api.View+xml: the view in xml format (see View_) + :application/vnd.ez.api.View+json: the view in xml format (see View_) + :Content-Type: + :application/vnd.ez.api.ViewInput+xml: the view input in xml format (see View_) + :application/vnd.ez.api.ViewInput+json: the view input in xml format (see View_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + View_ + +:Error codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + +XML Example +''''''''''' + +Perform a query on articles with a specific title. + +.. code:: http + + POST /content/views HTTP/1.1 + Accept: application/vnd.ez.api.View+xml + Content-Type: application/vnd.ez.api.ViewInput+xml + Content-Length: xxx + +.. code:: xml + + + + TitleView + + + Title + + 10 + 0 + + + NAME + + + + + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/views/view1234 + Content-Type: application/vnd.ez.api.View+xml + Content-Length: xxx + +.. code:: xml + + + + TitleView + + false + + + Title + + 10 + 0 + + + NAME + + + + + + + + + + + + + + Name + + + + + 123 + 2 + PUBLISHED + 2001-12-31T12:00:00 + + 2001-12-31T12:00:00 + eng-UK + + + + + 1234 + title + eng-UK + Title + + + 1235 + summary + + eng-UK + This is a summary + + + + + +
+ + + + 2001-12-31T12:00:00 + 2001-12-31T12:00:00 + eng-UK + true + + + + .... + + + + + + 3 + + + + 9 + + + + 1 + + + + 8 + + + + + + + +List views +`````````` +:Resource: /content/views +:Method: GET +:Description: Returns a list of view uris. The list includes public view and private view of the authenticated user. +:Headers: + :Accept: + :application/vnd.ez.api.RefList+xml: the view link list in xml format (see View_) + :application/vnd.ez.api.RefList+json: the view link list in xml format (see View_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Common_ + +Get View +```````` +:Resource: /content/views/ +:Method: GET +:Description: Returns the view +:Headers: + :Accept: + :application/vnd.ez.api.View+xml: the view excluding results in xml format (see View_) + :application/vnd.ez.api.View+json: the view excluding results in json format (see View_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + View_ + +:Error Codes: + :401: if the view is not public and from another user + + +Get Results of existing View +```````````````````````````` +:Resource: /content/views//results +:Method: GET +:Description: Returns result of the view +:Headers: + :Accept: + :application/vnd.ez.api.ViewResult+xml: the view excluding results in xml format (see View_) + :application/vnd.ez.api.ViewResult+json: the view excluding results in json format (see View_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + View_ + +:Error Codes: + :401: if the view is not public and from another user + +Delete View +``````````` +:Resource: /content/views/ +:Method: DELETE +:Description: the given view is deleted +:Parameters: +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this view + :404: If the view does not exist + + + +Managing Sections +~~~~~~~~~~~~~~~~~ + +Create a new Section +```````````````````` +:Resource: /content/sections +:Method: POST +:Description: Creates a new section +:Headers: + :Accept: + :application/vnd.ez.api.Section+xml: if set the new section is returned in xml format (see Section_) + :application/vnd.ez.api.Section+json: if set the new section is returned in json format (see Section_) + :Content-Type: + :application/vnd.ez.api.SectionInput+json: the Section_ input schema encoded in json + :application/vnd.ez.api.SectionInput+xml: the Section_ input schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/section/ + ETag: "" + Accept-Patch: application/vnd.ez.api.SectionInput+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + Section_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this section + :403: If a section with same identifier already exists + +XML Example +''''''''''' + +.. code:: http + + POST /content/sections HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.Section+xml + Content-Type: application/vnd.ez.api.SectionInput+xml + Content-Length: xxxx + +.. code:: xml + + + + restricted + Restricted + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/section/5 + ETag: "4567867894564356" + Accept-Patch: application/vnd.ez.api.SectionInput+(json|xml) + Content-Type: application/vnd.ez.api.Section+xml + Content-Length: xxxx + +.. code:: xml + + +
+ 5 + restricted + Restriced +
+ + + +Get Sections +```````````` +:Resource: /content/sections +:Method: GET +:Description: Returns a list of all sections +:Parameters: + :identifer: only the section with the given identifier is returned. +:Headers: + :Accept: + :application/vnd.ez.api.SectionList+xml: if set the section list is returned in xml format (see Section_) + :application/vnd.ez.api.SectionList+json: if set the section list is returned in json format (see Section_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Section_ (sectionListType) + +:Error Codes: + :401: If the user has no permission to read the sections + +XML Example +''''''''''' + +.. code:: http + + GET /content/sections + Host: api.example.net + If-None-Match: "43450986749098765" + Accept: application/vnd.ez.api.SectionList+xml + +.. code:: http + + HTTP/1.1 200 OK + ETag: "43450986743098576" + Content-Type: application/vnd.ez.api.SectionList+xml + Content-Length: xxx + +.. code:: xml + + + +
+ 1 + standard + Standard +
+
+ 2 + users + Users +
+
+ 3 + media + Media +
+
+ 4 + setup + Setup +
+
+ + +Get Section +``````````` +:Resource: /content/sections/ +:Method: GET +:Description: Returns the section given by id +:Headers: + :Accept: + :application/vnd.ez.api.Section+xml: if set the section is returned in xml format (see Section_) + :application/vnd.ez.api.Section+json: if set the section is returned in json format (see Section_) + :If-None-match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.SectionInput+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + Section_ + +:ErrorCodes: + :401: If the user is not authorized to read this section + :404: If the section does not exist + +XML Example +''''''''''' + +.. code:: http + + GET /content/sections/3 HTTP/1.1 + Host: api.example.net + If-None-Match: "43450986749098765" + Accept: application/vnd.ez.api.Section+xml + +.. code:: http + + HTTP/1.1 200 OK + ETag: "4567867894564356" + Accept-Patch: application/vnd.ez.api.SectionInput+(json|xml) + Content-Type: application/vnd.ez.api.Section+xml + Content-Length: xxxx + +.. code:: xml + + +
+ 3 + media + Media +
+ + +Update a Section +```````````````` +:Resource: /content/sections/ +:Method: PATCH or POST with header X-HTTP-Method-Override +:Description: Updates a section +:Headers: + :Accept: + :application/vnd.ez.api.Section+xml: if set the updated section is returned in xml format (see Section_) + :application/vnd.ez.api.Section+json: if set the updated section is returned in json format (see Section_) + :Content-Type: + :application/vnd.ez.api.SectionInput+json: the Section_ input schema encoded in json + :application/vnd.ez.api.SectionInput+xml: the Section_ input schema encoded in xml + :If-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.SectionInput+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + Section_ (sectionListType) + +:Error Codes: + :400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this section + :403: If a section with the given new identifier already exists + :412: If the current ETag does not match with the provided one in the If-Match header + +Delete Section +`````````````` +:Resource: /content/sections/ +:Method: DELETE +:Description: the given section is deleted +:Headers: + :Accept: + :application/vnd.ez.api.ErrorMessage+xml: if set in the case of an error the error message is returned in xml format (see ErrorMessage_) + :application/vnd.ez.api.ErrorMessage+json: if set in the case of an error the error message is returned in json format (see ErrorMessage_) +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this section + :404: If the section does not exist + +Managing Trash +~~~~~~~~~~~~~~ + +List TrashItems +``````````````` +:Resource: /content/trash +:Method: GET +:Description: Returns a list of all trash items +:Parameters: + :limit: only items will be returned started by offset + :offset: offset of the result set +:Headers: + :Accept: + :application/vnd.ez.api.Trash+xml: if set the new location is returned in xml format (see Trash_) + :application/vnd.ez.api.Trash+json: if set the new location is returned in json format (see Trash_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Trash_ + +:ErrorCodes: + :401: If the user has no permission to read the trash + +Get TrashItem +````````````` +:Resource: /content/trash/ +:Method: GET +:Description: Returns the trash item given by id +:Headers: + :Accept: + :application/vnd.ez.api.TrashItem+xml: if set the new trash item is returned in xml format (see Trash_) + :application/vnd.ez.api.TrashItem+json: if set the new trash item is returned in json format (see Trash_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Trash_ + +:Error Codes: + :401: If the user has no permission to read the trash item + :404: If the trash item with the given id does not exist + +Untrash Item +```````````` +:Resource: /content/trash/ +:Method: MOVE or POST with header X-HTTP-Method-Override: MOVE +:Description: Restores a trashItem +:Headers: + :Destination: if given the trash item is restored under this location otherwise under its orifinal parent location +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/locations/ + +:Error Codes: + :401: If the user is not authorized to restore this trash item + :403: if the given parent location does not exist + :404: if the given trash item does not exist + +Empty Trash +``````````` +:Resource: /content/trash +:Method: DELETE +:Description: Empties the trash +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to empty all trash items + +Delete TrashItem +```````````````` +:Resource: /content/trash/items/ +:Method: DELETE +:Description: Deletes the given trash item +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to empty the given trash item + :404: if the given trash item does not exist + +Object States +~~~~~~~~~~~~~ + +Create ObjectStateGroup +``````````````````````` +:Resource: /content/objectstategroups +:Method: POST +:Description: Creates a new objectstategroup +:Headers: + :Accept: + :application/vnd.ez.api.ObjectStateGroup+xml: if set the new object state group is returned in xml format (see ObjectStateGroup_) + :application/vnd.ez.api.ObjectStateGroup+json: if set the new object state group is returned in json format (see ObjectStateGroup_) + :Content-Type: + :application/vnd.ez.api.ObjectStateGroupCreate+json: the ObjectStateGroup_ input schema encoded in json + :application/vnd.ez.api.ObjectStateGroupCreate+xml: the ObjectStateGroup_ input schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objectstategroup/ + ETag: "" + Accept-Patch: application/vnd.ez.api.ObjectStateGroupInput+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create an object state group + :403: If a object state group with same identifier already exists + +List ObjectStateGroups +`````````````````````` +:Resource: /content/objectstategroups +:Method: GET +:Description: Returns a list of all object state groups +:Headers: + :Accept: + :application/vnd.ez.api.ObjectStateGroupList+xml: if set the object state group list is returned in xml format (see ObjectStateGroup_) + :application/vnd.ez.api.ObjectStateGroupList+json: if set the object state group list is returned in json format (see ObjectStateGroup_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:Error Codes: + :401: If the user has no permission to read object state groups + + + +Get ObjectStateGroup +```````````````````` +:Resource: /content/objectstategroups/ +:Method: GET +:Description: Returns the object state group given by id +:Headers: + :Accept: + :application/vnd.ez.api.ObjectStateGroup+xml: if set the object state group is returned in xml format (see ObjectStateGroup_) + :application/vnd.ez.api.ObjectStateGroup+json: if set the object state group is returned in json format (see ObjectStateGroup_) + :If-None-match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ObjectStateGroupUpdate+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:ErrorCodes: + :401: If the user is not authorized to read object state groups + :404: If the sobject state group does not exist + +Update ObjectStateGroup +``````````````````````` +:Resource: /content/objectstategroups/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates an object state group +:Headers: + :Accept: + :application/vnd.ez.api.ObjectStateGroup+xml: if set the updated object state group is returned in xml format (see ObjectStateGroup_) + :application/vnd.ez.api.ObjectStateGroup+json: if set the updated object state group is returned in json format (see ObjectStateGroup_) + :Content-Type: + :application/vnd.ez.api.ObjectStateGroupUpdate+json: the ObjectStateGroup_ input schema encoded in json + :application/vnd.ez.api.ObjectStateGroupUpdate+xml: the ObjectStateGroup_ input schema encoded in xml + :If-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ObjectStateGroupUpdate+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:Error Codes: + :400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update an object state group + :403: If an object state group with the given new identifier already exists + :412: If the current ETag does not match with the provided one in the If-Match header + +Delete ObjectStateGroup +``````````````````````` +:Resource: /content/objectstategroups/ +:Method: DELETE +:Description: the given object state group including the object states is deleted +:Parameters: +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete an object state group + :404: If the object statee group does not exist + +Create ObjectState +`````````````````` +:Resource: /content/objectstategroups//objectstates +:Method: POST +:Description: Creates a new objectstate +:Headers: + :Accept: + :application/vnd.ez.api.ObjectState+xml: if set the new object state is returned in xml format (see ObjectState_) + :application/vnd.ez.api.ObjectState+json: if set the new object state is returned in json format (see ObjectState_) + :Content-Type: + :application/vnd.ez.api.ObjectStateGroupCreate+json: the ObjectState_ input schema encoded in json + :application/vnd.ez.api.ObjectStateGroupCreate+xml: the ObjectState_ input schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/objectstategroup//objectstate/ + ETag: "" + Accept-Patch: application/vnd.ez.api.ObjectStateUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create an object state + :403: If a object state with same identifier already exists in the given group + +List Objectstates +````````````````` +:Resource: /content/objectstategroups//objectstates +:Method: GET +:Description: Returns a list of all object states of the given group +:Headers: + :Accept: + :application/vnd.ez.api.ObjectStateList+xml: if set the object state list is returned in xml format (see ObjectState_) + :application/vnd.ez.api.ObjectStateList+json: if set the object state list is returned in json format (see ObjectState_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:Error Codes: + :401: If the user has no permission to read object states + + + +Get ObjectState +``````````````` +:Resource: /content/objectstategroups//objectstates/ +:Method: GET +:Description: Returns the object state +:Headers: + :Accept: + :application/vnd.ez.api.ObjectState+xml: if set the object state is returned in xml format (see ObjectState_) + :application/vnd.ez.api.ObjectState+json: if set the object state is returned in json format (see ObjectState_) + :If-None-match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ObjectStateUpdate+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:ErrorCodes: + :401: If the user is not authorized to read object state groups + :404: If the sobject state group does not exist + +Update ObjectState +`````````````````` +:Resource: /content/objectstategroups//objectstates/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates an object state +:Headers: + :Accept: + :application/vnd.ez.api.ObjectState+xml: if set the updated object state is returned in xml format (see ObjectState_) + :application/vnd.ez.api.ObjectState+json: if set the updated object state is returned in json format (see ObjectState_) + :Content-Type: + :application/vnd.ez.api.ObjectStateUpdate+json: the ObjectState_ input schema encoded in json + :application/vnd.ez.api.ObjectStateUpdate+xml: the ObjectState_ input schema encoded in xml + :If-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ObjectStateUpdate+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + ObjectStateGroup_ + +:Error Codes: + :400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update an object state + :403: If an object state with the given new identifier already exists in this group + :412: If the current ETag does not match with the provided one in the If-Match header + +Delete ObjectState +`````````````````` +:Resource: /content/objectstategroups//objectstates/ +:Method: DELETE +:Description: the given object state is deleted +:Parameters: +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete an object state group + :404: If the object state does not exist + + +Get ObjectStates of Content +``````````````````````````` +:Resource: /content/objects//objectstates +:Method: GET +:Description: Returns the object states of content +:Headers: + :Accept: + :application/vnd.ez.api.ContentObjectStates+xml: if set the object state is returned in xml format (see ContentObjectStates_) + :application/vnd.ez.api.ContentObjectStates+json: if set the object state is returned in json format (see ContentObjectStates_) + :If-None-match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ContentObjectStates+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + ContentObjectStates_ + +:ErrorCodes: + :404: If the content object does not exist + +Set ObjectStates of Content +``````````````````````````` +:Resource: /content/objects//objectstates +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates object states of content. An object state in the input overrides the state of the object state group. +:Headers: + :Accept: + :application/vnd.ez.api.ContentObjectStates+xml: if set the updated object state is returned in xml format (see ContentObjectStates_) + :application/vnd.ez.api.ContentObjectStates+json: if set the updated object state is returned in json format (see ContentObjectStates_) + :Content-Type: + :application/vnd.ez.api.ContentObjectStates+json: the ContentObjectStates_ input schema encoded in json + :application/vnd.ez.api.ContentObjectStates+xml: the ContentObjectStates_ input schema encoded in xml + :If-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Accept-Patch: application/vnd.ez.api.ContentObjectStates+(xml|json) + Content-Type: + Content-Length: +.. parsed-literal:: + ContentObjectStates_ + +:Error Codes: + :400; If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to set an object state + :403: If the input contains multiple object states of the same object state group + :412: If the current ETag does not match with the provided one in the If-Match header + +Url Alias +~~~~~~~~~ + +Create Url Alias +```````````````` +:Resource: /content/urlaliases +:Method: POST +:Description: Creates a new url alias +:Headers: + :Accept: + :application/vnd.ez.api.UrlAlias+xml: if set the new object state group is returned in xml format (see UrlAlias_) + :application/vnd.ez.api.UrlAlias+json: if set the new object state group is returned in json format (see UrlAlias_) + :Content-Type: + :application/vnd.ez.api.UrlAliasCreate+json: the UrlAlias_ input schema encoded in json + :application/vnd.ez.api.UrlAliasCreate+xml: the UrlAlias_ input schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/urlaliases/ + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + UrlAlias_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create an url alias + :403: If an url alias same identifier already exists + +List UrlAliases for location +```````````````````````````` +:Resource: /content/locations//urlaliases +:Method: GET +:Description: Returns the list of url aliases for a location +:Parameters: + :custom: (default true) this flag indicates wether autogenerated (false) or manual url aliases (true) should be returned. +:Headers: + :Accept: + :application/vnd.ez.api.UrlAliasRefList+xml: if set the url alias list contains only references and is returned in xml format (see UrlAlias_) + :application/vnd.ez.api.UrlAliasRefList+json: if set the url alias list contains only references is and returned in json format (see UrlAlias_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UrlAlias_ + +:Error Codes: + :401: If the user has no permission to read urlaliases + :401: If the location was not found + + +List Global UrlAliases +`````````````````````` +:Resource: /content/urlaliases +:Method: GET +:Description: Returns the list of url global aliases +:Headers: + :Accept: + :application/vnd.ez.api.UrlAliasRefList+xml: if set the url alias list contains only references and is returned in xml format (see UrlAlias_) + :application/vnd.ez.api.UrlAliasRefList+json: if set the url alias list contains only references is and returned in json format (see UrlAlias_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UrlAlias_ + +:Error Codes: + :401: If the user has no permission to read urlaliases + +Get UrlAlias +```````````` +:Resource: /content/urlaliases/ +:Method: GET +:Description: Returns the urlalias with the given id +:Headers: + :Accept: + :application/vnd.ez.api.UrlAlias+xml: if set the url alias is returned in xml format (see UrlAlias_) + :application/vnd.ez.api.UrlAlias+json: if set the url alias is returned in json format (see UrlAlias_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UrlAlias_ + +:ErrorCodes: + :401: If the user is not authorized to read url aliases + :404: If the url alias does not exist + +Delete UrlAlias +``````````````` +:Resource: /content/urlaliases/ +:Method: DELETE +:Description: the given url alias is deleted +:Parameters: +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete an url alias + :404: If the url alias does not exist + + +Url Wildcards +~~~~~~~~~~~~~ + +Create Url Wildcard +``````````````````` +:Resource: /content/urlwildcards +:Method: POST +:Description: Creates a new url wildcard +:Headers: + :Accept: + :application/vnd.ez.api.UrlWildcard+xml: if set the new object state group is returned in xml format (see UrlWildcard_) + :application/vnd.ez.api.UrlWildcard+json: if set the new object state group is returned in json format (see UrlWildcard_) + :Content-Type: + :application/vnd.ez.api.UrlWildcardCreate+json: the UrlWildcard_ input schema encoded in json + :application/vnd.ez.api.UrlWildcardCreate+xml: the UrlWildcard_ input schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/urlwildcards/ + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + UrlWildcard_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create an url wildcard + :403: If an url wildcardsame identifier already exists + +List UrlWildcards +````````````````` +:Resource: /content/urlwildcards +:Method: GET +:Description: Returns a list of url wildcards +:Headers: + :Accept: + :application/vnd.ez.api.UrlWildcardList+xml: if set the url wildcard list is returned in xml format (see UrlWildcard_) + :application/vnd.ez.api.UrlWildcardList+json: if set the url wildcard list is returned in json format (see UrlWildcard_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UrlWildcard_ + +:Error Codes: + :401: If the user has no permission to read urlwildcards + +Get UrlWildcard +``````````````` +:Resource: /content/urlwildcards/ +:Method: GET +:Description: Returns the urlwildcard with the given id +:Headers: + :Accept: + :application/vnd.ez.api.UrlWildcard+xml: if set the url wildcard is returned in xml format (see UrlWildcard_) + :application/vnd.ez.api.UrlWildcard+json: if set the url wildcard is returned in json format (see UrlWildcard_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UrlWildcard_ + +:ErrorCodes: + :401: If the user is not authorized to read url wildcards + :404: If the url wildcard does not exist + +Delete UrlWildcard +`````````````````` +:Resource: /content/urlwildcards/ +:Method: DELETE +:Description: the given url wildcard is deleted +:Parameters: +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete an url wildcard + :404: If the url wildcard does not exist + + +Content Types +============= + +Overview +-------- + +================================================== =================== =================== ======================= ======================= + Resource POST GET PUT/PATCH DELETE +-------------------------------------------------- ------------------- ------------------- ----------------------- ----------------------- +/content/typegroups create new group load all groups . . +/content/typegroups/ . load group update group delete group +/content/typegroups//types create content type list content types . . +/content/types . list content types . . +/content/types/ copy content type load content type create draft delete content type +/content/types//groups link group list groups . . +/content/types//groups/ . . . unlink group +/content/types//draft publish draft load draft update draft delete draft +/content/types//draft/fieldDefinitions create field def. . . . +/content/types//draft/fieldDefinitions/ . load field def. update field definition delete field definition +================================================== =================== =================== ======================= ======================= + +Specification +------------- + +Managing Content Type Groups +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Create Content Type Group +````````````````````````` +:Resource: /content/typegroups +:Method: POST +:Description: Creates a new content type group +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroup+xml: if set the new section is returned in xml format (see ContentTypeGroup_) + :application/vnd.ez.api.ContentTypeGroup+json: if set the new section is returned in json format (see ContentTypeGroup_) + :Content-Type: + :application/vnd.ez.api.ContentTypeGroupInput+json: the ContentTypeGroup_ input schema encoded in json + :application/vnd.ez.api.ContentTypeGroupInput+xml: the ContentTypeGroup_ input schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Loction: /content/typegroups/ + Accept-Patch: application/vnd.ez.api.ContentTypeGroupInput+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this content type group + :403: If a content type group with same identifier already exists + + +XML Example +''''''''''' + +.. code:: http + + POST /content/typegroups HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.ContentTypeGroup+xml + Content-Type: application/vnd.ez.api.ContentTypeGroupInput+xml + Content-Length: xxx + +.. code:: xml + + + + newContentTypeGroup + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/typegroups/7 + Accept-Patch: application/vnd.ez.api.ContentTypeGroupInput+xml + ETag: "9587649865938675" + Content-Type: application/vnd.ez.api.ContentTypeGroup+xml + Content-Length: xxx + +.. code:: xml + + + + 7 + newContentTypeGroup + 2012-02-31T12:45:00 + 2012-02-31T12:45:00 + + + + + + +Get Content Type Groups +``````````````````````` +:Resource: /content/typegroups +:Method: GET +:Description: Returns a list of all content types groups +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroupList+xml: if set the new section is returned in xml format (see ContentTypeGroup_) + :application/vnd.ez.api.ContentTypeGroupList+json: if set the new section is returned in json format (see ContentTypeGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ (contentTypeGroupListType) + +:Error Codes: + :401: If the user has no permission to read the content types + +XML Example +''''''''''' + +.. code:: http + + GET /content/typegroups HTTP/1.1 + Host: api.example.net + Accept: application/vnd.ez.api.ContentTypeGroupList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.ContentTypeGroupList+xml + Content-Length: xxx + +.. code:: xml + + + + + 1 + Content + 2010-06-31T12:00:00 + 2010-07-31T12:00:00 + + + + + + 2 + Media + 2010-06-31T14:00:00 + 2010-09-31T12:00:00 + + + + + + + +Get Content Type Group +`````````````````````` +:Resource: /content/typegroups/ +:Method: GET +:Description: Returns the content type given by id +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroup+xml: if set the new section is returned in xml format (see ContentTypeGroup_) + :application/vnd.ez.api.ContentTypeGroup+json: if set the new section is returned in json format (see ContentTypeGroup_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.ContentTypeGroupInput+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ + +:ErrorCodes: + :401: If the user is not authorized to read this content type + :404: If the content type group does not exist + +Update Content Type Group +````````````````````````` +:Resource: /content/typegroups/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates a content type group +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroup+xml: if set the new section is returned in xml format (see ContentTypeGroup_) + :application/vnd.ez.api.ContentTypeGroup+json: if set the new section is returned in json format (see ContentTypeGroup_) + :Content-Type: + :application/vnd.ez.api.ContentTypeGroupInput+json: the ContentTypeGroup_ input schema encoded in json + :application/vnd.ez.api.ContentTypeGroupInput+xml: the ContentTypeGroup_ input schema encoded in xml + :If-Match: Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned. +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.ContentTypeGroupInput+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this content type group + :403: If a content type group with the given identifier already exists + :412: If the current ETag does not match with the provided one in the If-Match header + + +XML Example +''''''''''' + +.. code:: http + + POST /content/typegroups/7 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Host: api.example.net + If-Match: "958764986593830900" + Accept: application/vnd.ez.api.ContentTypeGroup+xml + Content-Type: application/vnd.ez.api.ContentTypeGroupInput+xml + Content-Length: xxx + +.. code:: xml + + + + updatedIdentifer + + +.. code:: http + + HTTP/1.1 200 OK + Location: /content/typegroups/7 + Accept-Patch: application/vnd.ez.api.ContentTypeGroupInput+xml + ETag: "95876498659383245" + Content-Type: application/vnd.ez.api.ContentTypeGroup+xml + Content-Length: xxx + +.. code:: xml + + + + 7 + updatedIdentifer + 2012-02-31T12:45:00 + 2012-04-13T12:45:00 + + + + + + +Delete Content Type Group +````````````````````````` +:Resource: /content/typegroups/ +:Method: DELETE +:Description: the given content type group is deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this content type + :403: If the content type group is not empty + :404: If the content type does not exist + +List Content Types for Group +```````````````````````````` +:Resource: /content/typegroups//types +:Method: GET +:Description: Returns a list of content types of the group +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeInfoList+xml: if set the list of content type info objects is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeInfoList+json: if set the list of content type info objects is returned in json format (see ContentType_) + :application/vnd.ez.api.ContentTypeList+xml: if set the list of content type objects (including field definitions) is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeList+json: if set the list content type objects (including field definitions) is returned in json format (see ContentType_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:Error Codes: + :401: If the user has no permission to read the content types + + +Managing Content Types +~~~~~~~~~~~~~~~~~~~~~~ + +Create Content Type +``````````````````` +:Resource: /content/typegroups//types +:Method: POST +:Description: Creates a new content type draft in the given content type group +:Parameters: :publish: (default false) If true the content type is published after creating +:Headers: + :Accept: + :application/vnd.ez.api.ContentType+xml: if set the new content type or draft is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentType+json: if set the new content type or draft is returned in json format (see ContentType_) + :Content-Type: + :application/vnd.ez.api.ContentTypeCreate+json: the ContentTypeCreate_ schema encoded in json + :application/vnd.ez.api.ContentTypeCreate+xml: the ContentTypeCreate_ schema encoded in xml +:Response: + If publish = false: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/types//draft + Accept-Patch: application/vnd.ez.api.ContentTypeUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +If publish = true: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/types/ + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:Error Codes: + :400: - If the Input does not match the input schema definition, + - If publish = true and the input is not complete e.g. no field definitions are provided + :401: If the user is not authorized to create this content type + :403: If a content type with same identifier already exists + +XML Example +''''''''''' + +.. code:: http + + POST /content/typegroups//types HTTP/1.1 + Accept: application/vnd.ez.api.ContentType + Content-Type: application/vnd.ez.api.ContentTypeCreate + Content-Length: xxx + +.. code:: xml + + + + newContentType + + New Content Type + + + This is a description + + remoteId-qwert548 + <title> + <title> + true + eng-US + true + PATH + ASC + + + title + ezstring + content + 1 + true + true + false + New Title + true + + Title + + + This is the title + + + + summary + ezxmltext + content + 2 + true + false + false + + true + + Summary + + + This is the summary + + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/types/32/draft + Accept-Patch: application/vnd.ez.api.ContentTypeUpdate+(json|xml) + ETag: "45674567543546" + Content-Type: application/vnd.ez.api.ContentType+xml + Content-Length: xxx + +.. code:: xml + + + + 32 + DRAFT + newContentType + + New Content Type + + + This is a description + + 2001-01-01T16:37:00 + 2001-01-01T16:37:00 + + + remoteId-qwert548 + <title> + <title> + true + eng-US + true + PATH + ASC + + + 34 + title + ezstring + content + 1 + true + true + false + New Title + true + + Title + + + This is the title + + + + 36 + summary + ezxmltext + content + 2 + true + false + false + + true + + Summary + + + This is the summary + + + + + + + +Copy Content Type +````````````````` +:Resource: /content/types/ +:Method: COPY or POST with header: X-HTTP-Method-Override COPY +:Description: copies a content type. The identifier of the copy is changed to copy_of_ anda new remoteIdis generated. +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/types/ + + +:Error Codes: + :401: If the user is not authorized to copy this content type + +List Content Types +`````````````````` +:Resource: /content/types +:Method: GET +:Description: Returns a list of content types +:Parameters: + :identifier: retrieves the content type for the given identifer + :remoteId: retieves the content type for the given remoteId + :limit: only items will be returned started by offset + :offset: offset of the result set + :orderby: one of (name | lastmodified) + :sort: one of (asc|desc) +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeInfoList+xml: if set the list of content type info objects is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeInfoList+json: if set the list of content type info objects is returned in json format (see ContentType_) + :application/vnd.ez.api.ContentTypeList+xml: if set the list of content type objects (including field definitions) is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeList+json: if set the list content type objects (including field definitions) is returned in json format (see ContentType_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:Error Codes: + :401: If the user has no permission to read the content types + +Get Content Type +```````````````` +:Resource: /content/types/ +:Method: GET +:Description: Returns the content type given by id +:Headers: + :Accept: + :application/vnd.ez.api.ContentType+xml: if set the list is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentType+json: if set the list is returned in json format (see ContentType_) + :If-None-Match: + +:Response: + +.. code:: http + + HTTP/1.1 200 OK + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:ErrorCodes: + :401: If the user is not authorized to read this content type + :404: If the content type does not exist + + +Create Draft +```````````` +:Resource: /content/types/ +:Method: POST +:Description: Cretes a draft and updates it with the given data +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeInfo+xml: if set the new content type draft is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeInfo+json: if set the new content type draft is returned in json format (see ContentType_) + :Content-Type: + :application/vnd.ez.api.ContentTypeUpdate+json: the ContentTypeUpdate_ schema encoded in json + :application/vnd.ez.api.ContentTypeUpdate+xml: the ContentTypeUpdate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/types//draft + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create the draft + :403: - If a content type with the given new identifier already exists. + - If there exists already a draft. + + + +Update Draft +```````````` +:Resource: /content/types//draft +:Method: PATCH or POST with header: X-HTTP-Method-Override: PATCH +:Description: Updates meta data of a draft. This method does not handle field definitions +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeInfo+xml: if set the new content type draft is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeInfo+json: if set the new content type draft is returned in json format (see ContentType_) + :Content-Type: + :application/vnd.ez.api.ContentTypeUpdate+json: the ContentTypeUpdate_ schema encoded in json + :application/vnd.ez.api.ContentTypeUpdate+xml: the ContentTypeUpdate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update the draft. + :403: If a content type with the given new identifier already exists. + :404: If there is no draft on this content type + +XML Example +''''''''''' + +.. code:: http + + POST /content/types/32/draft HTTP/1.1 + X-HTTP-Method-Override: PATCH + Accept: application/vnd.ez.api.ContentTypeInfo+xml + Content-Type: application/vnd.ez.api.ContentTypeUpdate+xml + Content-Length: xxx + +.. code:: xml + + + + + Neuer Content Typ + + + Das ist ein neuer Content Typ + + + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.ContentTypeInfo+xml + Content-Length: xxx + +.. code:: xml + + + + 32 + DRAFT + newContentType + + New Content Type + Neuer Content Typ + + + This is a description + Das ist ein neuer Content Typ + + 2001-01-01T16:37:00 + 2001-01-01T16:37:00 + + + remoteId-qwert548 + <title> + <title> + true + eng-US + true + PATH + ASC + + +Add Field definition +```````````````````` +:Resource: /content/types//draft/fielddefinitions +:Method: POST +:Description: Creates a new field definition for the given content type +:Headers: + :Accept: + :application/vnd.ez.api.FieldDefinition+xml: if set the new fielddefinition is returned in xml format (see FieldDefinition_) + :application/vnd.ez.api.FieldDefinition+json: if set the new fielddefinition is returned in json format (see FieldDefinition_) + :Content-Type: + :application/vnd.ez.api.FieldDefinitionCreate+json: the FieldDefinitionCreate_ schema encoded in json + :application/vnd.ez.api.FieldDefinitionCreate+xml: the FieldDefinitionCreate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /content/types//draft/fielddefinitions/ + Accept-Patch: application/vnd.ez.api.FieldDefinitionUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + FieldDefinition_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to add a field definition + :403: If a field definition with same identifier already exists in the given content type + +Get Fielddefinition +``````````````````` +:Resource: /content/types//draft/fielddefinitions/ +:Method: GET +:Description: Returns the field definition given by id +:Headers: + :Accept: + :application/vnd.ez.api.FieldDefinition+xml: if set the new fielddefinition is returned in xml format (see FieldDefinition_) + :application/vnd.ez.api.FieldDefinition+json: if set the new fielddefinition is returned in json format (see FieldDefinition_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.FieldDefinitionUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + FieldDefinition_ + +:ErrorCodes: + :401: If the user is not authorized to read the content type draft + :404: If the content type or draft does not exist + +Update Fielddefinition +`````````````````````` +:Resource: /content/types//draft/fielddefinitions/ +:Method: PUT +:Description: Updates the attributes of a field definitions +:Headers: + :Accept: + :application/vnd.ez.api.FieldDefinition+xml: if set the new fielddefinition is returned in xml format (see FieldDefinition_) + :application/vnd.ez.api.FieldDefinition+json: if set the new fielddefinition is returned in json format (see FieldDefinition_) + :Content-Type: + :application/vnd.ez.api.FieldDefinitionUpdate+json: the FieldDefinitionUpdate_ schema encoded in json + :application/vnd.ez.api.FieldDefinitionUpdate+xml: the FieldDefinitionUpdate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.FieldDefinitionUpdate+(json|xml) + Content-Type: + Content-Length: +.. parsed-literal:: + FieldDefinition_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update the field definition + :403: If a field definition with the given new identifier already exists in the given content type. + +Delete Fielddefinition +`````````````````````` +:Resource: /content/types//draft/fielddefinitions/ +:Method: DELETE +:Description: the given field definition is deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this content type + :403: - if there is no draft of the content type assigned to the authenticated user + +Publish content type +```````````````````` +:Resource: /content/types//draft +:Method: PUBLISH or POST with header: X-HTTP-Method-Override: PUBLISH +:Description: Publishes a content type draft +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentType_ + +:Error Codes: + :401: If the user is not authorized to publish this content type draft + :403: If the content type draft is not complete e.g. there is no field definition provided + :404: If there is no draft or content type with the given ID + +Delete Content Type Draft +````````````````````````` +:Resource: /content/types//draft +:Method: DELETE +:Description: the given content type draft is deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this content type draft + :404: If the content type/draft does not exist + + +Delete Content Type +``````````````````` +:Resource: /content/types/ +:Method: DELETE +:Description: the given content type is deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this content type + :403: If there are object instances of this content type - the response should contain an ErrorMessage_ + :404: If the content type does not exist + + +Get Groups of Content Type +`````````````````````````` +:Resource: /content/type//groups +:Method: GET +:Description: Returns the content type groups the content type belongs to. +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroupRefList+xml: if set the list is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeGroupRefList+json: if set the list is returned in json format (see ContentType_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ + +:ErrorCodes: + :401: If the user is not authorized to read this content type + :404: If the content type does not exist + +XML Example +''''''''''' + +.. code:: http + + GET /content/types/32/groups HTTP/1.1 + Accept: application/vnd.ez.api.ContentTypeGroupRefList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.ContentTypeGroupRefList+xml + Gontent-Length: xxx + +.. code:: xml + + + + + +Link Group to Content Type +`````````````````````````` +:Resource: /content/types//groups +:Method: POST +:Description: links a content type group to the content type and returns the updated group list +:Parameters: + :group: (uri) the uri of the group to which the content type should be linked +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroupRefList+xml: if set the list is returned in xml format (see ContentTypeGroup_) + :application/vnd.ez.api.ContentTypeGroupRefList+json: if set the list is returned in json format (see ContentTypeGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to add a group + :403: If the content type is already assigned to the group + +XML Example +''''''''''' + +.. code:: http + + POST /content/types/32/groups?/content/typegroups/10 + Accept: application/vnd.ez.api.ContentTypeGroupRefList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.ContentTypeGroupRefList+xml + Gontent-Length: xxx + +.. code:: xml + + + + + + + + + + + +Unlink Group from Content Type +`````````````````````````````` +:Resource: /content/type//groups/ +:Method: DELETE +:Description: removes the given group from the content type and returns the updated group list +:Headers: + :Accept: + :application/vnd.ez.api.ContentTypeGroupRefList+xml: if set the list is returned in xml format (see ContentType_) + :application/vnd.ez.api.ContentTypeGroupRefList+json: if set the list is returned in json format (see ContentType_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + ContentTypeGroup_ + +:Error Codes: + :401: If the user is not authorized to delete this content type + :403: If the given group is the last one + :404: If the resource does not exist + +XML Example +''''''''''' + +.. code:: http + + DELETE /content/types/32/groups/7 + Accept: application/vnd.ez.api.ContentTypeGroupRefList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.ContentTypeGroupRefList+xml + Gontent-Length: xxx + +.. code:: xml + + + + + + +User Management +=============== + +Overview +-------- + +============================================= ===================== ===================== ===================== ======================= +Resource POST GET PUT DELETE +--------------------------------------------- --------------------- --------------------- --------------------- ----------------------- +/user/groups . load all topl. groups . . +/user/groups/root . redirect to root . . +/user/groups/ . load user group update user group delete user group +/user/groups//users . load users of group . . +/user/groups//subgroups create user group load sub groups . remove all sub groups +/user/groups//roles assign role to group load roles of group . . +/user/groups//roles/ . . . unassign role from group +/user/users create user list users . . +/user/users/ . load user update user delete user +/user/users//groups . load groups of user add to group . +/user/users//drafts . list all drafts owned . . + by the user +/user/users//roles assign role to user load roles of group . . +/user/users//roles/ . load roleassignment . unassign role from user +/user/roles create new role load all roles . . +/user/roles/ . load role update role delete role +/user/roles//policies create policy load policies . delete all policies from role +/user/roles//policies/ . load policy update policy delete policy +============================================= ===================== ===================== ===================== ======================= + + +Managing Users and Groups +~~~~~~~~~~~~~~~~~~~~~~~~~ + +Get Root User Group +``````````````````` +:Resource: /user/groups/root +:Method: GET +:Description: Redirects to the root user group +:Response: + +.. code:: http + + HTTP/1.1 301 Moved Permanently + Location: /user/groups/ + +Example see UserGroupExample_ + +Load User Group +``````````````` +:Resource: /user/groups/ +:Method: GET +:Description: loads a user groups for the given +:Headers: + :Accept: + :application/vnd.ez.api.UserGroup+xml: if set the new user group is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroup+json: if set the new user group is returned in json format (see UserGroup_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.UserGroupUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :401: If the user has no permission to read user groups + :404: If the user group does not exist + +Example see UserGroupExample_ + +Load User Groups +```````````````` +:Resource: /user/groups +:Method: GET +:Description: Load user groups for either an id or remoteId or role. +:Parameters: + :roleId: lists user groups assigned to the given role + :id: retieves the user group for the given Id + :remoteId: retieves the user group for the given remoteId +:Headers: + :Accept: + :application/vnd.ez.api.UserGroupList+xml: if set the user group list returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupList+json: if set the user group list is returned in json format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+xml: if set the link list of user groups is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+json: if set the link list of user groups is returned in json format (see UserGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :401: If the user has no permission to read user groups + + +Create User Group +````````````````` +:Resource: /user/groups//subgroups +:Method: POST +:Description: Creates a new user group under the given parent. To create a top level group use /user/groups/subgroups +:Headers: + :Accept: + :application/vnd.ez.api.UserGroup+xml: if set the new user group is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroup+json: if set the new user group is returned in json format (see UserGroup_) + :Content-Type: + :application/vnd.ez.api.UserGroupCreate+json: the UserGroupCreate_ schema encoded in json + :application/vnd.ez.api.UserGroupCreate+xml: the UserGroupCreate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/groups/ + Accept-Patch: application/vnd.ez.api.UserGroupUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this user group + + +.. _UserGroupExample: + + +XML Example +''''''''''' + +Creating a top level group + +.. code:: http + + GET /user/groups/1/5 HTTP/1.1 + Accept: application/vnd.ez.api.UserGroup+xml + +.. code:: xml + + + + + Users + +
+ + + + 2011-02-31T16:00:00 + 2011-02-31T16:00:00 + eng-UK + true + + + 22 + 1 + PUBLISHED + 2011-02-31T16:00:00 + + 2011-02-31T16:00:00 + eng-UK + + + + + 1234 + name + eng-UK + Users + + + 1235 + description + eng-UK + Main Group + + + + + + + + + +.. code:: http + + POST /user/groups/1/5/subgroups HTTP/1.1 + Accept: application/vnd.ez.api.UserGroup+xml + Content-Type: application/vnd.ez.api.UserGroupCreate+xml + Content-Length: xxx + +.. code:: xml + + + + eng-US + remoteId-qwert098 + + + name + eng-US + UserGroup + + + description + eng-US + This is the description of the user group + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/groups/1/5/65 + Accept-Patch: application/vnd.ez.api.UserGroupUpdate+(json|xml) + ETag: "348506873565465" + Content-Type: application/vnd.ez.api.UserGroup+xml + Content-Length: xxx + +.. code:: xml + + + + + UserGroup + +
+ + + + 2012-02-31T16:00:00 + 2012-02-31T16:00:00 + eng-UK + true + + + 123 + 2 + PUBLISHED + 2012-02-31T16:00:00 + + 2012-02-31T16:00:00 + eng-UK + + + + + 1234 + name + eng-UK + UserGroup + + + 1235 + description + eng-UK + This is the description of the user group + + + + + + + + + + + + + +Update User Group +````````````````` +:Resource: /user/groups/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates a user group +:Headers: + :Accept: + :application/vnd.ez.api.UserGroup+xml: if set the new user group is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroup+json: if set the new user group is returned in json format (see UserGroup_) + :Content-Type: + :application/vnd.ez.api.UserGroupUpdate+json: the UserGroupUpdate_ schema encoded in json + :application/vnd.ez.api.UserGroupUpdate+xml: the UserGroupUpdate_ schema encoded in xml + :If-Match: Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned. +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.UserGroupUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update the user group + :412: If the current ETag does not match with the provided one in the If-Match header + + +XML Example +''''''''''' + +.. code:: http + + POST /user/groups/1/5/65 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Accept: application/vnd.ez.api.UserGroup+xml + If-Match: "348506873463455" + Content-Type: application/vnd.ez.api.UserGroupUpdate+xml + Content-Length: xxx + +.. code:: xml + + + + + + description + eng-US + This is another description + + + + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.UserGroupUpdate+(json|xml) + ETag: "348506873465777" + Content-Type: application/vnd.ez.api.UserGroup+xml + Content-Length: xxx + +.. code:: xml + + + + + UserGroup + +
+ + + + 2012-02-31T16:00:00 + 2012-02-31T16:00:00 + eng-UK + true + + + 125 + 3 + PUBLISHED + 2012-03-31T16:00:00 + + 2012-03-31T16:00:00 + eng-UK + + + + + 1234 + name + eng-UK + UserGroup + + + 1235 + description + eng-UK + This is another description of the user group + + + + + + + + + + + +Delete User Group +````````````````` +:Resource: /user/groups/ +:Method: DELETE +:Description: the given user group is deleted +:Response: + +.. code:: xml + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this content type + :403: If the user group is not empty + +Load Users of Group +``````````````````` +:Resource: /user/groups//users +:Method: GET +:Description: loads the users of the group with the given +:Headers: + :Accept: + :application/vnd.ez.api.UserList+xml: if set the user list returned in xml format (see User_) + :application/vnd.ez.api.UserList+json: if set the user list is returned in json format (see User_) + :application/vnd.ez.api.UserRefList+xml: if set the link list of users returned in xml format (see User_) + :application/vnd.ez.api.UserRefList+json: if set the link list of users is returned in json format (see User_) +:Parameters: :limit: only items will be returned started by offset + :offset: offset of the result set +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + User_ + +:Error Codes: + :401: If the user has no permission to read user groups + :404: If the user group does not exist + + +Move user Group +``````````````` +:Resource: /user/groups/ +:Method: MOVE or POST with header X-HTTP-Method-Override: MOVE +:Description: moves the user group to another parent. +:Headers: + :Destination: A parent group resource to which the location is moved +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/groups/ + +:Error Codes: + :401: If the user is not authorized to update the user group + :403: If the new parenbt does not exist + :404: If the user group does not exist + +Load Subgroups +`````````````` +:Resource: /user/groups//subgroups +:Method: GET +:Description: Returns a list of the sub groups +:Headers: + :Accept: + :application/vnd.ez.api.UserGroupList+xml: if set the user group list returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupList+json: if set the user group list is returned in json format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+xml: if set the link list of user groups is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+json: if set the link list of user groups is returned in json format (see UserGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + + +:Error Codes: + :401: If the user has no permission to read user groups + :404: If the user group does not exist + +Create User +``````````` +:Resource: /user/groups//users +:Method: POST +:Description: Creates a new user in the given group +:Headers: + :Accept: + :application/vnd.ez.api.User+xml: if set the new user is returned in xml format (see User_) + :application/vnd.ez.api.User+json: if set the new user is returned in json format (see User_) + :Content-Type: + :application/vnd.ez.api.UserCreate+json: the UserCreate_ schema encoded in json + :application/vnd.ez.api.UserCreate+xml: the UserCreate_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/users/ + Accept-Patch: application/vnd.ez.api.UserUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + User_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this user + :403: If a user with the same login already exists + :404: If the group with the given ID does not exist + +XML Example +''''''''''' + +.. code:: http + + POST /user/groups/1/5/65/users HTTP/1.1 + Accept: application/vnd.ez.api.User+xml + Content-Type: application/vnd.ez.api.UserCreate+xml + Content-Length: xxx + +.. code:: xml + + + + eng-US + remoteId-qwert426 + john + john.doe@example.net + john-does-password + + + first_name + eng-US + John + + + last_name + eng-US + Doe + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/users/99 + Accept-Patch: application/vnd.ez.api.UserUpdate+xml + ETag: "34567340896734095867" + Content-Type: application/vnd.ez.api.User+xml + Content-Length: xxx + +.. code:: xml + + + + + John + +
+ + + + 2001-04-01T12:00:00 + 2001-04-01T12:00:00 + eng-US + true + john + john.doe@example.net + true + + + 1243 + 1 + PUBLISHED + 2001-04-01T12:00:00 + + 2001-04-01T12:00:00 + eng-UK + + + + + first_name + eng-US + John + + + last_name + eng-US + Doe + + + + + + + + +List Users +`````````` +:Resource: /user/users +:Method: GET +:Description: Load users either for a given remoteId or role +:Parameters: + :roleId: lists users assigned to the given role + :remoteId: retieves the user for the given remoteId +:Headers: + :Accept: + :application/vnd.ez.api.UserList+xml: if set the user list returned in xml format (see User_) + :application/vnd.ez.api.UserList+json: if set the user list is returned in json format (see User_) + :application/vnd.ez.api.UserRefList+xml: if set the link list of users returned in xml format (see User_) + :application/vnd.ez.api.UserRefList+json: if set the link list of users is returned in json format (see User_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + User_ + +:Error Codes: + :401: If the user has no permission to read users + +Load User +````````` +:Resource: /user/users/ +:Method: GET +:Description: loads the users of the group with the given +:Headers: + :Accept: + :application/vnd.ez.api.User+xml: if set the new user is returned in xml format (see User_) + :application/vnd.ez.api.User+json: if set the new user is returned in json format (see User_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Location: /user/users/ + Accept-Patch: application/vnd.ez.api.UserUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + User_ + +:Error Codes: + :401: If the user has no permission to read users + :404: If the user does not exist + +Update User +``````````` +:Resource: /user/users/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates a user +:Headers: + :Accept: + :application/vnd.ez.api.User+xml: if set the new user is returned in xml format (see User_) + :application/vnd.ez.api.User+json: if set the new user is returned in json format (see User_) + :Content-Type: + :application/vnd.ez.api.UserUpdate+json: the UserUpdate_ schema encoded in json + :application/vnd.ez.api.UserUpdate+xml: the UserUpdate_ schema encoded in xml + :If-Match: Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned. +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.UserUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + User_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update the user + :404: If the user does not exist + :412: If the current ETag does not match with the provided one in the If-Match header + +XML Example +''''''''''' + +.. code:: http + + POST /user/users/99 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Accept: application/vnd.ez.api.User+xml + Content-Type: application/vnd.ez.api.UserUpdate+xml + Content-Length: xxx + +.. code:: xml + + + + john.doe@mooglemail.com + + + signature + eng-US + + John Doe + Example Systems + john.doe@mooglemail.com + skype: johndoe + + + + + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.UserUpdate+(json|xml) + ETag: "435908672409561" + Content-Type: application/vnd.ez.api.User+xml + Content-Length: xxx + +.. code:: xml + + + + + John + +
+ + + + 2001-04-01T12:00:00 + 2001-04-01T12:00:00 + eng-US + true + john + john.doe@mooglemail.com + true + + + 1243 + 1 + PUBLISHED + 2001-04-01T12:00:00 + + 2001-04-01T12:00:00 + eng-UK + + + + + first_name + eng-US + John + + + last_name + eng-US + Doe + + + + signature + eng-US + + John Doe + Example Systems + john.doe@mooglemail.com + skype: johndoe + + + + + + + + +Delete User +``````````` +:Resource: /user/users/ +:Method: DELETE +:Description: the given user is deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this user + :403: If the user is the same as the authenticated user + :404: If the user does not exist + +Load Groups Of User +``````````````````` +:Resource: /user/users//groups +:Method: GET +:Description: Returns a list of user groups the user belongs to. The returned list includes the resources for unassigning a user group if the user is in multiple groups. +:Headers: + :Accept: + :application/vnd.ez.api.UserGroupRefList+xml: if set the link list of user groups is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+json: if set the link list of user groups is returned in json format (see UserGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :401: If the user has no permission to read user groups + :404: If the user does not exist + +XML Example +''''''''''' + +.. code:: http + + GET /user/users/45/groups HTTP/1.1 + Accept: application/vnd.ez.api.UserGroupRefList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.UserGroupRefList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + +Assign User Group +````````````````` +:Resource: /user/users//groups +:Method: POST +:Description: Assigns the user to a user group +:Parameters: :group: the new parent group resource of the user +:Headers: + :Accept: + :application/vnd.ez.api.UserGroupRefList+xml: if set the link list of user groups is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+json: if set the link list of user groups is returned in json format (see UserGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :401: If the user is not authorized to assign user groups + :403: - If the new user group does not exist + - If the user is already in this group + :404: If the user does not exist + +XML Example +''''''''''' + +.. code:: http + + POST /user/users/45/groups?/user/groups/1/5/88 HTTP/1.1 + Accept: application/vnd.ez.api.UserGroupRefList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.UserGroupRefList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + + + +Unassign User Group +``````````````````` +:Resource: /user/users//groups/ +:Method: DELETE +:Description: Unassigns the user from a user group +:Headers: + :Accept: + :application/vnd.ez.api.UserGroupRefList+xml: if set the link list of user groups is returned in xml format (see UserGroup_) + :application/vnd.ez.api.UserGroupRefList+json: if set the link list of user groups is returned in json format (see UserGroup_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + UserGroup_ + +:Error Codes: + :401: If the user is not authorized to unassign user groups + :403: If the user is not in the given group + :404: If the user does not exist + +XML Example +''''''''''' + +.. code:: http + + DELETE /user/users/45/groups/78 HTTP/1.1 + Accept: application/vnd.ez.api.UserGroupRefList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.UserGroupRefList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + +Managing Roles and Policies +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Create Role +``````````` +:Resource: /user/roles +:Method: POST +:Description: Creates a new role +:Headers: + :Accept: + :application/vnd.ez.api.Role+xml: if set the new user is returned in xml format (see Role_) + :application/vnd.ez.api.Role+json: if set the new user is returned in json format (see Role_) + :Content-Type: + :application/vnd.ez.api.RoleInput+json: the RoleInput_ schema encoded in json + :application/vnd.ez.api.RoleInput+xml: the RoleInput_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/roles/ + Accept-Patch: application/vnd.ez.api.RoleUpdate+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Role_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create this role + +XML Example +''''''''''' + +.. code:: http + + POST /user/roles HTTP/1.1 + Accept: application/vnd.ez.api.Role+xml + Content-Type: application/vnd.ez.api.RoleInput+xml + Content-Length: xxx + +.. code:: xml + + + + NewRole + + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/roles/11 + Accept-Patch: application/vnd.ez.api.RoleUpdate+xml + ETag: "465897639450694836" + Content-Type: application/vnd.ez.api.Role+xml + Content-Length: xxx + +.. code:: xml + + + + NewRole + + + + + +Load Roles +`````````` +:Resource: /user/roles +:Method: GET +:Description: Returns a list of all roles +:Parameters: + :identifier: Restricts the result to a list containing the role with the given identifier. If the role is not found an empty list is returned. + :limit: only items will be returned started by offset + :offset: offset of the result set +:Headers: + :Accept: + :application/vnd.ez.api.RoleList+xml: if set the user list returned in xml format (see Role_) + :application/vnd.ez.api.RoleList+json: if set the user list is returned in json format (see Role_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: + ETag: "" +.. parsed-literal:: + Role_ + +:Error Codes: + :401: If the user has no permission to read roles + +Load Role +````````` +:Resource: /user/roles/ +:Method: GET +:Description: loads a role for the given +:Headers: + :Accept: + :application/vnd.ez.api.Role+xml: if set the user list returned in xml format (see Role_) + :application/vnd.ez.api.Role+json: if set the user list is returned in json format (see Role_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.RoleInput+(json|xml) + ETag: "" + Content-Type: + Content-Length: + +.. parsed-literal:: + Role_ + +:Error Codes: + :401: If the user has no permission to read roles + :404: If the role does not exist + +Update Role +``````````` +:Resource: /user/roles/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: Updates a role +:Headers: + :Accept: + :application/vnd.ez.api.Role+xml: if set the new user is returned in xml format (see Role_) + :application/vnd.ez.api.Role+json: if set the new user is returned in json format (see Role_) + :Content-Type: + :application/vnd.ez.api.RoleInput+json: the RoleInput schema encoded in json + :application/vnd.ez.api.RoleInput+xml: the RoleInput schema encoded in xml + :If-Match: Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned. +:Response: + +.. code:: xml + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.RoleInput+(json|xml) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Role_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update the role + :412: If the current ETag does not match with the provided one in the If-Match header + +Delete Role +``````````` +:Resource: /user/roles/ +:Method: DELETE +:Description: the given role and all assignments to users or user groups are deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this role + +Load Roles for User or User Group +````````````````````````````````` +:Resource: - /user/groups//roles for user group + - /user/users//roles for user +:Method: GET +:Description: Returns a list of all roles assigned to the given user group +:Headers: + :Accept: + :application/vnd.ez.api.RoleAssignmentList+xml: if set the role assignment list is returned in xml format (see Role_) + :application/vnd.ez.api.RoleAssignmentList+json: if set the role assignment list is returned in json format (see Role_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Role_ + +:Error Codes: + :401: If the user has no permission to read roles + +XML Example +''''''''''' + +.. code:: http + + GET /user/groups/1/5/65/roles HTTP/1.1 + Accept: application/vnd.ez.api.RoleAssignmentList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.RoleAssignmentList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + + + + + +Load Assignment +``````````````` +:Resource: - /user/groups//roles/ for user group + - /user/users//roles/ for user +:Method: GET +:Description: Returns a roleassignment to the given user or user group +:Headers: + :Accept: + :application/vnd.ez.api.RoleAssignment+xml: if set the role assignment list is returned in xml format (see Role_) + :application/vnd.ez.api.RoleAssignment+json: if set the role assignment list is returned in json format (see Role_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Role_ + +:Error Codes: + :401: If the user has no permission to read roles + + + +Assign Role to User or User Group +````````````````````````````````` +:Resource: - /user/groups//roles for user group + - /user/users//roles for user +:Method: POST +:Description: assign a role to a user or user group. +:Headers: + :Accept: + :application/vnd.ez.api.RoleAssignmentList+xml: if set the updated role assignment list is returned in xml format (see Role_) + :application/vnd.ez.api.RoleAssignmentList+json: if set the updated role assignment list is returned in json format (see Role_) + :Content-Type: + :application/vnd.ez.api.RoleAssignInput+json: the RoleAssignInput_ schema encoded in json + :application/vnd.ez.api.RoleAssignInput+xml: the RoleAssignInput_ schema encoded in xml +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Role_ + +:Error Codes: + :401: If the user is not authorized to assign this role + +XML Example +''''''''''' + +.. code:: http + + POST /user/groups/1/5/65/roles HTTP/1.1 + Accept: application/vnd.ez.api.RoleAssignmentList+xml + Content-Type: application/vnd.ez.api.RoleAssignInput+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.RoleAssignmentList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Unassign Role from User or User Group +`````````````````````````````````````` +:Resource: - /user/groups//roles/ for user group + - /user/users//roles/ for user +:Method: DELETE +:Description: the given role is removed from the user or user group +:Headers: + :Accept: + :application/vnd.ez.api.RoleAssignmentList+xml: if set the updated role assignment list is returned in xml format (see Role_) + :application/vnd.ez.api.RoleAssignmentList+json: if set the updated role assignment list is returned in json format (see Role_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Role_ + +:Error Codes: + :401: If the user is not authorized to delete this content type + +XML Example +''''''''''' + +.. code:: http + + DELETE /user/groups/1/5/65/roles/7 HTTP/1.1 + Accept: application/vnd.ez.api.RoleAssignmentList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.RoleAssignmentList+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + + + + + + + +Load Policies +````````````` +:Resource: /user/roles//policies +:Method: GET +:Description: loads policies for the given role +:Headers: + :Accept: + :application/vnd.ez.api.PolicyList+xml: if set the policy list is returned in xml format (see Policy_) + :application/vnd.ez.api.PolicyList+json: if set the policy list is returned in json format (see Policy_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Policy_ + + +:Error Codes: + :401: If the user has no permission to read roles + :404: If the role does not exist + + +XML Example +''''''''''' + +.. code:: http + + GET /user/roles/7/policies HTTP/1.1 + Accept: application/vnd.ez.api.PolicyList+xml + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: application/vnd.ez.api.PolicyList+xml + Content-Length: xxx + +.. code:: xml + + + + + 45 + content + create + + + + + + + + + + + + + + + + + 49 + content + read + + + + + + + + + + + + + +Delete Policies +``````````````` +:Resource: /user/roles//policies +:Method: DELETE +:Description: all policies of the given role are deleted +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Error Codes: + :401: If the user is not authorized to delete this content type + +Load Policy +``````````` +:Resource: /user/roles//policies/ +:Method: GET +:Description: loads a policy for the given module and function +:Headers: + :Accept: + :application/vnd.ez.api.Policy+xml: if set the policy is returned in xml format (see Policy_) + :application/vnd.ez.api.Policy+json: if set the policy is returned in json format (see Policy_) + :If-None-Match: +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Policy_ + +:Error Codes: + :401: If the user has no permission to read roles + :404: If the role or policy does not exist + + +XML Example +''''''''''' + +.. code:: http + + GET /user/roles/7/policies/45 HTTP/1.1 + Accept: application/vnd.ez.api.Policy+xml + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json) + ETag: "697850469873045967" + Content-Type: application/vnd.ez.api.Policy+xml + Content-Length: xxx + +.. code:: xml + + + 45 + content + create + + + + + + + + + + + + + + + + + + +Create Policy +````````````` +:Resource: /user/roles//policies/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: updates a policy +:Headers: + :Accept: + :application/vnd.ez.api.Policy+xml: if set the updated policy is returned in xml format (see Policy_) + :application/vnd.ez.api.Policy+json: if set the updated policy is returned in json format (see Policy_) + :Content-Type: + :application/vnd.ez.api.PolicyCreate+xml: if set the updated policy is returned in xml format (see Policy_) + :application/vnd.ez.api.PolicyCreate+json: if set the updated policy is returned in json format (see Policy_) + +:Response: + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/roles//policies/ + Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Policy_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to create the policy + :404: If the role does not exist + + +XML Example +''''''''''' + +.. code:: http + + POST /user/roles/7/policies HTTP/1.1 + Content-Type: application/vnd.ez.api.PolicyCreate+xml + Content-Length: xxx + +.. code:: xml + + + + content + create + + + + + + + + + + + + + + +.. code:: http + + HTTP/1.1 201 Created + Location: /user/roles/7/policies/55 + Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json) + ETag: "697850469873043234234" + Content-Type: application/vnd.ez.api.Policy+xml + Content-Length: xxx + +.. code:: xml + + + 55 + content + create + + + + + + + + + + + + + + + +Update Policy +````````````` +:Resource: /user/roles//policies/ +:Method: PATCH or POST with header X-HTTP-Method-Override: PATCH +:Description: updates a policy +:Headers: + :Accept: + :application/vnd.ez.api.Policy+xml: if set the updated policy is returned in xml format (see Policy_) + :application/vnd.ez.api.Policy+json: if set the updated policy is returned in json format (see Policy_) + :Content-Type: + :application/vnd.ez.api.PolicyUpdate+xml: if set the updated policy is returned in xml format (see Policy_) + :application/vnd.ez.api.PolicyUpdate+json: if set the updated policy is returned in json format (see Policy_) + :If-Match: Causes to patch only if the specified etag is the current one. Otherwise a 412 is returned. +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json) + ETag: "" + Content-Type: + Content-Length: +.. parsed-literal:: + Policy_ + +:Error Codes: + :400: If the Input does not match the input schema definition, In this case the response contains an ErrorMessage_ + :401: If the user is not authorized to update the policy + :404: If the role does not exist + :412: If the current ETag does not match with the provided one in the If-Match header + +XML Example +''''''''''' + +.. code:: http + + POST /user/roles/7/policies/55 HTTP/1.1 + X-HTTP-Method-Override: PATCH + Accept: application/vnd.ez.api.Policy+xml + If-Match: "697850469873043236666" + Content-Type: application/vnd.ez.api.PolicyUpdate+xml + Content-Length: xxx + +.. code:: xml + + + + + + + + + + + + + + + + + +.. code:: http + + HTTP/1.1 200 OK + Accept-Patch: application/vnd.ez.api.PolicyUpdate+(xml|json) + ETag: "697850469873043234234" + Content-Type: application/vnd.ez.api.Policy+xml + Content-Length: xxx + +.. code:: xml + + + 55 + content + create + + + + + + + + + + + + + + + +Delete Policy +````````````` +:Resource: /user/roles//policies/ +:Method: DELETE +:Response: + +.. code:: http + + HTTP/1.1 204 No Content + +:Description: the given policy is deleted +:Error Codes: + :401: If the user is not authorized to delete this content type + :404: If the role or policy does not exist + + +List Policies for user +`````````````````````` +:Resource: /user/policies +:Method: GET +:Description: search all policies which are applied to a given user +:Parameters: + :userId: the user id +:Headers: + :Accept: + :application/vnd.ez.api.PolicyList+xml: if set the policy list is returned in xml format (see Policy_) + :application/vnd.ez.api.PolicyList+json: if set the policy list is returned in json format (see Policy_) +:Response: + +.. code:: http + + HTTP/1.1 200 OK + Content-Type: + Content-Length: +.. parsed-literal:: + Policy_ + + +:Error Codes: + :401: If the user has no permission to read roles + + +.. _InputOutput: + +Input Output Specification +========================== + +.. _Common: + +Common Definitions +------------------ + +Common definition which are used from multiple schema definitions + +.. code:: xml + + + + + + + A base schema for referencing resources. + + + + + + + + + + + + + + + + A base schema for referencing controllers and + methods + + + + + + + + + + + + + + + + + + + + + + + Schema for field inputs in content create and + update structures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Root: + +Root Resources +-------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + +.. _Content: + +Content XML Schema +------------------ + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Relation: +.. _RelationList: +.. _RelationCreate: + +Relation XML Schema +------------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Version: + +Version XML Schema +------------------ + +VersionInfo +~~~~~~~~~~~ + +.. code:: xml + + + + + + + + + + The version id. + + + + + + + The version number. + This is the version + number, which only + increments in scope of a single Content + object. + + + + + + + + The date of the last modification of this + version + + + + + + + The user which has created this version + + + + + + + The date this version was created + + + + + + + In 4.x this is the language code which is + used for labeling a + translation. + + + + + + + List of languages in this version + Reflects + which languages fields exists in for this version. + + + + + + + + + + + + +Version +~~~~~~~ + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _VersionList: + +VersionList XML Schema +---------------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + +.. _VersionUpdate: + +VersionUpdate XML Schema +------------------------ + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + +.. _ContentCreate: + +ContentCreate XML Schema +------------------------ + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _ContentUpdate: + +ContentUpdate XML Schema +------------------------ + +.. code:: xml + + + + + + + + + + + + + + + + + + + + +.. _View: + +View XML Schema +--------------- + + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The identifier of the field i.e identifier + of the corresponding field + definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _LocationCreate: + +LocationCreate XML Schema +------------------------- + +.. code:: xml + + + + + + + + + + + The parent location where the new location + is created + + + + + + + Location priority + Position of the + Location + among its siblings when sorted using priority + sort order. + + + + + + + Indicates that the Location entity has + been + explicitly marked as hidden. + + + + + + + + + + + + + +.. _LocationUpdate: + +LocationUpdate XML Schema +------------------------- + +.. code:: xml + + + + + + + + + + + If set the location priority is changed to the given value + + + + + + + If set to true the location is hidden, if set to false the location is unhidden. + + + + + + + + + + + + + + +.. _Location: + +Location XML Schema +------------------- + + +.. code:: xml + + + + + + + + + + + + + Location ID. + + + + + + + Location priority + Position of the + Location among its siblings when sorted using priority + sort order. + + + + + + + Indicates that the Location entity has + been explicitly marked as hidden. + + + + + + + Indicates that the Location is + implicitly marked as hidden by a parent + location. + + + + + + + The parent location + + + + + + + The materialized path of the location + entry, eg: /1/2/ + + + + + + + Depth location has in the location + tree. + + + + + + + the number of chidren visible to the + authenticated user which has + loaded this instance. + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Trash: + +Trash XML Schema +---------------- + + +.. code:: xml + + + + + + + + + + + + + + Location ID. + + + + + + + Location priority + Position of the + Location among its siblings when sorted using priority + sort order. + + + + + + + Indicates that the Location entity has + been explicitly marked as hidden. + + + + + + + Indicates that the Location is + implicitly marked as hidden by a parent + location. + + + + + + + The parent location + + + + + + + The materialized path of the location + entry, eg: /1/2/ + + + + + + + Depth location has in the location + tree. + + + + + + + the number of chidren visible to the + authenticated user which has + loaded this instance. + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _UrlAlias: + +UrlAlias XML Schema +------------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _UrlWildcard: + +UrlWildcard XML Schema +---------------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Section: + +Section XML Schema +------------------ + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _ObjectStateGroup: + +ObjectStateGroup XML Schema +--------------------------- + +.. code:: xml + + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + the default language code + + + + + + + Comma separated List of language codes + present in names and descriptions + + + + + + + + + + + + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + the default language code + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + the default language code + + + + + + + + + + + + + +.. _ObjectState: + +ObjectStates XML Schema +----------------------- + +.. code:: xml + + + + + + + + + + + + + + Readable string identifier of an object state + + + + + + + + + + + the default language code + + + + + + + Comma separated List of language codes + present in names and descriptions + + + + + + + + + + + + + + + + + + + + + + + + Readable string identifier of an object state + + + + + + + + + the default language code + + + + + + + + + + + + + Readable string identifier of an object state + + + + + + + + + the default language code + + + + + + + + + + + + + +.. _ContentObjectStates: + +ContentObjectStates XML Schema +------------------------------ + +.. code:: xml + + + + + + + + + + + + + +.. _ContentTypeGroup: +.. _ContentTypeGroupInput: + +ContentTypeGroup XML Schema +--------------------------- + +.. code:: xml + + + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + Created date + + + + + + + Modified date + + + + + + + Creator user + + + + + + + Modifier user + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _ContentType: + +ContentType XML Schema +---------------------- +.. code:: xml + + + + + + + + + + + + + + Content type ID + + + + + + + The status of the content type. + + + + + + + String identifier of a content type + + + + + + + + + Creation date of the content type + + + + + + + Last modification date of the content + type + + + + + + + The user which created the content type + + + + + + + + The userwhich last modified the content + type + + + + + + + Unique remote ID of the content type + + + + + + + URL alias schema + If nothing is provided, + nameSchema will be used + instead. + + + + + + + Name schema. + Can be composed of + FieldDefinition + identifier place + holders.These place + holders must comply this + pattern : + <field_definition_identifier>. + An OR condition can + be used : + <field_def|other_field_def> + In this + example, field_def will be used if available. If not, + other_field_def will be used for content name generation + + + + + + + Determines if the type is a container + + + + + + + Main language + + + + + + + if an instance of acontent type is + created the always available + flag is set by default this + this value. + + + + + + + Specifies which property the child + locations should be sorted on by + default when created + + + + + + + Specifies whether the sort order should + be ascending or descending by + default when created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _ContentTypeCreate: + +ContentTypeCreate XML Schema +---------------------------- +.. code:: xml + + + + + + + + + + + + String identifier of a content type + + + + + + + + + If set this date is used as modification + date + + + + + + + The user under which this creation should + be done + + + + + + + Unique remote ID of the content type + + + + + + + URL alias schema + If nothing is provided, + nameSchema will be used + instead. + + + + + + + Name schema. + Can be composed of + FieldDefinition identifier place + holders.These place + holders + must comply this pattern : + <field_definition_identifier>. + An OR condition can + be + used : + <field_def|other_field_def> + In this + example, + field_def will be used if available. If not, + other_field_def + will be used for content name generation + + + + + + + Determines if the type is a container + + + + + + + Main language + + + + + + + if an instance of acontent type is + created + the always available + flag is set by default this + this value. + + + + + + + Specifies which property the child + locations should be sorted on by + default when created + + + + + + + Specifies whether the sort order should + be + ascending or descending by + default when created + + + + + + + + + + + + + + + +.. _ContentTypeUpdate: + +ContentTypeUpdate XML Schema +---------------------------- + +.. code:: xml + + + + + + + + + + + String identifier of a content type + + + + + + + + + If set this date is used as modification + date + + + + + + + The user under which this update should be + done + + + + + + + Unique remote ID of the content type + + + + + + + URL alias schema + If nothing is provided, + nameSchema will be used + instead. + + + + + + + Name schema. + Can be composed of + FieldDefinition identifier place + holders.These place + holders + must comply this pattern : + <field_definition_identifier>. + An OR condition can + be + used : + <field_def|other_field_def> + In this + example, + field_def will be used if available. If not, + other_field_def + will be used for content name generation + + + + + + + Determines if the type is a container + + + + + + + Main language + + + + + + + if an instance of acontent type is + created + the always available + flag is set by default this + this value. + + + + + + + Specifies which property the child + locations should be sorted on by + default when created + + + + + + + Specifies whether the sort order should + be + ascending or descending by + default when created + + + + + + + + + + +.. _FieldDefinition: + +FieldDefinition JSON Schema +--------------------------- +.. code:: xml + + + + + + + + + + + + the unique id of this field definition + + + + + + + Readable string identifier of a field + definition + + + + + + + Field group name + + + + + + + the position of the field definition in + the content typr + + + + + + + String identifier of the field type + + + + + + + If the field type is translatable + + + + + + + Is the field required + + + + + + + the flag if this attribute is used for + information collection + + + + + + + Default value of the field + + + + + + + Indicates if th the content is + searchable by this attribute + + + + + + + + + + + + + + + + + + + + + + + +.. _FieldDefinitionCreate: + +FieldDefinitionCreate XML Schema +-------------------------------- +.. code:: xml + + + + + + + + + + + + Readable string identifier of a field + definition + + + + + + + the field type for this definition + + + + + + + Field group name + + + + + + + the position of the field definition in + the content typr + + + + + + + If the field type is translatable + + + + + + + Is the field required + + + + + + + the flag if this attribute is used for + information collection + + + + + + + Default value of the field + + + + + + + Indicates if th the content is + searchable by this attribute + + + + + + + + + + + + +.. _FieldDefinitionUpdate: + +FieldDefinitionUpdate XML Schema +-------------------------------- +.. code:: xml + + + + + + + + + + If set the identifier of a field + definition is changed + + + + + + + If set the field group is changed + + + + + + + If set the the position of the field definition in + the content typr is changed + + + + + + + If set the translatable flag is set to this value + + + + + + + If set the required flag is set to this value + + + + + + + If set the info collection flag is set to this value + + + + + + + If set the default value of the field is changed + + + + + + + If set the searchable flag is set to this value + + + + + + + + + + + + +.. _UserGroupCreate: + +UserGroupCreate XML Schema +-------------------------- +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + +.. _UserGroupUpdate: + +UserGroupUpdate XML Schema +-------------------------- +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + +.. _UserGroup: + +UserGroup XML Schema +-------------------- +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _UserCreate: + +UserCreate XML Schema +--------------------- +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _UserUpdate: + +UserUpdate XML Schema +--------------------- +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _User: + +User XML Schema +--------------- +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Limitation: + +Limitation XML Schema +--------------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Policy: +.. _PolicyCreate: +.. _PolicyUpdate: + +Policy XML Schema +----------------- + +.. code:: xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _Role: +.. _RoleAssignInput: +.. _RoleInput: + +Role XML Schema +--------------- + +.. code:: xml + + + + + + + + + + + + String identifier of the role + + + + + + + + + + + + + + String identifier of the role + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +.. _ErrorMessage: + +ErrorMessage XML Schema +----------------------- + +.. code:: xml + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/convertXML2JSON.php b/doc/specifications/rest/convertXML2JSON.php new file mode 100644 index 0000000..ff78ddb --- /dev/null +++ b/doc/specifications/rest/convertXML2JSON.php @@ -0,0 +1,142 @@ +hasAttributes() && $root->childNodes->length==1 + && $root->childNodes->item(0)->nodeType == XML_TEXT_NODE) + { + return $root->childNodes->item(0)->nodeValue; + } + + $result = array(); + + if ($root->hasAttributes()) + { + $attrs = $root->attributes; + + foreach ($attrs as $i => $attr) + $result["_" . $attr->name] = $attr->value; + } + + $children = $root->childNodes; + + $group = array(); + + $text = ""; + + for($i = 0; $i < $children->length; $i++) + { + $child = $children->item($i); + if($child->nodeType == XML_TEXT_NODE) + { + $text = $text . $child->nodeValue; + } + else + { + if (!isset($result[$child->nodeName])) + $result[$child->nodeName] = dom_to_array($child); + else + { + if (!isset($group[$child->nodeName])) + { + $tmp = $result[$child->nodeName]; + $result[$child->nodeName] = array($tmp); + $group[$child->nodeName] = 1; + } + + $result[$child->nodeName][] = dom_to_array($child); + } + } + } + $trimmed = trim($text); + if($trimmed != "") + $result['#text'] = $text; + return $result; +} +/** + * takes a file name of an xml document and returns an json representation + * + * @param string $fileName + */ +function convert($fileName) +{ + $d = new DOMDocument(1, "UTF-8"); + $d->load($fileName); + $ret[$d->documentElement->nodeName] = dom_to_array($d->documentElement); + return json_encode($ret); +} + +echo indent(str_replace("\/","/",convert($argv[1]))); + +?> diff --git a/doc/specifications/rest/design/architecture.svg b/doc/specifications/rest/design/architecture.svg new file mode 100644 index 0000000..139022b --- /dev/null +++ b/doc/specifications/rest/design/architecture.svg @@ -0,0 +1,389 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Client(PHP-Script) + Client-API + + + Public-API + + + + + + + + Public-API + + REST-Client(XML or JSON) + REST-Server(XML or JSON) + Backend-API + Storage + + + + + + Architecture + + diff --git a/doc/specifications/rest/design/client-server.svg b/doc/specifications/rest/design/client-server.svg new file mode 100644 index 0000000..684ea9b --- /dev/null +++ b/doc/specifications/rest/design/client-server.svg @@ -0,0 +1,474 @@ + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + Client-API + + + Public-API + + + + + + + + Public-API + + REST-Client(XML or JSON) + REST-Server(XML or JSON) + Backend-API + + + Client-Server + + + + + + + + + GET $url + Build $url + Parse $url + GET $url + Build $response from $data + $response + $response + Convert $response to $data + POST $url $body + Build $url and $body + Parse $url; Convert $body + POST $url $body + Build $response from $data + $response + $response + Convert $response to $data + + + + diff --git a/doc/specifications/rest/design/design.txt b/doc/specifications/rest/design/design.txt new file mode 100644 index 0000000..f18bce9 --- /dev/null +++ b/doc/specifications/rest/design/design.txt @@ -0,0 +1,322 @@ +========================= +REST Client Server Design +========================= + +This documents describes the architecture and design of the REST client and +server, as well as the testing setup. It will also cover some details of the +implementation as far as those are required for finishing the implementation or +extending the software. + +Architecture +============ + +.. figure:: architecture.svg + :alt: System architecture + + System architecture + +As the figure shows the architecture depends on several layers. + +The basic idea behind the architecture is the following: + + The user should be able to use the REST Client (SDK) just like the public + API on a local system. + +Thus a PHP client (script) will likely use the REST Client SDK, which +implements the full Public API. + +The SDK implements a client which will communicate with the REST Server. The +communication may use XML or JSON as a transport encoding format. The used +encoding will depend on content types and accept headers provided. + +The server is a classic PHP webservice, which understands all requests as +defined in the REST API v3 specification. The server itself then maps the +requests to the REST API back to requests to the public API. Thus the server +may utilize different implementations of the public API. For now this will +likely be the test memory backend or the legacy backend. + +The server will of course work independently from the REST Client (SDK), if it +is accessed directly using the REST API. This setup enables us to use the +integration test suite together with the REST Client SDK to verify the client +and the server implement all of the required functionality. + +Client & Server Implementation +============================== + +.. figure:: client-server.svg + :alt: Client Server Interaction + + Client Server Interaction + +The figure shows a typical example of client server interaction. + +The Simple ``GET`` Request +-------------------------- + +The first request usually will just point to ``/`` on the server to discover +the servers capabilities. This is simple for the server to process, as it just +needs to return the available services. + +The server will typically retrieve the data it should send back to the client +from the public API. The data from the public API is paraphrased as ``$data`` +in the figure. This data needs to be converted into JSON or XML depending on +the clients capabilities (which are communicated through ``Accept`` HTTP +headers). For this the ``Common\Output\Visitor`` is used. More details on this +later. + +The Client now receives the generated ``$response`` (remember: XML or JSON) and +needs to convert it back into ``$data`` since we are in the SDK and the PHP +scripts wants to retrieve the common ``Value`` objects from the public API. For +this conversion the ``Client\Input\Dispatcher`` is used, which dispatches to +concrete parsers for the ``$response``. More on that later. + +A ``POST`` Request +------------------ + +In a more complex example, where the client wants to transmit data to the +server and not just receive data two more steps are involved in the client +server interaction. + +The client has some ``Value`` object structures, which must be transmitted to +the server. For the conversion of the ``$data`` into a proper (JSON or XML) +request ``$body`` again the ``Common\Output\Visitor`` is used, since this +process is very similar to the server output conversion. (It is just some +``$data`` into some JSON or XML conversion) + +The server must read some input data now, which was not necessary for the +simple ``GET`` request. This conversion again requires to convert JSON or XML +data (``$body``) into some ``Value`` object structures usable by the public API +implementation. This again is very similar to the Client parsing a servers +answer, so the ``Common\Input\Dispatcher`` is used here. + +The server and the clients usually must parse / return slightly different +XML / JSON structures. Because of this the concrete implementations for parsing +some structure or creating some structure are not in the ``Common`` namespace, +but in the ``Server`` and ``Client`` namespace, respectively. + +The Output Visitor +================== + +The output visitor is a slightly more sophisticated implementation of the +visitor pattern. The basic idea is: + +#) Find a proper Visitor for a Value object +#) Use a generator to generate either XML or JSON +#) Iterate this process for all aggregated Value objects + +Finding a concrete visitor +-------------------------- + +Finding a concrete visitor depends on the Value object passed to +``Common\Output\Visitor``. If a visitor has been registered for the exact class +of the passed Value object, this one is used. Otherwise all parent classes are +checked, until a visitor could be found. If there is no visitor for the passed +Value objects nor for any of its parent classes an exception will be thrown. + +There is one speciality: The method ``visit()`` may only be called for the +outermost Value object. It starts the document. For all aggregated objects the +method ``visitValueObject()`` should be called. + +The concrete visitors for single Value objects will receive a reference to the +``Common\Output\Visitor`` so they can call ``visitValueObject()`` for all +aggregated value objects. + +The Generator +------------- + +Since we need to generate XML or JSON depending on the client the visitors do +not generate output themselves, but call an implementation of +``Common\Output\Generator`` which does the actual work. This also allows us to +do some error checking, so that only valid structures are generated. The API of +those generators is fairly simple and straight forward. Just take a look at the +API documentation or concrete visitor examples. + +The Input Dispatcher +==================== + +The ``Common\Input\Dispatcher`` receives a ``Message`` object, which contains a +set of message headers and a message body, to parse that. The parsing depends +on the ``Content-Type`` header set. They determine which concrete parser should +be used. + +The ``Content-Type`` header also determines the input type (XML or JSON) of the +message. The basic idea of the parsing process therefore is: + +#) Receive message +#) Convert message into a native structure from XML or JSON +#) Call a parser (/ handler) for the current data +#) Iterate: For aggregated data call a parser (/handler) for this data. + +Data Conversion +--------------- + +Both, XML and JSON, are converted into a native array structure which then can +be handled by the concrete parsers. For JSON this just means a call to +``json_decode()``, which it is slightly more complex for the XML data. + +The XML data is converted by the ``Common\Input\Handler\Xml`` implementation +which will generate the JSON array structure from the XML. There is one +speciality in this conversion process when it comes to lists. + +In XML it is possible to have multiple elements with the same name in a direct +row. This is not possible in JSON and therefore an array needs to be used here, +which is also used in the common array structure. + +However, in XML it cannot be decided if an element is part of a list or +stand-alone, if it only occurs once. For example:: + + + + + + + +In this case, it is not clear to the XML parser, that the ```` +elements form a list, since only one occurs here. To conform to the same +structure as achieved by ``json_decode()``, the parser needs to know that this +specific combination of parent-child elements forms a list, no matter how many +elements are present. + +To achieve this, the ``$forceList`` property in +``Common/Input/Handler/Xml.php`` is used. It defines element combinations, +which are forced to create a list structure. In order to use this mechanism for +your purposes, just extend the array mapping. + +Calling A Parser +---------------- + +Calling the correct parser (/handler) for an array structure depends on the +associated mime type. This is provided in the message headers for the outermost +element and as a property for all aggregated elements. + +The class ``Common\Input\ParsingDispatcher`` maintains a mapping of +Content-Types to concrete parser implementations for this purpose. Thus, +depending on the mime type (/ content type) a parser is called, which then +handles the data and converts it into the corresponding ``Value`` object. + +For aggregated data it may call again the ``Common\Input\ParsingDispatcher`` to +dispatch the data handling to a specialized parser. + +Exchanging the Server Back End +============================== + +The REST server simply works on an instance of the Public API implementation. +In the test environment, this is the *in memory* implementation also used by +the integration tests. However, for production use or other test scenarios, +this must be replaced by a real world implementation of the public API. + +None of the infrastructure (MVC) parts of the REST API needs the repository. It +is only needed for: + +1. Controller + + A controller by now receives the services it needs in order to fulfill its + requests. These services must descend from the same repository. For example, + the ``SectionController`` needs the ``SectionService``. + +2. Authenticator + + The ``Authenticator`` given to the enhanced dispatching mechanism needs the + Repository, in order to call ``setCurrentUser()`` on it, based on the + credentials provided by a REST client. + +It is a wise decision to have the used repository created by a Dependency +Injection Container, or similar, and to have this inject the necessary services +into other components. + + +.. note:: + Since the memory back end used for integration tests does not provide state + between requests, the ``index.php`` used for integration currently + implements a rudimentary session management. This should not be required for + any other setup! See the ``index.php`` for further detail. + +Authentication +============== + +Authentication has to be performed through a mechanism over HTTP. Therefore, +the slient and server both contain example implementation on how additional +authentication mechanisms can be implemented. + +Server +------ + +The Server uses a derived version of the RMF\Dispatcher\Simple class, which +handles authentication before the actual dispatching takes place. As +examples, the …\REST\Server\Authenticator base class has been implemented for +the integration test framework and basic auth. + +In order to realize multiple different authentication methods in the server, a +PriorityAuthenticator can be implemented, which aggregates multiple +authenticators and iterates through them. In production, the last authenticator +in such a process should be an AnonymousAuthenticator, which loads the +anonymous user and sets it as the current user in the repository. + +The IntegrationTest authenticator is ONLY meant to be used with integration +tests. It loads the user for which the ID is provided in a special header. This +is neccessary, since the test suite contains tests with different access +permissions. + +Client +------ + +In the client Repository implementation, the setCurrentUser() method has been +deactivated. This method does not make sense in a REST context, since the user +to execute operations with, must be authenticated in every request anyway. + +Therefore, authentication is exclusively handled by different implementations +of the HttpClient base class. The authentication mechanism can send arbitrary +data with every request to trigger authentication in the server. As examples, +the IntegrationTestAuthenticator and BasicAuth have been implemented. The user +must provide his credentials for these, if he wants to use the API via REST. + +If a user of the SDK wants to act as the anonymous user, he can use one of the +HttpClient impelementations without authentication facilities. + +Extending Server And Client +=========================== + +The input and output processing for the server and the client are configured in +two different files. Both are, in their current state, for testing only. + +The test server is configured in +``eZ/Publish/Core/REST/Server/index.php``. Details of the +configuration can be found in the inline documentation. + +The test client is configured in ``eZ/Publish/Core/REST/common.php``. +Details can also be found in the inline documentation. + +You can find addtional details on extending throughout this document. + +Running The Tests +================= + +There are two sets of tests. The unit tests for the REST server and the +integration tests, which may use the REST SDK and Server. + +The Unit Tests +-------------- + +The unit tests are located at +``eZ/Publish/Core/REST`` and can be executed like:: + + phpunit -c phpunit.xml.dist + +The Integration Tests +--------------------- + +The integration tests require a web server for REST server to run. You can +either configure your webserver accordingly or use the PHP build-in webserver +(available since 5.4). To use the build-in webserver go to +``eZ/Publish/Core/REST/Server`` in the repository and execute:: + + php -S localhost:8042 index.php + +To verify that the code works using XML and JSON as transport mechanism this +transport mechanism can be configured using an environment variable. We +prepared two PHPUnit XML configuration files for each variation. To execute the +tests go to ``eZ/Publish/API/Repository/Tests`` in the repository and execute +either of the following lines:: + + phpunit -c phpunit-rest-xml.xml + phpunit -c phpunit-rest-json.xml diff --git a/doc/specifications/rest/notes.rst b/doc/specifications/rest/notes.rst new file mode 100644 index 0000000..cee22b7 --- /dev/null +++ b/doc/specifications/rest/notes.rst @@ -0,0 +1,881 @@ +=============== +REST API review +=============== + +The following document contains a review of the eZ REST API specification as of +January 31st 2012. The document is structured in two main parts: The +chapter Suggestions_ contains general suggestions, which apply to the whole API +or large parts of it. The second part, `Resources & Operations`_ contains a +list of additional findings, grouped by resource URIs. The latter findings +occurred during the review and has no right to completeness. Not all resources +and actions have been investigated in full detail, due to timing constraints. +However, the findings seem to be representative for the API and should be seen +as a reference for all resources. + +The general impression of the API is quite good. The resource structuring, and +the resulting URL structure, looks decent and most of the used methods and +structs are fine. However, we have a few fundamental concerns. These are +explained in following and reasonable solution approaches are discussed. Please +not, that these solutions are not ready for use, yet, but rather need +additional investigation. + +----------- +Suggestions +----------- + +In following, you find suggestions, which affect the whole REST API. + +HATEOAS +======= + +The current version of the API specification already provides an advanced means +of locating resources through their HTTP URL and using HTTP method semantics to +provide actions on these resources. Getting this straight (see further +examination) allows us to rate your API already on level 2 of the `Richardson +Maturity Model`__. In order to achieve level 3 (maximum), only the usage of +hypermedia controls (links) is missing. We highly recommend to add this feature +to your API, for several reasons: + +- The API will available through millions of servers in the future and should + therefore be top-notch in order to fulfill all imaginable requirements. +- Using hypermedia controls allows you to shift resource URIs around later, + which helps to stay backwards compatible even if changes become necessary. +- The latter point is especially viable if you might need to move certain + resources to dedicated servers to redirect them to a different system. + +The idea of hypermedia controls is basically to provide the client with hyper +links to related resources and operations, together with the resource +representation itself. For example, the resource of a content object should +provide links to its version list, relations and so on:: + + http://…/content/objects/23 + versions -> http://…/content/object/23/versions + current_version -> http://…/content/object/23/version/5 + relations -> http://…/content/object/23/version/5/relations + +Having the possible sub-ordinates and related resources linked directly allows +a client to auto-discover these operations (if modelled consistent) and avoids +clients to rely on manually built links, which might break in the future. + +In order to use hypermedia controls, you need to realize the following steps: + +1. Replace all IDs with links to the corresponding resource +2. Add links to sub-ordinate and related resources to the representations + +The representation of such links is crucial to their usability. It should +include: + +- The link target +- The link relation type +- The hyper media type of the related resource + +A common way to achieve this is to re-use the ```` element of the Atom_ +specification, which already provides a convenient interface to this +information. Another way would be to create a custom link format and re-use the +XLink__ specification attributes. Both approaches facilitate the consumer of +the API by the usage of existing standards. + +If you insist of using the JSON format for the API, it is recommended that you +adjust one of these standards to your REST format. For further information see +`JSON vs. XML`_. + +__ http://martinfowler.com/articles/richardsonMaturityModel.html +__ http://www.w3.org/TR/xlink11/ + + +JSON vs. XML +============ + +JSON is a fully valid format to be used for REST APIs and we acknowledge, that +it especially eases the use of a REST API in the AJAX environments. Still, the +usage of an XML format as your resource representation is better suited for +REST in general, due to the following reasons. We can therefore only recommend +to use XML instead of, or at least in addition to, JSON. + +Attributes +---------- + +JSON structures are uni-dimensional, since they do not support the annotation +of data with meta data. XML has this facility built in, using XML attributes. +This allows you to easily add information to to your elements, which affect the +usage of the API and do not represent data transmitted with it. + +This is, for example, crucial for the usage of hypermedia controls (HATEOAS_), +since links need to be annotated with a relation type. + +Namespaces +---------- + +There is no way to namespace elements in JSON. This avoids to mix own data with +3rd party formats transparently to the client, which might be needed for future +API additions or the re-use of existing data formats. For example, the use of +Atom and XLink (see HATEOAS_) is not possible in JSON. A result from this is, +that developers cannot easily recognize common elements in different APIs. + +Evolution +--------- + +It is way harder to evolve a JSON data format in the future, than it is for +XML. For example, to allow multiple elements in the future in a place where +only a single element was allowed in the past. + +For example:: + +
+ Blog entry + … + php +
+ +can easily become:: + +
+ Blog entry + … + php + open source +
+ +without breaking old client implementations. + +In addition, the support for `Namespaces`_ supports these evolution +possibilities of XML data formats drastically. + +Format complexity +----------------- + +Due to the lack in support for attributes and namespaces, JSON representations +become extremely more complex than XML representations. To illustrate this, here +is an example of the HAL resource embedding approach, as mentioned in `Resource +embedding`_. + +XML:: + + + + + + + + + ABC123 + 2 + 9.50 + + + GFZ111 + 1 + 11.00 + + + 30.00 + USD + shipped + 2011-01-16 + + + +JSON:: + + { + "_links": { + "self": { "href": "/orders" }, + "next": { "href": "/orders?page=2" }, + "search": { "href": "/orders?id={order_id}" } + }, + "_embedded": { + "order": [ + { + "_links": { + "self": { "href": "/orders/123" }, + "customer": { "href": "/customer/bob", "title": "Bob Jones " } + }, + "total": 30.00, + "currency": "USD", + "status": "shipped", + "placed": "2011-01-16", + "_embedded": { + "basket": { + "_links": { + "self": { "href": "/orders/123/basket" } + }, + "items": [ + { + "sku": "ABC123", + "quantity": 2, + "price": 9.50 + },{ + "sku": "GFZ111", + "quantity": 1, + "price": 11 + } + ] + } + } + } + } + } + +Drawbacks +--------- + +Of course, the usage of XML in favor of JSON has some drawbacks. For example, +the processing of XML data structures is quite more complex in most languages. +However, this drawback can easily be abolished, by providing a slim SDK layer +in the most important languages (PHP and JavaScript). The PHP SDK is already +planned to be implemented for testing purposes anyway. + +Accept header +------------- + +In case you decide to provide multiple different representation formats for +your resources, we recommend to use the ``Accept`` header in order to determine +which representation is required by a certain client. + +Resource embedding +================== + +One essential violation against the basic principles of REST can be found all +over the specification of your API: The duplication of resources, by making a +resource available through multiple URIs. There is a huge chain of negative +effects from this violation. + +Impact of resource duplication +------------------------------ + +Clients can no more detect if 2 resources are the same. Therefore, it is +impossible to cache the resource representation. Additionally, using an +identity map to ensure object consistency on the client side is impossible. +This also affects caching solutions like Varnish, which can have 2 different +representations of the same resource cached and therefore deliver inconsistent +data to the client. + +We therefore highly recommend to stick to the rule of having a single resource +identified by a singe URI. The additional API calls (and HTTP requests) needed +to look up specific resource through links (see HATEOAS_) can easily be +compensated by HTTP level caching and SDK level caching. + +Embedding theory +---------------- + +However, we understand the need to provide the data of related resources with a +single request (e.g. the current object version and its fields when requesting +``/content/objects/``) and to duplicate related resources in some places +(e.g. ``/content/objects/locations`` and ``/content/locations/``). But, +instead of simply duplicating the resource, we recommend to use the embedding +of related resources. + +Embedding of resources in this case means: Instead of providing the +raw data of related resources, in scope of the requested resource, the data is +clearly annotated to be part of another resource, which is identified by a +different URI than the requested one. + +This mitigates some of the problems named above: Clients recognize, that the +additional data is originally located at a different URI. They can therefore +replace the embedded with an identified (and potentially modified) version on +there side. In addition, a client knows immediately where to go in order to +perform operations on the embedded resource. + +Embedding practical +------------------- + +There already exists an approach to resource embedding in REST APIs, which is +called HAL_. However, this approach has 2 essential problems: First, it +provides a general purpose hyper media format, which violates the aspect of +having each API provide its own, simple format. Secondly, the approach has +still some issues in its realization of links. + +Still, HAL_ can deal as in inspiration basis for modelling a custom resource +embedding format, since it already provides translations between XML and JSON, +which might be necessary, if both formats are to be supported (see `JSON vs. +XML`_). + +To visualize the idea of resource embedding, we have made up a simplified +example for an XML representation of a resource which is located under +``…/content/objects/23``: + +.. include:: examples/content_objects_23.xml + :literal: + +As can be seen, the represented resource itself is of type ``ContentInfo``, +which acknowledges the fact, that the requested URI only represents the version +independent meta information of a content object. However, it is assumed that +the standard use case is not to retrieve only this meta information, but the +"current version" of the object in addition, as well as all of its fields. + +In pure REST, the "current version" would only be a link to the corresponding +resource (here: ``…/content/objects/23/versions/5``), which must be requested +by the client, in order to retrieve its state. This link is realized in the +example, using Atom_ style and the corresponding namespace. However, instead of +only giving the link, the corresponding resource representation is included as +a sub-ordinate of the link (````). In addition, +the representation is marked embedded, which gives a clear indicator to the +client, that the encapsulated data is typically found at a different URI. + +The second embedding in the example shows the embedding of version fields into +the version meta data. + +SDK transparency +---------------- + +Practically, the embedding of related resources could be switched on/off by the +client through a URL parameter (e.g. ``embed=true``). In addition, it can be +clearly communicated, that embedding behavior might change, so that the client +state machine can react accordingly. For example, like this:: + + IF link->hasChildren() + resource = parseResource( link->firstChild(), link->type ) + ELSE + resource = parseResource( get( link->href ), link->type ) + END IF + +This approach also enables you to first go with a completely clean API in a +first step (without embedding resources at all or just very few) and to +dynamically add or remove embeds, which occur to be needed or result in issues. + +Warning +------- + +Even with this technique of embedding there will exist essential caching +issues: Additional resource representations must be invalidated, if their +embedded resources are updated. This can easily result in a situation which +requires to purge the full cache for most updates. On the client side, caching +can only work on an object basis and not on HTTP level anymore. + +We can therefore only recommend to use a completely duplication free REST API, +to enable safe and simple caching on HTTP level. This is one of the main +benefits of REST. The additional HTTP requests needed to retrieve related and +sub-ordinate resources can easily be handled by an SDK. Making this use client +side caching can mitigate the performance issues to a high degree. + +However, if there is still a need for embedding resource, we highly recommend +to keep this to a minimum. In fact, for a first version, one can prototype the +idea described in this chapter in only 1 or 2 places. One can then subsequently +add additional places, where problems occur, or remove the whole embedding +concept again. + +Caching mechanisms +================== + +It is highly recommended to take care for caching mechanisms on the client, as +well as on the server side. Therefore, + +Custom HTTP methods +=================== + +In a few cases, it is desirable to send custom HTTP request verbs to your API, +which are namely + +- ``PATCH`` to perform partial updates +- ``PUBLISH`` to publish a draft of a content object version + +We agree that this is a nice way of handling these actions, especially since +there is already an `RFC for the PATCH method`__. + +However, there are some issues in some browser implementations, to not support +custom HTTP verbs, as summarized in `this blog article`__. Basically, all +recent browsers seem to support the standard HTTP methods, but especially +Internet Explorer does not support custom verbs. + +To ship around this issue, we recommend to allow these methods to be +alternatively issued as ``POST`` request and a specific header, which indicates +the original method. For example:: + + X-eZ-Method: PATCH + +It should be clearly documented, that using these methods is only feasible for +use in the browser and that all other implementations (e.g. accessing the API +from PHP) must use the correct HTTP verbs. + +There is also a `blog post by Roy Fielding on the relative view on POST`__. + +__ http://tools.ietf.org/html/rfc5789 +__ http://annevankesteren.nl/2007/10/http-method-support +__ http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post + +Error codes +=========== + +We were missing some error codes from your list of general error codes, which +are sensible to be issued under certain circumstances: + +400 Bad Request + Should be issued if the request is malformed (missing parameter, incorrect + payload, etc.) +401 Unauthorized + Raised if user authorization is missing. +403 Forbidden + Issued if authentication can not fix the access issue. + +Furthermore you should also consider the following status codes as good +practice: + +- 301 Moved Permanently +- 304 Not Modified +- 307 Temporary Redirect + +HTTP headers +============ + +We recommend especially the obey to the following HTTP headers: + +- Allow (determining the allowed methods on the resource) +- Accept +- Accept-Language +- Various Cache-Control headers +- Content-Type +- ETag +- If-* +- Location + +Especially the ``Location`` header is viable for new resource created by POST. + + +Media types +=========== + +In order to identify the media types used by the REST API (for request and +response payloads), you should define a clear naming scheme and use it in your +application. This helps users to easily know what type of data structure they +can expect and need to send. In addition, it helps you versioning your API. + +A common standard seems to be:: + + application/vnd.no.ez.public-api.Fields+xml + +The first part here specifies that the media type belongs to a certain vendor +(``vnd``) and is non-standard. After that follows a reverse domain lookup of +the vendor (``no.ez``) and the application (``public-api``). Finally, the +resource type is identified (here: ``Fields`` for a list of content fields). +Finally, the representation for the resource state is indicated (``+xml``). +For JSON encoding of the representation, simply replace ``+xml`` with +``+json``. + +In order to version your API you can easily, using the following syntax:: + + application/vnd.no.ez.public-api.Fields+xml;v=1.2 + +This allows you to stay backwards compatible with old clients, while evolving +your media types over time. + +Clients should therefore send these media type identifiers in their ``Accept`` +and ``Content-Type`` headers, the same applies for the server in its response +(``Content-Type``) and especially to ``400`` responses, to indicate the correct +media type. + +Documentation +============= + +A good REST API requires a fair amount of documentation, in order to be +successfully used. We therefore recommend three ways of documentation to be +combined: + +Reference +--------- + +This documentation should have three sections: + +1. Concepts + explaining the realized concepts, like the basic structure, the encoding + formats, how links (and embedding?) works, best practices, and so on. +2. Resources + examining the resources used, the URL scheme and methods supported on each + resource. This should reference the 3. section heavily. +3. Media Types + mentioning all occurring media types, referencing the corresponding + resources, which uses them. + +Tutorials +--------- + +Explanations on how to achieve important use cases with the REST API. + +HTML Representation +------------------- + +We also recommend to implement HTML representation in your REST API itself. +This allows users to simply access the API using their browser and inspecting +it manually. This representation should: + +- Visualize the state of the resource in HTML +- Display possible methods (already available in the ``Allow`` header) +- Transform links to clickable HTML links +- Reference the media type and resources sections in Reference_ + +-------------- +Authentication +-------------- + +We consider your proposed 3 authentication types (basic, oauth2, session) a +good choice, since they allow the usage of the API in various use cases. +However, the ``basic`` authentication is especially insecure and should only be +used in HTTPs secured environments. It might therefore make sense to add digest +authentication in addition, since this one does not send the password in clear +text. You should also have a look at the CouchDB authentication abstraction, +since this one basically provides your selected methods, too. + +- /user/sessions should be /users/<$userId>/sessions +- Providing user info as response to the session login violates rest + + - 2 URLs represent the same resource + +---------------------- +Resources & Operations +---------------------- + +Content +======= + +- ``/content/objects`` + + - Method ``GET`` + + - Should typically only reference objects + - `Resource embedding`_ should be considered + + - ``POST`` + + - Duplicate usage for + + - Create new content object + - Copy a content object + + - Copying should rather be a dedicated operation + + - Could be inspired by the ``COPY`` operation in WebDAV + - Mixing of locations and content objects is confusing + + - Maybe rather "copy a location"? + - Would also fit better with WebDAV copy + +- ``/content/objects/views`` + + - Why isn't this in ``/content/views``? + - Might be very confusing to see this as a subordinate of + ``/content/objects`` + - ``POST`` + + - Why is there no ``POST`` allowed? + - Expected as the default for creating a new view + - Why should a user know the ID upfront? + + - ``GET`` + + - Missing content type + - Can / is the list of views restricted somehow? + + - ``PUT`` + + - Should work on ``/content/views/`` instead + + - Cleaner structure would be + + - ``/content/views`` list of views (links) + - ``/content/views/`` the view query structure + - ``/content/views//results`` list of links to results + + - Results could be embedded using `Resource embedding`_ + +- ``/content/objects/view/`` + + - ``POST`` + + - Are views materialized on the server? + - If yes, an empty ``POST`` to a view could trigger a (stale) update + + - ``GET`` + + - Should typically only reference objects or versions + + - Could be embedded using `Resource embedding`_ + + - See above, the query would be expected here + + - Use ``…/views//results`` instead + +- ``/content/objects/`` + + - ``/content/locations//content`` + + - Is a duplicate + - For such duplicates, `Resource embedding`_ style embedding could be an option + + - Get results in different formats + + - The file extension is not a nice option + + - duplicates resource representations + + - Rather use the `Accept header`_ instead + + - ``GET`` + + - Inconsistency to ``PUT`` + + - ``PUT`` works on ``ContentInfo`` (basically) + - ``GET`` returns a specific version + + - Should rather + + - Return ``ContentInfo`` + + - This is also updateable through PUT + + - Embed the "current version" using `Resource embedding`_ + + - Maybe embed further down (fields, etc.) + + - ``DELETE`` + + - Maybe a ``TRASH`` method would make more sense? + + - Clear distinguishing + + - On trash, this method should return ``301`` + + - With ``Location`` header to the new location + +- ``/content/objects//translations`` + + - Looks fine + +- ``/content/objects//languages/`` + + - This is duplication of resources + + - Instead only one syntax should be kept: + + - ``/content/objects/?languages=,...`` + + - This can also work for ``DELETE`` method + +- ``/content/objects//currentversion`` + + - Duplication of resources + - Is already refered to a ``/content/objects/`` + +- ``/content/objects//versions`` + + - ``POST`` + + - Maybe the ``COPY`` method (borrowed from WebDAV) would make more sense? + + - ``GET`` + + - VersionInfo returned should contain links to + + - ContentInfo + - Version + + - ``/content/objects//versions//info`` + + - This is unclear: VersionInfo is already listed + - Is this really necessary? + +- ``/content/objects//locations`` + + - ``GET`` + + - This should usually only be links to the location resources + - Resource embedding would be possible + + - ``POST`` + + - Allowing to create a new location here sounds strange + + - No idea if location is really available + + - Better: + + - Use location links only in ``GET`` + - Do not allow ``POST`` at all + + - ``DELETE`` + + - Makes more sense + - But is the use case really there? + + - How many locations will a content object have? + - How often will all of them be deleted? + - What effort does deleting them in dedicated requests give? + +- ``/content/objects//mainlocation`` + + - Resource duplication + - Should be linked in ``/content/objects/`` + + - Maybe `Resource embedding`_ + +- ``/user/users//drafts`` + + - Duplicates resources + - Should therefore only contain links + - If really necessary, use `Resource embedding`_ + - Another option is to handle this purely via search + +- ``/content/objects//section`` + + - ``GET`` + + - Should not return section, but section link + + - Duplication of resources ``/content/sections/`` + + - Maybe can use `Resource embedding`_ + +- ``/content/objects//relations`` + + - ``GET`` + + - Should return link to "current version" relations + + - Duplication of resources + + - Maybe use `Resource embedding`_ + +- ``/content/objects//versions//relations`` + + - ``GET`` + + - Should return links to ``/content/objects//versions//relations`` + + - Duplication of resources + + - Maybe use `Resource embedding`_ + +- ``/content/locations`` + + - ``PUT`` + + - See `Media Types`_ for issues with LocationInput + - Putting to the base for new locations is not optimal + + - New location is always a sub-ordinate of it's parent + + - What about this structure? + + - ``/content/locations`` + + - Search view on locations + - Default search only refers to root location + - Should be links (and maybe use `Resource embedding`_) + + - ``/content/locations/`` + + - Location details + - Locations are trees anyway + - Would allow: + + - ``POST`` on ``/content/locations/some/location/children`` + to create a new child + + - ``/content/locations//parent`` + + - Should be a link (`Resource embedding`_?) + +- ``/content/trash/items`` + + - Why not ``/content/trash``? + +Content Types +============= + +- ``/content/typegroups`` + + - ``GET`` + + - Should be links to type groups (`Resource embedding`_?) + - Additional link to ``/content/types`` (to list types) + +- ``/content/typegroups//types`` + + - ``GET`` + + - Should be links to type groups (`Resource embedding`_?) + + - ``PUT`` + + - Should actually post a link to an existing type + + - ``DELETE`` + + - Should correspondingly delete the link + + - ``POST`` + + - Should not create a type (for this use ``/content/types``) but only + assign a type to a group + +- ``/content/types`` + + - ``POST`` + + - Maybe use the WebDAV ``COPY`` method instead? + - Why is there no way to create a brand new type? + - This should work here! + +- ``/content/types/`` + + - Field definitions should not be part of response + + - Actually, only a link to ``/content/types//fieldDefinitions`` should + be there + - Maybe use `Resource embedding`_? + + - Would need nested-embedding + +- ``/content/types//fieldDefinitions`` + + - Should be a list of links to field definitions + +- ``/content/types//groups`` + + - Duplication! + +Resource representations +======================== + +There are still some issues with the resource representations. We summarized +some examples. Please ensure to verify the resource representations in further +detail, especially in respect to the Public API. + +- ContentInfo + + - Is missing a link to all available versions + - Should rather use links instead of IDs + + - contentId (should be SELF) + - ownerId + - sectionId + - mainLocationId + - currentVersionNo + + - Reference to version + - And version number in addition? + + - contentType + + - should be a link + + - mainLanguageCode + + - is not of format ``date-time`` + + - … + +- LocationInput + + - ``contentId`` and ``parentId`` are not parameters, but payload + + +.. _`RFC 5789`: http://tools.ietf.org/html/rfc5789 +.. _HAL: http://stateless.co/hal_specification.html +.. _Atom: http://tools.ietf.org/html/rfc4287 + + +.. + Local Variables: + mode: rst + fill-column: 79 + End: + vim: et syn=rst tw=79 diff --git a/doc/specifications/rest/reststyle.css b/doc/specifications/rest/reststyle.css new file mode 100644 index 0000000..ec98ea7 --- /dev/null +++ b/doc/specifications/rest/reststyle.css @@ -0,0 +1,365 @@ +/* +:Author: David Goodger (goodger@python.org) +:Id: $Id: html4css1.css 7056 2011-06-17 10:50:48Z milde $ +:Copyright: This stylesheet has been placed in the public domain. + +Default cascading style sheet for the HTML output of Docutils. + +See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to +customize this style sheet. +*/ + +/* used to remove borders from tables and images */ +.borderless, table.borderless td, table.borderless th { + border: 0 } + +table.borderless td, table.borderless th { + /* Override padding for "table.docutils td" with "! important". + The right padding separates the table cells. */ + padding: 0 0.5em 0 0 ! important } + +.first { + /* Override more specific margin styles with "! important". */ + margin-top: 0 ! important } + +.last, .with-subtitle { + margin-bottom: 0 ! important } + +.hidden { + display: none } + +a.toc-backref { + text-decoration: none ; + color: black } + +blockquote.epigraph { + margin: 2em 5em ; } + +dl.docutils dd { + margin-bottom: 0.5em } + +object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] { + overflow: hidden; +} + +/* Uncomment (and remove this text!) to get bold-faced definition list terms +dl.docutils dt { + font-weight: bold } +*/ + +div.abstract { + margin: 2em 5em } + +div.abstract p.topic-title { + font-weight: bold ; + text-align: center } + +div.admonition, div.attention, div.caution, div.danger, div.error, +div.hint, div.important, div.note, div.tip, div.warning { + margin: 2em ; + border: medium outset ; + padding: 1em } + +div.admonition p.admonition-title, div.hint p.admonition-title, +div.important p.admonition-title, div.note p.admonition-title, +div.tip p.admonition-title { + font-weight: bold ; + font-family: sans-serif } + +div.attention p.admonition-title, div.caution p.admonition-title, +div.danger p.admonition-title, div.error p.admonition-title, +div.warning p.admonition-title { + color: red ; + font-weight: bold ; + font-family: sans-serif } + +/* Uncomment (and remove this text!) to get reduced vertical space in + compound paragraphs. +div.compound .compound-first, div.compound .compound-middle { + margin-bottom: 0.5em } + +div.compound .compound-last, div.compound .compound-middle { + margin-top: 0.5em } +*/ + +div.dedication { + margin: 2em 5em ; + text-align: center ; + font-style: italic } + +div.dedication p.topic-title { + font-weight: bold ; + font-style: normal } + +div.figure { + margin-left: 2em ; + margin-right: 2em } + +div.footer, div.header { + clear: both; + font-size: smaller } + +div.line-block { + display: block ; + margin-top: 1em ; + margin-bottom: 1em } + +div.line-block div.line-block { + margin-top: 0 ; + margin-bottom: 0 ; + margin-left: 1.5em } + +div.sidebar { + margin: 0 0 0.5em 1em ; + border: medium outset ; + padding: 1em ; + background-color: #ffffee ; + width: 40% ; + float: right ; + clear: right } + +div.sidebar p.rubric { + font-family: sans-serif ; + font-size: medium } + +div.system-messages { + margin: 5em } + +div.system-messages h1 { + color: red } + +div.system-message { + border: medium outset ; + padding: 1em } + +div.system-message p.system-message-title { + color: red ; + font-weight: bold } + +div.topic { + margin: 2em } + +h1.section-subtitle, h2.section-subtitle, h3.section-subtitle, +h4.section-subtitle, h5.section-subtitle, h6.section-subtitle { + margin-top: 0.4em } + +h1.title { + text-align: center } + +h2.subtitle { + text-align: center } + +hr.docutils { + width: 75% } + +img.align-left, .figure.align-left, object.align-left { + clear: left ; + float: left ; + margin-right: 1em } + +img.align-right, .figure.align-right, object.align-right { + clear: right ; + float: right ; + margin-left: 1em } + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left } + +.align-center { + clear: both ; + text-align: center } + +.align-right { + text-align: right } + +/* reset inner alignment in figures */ +div.align-right { + text-align: inherit } + +/* div.align-center * { */ +/* text-align: left } */ + +ol.simple, ul.simple { + margin-bottom: 1em } + +ol.arabic { + list-style: decimal } + +ol.loweralpha { + list-style: lower-alpha } + +ol.upperalpha { + list-style: upper-alpha } + +ol.lowerroman { + list-style: lower-roman } + +ol.upperroman { + list-style: upper-roman } + +p.attribution { + text-align: right ; + margin-left: 50% } + +p.caption { + font-style: italic } + +p.credits { + font-style: italic ; + font-size: smaller } + +p.label { + white-space: nowrap } + +p.rubric { + font-weight: bold ; + font-size: larger ; + color: maroon ; + text-align: center } + +p.sidebar-title { + font-family: sans-serif ; + font-weight: bold ; + font-size: larger } + +p.sidebar-subtitle { + font-family: sans-serif ; + font-weight: bold } + +p.topic-title { + font-weight: bold } + +pre.address { + margin-bottom: 0 ; + margin-top: 0 ; + font: inherit } + +pre.literal-block, pre.doctest-block, pre.math { + margin-left: 2em ; + margin-right: 2em } + +span.classifier { + font-family: sans-serif ; + font-style: oblique } + +span.classifier-delimiter { + font-family: sans-serif ; + font-weight: bold } + +span.interpreted { + font-family: sans-serif } + +span.option { + white-space: nowrap } + +span.pre { + white-space: pre } + +span.problematic { + color: red } + +span.section-subtitle { + /* font-size relative to parent (h1..h6 element) */ + font-size: 80% } + +table.citation { + border-left: solid 1px gray; + margin-left: 1px } + +table.docinfo { + margin: 2em 4em } + +table.docutils { + margin-top: 0.5em ; + margin-bottom: 0.5em } + +table.footnote { + border-left: solid 1px black; + margin-left: 1px } + +table.docutils td, table.docutils th, +table.docinfo td, table.docinfo th { + padding-left: 0.5em ; + padding-right: 0.5em ; + vertical-align: top } + +table.docutils th.field-name, table.docinfo th.docinfo-name { + font-weight: bold ; + text-align: left ; + white-space: nowrap ; + padding-left: 0 } + +h1 tt.docutils, h2 tt.docutils, h3 tt.docutils, +h4 tt.docutils, h5 tt.docutils, h6 tt.docutils { + font-size: 100% } + +ul.auto-toc { + list-style-type: none } +.hll { background-color: #ffffcc } +.c { color: #808080 } /* Comment */ +.err { color: #F00000; background-color: #F0A0A0 } /* Error */ +.k { color: #008000; font-weight: bold } /* Keyword */ +.o { color: #008000 } /* Operator */ +.cm { color: #808080 } /* Comment.Multiline */ +.cp { color: #507090 } /* Comment.Preproc */ +.c1 { color: #808080 } /* Comment.Single */ +.cs { color: #cc0000; font-weight: bold } /* Comment.Special */ +.gd { color: #A00000 } /* Generic.Deleted */ +.ge { font-style: italic } /* Generic.Emph */ +.gr { color: #FF0000 } /* Generic.Error */ +.p { color: #A00000 } /* Generic.Error */ +.gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.gi { color: #00A000 } /* Generic.Inserted */ +.go { color: #808080 } /* Generic.Output */ +.gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.gs { font-weight: bold } /* Generic.Strong */ +.gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.gt { color: #0040D0 } /* Generic.Traceback */ +.kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.kp { color: #003080; font-weight: bold } /* Keyword.Pseudo */ +.kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.kt { color: #303090; font-weight: bold } /* Keyword.Type */ +.m { color: #6000E0; font-weight: bold } /* Literal.Number */ +.s { color: #0000C0 } /* Literal.String */ +.na { color: #A000A0 } /* Name.Attribute */ +.nb { color: #007020 } /* Name.Builtin */ +.nc { color: #B00060; font-weight: bold } /* Name.Class */ +.no { color: #003060; font-weight: bold } /* Name.Constant */ +.nd { color: #505050; font-weight: bold } /* Name.Decorator */ +.ni { color: #800000; font-weight: bold } /* Name.Entity */ +.ne { color: #F00000; font-weight: bold } /* Name.Exception */ +.nf { color: #0060B0; font-weight: bold } /* Name.Function */ +.nl { color: #907000; font-weight: bold } /* Name.Label */ +.nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.nt { color: #007000 } /* Name.Tag */ +.nv { color: #906030 } /* Name.Variable */ +.ow { color: #000000; font-weight: bold } /* Operator.Word */ +.w { color: #bbbbbb } /* Text.Whitespace */ +.mf { color: #6000E0; font-weight: bold } /* Literal.Number.Float */ +.mh { color: #005080; font-weight: bold } /* Literal.Number.Hex */ +.mi { color: #0000D0; font-weight: bold } /* Literal.Number.Integer */ +.mo { color: #4000E0; font-weight: bold } /* Literal.Number.Oct */ +.sb { background-color: #fff0f0 } /* Literal.String.Backtick */ +.sc { color: #0040D0 } /* Literal.String.Char */ +.sd { color: #D04020 } /* Literal.String.Doc */ +.s2 { color: #0000C0 } /* Literal.String.Double */ +.se { color: #606060; font-weight: bold; background-color: #fff0f0 } /* Literal.String.Escape */ +.sh { background-color: #fff0f0 } /* Literal.String.Heredoc */ +.si { background-color: #e0e0e0 } /* Literal.String.Interpol */ +.sx { color: #D02000; background-color: #fff0f0 } /* Literal.String.Other */ +.sr { color: #000000; background-color: #fff0ff } /* Literal.String.Regex */ +.s1 { background-color: #fff0f0 } /* Literal.String.Single */ +.ss { color: #A06000 } /* Literal.String.Symbol */ +.bp { color: #007020 } /* Name.Builtin.Pseudo */ +.vc { color: #306090 } /* Name.Variable.Class */ +.vg { color: #d07000; font-weight: bold } /* Name.Variable.Global */ +.vi { color: #3030B0 } /* Name.Variable.Instance */ +.il { color: #0000D0; font-weight: bold } /* Literal.Number.Integer.Long */ diff --git a/doc/specifications/rest/section_input.rst b/doc/specifications/rest/section_input.rst new file mode 100644 index 0000000..029c960 --- /dev/null +++ b/doc/specifications/rest/section_input.rst @@ -0,0 +1,42 @@ +============ +SectionInput +============ + +.. code:: xml + + + + new-section + New Section + + +.. code:: javascript + + { + "SectionInput": + { + "identifier": "new-section", + "name": "New Section", + } + } + +.. code:: javascript + + { + "SectionInput": + [ + { + "identifier": "new-section", + "name": "New Section", + } + ] + } + + + +.. + Local Variables: + mode: rst + fill-column: 79 + End: + vim: et syn=rst tw=79 diff --git a/doc/specifications/rest/toHtml.sh b/doc/specifications/rest/toHtml.sh new file mode 100755 index 0000000..ce2c410 --- /dev/null +++ b/doc/specifications/rest/toHtml.sh @@ -0,0 +1,4 @@ +export LC_ALL=en_US.UTF-8 +export LANG=en_US.UTF-8 +rst2html.py --stylesheet=reststyle.css REST-API-V2.rst > REST-API-V2.html + diff --git a/doc/specifications/rest/xsd/BinaryInput.xsd b/doc/specifications/rest/xsd/BinaryInput.xsd new file mode 100644 index 0000000..942fabd --- /dev/null +++ b/doc/specifications/rest/xsd/BinaryInput.xsd @@ -0,0 +1,105 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/CommonDefinitions.xsd b/doc/specifications/rest/xsd/CommonDefinitions.xsd new file mode 100644 index 0000000..3dc354e --- /dev/null +++ b/doc/specifications/rest/xsd/CommonDefinitions.xsd @@ -0,0 +1,122 @@ + + + + + + A base schema for referencing resources. + + + + + + + + + + + + + + + + A base schema for referencing controllers and + methods + + + + + + + + + + + + + + + + + + + + + + + Schema for field inputs in content create and + update structures + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Content.xsd b/doc/specifications/rest/xsd/Content.xsd new file mode 100644 index 0000000..3e8821f --- /dev/null +++ b/doc/specifications/rest/xsd/Content.xsd @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentCreate.xsd b/doc/specifications/rest/xsd/ContentCreate.xsd new file mode 100644 index 0000000..39a0831 --- /dev/null +++ b/doc/specifications/rest/xsd/ContentCreate.xsd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentObjectState.xsd b/doc/specifications/rest/xsd/ContentObjectState.xsd new file mode 100644 index 0000000..42fa1eb --- /dev/null +++ b/doc/specifications/rest/xsd/ContentObjectState.xsd @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentType.xsd b/doc/specifications/rest/xsd/ContentType.xsd new file mode 100644 index 0000000..17dcf92 --- /dev/null +++ b/doc/specifications/rest/xsd/ContentType.xsd @@ -0,0 +1,186 @@ + + + + + + + + + + + + + Content type ID + + + + + + + The status of the content type. + + + + + + + String identifier of a content type + + + + + + + + + Creation date of the content type + + + + + + + Last modification date of the content + type + + + + + + + The user which created the content type + + + + + + + + The userwhich last modified the content + type + + + + + + + Unique remote ID of the content type + + + + + + + URL alias schema + If nothing is provided, + nameSchema will be used + instead. + + + + + + + Name schema. + Can be composed of + FieldDefinition + identifier place + holders.These place + holders must comply this + pattern : + <field_definition_identifier>. + An OR condition can + be used : + <field_def|other_field_def> + In this + example, field_def will be used if available. If not, + other_field_def will be used for content name generation + + + + + + + Determines if the type is a container + + + + + + + Main language + + + + + + + if an instance of acontent type is + created the always available + flag is set by default this + this value. + + + + + + + Specifies which property the child + locations should be sorted on by + default when created + + + + + + + Specifies whether the sort order should + be ascending or descending by + default when created + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentTypeCreate.xsd b/doc/specifications/rest/xsd/ContentTypeCreate.xsd new file mode 100644 index 0000000..3f7163a --- /dev/null +++ b/doc/specifications/rest/xsd/ContentTypeCreate.xsd @@ -0,0 +1,132 @@ + + + + + + + + + + + String identifier of a content type + + + + + + + + + If set this date is used as modification + date + + + + + + + The user under which this creation should + be done + + + + + + + Unique remote ID of the content type + + + + + + + URL alias schema + If nothing is provided, + nameSchema will be used + instead. + + + + + + + Name schema. + Can be composed of + FieldDefinition identifier place + holders.These place + holders + must comply this pattern : + <field_definition_identifier>. + An OR condition can + be + used : + <field_def|other_field_def> + In this + example, + field_def will be used if available. If not, + other_field_def + will be used for content name generation + + + + + + + Determines if the type is a container + + + + + + + Main language + + + + + + + if an instance of acontent type is + created + the always available + flag is set by default this + this value. + + + + + + + Specifies which property the child + locations should be sorted on by + default when created + + + + + + + Specifies whether the sort order should + be + ascending or descending by + default when created + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentTypeGroup.xsd b/doc/specifications/rest/xsd/ContentTypeGroup.xsd new file mode 100644 index 0000000..bc583d4 --- /dev/null +++ b/doc/specifications/rest/xsd/ContentTypeGroup.xsd @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + Created date + + + + + + + Modified date + + + + + + + Creator user + + + + + + + Modifier user + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentTypeUpdate.xsd b/doc/specifications/rest/xsd/ContentTypeUpdate.xsd new file mode 100644 index 0000000..5f5bf86 --- /dev/null +++ b/doc/specifications/rest/xsd/ContentTypeUpdate.xsd @@ -0,0 +1,132 @@ + + + + + + + + + + String identifier of a content type + + + + + + + + + If set this date is used as modification + date + + + + + + + The user under which this update should be + done + + + + + + + Unique remote ID of the content type + + + + + + + URL alias schema + If nothing is provided, + nameSchema will be used + instead. + + + + + + + Name schema. + Can be composed of + FieldDefinition identifier place + holders.These place + holders + must comply this pattern : + <field_definition_identifier>. + An OR condition can + be + used : + <field_def|other_field_def> + In this + example, + field_def will be used if available. If not, + other_field_def + will be used for content name generation + + + + + + + Determines if the type is a container + + + + + + + Main language + + + + + + + if an instance of acontent type is + created + the always available + flag is set by default this + this value. + + + + + + + Specifies which property the child + locations should be sorted on by + default when created + + + + + + + Specifies whether the sort order should + be + ascending or descending by + default when created + + + + + + + + diff --git a/doc/specifications/rest/xsd/ContentUpdate.xsd b/doc/specifications/rest/xsd/ContentUpdate.xsd new file mode 100644 index 0000000..80e2665 --- /dev/null +++ b/doc/specifications/rest/xsd/ContentUpdate.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ErrorMessage.xsd b/doc/specifications/rest/xsd/ErrorMessage.xsd new file mode 100644 index 0000000..1455a4b --- /dev/null +++ b/doc/specifications/rest/xsd/ErrorMessage.xsd @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/FieldDefinition.xsd b/doc/specifications/rest/xsd/FieldDefinition.xsd new file mode 100644 index 0000000..5b9bd1c --- /dev/null +++ b/doc/specifications/rest/xsd/FieldDefinition.xsd @@ -0,0 +1,102 @@ + + + + + + + + + + + the unique id of this field definition + + + + + + + Readable string identifier of a field + definition + + + + + + + Field group name + + + + + + + the position of the field definition in + the content typr + + + + + + + String identifier of the field type + + + + + + + If the field type is translatable + + + + + + + Is the field required + + + + + + + the flag if this attribute is used for + information collection + + + + + + + Default value of the field + + + + + + + Indicates if th the content is + searchable by this attribute + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/FieldDefinitionCreate.xsd b/doc/specifications/rest/xsd/FieldDefinitionCreate.xsd new file mode 100644 index 0000000..052f39e --- /dev/null +++ b/doc/specifications/rest/xsd/FieldDefinitionCreate.xsd @@ -0,0 +1,83 @@ + + + + + + + + + + + Readable string identifier of a field + definition + + + + + + + the field type for this definition + + + + + + + Field group name + + + + + + + the position of the field definition in + the content typr + + + + + + + If the field type is translatable + + + + + + + Is the field required + + + + + + + the flag if this attribute is used for + information collection + + + + + + + Default value of the field + + + + + + + Indicates if th the content is + searchable by this attribute + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/FieldDefinitionUpdate.xsd b/doc/specifications/rest/xsd/FieldDefinitionUpdate.xsd new file mode 100644 index 0000000..6e914e4 --- /dev/null +++ b/doc/specifications/rest/xsd/FieldDefinitionUpdate.xsd @@ -0,0 +1,72 @@ + + + + + + + + + If set the identifier of a field + definition is changed + + + + + + + If set the field group is changed + + + + + + + If set the the position of the field definition in + the content typr is changed + + + + + + + If set the translatable flag is set to this value + + + + + + + If set the required flag is set to this value + + + + + + + If set the info collection flag is set to this value + + + + + + + If set the default value of the field is changed + + + + + + + If set the searchable flag is set to this value + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/FieldValue.xsd b/doc/specifications/rest/xsd/FieldValue.xsd new file mode 100644 index 0000000..c3c0dcc --- /dev/null +++ b/doc/specifications/rest/xsd/FieldValue.xsd @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ISOCountryCodeType-V2006.xsd b/doc/specifications/rest/xsd/ISOCountryCodeType-V2006.xsd new file mode 100644 index 0000000..247ee35 --- /dev/null +++ b/doc/specifications/rest/xsd/ISOCountryCodeType-V2006.xsd @@ -0,0 +1,1255 @@ + + + + + + + + + + + + + ISO 3166-1:2006 + + + + + ANDORRA + + + + + UNITED ARAB EMIRATES + + + + + AFGHANISTAN + + + + + ANTIGUA AND BARBUDA + + + + + ANGUILLA + + + + + ALBANIA + + + + + ARMENIA + + + + + NETHERLANDS ANTILLES + + + + + ANGOLA + + + + + ANTARCTICA + + + + + ARGENTINA + + + + + AMERICAN SAMOA + + + + + AUSTRIA + + + + + AUSTRALIA + + + + + ARUBA + + + + + ÅLAND ISLANDS + + + + + AZERBAIJAN + + + + + BOSNIA AND HERZEGOVINA + + + + + BARBADOS + + + + + BANGLADESH + + + + + BELGIUM + + + + + BURKINA FASO + + + + + BULGARIA + + + + + BAHRAIN + + + + + BURUNDI + + + + + BENIN + + + + + SAINT BARTHLEMY + + + + + BERMUDA + + + + + BRUNEI DARUSSALAM + + + + + BOLIVIA + + + + + BRAZIL + + + + + BAHAMAS + + + + + BHUTAN + + + + + BOUVET ISLAND + + + + + BOTSWANA + + + + + BELARUS + + + + + BELIZE + + + + + CANADA + + + + + COCOS (KEELING) ISLANDS + + + + + CONGO, THE DEMOCRATIC REPUBLIC OF THE + + + + + CENTRAL AFRICAN REPUBLIC + + + + + CONGO + + + + + SWITZERLAND + + + + + COTE D'IVOIRE + + + + + COOK ISLANDS + + + + + CHILE + + + + + CAMEROON + + + + + CHINA + + + + + COLOMBIA + + + + + COSTA RICA + + + + + CUBA + + + + + CAPE VERDE + + + + + CHRISTMAS ISLAND + + + + + CYPRUS + + + + + CZECH REPUBLIC + + + + + GERMANY + + + + + DJIBOUTI + + + + + DENMARK + + + + + DOMINICA + + + + + DOMINICAN REPUBLIC + + + + + ALGERIA + + + + + ECUADOR + + + + + ESTONIA + + + + + EGYPT + + + + + WESTERN SAHARA + + + + + ERITREA + + + + + SPAIN + + + + + ETHIOPIA + + + + + FINLAND + + + + + FIJI + + + + + FALKLAND ISLANDS (MALVINAS) + + + + + MICRONESIA, FEDERATED STATES OF + + + + + FAROE ISLANDS + + + + + FRANCE + + + + + GABON + + + + + UNITED KINGDOM + + + + + GRENADA + + + + + GEORGIA + + + + + FRENCH GUIANA + + + + + GUERNSEY + + + + + GHANA + + + + + GIBRALTAR + + + + + GREENLAND + + + + + GAMBIA + + + + + GUINEA + + + + + GUADELOUPE + + + + + EQUATORIAL GUINEA + + + + + GREECE + + + + + SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS + + + + + GUATEMALA + + + + + GUAM + + + + + GUINEA-BISSAU + + + + + GUYANA + + + + + HONG KONG + + + + + HEARD ISLAND AND MCDONALD ISLANDS + + + + + HONDURAS + + + + + CROATIA + + + + + HAITI + + + + + HUNGARY + + + + + INDONESIA + + + + + IRELAND + + + + + ISRAEL + + + + + ISLE OF MAN + + + + + INDIA + + + + + BRITISH INDIAN OCEAN TERRITORY + + + + + IRAQ + + + + + IRAN, ISLAMIC REPUBLIC OF + + + + + ICELAND + + + + + ITALY + + + + + JERSEY + + + + + JAMAICA + + + + + JORDAN + + + + + JAPAN + + + + + KENYA + + + + + KYRGYZSTAN + + + + + CAMBODIA + + + + + KIRIBATI + + + + + COMOROS + + + + + SAINT KITTS AND NEVIS + + + + + KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF + + + + + KOREA, REPUBLIC OF + + + + + KUWAIT + + + + + CAYMAN ISLANDS + + + + + KAZAKHSTAN + + + + + LAO PEOPLE'S DEMOCRATIC REPUBLIC + + + + + LEBANON + + + + + SAINT LUCIA + + + + + LIECHTENSTEIN + + + + + SRI LANKA + + + + + LIBERIA + + + + + LESOTHO + + + + + LITHUANIA + + + + + LUXEMBOURG + + + + + LATVIA + + + + + LIBYAN ARAB JAMAHIRIYA + + + + + MOROCCO + + + + + MONACO + + + + + MOLDOVA, REPUBLIC OF + + + + + MONTENEGRO + + + + + SAINT MARTIN (FRENCH PART) + + + + + MADAGASCAR + + + + + MARSHALL ISLANDS + + + + + MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF + + + + + MALI + + + + + MYANMAR + + + + + MONGOLIA + + + + + MACAO + + + + + NORTHERN MARIANA ISLANDS + + + + + MARTINIQUE + + + + + MAURITANIA + + + + + MONTSERRAT + + + + + MALTA + + + + + MAURITIUS + + + + + MALDIVES + + + + + MALAWI + + + + + MEXICO + + + + + MALAYSIA + + + + + MOZAMBIQUE + + + + + NAMIBIA + + + + + NEW CALEDONIA + + + + + NIGER + + + + + NORFOLK ISLAND + + + + + NIGERIA + + + + + NICARAGUA + + + + + NETHERLANDS + + + + + NORWAY + + + + + NEPAL + + + + + NAURU + + + + + NIUE + + + + + NEW ZEALAND + + + + + OMAN + + + + + PANAMA + + + + + PERU + + + + + FRENCH POLYNESIA + + + + + PAPUA NEW GUINEA + + + + + PHILIPPINES + + + + + PAKISTAN + + + + + POLAND + + + + + SAINT PIERRE AND MIQUELON + + + + + PITCAIRN + + + + + PUERTO RICO + + + + + PALESTINIAN TERRITORY, OCCUPIED + + + + + PORTUGAL + + + + + PALAU + + + + + PARAGUAY + + + + + QATAR + + + + + REUNION + + + + + ROMANIA + + + + + SERBIA + + + + + RUSSIAN FEDERATION + + + + + RWANDA + + + + + SAUDI ARABIA + + + + + SOLOMON ISLANDS + + + + + SEYCHELLES + + + + + SUDAN + + + + + SWEDEN + + + + + SINGAPORE + + + + + SAINT HELENA + + + + + SLOVENIA + + + + + SVALBARD AND JAN MAYEN + + + + + SLOVAKIA + + + + + SIERRA LEONE + + + + + SAN MARINO + + + + + SENEGAL + + + + + SOMALIA + + + + + SURINAME + + + + + SAO TOME AND PRINCIPE + + + + + EL SALVADOR + + + + + SYRIAN ARAB REPUBLIC + + + + + SWAZILAND + + + + + TURKS AND CAICOS ISLANDS + + + + + CHAD + + + + + FRENCH SOUTHERN TERRITORIES + + + + + TOGO + + + + + THAILAND + + + + + TAJIKISTAN + + + + + TOKELAU + + + + + TIMOR-LESTE + + + + + TURKMENISTAN + + + + + TUNISIA + + + + + TONGA + + + + + TURKEY + + + + + TRINIDAD AND TOBAGO + + + + + TUVALU + + + + + TAIWAN, PROVINCE OF CHINA + + + + + TANZANIA, UNITED REPUBLIC OF + + + + + UKRAINE + + + + + UGANDA + + + + + UNITED STATES MINOR OUTLYING ISLANDS + + + + + UNITED STATES + + + + + URUGUAY + + + + + UZBEKISTAN + + + + + HOLY SEE (VATICAN CITY STATE) + + + + + SAINT VINCENT AND THE GRENADINES + + + + + VENEZUELA, PLURINATIONAL STATE OF + + + + + VIRGIN ISLANDS, BRITISH + + + + + VIRGIN ISLANDS, U.S. + + + + + VIET NAM + + + + + VANUATU + + + + + WALLIS AND FUTUNA + + + + + SAMOA + + + + + YEMEN + + + + + MAYOTTE + + + + + SOUTH AFRICA + + + + + ZAMBIA + + + + + ZIMBABWE + + + + + + + + diff --git a/doc/specifications/rest/xsd/Limitation.xsd b/doc/specifications/rest/xsd/Limitation.xsd new file mode 100644 index 0000000..5f6c7e5 --- /dev/null +++ b/doc/specifications/rest/xsd/Limitation.xsd @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Location.xsd b/doc/specifications/rest/xsd/Location.xsd new file mode 100644 index 0000000..610ada9 --- /dev/null +++ b/doc/specifications/rest/xsd/Location.xsd @@ -0,0 +1,99 @@ + + + + + + + + + + + + Location ID. + + + + + + + Location priority + Position of the + Location among its siblings when sorted using priority + sort order. + + + + + + + Indicates that the Location entity has + been explicitly marked as hidden. + + + + + + + Indicates that the Location is + implicitly marked as hidden by a parent + location. + + + + + + + The parent location + + + + + + + The materialized path of the location + entry, eg: /1/2/ + + + + + + + Depth location has in the location + tree. + + + + + + + the number of chidren visible to the + authenticated user which has + loaded this instance. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/LocationCreate.xsd b/doc/specifications/rest/xsd/LocationCreate.xsd new file mode 100644 index 0000000..e86348c --- /dev/null +++ b/doc/specifications/rest/xsd/LocationCreate.xsd @@ -0,0 +1,46 @@ + + + + + + + + + + The parent location where the new location + is created + + + + + + + Location priority + Position of the + Location + among its siblings when sorted using priority + sort order. + + + + + + + Indicates that the Location entity has + been + explicitly marked as hidden. + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/LocationUpdate.xsd b/doc/specifications/rest/xsd/LocationUpdate.xsd new file mode 100644 index 0000000..dcac461 --- /dev/null +++ b/doc/specifications/rest/xsd/LocationUpdate.xsd @@ -0,0 +1,31 @@ + + + + + + + + + + If set the location priority is changed to the given value + + + + + + + If set to true the location is hidden, if set to false the location is unhidden. + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ObjectRelation.xsd b/doc/specifications/rest/xsd/ObjectRelation.xsd new file mode 100644 index 0000000..06627a1 --- /dev/null +++ b/doc/specifications/rest/xsd/ObjectRelation.xsd @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/doc/specifications/rest/xsd/ObjectState.xsd b/doc/specifications/rest/xsd/ObjectState.xsd new file mode 100644 index 0000000..5c047b4 --- /dev/null +++ b/doc/specifications/rest/xsd/ObjectState.xsd @@ -0,0 +1,103 @@ + + + + + + + + + + + + + Readable string identifier of an object state + + + + + + + + + + + the default language code + + + + + + + Comma separated List of language codes + present in names and descriptions + + + + + + + + + + + + + + + + + + + + + + + + Readable string identifier of an object state + + + + + + + + + the default language code + + + + + + + + + + + + + Readable string identifier of an object state + + + + + + + + + the default language code + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/ObjectStateGroup.xsd b/doc/specifications/rest/xsd/ObjectStateGroup.xsd new file mode 100644 index 0000000..c5b933f --- /dev/null +++ b/doc/specifications/rest/xsd/ObjectStateGroup.xsd @@ -0,0 +1,95 @@ + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + the default language code + + + + + + + Comma separated List of language codes + present in names and descriptions + + + + + + + + + + + + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + the default language code + + + + + + + + + + + + + Readable string identifier of a group + + + + + + + the default language code + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Policy.xsd b/doc/specifications/rest/xsd/Policy.xsd new file mode 100644 index 0000000..5adffad --- /dev/null +++ b/doc/specifications/rest/xsd/Policy.xsd @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Relation.xsd b/doc/specifications/rest/xsd/Relation.xsd new file mode 100644 index 0000000..d5536a1 --- /dev/null +++ b/doc/specifications/rest/xsd/Relation.xsd @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Role.xsd b/doc/specifications/rest/xsd/Role.xsd new file mode 100644 index 0000000..8028533 --- /dev/null +++ b/doc/specifications/rest/xsd/Role.xsd @@ -0,0 +1,79 @@ + + + + + + + + + + + String identifier of the role + + + + + + + + + + + + + + String identifier of the role + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Root.xsd b/doc/specifications/rest/xsd/Root.xsd new file mode 100644 index 0000000..bd56cfc --- /dev/null +++ b/doc/specifications/rest/xsd/Root.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Section.xsd b/doc/specifications/rest/xsd/Section.xsd new file mode 100644 index 0000000..06de677 --- /dev/null +++ b/doc/specifications/rest/xsd/Section.xsd @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/StringTypes.xsd b/doc/specifications/rest/xsd/StringTypes.xsd new file mode 100644 index 0000000..dbcb410 --- /dev/null +++ b/doc/specifications/rest/xsd/StringTypes.xsd @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/doc/specifications/rest/xsd/Trash.xsd b/doc/specifications/rest/xsd/Trash.xsd new file mode 100644 index 0000000..86c3ce7 --- /dev/null +++ b/doc/specifications/rest/xsd/Trash.xsd @@ -0,0 +1,99 @@ + + + + + + + + + + + + + Location ID. + + + + + + + Location priority + Position of the + Location among its siblings when sorted using priority + sort order. + + + + + + + Indicates that the Location entity has + been explicitly marked as hidden. + + + + + + + Indicates that the Location is + implicitly marked as hidden by a parent + location. + + + + + + + The parent location + + + + + + + The materialized path of the location + entry, eg: /1/2/ + + + + + + + Depth location has in the location + tree. + + + + + + + the number of chidren visible to the + authenticated user which has + loaded this instance. + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UrlAlias.xsd b/doc/specifications/rest/xsd/UrlAlias.xsd new file mode 100644 index 0000000..896aa6c --- /dev/null +++ b/doc/specifications/rest/xsd/UrlAlias.xsd @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UrlWildcard.xsd b/doc/specifications/rest/xsd/UrlWildcard.xsd new file mode 100644 index 0000000..418d7fb --- /dev/null +++ b/doc/specifications/rest/xsd/UrlWildcard.xsd @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/User.xsd b/doc/specifications/rest/xsd/User.xsd new file mode 100644 index 0000000..a7e335d --- /dev/null +++ b/doc/specifications/rest/xsd/User.xsd @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UserCreate.xsd b/doc/specifications/rest/xsd/UserCreate.xsd new file mode 100644 index 0000000..119d6ec --- /dev/null +++ b/doc/specifications/rest/xsd/UserCreate.xsd @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UserGroup.xsd b/doc/specifications/rest/xsd/UserGroup.xsd new file mode 100644 index 0000000..a37218f --- /dev/null +++ b/doc/specifications/rest/xsd/UserGroup.xsd @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UserGroupCreate.xsd b/doc/specifications/rest/xsd/UserGroupCreate.xsd new file mode 100644 index 0000000..fe0cb2f --- /dev/null +++ b/doc/specifications/rest/xsd/UserGroupCreate.xsd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UserGroupUpdate.xsd b/doc/specifications/rest/xsd/UserGroupUpdate.xsd new file mode 100644 index 0000000..61cf1de --- /dev/null +++ b/doc/specifications/rest/xsd/UserGroupUpdate.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/UserUpdate.xsd b/doc/specifications/rest/xsd/UserUpdate.xsd new file mode 100644 index 0000000..e055312 --- /dev/null +++ b/doc/specifications/rest/xsd/UserUpdate.xsd @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/Version.xsd b/doc/specifications/rest/xsd/Version.xsd new file mode 100644 index 0000000..e1a6f75 --- /dev/null +++ b/doc/specifications/rest/xsd/Version.xsd @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/VersionInfo.xsd b/doc/specifications/rest/xsd/VersionInfo.xsd new file mode 100644 index 0000000..82fe7f0 --- /dev/null +++ b/doc/specifications/rest/xsd/VersionInfo.xsd @@ -0,0 +1,74 @@ + + + + + + + + + The version id. + + + + + + + The version number. + This is the version + number, which only + increments in scope of a single Content + object. + + + + + + + + The date of the last modification of this + version + + + + + + + The user which has created this version + + + + + + + The date this version was created + + + + + + + In 4.x this is the language code which is + used for labeling a + translation. + + + + + + + List of languages in this version + Reflects + which languages fields exists in for this version. + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/VersionList.xsd b/doc/specifications/rest/xsd/VersionList.xsd new file mode 100644 index 0000000..b05876b --- /dev/null +++ b/doc/specifications/rest/xsd/VersionList.xsd @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/VersionUpdate.xsd b/doc/specifications/rest/xsd/VersionUpdate.xsd new file mode 100644 index 0000000..dbc7fe9 --- /dev/null +++ b/doc/specifications/rest/xsd/VersionUpdate.xsd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/View.xsd b/doc/specifications/rest/xsd/View.xsd new file mode 100644 index 0000000..1fb66ab --- /dev/null +++ b/doc/specifications/rest/xsd/View.xsd @@ -0,0 +1,518 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The identifier of the field i.e identifier + of the corresponding field + definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContenUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/ContenUpdate.xml new file mode 100644 index 0000000..79ba541 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContenUpdate.xml @@ -0,0 +1,9 @@ + + + ger-DE +
+ + + false + remoteId-9876543s + diff --git a/doc/specifications/rest/xsd/xmlexamples/Content.xml b/doc/specifications/rest/xsd/xmlexamples/Content.xml new file mode 100644 index 0000000..ca6f0c6 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Content.xml @@ -0,0 +1,46 @@ + + + + Name + + + + + 123 + 2 + PUBLISHED + 2001-12-31T12:00:00 + + 2001-12-31T12:00:00 + eng-UK + + + + + 1234 + title + eng-UK + Title + + + 1235 + summary + eng-UK + This is a summary + + + + + +
+ + + + 2001-12-31T12:00:00 + 2001-12-31T12:00:00 + eng-UK + true + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentCreate.xml b/doc/specifications/rest/xsd/xmlexamples/ContentCreate.xml new file mode 100644 index 0000000..76abdd1 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentCreate.xml @@ -0,0 +1,37 @@ + + + + eng-US + + + 0 + false + PATH + ASC + +
+ true + remoteId12345678 + + + title + eng-US + This is a title + + + summary + eng-US + This is a summary + + + authors + eng-US + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentDraft.xml b/doc/specifications/rest/xsd/xmlexamples/ContentDraft.xml new file mode 100644 index 0000000..241ee9d --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentDraft.xml @@ -0,0 +1,54 @@ + + + + This is a title + + + + + 123 + 1 + DRAFT + 2012-02-12T12:30:00 + + 2012-02-12T12:30:00 + eng-US + + + + + 1234 + title + eng-UK + This is a title + + + 1235 + summary + eng-UK + This is a summary + + + authors + eng-US + + + + + + + + + + + +
+ + + + 2012-02-12T12:30:00 + eng-US + true + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentType.xml b/doc/specifications/rest/xsd/xmlexamples/ContentType.xml new file mode 100644 index 0000000..05d0db8 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentType.xml @@ -0,0 +1,62 @@ + + + 32 + DRAFT + newContentType + + New Content Type + + + This is a description + + 2001-01-01T16:37:00 + 2001-01-01T16:37:00 + + + remoteId-qwert548 + <title> + <title> + true + eng-US + true + PATH + ASC + + + 34 + title + ezstring + content + 1 + true + true + false + New Title + true + + Title + + + This is the title + + + + 36 + summary + ezxmltext + content + 2 + true + false + false + + true + + Summary + + + This is the summary + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentTypeCreate.xml b/doc/specifications/rest/xsd/xmlexamples/ContentTypeCreate.xml new file mode 100644 index 0000000..3e94e0d --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentTypeCreate.xml @@ -0,0 +1,54 @@ + + + newContentType + + New Content Type + + + This is a description + + remoteId-qwert548 + <title> + <title> + true + eng-US + true + PATH + ASC + + + title + ezstring + content + 1 + true + true + false + New Title + true + + Title + + + This is the title + + + + summary + ezxmltext + content + 2 + true + false + false + + true + + Summary + + + This is the summary + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroup.xml b/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroup.xml new file mode 100644 index 0000000..811a489 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroup.xml @@ -0,0 +1,10 @@ + + + 7 + newContentTypeGroup + 2012-02-31T12:45:00 + 2012-02-31T12:45:00 + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroupInput.xml b/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroupInput.xml new file mode 100644 index 0000000..4a1a772 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroupInput.xml @@ -0,0 +1,4 @@ + + + newContentTypeGroup + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroupList.xml b/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroupList.xml new file mode 100644 index 0000000..345a9e2 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentTypeGroupList.xml @@ -0,0 +1,21 @@ + + + + 1 + Content + 2010-06-31T12:00:00 + 2010-07-31T12:00:00 + + + + + + 2 + Media + 2010-06-31T14:00:00 + 2010-09-31T12:00:00 + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ContentTypeUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/ContentTypeUpdate.xml new file mode 100644 index 0000000..5058b98 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ContentTypeUpdate.xml @@ -0,0 +1,9 @@ + + + + Neuer Content Typ + + + Das ist ein neuer Content Typ + + diff --git a/doc/specifications/rest/xsd/xmlexamples/FacetBuilders.xml b/doc/specifications/rest/xsd/xmlexamples/FacetBuilders.xml new file mode 100644 index 0000000..ffee16a --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/FacetBuilders.xml @@ -0,0 +1,4 @@ + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/Location.xml b/doc/specifications/rest/xsd/xmlexamples/Location.xml new file mode 100644 index 0000000..91f157b --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Location.xml @@ -0,0 +1,15 @@ + + + 133 + 0 + false + false + + /1/5/73/133 + 4 + 0 + remoteId-qwert567 + + PATH + ASC + diff --git a/doc/specifications/rest/xsd/xmlexamples/LocationCreate.xml b/doc/specifications/rest/xsd/xmlexamples/LocationCreate.xml new file mode 100644 index 0000000..08e4eff --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/LocationCreate.xml @@ -0,0 +1,8 @@ + + + + 0 + false + PATH + ASC + diff --git a/doc/specifications/rest/xsd/xmlexamples/LocationList.xml b/doc/specifications/rest/xsd/xmlexamples/LocationList.xml new file mode 100644 index 0000000..7d6ee9b --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/LocationList.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/LocationUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/LocationUpdate.xml new file mode 100644 index 0000000..c4ffb31 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/LocationUpdate.xml @@ -0,0 +1,8 @@ + + + 3 + true + remoteId-qwert999 + CLASS + DESC + diff --git a/doc/specifications/rest/xsd/xmlexamples/MobileContent.xml b/doc/specifications/rest/xsd/xmlexamples/MobileContent.xml new file mode 100644 index 0000000..e89037e --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/MobileContent.xml @@ -0,0 +1,5 @@ + + + Title + This is a summary + diff --git a/doc/specifications/rest/xsd/xmlexamples/Policy.xml b/doc/specifications/rest/xsd/xmlexamples/Policy.xml new file mode 100644 index 0000000..1fdc508 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Policy.xml @@ -0,0 +1,20 @@ + + + 45 + content + create + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/PolicyCreate.xml b/doc/specifications/rest/xsd/xmlexamples/PolicyCreate.xml new file mode 100644 index 0000000..567b098 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/PolicyCreate.xml @@ -0,0 +1,17 @@ + + + content + create + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/PolicyList.xml b/doc/specifications/rest/xsd/xmlexamples/PolicyList.xml new file mode 100644 index 0000000..cf31336 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/PolicyList.xml @@ -0,0 +1,36 @@ + + + + 45 + content + create + + + + + + + + + + + + + + + + + 45 + content + read + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/PolicyUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/PolicyUpdate.xml new file mode 100644 index 0000000..abdcb82 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/PolicyUpdate.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/Query.xml b/doc/specifications/rest/xsd/xmlexamples/Query.xml new file mode 100644 index 0000000..e260228 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Query.xml @@ -0,0 +1,20 @@ + + + + + article + + EQ + title + Title + + + + 10 + 0 + + + NAME + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/Relation.xml b/doc/specifications/rest/xsd/xmlexamples/Relation.xml new file mode 100644 index 0000000..14fcb7d --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Relation.xml @@ -0,0 +1,18 @@ + + + + + + COMMON + + + + + body + EMBED + + diff --git a/doc/specifications/rest/xsd/xmlexamples/RelationCreate.xml b/doc/specifications/rest/xsd/xmlexamples/RelationCreate.xml new file mode 100644 index 0000000..b88b990 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/RelationCreate.xml @@ -0,0 +1,4 @@ + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/Role.xml b/doc/specifications/rest/xsd/xmlexamples/Role.xml new file mode 100644 index 0000000..5e1da65 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Role.xml @@ -0,0 +1,5 @@ + + + NewRole + + diff --git a/doc/specifications/rest/xsd/xmlexamples/RoleAssignInput.xml b/doc/specifications/rest/xsd/xmlexamples/RoleAssignInput.xml new file mode 100644 index 0000000..b83b8f4 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/RoleAssignInput.xml @@ -0,0 +1,7 @@ + + + + + 1 4 + + diff --git a/doc/specifications/rest/xsd/xmlexamples/RoleAssignmentList.xml b/doc/specifications/rest/xsd/xmlexamples/RoleAssignmentList.xml new file mode 100644 index 0000000..41abf18 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/RoleAssignmentList.xml @@ -0,0 +1,18 @@ + + + + + + + + /1/23/88 /1/32/67 + + + + + + 1 4 + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/RoleInput.xml b/doc/specifications/rest/xsd/xmlexamples/RoleInput.xml new file mode 100644 index 0000000..c579413 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/RoleInput.xml @@ -0,0 +1,4 @@ + + + NewRole + diff --git a/doc/specifications/rest/xsd/xmlexamples/Root.xml b/doc/specifications/rest/xsd/xmlexamples/Root.xml new file mode 100644 index 0000000..f1bd422 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Root.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/Section.xml b/doc/specifications/rest/xsd/xmlexamples/Section.xml new file mode 100644 index 0000000..3f1413d --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Section.xml @@ -0,0 +1,6 @@ + +
+ 3 + Media + media +
diff --git a/doc/specifications/rest/xsd/xmlexamples/SectionCreate.xml b/doc/specifications/rest/xsd/xmlexamples/SectionCreate.xml new file mode 100644 index 0000000..9d92bb9 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/SectionCreate.xml @@ -0,0 +1,5 @@ + + + restricted + Restricted + diff --git a/doc/specifications/rest/xsd/xmlexamples/SectionList.xml b/doc/specifications/rest/xsd/xmlexamples/SectionList.xml new file mode 100644 index 0000000..b040ea8 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/SectionList.xml @@ -0,0 +1,23 @@ + + +
+ 1 + standard + Standard +
+
+ 2 + users + Users +
+
+ 3 + media + Media +
+
+ 4 + setup + Setup +
+
diff --git a/doc/specifications/rest/xsd/xmlexamples/User.xml b/doc/specifications/rest/xsd/xmlexamples/User.xml new file mode 100644 index 0000000..3c50aff --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/User.xml @@ -0,0 +1,45 @@ + + + + John + +
+ + + + 2001-04-01T12:00:00 + 2001-04-01T12:00:00 + eng-US + true + john + john.doe@example.net + true + + + 1243 + 1 + PUBLISHED + 2001-04-01T12:00:00 + + 2001-04-01T12:00:00 + eng-UK + + + + + first_name + eng-US + John + + + last_name + eng-US + Doe + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/UserCreate.xml b/doc/specifications/rest/xsd/xmlexamples/UserCreate.xml new file mode 100644 index 0000000..8f25361 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/UserCreate.xml @@ -0,0 +1,20 @@ + + + eng-US + remoteId-qwert426 + john + john.doe@example.net + john-does-password + + + first_name + eng-US + John + + + last_name + eng-US + Doe + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/UserGroup.xml b/doc/specifications/rest/xsd/xmlexamples/UserGroup.xml new file mode 100644 index 0000000..5288d68 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/UserGroup.xml @@ -0,0 +1,45 @@ + + + + UserGroup + +
+ + + + 2012-02-31T16:00:00 + 2012-02-31T16:00:00 + eng-UK + true + + + 123 + 2 + PUBLISHED + 2012-02-31T16:00:00 + + 2012-02-31T16:00:00 + eng-UK + + + + + 1234 + name + eng-UK + UserGroup + + + 1235 + description + eng-UK + This is the description of the user group + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/UserGroupCreate.xml b/doc/specifications/rest/xsd/xmlexamples/UserGroupCreate.xml new file mode 100644 index 0000000..c79bdef --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/UserGroupCreate.xml @@ -0,0 +1,17 @@ + + + eng-US + remoteId-qwert098 + + + name + eng-US + UserGroup + + + description + eng-US + Group Descruption + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/UserGroupRefList.xml b/doc/specifications/rest/xsd/xmlexamples/UserGroupRefList.xml new file mode 100644 index 0000000..00f4746 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/UserGroupRefList.xml @@ -0,0 +1,10 @@ + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/UserGroupUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/UserGroupUpdate.xml new file mode 100644 index 0000000..f7d7894 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/UserGroupUpdate.xml @@ -0,0 +1,10 @@ + + + + + description + eng-US + This is another description + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/UserUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/UserUpdate.xml new file mode 100644 index 0000000..96a4930 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/UserUpdate.xml @@ -0,0 +1,16 @@ + + + john.doe@mooglemail.com + + + signature + eng-US + + John Doe + Example Systems + john.doe@mooglemail.com + skype: johndoe + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/Version.xml b/doc/specifications/rest/xsd/xmlexamples/Version.xml new file mode 100644 index 0000000..332ef75 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/Version.xml @@ -0,0 +1,49 @@ + + + + 45 + 4 + DRAFT + 2012-02-20T12:00:00 + + 22012-02-20T12:00:00 + ger-DE + + Name + Name + + + + + + 1234 + title + ger-DE + Titel + + + 1235 + summary + ger-DE + Dies ist eine Zusammenfassungy + + + authors + ger-DE + + + + + + + + + + + + COMMON + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/VersionInfo.xml b/doc/specifications/rest/xsd/xmlexamples/VersionInfo.xml new file mode 100644 index 0000000..11572df --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/VersionInfo.xml @@ -0,0 +1,15 @@ + + + 0 + 0 + DRAFT + 2001-12-31T12:00:00 + + 2001-12-31T12:00:00 + initialLanguageCode + array() + + value + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/VersionInfoList.xml b/doc/specifications/rest/xsd/xmlexamples/VersionInfoList.xml new file mode 100644 index 0000000..c755031 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/VersionInfoList.xml @@ -0,0 +1,65 @@ + + + + + 12 + 1 + ARCHIVED + 2012-02-15T12:00:00 + + 22012-02-15T12:00:00 + eng-US + + Name + + + + + + + 22 + 2 + PUBLISHED + 2012-02-17T12:00:00 + + 22012-02-17T12:00:00 + eng-US + + Name + + + + + + + 44 + 3 + DRAFT + 2012-02-19T12:00:00 + + 22012-02-19T12:00:00 + fra-FR + + Name + Nom + + + + + + + 45 + 4 + DRAFT + 2012-02-20T12:00:00 + + 22012-02-20T12:00:00 + ger-DE + + Name + Name + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/VersionUpdate.xml b/doc/specifications/rest/xsd/xmlexamples/VersionUpdate.xml new file mode 100644 index 0000000..b536d16 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/VersionUpdate.xml @@ -0,0 +1,20 @@ + + + 2001-12-31T12:00:00 + + + 1234 + title + ger-DE + Neuer Titel + + + 1235 + summary + ger-DE + Dies ist eine neue Zusammenfassungy + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/View.xml b/doc/specifications/rest/xsd/xmlexamples/View.xml new file mode 100644 index 0000000..8364fde --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/View.xml @@ -0,0 +1,36 @@ + + + identifier + + true + + + + + 0 + 0 + + + + + + PATH + + + true + + + + + + hightlight + + + + + + + + + + diff --git a/doc/specifications/rest/xsd/xmlexamples/ViewInput.xml b/doc/specifications/rest/xsd/xmlexamples/ViewInput.xml new file mode 100644 index 0000000..ef31b70 --- /dev/null +++ b/doc/specifications/rest/xsd/xmlexamples/ViewInput.xml @@ -0,0 +1,24 @@ + + + ArticleTitleView + + + + article + + EQ + title + Title + + + + 10 + 0 + + + NAME + + + + + diff --git a/docblox.dist.xml b/docblox.dist.xml new file mode 100644 index 0000000..e319045 --- /dev/null +++ b/docblox.dist.xml @@ -0,0 +1,16 @@ + + + + doc/apidoc + + + doc/apidoc + + + . + doc/* + ezp/*/Tests/* + eZ/Publish/SPI/Persistence/Storage/*/Tests/* + eZ/Publish/Core/*/Tests/* + + diff --git a/eZ/Bundle/EzPublishCoreBundle/ApiLoader/Exception/InvalidStorageEngine.php b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/Exception/InvalidStorageEngine.php new file mode 100644 index 0000000..e93e6b0 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/Exception/InvalidStorageEngine.php @@ -0,0 +1,16 @@ +container = $container; + } + + /** + * Returns a closure which returns ezpublish.api.repository when called. + * + * To be used when lazy loading is needed. + * + * @return \Closure + */ + public function buildRepository() + { + $container = $this->container; + return function () use ( $container ) + { + static $repository; + if ( !$repository instanceof Repository ) + { + $repository = $container->get( 'ezpublish.api.repository' ); + } + + return $repository; + }; + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/ApiLoader/LegacyDbHandlerFactory.php b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/LegacyDbHandlerFactory.php new file mode 100644 index 0000000..2bcab31 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/LegacyDbHandlerFactory.php @@ -0,0 +1,39 @@ +configResolver = $resolver; + } + + /** + * Builds the DB handler used by the legacy storage engine. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + public function buildLegacyDbHandler() + { + return EzcDbHandler::create( + $this->configResolver->getParameter( 'database.params' ) + ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/ApiLoader/LegacyStorageEngineFactory.php b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/LegacyStorageEngineFactory.php new file mode 100644 index 0000000..5346900 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/LegacyStorageEngineFactory.php @@ -0,0 +1,72 @@ +container = $container; + } + + /** + * Registers a field type converter as expected in legacy storage engine. + * $className must implement eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter interface. + * + * @param string $typeIdentifier Field type identifier the converter will be used for + * @param string $className FQN of the converter class + */ + public function registerFieldTypeConverter( $typeIdentifier, $className ) + { + $this->converters[$typeIdentifier] = $className; + } + + /** + * Builds the Legacy Storage Engine + * + * @param \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler $dbhandler + * @param boolean $deferTypeUpdate + * + * @return \eZ\Publish\Core\Persistence\Legacy\Handler + */ + public function buildLegacyEngine( EzcDbHandler $dbhandler, $deferTypeUpdate ) + { + $legacyEngineClass = $this->container->getParameter( 'ezpublish.api.storage_engine.legacy.class' ); + return new $legacyEngineClass( + $dbhandler, + new ConverterRegistry( $this->converters ), + new StorageRegistry( + $this->container->get( 'ezpublish.api.repository.factory' )->getExternalStorageHandlers() + ), + $this->container->get( 'ezpublish.api.storage_engine.legacy.transformation_processor' ), + array( + 'defer_type_update' => (bool)$deferTypeUpdate, + ) + ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/ApiLoader/RepositoryFactory.php b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/RepositoryFactory.php new file mode 100644 index 0000000..7f15389 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/RepositoryFactory.php @@ -0,0 +1,153 @@ +container = $container; + } + + /** + * Builds the main repository, heart of eZ Publish API + * + * This always returns the true inner Repository, please depend on ezpublish.api.repository and not this method + * directly to make sure you get an instance wrapped inside Signal / Cache / * functionality. + * + * @param \eZ\Publish\SPI\Persistence\Handler $persistenceHandler + * @param \eZ\Publish\SPI\IO\Handler $ioHandler + * + * @return \eZ\Publish\API\Repository\Repository + */ + public function buildRepository( PersistenceHandler $persistenceHandler, IoHandler $ioHandler ) + { + /** @var $configResolver \eZ\Publish\Core\MVC\ConfigResolverInterface */ + $configResolver = $this->container->get( 'ezpublish.config.resolver' ); + $repositoryClass = $this->container->getParameter( 'ezpublish.api.inner_repository.class' ); + return new $repositoryClass( + $persistenceHandler, + $ioHandler, + array( + 'fieldType' => $this->fieldTypes, + 'role' => array( + 'limitationTypes' => $this->roleLimitations + ), + 'languages' => $configResolver->getParameter( 'languages' ) + ) + ); + } + + /** + * Registers an eZ Publish field type. + * Field types are being registered as a closure so that they will be lazy loaded. + * + * @param string $fieldTypeServiceId The field type service Id + * @param string $fieldTypeAlias The field type alias (e.g. "ezstring") + */ + public function registerFieldType( $fieldTypeServiceId, $fieldTypeAlias ) + { + $container = $this->container; + $this->fieldTypes[$fieldTypeAlias] = function() use ( $container, $fieldTypeServiceId ) + { + return $container->get( $fieldTypeServiceId ); + }; + } + + /** + * Registers an external storage handler for a field type, identified by $fieldTypeAlias. + * They are being registered as closures so that they will be lazy loaded. + * + * @param string $serviceId The external storage handler service Id + * @param string $fieldTypeAlias The field type alias (e.g. "ezstring") + */ + public function registerExternalStorageHandler( $serviceId, $fieldTypeAlias ) + { + $container = $this->container; + $this->externalStorages[$fieldTypeAlias] = function () use ( $container, $serviceId ) + { + return $container->get( $serviceId ); + }; + } + + /** + * Registers a limitation type for the RoleService. + * + * @param string $limitationName + * @param \eZ\Publish\SPI\Limitation\Type $limitationType + */ + public function registerLimitationType( $limitationName, SPILimitationType $limitationType ) + { + $this->roleLimitations[$limitationName] = $limitationType; + } + + /** + * Returns registered external storage handlers for field types (as closures to be lazy loaded in the public API) + * + * @return \Closure[] + */ + public function getExternalStorageHandlers() + { + return $this->externalStorages; + } + + /** + * Returns a service based on a name string (content => contentService, etc) + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param string $serviceName + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException + * + * @return mixed + */ + public function buildService( Repository $repository, $serviceName ) + { + $methodName = 'get' . $serviceName . 'Service'; + if ( !method_exists( $repository, $methodName ) ) + { + throw new InvalidArgumentException( $serviceName, "No such service" ); + } + return $repository->$methodName(); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/ApiLoader/StorageEngineFactory.php b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/StorageEngineFactory.php new file mode 100644 index 0000000..67db407 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/ApiLoader/StorageEngineFactory.php @@ -0,0 +1,70 @@ +container = $container; + } + + /** + * Registers $storageEngineServiceId as a service Id to be used as a valid storage engine, with identifier $storageEngineIdentifier + * + * @param string $storageEngineServiceId + * @param string $storageEngineIdentifier + */ + public function registerStorageEngine( $storageEngineServiceId, $storageEngineIdentifier ) + { + $this->storageEngines[$storageEngineIdentifier] = $storageEngineServiceId; + } + + /** + * Builds storage engine identified by $storageEngineIdentifier (the "alias" attribute in the service tag) + * + * @param string $storageEngineIdentifier The storage engine identifier + * + * @throws \eZ\Bundle\EzPublishCoreBundle\ApiLoader\Exception\InvalidStorageEngine + * + * @return \eZ\Publish\SPI\Persistence\Handler + */ + public function buildStorageEngine( $storageEngineIdentifier ) + { + if ( !isset( $this->storageEngines[$storageEngineIdentifier] ) ) + { + throw new InvalidStorageEngine( + "Invalid storage engine '$storageEngineIdentifier'. Could not find any service tagged as ezpublish.storageEngine with alias $storageEngineIdentifier." + ); + } + + $serviceId = $this->storageEngines[$storageEngineIdentifier]; + return $this->container->get( $serviceId ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Console/Application.php b/eZ/Bundle/EzPublishCoreBundle/Console/Application.php new file mode 100644 index 0000000..6413169 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Console/Application.php @@ -0,0 +1,60 @@ +getDefinition()->addOption( + new InputOption( '--siteaccess', null, InputOption::VALUE_OPTIONAL, 'SiteAccess to use for operations. If not provided, default siteaccess will be used' ) + ); + } + + public function doRun( InputInterface $input, OutputInterface $output ) + { + $this->siteAccessName = $input->getParameterOption( '--siteaccess', null ); + return parent::doRun( $input, $output ); + } + + protected function registerCommands() + { + parent::registerCommands(); + + $container = $this->getKernel()->getContainer(); + $this->siteAccessName = $this->siteAccessName ?: $container->getParameter( 'ezpublish.siteaccess.default' ); + $siteAccess = new SiteAccess( $this->siteAccessName, 'cli' ); + $container->set( 'ezpublish.siteaccess', $siteAccess ); + + // Replacing legacy kernel handler web by the CLI one + // @todo: this should be somewhat done in the legacy bundle + $legacyHandlerCLI = $container->get( 'ezpublish_legacy.kernel_handler.cli' ); + $container->set( 'ezpublish_legacy.kernel_handler', $legacyHandlerCLI ); + $container->set( 'ezpublish_legacy.kernel_handler.web', $legacyHandlerCLI ); + } + +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Controller.php b/eZ/Bundle/EzPublishCoreBundle/Controller.php new file mode 100644 index 0000000..638cb64 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Controller.php @@ -0,0 +1,68 @@ +container->has( 'ezpublish.api.repository' ) ) + throw new \LogicException( 'The EzPublishCoreBundle has not been registered in your application.' ); + + return $this->container->get( 'ezpublish.api.repository' ); + } + + /** + * Returns the legacy kernel object. + * + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + final protected function getLegacyKernel() + { + if ( !isset( $this->legacyKernelClosure ) ) + $this->legacyKernelClosure = $this->get( 'ezpublish_legacy.kernel' ); + + $legacyKernelClosure = $this->legacyKernelClosure; + return $legacyKernelClosure(); + } + + /** + * @return \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver + */ + protected function getConfigResolver() + { + return $this->container->get( 'ezpublish.config.resolver' ); + } + + /** + * Checks if current user has granted access to provided attribute + * + * @param \eZ\Publish\Core\MVC\Symfony\Security\Authorization\Attribute $attribute + * + * @return boolean + */ + public function isGranted( AuthorizationAttribute $attribute ) + { + return $this->container->get( 'security.context' )->isGranted( $attribute ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/AddFieldTypePass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/AddFieldTypePass.php new file mode 100644 index 0000000..4ac647e --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/AddFieldTypePass.php @@ -0,0 +1,115 @@ +hasDefinition( 'ezpublish.api.repository.factory' ) ) + return; + + $repositoryFactoryDef = $container->getDefinition( 'ezpublish.api.repository.factory' ); + + // Field types. + // Alias attribute is the field type string. + foreach ( $container->findTaggedServiceIds( 'ezpublish.fieldType' ) as $id => $attributes ) + { + if ( !isset( $attributes[0]['alias'] ) ) + throw new \LogicException( 'ezpublish.fieldType service tag needs an "alias" attribute to identify the field type. None given.' ); + + $repositoryFactoryDef->addMethodCall( + 'registerFieldType', + array( + // Only pass the service Id since field types will be lazy loaded via the service container + $id, + $attributes[0]['alias'] + ) + ); + } + + // Gateways for external storage handlers. + // Alias attribute is the corresponding field type string. + $externalStorageGateways = array(); + // Referencing the services by alias (field type string) + foreach ( $container->findTaggedServiceIds( 'ezpublish.fieldType.externalStorageHandler.gateway' ) as $id => $attributes ) + { + if ( !isset( $attributes[0]['alias'] ) ) + throw new \LogicException( 'ezpublish.fieldType.externalStorageHandler.gateway service tag needs an "alias" attribute to identify the field type. None given.' ); + + if ( !isset( $attributes[0]['identifier'] ) ) + throw new \LogicException( 'ezpublish.fieldType.externalStorageHandler.gateway service tag needs an "identifier" attribute to identify the gateway. None given.' ); + + $externalStorageGateways[$attributes[0]['alias']] = array( + 'id' => $id, + 'identifier' => $attributes[0]['identifier'] + ); + } + + // External storage handlers for field types that need them. + // Alias attribute is the field type string. + foreach ( $container->findTaggedServiceIds( 'ezpublish.fieldType.externalStorageHandler' ) as $id => $attributes ) + { + if ( !isset( $attributes[0]['alias'] ) ) + throw new \LogicException( 'ezpublish.fieldType.externalStorageHandler service tag needs an "alias" attribute to identify the field type. None given.' ); + + // If the storage handler is gateway based, then we need to add a corresponding gateway to it. + // Will throw a LogicException if no gateway is defined for this field type. + $storageHandlerDef = $container->findDefinition( $id ); + $storageHandlerClass = $storageHandlerDef->getClass(); + if ( preg_match( '/^%([^%\s]+)%$/', $storageHandlerClass, $match ) ) + $storageHandlerClass = $container->getParameter( $match[1] ); + + if ( + is_subclass_of( + $storageHandlerClass, + 'eZ\\Publish\\Core\\FieldType\\GatewayBasedStorage' + ) + ) + { + if ( !isset( $externalStorageGateways[$attributes[0]['alias']] ) ) + throw new \LogicException( + "External storage handler '$id' for field type {$attributes[0]['alias']} needs a storage gateway but none was given. + Consider defining a storage gateway as a service for this field type and add the 'ezpublish.fieldType.externalStorageHandler.gateway tag'" + ); + + $storageHandlerDef->addMethodCall( + 'addGateway', + array( + $externalStorageGateways[$attributes[0]['alias']]['identifier'], + new Reference( $externalStorageGateways[$attributes[0]['alias']]['id'] ) + ) + ); + } + + $repositoryFactoryDef->addMethodCall( + 'registerExternalStorageHandler', + array( + // Only pass the service Id since field types will be lazy loaded via the service container + $id, + $attributes[0]['alias'] + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainConfigResolverPass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainConfigResolverPass.php new file mode 100644 index 0000000..32644f1 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainConfigResolverPass.php @@ -0,0 +1,49 @@ +hasDefinition( 'ezpublish.config.resolver.chain' ) ) + return; + + $chainResolver = $container->getDefinition( 'ezpublish.config.resolver.chain' ); + + foreach ( $container->findTaggedServiceIds( 'ezpublish.config.resolver' ) as $id => $attributes ) + { + $priority = isset( $attributes[0]['priority'] ) ? (int)$attributes[0]['priority'] : 0; + // Priority range is between -255 (the lowest) and 255 (the highest) + if ( $priority > 255 ) + $priority = 255; + if ( $priority < -255 ) + $priority = -255; + + $chainResolver->addMethodCall( + 'addResolver', + array( + new Reference( $id ), + $priority + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainRoutingPass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainRoutingPass.php new file mode 100644 index 0000000..16ecabd --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ChainRoutingPass.php @@ -0,0 +1,63 @@ +hasDefinition( 'ezpublish.chain_router' ) ) + return; + + $chainRouter = $container->getDefinition( 'ezpublish.chain_router' ); + + // Enforce default router to be part of the routing chain + // The default router will be given the highest priority so that it will be used by default + if ( $container->hasDefinition( 'router.default' ) ) + { + $defaultRouter = $container->getDefinition( 'router.default' ); + if ( !$defaultRouter->hasTag( 'router' ) ) + { + $defaultRouter->addTag( + 'router', + array( 'priority' => 255 ) + ); + } + } + + foreach ( $container->findTaggedServiceIds( 'router' ) as $id => $attributes ) + { + $priority = isset( $attributes[0]['priority'] ) ? (int)$attributes[0]['priority'] : 0; + // Priority range is between -255 (the lowest) and 255 (the highest) + if ( $priority > 255 ) + $priority = 255; + if ( $priority < -255 ) + $priority = -255; + + $chainRouter->addMethodCall( + 'add', + array( + new Reference( $id ), + $priority + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ContentViewPass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ContentViewPass.php new file mode 100644 index 0000000..3f78eff --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ContentViewPass.php @@ -0,0 +1,23 @@ +hasDefinition( 'ezpublish.api.storage_engine.legacy.factory' ) ) + return; + + $legacyStorageEngineDef = $container->getDefinition( 'ezpublish.api.storage_engine.legacy.factory' ); + + foreach ( $container->findTaggedServiceIds( 'ezpublish.storageEngine.legacy.converter' ) as $id => $attributes ) + { + if ( isset( $attributes[0]['lazy'] ) && $attributes[0]['lazy'] === true ) + { + if ( !isset( $attributes[0]['callback'] ) ) + throw new LogicException( "Converter service '$id' is marked as lazy but no callback is provided! Please provide a callback." ); + + $converter = $attributes[0]['callback']; + if ( strpos( $converter, '::' ) === 0 ) + { + $converter = $container->getDefinition( $id )->getClass() . $converter; + } + } + else + { + $converter = new Reference( $id ); + } + + $legacyStorageEngineDef->addMethodCall( + 'registerFieldTypeConverter', + array( + // @todo: Maybe there should be some validation here. What if no alias is provided ? + $attributes[0]['alias'], + $converter + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/LocationViewPass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/LocationViewPass.php new file mode 100644 index 0000000..c34d71f --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/LocationViewPass.php @@ -0,0 +1,23 @@ +hasDefinition( 'ezpublish.api.repository.factory' ) ) + return; + + $repositoryFactoryDef = $container->getDefinition( 'ezpublish.api.repository.factory' ); + + // Limitation types. + // Alias attribute is the limitation type name. + foreach ( $container->findTaggedServiceIds( 'ezpublish.limitationType' ) as $id => $attributes ) + { + if ( !isset( $attributes[0]['alias'] ) ) + throw new \LogicException( 'ezpublish.limitationType service tag needs an "alias" attribute to identify the limitation type. None given.' ); + + $repositoryFactoryDef->addMethodCall( + 'registerLimitationType', + array( + $attributes[0]['alias'], + new Reference( $id ) + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/RegisterStorageEnginePass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/RegisterStorageEnginePass.php new file mode 100644 index 0000000..2ffce71 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/RegisterStorageEnginePass.php @@ -0,0 +1,43 @@ +hasDefinition( 'ezpublish.api.storage_engine.factory' ) ) + return; + + $storageEngineFactoryDef = $container->getDefinition( 'ezpublish.api.storage_engine.factory' ); + + foreach ( $container->findTaggedServiceIds( 'ezpublish.storageEngine' ) as $id => $attributes ) + { + $storageEngineFactoryDef->addMethodCall( + 'registerStorageEngine', + array( + $id, + // @todo: Maybe there should be some validation here. What if no alias is provided ? + $attributes[0]['alias'] + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/TwigTweaksPass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/TwigTweaksPass.php new file mode 100644 index 0000000..ef067f3 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/TwigTweaksPass.php @@ -0,0 +1,39 @@ +hasDefinition( 'twig.loader.chain' ) ) + return; + + // Add registered loaders to the chain loader + $refChainLoader = $container->getDefinition( 'twig.loader.chain' ); + foreach ( $container->findTaggedServiceIds( 'twig.loader' ) as $id => $attributes ) + { + $refChainLoader->addMethodCall( 'addLoader', array( new Reference( $id ) ) ); + } + + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ViewPass.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ViewPass.php new file mode 100644 index 0000000..1aaa4bb --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Compiler/ViewPass.php @@ -0,0 +1,49 @@ +hasDefinition( "ezpublish.view_manager" ) ) + return; + + $viewManagerDef = $container->getDefinition( "ezpublish.view_manager" ); + foreach ( $container->findTaggedServiceIds( static::VIEW_PROVIDER_IDENTIFIER ) as $id => $attributes ) + { + $priority = isset( $attributes[0]["priority"] ) ? (int)$attributes[0]["priority"] : 0; + // Priority range is between -255 (the lowest) and 255 (the highest) + $priority = max( min( $priority, 255 ), -255 ); + + $viewManagerDef->addMethodCall( + static::ADD_VIEW_PROVIDER_METHOD, + array( + new Reference( $id ), + $priority + ) + ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..85d44fa --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration.php @@ -0,0 +1,232 @@ +configParsers = $configParsers; + } + + /** + * Generates the configuration tree builder. + * + * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder The tree builder + */ + public function getConfigTreeBuilder() + { + $treeBuilder = new TreeBuilder(); + $rootNode = $treeBuilder->root( 'ezpublish' ); + + $this->addSiteaccessSection( $rootNode ); + $this->addImageMagickSection( $rootNode ); + $this->addHttpCacheSection( $rootNode ); + $this->addSystemSection( $rootNode ); + + return $treeBuilder; + } + + public function addSiteaccessSection( ArrayNodeDefinition $rootNode ) + { + $rootNode + ->children() + ->arrayNode( 'siteaccess' ) + ->info( 'SiteAccess configuration' ) + ->children() + ->arrayNode( 'list' ) + ->info( 'Available SiteAccess list' ) + ->example( array( 'ezdemo_site', 'ezdemo_site_admin' ) ) + ->isRequired() + ->requiresAtLeastOneElement() + ->prototype( 'scalar' )->end() + ->end() + ->arrayNode( 'groups' ) + ->useAttributeAsKey( 'key' ) + ->info( 'SiteAccess groups. Useful to share settings between Siteaccess' ) + ->example( array( 'ezdemo_group' => array( 'ezdemo_site', 'ezdemo_site_admin' ) ) ) + ->prototype( 'array' ) + ->requiresAtLeastOneElement() + ->prototype( 'scalar' )->end() + ->end() + ->end() + ->scalarNode( 'default_siteaccess' )->isRequired()->info( 'Name of the default siteaccess' )->end() + ->arrayNode( 'match' ) + ->info( 'Siteaccess match configuration. First key is the matcher class, value is passed to the matcher' ) + ->example( + array( + 'Map\\URI' => array( + 'foo' => 'ezdemo_site', + 'ezdemo_site' => 'ezdemo_site', + 'ezdemo_site_admin' => 'ezdemo_site_admin' + ), + 'Map\\Host' => array( + 'ezpublish.dev' => 'ezdemo_site', + 'admin.ezpublish.dev' => 'ezdemo_site_admin' + ) + ) + ) + ->isRequired() + ->useAttributeAsKey( 'key' ) + ->prototype( 'array' ) + ->beforeNormalization() + // Value passed to the matcher should always be an array. + // If value is not an array, we transform it to a hash, with 'value' as key. + ->ifTrue( + function ( $v ) + { + return !is_array( $v ); + } + ) + ->then( + function ( $v ) + { + return array( 'value' => $v ); + } + ) + ->end() + ->useAttributeAsKey( 'key' ) + ->prototype( 'variable' )->end() + ->end() + ->end() + ->end() + ->end() + ->end(); + } + + private function addSystemSection( ArrayNodeDefinition $rootNode ) + { + $systemNodeBuilder = $rootNode + ->children() + ->arrayNode( 'system' ) + ->info( 'System configuration. First key is always a siteaccess or siteaccess group name' ) + ->example( + array( + 'ezdemo_site' => array( + 'languages' => array( 'eng-GB', 'fre-FR' ), + 'content' => array( + 'view_cache' => true, + 'ttl_cache' => true, + 'default_ttl' => 30 + ) + ), + 'ezdemo_group' => array( + 'database' => array( + 'type' => 'mysql', + 'server' => 'localhost', + 'port' => 3306, + 'user' => 'root', + 'password' => 'root', + 'database_name' => 'ezdemo' + ) + ) + ) + ) + ->useAttributeAsKey( 'key' ) + ->requiresAtLeastOneElement() + ->prototype( 'array' ) + ->children(); + + // Delegate to configuration parsers + foreach ( $this->configParsers as $parser ) + { + $parser->addSemanticConfig( $systemNodeBuilder ); + } + } + + private function addImageMagickSection( ArrayNodeDefinition $rootNode ) + { + $filtersInfo = +<<children() + ->arrayNode( 'imagemagick' ) + ->info( 'ImageMagick configuration' ) + ->children() + ->booleanNode( 'enabled' )->defaultTrue()->end() + ->scalarNode( 'path' ) + ->info( 'Absolute path of ImageMagick / GraphicsMagick "convert" binary.' ) + ->beforeNormalization() + ->ifTrue( + function ( $v ) + { + $basename = basename( $v ); + // If there is a space in the basename, just drop it and everything after it. + if ( ( $wsPos = strpos( $basename, ' ' ) ) !== false ) + { + $basename = substr( $basename, 0, $wsPos ); + } + return !is_executable( dirname( $v ) . DIRECTORY_SEPARATOR . $basename ); + } + ) + ->thenInvalid( 'Please provide full path to ImageMagick / GraphicsMagick "convert" binary. Please also check that it is executable.' ) + ->end() + ->end() + ->arrayNode( 'filters' ) + ->info( $filtersInfo ) + ->example( array( 'geometry/scaledownonly' => '"-geometry {1}x{2}>"' ) ) + ->end() + ->end() + ->end() + ->end(); + } + + private function addHttpCacheSection( ArrayNodeDefinition $rootNode ) + { + $purgeTypeInfo = <<children() + ->arrayNode( 'http_cache' ) + ->info( 'Http cache configuration' ) + ->children() + ->scalarNode( 'purge_type' ) + ->info( $purgeTypeInfo ) + ->defaultValue( 'local' ) + ->end() + ->scalarNode( 'timeout' ) + ->info( 'Timeout for each Http PURGE request, in seconds.' ) + ->validate() + ->ifTrue( + function ( $v ) + { + return !is_int( $v ); + } + ) + ->thenInvalid( 'ezpublish.http_cache.timeout can only be an integer.' ) + ->end() + ->defaultValue( 1 ) + ->end() + ->end() + ->end() + ->end(); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/AbstractParser.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/AbstractParser.php new file mode 100644 index 0000000..fe925f8 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/AbstractParser.php @@ -0,0 +1,247 @@ + + * $this->registerInternalConfigArray( 'key', $config, $container ); + * + * This method will look for the 'key' array in the configuration provided in + * $config and will merge the arrays from default, group, siteaccess and global + * scopes in the correct order to compute the value for each siteaccess. + */ +abstract class AbstractParser implements Parser +{ + /** + * With this option, AbstractParser::registerInternalConfigArray() will + * call array_unique() at the end of the merge process. This will only work + * with normal arrays (ie not hashes) containing scalar values. + */ + const UNIQUE = 1; + + /** + * With this option, AbstractParser::registerInternalConfigArray() will + * merge the hashes from the second level. For instance: + * array( 'full' => array( 1, 2, 3 ) ) and array( 'full' => array( 4, 5 ) ) + * will result in array( 'full' => array( 1, 2, 3, 4, 5 ) ) + */ + const MERGE_FROM_SECOND_LEVEL = 2; + + /** + * The base key where to look for the configuration. 'system' by default. + * + * @var string + */ + protected $baseKey = 'system'; + + /** + * Sets the base key of this parser. + * + * @param string $key + */ + public function setBaseKey( $key ) + { + $this->baseKey = $key; + } + + /** + * Returns the value under the $id in the $container. if the container does + * not known this $id, returns $default + * + * @param ContainerBuilder $container + * @param string $id + * @param mixed $default + * + * @return mixed + */ + protected function getContainerParameter( ContainerBuilder $container, $id, $default = null ) + { + if ( $container->hasParameter( $id ) ) + { + return $container->getParameter( $id ); + } + return $default; + } + + /** + * Merges setting array for a set of groups. + * + * @param array $groups array of group name + * @param string $id id of the setting array under ezpublish.. + * @param array $config the full configuration array + * @param int $options only self::MERGE_FROM_SECOND_LEVEL or self::UNIQUE are recognized + * + * @return array + */ + protected function groupsArraySetting( array $groups, $id, array $config, $options = 0 ) + { + $groupsSettings = array(); + sort( $groups ); + foreach ( $groups as $group ) + { + if ( isset( $config[$this->baseKey][$group][$id] ) ) + { + if ( $options & self::MERGE_FROM_SECOND_LEVEL ) + { + foreach ( array_keys( $config[$this->baseKey][$group][$id] ) as $key ) + { + if ( !isset( $groupsSettings[$key] ) ) + { + $groupsSettings[$key] = $config[$this->baseKey][$group][$id][$key]; + } + else + { + // array_merge() has to be used because we don't + // know whether we have a hash or a plain array + $groupsSettings[$key] = array_merge( + $groupsSettings[$key], + $config[$this->baseKey][$group][$id][$key] + ); + } + } + } + else + { + // array_merge() has to be used because we don't + // know whether we have a hash or a plain array + $groupsSettings = array_merge( + $groupsSettings, + $config[$this->baseKey][$group][$id] + ); + } + } + } + return $groupsSettings; + } + + /** + * Make sure settings array defined in "global" siteaccess are registered + * in the internal global scope. + * + * @param string $id + * @param array $config + * @param ContainerBuilder $container + */ + protected function registerGlobalConfigArray( $id, array $config, ContainerBuilder $container ) + { + if ( isset( $config[$this->baseKey][ConfigResolver::SCOPE_GLOBAL][$id] ) + && !empty( $config[$this->baseKey][ConfigResolver::SCOPE_GLOBAL][$id] ) ) + { + $key = 'ezsettings.' . ConfigResolver::SCOPE_GLOBAL . '.' . $id; + $globalValue = $config[$this->baseKey][ConfigResolver::SCOPE_GLOBAL][$id]; + if ( $container->hasParameter( $key ) ) + { + $globalValue = array_merge( + $container->getParameter( $key ), + $globalValue + ); + } + $container->setParameter( $key, $globalValue ); + } + } + + /** + * Registers the internal configuration. For array settings, we merge the + * arrays defined in scopes default, in the siteaccess groups, in the + * siteaccess itself and in the global scope. To calculate the precedence + * of siteaccess group, they are alphabetically sorted. + * + * @param string $id id of the setting array to register + * @param array $config the full configuration as an array + * @param ContainerBuilder $container + * @param int $options bit mask of options (@see constants of this class) + */ + protected function registerInternalConfigArray( $id, array $config, ContainerBuilder $container, $options = 0 ) + { + $this->registerGlobalConfigArray( $id, $config, $container ); + $defaultSettings = $this->getContainerParameter( + $container, + 'ezsettings.' . ConfigResolver::SCOPE_DEFAULT . '.' . $id, + array() + ); + $globalSettings = $this->getContainerParameter( + $container, + 'ezsettings.' . ConfigResolver::SCOPE_GLOBAL . '.' . $id, + array() + ); + + $groupsBySiteaccess = $this->getContainerParameter( + $container, + 'ezpublish.siteaccess.groups_by_siteaccess', + array() + ); + + foreach ( $config['siteaccess']['list'] as $sa ) + { + // for a siteaccess, we have to merge the default value, + // the group value(s), the siteaccess value and the global + // value of the settings. + $groupsSettings = array(); + if ( isset( $groupsBySiteaccess[$sa] ) && is_array( $groupsBySiteaccess[$sa] ) ) + { + $groupsSettings = $this->groupsArraySetting( + $groupsBySiteaccess[$sa], $id, + $config, $options & self::MERGE_FROM_SECOND_LEVEL + ); + } + $siteaccessSettings = array(); + if ( isset( $config[$this->baseKey][$sa][$id] ) ) + { + $siteaccessSettings = $config[$this->baseKey][$sa][$id]; + } + if ( $options & self::MERGE_FROM_SECOND_LEVEL ) + { + // array_merge() has to be used because we don't + // know whether we have a hash or a plain array + $keys1 = array_unique( + array_merge( + array_keys( $defaultSettings ), + array_keys( $groupsSettings ), + array_keys( $siteaccessSettings ), + array_keys( $globalSettings ) + ) + ); + $mergedSettings = array(); + foreach ( $keys1 as $key ) + { + $mergedSettings[$key] = array_merge( + isset( $defaultSettings[$key] ) ? $defaultSettings[$key] : array(), + isset( $groupsSettings[$key] ) ? $groupsSettings[$key] : array(), + isset( $siteaccessSettings[$key] ) ? $siteaccessSettings[$key] : array(), + isset( $globalSettings[$key] ) ? $globalSettings[$key] : array() + ); + } + } + else + { + $mergedSettings = array_merge( + $defaultSettings, + $groupsSettings, + $siteaccessSettings, + $globalSettings + ); + } + if ( $options & self::UNIQUE ) + { + $mergedSettings = array_values( + array_unique( $mergedSettings ) + ); + } + + $container->setParameter( "ezsettings.$sa.$id", $mergedSettings ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/ChainConfigResolver.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/ChainConfigResolver.php new file mode 100644 index 0000000..3dc9fc1 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/ChainConfigResolver.php @@ -0,0 +1,146 @@ +resolvers[$priority] ) ) + $this->resolvers[$priority] = array(); + + $this->resolvers[$priority][] = $resolver; + $this->sortedResolvers = array(); + } + + /** + * @return \eZ\Publish\Core\MVC\ConfigResolverInterface[] + */ + public function getAllResolvers() + { + if ( empty( $this->sortedResolvers ) ) + $this->sortedResolvers = $this->sortResolvers(); + + return $this->sortedResolvers; + } + + /** + * Sort the registered mappers by priority. + * The highest priority number is the highest priority (reverse sorting) + * + * @return \eZ\Publish\Core\MVC\ConfigResolverInterface[] + */ + protected function sortResolvers() + { + $sortedResolvers = array(); + krsort( $this->resolvers ); + + foreach ( $this->resolvers as $resolvers ) + { + $sortedResolvers = array_merge( $sortedResolvers, $resolvers ); + } + + return $sortedResolvers; + } + + /** + * Returns value for $paramName, in $namespace. + * + * @param string $paramName The parameter name, without $prefix and the current scope (i.e. siteaccess name). + * @param string $namespace Namespace for the parameter name. If null, the default namespace should be used. + * @param string $scope The scope you need $paramName value for. + * + * @throws \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException + * + * @return mixed + */ + public function getParameter( $paramName, $namespace = null, $scope = null ) + { + foreach ( $this->getAllResolvers() as $resolver ) + { + try + { + return $resolver->getParameter( $paramName, $namespace, $scope ); + } + catch ( ParameterNotFoundException $e ) + { + // Do nothing, just let the next resolver handle it + } + } + + // Finally throw a ParameterNotFoundException since the chain resolver couldn't find any valid resolver for demanded parameter + throw new ParameterNotFoundException( $paramName, $namespace ); + } + + /** + * Checks if $paramName exists in $namespace + * + * @param string $paramName + * @param string $namespace If null, the default namespace should be used. + * @param string $scope The scope you need $paramName value for. + * + * @return boolean + */ + public function hasParameter( $paramName, $namespace = null, $scope = null ) + { + foreach ( $this->getAllResolvers() as $resolver ) + { + $hasParameter = $resolver->hasParameter( $paramName, $namespace, $scope ); + if ( $hasParameter ) + return true; + } + + return false; + } + + /** + * Changes the default namespace to look parameter into. + * + * @param string $defaultNamespace + */ + public function setDefaultNamespace( $defaultNamespace ) + { + foreach ( $this->getAllResolvers() as $resolver ) + { + $resolver->setDefaultNamespace( $defaultNamespace ); + } + } + + /** + * Not supported + * + * @throws \LogicException + */ + public function getDefaultNamespace() + { + throw new \LogicException( 'getDefaultNamespace() is not supported by the ChainConfigResolver' ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/ConfigResolver.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/ConfigResolver.php new file mode 100644 index 0000000..c0d3cf7 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/ConfigResolver.php @@ -0,0 +1,226 @@ +..parameter.name". + * + * - is the namespace for your dynamic setting. Defaults to "ezsettings", but can be anything. + * - is basically the siteaccess name you want your parameter value to apply to. + * Can also be "global" for a global override. + * Another scope is used internally: "default". This is the generic fallback. + * + * The resolve scope order is the following: + * 1. "global" + * 2. SiteAccess name + * 3. "default" + */ +class ConfigResolver implements ConfigResolverInterface +{ + const SCOPE_GLOBAL = 'global', + SCOPE_DEFAULT = 'default'; + + const UNDEFINED_STRATEGY_EXCEPTION = 1, + UNDEFINED_STRATEGY_NULL = 2; + + /** + * @var \eZ\Publish\Core\MVC\Symfony\SiteAccess + */ + protected $siteAccess; + + /** + * @var array Siteaccess groups, indexed by siteaccess name + */ + protected $groupsBySiteAccess; + + /** + * @var \Symfony\Component\DependencyInjection\ContainerInterface + */ + protected $container; + + /** + * @var string + */ + protected $defaultNamespace; + + /** + * @var int + */ + protected $undefinedStrategy; + + /** + * @param \eZ\Publish\Core\MVC\Symfony\SiteAccess $siteAccess + * @param array $groupsBySiteAccess SiteAccess groups, indexed by siteaccess. + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + * @param string $defaultNamespace The default namespace + * @param int $undefinedStrategy Strategy to use when encountering undefined parameters. + * Must be one of + * - ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION (throw an exception) + * - ConfigResolver::UNDEFINED_STRATEGY_NULL (return null) + */ + public function __construct( + SiteAccess $siteAccess, + array $groupsBySiteAccess, + ContainerInterface $container, + $defaultNamespace, + $undefinedStrategy = self::UNDEFINED_STRATEGY_EXCEPTION + ) + { + $this->siteAccess = $siteAccess; + $this->groupsBySiteAccess = $groupsBySiteAccess; + $this->container = $container; + $this->defaultNamespace = $defaultNamespace; + $this->undefinedStrategy = $undefinedStrategy; + } + + /** + * Sets the strategy to use if an undefined parameter is being asked. + * Can be one of: + * - ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION (throw an exception) + * - ConfigResolver::UNDEFINED_STRATEGY_NULL (return null) + * + * Defaults to ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION. + * + * @param int $undefinedStrategy + */ + public function setUndefinedStrategy( $undefinedStrategy ) + { + $this->undefinedStrategy = $undefinedStrategy; + } + + /** + * @return int + */ + public function getUndefinedStrategy() + { + return $this->undefinedStrategy; + } + + /** + * Checks if $paramName exists in $namespace + * + * @param string $paramName + * @param string $namespace If null, the default namespace should be used. + * @param string $scope The scope you need $paramName value for. It's typically the siteaccess name. + * If null, the current siteaccess name will be used. + * + * @return boolean + */ + public function hasParameter( $paramName, $namespace = null, $scope = null ) + { + $namespace = $namespace ?: $this->defaultNamespace; + $scope = $scope ?: $this->siteAccess->name; + + $defaultScopeParamName = "$namespace." . self::SCOPE_DEFAULT . ".$paramName"; + $globalScopeParamName = "$namespace." . self::SCOPE_GLOBAL . ".$paramName"; + $relativeScopeParamName = "$namespace.$scope.$paramName"; + return + $this->container->hasParameter( $defaultScopeParamName ) + || $this->container->hasParameter( $relativeScopeParamName ) + || $this->container->hasParameter( $globalScopeParamName ); + } + + /** + * Returns value for $paramName, in $namespace. + * + * @param string $paramName The parameter name, without $prefix and the current scope (i.e. siteaccess name). + * @param string $namespace Namespace for the parameter name. If null, the default namespace will be used. + * @param string $scope The scope you need $paramName value for. It's typically the siteaccess name. + * If null, the current siteaccess name will be used. + * + * @throws \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException + * + * @return mixed + */ + public function getParameter( $paramName, $namespace = null, $scope = null ) + { + $namespace = $namespace ?: $this->defaultNamespace; + $scope = $scope ?: $this->siteAccess->name; + $triedScopes = array(); + + // Global scope + $globalScopeParamName = "$namespace." . self::SCOPE_GLOBAL . ".$paramName"; + if ( $this->container->hasParameter( $globalScopeParamName ) ) + { + return $this->container->getParameter( $globalScopeParamName ); + } + $triedScopes[] = self::SCOPE_GLOBAL; + unset( $globalScopeParamName ); + + // Relative scope, siteaccess wise + $relativeScopeParamName = "$namespace.$scope.$paramName"; + if ( $this->container->hasParameter( $relativeScopeParamName ) ) + { + return $this->container->getParameter( $relativeScopeParamName ); + } + $triedScopes[] = $this->siteAccess->name; + unset( $relativeScopeParamName ); + + // Relative scope, siteacces group wise + if ( isset( $this->groupsBySiteAccess[$scope] ) ) + { + foreach ( $this->groupsBySiteAccess[$scope] as $groupName ) + { + $relativeScopeParamName = "$namespace.$groupName.$paramName"; + if ( $this->container->hasParameter( $relativeScopeParamName ) ) + { + return $this->container->getParameter( $relativeScopeParamName ); + } + } + } + + // Default scope + $defaultScopeParamName = "$namespace." . self::SCOPE_DEFAULT . ".$paramName"; + if ( $this->container->hasParameter( $defaultScopeParamName ) ) + { + return $this->container->getParameter( $defaultScopeParamName ); + } + $triedScopes[] = $this->defaultNamespace; + unset( $defaultScopeParamName ); + + // Undefined parameter + switch ( $this->undefinedStrategy ) + { + case self::UNDEFINED_STRATEGY_NULL: + return null; + + case self::UNDEFINED_STRATEGY_EXCEPTION: + default: + throw new ParameterNotFoundException( $paramName, $namespace, $triedScopes ); + } + } + + /** + * Changes the default namespace to look parameter into. + * + * @param string $defaultNamespace + */ + public function setDefaultNamespace( $defaultNamespace ) + { + $this->defaultNamespace = $defaultNamespace; + } + + /** + * @return string + */ + public function getDefaultNamespace() + { + return $this->defaultNamespace; + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser.php new file mode 100644 index 0000000..eba67c2 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser.php @@ -0,0 +1,35 @@ + + * + * @return void + */ + public function addSemanticConfig( NodeBuilder $nodeBuilder ); + + /** + * Translates parsed semantic config values from $config to internal key/value pairs. + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * + * @return void + */ + public function registerInternalConfig( array $config, ContainerBuilder $container ); +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Common.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Common.php new file mode 100644 index 0000000..1cbc2bd --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Common.php @@ -0,0 +1,145 @@ + + * + * @return void + */ + public function addSemanticConfig( NodeBuilder $nodeBuilder ) + { + $nodeBuilder + ->arrayNode( 'languages' ) + ->cannotBeEmpty() + ->info( 'Available languages, in order of precedence' ) + ->example( array( 'fre-FR', 'eng-GB' ) ) + ->prototype( 'scalar' )->end() + ->end() + ->arrayNode( 'database' ) + ->children() + ->enumNode( 'type' )->values( array( 'mysql', 'pgsql', 'sqlite' ) )->info( 'The database driver. Can be mysql, pgsql or sqlite.' )->end() + ->scalarNode( 'server' )->end() + ->scalarNode( 'port' )->end() + ->scalarNode( 'user' )->cannotBeEmpty()->end() + ->scalarNode( 'password' )->end() + ->scalarNode( 'database_name' )->cannotBeEmpty()->end() + ->scalarNode( 'charset' )->defaultValue( 'utf8' )->end() + ->scalarNode( 'socket' )->end() + ->arrayNode( 'options' ) + ->info( 'Arbitrary options, supported by your DB driver ("driver-opts" in PDO)' ) + ->example( array( 'foo' => 'bar', 'someOptionName' => array( 'one', 'two', 'three' ) ) ) + ->useAttributeAsKey( 'key' ) + ->prototype( 'variable' )->end() + ->end() + ->scalarNode( 'dsn' )->info( 'Full database DSN. Will replace settings above.' )->example( 'mysql://root:root@localhost:3306/ezdemo' )->end() + ->end() + ->end() + ->scalarNode( 'var_dir' ) + ->cannotBeEmpty() + ->example( 'var/ezdemo_site' ) + ->info( 'The directory relative to web/ where files are stored. Default value is "var"' ) + ->end() + ->scalarNode( 'storage_dir' ) + ->cannotBeEmpty() + ->info( "Directory where to place new files for storage, it's relative to var directory. Default value is 'storage'" ) + ->end() + ->scalarNode( 'binary_dir' ) + ->cannotBeEmpty() + ->info( 'Directory where binary files (from ezbinaryfile field type) are stored. Default value is "original"' ) + ->end() + ->booleanNode( 'legacy_mode' ) + ->info( 'Whether to use legacy mode or not. If true, will let the legacy kernel handle url aliases.' ) + ->defaultValue( false ) + ->end() + ->scalarNode( 'session_name' ) + ->info( 'The session name. If you want a session name per siteaccess, use "{siteaccess_hash}" token. Will override default session name from framework.session.name' ) + ->example( array( 'session_name' => 'eZSESSID{siteaccess_hash}' ) ) + ->end() + ->arrayNode( 'http_cache' ) + ->info( 'Settings related to Http cache' ) + ->cannotBeEmpty() + ->children() + ->arrayNode( 'purge_servers' ) + ->info( 'Servers to use for Http PURGE (will NOT be used if ezpublish.http_cache.purge_type is "local").' ) + ->example( array( 'http://localhost/', 'http://another.server/' ) ) + ->requiresAtLeastOneElement() + ->prototype( 'scalar' )->end() + ->end() + ->end() + ->end(); + } + + /** + * Translates parsed semantic config values from $config to internal key/value pairs. + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * + * @return void + */ + public function registerInternalConfig( array $config, ContainerBuilder $container ) + { + $this->registerInternalConfigArray( + 'languages', $config, $container, self::UNIQUE + ); + $this->registerInternalConfigArray( 'database', $config, $container ); + foreach ( $config['siteaccess']['list'] as $sa ) + { + $database = $container->getParameter( "ezsettings.$sa.database" ); + if ( !empty( $database ) ) + { + // DSN has priority over any other setting + if ( isset( $database['dsn'] ) ) + { + $container->setParameter( "ezsettings.$sa.database.params", $database['dsn'] ); + } + else + { + // Renaming dbParams to parameters supported by ezcDb. + $database['database'] = $database['database_name']; + $database['host'] = $database['server']; + $database['driver-opts'] = $database['options']; + unset( $database['database_name'], $database['server'], $database['options'] ); + $container->setParameter( "ezsettings.$sa.database.params", $database ); + } + } + } + foreach ( $config[$this->baseKey] as $sa => $settings ) + { + if ( isset( $settings['legacy_mode'] ) ) + { + $container->setParameter( "ezsettings.$sa.legacy_mode", $settings['legacy_mode'] ); + $container->setParameter( "ezsettings.$sa.url_alias_router", !$settings['legacy_mode'] ); + } + if ( isset( $settings['var_dir'] ) ) + $container->setParameter( "ezsettings.$sa.var_dir", $settings['var_dir'] ); + if ( isset( $settings['storage_dir'] ) ) + $container->setParameter( "ezsettings.$sa.storage_dir", $settings['storage_dir'] ); + if ( isset( $settings['binary_dir'] ) ) + $container->setParameter( "ezsettings.$sa.binary_dir", $settings['binary_dir'] ); + if ( isset( $settings['session_name'] ) ) + $container->setParameter( "ezsettings.$sa.session_name", $settings['session_name'] ); + if ( isset( $settings['http_cache']['purge_servers'] ) ) + $container->setParameter( "ezsettings.$sa.http_cache.purge_servers", $settings['http_cache']['purge_servers'] ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Content.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Content.php new file mode 100644 index 0000000..df02eb1 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Content.php @@ -0,0 +1,61 @@ + + * + * @return void + */ + public function addSemanticConfig( NodeBuilder $nodeBuilder ) + { + $nodeBuilder + ->arrayNode( 'content' ) + ->info( 'Content related configuration' ) + ->children() + ->booleanNode( 'view_cache' )->defaultValue( true )->end() + ->booleanNode( 'ttl_cache' )->defaultValue( false )->end() + ->scalarNode( 'default_ttl' )->info( 'Default value for TTL cache, in seconds' )->defaultValue( 60 )->end() + ->end() + ->end(); + } + + /** + * Translates parsed semantic config values from $config to internal key/value pairs. + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * + * @return mixed + */ + public function registerInternalConfig( array $config, ContainerBuilder $container ) + { + foreach ( $config['system'] as $sa => $settings ) + { + if ( !empty( $settings['content'] ) ) + { + $container->setParameter( "ezsettings.$sa.content.view_cache", $settings['content']['view_cache'] ); + $container->setParameter( "ezsettings.$sa.content.ttl_cache", $settings['content']['ttl_cache'] ); + $container->setParameter( "ezsettings.$sa.content.default_ttl", $settings['content']['default_ttl'] ); + } + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/ContentView.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/ContentView.php new file mode 100644 index 0000000..ac4b78e --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/ContentView.php @@ -0,0 +1,16 @@ + + * + * @return void + */ + public function addSemanticConfig( NodeBuilder $nodeBuilder ) + { + $nodeBuilder + ->arrayNode( 'field_templates' ) + ->info( 'Template settings for fields rendered by ez_render_field() Twig function' ) + ->prototype( 'array' ) + ->children() + ->scalarNode( 'template' ) + ->info( 'Template file where to find block definition to display fields' ) + ->isRequired() + ->end() + ->scalarNode( 'priority' ) + ->defaultValue( 0 ) + ->end() + ->end() + ->end() + ->end(); + } + + /** + * Translates parsed semantic config values from $config to internal key/value pairs.; + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * + * @return void + */ + public function registerInternalConfig( array $config, ContainerBuilder $container ) + { + foreach ( $config['siteaccess']['groups'] as $group => $saArray ) + { + if ( isset( $config[$this->baseKey][$group]['field_templates'] ) ) + { + $container->setParameter( + "ezsettings.$group.field_templates", + $config[$this->baseKey][$group]['field_templates'] + ); + } + }; + $this->registerInternalConfigArray( + 'field_templates', $config, $container + ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Image.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Image.php new file mode 100644 index 0000000..d5cd190 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/Image.php @@ -0,0 +1,108 @@ + + */ + public function addSemanticConfig( NodeBuilder $nodeBuilder ) + { + $nodeBuilder + ->arrayNode( 'imagemagick' ) + ->children() + ->scalarNode( 'pre_parameters' )->info( 'Parameters that must be run BEFORE the filenames and filters' )->end() + ->scalarNode( 'post_parameters' )->info( 'Parameters that must be run AFTER the filenames and filters' )->end() + ->end() + ->end() + ->arrayNode( 'image_variations' ) + ->info( 'Configuration for your image variations (aka "image aliases")' ) + ->example( + array( + 'my_image_variation' => array( + 'reference' => '~', + 'filters' => array( + array( + 'name' => 'geometry/scaledownonly', + 'params' => array( 400, 350 ) + ) + ) + ), + 'my_cropped_variation' => array( + 'reference' => 'my_cropped_variation', + 'filters' => array( + array( + 'name' => 'geometry/scalewidthdownonly', + 'params' => array( 300 ) + ), + array( + 'name' => 'geometry/crop', + 'params' => array( 300, 300, 0, 0 ) + ) + ) + ) + ) + ) + ->useAttributeAsKey( 'key' ) + ->prototype( 'array' ) + ->children() + ->scalarNode( 'reference' ) + ->info( 'Tells the system which original variation to use as reference image. Defaults to original' ) + ->example( array( 'reference' => 'large' ) ) + ->end() + ->arrayNode( 'filters' ) + ->info( 'A list of filters to run, each filter must be supported by the active image converters' ) + ->prototype( 'array' ) + ->children() + ->scalarNode( 'name' ) + ->info( 'The filter name, as defined in ImageMagick configuration, or a GD supported filter name' ) + ->isRequired() + ->end() + ->arrayNode( 'params' ) + ->info( 'Array of parameters to pass to the filter, if needed' ) + ->prototype( 'scalar' )->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ->end() + ->end(); + } + + /** + * Translates parsed semantic config values from $config to internal key/value pairs. + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + */ + public function registerInternalConfig( array $config, ContainerBuilder $container ) + { + $this->registerInternalConfigArray( 'image_variations', $config, $container ); + + foreach ( $config[$this->baseKey] as $sa => $settings ) + { + if ( isset( $settings['imagemagick']['pre_parameters'] ) ) + $container->setParameter( "ezsettings.$sa.imagemagick.pre_parameters", $settings['imagemagick']['pre_parameters'] ); + if ( isset( $settings['imagemagick']['post_parameters'] ) ) + $container->setParameter( "ezsettings.$sa.imagemagick.post_parameters", $settings['imagemagick']['post_parameters'] ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/LocationView.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/LocationView.php new file mode 100644 index 0000000..6f15145 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Configuration/Parser/LocationView.php @@ -0,0 +1,16 @@ + + * + * @return void + */ + public function addSemanticConfig( NodeBuilder $nodeBuilder ) + { + $nodeBuilder + ->arrayNode( static::NODE_KEY ) + ->info( static::INFO ) + ->useAttributeAsKey( "key" ) + ->prototype( "array" ) + ->useAttributeAsKey( "key" ) + ->prototype( "array" ) + ->children() + ->scalarNode( "template" )->isRequired()->info( "Your template path, as MyBundle:subdir:my_template.html.twig" )->end() + ->arrayNode( "match" ) + ->info( "Condition matchers configuration" ) + ->useAttributeAsKey( "key" ) + ->prototype( "variable" )->end() + ->end() + ->end() + ->end() + ->end() + ->end(); + } + + /** + * Translates parsed semantic config values from $config to internal key/value pairs. + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * + * @return void + */ + public function registerInternalConfig( array $config, ContainerBuilder $container ) + { + $this->registerInternalConfigArray( static::NODE_KEY, $config, $container, self::MERGE_FROM_SECOND_LEVEL ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/EzPublishCoreExtension.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/EzPublishCoreExtension.php new file mode 100644 index 0000000..e8f0489 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/EzPublishCoreExtension.php @@ -0,0 +1,354 @@ +configParsers = $configParsers; + } + + public function getAlias() + { + return 'ezpublish'; + } + + /** + * Loads a specific configuration. + * + * @param mixed[] $configs An array of configuration values + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container A ContainerBuilder instance + * + * @throws \InvalidArgumentException When provided tag is not defined in this extension + * + * @api + */ + public function load( array $configs, ContainerBuilder $container ) + { + $loader = new Loader\YamlFileLoader( + $container, + new FileLocator( __DIR__ . '/../Resources/config' ) + ); + $configuration = $this->getConfiguration( $configs, $container ); + + // Workaround for http://jira.ez.no/browse/EZP-20107 + $this->fixUpConfiguration( $configs ); + + // Note: this is where the transformation occurs + $config = $this->processConfiguration( $configuration, $configs ); + + // Workaround for http://jira.ez.no/browse/EZP-20107 + $this->unFixUpConfiguration( $config ); + + // Base services and services overrides + $loader->load( 'services.yml' ); + // Security services + $loader->load( 'security.yml' ); + // Default settings + $loader->load( 'default_settings.yml' ); + $this->registerSiteAccessConfiguration( $config, $container ); + $this->registerImageMagickConfiguration( $config, $container ); + + // Routing + $this->handleRouting( $container, $loader ); + // Public API loading + $this->handleApiLoading( $container, $loader ); + $this->handleTemplating( $container, $loader ); + $this->handleSessionLoading( $container, $loader ); + $this->handleCache( $config, $container, $loader ); + + // Map settings + foreach ( $this->configParsers as $configParser ) + { + $configParser->registerInternalConfig( $config, $container ); + } + } + + /** + * Applies the workaround for http://jira.ez.no/browse/EZP-20107 + * + * Prefixes affected keys (siteaccess map matching, override rules, image variations names) that contain a dash + * with an underscore so that the symfony normalize method (https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Config/Definition/Processor.php#L55) + * doesn't replace dashes with underscores + * + * @param array $config Raw configuration array + */ + private function fixUpConfiguration( array &$config ) + { + $affectedMatchMethods = array( 'Map\\URI' => true, 'Map\\Host' => true ); + $affectedSystemKeys = array( 'location_view', 'content_view', 'image_variations' ); + foreach ( $config as &$subConfig ) + { + if ( isset( $subConfig['siteaccess']['match'] ) ) + { + foreach ( $subConfig['siteaccess']['match'] as $mappingMethod => &$configurationBlock ) + { + if ( !isset( $affectedMatchMethods[$mappingMethod] ) ) + continue; + + $this->fixedUpKeys['siteaccess']['match'][$mappingMethod] = $this->fixUpKeyReference( $configurationBlock ); + } + } + + if ( isset( $subConfig['system'] ) ) + { + foreach ( $subConfig['system'] as $configurationKey => &$configurationBlock ) + { + foreach ( $affectedSystemKeys as $affectedKey ) + { + if ( !isset( $configurationBlock[$affectedKey] ) ) + continue; + $result = $this->fixUpKeyReference( $configurationBlock[$affectedKey] ); + if ( !empty( $result ) ) + $this->fixedUpKeys['system'][$configurationKey][$affectedKey] = $result; + } + } + } + } + } + + /** + * Prefixes keys from $configuration that are affected by http://jira.ez.no/browse/EZP-20107 with an underscore + * and returns the list of modified keys (original values) + * + * Workaround for http://jira.ez.no/browse/EZP-20107 + * + * @param array $configuration + * + * @return array + */ + private function fixUpKeyReference( &$configuration ) + { + $fixedUpItems = array(); + foreach ( $configuration as $key => $value ) + { + if ( strpos( $key, '-' ) !== false && strstr( $key, '_' ) === false ) + { + $configuration["_{$key}"] = $value; + unset( $configuration[$key] ); + $fixedUpItems[$key] = true; + } + } + + return $fixedUpItems; + } + + /** + * Undoes the changes done by {@see fixUpConfiguration()} + * + * Workaround for http://jira.ez.no/browse/EZP-20107 + * + * @param array $config + */ + private function unFixUpConfiguration( array &$config ) + { + $this->processFixedUpKeyReference( $this->fixedUpKeys, $config ); + } + + /** + * Recursively scans through an n dimension array of keys, ending up with a true value, and for those keys, + * cancels the changes done by {@see fixedUpConfiguration}. The method pops the keys out of $keyReferenceArray + * in order to dive into $configReference until it finds out the modified value, and restores it when found + * + * Workaround for http://jira.ez.no/browse/EZP-20107 + * + * @param array $keyReferencesArray Keys array to process $array[keya][keyb] = true + * @param array $configReference Configuration array + */ + private function processFixedUpKeyReference( array $keyReferencesArray, &$configReference ) + { + foreach ( $keyReferencesArray as $key => $value ) + { + if ( is_array( $value ) ) + { + $this->processFixedUpKeyReference( $value, $configReference[$key] ); + } + else + { + $configReference[$key] = $configReference["_{$key}"]; + unset( $configReference["_{$key}"] ); + } + } + } + + /** + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * + * @return \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration + */ + public function getConfiguration( array $config, ContainerBuilder $container ) + { + return new Configuration( $this->configParsers ); + } + + private function registerSiteAccessConfiguration( array $config, ContainerBuilder $container ) + { + if ( !isset( $config['siteaccess'] ) ) + { + $config['siteaccess'] = array(); + $config['siteaccess']['list'] = array( 'setup' ); + $config['siteaccess']['default_siteaccess'] = 'setup'; + $config['siteaccess']['groups'] = array(); + $config['siteaccess']['match'] = null; + } + + $container->setParameter( 'ezpublish.siteaccess.list', $config['siteaccess']['list'] ); + $container->setParameter( 'ezpublish.siteaccess.default', $config['siteaccess']['default_siteaccess'] ); + $container->setParameter( 'ezpublish.siteaccess.match_config', $config['siteaccess']['match'] ); + + // Register siteaccess groups + reverse + $container->setParameter( 'ezpublish.siteaccess.groups', $config['siteaccess']['groups'] ); + $groupsBySiteaccess = array(); + foreach ( $config['siteaccess']['groups'] as $groupName => $groupMembers ) + { + foreach ( $groupMembers as $member ) + { + if ( !isset( $groupsBySiteaccess[$member] ) ) + $groupsBySiteaccess[$member] = array(); + + $groupsBySiteaccess[$member][] = $groupName; + } + } + $container->setParameter( 'ezpublish.siteaccess.groups_by_siteaccess', $groupsBySiteaccess ); + } + + private function registerImageMagickConfiguration( array $config, ContainerBuilder $container ) + { + if ( isset( $config['imagemagick'] ) ) + { + $container->setParameter( 'ezpublish.image.imagemagick.enabled', $config['imagemagick']['enabled'] ); + if ( $config['imagemagick']['enabled'] ) + { + $container->setParameter( 'ezpublish.image.imagemagick.executable_path', dirname( $config['imagemagick']['path'] ) ); + $container->setParameter( 'ezpublish.image.imagemagick.executable', basename( $config['imagemagick']['path'] ) ); + } + } + + $filters = isset( $config['imagemagick']['filters'] ) ? $config['imagemagick']['filters'] : array(); + $filters = $filters + $container->getParameter( 'ezpublish.image.imagemagick.filters' ); + $container->setParameter( 'ezpublish.image.imagemagick.filters', $filters ); + } + + /** + * Handle routing parameters + * + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * @param \Symfony\Component\DependencyInjection\Loader\FileLoader $loader + */ + private function handleRouting( ContainerBuilder $container, FileLoader $loader ) + { + $loader->load( 'routing.yml' ); + $container->setAlias( 'router', 'ezpublish.chain_router' ); + } + + /** + * Handle public API loading + * + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * @param \Symfony\Component\DependencyInjection\Loader\FileLoader $loader + */ + private function handleApiLoading( ContainerBuilder $container, FileLoader $loader ) + { + // Public API services + $loader->load( 'papi.yml' ); + // Built-in field types + $loader->load( 'fieldtypes.yml' ); + // Built-in storage engines + $loader->load( 'storage_engines.yml' ); + // Roles and limitations + $loader->load( 'roles.yml' ); + } + + /** + * Handle templating parameters + * + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * @param \Symfony\Component\DependencyInjection\Loader\FileLoader $loader + */ + private function handleTemplating( ContainerBuilder $container, FileLoader $loader ) + { + $loader->load( 'templating.yml' ); + } + + /** + * Handle session parameters + * + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * @param \Symfony\Component\DependencyInjection\Loader\FileLoader $loader + */ + private function handleSessionLoading( ContainerBuilder $container, FileLoader $loader ) + { + $loader->load( 'session.yml' ); + } + + /** + * Handle cache parameters + * + * @param array $config + * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container + * @param \Symfony\Component\DependencyInjection\Loader\FileLoader $loader + * + * @throws \InvalidArgumentException + * + * @return void + */ + private function handleCache( array $config, ContainerBuilder $container, FileLoader $loader ) + { + $loader->load( 'cache.yml' ); + if ( isset( $config['http_cache']['purge_type'] ) ) + { + switch ( $config['http_cache']['purge_type'] ) + { + case 'local': + $purgeService = 'ezpublish.http_cache.purge_client.local'; + break; + case 'single_http': + $purgeService = 'ezpublish.http_cache.purge_client.single_request'; + break; + case 'multiple_http': + $purgeService = 'ezpublish.http_cache.purge_client.multi_request'; + break; + default: + if ( !$container->has( $config['http_cache']['purge_type'] ) ) + { + throw new \InvalidArgumentException( "Invalid ezpublish.http_cache.purge_type. Can be 'single', 'multiple' or a valid service identifier implementing PurgeClientInterface." ); + } + + $purgeService = $config['http_cache']['purge_type']; + } + + $container->setAlias( 'ezpublish.http_cache.purge_client', $purgeService ); + } + + if ( isset( $config['http_cache']['timeout'] ) ) + { + $container->setParameter( 'ezpublish.http_cache.purge_client.http_client.timeout', (int)$config['http_cache']['timeout'] ); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Security/Factory.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Security/Factory.php new file mode 100644 index 0000000..87febcc --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Security/Factory.php @@ -0,0 +1,75 @@ +setDefinition( $providerId, new DefinitionDecorator( self::AUTHENTICATION_PROVIDER_ID ) ) + ->replaceArgument( 0, new Reference( $userProviderId ) ) + ->addArgument( $id ); + + return $providerId; + } + + protected function createListener( $container, $id, $config, $userProvider ) + { + $parentListenerId = $this->getListenerId(); + $listenerId = "$parentListenerId.$id"; + $container + ->setDefinition( $listenerId, new DefinitionDecorator( $parentListenerId ) ) + ->replaceArgument( 2, $id ); + + return $listenerId; + } + + /** + * Subclasses must return the id of the listener template. + * + * @return string + */ + protected function getListenerId() + { + return self::AUTHENTICATION_LISTENER_ID; + } + + public function getPosition() + { + return 'pre_auth'; + } + + public function getKey() + { + return 'ezpublish'; + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Security/HttpBasicFactory.php b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Security/HttpBasicFactory.php new file mode 100644 index 0000000..2e3de42 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/DependencyInjection/Security/HttpBasicFactory.php @@ -0,0 +1,41 @@ +setDefinition( $provider, new DefinitionDecorator( self::AUTHENTICATION_PROVIDER_ID ) ) + ->replaceArgument( 2, $id ); + + return array( $provider, $listenerId, $entryPointId ); + } + + public function getKey() + { + return 'ezpublish_http_basic'; + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/EventListener/RequestEventListener.php b/eZ/Bundle/EzPublishCoreBundle/EventListener/RequestEventListener.php new file mode 100644 index 0000000..3a8b2a1 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/EventListener/RequestEventListener.php @@ -0,0 +1,154 @@ +httpKernel = $container->get( 'http_kernel' ); + $this->container = $container; + $this->logger = $logger; + $this->router = $container->get( 'router' ); + } + + public static function getSubscribedEvents() + { + return array( + KernelEvents::REQUEST => array( + array( 'onKernelRequestSetup', 190 ), + array( 'onKernelRequestForward', 10 ), + array( 'onKernelRequestRedirect', 0 ) + ) + ); + } + + /** + * Checks if it's needed to redirect to setup wizard + * + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event + */ + public function onKernelRequestSetup( GetResponseEvent $event ) + { + if ( + $event->getRequestType() == HttpKernelInterface::MASTER_REQUEST + && $this->container->hasParameter( 'ezpublish.siteaccess.default' ) + ) + { + if ( $this->container->getParameter( 'ezpublish.siteaccess.default' ) !== 'setup' ) + return; + + $request = $event->getRequest(); + $requestContext = $this->container->get( 'router.request_context' ); + $requestContext->fromRequest( $request ); + $this->router->setContext( $requestContext ); + $setupURI = $this->router->generate( 'ezpublishSetup' ); + + if ( ( $requestContext->getBaseUrl() . $request->getPathInfo() ) === $setupURI ) + return; + + $event->setResponse( new RedirectResponse( $setupURI ) ); + } + } + + /** + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event + */ + public function onKernelRequestForward( GetResponseEvent $event ) + { + if ( $event->getRequestType() == HttpKernelInterface::MASTER_REQUEST ) + { + $request = $event->getRequest(); + if ( $request->attributes->get( 'needsForward' ) && $request->attributes->has( 'semanticPathinfo' ) ) + { + $semanticPathinfo = $request->attributes->get( 'semanticPathinfo' ); + $event->setResponse( + $this->httpKernel->render( $semanticPathinfo ) + ); + $event->stopPropagation(); + + if ( isset( $this->logger ) ) + $this->logger->info( + "URLAlias made request to be forwarded to $semanticPathinfo", + array( 'pathinfo' => $request->getPathInfo() ) + ); + } + } + } + + /** + * Checks if the request needs to be redirected and return a RedirectResponse in such case. + * The request attributes "needsRedirect" and "semanticPathinfo" are originally set in the UrlAliasRouter. + * + * Note: The event propagation will be stopped to ensure that no response can be set later and override the redirection. + * + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event + * + * @see \eZ\Publish\Core\MVC\Symfony\Routing\UrlAliasRouter + */ + public function onKernelRequestRedirect( GetResponseEvent $event ) + { + if ( $event->getRequestType() == HttpKernelInterface::MASTER_REQUEST ) + { + $request = $event->getRequest(); + if ( $request->attributes->get( 'needsRedirect' ) && $request->attributes->has( 'semanticPathinfo' ) ) + { + $siteaccess = $request->attributes->get( 'siteaccess' ); + $semanticPathinfo = $request->attributes->get( 'semanticPathinfo' ); + if ( $siteaccess instanceof SiteAccess && $siteaccess->matcher instanceof URILexer ) + $semanticPathinfo = $siteaccess->matcher->analyseLink( $semanticPathinfo ); + + $event->setResponse( + new RedirectResponse( + $semanticPathinfo, + 301 + ) + ); + $event->stopPropagation(); + + if ( isset( $this->logger ) ) + $this->logger->info( + "URLAlias made request to be redirected to $semanticPathinfo", + array( 'pathinfo' => $request->getPathInfo() ) + ); + } + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/EventListener/SessionInitByPostListener.php b/eZ/Bundle/EzPublishCoreBundle/EventListener/SessionInitByPostListener.php new file mode 100644 index 0000000..3c85e64 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/EventListener/SessionInitByPostListener.php @@ -0,0 +1,60 @@ +container = $container; + } + + public static function getSubscribedEvents() + { + return array( + MVCEvents::SITEACCESS => array( 'onSiteAccessMatch', 249 ) + ); + } + + public function onSiteAccessMatch( PostSiteAccessMatchEvent $event ) + { + if ( !$this->container->has( 'session' ) ) + { + return; + } + $session = $this->container->get( 'session' ); + $sessionName = $session->getName(); + $request = $event->getRequest(); + + if ( + !$session->isStarted() + && !$request->hasPreviousSession() + && $request->request->has( $sessionName ) + ) + { + $session->setId( $request->request->get( $sessionName ) ); + $session->start(); + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/EventListener/SessionSetDynamicNameListener.php b/eZ/Bundle/EzPublishCoreBundle/EventListener/SessionSetDynamicNameListener.php new file mode 100644 index 0000000..b3fd61c --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/EventListener/SessionSetDynamicNameListener.php @@ -0,0 +1,77 @@ +container = $container; + } + + public static function getSubscribedEvents() + { + return array( + MVCEvents::SITEACCESS => array( 'onSiteAccessMatch', 250 ) + ); + } + + public function onSiteAccessMatch( PostSiteAccessMatchEvent $event ) + { + if ( !$this->container->has( 'session' ) ) + { + return; + } + + // Getting from the container and not from the request because the session object is assigned to the request only when session has started. + /** @var $session \Symfony\Component\HttpFoundation\Session\Session */ + $session = $this->container->get( 'session' ); + + if ( !$session->isStarted() ) + { + $sessionName = $this->container->get( 'ezpublish.config.resolver' )->getParameter( 'session_name' ); + if ( strpos( $sessionName, self::MARKER ) !== false ) + { + $session->setName( + str_replace( + self::MARKER, md5( $event->getSiteAccess()->name ), $sessionName + ) + ); + } + else + { + $session->setName( $sessionName ); + } + } + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/EventListener/SiteAccessListener.php b/eZ/Bundle/EzPublishCoreBundle/EventListener/SiteAccessListener.php new file mode 100644 index 0000000..0326a0a --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/EventListener/SiteAccessListener.php @@ -0,0 +1,131 @@ +container = $container; + } + + public static function getSubscribedEvents() + { + return array( + MVCEvents::SITEACCESS => array( 'onSiteAccessMatch', 255 ) + ); + } + + public function onSiteAccessMatch( PostSiteAccessMatchEvent $event ) + { + $request = $event->getRequest(); + $siteAccess = $event->getSiteAccess(); + $this->container->set( 'ezpublish.siteaccess', $siteAccess ); + + // Analyse the pathinfo if needed since it might contain the siteaccess (i.e. like in URI mode) + $pathinfo = $request->getPathInfo(); + if ( $siteAccess->matcher instanceof URILexer ) + { + $semanticPathinfo = $siteAccess->matcher->analyseURI( $pathinfo ); + } + else + { + $semanticPathinfo = $pathinfo; + } + + // Get view parameters and cleaned up pathinfo (without view parameters string) + list( $semanticPathinfo, $viewParameters, $viewParametersString ) = $this->getViewParameters( $semanticPathinfo ); + + // Storing the modified pathinfo in 'semanticPathinfo' request attribute, to keep a trace of it. + // Routers implementing RequestMatcherInterface should thus use this attribute instead of the original pathinfo + $request->attributes->set( 'semanticPathinfo', $semanticPathinfo ); + $request->attributes->set( 'viewParameters', $viewParameters ); + $request->attributes->set( 'viewParametersString', $viewParametersString ); + + if ( $this->container->hasParameter( "ezpublish.siteaccess.config.$siteAccess->name" ) ) + { + $siteAccess->attributes->add( + $this->container->getParameter( "ezpublish.siteaccess.config.$siteAccess->name" ) + ); + } + } + + /** + * Extracts view parameters from $pathinfo. + * In the pathinfo, view parameters are in the form /(param_name)/param_value. + * + * @param string $pathinfo + * + * @return array First element is the cleaned up pathinfo (without the view parameters string). + * Second element is the view parameters hash. + * Third element is the view parameters string (e.g. /(foo)/bar) + */ + private function getViewParameters( $pathinfo ) + { + // No view parameters, get out of here. + if ( ( $vpStart = strpos( $pathinfo, '/(' ) ) === false ) + { + return array( $pathinfo, array(), '' ); + } + + $viewParameters = array(); + $vpString = substr( $pathinfo, $vpStart + 1 ); + $vpSegments = explode( '/', $vpString ); + for ( $i = 0, $iMax = count( $vpSegments ); $i < $iMax; ++$i ) + { + if ( !isset( $vpSegments[$i] ) ) + { + continue; + } + + // View parameter name. + // We extract it + the value from the following segment (next element in $vpSegments array) + if ( $vpSegments[$i]{0} === '(' ) + { + $paramName = str_replace( array( '(', ')' ), '', $vpSegments[$i] ); + // A value is present (e.g. /(foo)/bar) + if ( isset( $vpSegments[$i + 1] ) ) + { + $viewParameters[$paramName] = $vpSegments[$i + 1]; + unset( $vpSegments[$i + 1] ); + } + // No value (e.g. /(foo)) => set it to empty string + else + { + $viewParameters[$paramName] = ''; + } + } + // Orphan segment (no previous parameter name), e.g. /(foo)/bar/baz + // Add it to the previous parameter. + else if ( isset( $paramName ) ) + { + $viewParameters[$paramName] .= '/' . $vpSegments[$i]; + } + } + + // Now remove the view parameters string from $semanticPathinfo + $pathinfo = substr( $pathinfo, 0, $vpStart ); + return array( $pathinfo, $viewParameters, "/$vpString" ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/EzPublishCoreBundle.php b/eZ/Bundle/EzPublishCoreBundle/EzPublishCoreBundle.php new file mode 100644 index 0000000..affaa88 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/EzPublishCoreBundle.php @@ -0,0 +1,66 @@ +addCompilerPass( new ChainRoutingPass ); + $container->addCompilerPass( new ChainConfigResolverPass ); + $container->addCompilerPass( new AddFieldTypePass ); + $container->addCompilerPass( new RegisterLimitationTypePass ); + $container->addCompilerPass( new RegisterStorageEnginePass ); + $container->addCompilerPass( new LegacyStorageEnginePass ); + $container->addCompilerPass( new TwigTweaksPass ); + $container->addCompilerPass( new ContentViewPass ); + $container->addCompilerPass( new LocationViewPass ); + + $securityExtension = $container->getExtension( 'security' ); + $securityExtension->addSecurityListenerFactory( new EzPublishSecurityFactory ); + $securityExtension->addSecurityListenerFactory( new HttpBasicFactory ); + } + + public function getContainerExtension() + { + if ( !isset( $this->extension ) ) + { + $this->extension = new EzPublishCoreExtension( + array( + new ConfigParser\LocationView, + new ConfigParser\ContentView, + new ConfigParser\Common, + new ConfigParser\Content, + new ConfigParser\FieldTemplates, + new ConfigParser\Image, + ) + ); + } + + return $this->extension; + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/HttpCache.php b/eZ/Bundle/EzPublishCoreBundle/HttpCache.php new file mode 100644 index 0000000..c402986 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/HttpCache.php @@ -0,0 +1,113 @@ +cacheDir ?: $this->kernel->getCacheDir() . '/http_cache' ); + } + + /** + * Handle invalidation, including Http PURGE requests. + * All non-allowed PURGE requests will receive an HTTP 405 + * + * @param \Symfony\Component\HttpFoundation\Request $request + * @param boolean $catch + * + * @return \Symfony\Component\HttpFoundation\Response + */ + protected function invalidate( Request $request, $catch = false ) + { + if ( $request->getMethod() !== 'PURGE' ) + { + return parent::invalidate( $request, $catch ); + } + + // Reject all non-authorized clients + if ( !$this->isPurgeRequestAllowed( $request ) ) + { + return new Response( '', 405 ); + } + + $response = new Response(); + $store = $this->getStore(); + if ( $store instanceof RequestAwarePurger ) + { + $result = $store->purgeByRequest( $request ); + } + else + { + $result = $store->purge( $request->getUri() ); + } + + if ( $result === true ) + { + $response->setStatusCode( 200, 'Purged' ); + } + else + { + $response->setStatusCode( 404, 'Not purged' ); + } + + return $response; + } + + /** + * Checks if current purge request is allowed. + * This method can be overridden to extend the allowance test. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * + * @return boolean + */ + protected function isPurgeRequestAllowed( Request $request ) + { + if ( !$this->isPurgeIPAllowed( $request->getClientIp() ) ) + return false; + + return true; + } + + /** + * Checks if $ip is allowed for Http PURGE requests + * + * @todo Check subnets + * + * @param string $ip + * + * @return boolean + */ + protected function isPurgeIPAllowed( $ip ) + { + $allowedIps = array_fill_keys( $this->getPurgeAllowedIPs(), true ); + if ( !isset( $allowedIps[$ip] ) ) + return false; + + return true; + } + + /** + * Returns an array of allowed IPs for Http PURGE requests. + * + * @return array + */ + protected function getPurgeAllowedIPs() + { + return array( '127.0.0.1', '::1' ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/cache.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/cache.yml new file mode 100644 index 0000000..daad54e --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/cache.yml @@ -0,0 +1,45 @@ +parameters: + ezpublish.http_cache.purger.instant.class: eZ\Publish\Core\MVC\Symfony\Cache\Http\InstantCachePurger + ezpublish.http_cache.purge_client.local.class: eZ\Publish\Core\MVC\Symfony\Cache\Http\LocalPurgeClient + ezpublish.http_cache.store.class: eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore + ezpublish.http_cache.store.root: %kernel.cache_dir%/http_cache + ezpublish.http_cache.purge_client.multi_request.class: eZ\Publish\Core\MVC\Symfony\Cache\Http\PurgeClient + ezpublish.http_cache.purge_client.single_request.class: eZ\Publish\Core\MVC\Symfony\Cache\Http\PurgeClientSingleRequest + ezpublish.http_cache.purge_client.http_client.class: eZ\Publish\Core\MVC\Symfony\Cache\Http\Curl + ezpublish.http_cache.purge_client.http_client.timeout: 1 # Timeout, in seconds. Setting a low value will emulate an asynchronous request + ezpublish.http_cache.purge_client.browser.class: Buzz\Browser + +services: + ezpublish.http_cache.purger.instant: + class: %ezpublish.http_cache.purger.instant.class% + arguments: [@ezpublish.http_cache.purge_client] + + ezpublish.http_cache.purger: + alias: ezpublish.http_cache.purger.instant + + ezpublish.http_cache.purge_client.local: + class: %ezpublish.http_cache.purge_client.local.class% + arguments: [@ezpublish.http_cache.store] + + ezpublish.http_cache.store: + class: %ezpublish.http_cache.store.class% + arguments: [%ezpublish.http_cache.store.root%] + + ezpublish.http_cache.purge_client.multi_request: + class: %ezpublish.http_cache.purge_client.multi_request.class% + arguments: [@ezpublish.config.resolver, @ezpublish.http_cache.purge_client.browser] + + ezpublish.http_cache.purge_client.single_request: + class: %ezpublish.http_cache.purge_client.single_request.class% + parent: ezpublish.http_cache.purge_client.multi_request + + ezpublish.http_cache.purge_client: + alias: ezpublish.http_cache.purge_client.local + + ezpublish.http_cache.purge_client.browser: + class: %ezpublish.http_cache.purge_client.browser.class% + arguments: [@ezpublish.http_cache.purge_client.http_client] + + ezpublish.http_cache.purge_client.http_client: + class: %ezpublish.http_cache.purge_client.http_client.class% + arguments: [%ezpublish.http_cache.purge_client.http_client.timeout%, @?logger] diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/default_settings.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/default_settings.yml new file mode 100644 index 0000000..207b498 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/default_settings.yml @@ -0,0 +1,134 @@ +parameters: + # Kernel related params + webroot_dir: %kernel.root_dir%/../web + + ### + # ezsettings namespace, default scope + ### + + # Content/Location view + ezsettings.default.location_view: {} + ezsettings.default.content_view: {} + + # Common settings + ezsettings.default.database.params: ~ + ezsettings.default.session_name: "eZSESSID{siteaccess_hash}" # Using "{siteaccess_hash}" in session name makes it unique per siteaccess + ezsettings.default.legacy_mode: false + ezsettings.default.url_alias_router: true # Use UrlAliasRouter by default + ezsettings.default.languages: [] + ezsettings.default.var_dir: "var" # The root directory where all log files, cache files and other stored files are created + ezsettings.default.storage_dir: "storage" # Where to place new files for storage, it's relative to var directory + ezsettings.default.binary_dir: "original" + + # Content settings + ezsettings.default.content.view_cache: true # Whether to use content view cache or not (Etag/Last-Modified based) + ezsettings.default.content.ttl_cache: false # Whether to use TTL Cache for content (i.e. Max-Age response header) + ezsettings.default.content.default_ttl: 60 # Default TTL cache value for content + + # Cache settings + ezsettings.default.http_cache.purge_servers: ["http://localhost/"] # Server(s) URL(s) that will be used for purging HTTP cache with PURGE requests. + + # Treemenu settings (admin interface) + ezsettings.default.treemenu.http_cache: true # Whether to use HttpCache or not for admin tree menu + ezsettings.default.treemenu.ttl_cache: 86400 # If HttpCache is used, cache time to live in seconds + + # Templates to use while rendering fields + ezsettings.default.field_templates: + - {template: EzPublishCoreBundle::content_fields.html.twig, priority: 0} + + # Image settings + ezsettings.default.image.temporary_dir: imagetmp + ezsettings.default.image.published_images_dir: images + ezsettings.default.image.versioned_images_dir: images-versioned + ezsettings.default.image_variations: + reference: + reference: ~ + filters: + - {name: geometry/scaledownonly, params: [600, 600]} + small: + reference: reference + filters: + - {name: geometry/scaledownonly, params: [100, 100]} + tiny: + reference: reference + filters: + - {name: geometry/scaledownonly, params: [30, 30]} + medium: + reference: reference + filters: + - {name: geometry/scaledownonly, params: [200, 200]} + large: + reference: reference + filters: + - {name: geometry/scaledownonly, params: [300, 300]} + rss: + reference: reference + filters: + - {name: geometry/scale, params: [88, 31]} + campaign: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [770]} + - {name: geometry/crop, params: [770, 390, 0, 0]} + backgroundimage: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [770]} + - {name: geometry/crop, params: [770, 390, 0, 0]} + highlighted: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [300]} + - {name: geometry/crop, params: [300, 300, 0, 0]} + galleryfull: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [770]} + contentgrid: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [770]} + - {name: geometry/crop, params: [370, 160, 0, 0]} + gallery: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [770]} + - {name: geometry/crop, params: [770, 390, 0, 0]} + imagefull: + reference: ~ + filters: + - {name: geometry/scalewidthdownonly, params: [770]} + + # ImageMagick + ezpublish.image.imagemagick.enabled: false + ezpublish.image.imagemagick.executable_path: + ezpublish.image.imagemagick.executable: convert + ezsettings.default.imagemagick.pre_parameters: + ezsettings.default.imagemagick.post_parameters: + ezpublish.image.imagemagick.filters: + geometry/scale: "-geometry {1}x{2}" + geometry/scalewidth: "-geometry {1}" + geometry/scaleheight: "-geometry x{1}" + geometry/scaledownonly: "-geometry {1}x{2}>" + geometry/scalewidthdownonly: "-geometry {1}>" + geometry/scaleheightdownonly: "-geometry x{1}>" + geometry/scaleexact: "-geometry {1}x{2}!" + geometry/scalepercent: "-geometry {1}x{2}%" + geometry/crop: "-crop {1}x{2}+{3}+{4}" + filter/noise: "-noise {1}" + filter/swirl: "-swirl {1}" + colorspace/gray: "-colorspace GRAY" + colorspace/transparent: "-colorspace Transparent" + colorspace: "-colorspace {1}" + border: "-border {1}x{2}" + border/color: "-bordercolor rgb({1},{2},{3})" + border/width: "-borderwidth {1}" + flatten: "-flatten" + resize: "-resize {1}" + optimize: "-strip" + + ### + # Internal settings + ### + ezpublish.siteaccess.groups: {} + ezpublish.siteaccess.groups_by_siteaccess: {} \ No newline at end of file diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/fieldtypes.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/fieldtypes.yml new file mode 100644 index 0000000..cf33a3c --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/fieldtypes.yml @@ -0,0 +1,681 @@ +parameters: + ezpublish.fieldType.class: eZ\Publish\Core\FieldType\FieldType + ezpublish.fieldType.ezauthor.class: eZ\Publish\Core\FieldType\Author\Type + ezpublish.fieldType.ezbinaryfile.class: eZ\Publish\Core\FieldType\BinaryFile\Type + ezpublish.fieldType.ezbinaryfile.externalStorage.class: eZ\Publish\Core\FieldType\BinaryFile\BinaryFileStorage + ezpublish.fieldType.ezbinaryfile.fileService.class: eZ\Publish\Core\MVC\Symfony\ConfiguredLocalFileService + ezpublish.fieldType.ezbinaryfile.mimeTypeDetector.class: eZ\Publish\Core\FieldType\BinaryBase\MimeTypeDetector\FileInfoDetector + ezpublish.fieldType.ezbinaryfile.pathGenerator.class: eZ\Publish\Core\FieldType\BinaryBase\PathGenerator\LegacyPathGenerator + ezpublish.fieldType.ezboolean.class: eZ\Publish\Core\FieldType\Checkbox\Type + ezpublish.fieldType.ezdatetime.class: eZ\Publish\Core\FieldType\DateAndTime\Type + ezpublish.fieldType.ezemail.class: eZ\Publish\Core\FieldType\EmailAddress\Type + ezpublish.fieldType.ezfloat.class: eZ\Publish\Core\FieldType\Float\Type + ezpublish.fieldType.ezinteger.class: eZ\Publish\Core\FieldType\Integer\Type + ezpublish.fieldType.ezimage.class: eZ\Publish\Core\FieldType\Image\Type + ezpublish.fieldType.ezimage.pathGenerator.class: eZ\Publish\Core\FieldType\Image\PathGenerator\LegacyPathGenerator + ezpublish.fieldType.ezimage.fileService.class: eZ\Publish\Core\MVC\Symfony\File\ConfiguredLocalImageService + ezpublish.fieldType.ezimage.externalStorage.class: eZ\Publish\Core\FieldType\Image\ImageStorage + ezpublish.fieldType.ezkeyword.class: eZ\Publish\Core\FieldType\Keyword\Type + ezpublish.fieldType.ezkeyword.externalStorage.class: eZ\Publish\Core\FieldType\Keyword\KeywordStorage + ezpublish.fieldType.ezmedia.class: eZ\Publish\Core\FieldType\Media\Type + ezpublish.fieldType.ezmedia.externalStorage.class: eZ\Publish\Core\FieldType\Media\MediaStorage + ezpublish.fieldType.ezobjectrelation.class: eZ\Publish\Core\FieldType\Relation\Type + ezpublish.fieldType.ezobjectrelation.externalStorage.class: eZ\Publish\Core\FieldType\Relation\RelationStorage + ezpublish.fieldType.ezsrrating.class: eZ\Publish\Core\FieldType\Rating\Type + ezpublish.fieldType.ezselection.class: eZ\Publish\Core\FieldType\Selection\Type + ezpublish.fieldType.eztext.class: eZ\Publish\Core\FieldType\TextBlock\Type + ezpublish.fieldType.ezstring.class: eZ\Publish\Core\FieldType\TextLine\Type + ezpublish.fieldType.ezurl.class: eZ\Publish\Core\FieldType\Url\Type + ezpublish.fieldType.ezurl.externalStorage.class: eZ\Publish\Core\FieldType\Url\UrlStorage + ezpublish.fieldType.ezxmltext.class: eZ\Publish\Core\FieldType\XmlText\Type + ezpublish.fieldType.ezxmltext.externalStorage.class: eZ\Publish\Core\FieldType\XmlText\XmlTextStorage + ezpublish.fieldType.ezxmltext.converter.html5.class: eZ\Publish\Core\FieldType\XmlText\Converter\Html5 + ezpublish.fieldType.ezxmltext.converter.html5.resources: %kernel.root_dir%/../vendor/ezsystems/ezpublish/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5.xsl + ezpublish.fieldType.ezxmltext.converter.embedToHtml5.class: eZ\Publish\Core\FieldType\XmlText\Converter\EmbedToHtml5 + ezpublish.fieldType.ezpage.class: eZ\Publish\Core\FieldType\Page\Type + ezpublish.fieldType.ezpage.pageService.class: eZ\Publish\Core\FieldType\Page\Service + ezpublish.fieldtype.ezpage.zoneDefinition: {} + ezpublish.fieldType.ezpage.blockDefinition: {} + + ezpublish.fieldType.ezgmaplocation.class: eZ\Publish\Core\FieldType\MapLocation\Type + ezpublish.fieldType.ezgmaplocation.externalStorage.class: eZ\Publish\Core\FieldType\MapLocation\MapLocationStorage + ezpublish.fieldType.ezobjectrelationlist.class: eZ\Publish\Core\FieldType\RelationList\Type + ezpublish.fieldType.ezobjectrelationlist.externalStorage.class: eZ\Publish\Core\FieldType\Relation\RelationStorage + ezpublish.fieldType.ezuser.class: eZ\Publish\Core\FieldType\User\Type + ezpublish.fieldType.ezuser.externalStorage.class: eZ\Publish\Core\FieldType\User\UserStorage + ezpublish.fieldType.ezcountry.class: eZ\Publish\Core\FieldType\Country\Type + ezpublish.fieldType.ezcountry.data: + AF: {Name: "Afghanistan", Alpha2: "AF", Alpha3: "AFG", IDC: "93"} + AX: {Name: "Åland", Alpha2: "AX", Alpha3: "ALA", IDC: "358"} + AL: {Name: "Albania", Alpha2: "AL", Alpha3: "ALB", IDC: "355"} + DZ: {Name: "Algeria", Alpha2: "DZ", Alpha3: "DZA", IDC: "213"} + AS: {Name: "American Samoa", Alpha2: "AS", Alpha3: "ASM", IDC: "1684"} + AD: {Name: "Andorra", Alpha2: "AD", Alpha3: "AND", IDC: "376"} + AO: {Name: "Angola", Alpha2: "AO", Alpha3: "AGO", IDC: "244"} + AI: {Name: "Anguilla", Alpha2: "AI", Alpha3: "AIA", IDC: "1264"} + AQ: {Name: "Antarctica", Alpha2: "AQ", Alpha3: "ATA", IDC: "672"} + AG: {Name: "Antigua and Barbuda", Alpha2: "AG", Alpha3: "ATG", IDC: "1268"} + AR: {Name: "Argentina", Alpha2: "AR", Alpha3: "ARG", IDC: "54"} + AM: {Name: "Armenia", Alpha2: "AM", Alpha3: "ARM", IDC: "374"} + AW: {Name: "Aruba", Alpha2: "AW", Alpha3: "ABW", IDC: "297"} + AU: {Name: "Australia", Alpha2: "AU", Alpha3: "AUS", IDC: "61"} + AT: {Name: "Austria", Alpha2: "AT", Alpha3: "AUT", IDC: "43"} + AZ: {Name: "Azerbaijan", Alpha2: "AZ", Alpha3: "AZE", IDC: "994"} + BS: {Name: "Bahamas", Alpha2: "BS", Alpha3: "BHS", IDC: "1242"} + BH: {Name: "Bahrain", Alpha2: "BH", Alpha3: "BHR", IDC: "973"} + BD: {Name: "Bangladesh", Alpha2: "BD", Alpha3: "BGD", IDC: "880"} + BB: {Name: "Barbados", Alpha2: "BB", Alpha3: "BRB", IDC: "1246"} + BY: {Name: "Belarus", Alpha2: "BY", Alpha3: "BLR", IDC: "375"} + BE: {Name: "Belgium", Alpha2: "BE", Alpha3: "BEL", IDC: "32"} + BZ: {Name: "Belize", Alpha2: "BZ", Alpha3: "BLZ", IDC: "501"} + BJ: {Name: "Benin", Alpha2: "BJ", Alpha3: "BEN", IDC: "229"} + BM: {Name: "Bermuda", Alpha2: "BM", Alpha3: "BMU", IDC: "1441"} + BT: {Name: "Bhutan", Alpha2: "BT", Alpha3: "BTN", IDC: "975"} + BO: {Name: "Bolivia", Alpha2: "BO", Alpha3: "BOL", IDC: "591"} + BA: {Name: "Bosnia and Herzegovina", Alpha2: "BA", Alpha3: "BIH", IDC: "387"} + BW: {Name: "Botswana", Alpha2: "BW", Alpha3: "BWA", IDC: "267"} + BV: {Name: "Bouvet Island", Alpha2: "BV", Alpha3: "BVT", IDC: "47"} + BR: {Name: "Brazil", Alpha2: "BR", Alpha3: "BRA", IDC: "55"} + IO: {Name: "British Indian Ocean Territory", Alpha2: "IO", Alpha3: "IOT", IDC: "246"} + BN: {Name: "Brunei Darussalam", Alpha2: "BN", Alpha3: "BRN", IDC: "673"} + BG: {Name: "Bulgaria", Alpha2: "BG", Alpha3: "BGR", IDC: "359"} + BF: {Name: "Burkina Faso", Alpha2: "BF", Alpha3: "BFA", IDC: "226"} + BI: {Name: "Burundi", Alpha2: "BI", Alpha3: "BDI", IDC: "257"} + KH: {Name: "Cambodia", Alpha2: "KH", Alpha3: "KHM", IDC: "855"} + CM: {Name: "Cameroon", Alpha2: "CM", Alpha3: "CMR", IDC: "237"} + CA: {Name: "Canada", Alpha2: "CA", Alpha3: "CAN", IDC: "1"} + CV: {Name: "Cape Verde", Alpha2: "CV", Alpha3: "CPV", IDC: "238"} + KY: {Name: "Cayman Islands", Alpha2: "KY", Alpha3: "CYM", IDC: "1345"} + CF: {Name: "Central African Republic", Alpha2: "CF", Alpha3: "CAF", IDC: "236"} + TD: {Name: "Chad", Alpha2: "TD", Alpha3: "TCD", IDC: "235"} + CL: {Name: "Chile", Alpha2: "CL", Alpha3: "CHL", IDC: "56"} + CN: {Name: "China", Alpha2: "CN", Alpha3: "CHN", IDC: "86"} + CX: {Name: "Christmas Island", Alpha2: "CX", Alpha3: "CXR", IDC: "61"} + CC: {Name: "Cocos (Keeling) Islands", Alpha2: "CC", Alpha3: "CCK", IDC: "61"} + CO: {Name: "Colombia", Alpha2: "CO", Alpha3: "COL", IDC: "57"} + KM: {Name: "Comoros", Alpha2: "KM", Alpha3: "COM", IDC: "269"} + CG: {Name: "Congo", Alpha2: "CG", Alpha3: "COG", IDC: "242"} + CD: {Name: "Congo, The Democratic Republic Of The", Alpha2: "CD", Alpha3: "COD", IDC: "243"} + CK: {Name: "Cook Islands", Alpha2: "CK", Alpha3: "COK", IDC: "682"} + CR: {Name: "Costa Rica", Alpha2: "CR", Alpha3: "CRI", IDC: "506"} + CI: {Name: "Côte d'Ivoire", Alpha2: "CI", Alpha3: "CIV", IDC: "225"} + HR: {Name: "Croatia", Alpha2: "HR", Alpha3: "HRV", IDC: "385"} + CU: {Name: "Cuba", Alpha2: "CU", Alpha3: "CUB", IDC: "53"} + CY: {Name: "Cyprus", Alpha2: "CY", Alpha3: "CYP", IDC: "357"} + CZ: {Name: "Czech Republic", Alpha2: "CZ", Alpha3: "CZE", IDC: "420"} + DK: {Name: "Denmark", Alpha2: "DK", Alpha3: "DNK", IDC: "45"} + DJ: {Name: "Djibouti", Alpha2: "DJ", Alpha3: "DJI", IDC: "253"} + DM: {Name: "Dominica", Alpha2: "DM", Alpha3: "DMA", IDC: "1767"} + DO: {Name: "Dominican Republic", Alpha2: "DO", Alpha3: "DOM", IDC: "1809"} + EC: {Name: "Ecuador", Alpha2: "EC", Alpha3: "ECU", IDC: "593"} + EG: {Name: "Egypt", Alpha2: "EG", Alpha3: "EGY", IDC: "20"} + SV: {Name: "El Salvador", Alpha2: "SV", Alpha3: "SLV", IDC: "503"} + GQ: {Name: "Equatorial Guinea", Alpha2: "GQ", Alpha3: "GNQ", IDC: "240"} + ER: {Name: "Eritrea", Alpha2: "ER", Alpha3: "ERI", IDC: "291"} + EE: {Name: "Estonia", Alpha2: "EE", Alpha3: "EST", IDC: "372"} + ET: {Name: "Ethiopia", Alpha2: "ET", Alpha3: "ETH", IDC: "251"} + FK: {Name: "Falkland Islands (Malvinas)", Alpha2: "FK", Alpha3: "FLK", IDC: "500"} + FO: {Name: "Faroe Islands", Alpha2: "FO", Alpha3: "FRO", IDC: "298"} + FJ: {Name: "Fiji", Alpha2: "FJ", Alpha3: "FJI", IDC: "679"} + FI: {Name: "Finland", Alpha2: "FI", Alpha3: "FIN", IDC: "358"} + FR: {Name: "France", Alpha2: "FR", Alpha3: "FRA", IDC: "33"} + GF: {Name: "French Guiana", Alpha2: "GF", Alpha3: "GUF", IDC: "594"} + PF: {Name: "French Polynesia", Alpha2: "PF", Alpha3: "PYF", IDC: "689"} + TF: {Name: "French Southern Territories", Alpha2: "TF", Alpha3: "ATF", IDC: "0"} + GA: {Name: "Gabon", Alpha2: "GA", Alpha3: "GAB", IDC: "241"} + GM: {Name: "Gambia", Alpha2: "GM", Alpha3: "GMB", IDC: "220"} + GE: {Name: "Georgia", Alpha2: "GE", Alpha3: "GEO", IDC: "995"} + DE: {Name: "Germany", Alpha2: "DE", Alpha3: "DEU", IDC: "49"} + GH: {Name: "Ghana", Alpha2: "GH", Alpha3: "GHA", IDC: "233"} + GI: {Name: "Gibraltar", Alpha2: "GI", Alpha3: "GIB", IDC: "350"} + GR: {Name: "Greece", Alpha2: "GR", Alpha3: "GRC", IDC: "30"} + GL: {Name: "Greenland", Alpha2: "GL", Alpha3: "GRL", IDC: "299"} + GD: {Name: "Grenada", Alpha2: "GD", Alpha3: "GRD", IDC: "1473"} + GP: {Name: "Guadeloupe", Alpha2: "GP", Alpha3: "GLP", IDC: "590"} + GU: {Name: "Guam", Alpha2: "GU", Alpha3: "GUM", IDC: "1671"} + GT: {Name: "Guatemala", Alpha2: "GT", Alpha3: "GTM", IDC: "502"} + GG: {Name: "Guernsey", Alpha2: "GG", Alpha3: "GGY", IDC: "44"} + GN: {Name: "Guinea", Alpha2: "GN", Alpha3: "GIN", IDC: "224"} + GW: {Name: "Guinea-Bissau", Alpha2: "GW", Alpha3: "GNB", IDC: "245"} + GY: {Name: "Guyana", Alpha2: "GY", Alpha3: "GUY", IDC: "592"} + HT: {Name: "Haiti", Alpha2: "HT", Alpha3: "HTI", IDC: "509"} + HM: {Name: "Heard Island and McDonald Islands", Alpha2: "HM", Alpha3: "HMD", IDC: "672"} + HN: {Name: "Honduras", Alpha2: "HN", Alpha3: "HND", IDC: "504"} + HK: {Name: "Hong Kong", Alpha2: "HK", Alpha3: "HKG", IDC: "852"} + HU: {Name: "Hungary", Alpha2: "HU", Alpha3: "HUN", IDC: "36"} + IS: {Name: "Iceland", Alpha2: "IS", Alpha3: "ISL", IDC: "354"} + IN: {Name: "India", Alpha2: "IN", Alpha3: "IND", IDC: "91"} + ID: {Name: "Indonesia", Alpha2: "ID", Alpha3: "IDN", IDC: "62"} + IR: {Name: "Iran, Islamic Republic of", Alpha2: "IR", Alpha3: "IRN", IDC: "98"} + IQ: {Name: "Iraq", Alpha2: "IQ", Alpha3: "IRQ", IDC: "964"} + IE: {Name: "Ireland", Alpha2: "IE", Alpha3: "IRL", IDC: "353"} + IM: {Name: "Isle of Man", Alpha2: "IM", Alpha3: "IMN", IDC: "44"} + IL: {Name: "Israel", Alpha2: "IL", Alpha3: "ISR", IDC: "972"} + IT: {Name: "Italy", Alpha2: "IT", Alpha3: "ITA", IDC: "39"} + JM: {Name: "Jamaica", Alpha2: "JM", Alpha3: "JAM", IDC: "1876"} + JP: {Name: "Japan", Alpha2: "JP", Alpha3: "JPN", IDC: "81"} + JE: {Name: "Jersey", Alpha2: "JE", Alpha3: "JEY", IDC: "44"} + JO: {Name: "Jordan", Alpha2: "JO", Alpha3: "JOR", IDC: "962"} + KZ: {Name: "Kazakhstan", Alpha2: "KZ", Alpha3: "KAZ", IDC: "7"} + KE: {Name: "Kenya", Alpha2: "KE", Alpha3: "KEN", IDC: "254"} + KI: {Name: "Kiribati", Alpha2: "KI", Alpha3: "KIR", IDC: "686"} + KP: {Name: "Korea, Democratic People's Republic of", Alpha2: "KP", Alpha3: "PRK", IDC: "850"} + KR: {Name: "Korea, Republic of", Alpha2: "KR", Alpha3: "KOR", IDC: "82"} + KW: {Name: "Kuwait", Alpha2: "KW", Alpha3: "KWT", IDC: "965"} + KG: {Name: "Kyrgyzstan", Alpha2: "KG", Alpha3: "KGZ", IDC: "996"} + LA: {Name: "Lao People's Democratic Republic", Alpha2: "LA", Alpha3: "LAO", IDC: "856"} + LV: {Name: "Latvia", Alpha2: "LV", Alpha3: "LVA", IDC: "371"} + LB: {Name: "Lebanon", Alpha2: "LB", Alpha3: "LBN", IDC: "961"} + LS: {Name: "Lesotho", Alpha2: "LS", Alpha3: "LSO", IDC: "266"} + LR: {Name: "Liberia", Alpha2: "LR", Alpha3: "LBR", IDC: "231"} + LY: {Name: "Libyan Arab Jamahiriya", Alpha2: "LY", Alpha3: "LBY", IDC: "218"} + LI: {Name: "Liechtenstein", Alpha2: "LI", Alpha3: "LIE", IDC: "423"} + LT: {Name: "Lithuania", Alpha2: "LT", Alpha3: "LTU", IDC: "370"} + LU: {Name: "Luxembourg", Alpha2: "LU", Alpha3: "LUX", IDC: "352"} + MO: {Name: "Macau", Alpha2: "MO", Alpha3: "MAC", IDC: "853"} + MK: {Name: "Macedonia, The Former Yugoslav Republic of", Alpha2: "MK", Alpha3: "MKD", IDC: "389"} + MG: {Name: "Madagascar", Alpha2: "MG", Alpha3: "MDG", IDC: "261"} + MW: {Name: "Malawi", Alpha2: "MW", Alpha3: "MWI", IDC: "265"} + MY: {Name: "Malaysia", Alpha2: "MY", Alpha3: "MYS", IDC: "60"} + MV: {Name: "Maldives", Alpha2: "MV", Alpha3: "MDV", IDC: "960"} + ML: {Name: "Mali", Alpha2: "ML", Alpha3: "MLI", IDC: "223"} + MT: {Name: "Malta", Alpha2: "MT", Alpha3: "MLT", IDC: "356"} + MH: {Name: "Marshall Islands", Alpha2: "MH", Alpha3: "MHL", IDC: "692"} + MQ: {Name: "Martinique", Alpha2: "MQ", Alpha3: "MTQ", IDC: "596"} + MR: {Name: "Mauritania", Alpha2: "MR", Alpha3: "MRT", IDC: "222"} + MU: {Name: "Mauritius", Alpha2: "MU", Alpha3: "MUS", IDC: "230"} + YT: {Name: "Mayotte", Alpha2: "YT", Alpha3: "MYT", IDC: "262"} + MX: {Name: "Mexico", Alpha2: "MX", Alpha3: "MEX", IDC: "52"} + FM: {Name: "Micronesia, Federated States of", Alpha2: "FM", Alpha3: "FSM", IDC: "691"} + MD: {Name: "Moldova, Republic of", Alpha2: "MD", Alpha3: "MDA", IDC: "373"} + MC: {Name: "Monaco", Alpha2: "MC", Alpha3: "MCO", IDC: "377"} + MN: {Name: "Mongolia", Alpha2: "MN", Alpha3: "MNG", IDC: "976"} + ME: {Name: "Montenegro", Alpha2: "ME", Alpha3: "MNE", IDC: "382"} + MS: {Name: "Montserrat", Alpha2: "MS", Alpha3: "MSR", IDC: "1664"} + MA: {Name: "Morocco", Alpha2: "MA", Alpha3: "MAR", IDC: "212"} + MZ: {Name: "Mozambique", Alpha2: "MZ", Alpha3: "MOZ", IDC: "258"} + MM: {Name: "Myanmar", Alpha2: "MM", Alpha3: "MMR", IDC: "95"} + NA: {Name: "Namibia", Alpha2: "NA", Alpha3: "NAM", IDC: "264"} + NR: {Name: "Nauru", Alpha2: "NR", Alpha3: "NRU", IDC: "674"} + NP: {Name: "Nepal", Alpha2: "NP", Alpha3: "NPL", IDC: "977"} + NL: {Name: "Netherlands", Alpha2: "NL", Alpha3: "NLD", IDC: "31"} + AN: {Name: "Netherlands Antilles", Alpha2: "AN", Alpha3: "ANT", IDC: "599"} + NC: {Name: "New Caledonia", Alpha2: "NC", Alpha3: "NCL", IDC: "687"} + NZ: {Name: "New Zealand", Alpha2: "NZ", Alpha3: "NZL", IDC: "64"} + NI: {Name: "Nicaragua", Alpha2: "NI", Alpha3: "NIC", IDC: "505"} + NE: {Name: "Niger", Alpha2: "NE", Alpha3: "NER", IDC: "227"} + NG: {Name: "Nigeria", Alpha2: "NG", Alpha3: "NGA", IDC: "234"} + NU: {Name: "Niue", Alpha2: "NU", Alpha3: "NIU", IDC: "683"} + NF: {Name: "Norfolk Island", Alpha2: "NF", Alpha3: "NFK", IDC: "6723"} + MP: {Name: "Northern Mariana Islands", Alpha2: "MP", Alpha3: "MNP", IDC: "1670"} + NO: {Name: "Norway", Alpha2: "NO", Alpha3: "NOR", IDC: "47"} + OM: {Name: "Oman", Alpha2: "OM", Alpha3: "OMN", IDC: "968"} + PK: {Name: "Pakistan", Alpha2: "PK", Alpha3: "PAK", IDC: "92"} + PW: {Name: "Palau", Alpha2: "PW", Alpha3: "PLW", IDC: "680"} + PS: {Name: "Palestinian Territory, Occupied", Alpha2: "PS", Alpha3: "PSE", IDC: "970"} + PA: {Name: "Panama", Alpha2: "PA", Alpha3: "PAN", IDC: "507"} + PG: {Name: "Papua New Guinea", Alpha2: "PG", Alpha3: "PNG", IDC: "675"} + PY: {Name: "Paraguay", Alpha2: "PY", Alpha3: "PRY", IDC: "595"} + PE: {Name: "Peru", Alpha2: "PE", Alpha3: "PER", IDC: "51"} + PH: {Name: "Philippines", Alpha2: "PH", Alpha3: "PHL", IDC: "63"} + PN: {Name: "Pitcairn", Alpha2: "PN", Alpha3: "PCN", IDC: "64"} + PL: {Name: "Poland", Alpha2: "PL", Alpha3: "POL", IDC: "48"} + PT: {Name: "Portugal", Alpha2: "PT", Alpha3: "PRT", IDC: "351"} + PR: {Name: "Puerto Rico", Alpha2: "PR", Alpha3: "PRI", IDC: "1787"} + QA: {Name: "Qatar", Alpha2: "QA", Alpha3: "QAT", IDC: "974"} + RE: {Name: "Reunion", Alpha2: "RE", Alpha3: "REU", IDC: "262"} + RO: {Name: "Romania", Alpha2: "RO", Alpha3: "ROU", IDC: "40"} + RU: {Name: "Russian Federation", Alpha2: "RU", Alpha3: "RUS", IDC: "7"} + RW: {Name: "Rwanda", Alpha2: "RW", Alpha3: "RWA", IDC: "250"} + BL: {Name: "Saint Barthélemy", Alpha2: "BL", Alpha3: "BLM", IDC: "590"} + SH: {Name: "Saint Helena", Alpha2: "SH", Alpha3: "SHN", IDC: "290"} + KN: {Name: "Saint Kitts and Nevis", Alpha2: "KN", Alpha3: "KNA", IDC: "1869"} + LC: {Name: "Saint Lucia", Alpha2: "LC", Alpha3: "LCA", IDC: "1758"} + MF: {Name: "Saint Martin", Alpha2: "MF", Alpha3: "MAF", IDC: "590"} + PM: {Name: "Saint Pierre and Miquelon", Alpha2: "PM", Alpha3: "SPM", IDC: "508"} + VC: {Name: "Saint Vincent and The Grenadines", Alpha2: "VC", Alpha3: "VCT", IDC: "1784"} + WS: {Name: "Samoa", Alpha2: "WS", Alpha3: "WSM", IDC: "685"} + SM: {Name: "San Marino", Alpha2: "SM", Alpha3: "SMR", IDC: "378"} + ST: {Name: "Sao Tome and Principe", Alpha2: "ST", Alpha3: "STP", IDC: "239"} + SA: {Name: "Saudi Arabia", Alpha2: "SA", Alpha3: "SAU", IDC: "966"} + SN: {Name: "Senegal", Alpha2: "SN", Alpha3: "SEN", IDC: "221"} + RS: {Name: "Serbia", Alpha2: "RS", Alpha3: "SRB", IDC: "381"} + SC: {Name: "Seychelles", Alpha2: "SC", Alpha3: "SYC", IDC: "248"} + SL: {Name: "Sierra Leone", Alpha2: "SL", Alpha3: "SLE", IDC: "232"} + SG: {Name: "Singapore", Alpha2: "SG", Alpha3: "SGP", IDC: "65"} + SK: {Name: "Slovakia", Alpha2: "SK", Alpha3: "SVK", IDC: "421"} + SI: {Name: "Slovenia", Alpha2: "SI", Alpha3: "SVN", IDC: "386"} + SB: {Name: "Solomon Islands", Alpha2: "SB", Alpha3: "SLB", IDC: "677"} + SO: {Name: "Somalia", Alpha2: "SO", Alpha3: "SOM", IDC: "252"} + ZA: {Name: "South Africa", Alpha2: "ZA", Alpha3: "ZAF", IDC: "27"} + GS: {Name: "South Georgia and The South Sandwich Islands", Alpha2: "GS", Alpha3: "SGS", IDC: "500"} + ES: {Name: "Spain", Alpha2: "ES", Alpha3: "ESP", IDC: "34"} + LK: {Name: "Sri Lanka", Alpha2: "LK", Alpha3: "LKA", IDC: "94"} + SD: {Name: "Sudan", Alpha2: "SD", Alpha3: "SDN", IDC: "249"} + SR: {Name: "Suriname", Alpha2: "SR", Alpha3: "SUR", IDC: "597"} + SJ: {Name: "Svalbard and Jan Mayen", Alpha2: "SJ", Alpha3: "SJM", IDC: "47"} + SZ: {Name: "Swaziland", Alpha2: "SZ", Alpha3: "SWZ", IDC: "268"} + SE: {Name: "Sweden", Alpha2: "SE", Alpha3: "SWE", IDC: "46"} + CH: {Name: "Switzerland", Alpha2: "CH", Alpha3: "CHE", IDC: "41"} + SY: {Name: "Syrian Arab Republic", Alpha2: "SY", Alpha3: "SYR", IDC: "963"} + TW: {Name: "Taiwan", Alpha2: "TW", Alpha3: "TWN", IDC: "886"} + TJ: {Name: "Tajikistan", Alpha2: "TJ", Alpha3: "TJK", IDC: "992"} + TZ: {Name: "Tanzania, United Republic of", Alpha2: "TZ", Alpha3: "TZA", IDC: "255"} + TH: {Name: "Thailand", Alpha2: "TH", Alpha3: "THA", IDC: "66"} + TL: {Name: "Timor-Leste", Alpha2: "TL", Alpha3: "TLS", IDC: "670"} + TG: {Name: "Togo", Alpha2: "TG", Alpha3: "TGO", IDC: "228"} + TK: {Name: "Tokelau", Alpha2: "TK", Alpha3: "TKL", IDC: "690"} + TO: {Name: "Tonga", Alpha2: "TO", Alpha3: "TON", IDC: "676"} + TT: {Name: "Trinidad and Tobago", Alpha2: "TT", Alpha3: "TTO", IDC: "1868"} + TN: {Name: "Tunisia", Alpha2: "TN", Alpha3: "TUN", IDC: "216"} + TR: {Name: "Turkey", Alpha2: "TR", Alpha3: "TUR", IDC: "90"} + TM: {Name: "Turkmenistan", Alpha2: "TM", Alpha3: "TKM", IDC: "993"} + TC: {Name: "Turks and Caicos Islands", Alpha2: "TC", Alpha3: "TCA", IDC: "1649"} + TV: {Name: "Tuvalu", Alpha2: "TV", Alpha3: "TUV", IDC: "688"} + UG: {Name: "Uganda", Alpha2: "UG", Alpha3: "UGA", IDC: "256"} + UA: {Name: "Ukraine", Alpha2: "UA", Alpha3: "UKR", IDC: "380"} + AE: {Name: "United Arab Emirates", Alpha2: "AE", Alpha3: "ARE", IDC: "971"} + GB: {Name: "United Kingdom", Alpha2: "GB", Alpha3: "GBR", IDC: "44"} + UM: {Name: "United States Minor Outlying Islands", Alpha2: "UM", Alpha3: "UMI", IDC: "1"} + US: {Name: "United States of America", Alpha2: "US", Alpha3: "USA", IDC: "1"} + UY: {Name: "Uruguay", Alpha2: "UY", Alpha3: "URY", IDC: "598"} + UZ: {Name: "Uzbekistan", Alpha2: "UZ", Alpha3: "UZB", IDC: "998"} + VU: {Name: "Vanuatu", Alpha2: "VU", Alpha3: "VUT", IDC: "678"} + VA: {Name: "Holy See (Vatican City State)", Alpha2: "VA", Alpha3: "VAT", IDC: "3906"} + VE: {Name: "Venezuela", Alpha2: "VE", Alpha3: "VEN", IDC: "58"} + VN: {Name: "Viet Nam", Alpha2: "VN", Alpha3: "VNM", IDC: "84"} + VG: {Name: "Virgin Islands, British", Alpha2: "VG", Alpha3: "VGB", IDC: "1284"} + VI: {Name: "Virgin Islands, U.S.", Alpha2: "VI", Alpha3: "VIR", IDC: "1340"} + WF: {Name: "Wallis and Futuna", Alpha2: "WF", Alpha3: "WLF", IDC: "681"} + EH: {Name: "Western Sahara", Alpha2: "EH", Alpha3: "ESH", IDC: "212"} + YE: {Name: "Yemen", Alpha2: "YE", Alpha3: "YEM", IDC: "967"} + ZM: {Name: "Zambia", Alpha2: "ZM", Alpha3: "ZMB", IDC: "260"} + ZW: {Name: "Zimbabwe", Alpha2: "ZW", Alpha3: "ZWE", IDC: "263"} + + ezpublish.fieldType.eznull.class: eZ\Publish\Core\FieldType\Null\Type + +services: + ezpublish.fieldType: + class: %ezpublish.fieldType.class% + abstract: true + + ezpublish.fieldType.ezauthor: + class: %ezpublish.fieldType.ezauthor.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezauthor} + + ezpublish.fieldType.ezbinaryfile: + class: %ezpublish.fieldType.ezbinaryfile.class% + parent: ezpublish.fieldType + arguments: [@ezpublish.fieldType.ezbinaryfile.fileService, @ezpublish.fieldType.ezbinaryfile.mimeTypeDetector] + tags: + - {name: ezpublish.fieldType, alias: ezbinaryfile} + + ezpublish.fieldType.ezbinaryfile.fileService: + class: %ezpublish.fieldType.ezbinaryfile.fileService.class% + arguments: [@ezpublish.config.resolver, %webroot_dir%] + + ezpublish.fieldType.ezbinaryfile.mimeTypeDetector: + class: %ezpublish.fieldType.ezbinaryfile.mimeTypeDetector.class% + + ezpublish.fieldType.ezbinaryfile.pathGenerator: + class: %ezpublish.fieldType.ezbinaryfile.pathGenerator.class% + + ezpublish.fieldType.ezbinaryfile.externalStorage: + class: %ezpublish.fieldType.ezbinaryfile.externalStorage.class% + arguments: [[], @ezpublish.fieldType.ezbinaryfile.fileService, @ezpublish.fieldType.ezbinaryfile.pathGenerator] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezbinaryfile} + + ezpublish.fieldType.ezboolean: + class: %ezpublish.fieldType.ezboolean.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezboolean} + + ezpublish.fieldType.ezcountry: + class: %ezpublish.fieldType.ezcountry.class% + arguments: [%ezpublish.fieldType.ezcountry.data%] + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezcountry} + + ezpublish.fieldType.ezdatetime: + class: %ezpublish.fieldType.ezdatetime.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezdatetime} + + ezpublish.fieldType.ezemail: + class: %ezpublish.fieldType.ezemail.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezemail} + + ezpublish.fieldType.ezfloat: + class: %ezpublish.fieldType.ezfloat.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezfloat} + + ezpublish.fieldType.ezinteger: + class: %ezpublish.fieldType.ezinteger.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezinteger} + + ezpublish.fieldType.ezimage: + class: %ezpublish.fieldType.ezimage.class% + parent: ezpublish.fieldType + arguments: [@ezpublish.fieldType.ezbinaryfile.fileService] + tags: + - {name: ezpublish.fieldType, alias: ezimage} + + ezpublish.fieldType.ezimage.fileService: + class: %ezpublish.fieldType.ezimage.fileService.class% + arguments: [@ezpublish.config.resolver, %webroot_dir%] + + ezpublish.fieldType.ezimage.pathGenerator: + class: %ezpublish.fieldType.ezimage.pathGenerator.class% + + ezpublish.fieldType.ezimage.externalStorage: + class: %ezpublish.fieldType.ezimage.externalStorage.class% + arguments: [[], @ezpublish.fieldType.ezimage.fileService, @ezpublish.fieldType.ezimage.pathGenerator] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezimage} + + # Image alias generator + # @todo: Implement a new one not to rely only on legacy + # See @EzPublishLegacyBundle/config/services.yml + #ezpublish.fieldType.ezimage.variation_service: + # alias: ezpublish.fieldType.ezimage.variation_service.default + + ezpublish.fieldType.ezkeyword: + class: %ezpublish.fieldType.ezkeyword.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezkeyword} + + ezpublish.fieldType.ezkeyword.externalStorage: + class: %ezpublish.fieldType.ezkeyword.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezkeyword} + + ezpublish.fieldType.ezmedia: + class: %ezpublish.fieldType.ezmedia.class% + arguments: [@ezpublish.fieldType.ezbinaryfile.fileService, @ezpublish.fieldType.ezbinaryfile.mimeTypeDetector] + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezmedia} + + ezpublish.fieldType.ezmedia.externalStorage: + class: %ezpublish.fieldType.ezmedia.externalStorage.class% + arguments: [[], @ezpublish.fieldType.ezbinaryfile.fileService, @ezpublish.fieldType.ezbinaryfile.pathGenerator] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezmedia} + + ezpublish.fieldType.ezobjectrelation: + class: %ezpublish.fieldType.ezobjectrelation.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezobjectrelation} + + ezpublish.fieldType.ezobjectrelation.externalStorage: + class: %ezpublish.fieldType.ezobjectrelation.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezobjectrelation} + + ezpublish.fieldType.ezsrrating: + class: %ezpublish.fieldType.ezsrrating.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezsrrating} + + ezpublish.fieldType.ezselection: + class: %ezpublish.fieldType.ezselection.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezselection} + + ezpublish.fieldType.eztext: + class: %ezpublish.fieldType.eztext.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: eztext} + + ezpublish.fieldType.ezstring: + class: %ezpublish.fieldType.ezstring.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezstring} + + ezpublish.fieldType.ezurl: + class: %ezpublish.fieldType.ezurl.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezurl} + + ezpublish.fieldType.ezurl.externalStorage: + class: %ezpublish.fieldType.ezurl.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezurl} + + ezpublish.fieldType.ezxmltext: + class: %ezpublish.fieldType.ezxmltext.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezxmltext} + + ezpublish.fieldType.ezxmltext.externalStorage: + class: %ezpublish.fieldType.ezxmltext.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezxmltext} + + ezpublish.fieldType.ezxmltext.converter.html5: + class: %ezpublish.fieldType.ezxmltext.converter.html5.class% + arguments: [%ezpublish.fieldType.ezxmltext.converter.html5.resources%, [@ezpublish.fieldType.ezxmltext.converter.embedToHtml5]] + + ezpublish.fieldType.ezxmltext.converter.embedToHtml5: + class: %ezpublish.fieldType.ezxmltext.converter.embedToHtml5.class% + arguments: [@ezpublish.view_manager,@ezpublish.api.repository] + + ezpublish.fieldType.ezpage: + class: %ezpublish.fieldType.ezpage.class% + parent: ezpublish.fieldType + arguments: [@ezpublish.fieldType.ezpage.pageService] + tags: + - {name: ezpublish.fieldType, alias: ezpage} + + ezpublish.fieldType.ezpage.pageService: + class: %ezpublish.fieldType.ezpage.pageService.class% + arguments: [%ezpublish.fieldtype.ezpage.zoneDefinition%, %ezpublish.fieldtype.ezpage.blockDefinition%] + + ezpublish.fieldType.ezgmaplocation: + class: %ezpublish.fieldType.ezgmaplocation.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezgmaplocation} + + ezpublish.fieldType.ezemail: + class: %ezpublish.fieldType.ezemail.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezemail} + + ezpublish.fieldType.ezgmaplocation.externalStorage: + class: %ezpublish.fieldType.ezgmaplocation.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezgmaplocation} + + ezpublish.fieldType.ezobjectrelationlist: + class: %ezpublish.fieldType.ezobjectrelationlist.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezobjectrelationlist} + + ezpublish.fieldType.ezobjectrelationlist.externalStorage: + class: %ezpublish.fieldType.ezobjectrelationlist.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezobjectrelationlist} + + ezpublish.fieldType.ezuser: + class: %ezpublish.fieldType.ezuser.class% + parent: ezpublish.fieldType + tags: + - {name: ezpublish.fieldType, alias: ezuser} + + ezpublish.fieldType.ezuser.externalStorage: + class: %ezpublish.fieldType.ezuser.externalStorage.class% + arguments: [[]] + tags: + - {name: ezpublish.fieldType.externalStorageHandler, alias: ezuser} + + # Not implemented fieldtypes + # Configured to use the Null type to not throw exception + ezpublish.fieldType.ezdate: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezdate" ] + tags: + - {name: ezpublish.fieldType, alias: ezdate} + + ezpublish.fieldType.ezenum: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezenum" ] + tags: + - {name: ezpublish.fieldType, alias: ezenum} + + ezpublish.fieldType.ezidentifier: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezidentifier" ] + tags: + - {name: ezpublish.fieldType, alias: ezidentifier} + + ezpublish.fieldType.ezinisetting: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezinisetting" ] + tags: + - {name: ezpublish.fieldType, alias: ezinisetting} + + ezpublish.fieldType.ezisbn: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezisbn" ] + tags: + - {name: ezpublish.fieldType, alias: ezisbn} + + ezpublish.fieldType.ezmatrix: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezmatrix" ] + tags: + - {name: ezpublish.fieldType, alias: ezmatrix} + + ezpublish.fieldType.ezmultioption: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezmultioption" ] + tags: + - {name: ezpublish.fieldType, alias: ezmultioption} + + ezpublish.fieldType.ezmultioption2: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezmultioption2" ] + tags: + - {name: ezpublish.fieldType, alias: ezmultioption2} + + ezpublish.fieldType.ezmultiprice: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezmultiprice" ] + tags: + - {name: ezpublish.fieldType, alias: ezmultiprice} + + ezpublish.fieldType.ezoption: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezoption" ] + tags: + - {name: ezpublish.fieldType, alias: ezoption} + + ezpublish.fieldType.ezpackage: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezpackage" ] + tags: + - {name: ezpublish.fieldType, alias: ezpackage} + + ezpublish.fieldType.ezprice: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezprice" ] + tags: + - {name: ezpublish.fieldType, alias: ezprice} + + ezpublish.fieldType.ezproductcategory: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezproductcategory" ] + tags: + - {name: ezpublish.fieldType, alias: ezproductcategory} + + ezpublish.fieldType.ezrangeoption: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezrangeoption" ] + tags: + - {name: ezpublish.fieldType, alias: ezrangeoption} + + ezpublish.fieldType.ezsubtreesubscription: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezsubtreesubscription" ] + tags: + - {name: ezpublish.fieldType, alias: ezsubtreesubscription} + + ezpublish.fieldType.eztime: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "eztime" ] + tags: + - {name: ezpublish.fieldType, alias: eztime} + + # not implemented fieldtypes from extensions + ezpublish.fieldType.ezcomcomments: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezcomcomments" ] + tags: + - {name: ezpublish.fieldType, alias: ezcomcomments} + + ezpublish.fieldType.ezpaex: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezpaex" ] + tags: + - {name: ezpublish.fieldType, alias: ezpaex} + + ezpublish.fieldType.ezsurvey: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "ezsurvey" ] + tags: + - {name: ezpublish.fieldType, alias: ezsurvey} + + ezpublish.fieldType.eztags: + class: %ezpublish.fieldType.eznull.class% + parent: ezpublish.fieldType + arguments: [ "eztags" ] + tags: + - {name: ezpublish.fieldType, alias: eztags} diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/papi.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/papi.yml new file mode 100644 index 0000000..39d222e --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/papi.yml @@ -0,0 +1,238 @@ +parameters: + # API + ezpublish.api.repository.factory.class: eZ\Bundle\EzPublishCoreBundle\ApiLoader\RepositoryFactory + ezpublish.api.repository.lazy_factory.class: eZ\Bundle\EzPublishCoreBundle\ApiLoader\LazyRepositoryFactory + ezpublish.api.inner_repository.class: eZ\Publish\Core\Repository\Repository + ezpublish.api.io_handler.class: eZ\Publish\Core\IO\InMemoryHandler + ezpublish.api.storage_engine.factory.class: eZ\Bundle\EzPublishCoreBundle\ApiLoader\StorageEngineFactory + + # Signal Slot API wrapper + ezpublish.signalslot.repository.class: eZ\Publish\Core\SignalSlot\Repository + ezpublish.signalslot.slot_factory.class: eZ\Publish\Core\SignalSlot\SlotFactory\ContainerSlotFactory + ezpublish.signalslot.signal_dispatcher.class: eZ\Publish\Core\SignalSlot\SignalDispatcher\DefaultSignalDispatcher + ezpublish.signalslot.signal_dispatcher.mapping: + eZ\Publish\Core\SignalSlot\Signal\SectionService\AssignSectionSignal: [ezpublish.signalslot.legacy_slot.assign_section] + eZ\Publish\Core\SignalSlot\Signal\ContentService\CopyContentSignal: [ezpublish.signalslot.legacy_slot.copy_content] + eZ\Publish\Core\SignalSlot\Signal\LocationService\CreateLocationSignal: [ezpublish.signalslot.legacy_slot.create_location] + eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteContentSignal: [ezpublish.signalslot.legacy_slot.delete_content] + eZ\Publish\Core\SignalSlot\Signal\LocationService\DeleteLocationSignal: [ezpublish.signalslot.legacy_slot.delete_location] + eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteVersionSignal: [ezpublish.signalslot.legacy_slot.delete_version] + eZ\Publish\Core\SignalSlot\Signal\LocationService\HideLocationSignal: [ezpublish.signalslot.legacy_slot.hide_location] + eZ\Publish\Core\SignalSlot\Signal\LocationService\MoveSubtreeSignal: [ezpublish.signalslot.legacy_slot.move_subtree] + eZ\Publish\Core\SignalSlot\Signal\ContentService\PublishVersionSignal: [ezpublish.signalslot.legacy_slot.publish_version] + eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\SetContentStateSignal: [ezpublish.signalslot.legacy_slot.set_content_state] + eZ\Publish\Core\SignalSlot\Signal\LocationService\SwapLocationSignal: [ezpublish.signalslot.legacy_slot.swap_location] + eZ\Publish\Core\SignalSlot\Signal\LocationService\UnhideLocationSignal: [ezpublish.signalslot.legacy_slot.unhide_location] + eZ\Publish\Core\SignalSlot\Signal\LocationService\UpdateLocationSignal: [ezpublish.signalslot.legacy_slot.update_location] + eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\PublishContentTypeDraftSignal: [ezpublish.signalslot.legacy_slot.publish_content_type_draft] + ezpublish.signalslot.legacy_slot.assign_section.class: eZ\Publish\Core\SignalSlot\Slot\LegacyAssignSectionSlot + ezpublish.signalslot.legacy_slot.copy_content.class: eZ\Publish\Core\SignalSlot\Slot\LegacyCopyContentSlot + ezpublish.signalslot.legacy_slot.create_location.class: eZ\Publish\Core\SignalSlot\Slot\LegacyCreateLocationSlot + ezpublish.signalslot.legacy_slot.delete_content.class: eZ\Publish\Core\SignalSlot\Slot\LegacyDeleteContentSlot + ezpublish.signalslot.legacy_slot.delete_location.class: eZ\Publish\Core\SignalSlot\Slot\LegacyDeleteLocationSlot + ezpublish.signalslot.legacy_slot.delete_version.class: eZ\Publish\Core\SignalSlot\Slot\LegacyDeleteVersionSlot + ezpublish.signalslot.legacy_slot.hide_location.class: eZ\Publish\Core\SignalSlot\Slot\LegacyHideLocationSlot + ezpublish.signalslot.legacy_slot.move_subtree.class: eZ\Publish\Core\SignalSlot\Slot\LegacyMoveSubtreeSlot + ezpublish.signalslot.legacy_slot.publish_version.class: eZ\Publish\Core\SignalSlot\Slot\LegacyPublishVersionSlot + ezpublish.signalslot.legacy_slot.set_content_state.class: eZ\Publish\Core\SignalSlot\Slot\LegacySetContentStateSlot + ezpublish.signalslot.legacy_slot.swap_location.class: eZ\Publish\Core\SignalSlot\Slot\LegacySwapLocationSlot + ezpublish.signalslot.legacy_slot.unhide_location.class: eZ\Publish\Core\SignalSlot\Slot\LegacyUnhideLocationSlot + ezpublish.signalslot.legacy_slot.update_location.class: eZ\Publish\Core\SignalSlot\Slot\LegacyUpdateLocationSlot + ezpublish.signalslot.legacy_slot.publish_content_type_draft.class: eZ\Publish\Core\SignalSlot\Slot\LegacyPublishContentTypeDraftSlot + + + # Using legacy storage engine for data compatibility with 4.x + ezpublish.api.storage_engine.default: legacy + + ezpublish.api.content.class: eZ\Publish\Core\Repository\Values\Content\Content + ezpublish.api.location.class: eZ\Publish\Core\Repository\Values\Content\Location + +services: + # API + ezpublish.api.repository: + alias: ezpublish.signalslot.repository + + ezpublish.api.repository.factory: + class: %ezpublish.api.repository.factory.class% + arguments: [@service_container] + + ezpublish.api.repository.lazy_factory: + class: %ezpublish.api.repository.lazy_factory.class% + arguments: [@service_container] + + ezpublish.api.inner_repository: + class: %ezpublish.api.inner_repository.class% + factory_service: ezpublish.api.repository.factory + factory_method: buildRepository + arguments: + - @ezpublish.api.persistence_handler + - @ezpublish.api.io_handler + + ezpublish.api.repository.lazy: + class: Closure + factory_service: ezpublish.api.repository.lazy_factory + factory_method: buildRepository + + ezpublish.api.io_handler: + class: %ezpublish.api.io_handler.class% + public: false + + ezpublish.api.storage_engine.factory: + class: %ezpublish.api.storage_engine.factory.class% + arguments: [@service_container] + + ezpublish.api.persistence_handler: + class: eZ\Publish\SPI\Persistence\Handler + factory_service: ezpublish.api.storage_engine.factory + factory_method: buildStorageEngine + arguments: [%ezpublish.api.storage_engine.default%] + public: false + + ezpublish.api.service.content: + class: eZ\Publish\API\Repository\ContentService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, Content] + + ezpublish.api.service.content_type: + class: eZ\Publish\API\Repository\ContentTypeService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, ContentType] + + ezpublish.api.service.field_type: + class: eZ\Publish\API\Repository\ContentTypeService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, FieldType] + + ezpublish.api.service.role: + class: eZ\Publish\API\Repository\RoleService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, Role] + + ezpublish.api.service.io: + class: eZ\Publish\API\Repository\IOService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, IO] + + ezpublish.api.service.object_state: + class: eZ\Publish\API\Repository\ObjectStateService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, ObjectState] + + ezpublish.api.service.url_wildcard: + class: eZ\Publish\API\Repository\URLWildcardService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, URLWildcard] + + ezpublish.api.service.url_alias: + class: eZ\Publish\API\Repository\URLAliasService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, URLAlias] + + ezpublish.api.service.user: + class: eZ\Publish\API\Repository\UserService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, User] + + ezpublish.api.service.search: + class: eZ\Publish\API\Repository\SearchService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, Search] + + ezpublish.api.service.section: + class: eZ\Publish\API\Repository\SectionService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, Section] + + ezpublish.api.service.trash: + class: eZ\Publish\API\Repository\TrashService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, Trash] + + ezpublish.api.service.location: + class: eZ\Publish\API\Repository\LocationService + factory_service: ezpublish.api.repository.factory + factory_method: buildService + arguments: [@ezpublish.api.repository, Location] + + # Signal Slot API wrapper + ezpublish.signalslot.repository: + class: %ezpublish.signalslot.repository.class% + arguments: [@ezpublish.api.inner_repository, @ezpublish.signalslot.signal_dispatcher] + + ezpublish.signalslot.signal_dispatcher: + class: %ezpublish.signalslot.signal_dispatcher.class% + arguments: + - @ezpublish.signalslot.slot_factory + - %ezpublish.signalslot.signal_dispatcher.mapping% + + ezpublish.signalslot.slot_factory: + class: %ezpublish.signalslot.slot_factory.class% + arguments: [@service_container] + + ezpublish.signalslot.legacy_slot.assign_section: + class: %ezpublish.signalslot.legacy_slot.assign_section.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.copy_content: + class: %ezpublish.signalslot.legacy_slot.copy_content.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.create_location: + class: %ezpublish.signalslot.legacy_slot.create_location.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.delete_content: + class: %ezpublish.signalslot.legacy_slot.delete_content.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.delete_location: + class: %ezpublish.signalslot.legacy_slot.delete_location.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.delete_version: + class: %ezpublish.signalslot.legacy_slot.delete_version.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.hide_location: + class: %ezpublish.signalslot.legacy_slot.hide_location.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.move_subtree: + class: %ezpublish.signalslot.legacy_slot.move_subtree.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.publish_version: + class: %ezpublish.signalslot.legacy_slot.publish_version.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.set_content_state: + class: %ezpublish.signalslot.legacy_slot.set_content_state.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.swap_location: + class: %ezpublish.signalslot.legacy_slot.swap_location.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.unhide_location: + class: %ezpublish.signalslot.legacy_slot.unhide_location.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.update_location: + class: %ezpublish.signalslot.legacy_slot.update_location.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.signalslot.legacy_slot.publish_content_type_draft: + class: %ezpublish.signalslot.legacy_slot.publish_content_type_draft.class% + arguments: [@ezpublish_legacy.kernel] diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/roles.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/roles.yml new file mode 100644 index 0000000..17bc4cc --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/roles.yml @@ -0,0 +1,94 @@ +parameters: + ezpublish.api.role.limitation_type.content_type.class: eZ\Publish\Core\Limitation\ContentTypeLimitationType + ezpublish.api.role.limitation_type.language.class: eZ\Publish\Core\Limitation\LanguageLimitationType + ezpublish.api.role.limitation_type.location.class: eZ\Publish\Core\Limitation\LocationLimitationType + ezpublish.api.role.limitation_type.owner.class: eZ\Publish\Core\Limitation\OwnerLimitationType + ezpublish.api.role.limitation_type.parent_content_type.class: eZ\Publish\Core\Limitation\ParentContentTypeLimitationType + ezpublish.api.role.limitation_type.parent_depth.class: eZ\Publish\Core\Limitation\ParentDepthLimitationType + ezpublish.api.role.limitation_type.parent_owner.class: eZ\Publish\Core\Limitation\ParentOwnerLimitationType + ezpublish.api.role.limitation_type.parent_group.class: eZ\Publish\Core\Limitation\ParentUserGroupLimitationType + ezpublish.api.role.limitation_type.section.class: eZ\Publish\Core\Limitation\SectionLimitationType + ezpublish.api.role.limitation_type.new_section.class: eZ\Publish\Core\Limitation\NewSectionLimitationType + ezpublish.api.role.limitation_type.siteaccess.class: eZ\Publish\Core\Limitation\SiteAccessLimitationType + ezpublish.api.role.limitation_type.state.class: eZ\Publish\Core\Limitation\ObjectStateLimitationType + ezpublish.api.role.limitation_type.subtree.class: eZ\Publish\Core\Limitation\SubtreeLimitationType + ezpublish.api.role.limitation_type.user_group.class: eZ\Publish\Core\Limitation\UserGroupLimitationType + +services: + ezpublish.api.role.limitation_type.content_type: + class: %ezpublish.api.role.limitation_type.content_type.class% + tags: + - {name: ezpublish.limitationType, alias: Class} + + ezpublish.api.role.limitation_type.language: + class: %ezpublish.api.role.limitation_type.language.class% + tags: + - {name: ezpublish.limitationType, alias: Language} + + ezpublish.api.role.limitation_type.location: + class: %ezpublish.api.role.limitation_type.location.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: Node} + + ezpublish.api.role.limitation_type.owner: + class: %ezpublish.api.role.limitation_type.owner.class% + tags: + - {name: ezpublish.limitationType, alias: Owner} + + ezpublish.api.role.limitation_type.parent_content_type: + class: %ezpublish.api.role.limitation_type.parent_content_type.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: ParentClass} + + ezpublish.api.role.limitation_type.parent_depth: + class: %ezpublish.api.role.limitation_type.parent_depth.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: ParentDepth} + + ezpublish.api.role.limitation_type.parent_owner: + class: %ezpublish.api.role.limitation_type.parent_owner.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: ParentOwner} + + ezpublish.api.role.limitation_type.parent_group: + class: %ezpublish.api.role.limitation_type.parent_group.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: ParentGroup} + + ezpublish.api.role.limitation_type.section: + class: %ezpublish.api.role.limitation_type.section.class% + tags: + - {name: ezpublish.limitationType, alias: Section} + + ezpublish.api.role.limitation_type.new_section: + class: %ezpublish.api.role.limitation_type.new_section.class% + tags: + - {name: ezpublish.limitationType, alias: NewSection} + + ezpublish.api.role.limitation_type.siteaccess: + class: %ezpublish.api.role.limitation_type.siteaccess.class% + tags: + - {name: ezpublish.limitationType, alias: SiteAccess} + + ezpublish.api.role.limitation_type.state: + class: %ezpublish.api.role.limitation_type.state.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: State} + + ezpublish.api.role.limitation_type.subtree: + class: %ezpublish.api.role.limitation_type.subtree.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: Subtree} + + ezpublish.api.role.limitation_type.user_group: + class: %ezpublish.api.role.limitation_type.user_group.class% + arguments: [@ezpublish.api.persistence_handler] + tags: + - {name: ezpublish.limitationType, alias: UserGroup} diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/routing.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/routing.yml new file mode 100644 index 0000000..3058cee --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/routing.yml @@ -0,0 +1,63 @@ +parameters: + # Redefining the default router class to implement the RequestMatcherInterface + router.class: eZ\Bundle\EzPublishCoreBundle\Routing\DefaultRouter + ezpublish.chain_router.class: Symfony\Cmf\Component\Routing\ChainRouter + ezpublish.url_generator.base.class: eZ\Publish\Core\MVC\Symfony\Routing\Generator + ezpublish.urlalias_router.class: eZ\Bundle\EzPublishCoreBundle\Routing\UrlAliasRouter + ezpublish.urlalias_generator.class: eZ\Publish\Core\MVC\Symfony\Routing\Generator\UrlAliasGenerator + ezpublish.siteaccess_router.class: eZ\Publish\Core\MVC\Symfony\SiteAccess\Router + ezpublish.siteaccess_listener.class: eZ\Bundle\EzPublishCoreBundle\EventListener\SiteAccessListener + ezpublish.request_redirect_listener.class: eZ\Bundle\EzPublishCoreBundle\EventListener\RequestEventListener + ezpublish.siteaccess_match_listener.class: eZ\Publish\Core\MVC\Symfony\EventListener\SiteAccessMatchListener + +services: + ezpublish.chain_router: + class: %ezpublish.chain_router.class% + arguments: [@?logger] + calls: + - [setContext, [@router.request_context]] + + ezpublish.siteaccess_match_listener: + class: %ezpublish.siteaccess_match_listener.class% + arguments: [@ezpublish.siteaccess_router, @event_dispatcher] + tags: + - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 200 } + + ezpublish.url_generator.base: + class: %ezpublish.url_generator.base.class% + abstract: true + calls: + - [setRequestContext, [@router.request_context]] + + ezpublish.urlalias_router: + class: %ezpublish.urlalias_router.class% + arguments: [@ezpublish.api.repository.lazy, @ezpublish.urlalias_generator, @?router.request_context, @?logger] + calls: + - [setContainer, [@service_container]] + tags: + - {name: router, priority: 200} + + ezpublish.urlalias_generator: + class: %ezpublish.urlalias_generator.class% + arguments: [@ezpublish.api.repository.lazy, @router] + parent: ezpublish.url_generator.base + + ezpublish.siteaccess_router: + class: %ezpublish.siteaccess_router.class% + arguments: + - %ezpublish.siteaccess.default% + - %ezpublish.siteaccess.match_config% + - %ezpublish.siteaccess.list% + - %ezpublish.siteaccess.class% + + ezpublish.siteaccess_listener: + class: %ezpublish.siteaccess_listener.class% + arguments: [@service_container] + tags: + - { name: kernel.event_subscriber } + + ezpublish.request_redirect_listener: + class: %ezpublish.request_redirect_listener.class% + arguments: [@service_container, @?logger] + tags: + - { name: kernel.event_subscriber } diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/routing/internal.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/routing/internal.yml new file mode 100644 index 0000000..da19aa2 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/routing/internal.yml @@ -0,0 +1,7 @@ +# Internal routes +_ezpublishLocation: + pattern: /content/location/{locationId}/{viewType}/{layout} + defaults: + _controller: ezpublish.controller.content.view:viewLocation + viewType: full + layout: true diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/security.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/security.yml new file mode 100644 index 0000000..c772068 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/security.yml @@ -0,0 +1,33 @@ +parameters: + ezpublish.security.authentication_provider.class: eZ\Publish\Core\MVC\Symfony\Security\Authentication\Provider + ezpublish.security.user_provider.class: eZ\Publish\Core\MVC\Symfony\Security\User\Provider + ezpublish.security.voter.core.class: eZ\Publish\Core\MVC\Symfony\Security\Authorization\Voter\CoreVoter + ezpublish.security.authentication_provider.basic.class: eZ\Publish\Core\MVC\Symfony\Security\Authentication\BasicAuthProvider + +services: + ezpublish.security.user_provider: + class: %ezpublish.security.user_provider.class% + arguments: [@ezpublish.api.repository.lazy] + + ezpublish.security.authentication_provider: + class: %ezpublish.security.authentication_provider.class% + abstract: true + parent: security.authentication.provider.pre_authenticated + calls: + - [setLazyRepository, [@ezpublish.api.repository.lazy]] + + ezpublish.security.authentication_provider.basic: + class: %ezpublish.security.authentication_provider.basic.class% + abstract: true + arguments: + - @ezpublish.api.repository.lazy + - @security.user_checker + - ~ # Provider-shared Key + - %security.authentication.hide_user_not_found% + + ezpublish.security.voter.core: + class: %ezpublish.security.voter.core.class% + arguments: [@ezpublish.api.repository.lazy] + public: false + tags: + - { name: security.voter } diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml new file mode 100644 index 0000000..a79bf45 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/services.yml @@ -0,0 +1,43 @@ +parameters: + ezpublish.siteaccess.class: eZ\Bundle\EzPublishCoreBundle\SiteAccess + ezpublish.siteaccess.default.name: default + ezpublish.config.resolver.dynamic.class: eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver + ezpublish.config.resolver.chain.class: eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver + ezpublish.config.default_scope: ezsettings + ezpublish.controller.base.class: eZ\Publish\Core\MVC\Symfony\Controller\Controller + ezpublish.controller.content.view.class: eZ\Publish\Core\MVC\Symfony\Controller\Content\ViewController + +services: + # Siteaccess is injected in the container at runtime + ezpublish.siteaccess: + class: %ezpublish.siteaccess.class% + arguments: [%ezpublish.siteaccess.default.name%] + + ezpublish.config.resolver.core: + class: %ezpublish.config.resolver.dynamic.class% + arguments: [@ezpublish.siteaccess, %ezpublish.siteaccess.groups_by_siteaccess%, @service_container, %ezpublish.config.default_scope%] + tags: + - { name: ezpublish.config.resolver, priority: 200 } + + ezpublish.config.resolver.chain: + class: %ezpublish.config.resolver.chain.class% + + ezpublish.config.resolver: + alias: ezpublish.config.resolver.chain + + ezpublish.controller.base: + class: %ezpublish.controller.base.class% + abstract: true + calls: + - [ setContainer, [@service_container] ] + + ezpublish.controller.content.view: + class: %ezpublish.controller.content.view.class% + arguments: [@ezpublish.view_manager] + parent: ezpublish.controller.base + scope: request + + # This alias allows easier management for subrequests + # {% render "ez_content:viewLocation" with {"locationId": 123, "viewMode": "line"} %} + ez_content: + alias: ezpublish.controller.content.view diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/session.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/session.yml new file mode 100644 index 0000000..82c5f3b --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/session.yml @@ -0,0 +1,21 @@ +parameters: + ezpublish.session_set_dynamic_name_listener.class: eZ\Bundle\EzPublishCoreBundle\EventListener\SessionSetDynamicNameListener + ezpublish.session_init_by_post_listener.class: eZ\Bundle\EzPublishCoreBundle\EventListener\SessionInitByPostListener + ezpublish.session.attribute_bag.storage_key: "_ezpublish" + +services: + ezpublish.session_set_dynamic_name_listener: + class: %ezpublish.session_set_dynamic_name_listener.class% + arguments: [@service_container] + tags: + - { name: kernel.event_subscriber } + + ezpublish.session_init_by_post_listener: + class: %ezpublish.session_init_by_post_listener.class% + arguments: [@service_container] + tags: + - { name: kernel.event_subscriber } + + session.attribute_bag: + class: %session.attribute_bag.class% + arguments: [%ezpublish.session.attribute_bag.storage_key%] diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/storage_engines.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/storage_engines.yml new file mode 100644 index 0000000..93bde56 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/storage_engines.yml @@ -0,0 +1,398 @@ +parameters: + ezpublish.api.storage_engine.in_memory.class: eZ\Publish\Core\Persistence\InMemory\Handler + ezpublish.api.storage_engine.legacy.class: eZ\Publish\Core\Persistence\Legacy\Handler + ezpublish.api.storage_engine.legacy.dbhandler.class: eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + ezpublish.api.storage_engine.legacy.factory.class: eZ\Bundle\EzPublishCoreBundle\ApiLoader\LegacyStorageEngineFactory + ezpublish.api.storage_engine.legacy.dbhandler.factory.class: eZ\Bundle\EzPublishCoreBundle\ApiLoader\LegacyDbHandlerFactory + #ezpublish.api.storage_engine.legacy.dsn: ://:@/ + ezpublish.api.storage_engine.legacy.defer_type_update: false + + # Legacy storage engine configuration + # Transformation parser/compiler for search purpose + + ezpublish.api.storage_engine.legacy.pcre_compiler.class: eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\PcreCompiler + ezpublish.api.storage_engine.legacy.transformation_converter.class: eZ\Publish\Core\Persistence\Legacy\Content\Search\Utf8Converter + + # Using definition files: + # + # ezpublish.api.storage_engine.legacy.transformation_processor.class: eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\DefinitionBased + ezpublish.api.storage_engine.legacy.transformation_parser.class: eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\DefinitionBased\Parser + # # Transormation rules resources. + # # @todo: Should they be somewhat configurable for the developer? + ezpublish.api.storage_engine.legacy.transformation_rules.resources: + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr + + # Using preprocessed files: + # + ezpublish.api.storage_engine.legacy.transformation_processor.class: eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\PreprocessedBased + ezpublish.api.storage_engine.legacy.preprocessed_transformation_rules.resources: + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr.result + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr.result + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr.result + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr.result + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr.result + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr.result + - ../vendor/ezsystems/ezpublish/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr.result + + # Value converters + ezpublish.fieldType.ezauthor.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Author + ezpublish.fieldType.ezbinaryfile.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\BinaryFile + ezpublish.fieldType.ezbinaryfile.storage_gateway.class: eZ\Publish\Core\FieldType\BinaryFile\BinaryFileStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezboolean.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Checkbox + ezpublish.fieldType.ezcountry.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country + ezpublish.fieldType.ezdatetime.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime + ezpublish.fieldType.ezemail.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\EmailAddress + ezpublish.fieldType.ezfloat.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Float + ezpublish.fieldType.ezgmaplocation.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\MapLocation + ezpublish.fieldType.externalStorageHandler.ezgmaplocation.gateway.class: eZ\Publish\Core\FieldType\MapLocation\MapLocationStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezinteger.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer + ezpublish.fieldType.ezimage.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Image + ezpublish.fieldType.ezimage.storage_gateway.class: eZ\Publish\Core\FieldType\Image\ImageStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezkeyword.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Keyword + ezpublish.fieldType.ezkeyword.storage_gateway.class: eZ\Publish\Core\FieldType\Keyword\KeywordStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezmedia.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Media + ezpublish.fieldType.ezmedia.storage_gateway.class: eZ\Publish\Core\FieldType\Media\MediaStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezobjectrelation.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Relation + ezpublish.fieldType.externalStorageHandler.ezobjectrelation.gateway.class: eZ\Publish\Core\FieldType\Relation\RelationStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezobjectrelationlist.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\RelationList + ezpublish.fieldType.externalStorageHandler.ezobjectrelationlist.gateway.class: eZ\Publish\Core\FieldType\RelationList\RelationListStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezselection.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection + ezpublish.fieldType.ezstring.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine + ezpublish.fieldType.eztext.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlock + ezpublish.fieldType.ezxmltext.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\XmlText + ezpublish.fieldType.ezxmltext.storage_gateway.class: eZ\Publish\Core\FieldType\XmlText\XmlTextStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezsrrating.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating + ezpublish.fieldType.ezurl.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Url + ezpublish.fieldType.ezurl.storage_gateway.class: eZ\Publish\Core\FieldType\Url\UrlStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezuser.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Null + ezpublish.fieldType.ezuser.storage_gateway.class: eZ\Publish\Core\FieldType\User\UserStorage\Gateway\LegacyStorage + ezpublish.fieldType.ezpage.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Page + + ezpublish.fieldType.eznull.converter.class: eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Null + +services: + ezpublish.api.storage_engine.in_memory: + class: %ezpublish.api.storage_engine.in_memory.class% + tags: + - {name: ezpublish.storageEngine, alias: inMemory} + + # Legacy storage engine + ezpublish.api.storage_engine.legacy.factory: + class: %ezpublish.api.storage_engine.legacy.factory.class% + arguments: [@service_container] + + ezpublish.api.storage_engine.legacy.dbhandler.factory: + class: %ezpublish.api.storage_engine.legacy.dbhandler.factory.class% + arguments: [@ezpublish.config.resolver] + + ezpublish.api.storage_engine.legacy.dbhandler: + class: %ezpublish.api.storage_engine.legacy.dbhandler.class% + factory_service: ezpublish.api.storage_engine.legacy.dbhandler.factory + factory_method: buildLegacyDbHandler + + ezpublish.api.storage_engine.legacy: + class: %ezpublish.api.storage_engine.legacy.class% + factory_service: ezpublish.api.storage_engine.legacy.factory + factory_method: buildLegacyEngine + arguments: + - @ezpublish.api.storage_engine.legacy.dbhandler + - %ezpublish.api.storage_engine.legacy.defer_type_update% + tags: + - {name: ezpublish.storageEngine, alias: legacy} + + ezpublish.api.storage_engine.legacy.transformation_parser: + class: %ezpublish.api.storage_engine.legacy.transformation_parser.class% + arguments: [%kernel.root_dir%] + + ezpublish.api.storage_engine.legacy.pcre_compiler: + class: %ezpublish.api.storage_engine.legacy.pcre_compiler.class% + arguments: [@ezpublish.api.storage_engine.legacy.transformation_converter] + + ezpublish.api.storage_engine.legacy.transformation_converter: + class: %ezpublish.api.storage_engine.legacy.transformation_converter.class% + + ezpublish.api.storage_engine.legacy.transformation_processor: + class: %ezpublish.api.storage_engine.legacy.transformation_processor.class% + arguments: + # Using definition files: + # + # - @ezpublish.api.storage_engine.legacy.transformation_parser + # - @ezpublish.api.storage_engine.legacy.pcre_compiler + # - %ezpublish.api.storage_engine.legacy.transformation_rules.resources% + + # Using preprocessed files: + - @ezpublish.api.storage_engine.legacy.pcre_compiler + - %kernel.root_dir% + - %ezpublish.api.storage_engine.legacy.preprocessed_transformation_rules.resources% + + # Field type converters for legacy + ezpublish.fieldType.ezauthor.converter: + class: %ezpublish.fieldType.ezauthor.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezauthor, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezbinaryfile.converter: + class: %ezpublish.fieldType.ezbinaryfile.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezbinaryfile, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezbinaryfile.storage_gateway: + class: %ezpublish.fieldType.ezbinaryfile.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezbinaryfile, identifier: LegacyStorage} + + ezpublish.fieldType.ezboolean.converter: + class: %ezpublish.fieldType.ezboolean.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezboolean, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezcountry.converter: + class: %ezpublish.fieldType.ezcountry.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezcountry, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezdatetime.converter: + class: %ezpublish.fieldType.ezdatetime.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezdatetime, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezfloat.converter: + class: %ezpublish.fieldType.ezfloat.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezfloat, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezinteger.converter: + class: %ezpublish.fieldType.ezinteger.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezinteger, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezkeyword.converter: + class: %ezpublish.fieldType.ezkeyword.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezkeyword, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezkeyword.storage_gateway: + class: %ezpublish.fieldType.ezkeyword.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezkeyword, identifier: LegacyStorage} + + ezpublish.fieldType.ezmedia.converter: + class: %ezpublish.fieldType.ezmedia.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezmedia, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezmedia.storage_gateway: + class: %ezpublish.fieldType.ezmedia.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezmedia, identifier: LegacyStorage} + + ezpublish.fieldType.ezselection.converter: + class: %ezpublish.fieldType.ezselection.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezselection, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezstring.converter: + class: %ezpublish.fieldType.ezstring.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezstring, lazy: true, callback: '::create'} + + ezpublish.fieldType.eztext.converter: + class: %ezpublish.fieldType.eztext.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: eztext, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezxmltext.converter: + class: %ezpublish.fieldType.ezxmltext.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezxmltext, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezxmltext.storage_gateway: + class: %ezpublish.fieldType.ezxmltext.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezxmltext, identifier: LegacyStorage} + + ezpublish.fieldType.ezsrrating.converter: + class: %ezpublish.fieldType.ezsrrating.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezsrrating, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezurl.converter: + class: %ezpublish.fieldType.ezurl.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezurl, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezurl.storage_gateway: + class: %ezpublish.fieldType.ezurl.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezurl, identifier: LegacyStorage} + + ezpublish.fieldType.ezpage.converter: + class: %ezpublish.fieldType.ezpage.converter.class% + arguments: [@ezpublish.fieldType.ezpage.pageService] + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezpage} + + ezpublish.fieldType.ezimage.converter: + class: %ezpublish.fieldType.ezimage.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezimage, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezimage.storage_gateway: + class: %ezpublish.fieldType.ezimage.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezimage, identifier: LegacyStorage} + + ezpublish.fieldType.ezgmaplocation.converter: + class: %ezpublish.fieldType.ezgmaplocation.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezgmaplocation, lazy: true, callback: '::create'} + + ezpublish.fieldType.externalStorageHandler.ezgmaplocation.gateway: + class: %ezpublish.fieldType.externalStorageHandler.ezgmaplocation.gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezgmaplocation, identifier: LegacyStorage} + + ezpublish.fieldType.ezemail.converter: + class: %ezpublish.fieldType.ezemail.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezemail, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezobjectrelation.converter: + class: %ezpublish.fieldType.ezobjectrelation.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezobjectrelation, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezobjectrelationlist.converter: + class: %ezpublish.fieldType.ezobjectrelationlist.converter.class% + arguments: [@ezpublish.api.storage_engine.legacy.dbhandler] + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezobjectrelationlist} + + ezpublish.fieldType.externalStorageHandler.ezobjectrelation.gateway: + class: %ezpublish.fieldType.externalStorageHandler.ezobjectrelation.gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezobjectrelation, identifier: LegacyStorage} + + ezpublish.fieldType.externalStorageHandler.ezobjectrelationlist.gateway: + class: %ezpublish.fieldType.externalStorageHandler.ezobjectrelationlist.gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezobjectrelationlist, identifier: LegacyStorage} + + ezpublish.fieldType.ezuser.converter: + class: %ezpublish.fieldType.ezuser.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezuser, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezuser.storage_gateway: + class: %ezpublish.fieldType.ezuser.storage_gateway.class% + tags: + - {name: ezpublish.fieldType.externalStorageHandler.gateway, alias: ezuser, identifier: LegacyStorage} + + # Not implemented converters + # Configured to use the Null converter which does not nothing + ezpublish.fieldType.ezdate.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezdate, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezenum.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezenum, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezidentifier.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezidentifier, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezinisetting.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezinisetting, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezisbn.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezisbn, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezmatrix.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezmatrix, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezmultioption.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezmultioption, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezmultioption2.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezmultioption2, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezmultiprice.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezmultiprice, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezoption.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezoption, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezpackage.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezpackage, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezprice.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezprice, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezproductcategory.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezproductcategory, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezrangeoption.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezrangeoption, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezsubtreesubscription.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezsubtreesubscription, lazy: true, callback: '::create'} + + ezpublish.fieldType.eztime.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: eztime, lazy: true, callback: '::create'} + + # not implemented converters from extensions + ezpublish.fieldType.ezcomcomments.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezcomcomments, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezpaex.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezpaex, lazy: true, callback: '::create'} + + ezpublish.fieldType.ezsurvey.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: ezsurvey, lazy: true, callback: '::create'} + + ezpublish.fieldType.eztags.converter: + class: %ezpublish.fieldType.eznull.converter.class% + tags: + - {name: ezpublish.storageEngine.legacy.converter, alias: eztags, lazy: true, callback: '::create'} diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/config/templating.yml b/eZ/Bundle/EzPublishCoreBundle/Resources/config/templating.yml new file mode 100644 index 0000000..784d534 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/config/templating.yml @@ -0,0 +1,54 @@ +parameters: + twig.loader.chain.class: Twig_Loader_Chain + twig.loader.string.class: Twig_Loader_String + + ezpublish.twig.extension.content.class: eZ\Publish\Core\MVC\Symfony\Templating\Twig\Extension\ContentExtension + + ezpublish.view_manager.class: eZ\Publish\Core\MVC\Symfony\View\Manager + ezpublish.content_view_provider.configured.class: eZ\Bundle\EzPublishCoreBundle\View\Provider\Content\Configured + ezpublish.location_view_provider.configured.class: eZ\Bundle\EzPublishCoreBundle\View\Provider\Location\Configured + ezpublish.content_view.viewbase_layout: "EzPublishCoreBundle::viewbase_layout.html.twig" + ezpublish.content_view.content_block_name: "content" + +services: + # Redefining twig loader to use the chain loader instead of only the file system loader. + # This allows to add additional loading logic + # Loaders can be registered by identifying with twig.loader tag. + twig.loader.chain: + class: %twig.loader.chain.class% + + twig.loader: + alias: twig.loader.chain + + twig.loader.filesystem: + class: %twig.loader.class% + arguments: [@templating.locator, @templating.name_parser] + tags: + - {name: twig.loader} + + twig.loader.string: + class: %twig.loader.string.class% + tags: + - {name: twig.loader} + + ezpublish.twig.extension.content: + class: %ezpublish.twig.extension.content.class% + arguments: [@service_container, @ezpublish.config.resolver] + tags: + - {name: twig.extension} + + ezpublish.view_manager: + class: %ezpublish.view_manager.class% + arguments: [@templating, @event_dispatcher, @ezpublish.api.repository, %ezpublish.content_view.viewbase_layout%, @?logger] + + ezpublish.content_view_provider.configured: + class: %ezpublish.content_view_provider.configured.class% + arguments: [@ezpublish.config.resolver, @ezpublish.api.repository, @service_container] + tags: + - {name: ezpublish.content_view_provider, priority: 10} + + ezpublish.location_view_provider.configured: + class: %ezpublish.location_view_provider.configured.class% + arguments: [@ezpublish.config.resolver, @ezpublish.api.repository, @service_container] + tags: + - {name: ezpublish.location_view_provider, priority: 10} diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/views/content_fields.html.twig b/eZ/Bundle/EzPublishCoreBundle/Resources/views/content_fields.html.twig new file mode 100644 index 0000000..d0479be --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/views/content_fields.html.twig @@ -0,0 +1,403 @@ +{# Template blocks to be used by content fields #} +{# Block naming convention is _field #} +{# Following variables are passed: + # - \eZ\Publish\API\Repository\Values\Content\Field field the field to display + # - \eZ\Publish\API\Repository\Values\Content\ContentInfo contentInfo the contentInfo to which the field belongs to + # - \eZ\Publish\API\Repository\Values\Content\VersionInfo versionInfo the versionInfo to which the field belongs to + # - mixed fieldSettings settings of the field (depends on the fieldtype) + # - array parameters options passed to ez_render_field under the parameters key + # - array attr the attributes to add the generate HTML, contains at least a "class" entry + # containing -field + #} + +{% block ezstring_field %} +{% spaceless %} + {% set field_value = field.value.text %} + {{ block( 'simple_inline_field' ) }} +{% endspaceless %} +{% endblock %} + +{% block eztext_field %} +{% spaceless %} + {% set field_value = field.value|nl2br %} + {{ block( 'simple_block_field' ) }} +{% endspaceless %} +{% endblock %} + +{% block ezxmltext_field %} +{% spaceless %} + {% set field_value = field.value.xml|xmltext_to_html5 %} + {{ block( 'simple_block_field' ) }} +{% endspaceless %} +{% endblock %} + +{% block ezauthor_field %} +{% spaceless %} + {% if field.value.authors|length() > 0 %} + + {% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezcountry_field %} +{% spaceless %} + {% if fieldSettings.isMultiple and field.value.countries|length > 0 %} +
    + {% for country in field.value.countries %} +
  • {{ country['Name'] }}
  • + {% endfor %} +
+ {% elseif field.value.countries|length() == 1 %} +

+ {% for country in field.value.countries %} + {{ country['Name'] }} + {% endfor %} +

+ {% endif %} +{% endspaceless %} +{% endblock %} + +{# @todo: add translate filter #} +{% block ezboolean_field %} +{% spaceless %} + {% set field_value = field.value.bool ? 'Yes' : 'No' %} + {{ block( 'simple_inline_field' ) }} +{% endspaceless %} +{% endblock %} + +{# @todo: + # - handle default format + # - handle eztime + # - handle ezdate + #} +{% block ezdatetime_field %} +{% spaceless %} + {% set field_value = field.value.value|date() %} + {{ block( 'simple_block_field' ) }} +{% endspaceless %} +{% endblock %} + +{% block ezemail_field %} +{% spaceless %} + {% if field.value.email %} + {% set field_value = field.value.email %} + {{ field.value.email }} + {% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezinteger_field %} +{% spaceless %} + {% if field.value %} + {% set field_value = field.value.value %} + {{ block( 'simple_inline_field' ) }} + {% endif %} +{% endspaceless %} +{% endblock %} + +{# @todo: handle localization #} +{% block ezfloat_field %} +{% spaceless %} + {% if field.value %} + {% set field_value = field.value.value %} + {{ block( 'simple_inline_field' ) }} + {% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezurl_field %} +{% spaceless %} + {% if field.value %} + {{ field.value.text ? field.value.text : field.value.link }} + {% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezkeyword_field %} +{% spaceless %} + {% if field.value.values|length() > 0 %} +
    + {% for keyword in field.value.values %} +
  • {{ keyword }}
  • + {% endfor %} +
+ {% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezselection_field %} +{% spaceless %} + {% if fieldSettings.isMultiple and field.value.selection|length() > 0 %} +
    + {% for selectedIndex in field.value.selection %} +
  • {{ fieldSettings.options[selectedIndex] }}
  • + {% endfor %} +
+ {% elseif not fieldSettings.isMultiple %} + {% set field_value = fieldSettings.options[field.value.selection.0] %} + {{ block( 'simple_block_field' ) }} + {% endif %} +{% endspaceless %} +{% endblock %} + +{# @todo: + # - add translate filter + # - legacy used to dump is_locked attribute + #} +{% block ezuser_field %} +{% spaceless %} +
+
User ID
+
{{ field.value.contentId }}
+
Username
+
{{ field.value.login }}
+
Email
+
{{ field.value.email }}
+
Account status
+
{{ field.value.enabled ? 'enabled' : 'disabled' }}
+
+{% endspaceless %} +{% endblock %} + +{# @todo: handle the unit of the fileSize (si operator in legacy template engine) #} +{% block ezbinaryfile_field %} +{% spaceless %} + {% if field.value %} + {% set uri = 'content/download/' ~ contentInfo.id ~ '/' ~ field.id + ~ '/version/' ~ contentInfo.currentVersionNo ~ "/file/" + ~ field.value.fileName|escape( 'url' ) %} + {{ field.value.fileName }} ({{ field.value.fileSize }}) + {% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezmedia_field %} +{% if field.value %} +{% spaceless %} + {% set type = fieldSettings.mediaType %} + {% set value = field.value %} + {% set uri = 'content/download/' ~ contentInfo.id ~ '/' ~ field.id + ~ '/' ~ value.fileName|escape( 'url' ) %} + {% set download = path( 'ez_legacy', {'module_uri': uri } ) %} + {% set width = value.width > 0 ? 'width="' ~ value.width ~ '"' : "" %} + {% set height = value.height > 0 ? 'height="' ~ value.height ~ '"' : "" %} +
+ {% autoescape false %} + {% if type == "html5_video" + or type == "quick_time" + or type == "windows_media_player" + or type == "real_player" %} + + {% elseif type == "html5_audio" %} + + {% elseif type == 'flash' %} + + + + + + + {% elseif type == 'silverlight' %} + + + + + + + Get Microsoft Silverlight + + + + {% endif %} + {% endautoescape %} +
+{% endspaceless %} +{% endif %} +{% endblock %} + +{% block ezobjectrelationlist_field %} +{% spaceless %} + {% if field.value.destinationContentIds|length > 0 %} +
    + {% for contentId in field.value.destinationContentIds %} +
  • + {% render "ez_content:viewContent" with {'contentId': contentId, 'viewType': 'embed', 'noLayout': 1} %} +
  • + {% endfor %} +
+ {% endif %} +{% endspaceless %} +{% endblock %} + +{# @todo: + # - include Gmaps JS only once if the field is used several times in the page + # - add translate filter + #} +{% block ezgmaplocation_field %} +{## + # This field type block accepts the following parameters: + # - string mapType the Google map type (ROADMAP, SATELLITE, HYBRID or TERRAIN), default is ROADMAP + # - boolean showMap whether to show the Google map or not, default is true + # - integer zoom the default zoom level, default is 13 + # - string|false width the width of the rendered map with its unit (ie "500px" or "50em"), + # set to false to not set any width style inline, default is 500px + # - string|boolean height the height of the rendered map with its unit (ie "200px" or "20em"), + # set to false to not set any height style inline, default is 200px + #} +{% spaceless %} +
+ {% set defaultWidth = '500px' %} + {% set defaultHeight = '200px' %} + {% set defautShowMap = true %} + {% set defaultZoom = 13 %} + {% set defaultMapType = 'ROADMAP' %} + + {% set hasContent = field.value is not null %} + {% set latitude = field.value.latitude|default( 0 ) %} + {% set longitude = field.value.longitude|default( 0 ) %} + {% set address = field.value.address|default( "" ) %} + {% set mapId = "maplocation-map-" ~ field.id %} + + {% set zoom = parameters.zoom|default( defaultZoom ) %} + {% set mapType = parameters.mapType|default( defaultMapType ) %} + {% if parameters.width is sameas(false) %} + {% set mapWidth = false %} + {% else %} + {% set mapWidth = parameters.width|default( defaultWidth ) %} + {% endif %} + {% if parameters.height is sameas(false) %} + {% set mapHeight = false %} + {% else %} + {% set mapHeight = parameters.width|default( defaultHeight ) %} + {% endif %} + + {% set showMap = defautShowMap %} + {% if parameters and parameters.showMap is sameas(false) %} + {% set showMap = false %} + {% endif %} + +
+
Latitude
+
{{ hasContent ? latitude : "Not set" }}
+
Longitude
+
{{ longitude ? longitude : "Not set" }}
+ {% if address %} +
Address
+
{{ address }}
+ {% endif %} +
+ + {% if hasContent and showMap %} + + + {% set mapStyle = mapWidth ? "width:" ~ mapWidth ~ ";": "" %} + {% set mapStyle = mapHeight ? mapStyle ~ " height:" ~ mapHeight : mapStyle %} +
+ {% endif %} +
+{% endspaceless %} +{% endblock %} + +{# This field accepts the following parameters: + # - alias (image variation name). Defaults to "original" (e.g. image originally uploaded) + #} +{% block ezimage_field %} +{% spaceless %} +{% if field.value %} +
+ {% set imageAlias = ez_image_alias( field, versionInfo, parameters.alias|default( 'original' ) ) %} + {{ field.value.alternativeText }} +
+{% endif %} +{% endspaceless %} +{% endblock %} + +{% block ezobjectrelation_field %} +{% spaceless %} +{% if field.value.destinationContentId %} +
+ {% render "ez_content:viewContent" with {'contentId': field.value.destinationContentId, 'viewType': 'text_linked', 'noLayout': 1} %} +
+{% endif %} +{% endspaceless %} +{% endblock %} + + +{# The simple_block_field block is a shorthand html block-based fields (like eztext or ezxmltext) #} +{# You can define a field_value variable before rendering this one if you need special operation for rendering content (i.e. nl2br) #} +{% block simple_block_field %} +{% spaceless %} + {% set field_value = field_value|default( field.value ) %} +
+ {{ field_value|raw }} +
+{% endspaceless %} +{% endblock %} + +{% block simple_inline_field %} +{% spaceless %} + {% set field_value = field_value|default( field.value ) %} + {{ field_value }} +{% endspaceless %} +{% endblock %} + +{# Block for field attributes rendering. Useful to add a custom class, id or whatever HTML attribute to the field markup #} +{% block field_attributes %} +{% spaceless %} + {% set attr = attr|default( {} ) %} + {% for attrname, attrvalue in attr %}{{ attrname }}="{{ attrvalue }}" {% endfor %} +{% endspaceless %} +{% endblock %} diff --git a/eZ/Bundle/EzPublishCoreBundle/Resources/views/viewbase_layout.html.twig b/eZ/Bundle/EzPublishCoreBundle/Resources/views/viewbase_layout.html.twig new file mode 100644 index 0000000..ddaf17d --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Resources/views/viewbase_layout.html.twig @@ -0,0 +1,4 @@ +{# this is the layout used when we want to render a block with any decoration + # ie with using the complete pagelayout. + #} +{% block content %}{% endblock %} diff --git a/eZ/Bundle/EzPublishCoreBundle/Routing/DefaultRouter.php b/eZ/Bundle/EzPublishCoreBundle/Routing/DefaultRouter.php new file mode 100644 index 0000000..e2de9d9 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Routing/DefaultRouter.php @@ -0,0 +1,38 @@ +attributes->has( 'semanticPathinfo' ) ) + { + return $this->match( $request->attributes->get( 'semanticPathinfo' ) ); + } + + return $this->match( $request->getPathInfo() ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Routing/UrlAliasRouter.php b/eZ/Bundle/EzPublishCoreBundle/Routing/UrlAliasRouter.php new file mode 100644 index 0000000..53089d3 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Routing/UrlAliasRouter.php @@ -0,0 +1,46 @@ +container = $container; + } + + /** + * @return \eZ\Publish\Core\MVC\ConfigResolverInterface + */ + protected function getConfigResolver() + { + return $this->container->get( 'ezpublish.config.resolver' ); + } + + public function matchRequest( Request $request ) + { + // UrlAliasRouter might be disabled from configuration. + // An example is for running the admin interface: it needs to be entirely run through the legacy kernel. + if ( $this->getConfigResolver()->getParameter( 'url_alias_router' ) === false ) + throw new ResourceNotFoundException( "Config says to bypass UrlAliasRouter" ); + + return parent::matchRequest( $request ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/SiteAccess.php b/eZ/Bundle/EzPublishCoreBundle/SiteAccess.php new file mode 100644 index 0000000..0a9a6cc --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/SiteAccess.php @@ -0,0 +1,27 @@ +attributes = new ParameterBag(); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Tests/ArraySettingsMergeTest.php b/eZ/Bundle/EzPublishCoreBundle/Tests/ArraySettingsMergeTest.php new file mode 100644 index 0000000..e690860 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Tests/ArraySettingsMergeTest.php @@ -0,0 +1,1023 @@ +containerMock = $this->getMock( + 'Symfony\\Component\\DependencyInjection\\ContainerBuilder' + ); + $this->parserMock = $this->getMock( + 'eZ\\Bundle\\EzPublishCoreBundle\\DependencyInjection\\Configuration\\AbstractParser', + array( + // leave setBaseKey alone! + 'registerInternalConfigArray', + 'getContainerParameter', + 'groupsArraySetting', + 'addSemanticConfig', + 'registerInternalConfig' + ) + ); + } + + /** + * Test that settings array a properly merged when defined in several + * scopes. + * + * @dataProvider parameterProvider + */ + public function testArrayMerge( + $testId, $siteaccess, array $groups, array $defaultValue, + array $globalValue, array $config, $options, array $expected, + $customBaseKey = null + ) + { + $hasParameterMap = array( + array( + 'ezsettings.' . ConfigResolver::SCOPE_DEFAULT . '.' . $testId, + true + ), + array( + 'ezsettings.' . ConfigResolver::SCOPE_GLOBAL . '.' . $testId, + true + ), + array( + 'ezpublish.siteaccess.groups_by_siteaccess', + true + ) + ); + + $getParameterMap = array( + array( + 'ezsettings.' . ConfigResolver::SCOPE_DEFAULT . '.' . $testId, + $defaultValue + ), + array( + 'ezsettings.' . ConfigResolver::SCOPE_GLOBAL . '.' . $testId, + $globalValue + ), + array( + 'ezpublish.siteaccess.groups_by_siteaccess', + array( $siteaccess => $groups ) + ) + ); + + $this->containerMock + ->expects( $this->any() ) + ->method( 'hasParameter' ) + ->will( $this->returnValueMap( $hasParameterMap ) ); + + $this->containerMock + ->expects( $this->any() ) + ->method( 'getParameter' ) + ->will( $this->returnValueMap( $getParameterMap ) ); + + $this->containerMock + ->expects( $this->any() ) + ->method( 'setParameter' ) + ->with( + $this->equalTo( "ezsettings.$siteaccess.$testId" ), + $this->equalTo( $expected ) + ); + + if ( $customBaseKey !== null ) + { + $this->parserMock->setBaseKey( $customBaseKey ); + } + $method = new \ReflectionMethod( + $this->parserMock, + 'registerInternalConfigArray' + ); + $method->setAccessible( true ); + $method->invoke( $this->parserMock, $testId, $config, $this->containerMock, $options ); + } + + public function parameterProvider() + { + $testId = 'wizards'; + $siteaccess = 'krondor'; + $group1 = 'midkemia'; + $group2 = 'triagia'; + $all = array( 'Kulgan', 'Macros the Black', 'Pug', 'Rogen', 'William' ); + $siteaccessConfig = array( + 'list' => array( $siteaccess ), + 'groups' => array( + $group1 => array( $siteaccess ), + $group2 => array( $siteaccess ), + ) + ); + $testIdHash = 'location_view'; + $locationView1 = array( + 'full' => array( + 'Wizard' => array( + 'template' => 'wizard.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer.html.twig' + ) + ) + ); + + $locationView2 = array( + 'full' => array( + 'Dwarve' => array( + 'template' => 'dwarve.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer2.html.twig' + ) + ) + ); + + $locationView3 = array( + 'full' => array( + 'Moredhel' => array( + 'template' => 'moredhel.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer3.html.twig' + ), + ) + ); + $locationView4 = array( + 'full' => array( + 'Moredhel' => array( + 'template' => 'moredhel2.html.twig' + ), + 'Warrior' => array( + 'template' => 'warrior.html.twig' + ), + ) + ); + + $locationView12 = array( + 'full' => array( + 'Wizard' => array( + 'template' => 'wizard.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer2.html.twig' + ), + 'Dwarve' => array( + 'template' => 'dwarve.html.twig' + ), + ) + ); + + $locationView123 = array( + 'full' => array( + 'Wizard' => array( + 'template' => 'wizard.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer3.html.twig' + ), + 'Dwarve' => array( + 'template' => 'dwarve.html.twig' + ), + 'Moredhel' => array( + 'template' => 'moredhel.html.twig' + ) + ) + ); + + $locationView1234 = array( + 'full' => array( + 'Wizard' => array( + 'template' => 'wizard.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer3.html.twig' + ), + 'Dwarve' => array( + 'template' => 'dwarve.html.twig' + ), + 'Moredhel' => array( + 'template' => 'moredhel2.html.twig' + ), + 'Warrior' => array( + 'template' => 'warrior.html.twig' + ), + ) + ); + + $locationView21 = array( + 'full' => array( + 'Dwarve' => array( + 'template' => 'dwarve.html.twig' + ), + 'Sorcerer' => array( + 'template' => 'sorcerer.html.twig' + ), + 'Wizard' => array( + 'template' => 'wizard.html.twig' + ), + ) + ); + + $cases = array( + // + // MERGING TESTS ON NORMAL ARRAY + // + array( + // everything in default scope + $testId, + $siteaccess, + array( $group1, $group2 ), + $all, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array() + ), + 0, + $all, + ), + array( + // everything in global scope + $testId, + $siteaccess, + array( $group1, $group2 ), + array(), + $all, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array() + ), + 0, + $all, + ), + array( + // everything in a group + $testId, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group2 => array( $testId => $all ) + ) + ), + 0, + $all, + ), + array( + // everything in a siteaccess + $testId, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $siteaccess => array( $testId => $all ) + ) + ), + 0, + $all, + ), + array( + // default scope + one group + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan', 'Macros the Black' ), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Pug', 'Rogen', 'William' ) ), + ) + ), + 0, + $all, + ), + array( + // one group + global scope + $testId, + $siteaccess, + array( $group1, $group2 ), + array(), + array( 'Pug', 'Rogen', 'William' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Kulgan', 'Macros the Black' ) ), + ) + ), + 0, + $all, + ), + array( + // default scope + two groups + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan', 'Macros the Black' ), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Pug', 'Rogen' ) ), + $group2 => array( $testId => array( 'William' ) ), + ) + ), + 0, + $all, + ), + array( + // two groups + global scope + $testId, + $siteaccess, + array( $group1, $group2 ), + array(), + array( 'Kulgan', 'Macros the Black' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Pug', 'Rogen' ) ), + $group2 => array( $testId => array( 'William' ) ), + ) + ), + 0, + array( 'Pug', 'Rogen', 'William', 'Kulgan', 'Macros the Black' ), + ), + array( + // default scope + two groups + siteaccess + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan', 'Macros the Black' ), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Pug' ) ), + $group2 => array( $testId => array( 'Rogen' ) ), + $siteaccess => array( $testId => array( 'William' ) ), + ) + ), + 0, + $all, + ), + array( + // global scope + two groups + siteaccess + $testId, + $siteaccess, + array( $group1, $group2 ), + array(), + array( 'Kulgan', 'Macros the Black' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Pug' ) ), + $group2 => array( $testId => array( 'Rogen' ) ), + $siteaccess => array( $testId => array( 'William' ) ), + ) + ), + 0, + array( 'Pug', 'Rogen', 'William', 'Kulgan', 'Macros the Black' ), + ), + array( + // default scope + two groups + global + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan', 'Macros the Black' ), + array( 'William' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Pug' ) ), + $group2 => array( $testId => array( 'Rogen' ) ), + ) + ), + 0, + $all, + ), + array( + // default scope + two groups + siteaccess + global + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan' ), + array( 'William' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Macros the Black' ) ), + $group2 => array( $testId => array( 'Pug' ) ), + $siteaccess => array( $testId => array( 'Rogen' ) ), + ) + ), + 0, + $all, + ), + // + // UNIQUE OPTION TESTS (only suitable for normal array) + // + array( + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan', 'Kulgan' ), + array( 'William' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Macros the Black' ) ), + $group2 => array( $testId => array( 'Pug' ) ), + $siteaccess => array( $testId => array( 'Rogen', 'Pug' ) ), + ) + ), + AbstractParser::UNIQUE, + array( 'Kulgan', 'Macros the Black', 'Pug', 'Rogen', 'William' ) + ), + array( + $testId, + $siteaccess, + array( $group1, $group2 ), + array( 'Kulgan', 'Kulgan' ), + array( 'William', 'Kulgan', 'Pug' ), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testId => array( 'Macros the Black' ) ), + $group2 => array( $testId => array( 'Pug', 'William', 'Kulgan' ) ), + $siteaccess => array( $testId => array( 'Rogen', 'Pug', 'Rogen', 'Macros the Black' ) ), + ) + ), + AbstractParser::UNIQUE, + array( 'Kulgan', 'Macros the Black', 'Pug', 'William', 'Rogen' ) + ), + // + // MERGING HASH TESTS with MERGE_FROM_SECOND_LEVEL + // + array( + // everything in default scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array() + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1, + ), + array( + // everything in global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView1, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array() + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1, + ), + array( + // everything in a group + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ) + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1, + ), + array( + // everything in a siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $siteaccess => array( $testIdHash => $locationView1 ) + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1, + ), + + array( + // default scope + one group + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView12, + ), + array( + // one group + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView1, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView21, + ), + array( + // default scope + two groups + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $group2 => array( $testIdHash => $locationView3 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView123, + ), + array( + // default scope + two groups + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $group2 => array( $testIdHash => $locationView3 ), + $siteaccess => array( $testIdHash => $locationView4 ) + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1234, + ), + array( + // two groups + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView12, + ), + array( + // two groups + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView3, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView123 + ), + array( + // two groups + siteaccess + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView4, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + $siteaccess => array( $testIdHash => $locationView3 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1234 + ), + + array( + // two groups + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $siteaccess => array( $testIdHash => $locationView3 ), + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView123 + ), + array( + // default scope + group + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $siteaccess => array( $testIdHash => $locationView3 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView123, + ), + array( + // default scope + group + siteaccess + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + $locationView4, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $siteaccess => array( $testIdHash => $locationView3 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView1234, + ), + array( + // global scope + group + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView3, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group2 => array( $testIdHash => $locationView1 ), + $siteaccess => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView123 + ), + array( + // default scope + group + global + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + $locationView3, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + AbstractParser::MERGE_FROM_SECOND_LEVEL, + $locationView123, + ), + // + // MERGING HASH TESTS without MERGE_FROM_SECOND_LEVEL, the result + // is always the "last" defined one + // + array( + // everything in default scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array() + ), + 0, + $locationView1, + ), + array( + // everything in global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView1, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array() + ), + 0, + $locationView1, + ), + array( + // everything in a group + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ) + ) + ), + 0, + $locationView1, + ), + array( + // everything in a siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $siteaccess => array( $testIdHash => $locationView1 ) + ) + ), + 0, + $locationView1, + ), + array( + // default scope + one group + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView2, + ), + array( + // one group + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView1, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView1, + ), + array( + // default scope + two groups + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $group2 => array( $testIdHash => $locationView3 ), + ) + ), + 0, + $locationView3, + ), + array( + // default scope + two groups + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $group2 => array( $testIdHash => $locationView3 ), + $siteaccess => array( $testIdHash => $locationView4 ), + ) + ), + 0, + $locationView4, + ), + array( + // default scope + two groups + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + $locationView4, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $group2 => array( $testIdHash => $locationView3 ), + ) + ), + 0, + $locationView4, + ), + array( + // two groups + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView2, + ), + array( + // two groups + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView3, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView3 + ), + array( + // two groups + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $siteaccess => array( $testIdHash => $locationView3 ), + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView3 + ), + array( + // two groups + siteaccess + global scope + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView4, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $siteaccess => array( $testIdHash => $locationView3 ), + $group1 => array( $testIdHash => $locationView1 ), + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView4 + ), + array( + // default scope + group + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + array(), + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group1 => array( $testIdHash => $locationView2 ), + $siteaccess => array( $testIdHash => $locationView3 ), + ) + ), + 0, + $locationView3, + ), + array( + // global scope + group + siteaccess + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + array(), + $locationView3, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group2 => array( $testIdHash => $locationView1 ), + $siteaccess => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView3 + ), + array( + // default scope + group + global + $testIdHash, + $siteaccess, + array( $group1, $group2 ), + $locationView1, + $locationView3, + array( + 'siteaccess' => $siteaccessConfig, + 'system' => array( + $group2 => array( $testIdHash => $locationView2 ), + ) + ), + 0, + $locationView3, + ) + ); + + foreach ( $cases as $k => $newcase ) + { + // run the same tests with another baseKey than the default one + if ( isset( $newcase[5]['system'] ) ) + { + $newcase[5]['customBaseKey'] = $newcase[5]['system']; + unset( $newcase[5]['system'] ); + $newcase[] = 'customBaseKey'; + $cases[] = $newcase; + } + } + return $cases; + } + +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Tests/ChainConfigResolverTest.php b/eZ/Bundle/EzPublishCoreBundle/Tests/ChainConfigResolverTest.php new file mode 100644 index 0000000..bc73776 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Tests/ChainConfigResolverTest.php @@ -0,0 +1,283 @@ +chainResolver = new ChainConfigResolver(); + } + + /** + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::addResolver + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::sortResolvers + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::getAllResolvers + */ + public function testPriority() + { + $this->assertEquals( array(), $this->chainResolver->getAllResolvers() ); + + list($low, $high) = $this->createResolverMocks(); + + $this->chainResolver->addResolver( $low, 10 ); + $this->chainResolver->addResolver( $high, 100 ); + + $this->assertEquals( + array( + $high, + $low, + ), + $this->chainResolver->getAllResolvers() + ); + } + + /** + * Resolvers are supposed to be sorted only once. + * This test will check that by trying to get all resolvers several times. + * + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::addResolver + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::sortResolvers + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::getAllResolvers + */ + public function testSortResolvers() + { + list( $low, $medium, $high ) = $this->createResolverMocks(); + // We're using a mock here and not $this->chainResolver because we need to ensure that the sorting operation is done only once. + $resolver = $this->buildMock( + 'eZ\\Bundle\\EzPublishCoreBundle\\DependencyInjection\\Configuration\\ChainConfigResolver', + array( 'sortResolvers' ) + ); + $resolver + ->expects( $this->once() ) + ->method( 'sortResolvers' ) + ->will( + $this->returnValue( + array( $high, $medium, $low ) + ) + ); + + $resolver->addResolver( $low, 10 ); + $resolver->addResolver( $medium, 50 ); + $resolver->addResolver( $high, 100 ); + $expectedSortedRouters = array( $high, $medium, $low ); + // Let's get all routers 5 times, we should only sort once. + for ( $i = 0; $i < 5; ++$i ) + { + $this->assertSame( $expectedSortedRouters, $resolver->getAllResolvers() ); + } + } + + /** + * This test ensures that if a resolver is being added on the fly, the sorting is reset. + * + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::sortResolvers + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::getAllResolvers + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::addResolver + */ + public function testReSortResolvers() + { + list( $low, $medium, $high ) = $this->createResolverMocks(); + $highest = clone $high; + // We're using a mock here and not $this->chainResolver because we need to ensure that the sorting operation is done only once. + $resolver = $this->buildMock( + 'eZ\\Bundle\\EzPublishCoreBundle\\DependencyInjection\\Configuration\\ChainConfigResolver', + array( 'sortResolvers' ) + ); + $resolver + ->expects( $this->at( 0 ) ) + ->method( 'sortResolvers' ) + ->will( + $this->returnValue( + array( $high, $medium, $low ) + ) + ); + // The second time sortResolvers() is called, we're supposed to get the newly added router ($highest) + $resolver + ->expects( $this->at( 1 ) ) + ->method( 'sortResolvers' ) + ->will( + $this->returnValue( + array( $highest, $high, $medium, $low ) + ) + ); + + $resolver->addResolver( $low, 10 ); + $resolver->addResolver( $medium, 50 ); + $resolver->addResolver( $high, 100 ); + $this->assertSame( + array( $high, $medium, $low ), + $resolver->getAllResolvers() + ); + + // Now adding another resolver on the fly, sorting must have been reset + $resolver->addResolver( $highest, 101 ); + $this->assertSame( + array( $highest, $high, $medium, $low ), + $resolver->getAllResolvers() + ); + } + + /** + * @expectedException \LogicException + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::getDefaultNamespace + */ + public function testGetDefaultNamespace() + { + $this->chainResolver->getDefaultNamespace(); + } + + /** + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::setDefaultNamespace + */ + public function testSetDefaultNamespace() + { + $namespace = 'foo'; + foreach ( $this->createResolverMocks() as $i => $resolver ) + { + $resolver + ->expects( $this->once() ) + ->method( 'setDefaultNamespace' ) + ->with( $namespace ); + $this->chainResolver->addResolver( $resolver, $i ); + } + + $this->chainResolver->setDefaultNamespace( $namespace ); + } + + /** + * @expectedException \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::getParameter + */ + public function testGetParameterInvalid() + { + $paramName = 'foo'; + $namespace = 'namespace'; + $scope = 'scope'; + foreach ( $this->createResolverMocks() as $resolver ) + { + $resolver + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( $paramName, $namespace, $scope ) + ->will( $this->throwException( new ParameterNotFoundException( $paramName, $namespace ) ) ); + $this->chainResolver->addResolver( $resolver ); + } + + $this->chainResolver->getParameter( $paramName, $namespace, $scope ); + } + + /** + * @dataProvider getParameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::addResolver + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::getParameter + * + * @param string $paramName + * @param string $namespace + * @param string $scope + * @param mixed $expectedValue + */ + public function testGetParameter( $paramName, $namespace, $scope, $expectedValue ) + { + $resolver = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + $resolver + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( $paramName, $namespace, $scope ) + ->will( $this->returnValue( $expectedValue ) ); + + $this->chainResolver->addResolver( $resolver ); + $this->assertSame( $expectedValue, $this->chainResolver->getParameter( $paramName, $namespace, $scope ) ); + } + + public function getParameterProvider() + { + return array( + array( 'foo', 'namespace', 'scope', 'someValue' ), + array( 'some.parameter', 'wowNamespace', 'mySiteaccess', array( 'foo', 'bar' ) ), + array( 'another.parameter.but.longer.name', 'yetAnotherNamespace', 'anotherSiteaccess', array( 'foo', array( 'fruit' => 'apple' ) ) ), + array( 'boolean.parameter', 'yetAnotherNamespace', 'admin', false ), + ); + } + + /** + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::addResolver + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ChainConfigResolver::hasParameter + */ + public function testHasParameterTrue() + { + $paramName = 'foo'; + $namespace = 'yetAnotherNamespace'; + $scope = 'mySiteaccess'; + + $resolver1 = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + $resolver1 + ->expects( $this->once() ) + ->method( 'hasParameter' ) + ->with( $paramName, $namespace, $scope ) + ->will( $this->returnValue( false ) ); + $this->chainResolver->addResolver( $resolver1 ); + + $resolver2 = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + $resolver2 + ->expects( $this->once() ) + ->method( 'hasParameter' ) + ->with( $paramName, $namespace, $scope ) + ->will( $this->returnValue( true ) ); + $this->chainResolver->addResolver( $resolver2 ); + + $resolver3 = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + $resolver3 + ->expects( $this->never() ) + ->method( 'hasParameter' ); + $this->chainResolver->addResolver( $resolver3 ); + + $this->assertTrue( $this->chainResolver->hasParameter( $paramName, $namespace, $scope ) ); + } + + public function testHasParameterFalse() + { + $paramName = 'foo'; + $namespace = 'yetAnotherNamespace'; + $scope = 'mySiteaccess'; + + $resolver = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + $resolver + ->expects( $this->once() ) + ->method( 'hasParameter' ) + ->with( $paramName, $namespace, $scope ) + ->will( $this->returnValue( false ) ); + $this->chainResolver->addResolver( $resolver ); + + $this->assertFalse( $this->chainResolver->hasParameter( $paramName, $namespace, $scope ) ); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject[] + */ + private function createResolverMocks() + { + return array( + $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ), + $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ), + $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ), + ); + } + + private function buildMock( $class, array $methods = array() ) + { + return $this + ->getMockBuilder( $class ) + ->disableOriginalConstructor() + ->setMethods( $methods ) + ->getMock(); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Tests/ConfigResolverTest.php b/eZ/Bundle/EzPublishCoreBundle/Tests/ConfigResolverTest.php new file mode 100644 index 0000000..6bfdbe9 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Tests/ConfigResolverTest.php @@ -0,0 +1,291 @@ +siteAccess = new SiteAccess( 'test' ); + $this->containerMock = $this->getMock( 'Symfony\\Component\\DependencyInjection\\ContainerInterface' ); + } + + /** + * @param string $defaultNS + * @param int $undefinedStrategy + * + * @return \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver + */ + private function getResolver( $defaultNS = 'ezsettings', $undefinedStrategy = ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION, array $groupsBySiteAccess = array() ) + { + return new ConfigResolver( + $this->siteAccess, + $groupsBySiteAccess, + $this->containerMock, + $defaultNS, + $undefinedStrategy + ); + } + + /** + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getUndefinedStrategy + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::setUndefinedStrategy + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getDefaultNamespace + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::setDefaultNamespace + */ + public function testGetSetUndefinedStrategy() + { + $strategy = ConfigResolver::UNDEFINED_STRATEGY_NULL; + $defaultNS = 'ezsettings'; + $resolver = $this->getResolver( $defaultNS, $strategy ); + + $this->assertSame( $strategy, $resolver->getUndefinedStrategy() ); + $resolver->setUndefinedStrategy( ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION ); + $this->assertSame( ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION, $resolver->getUndefinedStrategy() ); + + $this->assertSame( $defaultNS, $resolver->getDefaultNamespace() ); + $resolver->setDefaultNamespace( 'anotherNamespace' ); + $this->assertSame( 'anotherNamespace', $resolver->getDefaultNamespace() ); + } + + /** + * @expectedException \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getParameter + */ + public function testGetParameterFailedWithException() + { + $resolver = $this->getResolver( 'ezsettings', ConfigResolver::UNDEFINED_STRATEGY_EXCEPTION ); + $resolver->getParameter( 'foo' ); + } + + /** + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getParameter + */ + public function testGetParameterFailedNull() + { + $resolver = $this->getResolver( 'ezsettings', ConfigResolver::UNDEFINED_STRATEGY_NULL ); + $this->assertNull( $resolver->getParameter( 'foo' ) ); + } + + public function parameterProvider() + { + return array( + array( 'foo', 'bar' ), + array( 'some.parameter', true ), + array( 'some.other.parameter', array( 'foo', 'bar', 'baz' ) ), + array( 'a.hash.parameter', array( 'foo' => 'bar', 'tata' => 'toto' ) ), + array( + 'a.deep.hash', array( + 'foo' => 'bar', + 'tata' => 'toto', + 'deeper_hash' => array( + 'likeStarWars' => true, + 'jedi' => array( 'Obi-Wan Kenobi', 'Mace Windu', 'Luke Skywalker', 'Leïa Skywalker (yes! Read episodes 7-8-9!)' ), + 'sith' => array( 'Darth Vader', 'Darth Maul', 'Palpatine' ), + 'roles' => array( + 'Amidala' => array( 'Queen' ), + 'Palpatine' => array( 'Senator', 'Emperor', 'Villain' ), + 'C3PO' => array( 'Droid', 'Annoying guy' ), + 'Jar-Jar' => array( 'Still wondering his role', 'Annoying guy' ) + ) + ) + ) + ), + ); + } + + /** + * @dataProvider parameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getParameter + */ + public function testGetParameterGlobalScope( $paramName, $expectedValue ) + { + $globalScopeParameter = "ezsettings.global.$paramName"; + $this->containerMock + ->expects( $this->once() ) + ->method( 'hasParameter' ) + ->with( $globalScopeParameter ) + ->will( $this->returnValue( true ) ); + $this->containerMock + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( $globalScopeParameter ) + ->will( $this->returnValue( $expectedValue ) ); + + $this->assertSame( $expectedValue, $this->getResolver()->getParameter( $paramName ) ); + } + + /** + * @dataProvider parameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getParameter + */ + public function testGetParameterRelativeScope( $paramName, $expectedValue ) + { + $relativeScopeParameter = "ezsettings.{$this->siteAccess->name}.$paramName"; + $this->containerMock + ->expects( $this->exactly( 2 ) ) + ->method( 'hasParameter' ) + ->with( + $this->logicalOr( + "ezsettings.global.$paramName", + $relativeScopeParameter + ) + ) + // First call is for "global" scope, second is the right one + ->will( $this->onConsecutiveCalls( false, true ) ); + $this->containerMock + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( $relativeScopeParameter ) + ->will( $this->returnValue( $expectedValue ) ); + + $this->assertSame( $expectedValue, $this->getResolver()->getParameter( $paramName ) ); + } + + /** + * @dataProvider parameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getParameter + */ + public function testGetParameterSpecificScope( $paramName, $expectedValue ) + { + $scope = 'some_siteaccess'; + $relativeScopeParameter = "ezsettings.$scope.$paramName"; + $this->containerMock + ->expects( $this->exactly( 2 ) ) + ->method( 'hasParameter' ) + ->with( + $this->logicalOr( + "ezsettings.global.$paramName", + $relativeScopeParameter + ) + ) + // First call is for "global" scope, second is the right one + ->will( $this->onConsecutiveCalls( false, true ) ); + $this->containerMock + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( $relativeScopeParameter ) + ->will( $this->returnValue( $expectedValue ) ); + + $this->assertSame( + $expectedValue, + $this->getResolver()->getParameter( $paramName, 'ezsettings', $scope ) + ); + } + + /** + * @dataProvider parameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::getParameter + */ + public function testGetParameterDefaultScope( $paramName, $expectedValue ) + { + $defaultScopeParameter = "ezsettings.default.$paramName"; + $relativeScopeParameter = "ezsettings.{$this->siteAccess->name}.$paramName"; + $this->containerMock + ->expects( $this->exactly( 3 ) ) + ->method( 'hasParameter' ) + ->with( + $this->logicalOr( + "ezsettings.global.$paramName", + $relativeScopeParameter, + $defaultScopeParameter + ) + ) + // First call is for "global" scope, second is the right one + ->will( $this->onConsecutiveCalls( false, false, true ) ); + $this->containerMock + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( $defaultScopeParameter ) + ->will( $this->returnValue( $expectedValue ) ); + + $this->assertSame( $expectedValue, $this->getResolver()->getParameter( $paramName ) ); + } + + public function hasParameterProvider() + { + return array( + array( true, true, true, true ), + array( true, true, false, true ), + array( true, false, false, true ), + array( false, false, false, false ), + array( false, true, false, true ), + array( false, false, true, true ), + array( false, true, true, true ), + ); + } + + /** + * @dataProvider hasParameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::hasParameter + */ + public function testHasParameterNoNamespace( $defaultMatch, $scopeMatch, $globalMatch, $expectedResult ) + { + $paramName = 'foo.bar'; + $this->containerMock->expects( $this->atLeastOnce() ) + ->method( 'hasParameter' ) + ->with( + $this->logicalOr( + "ezsettings.global.$paramName", + "ezsettings.{$this->siteAccess->name}.$paramName", + "ezsettings.default.$paramName" + ) + ) + ->will( $this->onConsecutiveCalls( $defaultMatch, $scopeMatch, $globalMatch ) ); + + $this->assertSame( $expectedResult, $this->getResolver()->hasParameter( $paramName ) ); + } + + /** + * @dataProvider hasParameterProvider + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\DependencyInjection\Configuration\ConfigResolver::hasParameter + */ + public function testHasParameterWithNamespaceAndScope( $defaultMatch, $scopeMatch, $globalMatch, $expectedResult ) + { + $paramName = 'foo.bar'; + $namespace = 'my.namespace'; + $scope = "another_siteaccess"; + $this->containerMock->expects( $this->atLeastOnce() ) + ->method( 'hasParameter' ) + ->with( + $this->logicalOr( + "$namespace.global.$paramName", + "$namespace.$scope.$paramName", + "$namespace.default.$paramName" + ) + ) + ->will( $this->onConsecutiveCalls( $defaultMatch, $scopeMatch, $globalMatch ) ); + + $this->assertSame( $expectedResult, $this->getResolver()->hasParameter( $paramName, $namespace, $scope ) ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/Tests/ConfiguredContentViewProviderTest.php b/eZ/Bundle/EzPublishCoreBundle/Tests/ConfiguredContentViewProviderTest.php new file mode 100644 index 0000000..8a96ddf --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/Tests/ConfiguredContentViewProviderTest.php @@ -0,0 +1,88 @@ +siteAccess = new SiteAccess( 'test' ); + } + + /** + * @covers \eZ\Bundle\EzPublishCoreBundle\View\Provider\Location\Configured::__construct + * @covers \eZ\Bundle\EzPublishCoreBundle\View\Provider\Location\Configured::getMatcher + */ + public function testGetMatcherForLocation() + { + $matcherServiceIdentifier = 'my.matcher.service'; + $container = $this->getMock( 'Symfony\\Component\\DependencyInjection\\ContainerInterface' ); + + // The following should happen in getMatcher() + $container + ->expects( $this->once() ) + ->method( 'has' ) + ->with( $matcherServiceIdentifier ) + ->will( $this->returnValue( true ) ); + $container->expects( $this->once() ) + ->method( 'get' ) + ->with( $matcherServiceIdentifier ) + ->will( + $this->returnValue( $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\ContentViewProvider\\Configured\\Matcher' ) ) + ); + + $resolverMock = $this->getResolverMock( $matcherServiceIdentifier ); + $lvp = new Configured( $resolverMock, $this->repositoryMock, $container ); + $lvp->getView( + $this->getLocationMock(), + 'full' + ); + } + + /** + * @param string $matcherServiceIdentifier + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function getResolverMock( $matcherServiceIdentifier ) + { + $resolverMock = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + $resolverMock + ->expects( $this->atLeastOnce() ) + ->method( 'getParameter' ) + ->with( $this->logicalOr( 'location_view', 'content_view' ) ) + ->will( + $this->returnValue( + array( + 'full' => array( + 'matchRule' => array( + 'template' => 'my_template.html.twig', + 'match' => array( + $matcherServiceIdentifier => 'someValue' + ) + ) + ) + ) + ) + ); + + return $resolverMock; + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/View/Provider/Content/Configured.php b/eZ/Bundle/EzPublishCoreBundle/View/Provider/Content/Configured.php new file mode 100644 index 0000000..15cc2b8 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/View/Provider/Content/Configured.php @@ -0,0 +1,53 @@ +container = $container; + + parent::__construct( $repository, $configResolver->getParameter( 'content_view' ) ); + } + + /** + * Returns the matcher object either from a service identifier or from a class. + * + * @param string $matcherIdentifier If it is a service identifier, the matcher will be built with the service container. + * + * @return \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher + */ + protected function getMatcher( $matcherIdentifier ) + { + if ( $this->container->has( $matcherIdentifier ) ) + return $this->container->get( $matcherIdentifier ); + + return parent::getMatcher( $matcherIdentifier ); + } +} diff --git a/eZ/Bundle/EzPublishCoreBundle/View/Provider/Location/Configured.php b/eZ/Bundle/EzPublishCoreBundle/View/Provider/Location/Configured.php new file mode 100644 index 0000000..efe0476 --- /dev/null +++ b/eZ/Bundle/EzPublishCoreBundle/View/Provider/Location/Configured.php @@ -0,0 +1,53 @@ +container = $container; + + parent::__construct( $repository, $configResolver->getParameter( 'location_view' ) ); + } + + /** + * Returns the matcher object either from a service identifier or from a class. + * + * @param string $matcherIdentifier If it is a service identifier, the matcher will be built with the service container. + * + * @return \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher + */ + protected function getMatcher( $matcherIdentifier ) + { + if ( $this->container->has( $matcherIdentifier ) ) + return $this->container->get( $matcherIdentifier ); + + return parent::getMatcher( $matcherIdentifier ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Command/LegacyConfigurationCommand.php b/eZ/Bundle/EzPublishLegacyBundle/Command/LegacyConfigurationCommand.php new file mode 100644 index 0000000..d793f89 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Command/LegacyConfigurationCommand.php @@ -0,0 +1,62 @@ +setName( 'ezpublish:configure' ) + ->setDefinition( + array( + new InputArgument( 'package', InputArgument::REQUIRED, 'Name of the installed package. Used to generate the settings group name. Example: ezdemo_site' ), + new InputArgument( 'adminsiteaccess', InputArgument::REQUIRED, 'Name of your admin siteaccess. Example: ezdemo_site_admin' ), + new InputOption( 'backup', null, InputOption::VALUE_NONE, 'Makes a backup of existing files if any' ), + ) + ) + ->setDescription( 'Creates the ezpublish 5 configuration based on an existing ezpublish_legacy' ) + ->setHelp( + <<%command.name% creates the ezpublish 5 configuration, +based on an existing ezpublish_legacy installation. + +Settings will be picked based on the default siteaccess. +EOT + ); + } + + protected function execute( InputInterface $input, OutputInterface $output ) + { + $package = $input->getArgument( 'package' ); + $adminSiteaccess = $input->getArgument( 'adminsiteaccess' ); + $kernel = $this->getContainer()->get( 'kernel' ); + + /** @var $configurationConverter \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationConverter */ + $configurationConverter = $this->getContainer()->get( 'ezpublish_legacy.setup_wizard.configuration_converter' ); + /** @var $configurationDumper \eZ\Bundle\EzpublishLegacyBundle\SetupWizard\ConfigurationDumper */ + $configurationDumper = $this->getContainer()->get( 'ezpublish_legacy.setup_wizard.configuration_dumper' ); + $configurationDumper->addEnvironment( $kernel->getEnvironment() ); + + $options = ConfigDumperInterface::OPT_DEFAULT; + if ( $input->getOption( 'backup' ) ) + $options |= ConfigDumperInterface::OPT_BACKUP_CONFIG; + $configurationDumper->dump( $configurationConverter->fromLegacy( $package, $adminSiteaccess ), $options ); + + $output->writeln( "Configuration written to ezpublish.yml and environment related ezpublish configuration files." ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Command/LegacyWrapperInstallCommand.php b/eZ/Bundle/EzPublishLegacyBundle/Command/LegacyWrapperInstallCommand.php new file mode 100644 index 0000000..8a757aa --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Command/LegacyWrapperInstallCommand.php @@ -0,0 +1,117 @@ +setName( 'ezpublish:legacy:assets_install' ) + ->setDefinition( + array( + new InputArgument( 'target', InputArgument::OPTIONAL, 'The target directory', 'web' ), + ) + ) + ->addOption( 'symlink', null, InputOption::VALUE_NONE, 'Symlinks the assets instead of copying it' ) + ->addOption( 'relative', null, InputOption::VALUE_NONE, 'Make relative symlinks' ) + ->setDescription( 'Installs assets from eZ Publish legacy installation and wrapper scripts for front controllers (like index_cluster.php).' ) + ->setHelp( + <<%command.name% installs assets from eZ Publish legacy installation +and wrapper scripts for front controllers (like index_cluster.php). +Assets folders: Symlinks will be created from your eZ Publish legacy directory. +Front controllers: Wrapper scripts will be generated. +EOT + ); + } + + protected function execute( InputInterface $input, OutputInterface $output ) + { + $targetArg = rtrim( $input->getArgument( 'target' ), '/' ); + if ( !is_dir( $targetArg ) ) + { + throw new \InvalidArgumentException( sprintf( 'The target directory "%s" does not exist.', $input->getArgument( 'target' ) ) ); + } + else if ( !function_exists( 'symlink' ) && $input->getOption( 'symlink' ) ) + { + throw new \InvalidArgumentException( 'The symlink() function is not available on your system. You need to install the assets without the --symlink option.' ); + } + + /** + * @var \Symfony\Component\Filesystem\Filesystem + */ + $filesystem = $this->getContainer()->get( 'filesystem' ); + $legacyRootDir = rtrim( $this->getContainer()->getParameter( 'ezpublish_legacy.root_dir' ), '/' ); + + $output->writeln( sprintf( "Installing eZ Publish legacy assets form $legacyRootDir using the %s option", $input->getOption( 'symlink' ) ? 'symlink' : 'hard copy' ) ); + + foreach ( array( 'design', 'extension', 'share', 'var' ) as $folder ) + { + $targetDir = "$targetArg/$folder"; + $originDir = "$legacyRootDir/$folder"; + $filesystem->remove( $targetDir ); + if ( $input->getOption( 'symlink' ) ) + { + if ( $input->getOption( 'relative' ) ) + { + $originDir = $filesystem->makePathRelative( $originDir, realpath( $targetArg ) ); + } + + $filesystem->symlink( $originDir, $targetDir ); + } + else + { + $filesystem->mkdir( $targetDir, 0777 ); + // We use a custom iterator to ignore VCS files + $filesystem->mirror( $originDir, $targetDir, Finder::create()->in( $originDir ) ); + } + } + + $output->writeln( "Installing wrappers for eZ Publish legacy front controllers (rest & cluster)" ); + foreach ( array( 'index_rest.php', 'index_cluster.php' ) as $frontController ) + { + $newFrontController = "$targetArg/$frontController"; + $filesystem->remove( $newFrontController ); + $generator = new ezcPhpGenerator( $newFrontController, false ); + $generator->lineBreak = "\n"; + $generator->appendCustomCode( + <<appendValueAssignment( 'legacyRoot', $legacyRootDir ); + $generator->appendFunctionCall( + 'chdir', + array( + new ezcPhpGeneratorParameter( 'legacyRoot' ) + ) + ); + $generator->appendCustomCode( "require \$legacyRoot . '/$frontController';" ); + $generator->appendEmptyLines(); + $generator->finish(); + } + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacyKernelController.php b/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacyKernelController.php new file mode 100644 index 0000000..10b6c0c --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacyKernelController.php @@ -0,0 +1,123 @@ +kernel = $kernelClosure(); + $this->templateEngine = $templateEngine; + } + + /** + * Renders a view and returns a Response. + * + * @param string $view The view name + * @param array $parameters An array of parameters to pass to the view + * + * @return Response A Response instance + */ + public function render( $view, array $parameters = array() ) + { + $response = new Response(); + $response->setContent( $this->templateEngine->render( $view, $parameters ) ); + return $response; + } + + /** + * Base fallback action. + * Will be basically used for every + * @return \Symfony\Component\HttpFoundation\Response + */ + public function indexAction() + { + try + { + $result = $this->kernel->run(); + } + catch ( ezpModuleNotFound $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:module_not_found.html.twig", + array( "moduleName" => $e->moduleName ) + )->setStatusCode( 404 ); + } + catch ( ezpModuleViewNotFound $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:module_view_not_found.html.twig", + array( "moduleName" => $e->moduleName, "viewName" => $e->viewName ) + )->setStatusCode( 404 ); + } + catch ( ezpModuleDisabled $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:module_disabled.html.twig", + array( "moduleName" => $e->moduleName ) + )->setStatusCode( 404 ); + } + catch ( ezpModuleViewDisabled $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:module_view_disabled.html.twig", + array( "moduleName" => $e->moduleName, "viewName" => $e->viewName ) + )->setStatusCode( 404 ); + } + catch ( ezpAccessDenied $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:access_denied.html.twig" + )->setStatusCode( 403 ); + } + catch ( ezpContentNotFoundException $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:content_not_found.html.twig" + )->setStatusCode( 404 ); + } + catch ( ezpLanguageNotFound $e ) + { + return $this->render( + "EzPublishLegacyBundle:errors:language_not_found.html.twig" + )->setStatusCode( 500 ); + } + + return new Response( + $result->getContent() + ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacySetupController.php b/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacySetupController.php new file mode 100644 index 0000000..c033c0e --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacySetupController.php @@ -0,0 +1,139 @@ +legacyKernelClosure = $kernelClosure; + $this->legacyConfigResolver = $legacyConfigResolver; + } + + public function setContainer( Container $container ) + { + $this->container = $container; + } + + /** + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected function getLegacyKernel() + { + $legacyKernelClosure = $this->legacyKernelClosure; + return $legacyKernelClosure(); + } + + public function init() + { + /** @var $request \Symfony\Component\HttpFoundation\Request */ + $request = $this->container->get( 'request' ); + $currentStep = $request->request->get( 'eZSetup_current_step' ); + + $response = new Response(); + + // inject the extra ezpublish5 folders we want permissions checked for + if ( $currentStep == 'Welcome' || $currentStep == 'SystemCheck' ) + { + $this->getLegacyKernel()->runCallback( + function() + { + $directoriesCheckList = eZINI::instance( 'setup.ini' )->variable( 'directory_permissions', 'CheckList' ); + $injectedSettings = array(); + // checked folders are relative to the ezpublish_legacy folder + $injectedSettings['setup.ini']['directory_permissions']['CheckList'] = + "../ezpublish/logs;../ezpublish/cache;../ezpublish/config;" . $directoriesCheckList; + eZINI::injectSettings( $injectedSettings ); + } + ); + } + + /** @var \ezpKernelResult $result */ + $result = $this->getLegacyKernel()->run(); + $result->getContent(); + $response->setContent( $result->getContent() ); + + // After the registration step, we can re-use both POST data and written INI settings + // to generate a local ezpublish_.yml + if ( $currentStep == 'Registration' ) + { + // Clear INI cache since setup has written new files + $this->getLegacyKernel()->runCallback( + function() + { + eZINI::injectSettings( array() ); + eZCache::clearByTag( 'ini' ); + eZINI::resetAllInstances(); + } + ); + + // Check that eZ Publish Legacy was actually installed, since one step can run several steps + if ( $this->legacyConfigResolver->getParameter( 'SiteAccessSettings.CheckValidity' ) == 'false' ) + { + $chosenSitePackage = $request->request->get( 'P_chosen_site_package-0' ); + + // match mode (host, url or port) + $accessType = $request->request->get( 'P_site_extra_data_access_type-' . $chosenSitePackage ); + if ( $accessType == 'hostname' || $accessType == 'port' ) + { + $adminSiteaccess = $chosenSitePackage . '_admin'; + } + else if ( $accessType === 'url' ) + { + $adminSiteaccess = $request->request->get( 'P_site_extra_data_admin_access_type_value-' . $chosenSitePackage ); + } + + /** @var $configurationConverter \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationConverter */ + $configurationConverter = $this->container->get( 'ezpublish_legacy.setup_wizard.configuration_converter' ); + /** @var $configurationDumper \eZ\Bundle\EzpublishLegacyBundle\SetupWizard\ConfigurationDumper */ + $configurationDumper = $this->container->get( 'ezpublish_legacy.setup_wizard.configuration_dumper' ); + $configurationDumper->addEnvironment( $this->container->get( 'kernel' )->getEnvironment() ); + $configurationDumper->dump( + $configurationConverter->fromLegacy( $chosenSitePackage, $adminSiteaccess ), + ConfigDumperInterface::OPT_BACKUP_CONFIG + ); + } + } + + return $response; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacyTreeMenuController.php b/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacyTreeMenuController.php new file mode 100644 index 0000000..3054cff --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Controller/LegacyTreeMenuController.php @@ -0,0 +1,63 @@ +buildLegacyKernel( $treeMenuKernelHandler ); + $this->treeMenuKernel = $kernelClosure(); + } + + /** + * Action rendering the tree menu for admin interface. + * Note that parameters are not used at all since the request is entirely forwarded to the legacy kernel. + * + * @param int $nodeId + * @param int $modified + * @param int $expiry + * @param string $perm + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function viewMenu( $nodeId, $modified, $expiry, $perm ) + { + $response = new Response(); + if ( $this->getParameter( 'treemenu.http_cache' ) ) + { + $request = $this->getRequest(); + $response->setMaxAge( $this->getParameter( 'treemenu.ttl_cache' ) ); + // Aggressive cache : Always return a 304 response if "If-Modified-Since" request header is present. + if ( $request->headers->has( 'If-Modified-Since' ) ) + { + $response->setNotModified(); + return $response; + } + } + + $result = $this->treeMenuKernel->run(); + if ( $result->hasAttribute( 'lastModified' ) ) + $response->setLastModified( $result->getAttribute( 'lastModified' ) ); + $response->setContent( $result->getContent() ); + return $response; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Compiler/LegacyPass.php b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Compiler/LegacyPass.php new file mode 100644 index 0000000..70fb55f --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Compiler/LegacyPass.php @@ -0,0 +1,41 @@ +hasDefinition( 'ezpublish_legacy.templating.delegating_converter' ) ) + return; + + $definition = $container->getDefinition( 'ezpublish_legacy.templating.delegating_converter' ); + foreach ( $container->findTaggedServiceIds( 'ezpublish_legacy.templating.converter' ) as $id => $attributes ) + { + foreach ( $attributes as $attribute ) + { + if ( !isset( $attribute['for'] ) ) + continue; + + $definition->addMethodCall( + 'addConverter', + array( + new Reference( $id ), + $attribute['for'] + ) + ); + } + } + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Configuration.php b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..39360bf --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Configuration.php @@ -0,0 +1,46 @@ +root( 'ezpublish_legacy' ) + ->children() + ->booleanNode( 'enabled' )->defaultFalse()->end() + ->scalarNode( 'root_dir' ) + ->validate() + ->ifTrue( + function ( $v ) + { + return !file_exists( $v ); + } + ) + ->thenInvalid( "Provided eZ Publish Legacy root dir does not exist!'" ) + ->end() + ->end(); + + return $treeBuilder; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Configuration/LegacyConfigResolver.php b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Configuration/LegacyConfigResolver.php new file mode 100644 index 0000000..c95cb40 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/Configuration/LegacyConfigResolver.php @@ -0,0 +1,190 @@ + + * // From a controller + * $legacyResolver = $this->container->get( 'ezpublish_legacy.config.resolver' ); + * // Get [DebugSettings].DebugOutput from site.ini + * $debugOutput = $legacyResolver->getParameter( 'DebugSettings.DebugOutput' ); + * // Get [ImageMagick].ExecutablePath from image.ini + * $imageMagickPath = $legacyResolver->getParameter( 'ImageMagick.ExecutablePath', 'image' ); + * // Get [DatabaseSettings].Database from site.ini, for ezdemo_site_admin siteaccess + * $databaseName = $legacyResolver->getParameter( 'DatabaseSettings.Database', 'site', 'ezdemo_site_admin' ); + * + * // Note that the examples above are also applicable for hasParameter(). + * + */ +class LegacyConfigResolver implements ConfigResolverInterface +{ + /** + * @var \Closure + */ + protected $legacyKernelClosure; + + /** + * @var string + */ + protected $defaultNamespace; + + public function __construct( \Closure $legacyKernelClosure, $defaultNamespace ) + { + $this->legacyKernelClosure = $legacyKernelClosure; + $this->defaultNamespace = $defaultNamespace; + } + + /** + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected function getLegacyKernel() + { + $kernelClosure = $this->legacyKernelClosure; + return $kernelClosure(); + } + + /** + * Returns value for $paramName, in $namespace. + * + * @param string $paramName String containing dot separated INI group name and param name. + * Must follow the following format: . + * @param string $namespace The legacy INI file name, without the suffix (i.e. without ".ini"). + * @param string $scope A specific siteaccess to look into. Defaults to the current siteaccess. + * + * @throws \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException + * + * @return mixed + */ + public function getParameter( $paramName, $namespace = null, $scope = null ) + { + $namespace = $namespace ?: $this->defaultNamespace; + $namespace = str_replace( '.ini', '', $namespace ); + list( $iniGroup, $paramName ) = explode( '.', $paramName, 2 ); + + return $this->getLegacyKernel()->runCallback( + function () use ( $iniGroup, $paramName, $namespace, $scope ) + { + if ( isset( $scope ) ) + { + $ini = eZINI::getSiteAccessIni( $scope, "$namespace.ini" ); + } + else + { + $ini = eZINI::instance( "$namespace.ini" ); + } + + if ( !$ini->hasVariable( $iniGroup, $paramName ) ) + throw new ParameterNotFoundException( $paramName, "$namespace.ini" ); + + return $ini->variable( $iniGroup, $paramName ); + }, + false + ); + } + + /** + * Returns values for $groupName, in $namespace. + * + * @param string $groupName String containing an INI group name. + * @param string $namespace The legacy INI file name, without the suffix (i.e. without ".ini"). + * @param string $scope A specific siteaccess to look into. Defaults to the current siteaccess. + * + * @throws \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException + * + * @todo Implement in ConfigResolver interface + * + * @return array + */ + public function getGroup( $groupName, $namespace = null, $scope = null ) + { + $namespace = $namespace ?: $this->defaultNamespace; + $namespace = str_replace( '.ini', '', $namespace ); + + return $this->getLegacyKernel()->runCallback( + function () use ( $groupName, $namespace, $scope ) + { + if ( isset( $scope ) ) + { + $ini = eZINI::getSiteAccessIni( $scope, "$namespace.ini" ); + } + else + { + $ini = eZINI::instance( "$namespace.ini" ); + } + + if ( !$ini->hasGroup( $groupName ) ) + throw new ParameterNotFoundException( $groupName, "$namespace.ini" ); + + return $ini->group( $groupName ); + }, + false + ); + } + + /** + * Checks if $paramName exists in $namespace + * + * @param string $paramName + * @param string $namespace If null, the default namespace should be used. + * @param string $scope The scope you need $paramName value for. + * + * @return boolean + */ + public function hasParameter( $paramName, $namespace = null, $scope = null ) + { + $namespace = $namespace ?: $this->defaultNamespace; + $namespace = str_replace( '.ini', '', $namespace ); + list( $iniGroup, $paramName ) = explode( '.', $paramName, 2 ); + + return $this->getLegacyKernel()->runCallback( + function () use ( $iniGroup, $paramName, $namespace, $scope ) + { + if ( isset( $scope ) ) + { + $ini = eZINI::getSiteAccessIni( $scope, "$namespace.ini" ); + } + else + { + $ini = eZINI::instance( "$namespace.ini" ); + } + + return $ini->hasVariable( $iniGroup, $paramName ); + }, + false + ); + } + + /** + * Changes the default namespace to look parameter into. + * + * @param string $defaultNamespace + */ + public function setDefaultNamespace( $defaultNamespace ) + { + $this->defaultNamespace = $defaultNamespace; + } + + /** + * Returns the current default namespace. + * + * @return string + */ + public function getDefaultNamespace() + { + return $this->defaultNamespace; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/EzPublishLegacyExtension.php b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/EzPublishLegacyExtension.php new file mode 100644 index 0000000..399399d --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/DependencyInjection/EzPublishLegacyExtension.php @@ -0,0 +1,54 @@ +processConfiguration( $configuration, $configs ); + + $container->setParameter( 'ezpublish_legacy.enabled', $config['enabled'] ); + if ( $config['enabled'] ) + { + $loader = new Loader\YamlFileLoader( + $container, + new FileLocator( __DIR__ . '/../Resources/config' ) + ); + $loader->load( 'services.yml' ); + // Security services + $loader->load( 'security.yml' ); + + $container->setParameter( 'ezpublish_legacy.root_dir', $config['root_dir'] ); + + // Templating + $loader->load( 'templating.yml' ); + + // View + $loader->load( 'view.yml' ); + } + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/EzPublishLegacyBundle.php b/eZ/Bundle/EzPublishLegacyBundle/EzPublishLegacyBundle.php new file mode 100644 index 0000000..716f08e --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/EzPublishLegacyBundle.php @@ -0,0 +1,35 @@ +container->getParameter( 'ezpublish_legacy.enabled' ) ) + return; + + // Deactivate eZComponents loading from legacy autoload.php as they are already loaded + if ( !defined( 'EZCBASE_ENABLED' ) ) + define( 'EZCBASE_ENABLED', false ); + + require_once $this->container->getParameter( 'ezpublish_legacy.root_dir' ) . "/autoload.php"; + } + + public function build( ContainerBuilder $container ) + { + parent::build( $container ); + $container->addCompilerPass( new LegacyPass() ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/Configuration.php b/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/Configuration.php new file mode 100644 index 0000000..ea5b257 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/Configuration.php @@ -0,0 +1,135 @@ +configResolver = $configResolver; + $this->gatewayCachePurger = $gatewayCachePurger; + $this->options = $options; + } + + public static function getSubscribedEvents() + { + return array( + LegacyEvents::PRE_BUILD_LEGACY_KERNEL => array( "onBuildKernel", 128 ) + ); + } + + /** + * Adds settings to the parameters that will be injected into the legacy kernel + * + * @param \eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelEvent $event + * + * @todo Cache computed settings somehow + */ + public function onBuildKernel( PreBuildKernelEvent $event ) + { + $databaseSettings = $this->configResolver->getParameter( "database" ); + $settings = array(); + foreach ( + array( + "server" => "Server", + "port" => "Port", + "user" => "User", + "password" => "Password", + "database_name" => "Database", + "type" => "DatabaseImplementation", + ) as $key => $iniKey + ) + { + if ( isset( $databaseSettings[$key] ) ) + $settings["site.ini/DatabaseSettings/$iniKey"] = $databaseSettings[$key]; + } + + // Image settings + $settings += $this->getImageSettings(); + // File settings + $settings += array( + 'site.ini/FileSettings/VarDir' => $this->configResolver->getParameter( 'var_dir' ), + 'site.ini/FileSettings/StorageDir' => $this->configResolver->getParameter( 'storage_dir' ) + ); + + $event->getParameters()->set( + "injected-settings", + $settings + (array)$event->getParameters()->get( "injected-settings" ) + ); + + // Register content/cache event listener + ezpEvent::getInstance()->attach( 'content/cache', array( $this->gatewayCachePurger, 'purge' ) ); + ezpEvent::getInstance()->attach( 'content/cache/all', array( $this->gatewayCachePurger, 'purgeAll' ) ); + } + + private function getImageSettings() + { + $imageSettings = array( + // Basic settings + 'image.ini/FileSettings/TemporaryDir' => $this->configResolver->getParameter( 'image.temporary_dir' ), + 'image.ini/FileSettings/PublishedImages' => $this->configResolver->getParameter( 'image.published_images_dir' ), + 'image.ini/FileSettings/VersionedImages' => $this->configResolver->getParameter( 'image.versioned_images_dir' ), + 'image.ini/AliasSettings/AliasList' => array(), + // ImageMagick configuration + 'image.ini/ImageMagick/IsEnabled' => $this->options['imagemagick_enabled'] ? 'true' : 'false', + 'image.ini/ImageMagick/ExecutablePath' => $this->options['imagemagick_executable_path'], + 'image.ini/ImageMagick/Executable' => $this->options['imagemagick_executable'], + 'image.ini/ImageMagick/PreParameters' => $this->configResolver->getParameter( 'imagemagick.pre_parameters' ), + 'image.ini/ImageMagick/PostParameters' => $this->configResolver->getParameter( 'imagemagick.post_parameters' ), + 'image.ini/ImageMagick/Filters' => array() + ); + + // Aliases configuration + foreach ( $this->configResolver->getParameter( 'image_variations' ) as $aliasName => $aliasSettings ) + { + $imageSettings['image.ini/AliasSettings/AliasList'][] = $aliasName; + if ( isset( $aliasSettings['reference'] ) ) + $imageSettings["image.ini/$aliasName/Reference"] = $aliasSettings['reference']; + + foreach ( $aliasSettings['filters'] as $filter ) + { + $imageSettings["image.ini/$aliasName/Filters"][] = $filter['name'] . '=' . implode( ';', $filter['params'] ); + } + } + + foreach ( $this->options['imagemagick_filters'] as $filterName => $filter ) + { + $imageSettings['image.ini/ImageMagick/Filters'][] = "$filterName=" . strtr( $filter, array( '{' => '%', '}' => '' ) ); + } + + return $imageSettings; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/Session.php b/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/Session.php new file mode 100644 index 0000000..03ea979 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/Session.php @@ -0,0 +1,71 @@ +container = $container; + } + + public static function getSubscribedEvents() + { + return array( + LegacyEvents::PRE_BUILD_LEGACY_KERNEL_WEB => array( 'onBuildKernelWebHandler', 128 ) + ); + } + + /** + * Adds the session settings to the parameters that will be injected + * into the legacy kernel + * + * @param \eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelWebHandlerEvent $event + */ + public function onBuildKernelWebHandler( PreBuildKernelWebHandlerEvent $event ) + { + $sessionInfos = array( + 'configured' => false, + 'started' => false, + 'name' => false, + 'namespace' => false, + 'has_previous' => false, + 'storage' => false, + ); + if ( $this->container->has( 'session' ) ) + { + $sessionInfos['configured'] = true; + + $session = $this->container->get( 'session' ); + $sessionInfos['name'] = $session->getName(); + $sessionInfos['started'] = $session->isStarted(); + $sessionInfos['namespace'] = $this->container->getParameter( + 'ezpublish.session.attribute_bag.storage_key' + ); + $sessionInfos['has_previous'] = $event->getRequest()->hasPreviousSession(); + $sessionInfos['storage'] = $this->container->get( 'session.storage' ); + } + + $event->getParameters()->set( 'session', $sessionInfos ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/SiteAccess.php b/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/SiteAccess.php new file mode 100644 index 0000000..6ddb253 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/LegacyMapper/SiteAccess.php @@ -0,0 +1,105 @@ +container = $container; + } + + public static function getSubscribedEvents() + { + return array( + LegacyEvents::PRE_BUILD_LEGACY_KERNEL_WEB => array( 'onBuildKernelWebHandler', 128 ) + ); + } + + /** + * Maps matched siteaccess to the legacy parameters + * + * @param \eZ\Publish\Core\MVC\Legacy\Event\PreBuildKernelWebHandlerEvent $event + * + * @return void + */ + public function onBuildKernelWebHandler( PreBuildKernelWebHandlerEvent $event ) + { + $siteAccess = $this->container->get( 'ezpublish.siteaccess' ); + $request = $event->getRequest(); + $uriPart = array(); + + // Convert matching type + switch ( $siteAccess->matchingType ) + { + case 'default': + $legacyAccessType = eZSiteAccess::TYPE_DEFAULT; + break; + + case 'env': + $legacyAccessType = eZSiteAccess::TYPE_SERVER_VAR; + break; + + case 'uri:map': + case 'uri:element': + case 'uri:text': + case 'uri:regexp': + $legacyAccessType = eZSiteAccess::TYPE_URI; + break; + + case 'host:map': + case 'host:element': + case 'host:text': + case 'host:regexp': + $legacyAccessType = eZSiteAccess::TYPE_HTTP_HOST; + break; + + case 'port': + $legacyAccessType = eZSiteAccess::TYPE_PORT; + break; + + default: + $legacyAccessType = eZSiteAccess::TYPE_CUSTOM; + } + + // uri_part + $pathinfo = str_replace( $request->attributes->get( 'viewParametersString' ), '', $request->getPathInfo() ); + $semanticPathinfo = $request->attributes->get( 'semanticPathinfo', $pathinfo ); + if ( $pathinfo != $semanticPathinfo ) + { + $aPathinfo = explode( '/', substr( $pathinfo, 1 ) ); + $aSemanticPathinfo = explode( '/', substr( $semanticPathinfo, 1 ) ); + $uriPart = array_diff( $aPathinfo, $aSemanticPathinfo ); + } + + $event->getParameters()->set( + 'siteaccess', + array( + 'name' => $siteAccess->name, + 'type' => $legacyAccessType, + 'uri_part' => $uriPart + ) + ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/routing.yml b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/routing.yml new file mode 100644 index 0000000..5d514bd --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/routing.yml @@ -0,0 +1,11 @@ +# Internal legacy routes +_ezpublishLegacyTreeMenu: + pattern: /content/treemenu/{nodeId}/{modified}/{expiry}/{perm} + defaults: + _controller: ezpublish_legacy.treemenu.controller:viewMenu + _format: json + +ezpublishSetup: + pattern: /ezsetup + defaults: + _controller: ezpublish_legacy.setup.controller:init \ No newline at end of file diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/security.yml b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/security.yml new file mode 100644 index 0000000..c3358d7 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/security.yml @@ -0,0 +1,12 @@ +parameters: + ezpublish_legacy.security.firewall_listener.class: eZ\Publish\Core\MVC\Legacy\Security\Firewall\LegacyListener + +services: + ezpublish_legacy.security.firewall_listener: + class: %ezpublish_legacy.security.firewall_listener.class% + abstract: true + arguments: + - @security.context + - @security.authentication.manager + - ~ # Will be replaced at compile time by the security factory to be the right user provider + - @?logger diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml new file mode 100644 index 0000000..94775ce --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/services.yml @@ -0,0 +1,154 @@ +parameters: + # Below default parameters, to be defined in ezpublish/config/config.yml + #ezpublish_legacy.enabled: false + #ezpublish_legacy.root_dir: ~ + + ezpublish_legacy.kernel.lazy_loader.class: eZ\Publish\Core\MVC\Legacy\Kernel\Loader + ezpublish_legacy.kernel_handler.class: ezpKernelHandler + ezpublish_legacy.kernel_handler.web.class: ezpKernelWeb + ezpublish_legacy.kernel_handler.treemenu.class: ezpKernelTreeMenu + + ezpublish_legacy.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacyKernelController + ezpublish_legacy.treemenu.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacyTreeMenuController + ezpublish_legacy.treemenu.controller.options: {} + ezpublish_legacy.setup.controller.class: eZ\Bundle\EzPublishLegacyBundle\Controller\LegacySetupController + + ezpublish_legacy.kernel_handler.cli.class: eZ\Publish\Core\MVC\Legacy\Kernel\CLIHandler + ezpublish_legacy.kernel_handler.cli.options: {} + + ezpublish_legacy.router.class: eZ\Bundle\EzPublishLegacyBundle\Routing\FallbackRouter + ezpublish_legacy.url_generator.class: eZ\Bundle\EzPublishLegacyBundle\Routing\UrlGenerator + ezpublish_legacy.siteaccess_mapper.class: eZ\Bundle\EzPublishLegacyBundle\LegacyMapper\SiteAccess + ezpublish_legacy.session_mapper.class: eZ\Bundle\EzPublishLegacyBundle\LegacyMapper\Session + ezpublish_legacy.configuration_mapper.class: eZ\Bundle\EzPublishLegacyBundle\LegacyMapper\Configuration + ezpublish_legacy.configuration_mapper.options: + imagemagick_enabled: %ezpublish.image.imagemagick.enabled% + imagemagick_executable_path: %ezpublish.image.imagemagick.executable_path% + imagemagick_executable: %ezpublish.image.imagemagick.executable% + imagemagick_filters: %ezpublish.image.imagemagick.filters% + ezpublish_legacy.content_exception_handler.class: eZ\Publish\Core\MVC\Legacy\EventListener\APIContentExceptionListener + ezpublish_legacy.config.resolver.class: eZ\Bundle\EzPublishLegacyBundle\DependencyInjection\Configuration\LegacyConfigResolver + ezpublish_legacy.config.default_scope: site + ezpublish_legacy.setup_wizard.configuration_converter.class: eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationConverter + ezpublish_legacy.setup_wizard.configuration_dumper.class: eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper + # Environments to pre-generate config file for + ezpublish_legacy.setup_wizard.configuration_dumper.environments: [dev, prod] + # Non-supported packages will have url_alias_router to false + ezpublish_legacy.setup_wizard.supported_packages: [ezdemo_site, ezdemo_site_clean] + ezpublish_legacy.fieldType.ezimage.variation_service.class: eZ\Publish\Core\MVC\Legacy\Image\AliasGenerator + +services: + ezpublish_legacy.kernel: + alias: ezpublish_legacy.kernel.lazy + + ezpublish_legacy.kernel.lazy: + class: Closure + factory_service: ezpublish_legacy.kernel.lazy_loader + factory_method: buildLegacyKernel + arguments: [@ezpublish_legacy.kernel_handler] + + ezpublish_legacy.kernel.lazy_loader: + class: %ezpublish_legacy.kernel.lazy_loader.class% + arguments: + - %ezpublish_legacy.root_dir% + - %webroot_dir% + - @?logger + + ezpublish_legacy.kernel_handler.web: + class: %ezpublish_legacy.kernel_handler.class% + factory_service: ezpublish_legacy.kernel.lazy_loader + factory_method: buildLegacyKernelHandlerWeb + arguments: [@service_container, %ezpublish_legacy.kernel_handler.web.class%] + + ezpublish_legacy.kernel_handler.treemenu: + class: %ezpublish_legacy.kernel_handler.treemenu.class% + factory_service: ezpublish_legacy.kernel.lazy_loader + factory_method: buildLegacyKernelHandlerTreeMenu + arguments: [@service_container] + + ezpublish_legacy.kernel_handler.cli: + class: %ezpublish_legacy.kernel_handler.cli.class% + factory_service: ezpublish_legacy.kernel.lazy_loader + factory_method: buildLegacyKernelHandlerCLI + arguments: [@service_container] + + ezpublish_legacy.kernel_handler: + alias: ezpublish_legacy.kernel_handler.web + + ezpublish_legacy.controller: + class: %ezpublish_legacy.controller.class% + arguments: [@ezpublish_legacy.kernel, @templating] + + ezpublish_legacy.treemenu.controller: + class: %ezpublish_legacy.treemenu.controller.class% + arguments: + - @ezpublish_legacy.kernel_handler.treemenu + - @ezpublish_legacy.kernel.lazy_loader + - %ezpublish_legacy.treemenu.controller.options% + parent: ezpublish.controller.base + scope: request + + ezpublish_legacy.setup.controller: + class: %ezpublish_legacy.setup.controller.class% + parent: ezpublish.controller.base + arguments: [@ezpublish_legacy.kernel, @ezpublish_legacy.config.resolver] + + ezpublish_legacy.router: + class: %ezpublish_legacy.router.class% + arguments: [@service_container, @?request_context, @?logger] + tags: + - {name: router, priority: -255} + + ezpublish_legacy.url_generator: + class: %ezpublish_legacy.url_generator.class% + arguments: [@ezpublish_legacy.kernel] + parent: ezpublish.url_generator.base + + ezpublish_legacy.siteaccess_mapper: + class: %ezpublish_legacy.siteaccess_mapper.class% + arguments: [@service_container] + tags: + - { name: kernel.event_subscriber } + + ezpublish_legacy.session_mapper: + class: %ezpublish_legacy.session_mapper.class% + arguments: [@service_container] + tags: + - { name: kernel.event_subscriber } + + ezpublish_legacy.configuration_mapper: + class: %ezpublish_legacy.configuration_mapper.class% + arguments: + - @ezpublish.config.resolver.core + - @ezpublish.http_cache.purger + - %ezpublish_legacy.configuration_mapper.options% + tags: + - { name: kernel.event_subscriber } + + ezpublish_legacy.content_exception_handler: + class: %ezpublish_legacy.content_exception_handler.class% + arguments: [@ezpublish_legacy.content_view_provider, @ezpublish_legacy.location_view_provider, @?logger] + tags: + - { name: kernel.event_subscriber } + + ezpublish_legacy.config.resolver: + class: %ezpublish_legacy.config.resolver.class% + arguments: [@ezpublish_legacy.kernel, %ezpublish_legacy.config.default_scope%] + tags: + - { name: ezpublish.config.resolver, priority: -255 } + + ezpublish_legacy.setup_wizard.configuration_converter: + class: %ezpublish_legacy.setup_wizard.configuration_converter.class% + arguments: [@ezpublish_legacy.config.resolver, @ezpublish_legacy.kernel, %ezpublish_legacy.setup_wizard.supported_packages%] + + ezpublish_legacy.setup_wizard.configuration_dumper: + class: %ezpublish_legacy.setup_wizard.configuration_dumper.class% + arguments: [@filesystem, %ezpublish_legacy.setup_wizard.configuration_dumper.environments%, %kernel.root_dir%, %kernel.cache_dir%] + + # Image alias generator using legacy + ezpublish_legacy.fieldType.ezimage.variation_service: + class: %ezpublish_legacy.fieldType.ezimage.variation_service.class% + arguments: [@ezpublish_legacy.kernel] + + ezpublish.fieldType.ezimage.variation_service: + alias: ezpublish_legacy.fieldType.ezimage.variation_service diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/templating.yml b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/templating.yml new file mode 100644 index 0000000..658b7ef --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/templating.yml @@ -0,0 +1,30 @@ +parameters: + ezpublish_legacy.twig.extension.class: eZ\Publish\Core\MVC\Legacy\Templating\Twig\Extension\LegacyExtension + ezpublish_legacy.templating.api_content_converter.class: eZ\Publish\Core\MVC\Legacy\Templating\Converter\ApiContentConverter + ezpublish_legacy.templating.delegating_converter.class: eZ\Publish\Core\MVC\Legacy\Templating\Converter\DelegatingConverter + ezpublish_legacy.templating.generic_converter.class: eZ\Publish\Core\MVC\Legacy\Templating\Converter\GenericConverter + +services: + ezpublish_legacy.twig.extension: + class: %ezpublish_legacy.twig.extension.class% + arguments: [@ezpublish_legacy.kernel, @ezpublish_legacy.templating.delegating_converter] + tags: + - {name: twig.extension} + + ezpublish_legacy.templating.generic_converter: + class: %ezpublish_legacy.templating.generic_converter.class% + + ezpublish_legacy.templating.delegating_converter: + class: %ezpublish_legacy.templating.delegating_converter.class% + arguments: [@ezpublish_legacy.templating.generic_converter] + + ezpublish_legacy.templating.object_converter: + alias: ezpublish_legacy.templating.delegating_converter + + ezpublish_legacy.templating.api_content_converter: + class: %ezpublish_legacy.templating.api_content_converter.class% + arguments: [@ezpublish_legacy.kernel] + tags: + - {name: ezpublish_legacy.templating.converter, for: %ezpublish.api.content.class%} + - {name: ezpublish_legacy.templating.converter, for: %ezpublish.api.location.class%} + diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/config/view.yml b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/view.yml new file mode 100644 index 0000000..9773ba0 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/config/view.yml @@ -0,0 +1,37 @@ +parameters: + ezpublish_legacy.view_provider.class: eZ\Publish\Core\MVC\Legacy\View\Provider + ezpublish_legacy.content_view_provider.class: eZ\Publish\Core\MVC\Legacy\View\Provider\Content + ezpublish_legacy.location_view_provider.class: eZ\Publish\Core\MVC\Legacy\View\Provider\Location + ezpublish_legacy.view_decorator.twig.class: eZ\Publish\Core\MVC\Legacy\View\TwigContentViewLayoutDecorator + ezpublish_legacy.view_decorator.options: + layout: %ezpublish_legacy.view.default_layout% + viewbaseLayout: %ezpublish.content_view.viewbase_layout% + contentBlockName: %ezpublish.content_view.content_block_name% + +services: + ezpublish_legacy.view_provider: + class: %ezpublish_legacy.view_provider.class% + arguments: [@ezpublish_legacy.kernel, @ezpublish_legacy.view_decorator, @?logger] + abstract: true + + ezpublish_legacy.content_view_provider: + class: %ezpublish_legacy.content_view_provider.class% + parent: ezpublish_legacy.view_provider + tags: + - {name: ezpublish.content_view_provider, priority: -255} + + ezpublish_legacy.location_view_provider: + class: %ezpublish_legacy.location_view_provider.class% + parent: ezpublish_legacy.view_provider + calls: + # Injecting the request, in non strict mode ("=") avoiding this service to be forced in request scope. + - [setRequest, [@request=]] + tags: + - {name: ezpublish.location_view_provider, priority: -255} + + ezpublish_legacy.view_decorator.twig: + class: %ezpublish_legacy.view_decorator.twig.class% + arguments: [@twig, %ezpublish_legacy.view_decorator.options%] + + ezpublish_legacy.view_decorator: + alias: ezpublish_legacy.view_decorator.twig diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/access_denied.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/access_denied.html.twig new file mode 100644 index 0000000..f209cae --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/access_denied.html.twig @@ -0,0 +1,13 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

Access denied

+

You do not have permission to access this area.

+

Possible reasons for this are:

+
    +
  • You are currently not logged in to the site, to get proper access create a new user or login with an existing user.
  • +
  • You misspelled some parts of your URL, try changing it.
  • +
+
+{% endblock %} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/content_not_found.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/content_not_found.html.twig new file mode 100644 index 0000000..06791bb --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/content_not_found.html.twig @@ -0,0 +1,13 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

Not found

+

The resource you requested was not found.

+

Possible reasons for this are:

+
    +
  • The the id or name of the resource was misspelled, try changing it.
  • +
  • The resource no longer exists on the site.
  • +
+
+{% endblock %} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/language_not_found.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/language_not_found.html.twig new file mode 100644 index 0000000..c469e94 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/language_not_found.html.twig @@ -0,0 +1,8 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

Language Not found

+

Invalid language code provided.

+
+{% endblock %} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_disabled.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_disabled.html.twig new file mode 100644 index 0000000..e25e3eb --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_disabled.html.twig @@ -0,0 +1,10 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

Module is disabled

+
    +
  • The module {{ moduleName }} is disabled and cannot be accessed.
  • +
+
+{% endblock %} \ No newline at end of file diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_not_found.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_not_found.html.twig new file mode 100644 index 0000000..f90b19d --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_not_found.html.twig @@ -0,0 +1,14 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

Module not found

+

The requested module {{ moduleName }} could not be found.

+

Possible reasons for this are:

+
    +
  • The module name was misspelled, try changing the URL.
  • +
  • The module does not exist on this site.
  • +
  • This site uses siteaccess matching in the URL and you did not supply one, try inserting a siteaccess name before the module in the URL.
  • +
+
+{% endblock %} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_view_disabled.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_view_disabled.html.twig new file mode 100644 index 0000000..a2f9e63 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_view_disabled.html.twig @@ -0,0 +1,10 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

View is disabled

+
    +
  • The view {{ moduleName }}/{{ viewName }} is disabled and cannot be accessed.
  • +
+
+{% endblock %} \ No newline at end of file diff --git a/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_view_not_found.html.twig b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_view_not_found.html.twig new file mode 100644 index 0000000..0d0800c --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Resources/views/errors/module_view_not_found.html.twig @@ -0,0 +1,14 @@ +{% extends "eZDemoBundle::pagelayout.html.twig" %} + +{% block content %} +
+

View not found

+

The requested view {{ viewName }} could not be found in module {{ moduleName }}.

+

Possible reasons for this are:

+
    +
  • The view name was misspelled, try changing the URL.
  • +
  • The view does not exist for the module .
  • +
  • This site uses siteaccess matching in the URL and you did not supply one, try inserting a siteaccess name before the module in the URL.
  • +
+
+{% endblock %} \ No newline at end of file diff --git a/eZ/Bundle/EzPublishLegacyBundle/Routing/FallbackRouter.php b/eZ/Bundle/EzPublishLegacyBundle/Routing/FallbackRouter.php new file mode 100644 index 0000000..d3791b2 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Routing/FallbackRouter.php @@ -0,0 +1,147 @@ +container = $container; + $this->context = $context = $context ?: new RequestContext; + $this->logger = $logger; + } + + /** + * Sets the request context. + * + * @param \Symfony\Component\Routing\RequestContext $context The context + */ + public function setContext( RequestContext $context ) + { + $this->context = $context; + } + + /** + * Gets the request context. + * + * @return \Symfony\Component\Routing\RequestContext The context + */ + public function getContext() + { + return $this->context; + } + + /** + * Gets the RouteCollection instance associated with this Router. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRouteCollection() + { + // No route registered for legacy fallback, request will be forwarded directly to the legacy kernel + return new RouteCollection(); + } + + /** + * Generates a URL for an eZ Publish legacy fallback route, from the given parameters. + * "module_uri" must be provided as a key in $parameters. The module URI must contain ordered parameters if any + * (e.g. /content/view/full/2, "full", and "2" being regular ordered parameters. See your module definition for more info.). + * All additional named parameters will be passed as unordered params in the form "/()/ + * $params = array( + * 'module_uri' => '/content/view/full/2', + * 'offset' => 30, + * 'limit' => 10 + * ); + * $url = $legacyRouter->generate( 'ez_legacy', $params ); + * // $url will be "/content/view/full/2/(offset)/30/(limit)/10" + * + * + * @param string $name The name of the route + * @param mixed $parameters An array of parameters + * @param boolean $absolute Whether to generate an absolute URL + * + * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException + * @throws \InvalidArgumentException + * + * @return string The generated URL + * + * @api + */ + public function generate( $name, $parameters = array(), $absolute = false ) + { + if ( $name === self::ROUTE_NAME ) + { + if ( !isset( $parameters['module_uri'] ) ) + { + throw new \InvalidArgumentException( 'When generating an eZ Publish legacy fallback route, "uri" parameter must be provided.' ); + } + + $moduleUri = $parameters['module_uri']; + unset( $parameters['module_uri'] ); + // Using service container here because of urlGenerator dependency on legacy kernel which is in the "request" scope. + // So cannot inject it in the constructor since a router is not yet in that scope. + $urlGenerator = $this->container->get( 'ezpublish_legacy.url_generator' ); + return $urlGenerator->generate( $moduleUri, $parameters, $absolute ); + } + + throw new RouteNotFoundException(); + } + + /** + * Tries to match a URL with a set of routes. + * + * If the matcher can not find information, it must throw one of the exceptions documented + * below. + * + * @param string $pathinfo The path info to be parsed (raw format, i.e. not urldecoded) + * + * @return array An array of parameters + * + * @throws ResourceNotFoundException If the resource could not be found + * @throws MethodNotAllowedException If the resource was found but the request method is not allowed + * + * @api + */ + public function match( $pathinfo ) + { + return array( + "_route" => self::ROUTE_NAME, + "_controller" => "ezpublish_legacy.controller:indexAction", + ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Routing/UrlGenerator.php b/eZ/Bundle/EzPublishLegacyBundle/Routing/UrlGenerator.php new file mode 100644 index 0000000..ccc525f --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Routing/UrlGenerator.php @@ -0,0 +1,83 @@ +legacyKernelClosure = $legacyKernelClosure; + } + + /** + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + public function getLegacyKernel() + { + $kernelClosure = $this->legacyKernelClosure; + return $kernelClosure(); + } + + /** + * Generate the URL of an eZ Publish legacy module. + * Existence of the module/view will be checked and an \InvalidArgumentException will be thrown if one or the other don't exist. + * + * @param string $legacyModuleUri The legacy module URI, including ordered params (e.g. "/content/view/full/2" + * @param array $parameters Named parameters for the module/view + * + * @throws \InvalidArgumentException + * + * @return string + */ + public function doGenerate( $legacyModuleUri, array $parameters ) + { + // Removing leading and trailing slashes + if ( strpos( $legacyModuleUri, '/' ) === 0 ) + $legacyModuleUri = substr( $legacyModuleUri, 1 ); + if ( strrpos( $legacyModuleUri, '/' ) === ( strlen( $legacyModuleUri ) - 1 ) ) + $legacyModuleUri = substr( $legacyModuleUri, 0, -1 ); + + list( $moduleName, $viewName ) = explode( '/', $legacyModuleUri ); + + return $this->getLegacyKernel()->runCallback( + function () use ( $legacyModuleUri, $moduleName, $viewName, $parameters ) + { + $module = eZModule::findModule( $moduleName ); + if ( !$module instanceof eZModule ) + throw new \InvalidArgumentException( "Legacy module '$moduleName' doesn't exist. Cannot generate URL." ); + + $moduleViews = $module->attribute( 'views' ); + if ( !isset( $moduleViews[$viewName] ) ) + throw new \InvalidArgumentException( "Legacy module '$moduleName' doesn't have any view named '$viewName'. Cannot generate URL." ); + + $unorderedParams = ''; + foreach ( $parameters as $paramName => $paramValue ) + { + if ( !is_scalar( $paramValue ) ) + continue; + + $unorderedParams .= "/($paramName)/$paramValue"; + } + + return "/$legacyModuleUri$unorderedParams"; + }, + false + ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/SetupWizard/ConfigurationConverter.php b/eZ/Bundle/EzPublishLegacyBundle/SetupWizard/ConfigurationConverter.php new file mode 100644 index 0000000..3c9cacc --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/SetupWizard/ConfigurationConverter.php @@ -0,0 +1,452 @@ +legacyResolver = $legacyResolver; + $this->legacyKernel = $legacyKernel(); + $this->supportedPackages = array_fill_keys( $supportedPackages, true ); + } + + /** + * Converts from legacy settings to an array dumpable to ezpublish.yml + * @param string $sitePackage Name of the chosen install package + * @param string $adminSiteaccess Name of the admin siteaccess + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException + * + * @return array + */ + public function fromLegacy( $sitePackage, $adminSiteaccess ) + { + $settings = array(); + $settings['ezpublish'] = array(); + $settings['ezpublish']['siteaccess'] = array(); + $defaultSiteaccess = $this->getParameter( 'SiteSettings', 'DefaultAccess' ); + $settings['ezpublish']['siteaccess']['default_siteaccess'] = $defaultSiteaccess; + $siteList = $this->getParameter( 'SiteAccessSettings', 'AvailableSiteAccessList' ); + + if ( !is_array( $siteList ) || empty( $siteList ) ) + throw new InvalidArgumentException( 'siteList', 'can not be empty' ); + + if ( !in_array( $adminSiteaccess, $siteList ) ) + throw new InvalidArgumentException( "adminSiteaccess", "Siteaccess $adminSiteaccess wasn't found in SiteAccessSettings.AvailableSiteAccessList" ); + + $settings['ezpublish']['siteaccess']['list'] = $siteList; + $settings['ezpublish']['siteaccess']['groups'] = array(); + $groupName = $sitePackage . '_group'; + $settings['ezpublish']['siteaccess']['groups'][$groupName] = $siteList; + $settings['ezpublish']['siteaccess']['match'] = $this->resolveMatching(); + + $databaseMapping = array( + 'ezmysqli' => 'mysql', + 'eZMySQLiDB' => 'mysql', + 'ezmysql' => 'mysql', + 'eZMySQLDB' => 'mysql', + ); + + $databaseSettings = $this->getGroup( 'DatabaseSettings', 'site.ini', $defaultSiteaccess ); + + $databaseType = $databaseSettings['DatabaseImplementation']; + if ( isset( $databaseMapping[$databaseType] ) ) + $databaseType = $databaseMapping[$databaseType]; + + $settings['ezpublish']['system'] = array(); + $settings['ezpublish']['system'][$groupName] = array(); + $databasePassword = $databaseSettings['Password'] != '' ? $databaseSettings['Password'] : null; + $settings['ezpublish']['system'][$groupName]['database'] = array( + 'type' => $this->mapDatabaseType( $databaseType ), + 'user' => $databaseSettings['User'], + 'password' => $databasePassword, + 'server' => $databaseSettings['Server'], + 'database_name' => $databaseSettings['Database'], + ); + $settings['ezpublish']['system'][$defaultSiteaccess] = array(); + $settings['ezpublish']['system'][$adminSiteaccess] = array(); + + // If package is not supported, all siteaccesses will have individually legacy_mode to true, forcing legacy fallback + if ( !isset( $this->supportedPackages[$sitePackage] ) ) + { + foreach ( $siteList as $siteaccess ) + { + $settings['ezpublish']['system'][$siteaccess] = array( 'legacy_mode' => true ); + } + } + else + { + $settings['ezpublish']['system'][$adminSiteaccess] += array( 'legacy_mode' => true ); + } + + $languages = $this->getLanguages( $siteList, $groupName ); + foreach ( $languages as $siteaccess => $langSettings ) + { + $settings['ezpublish']['system'][$siteaccess]['languages'] = $langSettings; + } + + // FileSettings + $settings['ezpublish']['system'][$groupName]['var_dir'] = + $this->getParameter( 'FileSettings', 'VarDir', 'site.ini', $defaultSiteaccess ); + + // we don't map the default FileSettings.StorageDir value + $storageDir = $this->getParameter( 'FileSettings', 'StorageDir', 'site.ini', $defaultSiteaccess ); + if ( $storageDir !== 'storage' ) + $settings['ezpublish']['system'][$groupName]['storage_dir'] = $storageDir; + + // ImageMagick settings + $imageMagickEnabled = $this->getParameter( 'ImageMagick', 'IsEnabled', 'image.ini', $defaultSiteaccess ); + if ( $imageMagickEnabled == 'true' ) + { + $settings['ezpublish']['imagemagick']['enabled'] = true; + $imageMagickExecutablePath = $this->getParameter( 'ImageMagick', 'ExecutablePath', 'image.ini', $defaultSiteaccess ); + $imageMagickExecutable = $this->getParameter( 'ImageMagick', 'Executable', 'image.ini', $defaultSiteaccess ); + $settings['ezpublish']['imagemagick']['path'] = rtrim( $imageMagickExecutablePath, '/\\' ) . '/' . $imageMagickExecutable; + } + else + { + $settings['ezpublish']['imagemagick']['enabled'] = false; + } + + $variations = $this->getImageVariations( $siteList, $groupName ); + + foreach ( $variations as $siteaccess => $imgSettings ) + { + $settings['ezpublish']['system'][$siteaccess]['image_variations'] = $imgSettings; + } + + // Explicitly set Http cache purge type to "local" + $settings['ezpublish']['http_cache']['purge_type'] = 'local'; + + return $settings; + } + + /** + * Returns the languages list for all siteaccess unless it's the same for + * each one, in this case, it returns the languages list for the group. + * + * @param array $siteList + * @param string $groupName + * + * @return array + */ + protected function getLanguages( array $siteList, $groupName ) + { + $result = array(); + $allSame = true; + $previousSA = null; + foreach ( $siteList as $siteaccess ) + { + $result[$siteaccess] = $this->getParameter( + 'RegionalSettings', 'SiteLanguageList', 'site.ini', $siteaccess + ); + if ( $allSame && $previousSA !== null ) + { + $allSame = ( $result[$previousSA] === $result[$siteaccess] ); + } + $previousSA = $siteaccess; + } + if ( $allSame ) + { + return array( $groupName => $result[$previousSA] ); + } + return $result; + } + + /** + * Returns the image variations settings for all siteaccess unless it's the + * same for each one, in this case, it returns the variations settings for + * the group. This avoids to duplicate the image variations settings + * + * @param array $siteList + * @param string $groupName + * + * @return array + */ + protected function getImageVariations( array $siteList, $groupName ) + { + $result = array(); + $allSame = true; + $previousSA = null; + foreach ( $siteList as $siteaccess ) + { + $result[$siteaccess] = $this->getImageVariationsForSiteaccess( $siteaccess ); + if ( $allSame && $previousSA !== null ) + { + $allSame = ( $result[$previousSA] === $result[$siteaccess] ); + } + $previousSA = $siteaccess; + } + if ( $allSame ) + { + return array( $groupName => $result[$previousSA] ); + } + return $result; + } + + /** + * Returns the image variation settings for the siteaccess + * + * @param string $siteaccess + * + * @return array + */ + protected function getImageVariationsForSiteaccess( $siteaccess ) + { + $variations = array(); + $imageAliasesList = $this->getGroup( 'AliasSettings', 'image.ini', $siteaccess ); + foreach ( $imageAliasesList['AliasList'] as $imageAliasIdentifier ) + { + $variationSettings = array( 'reference' => null, 'filters' => array() ); + $aliasSettings = $this->getGroup( $imageAliasIdentifier, 'image.ini', $siteaccess ); + if ( isset( $aliasSettings['Reference'] ) && $aliasSettings['Reference'] != '' ) + { + $variationSettings['reference'] = $aliasSettings['Reference']; + } + if ( isset( $aliasSettings['Filters'] ) && is_array( $aliasSettings['Filters'] ) ) + { + // parse filters. Format: filtername=param1;param2...paramN + foreach ( $aliasSettings['Filters'] as $filterString ) + { + $filteringSettings = array(); + + if ( strstr( $filterString, '=' ) !== false ) + { + list( $filteringSettings['name'], $filterParams) = explode( '=', $filterString ); + $filterParams = explode( ';', $filterParams ); + + // make sure integers are actually integers, not strings + array_walk( + $filterParams, + function( &$value ) + { + if ( preg_match( '/^[0-9]+$/', $value ) ) + $value = (int)$value; + } + ); + + $filteringSettings['params'] = $filterParams; + } + else + { + $filteringSettings['name'] = $filterString; + } + + $variationSettings['filters'][] = $filteringSettings; + } + } + $variations[$imageAliasIdentifier] = $variationSettings; + } + return $variations; + } + + protected function mapDatabaseType( $databaseType ) + { + $map = array( + 'ezpostgresql' => 'pgsql', + 'postgresql' => 'pgsql' + ); + + return isset( $map[$databaseType] ) ? $map[$databaseType] : $databaseType; + } + + /** + * Returns the contents of the legacy group $groupName. If $file and + * $siteaccess are null, the global value is fetched with the legacy resolver. + * + * @param string $groupName + * @param string|null $namespace + * @param string|null $siteaccess + * + * @return array + */ + public function getGroup( $groupName, $file = null, $siteaccess = null ) + { + if ( $file === null && $siteaccess === null ) + { + // in this case we want the "global" value, no need to use the + // legacy kernel, the legacy resolver is enough + return $this->legacyResolver->getGroup( $groupName ); + } + return $this->legacyKernel->runCallback( + function () use ( $file, $groupName, $siteaccess ) + { + // @todo: do reset injected settings everytime + // and make sure to restore the previous injected settings + eZINI::injectSettings( array() ); + return eZSiteAccess::getIni( $siteaccess, $file )->group( $groupName ); + } + ); + } + + /** + * Returns the value of the legacy parameter $parameterName in $groupName. + * If $file and $siteaccess are null, the global value is fetched with the + * legacy resolver. + * + * @param string $groupName + * @param string $parameterName + * @param string|null $file + * @param string|null $siteaccess + * + * @return array + */ + public function getParameter( $groupName, $parameterName, $file = null, $siteaccess = null ) + { + if ( $file === null && $siteaccess === null ) + { + // in this case we want the "global" value, no need to use the + // legacy kernel, the legacy resolver is enough + return $this->legacyResolver->getParameter( "$groupName.$parameterName" ); + } + return $this->legacyKernel->runCallback( + function () use ( $file, $groupName, $parameterName, $siteaccess ) + { + // @todo: do reset injected settings everytime + // and make sure to restore the previous injected settings + eZINI::injectSettings( array() ); + return eZSiteAccess::getIni( $siteaccess, $file ) + ->variable( $groupName, $parameterName ); + } + ); + } + + protected function resolveMatching() + { + $siteaccessSettings = $this->getGroup( 'SiteAccessSettings' ); + + $matching = array(); $match = false; + foreach ( explode( ';', $siteaccessSettings['MatchOrder'] ) as $matchMethod ) + { + switch( $matchMethod ) + { + case 'uri': + $match = $this->resolveURIMatching( $siteaccessSettings ); + break; + case 'host': + $match = $this->resolveHostMatching( $siteaccessSettings ); + break; + case 'host_uri': + // @todo Not implemented yet + $match = false; + break; + case 'port': + $match = array( 'Map\Port' => $this->getGroup( 'PortAccessSettings' ) ); + break; + } + if ( $match !== false ) + { + $matching = $match + $matching; + } + } + return $matching; + } + + protected function resolveUriMatching( $siteaccessSettings ) + { + switch( $siteaccessSettings['URIMatchType'] ) + { + case 'disabled': + return false; + + case 'map': + return array( "Map\\Uri" => $this->resolveMapMatch( $siteaccessSettings['URIMatchMapItems'] ) ); + + case 'element': + return array( "URIElement" => $siteaccessSettings['URIMatchElement'] ); + + case 'text': + return array( "URIText" => $this->resolveTextMatch( $siteaccessSettings, 'URIMatchSubtextPre', 'URIMatchSubtextPost' ) ); + + case 'regexp': + return array( "Regex\\URI" => array( $siteaccessSettings['URIMatchRegexp'], $siteaccessSettings['URIMatchRegexpItem'] ) ); + } + } + + /** + * Parses Legacy HostMatching settings to a matching array + * @param mixed[] $siteaccessSettings + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException + * + * @return array|bool + */ + protected function resolveHostMatching( $siteaccessSettings ) + { + switch( $siteaccessSettings['HostMatchType'] ) + { + case 'disabled': + return false; + + case 'map': + return array( "Map\\Host" => $this->resolveMapMatch( $siteaccessSettings['HostMatchMapItems'] ) ); + + case 'element': + return array( "HostElement" => $siteaccessSettings['HostMatchElement'] ); + + case 'text': + return array( "HostText" => $this->resolveTextMatch( $siteaccessSettings, 'HostMatchSubtextPre', 'HostMatchSubtextPost' ) ); + + case 'regexp': + return array( "Regex\\Host" => array( $siteaccessSettings['HostMatchRegexp'], $siteaccessSettings['HostMatchRegexpItem'] ) ); + + default: + throw new InvalidArgumentException( "HostMatchType", "Invalid value for legacy setting site.ini '{$siteaccessSettings['HostMatchType']}'" ); + } + } + + protected function resolveTextMatch( $siteaccessSettings, $prefixKey, $suffixKey ) + { + $settings = array(); + if ( isset( $siteaccessSettings[$prefixKey] ) ) + $settings['prefix'] = $siteaccessSettings[$prefixKey]; + if ( isset( $siteaccessSettings[$suffixKey] ) ) + $settings['suffix'] = $siteaccessSettings[$suffixKey]; + + return $settings; + } + + protected function resolveMapMatch( $mapArray ) + { + $map = array(); + foreach ( $mapArray as $mapItem ) + { + $elements = explode( ';', $mapItem ); + $map[$elements[0]] = count( $elements ) > 2 ? array_slice( $elements, 1 ) : $elements[1]; + } + + return $map; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/SetupWizard/ConfigurationDumper.php b/eZ/Bundle/EzPublishLegacyBundle/SetupWizard/ConfigurationDumper.php new file mode 100644 index 0000000..2d482fc --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/SetupWizard/ConfigurationDumper.php @@ -0,0 +1,125 @@ +fs = $fs; + $this->rootDir = $rootDir; + $this->cacheDir = $cacheDir; + $this->envs = array_fill_keys( $envs, true ); + } + + /** + * Adds an environment to dump a configuration file for. + * + * @param string $env + */ + public function addEnvironment( $env ) + { + $this->envs[$env] = true; + } + + /** + * Dumps settings contained in $configArray in ezpublish.yml + * + * @param array $configArray Hash of settings. + * @param int $options A binary combination of options. See class OPT_* class constants in {@link \eZ\Publish\Core\MVC\Symfony\ConfigDumperInterface} + * + * @return void + */ + public function dump( array $configArray, $options = ConfigDumperInterface::OPT_DEFAULT ) + { + $configPath = "$this->rootDir/config"; + $mainConfigFile = "$configPath/ezpublish.yml"; + if ( $this->fs->exists( $mainConfigFile ) && $options & static::OPT_BACKUP_CONFIG ) + { + $this->backupConfigFile( $mainConfigFile ); + } + + file_put_contents( $mainConfigFile, Yaml::dump( $configArray, 7 ) ); + + // Now generates environment config files + foreach ( array_keys( $this->envs ) as $env ) + { + $configFile = "$configPath/ezpublish_{$env}.yml"; + // Add the import statement for the root YAML file + $envConfigArray = array( + 'imports' => array( array( 'resource' => 'ezpublish.yml' ) ) + ); + + // File already exists, handle possible options + if ( $this->fs->exists( $configFile ) && $options & static::OPT_BACKUP_CONFIG ) + { + $this->backupConfigFile( $configFile ); + } + + file_put_contents( $configFile, Yaml::dump( $envConfigArray, 7 ) ); + } + + $this->clearCache(); + } + + /** + * Makes a backup copy of $configFile. + * + * @param string $configFile + * + * @return void + */ + protected function backupConfigFile( $configFile ) + { + if ( $this->fs->exists( $configFile ) ) + $this->fs->copy( $configFile, $configFile . '-' . date( 'Y-m-d_H-i-s' ) ); + } + + /** + * Clears the configuration cache. + */ + protected function clearCache() + { + $oldCacheDirName = "{$this->cacheDir}_old"; + $this->fs->rename( $this->cacheDir, $oldCacheDirName ); + $this->fs->remove( $oldCacheDirName ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Tests/SetupWizard/ConfigurationConverterTest.php b/eZ/Bundle/EzPublishLegacyBundle/Tests/SetupWizard/ConfigurationConverterTest.php new file mode 100644 index 0000000..f0b3b3d --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Tests/SetupWizard/ConfigurationConverterTest.php @@ -0,0 +1,467 @@ +getMock( + 'eZ\\Bundle\\EzPublishLegacyBundle\\SetupWizard\\ConfigurationConverter', + array( + 'getParameter', + 'getGroup' + ), + $constructorParams + ); + } + + /** + * @param string $package + * @param string $adminSiteaccess + * @param array $mockParameters + * @param mixed $expectedResult + * @param string $exception exception type, if expected + * + * @throws \Exception + * + * @return void + * @internal param $mockParameter + * + * @dataProvider providerForTestFromLegacy + */ + public function testFromLegacy( $package, $adminSiteaccess, $mockParameters, $expectedResult, $exception = null ) + { + $configurationConverter = $this->getConfigurationConverterMock( + array( + $this->getLegacyConfigResolverMock(), + $this->getLegacyKernelMock(), + array( $package ) + ) + ); + foreach ( $mockParameters as $method => $callbackMap ) + { + $configurationConverter->expects( $this->any() ) + ->method( $method ) + ->will( + $this->returnCallback( + $this->convertMapToCallback( $callbackMap ) + ) + ); + } + + try + { + $result = $configurationConverter->fromLegacy( $package, $adminSiteaccess ); + } + catch ( \Exception $e ) + { + if ( $exception !== null && $e instanceof $exception ) + { + return; + } + else + { + throw $e; + } + } + self::assertEquals( + $expectedResult, + $result + ); + } + + /** + * Converts a map of arguments + return value to a callback in order to allow exceptions + * + * @param array[] $callbackMap array of callback parameter arrays [0..n-1 => arguments, n => return value] + * + * @return callable + */ + protected function convertMapToCallback( $callbackMap ) + { + return function() use ( $callbackMap ) + { + foreach ( $callbackMap as $map ) + { + $mapArguments = array_slice( $map, 0, -1 ); + // pad the call arguments array with nulls to match the map + $callArguments = array_pad( func_get_args(), count( $mapArguments ), null ); + + if ( count( array_diff( $callArguments, $mapArguments ) ) == 0 ) + { + $return = $map[count( $map ) - 1]; + if ( is_callable( $return ) ) + return $return(); + else + return $return; + } + } + throw new \Exception( "No callback match found for " . var_export( func_get_args(), true ) ); + }; + } + + public function providerForTestFromLegacy() + { + define( 'IDX_PACKAGE', 0 ); + define( 'IDX_ADMIN_SITEACCESS', 1 ); + define( 'IDX_MOCK_PARAMETERS', 2 ); + define( 'IDX_EXPECTED_RESULT', 3 ); + define( 'IDX_EXCEPTION', 4 ); + + $commonResult = array( + 'ezpublish' => array( + 'siteaccess' => array( + 'default_siteaccess' => 'eng', + 'list' => array( + 0 => 'eng', + 1 => 'ezdemo_site', + 2 => 'ezdemo_site_admin', + ), + 'groups' => array( + 'ezdemo_group' => array( + 0 => 'eng', + 1 => 'ezdemo_site', + 2 => 'ezdemo_site_admin', + ), + ), + 'match' => array( 'URIElement' => 1 ), + ), + 'system' => array( + 'ezdemo_group' => array( + 'database' => array( + 'type' => 'mysql', + 'user' => 'root', + 'password' => null, + 'server' => 'localhost', + 'database_name' => 'ezdemo', + ), + 'var_dir' => 'var/ezdemo_site', + 'image_variations' => array( + 'large' => array( + 'reference' => null, 'filters' => array( + array( 'name' => 'geometry/scaledownonly', 'params' => array( 360, 440 ) ) + ) + ), + 'infoboximage' => array( + 'reference' => null, 'filters' => array( + array( 'name' => 'geometry/scalewidth', 'params' => array( 75 ) ), + array( 'name' => 'flatten' ) + ) + ), + ), + 'languages' => array( 'eng-GB' ) + ), + 'eng' => array(), + 'ezdemo_site_admin' => array( + 'legacy_mode' => true, + ), + ), + + 'imagemagick' => array( + 'enabled' => true, + 'path' => '/usr/bin/convert', + ), + 'http_cache' => array( 'purge_type' => 'local' ) + ), + ); + + $exceptionType = 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException'; + +// $parameterNotFoundException = function() +// { +// throw new \eZ\Publish\Core\MVC\Exception\ParameterNotFoundException( 'Test', 'test' ); +// }; + + $commonMockParameters = array( + 'getParameter' => array( + 'SiteSettingsDefaultAccess' => array( 'SiteSettings', 'DefaultAccess', null, null, 'eng' ), + 'SiteAccessSettingsAvailableSiteAccessList' => array( 'SiteAccessSettings', 'AvailableSiteAccessList', null, null, array( 'eng', 'ezdemo_site', 'ezdemo_site_admin' ) ), + 'FileSettingsVarDir' => array( 'FileSettings', 'VarDir', 'site.ini', 'eng', 'var/ezdemo_site' ), + 'FileSettingsStorageDir' => array( 'FileSettings', 'StorageDir', 'site.ini', 'eng', 'storage' ), + 'ImageMagickIsEnabled' => array( 'ImageMagick', 'IsEnabled', 'image.ini', 'eng', 'true' ), + 'ImageMagickExecutablePath' => array( 'ImageMagick', 'ExecutablePath', 'image.ini', 'eng', '/usr/bin' ), + 'ImageMagickExecutable' => array( 'ImageMagick', 'Executable', 'image.ini', 'eng', 'convert' ), + 'Languages_eng' => array( 'RegionalSettings', 'SiteLanguageList', 'site.ini', 'eng', array( 'eng-GB' ) ), + 'Languages_demo' => array( 'RegionalSettings', 'SiteLanguageList', 'site.ini', 'ezdemo_site', array( 'eng-GB' ) ), + 'Languages_admin' => array( 'RegionalSettings', 'SiteLanguageList', 'site.ini', 'ezdemo_site_admin', array( 'eng-GB' ) ), + ), + 'getGroup' => array( + 'SiteAccessSettings' => array( + 'SiteAccessSettings', null, null, + array( 'MatchOrder' => 'uri', 'URIMatchType' => 'element', 'URIMatchElement' => 1 ) + ), + 'DatabaseSettings' => array( + 'DatabaseSettings', 'site.ini', 'eng', + array( 'DatabaseImplementation' => 'ezmysqli', 'Server' => 'localhost', 'User' => 'root', 'Password' => '', 'Database' => 'ezdemo' ) + ), + 'AliasSettings' => array( + 'AliasSettings', 'image.ini', 'eng', + array( 'AliasList' => array( 'large', 'infoboximage' ) ) + ), + 'AliasSettings_demo' => array( + 'AliasSettings', 'image.ini', 'ezdemo_site', + array( 'AliasList' => array( 'large', 'infoboximage' ) ) + ), + 'AliasSettings_admin' => array( + 'AliasSettings', 'image.ini', 'ezdemo_site_admin', + array( 'AliasList' => array( 'large', 'infoboximage' ) ) + ), + 'large' => array( + 'large', 'image.ini', 'eng', + array( 'Reference' => '', 'Filters' => array( 'geometry/scaledownonly=360;440' ) ) + ), + 'infoboximage' => array( + 'infoboximage', 'image.ini', 'eng', + array( 'Reference' => '', 'Filters' => array( 'geometry/scalewidth=75', 'flatten' ) ) + ), + 'large_demo' => array( + 'large', 'image.ini', 'ezdemo_site', + array( 'Reference' => '', 'Filters' => array( 'geometry/scaledownonly=360;440' ) ) + ), + 'infoboximage_demo' => array( + 'infoboximage', 'image.ini', 'ezdemo_site', + array( 'Reference' => '', 'Filters' => array( 'geometry/scalewidth=75', 'flatten' ) ) + ), + 'large_admin' => array( + 'large', 'image.ini', 'ezdemo_site_admin', + array( 'Reference' => '', 'Filters' => array( 'geometry/scaledownonly=360;440' ) ) + ), + 'infoboximage_admin' => array( + 'infoboximage', 'image.ini', 'ezdemo_site_admin', + array( 'Reference' => '', 'Filters' => array( 'geometry/scalewidth=75', 'flatten' ) ) + ), + ) + ); + + $baseData = array( 'ezdemo', 'ezdemo_site_admin', $commonMockParameters, $commonResult ); + + $data = array(); + $data[] = $baseData; + + // empty site list => invalid argument exception + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getParameter']['SiteSettingsSiteList'] = array( 'SiteSettings', 'SiteList', null, null, array() ); + $element[IDX_EXCEPTION] = $exceptionType; + $data[] = $element; + + // imagemagick disabled + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getParameter']['ImageMagickIsEnabled'] = array( 'ImageMagick', 'IsEnabled', 'eng', 'image.ini', 'false' ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['imagemagick']['enabled'] = false; + unset( $element[IDX_EXPECTED_RESULT]['ezpublish']['imagemagick']['path'] ); + $data[] = $element; + + // postgresql + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getGroup']['DatabaseSettings'][3]['DatabaseImplementation'] = 'ezpostgresql'; + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['database']['type'] = 'pgsql'; + $data[] = $element; + + // host match, with map + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getGroup']['SiteAccessSettings'] = array( + 'SiteAccessSettings', null, null, array( + 'MatchOrder' => 'host', + 'HostMatchType' => 'map', + 'HostMatchMapItems' => array( 'site.com;eng', 'admin.site.com;ezdemo_site_admin' ) + ) + ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['siteaccess']['match'] = array( + "Map\\Host" => array( 'site.com' => 'eng', 'admin.site.com' => 'ezdemo_site_admin' ) + ); + $data[] = $element; + + // host match, with map + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getGroup']['SiteAccessSettings'] = array( + 'SiteAccessSettings', null, null, array( + 'MatchOrder' => 'host', + 'HostMatchType' => 'map', + 'HostMatchMapItems' => array( 'site.com;eng', 'admin.site.com;ezdemo_site_admin' ) + ) + ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['siteaccess']['match'] = array( + "Map\\Host" => array( 'site.com' => 'eng', 'admin.site.com' => 'ezdemo_site_admin' ) + ); + $data[] = $element; + + // customized storage dir + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getParameter']['FileSettingsStorageDir'] = array( 'FileSettings', 'StorageDir', 'site.ini', 'eng', 'customstorage' ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['storage_dir'] = 'customstorage'; + $data[] = $element; + + // host match, with map + $element = $baseData; + $element[IDX_ADMIN_SITEACCESS] = 'winter'; + $element[IDX_EXCEPTION] = $exceptionType; + $data[] = $element; + + // different alias list for ezdemo_site_admin + // each siteaccess has its own variations list + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getGroup']['AliasSettings_admin'] = array( + 'AliasSettings', 'image.ini', 'ezdemo_site_admin', + array( + 'AliasList' => array( 'large' ) + ) + ); + unset( $element[IDX_MOCK_PARAMETERS]['getGroup']['infoboximage_admin'] ); + + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['eng']['image_variations'] = $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations']; + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site']['image_variations'] = $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations']; + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site_admin']['image_variations'] = $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations']; + unset( $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site_admin']['image_variations']['infoboximage'] ); + unset( $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations'] ); + $data[] = $element; + + // different parameter for an alias in ezdemo_site_admin + // each siteaccess has its own variations list + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getGroup']['large_admin'] = array( + 'large', 'image.ini', 'ezdemo_site_admin', + array( + 'Reference' => '', + 'Filters' => array( 'geometry/scaledownonly=100;100' ) + ) + ); + + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['eng']['image_variations'] = $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations']; + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site']['image_variations'] = $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations']; + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site_admin']['image_variations'] = $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations']; + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site_admin']['image_variations']['large']['filters'][0]['params'] = array( 100, 100 ); + unset( $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['image_variations'] ); + $data[] = $element; + + // several languages and same for all SA + // still only a languages setting in ezdemo_group + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_eng'][4] = array( 'eng-GB', 'fre-FR' ); + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_demo'][4] = array( 'eng-GB', 'fre-FR' ); + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_admin'][4] = array( 'eng-GB', 'fre-FR' ); + + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['languages'] = array( 'eng-GB', 'fre-FR' ); + $data[] = $element; + + // several languages and same list for all SA but not the same order + // no more languages setting in ezdemo_group, one by SA + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_eng'][4] = array( 'eng-GB', 'fre-FR' ); + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_demo'][4] = array( 'fre-FR', 'eng-GB' ); + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_admin'][4] = array( 'eng-GB', 'fre-FR' ); + + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['eng']['languages'] = array( 'eng-GB', 'fre-FR' ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site']['languages'] = array( 'fre-FR', 'eng-GB' ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site_admin']['languages'] = array( 'eng-GB', 'fre-FR' ); + + unset( $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['languages'] ); + $data[] = $element; + + // several languages and different lists for each SA + // no more languages setting in ezdemo_group, one by SA + $element = $baseData; + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_eng'][4] = array( 'eng-GB', 'fre-FR' ); + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_demo'][4] = array( 'Entish', 'Valarin', 'Elvish' ); + $element[IDX_MOCK_PARAMETERS]['getParameter']['Languages_admin'][4] = array( 'Khuzdul', 'Sindarin' ); + + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['eng']['languages'] = array( 'eng-GB', 'fre-FR' ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site']['languages'] = array( 'Entish', 'Valarin', 'Elvish' ); + $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_site_admin']['languages'] = array( 'Khuzdul', 'Sindarin' ); + + unset( $element[IDX_EXPECTED_RESULT]['ezpublish']['system']['ezdemo_group']['languages'] ); + $data[] = $element; + + return $data; + } + + /** + * @param array $methodsToMock + * + * @return \PHPUnit_Framework_MockObject_MockObject|\eZ\Bundle\EzPublishLegacyBundle\DependencyInjection\Configuration\LegacyConfigResolver + */ + protected function getLegacyConfigResolverMock( array $methodsToMock = array() ) + { + $mock = $this + ->getMockBuilder( 'eZ\\Bundle\\EzPublishLegacyBundle\\DependencyInjection\\Configuration\\LegacyConfigResolver' ) + ->setMethods( array_merge( $methodsToMock, array( 'getParameter', 'getGroup' ) ) ) + ->disableOriginalConstructor() + ->getMock(); + + return $mock; + } + + protected function getExpectedResultForTestFromLegacy() + { + return array( + 'ezpublish' => array( + 'siteaccess' => array( + 'default_siteaccess' => 'eng', + 'list' => array( + 0 => 'eng', + 1 => 'ezdemo_site', + 2 => 'ezdemo_site_admin', + ), + 'groups' => array( + 'ezdemo_site_group' => array( + 0 => 'eng', + 1 => 'ezdemo_site', + 2 => 'ezdemo_site_admin', + ), + ), + 'match' => array( + 'URIElement' => 1, + ), + ), + 'system' => array( + 'ezdemo_site_group' => array( + 'database' => array( + 'type' => 'mysql', + 'user' => 'root', + 'password' => null, + 'server' => 'localhost', + 'database_name' => 'ezdemo', + ), + ), + 'ezdemo_site_admin' => array( + 'legacy_mode' => true, + ) + ), + ), + ); + } + + /** + * @return \Closure + */ + protected function getLegacyKernelMock() + { + $legacyKernelMock = $this + ->getMockBuilder( 'eZ\\Publish\\Core\\MVC\\Legacy\\Kernel' ) + ->setMethods( array( 'runCallback' ) ) + ->disableOriginalConstructor() + ->getMock(); + + $legacyKernelMock + ->expects( $this->any() ) + ->method( 'runCallback' ) + ->will( $this->returnValue( 'ezpKernelResult' ) ); + + $closureMock = function() use ( $legacyKernelMock ) + { + return $legacyKernelMock; + }; + + return $closureMock; + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Tests/SetupWizard/ConfigurationDumperTest.php b/eZ/Bundle/EzPublishLegacyBundle/Tests/SetupWizard/ConfigurationDumperTest.php new file mode 100644 index 0000000..70573a0 --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Tests/SetupWizard/ConfigurationDumperTest.php @@ -0,0 +1,177 @@ +fs = $this->getMock( 'Symfony\\Component\\Filesystem\\Filesystem' ); + $this->cacheDir = __DIR__ . '/cache'; + $this->configDir = __DIR__ . '/config'; + @mkdir( $this->configDir ); + $this->envs = array( 'dev', 'prod' ); + } + + protected function tearDown() + { + array_map( 'unlink', glob( "$this->configDir/*.yml" ) ); + rmdir( $this->configDir ); + parent::tearDown(); + } + + private function expectsCacheClear() + { + $this->fs + ->expects( $this->once() ) + ->method( 'rename' ) + ->with( $this->cacheDir, "{$this->cacheDir}_old" ); + + $this->fs + ->expects( $this->once() ) + ->method( 'remove' ) + ->with( "{$this->cacheDir}_old" ); + } + + public function dumpProvider() + { + return array( + array( + array( + 'foo' => 'bar', + 'baz' => null, + 'flag' => true, + 'myArray' => array( 1, 2, 3 ), + 'myHash' => array( 'this' => 'that', 'these' => 'those' ) + ) + ), + array( + array( + 'foo' => 'bar', + 'flag' => true, + 'someArray' => array( 1, 2, 3 ), + 'nestedArray' => array( + 'anotherArray' => array( 'one', 'two', 'three' ), + 'anotherHash' => array( + 'someKey' => 123, + 'anotherFlag' => false, + 'nullValue' => null, + 'emptyArray' => array() + ) + ) + ) + ) + ); + } + + private function assertConfigFileValid( array $configArray ) + { + $configFile = "$this->configDir/ezpublish.yml"; + $this->assertFileExists( $configFile ); + $this->assertEquals( $configArray, Yaml::parse( $configFile ) ); + } + + private function assertEnvConfigFilesValid( array $configArray = array() ) + { + $configArray = array_merge_recursive( + $configArray, + array( + 'imports' => array( array( 'resource' => 'ezpublish.yml' ) ) + ) + ); + + foreach ( $this->envs as $env ) + { + $configFile = "$this->configDir/ezpublish_$env.yml"; + $this->assertFileExists( $configFile ); + $this->assertEquals( $configArray, Yaml::parse( $configFile ) ); + } + } + + /** + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::__construct + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::dump + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::clearCache + * + * @dataProvider dumpProvider + */ + public function testDumpNoPreviousFile( array $configArray ) + { + $this->fs + ->expects( $this->any() ) + ->method( 'exists' ) + ->will( $this->returnValue( false ) ); + $this->expectsCacheClear(); + + $dumper = new ConfigurationDumper( $this->fs, $this->envs, __DIR__, $this->cacheDir ); + $dumper->dump( $configArray ); + $this->assertConfigFileValid( $configArray ); + $this->assertEnvConfigFilesValid(); + } + + /** + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::__construct + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::dump + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::backupConfigFile + * @covers \eZ\Bundle\EzPublishLegacyBundle\SetupWizard\ConfigurationDumper::clearCache + * + * @dataProvider dumpProvider + */ + public function testDumpBackupFile( array $configArray ) + { + $this->fs + ->expects( $this->any() ) + ->method( 'exists' ) + ->will( ( $this->returnValue( true ) ) ); + $this->expectBackup(); + $this->expectsCacheClear(); + + $dumper = new ConfigurationDumper( $this->fs, $this->envs, __DIR__, $this->cacheDir ); + $dumper->dump( $configArray, ConfigDumperInterface::OPT_BACKUP_CONFIG ); + $this->assertConfigFileValid( $configArray ); + $this->assertEnvConfigFilesValid(); + } + + private function expectBackup() + { + $this->fs + ->expects( $this->exactly( count( $this->envs ) + 1 ) ) + ->method( 'copy' ) + ->with( + $this->logicalAnd( + $this->stringStartsWith( "$this->configDir/ezpublish" ), + $this->stringEndsWith( '.yml' ) + ), + $this->logicalAnd( + $this->stringStartsWith( "$this->configDir/ezpublish" ), + $this->stringContains( '.yml-' . date( 'Y-m-d_' ) ) + ) + ); + } +} diff --git a/eZ/Bundle/EzPublishLegacyBundle/Tests/SiteAccess/LegacyMapperTest.php b/eZ/Bundle/EzPublishLegacyBundle/Tests/SiteAccess/LegacyMapperTest.php new file mode 100644 index 0000000..46c9a2f --- /dev/null +++ b/eZ/Bundle/EzPublishLegacyBundle/Tests/SiteAccess/LegacyMapperTest.php @@ -0,0 +1,232 @@ +getContainerMock(); + $container + ->expects( $this->exactly( 1 ) ) + ->method( 'get' ) + ->with( 'ezpublish.siteaccess' ) + ->will( $this->returnValue( $siteaccess ) ); + + $request = $this->getRequestMock(); + $request + ->expects( $this->any() ) + ->method( 'getPathInfo' ) + ->will( $this->returnValue( $pathinfo ) ); + $request->attributes->set( 'semanticPathinfo', $semanticPathinfo ); + + $mapper = new LegacyMapper( $container ); + $bag = new \Symfony\Component\HttpFoundation\ParameterBag(); + $mapper->onBuildKernelWebHandler( + new PreBuildKernelWebHandlerEvent( + $bag, + $request + ) + ); + self::assertSame( $expectedAccess, $bag->get( 'siteaccess' ) ); + } + + public function siteAccessMatchProvider() + { + return array( + array( + '/some/pathinfo', + '/some/pathinfo', + new SiteAccess( 'foo', 'default' ), + array( + 'name' => 'foo', + 'type' => 1, + 'uri_part' => array() + ) + ), + array( + '/env/matching', + '/env/matching', + new SiteAccess( 'foo', 'env' ), + array( + 'name' => 'foo', + 'type' => 7, + 'uri_part' => array() + ) + ), + array( + '/urimap/matching', + '/urimap/matching', + new SiteAccess( 'foo', 'uri:map' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array() + ) + ), + array( + '/foo/urimap/matching', + '/urimap/matching', + new SiteAccess( 'foo', 'uri:map' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array( 'foo' ) + ) + ), + array( + '/urielement/matching', + '/urielement/matching', + new SiteAccess( 'foo', 'uri:element' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array() + ) + ), + array( + '/foo/bar/urielement/matching', + '/urielement/matching', + new SiteAccess( 'foo', 'uri:element' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array( 'foo', 'bar' ) + ) + ), + array( + '/foo/bar/baz/urielement/matching', + '/urielement/matching', + new SiteAccess( 'foo', 'uri:element' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array( 'foo', 'bar', 'baz' ) + ) + ), + array( + '/uritext/matching', + '/uritext/matching', + new SiteAccess( 'foo', 'uri:text' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array() + ) + ), + array( + '/uriregex/matching', + '/uriregex/matching', + new SiteAccess( 'foo', 'uri:regexp' ), + array( + 'name' => 'foo', + 'type' => 2, + 'uri_part' => array() + ) + ), + array( + '/hostmap/matching', + '/hostmap/matching', + new SiteAccess( 'foo', 'host:map' ), + array( + 'name' => 'foo', + 'type' => 4, + 'uri_part' => array() + ) + ), + array( + '/hostelement/matching', + '/hostelement/matching', + new SiteAccess( 'foo', 'host:element' ), + array( + 'name' => 'foo', + 'type' => 4, + 'uri_part' => array() + ) + ), + array( + '/hosttext/matching', + '/hosttext/matching', + new SiteAccess( 'foo', 'host:text' ), + array( + 'name' => 'foo', + 'type' => 4, + 'uri_part' => array() + ) + ), + array( + '/hostregex/matching', + '/hostregex/matching', + new SiteAccess( 'foo', 'host:regexp' ), + array( + 'name' => 'foo', + 'type' => 4, + 'uri_part' => array() + ) + ), + array( + '/port/matching', + '/port/matching', + new SiteAccess( 'foo', 'port' ), + array( + 'name' => 'foo', + 'type' => 3, + 'uri_part' => array() + ) + ), + array( + '/custom/matching', + '/custom/matching', + new SiteAccess( 'foo', 'custom_match' ), + array( + 'name' => 'foo', + 'type' => 10, + 'uri_part' => array() + ) + ), + ); + } + + /** + * @param array $methodsToMock + * + * @return \PHPUnit_Framework_MockObject_MockObject|\Symfony\Component\HttpFoundation\Request + */ + private function getRequestMock( array $methodsToMock = array() ) + { + return $this + ->getMockBuilder( 'Symfony\\Component\\HttpFoundation\\Request' ) + ->setMethods( array_merge( array( 'getPathInfo' ), $methodsToMock ) ) + ->getMock(); + } + + /** + * @param array $methodsToMock + * + * @return \PHPUnit_Framework_MockObject_MockObject|\Symfony\Component\DependencyInjection\ContainerInterface + */ + private function getContainerMock( array $methodsToMock = array() ) + { + return $this + ->getMockBuilder( 'Symfony\\Component\\DependencyInjection\\ContainerInterface' ) + ->setMethods( $methodsToMock ) + ->getMock(); + } +} diff --git a/eZ/Bundle/EzPublishRestBundle/ApiLoader/Factory.php b/eZ/Bundle/EzPublishRestBundle/ApiLoader/Factory.php new file mode 100644 index 0000000..70612d0 --- /dev/null +++ b/eZ/Bundle/EzPublishRestBundle/ApiLoader/Factory.php @@ -0,0 +1,350 @@ +container = $container; + $this->repository = $repository; + } + + public function buildInputDispatcher() + { + /** @var \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler */ + $urlHandler = $this->container->get( 'ezpublish_rest.url_handler' ); + + /** @var \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools */ + $parserTools = $this->container->get( 'ezpublish_rest.parser_tools' ); + + /** @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser */ + $fieldTypeParser = $this->container->get( 'ezpublish_rest.field_type_parser' ); + + return new Common\Input\Dispatcher( + new Common\Input\ParsingDispatcher( + array( + 'application/vnd.ez.api.RoleInput' => new Input\Parser\RoleInput( $urlHandler, $this->repository->getRoleService(), $parserTools ), + 'application/vnd.ez.api.SectionInput' => new Input\Parser\SectionInput( $urlHandler, $this->repository->getSectionService() ), + 'application/vnd.ez.api.ContentCreate' => new Input\Parser\ContentCreate( + $urlHandler, + $this->repository->getContentService(), + $this->repository->getContentTypeService(), + $fieldTypeParser, + // Needed here since there's no media type in request for embedded LocationCreate + ( $locationCreateParser = new Input\Parser\LocationCreate( $urlHandler, $this->repository->getLocationService(), $parserTools ) ), + $parserTools + ), + 'application/vnd.ez.api.VersionUpdate' => new Input\Parser\VersionUpdate( + $urlHandler, + $this->repository->getContentService(), + $fieldTypeParser + ), + 'application/vnd.ez.api.UserGroupCreate' => new Input\Parser\UserGroupCreate( + $urlHandler, + $this->repository->getUserService(), + $this->repository->getContentTypeService(), + $fieldTypeParser + ), + 'application/vnd.ez.api.UserCreate' => new Input\Parser\UserCreate( + $urlHandler, + $this->repository->getUserService(), + $this->repository->getContentTypeService(), + $fieldTypeParser, + $parserTools + ), + 'application/vnd.ez.api.ContentUpdate' => new Input\Parser\ContentUpdate( $urlHandler ), + 'application/vnd.ez.api.UserGroupUpdate' => new Input\Parser\UserGroupUpdate( + $urlHandler, + $this->repository->getUserService(), + $this->repository->getContentService(), + $this->repository->getLocationService(), + $fieldTypeParser + ), + 'application/vnd.ez.api.UserUpdate' => new Input\Parser\UserUpdate( + $urlHandler, + $this->repository->getUserService(), + $this->repository->getContentService(), + $fieldTypeParser, + $parserTools + ), + 'application/vnd.ez.api.ContentTypeGroupInput' => new Input\Parser\ContentTypeGroupInput( $urlHandler, $this->repository->getContentTypeService(), $parserTools ), + 'application/vnd.ez.api.ContentTypeCreate' => new Input\Parser\ContentTypeCreate( + $urlHandler, + $this->repository->getContentTypeService(), + // Needed here since there's no media type in request for embedded FieldDefinitionCreate + ( $fieldDefinitionCreateParser = new Input\Parser\FieldDefinitionCreate( $urlHandler, $this->repository->getContentTypeService(), $parserTools ) ), + $parserTools + ), + 'application/vnd.ez.api.ContentTypeUpdate' => new Input\Parser\ContentTypeUpdate( + $urlHandler, + $this->repository->getContentTypeService(), + $parserTools + ), + 'application/vnd.ez.api.FieldDefinitionCreate' => $fieldDefinitionCreateParser, + 'application/vnd.ez.api.FieldDefinitionUpdate' => new Input\Parser\FieldDefinitionUpdate( + $urlHandler, + $this->repository->getContentTypeService(), + $parserTools + ), + 'application/vnd.ez.api.PolicyCreate' => new Input\Parser\PolicyCreate( $urlHandler, $this->repository->getRoleService(), $parserTools ), + 'application/vnd.ez.api.PolicyUpdate' => new Input\Parser\PolicyUpdate( $urlHandler, $this->repository->getRoleService(), $parserTools ), + 'application/vnd.ez.api.RoleAssignInput' => new Input\Parser\RoleAssignInput( $urlHandler, $parserTools ), + 'application/vnd.ez.api.LocationCreate' => $locationCreateParser, + 'application/vnd.ez.api.LocationUpdate' => new Input\Parser\LocationUpdate( $urlHandler, $this->repository->getLocationService(), $parserTools ), + 'application/vnd.ez.api.ObjectStateGroupCreate' => new Input\Parser\ObjectStateGroupCreate( $urlHandler, $this->repository->getObjectStateService(), $parserTools ), + 'application/vnd.ez.api.ObjectStateGroupUpdate' => new Input\Parser\ObjectStateGroupUpdate( $urlHandler, $this->repository->getObjectStateService(), $parserTools ), + 'application/vnd.ez.api.ObjectStateCreate' => new Input\Parser\ObjectStateCreate( $urlHandler, $this->repository->getObjectStateService(), $parserTools ), + 'application/vnd.ez.api.ObjectStateUpdate' => new Input\Parser\ObjectStateUpdate( $urlHandler, $this->repository->getObjectStateService(), $parserTools ), + 'application/vnd.ez.api.ContentObjectStates' => new Input\Parser\ContentObjectStates( $urlHandler ), + 'application/vnd.ez.api.RelationCreate' => new Input\Parser\RelationCreate( $urlHandler ), + 'application/vnd.ez.api.ViewInput' => new Input\Parser\ViewInput( $urlHandler ), + 'application/vnd.ez.api.UrlWildcardCreate' => new Input\Parser\URLWildcardCreate( $urlHandler, $parserTools ), + 'application/vnd.ez.api.UrlAliasCreate' => new Input\Parser\URLAliasCreate( $urlHandler, $parserTools ), + + // internal Media-Types + 'application/vnd.ez.api.internal.criterion.ContentId' => new Input\Parser\Criterion\ContentId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ContentRemoteId' => new Input\Parser\Criterion\ContentRemoteId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ContentTypeGroupId' => new Input\Parser\Criterion\ContentTypeGroupId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ContentTypeId' => new Input\Parser\Criterion\ContentTypeId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ContentTypeIdentifier' => new Input\Parser\Criterion\ContentTypeIdentifier( $urlHandler, $this->repository->getContentTypeService() ), + 'application/vnd.ez.api.internal.criterion.DateMetadata' => new Input\Parser\Criterion\DateMetadata( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.Field' => new Input\Parser\Criterion\Field( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.FullText' => new Input\Parser\Criterion\FullText( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LocationId' => new Input\Parser\Criterion\LocationId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LocationRemoteId' => new Input\Parser\Criterion\LocationRemoteId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LogicalAnd' => new Input\Parser\Criterion\LogicalAnd( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LogicalNot' => new Input\Parser\Criterion\LogicalNot( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LogicalOperator' => new Input\Parser\Criterion\LogicalOperator( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LogicalOr' => new Input\Parser\Criterion\LogicalOr( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.MoreLikeThis' => new Input\Parser\Criterion\MoreLikeThis( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.Operator' => new Input\Parser\Criterion\Operator( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ParentLocationId' => new Input\Parser\Criterion\ParentLocationId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ParentLocationRemoteId' => new Input\Parser\Criterion\ParentLocationRemoteId( $urlHandler, $this->repository->getLocationService() ), + 'application/vnd.ez.api.internal.criterion.SectionIdentifier' => new Input\Parser\Criterion\SectionIdentifier( $urlHandler, $this->repository->getSectionService() ), + 'application/vnd.ez.api.internal.criterion.SectionId' => new Input\Parser\Criterion\SectionId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.Status' => new Input\Parser\Criterion\Status( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.Subtree' => new Input\Parser\Criterion\Subtree( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.UrlAlias' => new Input\Parser\Criterion\UrlAlias( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.UserMetadata' => new Input\Parser\Criterion\UserMetadata( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.ObjectStateId' => new Input\Parser\Criterion\ObjectStateId( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.Visibility' => new Input\Parser\Criterion\Visibility( $urlHandler ), + 'application/vnd.ez.api.internal.criterion.LanguageCode' => new Input\Parser\Criterion\LanguageCode( $urlHandler ), + ) + ), + array( + 'json' => new Common\Input\Handler\Json(), + 'xml' => new Common\Input\Handler\Xml(), + ) + ); + } + + public function buildFieldTypeProcessorRegistry() + { + return new Common\FieldTypeProcessorRegistry( + array( + 'ezimage' => new FieldTypeProcessor\ImageProcessor( + // Config for local temp dir + // @todo get configuration + sys_get_temp_dir(), + // URL schema for image links + // @todo get configuration + 'http://example.com/fancy_site/{variant}/images/{path}', + // Image variants (names only) + // @todo get configuration + array( + 'original' => 'image/jpeg', + 'gallery' => 'image/jpeg', + 'thumbnail' => 'image/png', + ) + ) + ) + ); + } + + public function buildResponseVisitorDispatcher( + Common\URLHandler $urlHandler, + Common\Output\FieldTypeSerializer $fieldTypeSerializer, + Repository $repository ) + { + $valueObjectVisitors = array( + // Errors + + '\\eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException' => new Output\ValueObjectVisitor\InvalidArgumentException( $urlHandler, true ), + '\\eZ\\Publish\\API\\Repository\\Exceptions\\NotFoundException' => new Output\ValueObjectVisitor\NotFoundException( $urlHandler, true ), + '\\eZ\\Publish\\API\\Repository\\Exceptions\\UnauthorizedException' => new Output\ValueObjectVisitor\UnauthorizedException( $urlHandler, true ), + '\\eZ\\Publish\\API\\Repository\\Exceptions\\BadStateException' => new Output\ValueObjectVisitor\BadStateException( $urlHandler, true ), + '\\eZ\\Publish\\Core\\REST\\Server\\Exceptions\\BadRequestException' => new Output\ValueObjectVisitor\BadRequestException( $urlHandler, true ), + '\\eZ\\Publish\\Core\\REST\\Server\\Exceptions\\ForbiddenException' => new Output\ValueObjectVisitor\ForbiddenException( $urlHandler, true ), + '\\Exception' => new Output\ValueObjectVisitor\Exception( $urlHandler, true ), + + // Section + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\SectionList' => new Output\ValueObjectVisitor\SectionList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedSection' => new Output\ValueObjectVisitor\CreatedSection( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Section' => new Output\ValueObjectVisitor\Section( $urlHandler ), + + // URLWildcard + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\URLWildcardList' => new Output\ValueObjectVisitor\URLWildcardList( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\URLWildcard' => new Output\ValueObjectVisitor\URLWildcard( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedURLWildcard' => new Output\ValueObjectVisitor\CreatedURLWildcard( $urlHandler ), + + // URLAlias + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\URLAliasList' => new Output\ValueObjectVisitor\URLAliasList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\URLAliasRefList' => new Output\ValueObjectVisitor\URLAliasRefList( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias' => new Output\ValueObjectVisitor\URLAlias( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedURLAlias' => new Output\ValueObjectVisitor\CreatedURLAlias( $urlHandler ), + + // Content + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ContentList' => new Output\ValueObjectVisitor\ContentList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestContent' => new Output\ValueObjectVisitor\RestContent( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedContent' => new Output\ValueObjectVisitor\CreatedContent( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\VersionList' => new Output\ValueObjectVisitor\VersionList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedVersion' => new Output\ValueObjectVisitor\CreatedVersion( $urlHandler, $fieldTypeSerializer ), + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo' => new Output\ValueObjectVisitor\VersionInfo( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\Version' => new Output\ValueObjectVisitor\Version( + $urlHandler, + $fieldTypeSerializer + ), + + // UserGroup + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserGroup' => new Output\ValueObjectVisitor\RestUserGroup( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedUserGroup' => new Output\ValueObjectVisitor\CreatedUserGroup( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\UserGroupList' => new Output\ValueObjectVisitor\UserGroupList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\UserGroupRefList' => new Output\ValueObjectVisitor\UserGroupRefList( $urlHandler ), + + // User + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\UserList' => new Output\ValueObjectVisitor\UserList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\UserRefList' => new Output\ValueObjectVisitor\UserRefList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedUser' => new Output\ValueObjectVisitor\CreatedUser( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestUser' => new Output\ValueObjectVisitor\RestUser( $urlHandler ), + + // ContentType + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestContentType' => new Output\ValueObjectVisitor\RestContentType( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedContentType' => new Output\ValueObjectVisitor\CreatedContentType( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ContentTypeList' => new Output\ValueObjectVisitor\ContentTypeList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ContentTypeInfoList' => new Output\ValueObjectVisitor\ContentTypeInfoList( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup' => new Output\ValueObjectVisitor\ContentTypeGroup( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedContentTypeGroup' => new Output\ValueObjectVisitor\CreatedContentTypeGroup( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ContentTypeGroupList' => new Output\ValueObjectVisitor\ContentTypeGroupList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ContentTypeGroupRefList' => new Output\ValueObjectVisitor\ContentTypeGroupRefList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\FieldDefinitionList' => new Output\ValueObjectVisitor\FieldDefinitionList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedFieldDefinition' => new Output\ValueObjectVisitor\CreatedFieldDefinition( + $urlHandler, + $fieldTypeSerializer + ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestFieldDefinition' => new Output\ValueObjectVisitor\RestFieldDefinition( + $urlHandler, + $fieldTypeSerializer + ), + + // Relation + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RelationList' => new Output\ValueObjectVisitor\RelationList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestRelation' => new Output\ValueObjectVisitor\RestRelation( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedRelation' => new Output\ValueObjectVisitor\CreatedRelation( $urlHandler ), + + // Role + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RoleList' => new Output\ValueObjectVisitor\RoleList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedRole' => new Output\ValueObjectVisitor\CreatedRole( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Role' => new Output\ValueObjectVisitor\Role( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Policy' => new Output\ValueObjectVisitor\Policy( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedPolicy' => new Output\ValueObjectVisitor\CreatedPolicy( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\PolicyList' => new Output\ValueObjectVisitor\PolicyList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RoleAssignmentList' => new Output\ValueObjectVisitor\RoleAssignmentList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserRoleAssignment' => new Output\ValueObjectVisitor\RestUserRoleAssignment( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserGroupRoleAssignment' => new Output\ValueObjectVisitor\RestUserGroupRoleAssignment( $urlHandler ), + + // Location + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedLocation' => new Output\ValueObjectVisitor\CreatedLocation( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestLocation' => new Output\ValueObjectVisitor\RestLocation( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\LocationList' => new Output\ValueObjectVisitor\LocationList( $urlHandler ), + + // Trash + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\Trash' => new Output\ValueObjectVisitor\Trash( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestTrashItem' => new Output\ValueObjectVisitor\RestTrashItem( $urlHandler ), + + // Views + + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestExecutedView' => new Output\ValueObjectVisitor\RestExecutedView( + $urlHandler, + $repository->getLocationService(), + $repository->getContentService() + ), + + // Object state + + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup' => new Output\ValueObjectVisitor\ObjectStateGroup( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedObjectStateGroup' => new Output\ValueObjectVisitor\CreatedObjectStateGroup( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ObjectStateGroupList' => new Output\ValueObjectVisitor\ObjectStateGroupList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Common\\Values\\RestObjectState' => new Output\ValueObjectVisitor\RestObjectState( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\CreatedObjectState' => new Output\ValueObjectVisitor\CreatedObjectState( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ObjectStateList' => new Output\ValueObjectVisitor\ObjectStateList( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Common\\Values\\ContentObjectStates' => new Output\ValueObjectVisitor\ContentObjectStates( $urlHandler ), + + // REST specific + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\TemporaryRedirect' => new Output\ValueObjectVisitor\TemporaryRedirect( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\PermanentRedirect' => new Output\ValueObjectVisitor\PermanentRedirect( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\ResourceCreated' => new Output\ValueObjectVisitor\ResourceCreated( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\NoContent' => new Output\ValueObjectVisitor\NoContent( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Common\\Values\\Root' => new Output\ValueObjectVisitor\Root( $urlHandler ), + ); + + $jsonVisitor = new Common\Output\Visitor( + new Common\Output\Generator\Json( + new Common\Output\Generator\Json\FieldTypeHashGenerator() + ), + $valueObjectVisitors + ); + + $xmlVisitor = new Common\Output\Visitor( + new Common\Output\Generator\Xml( + new Common\Output\Generator\Xml\FieldTypeHashGenerator() + ), + $valueObjectVisitors + ); + + $acceptHeaderVisitorMapping = array( + '(^application/vnd\\.ez\\.api\\.[A-Za-z]+\\+json$)' => $jsonVisitor, + '(^application/vnd\\.ez\\.api\\.[A-Za-z]+\\+xml$)' => $xmlVisitor, + '(^application/json$)' => $jsonVisitor, + '(^application/xml$)' => $xmlVisitor, + // '(^.*/.*$)' => new View\InvalidApiUse(), + // Fall back gracefully to XML visiting. Also helps support responses + // without Accept header (e.g. DELETE requests). + '(^.*/.*$)' => $xmlVisitor, + ); + + return new AcceptHeaderVisitorDispatcher( $acceptHeaderVisitorMapping ); + } +} diff --git a/eZ/Bundle/EzPublishRestBundle/DependencyInjection/Configuration.php b/eZ/Bundle/EzPublishRestBundle/DependencyInjection/Configuration.php new file mode 100644 index 0000000..54a1266 --- /dev/null +++ b/eZ/Bundle/EzPublishRestBundle/DependencyInjection/Configuration.php @@ -0,0 +1,29 @@ +root( 'ez_publish_rest' ); + + // Here you should define the parameters that are allowed to + // configure your bundle. See the documentation linked above for + // more information on that topic. + + return $treeBuilder; + } +} diff --git a/eZ/Bundle/EzPublishRestBundle/DependencyInjection/EzPublishRestExtension.php b/eZ/Bundle/EzPublishRestBundle/DependencyInjection/EzPublishRestExtension.php new file mode 100644 index 0000000..4155bc9 --- /dev/null +++ b/eZ/Bundle/EzPublishRestBundle/DependencyInjection/EzPublishRestExtension.php @@ -0,0 +1,27 @@ +processConfiguration( $configuration, $configs ); + + $loader = new Loader\YamlFileLoader( $container, new FileLocator( __DIR__ . '/../Resources/config' ) ); + $loader->load( 'services.yml' ); + } +} diff --git a/eZ/Bundle/EzPublishRestBundle/EventListener/RestListener.php b/eZ/Bundle/EzPublishRestBundle/EventListener/RestListener.php new file mode 100644 index 0000000..b05d849 --- /dev/null +++ b/eZ/Bundle/EzPublishRestBundle/EventListener/RestListener.php @@ -0,0 +1,150 @@ +container = $container; + $this->request = $request; + } + + /** + * @return array + */ + public static function getSubscribedEvents() + { + return array( + KernelEvents::VIEW => 'onKernelResultView', + KernelEvents::EXCEPTION => 'onKernelExceptionView', + // @todo delete completely when this auth. method has been totally removed + // KernelEvents::REQUEST => 'onKernelRequest' + ); + } + + /** + * @param \Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event + * + * @throws \Exception + */ + + public function onKernelResultView( GetResponseForControllerResultEvent $event ) + { + if ( $event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST ) + return; + + if ( !$this->isRestRequest( $event->getRequest() ) ) + return; + + $result = $event->getControllerResult(); + + $event->setResponse( $this->visitResult( $result ) ); + $event->stopPropagation(); + } + + /** + * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event + * + * @throws \Exception + * + * @return void + */ + public function onKernelExceptionView( GetResponseForExceptionEvent $event ) + { + if ( $event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST ) + return; + + if ( !$this->isRestRequest( $event->getRequest() ) ) + return; + + $result = $event->getException(); + + $event->setResponse( $this->visitResult( $result ) ); + $event->stopPropagation(); + } + + public function onKernelRequest( GetResponseEvent $event ) + { + if ( $event->getRequestType() !== HttpKernelInterface::MASTER_REQUEST ) + return; + + if ( !$this->isRestRequest( $event->getRequest() ) ) + return; + + /** @var \eZ\Publish\Core\REST\Server\Request $request */ + $request = $this->container->get( 'ezpublish_rest.request' ); + if ( !isset( $request->testUser ) ) + return; + + /** @var \eZ\Publish\API\Repository\Repository $repository */ + $repository = $this->container->get( 'ezpublish.api.repository' ); + + $repository->setCurrentUser( + $repository->getUserService()->loadUser( $request->testUser ) + ); + } + + /** + * @param \Symfony\Component\HttpFoundation\Request $request + * + * @return boolean + */ + protected function isRestRequest( Request $request ) + { + return ( strpos( $request->getPathInfo(), '/api/ezp/v2/' ) === 0 ); + } + + /** + * @param mixed $result + * + * @return \Symfony\Component\HttpFoundation\Response + */ + protected function visitResult( $result ) + { + // visit response + $viewDispatcher = $this->container->get( 'ezpublish_rest.response_visitor_dispatcher' ); + $message = $viewDispatcher->dispatch( $this->container->get( 'ezpublish_rest.request' ), $result ); + + // @todo It would be even better if visitors would return a Symfony message directly + return new Response( $message->body, $message->statusCode, $message->headers ); + } +} diff --git a/eZ/Bundle/EzPublishRestBundle/EzPublishRestBundle.php b/eZ/Bundle/EzPublishRestBundle/EzPublishRestBundle.php new file mode 100644 index 0000000..8b96081 --- /dev/null +++ b/eZ/Bundle/EzPublishRestBundle/EzPublishRestBundle.php @@ -0,0 +1,9 @@ + + * array( + * 'stringLength' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * + * + * @return mixed + */ + public function getValidatorConfigurationSchema(); + + /** + * Indicates if the field type supports indexing and sort keys for searching + * + * @return boolean + */ + public function isSearchable(); + + /** + * Returns the empty value for this field type. + * + * @return mixed + */ + public function getEmptyValue(); + + /** + * Converts an $hash to the Value defined by the field type + * + * This is the reverse operation to {@link toHash()}. + * + * @param mixed $hash + * + * @return mixed + */ + public function fromHash( $hash ); + + /** + * Converts the given $value into a plain hash format + * + * @param mixed $value + * + * @return mixed + */ + public function toHash( $value ); + + /** + * Converts the given $fieldSettings to a simple hash format + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ); + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ); + + /** + * Converts the given $validatorConfiguration to a simple hash format + * + * @param mixed $validatorConfiguration + * + * @return array|hash|scalar|null + */ + public function validatorConfigurationToHash( $validatorConfiguration ); + + /** + * Converts the given $validatorConfigurationHash to a validator + * configuration of the type + * + * @param array|hash|scalar|null $validatorConfigurationHash + * + * @return mixed + */ + public function validatorConfigurationFromHash( $validatorConfigurationHash ); +} diff --git a/eZ/Publish/API/Repository/FieldTypeService.php b/eZ/Publish/API/Repository/FieldTypeService.php new file mode 100644 index 0000000..158bb71 --- /dev/null +++ b/eZ/Publish/API/Repository/FieldTypeService.php @@ -0,0 +1,47 @@ +array("languages" => array(,..)). + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array(), $filterOnUserPermissions = true ); + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: array("languages" => array(,..)). + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Criterion $criterion, array $fieldFilters = array(), $filterOnUserPermissions = true ); + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldpath + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ); +} + diff --git a/eZ/Publish/API/Repository/SectionService.php b/eZ/Publish/API/Repository/SectionService.php new file mode 100644 index 0000000..9ff8eb9 --- /dev/null +++ b/eZ/Publish/API/Repository/SectionService.php @@ -0,0 +1,129 @@ +getRepository(); + + $parentLocationId = $this->generateId( 'location', 56 ); + $sectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Inline */ + // $parentLocationId is the id of the /Design/eZ-publish node + + $contentService = $repository->getContentService(); + $contentTypeService = $repository->getContentTypeService(); + $locationService = $repository->getLocationService(); + + // Configure new location + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $locationCreate->priority = 23; + $locationCreate->hidden = true; + $locationCreate->remoteId = '0123456789abcdef0123456789abcdef'; + $locationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $locationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // Load content type + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + // Configure new content object + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + + $contentCreate->setField( 'name', 'An awesome forum' ); + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + // $sectionId is the ID of section 1 + $contentCreate->sectionId = $sectionId; + $contentCreate->alwaysAvailable = true; + + // Create a draft + $draft = $contentService->createContent( $contentCreate, array( $locationCreate ) ); + /* END: Inline */ + + return $draft; + } + + /** + * Creates a fresh clean published content instance. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createContentVersion1() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $draft = $this->createContentDraftVersion1(); + + // Publish this draft + $content = $contentService->publishVersion( $draft->getVersionInfo() ); + /* END: Inline */ + + return $content; + } + + /** + * Creates a new content draft named $draftVersion2 from a currently + * published content object. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createContentDraftVersion2() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $content = $this->createContentVersion1(); + + // Create a new draft from the published content + $draftVersion2 = $contentService->createContentDraft( $content->contentInfo ); + /* END: Inline */ + + return $draftVersion2; + } + + /** + * Creates an updated content draft named $draftVersion2 from + * a currently published content object. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createUpdatedDraftVersion2() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $draftVersion2 = $this->createContentDraftVersion2(); + + // Create an update struct and modify some fields + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->initialLanguageCode = 'eng-US'; + $contentUpdate->setField( 'name', 'An awesome forum²' ); + $contentUpdate->setField( 'name', 'An awesome forum²³', 'eng-GB' ); + + // Update the content draft + $draftVersion2 = $contentService->updateContent( + $draftVersion2->getVersionInfo(), + $contentUpdate + ); + /* END: Inline */ + + return $draftVersion2; + } + + /** + * Creates an updated content object named $contentVersion2 from + * a currently published content object. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createContentVersion2() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $draftVersion2 = $this->createUpdatedDraftVersion2(); + + // Publish the updated draft + $contentVersion2 = $contentService->publishVersion( $draftVersion2->getVersionInfo() ); + /* END: Inline */ + + return $contentVersion2; + } + + /** + * Creates an updated content draft named $draft. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createMultipleLanguageDraftVersion1() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $draft = $this->createContentDraftVersion1(); + + $contentUpdate = $contentService->newContentUpdateStruct(); + + $contentUpdate->initialLanguageCode = 'eng-US'; + + $contentUpdate->setField( 'name', 'An awesome multi-lang forum²' ); + + $contentUpdate->setField( 'name', 'An awesome multi-lang forum²³', 'eng-GB' ); + + $draft = $contentService->updateContent( + $draft->getVersionInfo(), + $contentUpdate + ); + /* END: Inline */ + + return $draft; + } + + /** + * Creates a published content object with versionNo=2 named + * $contentVersion2. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createMultipleLanguageContentVersion2() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $draft = $this->createMultipleLanguageDraftVersion1(); + + // Publish this version. + $contentVersion1 = $contentService->publishVersion( + $draft->getVersionInfo() + ); + + // Create a new draft and update with same values + $draftVersion2 = $contentService->createContentDraft( + $contentVersion1->contentInfo + ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + foreach ( $draftVersion2->getFields() as $field ) + { + $contentUpdate->setField( $field->fieldDefIdentifier, $field->value, $field->languageCode ); + } + + $contentService->updateContent( + $draftVersion2->getVersionInfo(), + $contentUpdate + ); + + // Finally publish version 2 + $contentVersion2 = $contentService->publishVersion( + $draftVersion2->getVersionInfo() + ); + /* END: Inline */ + + return $contentVersion2; + } +} diff --git a/eZ/Publish/API/Repository/Tests/BaseContentTypeServiceTest.php b/eZ/Publish/API/Repository/Tests/BaseContentTypeServiceTest.php new file mode 100644 index 0000000..6fea561 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/BaseContentTypeServiceTest.php @@ -0,0 +1,111 @@ +getRepository(); + + $creatorId = $this->generateId( 'user', 14 ); + /* BEGIN: Inline */ + $contentTypeService = $repository->getContentTypeService(); + + $groups = array( + $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ), + $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ) + ); + + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'blog-post' ); + $typeCreate->mainLanguageCode = 'eng-US'; + $typeCreate->remoteId = '384b94a1bd6bc06826410e284dd9684887bf56fc'; + $typeCreate->urlAliasSchema = 'url|scheme'; + $typeCreate->nameSchema = 'name|scheme'; + $typeCreate->names = array( + 'eng-US' => 'Blog post', + 'ger-DE' => 'Blog-Eintrag', + ); + $typeCreate->descriptions = array( + 'eng-US' => 'A blog post', + 'ger-DE' => 'Ein Blog-Eintrag', + ); + // $creatorId contains the ID of user 23 + $typeCreate->creatorId = $creatorId; + $typeCreate->creationDate = $this->createDateTime(); + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + $titleFieldCreate->names = array( + 'eng-US' => 'Title', + 'ger-DE' => 'Titel', + ); + $titleFieldCreate->descriptions = array( + 'eng-US' => 'Title of the blog post', + 'ger-DE' => 'Titel des Blog-Eintrages', + ); + $titleFieldCreate->fieldGroup = 'blog-content'; + $titleFieldCreate->position = 1; + $titleFieldCreate->isTranslatable = true; + $titleFieldCreate->isRequired = true; + $titleFieldCreate->isInfoCollector = false; + $titleFieldCreate->validatorConfiguration = array( + 'StringLengthValidator' => array( + 'minStringLength' => 0, + 'maxStringLength' => 0, + ), + ); + $titleFieldCreate->fieldSettings = array(); + $titleFieldCreate->isSearchable = true; + + $typeCreate->addFieldDefinition( $titleFieldCreate ); + + $bodyFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'body', 'eztext' + ); + $bodyFieldCreate->names = array( + 'eng-US' => 'Body', + 'ger-DE' => 'Textkörper', + ); + $bodyFieldCreate->descriptions = array( + 'eng-US' => 'Body of the blog post', + 'ger-DE' => 'Textkörper des Blog-Eintrages', + ); + $bodyFieldCreate->fieldGroup = 'blog-content'; + $bodyFieldCreate->position = 2; + $bodyFieldCreate->isTranslatable = true; + $bodyFieldCreate->isRequired = true; + $bodyFieldCreate->isInfoCollector = false; + $bodyFieldCreate->validatorConfiguration = array(); + $bodyFieldCreate->fieldSettings = array( + 'textRows' => 80 + ); + $bodyFieldCreate->isSearchable = true; + + $typeCreate->addFieldDefinition( $bodyFieldCreate ); + + $contentTypeDraft = $contentTypeService->createContentType( + $typeCreate, + $groups + ); + /* END: Inline */ + + return $contentTypeDraft; + } +} diff --git a/eZ/Publish/API/Repository/Tests/BaseTest.php b/eZ/Publish/API/Repository/Tests/BaseTest.php new file mode 100644 index 0000000..453ff99 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/BaseTest.php @@ -0,0 +1,348 @@ +getRepository(); + + // Set session if we are testing the REST backend to make it + // possible to persist data in the memory backend during multiple + // requests. + if ( $repository instanceof Sessionable ) + { + $repository->setSession( $id = md5( microtime() ) ); + } + } + catch ( \Exception $e ) + { + $this->markTestSkipped( + 'Cannot create a repository with predefined user. ' . + 'Check the UserService or RoleService implementation. ' . + PHP_EOL . PHP_EOL . + 'Exception: ' . $e + ); + } + } + + /** + * Resets the temporary used repository between each test run. + * + * @return void + */ + protected function tearDown() + { + $this->repository = null; + parent::tearDown(); + } + + /** + * Returns the ID generator, fitting to the repository implementation + * + * @return \eZ\Publish\API\Repository\Tests\IdManager + */ + protected function getIdManager() + { + return $this->getSetupFactory()->getIdManager(); + } + + /** + * Generates a repository specific ID value. + * + * @param string $type + * @param mixed $rawId + * + * @return mixed + */ + protected function generateId( $type, $rawId ) + { + return $this->getIdManager()->generateId( $type, $rawId ); + } + + /** + * Parses a repository specific ID value. + * + * @param string $type + * @param mixed $id + * + * @return mixed + */ + protected function parseId( $type, $id ) + { + return $this->getIdManager()->parseId( $type, $id ); + } + + /** + * Returns a config setting provided by the setup factory + * + * @param string $configKey + * + * @return mixed + */ + protected function getConfigValue( $configKey ) + { + return $this->getSetupFactory()->getConfigValue( $configKey ); + } + + /** + * Tests if the currently tested api is based on a V4 implementation. + * + * @return boolean + */ + protected function isVersion4() + { + return ( isset( $_ENV['backendVersion'] ) && '4' === $_ENV['backendVersion'] ); + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + if ( null === $this->repository ) + { + $this->repository = $this->getSetupFactory()->getRepository(); + } + return $this->repository; + } + + /** + * @return \eZ\Publish\API\Repository\Tests\SetupFactory + */ + protected function getSetupFactory() + { + if ( null === $this->setupFactory ) + { + if ( false === isset( $_ENV['setupFactory'] ) ) + { + throw new \ErrorException( 'Missing mandatory setting $_ENV["setupFactory"].' ); + } + + $setupClass = $_ENV['setupFactory']; + if ( false === class_exists( $setupClass ) ) + { + throw new \ErrorException( '$_ENV["setupFactory"] does not reference an existing class.' ); + } + + $this->setupFactory = new $setupClass; + } + return $this->setupFactory; + } + + /** + * Asserts that properties given in $expectedValues are correctly set in + * $actualObject. + * + * @param mixed[] $expectedValues + * @param \eZ\Publish\API\Repository\Values\ValueObject $actualObject + * + * @return void + */ + protected function assertPropertiesCorrect( array $expectedValues, ValueObject $actualObject ) + { + foreach ( $expectedValues as $propertyName => $propertyValue ) + { + $this->assertPropertiesEqual( + $propertyName, $propertyValue, $actualObject->$propertyName + ); + } + } + + /** + * Asserts all properties from $expectedValues are correctly set in + * $actualObject. Additional (virtual) properties can be asserted using + * $additionalProperties. + * + * @param \eZ\Publish\API\Repository\Values\ValueObject $expectedValues + * @param \eZ\Publish\API\Repository\Values\ValueObject $actualObject + * @param array $propertyNames + * + * @return void + */ + protected function assertStructPropertiesCorrect( ValueObject $expectedValues, ValueObject $actualObject, array $additionalProperties = array() ) + { + foreach ( $expectedValues as $propertyName => $propertyValue ) + { + $this->assertPropertiesEqual( + $propertyName, $propertyValue, $actualObject->$propertyName + ); + } + + foreach ( $additionalProperties as $propertyName ) + { + $this->assertPropertiesEqual( + $propertyName, $expectedValues->$propertyName, $actualObject->$propertyName + ); + } + } + + private function assertPropertiesEqual( $propertyName, $expectedValue, $actualValue ) + { + if ( $expectedValue instanceof \ArrayObject ) + { + $expectedValue = $expectedValue->getArrayCopy(); + } + if ( $actualValue instanceof \ArrayObject ) + { + $actualValue = $actualValue->getArrayCopy(); + } + + $this->assertEquals( + $expectedValue, + $actualValue, + sprintf( 'Object property "%s" incorrect.', $propertyName ) + ); + } + + /** + * Create a user fixture in a variable named $user, + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + protected function createUserVersion1() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + // ID of the "Editors" user group in an eZ Publish demo installation + $editorsGroupId = 13; + + $userService = $repository->getUserService(); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US' + ); + $userCreate->enabled = true; + + // Set some fields required by the user ContentType + $userCreate->setField( 'first_name', 'Example' ); + $userCreate->setField( 'last_name', 'User' ); + + // Load parent group for the user + $group = $userService->loadUserGroup( $editorsGroupId ); + + // Create a new user instance. + $user = $userService->createUser( $userCreate, array( $group ) ); + /* END: Inline */ + + return $user; + } + + /** + * Create a user fixture in a variable named $user, + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + protected function createMediaUserVersion1() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + // ID of the "Users" user group in an eZ Publish demo installation + $usersGroupId = 4; + + $roleService = $repository->getRoleService(); + $userService = $repository->getUserService(); + + // Get a group create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', 'Media Editor' ); + + // Create new group with media editor rights + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $userService->loadUserGroup( $usersGroupId ) + ); + $roleService->assignRoleToUserGroup( + $roleService->loadRoleByIdentifier( 'Editor' ), + $userGroup, + new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/48/' ) + ) + ) + ); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US' + ); + $userCreate->enabled = true; + + // Set some fields required by the user ContentType + $userCreate->setField( 'first_name', 'Example' ); + $userCreate->setField( 'last_name', 'User' ); + + // Create a new user instance. + $user = $userService->createUser( $userCreate, array( $userGroup ) ); + /* END: Inline */ + + return $user; + } + + /** + * Only for internal use. + * + * Creates a \DateTime object for $timestamp in the current time zone + * + * @param int $timestamp + * + * @return \DateTime + */ + public function createDateTime( $timestamp = null ) + { + $dateTime = new \DateTime(); + if ( $timestamp !== null ) + { + $dateTime->setTimestamp( $timestamp ); + } + return $dateTime; + } +} diff --git a/eZ/Publish/API/Repository/Tests/BaseTrashServiceTest.php b/eZ/Publish/API/Repository/Tests/BaseTrashServiceTest.php new file mode 100644 index 0000000..93ef9dc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/BaseTrashServiceTest.php @@ -0,0 +1,45 @@ +Community page location and stores + * this item in a location variable named $trashItem. + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + protected function createTrashItem() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + // remoteId of the "Media" page main location + $mediaRemoteId = '75c715a51699d2d309a924eca6a95145'; + + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + // Load "Media" page location + $mediaLocation = $locationService->loadLocationByRemoteId( + $mediaRemoteId + ); + + // Trash the "Community" page location + $trashItem = $trashService->trash( $mediaLocation ); + /* END: Inline */ + + return $trashItem; + } +} diff --git a/eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php new file mode 100644 index 0000000..2ef9ce7 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php @@ -0,0 +1,1309 @@ +isVersion4() ) + { + $this->markTestSkipped( "This test requires eZ Publish 5" ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $contentTypeService = $repository->getContentTypeService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentService = $repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate->setField( 'name', 'Awesome Sindelfingen forum' ); + + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // This call will fail with a "UnauthorizedException" + $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent($contentCreateStruct, $locationCreateStructs) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $this->createContentDraftVersion1(); + /* END: Use Case */ + } + + /** + * Test for the loadContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentInfo() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testLoadContentInfoThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 10 ); + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + // $contentId contains a content object ID not accessible for anonymous + $contentService->loadContentInfo( $contentId ); + /* END: Use Case */ + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentInfoByRemoteId() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfoByRemoteId + */ + public function testLoadContentInfoByRemoteIdThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // RemoteId of the "Anonymous User" in an eZ Publish demo installation + $anonymousRemoteId = 'faaeb9be3bd98ed09f606fc16d144eca'; + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentInfoByRemoteId( $anonymousRemoteId ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfo() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfo + */ + public function testLoadVersionInfoThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadVersionInfo( $contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfo($contentInfo, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfoWithSecondParameter + */ + public function testLoadVersionInfoThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadVersionInfo( $contentInfo, 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfoById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfoById() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfoById + */ + public function testLoadVersionInfoByIdThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadVersionInfoById( $anonymousUserId ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfoById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfoById($contentId, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfoByIdWithSecondParameter + */ + public function testLoadVersionInfoByIdThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadVersionInfoById( $anonymousUserId, 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfo + */ + public function testLoadContentByContentInfoThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByContentInfo( $contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo($contentInfo, $languages) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfoWithSecondParameter + */ + public function testLoadContentByContentInfoThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByContentInfo( $contentInfo, array( 'eng-US' ) ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo($contentInfo, $languages, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfoWithThirdParameter + */ + public function testLoadContentByContentInfoThrowsUnauthorizedExceptionWithThirdParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByContentInfo( $contentInfo, array( 'eng-US' ), 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByVersionInfo() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByVersionInfo + */ + public function testLoadContentByVersionInfoThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + // Load the current VersionInfo + $versionInfo = $contentService->loadVersionInfo( $contentInfo ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByVersionInfo( $versionInfo ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByVersionInfo($versionInfo, $languages) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByVersionInfoWithSecondParameter + */ + public function testLoadContentByVersionInfoThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Anonymous User" + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + // Load the current VersionInfo + $versionInfo = $contentService->loadVersionInfo( $contentInfo ); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByVersionInfo( $versionInfo, array( 'eng-US' ) ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testLoadContentThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContent( $anonymousUserId ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent($contentId, $languages) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentWithSecondParameter + */ + public function testLoadContentThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContent( $anonymousUserId, array( 'eng-US' ) ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent($contentId, $languages, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentWithThirdParameter + */ + public function testLoadContentThrowsUnauthorizedExceptionWithThirdParameter() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the ID of the "Anonymous User" in an eZ Publish + // demo installation + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContent( $anonymousUserId, array( 'eng-US' ), 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByRemoteId + */ + public function testLoadContentByRemoteIdThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Remote id of the "Anonymous" user in a eZ Publish demo installation + $anonymousRemoteId = 'faaeb9be3bd98ed09f606fc16d144eca'; + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByRemoteId( $anonymousRemoteId ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId($remoteId, $languages) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByRemoteIdWithSecondParameter + */ + public function testLoadContentByRemoteIdThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Remote id of the "Anonymous" user in a eZ Publish demo installation + $anonymousRemoteId = 'faaeb9be3bd98ed09f606fc16d144eca'; + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByRemoteId( $anonymousRemoteId, array( 'eng-US' ) ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId($remoteId, $languages, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByRemoteIdWithThirdParameter + */ + public function testLoadContentByRemoteIdThrowsUnauthorizedExceptionWithThirdParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Remote id of the "Anonymous" user in a eZ Publish demo installation + $anonymousRemoteId = 'faaeb9be3bd98ed09f606fc16d144eca'; + + $contentService = $repository->getContentService(); + + $pseudoEditor = $this->createAnonymousWithEditorRole(); + + // Set restricted editor user + $repository->setCurrentUser( $pseudoEditor ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentByRemoteId( $anonymousRemoteId, array( 'eng-US' ), 2 ); + /* END: Use Case */ + } + + /** + * Test for the updateContentMetadata() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + */ + public function testUpdateContentMetadataThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Get ContentInfo instance. + $contentInfo = $content->contentInfo; + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // Creates a metadata update struct + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + + $metadataUpdate->remoteId = 'aaaabbbbccccddddeeeeffff11112222'; + $metadataUpdate->mainLanguageCode = 'eng-US'; + $metadataUpdate->alwaysAvailable = false; + $metadataUpdate->publishedDate = $this->createDateTime(); + $metadataUpdate->modificationDate = $this->createDateTime(); + + // This call will fail with a "UnauthorizedException" + $contentService->updateContentMetadata( + $contentInfo, + $metadataUpdate + ); + /* END: Use Case */ + } + + /** + * Test for the deleteContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteContent + */ + public function testDeleteContentThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Get ContentInfo instance + $contentInfo = $contentVersion2->contentInfo; + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->deleteContent( $contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Get ContentInfo instance + $contentInfo = $content->contentInfo; + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->createContentDraft( $contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft($contentInfo, $versionInfo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraftWithSecondParameter + */ + public function testCreateContentDraftThrowsUnauthorizedExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Get ContentInfo and VersionInfo instances + $contentInfo = $content->contentInfo; + $versionInfo = $content->getVersionInfo(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->createContentDraft( $contentInfo, $versionInfo ); + /* END: Use Case */ + } + + /** + * Test for the loadContentDrafts() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentDrafts() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentDrafts + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentDrafts + */ + public function testLoadContentDraftsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentDrafts(); + /* END: Use Case */ + } + + /** + * Test for the loadContentDrafts() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentDrafts($user) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentDrafts + */ + public function testLoadContentDraftsThrowsUnauthorizedExceptionWithFirstParameter() + { + $repository = $this->getRepository(); + + $administratorUserId = $this->generateId( 'user', 14 ); + /* BEGIN: Use Case */ + // $administratorUserId is the ID of the "Administrator" user in a eZ + // Publish demo installation. + + $contentService = $repository->getContentService(); + + // Load the user service + $userService = $repository->getUserService(); + + // Load the "Administrator" user + $administratorUser = $userService->loadUser( $administratorUserId ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadContentDrafts( $administratorUser ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draftVersion2 = $this->createContentDraftVersion2(); + + // Get VersionInfo instance + $versionInfo = $draftVersion2->getVersionInfo(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // Create an update struct and modify some fields + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'An awesome² story about ezp.' ); + $contentUpdate->setField( 'name', 'An awesome²³ story about ezp.', 'eng-GB' ); + + $contentUpdate->initialLanguageCode = 'eng-US'; + + // This call will fail with a "UnauthorizedException" + $contentService->updateContent( $versionInfo, $contentUpdate ); + /* END: Use Case */ + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testPublishVersionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->publishVersion( $draft->getVersionInfo() ); + /* END: Use Case */ + } + + /** + * Test for the deleteVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteVersion() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteVersion + */ + public function testDeleteVersionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException", because "content" + // "versionremove" permission is missing. + $contentService->deleteVersion( $draft->getVersionInfo() ); + /* END: Use Case */ + } + + /** + * Test for the loadVersions() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersions() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersions + */ + public function testLoadVersionsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Get ContentInfo instance of version 2 + $contentInfo = $contentVersion2->contentInfo; + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadVersions( $contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the copyContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::copyContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCopyContent + */ + public function testCopyContentThrowsUnauthorizedException() + { + $parentLocationId = $this->generateId( 'location', 52 ); + + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createMultipleLanguageContentVersion2(); + + // Get ContentInfo instance of version 2 + $contentInfo = $contentVersion2->contentInfo; + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // Configure new target location + $targetLocationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $targetLocationCreate->priority = 42; + $targetLocationCreate->hidden = true; + $targetLocationCreate->remoteId = '01234abcdef5678901234abcdef56789'; + $targetLocationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $targetLocationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // This call will fail with a "UnauthorizedException" + $contentService->copyContent( + $contentInfo, + $targetLocationCreate + ); + /* END: Use Case */ + } + + /** + * Test for the copyContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::copyContent($contentInfo, $destinationLocationCreateStruct, $versionInfo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCopyContentWithThirdParameter + */ + public function testCopyContentThrowsUnauthorizedExceptionWithThirdParameter() + { + $parentLocationId = $this->generateId( 'location', 52 ); + + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // Configure new target location + $targetLocationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $targetLocationCreate->priority = 42; + $targetLocationCreate->hidden = true; + $targetLocationCreate->remoteId = '01234abcdef5678901234abcdef56789'; + $targetLocationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $targetLocationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // This call will fail with a "UnauthorizedException" + $contentService->copyContent( + $contentVersion2->contentInfo, + $targetLocationCreate, + $contentService->loadVersionInfo( $contentVersion2->contentInfo, 1 ) + ); + /* END: Use Case */ + } + + /** + * Test for the loadRelations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadRelations() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadRelations + */ + public function testLoadRelationsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // Remote id of the "Media" page of a eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $versionInfo = $contentService->loadVersionInfo( + $contentService->loadContentInfoByRemoteId( + $mediaRemoteId + ) + ); + + // Set media editor as current user + $repository->setCurrentUser( $user ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadRelations( $versionInfo ); + /* END: Use Case */ + } + + /** + * Test for the loadReverseRelations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadReverseRelations() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadReverseRelations + */ + public function testLoadReverseRelationsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // Remote id of the "Media" page of a eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $contentInfo = $contentService->loadContentInfoByRemoteId( + $mediaRemoteId + ); + + // Set media editor as current user + $repository->setCurrentUser( $user ); + + // This call will fail with a "UnauthorizedException" + $contentService->loadReverseRelations( $contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the addRelation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::addRelation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testAddRelation + */ + public function testAddRelationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Remote id of the "Media" page of a eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $draft = $this->createContentDraftVersion1(); + + // Get the draft's version info + $versionInfo = $draft->getVersionInfo(); + + // Load other content object + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->addRelation( + $versionInfo, + $media + ); + /* END: Use Case */ + } + + /** + * Test for the deleteRelation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteRelation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteRelation + */ + public function testDeleteRelationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Remote ids of the "Media" and the "Demo Design" page of a eZ Publish + // demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + $demoDesignRemoteId = '8b8b22fe3c6061ed500fbd2b377b885f'; + + $draft = $this->createContentDraftVersion1(); + + // Get the draft's version info + $versionInfo = $draft->getVersionInfo(); + + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + $demoDesign = $contentService->loadContentInfoByRemoteId( $demoDesignRemoteId ); + + // Establish some relations + $contentService->addRelation( $draft->getVersionInfo(), $media ); + $contentService->addRelation( $draft->getVersionInfo(), $demoDesign ); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentService->deleteRelation( $versionInfo, $media ); + /* END: Use Case */ + } + + /** + * Test for the findContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::findContent($query, $fieldFilters, $filterOnUserPermissions) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testFindContent + */ + public function testFindContentWithUserPermissionFilter() + { + self::markTestIncomplete( "Search have been moved to SearchService" ); + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // Set new media editor as current user + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + + // Create a search query for content objects about "eZ Publish" + $query = new Query(); + $query->criterion = new Criterion\LogicalAnd( + array( + new Criterion\Field( 'title', Criterion\Operator::LIKE, '*eZ Publish*' ) + ) + ); + + // Search for matching content + $searchResultWithoutPermissions = $contentService->findContent( $query, array(), false ); + + // Search for matching content + $searchResultWithPermissions = $contentService->findContent( $query, array() ); + /* END: Use Case */ + + $this->assertGreaterThan( + $searchResultWithPermissions->count, + $searchResultWithoutPermissions->count + ); + } + + /** + * Test for the findSingle() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::findSingle($query, $fieldFilters, $filterOnUserPermissions) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testFindContent + */ + public function testFindSingleWithUserPermissionFilter() + { + self::markTestIncomplete( "Search have been moved to SearchService" ); + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // Set new media editor as current user + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + + // Create a search query for content objects about "eZ Publish" + $query = new Query(); + $query->criterion = new Criterion\LogicalAnd( + array( + new Criterion\Field( 'name', Criterion\Operator::LIKE, 'Administrator users' ) + ) + ); + + // Search for matching content + $content = $contentService->findSingle( $query, array(), false ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + } + + /** + * Test for the findSingle() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::findSingle($query, $fieldFilters, $filterOnUserPermissions) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testFindContent + */ + public function testFindSingleThrowsNotFoundExceptionWithUserPermissionFilter() + { + self::markTestIncomplete( "Search have been moved to SearchService" ); + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // Set new media editor as current user + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + + // Create a search query for content objects about "eZ Publish" + $query = new Query(); + $query->criterion = new Criterion\LogicalAnd( + array( + new Criterion\Field( 'name', Criterion\Operator::LIKE, 'Administrator users' ) + ) + ); + + // This call will fail with a "NotFoundException", because the current + // user has no access to the "Admin Users" user group + $contentService->findSingle( $query, array(), true ); + /* END: Use Case */ + } + + /** + * Creates a pseudo editor with a limitation to objects in the "Media/Images" + * subtree. + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + private function createAnonymousWithEditorRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + $roleService = $repository->getRoleService(); + $userService = $repository->getUserService(); + + $user = $userService->loadAnonymousUser(); + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + // Assign "Editor" role with limitation to "Media/Images" + $roleService->assignRoleToUser( + $role, + $user, + new \eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation( + array( + 'limitationValues' => array( '/1/43/51/' ) + ) + ) + ); + + $pseudoEditor = $userService->loadUser( $user->id ); + /* END: Inline */ + + return $pseudoEditor; + } +} diff --git a/eZ/Publish/API/Repository/Tests/ContentServiceTest.php b/eZ/Publish/API/Repository/Tests/ContentServiceTest.php new file mode 100644 index 0000000..d08ed3b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/ContentServiceTest.php @@ -0,0 +1,4341 @@ +getRepository(); + + /* BEGIN: Use Case */ + // Create a content type + $contentTypeService = $repository->getContentTypeService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentService = $repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + /* END: Use Case */ + + $this->assertInstanceOf( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentCreateStruct', $contentCreate ); + } + + /** + * Test for the createContent() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testNewContentCreateStruct + * @group user + * @group field-type + */ + public function testCreateContent() + { + if ( $this->isVersion4() ) + { + $this->markTestSkipped( "This test requires eZ Publish 5" ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentService = $repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate->setField( 'name', 'My awesome forum' ); + + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + $content = $contentService->createContent( $contentCreate ); + /* END: Use Case */ + + $this->assertInstanceOf( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', $content ); + + return $content; + } + + /** + * Test for the createContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentSetsContentType( $content ) + { + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\ContentType\ContentType', $content->contentType ); + + return $content; + } + + /** + * Test for the createContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentSetsContentType + */ + public function testCreateContentSetsExpectedContentType( $content ) + { + $this->assertEquals( 'forum', $content->contentType->identifier ); + } + + /** + * Test for the createContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentSetsContentInfo( $content ) + { + $this->assertInstanceOf( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentInfo', $content->contentInfo ); + + return $content; + } + + /** + * Test for the createContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentSetsContentInfo + */ + public function testCreateContentSetsExpectedContentInfo( $content ) + { + $this->assertEquals( + array( + $content->id, + true, + 1, + 'abcdef0123456789abcdef0123456789', + 'eng-US', + $this->getRepository()->getCurrentUser()->id, + false, + null + ), + array( + $content->contentInfo->id, + $content->contentInfo->alwaysAvailable, + $content->contentInfo->currentVersionNo, + $content->contentInfo->remoteId, + $content->contentInfo->mainLanguageCode, + $content->contentInfo->ownerId, + $content->contentInfo->published, + $content->contentInfo->publishedDate, + ) + ); + } + + /** + * Test for the createContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentSetsVersionInfo( $content ) + { + $this->assertInstanceOf( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo', $content->getVersionInfo() ); + + return $content; + } + + /** + * Test for the createContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentSetsVersionInfo + */ + public function testCreateContentSetsExpectedVersionInfo( $content ) + { + $this->assertEquals( + array( + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => 1, + 'creatorId' => $this->getRepository()->getCurrentUser()->id, + 'initialLanguageCode' => 'eng-US', + ), + array( + 'status' => $content->getVersionInfo()->status, + 'versionNo' => $content->getVersionInfo()->versionNo, + 'creatorId' => $content->getVersionInfo()->creatorId, + 'initialLanguageCode' => $content->getVersionInfo()->initialLanguageCode, + ) + ); + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentThrowsInvalidArgumentException() + { + if ( $this->isVersion4() ) + { + $this->markTestSkipped( "This test requires eZ Publish 5" ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentCreate1 = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate1->setField( 'name', 'An awesome Sidelfingen forum' ); + + $contentCreate1->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate1->alwaysAvailable = true; + + $draft = $contentService->createContent( $contentCreate1 ); + $contentService->publishVersion( $draft->versionInfo ); + + $contentCreate2 = $contentService->newContentCreateStruct( $contentType, 'eng-GB' ); + $contentCreate2->setField( 'name', 'An awesome Bielefeld forum' ); + + $contentCreate2->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate2->alwaysAvailable = false; + + // This call will fail with an "InvalidArgumentException", because the + // remoteId is already in use. + $contentService->createContent( $contentCreate2 ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentThrowsInvalidArgumentExceptionOnFieldTypeNotAccept() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + // The name field does only accept strings and null as its values + $contentCreate->setField( 'name', new \stdClass() ); + + // Throws InvalidArgumentException since the name field is filled + // improperly + $draft = $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentThrowsContentFieldValidationException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $contentCreate1 = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate1->setField( 'name', 'An awesome Sidelfingen folder' ); + // Violates string length constraint + $contentCreate1->setField( 'short_name', str_repeat( 'a', 200 ) ); + + // Throws ContentValidationException, since short_name does not pass + // validation of the string length validator + $draft = $contentService->createContent( $contentCreate1 ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateContentThrowsContentValidationException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentCreate1 = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + // Required field "name" is not set + + // Throws a ContentValidationException, since a required field is + // missing + $draft = $contentService->createContent( $contentCreate1 ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * NOTE: We have bidirectional dependencies between the ContentService and + * the LocationService, so that we cannot use PHPUnit's test dependencies + * here. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent($contentCreateStruct, $locationCreateStructs) + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationByRemoteId + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @group user + */ + public function testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately() + { + $repository = $this->getRepository(); + + $locationService = $repository->getLocationService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // The location will not have been created, yet, so this throws an + // exception + $location = $locationService->loadLocationByRemoteId( + '0123456789abcdef0123456789abcdef' + ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent($contentCreateStruct, $locationCreateStructs) + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately + */ + public function testCreateContentThrowsInvalidArgumentExceptionWithLocationCreateParameter() + { + $repository = $this->getRepository(); + + $parentLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $parentLocationId is a valid location ID + + $contentService = $repository->getContentService(); + $contentTypeService = $repository->getContentTypeService(); + $locationService = $repository->getLocationService(); + + // Load content type + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + // Configure new locations + $locationCreate1 = $locationService->newLocationCreateStruct( $parentLocationId ); + + $locationCreate1->priority = 23; + $locationCreate1->hidden = true; + $locationCreate1->remoteId = '0123456789abcdef0123456789aaaaaa'; + $locationCreate1->sortField = Location::SORT_FIELD_NODE_ID; + $locationCreate1->sortOrder = Location::SORT_ORDER_DESC; + + $locationCreate2 = $locationService->newLocationCreateStruct( $parentLocationId ); + + $locationCreate2->priority = 42; + $locationCreate2->hidden = true; + $locationCreate2->remoteId = '0123456789abcdef0123456789bbbbbb'; + $locationCreate2->sortField = Location::SORT_FIELD_NODE_ID; + $locationCreate2->sortOrder = Location::SORT_ORDER_DESC; + + // Configure new content object + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + + $contentCreate->setField( 'name', 'A awesome Sindelfingen forum' ); + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Create new content object under the specified location + $draft = $contentService->createContent( + $contentCreate, + array( $locationCreate1 ) + ); + $contentService->publishVersion( $draft->versionInfo ); + + // This call will fail with an "InvalidArgumentException", because the + // Content remoteId already exists, + $contentService->createContent( + $contentCreate, + array( $locationCreate2 ) + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentInfo() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + * @group user + */ + public function testLoadContentInfo() + { + $repository = $this->getRepository(); + + $mediaFolderId = $this->generateId( 'object', 41 ); + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Media" folder + $contentInfo = $contentService->loadContentInfo( $mediaFolderId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentInfo', + $contentInfo + ); + } + + /** + * Test for the loadContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentInfo() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testLoadContentInfoThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentContentId = $this->generateId( 'object', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // This call will fail with a NotFoundException + $contentService->loadContentInfo( $nonExistentContentId ); + /* END: Use Case */ + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentInfoByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + */ + public function testLoadContentInfoByRemoteId() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Media" folder + $contentInfo = $contentService->loadContentInfoByRemoteId( 'faaeb9be3bd98ed09f606fc16d144eca' ); + /* END: Use Case */ + + $this->assertInstanceOf( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentInfo', $contentInfo ); + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentInfoByRemoteId() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfoByRemoteId + */ + public function testLoadContentInfoByRemoteIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // This call will fail with a NotFoundException + $contentService->loadContentInfoByRemoteId( 'abcdefghijklmnopqrstuvwxyz0123456789' ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfo() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @group user + */ + public function testLoadVersionInfo() + { + $repository = $this->getRepository(); + + $mediaFolderId = $this->generateId( 'object', 41 ); + /* BEGIN: Use Case */ + // $mediaFolderId contains the ID of the "Media" folder + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Media" folder + $contentInfo = $contentService->loadContentInfo( $mediaFolderId ); + + // Now load the current version info of the "Media" folder + $versionInfo = $contentService->loadVersionInfo( $contentInfo ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo', + $versionInfo + ); + } + + /** + * Test for the loadVersionInfoById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfoById() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + */ + public function testLoadVersionInfoById() + { + $repository = $this->getRepository(); + + $mediaFolderId = $this->generateId( 'object', 41 ); + /* BEGIN: Use Case */ + // $mediaFolderId contains the ID of the "Media" folder + + $contentService = $repository->getContentService(); + + // Load the VersionInfo for "Media" folder + $versionInfo = $contentService->loadVersionInfoById( $mediaFolderId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo', + $versionInfo + ); + } + + /** + * Test for the loadVersionInfoById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfoById() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfoById + */ + public function testLoadVersionInfoByIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentContentId = $this->generateId( 'object', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // This call will fail with a "NotFoundException" + $contentService->loadVersionInfoById( $nonExistentContentId ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testLoadContentByContentInfo() + { + $repository = $this->getRepository(); + + $mediaFolderId = $this->generateId( 'object', 41 ); + /* BEGIN: Use Case */ + // $mediaFolderId contains the ID of the "Media" folder + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Media" folder + $contentInfo = $contentService->loadContentInfo( $mediaFolderId ); + + // Now load the current content version for the info instance + $content = $contentService->loadContentByContentInfo( $contentInfo ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + } + + /** + * Test for the loadContentByVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByVersionInfo() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfo + */ + public function testLoadContentByVersionInfo() + { + $repository = $this->getRepository(); + + $mediaFolderId = $this->generateId( 'object', 41 ); + /* BEGIN: Use Case */ + // $mediaFolderId contains the ID of the "Media" folder + + $contentService = $repository->getContentService(); + + // Load the ContentInfo for "Media" folder + $contentInfo = $contentService->loadContentInfo( $mediaFolderId ); + + // Load the current VersionInfo + $versionInfo = $contentService->loadVersionInfo( $contentInfo ); + + // Now load the current content version for the info instance + $content = $contentService->loadContentByVersionInfo( $versionInfo ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + * @group user + * @group field-type + */ + public function testLoadContent() + { + $repository = $this->getRepository(); + + $mediaFolderId = $this->generateId( 'object', 41 ); + /* BEGIN: Use Case */ + // $mediaFolderId contains the ID of the "Media" folder + + $contentService = $repository->getContentService(); + + // Load the Content for "Media" folder, any language and current version + $content = $contentService->loadContent( $mediaFolderId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testLoadContentThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentContentId = $this->generateId( 'object', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // This call will fail with a "NotFoundException" + $contentService->loadContent( $nonExistentContentId ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + */ + public function testLoadContentByRemoteId() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Remote id of the "Media" folder + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $contentService = $repository->getContentService(); + + // Load the Content for "Media" folder + $content = $contentService->loadContentByRemoteId( $mediaRemoteId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByRemoteId + */ + public function testLoadContentByRemoteIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // This call will fail with a "NotFoundException", because no content + // object exists for the given remoteId + $contentService->loadContentByRemoteId( 'a1b1c1d1e1f1a2b2c2d2e2f2a3b3c3d3' ); + /* END: Use Case */ + } + + /** + * Test for the publishVersion() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfo + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately + * @group user + * @group field-type + */ + public function testPublishVersion() + { + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + + return $content; + } + + /** + * Test for the publishVersion() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testPublishVersionSetsExpectedContentInfo( $content ) + { + $this->assertEquals( + array( + $content->id, + true, + 1, + 'abcdef0123456789abcdef0123456789', + 'eng-US', + $this->getRepository()->getCurrentUser()->id, + true, + ), + array( + $content->contentInfo->id, + $content->contentInfo->alwaysAvailable, + $content->contentInfo->currentVersionNo, + $content->contentInfo->remoteId, + $content->contentInfo->mainLanguageCode, + $content->contentInfo->ownerId, + $content->contentInfo->published + ) + ); + + $date = new \DateTime( '1984/01/01' ); + $this->assertGreaterThan( + $date->getTimestamp(), + $content->contentInfo->publishedDate->getTimestamp() + ); + } + + /** + * Test for the publishVersion() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testPublishVersionSetsExpectedVersionInfo( $content ) + { + $this->assertEquals( + array( + $this->getRepository()->getCurrentUser()->id, + 'eng-US', + VersionInfo::STATUS_PUBLISHED, + 1 + ), + array( + $content->getVersionInfo()->creatorId, + $content->getVersionInfo()->initialLanguageCode, + $content->getVersionInfo()->status, + $content->getVersionInfo()->versionNo + ) + ); + + $date = new \DateTime( '1984/01/01' ); + $this->assertGreaterThan( + $date->getTimestamp(), + $content->getVersionInfo()->modificationDate->getTimestamp() + ); + + $this->assertNotNull( $content->getVersionInfo()->modificationDate ); + } + + /** + * Test for the publishVersion() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testPublishVersionCreatesLocationsDefinedOnCreate() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + /* END: Use Case */ + + $locationService = $repository->getLocationService(); + $location = $locationService->loadLocationByRemoteId( + '0123456789abcdef0123456789abcdef' + ); + + $this->assertEquals( + $location->getContentInfo(), + $content->getVersionInfo()->getContentInfo() + ); + + return array( $content, $location ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionCreatesLocationsDefinedOnCreate + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationByRemoteId + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testCreateContentWithLocationCreateParameterSetsMainLocationId( array $testData ) + { + list( $content, $location ) = $testData; + + $this->assertEquals( + $content->getVersionInfo()->getContentInfo()->mainLocationId, + $location->id + ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testPublishVersionThrowsBadStateException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Publish the content draft + $contentService->publishVersion( $draft->getVersionInfo() ); + + // This call will fail with a "BadStateException", because the version + // is already published. + $contentService->publishVersion( $draft->getVersionInfo() ); + /* END: Use Case */ + } + + /** + * Test for the createContentDraft() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + * @group user + */ + public function testCreateContentDraft() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Now we create a new draft from the published content + $draftedContent = $contentService->createContentDraft( $content->contentInfo ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $draftedContent + ); + + return $draftedContent; + } + + /** + * Test for the createContentDraft() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $draft + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftSetsExpectedProperties( $draft ) + { + $this->assertEquals( + array( + 'fieldCount' => 2, + 'relationCount' => 0 + ), + array( + 'fieldCount' => count( $draft->getFields() ), + 'relationCount' => count( $this->getRepository()->getContentService()->loadRelations( $draft->getVersionInfo() ) ) + ) + ); + } + + /** + * Test for the createContentDraft() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $draft + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftSetsContentInfo( $draft ) + { + $contentInfo = $draft->contentInfo; + + $this->assertEquals( + array( + $draft->id, + true, + 1, + 'eng-US', + $this->getRepository()->getCurrentUser()->id, + 'abcdef0123456789abcdef0123456789', + 1 + ), + array( + $contentInfo->id, + $contentInfo->alwaysAvailable, + $contentInfo->currentVersionNo, + $contentInfo->mainLanguageCode, + $contentInfo->ownerId, + $contentInfo->remoteId, + $contentInfo->sectionId + ) + ); + } + + /** + * Test for the createContentDraft() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $draft + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftSetsVersionInfo( $draft ) + { + $versionInfo = $draft->getVersionInfo(); + + $this->assertEquals( + array( + 'creatorId' => $this->getRepository()->getCurrentUser()->id, + 'initialLanguageCode' => 'eng-US', + 'languageCodes' => array( 0 => 'eng-US' ), + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => 2 + ), + array( + 'creatorId' => $versionInfo->creatorId, + 'initialLanguageCode' => $versionInfo->initialLanguageCode, + 'languageCodes' => $versionInfo->languageCodes, + 'status' => $versionInfo->status, + 'versionNo' => $versionInfo->versionNo + ) + ); + } + + /** + * Test for the createContentDraft() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $draft + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfo + */ + public function testCreateContentDraftLoadVersionInfoStillLoadsPublishedVersion( $draft ) + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Now we create a new draft from the published content + $contentService->createContentDraft( $content->contentInfo ); + + // This call will still load the published version + $versionInfoPublished = $contentService->loadVersionInfo( $content->contentInfo ); + /* END: Use Case */ + + $this->assertEquals( 1, $versionInfoPublished->versionNo ); + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftLoadContentStillLoadsPublishedVersion() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Now we create a new draft from the published content + $contentService->createContentDraft( $content->contentInfo ); + + // This call will still load the published content version + $contentPublished = $contentService->loadContent( $content->id ); + /* END: Use Case */ + + $this->assertEquals( 1, $contentPublished->getVersionInfo()->versionNo ); + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByRemoteId + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftLoadContentByRemoteIdStillLoadsPublishedVersion() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Now we create a new draft from the published content + $contentService->createContentDraft( $content->contentInfo ); + + // This call will still load the published content version + $contentPublished = $contentService->loadContentByRemoteId( 'abcdef0123456789abcdef0123456789' ); + /* END: Use Case */ + + $this->assertEquals( 1, $contentPublished->getVersionInfo()->versionNo ); + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfo + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testCreateContentDraftLoadContentByContentInfoStillLoadsPublishedVersion() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Now we create a new draft from the published content + $contentService->createContentDraft( $content->contentInfo ); + + // This call will still load the published content version + $contentPublished = $contentService->loadContentByContentInfo( $content->contentInfo ); + /* END: Use Case */ + + $this->assertEquals( 1, $contentPublished->getVersionInfo()->versionNo ); + } + + /** + * Test for the newContentUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::newContentUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + * @group user + */ + public function testNewContentUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + $updateStruct = $contentService->newContentUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentUpdateStruct', + $updateStruct + ); + } + + /** + * Test for the updateContent() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testNewContentUpdateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + * @group user + * @group field-type + */ + public function testUpdateContent() + { + /* BEGIN: Use Case */ + $draftVersion2 = $this->createUpdatedDraftVersion2(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $draftVersion2 + ); + + return $draftVersion2; + } + + /** + * Test for the updateContent() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentSetsExpectedFields( $content ) + { + $actual = $this->normalizeFields( $content->getFields() ); + + $expected = array( + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-GB', + 'fieldDefIdentifier' => 'description' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'description' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-GB', + 'fieldDefIdentifier' => 'name' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'name' + ) + ), + ); + + $this->assertEquals( $expected, $actual ); + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentThrowsBadStateException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Now create an update struct and modify some fields + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->setField( 'title', 'An awesome² story about ezp.' ); + $contentUpdateStruct->setField( 'title', 'An awesome²³ story about ezp.', 'eng-GB' ); + + $contentUpdateStruct->initialLanguageCode = 'eng-US'; + + // This call will fail with a "BadStateException", because $publishedContent + // is not a draft. + $contentService->updateContent( + $content->getVersionInfo(), + $contentUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentThrowsInvalidArgumentExceptionWhenFieldTypeDoesNotAccept() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Now create an update struct and modify some fields + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + // The name field does not accept a stdClass object as its input + $contentUpdateStruct->setField( 'name', new \stdClass(), 'eng-US' ); + + // Throws an InvalidArgumentException, since the value for field "name" + // is not accepted + $contentService->updateContent( + $draft->getVersionInfo(), + $contentUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentThrowsContentValidationExceptionWhenMandatoryFieldIsEmpty() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Now create an update struct and set a mandatory field to null + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->setField( 'name', null ); + + // Don't set this, then the above call without languageCode will fail + $contentUpdateStruct->initialLanguageCode = 'eng-US'; + + // This call will fail with a "ContentValidationException", because the + // mandatory "name" field is empty. + $contentService->updateContent( + $draft->getVersionInfo(), + $contentUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentThrowsContentFieldValidationException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate->setField( 'name', 'An awesome Sidelfingen folder' ); + + $draft = $contentService->createContent( $contentCreate ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + // Violates string length constraint + $contentUpdate->setField( 'short_name', str_repeat( 'a', 200 ), 'eng-US' ); + + // Throws ContentFieldValidationException because the string length + // validation of the field "short_name" fails + $contentService->updateContent( $draft->getVersionInfo(), $contentUpdate ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testUpdateContentWithNotUpdatingMandatoryField() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Now create an update struct which does not overwrite mandatory + // fields + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->setField( + 'description', + '
' + ); + + // Don't set this, then the above call without languageCode will fail + $contentUpdateStruct->initialLanguageCode = 'eng-US'; + + // This will only update the "description" field in the "eng-US" + // language + $updatedDraft = $contentService->updateContent( + $draft->getVersionInfo(), + $contentUpdateStruct + ); + /* END: Use Case */ + + foreach ( $updatedDraft->getFields() as $field ) + { + if ( $field->languageCode === 'eng-US' && $field->fieldDefIdentifier === 'name' && $field->value !== null ) + { + // Found field + return; + } + } + $this->fail( + 'Field with identifier "name" in language "eng-US" could not be found or has empty value.' + ); + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft($contentInfo, $versionInfo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testCreateContentDraftWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Now we create a new draft from the initial version + $draftedContentReloaded = $contentService->createContentDraft( + $contentVersion2->contentInfo, + $contentVersion2->getVersionInfo() + ); + /* END: Use Case */ + + $this->assertEquals( 3, $draftedContentReloaded->getVersionInfo()->versionNo ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + */ + public function testPublishVersionFromContentDraft() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + /* END: Use Case */ + + $versionInfo = $contentService->loadVersionInfo( $contentVersion2->contentInfo ); + + $this->assertEquals( + array( + 'status' => VersionInfo::STATUS_PUBLISHED, + 'versionNo' => 2 + ), + array( + 'status' => $versionInfo->status, + 'versionNo' => $versionInfo->versionNo + ) + ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testPublishVersionFromContentDraftArchivesOldVersion() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + /* END: Use Case */ + + $versionInfo = $contentService->loadVersionInfo( $contentVersion2->contentInfo, 1 ); + + $this->assertEquals( + array( + 'status' => VersionInfo::STATUS_ARCHIVED, + 'versionNo' => 1 + ), + array( + 'status' => $versionInfo->status, + 'versionNo' => $versionInfo->versionNo + ) + ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testPublishVersionFromContentDraftUpdatesContentInfoCurrentVersion() + { + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + /* END: Use Case */ + + $this->assertEquals( 2, $contentVersion2->contentInfo->currentVersionNo ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testPublishVersionFromOldContentDraftArchivesNewerVersionNo() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Create a new draft with versionNo = 2 + $draftedContentVersion2 = $contentService->createContentDraft( $content->contentInfo ); + + // Create another new draft with versionNo = 3 + $draftedContentVersion3 = $contentService->createContentDraft( $content->contentInfo ); + + // Publish draft with versionNo = 3 + $contentService->publishVersion( $draftedContentVersion3->getVersionInfo() ); + + // Publish the first draft with versionNo = 2 + // currentVersionNo is now 2, versionNo 3 will be archived + $publishedDraft = $contentService->publishVersion( $draftedContentVersion2->getVersionInfo() ); + /* END: Use Case */ + + $this->assertEquals( 2, $publishedDraft->contentInfo->currentVersionNo ); + } + + /** + * Test for the newContentMetadataUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::newContentMetadataUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + * @group user + */ + public function testNewContentMetadataUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + // Creates a new metadata update struct + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + + $metadataUpdate->remoteId = 'aaaabbbbccccddddeeeeffff11112222'; + $metadataUpdate->mainLanguageCode = 'eng-GB'; + $metadataUpdate->alwaysAvailable = false; + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentMetadataUpdateStruct', + $metadataUpdate + ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testNewContentMetadataUpdateStruct + * @group user + */ + public function testUpdateContentMetadata() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // Creates a metadata update struct + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + + $metadataUpdate->remoteId = 'aaaabbbbccccddddeeeeffff11112222'; + $metadataUpdate->mainLanguageCode = 'eng-GB'; + $metadataUpdate->alwaysAvailable = false; + $metadataUpdate->publishedDate = $this->createDateTime( 441759600 ); // 1984/01/01 + $metadataUpdate->modificationDate = $this->createDateTime( 441759600 ); // 1984/01/01 + + // Update the metadata of the published content object + $content = $contentService->updateContentMetadata( + $content->contentInfo, + $metadataUpdate + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + + return $content; + } + + /** + * Test for the updateContentMetadata() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + */ + public function testUpdateContentMetadataSetsExpectedProperties( $content ) + { + $contentInfo = $content->contentInfo; + + $this->assertEquals( + array( + 'remoteId' => 'aaaabbbbccccddddeeeeffff11112222', + 'sectionId' => $this->generateId( 'section', 1 ), + 'alwaysAvailable' => false, + 'currentVersionNo' => 1, + 'mainLanguageCode' => 'eng-GB', + 'modificationDate' => $this->createDateTime( 441759600 ), + 'ownerId' => $this->getRepository()->getCurrentUser()->id, + 'published' => true, + 'publishedDate' => $this->createDateTime( 441759600 ), + ), + array( + 'remoteId' => $contentInfo->remoteId, + 'sectionId' => $contentInfo->sectionId, + 'alwaysAvailable' => $contentInfo->alwaysAvailable, + 'currentVersionNo' => $contentInfo->currentVersionNo, + 'mainLanguageCode' => $contentInfo->mainLanguageCode, + 'modificationDate' => $contentInfo->modificationDate, + 'ownerId' => $contentInfo->ownerId, + 'published' => $contentInfo->published, + 'publishedDate' => $contentInfo->publishedDate, + ) + ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + */ + public function testUpdateContentMetadataNotUpdatesContentVersion( $content ) + { + $this->assertEquals( 1, $content->getVersionInfo()->versionNo ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + */ + public function testUpdateContentMetadataThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $content = $this->createContentVersion1(); + + // Creates a metadata update struct + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->remoteId = $mediaRemoteId; + + // This call will fail with an "InvalidArgumentException", because the + // specified remoteId is already used by the "Media" page. + $contentService->updateContentMetadata( + $content->contentInfo, + $metadataUpdate + ); + /* END: Use Case */ + } + + /** + * Test for the deleteContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteContent() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testDeleteContent() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Load the locations for this content object + $locations = $locationService->loadLocations( $contentVersion2->contentInfo ); + + // This will delete the content, all versions and the associated locations + $contentService->deleteContent( $contentVersion2->contentInfo ); + /* END: Use Case */ + + foreach ( $locations as $location ) + { + $locationService->loadLocation( $location->id ); + } + } + + /** + * Test for the loadContentDrafts() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentDrafts() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentService + */ + public function testLoadContentDraftsReturnsEmptyArrayByDefault() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + + $contentDrafts = $contentService->loadContentDrafts(); + /* END: Use Case */ + + $this->assertSame( array(), $contentDrafts ); + } + + /** + * Test for the loadContentDrafts() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentDrafts() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + */ + public function testLoadContentDrafts() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // Remote ids of the "Media" and the "eZ Publish Demo Design ..." page + // of a eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + $demoDesignRemoteId = '8b8b22fe3c6061ed500fbd2b377b885f'; + + $contentService = $repository->getContentService(); + + // "Media" content object + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // "eZ Publish Demo Design ..." content object + $demoDesignContentInfo = $contentService->loadContentInfoByRemoteId( $demoDesignRemoteId ); + + // Create some drafts + $contentService->createContentDraft( $mediaContentInfo ); + $contentService->createContentDraft( $demoDesignContentInfo ); + + // Now $contentDrafts should contain two drafted versions + $draftedVersions = $contentService->loadContentDrafts(); + /* END: Use Case */ + + $actual = array( + $draftedVersions[0]->status, + $draftedVersions[0]->getContentInfo()->remoteId, + $draftedVersions[1]->status, + $draftedVersions[1]->getContentInfo()->remoteId, + ); + sort( $actual, SORT_STRING ); + + $this->assertEquals( + array( + VersionInfo::STATUS_DRAFT, + VersionInfo::STATUS_DRAFT, + $demoDesignRemoteId, + $mediaRemoteId, + ), + $actual + ); + } + + /** + * Test for the loadContentDrafts() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentDrafts($user) + * + */ + public function testLoadContentDraftsWithFirstParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Get current user + $oldCurrentUser = $repository->getCurrentUser(); + + // Set new editor as user + $repository->setCurrentUser( $user ); + + // Remote id of the "Media" content object in an eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $contentService = $repository->getContentService(); + + // "Media" content object + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // Create a content draft + $contentService->createContentDraft( $mediaContentInfo ); + + // Reset to previous current user + $repository->setCurrentUser( $oldCurrentUser ); + + // Now $contentDrafts for the previous current user and the new user + $newCurrentUserDrafts = $contentService->loadContentDrafts( $user ); + $oldCurrentUserDrafts = $contentService->loadContentDrafts( $oldCurrentUser ); + /* END: Use Case */ + + $this->assertSame( array(), $oldCurrentUserDrafts ); + + $this->assertEquals( + array( + VersionInfo::STATUS_DRAFT, + $mediaRemoteId, + ), + array( + $newCurrentUserDrafts[0]->status, + $newCurrentUserDrafts[0]->getContentInfo()->remoteId + ) + ); + } + + /** + * Test for the loadVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfo($contentInfo, $versionNo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testLoadVersionInfoWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Will return the $versionInfo of $content + $versionInfo = $contentService->loadVersionInfo( $contentVersion2->contentInfo, 1 ); + /* END: Use Case */ + + $this->assertEquals( 1, $versionInfo->versionNo ); + } + + /** + * Test for the loadVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfo($contentInfo, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfoWithSecondParameter + */ + public function testLoadVersionInfoThrowsNotFoundExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // This call will fail with a "NotFoundException", because not versionNo + // 2 exists for this content object. + $contentService->loadVersionInfo( $draft->contentInfo, 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfoById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfoById($contentId, $versionNo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfoWithSecondParameter + */ + public function testLoadVersionInfoByIdWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Will return the $versionInfo of $content + $versionInfo = $contentService->loadVersionInfoById( $contentVersion2->id, 1 ); + /* END: Use Case */ + + $this->assertEquals( 1, $versionInfo->versionNo ); + } + + /** + * Test for the loadVersionInfoById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersionInfoById($contentId, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadVersionInfoByIdThrowsNotFoundExceptionWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // This call will fail with a "NotFoundException", because not versionNo + // 2 exists for this content object. + $contentService->loadVersionInfoById( $content->id, 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByVersionInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByVersionInfo($versionInfo, $languages) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByVersionInfo + */ + public function testLoadContentByVersionInfoWithSecondParameter() + { + $repository = $this->getRepository(); + + $sectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentService = $repository->getContentService(); + + $contentCreateStruct = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + + $contentCreateStruct->setField( 'name', 'Sindelfingen forum²' ); + + $contentCreateStruct->setField( 'name', 'Sindelfingen forum²³', 'eng-GB' ); + + $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789'; + // $sectionId contains the ID of section 1 + $contentCreateStruct->sectionId = $sectionId; + $contentCreateStruct->alwaysAvailable = true; + + // Create a new content draft + $content = $contentService->createContent( $contentCreateStruct ); + + // Now publish this draft + $publishedContent = $contentService->publishVersion( $content->getVersionInfo() ); + + // Will return a content instance with fields in "eng-US" + $reloadedContent = $contentService->loadContentByVersionInfo( + $publishedContent->getVersionInfo(), + array( + 'eng-GB' + ) + ); + /* END: Use Case */ + + $actual = array(); + foreach ( $reloadedContent->getFields() as $field ) + { + $actual[] = new Field( + array( + 'id' => 0, + 'value' => ( $field->value !== null ? true : null ), // Actual value tested by FieldType integration tests + 'languageCode' => $field->languageCode, + 'fieldDefIdentifier' => $field->fieldDefIdentifier + ) + ); + } + usort( + $actual, + function ( $field1, $field2 ) { + if ( 0 === ( $return = strcasecmp( $field1->fieldDefIdentifier, $field2->fieldDefIdentifier ) ) ) + { + return strcasecmp( $field1->languageCode, $field2->languageCode ); + } + return $return; + } + ); + + $expected = array( + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-GB', + 'fieldDefIdentifier' => 'description' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-GB', + 'fieldDefIdentifier' => 'name' + ) + ), + ); + + $this->assertEquals( $expected, $actual ); + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo($contentInfo, $languages) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfo + */ + public function testLoadContentByContentInfoWithSecondParameter() + { + $repository = $this->getRepository(); + + $sectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + $contentService = $repository->getContentService(); + + $contentCreateStruct = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + + $contentCreateStruct->setField( 'name', 'Sindelfingen forum²' ); + + $contentCreateStruct->setField( 'name', 'Sindelfingen forum²³', 'eng-GB' ); + + $contentCreateStruct->remoteId = 'abcdef0123456789abcdef0123456789'; + // $sectionId contains the ID of section 1 + $contentCreateStruct->sectionId = $sectionId; + $contentCreateStruct->alwaysAvailable = true; + + // Create a new content draft + $content = $contentService->createContent( $contentCreateStruct ); + + // Now publish this draft + $publishedContent = $contentService->publishVersion( $content->getVersionInfo() ); + + // Will return a content instance with fields in "eng-US" + $reloadedContent = $contentService->loadContentByContentInfo( + $publishedContent->contentInfo, + array( + 'eng-US' + ) + ); + /* END: Use Case */ + + $actual = $this->normalizeFields( $reloadedContent->getFields() ); + + $expected = array( + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'description' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => true, + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'name' + ) + ), + ); + + $this->assertEquals( $expected, $actual ); + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo($contentInfo, $languages, $versionNo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfo + * @todo Fix method name to be more descriptive + */ + public function testLoadContentByContentInfoWithThirdParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Will return a Content instance equal to $content + $contentReloaded = $contentService->loadContentByContentInfo( + $contentVersion2->contentInfo, + null, + 1 + ); + /* END: Use Case */ + + $this->assertEquals( + 1, + $contentReloaded->getVersionInfo()->versionNo + ); + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByContentInfo($contentInfo, $languages, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByContentInfoWithThirdParameter + */ + public function testLoadContentByContentInfoThrowsNotFoundExceptionWithThirdParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // This call will fail with a "NotFoundException", because no content + // with versionNo = 2 exists. + $contentService->loadContentByContentInfo( $content->contentInfo, null, 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent($contentId, $languages) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testLoadContentWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createMultipleLanguageDraftVersion1(); + + // This draft contains those fields localized with "eng-GB" + $draftLocalized = $contentService->loadContent( $draft->id, array( 'eng-GB' ) ); + /* END: Use Case */ + + $this->assertLocaleFieldsEquals( $draftLocalized->getFields(), 'eng-GB' ); + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent($contentId, $languages, $versionNo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testLoadContentWithThirdParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draftVersion2 = $this->createContentDraftVersion2(); + + // This content instance is identical to $contentVersion1 + $oldContent = $contentService->loadContent( $draftVersion2->id, null, 1 ); + /* END: Use Case */ + + $this->assertEquals( 1, $oldContent->getVersionInfo()->versionNo ); + } + + /** + * Test for the loadContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContent($contentId, $languages, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentWithThirdParameter + */ + public function testLoadContentThrowsNotFoundExceptionWithThirdParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // This call will fail with a "NotFoundException", because for this + // content object no versionNo=2 exists. + $contentService->loadContent( $content->id, null, 2 ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId($remoteId, $languages) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testLoadContentByRemoteIdWithSecondParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createMultipleLanguageDraftVersion1(); + + $contentService->publishVersion( $draft->versionInfo ); + + // This draft contains those fields localized with "eng-GB" + $draftLocalized = $contentService->loadContentByRemoteId( + $draft->contentInfo->remoteId, + array( 'eng-GB' ) + ); + /* END: Use Case */ + + $this->assertLocaleFieldsEquals( $draftLocalized->getFields(), 'eng-GB' ); + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId($remoteId, $languages, $versionNo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testLoadContentByRemoteIdWithThirdParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draftVersion2 = $this->createContentDraftVersion2(); + + // This content instance is identical to $contentVersion1 + $oldContent = $contentService->loadContentByRemoteId( + $draftVersion2->contentInfo->remoteId, + null, + 1 + ); + /* END: Use Case */ + + $this->assertEquals( 1, $oldContent->getVersionInfo()->versionNo ); + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadContentByRemoteId($remoteId, $languages, $versionNo) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentByRemoteIdWithThirdParameter + */ + public function testLoadContentByRemoteIdThrowsNotFoundExceptionWithThirdParameter() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // This call will fail with a "NotFoundException", because for this + // content object no versionNo=2 exists. + $contentService->loadContentByRemoteId( + $content->contentInfo->remoteId, + null, + 2 + ); + /* END: Use Case */ + } + + /** + * Test for the deleteVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteVersion() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testDeleteVersion() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Delete the previously created draft + $contentService->deleteVersion( $draft->getVersionInfo() ); + /* END: Use Case */ + + $contentService->loadContent( $draft->id ); + } + + /** + * Test for the deleteVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteVersion() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteVersion + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testDeleteVersionThrowsBadStateException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $content = $this->createContentVersion1(); + + // This call will fail with a "BadStateException", because the content + // version is currently published. + $contentService->deleteVersion( $content->getVersionInfo() ); + /* END: Use Case */ + } + + /** + * Test for the loadVersions() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadVersions() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testLoadVersions() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Load versions of this ContentInfo instance + $versions = $contentService->loadVersions( $contentVersion2->contentInfo ); + /* END: Use Case */ + + $expectedVersionIds = array( + $contentService->loadVersionInfo( $contentVersion2->contentInfo, 1 )->id => true, + $contentService->loadVersionInfo( $contentVersion2->contentInfo, 2 )->id => true, + ); + + foreach ( $versions as $actualVersion ) + { + if ( !isset( $expectedVersionIds[$actualVersion->id] ) ) + { + $this->fail( "Unexpected version with ID '{$actualVersion->id}' loaded." ); + } + unset( $expectedVersionIds[$actualVersion->id] ); + } + + if ( !empty( $expectedVersionIds ) ) + { + $this->fail( + sprintf( + "Expected versions not loaded: '%s'", + implode( "', '", $expectedVersionIds ) + ) + ); + } + } + + /** + * Test for the copyContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::copyContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + * @group field-type + */ + public function testCopyContent() + { + $parentLocationId = $this->generateId( 'location', 56 ); + + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createMultipleLanguageContentVersion2(); + + // Configure new target location + $targetLocationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $targetLocationCreate->priority = 42; + $targetLocationCreate->hidden = true; + $targetLocationCreate->remoteId = '01234abcdef5678901234abcdef56789'; + $targetLocationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $targetLocationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // Copy content with all versions and drafts + $contentCopied = $contentService->copyContent( + $contentVersion2->contentInfo, + $targetLocationCreate + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $contentCopied + ); + + $this->assertNotEquals( + $contentVersion2->contentInfo->remoteId, + $contentCopied->contentInfo->remoteId + ); + + $this->assertNotEquals( + $contentVersion2->id, + $contentCopied->id + ); + + $this->assertEquals( + 2, + count( $contentService->loadVersions( $contentCopied->contentInfo ) ) + ); + + $this->assertEquals( 2, $contentCopied->getVersionInfo()->versionNo ); + + $this->assertAllFieldsEquals( $contentCopied->getFields() ); + } + + /** + * Test for the copyContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::copyContent($contentInfo, $destinationLocationCreateStruct, $versionInfo) + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCopyContent + * @todo Fix to more descriptive name + */ + public function testCopyContentWithThirdParameter() + { + $parentLocationId = $this->generateId( 'location', 56 ); + + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + /* BEGIN: Use Case */ + $contentVersion2 = $this->createContentVersion2(); + + // Configure new target location + $targetLocationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $targetLocationCreate->priority = 42; + $targetLocationCreate->hidden = true; + $targetLocationCreate->remoteId = '01234abcdef5678901234abcdef56789'; + $targetLocationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $targetLocationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // Copy only the initial version + $contentCopied = $contentService->copyContent( + $contentVersion2->contentInfo, + $targetLocationCreate, + $contentService->loadVersionInfo( $contentVersion2->contentInfo, 1 ) + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $contentCopied + ); + + $this->assertNotEquals( + $contentVersion2->contentInfo->remoteId, + $contentCopied->contentInfo->remoteId + ); + + $this->assertNotEquals( + $contentVersion2->id, + $contentCopied->id + ); + + $this->assertEquals( + 1, + count( $contentService->loadVersions( $contentCopied->contentInfo ) ) + ); + + $this->assertEquals( 1, $contentCopied->getVersionInfo()->versionNo ); + } + + /** + * Test for the addRelation() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @see \eZ\Publish\API\Repository\ContentService::addRelation() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersionFromContentDraft + */ + public function testAddRelation() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // RemoteId of the "Media" content of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $draft = $this->createContentDraftVersion1(); + + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // Create relation between new content object and "Media" page + $relation = $contentService->addRelation( + $draft->getVersionInfo(), + $media + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Relation', + $relation + ); + + return $contentService->loadRelations( $draft->getVersionInfo() ); + } + + /** + * Test for the addRelation() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Relation[] $relations + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::addRelation() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testAddRelation + */ + public function testAddRelationAddsRelationToContent( $relations ) + { + $this->assertEquals( + 1, + count( $relations ) + ); + } + + /** + * Test for the addRelation() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Relation[] $relations + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::addRelation() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testAddRelation + */ + public function testAddRelationSetsExpectedRelations( $relations ) + { + $this->assertEquals( + array( + 'type' => Relation::COMMON, + 'sourceFieldDefinitionIdentifier' => null, + 'sourceContentInfo' => 'abcdef0123456789abcdef0123456789', + 'destinationContentInfo' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + ), + array( + 'type' => $relations[0]->type, + 'sourceFieldDefinitionIdentifier' => $relations[0]->sourceFieldDefinitionIdentifier, + 'sourceContentInfo' => $relations[0]->sourceContentInfo->remoteId, + 'destinationContentInfo' => $relations[0]->destinationContentInfo->remoteId, + ) + ); + } + + /** + * Test for the addRelation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::addRelation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testAddRelation + */ + public function testAddRelationThrowsBadStateException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $content = $this->createContentVersion1(); + + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // This call will fail with a "BadStateException", because content is + // published and not a draft. + $contentService->addRelation( + $content->getVersionInfo(), + $media + ); + /* END: Use Case */ + } + + /** + * Test for the loadRelations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadRelations() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testAddRelation + */ + public function testLoadRelations() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Remote ids of the "Media" and the "eZ Publish Demo Design ..." page + // of a eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + $demoDesignRemoteId = '8b8b22fe3c6061ed500fbd2b377b885f'; + + $draft = $this->createContentDraftVersion1(); + + // Load other content objects + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + $demoDesign = $contentService->loadContentInfoByRemoteId( $demoDesignRemoteId ); + + // Create relation between new content object and "Media" page + $contentService->addRelation( + $draft->getVersionInfo(), + $media + ); + + // Create another relation with the "Demo Design" page + $contentService->addRelation( + $draft->getVersionInfo(), + $demoDesign + ); + + // Load all relations + $relations = $contentService->loadRelations( $draft->getVersionInfo() ); + /* END: Use Case */ + + usort( + $relations, + function( $rel1, $rel2 ) { + return strcasecmp( + $rel2->getDestinationContentInfo()->remoteId, + $rel1->getDestinationContentInfo()->remoteId + ); + } + ); + + $this->assertEquals( + array( + array( + 'sourceContentInfo' => 'abcdef0123456789abcdef0123456789', + 'destinationContentInfo' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + ), + array( + 'sourceContentInfo' => 'abcdef0123456789abcdef0123456789', + 'destinationContentInfo' => '8b8b22fe3c6061ed500fbd2b377b885f', + ) + ), + array( + array( + 'sourceContentInfo' => $relations[0]->sourceContentInfo->remoteId, + 'destinationContentInfo' => $relations[0]->destinationContentInfo->remoteId, + ), + array( + 'sourceContentInfo' => $relations[1]->sourceContentInfo->remoteId, + 'destinationContentInfo' => $relations[1]->destinationContentInfo->remoteId, + ) + ) + ); + } + + /** + * Test for the loadReverseRelations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::loadReverseRelations() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testAddRelation + */ + public function testLoadReverseRelations() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Remote ids of the "Media" and the "eZ Publish Demo Design ..." page + // of a eZ Publish demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + $demoDesignRemoteId = '8b8b22fe3c6061ed500fbd2b377b885f'; + + $versionInfo = $this->createContentVersion1()->getVersionInfo(); + $contentInfo = $versionInfo->getContentInfo(); + + // Create some drafts + $mediaDraft = $contentService->createContentDraft( + $contentService->loadContentInfoByRemoteId( $mediaRemoteId ) + ); + $demoDesignDraft = $contentService->createContentDraft( + $contentService->loadContentInfoByRemoteId( $demoDesignRemoteId ) + ); + + // Create relation between new content object and "Media" page + $relation1 = $contentService->addRelation( + $mediaDraft->getVersionInfo(), + $contentInfo + ); + + // Create another relation with the "Demo Design" page + $relation2 = $contentService->addRelation( + $demoDesignDraft->getVersionInfo(), + $contentInfo + ); + + // Publish drafts, so relations become active + $contentService->publishVersion( $mediaDraft->getVersionInfo() ); + $contentService->publishVersion( $demoDesignDraft->getVersionInfo() ); + + // Load all relations + $relations = $contentService->loadRelations( $versionInfo ); + $reverseRelations = $contentService->loadReverseRelations( $contentInfo ); + /* END: Use Case */ + + $this->assertEquals( $contentInfo->id, $relation1->getDestinationContentInfo()->id ); + $this->assertEquals( $mediaDraft->id, $relation1->getSourceContentInfo()->id ); + + $this->assertEquals( $contentInfo->id, $relation2->getDestinationContentInfo()->id ); + $this->assertEquals( $demoDesignDraft->id, $relation2->getSourceContentInfo()->id ); + + $this->assertEquals( 0, count( $relations ) ); + $this->assertEquals( 2, count( $reverseRelations ) ); + + usort( + $reverseRelations, + function( $rel1, $rel2 ) { + return strcasecmp( + $rel2->getSourceContentInfo()->remoteId, + $rel1->getSourceContentInfo()->remoteId + ); + } + ); + + $this->assertEquals( + array( + array( + 'sourceContentInfo' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + 'destinationContentInfo' => 'abcdef0123456789abcdef0123456789', + ), + array( + 'sourceContentInfo' => '8b8b22fe3c6061ed500fbd2b377b885f', + 'destinationContentInfo' => 'abcdef0123456789abcdef0123456789', + ) + ), + array( + array( + 'sourceContentInfo' => $reverseRelations[0]->sourceContentInfo->remoteId, + 'destinationContentInfo' => $reverseRelations[0]->destinationContentInfo->remoteId, + ), + array( + 'sourceContentInfo' => $reverseRelations[1]->sourceContentInfo->remoteId, + 'destinationContentInfo' => $reverseRelations[1]->destinationContentInfo->remoteId, + ) + ) + ); + } + + /** + * Test for the deleteRelation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteRelation() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadRelations + */ + public function testDeleteRelation() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Remote ids of the "Media" and the "Demo Design" page of a eZ Publish + // demo installation. + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + $demoDesignRemoteId = '8b8b22fe3c6061ed500fbd2b377b885f'; + + $draft = $this->createContentDraftVersion1(); + + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + $demoDesign = $contentService->loadContentInfoByRemoteId( $demoDesignRemoteId ); + + // Establish some relations + $contentService->addRelation( $draft->getVersionInfo(), $media ); + $contentService->addRelation( $draft->getVersionInfo(), $demoDesign ); + + // Delete one of the currently created relations + $contentService->deleteRelation( $draft->getVersionInfo(), $media ); + + // The relations array now contains only one element + $relations = $contentService->loadRelations( $draft->getVersionInfo() ); + /* END: Use Case */ + + $this->assertEquals( 1, count( $relations ) ); + } + + /** + * Test for the deleteRelation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteRelation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteRelation + */ + public function testDeleteRelationThrowsBadStateException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $content = $this->createContentVersion1(); + + // Load the destination object + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // Create a new draft + $draftVersion2 = $contentService->createContentDraft( $content->contentInfo ); + + // Add a relation + $contentService->addRelation( $draftVersion2->getVersionInfo(), $media ); + + // Publish new version + $contentVersion2 = $contentService->publishVersion( + $draftVersion2->getVersionInfo() + ); + + // This call will fail with a "BadStateException", because content is + // published and not a draft. + $contentService->deleteRelation( + $contentVersion2->getVersionInfo(), + $media + ); + /* END: Use Case */ + } + + /** + * Test for the deleteRelation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteRelation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteRelation + */ + public function testDeleteRelationThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $draft = $this->createContentDraftVersion1(); + + // Load the destination object + $media = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // This call will fail with a "InvalidArgumentException", because no + // relation exists between $draft and $media. + $contentService->deleteRelation( + $draft->getVersionInfo(), + $media + ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testCreateContentInTransactionWithRollback() + { + if ( $this->isVersion4() ) + { + $this->markTestSkipped( "This test requires eZ Publish 5" ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + // Start a transaction + $repository->beginTransaction(); + + try + { + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + // Get a content create struct and set mandatory properties + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate->setField( 'name', 'Sindelfingen forum' ); + + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Create a new content object + $contentId = $contentService->createContent( $contentCreate )->id; + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentService->loadContent( $contentId ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + // This is expected + return; + } + /* END: Use Case */ + + $this->fail( 'Content object still exists after rollback.' ); + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testCreateContentInTransactionWithCommit() + { + if ( $this->isVersion4() ) + { + $this->markTestSkipped( "This test requires eZ Publish 5" ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + + // Start a transaction + $repository->beginTransaction(); + + try + { + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'forum' ); + + // Get a content create struct and set mandatory properties + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $contentCreate->setField( 'name', 'Sindelfingen forum' ); + + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Create a new content object + $contentId = $contentService->createContent( $contentCreate )->id; + + // Commit changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load the new content object + $content = $contentService->loadContent( $contentId ); + /* END: Use Case */ + + $this->assertEquals( $contentId, $content->id ); + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent($contentCreateStruct, $locationCreateStructs) + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentThrowsNotFoundException + */ + public function testCreateContentWithLocationCreateParameterInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Start a transaction + $repository->beginTransaction(); + + try + { + $draft = $this->createContentDraftVersion1(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + $contentId = $draft->id; + + // Roleback the transaction + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentService->loadContent( $contentId ); + } + catch ( NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Can still load content object after rollback.' ); + } + + /** + * Test for the createContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContent($contentCreateStruct, $locationCreateStructs) + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentWithLocationCreateParameterDoesNotCreateLocationImmediately + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentThrowsNotFoundException + */ + public function testCreateContentWithLocationCreateParameterInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + // Start a transaction + $repository->beginTransaction(); + + try + { + $draft = $this->createContentDraftVersion1(); + + $contentId = $draft->id; + + // Roleback the transaction + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load the new content object + $content = $contentService->loadContent( $contentId ); + /* END: Use Case */ + + $this->assertEquals( $contentId, $content->id ); + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testCreateContentDraftInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Load the user group content object + $content = $contentService->loadContent( $contentId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create a new draft + $drafted = $contentService->createContentDraft( $content->contentInfo ); + + // Store version number for later reuse + $versionNo = $drafted->versionInfo->versionNo; + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentService->loadContent( $contentId, null, $versionNo ); + } + catch ( NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Can still load content draft after rollback' ); + } + + /** + * Test for the createContentDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::createContentDraft() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContentDraft + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testCreateContentDraftInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Load the user group content object + $content = $contentService->loadContent( $contentId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create a new draft + $drafted = $contentService->createContentDraft( $content->contentInfo ); + + // Store version number for later reuse + $versionNo = $drafted->versionInfo->versionNo; + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + $content = $contentService->loadContent( $contentId, null, $versionNo ); + /* END: Use Case */ + + $this->assertEquals( + $versionNo, + $content->getVersionInfo()->versionNo + ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + */ + public function testPublishVersionInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Load the user group content object + $content = $contentService->loadContent( $contentId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + $draftVersion = $contentService->createContentDraft( $content->contentInfo )->getVersionInfo(); + + // Publish a new version + $content = $contentService->publishVersion( $draftVersion ); + + // Store version number for later reuse + $versionNo = $content->versionInfo->versionNo; + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentService->loadContent( $contentId, null, $versionNo ); + } + catch ( NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Can still load content draft after rollback' ); + } + + /** + * Test for the publishVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::publishVersion() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadVersionInfo + */ + public function testPublishVersionInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // ID of the "Administrator users" user group + $contentId = 12; + + // Get the content service + $contentService = $repository->getContentService(); + + // Load the user group content object + $template = $contentService->loadContent( $contentId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Publish a new version + $content = $contentService->publishVersion( + $contentService->createContentDraft( $template->contentInfo )->getVersionInfo() + ); + + // Store version number for later reuse + $versionNo = $content->versionInfo->versionNo; + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load current version info + $versionInfo = $contentService->loadVersionInfo( $content->contentInfo ); + /* END: Use Case */ + + $this->assertEquals( $versionNo, $versionInfo->versionNo ); + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testUpdateContentInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Load content service + $contentService = $repository->getContentService(); + + // Create a new user group draft + $draft = $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + + // Get an update struct and change the group name + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'Administrators', 'eng-US' ); + + // Start a transaction + $repository->beginTransaction(); + + try + { + // Update the group name + $draft = $contentService->updateContent( + $draft->getVersionInfo(), + $contentUpdate + ); + + // Publish updated version + $contentService->publishVersion( $draft->getVersionInfo() ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes. + $repository->rollback(); + + // Name will still be "Administrator users" + $name = $contentService->loadContent( $contentId )->getFieldValue( 'name' ); + /* END: Use Case */ + + $this->assertEquals( 'Administrator users', $name ); + } + + /** + * Test for the updateContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testUpdateContentInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Load content service + $contentService = $repository->getContentService(); + + // Create a new user group draft + $draft = $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + + // Get an update struct and change the group name + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'Administrators', 'eng-US' ); + + // Start a transaction + $repository->beginTransaction(); + + try + { + // Update the group name + $draft = $contentService->updateContent( + $draft->getVersionInfo(), + $contentUpdate + ); + + // Publish updated version + $contentService->publishVersion( $draft->getVersionInfo() ); + + // Commit all changes. + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Name is now "Administrators" + $name = $contentService->loadContent( $contentId )->getFieldValue( 'name', 'eng-US' ); + /* END: Use Case */ + + $this->assertEquals( 'Administrators', $name ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testUpdateContentMetadataInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Load a ContentInfo object + $contentInfo = $contentService->loadContentInfo( $contentId ); + + // Store remoteId for later testing + $remoteId = $contentInfo->remoteId; + + // Start a transaction + $repository->beginTransaction(); + + try + { + // Get metadata update struct and change remoteId + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->remoteId = md5( microtime( true ) ); + + // Update the metadata of the published content object + $contentService->updateContentMetadata( + $contentInfo, + $metadataUpdate + ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes. + $repository->rollback(); + + // Load current remoteId + $remoteIdReloaded = $contentService->loadContentInfo( $contentId )->remoteId; + /* END: Use Case */ + + $this->assertEquals( $remoteId, $remoteIdReloaded ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::updateContentMetadata() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testUpdateContentMetadataInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Load a ContentInfo object + $contentInfo = $contentService->loadContentInfo( $contentId ); + + // Store remoteId for later testing + $remoteId = $contentInfo->remoteId; + + // Start a transaction + $repository->beginTransaction(); + + try + { + // Get metadata update struct and change remoteId + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->remoteId = md5( microtime( true ) ); + + // Update the metadata of the published content object + $contentService->updateContentMetadata( + $contentInfo, + $metadataUpdate + ); + + // Commit all changes. + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load current remoteId + $remoteIdReloaded = $contentService->loadContentInfo( $contentId )->remoteId; + /* END: Use Case */ + + $this->assertNotEquals( $remoteId, $remoteIdReloaded ); + } + + /** + * Test for the deleteVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteVersion() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentDrafts + */ + public function testDeleteVersionInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create a new draft + $draft = $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + + $contentService->deleteVersion( $draft->getVersionInfo() ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes. + $repository->rollback(); + + // This array will be empty + $drafts = $contentService->loadContentDrafts(); + /* END: Use Case */ + + $this->assertSame( array(), $drafts ); + } + + /** + * Test for the deleteVersion() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteVersion() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentDrafts + */ + public function testDeleteVersionInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Administrator users" user group + + // Get the content service + $contentService = $repository->getContentService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create a new draft + $draft = $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + + $contentService->deleteVersion( $draft->getVersionInfo() ); + + // Commit all changes. + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // This array will contain no element + $drafts = $contentService->loadContentDrafts(); + /* END: Use Case */ + + $this->assertSame( array(), $drafts ); + } + + /** + * Test for the deleteContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testDeleteContentInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 11 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Members" user group in an eZ Publish + // demo installation + + // Get content service + $contentService = $repository->getContentService(); + + // Load a ContentInfo instance + $contentInfo = $contentService->loadContentInfo( $contentId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Delete content object + $contentService->deleteContent( $contentInfo ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // This call will return the original content object + $contentInfo = $contentService->loadContentInfo( $contentId ); + /* END: Use Case */ + + $this->assertEquals( $contentId, $contentInfo->id ); + } + + /** + * Test for the deleteContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::deleteContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + */ + public function testDeleteContentInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 11 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Members" user group in an eZ Publish + // demo installation + + // Get content service + $contentService = $repository->getContentService(); + + // Load a ContentInfo instance + $contentInfo = $contentService->loadContentInfo( $contentId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Delete content object + $contentService->deleteContent( $contentInfo ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Deleted content info is not found anymore + try + { + $contentService->loadContentInfo( $contentId ); + } + catch ( NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Can still load ContentInfo after commit.' ); + } + + /** + * Test for the copyContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::copyContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCopyContent + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildren + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testCopyContentInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 11 ); + $locationId = $this->generateId( 'location', 13 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Members" user group in an eZ Publish + // demo installation + + // $locationId is the ID of the "Adminstrator users" group location + + // Get services + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // Load content object to copy + $content = $contentService->loadContent( $contentId ); + + // Create new target location + $locationCreate = $locationService->newLocationCreateStruct( $locationId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Copy content with all versions and drafts + $contentService->copyContent( + $content->contentInfo, + $locationCreate + ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // This array will only contain a single admin user object + $locations = $locationService->loadLocationChildren( + $locationService->loadLocation( $locationId ) + )->locations; + /* END: Use Case */ + + $this->assertEquals( 1, count( $locations ) ); + } + + /** + * Test for the copyContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentService::copyContent() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCopyContent + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildren + * @depend(s) eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testCopyContentInTransactionWithCommit() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 11 ); + $locationId = $this->generateId( 'location', 13 ); + /* BEGIN: Use Case */ + // $contentId is the ID of the "Members" user group in an eZ Publish + // demo installation + + // $locationId is the ID of the "Administrator users" group location + + // Get services + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // Load content object to copy + $content = $contentService->loadContent( $contentId ); + + // Create new target location + $locationCreate = $locationService->newLocationCreateStruct( $locationId ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Copy content with all versions and drafts + $contentCopied = $contentService->copyContent( + $content->contentInfo, + $locationCreate + ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // This will contain the admin user and the new child location + $locations = $locationService->loadLocationChildren( + $locationService->loadLocation( $locationId ) + )->locations; + /* END: Use Case */ + + $this->assertEquals( 2, count( $locations ) ); + } + + /** + * @return void + */ + public function testURLAliasesCreatedForNewContent() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + $urlAliasService = $repository->getURLAliasService(); + + /* BEGIN: Use Case */ + $draft = $this->createContentDraftVersion1(); + + // Automatically creates a new URLAlias for the content + $liveContent = $contentService->publishVersion( $draft->getVersionInfo() ); + /* END: Use Case */ + + $location = $locationService->loadLocation( + $liveContent->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $aliases = $urlAliasService->listLocationAliases( $location, false ); + + $this->assertAliasesCorrect( + array( + '/Design/Plain-site/An-awesome-forum' => array( + 'type' => URLAlias::LOCATION, + 'destination' => $location->id, + 'path' => '/Design/Plain-site/An-awesome-forum', + 'languageCodes' => array( 'eng-US' ), + 'isHistory' => false, + 'isCustom' => false, + 'forward' => false, + ), + ), + $aliases + ); + } + + /** + * @return void + */ + public function testURLAliasesCreatedForUpdatedContent() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + $urlAliasService = $repository->getURLAliasService(); + + /* BEGIN: Use Case */ + $draft = $this->createUpdatedDraftVersion2(); + + // Automatically marks old aliases for the content as history + // and creates new aliases, based on the changes + $liveContent = $contentService->publishVersion( $draft->getVersionInfo() ); + /* END: Use Case */ + + $location = $locationService->loadLocation( + $liveContent->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $aliases = $urlAliasService->listLocationAliases( $location, false ); + + $this->assertAliasesCorrect( + array( + '/Design/Plain-site/An-awesome-forum2' => array( + 'type' => URLAlias::LOCATION, + 'destination' => $location->id, + 'path' => '/Design/Plain-site/An-awesome-forum2', + 'languageCodes' => array( 'eng-US' ), + 'isHistory' => false, + 'isCustom' => false, + 'forward' => false, + ), + '/Design/Plain-site/An-awesome-forum23' => array( + 'type' => URLAlias::LOCATION, + 'destination' => $location->id, + 'path' => '/Design/Plain-site/An-awesome-forum23', + 'languageCodes' => array( 'eng-GB' ), + 'isHistory' => false, + 'isCustom' => false, + 'forward' => false, + ), + ), + $aliases + ); + } + + /** + * @return void + */ + public function testCustomURLAliasesNotHistorizedOnUpdatedContent() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + $locationService = $repository->getLocationService(); + + $content = $this->createContentVersion1(); + + // Create a custom URL alias + $urlAliasService->createUrlAlias( + $locationService->loadLocation( + $content->getVersionInfo()->getContentInfo()->mainLocationId + ), + '/my/fancy/story-about-ez-publish', + 'eng-US' + ); + + $draftVersion2 = $contentService->createContentDraft( $content->contentInfo ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->initialLanguageCode = 'eng-US'; + $contentUpdate->setField( 'name', 'Amazing Bielefeld forum' ); + + $draftVersion2 = $contentService->updateContent( + $draftVersion2->getVersionInfo(), + $contentUpdate + ); + + // Only marks auto-generated aliases as history + // the custom one is left untouched + $liveContent = $contentService->publishVersion( $draftVersion2->getVersionInfo() ); + /* END: Use Case */ + + $location = $locationService->loadLocation( + $liveContent->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $aliases = $urlAliasService->listLocationAliases( $location ); + + $this->assertAliasesCorrect( + array( + '/my/fancy/story-about-ez-publish' => array( + 'type' => URLAlias::LOCATION, + 'destination' => $location->id, + 'path' => '/my/fancy/story-about-ez-publish', + 'languageCodes' => array( 'eng-US' ), + 'isHistory' => false, + 'isCustom' => true, + 'forward' => false, + 'alwaysAvailable' => false, + ), + ), + $aliases + ); + } + + /** + * Test to ensure that old versions are not affected by updates to newer + * drafts. + * + * @return void + */ + public function testUpdatingDraftDoesNotUpdateOldVersions() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + $contentService = $repository->getContentService(); + + $contentVersion2 = $this->createContentVersion2(); + + $loadedContent1 = $contentService->loadContent( $contentVersion2->id, null, 1 ); + $loadedContent2 = $contentService->loadContent( $contentVersion2->id, null, 2 ); + + $this->assertNotEquals( + $loadedContent1->getFieldValue( 'name', 'eng-US' ), + $loadedContent2->getFieldValue( 'name', 'eng-US' ) + ); + } + + /** + * Asserts that all aliases defined in $expectedAliasProperties with the + * given properties are available in $actualAliases and not more. + * + * @param array $expectedAliasProperties + * @param array $actualAliases + * + * @return void + */ + private function assertAliasesCorrect( array $expectedAliasProperties, array $actualAliases ) + { + foreach ( $actualAliases as $actualAlias ) + { + if ( !isset( $expectedAliasProperties[$actualAlias->path] ) ) + { + $this->fail( + sprintf( + 'Alias with path "%s" in languages "%s" not expected.', + $actualAlias->path, + implode( ', ', $actualAlias->languageCodes ) + ) + ); + } + + foreach ( $expectedAliasProperties[$actualAlias->path] as $propertyName => $propertyValue ) + { + $this->assertEquals( + $propertyValue, + $actualAlias->$propertyName, + sprintf( + 'Property $%s incorrect on alias with path "%s" in languages "%s".', + $propertyName, + $actualAlias->path, + implode( ', ', $actualAlias->languageCodes ) + ) + ); + } + + unset( $expectedAliasProperties[$actualAlias->path] ); + } + + if ( !empty( $expectedAliasProperties ) ) + { + $this->fail( + sprintf( + 'Missing expected aliases with paths "%s".', + implode( '", "', array_keys( $expectedAliasProperties ) ) + ) + ); + } + } + + /** + * Asserts that the given fields are equal to the default fields fixture. + * + * @param \eZ\Publish\API\Repository\Values\Content\Field[] $fields + * + * @return void + */ + private function assertAllFieldsEquals( array $fields ) + { + $actual = $this->normalizeFields( $fields ); + $expected = $this->normalizeFields( $this->createFieldsFixture() ); + + $this->assertEquals( $expected, $actual ); + } + + /** + * Asserts that the given fields are equal to a language filtered set of the + * default fields fixture. + * + * @param \eZ\Publish\API\Repository\Values\Content\Field[] $fields + * @param string $languageCode + * + * @return void + */ + private function assertLocaleFieldsEquals( array $fields, $languageCode ) + { + $actual = $this->normalizeFields( $fields ); + + $expected = array(); + foreach ( $this->normalizeFields( $this->createFieldsFixture() ) as $field ) + { + if ( $field->languageCode !== $languageCode ) + { + continue; + } + $expected[] = $field; + } + + $this->assertEquals( $expected, $actual ); + } + + /** + * This method normalizes a set of fields and returns a normalized set. + * + * Normalization means it resets the storage specific field id to zero and + * it sorts the field by their identifier and their language code. In + * addition, the field value is removed, since this one depends on the + * specific FieldType, which is tested in a dedicated integration test. + * + * @param \eZ\Publish\API\Repository\Values\Content\Field[] $fields + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + private function normalizeFields( array $fields ) + { + $normalized = array(); + foreach ( $fields as $field ) + { + $normalized[] = new Field( + array( + 'id' => 0, + 'value' => ( $field->value !== null ? true : null ), + 'languageCode' => $field->languageCode, + 'fieldDefIdentifier' => $field->fieldDefIdentifier + ) + ); + } + usort( + $normalized, + function ( $field1, $field2 ) { + if ( 0 === ( $return = strcasecmp( $field1->fieldDefIdentifier, $field2->fieldDefIdentifier ) ) ) + { + return strcasecmp( $field1->languageCode, $field2->languageCode ); + } + return $return; + } + ); + + return $normalized; + } + + /** + * Returns a filtered set of the default fields fixture. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + private function createLocaleFieldsFixture( $languageCode ) + { + $fields = array(); + foreach ( $this->createFieldsFixture() as $field ) + { + if ( null === $field->languageCode || $languageCode === $field->languageCode ) + { + $fields[] = $field; + } + } + return $fields; + } + + /** + * Returns the default fixture of fields used in most tests. + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + private function createFieldsFixture() + { + return array( + new Field( + array( + 'id' => 0, + 'value' => 'Foo', + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'description' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => 'Bar', + 'languageCode' => 'eng-GB', + 'fieldDefIdentifier' => 'description' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => 'An awesome multi-lang forum²', + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'name' + ) + ), + new Field( + array( + 'id' => 0, + 'value' => 'An awesome multi-lang forum²³', + 'languageCode' => 'eng-GB', + 'fieldDefIdentifier' => 'name' + ) + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php new file mode 100644 index 0000000..705449e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php @@ -0,0 +1,497 @@ +getRepository(); + + $creatorId = $this->generateId( 'user', 14 ); + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $contentTypeService = $repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + // $creatorId is the ID of the administrator user + $groupCreate->creatorId = $creatorId; + $groupCreate->creationDate = $this->createDateTime(); + /* @todo uncomment when support for multilingual names and descriptions is added + $groupCreate->mainLanguageCode = 'ger-DE'; + $groupCreate->names = array( 'eng-GB' => 'A name.' ); + $groupCreate->descriptions = array( 'eng-GB' => 'A description.' ); + */ + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->createContentTypeGroup( $groupCreate ); + /* END: Use Case */ + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeGroup + */ + public function testUpdateContentTypeGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $modifierId = $this->generateId( 'user', 42 ); + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $contentTypeService = $repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + + $groupUpdate->identifier = 'Teardown'; + // $modifierId is the ID of a random user + $groupUpdate->modifierId = $modifierId; + $groupUpdate->modificationDate = $this->createDateTime(); + /* @todo uncomment when support for multilingual names and descriptions is added + $groupUpdate->mainLanguageCode = 'eng-GB'; + + $groupUpdate->names = array( + 'eng-GB' => 'A name', + 'eng-US' => 'A name', + ); + $groupUpdate->descriptions = array( + 'eng-GB' => 'A description', + 'eng-US' => 'A description', + ); + */ + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testDeleteContentTypeGroup + */ + public function testDeleteContentTypeGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $contentTypeService = $repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $contentTypeService->createContentTypeGroup( $groupCreate ); + + // ... + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->deleteContentTypeGroup( $group ); + /* END: Use Case */ + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeDraft + */ + public function testUpdateContentTypeDraftThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $modifierId = $this->generateId( 'user', 42 ); + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->identifier = 'news-article'; + $typeUpdate->remoteId = '4cf35f5166fd31bf0cda859dc837e095daee9833'; + $typeUpdate->urlAliasSchema = 'url@alias|scheme'; + $typeUpdate->nameSchema = '@name@scheme@'; + $typeUpdate->isContainer = true; + $typeUpdate->mainLanguageCode = 'ger-DE'; + $typeUpdate->defaultAlwaysAvailable = false; + // $modifierId is the ID of a random user + $typeUpdate->modifierId = $modifierId; + $typeUpdate->modificationDate = $this->createDateTime(); + $typeUpdate->names = array( + 'eng-GB' => 'News article', + 'ger-DE' => 'Nachrichten-Artikel', + ); + $typeUpdate->descriptions = array( + 'eng-GB' => 'A news article', + 'ger-DE' => 'Ein Nachrichten-Artikel', + ); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + } + + /** + * Test for the addFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::addFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceAuthorizationTest::testAddFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAddFieldDefinition + */ + public function testAddFieldDefinitionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'tags', 'string' + ); + $fieldDefCreate->names = array( + 'eng-GB' => 'Tags', + 'ger-DE' => 'Schlagworte', + ); + $fieldDefCreate->descriptions = array( + 'eng-GB' => 'Tags of the blog post', + 'ger-DE' => 'Schlagworte des Blog-Eintrages', + ); + $fieldDefCreate->fieldGroup = 'blog-meta'; + $fieldDefCreate->position = 1; + $fieldDefCreate->isTranslatable = true; + $fieldDefCreate->isRequired = true; + $fieldDefCreate->isInfoCollector = false; + $fieldDefCreate->validatorConfiguration = array( + 'StringLengthValidator' => array( + 'minStringLength' => 0, + 'maxStringLength' => 0, + ), + ); + $fieldDefCreate->fieldSettings = array( + 'textRows' => 10 + ); + $fieldDefCreate->isSearchable = true; + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + /* END: Use Case */ + } + + /** + * Test for the removeFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::removeFieldDefinition() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testRemoveFieldDefinition + */ + public function testRemoveFieldDefinitionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + /* END: Use Case */ + } + + /** + * Test for the updateFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateFieldDefinition() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateFieldDefinition + */ + public function testUpdateFieldDefinitionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + + $bodyUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $bodyUpdateStruct->identifier = 'blog-body'; + $bodyUpdateStruct->names = array( + 'eng-GB' => 'Blog post body', + 'ger-DE' => 'Blog-Eintrags-Textkörper', + ); + $bodyUpdateStruct->descriptions = array( + 'eng-GB' => 'Blog post body of the blog post', + 'ger-DE' => 'Blog-Eintrags-Textkörper des Blog-Eintrages', + ); + $bodyUpdateStruct->fieldGroup = 'updated-blog-content'; + $bodyUpdateStruct->position = 3; + $bodyUpdateStruct->isTranslatable = false; + $bodyUpdateStruct->isRequired = false; + $bodyUpdateStruct->isInfoCollector = true; + $bodyUpdateStruct->validatorConfiguration = array(); + $bodyUpdateStruct->fieldSettings = array( + 'textRows' => 60 + ); + $bodyUpdateStruct->isSearchable = false; + + // This call will fail with a "UnauthorizedException" + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $bodyField, + $bodyUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::publishContentTypeDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testPublishContentTypeDraft + */ + public function testPublishContentTypeDraftThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + /* END: Use Case */ + } + + /** + * Test for the createContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeDraft + */ + public function testCreateContentTypeDraftThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->createContentTypeDraft( $commentType ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testDeleteContentType + */ + public function testDeleteContentTypeThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->deleteContentType( $commentType ); + /* END: Use Case */ + } + + /** + * Test for the copyContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::copyContentType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + */ + public function testCopyContentTypeThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->copyContentType( $commentType ); + /* END: Use Case */ + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::assignContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAssignContentTypeGroup + */ + public function testAssignContentTypeGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + /* END: Use Case */ + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::unassignContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUnassignContentTypeGroup + */ + public function testUnassignContentTypeGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ); + + // May not unassign last group + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + + // Load the user service + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $contentTypeService->unassignContentTypeGroup( $folderType, $contentGroup ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php b/eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php new file mode 100644 index 0000000..09d99fc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php @@ -0,0 +1,3303 @@ +getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupCreateStruct', + $groupCreate + ); + return $groupCreate; + } + + /** + * Test for the newContentTypeGroupCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newContentTypeGroupCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewContentTypeGroupCreateStruct + */ + public function testNewContentTypeGroupCreateStructValues( $createStruct ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'new-group', + 'creatorId' => null, + 'creationDate' => null, + /* @todo uncomment when support for multilingual names and descriptions is added + 'mainLanguageCode' => null, + */ + ), + $createStruct + ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewContentTypeGroupCreateStruct + * @group user + */ + public function testCreateContentTypeGroup() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $groupCreate->creatorId = $repository->getCurrentUser()->id; + $groupCreate->creationDate = $this->createDateTime(); + /* @todo uncomment when support for multilingual names and descriptions is added + $groupCreate->mainLanguageCode = 'ger-DE'; + $groupCreate->names = array( 'eng-GB' => 'A name.' ); + $groupCreate->descriptions = array( 'eng-GB' => 'A description.' ); + */ + + $group = $contentTypeService->createContentTypeGroup( $groupCreate ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup', + $group + ); + + return array( + 'createStruct' => $groupCreate, + 'group' => $group, + ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + */ + public function testCreateContentTypeGroupStructValues( array $data ) + { + $createStruct = $data['createStruct']; + $group = $data['group']; + + $this->assertEquals( + array( + 'identifier' => $group->identifier, + 'creatorId' => $group->creatorId, + 'creationDate' => $group->creationDate, + ), + array( + 'identifier' => $createStruct->identifier, + 'creatorId' => $createStruct->creatorId, + 'creationDate' => $createStruct->creationDate, + ) + ); + $this->assertNotNull( + $group->id + ); + return $data; + } + + /** + * Test for the createContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroupStructValues + */ + public function testCreateContentTypeGroupStructLanguageDependentValues( array $data ) + { + $createStruct = $data['createStruct']; + $group = $data['group']; + + $this->assertStructPropertiesCorrect( + $createStruct, + $group + /* @todo uncomment when support for multilingual names and descriptions is added + array( 'names', 'descriptions', 'mainLanguageCode' ) + */ + ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + */ + public function testCreateContentTypeGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'Content' + ); + + // Throws an Exception, since group "Content" already exists + $contentTypeService->createContentTypeGroup( $groupCreate ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + * @group user + */ + public function testLoadContentTypeGroup() + { + $repository = $this->getRepository(); + + $contentTypeGroupId = $this->generateId( 'typegroup', 2 ); + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Loads the "Users" group + // $contentTypeGroupId is the ID of an existing content type group + $loadedGroup = $contentTypeService->loadContentTypeGroup( $contentTypeGroupId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup', + $loadedGroup + ); + + return $loadedGroup; + } + + /** + * Test for the loadContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroup + */ + public function testLoadContentTypeGroupStructValues( ContentTypeGroup $group ) + { + $this->assertPropertiesCorrect( + array( + 'id' => $this->generateId( 'typegroup', 2 ), + 'identifier' => 'Users', + 'creationDate' => $this->createDateTime( 1031216941 ), + 'modificationDate' => $this->createDateTime( 1033922113 ), + 'creatorId' => $this->generateId( 'user', 14 ), + 'modifierId' => $this->generateId( 'user', 14 ), + ), + $group + ); + } + + /** + * Test for the loadContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + */ + public function testLoadContentTypeGroupThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $contentTypeService = $repository->getContentTypeService(); + $loadedGroup = $contentTypeService->loadContentTypeGroup( $this->generateId( 'typegroup', 2342 ) ); + } + + /** + * Test for the loadContentTypeGroupByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroupByIdentifier() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + * @group user + * @group field-type + */ + public function testLoadContentTypeGroupByIdentifier() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $loadedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( + "Media" + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup', + $loadedGroup + ); + + return $loadedGroup; + } + + /** + * Test for the loadContentTypeGroupByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroupByIdentifier() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifier + */ + public function testLoadContentTypeGroupByIdentifierStructValues( ContentTypeGroup $group ) + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $this->assertEquals( + $contentTypeService->loadContentTypeGroup( $this->generateId( 'typegroup', 3 ) ), + $group + ); + } + + /** + * Test for the loadContentTypeGroupByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroupByIdentifier() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifier + */ + public function testLoadContentTypeGroupByIdentifierThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Throws exception + $loadedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( + 'not-exists' + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeGroups() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroups() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + */ + public function testLoadContentTypeGroups() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Loads an array with all content type groups + $loadedGroups = $contentTypeService->loadContentTypeGroups(); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedGroups + ); + + return $loadedGroups; + } + + /** + * Test for the loadContentTypeGroups() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeGroups() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroups + */ + public function testLoadContentTypeGroupsIdentifiers( $groups ) + { + $this->assertEquals( 4, count( $groups ) ); + + $expectedIdentifiers = array( + 'Content' => true, + 'Users' => true, + 'Media' => true, + 'Setup' => true, + ); + + $actualIdentifiers = array(); + foreach ( $groups as $group ) + { + $actualIdentifiers[$group->identifier] = true; + } + + ksort( $expectedIdentifiers ); + ksort( $actualIdentifiers ); + + $this->assertEquals( + $expectedIdentifiers, + $actualIdentifiers, + 'Identifier missmatch in loaded groups.' + ); + } + + /** + * Test for the newContentTypeGroupUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newContentTypeGroupUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + */ + public function testNewContentTypeGroupUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupUpdateStruct', + $groupUpdate + ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + */ + public function testUpdateContentTypeGroup() + { + $repository = $this->getRepository(); + + $modifierId = $this->generateId( 'user', 42 ); + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + + $groupUpdate->identifier = 'Teardown'; + $groupUpdate->modifierId = $modifierId; + $groupUpdate->modificationDate = $this->createDateTime(); + /* @todo uncomment when support for multilingual names and descriptions is added + $groupUpdate->mainLanguageCode = 'eng-GB'; + + $groupUpdate->names = array( + 'eng-GB' => 'A name', + 'eng-US' => 'A name', + ); + $groupUpdate->descriptions = array( + 'eng-GB' => 'A description', + 'eng-US' => 'A description', + ); + */ + + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + /* END: Use Case */ + + $updatedGroup = $contentTypeService->loadContentTypeGroup( $group->id ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupUpdateStruct', + $groupUpdate + ); + + return array( + 'originalGroup' => $group, + 'updateStruct' => $groupUpdate, + 'updatedGroup' => $updatedGroup, + ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeGroup + */ + public function testUpdateContentTypeGroupStructValues( array $data ) + { + $expectedValues = array( + 'identifier' => $data['updateStruct']->identifier, + 'creationDate' => $data['originalGroup']->creationDate, + 'modificationDate' => $data['updateStruct']->modificationDate, + 'creatorId' => $data['originalGroup']->creatorId, + 'modifierId' => $data['updateStruct']->modifierId, + ); + + $this->assertPropertiesCorrect( + $expectedValues, $data['updatedGroup'] + ); + + return $data; + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeGroupStructValues + */ + public function testUpdateContentTypeGroupStructLanguageDependentValues( array $data ) + { + $expectedValues = array( + 'identifier' => $data['updateStruct']->identifier, + 'creationDate' => $data['originalGroup']->creationDate, + 'modificationDate' => $data['updateStruct']->modificationDate, + 'creatorId' => $data['originalGroup']->creatorId, + 'modifierId' => $data['updateStruct']->modifierId, + /* @todo uncomment when support for multilingual names and descriptions is added + 'mainLanguageCode' => $data['updateStruct']->mainLanguageCode, + 'names' => $data['updateStruct']->names, + 'descriptions' => $data['updateStruct']->descriptions, + */ + ); + + $this->assertPropertiesCorrect( + $expectedValues, $data['updatedGroup'] + ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeGroup + */ + public function testUpdateContentTypeGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( + 'Media' + ); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + $groupUpdate->identifier = 'Users'; + + // Exception, because group with identifier "Users" exists + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroup + */ + public function testDeleteContentTypeGroup() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $contentTypeService->createContentTypeGroup( $groupCreate ); + + // ... + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + $contentTypeService->deleteContentTypeGroup( $group ); + /* END: Use Case */ + + try + { + $contentTypeService->loadContentTypeGroup( $group->id ); + $this->fail( 'Content type group not deleted.' ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + // All fine + } + } + + /** + * Test for the newContentTypeCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newContentTypeCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + * @group user + * @group field-type + */ + public function testNewContentTypeCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $typeCreate = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeCreateStruct', + $typeCreate + ); + return $typeCreate; + } + + /** + * Test for the newContentTypeCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newContentTypeCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewContentTypeCreateStruct + */ + public function testNewContentTypeCreateStructValues( $createStruct ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'new-type', + 'mainLanguageCode' => null, + 'remoteId' => null, + 'urlAliasSchema' => null, + 'nameSchema' => null, + 'isContainer' => false, + 'defaultSortField' => Location::SORT_FIELD_PUBLISHED, + 'defaultSortOrder' => Location::SORT_ORDER_DESC, + 'defaultAlwaysAvailable' => true, + 'names' => null, + 'descriptions' => null, + 'creatorId' => null, + 'creationDate' => null, + ), + $createStruct + ); + } + + /** + * Test for the newFieldDefinitionCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newFieldDefinitionCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + * @group user + * @group field-type + */ + public function testNewFieldDefinitionCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $fieldDefinitionCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionCreateStruct', + $fieldDefinitionCreate + ); + return $fieldDefinitionCreate; + } + + /** + * Test for the newFieldDefinitionCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newFieldDefinitionCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewFieldDefinitionCreateStruct + */ + public function testNewFieldDefinitionCreateStructValues( $createStruct ) + { + $this->assertPropertiesCorrect( + array( + 'fieldTypeIdentifier' => 'ezstring', + 'identifier' => 'title', + 'names' => null, + 'descriptions' => null, + 'fieldGroup' => null, + 'position' => null, + 'isTranslatable' => null, + 'isRequired' => null, + 'isInfoCollector' => null, + 'validatorConfiguration' => null, + 'fieldSettings' => null, + 'defaultValue' => null, + 'isSearchable' => null, + ), + $createStruct + ); + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testDeleteContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testDeleteContentTypeGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ); + + // Throws exception, since group contains types + $contentTypeService->deleteContentTypeGroup( $contentGroup ); + /* END: Use Case */ + } + + /** + * Test for the createContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewContentTypeCreateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewFieldDefinitionCreateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifier + * @group user + * @group field-type + */ + public function testCreateContentType() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'blog-post' ); + $typeCreate->mainLanguageCode = 'eng-GB'; + $typeCreate->remoteId = '384b94a1bd6bc06826410e284dd9684887bf56fc'; + $typeCreate->urlAliasSchema = 'url|scheme'; + $typeCreate->nameSchema = 'name|scheme'; + $typeCreate->names = array( + 'eng-GB' => 'Blog post', + 'ger-DE' => 'Blog-Eintrag', + ); + $typeCreate->descriptions = array( + 'eng-GB' => 'A blog post', + 'ger-DE' => 'Ein Blog-Eintrag', + ); + $typeCreate->creatorId = $repository->getCurrentUser()->id; + $typeCreate->creationDate = $this->createDateTime(); + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + $titleFieldCreate->names = array( + 'eng-GB' => 'Title', + 'ger-DE' => 'Titel', + ); + $titleFieldCreate->descriptions = array( + 'eng-GB' => 'Title of the blog post', + 'ger-DE' => 'Titel des Blog-Eintrages', + ); + $titleFieldCreate->fieldGroup = 'blog-content'; + $titleFieldCreate->position = 1; + $titleFieldCreate->isTranslatable = true; + $titleFieldCreate->isRequired = true; + $titleFieldCreate->isInfoCollector = false; + $titleFieldCreate->validatorConfiguration = array( + 'StringLengthValidator' => array( + 'minStringLength' => 0, + 'maxStringLength' => 0, + ), + ); + $titleFieldCreate->fieldSettings = array(); + $titleFieldCreate->isSearchable = true; + + $typeCreate->addFieldDefinition( $titleFieldCreate ); + + $bodyFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'body', 'ezstring' + ); + $bodyFieldCreate->names = array( + 'eng-GB' => 'Body', + 'ger-DE' => 'Textkörper', + ); + $bodyFieldCreate->descriptions = array( + 'eng-GB' => 'Body of the blog post', + 'ger-DE' => 'Textkörper des Blog-Eintrages', + ); + $bodyFieldCreate->fieldGroup = 'blog-content'; + $bodyFieldCreate->position = 2; + $bodyFieldCreate->isTranslatable = true; + $bodyFieldCreate->isRequired = true; + $bodyFieldCreate->isInfoCollector = false; + $bodyFieldCreate->validatorConfiguration = array( + 'StringLengthValidator' => array( + 'minStringLength' => 0, + 'maxStringLength' => 0, + ), + ); + $bodyFieldCreate->fieldSettings = array(); + $bodyFieldCreate->isSearchable = true; + + $typeCreate->addFieldDefinition( $bodyFieldCreate ); + + $groups = array( + $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ), + $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ) + ); + + $contentTypeDraft = $contentTypeService->createContentType( + $typeCreate, + $groups + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $contentTypeDraft + ); + + return array( + 'typeCreate' => $typeCreate, + 'contentType' => $contentTypeDraft, + 'groups' => $groups, + ); + } + + /** + * Test for the createContentType() method struct values. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testCreateContentTypeStructValues( array $data ) + { + $typeCreate = $data['typeCreate']; + $contentType = $data['contentType']; + $groups = $data['groups']; + + foreach ( $typeCreate as $propertyName => $propertyValue ) + { + switch ( $propertyName ) + { + case 'fieldDefinitions': + $this->assertFieldDefinitionsCorrect( + $typeCreate->fieldDefinitions, + $contentType->fieldDefinitions + ); + break; + + case 'contentTypeGroups': + $this->assertContentTypeGroupsCorrect( + $groups, + $contentType->contentTypeGroups + ); + break; + default: + $this->assertEquals( + $typeCreate->$propertyName, + $contentType->$propertyName + ); + break; + } + } + } + + /** + * Asserts field definition creation + * + * Asserts that all field definitions defined through created structs in + * $expectedDefinitionCreates have been correctly created in + * $actualDefinitions. + * + * @param \eZ\Publish\API\Repository\Values\FieldDefinitionCreateStruct[] $expectedDefinitionCreates + * @param \eZ\Publish\API\Repository\Values\FieldDefinition[] $actualDefinitions + * + * @return void + */ + protected function assertFieldDefinitionsCorrect( array $expectedDefinitionCreates, array $actualDefinitions ) + { + $this->assertEquals( + count( $expectedDefinitionCreates ), + count( $actualDefinitions ), + 'Count of field definition creates did not match count of field definitions.' + ); + + $sorter = function( $a, $b ) + { + return strcmp( $a->identifier, $b->identifier ); + }; + + usort( $expectedDefinitionCreates, $sorter ); + usort( $actualDefinitions, $sorter ); + + foreach ( $expectedDefinitionCreates as $key => $expectedCreate ) + { + $this->assertFieldDefinitionsEqual( + $expectedCreate, + $actualDefinitions[$key] + ); + } + } + + /** + * Asserts that a field definition has been correctly created. + * + * Asserts that the given $actualDefinition is correctly created from the + * create struct in $expectedCreate. + * + * @param \eZ\Publish\API\Repository\Values\FieldDefinitionCreateStruct $expectedDefinitionCreate + * @param \eZ\Publish\API\Repository\Values\FieldDefinition $actualDefinition + * + * @return void + */ + protected function assertFieldDefinitionsEqual( $expectedCreate, $actualDefinition ) + { + foreach ( $expectedCreate as $propertyName => $propertyValue ) + { + $this->assertEquals( + $expectedCreate->$propertyName, + $actualDefinition->$propertyName + ); + } + } + + /** + * Asserts that two sets of ContentTypeGroups are equal. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $expectedGroups + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $actualGroups + * + * @return void + */ + protected function assertContentTypeGroupsCorrect( $expectedGroups, $actualGroups ) + { + $sorter = function ( $a, $b ) + { + return strcmp( $a->id, $b->id ); + }; + + usort( $expectedGroups, $sorter ); + usort( $actualGroups, $sorter ); + + foreach ( $expectedGroups as $key => $expectedGroup ) + { + $this->assertPropertiesCorrect( + $expectedGroup, + $actualGroups[$key], + $this->groupProperties + ); + } + } + + /** + * Test for the createContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionDuplicateIdentifier() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'folder' ); + + // Throws exception, since type "folder" exists + $secondType = $contentTypeService->createContentType( $typeCreate, array() ); + /* END: Use Case */ + } + + /** + * Test for the createContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionDuplicateRemoteId() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'news-article' ); + $typeCreate->remoteId = 'a3d405b81be900468eb153d774f4f0d2'; + + // Throws exception, since "folder" type has this remote ID + $secondType = $contentTypeService->createContentType( $typeCreate, array() ); + /* END: Use Case */ + } + + /** + * Test for the createContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionDuplicateFieldIdentifier() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'blog-post' ); + + $firstFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + $typeCreate->addFieldDefinition( $firstFieldCreate ); + + $secondFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + $typeCreate->addFieldDefinition( $secondFieldCreate ); + + // Throws exception, due to duplicate "title" field + $secondType = $contentTypeService->createContentType( $typeCreate, array() ); + /* END: Use Case */ + } + + /** + * Test for the newContentTypeUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newContentTypeUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + */ + public function testNewContentTypeUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeUpdateStruct', + $typeUpdate + ); + return $typeUpdate; + } + + /** + * Test for the newContentTypeUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newContentTypeUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testNewContentTypeUpdateStruct + */ + public function testNewContentTypeUpdateStructValues( $typeUpdate ) + { + foreach ( $typeUpdate as $propertyName => $propertyValue ) + { + $this->assertNull( + $propertyValue, + "Property '$propertyName' is not null." + ); + } + } + + /** + * Test for the loadContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testLoadContentTypeDraft() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $contentTypeDraftReloaded = $contentTypeService->loadContentTypeDraft( + $contentTypeDraft->id + ); + /* END: Use Case */ + + $this->assertEquals( + $contentTypeDraft, + $contentTypeDraftReloaded + ); + } + + /** + * Test for the loadContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentTypeDraftThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingContentTypeId = $this->generateId( 'type', 2342 ); + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Throws exception, since 2342 does not exist + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $nonExistingContentTypeId ); + /* END: Use Case */ + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeDraft + */ + public function testUpdateContentTypeDraft() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $modifierId = $this->generateId( 'user', 14 ); + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->identifier = 'news-article'; + $typeUpdate->remoteId = '4cf35f5166fd31bf0cda859dc837e095daee9833'; + $typeUpdate->urlAliasSchema = 'url@alias|scheme'; + $typeUpdate->nameSchema = '@name@scheme@'; + $typeUpdate->isContainer = true; + $typeUpdate->mainLanguageCode = 'ger-DE'; + $typeUpdate->defaultAlwaysAvailable = false; + $typeUpdate->modifierId = $modifierId; + $typeUpdate->modificationDate = $this->createDateTime(); + $typeUpdate->names = array( + 'eng-GB' => 'News article', + 'ger-DE' => 'Nachrichten-Artikel', + ); + $typeUpdate->descriptions = array( + 'eng-GB' => 'A news article', + 'ger-DE' => 'Ein Nachrichten-Artikel', + ); + + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + + $updatedType = $contentTypeService->loadContentTypeDraft( + $contentTypeDraft->id + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $updatedType + ); + + return array( + 'originalType' => $contentTypeDraft, + 'updateStruct' => $typeUpdate, + 'updatedType' => $updatedType, + ); + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeDraft + */ + public function testUpdateContentTypeDraftStructValues( $data ) + { + $originalType = $data['originalType']; + $updateStruct = $data['updateStruct']; + $updatedType = $data['updatedType']; + + $expectedValues = array( + 'id' => $originalType->id, + 'names' => $updateStruct->names, + 'descriptions' => $updateStruct->descriptions, + 'identifier' => $updateStruct->identifier, + 'creationDate' => $originalType->creationDate, + 'modificationDate' => $updateStruct->modificationDate, + 'creatorId' => $originalType->creatorId, + 'modifierId' => $updateStruct->modifierId, + 'urlAliasSchema' => $updateStruct->urlAliasSchema, + 'nameSchema' => $updateStruct->nameSchema, + 'isContainer' => $updateStruct->isContainer, + 'mainLanguageCode' => $updateStruct->mainLanguageCode, + 'contentTypeGroups' => $originalType->contentTypeGroups, + 'fieldDefinitions' => $originalType->fieldDefinitions, + ); + + $this->assertPropertiesCorrect( + $expectedValues, + $updatedType + ); + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeDraft + */ + public function testUpdateContentTypeDraftThrowsInvalidArgumentExceptionDuplicateIdentifier() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->identifier = 'folder'; + + // Throws exception, since type "folder" already exists + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeDraft + */ + public function testUpdateContentTypeDraftThrowsInvalidArgumentExceptionDuplicateRemoteId() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->remoteId = 'a3d405b81be900468eb153d774f4f0d2'; + + // Throws exception, since remote ID of type "folder" is used + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + } + + /** + * Test for the addFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::addFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testAddFieldDefinition() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'tags', 'ezstring' + ); + $fieldDefCreate->names = array( + 'eng-GB' => 'Tags', + 'ger-DE' => 'Schlagworte', + ); + $fieldDefCreate->descriptions = array( + 'eng-GB' => 'Tags of the blog post', + 'ger-DE' => 'Schlagworte des Blog-Eintrages', + ); + $fieldDefCreate->fieldGroup = 'blog-meta'; + $fieldDefCreate->position = 1; + $fieldDefCreate->isTranslatable = true; + $fieldDefCreate->isRequired = true; + $fieldDefCreate->isInfoCollector = false; + $fieldDefCreate->validatorConfiguration = array( + 'StringLengthValidator' => array( + 'minStringLength' => 0, + 'maxStringLength' => 0, + ), + ); + $fieldDefCreate->fieldSettings = array(); + $fieldDefCreate->isSearchable = true; + + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedType + ); + return array( + 'loadedType' => $loadedType, + 'fieldDefCreate' => $fieldDefCreate, + ); + } + + /** + * Test for the addFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::addFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAddFieldDefinition + */ + public function testAddFieldDefinitionStructValues( array $data ) + { + $loadedType = $data['loadedType']; + $fieldDefCreate = $data['fieldDefCreate']; + + foreach ( $loadedType->fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier == $fieldDefCreate->identifier ) + { + $this->assertFieldDefinitionsEqual( $fieldDefCreate, $fieldDefinition ); + return; + } + } + + $this->fail( + sprintf( + 'Field definition with identifier "%s" not create.', + $fieldDefCreate->identifier + ) + ); + } + + /** + * Test for the addFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::addFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAddFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testAddFieldDefinitionThrowsInvalidArgumentExceptionDuplicateFieldIdentifier() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + + // Throws an exception + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + /* END: Use Case */ + } + + /** + * Test for the removeFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::removeFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testRemoveFieldDefinition() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedType + ); + + return array( + 'removedFieldDefinition' => $bodyField, + 'loadedType' => $loadedType, + ); + } + + /** + * Test for the removeFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::removeFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testRemoveFieldDefinition + */ + public function testRemoveFieldDefinitionRemoved( array $data ) + { + $removedFieldDefinition = $data['removedFieldDefinition']; + $loadedType = $data['loadedType']; + + foreach ( $loadedType->fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier == $removedFieldDefinition->identifier ) + { + $this->fail( + sprintf( + 'Field definition with identifier "%s" not removed.', + $removedFieldDefinition->identifier + ) + ); + } + } + } + + /** + * Test for the removeFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::removeFieldDefinition() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testRemoveFieldDefinition + */ + public function testRemoveFieldDefinitionThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + + $loadedDraft = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + // Throws exception, sine "body" has already been removed + $contentTypeService->removeFieldDefinition( $loadedDraft, $bodyField ); + /* END: Use Case */ + } + + /** + * Test for the newFieldDefinitionUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::newFieldDefinitionUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetContentTypeService + */ + public function testNewFieldDefinitionUpdateStruct() + { + $repository = $this->getRepository(); + /* BEGIN: Use Case */ + // $draftId contains the ID of a content type draft + $contentTypeService = $repository->getContentTypeService(); + + $updateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionUpdateStruct', + $updateStruct + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeDraft + */ + public function testUpdateFieldDefinition() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + + $bodyUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $bodyUpdateStruct->identifier = 'blog-body'; + $bodyUpdateStruct->names = array( + 'eng-GB' => 'Blog post body', + 'ger-DE' => 'Blog-Eintrags-Textkörper', + ); + $bodyUpdateStruct->descriptions = array( + 'eng-GB' => 'Blog post body of the blog post', + 'ger-DE' => 'Blog-Eintrags-Textkörper des Blog-Eintrages', + ); + $bodyUpdateStruct->fieldGroup = 'updated-blog-content'; + $bodyUpdateStruct->position = 3; + $bodyUpdateStruct->isTranslatable = false; + $bodyUpdateStruct->isRequired = false; + $bodyUpdateStruct->isInfoCollector = true; + $bodyUpdateStruct->validatorConfiguration = array(); + $bodyUpdateStruct->fieldSettings = array( + 'textRows' => 60 + ); + $bodyUpdateStruct->isSearchable = false; + + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $bodyField, + $bodyUpdateStruct + ); + /* END: Use Case */ + + $loadedDraft = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition', + ( $loadedField = $loadedDraft->getFieldDefinition( 'blog-body' ) ) + ); + + return array( + 'originalField' => $bodyField, + 'updatedField' => $loadedField, + 'updateStruct' => $bodyUpdateStruct, + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateFieldDefinition + */ + public function testUpdateFieldDefinitionStructValues( array $data ) + { + $originalField = $data['originalField']; + $updatedField = $data['updatedField']; + $updateStruct = $data['updateStruct']; + + $this->assertPropertiesCorrect( + array( + 'id' => $originalField->id, + 'identifier' => $updateStruct->identifier, + 'names' => $updateStruct->names, + 'descriptions' => $updateStruct->descriptions, + 'fieldGroup' => $updateStruct->fieldGroup, + 'position' => $updateStruct->position, + 'fieldTypeIdentifier' => $originalField->fieldTypeIdentifier, + 'isTranslatable' => $updateStruct->isTranslatable, + 'isRequired' => $updateStruct->isRequired, + 'isInfoCollector' => $updateStruct->isInfoCollector, + 'validatorConfiguration' => $updateStruct->validatorConfiguration, + 'defaultValue' => $originalField->defaultValue, + 'isSearchable' => $updateStruct->isSearchable, + ), + $updatedField + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUpdateFieldDefinitionThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + $titleField = $contentTypeDraft->getFieldDefinition( 'title' ); + + $bodyUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $bodyUpdateStruct->identifier = 'title'; + + // Throws exception, since "title" field already exists + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $bodyField, + $bodyUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the updateFieldDefinition() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateFieldDefinition() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUpdateFieldDefinitionThrowsInvalidArgumentExceptionForUndefinedField() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + + $loadedDraft = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + $bodyUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + + // Throws exception, since field "body" is already deleted + $contentTypeService->updateFieldDefinition( + $loadedDraft, + $bodyField, + $bodyUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::publishContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeDraft + */ + public function testPublishContentTypeDraft() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + /* END: Use Case */ + + $publishedType = $contentTypeService->loadContentType( $contentTypeDraft->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $publishedType + ); + $this->assertNotInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $publishedType + ); + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::publishContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testPublishContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testPublishContentTypeDraftThrowsBadStateException() + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + /* BEGIN: Use Case */ + $contentTypeDraft = $this->createContentTypeDraft(); + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + + // Throws exception, since no draft exists anymore + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + /* END: Use Case */ + } + + /** + * Test for the loadContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + * @group user + * @group field-type + */ + public function testLoadContentType() + { + $repository = $this->getRepository(); + + $userGroupId = $this->generateId( 'type', 3 ); + /* BEGIN: Use Case */ + // $userGroupId is the ID of the "user_group" type + $contentTypeService = $repository->getContentTypeService(); + // Loads the standard "user_group" type + $userGroupType = $contentTypeService->loadContentType( $userGroupId ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $userGroupType + ); + + return $userGroupType; + } + + /** + * Test for the loadContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + */ + public function testLoadContentTypeStructValues( $userGroupType ) + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $this->assertPropertiesCorrect( + array( + 'id' => $this->generateId( 'type', 3 ), + 'status' => 0, + 'identifier' => 'user_group', + 'creationDate' => $this->createDateTime( 1024392098 ), + 'modificationDate' => $this->createDateTime( 1048494743 ), + 'creatorId' => $this->generateId( 'user', 14 ), + 'modifierId' => $this->generateId( 'user', 14 ), + 'remoteId' => '25b4268cdcd01921b808a0d854b877ef', + 'names' => array( + 'eng-US' => 'User group', + ), + 'descriptions' => array(), + 'nameSchema' => '', + 'isContainer' => true, + 'mainLanguageCode' => 'eng-US', + 'defaultAlwaysAvailable' => true, + 'defaultSortField' => 1, + 'defaultSortOrder' => 1, + 'contentTypeGroups' => array( + 0 => $contentTypeService->loadContentTypeGroup( $this->generateId( 'typegroup', 2 ) ) + ), + ), + $userGroupType + ); + + return $userGroupType->fieldDefinitions; + } + + /** + * Test for the loadContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeStructValues + */ + public function testLoadContentTypeFieldDefinitions( array $fieldDefinitions ) + { + $expectedFieldDefinitions = array( + 'name' => array( + 'identifier' => 'name', + 'fieldGroup' => '', + 'position' => 1, + 'fieldTypeIdentifier' => 'ezstring', + 'isTranslatable' => true, + 'isRequired' => true, + 'isInfoCollector' => false, + 'isSearchable' => true, + 'defaultValue' => null, + 'names' => array( + 'eng-US' => 'Name', + ), + 'descriptions' => array(), + ), + 'description' => array( + 'identifier' => 'description', + 'fieldGroup' => '', + 'position' => 2, + 'fieldTypeIdentifier' => 'ezstring', + 'isTranslatable' => true, + 'isRequired' => false, + 'isInfoCollector' => false, + 'isSearchable' => true, + 'defaultValue' => null, + 'names' => array( + 'eng-US' => 'Description', + ), + 'descriptions' => array(), + ) + ); + + foreach ( $fieldDefinitions as $index => $fieldDefinition ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition', + $fieldDefinition + ); + + $this->assertNotNull( $fieldDefinition->id ); + + if ( !isset( $expectedFieldDefinitions[$fieldDefinition->identifier] ) ) + { + $this->fail( + sprintf( + 'Unexpected FieldDefinition loaded: "%s" (%s)', + $fieldDefinition->identifier, + $fieldDefinition->id + ) + ); + } + + $this->assertPropertiesCorrect( + $expectedFieldDefinitions[$fieldDefinition->identifier], + $fieldDefinition + ); + unset( $expectedFieldDefinitions[$fieldDefinition->identifier] ); + unset( $fieldDefinitions[$index] ); + } + + if ( 0 !== count( $expectedFieldDefinitions ) ) + { + $this->fail( + sprintf( + 'Missing expected FieldDefinitions: %s', + implode( + ',', + array_map( + function ( $fieldDefArray ) + { + return $fieldDefArray['identifier']; + }, + $expectedFieldDefinitions + ) + ) + ) + ); + } + + if ( 0 !== count( $fieldDefinitions ) ) + { + $this->fail( + sprintf( + 'Loaded unexpected FieldDefinitions: %s', + implode( + ',', + array_map( + function ( $fieldDefinition ) + { + return $fieldDefinition->identifier; + }, + $fieldDefinitions + ) + ) + ) + ); + } + } + + /** + * Test for the loadContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentTypeThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentTypeId = $this->generateId( 'type', 2342 ); + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Throws exception, since type with ID 2342 does not exist + $contentTypeService->loadContentType( $nonExistentTypeId ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeByIdentifier() method. + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeByIdentifier() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + * @group user + */ + public function testLoadContentTypeByIdentifier() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $articleType = $contentTypeService->loadContentTypeByIdentifier( 'article' ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $articleType + ); + + return $articleType; + } + + /** + * Test for the loadContentTypeByIdentifier() method. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeByIdentifier() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testLoadContentTypeByIdentifierReturnsCorrectInstance( $contentType ) + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $this->assertEquals( + $contentTypeService->loadContentType( $contentType->id ), + $contentType + ); + } + + /** + * Test for the loadContentTypeByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeByIdentifier() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testLoadContentTypeByIdentifierThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Throws an exception, since no type with this identifier exists + $contentTypeService->loadContentTypeByIdentifier( 'sindelfingen' ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + */ + public function testLoadContentTypeByRemoteId() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Loads the standard "user_group" type + $userGroupType = $contentTypeService->loadContentTypeByRemoteId( + '25b4268cdcd01921b808a0d854b877ef' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $userGroupType + ); + + return $userGroupType; + } + + /** + * Test for the loadContentTypeByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByRemoteId + */ + public function testLoadContentTypeByRemoteIdReturnsCorrectInstance( $contentType ) + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $this->assertEquals( + $contentTypeService->loadContentType( $contentType->id ), + $contentType + ); + } + + /** + * Test for the loadContentTypeByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypeByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentTypeByRemoteIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Throws an exception, since no type with this remote ID exists + $contentTypeService->loadContentTypeByRemoteId( 'not-exists' ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypes() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypes() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + */ + public function testLoadContentTypes() + { + $repository = $this->getRepository(); + + $typeGroupId = $this->generateId( 'typegroup', 2 ); + /* BEGIN: Use Case */ + // $typeGroupId is a valid ID of a content type group + $contentTypeService = $repository->getContentTypeService(); + + $contentTypeGroup = $contentTypeService->loadContentTypeGroup( $typeGroupId ); + + // Loads all types from content type group "Users" + $types = $contentTypeService->loadContentTypes( $contentTypeGroup ); + /* END: Use Case */ + + $this->assertInternalType( 'array', $types ); + + return $types; + } + + /** + * Test for the loadContentTypes() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::loadContentTypes() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypes + */ + public function testLoadContentTypesContent( array $types ) + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $this->assertEquals( + array( + $contentTypeService->loadContentType( $this->generateId( 'type', 3 ) ), + $contentTypeService->loadContentType( $this->generateId( 'type', 4 ) ), + ), + $types + ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + */ + public function testCreateContentTypeDraft() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + $commentTypeDraft = $contentTypeService->createContentTypeDraft( $commentType ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $commentTypeDraft + ); + + return array( + 'originalType' => $commentType, + 'typeDraft' => $commentTypeDraft, + ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeDraft + */ + public function testCreateContentTypeDraftStructValues( array $data ) + { + $originalType = $data['originalType']; + $typeDraft = $data['typeDraft']; + + // Names and descriptions tested in corresponding language test + $this->assertEquals( + array( + 'id' => $originalType->id, + 'names' => $originalType->names, + 'descriptions' => $originalType->descriptions, + 'identifier' => $originalType->identifier, + 'creatorId' => $originalType->creatorId, + 'modifierId' => $originalType->modifierId, + 'remoteId' => $originalType->remoteId, + 'urlAliasSchema' => $originalType->urlAliasSchema, + 'nameSchema' => $originalType->nameSchema, + 'isContainer' => $originalType->isContainer, + 'mainLanguageCode' => $originalType->mainLanguageCode, + 'defaultAlwaysAvailable' => $originalType->defaultAlwaysAvailable, + 'defaultSortField' => $originalType->defaultSortField, + 'defaultSortOrder' => $originalType->defaultSortOrder, + 'contentTypeGroups' => $originalType->contentTypeGroups, + 'fieldDefinitions' => $originalType->fieldDefinitions, + ), + array( + 'id' => $typeDraft->id, + 'names' => $typeDraft->names, + 'descriptions' => $typeDraft->descriptions, + 'identifier' => $typeDraft->identifier, + 'creatorId' => $typeDraft->creatorId, + 'modifierId' => $typeDraft->modifierId, + 'remoteId' => $typeDraft->remoteId, + 'urlAliasSchema' => $typeDraft->urlAliasSchema, + 'nameSchema' => $typeDraft->nameSchema, + 'isContainer' => $typeDraft->isContainer, + 'mainLanguageCode' => $typeDraft->mainLanguageCode, + 'defaultAlwaysAvailable' => $typeDraft->defaultAlwaysAvailable, + 'defaultSortField' => $typeDraft->defaultSortField, + 'defaultSortOrder' => $typeDraft->defaultSortOrder, + 'contentTypeGroups' => $typeDraft->contentTypeGroups, + 'fieldDefinitions' => $typeDraft->fieldDefinitions, + ) + ); + + $this->assertInstanceOf( + 'DateTime', + $typeDraft->modificationDate + ); + $modificationDifference = $originalType->modificationDate->diff( + $typeDraft->modificationDate + ); + // No modification date is newer, interval is not inverted + $this->assertEquals( 0, $modificationDifference->invert ); + + $this->assertEquals( + ContentType::STATUS_DRAFT, + $typeDraft->status + ); + + return $data; + } + + /** + * Test for the createContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeDraft() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeDraftStructValues + */ + public function testCreateContentTypeDraftStructLanguageDependentValues( array $data ) + { + $originalType = $data['originalType']; + $typeDraft = $data['typeDraft']; + + $this->assertEquals( + array( + 'names' => $originalType->names, + 'descriptions' => $originalType->descriptions, + ), + array( + 'names' => $typeDraft->names, + 'descriptions' => $typeDraft->descriptions, + ) + ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeDraft() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeDraft + */ + public function testCreateContentTypeDraftThrowsBadStateException() + { + $this->markTestIncomplete( + 'Behavior to test is: If a draft *by a different user* exists, throw BadState. Cannot be tested on current fixture, since additional, privileged user is missing.' + ); + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + $contentTypeService->createContentTypeDraft( $commentType ); + + // Throws exception, since type draft already exists + $contentTypeService->createContentTypeDraft( $commentType ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testDeleteContentType() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + $contentTypeService->deleteContentType( $commentType ); + /* END: Use Case */ + + try + { + $contentTypeService->loadContentType( $commentType->id ); + $this->fail( 'Content type could be loaded after delete.' ); + } + catch ( Exceptions\NotFoundException $e ) + { + // All fine + } + } + + /** + * Test for the deleteContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testDeleteContentType + */ + public function testDeleteContentTypeThrowsBadStateException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'user' ); + + // This call will fail with a "BadStateException" because there is at + // least on content object of type "user" in an eZ Publish demo + $contentTypeService->deleteContentType( $contentType ); + /* END: Use Case */ + } + + /** + * Test for the copyContentType() method. + * + * @return array + * @see \eZ\Publish\API\Repository\ContentTypeService::copyContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testCopyContentType() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Complete copy of the "comment" type + $copiedType = $contentTypeService->copyContentType( $commentType ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $copiedType + ); + + return array( + 'originalType' => $commentType, + 'copiedType' => $copiedType, + ); + } + + /** + * Test for the copyContentType() method. + * + * @param array $data + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::copyContentType() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + */ + public function testCopyContentTypeStructValues( array $data ) + { + $originalType = $data['originalType']; + $copiedType = $data['copiedType']; + + $this->assertStructPropertiesCorrect( + $originalType, + $copiedType, + array( + 'names', + 'descriptions', + 'creatorId', + 'modifierId', + 'urlAliasSchema', + 'nameSchema', + 'isContainer', + 'mainLanguageCode', + 'contentTypeGroups', + ) + ); + + $this->assertNotEquals( + $originalType->id, + $copiedType->id + ); + $this->assertNotEquals( + $originalType->remoteId, + $copiedType->remoteId + ); + $this->assertNotEquals( + $originalType->identifier, + $copiedType->identifier + ); + $this->assertNotEquals( + $originalType->creationDate, + $copiedType->creationDate + ); + $this->assertNotEquals( + $originalType->modificationDate, + $copiedType->modificationDate + ); + + foreach ( $originalType->fieldDefinitions as $originalFieldDefinition ) + { + $copiedFieldDefinition = $copiedType->getFieldDefinition( + $originalFieldDefinition->identifier + ); + + $this->assertStructPropertiesCorrect( + $originalFieldDefinition, + $copiedFieldDefinition, + array( + 'identifier', + 'names', + 'descriptions', + 'fieldGroup', + 'position', + 'fieldTypeIdentifier', + 'isTranslatable', + 'isRequired', + 'isInfoCollector', + 'validatorConfiguration', + 'defaultValue', + 'isSearchable', + ) + ); + $this->assertNotEquals( + $originalFieldDefinition->id, + $copiedFieldDefinition->id + ); + } + } + + /** + * Test for the copyContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::copyContentType($contentType, $user) + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + */ + public function testCopyContentTypeWithSecondParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $user = $this->createUserVersion1(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Complete copy of the "comment" type + $copiedType = $contentTypeService->copyContentType( $commentType, $user ); + /* END: Use Case */ + + $this->assertPropertiesCorrect( + array( + 'creatorId' => $user->id, + 'modifierId' => $user->id + ), + $copiedType + ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::assignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifier + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + */ + public function testAssignContentTypeGroup() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentType( $folderType->id ); + + foreach ( $loadedType->contentTypeGroups as $loadedGroup ) + { + if ( $mediaGroup->id == $loadedGroup->id ) + { + return; + } + } + $this->fail( + sprintf( + 'Group with ID "%s" not assigned to content type.', + $mediaGroup->id + ) + ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::assignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAssignContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testAssignContentTypeGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $assignedGroups = $folderType->contentTypeGroups; + + foreach ( $assignedGroups as $assignedGroup ) + { + // Throws an exception, since group is already assigned + $contentTypeService->assignContentTypeGroup( $folderType, $assignedGroup ); + } + /* END: Use Case */ + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::unassignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAssignContentTypeGroup + */ + public function testUnassignContentTypeGroup() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ); + + // May not unassign last group + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + + $contentTypeService->unassignContentTypeGroup( $folderType, $contentGroup ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentType( $folderType->id ); + + foreach ( $loadedType->contentTypeGroups as $assignedGroup ) + { + if ( $assignedGroup->id == $contentGroup->id ) + { + $this->fail( + sprintf( + 'Group with ID "%s" not unassigned.', + $assignedGroup->id + ) + ); + } + } + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::unassignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUnassignContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUnassignContentTypeGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $notAssignedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + + // Throws an exception, since "Media" group is not assigned to "folder" + $contentTypeService->unassignContentTypeGroup( $folderType, $notAssignedGroup ); + /* END: Use Case */ + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::unassignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUnassignContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testUnassignContentTypeGroupThrowsBadStateException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $assignedGroups = $folderType->contentTypeGroups; + + foreach ( $assignedGroups as $assignedGroup ) + { + // Throws an exception, when last group is to be removed + $contentTypeService->unassignContentTypeGroup( $folderType, $assignedGroup ); + } + /* END: Use Case */ + } + + /** + * Test for the createContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroup + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + */ + public function testCreateContentTypeGroupInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Get create struct and set language property + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( 'new-group' ); + /* @todo uncomment when support for multilingual names and descriptions is added + $groupCreate->mainLanguageCode = 'eng-GB'; + */ + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create the new content type group + $groupId = $contentTypeService->createContentTypeGroup( $groupCreate )->id; + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentTypeService->loadContentTypeGroup( $groupId ); + } + catch ( NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Can still load content type group after rollback' ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroup + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentTypeGroup + */ + public function testCreateContentTypeGroupInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Get create struct and set language property + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( 'new-group' ); + /* @todo uncomment when support for multilingual names and descriptions is added + $groupCreate->mainLanguageCode = 'eng-GB'; + */ + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create the new content type group + $groupId = $contentTypeService->createContentTypeGroup( $groupCreate )->id; + + // Rollback all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load created content type group + $group = $contentTypeService->loadContentTypeGroup( $groupId ); + /* END: Use Case */ + + $this->assertEquals( $groupId, $group->id ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeGroup + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifier + */ + public function testUpdateContentTypeGroupInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load an existing group + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ); + + // Get an update struct and change the identifier + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + $groupUpdate->identifier = 'Teardown'; + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Apply update to group + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // Load updated group, it will be unchanged + $updatedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ); + /* END: Use Case */ + + $this->assertEquals( 'Setup', $updatedGroup->identifier ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::updateContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testUpdateContentTypeGroup + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifier + */ + public function testUpdateContentTypeGroupInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load an existing group + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ); + + // Get an update struct and change the identifier + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + $groupUpdate->identifier = 'Teardown'; + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Apply update to group + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load updated group by it's new identifier "Teardown" + $updatedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( + 'Teardown' + ); + /* END: Use Case */ + + $this->assertEquals( 'Teardown', $updatedGroup->identifier ); + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testDeleteContentTypeGroup + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifierThrowsNotFoundException + */ + public function testDeleteContentTypeGroupWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Get a group create struct + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create the new group + $group = $contentTypeService->createContentTypeGroup( $groupCreate ); + + // Delete the currently created group + $contentTypeService->deleteContentTypeGroup( $group ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + try + { + // This call will fail with an "NotFoundException" + $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + } + catch ( NotFoundException $e ) + { + // Expected error path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Group not deleted after rollback' ); + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testDeleteContentTypeGroup + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeGroupByIdentifierThrowsNotFoundException + */ + public function testDeleteContentTypeGroupWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Get a group create struct + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Create the new group + $group = $contentTypeService->createContentTypeGroup( $groupCreate ); + + // Delete the currently created group + $contentTypeService->deleteContentTypeGroup( $group ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + try + { + // This call will fail with an "NotFoundException" + $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + } + catch ( NotFoundException $e ) + { + // Expected error path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Group not deleted after commit.' ); + } + + /** + * Test for the createContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifierThrowsNotFoundException + */ + public function testCreateContentTypeInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Get create struct and set some properties + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'blog-post' ); + $typeCreate->mainLanguageCode = 'eng-GB'; + $typeCreate->names = array( 'eng-GB' => 'Blog post' ); + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + $titleFieldCreate->names = array( 'eng-GB' => 'Title' ); + $titleFieldCreate->position = 1; + $typeCreate->addFieldDefinition( $titleFieldCreate ); + + $groups = array( + $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ) + ); + + // Create content type + $contentTypeDraft = $contentTypeService->createContentType( + $typeCreate, + $groups + ); + + // Publish the content type draft + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes. + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentTypeService->loadContentTypeByIdentifier( 'blog-post' ); + } + catch ( NotFoundException $e ) + { + // Expected execution path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Can still load content type after rollback.' ); + } + + /** + * Test for the createContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::createContentType() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifierThrowsNotFoundException + */ + public function testCreateContentTypeInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Get create struct and set some properties + $typeCreate = $contentTypeService->newContentTypeCreateStruct( 'blog-post' ); + $typeCreate->mainLanguageCode = 'eng-GB'; + $typeCreate->names = array( 'eng-GB' => 'Blog post' ); + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'ezstring' + ); + $titleFieldCreate->names = array( 'eng-GB' => 'Title' ); + $titleFieldCreate->position = 1; + $typeCreate->addFieldDefinition( $titleFieldCreate ); + + $groups = array( + $contentTypeService->loadContentTypeGroupByIdentifier( 'Setup' ) + ); + + // Create content type + $contentTypeDraft = $contentTypeService->createContentType( + $typeCreate, + $groups + ); + + // Publish the content type draft + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + + // Commit all changes. + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load the newly created content type + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'blog-post' ); + /* END: Use Case */ + + $this->assertEquals( $contentTypeDraft->id, $contentType->id ); + } + + /** + * Test for the copyContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::copyContentType() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeThrowsNotFoundException + */ + public function testCopyContentTypeInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load content type to copy + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Complete copy of the content type + $copiedType = $contentTypeService->copyContentType( $contentType ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $contentTypeService->loadContentType( $copiedType->id ); + } + catch ( NotFoundException $e ) + { + // Expected execution path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Can still load copied content type after rollback.' ); + } + + /** + * Test for the copyContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::copyContentType() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeThrowsNotFoundException + */ + public function testCopyContentTypeInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load content type to copy + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Complete copy of the content type + $contentTypeId = $contentTypeService->copyContentType( $contentType )->id; + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load the new content type copy. + $copiedContentType = $contentTypeService->loadContentType( $contentTypeId ); + /* END: Use Case */ + + $this->assertEquals( $contentTypeId, $copiedContentType->id ); + } + + /** + * Test for the deleteContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentType() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifierThrowsNotFoundException + */ + public function testDeleteContentTypeInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load content type to copy + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Delete the "comment" content type. + $contentTypeService->deleteContentType( $contentType ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // Load currently deleted and rollbacked content type + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + /* END: Use Case */ + + $this->assertEquals( 'comment', $commentType->identifier ); + } + + /** + * Test for the deleteContentType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::deleteContentType() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCopyContentType + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifierThrowsNotFoundException + */ + public function testDeleteContentTypeInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + // Load content type to copy + $contentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Delete the "comment" content type. + $contentTypeService->deleteContentType( $contentType ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + try + { + // This call will fail with a "NotFoundException" + $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + } + catch ( NotFoundException $e ) + { + // Expected execution path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Can still load content type after rollback.' ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::assignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAssignContentTypeGroup + */ + public function testAssignContentTypeGroupInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Assign group to content type + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // Load all content types assigned to media group + $contentTypes = $contentTypeService->loadContentTypes( $mediaGroup ); + + $contentTypeIds = array(); + foreach ( $contentTypes as $contentType ) + { + $contentTypeIds[] = $contentType->id; + } + /* END: Use Case */ + + $this->assertFalse( + in_array( $folderType->id, $contentTypeIds ), + 'Folder content type is still in media group after rollback.' + ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ContentTypeService::assignContentTypeGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testAssignContentTypeGroup + */ + public function testAssignContentTypeGroupInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Assign group to content type + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load all content types assigned to media group + $contentTypes = $contentTypeService->loadContentTypes( $mediaGroup ); + + $contentTypeIds = array(); + foreach ( $contentTypes as $contentType ) + { + $contentTypeIds[] = $contentType->id; + } + /* END: Use Case */ + + $this->assertTrue( + in_array( $folderType->id, $contentTypeIds ), + 'Folder content type not in media group after commit.' + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/AuthorIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/AuthorIntegrationTest.php new file mode 100644 index 0000000..4cb8c82 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/AuthorIntegrationTest.php @@ -0,0 +1,406 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 42 ), + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + // We may only create times from timestamps here, since storing will + // loose information about the timezone. + return new AuthorValue( + array( + new Author( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ) + ), + ) + ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Author\\Value', + $field->value + ); + + $expectedData = array( + 'authors' => new AuthorCollection( + array( + new Author( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ) + ), + ) + ) + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( 'Sindelfingen', 'eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException' ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new AuthorValue( + array( + new Author( + array( + 'id' => 42, + 'name' => 'Lieschen Mueller', + 'email' => 'lieschen@example.com', + ) + ), + ) + ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Author\\Value', + $field->value + ); + + $expectedData = array( + 'authors' => new AuthorCollection( + array( + new Author( + array( + 'id' => 42, + 'name' => 'Lieschen Mueller', + 'email' => 'lieschen@example.com', + ) + ), + ) + ) + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Author\\Value', + $field->value + ); + + $expectedData = array( + 'authors' => new AuthorCollection( + array( + new Author( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ) + ), + ) + ) + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new AuthorValue( + array( + new Author( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ) + ), + ) + ), + array( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ), + ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ), + ), + new AuthorValue( + array( + new Author( + array( + 'id' => 23, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com', + ) + ), + ) + ), + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new AuthorValue ), + array( new AuthorValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( + new AuthorValue( + array( + new Author( + array( + "id" => 23, + "name" => "Hans Mueller", + "email" => "hans@example.com", + ) + ) + ) + ) + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/BaseIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/BaseIntegrationTest.php new file mode 100644 index 0000000..4ba2b36 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/BaseIntegrationTest.php @@ -0,0 +1,863 @@ + + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + abstract public function provideInvalidCreationFieldData(); + + /** + * Get valid field data for updating content + * + * @return mixed + */ + abstract public function getValidUpdateFieldData(); + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidUpdateFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + */ + abstract public function assertUpdatedFieldDataLoadedCorrect( Field $field ); + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + abstract public function provideInvalidUpdateFieldData(); + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + abstract public function assertCopiedFieldDataLoadedCorrectly( Field $field ); + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + abstract public function provideToHashData(); + + /** + * Get hashes and their respective converted values + * + * This is a PHPUnit data provider + * + * The returned records must have the the input hash assigned to the + * first index and the expected value result to the second. For example: + * + * + * array( + * array( + * array( 'myValue' => true ), + * new MyValue( true ), + * ), + * // ... + * ); + * + * + * @return array + */ + abstract public function provideFromHashData(); + + /** + * Marks FieldType integration tests skipped against memory stub + * + * Since the FieldType integration tests rely on multiple factors which are + * hard to mimic by the memory stub, these can only be run against a real + * core implementation with a real persistence back end. + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + if ( $this->getRepository() instanceof \eZ\Publish\API\Repository\Tests\Stubs\RepositoryStub ) + { + $this->markTestSkipped( + 'FieldType integration tests cannot be run against memory stub.' + ); + } + } + + /** + * Method called after content creation + * + * Useful, if additional stuff should be executed (like creating the actual + * user). + * + * We cannot just overwrite the testCreateContent method, since this messes + * up PHPUnits @depends sorting of tests, so everything will be skipped. + * + * @param Repository\Repository $repository + * @param Repository\Values\Content\Content $content + * + * @return void + */ + public function postCreationHook( Repository\Repository $repository, Repository\Values\Content\Content $content ) + { + // Do nothing by default + } + + /** + * @dep_ends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testCreateContentType + */ + public function testCreateContentType() + { + $contentType = $this->createContentType( + $this->getValidFieldSettings(), + $this->getValidValidatorConfiguration() + ); + + $this->assertNotNull( $contentType->id ); + + return $contentType; + } + + /** + * Creates a content type under test with $fieldSettings and + * $validatorConfiguration. + * + * $typeCreateOverride and $fieldCreateOverride can be used to selectively + * override settings on the type create struct and field create struct. + * + * @param mixed $fieldSettings + * @param mixed $validatorConfiguration + * @param array $typeCreateOverride + * @param array $fieldCreateOverride + * + * @return \eZ\Publish\API\Repository\Values\ContentType + */ + protected function createContentType( $fieldSettings, $validatorConfiguration, array $typeCreateOverride = array(), array $fieldCreateOverride = array() ) + { + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + $createStruct = $contentTypeService->newContentTypeCreateStruct( + 'test-' . $this->getTypeName() + ); + $createStruct->mainLanguageCode = $this->getOverride( 'mainLanguageCode', $typeCreateOverride, 'eng-GB' ); + $createStruct->remoteId = $this->getTypeName(); + $createStruct->names = $this->getOverride( 'names', $typeCreateOverride, array( 'eng-GB' => 'Test' ) ); + $createStruct->creatorId = 14; + $createStruct->creationDate = $this->createDateTime(); + + $nameFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'name', 'ezstring' + ); + $nameFieldCreate->names = array( 'eng-GB' => 'Title' ); + $nameFieldCreate->fieldGroup = 'main'; + $nameFieldCreate->position = 1; + $nameFieldCreate->isTranslatable = true; + $createStruct->addFieldDefinition( $nameFieldCreate ); + + $dataFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'data', $this->getTypeName() + ); + $dataFieldCreate->names = $this->getOverride( 'names', $fieldCreateOverride, array( 'eng-GB' => 'Title' ) ); + $dataFieldCreate->fieldGroup = 'main'; + $dataFieldCreate->position = 2; + $dataFieldCreate->isTranslatable = $this->getOverride( 'isTranslatable', $fieldCreateOverride, false ); + + // Custom settings + $dataFieldCreate->fieldSettings = $fieldSettings; + $dataFieldCreate->validatorConfiguration = $validatorConfiguration; + + $createStruct->addFieldDefinition( $dataFieldCreate ); + + $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ); + $contentTypeDraft = $contentTypeService->createContentType( $createStruct, array( $contentGroup ) ); + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + $contentType = $contentTypeService->loadContentType( $contentTypeDraft->id ); + + return $contentType; + } + + /** + * Retrieves a value for $key from $overrideValues, falling back to + * $default + * + * @param string $key + * @param array $overrideValues + * @param mixed $default + * + * @return mixed + */ + protected function getOverride( $key, array $overrideValues, $default ) + { + return ( isset( $overrideValues[$key] ) ? $overrideValues[$key] : $default ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::isEmptyValue + * @dataProvider providerForTestIsEmptyValue + */ + public function testIsEmptyValue( $value ) + { + $this->assertTrue( $this->getRepository()->getFieldTypeService()->buildFieldType( $this->getTypeName() )->isEmptyValue( $value ) ); + } + + abstract public function providerForTestIsEmptyValue(); + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::isEmptyValue + * @dataProvider providerForTestIsNotEmptyValue + */ + public function testIsNotEmptyValue( $value ) + { + $this->assertFalse( $this->getRepository()->getFieldTypeService()->buildFieldType( $this->getTypeName() )->isEmptyValue( $value ) ); + } + + abstract public function providerForTestIsNotEmptyValue(); + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::isEmptyValue + */ + public function testIsEmptyValueWithNull() + { + $this->assertTrue( $this->getRepository()->getFieldTypeService()->buildFieldType( $this->getTypeName() )->isEmptyValue( null ) ); + } + + /** + * @depends testCreateContentType + */ + public function testContentTypeField( $contentType ) + { + $this->assertSame( + $this->getTypeName(), + $contentType->fieldDefinitions[1]->fieldTypeIdentifier + ); + } + + /** + * @dep_ends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentType + * @depends testCreateContentType + */ + public function testLoadContentTypeField() + { + $contentType = $this->testCreateContentType(); + + $repository = $this->getRepository(); + $contentTypeService = $repository->getContentTypeService(); + + return $contentTypeService->loadContentType( $contentType->id ); + } + + /** + * @depends testLoadContentTypeField + */ + public function testLoadContentTypeFieldType( $contentType ) + { + $this->assertSame( + $this->getTypeName(), + $contentType->fieldDefinitions[1]->fieldTypeIdentifier + ); + + return $contentType->fieldDefinitions[1]; + } + + public function testSettingsSchema() + { + $repository = $this->getRepository(); + $fieldTypeService = $repository->getFieldTypeService(); + $fieldType = $fieldTypeService->getFieldType( $this->getTypeName() ); + + $this->assertEquals( + $this->getSettingsSchema(), + $fieldType->getSettingsSchema() + ); + } + + /** + * @depends testLoadContentTypeFieldType + */ + public function testLoadContentTypeFieldData( FieldDefinition $fieldDefinition ) + { + $this->assertEquals( + $this->getTypeName(), + $fieldDefinition->fieldTypeIdentifier, + 'Loaded fieldTypeIdentifier does not match.' + ); + $this->assertEquals( + $this->getValidFieldSettings(), + $fieldDefinition->fieldSettings, + 'Loaded fieldSettings do not match.' + ); + $this->assertEquals( + $this->getValidValidatorConfiguration(), + $fieldDefinition->validatorConfiguration, + 'Loaded validatorConfiguration does not match.' + ); + } + + /** + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentTypeFieldDefinitionValidationException + */ + public function testCreateContentTypeFailsWithInvalidFieldSettings() + { + $this->createContentType( + $this->getInvalidFieldSettings(), + $this->getValidValidatorConfiguration() + ); + } + + public function testValidatorSchema() + { + $repository = $this->getRepository(); + $fieldTypeService = $repository->getFieldTypeService(); + $fieldType = $fieldTypeService->getFieldType( $this->getTypeName() ); + + $this->assertEquals( + $this->getValidatorSchema(), + $fieldType->getValidatorConfigurationSchema() + ); + } + + /** + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentTypeFieldDefinitionValidationException + */ + public function testCreateContentTypeFailsWithInvalidValidatorConfiguration() + { + $this->createContentType( + $this->getValidFieldSettings(), + $this->getInvalidValidatorConfiguration() + ); + } + + /** + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent; + * @depends testLoadContentTypeField + */ + public function testCreateContent() + { + return $this->createContent( $this->getValidCreationFieldData() ); + } + + /** + * Creates content with $fieldData + * + * @param mixed $fieldData + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createContent( $fieldData, $contentType = null ) + { + if ( $contentType === null ) + { + $contentType = $this->testCreateContentType(); + } + + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + $createStruct = $contentService->newContentCreateStruct( $contentType, 'eng-US' ); + $createStruct->setField( 'name', 'Test object' ); + $createStruct->setField( + 'data', + $fieldData + ); + + $createStruct->remoteId = 'abcdef0123456789abcdef0123456789'; + $createStruct->alwaysAvailable = true; + + return $contentService->createContent( $createStruct ); + } + + /** + * @depends testCreateContent + */ + public function testCreatedFieldType( $content ) + { + foreach ( $content->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === $this->customFieldIdentifier ) + { + return $field; + } + } + + $this->fail( "Custom field not found." ); + } + + /** + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + * @depends testCreateContent + */ + public function testPublishContent() + { + $draft = $this->testCreateContent(); + + if ( $draft->getVersionInfo()->status !== Repository\Values\Content\VersionInfo::STATUS_DRAFT ) + { + $this->markTestSkipped( "Provided content object is not a draft." ); + } + + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + return $contentService->publishVersion( $draft->getVersionInfo() ); + } + + /** + * @depends testPublishContent + */ + public function testPublishedFieldType( $content ) + { + foreach ( $content->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === $this->customFieldIdentifier ) + { + return $field; + } + } + + $this->fail( "Custom field not found." ); + } + + /** + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContent + * @dep_ends testCreateContent + */ + public function testLoadField() + { + $content = $this->testCreateContent(); + + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + return $contentService->loadContent( $content->contentInfo->id ); + } + + /** + * @depends testLoadField + */ + public function testLoadFieldType( $content ) + { + foreach ( $content->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === $this->customFieldIdentifier ) + { + return $field; + } + } + + $this->fail( "Custom field not found." ); + } + + /** + * @depends testLoadFieldType + */ + public function testLoadExternalData( Field $field ) + { + $this->assertFieldDataLoadedCorrect( $field ); + } + + /** + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + * @depends testLoadFieldType + */ + public function testUpdateField() + { + return $this->updateContent( $this->getValidUpdateFieldData() ); + } + + /** + * Updates the standard published content object with $fieldData + * + * @param mixed $fieldData + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function updateContent( $fieldData ) + { + $content = $this->testPublishContent(); + + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + $draft = $contentService->createContentDraft( $content->contentInfo ); + + $updateStruct = $contentService->newContentUpdateStruct(); + $updateStruct->setField( + $this->customFieldIdentifier, + $fieldData + ); + + return $contentService->updateContent( $draft->versionInfo, $updateStruct ); + } + + /** + * @depends testUpdateField + */ + public function testUpdateTypeFieldStillAvailable( $content ) + { + foreach ( $content->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === $this->customFieldIdentifier ) + { + return $field; + } + } + + $this->fail( "Custom field not found." ); + } + + /** + * @depends testUpdateTypeFieldStillAvailable + */ + public function testUpdatedDataCorrect( Field $field ) + { + $this->assertUpdatedFieldDataLoadedCorrect( $field ); + } + + /** + * @depends testCreateContent + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCopyContent + */ + public function testCopyField( $content ) + { + $content = $this->testCreateContent(); + + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + $locationService = $repository->getLocationService(); + $parentLocationId = $this->generateId( 'location', 2 ); + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $copied = $contentService->copyContent( $content->contentInfo, $locationCreate ); + + $this->assertNotSame( + $content->contentInfo->id, + $copied->contentInfo->id + ); + + return $contentService->loadContent( $copied->id ); + } + + /** + * @depends testCopyField + */ + public function testCopiedFieldType( $content ) + { + foreach ( $content->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === $this->customFieldIdentifier ) + { + return $field; + } + } + + $this->fail( "Custom field not found." ); + } + + /** + * @depends testCopiedFieldType + */ + public function testCopiedExternalData( Field $field ) + { + $this->assertCopiedFieldDataLoadedCorrectly( $field ); + } + + /** + * @depends testCopyField + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::deleteContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteContent( $content ) + { + $content = $this->testPublishContent(); + + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + + $contentService->deleteContent( $content->contentInfo ); + + $contentService->loadContent( $content->contentInfo->id ); + } + + /** + * Tests failing content creation + * + * @param mixed $failingValue + * @param string $expectedException + * + * @dataProvider provideInvalidCreationFieldData + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testDeleteContent + * + * @return void + */ + public function testCreateContentFails( $failingValue, $expectedException ) + { + try + { + $this->createContent( $failingValue ); + + $this->fail( 'Expected exception not thrown.' ); + } + catch ( \PHPUnit_Framework_AssertionFailedError $e ) + { + throw $e; + } + catch ( \Exception $e ) + { + $this->assertInstanceOf( + $expectedException, + $e + ); + } + } + + /** + * Tests failing content update + * + * @param mixed $failingValue + * @param string $expectedException + * + * @dataProvider provideInvalidUpdateFieldData + * @dep_ends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + * + * @return void + */ + public function testUpdateContentFails( $failingValue, $expectedException ) + { + try + { + $this->updateContent( $failingValue ); + + $this->fail( 'Expected exception not thrown.' ); + } + catch ( \PHPUnit_Framework_AssertionFailedError $e ) + { + throw $e; + } + catch ( \Exception $e ) + { + $this->assertInstanceOf( + $expectedException, + $e + ); + } + } + + /** + * @dataProvider provideToHashData + */ + public function testToHash( $value, $expectedHash ) + { + $repository = $this->getRepository(); + $fieldTypeService = $repository->getFieldTypeService(); + $fieldType = $fieldTypeService->getFieldType( $this->getTypeName() ); + + $this->assertEquals( + $expectedHash, + $fieldType->toHash( $value ) + ); + } + + /** + * @depends testCreateContent + * @dataProvider provideFromHashData + * @todo: Requires correct registered FieldTypeService, needs to be + * maintained! + */ + public function testFromHash( $hash, $expectedValue ) + { + $repository = $this->getRepository(); + $fieldTypeService = $repository->getFieldTypeService(); + $fieldType = $fieldTypeService->getFieldType( $this->getTypeName() ); + + $this->assertEquals( + $expectedValue, + $fieldType->fromHash( $hash ) + ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( get_called_class() ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/BinaryFileIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/BinaryFileIntegrationTest.php new file mode 100644 index 0000000..10bf7ae --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/BinaryFileIntegrationTest.php @@ -0,0 +1,391 @@ + array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.jpg' ), + 'fileName' => 'Icy-Night-Flower-Binary.jpg', + 'fileSize' => filesize( $path ), + 'mimeType' => 'image/jpeg', + // Left out'downloadCount' by intention (will be set to 0) + ), + 'update' => array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.png' ), + 'fileName' => 'Blue-Blue-Blue-Sindelfingen.png', + 'fileSize' => filesize( $path ), + 'downloadCount' => 23, + // Left out 'mimeType' by intention (will be auto-detected) + ), + ); + } + + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezbinaryfile'; + } + + /** + * Get expected settings schema + * + * @return array + */ + public function getSettingsSchema() + { + return array(); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array(); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'FileSizeValidator' => array( + 'maxFileSize' => array( + 'type' => 'int', + 'default' => false, + ), + ) + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ), + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + $fixtureData = $this->getFixtureData(); + return new BinaryFileValue( $fixtureData['create'] ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\BinaryFile\\Value', + $field->value + ); + + $fixtureData = $this->getFixtureData(); + $expectedData = $fixtureData['create']; + + // Will change during storage + unset( $expectedData['path'] ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertTrue( + file_exists( $this->getInstallDir() . '/' . $this->getStorageDir() . '/' . $field->value->path ) + ); + + self::$loadedBinaryFilePath = $field->value->path; + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new BinaryFileValue( array() ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + array( + 'path' => '/foo/bar/sindelfingen.pdf', + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new BinaryFileValue( + array( + 'path' => '/foo/bar/sindelfingen.pdf', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + $fixtureData = $this->getFixtureData(); + return new BinaryFileValue( $fixtureData['update'] ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\BinaryFile\\Value', + $field->value + ); + + $fixtureData = $this->getFixtureData(); + $expectedData = $fixtureData['update']; + // Will change during storage + unset( $expectedData['path'] ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertTrue( + file_exists( $this->getInstallDir() . '/' . $this->getStorageDir() . '/' . $field->value->path ) + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertFieldDataLoadedCorrect( $field ); + + $this->assertEquals( + self::$loadedBinaryFilePath, + $field->value->path + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + $fixture = $this->getFixtureData(); + $fixture['create']['downloadCount'] = 0; + return array( + array( + $this->getValidCreationFieldData(), + $fixture['create'], + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + $fixture = $this->getFixtureData(); + $fixture['create']['downloadCount'] = 0; + return array( + array( + $fixture['create'], + $this->getValidCreationFieldData() + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new BinaryFileValue ), + array( new BinaryFileValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/CheckboxIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/CheckboxIntegrationTest.php new file mode 100644 index 0000000..30ed81b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/CheckboxIntegrationTest.php @@ -0,0 +1,314 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 42 ), + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new CheckboxValue( true ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Checkbox\\Value', + $field->value + ); + + $expectedData = array( + 'bool' => true, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new CheckboxValue( new \stdClass() ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new CheckboxValue( false ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Checkbox\\Value', + $field->value + ); + + $expectedData = array( + 'bool' => false, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Checkbox\\Value', + $field->value + ); + + $expectedData = array( + 'bool' => true, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new CheckboxValue( true ), + '1' + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + '1', + new CheckboxValue( true ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new CheckboxValue ), + array( new CheckboxValue( null ) ), + array( new CheckboxValue( false ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( + new CheckboxValue( true ) + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/CountryIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/CountryIntegrationTest.php new file mode 100644 index 0000000..9f3c5da --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/CountryIntegrationTest.php @@ -0,0 +1,408 @@ + array( + "type" => "boolean", + "default" => false + ) + ); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + "isMultiple" => false + ); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + "unknown" => array( "value" => 42 ), + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Country\\Value', + $field->value + ); + + $expectedData = array( + "countries" => array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + 'Sindelfingen', + 'eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException' + ), + array( + array( "NON_VALID_ALPHA2_CODE" ), + 'eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException' + ), + array( + array( "BE", "FR" ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException' + ), + array( + new CountryValue( + array( + "NON_VALID_ALPHA2_CODE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException' + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new CountryValue( + array( + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Country\\Value', + $field->value + ); + + $expectedData = array( + "countries" => array( + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Country\\Value', + $field->value + ); + + $expectedData = array( + "countries" => array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ), + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ), + array( 'BE', 'FR' ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( "BE", "FR" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ), + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ), + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new CountryValue ), + array( new CountryValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/DateAndTimeIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/DateAndTimeIntegrationTest.php new file mode 100644 index 0000000..5dd2509 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/DateAndTimeIntegrationTest.php @@ -0,0 +1,352 @@ + array( + "type" => "bool", + "default" => false + ), + "defaultType" => array( + "type" => "choice", + "default" => 0 + ), + "dateInterval" => array( + "type" => "dateInterval", + "default" => null + ) + ); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + "useSeconds" => false, + "defaultType" => 0, + "dateInterval" => null, + ); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 42 ), + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + // We may only create times from timestamps here, since storing will + // loose information about the timezone. + return DateAndTimeValue::fromTimestamp( 123456 ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\DateAndTime\\Value', + $field->value + ); + + $expectedData = array( + 'value' => new \DateTime( "@123456" ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + "Some unknown date format", 'eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException' + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return DateAndTimeValue::fromTimestamp( 12345678 ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\DateAndTime\\Value', + $field->value + ); + + $expectedData = array( + 'value' => new \DateTime( "@12345678" ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Tests failing content update + * + * @param mixed $failingValue + * @param string $expectedException + * + * @dataProvider provideInvalidUpdateFieldData + * + * @return void + */ + public function testUpdateContentFails( $failingValue, $expectedException ) + { + return array( + array( + "Some unknown date format", 'eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException' + ), + ); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\DateAndTime\\Value', + $field->value + ); + + $expectedData = array( + 'value' => new \DateTime( "@123456" ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + DateAndTimeValue::fromTimestamp( 123456 ), + array( + 'timestamp' => 123456, + 'rfc850' => 'Friday, 02-Jan-70 10:17:36 GMT+0000', + ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( + 'timestamp' => 123456, + 'rfc850' => 'Friday, 02-Jan-70 10:17:36 GMT+0000', + ), + DateAndTimeValue::fromTimestamp( 123456 ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new DateAndTimeValue ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/EmailAddressIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/EmailAddressIntegrationTest.php new file mode 100644 index 0000000..9c7c16a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/EmailAddressIntegrationTest.php @@ -0,0 +1,337 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'EmailAddressValidator' => array() + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'EmailAddressValidator' => array() + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new EmailAddressValue( 'spam@ez.no' ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\EmailAddress\\Value', + $field->value + ); + + $expectedData = array( + 'email' => 'spam@ez.no', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + 42, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new EmailAddressValue( str_repeat( '.', 64 ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + array( + new EmailAddressValue( 'spam@' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + array( + new EmailAddressValue( '@ez.no' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + array( + new EmailAddressValue( 'spam@ez-no' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new EmailAddressValue( 'spam_name@ez-some-thing.no' ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\EmailAddress\\Value', + $field->value + ); + + $expectedData = array( + 'email' => 'spam_name@ez-some-thing.no', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\EmailAddress\\Value', + $field->value + ); + + $expectedData = array( + 'email' => 'spam@ez.no', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new EmailAddressValue( 'spam@example.no' ), + 'spam@example.no', + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + 'spam@example.no', + new EmailAddressValue( 'spam@example.no' ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new EmailAddressValue ), + array( new EmailAddressValue( null ) ), + array( new EmailAddressValue( "" ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/FileBaseIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/FileBaseIntegrationTest.php new file mode 100644 index 0000000..a07c7e5 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/FileBaseIntegrationTest.php @@ -0,0 +1,139 @@ +getConfigValue( 'install_dir' ); + self::$storageDir = $this->getConfigValue( static::$storageDirConfigKey ); + } + } + + /** + * Tears down the test. + * + * Cleans up the storage directory, if it was used + * + * @return void + */ + public static function tearDownAfterClass() + { + parent::tearDownAfterClass(); + self::cleanupStorageDir(); + } + + /** + * Returns an iterator over the full storage dir. + * + * @return Iterator + */ + protected static function getStorageDirIterator() + { + return new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + self::$installDir . '/' . self::$storageDir, + FileSystemIterator::KEY_AS_PATHNAME | FileSystemIterator::SKIP_DOTS | FilesystemIterator::CURRENT_AS_FILEINFO + ), + RecursiveIteratorIterator::CHILD_FIRST + ); + } + + /** + * Removes the given directory path recursively + * + * @param string $dir + * + * @return void + */ + protected static function cleanupStorageDir() + { + if ( self::$installDir == null || self::$storageDir == null || self::$leaveStorageData ) + { + // Nothing to do + return; + } + + $iterator = self::getStorageDirIterator(); + + foreach ( $iterator as $path => $fileInfo ) + { + if ( $fileInfo->isDir() ) + { + rmdir( $path ); + } + else + { + unlink( $path ); + } + } + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/FloatIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/FloatIntegrationTest.php new file mode 100644 index 0000000..319a189 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/FloatIntegrationTest.php @@ -0,0 +1,337 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'FloatValueValidator' => array( + 'minFloatValue' => array( + 'type' => 'float', + 'default' => false, + ), + 'maxFloatValue' => array( + 'type' => 'float', + 'default' => false, + ), + ) + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'FloatValueValidator' => array( + 'minFloatValue' => 23., + 'maxFloatValue' => 43., + ) + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'FloatValueValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new FloatValue( 23.5 ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Float\\Value', + $field->value + ); + + $expectedData = array( + 'value' => 23.5, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\API\\Repository\\Exceptions\\InvalidArgumentException', + ), + array( + new FloatValue( 5.5 ), + 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentFieldValidationException', + ), + array( + new FloatValue( 127.5 ), + 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentFieldValidationException', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new FloatValue( 42.5 ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Float\\Value', + $field->value + ); + + $expectedData = array( + 'value' => 42.5, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Float\\Value', + $field->value + ); + + $expectedData = array( + 'value' => 23.5, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new FloatValue( 23.5 ), + 23.5, + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + 42.5, + new FloatValue( 42.5 ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new FloatValue ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( new FloatValue( 0 ) ), + array( new FloatValue( 0.0 ) ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/ImageIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/ImageIntegrationTest.php new file mode 100644 index 0000000..4a683f2 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/ImageIntegrationTest.php @@ -0,0 +1,431 @@ + array( + 'fileName' => 'Icy-Night-Flower.jpg', + 'path' => ( $path = __DIR__ . '/_fixtures/image.jpg' ), + 'alternativeText' => 'My icy flower at night', + 'fileSize' => filesize( $path ), + ), + 'update' => array( + 'fileName' => 'Blue-Blue-Blue.png', + 'path' => ( $path = __DIR__ . '/_fixtures/image.png' ), + 'alternativeText' => 'Such a blue …', + 'fileSize' => filesize( $path ), + ), + ); + } + + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezimage'; + } + + /** + * Get expected settings schema + * + * @return array + */ + public function getSettingsSchema() + { + return array(); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array(); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'FileSizeValidator' => array( + 'maxFileSize' => array( + 'type' => 'int', + 'default' => false, + ), + ) + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ), + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + $fixtureData = $this->getFixtureData(); + return new ImageValue( $fixtureData['create'] ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Image\\Value', + $field->value + ); + + $fixtureData = $this->getFixtureData(); + $expectedData = $fixtureData['create']; + + // Will change during storage + unset( $expectedData['path'] ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertTrue( + file_exists( $this->getInstallDir() . '/' . $field->value->path ) + ); + + self::$loadedImagePath = $field->value->path; + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new ImageValue( array() ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new ImageValue( + array( + 'path' => __DIR__ . '/_fixtures/image.jpg', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new ImageValue( + array( + 'path' => __DIR__ . '/_fixtures/image.jpg', + 'fileName' => __DIR__ . '/_fixtures/image.jpg', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + $fixtureData = $this->getFixtureData(); + return new ImageValue( $fixtureData['update'] ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Image\\Value', + $field->value + ); + + $fixtureData = $this->getFixtureData(); + $expectedData = $fixtureData['update']; + // Will change during storage + unset( $expectedData['path'] ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertTrue( + file_exists( $this->getInstallDir() . '/' . $field->value->path ) + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertFieldDataLoadedCorrect( $field ); + + $this->assertEquals( + self::$loadedImagePath, + $field->value->path + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + $fixture = $this->getFixtureData(); + return array( + array( + $this->getValidCreationFieldData(), + $fixture['create'], + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + $fixture = $this->getFixtureData(); + return array( + array( + $fixture['create'], + $this->getValidCreationFieldData() + ), + ); + } + + public function testInherentCopyForNewLanguage() + { + $repository = $this->getRepository(); + $contentService = $repository->getContentService(); + $contentTypeService = $repository->getContentTypeService(); + + $type = $this->createContentType( + $this->getValidFieldSettings(), + $this->getValidValidatorConfiguration(), + array(), + // Causes a copy of the image value for each language in legacy + // storage + array( 'isTranslatable' => false ) + ); + + $draft = $this->createContent( $this->getValidCreationFieldData(), $type ); + + $updateStruct = $contentService->newContentUpdateStruct(); + $updateStruct->initialLanguageCode = 'ger-DE'; + $updateStruct->setField( 'name', 'Sindelfingen' ); + + // Automatically creates a copy of the image field in the back ground + $updatedDraft = $contentService->updateContent( $draft->versionInfo, $updateStruct ); + + $paths = array(); + foreach ( $updatedDraft->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === 'data' ) + { + $paths[$field->languageCode] = $field->value->path; + } + } + + $this->assertTrue( isset( $paths['eng-US'] ) && isset( $paths['ger-DE'] ) ); + $this->assertEquals( + $paths['eng-US'], + $paths['ger-DE'] + ); + + $contentService->deleteContent( $updatedDraft->contentInfo ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new ImageValue ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/IntegerIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/IntegerIntegrationTest.php new file mode 100644 index 0000000..0fcabc9 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/IntegerIntegrationTest.php @@ -0,0 +1,338 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => array( + 'type' => 'int', + 'default' => null, + ), + 'maxIntegerValue' => array( + 'type' => 'int', + 'default' => null, + ), + ) + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => 23, + 'maxIntegerValue' => 42, + ) + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'IntegerValueValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new IntegerValue( 23 ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Integer\\Value', + $field->value + ); + + $expectedData = array( + 'value' => 23, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new IntegerValue( 5 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + array( + new IntegerValue( 127 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new IntegerValue( 42 ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Integer\\Value', + $field->value + ); + + $expectedData = array( + 'value' => 42, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Integer\\Value', + $field->value + ); + + $expectedData = array( + 'value' => 23, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new IntegerValue( 23 ), + 23, + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + 42, + new IntegerValue( 42 ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new IntegerValue() ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( new IntegerValue( 0 ) ), + array( new IntegerValue( 0.0 ) ), + ); + } +} + diff --git a/eZ/Publish/API/Repository/Tests/FieldType/KeywordIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/KeywordIntegrationTest.php new file mode 100644 index 0000000..96279ce --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/KeywordIntegrationTest.php @@ -0,0 +1,309 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new KeywordValue( array( 'foo', 'bar', 'sindelfingen' ) ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Keyword\\Value', + $field->value + ); + + $this->assertEquals( + array( 'foo' => true, 'bar' => true, 'sindelfingen' => true ), + array_fill_keys( $field->value->values, true ) + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new KeywordValue( array( 'bielefeld' ) ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Keyword\\Value', + $field->value + ); + + $this->assertEquals( + array( 'bielefeld' => true ), + array_fill_keys( $field->value->values, true ) + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Keyword\\Value', + $field->value + ); + + $this->assertEquals( + array( 'foo' => true, 'bar' => true, 'sindelfingen' => true ), + array_fill_keys( $field->value->values, true ) + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new KeywordValue( array( 'bielefeld', 'sindelfingen' ) ), + array( 'bielefeld', 'sindelfingen' ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( 'sindelfeld', 'bielefingen' ), + new KeywordValue( array( 'sindelfeld', 'bielefingen' ) ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new KeywordValue ), + array( new KeywordValue( null ) ), + array( new KeywordValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( + new KeywordValue( array( "0" ) ) + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/MapLocationIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/MapLocationIntegrationTest.php new file mode 100644 index 0000000..afabdb3 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/MapLocationIntegrationTest.php @@ -0,0 +1,365 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new MapLocationValue( + array( + 'latitude' => 51.559997, + 'longitude' => 6.767921, + 'address' => 'Bielefeld', + ) + ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field ) + { + $this->assertEquals( + $this->getValidCreationFieldData(), + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new MapLocationValue( + array( + 'latitude' => 'string' + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new MapLocationValue( + array( + 'latitude' => 23.42, + 'longitude' => 'invalid', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new MapLocationValue( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => true, + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + // https://maps.google.de/maps?qll=,&spn=0.139491,0.209942&sll=51.983611,8.574829&sspn=0.36242,0.839767&oq=Punta+Cana&t=h&hnear=Punta+Cana,+La+Altagracia,+Dominikanische+Republik&z=13 + return new MapLocationValue( + array( + 'latitude' => 18.524701, + 'longitude' => -68.363113, + 'address' => 'Punta Cana', + ) + ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertEquals( + $this->getValidUpdateFieldData(), + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertEquals( + $this->getValidCreationFieldData(), + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new MapLocationValue( + array( + 'latitude' => 51.559997, + 'longitude' => 6.767921, + 'address' => 'Bielefeld', + ) + ), + array( + 'latitude' => 51.559997, + 'longitude' => 6.767921, + 'address' => 'Bielefeld', + ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( + 'latitude' => 51.559997, + 'longitude' => 6.767921, + 'address' => 'Bielefeld', + ), + new MapLocationValue( + array( + 'latitude' => 51.559997, + 'longitude' => 6.767921, + 'address' => 'Bielefeld', + ) + ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new MapLocationValue ), + array( + new MapLocationValue( + array( + 'latitude' => null, + 'longitude' => null, + ) + ) + ) + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( + new MapLocationValue( + array( + 'latitude' => 0, + 'longitude' => 0, + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/MediaIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/MediaIntegrationTest.php new file mode 100644 index 0000000..cefb8b1 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/MediaIntegrationTest.php @@ -0,0 +1,407 @@ + array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.jpg' ), + 'fileName' => 'Icy-Night-Flower-Binary.jpg', + 'fileSize' => filesize( $path ), + 'mimeType' => 'image/jpeg', + // Left out 'hasControlls', 'autoplay', 'loop', 'height' and + // 'width' by intention (will be set to defaults) + ), + 'update' => array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.png' ), + 'fileName' => 'Blue-Blue-Blue-Sindelfingen.png', + 'fileSize' => filesize( $path ), + // Left out 'mimeType' by intention (will be auto-detected) + 'hasController' => true, + 'autoplay' => true, + 'loop' => true, + 'width' => 23, + 'height' => 42, + ), + ); + } + + /** + * Get name of tested field tyoe + * + * @return string + */ + public function getTypeName() + { + return 'ezmedia'; + } + + /** + * Get expected settings schema + * + * @return array + */ + public function getSettingsSchema() + { + return array( + 'mediaType' => array( + 'type' => 'choice', + 'default' => MediaType::TYPE_HTML5_VIDEO, + ) + ); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + 'mediaType' => MediaType::TYPE_FLASH, + ); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'FileSizeValidator' => array( + 'maxFileSize' => array( + 'type' => 'int', + 'default' => false, + ), + ) + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ), + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + $fixtureData = $this->getFixtureData(); + return new MediaValue( $fixtureData['create'] ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Media\\Value', + $field->value + ); + + $fixtureData = $this->getFixtureData(); + $expectedData = $fixtureData['create']; + + // Will change during storage + unset( $expectedData['path'] ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertTrue( + file_exists( $this->getInstallDir() . '/' . $this->getStorageDir() . '/' . $field->value->path ) + ); + + self::$loadedMediaPath = $field->value->path; + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new MediaValue( array() ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + array( + 'path' => '/foo/bar/sindelfingen.pdf', + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new MediaValue( + array( + 'path' => '/foo/bar/sindelfingen.pdf', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + $fixtureData = $this->getFixtureData(); + return new MediaValue( $fixtureData['update'] ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Media\\Value', + $field->value + ); + + $fixtureData = $this->getFixtureData(); + $expectedData = $fixtureData['update']; + // Will change during storage + unset( $expectedData['path'] ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertTrue( + file_exists( $this->getInstallDir() . '/' . $this->getStorageDir() . '/' . $field->value->path ) + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertFieldDataLoadedCorrect( $field ); + + $this->assertEquals( + self::$loadedMediaPath, + $field->value->path + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + $fixture = $this->getFixtureData(); + // Defaults set by type + $fixture['create']['hasController'] = false; + $fixture['create']['autoplay'] = false; + $fixture['create']['loop'] = false; + $fixture['create']['width'] = 0; + $fixture['create']['height'] = 0; + return array( + array( + $this->getValidCreationFieldData(), + $fixture['create'], + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + $fixture = $this->getFixtureData(); + return array( + array( + $fixture['create'], + $this->getValidCreationFieldData() + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new MediaValue ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/RatingIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/RatingIntegrationTest.php new file mode 100644 index 0000000..6051be6 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/RatingIntegrationTest.php @@ -0,0 +1,317 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new RatingValue( false ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Rating\\Value', + $field->value + ); + + $expectedData = array( + 'isDisabled' => false, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + $value = new RatingValue( true ); + $value->isDisabled = 'foo'; + + return array( + array( + $value, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new RatingValue( true ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Rating\\Value', + $field->value + ); + + $expectedData = array( + 'isDisabled' => true, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Rating\\Value', + $field->value + ); + + $expectedData = array( + 'isDisabled' => false, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new RatingValue( false ), + 0, + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + 1, + new RatingValue( true ) + ), + ); + } + + /** + * Emptiness for rating doesn't make sense, field is always considered as non empty. + */ + public function testIsEmptyValue( $value = null ) + { + } + + public function providerForTestIsEmptyValue() + { + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( new RatingValue ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/RelationIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/RelationIntegrationTest.php new file mode 100644 index 0000000..e968abc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/RelationIntegrationTest.php @@ -0,0 +1,322 @@ + array( + 'type' => 'int', + 'default' => 0 + ), + 'selectionRoot' => array( + 'type' => 'string', + 'default' => '', + ) + ); + } + + /** + * @see eZ\Publish\API\Repository\Tests\FieldType\BaseIntegrationTest::getValidatorSchema() + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $fieldSettings value + * + * @todo Implement correctly + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( 'selectionMethod' => 0, 'selectionRoot' => '1' ); + } + + /** + * Get a valid $validatorConfiguration + * + * @todo Implement correctly + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @todo Implement correctly + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( 'selectionMethod' => 'a', 'selectionRoot' => true, 'unknownSetting' => false ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @todo Implement correctly + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( 'noValidator' => true ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new RelationValue( 4 ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Relation\\Value', + $field->value + ); + + $expectedData = array( + 'destinationContentId' => 4, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new RelationValue( array() ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new RelationValue( 49 ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Relation\\Value', + $field->value + ); + + $expectedData = array( + 'destinationContentId' => 49, + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Relation\\Value', + $field->value + ); + + $expectedData = array( + 'destinationContentId' => 4 + ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new RelationValue( 4 ), + array( + 'destinationContentId' => 4, + ) + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( 'destinationContentId' => 4 ), + new RelationValue( 4 ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new RelationValue ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/RelationListIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/RelationListIntegrationTest.php new file mode 100644 index 0000000..9dc43e7 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/RelationListIntegrationTest.php @@ -0,0 +1,332 @@ + array( + 'type' => 'int', + 'default' => RelationListType::SELECTION_BROWSE, + ), + 'selectionDefaultLocation' => array( + 'type' => 'string', + 'default' => null, + ), + 'selectionContentTypes' => array( + 'type' => 'array', + 'default' => array(), + ), + ); + } + + /** + * @see eZ\Publish\API\Repository\Tests\FieldType\BaseIntegrationTest::getValidatorSchema() + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $fieldSettings value + * + * @todo Implement correctly + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + 'selectionMethod' => 1, + 'selectionDefaultLocation' => '2', + 'selectionContentTypes' => array( 'blog_post' ), + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @todo Implement correctly + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @todo Implement correctly + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( 'selectionMethod' => 'a', 'selectionDefaultLocation' => true, 'unknownSetting' => false ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @todo Implement correctly + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( 'noValidator' => true ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new RelationListValue( array( 4 ) ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\RelationList\\Value', + $field->value + ); + + $expectedData = array( + 'destinationContentIds' => array( 4 ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new RelationListValue( array( null ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new RelationListValue( array( 49 ) ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\RelationList\\Value', + $field->value + ); + + $expectedData = array( + 'destinationContentIds' => array( 49 ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\RelationList\\Value', + $field->value + ); + + $expectedData = array( + 'destinationContentIds' => array( 4 ) + ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new RelationListValue( array( 4 ) ), + array( + 'destinationContentIds' => array( 4 ), + ) + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( 'destinationContentIds' => array( 4 ) ), + new RelationListValue( array( 4 ) ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new RelationListValue ), + array( new RelationListValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/SelectionIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/SelectionIntegrationTest.php new file mode 100644 index 0000000..29ee007 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/SelectionIntegrationTest.php @@ -0,0 +1,335 @@ + array( + 'type' => 'bool', + 'default' => false, + ), + 'options' => array( + 'type' => 'hash', + 'default' => array(), + ), + ); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + 'isMultiple' => true, + 'options' => array( + 0 => 'First', + 1 => 'Sindelfingen', + 2 => 'Bielefeld', + ) + ); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + 'isMultiple' => array(), + 'options' => new \stdClass(), + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new SelectionValue( array( 0, 2 ) ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Selection\\Value', + $field->value + ); + + $expectedData = array( + 'selection' => array( 0, 2 ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new SelectionValue( array( 3 ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new SelectionValue( array( 1 ) ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Selection\\Value', + $field->value + ); + + $expectedData = array( + 'selection' => array( 1 ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Selection\\Value', + $field->value + ); + + $expectedData = array( + 'selection' => array( 0, 2 ), + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new SelectionValue( array( 0, 2 ) ), + array( 0, 2 ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( 0, 2 ), + new SelectionValue( array( 0, 2 ) ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new SelectionValue ), + array( new SelectionValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( + new SelectionValue( array( 0 ) ) + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/TextBlockIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/TextBlockIntegrationTest.php new file mode 100644 index 0000000..233ecbc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/TextBlockIntegrationTest.php @@ -0,0 +1,323 @@ + array( + 'type' => 'int', + 'default' => 10, + ), + ); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + 'textRows' => 0, + ); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new TextBlockValue( 'Example' ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\TextBlock\\Value', + $field->value + ); + + $expectedData = array( + 'text' => 'Example', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new TextBlockValue( 'Example 2' ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\TextBlock\\Value', + $field->value + ); + + $expectedData = array( + 'text' => 'Example 2', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\TextBlock\\Value', + $field->value + ); + + $expectedData = array( + 'text' => 'Example', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new TextBlockValue( 'Simple value' ), + 'Simple value', + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + 'Foobar', + new TextBlockValue( 'Foobar' ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new TextBlockValue ), + array( new TextBlockValue( null ) ), + array( new TextBlockValue( "" ) ), + array( new TextBlockValue( "\n\n\n" ) ), + array( new TextBlockValue( "\r\r\r" ) ), + array( new TextBlockValue( " " ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( new TextBlockValue( 0 ) ), + array( new TextBlockValue( "0" ) ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/TextLineIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/TextLineIntegrationTest.php new file mode 100644 index 0000000..f51a4ab --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/TextLineIntegrationTest.php @@ -0,0 +1,339 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => array( + 'type' => 'int', + 'default' => null, + ), + 'maxStringLength' => array( + 'type' => 'int', + 'default' => null, + ), + ) + ); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => 1, + 'maxStringLength' => 42, + ) + ); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'StringLengthValidator' => array( + 'minStringLength' => new \stdClass(), + ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new TextLineValue( 'Example' ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\TextLine\\Value', + $field->value + ); + + $expectedData = array( + 'text' => 'Example', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + 42, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new TextLineValue( str_repeat( '.', 64 ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentFieldValidationException', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new TextLineValue( 'Example 2' ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\TextLine\\Value', + $field->value + ); + + $expectedData = array( + 'text' => 'Example 2', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\TextLine\\Value', + $field->value + ); + + $expectedData = array( + 'text' => 'Example', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new TextLineValue( 'Simple value' ), + 'Simple value', + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + 'Foobar', + new TextLineValue( 'Foobar' ) + ), + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new TextLineValue() ), + array( new TextLineValue( null ) ), + array( new TextLineValue( "" ) ), + array( new TextLineValue( " " ) ), + ); + } + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( new TextLineValue( 0 ) ), + array( new TextLineValue( "0" ) ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/UrlIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/UrlIntegrationTest.php new file mode 100644 index 0000000..695fdaa --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/UrlIntegrationTest.php @@ -0,0 +1,336 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + return new UrlValue( 'http://example.com', 'Example' ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Url\\Value', + $field->value + ); + + $expectedData = array( + 'link' => 'http://example.com', + 'text' => 'Example', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new UrlValue( 23 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + array( + new UrlValue( 'http://example.com', 23 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new UrlValue( 'http://example.com/2', 'Example 2' ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Url\\Value', + $field->value + ); + + $expectedData = array( + 'link' => 'http://example.com/2', + 'text' => 'Example 2', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\Url\\Value', + $field->value + ); + + $expectedData = array( + 'link' => 'http://example.com', + 'text' => 'Example', + ); + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new UrlValue( 'http://example.com' ), + array( + 'link' => 'http://example.com', + 'text' => null, + ) + ), + array( + new UrlValue( 'http://example.com', 'Link text' ), + array( + 'link' => 'http://example.com', + 'text' => 'Link text', + ) + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( 'link' => 'http://example.com/sindelfingen' ), + new UrlValue( 'http://example.com/sindelfingen' ) + ), + array( + array( 'link' => 'http://example.com/sindelfingen', 'text' => 'Foo' ), + new UrlValue( 'http://example.com/sindelfingen', 'Foo' ) + ) + ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new UrlValue ), + array( new UrlValue( null ) ), + array( new UrlValue( "" ) ), + array( new UrlValue( "", "" ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + array( + new UrlValue( 'http://example.com' ) + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/UserIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/UserIntegrationTest.php new file mode 100644 index 0000000..0052150 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/UserIntegrationTest.php @@ -0,0 +1,395 @@ + 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field externals data + * + * @return array + */ + public function getValidCreationFieldData() + { + return new UserValue( array( "login" => "hans" ) ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\Publish\Core\FieldType\User\Value', + $field->value + ); + + $expectedData = array( + 'hasStoredLogin' => true, + 'login' => 'hans', + 'email' => 'hans@example.com', + 'passwordHash' => '680869a9873105e365d39a6d14e68e46', + 'passwordHashType' => 2, + 'enabled' => true, + ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + + $this->assertNotNull( $field->value->contentId ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array(); + } + + public function testCreateContentFails( $failingValue = null, $expectedException = null ) + { + $this->markTestSkipped( "Values are ignored on creation." ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new UserValue( + array( + 'login' => 'change', // Change is intended to not get through + 'email' => 'change', // Change is intended to not get through + 'passwordHash' => 'change', // Change is intended to not get through + 'passwordHashType' => 'change', // Change is intended to not get through + 'enabled' => 'change', // Change is intended to not get through + ) + ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + // No update possible through field type + $this->assertFieldDataLoadedCorrect( $field ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return array( + array( + null, + 'eZ\\Publish\\Core\\Base\\Exceptions\\ContentValidationException' + ), + // @todo: Define more failure cases ... + ); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()}; + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\Publish\Core\FieldType\User\Value', + $field->value + ); + + $expectedData = array( + 'hasStoredLogin' => false, + 'contentId' => null, + 'login' => null, + 'email' => null, + 'passwordHash' => null, + 'passwordHashType' => null, + 'enabled' => false, + 'maxLogin' => null, + ); + + $this->assertPropertiesCorrect( + $expectedData, + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + return array( + array( + new UserValue( array( 'login' => 'hans' ) ), + array( + 'login' => 'hans', + 'hasStoredLogin' => null, + 'contentId' => null, + 'email' => null, + 'passwordHash' => null, + 'passwordHashType' => null, + 'enabled' => null, + 'maxLogin' => null, + ), + ), + ); + } + + /** + * Get hashes and their respective converted values + * + * This is a PHPUnit data provider + * + * The returned records must have the the input hash assigned to the + * first index and the expected value result to the second. For example: + * + * + * array( + * array( + * array( 'myValue' => true ), + * new MyValue( true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( 'login' => 'hans' ), + new UserValue( array( 'login' => 'hans' ) ), + ), + ); + } + + /** + * Overwrite normal content creation + * + * @param mixed $fieldData + * + * @return void + */ + protected function createContent( $fieldData, $contentType = null ) + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + 'hans', + 'hans@example.com', + 'password', + 'eng-US' + ); + $userCreate->enabled = true; + + // Set some fields required by the user ContentType + $userCreate->setField( 'first_name', 'Example' ); + $userCreate->setField( 'last_name', 'User' ); + + // ID of the "Editors" user group in an eZ Publish demo installation + $group = $userService->loadUserGroup( 13 ); + + // Create a new user instance. + $user = $userService->createUser( $userCreate, array( $group ) ); + + // Create draft from user content object + $contentService = $repository->getContentService(); + return $contentService->createContentDraft( $user->content->contentInfo, $user->content->versionInfo ); + } + + public function providerForTestIsEmptyValue() + { + return array( + array( new UserValue ), + array( new UserValue( array() ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + return array( + array( + $this->getValidCreationFieldData() + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/XmlTextIntegrationTest.php b/eZ/Publish/API/Repository/Tests/FieldType/XmlTextIntegrationTest.php new file mode 100644 index 0000000..cf5a62e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldType/XmlTextIntegrationTest.php @@ -0,0 +1,405 @@ +createdDOMValue = new DOMDocument; + $this->createdDOMValue->loadXML( +<< +
+Example +
+EOT + ); + + $this->updatedDOMValue = new DOMDocument; + $this->updatedDOMValue->loadXML( +<< +
+Example 2 +
+EOT + ); + } + + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezxmltext'; + } + + /** + * Get expected settings schema + * + * @return array + */ + public function getSettingsSchema() + { + return array( + 'numRows' => array( + 'type' => 'int', + 'default' => 10, + ), + 'tagPreset' => array( + 'type' => 'choice', + 'default' => XmlTextType::TAG_PRESET_DEFAULT, + ) + ); + } + + /** + * Get a valid $fieldSettings value + * + * @return mixed + */ + public function getValidFieldSettings() + { + return array( + 'numRows' => 0, + 'tagPreset' => XmlTextType::TAG_PRESET_DEFAULT, + ); + } + + /** + * Get $fieldSettings value not accepted by the field type + * + * @return mixed + */ + public function getInvalidFieldSettings() + { + return array( + 'somethingUnknown' => 0, + ); + } + + /** + * Get expected validator schema + * + * @return array + */ + public function getValidatorSchema() + { + return array(); + } + + /** + * Get a valid $validatorConfiguration + * + * @return mixed + */ + public function getValidValidatorConfiguration() + { + return array(); + } + + /** + * Get $validatorConfiguration not accepted by the field type + * + * @return mixed + */ + public function getInvalidValidatorConfiguration() + { + return array( + 'unknown' => array( 'value' => 23 ) + ); + } + + /** + * Get initial field data for valid object creation + * + * @return mixed + */ + public function getValidCreationFieldData() + { + $doc = new DOMDocument; + $doc->loadXML( +<< +
+Example +
+EOT + ); + return new XmlTextValue( $doc ); + } + + /** + * Asserts that the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was stored and loaded correctly. + * + * @param Field $field + * + * @return void + */ + public function assertFieldDataLoadedCorrect( Field $field) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\XmlText\\Value', + $field->value + ); + + $this->assertPropertiesCorrect( + array( + 'xml' => $this->createdDOMValue + ), + $field->value + ); + } + + /** + * Get field data which will result in errors during creation + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidCreationFieldData() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentType', + ), + ); + } + + /** + * Get update field externals data + * + * @return array + */ + public function getValidUpdateFieldData() + { + return new XmlTextValue( $this->updatedDOMValue ); + } + + /** + * Get externals updated field data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function assertUpdatedFieldDataLoadedCorrect( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\XmlText\\Value', + $field->value + ); + + $this->assertPropertiesCorrect( + array( + 'xml' => $this->updatedDOMValue + ), + $field->value + ); + } + + /** + * Get field data which will result in errors during update + * + * This is a PHPUnit data provider. + * + * The returned records must contain of an error producing data value and + * the expected exception class (from the API or SPI, not implementation + * specific!) as the second element. For example: + * + * + * array( + * array( + * new DoomedValue( true ), + * 'eZ\\Publish\\API\\Repository\\Exceptions\\ContentValidationException' + * ), + * // ... + * ); + * + * + * @return array[] + */ + public function provideInvalidUpdateFieldData() + { + return $this->provideInvalidCreationFieldData(); + } + + /** + * Asserts the the field data was loaded correctly. + * + * Asserts that the data provided by {@link getValidCreationFieldData()} + * was copied and loaded correctly. + * + * @param Field $field + */ + public function assertCopiedFieldDataLoadedCorrectly( Field $field ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\XmlText\\Value', + $field->value + ); + + $this->assertPropertiesCorrect( + array( + 'xml' => $this->createdDOMValue + ), + $field->value + ); + } + + /** + * Get data to test to hash method + * + * This is a PHPUnit data provider + * + * The returned records must have the the original value assigned to the + * first index and the expected hash result to the second. For example: + * + * + * array( + * array( + * new MyValue( true ), + * array( 'myValue' => true ), + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideToHashData() + { + $xml = new DOMDocument; + $xml->loadXML( +<< +
+Example +
+EOT + ); + return array( + array( + new XmlTextValue( $xml ), + array( 'xml' => $xml->saveXML() ), + ), + ); + } + + /** + * Get expectations for the fromHash call on our field value + * + * This is a PHPUnit data provider + * + * @return array + */ + public function provideFromHashData() + { + return array( + array( + array( + 'xml' => ' +
+Foobar +
+' + ) + ) + ); + } + + /** + * @dataProvider provideFromHashData + * @todo: Requires correct registered FieldTypeService, needs to be + * maintained! + */ + public function testFromHash( $hash, $expectedValue = null ) + { + $xmlTextValue = $this + ->getRepository() + ->getFieldTypeService() + ->getFieldType( $this->getTypeName() ) + ->fromHash( $hash ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\XmlText\\Value', + $xmlTextValue + ); + $this->assertInstanceOf( 'DOMDocument', $xmlTextValue->xml ); + + $this->assertEquals( $hash['xml'], (string)$xmlTextValue ); + } + + public function providerForTestIsEmptyValue() + { + $doc = new DOMDocument; + $doc->loadXML( "
" ); + + return array( + array( new XmlTextValue ), + array( new XmlTextValue( $doc ) ), + ); + } + + public function providerForTestIsNotEmptyValue() + { + $doc = new DOMDocument; + $doc->loadXML( "
" ); + $doc2 = new DOMDocument; + $doc2->loadXML( "
" ); + return array( + array( + $this->getValidCreationFieldData() + ), + array( new XmlTextValue( $doc ) ), + array( new XmlTextValue( $doc2 ) ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/FieldType/_fixtures/image.jpg b/eZ/Publish/API/Repository/Tests/FieldType/_fixtures/image.jpg new file mode 100644 index 0000000..0ddd840 Binary files /dev/null and b/eZ/Publish/API/Repository/Tests/FieldType/_fixtures/image.jpg differ diff --git a/eZ/Publish/API/Repository/Tests/FieldType/_fixtures/image.png b/eZ/Publish/API/Repository/Tests/FieldType/_fixtures/image.png new file mode 100644 index 0000000..159ab77 Binary files /dev/null and b/eZ/Publish/API/Repository/Tests/FieldType/_fixtures/image.png differ diff --git a/eZ/Publish/API/Repository/Tests/FieldTypeServiceTest.php b/eZ/Publish/API/Repository/Tests/FieldTypeServiceTest.php new file mode 100644 index 0000000..2b50183 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/FieldTypeServiceTest.php @@ -0,0 +1,140 @@ +getRepository(); + + /* BEGIN: Use Case */ + $fieldTypeService = $repository->getFieldTypeService(); + + // Contains the list of all registered field types + $fieldTypes = $fieldTypeService->getFieldTypes(); + /* END: Use Case */ + + // Require at least 1 field type + $this->assertNotEquals( 0, count( $fieldTypes ) ); + + foreach ( $fieldTypes as $fieldType ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\FieldType', + $fieldType + ); + } + } + + /** + * Test for the getFieldType() method. + * + * Expects FieldType "ezurl" to be available! + * + * @see \eZ\Publish\API\Repository\FieldTypeService::getFieldType() + * + * @return void + */ + public function testGetFieldType() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $fieldTypeService = $repository->getFieldTypeService(); + + // Contains the "ezurl" FieldType + $fieldType = $fieldTypeService->getFieldType( 'ezurl' ); + /* END: Use Case */ + + $this->assertInstanceof( + 'eZ\\Publish\\API\\Repository\\FieldType', + $fieldType + ); + $this->assertEquals( + 'ezurl', + $fieldType->getFieldTypeIdentifier() + ); + } + + /** + * Test for the getFieldType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\FieldTypeService::getFieldType() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testGetFieldTypeThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $fieldTypeService = $repository->getFieldTypeService(); + + // Throws and exception since type does not exist + $fieldType = $fieldTypeService->getFieldType( 'sindelfingen' ); + /* END: Use Case */ + } + + /** + * Test for the hasFieldType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\FieldTypeService::hasFieldType() + * + */ + public function testHasFieldTypeReturnsTrue() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $fieldTypeService = $repository->getFieldTypeService(); + + // Returns true, since 'ezurl' type exists + $typeExists = $fieldTypeService->hasFieldType( 'ezurl' ); + /* END: Use Case */ + + $this->assertTrue( $typeExists ); + } + + /** + * Test for the hasFieldType() method. + * + * @return void + * @see \eZ\Publish\API\Repository\FieldTypeService::hasFieldType() + * + */ + public function testHasFieldTypeReturnsFalse() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $fieldTypeService = $repository->getFieldTypeService(); + + // Returns false, since type does not exist + $typeExists = $fieldTypeService->hasFieldType( 'sindelfingen' ); + /* END: Use Case */ + + $this->assertFalse( $typeExists ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/IdManager.php b/eZ/Publish/API/Repository/Tests/IdManager.php new file mode 100644 index 0000000..f0c8123 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/IdManager.php @@ -0,0 +1,42 @@ +getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English (New Zealand)'; + $languageCreate->languageCode = 'eng-NZ'; + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $languageService->createLanguage( $languageCreate ); + /* END: Use Case */ + } + + /** + * Test for the updateLanguageName() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::updateLanguageName() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testUpdateLanguageName + */ + public function testUpdateLanguageNameThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = false; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $languageId = $languageService->createLanguage( $languageCreate )->id; + + $language = $languageService->loadLanguageById( $languageId ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $languageService->updateLanguageName( $language, 'New language name.' ); + /* END: Use Case */ + } + + /** + * Test for the enableLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::enableLanguage() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testEnableLanguage + */ + public function testEnableLanguageThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = false; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreate ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $languageService->enableLanguage( $language ); + /* END: Use Case */ + } + + /** + * Test for the disableLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::disableLanguage() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testDisableLanguage + */ + public function testDisableLanguageThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreate ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $languageService->disableLanguage( $language ); + /* END: Use Case */ + } + + /** + * Test for the deleteLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::deleteLanguage() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testDeleteLanguage + */ + public function testDeleteLanguageThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $languageService = $repository->getContentLanguageService(); + + $languageCreateEnglish = $languageService->newLanguageCreateStruct(); + $languageCreateEnglish->enabled = false; + $languageCreateEnglish->name = 'English'; + $languageCreateEnglish->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreateEnglish ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $languageService->deleteLanguage( $language ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/LanguageServiceTest.php b/eZ/Publish/API/Repository/Tests/LanguageServiceTest.php new file mode 100644 index 0000000..d3e9425 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/LanguageServiceTest.php @@ -0,0 +1,702 @@ +getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct', + $languageCreate + ); + } + + /** + * Test for the createLanguage() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + * @see \eZ\Publish\API\Repository\LanguageService::createLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testNewLanguageCreateStruct + */ + public function testCreateLanguage() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English (New Zealand)'; + $languageCreate->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreate ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Language', + $language + ); + + return $language; + } + + /** + * Test for the createLanguage() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::createLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testCreateLanguageSetsIdPropertyOnReturnedLanguage( $language ) + { + $this->assertNotNull( $language->id ); + } + + /** + * Test for the createLanguage() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::createLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testCreateLanguageSetsExpectedProperties( $language ) + { + $this->assertEquals( + array( + true, + 'English (New Zealand)', + 'eng-NZ' + ), + array( + $language->enabled, + $language->name, + $language->languageCode + ) + ); + } + + /** + * Test for the createLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::createLanguage() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testCreateLanguageThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'Norwegian'; + $languageCreate->languageCode = 'nor-NO'; + + $languageService->createLanguage( $languageCreate ); + + // This call should fail with an InvalidArgumentException, because + // the language code "nor-NO" already exists. + $languageService->createLanguage( $languageCreate ); + /* END: Use Case */ + } + + /** + * Test for the loadLanguageById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::loadLanguageById() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testLoadLanguageById() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = false; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $languageId = $languageService->createLanguage( $languageCreate )->id; + + $language = $languageService->loadLanguageById( $languageId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Language', + $language + ); + } + + /** + * Test for the loadLanguageById() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::loadLanguageById() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testLoadLanguageById + */ + public function testLoadLanguageByIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentLanguageId = $this->generateId( 'language', 2342 ); + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // This call should fail with a "NotFoundException" + $languageService->loadLanguageById( $nonExistentLanguageId ); + /* END: Use Case */ + } + + /** + * Test for the updateLanguageName() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::updateLanguageName() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testLoadLanguageById + */ + public function testUpdateLanguageName() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = false; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $languageId = $languageService->createLanguage( $languageCreate )->id; + + $language = $languageService->loadLanguageById( $languageId ); + + $updatedLanguage = $languageService->updateLanguageName( + $language, + 'New language name.' + ); + /* END: Use Case */ + + // Verify that the service returns an updated language instance. + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Language', + $updatedLanguage + ); + + // Verify that the service also persists the changes + $updatedLanguage = $languageService->loadLanguageById( $languageId ); + + $this->assertEquals( 'New language name.', $updatedLanguage->name ); + } + + /** + * Test for the enableLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::enableLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testLoadLanguageById + */ + public function testEnableLanguage() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = false; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreate ); + + // Now lets enable the newly created language + $languageService->enableLanguage( $language ); + + $enabledLanguage = $languageService->loadLanguageById( $language->id ); + /* END: Use Case */ + + $this->assertTrue( $enabledLanguage->enabled ); + } + + /** + * Test for the disableLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::disableLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testLoadLanguageById + */ + public function testDisableLanguage() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreate ); + + // Now lets disable the newly created language + $languageService->disableLanguage( $language ); + + $enabledLanguage = $languageService->loadLanguageById( $language->id ); + /* END: Use Case */ + + $this->assertFalse( $enabledLanguage->enabled ); + } + + /** + * Test for the loadLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::loadLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testLoadLanguage() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-NZ'; + + $languageId = $languageService->createLanguage( $languageCreate )->id; + + // Now load the newly created language by it's language code + $language = $languageService->loadLanguage( 'eng-NZ' ); + /* END: Use Case */ + + $this->assertEquals( $languageId, $language->id ); + } + + /** + * Test for the loadLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::loadLanguage() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testLoadLanguage + */ + public function testLoadLanguageThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // This call should fail with an exception + $languageService->loadLanguage( 'fre-FR' ); + /* END: Use Case */ + } + + /** + * Test for the loadLanguages() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::loadLanguages() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + * @todo Enhance to check for language codes and properties? + */ + public function testLoadLanguages() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // Create some languages + $languageCreateEnglish = $languageService->newLanguageCreateStruct(); + $languageCreateEnglish->enabled = false; + $languageCreateEnglish->name = 'English'; + $languageCreateEnglish->languageCode = 'eng-NZ'; + + $languageCreateFrench = $languageService->newLanguageCreateStruct(); + $languageCreateFrench->enabled = false; + $languageCreateFrench->name = 'French'; + $languageCreateFrench->languageCode = 'fre-FR'; + + $languageService->createLanguage( $languageCreateEnglish ); + $languageService->createLanguage( $languageCreateFrench ); + + $languages = $languageService->loadLanguages(); + foreach ( $languages as $language ) + { + // Operate on each language + } + /* END: Use Case */ + + // eng-US, eng-GB, ger-DE + 2 newly created + $this->assertEquals( 5, count( $languages ) ); + } + + /** + * Test for the loadLanguages() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::loadLanguages() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function loadLanguagesReturnsAnEmptyArrayByDefault() + { + $repository = $this->getRepository(); + + $languageService = $repository->getContentLanguageService(); + + $this->assertSame( array(), $languageService->loadLanguages() ); + } + + /** + * Test for the deleteLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::deleteLanguage() + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testLoadLanguages + */ + public function testDeleteLanguage() + { + $repository = $this->getRepository(); + $languageService = $repository->getContentLanguageService(); + + $beforeCount = count( $languageService->loadLanguages() ); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + $languageCreateEnglish = $languageService->newLanguageCreateStruct(); + $languageCreateEnglish->enabled = false; + $languageCreateEnglish->name = 'English'; + $languageCreateEnglish->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreateEnglish ); + + // Delete the newly created language + $languageService->deleteLanguage( $language ); + /* END: Use Case */ + + // +1 -1 + $this->assertEquals( $beforeCount, count( $languageService->loadLanguages() ) ); + } + + /** + * Test for the deleteLanguage() method. + * + * NOTE: This test has a dependency against several methods in the content + * service, but because there is no topological sort for test dependencies + * we cannot declare them here. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::deleteLanguage() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testDeleteLanguage + * @depend(s) eZ\Publish\API\Repository\Tests\ContentServiceTest::testPublishVersion + */ + public function testDeleteLanguageThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $editorsGroupId is the ID of the "Editors" user group in an eZ + // Publish demo installation + + $languageService = $repository->getContentLanguageService(); + + $languageCreateEnglish = $languageService->newLanguageCreateStruct(); + $languageCreateEnglish->enabled = true; + $languageCreateEnglish->name = 'English'; + $languageCreateEnglish->languageCode = 'eng-NZ'; + + $language = $languageService->createLanguage( $languageCreateEnglish ); + + $contentService = $repository->getContentService(); + + // Get metadata update struct and set new language as main language. + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->mainLanguageCode = 'eng-NZ'; + + // Update content object + $contentService->updateContentMetadata( + $contentService->loadContentInfo( $editorsGroupId ), + $metadataUpdate + ); + + // This call will fail with an "InvalidArgumentException", because the + // new language is used by a content object. + $languageService->deleteLanguage( $language ); + /* END: Use Case */ + } + + /** + * Test for the getDefaultLanguageCode() method. + * + * @see \eZ\Publish\API\Repository\LanguageService::getDefaultLanguageCode() + * + * @return void + */ + public function testGetDefaultLanguageCode() + { + $repository = $this->getRepository(); + $languageService = $repository->getContentLanguageService(); + + $this->assertRegExp( + '(^[a-z]{3}\-[A-Z]{2}$)', + $languageService->getDefaultLanguageCode() + ); + } + + /** + * Helper method that creates a new language test fixture in the + * API implementation under test. + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + private function createLanguage() + { + $repository = $this->getRepository(); + + $languageService = $repository->getContentLanguageService(); + $languageCreate = $languageService->newLanguageCreateStruct(); + + $languageCreate->enabled = false; + $languageCreate->name = 'English'; + $languageCreate->languageCode = 'eng-US'; + + return $languageService->createLanguage( $languageCreate ); + } + + /** + * Test for the createLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::createLanguage() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testCreateLanguageInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Get create struct and set properties + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English (New Zealand)'; + $languageCreate->languageCode = 'eng-NZ'; + + // Create new language + $languageService->createLanguage( $languageCreate ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $languageService->loadLanguage( 'eng-NZ' ); + } + catch ( NotFoundException $e ) + { + // Expected execution path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Can still load language after rollback' ); + } + + /** + * Test for the createLanguage() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::createLanguage() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testCreateLanguage + */ + public function testCreateLanguageInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Get create struct and set properties + $languageCreate = $languageService->newLanguageCreateStruct(); + $languageCreate->enabled = true; + $languageCreate->name = 'English (New Zealand)'; + $languageCreate->languageCode = 'eng-NZ'; + + // Create new language + $languageService->createLanguage( $languageCreate ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load new language + $language = $languageService->loadLanguage( 'eng-NZ' ); + /* END: Use Case */ + + $this->assertEquals( 'eng-NZ', $language->languageCode ); + } + + /** + * Test for the updateLanguageName() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::updateLanguageName() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testUpdateLanguageName + */ + public function testUpdateLanguageNameInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Load an existing language + $language = $languageService->loadLanguage( 'eng-US' ); + + // Update the language name + $languageService->updateLanguageName( $language, 'My English' ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // Load updated version, name will still be "English (American)" + $updatedLanguage = $languageService->loadLanguage( 'eng-US' ); + /* END: Use Case */ + + $this->assertEquals( 'English (American)', $updatedLanguage->name ); + } + + /** + * Test for the updateLanguageName() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LanguageService::updateLanguageName() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\LanguageServiceTest::testUpdateLanguageName + */ + public function testUpdateLanguageNameInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $languageService = $repository->getContentLanguageService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Load an existing language + $language = $languageService->loadLanguage( 'eng-US' ); + + // Update the language name + $languageService->updateLanguageName( $language, 'My English' ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load updated version, name will be "My English" + $updatedLanguage = $languageService->loadLanguage( 'eng-US' ); + /* END: Use Case */ + + $this->assertEquals( 'My English', $updatedLanguage->name ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php new file mode 100644 index 0000000..853e92f --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php @@ -0,0 +1,373 @@ +getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + $user = $this->createUserVersion1(); + + // ContentInfo for "Editors" user group + $contentInfo = $contentService->loadContentInfo( $editorsGroupId ); + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + $locationCreate = $locationService->newLocationCreateStruct( 1 ); + $locationCreate->priority = 23; + $locationCreate->hidden = true; + $locationCreate->remoteId = 'sindelfingen'; + $locationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $locationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // This call will fail with an "UnauthorizedException" + $locationService->createLocation( + $contentInfo, + $locationCreate + ); + /* END: Use Case */ + } + + /** + * Test for the loadLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testLoadLocationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $locationService = $repository->getLocationService(); + + $user = $this->createUserVersion1(); + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->loadLocation( $editorsGroupId ); + /* END: Use Case */ + } + + /** + * Test for the loadLocationByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationByRemoteId() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationByRemoteId + */ + public function testLoadLocationByRemoteIdThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + // remoteId of the "Editors" location in an eZ Publish demo installation + $editorsRemoteId = 'f7dda2854fc68f7c8455d9cb14bd04a9'; + + $locationService = $repository->getLocationService(); + + $user = $this->createUserVersion1(); + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->loadLocationByRemoteId( $editorsRemoteId ); + /* END: Use Case */ + } + + /** + * Test for the updateLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::updateLocation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testUpdateLocation + */ + public function testUpdateLocationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $locationService = $repository->getLocationService(); + + $originalLocation = $locationService->loadLocation( $editorsGroupId ); + + $locationUpdateStruct = $locationService->newLocationUpdateStruct(); + $locationUpdateStruct->priority = 3; + $locationUpdateStruct->remoteId = 'c7adcbf1e96bc29bca28c2d809d0c7ef69272651'; + $locationUpdateStruct->sortField = Location::SORT_FIELD_PRIORITY; + $locationUpdateStruct->sortOrder = Location::SORT_ORDER_DESC; + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->updateLocation( + $originalLocation, + $locationUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the swapLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::swapLocation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testSwapLocation + */ + public function testSwapLocationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" Location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" Location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + $mediaLocation = $locationService->loadLocation( $mediaLocationId ); + $demoDesignLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Swaps the content referred to by the locations + $locationService->swapLocation( $mediaLocation, $demoDesignLocation ); + + $user = $this->createMediaUserVersion1(); + + // Set media editor as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->swapLocation( $mediaLocation, $demoDesignLocation ); + /* END: Use Case */ + } + + /** + * Test for the hideLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::hideLocation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testHideLocation + */ + public function testHideLocationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $locationService = $repository->getLocationService(); + + $visibleLocation = $locationService->loadLocation( $editorsGroupId ); + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->hideLocation( $visibleLocation ); + /* END: Use Case */ + } + + /** + * Test for the unhideLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::unhideLocation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testUnhideLocation + */ + public function testUnhideLocationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $locationService = $repository->getLocationService(); + + $visibleLocation = $locationService->loadLocation( $editorsGroupId ); + + // Hide location + $hiddenLocation = $locationService->hideLocation( $visibleLocation ); + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->unhideLocation( $hiddenLocation ); + /* END: Use Case */ + } + + /** + * Test for the deleteLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::deleteLocation() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testDeleteLocation + */ + public function testDeleteLocationThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $editorsGroupId ); + + // Set current user to newly created user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->deleteLocation( $location ); + /* END: Use Case */ + } + + /** + * Test for the copySubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::copySubtree() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCopySubtree + */ + public function testCopySubtreeThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // $mediaLocationId is the ID of the "Media" Location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" Location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to copy + $locationToCopy = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Set media editor as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->copySubtree( + $locationToCopy, + $newParentLocation + ); + /* END: Use Case */ + } + + /** + * Test for the moveSubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::moveSubtree() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testMoveSubtree + */ + public function testMoveSubtreeThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + $user = $this->createMediaUserVersion1(); + + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to move + $locationToMove = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Set media editor as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $locationService->moveSubtree( + $locationToMove, + $newParentLocation + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/LocationServiceTest.php b/eZ/Publish/API/Repository/Tests/LocationServiceTest.php new file mode 100644 index 0000000..5786602 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/LocationServiceTest.php @@ -0,0 +1,1817 @@ +getRepository(); + + $parentLocationId = $this->generateId( 'location', 1 ); + /* BEGIN: Use Case */ + // $parentLocationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $locationCreate = $locationService->newLocationCreateStruct( + $parentLocationId + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\LocationCreateStruct', + $locationCreate + ); + + return $locationCreate; + } + + /** + * Test for the newLocationCreateStruct() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $locationCreate + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::newLocationCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + */ + public function testNewLocationCreateStructValues( LocationCreateStruct $locationCreate ) + { + $this->assertPropertiesCorrect( + array( + 'priority' => 0, + 'hidden' => false, + // remoteId should be initialized with a default value + //'remoteId' => null, + 'sortField' => Location::SORT_FIELD_NAME, + 'sortOrder' => Location::SORT_ORDER_ASC, + 'parentLocationId' => $this->generateId( 'location', 1 ), + ), + $locationCreate + ); + } + + /** + * Test for the createLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::createLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + */ + public function testCreateLocation() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 41 ); + $parentLocationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $contentId is the ID of an existing content object + // $parentLocationId is the ID of an existing location + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // ContentInfo for "How to use eZ Publish" + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + $locationCreate->priority = 23; + $locationCreate->hidden = true; + $locationCreate->remoteId = 'sindelfingen'; + $locationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $locationCreate->sortOrder = Location::SORT_ORDER_DESC; + + $location = $locationService->createLocation( + $contentInfo, + $locationCreate + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $location + ); + + return array( + 'locationCreate' => $locationCreate, + 'createdLocation' => $location, + 'contentInfo' => $contentInfo, + 'parentLocation' => $locationService->loadLocation( $this->generateId( 'location', 5 ) ), + ); + } + + /** + * Test for the createLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::createLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + */ + public function testCreateLocationStructValues( array $data ) + { + $locationCreate = $data['locationCreate']; + $createdLocation = $data['createdLocation']; + $contentInfo = $data['contentInfo']; + + $this->assertPropertiesCorrect( + array( + 'priority' => $locationCreate->priority, + 'hidden' => $locationCreate->hidden, + 'invisible' => $locationCreate->hidden, + 'remoteId' => $locationCreate->remoteId, + 'contentInfo' => $contentInfo, + 'parentLocationId' => $locationCreate->parentLocationId, + 'pathString' => '/1/5/' . $this->parseId( 'location', $createdLocation->id ) . '/', + 'depth' => 2, + 'sortField' => $locationCreate->sortField, + 'sortOrder' => $locationCreate->sortOrder, + ), + $createdLocation + ); + + $this->assertNotNull( $createdLocation->id ); + } + + /** + * Test for the createLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::createLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateLocationThrowsInvalidArgumentExceptionContentAlreadyBelowParent() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 11 ); + $parentLocationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $contentId is the ID of an existing content object + // $parentLocationId is the ID of an existing location which already + // has the content assigned to one of its descendant locations + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // ContentInfo for "How to use eZ Publish" + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + // Throws exception, since content is already located at "/1/2/107/110/" + $locationService->createLocation( + $contentInfo, + $locationCreate + ); + /* END: Use Case */ + } + + /** + * Test for the createLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::createLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateLocationThrowsInvalidArgumentExceptionParentIsSubLocationOfContent() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 4 ); + $parentLocationId = $this->generateId( 'location', 12 ); + /* BEGIN: Use Case */ + // $contentId is the ID of an existing content object + // $parentLocationId is the ID of an existing location which is below a + // location that is assigned to the content + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // ContentInfo for "How to use eZ Publish" + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + // Throws exception, since content is already located at "/1/2/" + $locationService->createLocation( + $contentInfo, + $locationCreate + ); + /* END: Use Case */ + } + + /** + * Test for the createLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::createLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testNewLocationCreateStruct + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateLocationThrowsInvalidArgumentExceptionRemoteIdExists() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 41 ); + $parentLocationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $contentId is the ID of an existing content object + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // ContentInfo for "How to use eZ Publish" + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + // This remote ID already exists + $locationCreate->remoteId = 'f3e90596361e31d496d4026eb624c983'; + + // Throws exception, since remote ID is already in use + $locationService->createLocation( + $contentInfo, + $locationCreate + ); + /* END: Use Case */ + } + + /** + * Test for the createLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::createLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + */ + public function testCreateLocationInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 41 ); + $parentLocationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $contentId is the ID of an existing content object + // $parentLocationId is the ID of an existing location + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + $repository->beginTransaction(); + + try + { + // ContentInfo for "How to use eZ Publish" + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + $locationCreate->remoteId = 'sindelfingen'; + + $createdLocationId = $locationService->createLocation( + $contentInfo, + $locationCreate + )->id; + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + $repository->rollback(); + + try + { + // Throws exception since creation of location was rolled back + $location = $locationService->loadLocation( $createdLocationId ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Objects still exists after rollback.' ); + } + + /** + * Test for the loadLocation() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + * @see \eZ\Publish\API\Repository\LocationService::loadLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + */ + public function testLoadLocation() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $location + ); + return $location; + } + + /** + * Test for the loadLocation() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testLoadLocationStructValues( Location $location ) + { + $this->assertPropertiesCorrect( + array( + 'id' => $this->generateId( 'location', 5 ), + 'priority' => 0, + 'hidden' => false, + 'invisible' => false, + 'remoteId' => '3f6d92f8044aed134f32153517850f5a', + 'parentLocationId' => $this->generateId( 'location', 1 ), + 'pathString' => '/1/5/', + 'depth' => 1, + 'sortField' => 1, + 'sortOrder' => 1, + ), + $location + ); + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\ContentInfo', + $location->contentInfo + ); + $this->assertEquals( + $this->generateId( 'object', 4 ), $location->contentInfo->id + ); + } + + /** + * Test for the loadLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadLocationThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentLocationId = $this->generateId( 'location', 2342 ); + /* BEGIN: Use Case */ + $locationService = $repository->getLocationService(); + + // Throws exception, if Location with $nonExistentLocationId does not + // exist + $location = $locationService->loadLocation( $nonExistentLocationId ); + /* END: Use Case */ + } + + /** + * Test for the loadLocationByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testLoadLocationByRemoteId() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocationByRemoteId( + '3f6d92f8044aed134f32153517850f5a' + ); + /* END: Use Case */ + + $this->assertEquals( + $locationService->loadLocation( $this->generateId( 'location', 5 ) ), + $location + ); + } + + /** + * Test for the loadLocationByRemoteId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationByRemoteId() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadLocationByRemoteIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $locationService = $repository->getLocationService(); + + // Throws exception, since Location with remote ID does not exist + $location = $locationService->loadLocationByRemoteId( + 'not-exists' + ); + /* END: Use Case */ + } + + /** + * Test for the loadLocations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocations() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCreateLocation + */ + public function testLoadLocations() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'object', 4 ); + /* BEGIN: Use Case */ + // $contentId contains the ID of an existing content object + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $locations = $locationService->loadLocations( $contentInfo ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', $locations + ); + return $locations; + } + + /** + * Test for the loadLocations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocations() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocations + */ + public function testLoadLocationsContent( array $locations ) + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $this->assertEquals( 1, count( $locations ) ); + foreach ( $locations as $loadedLocation ) + { + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $loadedLocation + ); + } + + usort( + $locations, + function ( $a, $b ) + { + strcmp( $a->id, $b->id ); + } + ); + + $this->assertEquals( + array( $this->generateId( 'location', 5 ) ), + array_map( + function ( Location $location ) + { + return $location->id; + }, + $locations + ) + ); + } + + /** + * Test for the loadLocations() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] + * @see \eZ\Publish\API\Repository\LocationService::loadLocations($contentInfo, $rootLocation) + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocations + */ + public function testLoadLocationsLimitedSubtree() + { + $repository = $this->getRepository(); + + $originalLocationId = $this->generateId( 'location', 54 ); + $originalParentLocationId = $this->generateId( 'location', 48 ); + $newParentLocationId = $this->generateId( 'location', 43 ); + /* BEGIN: Use Case */ + // $originalLocationId is the ID of an existing location + // $originalParentLocationId is the ID of the parent location of + // $originalLocationId + // $newParentLocationId is the ID of an existing location outside the tree + // of $originalLocationId and $originalParentLocationId + $locationService = $repository->getLocationService(); + + // Location at "/1/48/54" + $originalLocation = $locationService->loadLocation( $originalLocationId ); + + // Create location under "/1/43/" + $locationCreate = $locationService->newLocationCreateStruct( $newParentLocationId ); + $locationService->createLocation( + $originalLocation->contentInfo, + $locationCreate + ); + + $findRootLocation = $locationService->loadLocation( $originalParentLocationId ); + + // Returns an array with only $originalLocation + $locations = $locationService->loadLocations( + $originalLocation->contentInfo, + $findRootLocation + ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', $locations + ); + return $locations; + } + + /** + * Test for the loadLocations() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location[] $locations + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocations() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationsLimitedSubtree + */ + public function testLoadLocationsLimitedSubtreeContent( array $locations ) + { + $this->assertEquals( 1, count( $locations ) ); + + $this->assertEquals( + $this->generateId( 'location', 54 ), + reset( $locations )->id + ); + } + + /** + * Test for the loadLocations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocations() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocations + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testLoadLocationsThrowsBadStateException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // Create new content, which is not published + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $contentCreate = $contentService->newContentCreateStruct( + $folderType, 'eng-US' + ); + $contentCreate->setField( 'name', 'New Folder' ); + $content = $contentService->createContent( $contentCreate ); + + // Throws Exception, since $content has no published version, yet + $locationService->loadLocations( + $content->contentInfo + ); + /* END: Use Case */ + } + + /** + * Test for the loadLocations() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocations($contentInfo, $rootLocation) + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocations + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testLoadLocationsThrowsBadStateExceptionLimitedSubtree() + { + $repository = $this->getRepository(); + + $someLocationId = $this->generateId( 'location', 2 ); + /* BEGIN: Use Case */ + // $someLocationId is the ID of an existing location + $contentTypeService = $repository->getContentTypeService(); + $contentService = $repository->getContentService(); + $locationService = $repository->getLocationService(); + + // Create new content, which is not published + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $contentCreate = $contentService->newContentCreateStruct( + $folderType, 'eng-US' + ); + $contentCreate->setField( 'name', 'New Folder' ); + $content = $contentService->createContent( $contentCreate ); + + $findRootLocation = $locationService->loadLocation( $someLocationId ); + + // Throws Exception, since $content has no published version, yet + $locationService->loadLocations( + $content->contentInfo, + $findRootLocation + ); + /* END: Use Case */ + } + + /** + * Test for the loadLocationChildren() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationChildren() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testLoadLocationChildren() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + + $childLocations = $locationService->loadLocationChildren( $location ); + /* END: Use Case */ + + $this->assertInstanceOf( + "\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationList", $childLocations + ); + $this->assertInternalType( + 'array', $childLocations->locations + ); + $this->assertInternalType( + 'int', $childLocations->totalCount + ); + return $childLocations; + } + + /** + * Test for the getLocationChildCount() method. + * + * @see \eZ\Publish\API\Repository\LocationService::getLocationChildCount() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testGetLocationChildCount() + { + // $locationId is the ID of an existing location + $locationService = $this->getRepository()->getLocationService(); + + $this->assertSame( + 5, + $locationService->getLocationChildCount( + $locationService->loadLocation( $this->generateId( 'location', 5 ) ) + ) + ); + } + + /** + * Test for the loadLocationChildren() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationChildren() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildren + */ + public function testLoadLocationChildrenData( LocationList $locations ) + { + $this->assertEquals( 5, count( $locations->locations ) ); + $this->assertEquals( 5, $locations->totalCount ); + + foreach ( $locations->locations as $location ) + { + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $location + ); + } + + $this->assertEquals( + array( + $this->generateId( 'location', 12 ), + $this->generateId( 'location', 13 ), + $this->generateId( 'location', 14 ), + $this->generateId( 'location', 44 ), + $this->generateId( 'location', 61 ), + ), + array_map( + function ( Location $location ) + { + return $location->id; + }, + $locations->locations + ) + ); + } + + /** + * Test for the loadLocationChildren() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] + * @see \eZ\Publish\API\Repository\LocationService::loadLocationChildren($location, $offset) + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildren + */ + public function testLoadLocationChildrenWithOffset() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + + $childLocations = $locationService->loadLocationChildren( + $location, 2 + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationList", $childLocations + ); + $this->assertInternalType( + 'array', $childLocations->locations + ); + $this->assertInternalType( + 'int', $childLocations->totalCount + ); + return $childLocations; + } + + /** + * Test for the loadLocationChildren() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationList $locations + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationChildren($location, $offset) + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildrenWithOffset + */ + public function testLoadLocationChildrenDataWithOffset( LocationList $locations ) + { + $this->assertEquals( 3, count( $locations->locations ) ); + $this->assertEquals( 5, $locations->totalCount ); + + foreach ( $locations->locations as $location ) + { + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $location + ); + } + + $this->assertEquals( + array( + $this->generateId( 'location', 14 ), + $this->generateId( 'location', 44 ), + $this->generateId( 'location', 61 ), + ), + array_map( + function ( Location $location ) + { + return $location->id; + }, + $locations->locations + ) + ); + } + + /** + * Test for the loadLocationChildren() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] + * @see \eZ\Publish\API\Repository\LocationService::loadLocationChildren($location, $offset, $limit) + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildren + */ + public function testLoadLocationChildrenWithOffsetAndLimit() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + + $childLocations = $locationService->loadLocationChildren( + $location, 2, 2 + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationList", $childLocations + ); + $this->assertInternalType( + 'array', $childLocations->locations + ); + $this->assertInternalType( + 'int', $childLocations->totalCount + ); + return $childLocations; + } + + /** + * Test for the loadLocationChildren() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location[] $locations + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::loadLocationChildren($location, $offset, $limit) + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocationChildrenWithOffsetAndLimit + */ + public function testLoadLocationChildrenDataWithOffsetAndLimit( LocationList $locations ) + { + $this->assertEquals( 2, count( $locations->locations ) ); + $this->assertEquals( 5, $locations->totalCount ); + + foreach ( $locations->locations as $location ) + { + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $location + ); + } + + $this->assertEquals( + array( + $this->generateId( 'location', 14 ), + $this->generateId( 'location', 44 ), + ), + array_map( + function ( Location $location ) + { + return $location->id; + }, + $locations->locations + ) + ); + } + + /** + * Test for the newLocationUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::newLocationUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetLocationService + */ + public function testNewLocationUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $locationService = $repository->getLocationService(); + + $updateStruct = $locationService->newLocationUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct', + $updateStruct + ); + } + + /** + * Test for the updateLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::updateLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testUpdateLocation() + { + $repository = $this->getRepository(); + + $originalLocationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $originalLocationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $originalLocation = $locationService->loadLocation( $originalLocationId ); + + $updateStruct = $locationService->newLocationUpdateStruct(); + $updateStruct->priority = 3; + $updateStruct->remoteId = 'c7adcbf1e96bc29bca28c2d809d0c7ef69272651'; + $updateStruct->sortField = Location::SORT_FIELD_PRIORITY; + $updateStruct->sortOrder = Location::SORT_ORDER_DESC; + + $updatedLocation = $locationService->updateLocation( + $originalLocation, $updateStruct + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $updatedLocation + ); + + return array( + 'originalLocation' => $originalLocation, + 'updateStruct' => $updateStruct, + 'updatedLocation' => $updatedLocation, + ); + } + + /** + * Test for the updateLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::updateLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testUpdateLocation + */ + public function testUpdateLocationStructValues( array $data ) + { + $originalLocation = $data['originalLocation']; + $updateStruct = $data['updateStruct']; + $updatedLocation = $data['updatedLocation']; + + $this->assertPropertiesCorrect( + array( + 'id' => $originalLocation->id, + 'priority' => $updateStruct->priority, + 'hidden' => $originalLocation->hidden, + 'invisible' => $originalLocation->invisible, + 'remoteId' => $updateStruct->remoteId, + 'contentInfo' => $originalLocation->contentInfo, + 'parentLocationId' => $originalLocation->parentLocationId, + 'pathString' => $originalLocation->pathString, + 'depth' => $originalLocation->depth, + 'sortField' => $updateStruct->sortField, + 'sortOrder' => $updateStruct->sortOrder, + ), + $updatedLocation + ); + } + + /** + * Test for the updateLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::updateLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUpdateLocationThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $originalLocation = $locationService->loadLocation( $locationId ); + + $updateStruct = $locationService->newLocationUpdateStruct(); + // Remote ID of an existing location + $updateStruct->remoteId = 'f3e90596361e31d496d4026eb624c983'; + + // Throws exception, since remote ID is already taken + $locationService->updateLocation( + $originalLocation, $updateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the swapLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::swapLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testSwapLocation() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + + $mediaContentInfo = $locationService->loadLocation( $mediaLocationId )->getContentInfo(); + $demoDesignContentInfo = $locationService->loadLocation( $demoDesignLocationId )->getContentInfo(); + + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + $mediaLocation = $locationService->loadLocation( $mediaLocationId ); + $demoDesignLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Swaps the content referred to by the locations + $locationService->swapLocation( $mediaLocation, $demoDesignLocation ); + /* END: Use Case */ + + $this->assertEquals( + $mediaContentInfo->id, + $locationService->loadLocation( $demoDesignLocationId )->getContentInfo()->id + ); + $this->assertEquals( + $demoDesignContentInfo->id, + $locationService->loadLocation( $mediaLocationId )->getContentInfo()->id + ); + } + + /** + * Test for the hideLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::hideLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testHideLocation() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $visibleLocation = $locationService->loadLocation( $locationId ); + + $hiddenLocation = $locationService->hideLocation( $visibleLocation ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $hiddenLocation + ); + + $this->assertTrue( + $hiddenLocation->hidden, + sprintf( + 'Location with ID "%s" not hidden.', + $hiddenLocation->id + ) + ); + foreach ( $locationService->loadLocationChildren( $hiddenLocation )->locations as $child ) + { + $this->assertSubtreeProperties( + array( 'invisible' => true ), + $child + ); + } + } + + /** + * Assert that $expectedValues are set in the subtree starting at $location + * + * @param array $expectedValues + * @param Location $location + * + * @return void + */ + protected function assertSubtreeProperties( array $expectedValues, Location $location, $stopId = null ) + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + if ( $location->id === $stopId ) + { + return; + } + + foreach ( $expectedValues as $propertyName => $propertyValue ) + { + $this->assertEquals( + $propertyValue, + $location->$propertyName + ); + + foreach ( $locationService->loadLocationChildren( $location )->locations as $child ) + { + $this->assertSubtreeProperties( $expectedValues, $child ); + } + } + } + + /** + * Test for the unhideLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::unhideLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testHideLocation + */ + public function testUnhideLocation() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + $locationService = $repository->getLocationService(); + + $visibleLocation = $locationService->loadLocation( $locationId ); + $hiddenLocation = $locationService->hideLocation( $visibleLocation ); + + $unHiddenLocation = $locationService->unhideLocation( $hiddenLocation ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $unHiddenLocation + ); + + $this->assertFalse( + $unHiddenLocation->hidden, + sprintf( + 'Location with ID "%s" not unhidden.', + $unHiddenLocation->id + ) + ); + foreach ( $locationService->loadLocationChildren( $unHiddenLocation )->locations as $child ) + { + $this->assertSubtreeProperties( + array( 'invisible' => false ), + $child + ); + } + } + + /** + * Test for the unhideLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::unhideLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testUnhideLocation + */ + public function testUnhideLocationNotUnhidesHiddenSubtree() + { + $repository = $this->getRepository(); + + $higherLocationId = $this->generateId( 'location', 5 ); + $lowerLocationId = $this->generateId( 'location', 13 ); + /* BEGIN: Use Case */ + // $higherLocationId is the ID of a location + // $lowerLocationId is the ID of a location below $higherLocationId + $locationService = $repository->getLocationService(); + + $higherLocation = $locationService->loadLocation( $higherLocationId ); + $hiddenHigherLocation = $locationService->hideLocation( $higherLocation ); + + $lowerLocation = $locationService->loadLocation( $lowerLocationId ); + $hiddenLowerLocation = $locationService->hideLocation( $lowerLocation ); + + $unHiddenHigherLocation = $locationService->unhideLocation( $hiddenHigherLocation ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $unHiddenHigherLocation + ); + + $this->assertFalse( + $unHiddenHigherLocation->hidden, + sprintf( + 'Location with ID "%s" not unhidden.', + $unHiddenHigherLocation->id + ) + ); + foreach ( $locationService->loadLocationChildren( $unHiddenHigherLocation )->locations as $child ) + { + $this->assertSubtreeProperties( + array( 'invisible' => false ), + $child, + $this->generateId( 'location', 13 ) + ); + } + + $stillHiddenLocation = $locationService->loadLocation( $this->generateId( 'location', 13 ) ); + $this->assertTrue( + $stillHiddenLocation->hidden, + sprintf( + 'Hidden sub-location with ID %s accidentally unhidden.', + $stillHiddenLocation->id + ) + ); + foreach ( $locationService->loadLocationChildren( $stillHiddenLocation )->locations as $child ) + { + $this->assertSubtreeProperties( + array( 'invisible' => true ), + $child + ); + } + } + + /** + * Test for the deleteLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::deleteLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testDeleteLocation() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the location of the + // "Media" location in an eZ Publish demo installation + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $mediaLocationId ); + + $locationService->deleteLocation( $location ); + /* END: Use Case */ + + try + { + $locationService->loadLocation( $mediaLocationId ); + $this->fail( "Location $mediaLocationId not deleted." ); + } + catch ( Exceptions\NotFoundException $e ) + { + } + + // The following IDs are IDs of child locations of $mediaLocationId location + // ( Media/Images, Media/Files, Media/Multimedia respectively ) + foreach ( array( 51, 52, 53 ) as $childLocationId ) + { + try + { + $locationService->loadLocation( $this->generateId( 'location', $childLocationId ) ); + $this->fail( "Location $childLocationId not deleted." ); + } + catch ( Exceptions\NotFoundException $e ) + { + } + } + + // The following IDs are IDs of content below $mediaLocationId location + // ( Media/Images, Media/Files, Media/Multimedia respectively ) + $contentService = $this->getRepository()->getContentService(); + foreach ( array( 49, 50, 51 ) as $childContentId ) + { + try + { + $contentService->loadContentInfo( $this->generateId( 'object', $childContentId ) ); + $this->fail( "Content $childContentId not deleted." ); + } + catch ( Exceptions\NotFoundException $e ) + { + } + } + } + + /** + * Test for the deleteLocation() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::deleteLocation() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testDeleteLocation + */ + public function testDeleteLocationDecrementsChildCountOnParent() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the location of the + // "Media" location in an eZ Publish demo installation + + $locationService = $repository->getLocationService(); + + // Load the current the user group location + $location = $locationService->loadLocation( $mediaLocationId ); + + // Load the parent location + $parentLocation = $locationService->loadLocation( + $location->parentLocationId + ); + + // Get child count + $childCountBefore = $locationService->getLocationChildCount( $parentLocation ); + + // Delete the user group location + $locationService->deleteLocation( $location ); + + // Reload parent location + $parentLocation = $locationService->loadLocation( + $location->parentLocationId + ); + + // This will be $childCountBefore - 1 + $childCountAfter = $locationService->getLocationChildCount( $parentLocation ); + /* END: Use Case */ + + $this->assertEquals( $childCountBefore - 1, $childCountAfter ); + } + + /** + * Test for the copySubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::copySubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testCopySubtree() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to copy + $locationToCopy = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Copy location "Media" to "Demo Design" + $copiedLocation = $locationService->copySubtree( + $locationToCopy, + $newParentLocation + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $copiedLocation + ); + + $this->assertPropertiesCorrect( + array( + 'depth' => $newParentLocation->depth + 1, + 'parentLocationId' => $newParentLocation->id, + 'pathString' => "{$newParentLocation->pathString}" . $this->parseId( 'location', $copiedLocation->id ) . "/" + ), + $copiedLocation + ); + } + + /** + * Test for the copySubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::copySubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCopySubtree + */ + public function testCopySubtreeUpdatesSubtreeProperties() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $locationToCopy = $locationService->loadLocation( $this->generateId( 'location', 43 ) ); + + // Load Subtree properties before copy + $expected = $this->loadSubtreeProperties( $locationToCopy ); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to copy + $locationToCopy = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Copy location "Media" to "Demo Design" + $copiedLocation = $locationService->copySubtree( + $locationToCopy, + $newParentLocation + ); + /* END: Use Case */ + + $beforeIds = array(); + foreach ( $expected as $properties ) + { + $beforeIds[] = $properties['id']; + } + + // Load Subtree properties after copy + $actual = $this->loadSubtreeProperties( $copiedLocation ); + + $this->assertEquals( count( $expected ), count( $actual ) ); + + foreach ( $actual as $properties ) + { + $this->assertNotContains( $properties['id'], $beforeIds ); + $this->assertStringStartsWith( + "{$newParentLocation->pathString}" . $this->parseId( 'location', $copiedLocation->id ) . "/", + $properties['pathString'] + ); + $this->assertStringEndsWith( + "/" . $this->parseId( 'location', $properties['id'] ) . "/", + $properties['pathString'] + ); + } + } + + /** + * Test for the copySubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::copySubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCopySubtree + */ + public function testCopySubtreeIncrementsChildCountOfNewParent() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $childCountBefore = $locationService->getLocationChildCount( $locationService->loadLocation( 56 ) ); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to copy + $locationToCopy = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Copy location "Media" to "Demo Design" + $copiedLocation = $locationService->copySubtree( + $locationToCopy, + $newParentLocation + ); + /* END: Use Case */ + + $childCountAfter = $locationService->getLocationChildCount( $locationService->loadLocation( $demoDesignLocationId ) ); + + $this->assertEquals( $childCountBefore + 1, $childCountAfter ); + } + + /** + * Test for the copySubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::copySubtree() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testCopySubtree + */ + public function testCopySubtreeThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $communityLocationId = $this->generateId( 'location', 5 ); + /* BEGIN: Use Case */ + // $communityLocationId is the ID of the "Community" page location in + // an eZ Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to copy + $locationToCopy = $locationService->loadLocation( $communityLocationId ); + + // Use a child as new parent + $childLocations = $locationService->loadLocationChildren( $locationToCopy )->locations; + $newParentLocation = end( $childLocations ); + + // This call will fail with an "InvalidArgumentException", because the + // new parent is a child location of the subtree to copy. + $locationService->copySubtree( + $locationToCopy, + $newParentLocation + ); + /* END: Use Case */ + } + + /** + * Test for the moveSubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::moveSubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testLoadLocation + */ + public function testMoveSubtree() + { + $repository = $this->getRepository(); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to move + $locationToMove = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Move location from "Home" to "Demo Design" + $locationService->moveSubtree( + $locationToMove, + $newParentLocation + ); + + // Load moved location + $movedLocation = $locationService->loadLocation( $mediaLocationId ); + /* END: Use Case */ + + $this->assertPropertiesCorrect( + array( + 'depth' => $newParentLocation->depth + 1, + 'parentLocationId' => $newParentLocation->id, + 'pathString' => "{$newParentLocation->pathString}" . $this->parseId( 'location', $movedLocation->id ) . "/" + ), + $movedLocation + ); + } + + /** + * Test for the moveSubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::moveSubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testMoveSubtree + */ + public function testMoveSubtreeUpdatesSubtreeProperties() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $locationToMove = $locationService->loadLocation( $this->generateId( 'location', 43 ) ); + $newParentLocation = $locationService->loadLocation( $this->generateId( 'location', 56 ) ); + + // Load Subtree properties before move + $expected = $this->loadSubtreeProperties( $locationToMove ); + foreach ( $expected as $id => $properties ) + { + $expected[$id]['depth'] = $properties['depth'] + 2; + $expected[$id]['pathString'] = str_replace( + $locationToMove->pathString, + "{$newParentLocation->pathString}" . $this->parseId( 'location', $locationToMove->id ) . "/", + $properties['pathString'] + ); + } + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to move + $locationToMove = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Move location from "Home" to "Demo Design" + $locationService->moveSubtree( + $locationToMove, + $newParentLocation + ); + + // Load moved location + $movedLocation = $locationService->loadLocation( $mediaLocationId ); + /* END: Use Case */ + + // Load Subtree properties after move + $actual = $this->loadSubtreeProperties( $movedLocation ); + + $this->assertEquals( $expected, $actual ); + } + + /** + * Test for the moveSubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::moveSubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testMoveSubtree + */ + public function testMoveSubtreeIncrementsChildCountOfNewParent() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $newParentLocation = $locationService->loadLocation( $this->generateId( 'location', 56 ) ); + + // Load expected properties before move + $expected = $this->loadLocationProperties( $newParentLocation ); + $childCountBefore = $locationService->getLocationChildCount( $newParentLocation ); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to move + $locationToMove = $locationService->loadLocation( $mediaLocationId ); + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Move location from "Home" to "Demo Design" + $locationService->moveSubtree( + $locationToMove, + $newParentLocation + ); + + // Load moved location + $movedLocation = $locationService->loadLocation( $mediaLocationId ); + + // Reload new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + /* END: Use Case */ + + // Load Subtree properties after move + $actual = $this->loadLocationProperties( $newParentLocation ); + $childCountAfter = $locationService->getLocationChildCount( $newParentLocation ); + + $this->assertEquals( $expected, $actual ); + $this->assertEquals( $childCountBefore + 1, $childCountAfter ); + } + + /** + * Test for the moveSubtree() method. + * + * @return void + * @see \eZ\Publish\API\Repository\LocationService::moveSubtree() + * @depends eZ\Publish\API\Repository\Tests\LocationServiceTest::testMoveSubtree + */ + public function testMoveSubtreeDecrementsChildCountOfOldParent() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $oldParentLocation = $locationService->loadLocation( $this->generateId( 'location', 1 ) ); + + // Load expected properties before move + $expected = $this->loadLocationProperties( $oldParentLocation ); + $childCountBefore = $locationService->getLocationChildCount( $oldParentLocation ); + + $mediaLocationId = $this->generateId( 'location', 43 ); + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $mediaLocationId is the ID of the "Media" page location in + // an eZ Publish demo installation + + // $demoDesignLocationId is the ID of the "Demo Design" page location in an eZ + // Publish demo installation + + // Load the location service + $locationService = $repository->getLocationService(); + + // Load location to move + $locationToMove = $locationService->loadLocation( $mediaLocationId ); + + // Get the location id of the old parent + $oldParentLocationId = $locationToMove->parentLocationId; + + // Load new parent location + $newParentLocation = $locationService->loadLocation( $demoDesignLocationId ); + + // Move location from "Home" to "Demo Design" + $locationService->moveSubtree( + $locationToMove, + $newParentLocation + ); + + // Reload old parent location + $oldParentLocation = $locationService->loadLocation( $oldParentLocationId ); + /* END: Use Case */ + + // Load Subtree properties after move + $actual = $this->loadLocationProperties( $oldParentLocation ); + $childCountAfter = $locationService->getLocationChildCount( $oldParentLocation ); + + $this->assertEquals( $expected, $actual ); + $this->assertEquals( $childCountBefore - 1, $childCountAfter ); + } + + /** + * Loads properties from all locations in the $location's subtree + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param array $properties + * + * @return array + */ + private function loadSubtreeProperties( Location $location, array $properties = array() ) + { + $locationService = $this->getRepository()->getLocationService(); + + foreach ( $locationService->loadLocationChildren( $location )->locations as $childLocation ) + { + $properties[] = $this->loadLocationProperties( $childLocation ); + + $properties = $this->loadSubtreeProperties( $childLocation, $properties ); + } + + return $properties; + } + + /** + * Loads assertable properties from the given location. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param mixed[] $overwrite + * + * @return array + */ + private function loadLocationProperties( Location $location, array $overwrite = array() ) + { + return array_merge( + array( + 'id' => $location->id, + 'depth' => $location->depth, + 'parentLocationId' => $location->parentLocationId, + 'pathString' => $location->pathString, + 'remoteId' => $location->remoteId, + 'hidden' => $location->hidden, + 'invisible' => $location->invisible, + 'priority' => $location->priority, + 'sortField' => $location->sortField, + 'sortOrder' => $location->sortOrder + ), + $overwrite + ); + } + +} diff --git a/eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php new file mode 100644 index 0000000..a2750c0 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php @@ -0,0 +1,338 @@ +getRepository(); + + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + $objectStateService = $repository->getObjectStateService(); + + $objectStateGroupCreate = $objectStateService->newObjectStateGroupCreateStruct( + 'publishing' + ); + $objectStateGroupCreate->defaultLanguageCode = 'eng-US'; + $objectStateGroupCreate->names = array( + 'eng-US' => 'Publishing', + 'eng-GB' => 'Sindelfingen', + ); + $objectStateGroupCreate->descriptions = array( + 'eng-US' => 'Put something online', + 'eng-GB' => 'Put something ton Sindelfingen.', + ); + + // Throws unauthorized exception, since the anonymous user must not + // create object state groups + $createdObjectStateGroup = $objectStateService->createObjectStateGroup( + $objectStateGroupCreate + ); + /* END: Use Case */ + } + + /** + * Test for the updateObjectStateGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::updateObjectStateGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testUpdateObjectStateGroup + */ + public function testUpdateObjectStateGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + $groupUpdateStruct = $objectStateService->newObjectStateGroupUpdateStruct(); + $groupUpdateStruct->identifier = 'sindelfingen'; + $groupUpdateStruct->defaultLanguageCode = 'ger-DE'; + $groupUpdateStruct->names = array( + 'ger-DE' => 'Sindelfingen', + ); + $groupUpdateStruct->descriptions = array( + 'ger-DE' => 'Sindelfingen ist nicht nur eine Stadt' + ); + + // Throws unauthorized exception, since the anonymous user must not + // update object state groups + $updatedObjectStateGroup = $objectStateService->updateObjectStateGroup( + $loadedObjectStateGroup, + $groupUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the deleteObjectStateGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::deleteObjectStateGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testDeleteObjectStateGroup + */ + public function testDeleteObjectStateGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + // Throws unauthorized exception, since the anonymous user must not + // delete object state groups + $objectStateService->deleteObjectStateGroup( $loadedObjectStateGroup ); + /* END: Use Case */ + } + + /** + * Test for the createObjectState() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::createObjectState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testCreateObjectState + */ + public function testCreateObjectStateThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + $objectStateCreateStruct = $objectStateService->newObjectStateCreateStruct( + 'locked_and_unlocked' + ); + $objectStateCreateStruct->priority = 23; + $objectStateCreateStruct->defaultLanguageCode = 'eng-US'; + $objectStateCreateStruct->names = array( + 'eng-US' => 'Locked and Unlocked', + ); + $objectStateCreateStruct->descriptions = array( + 'eng-US' => 'A state between locked and unlocked.', + ); + + // Throws unauthorized exception, since the anonymous user must not + // create object states + $createdObjectState = $objectStateService->createObjectState( + $loadedObjectStateGroup, + $objectStateCreateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the updateObjectState() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::updateObjectState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testUpdateObjectState + */ + public function testUpdateObjectStateThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $objectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $objectStateId contains the ID of the "locked" state + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + + $updateStateStruct = $objectStateService->newObjectStateUpdateStruct(); + $updateStateStruct->identifier = 'somehow_locked'; + $updateStateStruct->defaultLanguageCode = 'ger-DE'; + $updateStateStruct->names = array( + 'eng-US' => 'Somehow locked', + 'ger-DE' => 'Irgendwie gelockt', + ); + $updateStateStruct->descriptions = array( + 'eng-US' => 'The object is somehow locked', + 'ger-DE' => 'Sindelfingen', + ); + + // Throws unauthorized exception, since the anonymous user must not + // update object states + $updatedObjectState = $objectStateService->updateObjectState( + $loadedObjectState, + $updateStateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the setPriorityOfObjectState() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::setPriorityOfObjectState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testSetPriorityOfObjectState + */ + public function testSetPriorityOfObjectStateThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $objectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $objectStateId contains the ID of the "locked" state + $objectStateService = $repository->getObjectStateService(); + + $initiallyLoadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + + // Throws unauthorized exception, since the anonymous user must not + // set priorities for object states + $objectStateService->setPriorityOfObjectState( + $initiallyLoadedObjectState, + 23 + ); + /* END: Use Case */ + } + + /** + * Test for the deleteObjectState() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::deleteObjectState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testDeleteObjectState + */ + public function testDeleteObjectStateThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $notLockedObjectStateId = $this->generateId( 'objectstate', 1 ); + $lockedObjectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $notLockedObjectStateId is the ID of the state "not_locked" + $objectStateService = $repository->getObjectStateService(); + + $notLockedObjectState = $objectStateService->loadObjectState( $notLockedObjectStateId ); + + // Throws unauthorized exception, since the anonymous user must not + // delete object states + $objectStateService->deleteObjectState( $notLockedObjectState ); + /* END: Use Case */ + } + + /** + * Test for the setContentState() method. + * + * @return void + * @see \eZ\Publish\API\Repository\ObjectStateService::setContentState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\ObjectStateServiceTest::testSetContentState + */ + public function testSetContentStateThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + $ezLockObjectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + $lockedObjectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // Set anonymous user + $userService = $repository->getUserService(); + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // $anonymousUserId is the content ID of "Anonymous User" + // $ezLockObjectStateGroupId contains the ID of the "ez_lock" object + // state group + // $lockedObjectStateId is the ID of the state "locked" + $contentService = $repository->getContentService(); + $objectStateService = $repository->getObjectStateService(); + + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $ezLockObjectStateGroup = $objectStateService->loadObjectStateGroup( + $ezLockObjectStateGroupId + ); + $lockedObjectState = $objectStateService->loadObjectState( $lockedObjectStateId ); + + // Throws unauthorized exception, since the anonymous user must not + // set object state + $objectStateService->setContentState( + $contentInfo, + $ezLockObjectStateGroup, + $lockedObjectState + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php b/eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php new file mode 100644 index 0000000..d9317fa --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php @@ -0,0 +1,1414 @@ +getRepository(); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $objectStateGroupCreate = $objectStateService->newObjectStateGroupCreateStruct( + 'publishing' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupCreateStruct', + $objectStateGroupCreate + ); + return $objectStateGroupCreate; + } + + /** + * testNewObjectStateGroupCreateStructValues + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct $objectStateGroupCreate + * + * @return void + * + * @depends testNewObjectStateGroupCreateStruct + */ + public function testNewObjectStateGroupCreateStructValues( ObjectStateGroupCreateStruct $objectStateGroupCreate ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'publishing', + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null, + ), + $objectStateGroupCreate + ); + } + + /** + * Test for the newObjectStateGroupUpdateStruct() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::newObjectStateGroupUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetObjectStateService + */ + public function testNewObjectStateGroupUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $objectStateGroupUpdate = $objectStateService->newObjectStateGroupUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupUpdateStruct', + $objectStateGroupUpdate + ); + return $objectStateGroupUpdate; + } + + /** + * testNewObjectStateGroupUpdateStructValues + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct $objectStateGroupUpdate + * + * @return void + * + * @depends testNewObjectStateGroupUpdateStruct + */ + public function testNewObjectStateGroupUpdateStructValues( ObjectStateGroupUpdateStruct $objectStateGroupUpdate ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null, + ), + $objectStateGroupUpdate + ); + } + + /** + * Test for the newObjectStateCreateStruct() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::newObjectStateCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetObjectStateService + */ + public function testNewObjectStateCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $objectStateCreate = $objectStateService->newObjectStateCreateStruct( + 'pending' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateCreateStruct', + $objectStateCreate + ); + return $objectStateCreate; + } + + /** + * testNewObjectStateCreateStructValues + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct $objectStateCreate + * + * @return void + * + * @depends testNewObjectStateCreateStruct + */ + public function testNewObjectStateCreateStructValues( ObjectStateCreateStruct $objectStateCreate ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'pending', + 'priority' => false, + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null, + ), + $objectStateCreate + ); + } + + /** + * Test for the newObjectStateUpdateStruct() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::newObjectStateUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetObjectStateService + */ + public function testNewObjectStateUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $objectStateUpdate = $objectStateService->newObjectStateUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateUpdateStruct', + $objectStateUpdate + ); + return $objectStateUpdate; + } + + /** + * testNewObjectStateUpdateStructValues + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct $objectStateUpdate + * + * @return void + * + * @depends testNewObjectStateUpdateStruct + */ + public function testNewObjectStateUpdateStructValues( ObjectStateUpdateStruct $objectStateUpdate ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null, + ), + $objectStateUpdate + ); + } + + /** + * Test for the createObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::createObjectStateGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetObjectStateService + * @depends testNewObjectStateGroupCreateStructValues + */ + public function testCreateObjectStateGroup() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $objectStateGroupCreate = $objectStateService->newObjectStateGroupCreateStruct( + 'publishing' + ); + $objectStateGroupCreate->defaultLanguageCode = 'eng-US'; + $objectStateGroupCreate->names = array( + 'eng-US' => 'Publishing', + 'eng-GB' => 'Sindelfingen', + ); + $objectStateGroupCreate->descriptions = array( + 'eng-US' => 'Put something online', + 'eng-GB' => 'Put something ton Sindelfingen.', + ); + + $createdObjectStateGroup = $objectStateService->createObjectStateGroup( + $objectStateGroupCreate + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $createdObjectStateGroup + ); + return $createdObjectStateGroup; + } + + /** + * testCreateObjectStateGroupStructValues + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $createdObjectStateGroup + * + * @return void + * + * @depends testCreateObjectStateGroup + */ + public function testCreateObjectStateGroupStructValues( ObjectStateGroup $createdObjectStateGroup ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'publishing', + 'defaultLanguageCode' => 'eng-US', + 'languageCodes' => array( 'eng-US', 'eng-GB' ), + 'names' => array( + 'eng-US' => 'Publishing', + 'eng-GB' => 'Sindelfingen', + ), + 'descriptions' => array( + 'eng-US' => 'Put something online', + 'eng-GB' => 'Put something ton Sindelfingen.', + ), + ), + $createdObjectStateGroup + ); + $this->assertNotNull( $createdObjectStateGroup->id ); + } + + /** + * Test for the createObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::createObjectStateGroup() + * @depends testCreateObjectStateGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateObjectStateGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $objectStateService = $repository->getObjectStateService(); + + $objectStateGroupCreate = $objectStateService->newObjectStateGroupCreateStruct( + // 'ez_lock' is already existing identifier + 'ez_lock' + ); + $objectStateGroupCreate->defaultLanguageCode = 'eng-US'; + $objectStateGroupCreate->names = array( + 'eng-US' => 'Publishing', + 'eng-GB' => 'Sindelfingen', + ); + $objectStateGroupCreate->descriptions = array( + 'eng-US' => 'Put something online', + 'eng-GB' => 'Put something ton Sindelfingen.', + ); + + // This call will fail because group with 'ez_lock' identifier already exists + $objectStateService->createObjectStateGroup( + $objectStateGroupCreate + ); + } + + /** + * Test for the loadObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroup() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetObjectStateService + */ + public function testLoadObjectStateGroup() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $loadedObjectStateGroup + ); + return $loadedObjectStateGroup; + } + + /** + * Test for the loadObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends testLoadObjectStateGroup + */ + public function testLoadObjectStateGroupThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentObjectStateGroupId = $this->generateId( 'objectstategroup', PHP_INT_MAX ); + /* BEGIN: Use Case */ + // $nonExistentObjectStateGroupId contains an ID for an object state + // that does not exist + $objectStateService = $repository->getObjectStateService(); + + // Throws a not found exception + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $nonExistentObjectStateGroupId + ); + /* END: Use Case */ + } + + /** + * Test for the loadObjectStateGroups() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroups() + * @depends testLoadObjectStateGroup + */ + public function testLoadObjectStateGroups() + { + $repository = $this->getRepository(); + + $expectedGroupIdentifiers = $this->getGroupIdentifierMap( $this->createObjectStateGroups() ); + $expectedGroupIdentifiers['ez_lock'] = true; + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroups = $objectStateService->loadObjectStateGroups(); + /* END: Use Case */ + + $this->assertInternalType( 'array', $loadedObjectStateGroups ); + + $this->assertObjectsLoadedByIdentifiers( + $expectedGroupIdentifiers, + $loadedObjectStateGroups, + 'ObjectStateGroup' + ); + } + + /** + * Creates a set of object state groups and returns an array of all + * existing group identifiers after creation + * + * @return boolean[] + */ + protected function createObjectStateGroups() + { + $repository = $this->getRepository(); + $objectStateService = $repository->getObjectStateService(); + + $identifiersToCreate = array( + 'first', + 'second', + 'third', + ); + + $createdStateGroups = array(); + + $groupCreateStruct = $objectStateService->newObjectStateGroupCreateStruct( 'dummy' ); + + $groupCreateStruct->defaultLanguageCode = 'eng-US'; + $groupCreateStruct->names = array( 'eng-US' => 'Foo' ); + $groupCreateStruct->descriptions = array( 'eng-US' => 'Foo Bar' ); + + foreach ( $identifiersToCreate as $identifier ) + { + $groupCreateStruct->identifier = $identifier; + $createdStateGroups[] = $objectStateService->createObjectStateGroup( $groupCreateStruct ); + } + + return $createdStateGroups; + } + + /** + * testLoadObjectStateGroupsLoadedExpectedGroups + * + * @param array $loadObjectStateGroups + * + * @depends testLoadObjectStateGroups + */ + protected function assertObjectsLoadedByIdentifiers( array $expectedIdentifiers, array $loadedObjects, $class ) + { + foreach ( $loadedObjects as $loadedObject ) + { + if ( !isset( $expectedIdentifiers[$loadedObject->identifier] ) ) + { + $this->fail( + sprintf( + 'Loaded not expected %s with identifier "%s"', + $class, + $loadedObject->identifier + ) + ); + } + unset( $expectedIdentifiers[$loadedObject->identifier] ); + } + + if ( !empty( $expectedIdentifiers ) ) + { + $this->fail( + sprintf( + 'Expected %ss with identifiers "%s" not loaded.', + $class, + implode( '", "', $expectedIdentifiers ) + ) + ); + } + } + + /** + * Test for the loadObjectStateGroups() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroups($offset) + * @depends testLoadObjectStateGroups + */ + public function testLoadObjectStateGroupsWithOffset() + { + $repository = $this->getRepository(); + $objectStateService = $repository->getObjectStateService(); + + $this->createObjectStateGroups(); + + $allObjectStateGroups = $objectStateService->loadObjectStateGroups(); + + $existingGroupIdentifiers = $this->getGroupIdentifierMap( $allObjectStateGroups ); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroups = $objectStateService->loadObjectStateGroups( 2 ); + /* END: Use Case */ + + $this->assertInternalType( 'array', $loadedObjectStateGroups ); + + $this->assertObjectsLoadedByIdentifiers( + array_slice( $existingGroupIdentifiers, 2 ), + $loadedObjectStateGroups, + 'ObjectStateGroup' + ); + } + + /** + * Returns a map of the given object state groups + * + * @param array $groups + * + * @return void + */ + protected function getGroupIdentifierMap( array $groups ) + { + $existingGroupIdentifiers = array_map( + function ( $group ) + { + return $group->identifier; + }, + $groups + ); + + return array_fill_keys( $existingGroupIdentifiers, true ); + } + + /** + * Test for the loadObjectStateGroups() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroups($offset, $limit) + * @depends testLoadObjectStateGroupsWithOffset + */ + public function testLoadObjectStateGroupsWithOffsetAndLimit() + { + $repository = $this->getRepository(); + $objectStateService = $repository->getObjectStateService(); + + $allObjectStateGroups = $objectStateService->loadObjectStateGroups(); + + $existingGroupIdentifiers = $this->getGroupIdentifierMap( $allObjectStateGroups ); + + /* BEGIN: Use Case */ + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroups = $objectStateService->loadObjectStateGroups( 1, 2 ); + /* END: Use Case */ + + $this->assertInternalType( 'array', $loadedObjectStateGroups ); + + $this->assertObjectsLoadedByIdentifiers( + array_slice( $existingGroupIdentifiers, 1, 2 ), + $loadedObjectStateGroups, + 'ObjectStateGroup' + ); + } + + /** + * Test for the loadObjectStates() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectStates() + * @depends testLoadObjectStateGroup + */ + public function testLoadObjectStates() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $objectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + // Loads all object states in $objectStateGroup + $loadedObjectStates = $objectStateService->loadObjectStates( $objectStateGroup ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedObjectStates + ); + $this->assertObjectsLoadedByIdentifiers( + array( 'not_locked' => true, 'locked' => true ), + $loadedObjectStates, + 'ObjectState' + ); + } + + /** + * Test for the updateObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::updateObjectStateGroup() + * @depends testLoadObjectStateGroup + */ + public function testUpdateObjectStateGroup() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + $groupUpdateStruct = $objectStateService->newObjectStateGroupUpdateStruct(); + $groupUpdateStruct->identifier = 'sindelfingen'; + $groupUpdateStruct->defaultLanguageCode = 'ger-DE'; + $groupUpdateStruct->names = array( + 'ger-DE' => 'Sindelfingen', + ); + $groupUpdateStruct->descriptions = array( + 'ger-DE' => 'Sindelfingen ist nicht nur eine Stadt' + ); + + // Updates the $loadObjectStateGroup with the data from + // $groupUpdateStruct and returns the updated group + $updatedObjectStateGroup = $objectStateService->updateObjectStateGroup( + $loadedObjectStateGroup, + $groupUpdateStruct + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $updatedObjectStateGroup + ); + return array( + $loadedObjectStateGroup, + $groupUpdateStruct, + $updatedObjectStateGroup + ); + } + + /** + * Test for the updateObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::updateObjectStateGroup() + * @depends testUpdateObjectStateGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUpdateObjectStateGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $objectStateService = $repository->getObjectStateService(); + + // Create object state group which we will later update + $objectStateGroupCreate = $objectStateService->newObjectStateGroupCreateStruct( + 'publishing' + ); + $objectStateGroupCreate->defaultLanguageCode = 'eng-US'; + $objectStateGroupCreate->names = array( + 'eng-US' => 'Publishing', + 'eng-GB' => 'Sindelfingen', + ); + $objectStateGroupCreate->descriptions = array( + 'eng-US' => 'Put something online', + 'eng-GB' => 'Put something ton Sindelfingen.', + ); + + $createdObjectStateGroup = $objectStateService->createObjectStateGroup( + $objectStateGroupCreate + ); + + $groupUpdateStruct = $objectStateService->newObjectStateGroupUpdateStruct(); + // 'ez_lock' is the identifier of already existing group + $groupUpdateStruct->identifier = 'ez_lock'; + $groupUpdateStruct->defaultLanguageCode = 'ger-DE'; + $groupUpdateStruct->names = array( + 'ger-DE' => 'Sindelfingen', + ); + $groupUpdateStruct->descriptions = array( + 'ger-DE' => 'Sindelfingen ist nicht nur eine Stadt' + ); + + // This call will fail since state group with 'ez_lock' identifier already exists + $objectStateService->updateObjectStateGroup( + $createdObjectStateGroup, + $groupUpdateStruct + ); + } + + /** + * testUpdateObjectStateGroupStructValues + * + * @param array $testData + * + * @return void + * + * @depends testUpdateObjectStateGroup + */ + public function testUpdateObjectStateGroupStructValues( array $testData ) + { + list( + $loadedObjectStateGroup, + $groupUpdateStruct, + $updatedObjectStateGroup + ) = $testData; + + $this->assertStructPropertiesCorrect( + $groupUpdateStruct, + $updatedObjectStateGroup + ); + } + + /** + * Test for the createObjectState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::createObjectState() + * @depends testLoadObjectStateGroup + * @depends testNewObjectStateCreateStruct + */ + public function testCreateObjectState() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + $objectStateCreateStruct = $objectStateService->newObjectStateCreateStruct( + 'locked_and_unlocked' + ); + $objectStateCreateStruct->priority = 23; + $objectStateCreateStruct->defaultLanguageCode = 'eng-US'; + $objectStateCreateStruct->names = array( + 'eng-US' => 'Locked and Unlocked', + ); + $objectStateCreateStruct->descriptions = array( + 'eng-US' => 'A state between locked and unlocked.', + ); + + // Creates a new object state in the $loadObjectStateGroup with the + // data from $objectStateCreateStruct + $createdObjectState = $objectStateService->createObjectState( + $loadedObjectStateGroup, + $objectStateCreateStruct + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $createdObjectState + ); + // Object sequences are renumbered + $objectStateCreateStruct->priority = 2; + return array( + $loadedObjectStateGroup, + $objectStateCreateStruct, + $createdObjectState + ); + } + + /** + * Test for the createObjectState() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::createObjectState() + * @depends testLoadObjectStateGroup + * @depends testCreateObjectState + */ + public function testCreateObjectStateThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + $objectStateCreateStruct = $objectStateService->newObjectStateCreateStruct( + // 'not_locked' is the identifier of already existing state + 'not_locked' + ); + $objectStateCreateStruct->priority = 23; + $objectStateCreateStruct->defaultLanguageCode = 'eng-US'; + $objectStateCreateStruct->names = array( + 'eng-US' => 'Locked and Unlocked', + ); + $objectStateCreateStruct->descriptions = array( + 'eng-US' => 'A state between locked and unlocked.', + ); + + // This call will fail because object state with + // 'not_locked' identifier already exists + $objectStateService->createObjectState( + $loadedObjectStateGroup, + $objectStateCreateStruct + ); + } + + /** + * testCreateObjectStateStructValues + * + * @param array $testData + * + * @return void + * + * @depends testCreateObjectState + */ + public function testCreateObjectStateStructValues( array $testData ) + { + list( + $loadedObjectStateGroup, + $objectStateCreateStruct, + $createdObjectState + ) = $testData; + + $this->assertStructPropertiesCorrect( + $objectStateCreateStruct, + $createdObjectState + ); + + $this->assertNotNull( $createdObjectState->id ); + + $this->assertEquals( + $loadedObjectStateGroup, + $createdObjectState->getObjectStateGroup() + ); + } + + /** + * Test for the loadObjectState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectState() + * @depends testLoadObjectStateGroup + */ + public function testLoadObjectState() + { + $repository = $this->getRepository(); + + $objectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // $objectStateId contains the ID of the "locked" state + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $loadedObjectState + ); + + return $loadedObjectState; + } + + /** + * testLoadObjectStateStructValues + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $loadedObjectState + * + * @return void + * + * @depends testLoadObjectState + */ + public function testLoadObjectStateStructValues( ObjectState $loadedObjectState ) + { + $this->assertPropertiesCorrect( + array( + 'id' => 2, + 'identifier' => 'locked', + 'priority' => 1, + 'defaultLanguageCode' => 'eng-US', + 'languageCodes' => array( 0 => 'eng-US' ), + 'names' => array( 'eng-US' => 'Locked' ), + 'descriptions' => array( 'eng-US' => '' ), + ), + $loadedObjectState + ); + + $this->assertEquals( + $this->getRepository()->getObjectStateService()->loadObjectStateGroup( 2 ), + $loadedObjectState->getObjectStateGroup() + ); + } + + /** + * Test for the loadObjectState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::loadObjectState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends testLoadObjectState + */ + public function testLoadObjectStateThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingObjectStateId = $this->generateId( 'objectstate', PHP_INT_MAX ); + /* BEGIN: Use Case */ + // $nonExistingObjectStateId contains the ID of a non existing state + $objectStateService = $repository->getObjectStateService(); + + // Throws not found exception + $loadedObjectState = $objectStateService->loadObjectState( + $nonExistingObjectStateId + ); + /* END: Use Case */ + } + + /** + * Test for the updateObjectState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::updateObjectState() + * @depends testLoadObjectState + */ + public function testUpdateObjectState() + { + $repository = $this->getRepository(); + + $objectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // $objectStateId contains the ID of the "locked" state + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + + $updateStateStruct = $objectStateService->newObjectStateUpdateStruct(); + $updateStateStruct->identifier = 'somehow_locked'; + $updateStateStruct->defaultLanguageCode = 'ger-DE'; + $updateStateStruct->names = array( + 'eng-US' => 'Somehow locked', + 'ger-DE' => 'Irgendwie gelockt', + ); + $updateStateStruct->descriptions = array( + 'eng-US' => 'The object is somehow locked', + 'ger-DE' => 'Sindelfingen', + ); + + $updatedObjectState = $objectStateService->updateObjectState( + $loadedObjectState, + $updateStateStruct + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $updatedObjectState + ); + + return array( + $loadedObjectState, + $updateStateStruct, + $updatedObjectState + ); + } + + /** + * Test for the updateObjectState() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::updateObjectState() + * @depends testUpdateObjectState + */ + public function testUpdateObjectStateThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $objectStateId = $this->generateId( 'objectstate', 2 ); + // $objectStateId contains the ID of the "locked" state + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + + $updateStateStruct = $objectStateService->newObjectStateUpdateStruct(); + // 'not_locked' is the identifier of already existing state + $updateStateStruct->identifier = 'not_locked'; + $updateStateStruct->defaultLanguageCode = 'ger-DE'; + $updateStateStruct->names = array( + 'eng-US' => 'Somehow locked', + 'ger-DE' => 'Irgendwie gelockt', + ); + $updateStateStruct->descriptions = array( + 'eng-US' => 'The object is somehow locked', + 'ger-DE' => 'Sindelfingen', + ); + + // This call will fail because state with + // 'not_locked' identifier already exists + $objectStateService->updateObjectState( + $loadedObjectState, + $updateStateStruct + ); + } + + /** + * testUpdateObjectStateStructValues + * + * @param array $testData + * + * @return void + * + * @depends testUpdateObjectState + */ + public function testUpdateObjectStateStructValues( array $testData ) + { + list( + $loadedObjectState, + $updateStateStruct, + $updatedObjectState + ) = $testData; + + $this->assertPropertiesCorrect( + array( + 'id' => $loadedObjectState->id, + 'identifier' => $updateStateStruct->identifier, + 'priority' => $loadedObjectState->priority, + 'defaultLanguageCode' => $updateStateStruct->defaultLanguageCode, + 'languageCodes' => array( 'eng-US', 'ger-DE' ), + 'names' => $updateStateStruct->names, + 'descriptions' => $updateStateStruct->descriptions, + ), + $updatedObjectState + ); + + $this->assertEquals( + $loadedObjectState->getObjectStateGroup(), + $updatedObjectState->getObjectStateGroup() + ); + } + + /** + * Test for the setPriorityOfObjectState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::setPriorityOfObjectState() + * @depends testLoadObjectState + */ + public function testSetPriorityOfObjectState() + { + $repository = $this->getRepository(); + + $objectStateId = $this->generateId( 'objectstate', 1 ); + /* BEGIN: Use Case */ + // $objectStateId contains the ID of the "not_locked" state + $objectStateService = $repository->getObjectStateService(); + + $initiallyLoadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + + // Sets the given priority on $initiallyLoadedObjectState + $objectStateService->setPriorityOfObjectState( + $initiallyLoadedObjectState, + 23 + ); + // $loadObjectState now has the priority 1, since object state + // priorities are always made sequential + $loadedObjectState = $objectStateService->loadObjectState( + $objectStateId + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $loadedObjectState + ); + $this->assertEquals( 1, $loadedObjectState->priority ); + } + + /** + * Test for the getContentState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::getContentState() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @depends testLoadObjectState + */ + public function testGetContentState() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + $ezLockObjectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the content ID of "Anonymous User" + $contentService = $repository->getContentService(); + $objectStateService = $repository->getObjectStateService(); + + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $ezLockObjectStateGroup = $objectStateService->loadObjectStateGroup( + $ezLockObjectStateGroupId + ); + + // Loads the state of $contentInfo in the "ez_lock" object state group + $ezLockObjectState = $objectStateService->getContentState( + $contentInfo, + $ezLockObjectStateGroup + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $ezLockObjectState + ); + $this->assertEquals( 'not_locked', $ezLockObjectState->identifier ); + } + + /** + * testGetInitialObjectState + * + * @return void + * + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @depends testLoadObjectState + */ + public function testGetInitialObjectState() + { + $repository = $this->getRepository(); + $objectStateService = $repository->getObjectStateService(); + + // Create object state group with custom state + $createdStateGroups = $this->createObjectStateGroups(); + + $customObjectStateGroupId = $createdStateGroups[1]->id; + $anonymousUserId = $this->generateId( 'user', 10 ); + + $customGroup = $objectStateService->loadObjectStateGroup( + $customObjectStateGroupId + ); + + $objectStateCreateStruct = $objectStateService->newObjectStateCreateStruct( + 'sindelfingen' + ); + $objectStateCreateStruct->priority = 1; + $objectStateCreateStruct->defaultLanguageCode = 'eng-US'; + $objectStateCreateStruct->names = array( 'eng-US' => 'Sindelfingen' ); + + $createdState = $objectStateService->createObjectState( + $customGroup, + $objectStateCreateStruct + ); + + // Store state ID to be used + $customObjectStateId = $createdState->id; + + /* BEGIN: Use Case */ + // $anonymousUserId is the content ID of "Anonymous User" + // $customObjectStateGroupId is the ID of a state group, from which no + // state has been assigned to $anonymousUserId, yet + $contentService = $repository->getContentService(); + $objectStateService = $repository->getObjectStateService(); + + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $customObjectStateGroup = $objectStateService->loadObjectStateGroup( + $customObjectStateGroupId + ); + + // Loads the initial state of the custom state group + $initialObjectState = $objectStateService->getContentState( + $contentInfo, + $customObjectStateGroup + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $initialObjectState + ); + $this->assertEquals( 'sindelfingen', $initialObjectState->identifier ); + $this->assertEquals( array( 'eng-US' => 'Sindelfingen' ), $initialObjectState->names ); + $this->assertEquals( 'eng-US', $initialObjectState->defaultLanguageCode ); + } + + /** + * Test for the setContentState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::setContentState() + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testLoadContentInfo + * @depends testLoadObjectState + */ + public function testSetContentState() + { + $repository = $this->getRepository(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + $ezLockObjectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + $lockedObjectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // $anonymousUserId is the content ID of "Anonymous User" + // $ezLockObjectStateGroupId contains the ID of the "ez_lock" object + // state group + // $lockedObjectStateId is the ID of the state "locked" + $contentService = $repository->getContentService(); + $objectStateService = $repository->getObjectStateService(); + + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $ezLockObjectStateGroup = $objectStateService->loadObjectStateGroup( + $ezLockObjectStateGroupId + ); + $lockedObjectState = $objectStateService->loadObjectState( $lockedObjectStateId ); + + // Sets the state of $contentInfo from "not_locked" to "locked" + $objectStateService->setContentState( + $contentInfo, + $ezLockObjectStateGroup, + $lockedObjectState + ); + /* END: Use Case */ + + $ezLockObjectState = $objectStateService->getContentState( + $contentInfo, + $ezLockObjectStateGroup + ); + + $this->assertEquals( 'locked', $ezLockObjectState->identifier ); + } + + /** + * Test for the setContentState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::setContentState() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends testSetContentState + */ + public function testSetContentStateThrowsInvalidArgumentExceptioon() + { + $repository = $this->getRepository(); + + $createdStateGroups = $this->createObjectStateGroups(); + + $anonymousUserId = $this->generateId( 'user', 10 ); + $differentObjectStateGroupId = $createdStateGroups[1]->id; + $lockedObjectStateId = $this->generateId( 'objectstate', 2 ); + + /* BEGIN: Use Case */ + // $anonymousUserId is the content ID of "Anonymous User" + // $differentObjectStateGroupId contains the ID of an object state + // group which does not contain $lockedObjectStateId + // $lockedObjectStateId is the ID of the state "locked" + $contentService = $repository->getContentService(); + $objectStateService = $repository->getObjectStateService(); + + $contentInfo = $contentService->loadContentInfo( $anonymousUserId ); + + $differentObjectStateGroup = $objectStateService->loadObjectStateGroup( + $differentObjectStateGroupId + ); + $lockedObjectState = $objectStateService->loadObjectState( $lockedObjectStateId ); + + // Throws an invalid argument exception since $lockedObjectState does + // not belong to $differentObjectStateGroup + $objectStateService->setContentState( + $contentInfo, + $differentObjectStateGroup, + $lockedObjectState + ); + /* END: Use Case */ + } + + /** + * Test for the getContentCount() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::getContentCount() + * @depends testLoadObjectState + */ + public function testGetContentCount() + { + $repository = $this->getRepository(); + + $notLockedObjectStateId = $this->generateId( 'objectstate', 1 ); + /* BEGIN: Use Case */ + // $notLockedObjectStateId is the ID of the state "not_locked" + $objectStateService = $repository->getObjectStateService(); + + $notLockedObjectState = $objectStateService->loadObjectState( $notLockedObjectStateId ); + + $objectCount = $objectStateService->getContentCount( $notLockedObjectState ); + /* END: Use Case */ + + $this->assertEquals( 18, $objectCount ); + } + + /** + * Test for the deleteObjectState() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::deleteObjectState() + * @depends testLoadObjectState + */ + public function testDeleteObjectState() + { + $repository = $this->getRepository(); + + $notLockedObjectStateId = $this->generateId( 'objectstate', 1 ); + $lockedObjectStateId = $this->generateId( 'objectstate', 2 ); + /* BEGIN: Use Case */ + // $notLockedObjectStateId is the ID of the state "not_locked" + $objectStateService = $repository->getObjectStateService(); + + $notLockedObjectState = $objectStateService->loadObjectState( $notLockedObjectStateId ); + + // Deletes the object state and sets all objects, which where in that + // state, to the first state of the same object state group + $objectStateService->deleteObjectState( $notLockedObjectState ); + /* END: Use Case */ + + $lockedObjectState = $objectStateService->loadObjectState( $lockedObjectStateId ); + + // All objects transferred + $this->assertEquals( + 18, + $objectStateService->getContentCount( $lockedObjectState ) + ); + } + + /** + * Test for the deleteObjectStateGroup() method. + * + * @return void + * + * @see \eZ\Publish\API\Repository\ObjectStateService::deleteObjectStateGroup() + * @depends testLoadObjectStateGroup + */ + public function testDeleteObjectStateGroup() + { + $repository = $this->getRepository(); + + $objectStateGroupId = $this->generateId( 'objectstategroup', 2 ); + /* BEGIN: Use Case */ + // $objectStateGroupId contains the ID of the standard object state + // group ez_lock. + $objectStateService = $repository->getObjectStateService(); + + $loadedObjectStateGroup = $objectStateService->loadObjectStateGroup( + $objectStateGroupId + ); + + $objectStateService->deleteObjectStateGroup( $loadedObjectStateGroup ); + /* END: Use Case */ + + try + { + $objectStateService->loadObjectStateGroup( $objectStateGroupId ); + $this->fail( + sprintf( + 'ObjectStateGroup with ID "%s" not deleted.', + $objectStateGroupId + ) + ); + } + catch ( NotFoundException $e ) + { + } + } +} diff --git a/eZ/Publish/API/Repository/Tests/README.rst b/eZ/Publish/API/Repository/Tests/README.rst new file mode 100644 index 0000000..f3c5b8e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/README.rst @@ -0,0 +1,38 @@ +================================ +Using the Integration Test Suite +================================ + +The Integration Test Suite can be used to verify the functionality of the Public +API with different back ends. In general, you just need a working *PHPUnit* in +order to run the tests. + +The Integration Test Suite ships with a memory back end, which can deal as a +verification step that the test suite itself runs. + +In order to run any of the tests, you need to copy the +``config.php-DEVELOPMENT`` configuration file in the ``ezp-next`` directory into +a ``config.php`` file. + +--------------- +Memory Back End +--------------- + +To run the Integration Test Suite against the Memory Back End, you just need to +run ``phpunit`` inside this directory. This should result in a fully successful +run of the suite. + +----------------- +Database Back End +----------------- + +To run the test suite against the real world implementation, use the alternative +``phpunit-legacy.xml`` as the configuration for PHPUnit. +Beware that you need to have set the correct path to your eZ Publish Legacy instance +(from ``ezpublish5-integration`` branch) in ``config.php``. + +After that, use the following command to run the tests:: + + phpunit -c phpunit-legacy.xml + +Any problems occurring during the run should be issues in the Public API +implementation, as long as `Memory Back End`_ runs correctly. diff --git a/eZ/Publish/API/Repository/Tests/RepositoryTest.php b/eZ/Publish/API/Repository/Tests/RepositoryTest.php new file mode 100644 index 0000000..90af29e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/RepositoryTest.php @@ -0,0 +1,319 @@ +getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\ContentService', + $repository->getContentService() + ); + } + + /** + * Test for the getContentLanguageService() method. + * + * @return void + * @group content-language + * @see \eZ\Publish\API\Repository\Repository::getContentLanguageService() + */ + public function testGetContentLanguageService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\LanguageService', + $repository->getContentLanguageService() + ); + } + + /** + * Test for the getContentTypeService() method. + * + * @return void + * @group content-type + * @group field-type + * @group user + * @see \eZ\Publish\API\Repository\Repository::getContentTypeService() + * + */ + public function testGetContentTypeService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\ContentTypeService', + $repository->getContentTypeService() + ); + } + + /** + * Test for the getLocationService() method. + * + * @return void + * @group location + * @see \eZ\Publish\API\Repository\Repository::getLocationService() + * + */ + public function testGetLocationService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\LocationService', + $repository->getLocationService() + ); + } + + /** + * Test for the getTrashService() method. + * + * @return void + * @group trash + * @see \eZ\Publish\API\Repository\Repository::getTrashService() + * + */ + public function testGetTrashService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\TrashService', + $repository->getTrashService() + ); + } + + /** + * Test for the getSectionService() method. + * + * @return void + * @group section + * @see \eZ\Publish\API\Repository\Repository::getSectionService() + */ + public function testGetSectionService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\SectionService', + $repository->getSectionService() + ); + } + + /** + * Test for the getUserService() method. + * + * @return void + * @group user + * @see \eZ\Publish\API\Repository\Repository::getUserService() + */ + public function testGetUserService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\UserService', + $repository->getUserService() + ); + } + + /** + * Test for the getRoleService() method. + * + * @return void + * @group role + * @see \eZ\Publish\API\Repository\Repository::getRoleService() + */ + public function testGetRoleService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\RoleService', + $repository->getRoleService() + ); + } + + /** + * Test for the getUrlAliasService() method. + * + * @return void + * @group url-alias + * @see \eZ\Publish\API\Repository\Repository::getUrlAliasService() + */ + public function testGetURLAliasService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\URLAliasService', + $repository->getURLAliasService() + ); + } + + /** + * Test for the getUrlWildcardService() method. + * + * @return void + * @group url-wildcard + * @see \eZ\Publish\API\Repository\Repository::getUrlWildcardService() + */ + public function testGetURLWildcardService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\URLWildcardService', + $repository->getURLWildcardService() + ); + } + + /** + * Test for the getObjectStateService() + * + * @return void + * @group object-state + * @see \eZ\Publish\API\Repository\Repository::getObjectStateService() + */ + public function testGetObjectStateService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\ObjectStateService', + $repository->getObjectStateService() + ); + } + + /** + * Test for the getFieldTypeService() + * + * @return void + * @group object-state + * @see \eZ\Publish\API\Repository\Repository::getFieldTypeService() + */ + public function testGetFieldTypeService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\FieldTypeService', + $repository->getFieldTypeService() + ); + } + + /** + * Test for the getIOService() method. + * + * @return void + * @group io + * @see \eZ\Publish\API\Repository\Repository::getIOService() + */ + public function testGetIOService() + { + $repository = $this->getRepository(); + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\IOService', + $repository->getIOService() + ); + } + + /** + * Test for the getSearchService() method. + * + * @return void + * @group search + * @see \eZ\Publish\API\Repository\Repository::getSearchService() + */ + public function testGetSearchService() + { + $repository = $this->getRepository(); + + if ( $repository instanceof \eZ\Publish\API\Repository\Tests\Stubs\RepositoryStub ) + { + $this->markTestSkipped( 'SearchService is not available in the memory implementation.' ); + } + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\SearchService', + $repository->getSearchService() + ); + } + + /** + * Test for the commit() method. + * + * @see \eZ\Publish\API\Repository\Repository::commit() + * + * @return void + */ + public function testCommit() + { + $repository = $this->getRepository(); + + try + { + $repository->beginTransaction(); + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + } + + /** + * Test for the commit() method. + * + * @return void + * @see \eZ\Publish\API\Repository\Repository::commit() + * @expectedException \RuntimeException + */ + public function testCommitThrowsRuntimeException() + { + $repository = $this->getRepository(); + $repository->commit(); + } + + /** + * Test for the rollback() method. + * + * @see \eZ\Publish\API\Repository\Repository::rollback() + * + * @return void + */ + public function testRollback() + { + $repository = $this->getRepository(); + $repository->beginTransaction(); + $repository->rollback(); + } + + /** + * Test for the rollback() method. + * + * @return void + * @see \eZ\Publish\API\Repository\Repository::rollback() + * @expectedException \RuntimeException + */ + public function testRollbackThrowsRuntimeException() + { + $repository = $this->getRepository(); + $repository->rollback(); + } +} diff --git a/eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php new file mode 100644 index 0000000..14582cf --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php @@ -0,0 +1,613 @@ +getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // Get the role service + $roleService = $repository->getRoleService(); + + // Instantiate a role create struct. + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + // This call will fail with an "UnauthorizedException" + $roleService->createRole( $roleCreate ); + /* END: Use Case */ + } + + /** + * Test for the loadRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRole() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRole + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadRoleThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->loadRole( $role->id ); + /* END: Use Case */ + } + + /** + * Test for the loadRoleByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRoleByIdentifier() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoleByIdentifier + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadRoleByIdentifierThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->loadRoleByIdentifier( $role->identifier ); + /* END: Use Case */ + } + + /** + * Test for the loadRoles() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRoles() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoles + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadRolesThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // Get the role service + $roleService = $repository->getRoleService(); + + // This call will fail with an "UnauthorizedException" + $roleService->loadRoles(); + /* END: Use Case */ + } + + /** + * Test for the updateRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::updateRole() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUpdateRole + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testUpdateRoleThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // Get a new role update struct and set new values + $roleUpdateStruct = $roleService->newRoleUpdateStruct(); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleUpdateStruct->mainLanguageCode = 'eng-US'; + + // This call will fail with an "UnauthorizedException" + $roleService->updateRole( $role, $roleUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the deleteRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::deleteRole() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testDeleteRole + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testDeleteRoleThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->deleteRole( $role ); + /* END: Use Case */ + } + + /** + * Test for the addPolicy() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::addPolicy() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAddPolicy + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testAddPolicyThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'content', 'delete' ) + ); + /* END: Use Case */ + } + + /** + * Test for the updatePolicy() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::updatePolicy() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUpdatePolicy + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testUpdatePolicyThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Get first role policy + $policies = $role->getPolicies(); + $policy = reset( $policies ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // Get a policy update struct and add a limitation + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/' ) + ) + ) + ); + + // This call will fail with an "UnauthorizedException" + $roleService->updatePolicy( $policy, $policyUpdate ); + /* END: Use Case */ + } + + /** + * Test for the removePolicy() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::removePolicy() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testRemovePolicy + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testRemovePolicyThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Get first role policy + $policies = $role->getPolicies(); + $policy = reset( $policies ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->removePolicy( $role, $policy ); + /* END: Use Case */ + } + + /** + * Test for the assignRoleToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testAssignRoleToUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + $roleService = $repository->getRoleService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Load the "Editors" user group + $userGroup = $userService->loadUserGroup( $editorsGroupId ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->assignRoleToUserGroup( $role, $userGroup ); + /* END: Use Case */ + } + + /** + * Test for the assignRoleToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUserGroup($role, $userGroup, $roleLimitation) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testAssignRoleToUserGroupThrowsUnauthorizedExceptionWithRoleLimitationParameter() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + $roleService = $repository->getRoleService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Load the "Editors" user group + $userGroup = $userService->loadUserGroup( $editorsGroupId ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // Create a subtree role limitation + $limitation = new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/2/' ) + ) + ); + + // This call will fail with an "UnauthorizedException" + $roleService->assignRoleToUserGroup( $role, $userGroup, $limitation ); + /* END: Use Case */ + } + + /** + * Test for the unassignRoleFromUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::unassignRoleFromUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUnassignRoleFromUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testUnassignRoleFromUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + $roleService = $repository->getRoleService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Load the "Editors" user group + $userGroup = $userService->loadUserGroup( $editorsGroupId ); + + // Assign new role to "Editors" user group + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->unassignRoleFromUserGroup( $role, $userGroup ); + /* END: Use Case */ + } + + /** + * Test for the assignRoleToUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUser + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testAssignRoleToUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->assignRoleToUser( $role, $user ); + /* END: Use Case */ + } + + /** + * Test for the assignRoleToUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUser($role, $user, $roleLimitation) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUser + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testAssignRoleToUserThrowsUnauthorizedExceptionWithRoleLimitationParameter() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // Create a subtree role limitation + $limitation = new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/2/' ) + ) + ); + + // This call will fail with an "UnauthorizedException" + $roleService->assignRoleToUser( $role, $user, $limitation ); + /* END: Use Case */ + } + + /** + * Test for the unassignRoleFromUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::unassignRoleFromUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUnassignRoleFromUser + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testUnassignRoleFromUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Assign new role to "Editor" user + $roleService->assignRoleToUser( $role, $user ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->unassignRoleFromUser( $role, $user ); + /* END: Use Case */ + } + + /** + * Test for the getRoleAssignments() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignments() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testGetRoleAssignments + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testGetRoleAssignmentsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $role = $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + } + + /** + * Test for the getRoleAssignmentsForUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignmentsForUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testGetRoleAssignmentsForUser + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testGetRoleAssignmentsForUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $this->createRole(); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->getRoleAssignmentsForUser( $user ); + /* END: Use Case */ + } + + /** + * Test for the getRoleAssignmentsForUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignmentsForUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testGetRoleAssignmentsForUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testGetRoleAssignmentsForUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + $userService = $repository->getUserService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $this->createRole(); + + // Load the "Editors" user group + $userGroup = $userService->loadUserGroup( $editorsGroupId ); + + // Set "Editor" user as current user. + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $roleService->getRoleAssignmentsForUserGroup( $userGroup ); + /* END: Use Case */ + } + + /** + * Create a role fixture in a variable named $role, + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + private function createRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + // Get the role service + $roleService = $repository->getRoleService(); + + // Get new policy create struct + $policyCreate = $roleService->newPolicyCreateStruct( 'content', '*' ); + + // Get a role create struct instance and set properties + $roleCreate = $roleService->newRoleCreateStruct( 'testRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-GB'; + + $roleCreate->addPolicy( $policyCreate ); + + // Create a new role instance. + $role = $roleService->createRole( $roleCreate ); + /* END: Inline */ + + return $role; + } +} diff --git a/eZ/Publish/API/Repository/Tests/RoleServiceTest.php b/eZ/Publish/API/Repository/Tests/RoleServiceTest.php new file mode 100644 index 0000000..92e0300 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/RoleServiceTest.php @@ -0,0 +1,1431 @@ + + *
  • + * ContentType + *
      + *
    • 28: File
    • + *
    • 29: Flash
    • + *
    • 30: Image
    • + *
    + *
  • + *
      + * + * @see eZ\Publish\API\Repository\RoleService + * @group role + */ +class RoleServiceTest extends BaseTest +{ + /** + * Test for the newRoleCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::newRoleCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetRoleService + */ + public function testNewRoleCreateStruct() + { + $repository = $this->getRepository(); + + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\RoleCreateStruct', $roleCreate ); + } + + /** + * Test for the newRoleCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::newRoleCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewRoleCreateStruct + */ + public function testNewRoleCreateStructSetsNamePropertyOnStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + /* END: Use Case */ + + $this->assertEquals( 'roleName', $roleCreate->identifier ); + } + + /** + * Test for the createRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::createRole() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewRoleCreateStruct + */ + public function testCreateRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\Role', + $role + ); + } + + /** + * Test for the createRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::createRole() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRole + */ + public function testCreateRoleThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'Editor' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + // This call will fail with an InvalidArgumentException, because Editor exists + $roleService->createRole( $roleCreate ); + + /* END: Use Case */ + } + + /** + * Test for the createRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::createRole() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewRoleCreateStruct + */ + public function testCreateRoleInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + + $repository->beginTransaction(); + + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $createdRoleId = $roleService->createRole( $roleCreate )->id; + + $repository->rollback(); + + try + { + // This call will fail with a "NotFoundException" + $role = $roleService->loadRole( $createdRoleId ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'Role object still exists after rollback.' ); + } + + /** + * Test for the loadRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRole() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRole + */ + public function testLoadRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $roleId = $roleService->createRole( $roleCreate )->id; + + // Load the newly create role by it's name + $role = $roleService->loadRole( $roleId ); + + /* END: Use Case */ + + $this->assertEquals( 'roleName', $role->identifier ); + } + + /** + * Test for the loadRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRole() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRole + */ + public function testLoadRoleThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingRoleId = $this->generateId( 'role', PHP_INT_MAX ); + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + + // This call will fail with a NotFoundException, because no such role exists. + $roleService->loadRole( $nonExistingRoleId ); + + /* END: Use Case */ + } + + /** + * Test for the loadRoleByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRoleByIdentifier() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRole + */ + public function testLoadRoleByIdentifier() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $roleService->createRole( $roleCreate ); + + // Load the newly create role by it's name + $role = $roleService->loadRoleByIdentifier( 'roleName' ); + + /* END: Use Case */ + + $this->assertEquals( 'roleName', $role->identifier ); + } + + /** + * Test for the loadRoleByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRoleByIdentifier() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoleByIdentifier + */ + public function testLoadRoleByIdentifierThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + $roleService = $repository->getRoleService(); + + // This call will fail with a NotFoundException, because no such role exists. + $roleService->loadRoleByIdentifier( 'MissingRole' ); + + /* END: Use Case */ + } + + /** + * Test for the loadRoles() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRoles() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRole + */ + public function testLoadRoles() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + + // First create a custom role + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'roleName' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + // Now load all available roles + $roles = $roleService->loadRoles(); + + foreach ( $roles as $role ) + { + if ( $role->identifier === 'roleName' ) + { + break; + } + } + + /* END: Use Case */ + + $this->assertEquals( 'roleName', $role->identifier ); + } + + /** + * Test for the loadRoles() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadRoles() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoles + */ + public function testLoadRolesReturnsExpectedSetOfDefaultRoles() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + $roles = $roleService->loadRoles(); + + $roleNames = array(); + foreach ( $roles as $role ) + { + $roleNames[] = $role->identifier; + } + /* END: Use Case */ + + sort( $roleNames ); + + $this->assertEquals( + array( + 'Administrator', + 'Anonymous', + 'Editor', + 'Member', + 'Partner' + ), + $roleNames + ); + } + + /** + * Test for the newRoleUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::newRoleUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetRoleService + */ + public function testNewRoleUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $roleUpdate = $roleService->newRoleUpdateStruct( 'newRole' ); + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\RoleUpdateStruct', $roleUpdate ); + } + + /** + * Test for the updateRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::updateRole() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewRoleUpdateStruct + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoleByIdentifier + */ + public function testUpdateRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + $roleUpdate = $roleService->newRoleUpdateStruct(); + $roleUpdate->identifier = 'updatedRole'; + + $updatedRole = $roleService->updateRole( $role, $roleUpdate ); + /* END: Use Case */ + + // Now verify that our change was saved + $role = $roleService->loadRoleByIdentifier( 'updatedRole' ); + + $this->assertEquals( $role->id, $updatedRole->id ); + } + + /** + * Test for the updateRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::updateRole() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUpdateRole + */ + public function testUpdateRoleThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + $roleUpdate = $roleService->newRoleUpdateStruct(); + $roleUpdate->identifier = 'Editor'; + + // This call will fail with an InvalidArgumentException, because Editor is a predefined role + $roleService->updateRole( $role, $roleUpdate ); + /* END: Use Case */ + } + + /** + * Test for the deleteRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::deleteRole() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRole + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoles + */ + public function testDeleteRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + $roleService->deleteRole( $role ); + /* END: Use Case */ + + $this->assertEquals( 5, count( $roleService->loadRoles() ) ); + } + + /** + * Test for the newPolicyCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::newPolicyCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetRoleService + */ + public function testNewPolicyCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\PolicyCreateStruct', $policyCreate ); + } + + /** + * Test for the newPolicyCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::newPolicyCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewPolicyCreateStruct + */ + public function testNewPolicyCreateStructSetsStructProperties() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + /* END: Use Case */ + + $this->assertEquals( + array( 'content', 'create' ), + array( $policyCreate->module, $policyCreate->function ) + ); + } + + /** + * Test for the addPolicy() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::addPolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoleByIdentifier + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewPolicyCreateStruct + */ + public function testAddPolicy() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + $role = $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'content', 'delete' ) + ); + $role = $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'content', 'create' ) + ); + /* END: Use Case */ + + $actual = array(); + foreach ( $role->getPolicies() as $policy ) + { + $actual[] = array( + 'module' => $policy->module, + 'function' => $policy->function + ); + } + usort( + $actual, + function ( $p1, $p2 ) + { + return strcasecmp( $p1['function'], $p2['function'] ); + } + ); + + $this->assertEquals( + array( + array( + 'module' => 'content', + 'function' => 'create', + ), + array( + 'module' => 'content', + 'function' => 'delete', + ) + ), + $actual + ); + } + + /** + * Test for the addPolicy() method. + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + * @see \eZ\Publish\API\Repository\RoleService::addPolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAddPolicy + */ + public function testAddPolicyUpdatesRole() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $role = $roleService->createRole( $roleCreate ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $role = $roleService->addPolicy( $role, $policyCreate ); + + $policy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( $policy->module === 'content' && $policy->function === 'create' ) + { + break; + } + } + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\Policy', + $policy + ); + + return array( $role, $policy ); + } + + /** + * Test for the addPolicy() method. + * + * @param array $roleAndPolicy + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::addPolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAddPolicyUpdatesRole + */ + public function testAddPolicySetsPolicyProperties( $roleAndPolicy ) + { + list( $role, $policy ) = $roleAndPolicy; + + $this->assertEquals( + array( $role->id, 'content', 'create' ), + array( $policy->roleId, $policy->module, $policy->function ) + ); + } + + /** + * Test for the createRole() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::createRole() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAddPolicyUpdatesRole + */ + public function testCreateRoleWithAddPolicy() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + // Instantiate a new create struct + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + // Add some role policies + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( + 'content', + 'read' + ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( + 'content', + 'translate' + ) + ); + + // Create new role instance + $role = $roleService->createRole( $roleCreate ); + + $policies = array(); + foreach ( $role->getPolicies() as $policy ) + { + $policies[] = array( 'module' => $policy->module, 'function' => $policy->function ); + } + /* END: Use Case */ + + $this->assertEquals( + array( + array( + 'module' => 'content', + 'function' => 'read' + ), + array( + 'module' => 'content', + 'function' => 'translate' + ) + ), + $policies + ); + } + + /** + * Test for the newPolicyUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::newPolicyUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetRoleService + */ + public function testNewPolicyUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + $policyUpdate = $roleService->newPolicyUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct', + $policyUpdate + ); + } + + /** + * Test for the updatePolicy() method. + * + * @return array + * @see \eZ\Publish\API\Repository\RoleService::updatePolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAddPolicy + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testNewPolicyUpdateStruct + */ + public function testUpdatePolicy() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + // Instantiate new policy create + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'translate' ); + + // Add some limitations for the new policy + $policyCreate->addLimitation( + new LanguageLimitation( + array( + 'limitationValues' => array( 28, 29 ) + ) + ) + ); + + // Instantiate a role create and add the policy create + $roleCreate = $roleService->newRoleCreateStruct( 'myRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $roleCreate->addPolicy( $policyCreate ); + + // Create a new role instance. + $role = $roleService->createRole( $roleCreate ); + + // Search for the new policy instance + $policy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( $policy->module === 'content' && $policy->function === 'translate' ) + { + break; + } + } + + // Create an update struct and set a modified limitation + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new ContentTypeLimitation( + array( + 'limitationValues' => array( 29, 30 ) + ) + ) + ); + + // Update the the policy + $policy = $roleService->updatePolicy( $policy, $policyUpdate ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\Policy', + $policy + ); + + return array( $roleService->loadRole( $role->id ), $policy ); + } + + /** + * Test for the updatePolicy() method. + * + * @param array $roleAndPolicy + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::updatePolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUpdatePolicy + */ + public function testUpdatePolicyUpdatesLimitations( $roleAndPolicy ) + { + list( $role, $policy ) = $roleAndPolicy; + + $this->assertEquals( + array( + new ContentTypeLimitation( + array( + 'limitationValues' => array( 29, 30 ) + ) + ) + ), + $policy->getLimitations() + ); + + return $role; + } + + /** + * Test for the updatePolicy() method. + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::updatePolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUpdatePolicyUpdatesLimitations + */ + public function testUpdatePolicyUpdatesRole( $role ) + { + $limitations = array(); + foreach ( $role->getPolicies() as $policy ) + { + foreach ( $policy->getLimitations() as $limitation ) + { + $limitations[] = $limitation; + } + } + + $this->assertEquals( + array( + new ContentTypeLimitation( + array( + 'limitationValues' => array( 29, 30 ) + ) + ) + ), + $limitations + ); + } + + /** + * Test for the removePolicy() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::removePolicy() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAddPolicy + */ + public function testRemovePolicy() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + // Instantiate a new role create + $roleCreate = $roleService->newRoleCreateStruct( 'newRole' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + // Create a new role with two policies + $role = $roleService->createRole( + $roleCreate, + array( + $roleService->newPolicyCreateStruct( 'content', 'create' ), + $roleService->newPolicyCreateStruct( 'content', 'delete' ), + ) + ); + + // Delete all policies from the new role + foreach ( $role->getPolicies() as $policy ) + { + $role = $roleService->removePolicy( $role, $policy ); + } + /* END: Use Case */ + + $this->assertSame( array(), $role->getPolicies() ); + } + + /** + * Test for the getRoleAssignments() method. + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignments() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadRoleByIdentifier + */ + public function testGetRoleAssignments() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + // Load the editor role + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + // Load all assigned users and user groups + $roleAssignments = $roleService->getRoleAssignments( $role ); + + /* END: Use Case */ + + $this->assertEquals( 1, count( $roleAssignments ) ); + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment', + reset( $roleAssignments ) + ); + + return $roleAssignments; + } + + /** + * Test for the getRoleAssignments() method. + * + * @param \eZ\Publish\API\Repository\Values\User\RoleAssignment[] $roleAssignments + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignments() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testGetRoleAssignments + */ + public function testGetRoleAssignmentsContainExpectedLimitation( array $roleAssignments ) + { + $this->assertEquals( + 'Subtree', + reset( $roleAssignments )->limitation->getIdentifier() + ); + } + + /** + * Test for the assignRoleToUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUser() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testGetRoleAssignments + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testAssignRoleToUser() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the existing "Administrator" role + $role = $roleService->loadRoleByIdentifier( 'Administrator' ); + + // Assign the "Administrator" role to the newly created user + $roleService->assignRoleToUser( $role, $user ); + + // The assignments array will contain the new role<->user assignment + $roleAssignments = $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + + // Administrator + Example User + $this->assertEquals( 2, count( $roleAssignments ) ); + } + + /** + * Test for the assignRoleToUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUser($role, $user, $roleLimitation) + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUser + */ + public function testAssignRoleToUserWithRoleLimitation() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the existing "Anonymous" role + $role = $roleService->loadRoleByIdentifier( 'Anonymous' ); + + // Assign the "Anonymous" role to the newly created user + $roleService->assignRoleToUser( + $role, + $user, + new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/43/' ) + ) + ) + ); + + // The assignments array will contain the new role<->user assignment + $roleAssignments = $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + + // Members + Partners + Anonymous + Example User + $this->assertEquals( 4, count( $roleAssignments ) ); + + // Get the role limitation + $roleLimitation = null; + foreach ( $roleAssignments as $roleAssignment ) + { + $roleLimitation = $roleAssignment->getRoleLimitation(); + if ( $roleLimitation ) + { + break; + } + } + + $this->assertEquals( + new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/43/' ) + ) + ), + $roleLimitation + ); + } + + /** + * Test for the unassignRoleFromUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::unassignRoleFromUser() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUser + */ + public function testUnassignRoleFromUser() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the existing "Member" role + $role = $roleService->loadRoleByIdentifier( 'Member' ); + + // Assign the "Member" role to the newly created user + $roleService->assignRoleToUser( $role, $user ); + + // Unassign user from role + $roleService->unassignRoleFromUser( $role, $user ); + + // The assignments array will not contain the new role<->user assignment + $roleAssignments = $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + + // Members + Editors + Partners + $this->assertEquals( 3, count( $roleAssignments ) ); + } + + /** + * Test for the unassignRoleFromUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::unassignRoleFromUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUnassignRoleFromUserThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the existing "Member" role + $role = $roleService->loadRoleByIdentifier( 'Member' ); + + // This call will fail with a "InvalidArgumentException", because the + // user does not have the "Member" role. + $roleService->unassignRoleFromUser( $role, $user ); + /* END: Use Case */ + } + + /** + * Test for the getRoleAssignmentsForUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignmentsForUser() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUser + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRoleWithAddPolicy + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testGetRoleAssignmentsForUser() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Instantiate a role create and add some policies + $roleCreate = $roleService->newRoleCreateStruct( 'Example Role' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'user', 'login' ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'content', 'read' ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'content', 'edit' ) + ); + + // Create the new role instance + $role = $roleService->createRole( $roleCreate ); + + // Assign role to new user + $roleService->assignRoleToUser( $role, $user ); + + // Load the currently assigned role + $roleAssignments = $roleService->getRoleAssignmentsForUser( $user ); + /* END: Use Case */ + + $this->assertEquals( 1, count( $roleAssignments ) ); + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserRoleAssignment', + reset( $roleAssignments ) + ); + } + + /** + * Test for the assignRoleToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUserGroup() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testGetRoleAssignments + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testAssignRoleToUserGroup() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the existing "Administrator" role + $role = $roleService->loadRoleByIdentifier( 'Administrator' ); + + // Assign the "Administrator" role to the newly created user group + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + // The assignments array will contain the new role<->group assignment + $roleAssignments = $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + + // Administrator + Example Group + $this->assertEquals( 2, count( $roleAssignments ) ); + } + + /** + * Test for the assignRoleToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::assignRoleToUserGroup($role, $userGroup, $roleLimitation) + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUserGroup + */ + public function testAssignRoleToUserGroupWithRoleLimitation() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the existing "Anonymous" role + $role = $roleService->loadRoleByIdentifier( 'Anonymous' ); + + // Assign the "Anonymous" role to the newly created user group + $roleService->assignRoleToUserGroup( + $role, + $userGroup, + new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/43/' ) + ) + ) + ); + + // The assignments array will contain the new role<->group assignment + $roleAssignments = $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + + // Members + Partners + Anonymous + Example Group + $this->assertEquals( 4, count( $roleAssignments ) ); + + // Get the role limitation + $roleLimitation = null; + foreach ( $roleAssignments as $roleAssignment ) + { + $roleLimitation = $roleAssignment->getRoleLimitation(); + if ( $roleLimitation ) + { + break; + } + } + + $this->assertEquals( + new SubtreeLimitation( + array( + 'limitationValues' => array( '/1/43/' ) + ) + ), + $roleLimitation + ); + } + + /** + * Test for the unassignRoleFromUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::unassignRoleFromUserGroup() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUserGroup + */ + public function testUnassignRoleFromUserGroup() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the existing "Member" role + $role = $roleService->loadRoleByIdentifier( 'Member' ); + + // Assign the "Member" role to the newly created user group + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + // Unassign group from role + $roleService->unassignRoleFromUserGroup( $role, $userGroup ); + + // The assignments array will not contain the new role<->group assignment + $roleAssignments = $roleService->getRoleAssignments( $role ); + /* END: Use Case */ + + // Members + Editors + Partners + $this->assertEquals( 3, count( $roleAssignments ) ); + } + + /** + * Test for the unassignRoleFromUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::unassignRoleFromUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testUnassignRoleFromUserGroup + */ + public function testUnassignRoleFromUserGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the existing "Member" role + $role = $roleService->loadRoleByIdentifier( 'Member' ); + + // This call will fail with a "InvalidArgumentException", because the + // user group does not have the "Member" role. + $roleService->unassignRoleFromUserGroup( $role, $userGroup ); + /* END: Use Case */ + } + + /** + * Test for the getRoleAssignmentsForUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::getRoleAssignmentsForUserGroup() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUserGroup + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testCreateRoleWithAddPolicy + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testGetRoleAssignmentsForUserGroup() + { + $repository = $this->getRepository(); + $roleService = $repository->getRoleService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Instantiate a role create and add some policies + $roleCreate = $roleService->newRoleCreateStruct( 'Example Role' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'user', 'login' ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'content', 'read' ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'content', 'edit' ) + ); + + // Create the new role instance + $role = $roleService->createRole( $roleCreate ); + + // Assign role to new user group + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + // Load the currently assigned role + $roleAssignments = $roleService->getRoleAssignmentsForUserGroup( $userGroup ); + /* END: Use Case */ + + $this->assertEquals( 1, count( $roleAssignments ) ); + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment', + reset( $roleAssignments ) + ); + } + + /** + * Test for the loadPoliciesByUserId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadPoliciesByUserId() + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUser + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testAssignRoleToUserGroup + */ + public function testLoadPoliciesByUserId() + { + $repository = $this->getRepository(); + + $anonUserId = $this->generateId( 'user', 10 ); + /* BEGIN: Use Case */ + // $anonUserId is the ID of the "Anonymous" user. + + $userService = $repository->getUserService(); + $roleService = $repository->getRoleService(); + + // Load "Anonymous" user + $user = $userService->loadUser( $anonUserId ); + + // Instantiate a role create and add some policies + $roleCreate = $roleService->newRoleCreateStruct( 'User Role' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreate->mainLanguageCode = 'eng-US'; + + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'notification', 'use' ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'user', 'password' ) + ); + $roleCreate->addPolicy( + $roleService->newPolicyCreateStruct( 'user', 'selfedit' ) + ); + + // Create the new role instance + $role = $roleService->createRole( $roleCreate ); + + // Assign role to anon user + $roleService->assignRoleToUser( $role, $user ); + + // Load the currently assigned role + $policies = array(); + foreach ( $roleService->loadPoliciesByUserId( $user->id ) as $policy ) + { + $policies[] = array( $policy->roleId, $policy->module, $policy->function ); + } + /* END: Use Case */ + array_multisort( $policies ); + + $this->assertEquals( + array( + array( 1, 'content', 'pdf' ), + array( 1, 'content', 'read' ), + array( 1, 'content', 'read' ), + array( 1, 'rss', 'feed' ), + array( 1, 'user', 'login' ), + array( 1, 'user', 'login' ), + array( 1, 'user', 'login' ), + array( 1, 'user', 'login' ), + array( $role->id, 'notification', 'use' ), + array( $role->id, 'user', 'password' ), + array( $role->id, 'user', 'selfedit' ), + ), + $policies + ); + } + + /** + * Test for the loadPoliciesByUserId() method. + * + * @return void + * @see \eZ\Publish\API\Repository\RoleService::loadPoliciesByUserId() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\RoleServiceTest::testLoadPoliciesByUserId + */ + public function testLoadPoliciesByUserIdThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingUserId = $this->generateId( 'user', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $roleService = $repository->getRoleService(); + + // This call will fail with a "NotFoundException", because hopefully no + // user with an ID equal to PHP_INT_MAX exists. + $roleService->loadPoliciesByUserId( $nonExistingUserId ); + /* END: Use Case */ + } + + /** + * Create a user group fixture in a variable named $userGroup, + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + private function createUserGroupVersion1() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Inline */ + // $mainGroupId is the ID of the main "Users" group + + $roleService = $repository->getRoleService(); + $userService = $repository->getUserService(); + + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', 'Example Group' ); + + // Create the new user group + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $parentUserGroup + ); + /* END: Inline */ + + return $userGroup; + } +} diff --git a/eZ/Publish/API/Repository/Tests/SearchServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/SearchServiceAuthorizationTest.php new file mode 100644 index 0000000..a60e860 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SearchServiceAuthorizationTest.php @@ -0,0 +1,114 @@ +getRepository(); + + /* BEGIN: Use Case */ + $searchService = $repository->getSearchService(); + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // Should return Content with location id: 2 as the anonymous user should have access to standard section + $searchResult = $searchService->findContent( new Query( array( 'criterion' => new Criterion\LocationId( 2 ) ) ) ); + /* END: Use Case */ + + self::assertEquals( 1, $searchResult->totalCount, "Search query should return totalCount of 1" ); + self::assertNotEmpty( $searchResult->searchHits, "\$searchResult->searchHits should not be empty" ); + self::assertEquals( "Home", $searchResult->searchHits[0]->valueObject->contentInfo->name ); + } + + /** + * Test for the findContent() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SearchService::findContent() + * @depends eZ\Publish\API\Repository\Tests\SearchServiceTest::testFindContent + */ + public function testFindContentEmptyResult() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $searchService = $repository->getSearchService(); + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will return an empty search result + $searchResult = $searchService->findContent( new Query( array( 'criterion' => new Criterion\LocationId( 5 ) ) ) ); + /* END: Use Case */ + + self::assertEmpty( + $searchResult->searchHits, + "Expected Not Found exception, got content with name: " . + (!empty($searchResult->searchHits) ? $searchResult->searchHits[0]->valueObject->contentInfo->name : '') + ); + self::assertEquals( 0, $searchResult->totalCount, "Search query should return totalCount of 0" ); + } + + /** + * Test for the findSingle() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SearchService::findSingle() + * @expectedException eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\SearchServiceTest::testFindSingle + */ + public function testFindSingleThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $searchService = $repository->getSearchService(); + $userService = $repository->getUserService(); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "NotFoundException" as user does not have access + $searchService->findSingle( + new Criterion\ContentId( + array( 4 ) + ) + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/SearchServiceTest.php b/eZ/Publish/API/Repository/Tests/SearchServiceTest.php new file mode 100644 index 0000000..9f8eebb --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SearchServiceTest.php @@ -0,0 +1,968 @@ +getFixtureDir(); + return array( + array( + new Query( + array( + 'criterion' => new Criterion\ContentId( + array( 1, 4, 10 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'ContentId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\LogicalAnd( + array( + new Criterion\ContentId( + array( 1, 4, 10 ) + ), + new Criterion\ContentId( + array( 4, 12 ) + ), + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'LogicalAnd.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\LogicalOr( + array( + new Criterion\ContentId( + array( 1, 4, 10 ) + ), + new Criterion\ContentId( + array( 4, 12 ) + ), + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'LogicalOr.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\LogicalAnd( + array( + new Criterion\ContentId( + array( 1, 4, 10 ) + ), + new Criterion\LogicalNot( + new Criterion\ContentId( + array( 10, 12 ) + ) + ), + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'LogicalNot.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\Subtree( + '/1/5/' + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'Subtree.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\ContentTypeId( + 4 + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'ContentTypeId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\ContentTypeGroupId( + 2 + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'ContentTypeGroupId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::GT, + 1343140540 + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'DateMetadataGt.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::GTE, + 1311154215 + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'DateMetadataGte.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::LTE, + 1311154215 + ), + 'limit' => 10, + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'DateMetadataLte.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::IN, + array( 1033920794, 1060695457, 1343140540 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'DateMetadataIn.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::BETWEEN, + array( 1033920776, 1072180276 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'DateMetadataBetween.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::CREATED, + Criterion\Operator::BETWEEN, + array( 1033920776, 1072180278 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'DateMetadataCreated.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\LocationId( + array( 1, 2, 5 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'LocationId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\ParentLocationId( + array( 1 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'ParentLocationId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\RemoteId( + array( 'f5c88a2209584891056f987fd965b0ba', 'faaeb9be3bd98ed09f606fc16d144eca' ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'RemoteId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\LocationRemoteId( + array( '3f6d92f8044aed134f32153517850f5a', 'f3e90596361e31d496d4026eb624c983' ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'LocationRemoteId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( + array( 2 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'SectionId.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\Status( + array( Criterion\Status::STATUS_PUBLISHED ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'Status.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\Field( + 'name', + Criterion\Operator::EQ, + 'Members' + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'Field.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\Field( + 'name', + Criterion\Operator::IN, + array( 'Members', 'Anonymous Users' ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'FieldIn.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::BETWEEN, + array( 1033920275, 1033920794 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'FieldBetween.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\LogicalOr( + array( + new Criterion\Field( + 'name', + Criterion\Operator::EQ, + 'Members' + ), + new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::BETWEEN, + array( 1033920275, 1033920794 ) + ), + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'FieldOr.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'contact' + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'FullText.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'Contact*' + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . 'FullTextWildcard.php', + ), + ); + } + + /** + * Test for the findContent() method. + * + * @dataProvider getSearches + * @see \eZ\Publish\API\Repository\SearchService::findContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService + */ + public function testFindContent( Query $query, $fixture ) + { + $this->assertQueryFixture( $query, $fixture ); + } + + public function testFindSingle() + { + $repository = $this->getRepository(); + $searchService = $repository->getSearchService(); + + $content = $searchService->findSingle( + new Criterion\ContentId( + array( 4 ) + ) + ); + + $this->assertEquals( + 4, + $content->id + ); + } + + /** + * @expectedException \OutOfBoundsException + */ + public function testInvalidFieldIdentifierRange() + { + $repository = $this->getRepository(); + $searchService = $repository->getSearchService(); + + $searchService->findContent( + new Query( + array( + 'criterion' => new Criterion\Field( + 'some_hopefully_unknown_field', + Criterion\Operator::BETWEEN, + array( 10, 1000 ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ) + ); + } + + /** + * @expectedException \OutOfBoundsException + */ + public function testInvalidFieldIdentifierIn() + { + $repository = $this->getRepository(); + $searchService = $repository->getSearchService(); + + $searchService->findContent( + new Query( + array( + 'criterion' => new Criterion\Field( + 'some_hopefully_unknown_field', + Criterion\Operator::EQ, + 1000 + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ) + ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testFindSingleFailMultiple() + { + $repository = $this->getRepository(); + $searchService = $repository->getSearchService(); + + $searchService->findSingle( + new Criterion\ContentId( + array( 4, 10 ) + ) + ); + } + + public function getSortedSearches() + { + $fixtureDir = $this->getFixtureDir(); + return array( + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array() + ) + ), + $fixtureDir . '/SortNone.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( new SortClause\LocationPathString( Query::SORT_DESC ) ) + ) + ), + $fixtureDir . '/SortPathString.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( new SortClause\LocationDepth( Query::SORT_ASC ) ) + ) + ), + $fixtureDir . '/SortLocationDepth.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 3 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\LocationPathString( Query::SORT_DESC ), + new SortClause\ContentName( Query::SORT_ASC ) + ) + ) + ), + $fixtureDir . '/SortMultiple.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\LocationPriority( Query::SORT_DESC ), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortDesc.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\DatePublished(), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortDatePublished.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 4, 2, 6, 3 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\SectionIdentifier(), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortSectionIdentifier.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 4, 2, 6, 3 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\SectionName(), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortSectionName.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2, 3 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\ContentName(), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortContentName.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\ContentTypeId( 1 ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\Field( "folder", "name" ), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortFolderName.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 5 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\Field( "template_look", "title" ), + new SortClause\ContentId(), + ) + ) + ), + $fixtureDir . '/SortTemplateTitle.php', + ), + ); + } + + /** + * Test for the findContent() method. + * + * @dataProvider getSortedSearches + * @see \eZ\Publish\API\Repository\SearchService::findContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService + */ + public function testFindAndSortContent( Query $query, $fixture ) + { + $this->assertQueryFixture( $query, $fixture ); + } + + public function getFacettedSearches() + { + $fixtureDir = $this->getFixtureDir(); + return array( + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\ContentTypeFacetBuilder() + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetContentType.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\ContentTypeFacetBuilder( + array( + 'minCount' => 3, + ) + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetContentTypeMinCount.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\ContentTypeFacetBuilder( + array( + 'limit' => 5, + ) + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetContentTypeMinLimit.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\SectionFacetBuilder() + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetSection.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\UserFacetBuilder() + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetUser.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\TermFacetBuilder() + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetTerm.php', + ), + /* @todo: It needs to be defined how this one is supposed to work. + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\CriterionFacetBuilder() + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetCriterion.php', + ), // */ + /* @todo: Add sane ranges here: + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\DateRangeFacetBuilder( array() ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetDateRange.php', + ), // */ + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\FieldFacetBuilder( + array( + 'fieldPaths' => array( 'article/title' ), + ) + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetFieldSimple.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\FieldFacetBuilder( + array( + 'fieldPaths' => array( 'article/title' ), + 'regex' => '(a|b|c)', + ) + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetFieldRegexp.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\FieldFacetBuilder( + array( + 'fieldPaths' => array( 'article/title' ), + 'regex' => '(a|b|c)', + 'sort' => FacetBuilder\FieldFacetBuilder::TERM_DESC + ) + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetFieldRegexpSortTerm.php', + ), + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\FieldFacetBuilder( + array( + 'fieldPaths' => array( 'article/title' ), + 'regex' => '(a|b|c)', + 'sort' => FacetBuilder\FieldFacetBuilder::COUNT_DESC + ) + ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetFieldRegexpSortCount.php', + ), + /* @todo: Add sane ranges here: + array( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => 10, + 'facetBuilders' => array( + new FacetBuilder\FieldRangeFacetBuilder( array( + 'fieldPath' => 'product/price', + ) ) + ), + 'sortClauses' => array( new SortClause\ContentId() ) + ) + ), + $fixtureDir . '/FacetFieldRegexpSortCount.php', + ), // */ + ); + } + + /** + * Test for the findContent() method. + * + * @dataProvider getFacettedSearches + * @see \eZ\Publish\API\Repository\SearchService::findContent() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSearchService + */ + public function testFindFacettedContent( Query $query, $fixture ) + { + $this->assertQueryFixture( $query, $fixture ); + } + + /** + * Assert that query result matches the given fixture. + * + * @param Query $query + * @param string $fixture + * + * @return void + */ + protected function assertQueryFixture( Query $query, $fixture ) + { + $repository = $this->getRepository(); + $searchService = $repository->getSearchService(); + + try + { + $result = $searchService->findContent( $query ); + $this->simplifySearchResult( $result ); + } + catch ( NotImplementedException $e ) + { + $this->markTestSkipped( + "This feature is not supported by the current search backend: " . $e->getMessage() + ); + } + + if ( !is_file( $fixture ) ) + { + if ( isset( $_ENV['ez_tests_record'] ) ) + { + file_put_contents( + $record = $fixture . '.recording', + "markTestIncomplete( "No fixture available. Result recorded at $record. Result: \n" . $this->printResult( $result ) ); + } + else + { + $this->markTestIncomplete( "No fixture available. Set \$_ENV['ez_tests_record'] to generate it." ); + } + } + + $this->assertEquals( + include $fixture, + $result, + "Search results do not match.", + .1 // Be quite generous regarding delay -- most important for scores + ); + } + + /** + * Show a simplified view of the search result for manual introspection + * + * @param SearchResult $result + * + * @return string + */ + protected function printResult( SearchResult $result ) + { + $printed = ''; + foreach ( $result->searchHits as $hit ) + { + $printed .= sprintf( " - %s (%s)\n", $hit->valueObject['title'], $hit->valueObject['id'] ); + } + return $printed; + } + + /** + * Simplify search result + * + * This leads to saner comparisons of results, since we do not get the full + * content objects every time. + * + * @param SearchResult $result + * + * @return void + */ + protected function simplifySearchResult( SearchResult $result ) + { + $result->time = 1; + + foreach ( $result->searchHits as $hit ) + { + switch ( true ) + { + case $hit->valueObject instanceof Content: + $hit->valueObject = array( + 'id' => $hit->valueObject->contentInfo->id, + 'title' => $hit->valueObject->contentInfo->name, + ); + break; + + default: + throw new \RuntimeException( "Unknown search result hit type: " . get_class( $hit->valueObject ) ); + } + } + } + + /** + * Get fixture directory + * + * @return string + */ + protected function getFixtureDir() + { + return __DIR__ . '/_fixtures/' . getenv( "fixtureDir" ) . '/'; + } +} diff --git a/eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php new file mode 100644 index 0000000..f0889a6 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php @@ -0,0 +1,246 @@ +getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->createSection( $sectionCreate ); + /* END: Use Case */ + } + + /** + * Test for the loadSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSection + */ + public function testLoadSectionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $sectionId = $sectionService->createSection( $sectionCreate )->id; + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->loadSection( $sectionId ); + /* END: Use Case */ + } + + /** + * Test for the updateSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::updateSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testUpdateSection + */ + public function testUpdateSectionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId is the ID of the "Standard" section in a eZ + // Publish demo installation. + + $userService = $repository->getUserService(); + $sectionService = $repository->getSectionService(); + + $section = $sectionService->loadSection( $standardSectionId ); + + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->name = 'New section name'; + $sectionUpdate->identifier = 'newUniqueKey'; + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->updateSection( $section, $sectionUpdate ); + /* END: Use Case */ + } + + /** + * Test for the loadSections() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSections() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSections + */ + public function testLoadSectionsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $sectionService = $repository->getSectionService(); + + // Create some sections + $sectionCreateOne = $sectionService->newSectionCreateStruct(); + $sectionCreateOne->name = 'Test section one'; + $sectionCreateOne->identifier = 'uniqueKeyOne'; + + $sectionCreateTwo = $sectionService->newSectionCreateStruct(); + $sectionCreateTwo->name = 'Test section two'; + $sectionCreateTwo->identifier = 'uniqueKeyTwo'; + + $sectionService->createSection( $sectionCreateOne ); + $sectionService->createSection( $sectionCreateTwo ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->loadSections(); + /* END: Use Case */ + } + + /** + * Test for the loadSectionByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSectionByIdentifier() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadSectionByIdentifierThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $sectionService->createSection( $sectionCreate ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->loadSectionByIdentifier( 'uniqueKey' ); + /* END: Use Case */ + } + + /** + * Test for the assignSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::assignSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testAssignSectionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId is the ID of the "Standard" section in a eZ + // Publish demo installation. + + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $userService = $repository->getUserService(); + $contentService = $repository->getContentService(); + $sectionService = $repository->getSectionService(); + + // Load a content info instance + $contentInfo = $contentService->loadContentInfoByRemoteId( + $mediaRemoteId + ); + + // Load the "Standard" section + $section = $sectionService->loadSection( $standardSectionId ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->assignSection( $contentInfo, $section ); + /* END: Use Case */ + } + + /** + * Test for the deleteSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::deleteSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testDeleteSectionThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $section = $sectionService->createSection( $sectionCreate ); + + // Set anonymous user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with a "UnauthorizedException" + $sectionService->deleteSection( $section ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/SectionServiceTest.php b/eZ/Publish/API/Repository/Tests/SectionServiceTest.php new file mode 100644 index 0000000..738d83a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SectionServiceTest.php @@ -0,0 +1,875 @@ +ContentService::loadContentInfoByRemoteId() + * at least returns an object, because this method is utilized in several + * tests, + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + try + { + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + // Load the ContentService + $contentService = $this->getRepository()->getContentService(); + + // Load a content info instance + $contentInfo = $contentService->loadContentInfoByRemoteId( + $mediaRemoteId + ); + + if ( false === is_object( $contentInfo ) ) + { + $this->markTestSkipped( + 'This test cannot be executed, because the utilized ' . + 'ContentService::loadContentInfoByRemoteId() does not ' . + 'return an object.' + ); + } + } + catch ( \Exception $e ) + { + $this->markTestSkipped( + 'This test cannot be executed, because the utilized ' . + 'ContentService::loadContentInfoByRemoteId() failed with ' . + PHP_EOL . PHP_EOL . + $e + ); + } + + } + + /** + * Test for the newSectionCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::newSectionCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSectionService + */ + public function testNewSectionCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\SectionCreateStruct', $sectionCreate ); + } + + /** + * Test for the createSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::createSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testNewSectionCreateStruct + */ + public function testCreateSection() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $section = $sectionService->createSection( $sectionCreate ); + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Section', $section ); + } + + /** + * Test for the createSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::createSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + */ + public function testCreateSectionThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreateOne = $sectionService->newSectionCreateStruct(); + $sectionCreateOne->name = 'Test section one'; + $sectionCreateOne->identifier = 'uniqueKey'; + + $sectionService->createSection( $sectionCreateOne ); + + $sectionCreateTwo = $sectionService->newSectionCreateStruct(); + $sectionCreateTwo->name = 'Test section two'; + $sectionCreateTwo->identifier = 'uniqueKey'; + + // This will fail, because identifier uniqueKey already exists. + $sectionService->createSection( $sectionCreateTwo ); + /* END: Use Case */ + } + + /** + * Test for the loadSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + */ + public function testLoadSection() + { + $repository = $this->getRepository(); + + $sectionId = $this->generateId( 'section', 2 ); + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // Loads user section + // $sectionId contains the corresponding ID + $section = $sectionService->loadSection( $sectionId ); + /* END: Use Case */ + + $this->assertEquals( 'users', $section->identifier ); + } + + /** + * Test for the loadSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSectionService + */ + public function testLoadSectionThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistentSectionId = $this->generateId( 'section', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // This call should fail with a NotFoundException + // $nonExistentSectionId contains a section ID that is not known + $sectionService->loadSection( $nonExistentSectionId ); + /* END: Use Case */ + } + + /** + * Test for the newSectionUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::newSectionUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSectionService + */ + public function testNewSectionUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct', $sectionUpdate ); + } + + /** + * Test for the updateSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::updateSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSection + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testNewSectionUpdateStruct + */ + public function testUpdateSection() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId contains the ID of the "Standard" section in a eZ + // Publish demo installation. + + $sectionService = $repository->getSectionService(); + + $section = $sectionService->loadSection( $standardSectionId ); + + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->name = 'New section name'; + $sectionUpdate->identifier = 'newUniqueKey'; + + $updatedSection = $sectionService->updateSection( $section, $sectionUpdate ); + /* END: Use Case */ + + // Verify that service returns an instance of Section + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Section', $updatedSection ); + + // Verify that the service also persists the changes + $updatedSection = $sectionService->loadSection( $standardSectionId ); + + $this->assertEquals( 'New section name', $updatedSection->name ); + } + + /** + * Test for the updateSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::updateSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testUpdateSection + */ + public function testUpdateSectionKeepsSectionIdentifierOnNameUpdate() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId contains the ID of the "Standard" section in a eZ + // Publish demo installation. + + $sectionService = $repository->getSectionService(); + + $section = $sectionService->loadSection( $standardSectionId ); + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->name = 'New section name'; + + $updatedSection = $sectionService->updateSection( $section, $sectionUpdate ); + /* END: Use Case */ + + $this->assertEquals( 'standard', $updatedSection->identifier ); + } + + /** + * Test for the updateSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::updateSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testUpdateSection + */ + public function testUpdateSectionKeepsSectionNameOnIdentifierUpdate() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId contains the ID of the "Standard" section in a eZ + // Publish demo installation. + + $sectionService = $repository->getSectionService(); + + $section = $sectionService->loadSection( $standardSectionId ); + + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->identifier = 'newUniqueKey'; + + $updatedSection = $sectionService->updateSection( $section, $sectionUpdate ); + /* END: Use Case */ + + $this->assertEquals( 'Standard', $updatedSection->name ); + } + + /** + * Test for the updateSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::updateSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testUpdateSection + */ + public function testUpdateSectionThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId contains the ID of the "Standard" section in a eZ + // Publish demo installation. + + $sectionService = $repository->getSectionService(); + + // Create section with conflict identifier + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Conflict section'; + $sectionCreate->identifier = 'conflictKey'; + + $sectionService->createSection( $sectionCreate ); + + // Load an existing section and update to an existing identifier + $section = $sectionService->loadSection( $standardSectionId ); + + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->identifier = 'conflictKey'; + + // This call should fail with an InvalidArgumentException + $sectionService->updateSection( $section, $sectionUpdate ); + /* END: Use Case */ + } + + /** + * Test for the loadSections() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSections() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + */ + public function testLoadSections() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sections = $sectionService->loadSections(); + foreach ( $sections as $section ) + { + // Operate on all sections. + } + /* END: Use Case */ + + $this->assertEquals( 6, count( $sections ) ); + } + + /** + * Test for the loadSections() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSections() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + */ + public function testLoadSectionsReturnsDefaultSectionsByDefault() + { + $repository = $this->getRepository(); + + $sectionService = $repository->getSectionService(); + + $this->assertEquals( + array( + new Section( + array( + 'id' => $this->generateId( 'section', 1 ), + 'name' => 'Standard', + 'identifier' => 'standard' + ) + ), + new Section( + array( + 'id' => $this->generateId( 'section', 2 ), + 'name' => 'Users', + 'identifier' => 'users' + ) + ), + new Section( + array( + 'id' => $this->generateId( 'section', 3 ), + 'name' => 'Media', + 'identifier' => 'media' + ) + ), + new Section( + array( + 'id' => $this->generateId( 'section', 4 ), + 'name' => 'Setup', + 'identifier' => 'setup' + ) + ), + new Section( + array( + 'id' => $this->generateId( 'section', 5 ), + 'name' => 'Design', + 'identifier' => 'design' + ) + ), + new Section( + array( + 'id' => $this->generateId( 'section', 6 ), + 'name' => 'Restricted', + 'identifier' => '' + ) + ), + ), + $sectionService->loadSections() + ); + } + + /** + * Test for the loadSectionByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSectionByIdentifier() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + */ + public function testLoadSectionByIdentifier() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $sectionId = $sectionService->createSection( $sectionCreate )->id; + + $section = $sectionService->loadSectionByIdentifier( 'uniqueKey' ); + /* END: Use Case */ + + $this->assertEquals( $sectionId, $section->id ); + } + + /** + * Test for the loadSectionByIdentifier() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::loadSectionByIdentifier() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetSectionService + */ + public function testLoadSectionByIdentifierThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // This call should fail with a NotFoundException + $sectionService->loadSectionByIdentifier( 'someUnknownSectionIdentifier' ); + /* END: Use Case */ + } + + /** + * Test for the countAssignedContents() method. + * + * @see \eZ\Publish\API\Repository\SectionService::countAssignedContents() + * + * @return void + */ + public function testCountAssignedContents() + { + $repository = $this->getRepository(); + + $sectionService = $repository->getSectionService(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId contains the ID of the "Standard" section in a eZ + // Publish demo installation. + + $standardSection = $sectionService->loadSection( $standardSectionId ); + + $numberOfAssignedContent = $sectionService->countAssignedContents( + $standardSection + ); + /* END: Use Case */ + + $this->assertEquals( + 2, // Taken from the fixture + $numberOfAssignedContent + ); + } + + /** + * Test for the assignSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::assignSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCountAssignedContents + */ + public function testAssignSection() + { + $repository = $this->getRepository(); + $sectionService = $repository->getSectionService(); + + $standardSectionId = $this->generateId( 'section', 1 ); + $mediaSectionId = $this->generateId( 'section', 3 ); + + $beforeStandardCount = $sectionService->countAssignedContents( + $sectionService->loadSection( $standardSectionId ) + ); + $beforeMediaCount = $sectionService->countAssignedContents( + $sectionService->loadSection( $mediaSectionId ) + ); + + /* BEGIN: Use Case */ + // $mediaSectionId contains the ID of the "Media" section in a eZ + // Publish demo installation. + + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $contentService = $repository->getContentService(); + $sectionService = $repository->getSectionService(); + + // Load a content info instance + $contentInfo = $contentService->loadContentInfoByRemoteId( + $mediaRemoteId + ); + + // Load the "Standard" section + $section = $sectionService->loadSection( $standardSectionId ); + + // Assign Section to ContentInfo + $sectionService->assignSection( $contentInfo, $section ); + /* END: Use Case */ + + $this->assertEquals( + $beforeStandardCount + 1, + $sectionService->countAssignedContents( + $sectionService->loadSection( $standardSectionId ) + ) + ); + $this->assertEquals( + $beforeMediaCount - 1, + $sectionService->countAssignedContents( + $sectionService->loadSection( $mediaSectionId ) + ) + ); + } + + /** + * Test for the countAssignedContents() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::countAssignedContents() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + */ + public function testCountAssignedContentsReturnsZeroByDefault() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $section = $sectionService->createSection( $sectionCreate ); + + // The number of assigned contents should be zero + $assignedContents = $sectionService->countAssignedContents( $section ); + /* END: Use Case */ + + $this->assertSame( 0, $assignedContents ); + } + + /** + * Test for the deleteSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::deleteSection() + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSections + */ + public function testDeleteSection() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $section = $sectionService->createSection( $sectionCreate ); + + // Delete the newly created section + $sectionService->deleteSection( $section ); + /* END: Use Case */ + + $this->assertEquals( 6, count( $sectionService->loadSections() ) ); + } + + /** + * Test for the deleteSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::deleteSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testDeleteSection + */ + public function testDeleteSectionThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + $section = $sectionService->createSection( $sectionCreate ); + + // Delete the newly created section + $sectionService->deleteSection( $section ); + + // This call should fail with a NotFoundException + $sectionService->deleteSection( $section ); + /* END: Use Case */ + } + + /** + * Test for the deleteSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::deleteSection() + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testAssignSection + */ + public function testDeleteSectionThrowsBadStateException() + { + $repository = $this->getRepository(); + + $standardSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + // $standardSectionId contains the ID of the "Standard" section in a eZ + // Publish demo installation. + + // RemoteId of the "Media" page of an eZ Publish demo installation + $mediaRemoteId = 'a6e35cbcb7cd6ae4b691f3eee30cd262'; + + $contentService = $repository->getContentService(); + $sectionService = $repository->getSectionService(); + + // Load the "Media" ContentInfo + $contentInfo = $contentService->loadContentInfoByRemoteId( $mediaRemoteId ); + + // Load the "Standard" section + $section = $sectionService->loadSection( $standardSectionId ); + + // Assign "Media" to "Standard" section + $sectionService->assignSection( $contentInfo, $section ); + + // This call should fail with a BadStateException, because there are assigned contents + $sectionService->deleteSection( $section ); + /* END: Use Case */ + } + + /** + * Test for the createSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::createSection() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSectionByIdentifier + */ + public function testCreateSectionInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Get a create struct and set some properties + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + // Create a new section + $sectionService->createSection( $sectionCreate ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + try + { + // This call will fail with a not found exception + $sectionService->loadSectionByIdentifier( 'uniqueKey' ); + } + catch ( NotFoundException $e ) + { + // Expected execution path + } + /* END: Use Case */ + + $this->assertTrue( isset( $e ), 'Can still load section after rollback.' ); + } + + /** + * Test for the createSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::createSection() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testCreateSection + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSectionByIdentifier + */ + public function testCreateSectionInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Get a create struct and set some properties + $sectionCreate = $sectionService->newSectionCreateStruct(); + $sectionCreate->name = 'Test Section'; + $sectionCreate->identifier = 'uniqueKey'; + + // Create a new section + $sectionService->createSection( $sectionCreate ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load new section + $section = $sectionService->loadSectionByIdentifier( 'uniqueKey' ); + /* END: Use Case */ + + $this->assertEquals( 'uniqueKey', $section->identifier ); + } + + /** + * Test for the createSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::createSection() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testRollback + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testUpdateSection + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSectionByIdentifier + */ + public function testUpdateSectionInTransactionWithRollback() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Load standard section + $section = $sectionService->loadSectionByIdentifier( 'standard' ); + + // Get an update struct and change section name + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->name = 'My Standard'; + + // Update section + $sectionService->updateSection( $section, $sectionUpdate ); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Rollback all changes + $repository->rollback(); + + // Load updated section, name will still be "Standard" + $updatedStandard = $sectionService->loadSectionByIdentifier( 'standard' ); + /* END: Use Case */ + + $this->assertEquals( 'Standard', $updatedStandard->name ); + } + + /** + * Test for the createSection() method. + * + * @return void + * @see \eZ\Publish\API\Repository\SectionService::createSection() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testCommit + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testUpdateSection + * @depends eZ\Publish\API\Repository\Tests\SectionServiceTest::testLoadSectionByIdentifier + */ + public function testUpdateSectionInTransactionWithCommit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $sectionService = $repository->getSectionService(); + + // Start a new transaction + $repository->beginTransaction(); + + try + { + // Load standard section + $section = $sectionService->loadSectionByIdentifier( 'standard' ); + + // Get an update struct and change section name + $sectionUpdate = $sectionService->newSectionUpdateStruct(); + $sectionUpdate->name = 'My Standard'; + + // Update section + $sectionService->updateSection( $section, $sectionUpdate ); + + // Commit all changes + $repository->commit(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + // Load updated section, name will now be "My Standard" + $updatedStandard = $sectionService->loadSectionByIdentifier( 'standard' ); + /* END: Use Case */ + + $this->assertEquals( 'My Standard', $updatedStandard->name ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/SetupFactory.php b/eZ/Publish/API/Repository/Tests/SetupFactory.php new file mode 100644 index 0000000..0a65351 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SetupFactory.php @@ -0,0 +1,44 @@ +initializeSchema(); + $this->insertData(); + } + + $repository = $this->getServiceContainer()->get( 'inner_repository' ); + $repository->setCurrentUser( + $repository->getUserService()->loadUser( 14 ) + ); + return $repository; + } + + /** + * Returns a config value for $configKey. + * + * @param string $configKey + * + * @throws Exception if $configKey could not be found. + * + * @return mixed + */ + public function getConfigValue( $configKey ) + { + return $this->getServiceContainer()->getVariable( $configKey ); + } + + /** + * Returns a repository specific ID manager. + * + * @return \eZ\Publish\API\Repository\Tests\IdManager + */ + public function getIdManager() + { + return new IdManager\Php; + } + + /** + * Insert the database data + * + * @return void + */ + public function insertData() + { + $data = $this->getInitialData(); + $handler = $this->getDatabaseHandler(); + + // @todo FIXME: Needs to be in fixture + $data['ezcontentobject_trash'] = array(); + $data['ezurlwildcard'] = array(); + + foreach ( $data as $table => $rows ) + { + // Cleanup before inserting + $deleteQuery = $handler->createDeleteQuery(); + $deleteQuery->deleteFrom( $handler->quoteIdentifier( $table ) ); + $stmt = $deleteQuery->prepare(); + $stmt->execute(); + + // Check that at least one row exists + if ( !isset( $rows[0] ) ) + { + continue; + } + + $q = $handler->createInsertQuery(); + $q->insertInto( $handler->quoteIdentifier( $table ) ); + + // Contains the bound parameters + $values = array(); + + // Binding the parameters + foreach ( $rows[0] as $col => $val ) + { + $q->set( + $handler->quoteIdentifier( $col ), + $q->bindParam( $values[$col] ) + ); + } + + $stmt = $q->prepare(); + + foreach ( $rows as $row ) + { + try + { + // This CANNOT be replaced by: + // $values = $row + // each $values[$col] is a PHP reference which should be + // kept for parameters binding to work + foreach ( $row as $col => $val ) + { + $values[$col] = $val; + } + + $stmt->execute(); + } + catch ( \Exception $e ) + { + echo "$table ( ", implode( ', ', $row ), " )\n"; + throw $e; + } + } + } + + $this->applyStatements( $this->getPostInsertStatements() ); + } + + /** + * Returns statements to be executed after data insert + * + * @return string[] + */ + protected function getPostInsertStatements() + { + if ( self::$db === 'pgsql' ) + { + $setvalPath = __DIR__ . '/../../../../Core/Persistence/Legacy/Tests/_fixtures/setval.pgsql.sql'; + return array_filter( preg_split( '(;\\s*$)m', file_get_contents( $setvalPath ) ) ); + } + return array(); + } + + /** + * Returns the initial database data + * + * @return array + */ + protected function getInitialData() + { + if ( !isset( self::$initialData ) ) + { + self::$initialData = include __DIR__ . '/../../../../Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php'; + // self::$initialData = include __DIR__ . '/../../../../Core/Repository/Tests/Service/Legacy/_fixtures/full_dump.php'; + } + return self::$initialData; + } + + /** + * Initializes the database schema + * + * @return void + */ + protected function initializeSchema() + { + if ( !self::$schemaInitialized ) + { + $dbHandler = $this->getDatabaseHandler(); + $statements = $this->getSchemaStatements(); + + $this->applyStatements( $statements ); + } + + self::$schemaInitialized = true; + } + + /** + * Applies the given SQL $statements to the database in use + * + * @param array $statements + * + * @return void + */ + protected function applyStatements( array $statements ) + { + foreach ( $statements as $statement ) + { + $this->getDatabaseHandler()->exec( $statement ); + } + } + + // ************* Setup copied and refactored from common.php ************ + + /** + * Returns the database schema as an array of SQL statements + * + * @return string[] + */ + protected function getSchemaStatements() + { + $schemaPath = __DIR__ . '/../../../../Core/Persistence/Legacy/Tests/_fixtures/schema.' . self::$db . '.sql'; + + return array_filter( preg_split( '(;\\s*$)m', file_get_contents( $schemaPath ) ) ); + } + + /** + * Returns the database handler from the service container + * + * @return EzcDbHandler + */ + protected function getDatabaseHandler() + { + return $this->getServiceContainer()->get( 'legacy_db_handler' ); + } + + /** + * Returns the global ezp-next settings + * + * @return mixed + */ + protected function getGlobalSettings() + { + if ( self::$globalSettings === null ) + { + $settingsPath = __DIR__ . '/../../../../../../config.php'; + + if ( !file_exists( $settingsPath ) ) + { + throw new \RuntimeException( 'Could not find config.php, please copy config.php-DEVELOPMENT to config.php customize to your needs!' ); + } + + self::$globalSettings = include $settingsPath; + } + + return self::$globalSettings; + } + + /** + * Returns the configuration manager + * + * @return \eZ\Publish\Core\Base\ConfigurationManager + */ + protected function getConfigurationManager() + { + if ( !isset( self::$configurationManager ) ) + { + $settings = $this->getGlobalSettings(); + + self::$configurationManager = new ConfigurationManager( + array_merge_recursive( + $settings, + array( + 'base' => array( + 'Configuration' => array( + 'UseCache' => false + ) + ) + ) + ), + $settings['base']['Configuration']['Paths'] + ); + } + + return self::$configurationManager; + } + + /** + * Returns the dependency configuration + * + * @return array + */ + protected function getDependencyConfiguration() + { + $dependencies = array(); + if ( isset( $_ENV['legacyKernel'] ) ) + { + $dependencies['@legacyKernel'] = $_ENV['legacyKernel']; + } + return $dependencies; + } + + /** + * Returns the service container used for initialization of the repository + * + * @todo Getting service container statically, too, would be nice + * + * @return \eZ\Publish\Core\Base\ServiceContainer + */ + protected function getServiceContainer() + { + if ( !isset( self::$serviceContainer ) ) + { + $configManager = $this->getConfigurationManager(); + + $serviceSettings = $configManager->getConfiguration( 'service' )->getAll(); + + $serviceSettings['persistence_handler']['alias'] = 'persistence_handler_legacy'; + $serviceSettings['io_handler']['alias'] = 'io_handler_legacy'; + + // Needed for URLAliasService tests + $serviceSettings['inner_repository']['arguments']['service_settings']['language']['languages'][] = 'eng-US'; + $serviceSettings['inner_repository']['arguments']['service_settings']['language']['languages'][] = 'eng-GB'; + + $serviceSettings['persistence_handler_legacy']['arguments']['config']['dsn'] = self::$dsn; + $serviceSettings['legacy_db_handler']['arguments']['dsn'] = self::$dsn; + + self::$serviceContainer = new ServiceContainer( + $serviceSettings, + $this->getDependencyConfiguration() + ); + } + + return self::$serviceContainer; + } +} diff --git a/eZ/Publish/API/Repository/Tests/SetupFactory/LegacySolr.php b/eZ/Publish/API/Repository/Tests/SetupFactory/LegacySolr.php new file mode 100644 index 0000000..6a4b96a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SetupFactory/LegacySolr.php @@ -0,0 +1,187 @@ +setAccessible( true ); + $persistenceHandler = $persistenceProperty->getValue( $repository ); + + $searchProperty = new \ReflectionProperty( $persistenceHandler, 'searchHandler' ); + $searchProperty->setAccessible( true ); + $searchProperty->setValue( + $persistenceHandler, + $this->getSearchHandler( $persistenceHandler ) + ); + + return $repository; + } + + protected function getSearchHandler( $persistenceHandler ) + { + $nameGenerator = new Solr\Content\Search\FieldNameGenerator(); + $fieldRegistry = new Solr\Content\Search\FieldRegistry( + array( + 'ezstring' => new FieldType\TextLine\SearchField(), + 'ezprice' => new FieldType\Price\SearchField(), + // @todo: These two need proper custom search field definitions + 'eztext' => new FieldType\TextLine\SearchField(), + 'ezxmltext' => new FieldType\TextLine\SearchField(), + // @todo: Define proper types for these: + 'ezuser' => new FieldType\Unindexed(), + 'ezimage' => new FieldType\Unindexed(), + 'ezboolean' => new FieldType\Unindexed(), + 'ezkeyword' => new FieldType\Unindexed(), + 'ezdatetime' => new FieldType\Unindexed(), + 'ezinisetting' => new FieldType\Unindexed(), + 'ezpackage' => new FieldType\Unindexed(), + 'ezurl' => new FieldType\Unindexed(), + 'ezobjectrelation' => new FieldType\Unindexed(), + 'ezmultioption' => new FieldType\Unindexed(), + 'ezauthor' => new FieldType\Unindexed(), + 'ezsrrating' => new FieldType\Unindexed(), + 'ezselection' => new FieldType\Unindexed(), + 'ezsubtreesubscription' => new FieldType\Unindexed(), + 'ezobjectrelationlist' => new FieldType\Unindexed(), + 'ezemail' => new FieldType\Unindexed(), + 'ezoption' => new FieldType\Unindexed(), + 'ezgmaplocation' => new FieldType\Unindexed(), + 'ezbinaryfile' => new FieldType\Unindexed(), + 'ezmedia' => new FieldType\Unindexed(), + 'ezpage' => new FieldType\Unindexed(), + 'ezcomcomments' => new FieldType\Unindexed(), + ) + ); + + $searchHandler = new Solr\Content\Search\Handler( + new Solr\Content\Search\Gateway\Native( + new Solr\Content\Search\Gateway\HttpClient\Stream( getenv( "solrServer" ) ), + new Solr\Content\Search\CriterionVisitor\Aggregate( + array( + new Solr\Content\Search\CriterionVisitor\ContentIdIn(), + new Solr\Content\Search\CriterionVisitor\LogicalAnd(), + new Solr\Content\Search\CriterionVisitor\LogicalOr(), + new Solr\Content\Search\CriterionVisitor\LogicalNot(), + new Solr\Content\Search\CriterionVisitor\SubtreeIn(), + new Solr\Content\Search\CriterionVisitor\ContentTypeIdIn(), + new Solr\Content\Search\CriterionVisitor\ContentTypeGroupIdIn(), + new Solr\Content\Search\CriterionVisitor\LocationIdIn(), + new Solr\Content\Search\CriterionVisitor\ParentLocationIdIn(), + new Solr\Content\Search\CriterionVisitor\SectionIn(), + new Solr\Content\Search\CriterionVisitor\RemoteIdIn(), + new Solr\Content\Search\CriterionVisitor\LanguageCodeIn(), + new Solr\Content\Search\CriterionVisitor\ObjectStateIdIn(), + new Solr\Content\Search\CriterionVisitor\LocationRemoteIdIn(), + new Solr\Content\Search\CriterionVisitor\DateMetadata\ModifiedIn(), + new Solr\Content\Search\CriterionVisitor\DateMetadata\PublishedIn(), + new Solr\Content\Search\CriterionVisitor\DateMetadata\ModifiedBetween(), + new Solr\Content\Search\CriterionVisitor\DateMetadata\PublishedBetween(), + new Solr\Content\Search\CriterionVisitor\StatusIn(), + new Solr\Content\Search\CriterionVisitor\FullText(), + new Solr\Content\Search\CriterionVisitor\Field\FieldIn( + $fieldRegistry, + $persistenceHandler->contentTypeHandler(), + $nameGenerator + ), + new Solr\Content\Search\CriterionVisitor\Field\FieldRange( + $fieldRegistry, + $persistenceHandler->contentTypeHandler(), + $nameGenerator + ), + ) + ), + new Solr\Content\Search\SortClauseVisitor\Aggregate( + array( + new Solr\Content\Search\SortClauseVisitor\ContentId(), + new Solr\Content\Search\SortClauseVisitor\LocationPathString(), + new Solr\Content\Search\SortClauseVisitor\LocationDepth(), + ) + ), + new Solr\Content\Search\FacetBuilderVisitor\Aggregate( + array( + new Solr\Content\Search\FacetBuilderVisitor\ContentType(), + new Solr\Content\Search\FacetBuilderVisitor\Section(), + new Solr\Content\Search\FacetBuilderVisitor\User(), + ) + ), + new Solr\Content\Search\FieldValueMapper\Aggregate( + array( + new Solr\Content\Search\FieldValueMapper\IdentifierMapper(), + new Solr\Content\Search\FieldValueMapper\StringMapper(), + new Solr\Content\Search\FieldValueMapper\IntegerMapper(), + new Solr\Content\Search\FieldValueMapper\DateMapper(), + new Solr\Content\Search\FieldValueMapper\PriceMapper(), + ) + ), + $persistenceHandler->contentHandler(), + $nameGenerator + ), + $fieldRegistry, + $persistenceHandler->contentTypeHandler(), + $persistenceHandler->objectStateHandler() + ); + + $this->indexAll( $persistenceHandler, $searchHandler ); + + return $searchHandler; + } + + protected function indexAll( $persistenceHandler, $searchHandler ) + { + if ( self::$indexed ) + { + return; + } + + // @todo: Is there a nicer way to get access to all content objects? We + // require this to run a full index here. + $dbHandlerProperty = new \ReflectionProperty( $persistenceHandler, 'dbHandler' ); + $dbHandlerProperty->setAccessible( true ); + $db = $dbHandlerProperty->getValue( $persistenceHandler ); + + $query = $db->createSelectQuery() + ->select( 'id', 'current_version' ) + ->from( 'ezcontentobject' ); + + $stmt = $query->prepare(); + $stmt->execute(); + + $searchHandler->purgeIndex(); + while ( $row = $stmt->fetch( \PDO::FETCH_ASSOC ) ) + { + $searchHandler->indexContent( + $persistenceHandler->contentHandler()->load( $row['id'], $row['current_version'] ) + ); + } + + self::$indexed = true; + } +} diff --git a/eZ/Publish/API/Repository/Tests/SetupFactory/Memory.php b/eZ/Publish/API/Repository/Tests/SetupFactory/Memory.php new file mode 100644 index 0000000..0d4c9ea --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/SetupFactory/Memory.php @@ -0,0 +1,74 @@ +setCurrentUser( + new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserStub( + array( + 'content' => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + 'id' => 14 + ) + ) + ) + ) + ); + + return $repository; + } + + /** + * Returns a repository specific ID manager. + * + * @return \eZ\Publish\API\Repository\Tests\IdManager + */ + public function getIdManager() + { + return new IdManager\Php; + } + + /** + * Returns a config value for $configKey. + * + * @param string $configKey + * + * @throws Exception if $configKey could not be found. + * + * @return mixed + */ + public function getConfigValue( $configKey ) + { + throw new \RuntimeException( "Memory implementation does not support config." ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/ContentServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/ContentServiceStub.php new file mode 100644 index 0000000..5e3bf5d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/ContentServiceStub.php @@ -0,0 +1,1919 @@ +repository = $repository; + $this->pseudoExternalStorage = new PseudoExternalStorage\StorageDispatcher( + array( + 'ezuser' => new PseudoExternalStorage\User( $repository ), + ) + ); + $this->initFromFixture(); + } + + /** + * Loads a content info object. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given id does not exist + * + * @param int $contentId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfo( $contentId ) + { + if ( isset( $this->contentInfo[$contentId] ) ) + { + if ( false === $this->repository->canUser( 'content', 'read', $this->contentInfo[$contentId] ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $this->contentInfo[$contentId]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads a content info object for the given remoteId. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the content in the given location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given remote id does not exist + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfoByRemoteId( $remoteId ) + { + foreach ( $this->contentInfo as $contentInfo ) + { + if ( $remoteId !== $contentInfo->remoteId ) + { + continue; + } + if ( false === $this->repository->canUser( 'content', 'read', $contentInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $contentInfo; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads a version info of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfo( ContentInfo $contentInfo, $versionNo = null ) + { + return $this->loadVersionInfoById( $contentInfo->id, $versionNo ); + } + + /** + * Loads a version info of the given content object id. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfoById( $contentId, $versionNo = null ) + { + $versions = array(); + foreach ( $this->versionInfo as $index => $versionInfo ) + { + if ( $versionInfo->contentId !== $contentId ) + { + continue; + } + + if ( false === $this->repository->canUser( 'content', 'read', $versionInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( $versionInfo->versionNo === $versionNo ) + { + return $versionInfo; + } + $versions[$versionInfo->status] = $versionInfo; + } + + if ( null === $versionNo && isset( $versions[VersionInfo::STATUS_PUBLISHED] ) ) + { + return $versions[VersionInfo::STATUS_PUBLISHED]; + } + else if ( null === $versionNo && isset( $versions[VersionInfo::STATUS_DRAFT] ) ) + { + return $versions[VersionInfo::STATUS_DRAFT]; + } + + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads content in a version for the given content info object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByContentInfo( ContentInfo $contentInfo, array $languages = null, $versionNo = null ) + { + return $this->loadContent( $contentInfo->id, $languages, $versionNo ); + } + + /** + * Loads content in the version given by version info. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByVersionInfo( VersionInfo $versionInfo, array $languages = null ) + { + return $this->loadContent( + $versionInfo->getContentInfo()->id, + $languages, + $versionInfo->versionNo + ); + } + + /** + * Loads content in a version of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content or version with the given id does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContent( $contentId, array $languages = null, $versionNo = null ) + { + $contents = array(); + + foreach ( $this->content as $content ) + { + if ( $content->id !== $contentId ) + { + continue; + } + + if ( false === $this->repository->canUser( 'content', 'read', $content ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( $versionNo === $content->getVersionInfo()->versionNo ) + { + return $this->filterFieldsByLanguages( $content, $languages ); + } + + $contents[$content->getVersionInfo()->status] = $content; + } + + if ( null === $versionNo && isset( $contents[VersionInfo::STATUS_PUBLISHED] ) ) + { + return $this->filterFieldsByLanguages( $contents[VersionInfo::STATUS_PUBLISHED], $languages ); + } + else if ( null === $versionNo && isset( $contents[VersionInfo::STATUS_DRAFT] ) ) + { + return $this->filterFieldsByLanguages( $contents[VersionInfo::STATUS_DRAFT], $languages ); + } + + throw new NotFoundExceptionStub( '@todo: What error code should be used? ID(' . $contentId . ')' ); + } + + /** + * Creates a filtered version of $content when the given $languages + * is not NULL and not empty. The returned Content instance will only + * contain fields for the given language codes. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param string[] $languageCodes + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + private function filterFieldsByLanguages( Content $content, array $languageCodes = null ) + { + $contentType = $content->contentType; + + $fieldDefinitions = $contentType->getFieldDefinitions(); + foreach ( $content->getFields() as $field ) + { + foreach ( $fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier === $field->fieldDefIdentifier ) + { + // @todo: Refactor out of here for clarity! + $this->pseudoExternalStorage->handleLoad( + $fieldDefinition, + $field, + $content + ); + } + } + } + + if ( empty( $languageCodes ) ) + { + return $content; + } + + $fields = array(); + foreach ( $content->getFields() as $field ) + { + if ( false === $contentType->getFieldDefinition( $field->fieldDefIdentifier )->isTranslatable ) + { + $fields[] = $field; + } + else if ( in_array( $field->languageCode, $languageCodes ) ) + { + $fields[] = $field; + } + } + + return $this->copyContentObject( + $content, + array( 'fields' => $fields ) + ); + } + + /** + * Loads content in a version for the content object reference by the given remote id. + * + * If no version is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content or version with the given remote id does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param string $remoteId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByRemoteId( $remoteId, array $languages = null, $versionNo = null ) + { + return $this->loadContent( + $this->loadContentInfoByRemoteId( $remoteId )->id, + $languages, + $versionNo + ); + } + + /** + * Creates a new content draft assigned to the authenticated user. + * + * If a different userId is given in $contentCreateStruct it is assigned to the given user + * but this required special rights for the authenticated user + * (this is useful for content staging where the transfer process does not + * have to authenticate with the user which created the content object in the source server). + * The user has to publish the draft if it should be visible. + * In 4.x at least one location has to be provided in the location creation array. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the content in the given location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is a provided remoteId which exists in the system + * or (4.x) there is no location provided + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct $contentCreateStruct + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct[] $locationCreateStructs an array of {@link \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct} for each location parent under which a location should be created for the content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContent( ContentCreateStruct $contentCreateStruct, array $locationCreateStructs = array() ) + { + if ( false === $this->repository->hasAccess( 'content', 'create' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $this->remoteIdExists( $contentCreateStruct->remoteId ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $languageCodes = $this->getLanguageCodes( $contentCreateStruct->fields, $contentCreateStruct->mainLanguageCode ); + $fields = $this->getFieldsByTypeAndLanguageCode( $contentCreateStruct->contentType, $contentCreateStruct->fields, $contentCreateStruct->mainLanguageCode ); + + // Validate all required fields available in each language; + $this->checkRequiredFields( $contentCreateStruct->contentType, $fields, $languageCodes, $contentCreateStruct->mainLanguageCode ); + + // Complete missing fields + $allFields = $this->createCompleteFields( $contentCreateStruct->contentType, $fields, $languageCodes, $contentCreateStruct->mainLanguageCode ); + + // Perform some fake validation to emulate validation exceptions + $this->fakeFieldValidation( $contentCreateStruct->contentType, $allFields ); + + $content = new ContentStub( + array( + 'id' => ++$this->contentNextId, + 'contentTypeId' => $contentCreateStruct->contentType->id, + 'fields' => $allFields, + 'versionNo' => 1, + 'repository' => $this->repository + ) + ); + + $contentInfo = new ContentInfoStub( + array( + 'id' => $this->contentNextId, + 'contentTypeId' => $contentCreateStruct->contentType->id, + 'remoteId' => $contentCreateStruct->remoteId, + 'sectionId' => $contentCreateStruct->sectionId, + 'alwaysAvailable' => $contentCreateStruct->alwaysAvailable, + 'currentVersionNo' => 1, + 'mainLanguageCode' => $contentCreateStruct->mainLanguageCode, + 'modificationDate' => $contentCreateStruct->modificationDate, + 'ownerId' => $this->repository->getCurrentUser()->id, + 'published' => false, + 'publishedDate' => null, + 'mainLocationId' => null, + + 'repository' => $this->repository + ) + ); + + $versionInfo = new VersionInfoStub( + array( + 'id' => ++$this->versionNextId, + 'contentId' => $this->contentNextId, + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => 1, + 'creatorId' => $this->repository->getCurrentUser()->id, + 'creationDate' => new \DateTime(), + 'modificationDate' => $contentCreateStruct->modificationDate, + 'languageCodes' => $languageCodes, + 'initialLanguageCode' => $contentCreateStruct->mainLanguageCode, + 'names' => $this->generateNames( $contentCreateStruct->contentType, $allFields ), + + 'repository' => $this->repository + ) + ); + + $fieldDefinitions = $contentCreateStruct->contentType->getFieldDefinitions(); + foreach ( $allFields as $field ) + { + foreach ( $fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier === $field->fieldDefIdentifier ) + { + $this->pseudoExternalStorage->handleCreate( + $fieldDefinition, + $field, + $content + ); + } + } + } + + $this->content[] = $content; + $this->contentInfo[$contentInfo->id] = $contentInfo; + $this->versionInfo[$versionInfo->id] = $versionInfo; + + $this->locationsOnPublish[$contentInfo->id] = $locationCreateStructs; + + return $content; + } + + /** + * Performs specific fake validations on the given $fields + * + * Checks: + * + * - String length <= 100 for folder::short_name + * + * @param ContentType $contentType + * @param array $fields + * + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if any of the fake rules are violated + * + * @return void + */ + private function fakeFieldValidation( ContentType $contentType, array $fields ) + { + foreach ( $fields as $field ) + { + switch ( $contentType->identifier ) + { + case 'folder': + switch ( $field->fieldDefIdentifier ) + { + case 'short_name': + if ( strlen( $field->value ) > 100 ) + { + throw new Exceptions\ContentFieldValidationExceptionStub(); + } + break; + } + break; + + case 'forum': + case 'user_group': + switch ( $field->fieldDefIdentifier ) + { + case 'name': + if ( !is_string( $field->value ) && $field->value !== null ) + { + throw new Exceptions\InvalidArgumentExceptionStub(); + } + break; + } + break; + + case 'user': + switch ( $field->fieldDefIdentifier ) + { + case 'first_name': + if ( !is_string( $field->value ) && $field->value !== null ) + { + throw new Exceptions\InvalidArgumentExceptionStub(); + } + break; + } + break; + } + } + } + + /** + * Creates locations on publish, which had been specified on content create + * + * @param ContentInfo $contentInfo + * + * @return void + */ + private function createLocationsOnFirstPublish( ContentInfo $contentInfo ) + { + if ( !isset( $this->locationsOnPublish[$contentInfo->id] ) ) + { + // Already published + return; + } + + $locationService = $this->repository->getLocationService(); + foreach ( $this->locationsOnPublish[$contentInfo->id] as $locationCreateStruct ) + { + $locationService->createLocation( + $contentInfo, + $locationCreateStruct + ); + } + + unset( $this->locationsOnPublish[$contentInfo->id] ); + } + + /** + * Returns all language codes used in $fields, including $mainLanguageCode + * if not null + * + * @param array $fields + * @param string $mainLanguageCode + * + * @return string[] + */ + private function getLanguageCodes( array $fields, $mainLanguageCode = null ) + { + $languageCodes = array(); + + if ( $mainLanguageCode !== null ) + { + $languageCodes[$mainLanguageCode] = true; + } + + foreach ( $fields as $field ) + { + if ( $field->languageCode !== null ) + { + $languageCodes[$field->languageCode] = true; + } + } + return array_keys( $languageCodes ); + } + + /** + * Returns $fields structured by type and language code + * + * @param ContentType $contentType + * @param array $fields + * @param string $mainLanguageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + * + * @throws Exceptions\ContentValidationException if the language code for a + * field could not be determined. + */ + private function getFieldsByTypeAndLanguageCode( ContentType $contentType, array $fields, $mainLanguageCode = null ) + { + $structuredFields = array(); + foreach ( $fields as $field ) + { + $languageCode = ( $field->languageCode !== null + ? $field->languageCode + : $mainLanguageCode ); + + if ( $languageCode === null + && $contentType->getFieldDefinition( $field->fieldDefIdentifier )->isTranslatable ) + { + throw new Exceptions\ContentValidationExceptionStub( + '@todo: What error code should be used?' + ); + } + + $field = $this->cloneField( $field, array( 'languageCode' => $languageCode ) ); + + if ( false === isset( $structuredFields[$field->fieldDefIdentifier] ) ) + { + $structuredFields[$field->fieldDefIdentifier] = array(); + } + // Only one field of each type per language code + $structuredFields[$field->fieldDefIdentifier][$languageCode] = $field; + } + return $structuredFields; + } + + /** + * Clones $field, potentially overriding specific properties from + * $overrides + * + * @param Field $field + * @param array $overrides + * + * @return Field + */ + private function cloneField( Field $field, array $overrides = array() ) + { + $fieldData = array_merge( + array( + 'id' => $field->id, + 'value' => $field->value, + 'languageCode' => $field->languageCode, + 'fieldDefIdentifier' => $field->fieldDefIdentifier, + ), + $overrides + ); + return new FieldStub( $fieldData ); + } + + /** + * Returns $originalFieldId if not null, otherwise a new field ID + * + * @param mixed $originalFieldId + * + * @return void + */ + private function getFieldId( $originalFieldId = null ) + { + if ( $originalFieldId !== null ) + { + return $originalFieldId; + } + return ++$this->fieldNextId; + } + + /** + * Checks all fields required by $contentType are available in $fields, + * taking languages and non-translatable fields into account. + * + * Structure is $fields[$fieldIdentifier][$languageCode], while + * non-translatable fields are stored with $mainLanguageCode. + * + * @param ContentType $contentType + * @param array $fields + * @param array $languageCodes + * @param string $mainLanguageCode + * + * @return void + */ + private function checkRequiredFields( ContentType $contentType, array $fields, array $languageCodes, $mainLanguageCode ) + { + foreach ( $contentType->getFieldDefinitions() as $fieldDefinition ) + { + if ( !$fieldDefinition->isRequired ) + { + continue; + } + + if ( $fieldDefinition->isTranslatable ) + { + foreach ( $languageCodes as $languageCode ) + { + if ( !isset( $fields[$fieldDefinition->identifier][$languageCode] ) || empty( $fields[$fieldDefinition->identifier][$languageCode]->value ) ) + { + throw new ContentValidationExceptionStub( + '@todo: What error code should be used? ' . $fieldDefinition->identifier . ' ' . $languageCode + ); + } + } + } + else + { + if ( !isset( $fields[$fieldDefinition->identifier][$mainLanguageCode] ) || empty( $fields[$fieldDefinition->identifier][$mainLanguageCode]->value ) ) + { + throw new ContentValidationExceptionStub( + '@todo: What error code should be used? ' . $fieldDefinition->identifier + ); + } + } + } + } + + /** + * Creates a list of all fields, while missing non-required fields are + * completed + * + * @param ContentType $contentType + * @param array $fields + * @param array $languageCodes + * @param string $mainLanguageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + private function createCompleteFields( ContentType $contentType, array $fields, array $languageCodes, $mainLanguageCode ) + { + $allFields = array(); + foreach ( $contentType->getFieldDefinitions() as $fieldDefinition ) + { + if ( $fieldDefinition->isTranslatable ) + { + foreach ( $languageCodes as $languageCode ) + { + if ( isset( $fields[$fieldDefinition->identifier][$languageCode] ) ) + { + $field = $fields[$fieldDefinition->identifier][$languageCode]; + $fieldId = $this->getFieldId( $field->id ); + + // Existing translatable field + $allFields[$fieldId] = $this->cloneField( + $field, + array( 'id' => $fieldId ) + ); + } + else + { + $fieldId = $this->getFieldId(); + // Missing translatable field + $allFields[$fieldId] = new FieldStub( + array( + 'id' => $fieldId, + // 'value' => $fieldDefinition->defaultValue, + // No default value in memory! + 'value' => 'Pseudo default value from memory stuff.', + 'languageCode' => $languageCode, + 'fieldDefIdentifier' => $fieldDefinition->identifier + ) + ); + } + } + } + else + { + if ( isset( $fields[$fieldDefinition->identifier][$mainLanguageCode] ) ) + { + $field = $fields[$fieldDefinition->identifier][$mainLanguageCode]; + $fieldId = $this->getFieldId( $field->id ); + + // Existing non-translatable field + $allFields[$fieldId] = $this->cloneField( + $field, + array( 'id' => $fieldId ) + ); + } + else + { + $fieldId = $this->getFieldId(); + + // Missing non-translatable field + $allFields[$fieldId] = new FieldStub( + array( + 'id' => $fieldId, + // 'value' => $fieldDefinition->defaultValue, + // No default value in memory! + 'value' => 'Pseudo default value from memory stuff.', + 'languageCode' => null, + 'fieldDefIdentifier' => $fieldDefinition->identifier + ) + ); + } + } + } + return $allFields; + } + + /** + * Generates the names based on the given $contentType and $fields + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\Content\Field[] $fields + * + * @return string[] + */ + private function generateNames( ContentType $contentType, array $fields ) + { + $languages = array_unique( + array_filter( + array_map( + function ( $field ) use ( $contentType ) + { + $fieldDefinition = $contentType->getFieldDefinition( $field->fieldDefIdentifier ); + return ( $fieldDefinition->isTranslatable + ? $field->languageCode + : false ); + }, + $fields + ) + ) + ); + + $names = array(); + foreach ( $languages as $languageCode ) + { + $names[$languageCode] = preg_replace_callback( + '(<([^>]+)>)', + function ( $matches ) use ( $fields, $languageCode ) + { + $fieldIdentifiers = explode( '|', $matches[1] ); + foreach ( $fieldIdentifiers as $fieldIdentifier ) + { + foreach ( $fields as $field ) + { + if ( $field->fieldDefIdentifier == $fieldIdentifier + && $field->languageCode == $languageCode ) + { + return $field->value; + } + } + } + }, + $contentType->nameSchema + ); + } + + return $names; + } + + /** + * Parses a name template ala "". + * + * @param string $nameTemplate + * + * @return string[] + */ + private function parseNameTemplate( $nameTemplate ) + { + return explode( '|', substr( $nameTemplate, 1, strlen( $nameTemplate ) - 2 ) ); + } + + /** + * Updates the metadata. + * + * (see {@link ContentMetadataUpdateStruct}) of a content object - to update fields use updateContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update the content meta data + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the remoteId in $contentMetadataUpdateStruct is set but already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct $contentMetadataUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content with the updated attributes + */ + public function updateContentMetadata( ContentInfo $contentInfo, ContentMetadataUpdateStruct $contentMetadataUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'content', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $this->remoteIdExists( $contentMetadataUpdateStruct->remoteId ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $this->contentInfo[$contentInfo->id] = new ContentInfoStub( + array( + 'id' => $contentInfo->id, + 'contentTypeId' => $this->contentInfo[$contentInfo->id]->contentTypeId, + 'remoteId' => $contentMetadataUpdateStruct->remoteId ?: $contentInfo->remoteId, + 'sectionId' => $contentInfo->sectionId, + 'alwaysAvailable' => is_null( $contentMetadataUpdateStruct->alwaysAvailable ) ? $contentInfo->alwaysAvailable : $contentMetadataUpdateStruct->alwaysAvailable, + 'currentVersionNo' => $contentInfo->currentVersionNo, + 'mainLanguageCode' => $contentMetadataUpdateStruct->mainLanguageCode ?: $contentInfo->mainLanguageCode, + 'modificationDate' => $contentMetadataUpdateStruct->modificationDate ?: $contentInfo->modificationDate, + 'ownerId' => $contentMetadataUpdateStruct->ownerId ?: $contentInfo->ownerId, + 'published' => $contentInfo->published, + 'publishedDate' => $contentMetadataUpdateStruct->publishedDate ?: $contentInfo->publishedDate, + 'mainLocationId' => $contentInfo->mainLocationId, + + 'repository' => $this->repository + ) + ); + + return $this->loadContent( $contentInfo->id ); + } + + /** + * Deletes a content object including all its versions and locations including their subtrees. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete the content (in one of the locations of the given content object) + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + */ + public function deleteContent( ContentInfo $contentInfo ) + { + if ( false === $this->repository->hasAccess( 'content', 'remove' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + // Avoid cycles between ContentService and LocationService + if ( false === isset( $this->contentInfo[$contentInfo->id] ) ) + { + return; + } + + // Load utilized content service + $locationService = $this->repository->getLocationService(); + + foreach ( $this->versionInfo as $key => $versionInfo ) + { + if ( $versionInfo->contentInfo->id === $contentInfo->id ) + { + unset( $this->versionInfo[$key] ); + } + } + + foreach ( $this->content as $key => $content ) + { + if ( $content->id === $contentInfo->id ) + { + unset( $this->content[$key] ); + } + } + + unset( $this->contentInfo[$contentInfo->id] ); + + // @HACK: See Asana @todo -- drafts and locations are not handled + // correctly + if ( ( $versionInfo->status === VersionInfo::STATUS_DRAFT ) && + ( $versionInfo->versionNo === 1 ) ) + { + return; + } + + // Delete all locations for the given $contentInfo + $locations = $locationService->loadLocations( $contentInfo ); + foreach ( $locations as $location ) + { + $locationService->deleteLocation( $location ); + } + } + + /** + * Creates a draft from a published or archived version. + * + * If no version is given, the current published version is used. + * 4.x: The draft is created with the initialLanguage code of the source version or if not present with the main language. + * It can be changed on updating the version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the draft + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\User\User $user if set given user is used to create the draft - otherwise the current user is used + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContentDraft( ContentInfo $contentInfo, VersionInfo $versionInfo = null, User $user = null ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $contentInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $versionNo = $versionInfo ? $versionInfo->versionNo : null; + + $content = $this->loadContentByContentInfo( $contentInfo, null, $versionNo ); + $versionInfo = $content->getVersionInfo(); + + // Select the greatest version number + foreach ( $this->versionInfo as $existingVersionInfo ) + { + if ( $existingVersionInfo->contentId !== $contentInfo->id ) + { + continue; + } + $versionNo = max( $versionNo, $existingVersionInfo->versionNo ); + } + + $contentDraft = new ContentStub( + array( + 'id' => $content->id, + 'fields' => $content->getFields(), + 'contentTypeId' => $contentInfo->getContentType()->id, + 'versionNo' => $versionNo + 1, + 'repository' => $this->repository + ) + ); + + $versionDraft = new VersionInfoStub( + array( + 'id' => ++$this->versionNextId, + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => $versionNo + 1, + 'creatorId' => $this->repository->getCurrentUser()->id, + 'creationDate' => new \DateTime(), + 'modificationDate' => new \DateTime(), + 'languageCodes' => $versionInfo->languageCodes, + 'initialLanguageCode' => $versionInfo->initialLanguageCode, + 'names' => $versionInfo->getNames(), + + 'contentId' => $content->id, + 'repository' => $this->repository + ) + ); + + $this->content[] = $contentDraft; + $this->versionInfo[$versionDraft->id] = $versionDraft; + + return $contentDraft; + } + + /** + * Loads drafts for a user. + * + * If no user is given the drafts for the authenticated user a returned + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load the draft list + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo the drafts ({@link VersionInfo}) owned by the given user + */ + public function loadContentDrafts( User $user = null ) + { + $user = $user ?: $this->repository->getCurrentUser(); + + if ( false === $this->repository->hasAccess( 'content', 'pendinglist' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $contentDrafts = array(); + foreach ( $this->versionInfo as $versionInfo ) + { + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + continue; + } + if ( $versionInfo->creatorId !== $user->id ) + { + continue; + } + $contentDrafts[] = $versionInfo; + } + + return $contentDrafts; + } + + /** + * Updates the fields of a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct $contentUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the updated fields + */ + public function updateContent( VersionInfo $versionInfo, ContentUpdateStruct $contentUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'content', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + + $content = $this->loadContentByVersionInfo( $versionInfo ); + $contentType = $content->contentType; + + $initialLanguageCode = $contentUpdateStruct->initialLanguageCode; + $mainLanguageCode = $versionInfo->getContentInfo()->mainLanguageCode; + + $oldAndNewFields = array_merge( $content->fields, $contentUpdateStruct->fields ); + + $languageCodes = $this->getLanguageCodes( $oldAndNewFields, $initialLanguageCode ); + + // Automatically overwrites old with new fields + $fields = $this->getFieldsByTypeAndLanguageCode( $contentType, $oldAndNewFields, $initialLanguageCode ?: $mainLanguageCode ); + + // Validate all required fields available in each language + $this->checkRequiredFields( $contentType, $fields, $languageCodes, $mainLanguageCode ); + + // Complete missing fields + $allFields = $this->createCompleteFields( $contentType, $fields, $languageCodes, $mainLanguageCode ); + + // Perform some fake validation to emulate validation exceptions + $this->fakeFieldValidation( $contentType, $allFields ); + + $draftedContent = new ContentStub( + array( + 'id' => $content->id, + 'fields' => $allFields, + 'contentTypeId' => $content->contentTypeId, + 'versionNo' => $versionInfo->versionNo, + 'repository' => $this->repository + ) + ); + + $draftedVersionInfo = new VersionInfoStub( + array( + 'id' => $versionInfo->id, + 'contentId' => $content->id, + 'status' => $versionInfo->status, + 'versionNo' => $versionInfo->versionNo, + 'creatorId' => $versionInfo->creatorId, + 'creationDate' => $versionInfo->creationDate, + 'modificationDate' => new \DateTime(), + 'languageCodes' => $languageCodes, + 'initialLanguageCode' => $mainLanguageCode, + 'names' => $this->generateNames( $contentType, $allFields ), + + 'repository' => $this->repository + ) + ); + + $fieldDefinitions = $contentType->getFieldDefinitions(); + foreach ( $allFields as $field ) + { + foreach ( $fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier === $field->fieldDefIdentifier ) + { + $this->pseudoExternalStorage->handleUpdate( + $fieldDefinition, + $field, + $draftedContent + ); + } + } + } + + if ( false === ( $index = array_search( $content, $this->content ) ) ) + { + throw new \ErrorException( "An implementation error..." ); + } + + $this->versionInfo[$versionInfo->id] = $draftedVersionInfo; + $this->content[$index] = $draftedContent; + + return $draftedContent; + } + + /** + * Publishes a content version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + */ + public function publishVersion( VersionInfo $versionInfo ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $versionInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + + $contentInfo = $versionInfo->getContentInfo(); + + // Newer versions will be ignored + $versionNo = $versionInfo->versionNo; + + $publishedContentInfo = new ContentInfoStub( + array( + 'id' => $contentInfo->id, + 'remoteId' => $contentInfo->remoteId, + 'sectionId' => $contentInfo->sectionId, + 'alwaysAvailable' => $contentInfo->alwaysAvailable, + 'currentVersionNo' => $versionNo, + 'mainLanguageCode' => $contentInfo->mainLanguageCode, + 'modificationDate' => $contentInfo->modificationDate, + 'ownerId' => $contentInfo->ownerId, + 'published' => true, + 'publishedDate' => new \DateTime(), + 'mainLocationId' => $contentInfo->mainLocationId, + + 'contentTypeId' => $contentInfo->getContentType()->id, + 'repository' => $this->repository + ) + ); + + $publishedVersionInfo = new VersionInfoStub( + array( + 'id' => $versionInfo->id, + 'status' => VersionInfo::STATUS_PUBLISHED, + 'versionNo' => $versionNo, + 'creatorId' => $versionInfo->creatorId, + 'initialLanguageCode' => $versionInfo->initialLanguageCode, + 'languageCodes' => $versionInfo->languageCodes, + 'names' => $versionInfo->getNames(), + 'modificationDate' => new \DateTime(), + + 'contentId' => $contentInfo->id, + 'repository' => $this->repository + ) + ); + + // Set all published versions of this content object to ARCHIVED + foreach ( $this->versionInfo as $existingVersionId => $existingVersionInfo ) + { + if ( $existingVersionInfo->contentId !== $contentInfo->id ) + { + continue; + } + if ( $existingVersionInfo->status !== VersionInfo::STATUS_PUBLISHED ) + { + continue; + } + + $this->versionInfo[$existingVersionId] = new VersionInfoStub( + array( + 'id' => $existingVersionInfo->id, + 'status' => VersionInfo::STATUS_ARCHIVED, + 'versionNo' => $existingVersionInfo->versionNo, + 'creatorId' => $existingVersionInfo->creatorId, + 'initialLanguageCode' => $existingVersionInfo->initialLanguageCode, + 'languageCodes' => $existingVersionInfo->languageCodes, + 'names' => $existingVersionInfo->getNames(), + 'modificationDate' => new \DateTime(), + + 'contentId' => $contentInfo->id, + 'repository' => $this->repository + ) + ); + } + + // Creates locations specified on content created, if necessary + $this->createLocationsOnFirstPublish( $publishedContentInfo ); + + $this->contentInfo[$contentInfo->id] = $publishedContentInfo; + $this->versionInfo[$versionInfo->id] = $publishedVersionInfo; + + $this->repository->getUrlAliasService()->createAliasesForVersion( + $publishedVersionInfo + ); + + return $this->loadContentByVersionInfo( $versionInfo ); + } + + /** + * removes the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is in state published + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + */ + public function deleteVersion( VersionInfo $versionInfo ) + { + if ( false === $this->repository->hasAccess( 'content', 'versionremove' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( VersionInfo::STATUS_PUBLISHED === $versionInfo->status ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + + foreach ( $this->content as $i => $content ) + { + if ( $content->versionNo !== $versionInfo->versionNo ) + { + continue; + } + else if ( $content->id !== $versionInfo->contentId ) + { + continue; + } + + unset( $this->content[$i] ); + unset( $this->versionInfo[$versionInfo->id] ); + + break; + } + + $references = 0; + foreach ( $this->content as $i => $content ) + { + if ( $content->id === $versionInfo->contentId ) + { + ++$references; + } + } + + if ( count( $references ) === 0 ) + { + unset( $this->contentInfo[$versionInfo->contentId] ); + } + } + + /** + * Loads all versions for the given content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to list versions + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] an array of {@link \eZ\Publish\API\Repository\Values\Content\VersionInfo} sorted by creation date + */ + public function loadVersions( ContentInfo $contentInfo ) + { + if ( false === $this->repository->hasAccess( 'content', 'versionread' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $versions = array(); + foreach ( $this->versionInfo as $versionInfo ) + { + if ( $contentInfo->id === $versionInfo->contentId ) + { + $versions[] = $versionInfo; + } + } + return $versions; + } + + /** + * Copies the content to a new location. If no version is given, + * all versions are copied, otherwise only the given version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy the content to the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $destinationLocationCreateStruct the target location where the content is copied to + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function copyContent( ContentInfo $contentInfo, LocationCreateStruct $destinationLocationCreateStruct, VersionInfo $versionInfo = null ) + { + if ( false === $this->repository->hasAccess( 'content', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + ++$this->contentNextId; + + $versionNo = $versionInfo ? $versionInfo->versionNo : null; + + $this->contentInfo[$this->contentNextId] = new ContentInfoStub( + array( + 'id' => $this->contentNextId, + 'remoteId' => md5( uniqid( $contentInfo->remoteId, true ) ), + 'sectionId' => $contentInfo->sectionId, + 'alwaysAvailable' => $contentInfo->alwaysAvailable, + 'currentVersionNo' => $versionNo ? 1 : $contentInfo->currentVersionNo, + 'mainLanguageCode' => $contentInfo->mainLanguageCode, + 'modificationDate' => new \DateTime(), + 'ownerId' => $contentInfo->ownerId, + 'published' => $contentInfo->published, + 'publishedDate' => new \DateTime(), + 'mainLocationId' => $contentInfo->mainLocationId, + + 'contentTypeId' => $contentInfo->getContentType()->id, + 'repository' => $this->repository + ) + ); + + foreach ( $this->versionInfo as $versionInfoStub ) + { + if ( $versionInfoStub->contentId !== $contentInfo->id ) + { + continue; + } + if ( $versionNo && $versionInfoStub->versionNo !== $versionNo ) + { + continue; + } + + ++$this->versionNextId; + + $this->versionInfo[$this->versionNextId] = new VersionInfoStub( + array( + 'id' => $this->versionNextId, + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => $versionNo ? 1 : $versionInfoStub->versionNo, + 'creatorId' => $versionInfoStub->creatorId, + 'creationDate' => new \DateTime(), + 'modificationDate' => new \DateTime(), + 'languageCodes' => $versionInfoStub->languageCodes, + 'initialLanguageCode' => $versionInfoStub->initialLanguageCode, + 'names' => $versionInfoStub->getNames(), + + 'contentId' => $this->contentNextId, + 'repository' => $this->repository + ) + ); + } + + foreach ( $this->content as $content ) + { + if ( $content->id !== $contentInfo->id ) + { + continue; + } + if ( $versionNo && $content->versionNo !== $versionNo ) + { + continue; + } + + $this->content[] = $this->copyContentObject( + $content, + array( + 'id' => $this->contentNextId, + 'versionNo' => $versionNo ? 1 : $content->versionNo + ) + ); + } + + $locationService = $this->repository->getLocationService(); + $location = $locationService->createLocation( + $this->contentInfo[$this->contentNextId], + $destinationLocationCreateStruct + ); + + $this->repository->getUrlAliasService()->createAliasesForLocation( $location ); + + return $this->loadContent( $this->contentNextId ); + } + + /** + * Loads all outgoing relations for the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadRelations( VersionInfo $versionInfo ) + { + if ( false === $this->repository->canUser( 'content', 'read', $versionInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $relations = array(); + foreach ( $this->relation as $relation ) + { + if ( $relation->getSourceContentInfo()->id === $versionInfo->contentId ) + { + $relations[] = $relation; + } + } + return $relations; + } + + /** + * Loads all incoming relations for a content object. + * + * The relations come only + * from published versions of the source content objects + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadReverseRelations( ContentInfo $contentInfo ) + { + if ( false === $this->repository->canUser( 'content', 'reverserelatedlist', $contentInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $relations = array(); + foreach ( $this->relation as $relation ) + { + if ( $relation->getDestinationContentInfo()->id === $contentInfo->id ) + { + $relations[] = $relation; + } + } + return $relations; + } + + /** + * Adds a relation of type common. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * The source of the relation is the content and version + * referenced by $versionInfo. + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent the destination of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation the newly created relation + */ + public function addRelation( VersionInfo $sourceVersion, ContentInfo $destinationContent ) + { + if ( false === $this->repository->hasAccess( 'content', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $sourceVersion->status !== VersionInfo::STATUS_DRAFT ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + + $relation = new RelationStub( + array( + 'id' => 23, + 'sourceContentInfo' => $sourceVersion->contentInfo, + 'destinationContentInfo' => $destinationContent, + 'type' => Relation::COMMON + ) + ); + + $this->relation = array_merge( $this->relation, array( $relation ) ); + return $relation; + } + + /** + * Removes a relation of type COMMON from a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is no relation of type COMMON for the given destination + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent + */ + public function deleteRelation( VersionInfo $sourceVersion, ContentInfo $destinationContent ) + { + if ( false === $this->repository->hasAccess( 'content', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( VersionInfo::STATUS_DRAFT !== $sourceVersion->status ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + + $relationNotFound = true; + $relationNoCommon = true; + foreach ( $this->relation as $i => $relation ) + { + if ( $relation->getDestinationContentInfo() !== $destinationContent ) + { + continue; + } + if ( $relation->getSourceContentInfo() !== $sourceVersion->getContentInfo() ) + { + continue; + } + $relationNotFound = false; + + if ( $relation->type !== Relation::COMMON ) + { + continue; + } + $relationNoCommon = false; + + unset( $this->relation[$i] ); + break; + } + + if ( $relationNotFound || $relationNoCommon ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + + /** + * Instantiates a new content create struct object + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param string $mainLanguageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ + public function newContentCreateStruct( ContentType $contentType, $mainLanguageCode ) + { + return new ContentCreateStructStub( + array( + 'contentType' => $contentType, + 'mainLanguageCode' => $mainLanguageCode, + 'modificationDate' => new \DateTime(), + 'remoteId' => md5( uniqid( __CLASS__, true ) ), + 'ownerId' => $this->repository->getCurrentUser()->id + ) + ); + } + + /** + * Instantiates a new content meta data update struct + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct + */ + public function newContentMetadataUpdateStruct() + { + return new ContentMetadataUpdateStruct(); + } + + /** + * Instantiates a new content update struct + * @return \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct + */ + public function newContentUpdateStruct() + { + return new ContentUpdateStructStub(); + } + + /** + * Internal helper method that returns all ContentInfo objects for the given + * $contentType. + * + * @access private + * + * @internal + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * + * @return \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub[] + */ + public function loadContentInfoByContentType( ContentType $contentType ) + { + $result = array(); + foreach ( $this->contentInfo as $contentInfo ) + { + if ( $contentInfo->contentType->id === $contentType->id ) + { + $result[] = $contentInfo; + } + } + + return $result; + } + + /** + * Internal helper method used to load ContentInfo objects by their main + * language code. + * + * @access private + * + * @internal + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub[] + */ + public function loadContentInfoByLanguageCode( $languageCode ) + { + $matches = array(); + foreach ( $this->contentInfo as $contentInfo ) + { + if ( $contentInfo->mainLanguageCode === $languageCode ) + { + $matches[] = $contentInfo; + } + } + return $matches; + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Copies a content object. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param string[] $overwrites + * + * @return Values\Content\ContentStub + */ + private function copyContentObject( Content $content, array $overwrites = array() ) + { + $names = array( + 'id', + 'fields', + 'contentTypeId', + 'versionNo', + 'repository' + ); + + $values = array(); + foreach ( $names as $name ) + { + if ( array_key_exists( $name, $overwrites ) ) + { + $values[$name] = $overwrites[$name]; + } + else + { + $values[$name] = $content->{$name}; + } + } + + $newContent = new ContentStub( $values ); + + // copy relations + $relations = $this->loadRelations( $content->getVersionInfo() ); + foreach ( $relations as $relation ) + { + $this->addRelation( $newContent->getVersionInfo(), $relation->getDestinationContentInfo() ); + } + return $newContent; + } + + /** + * Tests if the given $remoteId already exists. + * + * @param string $remoteId + * + * @return boolean + */ + private function remoteIdExists( $remoteId ) + { + if ( null === $remoteId ) + { + return false; + } + + foreach ( $this->contentInfo as $contentInfo ) + { + if ( $remoteId === $contentInfo->remoteId ) + { + return true; + } + } + return false; + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + list( + $this->contentInfo, + $this->contentNextId, + $this->versionInfo, + $this->versionNextId, + $this->content + ) = $this->repository->loadFixture( 'Content' ); + } + + // Ignore this eZ Publish 5 feature by now. + + // @codeCoverageIgnoreStart + + /** + * Translate a version + * + * updates the destination version given in $translationInfo with the provided translated fields in $translationValues + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the given destination version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $translationValues is not valid + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * @param \eZ\Publish\API\Repository\Values\Content\TranslationValues $translationValues + * @param \eZ\Publish\API\Repository\Values\User\User $user If set, this user is taken as modifier of the version + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the translated fields + * + * @since 5.0 + */ + public function translateVersion( TranslationInfo $translationInfo, TranslationValues $translationValues, User $user = null ) + { + // @todo: Implement translateVersion() method. + } + + /** + * Adds translation information to the content object + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed add a translation info + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * + * @since 5.0 + */ + public function addTranslationInfo( TranslationInfo $translationInfo ) + { + // @todo: Implement addTranslationInfo() method. + } + + /** + * lists the translations done on this content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed read translation infos + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $filter + * + * @todo TBD - filter by sourceversion destination version and languages + * + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo[] + * + * @since 5.0 + */ + public function loadTranslationInfos( ContentInfo $contentInfo, array $filter = array() ) + { + // @todo: Implement loadTranslationInfos() method. + } + + /** + * Instantiates a new TranslationInfo object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo + */ + public function newTranslationInfo() + { + // @todo: Implement newTranslationInfo() method. + } + + /** + * Instantiates a Translation object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationValues + */ + public function newTranslationValues() + { + // @todo: Implement newTranslationValues() method. + } + + // @codeCoverageIgnoreEnd +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/ContentTypeServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/ContentTypeServiceStub.php new file mode 100644 index 0000000..b628248 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/ContentTypeServiceStub.php @@ -0,0 +1,1109 @@ +initGroupProperties(); + + $this->repository = $repository; + $this->contentService = $contentService; + + $this->initFromFixture(); + } + + /** + * Initialize array of reflected group properties + * + * @return void + */ + protected function initGroupProperties() + { + $this->groupProperties = array(); + + $reflectionClass = new \ReflectionClass( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup' + ); + + foreach ( $reflectionClass->getProperties() as $reflectionProperty ) + { + $this->groupProperties[] = $reflectionProperty->name; + } + $this->groupProperties[] = 'names'; + $this->groupProperties[] = 'descriptions'; + } + + /** + * Create a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a group with the same identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function createContentTypeGroup( ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $data = array(); + foreach ( $this->groupProperties as $propertyName ) + { + if ( isset( $contentTypeGroupCreateStruct->$propertyName ) ) + { + $data[$propertyName] = $contentTypeGroupCreateStruct->$propertyName; + } + } + + $data['id'] = $this->nextGroupId++; + + $group = new ContentTypeGroupStub( $data ); + + $this->setGroup( $group ); + + return $group; + } + + /** + * Sets the group internally + * + * @param \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeGroupStub $group + * + * @return void + */ + protected function setGroup( ContentTypeGroupStub $group ) + { + if ( isset( $this->groups[$group->identifier] ) ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + $this->groups[$group->identifier] = $group; + $this->groupsById[$group->id] = $group; + } + + /** + * Get a Content Type Group object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param int $contentTypeGroupId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroup( $contentTypeGroupId ) + { + if ( !isset( $this->groupsById[$contentTypeGroupId] ) ) + { + throw new Exceptions\NotFoundExceptionStub; + } + return $this->groupsById[$contentTypeGroupId]; + } + + /** + * Get a Content Type Group object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param string $contentTypeGroupIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroupByIdentifier( $contentTypeGroupIdentifier ) + { + if ( !isset( $this->groups[$contentTypeGroupIdentifier] ) ) + { + throw new Exceptions\NotFoundExceptionStub; + } + return $this->groups[$contentTypeGroupIdentifier]; + } + + /** + * Get all Content Type Groups + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function loadContentTypeGroups() + { + return $this->groupsById; + } + + /** + * Update a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier (if set) already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup the content type group to be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct + */ + public function updateContentTypeGroup( ContentTypeGroup $contentTypeGroup, ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + unset( $this->groups[$contentTypeGroup->identifier] ); + unset( $this->groupsById[$contentTypeGroup->id] ); + + $data = array(); + + foreach ( $this->groupProperties as $propertyName ) + { + if ( isset( $contentTypeGroup->$propertyName ) ) + { + $data[$propertyName] = $contentTypeGroup->$propertyName; + } + if ( isset( $contentTypeGroupUpdateStruct->$propertyName ) ) + { + $data[$propertyName] = $contentTypeGroupUpdateStruct->$propertyName; + } + } + + $newGroup = new ContentTypeGroupStub( $data ); + + $this->setGroup( $newGroup ); + } + + /** + * Delete a Content Type Group. + * + * This method only deletes an content type group which has content types without any content instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a to be deleted content type has instances + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $ContentTypeGroup + */ + public function deleteContentTypeGroup( ContentTypeGroup $contentTypeGroup ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $this->groupHasTypes( $contentTypeGroup ) ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + + unset( $this->groups[$contentTypeGroup->identifier] ); + unset( $this->groupsById[$contentTypeGroup->id] ); + } + + /** + * Checks of $contentTypeGroup has types assigned + * + * @param ContentTypeGroup $contentTypeGroup + * + * @return boolean + */ + protected function groupHasTypes( ContentTypeGroup $contentTypeGroup ) + { + $types = array_merge( $this->types, $this->typeDrafts ); + + foreach ( $types as $type ) + { + foreach ( $type->contentTypeGroups as $assignedGroup ) + { + if ( $assignedGroup->id == $contentTypeGroup->id ) + { + return true; + } + } + } + return false; + } + + /** + * Create a Content Type object. + * + * The content type is created in the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the identifier or remoteId in the content type create struct already exists + * or there is a duplicate field identifier + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct $contentTypeCreateStruct + * @param array $contentTypeGroups Required array of {@link ContentTypeGroup} to link type with (must contain one) + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentType( ContentTypeCreateStruct $contentTypeCreateStruct, array $contentTypeGroups ) + { + $this->checkContentTypeCreate( $contentTypeCreateStruct ); + + $data = array(); + foreach ( $contentTypeCreateStruct as $propertyName => $propertyValue ) + { + $data[$propertyName] = $propertyValue; + } + + $data['fieldDefinitions'] = array(); + + if ( is_array( $contentTypeCreateStruct->fieldDefinitions ) ) + { + $fieldDefinitionCreates = $contentTypeCreateStruct->fieldDefinitions; + foreach ( $fieldDefinitionCreates as $fieldDefinitionCreate ) + { + $data['fieldDefinitions'][] = $this->createFieldDefinition( $fieldDefinitionCreate ); + } + } + + $data['contentTypeGroups'] = $contentTypeGroups; + + // @todo FIXME: Set status to draft + $data['id'] = $this->nextTypeId++; + + return $this->setContentTypeDraft( $data ); + } + + /** + * Checks that the given $contentTypeCreateStruct is valid + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the identifier or remoteId in the content type create struct already exists + * or there is a duplicate field identifier + * + * @param ContentTypeCreateStruct $contentTypeCreateStruct + * + * @return void + */ + protected function checkContentTypeCreate( ContentTypeCreateStruct $contentTypeCreateStruct ) + { + $types = array_merge( $this->types, $this->typeDrafts ); + foreach ( $types as $type ) + { + if ( $type->identifier == $contentTypeCreateStruct->identifier ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + if ( $type->remoteId == $contentTypeCreateStruct->remoteId ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + + $fieldIdentifiers = array(); + foreach ( $contentTypeCreateStruct->fieldDefinitions as $fieldDefinitionCreate ) + { + if ( isset( $fieldIdentifiers[$fieldDefinitionCreate->identifier] ) ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + $fieldIdentifiers[$fieldDefinitionCreate->identifier] = true; + } + } + + /** + * Creates a FieldDefinition from $fieldDefinitionCreate + * + * @param FieldDefinitionCreateStruct $fieldDefinitionCreate + * + * @return FieldDefinition + */ + protected function createFieldDefinition( FieldDefinitionCreateStruct $fieldDefinitionCreate ) + { + $data = array(); + foreach ( $fieldDefinitionCreate as $propertyName => $propertyValue ) + { + $data[$propertyName] = $propertyValue; + } + $data['id'] = $this->nextFieldDefinitionId++; + + return new FieldDefinitionStub( $data ); + } + + /** + * Get a Content Type object draft by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the content type draft owned by the current user can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function loadContentTypeDraft( $contentTypeId ) + { + if ( isset( $this->typeDrafts[$contentTypeId] ) ) + { + return $this->typeDrafts[$contentTypeId]; + } + throw new Exceptions\NotFoundExceptionStub; + } + + /** + * Update a Content Type object + * + * Does not update fields (fieldDefinitions), use {@link updateFieldDefinition()} to update them. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier or remoteId already exists or there is no draft assigned to the authenticated user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct + */ + public function updateContentTypeDraft( ContentTypeDraft $contentTypeDraft, ContentTypeUpdateStruct $contentTypeUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->checkContentTypeUpdate( $contentTypeDraft, $contentTypeUpdateStruct ); + + $data = $this->getTypeAsArray( $contentTypeDraft ); + + foreach ( array_keys( $data ) as $propertyName ) + { + if ( isset( $contentTypeUpdateStruct->$propertyName ) ) + { + $data[$propertyName] = $contentTypeUpdateStruct->$propertyName; + } + } + + $this->setContentTypeDraft( $data ); + } + + /** + * Returns the properties of $contentType in form of an array + * + * @param ContentType $contentType + * + * @return array + */ + protected function getTypeAsArray( ContentType $contentType ) + { + return array( + 'id' => $contentType->id, + 'status' => $contentType->status, + 'names' => $contentType->names, + 'descriptions' => $contentType->descriptions, + 'identifier' => $contentType->identifier, + 'creationDate' => $contentType->creationDate, + 'modificationDate' => $contentType->modificationDate, + 'creatorId' => $contentType->creatorId, + 'modifierId' => $contentType->modifierId, + 'remoteId' => $contentType->remoteId, + 'urlAliasSchema' => $contentType->urlAliasSchema, + 'nameSchema' => $contentType->nameSchema, + 'isContainer' => $contentType->isContainer, + 'mainLanguageCode' => $contentType->mainLanguageCode, + 'defaultAlwaysAvailable' => $contentType->defaultAlwaysAvailable, + 'defaultSortField' => $contentType->defaultSortField, + 'defaultSortOrder' => $contentType->defaultSortOrder, + 'contentTypeGroups' => $contentType->contentTypeGroups, + 'fieldDefinitions' => $contentType->fieldDefinitions, + ); + } + + /** + * Checks that the given $contentTypeUpdateStruct is valid + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the identifier or remoteId in the content type create struct already exists + * or there is a duplicate field identifier + * + * @param ContentTypeCreateStruct $contentTypeCreateStruct + * + * @return void + */ + protected function checkContentTypeUpdate( ContentTypeDraft $contentTypeDraft, ContentTypeUpdateStruct $contentTypeUpdateStruct ) + { + $types = array_merge( $this->types, $this->typeDrafts ); + foreach ( $types as $type ) + { + if ( $type->id == $contentTypeDraft->id ) + { + continue; + } + if ( $type->identifier == $contentTypeUpdateStruct->identifier ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + if ( $type->remoteId == $contentTypeUpdateStruct->remoteId ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + } + + /** + * Adds a new field definition to an existing content type. + * + * The content type must be in state DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the identifier in already exists in the content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + */ + public function addFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinitionCreateStruct $fieldDefinitionCreateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( $contentTypeDraft->fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier == $fieldDefinitionCreateStruct->identifier ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + + $data = $this->getTypeAsArray( $contentTypeDraft ); + + $data['fieldDefinitions'][] = $this->createFieldDefinition( $fieldDefinitionCreateStruct ); + + $this->setContentTypeDraft( $data ); + } + + /** + * Remove a field definition from an existing Type. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given field definition does not belong to the given type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + */ + public function removeFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $data = $this->getTypeAsArray( $contentTypeDraft ); + + $removed = false; + foreach ( $data['fieldDefinitions'] as $index => $existingDefinition ) + { + if ( $existingDefinition->id == $fieldDefinition->id ) + { + unset( $data['fieldDefinitions'][$index] ); + $removed = true; + } + } + + if ( !$removed ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + + $this->setContentTypeDraft( $data ); + } + + /** + * Creates and sets a new ContentTypeDraft from $data + * + * @param array $data + * + * @return \eZ\Publish\API\Repository\Values\ContentTypeDraft + */ + protected function setContentTypeDraft( array $data ) + { + $data['status'] = ContentType::STATUS_DRAFT; + + $newType = new ContentTypeDraftStub( new ContentTypeStub( $data ) ); + + $this->typeDrafts[$newType->id] = $newType; + + return $newType; + } + + /** + * Update a field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the field id in the update struct is not found or does not belong to the content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier is used in an existing field of the given content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft the content type draft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition the field definition which should be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + */ + public function updateFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition, FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->checkFieldDefinitionUpdate( $contentTypeDraft, $fieldDefinition, $fieldDefinitionUpdateStruct ); + + $fieldData = $this->getFieldDefinitionAsArray( $fieldDefinition ); + foreach ( $fieldData as $propertyName => $propertyValue ) + { + if ( isset( $fieldDefinitionUpdateStruct->$propertyName ) ) + { + $fieldData[$propertyName] = $fieldDefinitionUpdateStruct->$propertyName; + } + } + $newFieldDefinition = new FieldDefinitionStub( $fieldData ); + + $typeData = $this->getTypeAsArray( $contentTypeDraft ); + foreach ( $typeData['fieldDefinitions'] as $index => $existingFieldDefinition ) + { + if ( $existingFieldDefinition->id == $newFieldDefinition->id ) + { + $typeData['fieldDefinitions'][$index] = $newFieldDefinition; + } + } + + $this->setContentTypeDraft( $typeData ); + } + + /** + * Checks the given update combination for validity + * + * @param ContentTypeDraft $contentTypeDraft + * @param FieldDefinition $fieldDefinition + * @param FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + * + * @return void + */ + protected function checkFieldDefinitionUpdate( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition, FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct ) + { + $foundFieldId = false; + foreach ( $contentTypeDraft->fieldDefinitions as $existingFieldDefinition ) + { + if ( $existingFieldDefinition->id == $fieldDefinition->id ) + { + $foundFieldId = true; + } + else if ( $existingFieldDefinition->identifier == $fieldDefinitionUpdateStruct->identifier ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + if ( !$foundFieldId ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + + /** + * Returns the data of $fieldDefinition as an array + * + * @param FieldDefinition $fieldDefinition + * + * @return array + */ + protected function getFieldDefinitionAsArray( FieldDefinition $fieldDefinition ) + { + return array( + 'id' => $fieldDefinition->id, + 'identifier' => $fieldDefinition->identifier, + 'names' => $fieldDefinition->names, + 'descriptions' => $fieldDefinition->descriptions, + 'fieldGroup' => $fieldDefinition->fieldGroup, + 'position' => $fieldDefinition->position, + 'fieldTypeIdentifier' => $fieldDefinition->fieldTypeIdentifier, + 'isTranslatable' => $fieldDefinition->isTranslatable, + 'isRequired' => $fieldDefinition->isRequired, + 'isInfoCollector' => $fieldDefinition->isInfoCollector, + 'validatorConfiguration' => $fieldDefinition->validatorConfiguration, + 'defaultValue' => $fieldDefinition->defaultValue, + 'isSearchable' => $fieldDefinition->isSearchable, + ); + } + + /** + * Publish the content type and update content objects. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If the content type has no draft + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish a content type + * + * This method updates content objects, depending on the changed field definitions. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + */ + public function publishContentTypeDraft( ContentTypeDraft $contentTypeDraft ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( !isset( $this->typeDrafts[$contentTypeDraft->id] ) ) + { + throw new Exceptions\BadStateExceptionStub; + } + + $this->types[$contentTypeDraft->id] = $this->typeDrafts[$contentTypeDraft->id] + ->getInnerContentType(); + unset( $this->typeDrafts[$contentTypeDraft->id] ); + + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If a content type with the given id and status DEFINED can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentType( $contentTypeId ) + { + if ( isset( $this->types[$contentTypeId] ) ) + { + return $this->types[$contentTypeId]; + } + throw new Exceptions\NotFoundExceptionStub; + } + + /** + * Get a Content Type object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given identifier and status DEFINED can not be found + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByIdentifier( $identifier ) + { + foreach ( $this->types as $contentType ) + { + if ( $identifier === $contentType->identifier ) + { + return $contentType; + } + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given remote id and status DEFINED can not be found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByRemoteId( $remoteId ) + { + foreach ( $this->types as $contentType ) + { + if ( $remoteId === $contentType->remoteId ) + { + return $contentType; + } + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Get Content Type objects which belong to the given content type group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType[] Which have status DEFINED + */ + public function loadContentTypes( ContentTypeGroup $contentTypeGroup ) + { + $typesInGroup = array(); + + foreach ( $this->types as $type ) + { + foreach ( $type->contentTypeGroups as $group ) + { + if ( $group->id == $contentTypeGroup->id ) + { + $typesInGroup[] = $type; + } + } + } + + return $typesInGroup; + } + + /** + * Creates a draft from an existing content type. + * + * This is a complete copy of the content + * type which has the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there is already a draft assigned to another user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentTypeDraft( ContentType $contentType ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( isset( $this->typeDrafts[$contentType->id] ) ) + { + throw new Exceptions\BadStateExceptionStub; + } + $data = $this->getTypeAsArray( $this->types[$contentType->id] ); + return $this->setContentTypeDraft( $data ); + } + + /** + * Delete a Content Type object. + * + * Deletes a content type if it has no instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there exist content objects of this type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + */ + public function deleteContentType( ContentType $contentType ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( $this->contentService->loadContentInfoByContentType( $contentType ) ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + + unset( $this->types[$contentType->id] ); + } + + /** + * Copy Type incl fields and groupIds to a new Type object + * + * New Type will have $userId as creator / modifier, created / modified should be updated with current time, + * updated remoteId and identifier should be appended with '_' + unique string. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\User\User $user if null the current user is used + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function copyContentType( ContentType $contentType, User $user = null ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + $contentTypeData = $this->getTypeAsArray( $contentType ); + + $contentTypeData['id'] = $this->nextTypeId++; + $contentTypeData['identifier'] = $contentTypeData['identifier'] . '_' . uniqid(); + $contentTypeData['remoteId'] = $contentTypeData['remoteId'] . '_' . uniqid(); + $contentTypeData['creationDate'] = new \DateTime(); + $contentTypeData['modificationDate'] = new \DateTime(); + $contentTypeData['creatorId'] = $user ? $user->id : $contentTypeData['creatorId']; + $contentTypeData['modifierId'] = $user ? $user->id : $contentTypeData['modifierId']; + + $newFieldDefinitions = array(); + foreach ( $contentTypeData['fieldDefinitions'] as $fieldDefinition ) + { + $definitionData = $this->getFieldDefinitionAsArray( $fieldDefinition ); + $definitionData['id'] = $this->nextFieldDefinitionId++; + $newFieldDefinitions[] = new FieldDefinitionStub( $definitionData ); + } + $contentTypeData['fieldDefinitions'] = $newFieldDefinitions; + + $newType = new ContentTypeStub( $contentTypeData ); + $this->types[$contentTypeData['id']] = $newType; + return $newType; + } + + /** + * Assigns a content type to a content type group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to unlink a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is already assigned the given group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function assignContentTypeGroup( ContentType $contentType, ContentTypeGroup $contentTypeGroup ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $assignedGroups = $this->types[$contentType->id]->contentTypeGroups; + foreach ( $assignedGroups as $assignedGroup ) + { + if ( $assignedGroup->id == $contentTypeGroup->id ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + + $typeData = $this->getTypeAsArray( $this->types[$contentType->id] ); + $typeData['contentTypeGroups'][] = $contentTypeGroup; + $this->types[$contentType->id] = new ContentTypeStub( $typeData ); + } + + /** + * Unassign a content type from a group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to link a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is not assigned this the given group. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $contentTypeGroup is the last group assigned to the content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function unassignContentTypeGroup( ContentType $contentType, ContentTypeGroup $contentTypeGroup ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $typeData = $this->getTypeAsArray( $this->types[$contentType->id] ); + + $unassigned = false; + foreach ( $typeData['contentTypeGroups'] as $index => $assignedGroup ) + { + if ( $assignedGroup->id == $contentTypeGroup->id ) + { + unset( $typeData['contentTypeGroups'][$index] ); + $unassigned = true; + } + } + + if ( !$unassigned ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + if ( empty( $typeData['contentTypeGroups'] ) ) + { + throw new Exceptions\BadStateExceptionStub; + } + + $this->types[$contentType->id] = new ContentTypeStub( $typeData ); + } + + /** + * Instantiates a new content type group create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct + */ + public function newContentTypeGroupCreateStruct( $identifier ) + { + $groupCreate = new ContentTypeGroupCreateStruct(); + $groupCreate->identifier = $identifier; + return $groupCreate; + } + + /** + * Instantiates a new content type create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct + */ + public function newContentTypeCreateStruct( $identifier ) + { + $typeCreate = new ContentTypeCreateStructStub(); + $typeCreate->identifier = $identifier; + return $typeCreate; + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct + */ + public function newContentTypeUpdateStruct() + { + return new ContentTypeUpdateStruct(); + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct + */ + public function newContentTypeGroupUpdateStruct() + { + return new ContentTypeGroupUpdateStruct(); + } + + /** + * Instantiates a field definition create struct + * + * @param string $fieldTypeIdentifier the required field type identifier + * @param string $identifier the required identifier for the field definition + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct + */ + public function newFieldDefinitionCreateStruct( $identifier, $fieldTypeIdentifier ) + { + $fieldDefinitionCreate = new FieldDefinitionCreateStruct(); + + $fieldDefinitionCreate->identifier = $identifier; + $fieldDefinitionCreate->fieldTypeIdentifier = $fieldTypeIdentifier; + + return $fieldDefinitionCreate; + } + + /** + * Instantiates a field definition update class + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct + */ + public function newFieldDefinitionUpdateStruct() + { + return new FieldDefinitionUpdateStruct(); + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + $this->groups = array(); + $this->groupsById = array(); + + list( + $contentTypeGroups, + $this->nextGroupId + ) = $this->repository->loadFixture( 'ContentTypeGroup' ); + + ++$this->nextGroupId; + foreach ( $contentTypeGroups as $group ) + { + $this->setGroup( $group ); + } + + list( + $this->types, + $this->nextTypeId, + $this->nextFieldDefinitionId + ) = $this->repository->loadFixture( 'ContentType', array( 'groups' => $contentTypeGroups ) ); + + ++$this->nextTypeId; + ++$this->nextFieldDefinitionId; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Exceptions/BadStateExceptionStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Exceptions/BadStateExceptionStub.php new file mode 100644 index 0000000..1a2d8b0 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Exceptions/BadStateExceptionStub.php @@ -0,0 +1,22 @@ +fieldTypes['ezurl'] = new FieldTypeStub( 'ezurl' ); + } + + /** + * Returns a list of all field types. + * + * @return \eZ\Publish\API\Repository\FieldType[] + */ + public function getFieldTypes() + { + return array_values( $this->fieldTypes ); + } + + /** + * Returns the FieldType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\FieldType + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * if there is no FieldType registered with $identifier + */ + public function getFieldType( $identifier ) + { + if ( !$this->hasFieldType( $identifier ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + return $this->fieldTypes[$identifier]; + } + + /** + * Returns if there is a FieldType registered under $identifier + * + * @param string $identifier + * + * @return boolean + */ + public function hasFieldType( $identifier ) + { + return isset( $this->fieldTypes[$identifier] ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/FieldTypeStub.php b/eZ/Publish/API/Repository/Tests/Stubs/FieldTypeStub.php new file mode 100644 index 0000000..f96e936 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/FieldTypeStub.php @@ -0,0 +1,232 @@ +identifier = $identifier; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return $this->identifier; + } + + /** + * Returns a schema for the settings expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the settings of + * the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementor to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * @return mixed + */ + public function getSettingsSchema() + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Returns a schema for the validator configuration expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the validator + * configuration of the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementor to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * Best practice: + * + * It is considered best practice to return a hash map, which contains + * rudimentary settings structures, like e.g. for the "ezstring" FieldType + * + * + * array( + * 'StringLengthValidator' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * + * + * @return mixed + */ + public function getValidatorConfigurationSchema() + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Indicates if the field type supports indexing and sort keys for searching + * + * @return boolean + */ + public function isSearchable() + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return mixed + */ + public function getEmptyValue() + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return mixed + */ + public function fromHash( $hash ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Converts a Value to a hash + * + * @param mixed $value + * + * @return mixed + */ + public function toHash( $value ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * getName + * + * @return mixed $value + */ + public function getName( $value ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Converts the given $fieldSettings to a simple hash format + * + * See the class description for more details on a hash format. + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * See the class description for more details on a hash format. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Converts the given $validatorConfiguration to a simple hash format + * + * See the class description for more details on a hash format. + * + * @param mixed $validatorConfiguration + * + * @return array|hash|scalar|null + */ + public function validatorConfigurationToHash( $validatorConfiguration ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } + + /** + * Converts the given $validatorConfigurationHash to a validator + * configuration of the type + * + * See the class description for more details on a hash format. + * + * @param array|hash|scalar|null $validatorConfigurationHash + * + * @return mixed + */ + public function validatorConfigurationFromHash( $validatorConfigurationHash ) + { + throw new \RuntimeException( "Not implemented, just a wrapper." ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/IOServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/IOServiceStub.php new file mode 100644 index 0000000..4d5759c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/IOServiceStub.php @@ -0,0 +1,225 @@ +tempFile as $tempFile ) + { + unlink( $tempFile ); + } + } + + /** + * Creates a BinaryFileCreateStruct object from the uploaded file $uploadedFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException When given an invalid uploaded file + * + * @param array $uploadedFile The $_POST hash of an uploaded file + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct + */ + public function newBinaryCreateStructFromUploadedFile( array $uploadedFile ) + { + if ( false === is_uploaded_file( $uploadedFile['tmp_name'] ) ) + { + throw new InvalidArgumentExceptionStub; + } + if ( false === ( $stream = fopen( $uploadedFile['tmp_name'], 'rb' ) ) ) + { + throw new InvalidArgumentExceptionStub; + } + + return new BinaryFileCreateStruct( + array( + 'mimeType' => $uploadedFile['type'], + 'uri' => 'file://' . realpath( $uploadedFile['tmp_name'] ), + 'originalFileName' => $uploadedFile['name'], + 'size' => filesize( $uploadedFile['tmp_name'] ), + 'inputStream' => $stream + ) + ); + } + + /** + * Creates a BinaryFileCreateStruct object from $localFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException When given a non existing / unreadable file + * + * @param string $localFile Path to local file + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct + */ + public function newBinaryCreateStructFromLocalFile( $localFile ) + { + if ( false === file_exists( $localFile ) || false === is_readable( $localFile ) ) + { + throw new InvalidArgumentExceptionStub; + } + if ( false === ( $stream = fopen( $localFile, 'rb' ) ) ) + { + throw new InvalidArgumentExceptionStub; + } + + return new BinaryFileCreateStruct( + array( + 'mimeType' => mime_content_type( $localFile ), + 'uri' => 'file://' . realpath( $localFile ), + 'originalFileName' => basename( $localFile ), + 'size' => filesize( $localFile ), + 'inputStream' => $stream + ) + ); + } + + /** + * Creates a binary file in the the repository + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct $binaryFileCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile The created BinaryFile object + */ + public function createBinaryFile( BinaryFileCreateStruct $binaryFileCreateStruct ) + { + $this->binary[++$this->binaryId] = new BinaryFile( + array( + 'id' => $this->binaryId, + 'size' => $binaryFileCreateStruct->size, + 'ctime' => time(), + 'mtime' => time(), + 'uri' => $binaryFileCreateStruct->uri, + 'originalFile' => $binaryFileCreateStruct->originalFileName, + 'mimeType' => $binaryFileCreateStruct->mimeType + ) + ); + + $this->content[$this->binaryId] = ''; + while ( false === feof( $binaryFileCreateStruct->inputStream ) ) + { + $this->content[$this->binaryId] .= fgets( $binaryFileCreateStruct->inputStream ); + } + + // ??? + // fclose( $binaryFileCreateStruct->inputStream ); + + return $this->binary[$this->binaryId]; + } + + /** + * Deletes the BinaryFile with $path + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + */ + public function deleteBinaryFile( BinaryFile $binaryFile ) + { + unset( $this->binary[$binaryFile->id] ); + } + + /** + * Loads the binary file with $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $binaryFileid + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile + */ + public function loadBinaryFile( $binaryFileId ) + { + if ( false === isset( $this->binary[$binaryFileId] ) ) + { + throw new NotFoundExceptionStub; + } + return $this->binary[$binaryFileId]; + } + + /** + * Returns a read (mode: rb) file resource to the binary file identified by $path + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + * + * @return resource + */ + public function getFileInputStream( BinaryFile $binaryFile ) + { + // We use a temp file here, because it makes streaming really simple + $tempFile = tempnam( sys_get_temp_dir(), __CLASS__ ); + file_put_contents( $tempFile, $this->content[$binaryFile->id] ); + + $this->tempFile[] = $tempFile; + + return fopen( $tempFile, 'rb' ); + } + + /** + * Returns the content of the binary file + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + * + * @return string + */ + public function getFileContents( BinaryFile $binaryFile ) + { + return $this->content[$binaryFile->id]; + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->binary = array(); + $this->binaryId = 0; + $this->content = array(); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/LanguageServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/LanguageServiceStub.php new file mode 100644 index 0000000..dbc5498 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/LanguageServiceStub.php @@ -0,0 +1,308 @@ +repository = $repository; + $this->contentService = $contentService; + $this->defaultLanguageCode = $defaultLanguageCode; + + $this->initFromFixture(); + } + + /** + * Creates the a new Language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the languageCode already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct $languageCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function createLanguage( LanguageCreateStruct $languageCreateStruct ) + { + if ( isset( $this->codes[$languageCreateStruct->languageCode] ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + if ( true !== $this->repository->hasAccess( 'content', 'translations' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $language = new Language( + array( + 'id' => ++$this->nextId, + 'name' => $languageCreateStruct->name, + 'enabled' => $languageCreateStruct->enabled, + 'languageCode' => $languageCreateStruct->languageCode + ) + ); + + $this->languages[$language->id] = $language; + $this->codes[$language->languageCode] = $language->id; + + return $language; + } + + /** + * Changes the name of the language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * @param string $newName + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function updateLanguageName( Language $language, $newName ) + { + if ( true !== $this->repository->hasAccess( 'content', 'translations' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->languages[$language->id] = new Language( + array( + 'id' => $language->id, + 'name' => $newName, + 'enabled' => $language->enabled, + 'languageCode' => $language->languageCode + ) + ); + + return $this->languages[$language->id]; + } + + /** + * Enables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function enableLanguage( Language $language ) + { + if ( true !== $this->repository->hasAccess( 'content', 'translations' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->languages[$language->id] = new Language( + array( + 'id' => $language->id, + 'name' => $language->name, + 'enabled' => true, + 'languageCode' => $language->languageCode + ) + ); + } + + /** + * Disables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function disableLanguage( Language $language ) + { + if ( true !== $this->repository->hasAccess( 'content', 'translations' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->languages[$language->id] = new Language( + array( + 'id' => $language->id, + 'name' => $language->name, + 'enabled' => false, + 'languageCode' => $language->languageCode + ) + ); + } + + /** + * Loads a Language from its language code ($languageCode) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguage( $languageCode ) + { + if ( isset( $this->codes[$languageCode] ) ) + { + return $this->languages[$this->codes[$languageCode]]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads all Languages + * + * @return \eZ\Publish\API\Repository\Values\Content\Language[] + */ + public function loadLanguages() + { + return array_values( $this->languages ); + } + + /** + * Loads a Language by its id ($languageId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param int $languageId + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguageById( $languageId ) + { + if ( isset( $this->languages[$languageId] ) ) + { + return $this->languages[$languageId]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Deletes a language from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if language can not be deleted + * because it is still assigned to some content / type / (...). + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function deleteLanguage( Language $language ) + { + if ( true !== $this->repository->hasAccess( 'content', 'translations' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( count( $this->contentService->loadContentInfoByLanguageCode( $language->languageCode ) ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + unset( $this->languages[$language->id], $this->codes[$language->languageCode] ); + } + + /** + * Returns a configured default language code + * + * @return string + */ + public function getDefaultLanguageCode() + { + return $this->defaultLanguageCode; + } + + /** + * Instantiates an object to be used for creating languages + * + * @return \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct + */ + public function newLanguageCreateStruct() + { + return new LanguageCreateStruct(); + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + list( + $this->languages, + $this->codes, + $this->nextId + ) = $this->repository->loadFixture( 'Language' ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/LocationServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/LocationServiceStub.php new file mode 100644 index 0000000..9845442 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/LocationServiceStub.php @@ -0,0 +1,868 @@ +repository = $repository; + $this->initFromFixture(); + } + + /** + * Instantiates a new location create class + * + * @param int $parentLocationId the parent under which the new location should be created + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct + */ + public function newLocationCreateStruct( $parentLocationId ) + { + return new LocationCreateStruct( + array( + 'parentLocationId' => $parentLocationId + ) + ); + } + + /** + * Creates the new $location in the content repository for the given content + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the content is already below the specified parent + * or the parent is a sub location of the location the content + * or if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $locationCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created Location + * + */ + public function createLocation( ContentInfo $contentInfo, LocationCreateStruct $locationCreateStruct ) + { + $parentLocation = $this->loadLocation( $locationCreateStruct->parentLocationId ); + + if ( false === $this->repository->canUser( 'content', 'create', $parentLocation ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->checkContentNotInPath( $contentInfo, $parentLocation ); + $this->checkContentNotInTree( $contentInfo, $parentLocation ); + $this->checkRemoteIdNotTaken( $locationCreateStruct->remoteId ); + + if ( null === $locationCreateStruct->remoteId ) + { + $locationCreateStruct->remoteId = md5( uniqid( __METHOD__, true ) ); + } + + $data = array(); + foreach ( $locationCreateStruct as $propertyName => $propertyValue ) + { + $data[$propertyName] = $propertyValue; + } + + $data['contentInfo'] = $contentInfo; + + $data['id'] = ++$this->nextLocationId; + $data['pathString'] = $parentLocation->pathString . $data['id'] . '/'; + $data['depth'] = substr_count( $data['pathString'], '/' ) - 2; + $data['invisible'] = $locationCreateStruct->hidden; + + $location = new LocationStub( $data ); + $this->locations[$location->id] = $location; + + // Set main location if not set before. + if ( null === $contentInfo->mainLocationId ) + { + $contentInfo->setMainLocationId( $location->id ); + } + + return $location; + } + + /** + * Checks if the given $remoteId is already taken by another Location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if the remoteId exists already. + * @param string $remoteId + * + * @return void + */ + protected function checkRemoteIdNotTaken( $remoteId ) + { + foreach ( $this->locations as $location ) + { + if ( $location->remoteId == $remoteId ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + } + + /** + * Checks that the given $contentInfo does not occur in the tree starting + * at $location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if the content is in the tree of $location. + * @param ContentInfo $contentInfo + * @param Location $location + * + * @return void + */ + protected function checkContentNotInTree( ContentInfo $contentInfo, Location $location ) + { + if ( $location->contentInfo == $contentInfo ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + foreach ( $this->loadLocationChildren( $location )->locations as $childLocation ) + { + $this->checkContentNotInTree( $contentInfo, $childLocation ); + } + } + + /** + * Checks that the given $contentInfo does not occur in the tree starting + * at $location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if the content is in the tree of $location. + * @param ContentInfo $contentInfo + * @param Location $location + * + * @return void + */ + protected function checkContentNotInPath( ContentInfo $contentInfo, Location $location ) + { + if ( $location->contentInfo == $contentInfo ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + + if ( $location->parentLocationId !== $location->id ) + { + $this->checkContentNotInPath( + $contentInfo, + $this->loadLocation( $location->parentLocationId ) + ); + } + } + + /** + * Loads a location object from its $locationId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param int $locationId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocation( $locationId ) + { + if ( false === isset( $this->locations[$locationId] ) ) + { + throw new Exceptions\NotFoundExceptionStub; + } + if ( false === $this->repository->canUser( 'content', 'read', $this->locations[$locationId] ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + return $this->locations[$locationId]; + } + + /** + * Loads a location object from its $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocationByRemoteId( $remoteId ) + { + foreach ( $this->locations as $location ) + { + if ( $location->remoteId != $remoteId ) + { + continue; + } + if ( false === $this->repository->canUser( 'content', 'create', $location ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $location; + } + throw new Exceptions\NotFoundExceptionStub; + } + + /** + * Instantiates a new location update class + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct + */ + public function newLocationUpdateStruct() + { + return new LocationUpdateStruct(); + } + + /** + * Updates $location in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to update this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct $locationUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the updated Location + */ + public function updateLocation( Location $location, LocationUpdateStruct $locationUpdateStruct ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $location ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->checkRemoteIdNotExist( $locationUpdateStruct ); + + $data = $this->locationToArray( $location ); + + foreach ( $locationUpdateStruct as $propertyName => $propertyValue ) + { + $data[$propertyName] = $propertyValue; + } + + $updatedLocation = new LocationStub( $data ); + $this->locations[$updatedLocation->id] = $updatedLocation; + + return $updatedLocation; + } + + /** + * Checks that the remote ID used in $locationUpdateStruct does not exist + * + * @param LocationUpdateStruct $locationUpdateStruct + * + * @return void + */ + protected function checkRemoteIdNotExist( LocationUpdateStruct $locationUpdateStruct ) + { + foreach ( $this->locations as $location ) + { + if ( $location->remoteId == $locationUpdateStruct->remoteId ) + { + throw new Exceptions\InvalidArgumentExceptionStub; + } + } + } + + /** + * Returns the data of the given $location as an array + * + * @param Location $location + * + * @return array + */ + protected function locationToArray( Location $location ) + { + return array( + 'id' => $location->id, + 'priority' => $location->priority, + 'hidden' => $location->hidden, + 'invisible' => $location->invisible, + 'remoteId' => $location->remoteId, + 'contentInfo' => $location->contentInfo, + 'parentLocationId' => $location->parentLocationId, + 'pathString' => $location->pathString, + 'depth' => $location->depth, + 'sortField' => $location->sortField, + 'sortOrder' => $location->sortOrder, + ); + } + + /** + * Loads the locations for the given content object. + * + * If a $rootLocation is given, only locations that belong to this location are returned. + * The location list is also filtered by permissions on reading locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if there is no published version yet + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location $rootLocation + * + * @return array An array of {@link Location} + */ + public function loadLocations( ContentInfo $contentInfo, Location $rootLocation = null ) + { + if ( $contentInfo->published === false ) + { + throw new Exceptions\BadStateExceptionStub; + } + + $subPath = ( $rootLocation === null ? '/' : $rootLocation->pathString ); + + $locations = array(); + foreach ( $this->locations as $candidateLocation ) + { + if ( $candidateLocation->getContentInfo() === null ) + { + // Skip root location + continue; + } + if ( $contentInfo->id == $candidateLocation->getContentInfo()->id + && strpos( $candidateLocation->pathString, $subPath ) === 0 + ) + { + $locations[] = $candidateLocation; + } + } + return $locations; + } + + /** + * Loads children which are readable by the current user of a location object sorted by sortField and sortOrder + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @param int $offset the start offset for paging + * @param int $limit the number of locations returned. If $limit = -1 all children starting at $offset are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationList + */ + public function loadLocationChildren( Location $location, $offset = 0, $limit = -1 ) + { + $children = $this->loadLocationChildrenById( $location->id ); + + usort( + $children, + function ( $a, $b ) + { + if ( $a->priority == $b->priority ) + { + // Sort by ID for same priorities + return ( $a->id < $b->id ) ? -1 : 1; + } + return ( $a->priority < $b->priority ) ? -1 : 1; + } + ); + + return new LocationList( + array( + "locations" => array_slice( $children, $offset, ( $limit == -1 ? null : $limit ) ), + "totalCount" => count( $children ) + ) + ); + } + + /** + * Returns all location children based on their ID + * + * @param int $locationId + * + * @return array Of {@link Location} + */ + private function loadLocationChildrenById( $locationId ) + { + $children = array(); + foreach ( $this->locations as $potentialChild ) + { + if ( $potentialChild->parentLocationId == $locationId ) + { + $children[] = $potentialChild; + } + } + + return $children; + } + + /** + * Returns the number of children which are readable by the current user of a location object + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return int + */ + public function getLocationChildCount( Location $location ) + { + return count( $this->loadLocationChildrenById( $location->id ) ); + } + + /** + * Swaps the contents hold by the $location1 and $location2 + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to swap content + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location1 + * @param \eZ\Publish\API\Repository\Values\Content\Location $location2 + */ + public function swapLocation( Location $location1, Location $location2 ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $location1, $location2 ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + // Although the method is named swapLocation(), this method should + // actually swap the content nodes. This is intentionally. + $contentInfo1 = $location1->getContentInfo(); + $contentInfo2 = $location2->getContentInfo(); + + $location1->setContentInfo( $contentInfo2 ); + $location2->setContentInfo( $contentInfo1 ); + } + + /** + * Hides the $location and marks invisible all descendants of $location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to hide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function hideLocation( Location $location ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $location->contentInfo ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $location->hide(); + + foreach ( $this->loadLocationChildren( $location )->locations as $child ) + { + $this->markInvisible( $child ); + } + + return $location; + } + + /** + * Marks the sub-tree starting at $location invisible + * + * @param Location $location + * + * @return void + */ + protected function markInvisible( Location $location ) + { + $location->makeInvisible(); + + foreach ( $this->loadLocationChildren( $location )->locations as $child ) + { + $this->markInvisible( $child ); + } + } + + /** + * Unhides the $location. + * + * This method and marks visible all descendants of $locations + * until a hidden location is found. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to unhide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function unhideLocation( Location $location ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $location ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $location->unhide(); + + foreach ( $this->loadLocationChildren( $location )->locations as $child ) + { + $this->markVisible( $child ); + } + + return $location; + } + + /** + * Marks the subtree indicated by $location as visible. + * + * The process stops, when a hidden location is found in the subtree. + * + * @param mixed $location + * + * @return void + */ + protected function markVisible( $location ) + { + if ( $location->hidden == true ) + { + // Stop as soon as a hidden location is found + return; + } + $location->makeVisible(); + + foreach ( $this->loadLocationChildren( $location )->locations as $child ) + { + $this->markVisible( $child ); + } + } + + /** + * Deletes $location and all its descendants. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user is not allowed to delete this location or a descendant + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + */ + public function deleteLocation( Location $location ) + { + if ( false === $this->repository->canUser( 'content', 'remove', $location ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->repository->getUrlAliasService()->removeAliasesForLocation( $location ); + + $contentService = $this->repository->getContentService(); + + unset( $this->locations[$location->id] ); + + if ( !$this->hasLocation( $location->contentInfo ) ) + { + $contentService->deleteContent( $location->contentInfo ); + } + + foreach ( $this->loadLocationChildren( $location )->locations as $child ) + { + $this->deleteLocation( $child ); + } + } + + /** + * Returns if a location for the given $contentInfo exists. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + protected function hasLocation( ContentInfo $contentInfo ) + { + foreach ( $this->locations as $location ) + { + if ( $location->getContentInfo() == null ) + { + // Skip root location + continue; + } + if ( $location->getContentInfo()->id == $contentInfo->id ) + { + return true; + } + } + return false; + } + + /** + * Copies the subtree starting from $subtree as a new subtree of $targetLocation + * + * Only the items on which the user has read access are copied. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed copy the subtree to the given parent location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the target location is a sub location of the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $subtree - the subtree denoted by the location to copy + * @param \eZ\Publish\API\Repository\Values\Content\Location $targetParentLocation - the target parent location for the copy operation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location The newly created location of the copied subtree + * + * @todo enhancement - this method should return a result structure containing the new location and a list + * of locations which are not copied due to permission denials. + */ + public function copySubtree( Location $subtree, Location $targetParentLocation ) + { + // Check permissions + if ( false === $this->repository->canUser( 'content', 'edit', $subtree, $targetParentLocation ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + // Check new parent is not tree + $this->checkLocationNotInTree( $subtree, $targetParentLocation ); + + return $this->copySubtreeInternal( $subtree, $targetParentLocation ); + } + + /** + * Copies the subtree starting from $subtree as a new subtree of $targetLocation + * + * Only the items on which the user has read access are copied. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $subtree - the subtree denoted by the location to copy + * @param \eZ\Publish\API\Repository\Values\Content\Location $targetParentLocation - the target parent location for the copy operation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location The newly created location of the copied subtree + */ + private function copySubtreeInternal( Location $subtree, Location $targetParentLocation ) + { + $values = array_merge( + $this->locationToArray( $subtree ), + array( + 'id' => ++$this->nextLocationId, + 'remoteId' => md5( uniqid( $subtree->remoteId, true ) ), + 'depth' => $targetParentLocation->depth + 1, + 'parentLocationId' => $targetParentLocation->id, + 'pathString' => "{$targetParentLocation->pathString}{$this->nextLocationId}/" + ) + ); + + $this->locations[$values['id']] = new LocationStub( $values ); + + foreach ( $this->loadLocationChildren( $subtree )->locations as $childLocation ) + { + $this->copySubtreeInternal( $childLocation, $this->locations[$values['id']] ); + } + + return $this->locations[$values['id']]; + } + + /** + * Checks if the given $location is not a child of the given $substree. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $subtree + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return void + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + private function checkLocationNotInTree( Location $subtree, Location $location ) + { + if ( $subtree->id === $location->id ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + foreach ( $this->loadLocationChildren( $subtree )->locations as $childLocation ) + { + $this->checkLocationNotInTree( $childLocation, $location ); + } + } + + /** + * Moves the subtree to $newParentLocation + * + * If a user has the permission to move the location to a target location + * he can do it regardless of an existing descendant on which the user has no permission. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to move this location to the target + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + */ + public function moveSubtree( Location $location, Location $newParentLocation ) + { + if ( false === $this->repository->canUser( 'content', 'move', $location, $newParentLocation ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $oldParentLocation = $this->loadLocation( $location->parentLocationId ); + + $this->moveSubtreeInternal( $location, $newParentLocation ); + } + + /** + * Moves the subtree to $newParentLocation + * + * If a user has the permission to move the location to a target location + * he can do it regardless of an existing descendant on which the user has no permission. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to move this location to the target + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + */ + private function moveSubtreeInternal( Location $location, Location $newParentLocation ) + { + $values = array_merge( + $this->locationToArray( $location ), + array( + 'depth' => $newParentLocation->depth + 1, + 'pathString' => "{$newParentLocation->pathString}{$location->id}/", + 'parentLocationId' => $newParentLocation->id, + ) + ); + + $newLocation = $this->locations[$location->id] = new LocationStub( $values ); + $this->repository->getUrlAliasService()->createAliasesForLocation( $newLocation ); + + foreach ( $this->loadLocationChildren( $location )->locations as $childLocation ) + { + $this->moveSubtreeInternal( + $childLocation, + $this->locations[$location->id] + ); + } + } + + /** + * Internal helper method used to trash a location tree. + * + * @access private + * + * @internal + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location[] $trashed + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] + */ + public function trashLocation( Location $location, array $trashed = array() ) + { + $this->repository->getUrlAliasService()->removeAliasesForLocation( $location ); + + $trashed[] = $location; + foreach ( $this->loadLocationChildren( $location )->locations as $childLocation ) + { + $trashed = $this->trashLocation( $childLocation, $trashed ); + } + + unset( $this->locations[$location->id] ); + + return $trashed; + } + + /** + * Internal helper method used to recover a location tree. + * + * @access private + * + * @internal + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentlocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function recoverLocation( Location $location, Location $newParentlocation = null ) + { + if ( $newParentlocation ) + { + $location->setParentLocationId( $newParentlocation->id ); + } + + $location->setDepth( + $this->locations[$location->parentLocationId]->depth + 1 + ); + $location->setPathString( + $this->locations[$location->parentLocationId]->pathString . $location->id . "/" + ); + + // If the main location of the restored content is also trashed / + // deleted + if ( !isset( $this->locations[$location->getContentInfo()->mainLocationId] ) ) + { + $location->getContentInfo()->setMainLocationId( $location->id ); + } + + $this->repository->getUrlAliasService()->createAliasesForLocation( $location ); + + return ( $this->locations[$location->id] = $location ); + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + $this->locations = array(); + $this->nextLocationId = 0; + + list( + $locations, + $this->nextLocationId + ) = $this->repository->loadFixture( 'Location' ); + + foreach ( $locations as $location ) + { + $this->locations[$location->id] = $location; + $this->nextLocationId = max( $this->nextLocationId, $location->id ); + } + } +} + diff --git a/eZ/Publish/API/Repository/Tests/Stubs/ObjectStateServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/ObjectStateServiceStub.php new file mode 100644 index 0000000..06d6cb8 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/ObjectStateServiceStub.php @@ -0,0 +1,706 @@ + + * array( + * => array( + * => , + * // ... + * ), + * // ... + * ); + * + * + * @var array + */ + private $objectStateMap = array(); + + /** + * @var \eZ\Publish\API\Repository\Tests\Stubs\RepositoryStub + */ + private $repository; + + /** + * Instantiates a new content type service stub. + * + * @param \eZ\Publish\API\Repository\Tests\Stubs\RepositoryStub $repository + */ + public function __construct( RepositoryStub $repository ) + { + $this->repository = $repository; + + $this->initFromFixture(); + } + + /** + * Creates a new object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct $objectStateGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function createObjectStateGroup( ObjectStateGroupCreateStruct $objectStateGroupCreateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( $this->groups as $group ) + { + if ( $group->identifier == $objectStateGroupCreateStruct->identifier ) + { + throw new Exceptions\InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + + $groupData = array(); + foreach ( $objectStateGroupCreateStruct as $propertyName => $propertyValue ) + { + $groupData[$propertyName] = $propertyValue; + } + + $groupData['languageCodes'] = $this->determineLanguageCodes( + $objectStateGroupCreateStruct->names, + $objectStateGroupCreateStruct->descriptions + ); + + $groupData['id'] = $this->nextGroupId++; + + $group = new Values\ObjectState\ObjectStateGroupStub( $groupData ); + + $this->groups[$group->id] = $group; + + return $group; + } + + /** + * Determines all available language codes from $names and $descriptions + * + * @param string[] $names + * @param string[] $descriptions + * + * @return string[] + */ + protected function determineLanguageCodes( $names, $descriptions ) + { + return array_unique( + array_keys( + array_merge( + $names ?: array(), + $descriptions ?: array() + ) + ) + ); + } + + /** + * Loads a object state group + * + * @param mixed $objectStateGroupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function loadObjectStateGroup( $objectStateGroupId ) + { + if ( !isset( $this->groups[$objectStateGroupId] ) ) + { + throw new Exceptions\NotFoundExceptionStub( '@todo: What error code should be used?' ); + } + return $this->groups[$objectStateGroupId]; + } + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] + */ + public function loadObjectStateGroups( $offset = 0, $limit = -1 ) + { + return array_slice( + array_values( $this->groups ), + $offset, + ( $limit == -1 ? null : $limit ) + ); + } + + /** + * This method returns the ordered list of object states of a group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public function loadObjectStates( ObjectStateGroup $objectStateGroup ) + { + $states = array(); + foreach ( $this->groupStateMap[$objectStateGroup->id] as $stateId ) + { + $states[] = $this->states[$stateId]; + } + return $states; + } + + /** + * updates an object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function updateObjectStateGroup( ObjectStateGroup $objectStateGroup, ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( $objectStateGroupUpdateStruct->identifier !== null ) + { + foreach ( $this->groups as $group ) + { + if ( $group->identifier == $objectStateGroupUpdateStruct->identifier && $group->id != $objectStateGroup->id ) + { + throw new Exceptions\InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + } + + $data = array( + 'id' => $objectStateGroup->id, + 'identifier' => $objectStateGroup->identifier, + 'defaultLanguageCode' => $objectStateGroup->defaultLanguageCode, + 'names' => $objectStateGroup->getNames(), + 'descriptions' => $objectStateGroup->getDescriptions(), + ); + + foreach ( $objectStateGroupUpdateStruct as $propertyName => $propertyValue ) + { + if ( $propertyValue !== null ) + { + $data[$propertyName] = $propertyValue; + } + } + + $data['languageCodes'] = $this->determineLanguageCodes( + $data['names'], $data['descriptions'] + ); + + $this->groups[$objectStateGroup->id] = new Values\ObjectState\ObjectStateGroupStub( $data ); + + return $this->groups[$objectStateGroup->id]; + } + + /** + * Deletes a object state group including all states and links to content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + */ + public function deleteObjectStateGroup( ObjectStateGroup $objectStateGroup ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $stateIds = $this->groupStateMap[$objectStateGroup->id]; + + foreach ( $stateIds as $stateId ) + { + unset( $this->states[$stateId] ); + } + + foreach ( $this->objectStateMap as $objectId => $stateGroups ) + { + unset( $this->objectStateMap[$objectId][$objectStateGroup->id] ); + } + + unset( $this->groups[$objectStateGroup->id] ); + } + + /** + * Creates a new object state in the given group. + * + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct $objectStateCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function createObjectState( ObjectStateGroup $objectStateGroup, ObjectStateCreateStruct $objectStateCreateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( $this->states as $state ) + { + if ( $state->identifier == $objectStateCreateStruct->identifier + && $state->stateGroup->id == $objectStateGroup->id ) + { + throw new Exceptions\InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + + $stateData = array(); + foreach ( $objectStateCreateStruct as $propertyName => $propertyValue ) + { + $stateData[$propertyName] = $propertyValue; + } + $stateData['id'] = $this->nextStateId++; + $stateData['languageCodes'] = $this->determineLanguageCodes( + $stateData['names'], + $stateData['descriptions'] + ); + $stateData['stateGroup'] = $objectStateGroup; + + $newState = $this->createObjectStateFromArray( $stateData ); + + $this->renumberPriorities( $newState->stateGroup ); + + return $newState; + } + + /** + * Creates and sets an object state from $stateData. + * + * @param array $stateData + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + protected function createObjectStateFromArray( array $stateData ) + { + $newState = new Values\ObjectState\ObjectStateStub( $stateData ); + + $this->states[$newState->id] = $newState; + $this->groupStateMap[$newState->getObjectStateGroup()->id][$newState->id] = $newState->id; + + return $newState; + } + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function loadObjectState( $stateId ) + { + if ( !isset( $this->states[$stateId] ) ) + { + throw new Exceptions\NotFoundExceptionStub( '@todo: What error code should be used?' ); + } + return $this->states[$stateId]; + } + + /** + * updates an object state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct $objectStateUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function updateObjectState( ObjectState $objectState, ObjectStateUpdateStruct $objectStateUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( $this->states as $state ) + { + if ( $state->identifier == $objectStateUpdateStruct->identifier + && $state->stateGroup->id == $objectState->stateGroup->id + && $state->id != $objectState->id ) + { + throw new Exceptions\InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + + $stateData = array( + 'id' => $objectState->id, + 'identifier' => $objectState->identifier, + 'priority' => $objectState->priority, + 'defaultLanguageCode' => $objectState->defaultLanguageCode, + 'names' => $objectState->names, + 'descriptions' => $objectState->descriptions, + 'stateGroup' => $objectState->stateGroup, + ); + + foreach ( $objectStateUpdateStruct as $propertyName => $propertyValue ) + { + if ( $propertyValue !== null ) + { + $stateData[$propertyName] = $propertyValue; + } + } + $stateData['languageCodes'] = $this->determineLanguageCodes( + $stateData['names'], + $stateData['descriptions'] + ); + + $updatedState = $this->createObjectStateFromArray( $stateData ); + + $this->renumberPriorities( $updatedState->stateGroup ); + + return $updatedState; + } + + /** + * Changes the priority of the state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change priority on an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param int $priority + */ + public function setPriorityOfObjectState( ObjectState $objectState, $priority ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $objectState->setPriority( $priority ); + + $this->renumberPriorities( $objectState->stateGroup ); + } + + /** + * Renumbers priorities in the given $stateGroup + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $stateGroup + * + * @return void + */ + private function renumberPriorities( $stateGroup ) + { + foreach ( $this->groupStateMap[$stateGroup->id] as $stateId ) + { + $sortStates[] = $this->states[$stateId]; + } + + usort( + $sortStates, + function ( $a, $b ) + { + if ( $a->priority == $b->priority ) + { + return 0; + } + return ( $a->priority < $b->priority ? -1 : 1 ); + } + ); + + $newPrio = 0; + foreach ( $sortStates as $sortedState ) + { + $sortedState->setPriority( $newPrio++ ); + } + } + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function deleteObjectState( ObjectState $objectState ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $groupId = $objectState->getObjectStateGroup()->id; + + $newStateId = false; + $minStatePrio = PHP_INT_MAX; + + foreach ( $this->groupStateMap[$groupId] as $index => $stateId ) + { + if ( $stateId == $objectState->id ) + { + unset( $this->groupStateMap[$groupId][$index] ); + continue; + } + } + + $newState = $this->getLowestPriorityStateFromGroup( $groupId ); + + foreach ( $this->objectStateMap as $contentId => $stateGroups ) + { + if ( isset( $stateGroups[$groupId] ) ) + { + $this->objectStateMap[$contentId][$groupId] = $newState->id; + } + } + } + + /** + * Returns the state with the lowest priority from $groupId + * + * @param mixed $groupId + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + protected function getLowestPriorityStateFromGroup( $groupId ) + { + $selectedState = null; + $minPriority = PHP_INT_MAX; + + foreach ( $this->groupStateMap[$groupId] as $index => $selectedState ) + { + $state = $this->states[$selectedState]; + if ( $state->priority < $minPriority ) + { + $selectedState = $state; + $minPriority = $state->priority; + } + } + + return $selectedState; + } + + /** + * Sets the object-state of a state group to $state for the given content. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state does not belong to the given group + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change the object state + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * + */ + public function setContentState( ContentInfo $contentInfo, ObjectStateGroup $objectStateGroup, ObjectState $objectState ) + { + if ( false === $this->repository->hasAccess( 'class', '*' ) ) + { + throw new Exceptions\UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( $objectState->getObjectStateGroup() != $objectStateGroup ) + { + throw new Exceptions\InvalidArgumentExceptionStub( '@todo: What error code should be used?' ); + } + $this->objectStateMap[$contentInfo->id][$objectStateGroup->id] = $objectState->id; + } + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function getContentState( ContentInfo $contentInfo, ObjectStateGroup $objectStateGroup ) + { + $contentId = $contentInfo->id; + $groupId = $objectStateGroup->id; + + // Assign initial object state, if none assigned, yet. + if ( !isset( $this->objectStateMap[$contentId][$groupId] ) ) + { + $initialState = $this->getLowestPriorityStateFromGroup( $groupId ); + $this->objectStateMap[$contentId][$groupId] = $initialState->id; + } + + return $this->states[ + $this->objectStateMap[$contentId][$groupId] + ]; + } + + /** + * Returns the number of objects which are in this state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * + * @return int + */ + public function getContentCount( ObjectState $objectState ) + { + $groupId = $objectState->getObjectStateGroup()->id; + + $contentCount = 0; + foreach ( $this->objectStateMap as $objectId => $stateMap ) + { + if ( isset( $stateMap[$groupId] ) && $stateMap[$groupId] == $objectState->id ) + { + ++$contentCount; + } + } + return $contentCount; + } + + /** + * Instantiates a new Object State Group Create Struct and sets $identified in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct + */ + public function newObjectStateGroupCreateStruct( $identifier ) + { + return new ObjectStateGroupCreateStruct( + array( 'identifier' => $identifier ) + ); + } + + /** + * Instantiates a new Object State Group Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct + */ + public function newObjectStateGroupUpdateStruct() + { + return new ObjectStateGroupUpdateStruct(); + } + + /** + * Instantiates a new Object State Create Struct and sets $identifier in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct + */ + public function newObjectStateCreateStruct( $identifier ) + { + return new ObjectStateCreateStruct( + array( 'identifier' => $identifier ) + ); + } + + /** + * Instantiates a new Object State Update Struct and sets $identifier in it. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct + */ + public function newObjectStateUpdateStruct() + { + return new ObjectStateUpdateStruct(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + $this->groups = array(); + + list( + $this->groups, + $this->nextGroupId + ) = $this->repository->loadFixture( 'ObjectStateGroup' ); + + ++$this->nextGroupId; + + list( + $this->states, + $this->groupStateMap, + $this->objectStateMap, + $this->nextStateId + ) = $this->repository->loadFixture( 'ObjectState', array( 'groups' => $this->groups ) ); + + ++$this->nextStateId; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage.php b/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage.php new file mode 100644 index 0000000..b029455 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage.php @@ -0,0 +1,62 @@ +pseudoStorages = $pseudoStorages; + } + + /** + * Handle creation of the given $field. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + public function handleCreate( FieldDefinition $fieldDefinition, Field $field, Content $content ) + { + if ( !isset( $this->pseudoStorages[$fieldDefinition->fieldTypeIdentifier] ) ) + { + return false; + } + + $this->pseudoStorages[$fieldDefinition->fieldTypeIdentifier]->handleCreate( $fieldDefinition, $field, $content ); + } + + /** + * Handle updating of the given $field. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + public function handleUpdate( FieldDefinition $fieldDefinition, Field $field, Content $content ) + { + if ( !isset( $this->pseudoStorages[$fieldDefinition->fieldTypeIdentifier] ) ) + { + return false; + } + + $this->pseudoStorages[$fieldDefinition->fieldTypeIdentifier]->handleUpdate( $fieldDefinition, $field, $content ); + } + + /** + * Handle loading of the given $field. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + public function handleLoad( FieldDefinition $fieldDefinition, Field $field, Content $content ) + { + if ( !isset( $this->pseudoStorages[$fieldDefinition->fieldTypeIdentifier] ) ) + { + return false; + } + + $this->pseudoStorages[$fieldDefinition->fieldTypeIdentifier]->handleLoad( $fieldDefinition, $field, $content ); + } +} + diff --git a/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage/User.php b/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage/User.php new file mode 100644 index 0000000..3f02a2c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage/User.php @@ -0,0 +1,213 @@ + false, + 'contentId' => null, + 'login' => null, + 'email' => null, + 'passwordHash' => null, + 'passwordHashType' => null, + 'enabled' => false, + 'maxLogin' => null, + ); + + /** + * Editable properties + * + * @var array + */ + protected $editable = array(); + + /** + * Storage for field data + * + * @var array + */ + protected $fieldData = array(); + + /** + * Repository implementation + * + * @var \eZ\Publish\API\Repository\Tests\Stubs\RepositoryStub + */ + protected $repository; + + /** + * Construct from repository + * + * @param \eZ\Publish\API\Repository\Tests\Stubs\RepositoryStub $repository + */ + public function __construct( RepositoryStub $repository ) + { + $this->repository = $repository; + } + + /** + * Returns a mocked content service for internal use. + * + * This mock object is only used for the $this->getContentService() call in + * the user fixture file. The mock avoids loading the corresponding content + * objects, in order to avoid the circular reference. + * + * @return \eZ\Publish\API\Repository\Tests\Stubs\PseudoExternalStorage\User\ContentServiceMock + */ + protected function getContentService() + { + return new User\ContentServiceMock(); + } + + /** + * Returns the User objects from the fixture + * + * This method uses a quite some black magic in order to fetch the user + * fixture without creating a circular reference. + * + * @return \eZ\Publish\API\Repository\Tests\Stubs\Values\User\User + */ + protected function getUserData() + { + // Retrieve user service without having it initialized explicitly + $userServiceProperty = new \ReflectionProperty( $this->repository, 'userService' ); + $userServiceProperty->setAccessible( true ); + if ( $service = $userServiceProperty->getValue( $this->repository ) ) + { + // If the service has been initialized, retrieve the fixture data + // from its property + $usersProperty = new \ReflectionProperty( $service, 'users' ); + $usersProperty->setAccessible( true ); + return $usersProperty->getValue( $service ); + } + + // Otherwise retrieve the fixture manually + $fixtureDirProperty = new \ReflectionProperty( $this->repository, 'fixtureDir' ); + $fixtureDirProperty->setAccessible( true ); + $fixtureDir = $fixtureDirProperty->getValue( $this->repository ); + + $data = include $fixtureDir . '/UserFixture.php'; + return reset( $data ); + } + + /** + * Handle creation of the given $field. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + public function handleCreate( FieldDefinition $fieldDefinition, Field $field, Content $content ) + { + $this->handleUpdate( $fieldDefinition, $field, $content ); + } + + /** + * Handle updating of the given $field. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + public function handleUpdate( FieldDefinition $fieldDefinition, Field $field, Content $content ) + { + $storage = new Value(); + + foreach ( $this->defaultValues as $key => $default ) + { + if ( !empty( $field->value->$key ) && + isset( $this->editable[$key] ) ) + { + $storage->$key = $field->value->$key; + } + else + { + $storage->$key = $default; + } + } + + $this->fieldData[$content->id] = $storage; + $this->handleLoad( $fieldDefinition, $field, $content ); + } + + /** + * Handle loading of the given $field. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + public function handleLoad( FieldDefinition $fieldDefinition, Field $field, Content $content ) + { + $userData = $this->getUserData(); + if ( !isset( $userData[$content->id] ) || + !isset( $this->fieldData[$content->id] ) ) + { + if ( $field instanceof FieldStub ) + { + $field->setValue( new Value( $this->defaultValues ) ); + } + return; + } + + $value = $this->joinUserData( + $this->fieldData[$content->id], + $userData[$content->id] + ); + + $field->setValue( $value ); + } + + /** + * Join user data into field data + * + * @param array $data + * @param array $userData + * + * @return array + */ + protected function joinUserData( $data, $userData ) + { + $data->contentId = $userData->id; + $data->hasStoredLogin = true; + $data->login = $userData->login; + $data->email = $userData->email; + $data->passwordHash = $userData->passwordHash; + $data->passwordHashType = $userData->hashAlgorithm; + $data->enabled = $userData->enabled; + + return $data; + } +} + diff --git a/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage/User/ContentServiceMock.php b/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage/User/ContentServiceMock.php new file mode 100644 index 0000000..790035a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/PseudoExternalStorage/User/ContentServiceMock.php @@ -0,0 +1,30 @@ +fixtureDir = $fixtureDir; + $this->version = $version; + } + + /** + * Get current user + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getCurrentUser() + { + return $this->currentUser; + } + + /** + * Sets the current user to the given $user. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + */ + public function setCurrentUser( User $user ) + { + $this->currentUser = $user; + } + + /** + * @param string $module + * @param string $function + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return boolean|\eZ\Publish\API\Repository\Values\User\Limitation[] if limitations are on this function an array of limitations is returned + */ + public function hasAccess( $module, $function, User $user = null ) + { + if ( $this->permissionChecks > 0 ) + { + return true; + } + + $user = $user ?: $this->getCurrentUser(); + $roleService = $this->getRoleService(); + + ++$this->permissionChecks; + + foreach ( $roleService->getRoleAssignmentsForUser( $user, true ) as $roleAssignment ) + { + $roleLimitation = $roleAssignment->getRoleLimitation(); + $permissionSet = array( 'limitation' => null, 'policies' => array() ); + foreach ( $roleService->getRolePolicies( $roleAssignment->getRole() ) as $policy ) + { + if ( $policy->module === '*' && $roleLimitation === null ) + { + --$this->permissionChecks; + return true; + } + + if ( $policy->module !== $module && $policy->module !== "*" ) + continue; + + if ( $policy->function === '*' && $roleLimitation === null ) + { + --$this->permissionChecks; + return true; + } + + if ( $policy->function !== $function && $policy->function !== "*" ) + continue; + + $permissionSet['policies'][] = $policy; + } + + if ( !empty( $permissionSet['policies'] ) ) + { + if ( $roleLimitation !== null ) + { + $permissionSet['limitation'] = $roleLimitation; + } + + $permissionSets[] = $permissionSet; + } + } + + --$this->permissionChecks; + + if ( !empty( $permissionSets ) ) + return $permissionSets; + + return false;// No policies matching $module and $function + } + + /** + * Indicates if the current user is allowed to perform an action given by the function on the given + * objects + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * + * @param string $module The module, aka controller identifier to check permissions on + * @param string $function The function, aka the controller action to check permissions on + * @param \eZ\Publish\API\Repository\Values\ValueObject $object The object to check if the user has access to + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function canUser( $module, $function, ValueObject $object, ValueObject $target = null ) + { + if ( $this->permissionChecks > 0 ) + { + return true; + } + + $permissionSets = $this->hasAccess( $module, $function ); + if ( $permissionSets === false || $permissionSets === true ) + { + return $permissionSets; + } + + ++$this->permissionChecks; + + $locations = null; + $contentInfoValue = null; + if ( $object instanceof ContentInfo ) + { + $contentInfoValue = $object; + } + else if ( $object instanceof Content ) + { + $contentInfoValue = $object->contentInfo; + } + else if ( $object instanceof VersionInfo ) + { + $contentInfoValue = $object->contentInfo; + } + else if ( $object instanceof Location ) + { + $locations = array( $object ); + } + + if ( null !== $contentInfoValue && true === $contentInfoValue->published ) + { + $locationService = $this->getLocationService(); + $locations = $locationService->loadLocations( $contentInfoValue ); + } + + if ( null === $locations ) + { + --$this->permissionChecks; + return true; + } + + foreach ( $permissionSets as $permissionSet ) + { + /** + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] $permissionSet + */ + if ( $permissionSet['limitation'] instanceof Limitation ) + { + if ( $permissionSet['limitation']->getIdentifier() == Limitation::SUBTREE ) + { + foreach ( $locations as $location ) + { + foreach ( $permissionSet['limitation']->limitationValues as $limitationPathString ) + { + if ( strpos( $location->pathString, $limitationPathString ) === 0 ) + { + --$this->permissionChecks; + return true; + } + } + } + } + else if ( $permissionSet['limitation']->getIdentifier() == Limitation::SECTION ) + { + if ( in_array( $contentInfoValue->sectionId, $permissionSet['limitation']->limitationValues ) ) + { + --$this->permissionChecks; + return true; + } + } + } + } + + --$this->permissionChecks; + return false; // None of the limitation sets wanted to let you in, sorry! + } + + /** + * Get Content Service + * + * Get service object to perform operations on Content objects and it's aggregate members. + * + * @return \eZ\Publish\API\Repository\ContentService + */ + public function getContentService() + { + if ( null === $this->contentService ) + { + $this->contentService = new ContentServiceStub( $this ); + } + return $this->contentService; + } + + /** + * Get Content Language Service + * + * Get service object to perform operations on Content language objects + * + * @return \eZ\Publish\API\Repository\LanguageService + */ + public function getContentLanguageService() + { + if ( null === $this->languageService ) + { + $this->languageService = new LanguageServiceStub( + $this, + $this->getContentService(), + 'eng-US' + ); + } + return $this->languageService; + } + + /** + * Get Content Type Service + * + * Get service object to perform operations on Content Type objects and it's aggregate members. + * ( Group, Field & FieldCategory ) + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + public function getContentTypeService() + { + if ( null === $this->contentTypeService ) + { + $this->contentTypeService = new ContentTypeServiceStub( + $this, + $this->getContentService() + ); + } + return $this->contentTypeService; + } + + /** + * Get Content Location Service + * + * Get service object to perform operations on Location objects and subtrees + * + * @return \eZ\Publish\API\Repository\LocationService + */ + public function getLocationService() + { + if ( null === $this->locationService ) + { + $this->locationService = new LocationServiceStub( $this ); + } + return $this->locationService; + } + + /** + * Get Content Trash service + * + * Trash service allows to perform operations related to location trash + * (trash/untrash, load/list from trash...) + * + * @return \eZ\Publish\API\Repository\TrashService + */ + public function getTrashService() + { + if ( null === $this->trashService ) + { + $this->trashService = new TrashServiceStub( + $this, + $this->getLocationService() + ); + } + return $this->trashService; + } + + /** + * Get Content Section Service + * + * Get Section service that lets you manipulate section objects + * + * @return \eZ\Publish\API\Repository\SectionService + */ + public function getSectionService() + { + if ( null === $this->sectionService ) + { + $this->sectionService = new SectionServiceStub( $this ); + } + return $this->sectionService; + } + + /** + * Get Search Service + * + * Get search service that lets you find content objects + * + * @return \eZ\Publish\API\Repository\SearchService + */ + public function getSearchService() + { + throw new \RuntimeException( '@todo: Implement.' ); + } + + /** + * Get User Service + * + * Get service object to perform operations on Users and UserGroup + * + * @return \eZ\Publish\API\Repository\UserService + */ + public function getUserService() + { + if ( null === $this->userService ) + { + $this->userService = new UserServiceStub( $this ); + } + return $this->userService; + } + + /** + * Get IO Service + * + * Get service object to perform operations on binary files + * + * @return \eZ\Publish\API\Repository\IOService + */ + public function getIOService() + { + if ( null === $this->ioService ) + { + $this->ioService = new IOServiceStub( $this ); + } + return $this->ioService; + } + + /** + * Get RoleService + * + * @return \eZ\Publish\API\Repository\RoleService + */ + public function getRoleService() + { + if ( null === $this->roleService ) + { + $this->roleService = new RoleServiceStub( $this, $this->getUserService() ); + } + return $this->roleService; + } + + /** + * Get URLAliasService + * + * @return \eZ\Publish\API\Repository\URLAliasService + */ + public function getURLAliasService() + { + if ( null === $this->urlAliasService ) + { + $this->urlAliasService = new URLAliasServiceStub( $this ); + } + return $this->urlAliasService; + } + + /** + * Get URLWildcardService + * + * @return \eZ\Publish\API\Repository\URLWildcardService + */ + public function getURLWildcardService() + { + if ( null === $this->urlWildcardService ) + { + $this->urlWildcardService = new URLWildcardServiceStub( $this ); + } + return $this->urlWildcardService; + } + + /** + * Get ObjectStateService + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + public function getObjectStateService() + { + if ( null === $this->objectStateService ) + { + $this->objectStateService = new ObjectStateServiceStub( $this ); + } + return $this->objectStateService; + } + + /** + * Get FieldTypeService + * + * @return \eZ\Publish\API\Repository\FieldTypeService + */ + public function getFieldTypeService() + { + if ( null === $this->fieldTypeService ) + { + $this->fieldTypeService = new FieldTypeServiceStub( $this ); + } + return $this->fieldTypeService; + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + ++$this->transactionDepth; + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit() + { + if ( 0 === $this->transactionDepth ) + { + throw new \RuntimeException( 'What error code should be used?' ); + } + --$this->transactionDepth; + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback() + { + if ( 0 === $this->transactionDepth ) + { + throw new \RuntimeException( 'What error code should be used?' ); + } + + if ( $this->contentService ) + { + $this->contentService->rollback(); + } + if ( $this->contentTypeService ) + { + $this->contentTypeService->rollback(); + } + if ( $this->ioService ) + { + $this->ioService->rollback(); + } + if ( $this->languageService ) + { + $this->languageService->rollback(); + } + if ( $this->locationService ) + { + $this->locationService->rollback(); + } + if ( $this->roleService ) + { + $this->roleService->rollback(); + } + if ( $this->sectionService ) + { + $this->sectionService->rollback(); + } + if ( $this->trashService ) + { + $this->trashService->rollback(); + } + if ( $this->userService ) + { + $this->userService->rollback(); + } + + --$this->transactionDepth; + } + + /** + * Internally helper method that returns pre defined test data. + * + * @param string $fixtureName + * @param mixed[] $scopeValues + * + * @return array + */ + public function loadFixture( $fixtureName, array $scopeValues = array() ) + { + ++$this->permissionChecks; + $fixture = include $this->fixtureDir . '/' . $fixtureName . 'Fixture.php'; + --$this->permissionChecks; + + return $fixture; + } + + /** + * Internal helper method used to disable permission checks. + * + * @return void + */ + public function disableUserPermissions() + { + ++$this->permissionChecks; + } + + /** + * Internal helper method used to enable permission checks. + * + * @return void + */ + public function enableUserPermissions() + { + --$this->permissionChecks; + } + + /** + * Only for internal use. + * + * Creates a \DateTime object for $timestamp in the current time zone + * + * @param int $timestamp + * + * @return \DateTime + */ + public function createDateTime( $timestamp = null ) + { + $dateTime = new \DateTime(); + if ( $timestamp !== null ) + { + $dateTime->setTimestamp( $timestamp ); + } + return $dateTime; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/RoleServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/RoleServiceStub.php new file mode 100644 index 0000000..3cbf3df --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/RoleServiceStub.php @@ -0,0 +1,1002 @@ +repository = $repository; + $this->userService = $userService; + + $this->initFromFixture(); + } + + /** + * Creates a new Role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\RoleCreateStruct $roleCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function createRole( RoleCreateStruct $roleCreateStruct ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( isset( $this->nameToRoleId[$roleCreateStruct->identifier] ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $role = new RoleStub( + array( + 'id' => ++$this->nextRoleId, + 'identifier' => $roleCreateStruct->identifier + ) + ); + + $this->roles[$role->id] = $role; + $this->nameToRoleId[$role->identifier] = $role->id; + + foreach ( $roleCreateStruct->getPolicies() as $policy ) + { + $role = $this->addPolicy( $role, $policy ); + } + return $role; + } + + /** + * Updates the name of the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct $roleUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function updateRole( Role $role, RoleUpdateStruct $roleUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $roleName = $roleUpdateStruct->identifier ?: $role->identifier; + + if ( isset( $this->nameToRoleId[$roleName] ) && $this->nameToRoleId[$roleName] !== $role->id ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $updatedRole = new RoleStub( + array( + 'id' => $role->id, + 'identifier' => $roleName + ) + ); + + unset( $this->roles[$role->id], $this->nameToRoleId[$role->identifier] ); + + $this->roles[$updatedRole->id] = $updatedRole; + $this->nameToRoleId[$updatedRole->identifier] = $updatedRole->id; + + return $this->roles[$updatedRole->id]; + } + + /** + * Adds a new policy to the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to add a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function addPolicy( Role $role, PolicyCreateStruct $policyCreateStruct ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->policies[++$this->policyNextId] = new PolicyStub( + array( + 'id' => $this->policyNextId, + 'roleId' => $role->id, + 'module' => $policyCreateStruct->module, + 'function' => $policyCreateStruct->function, + 'limitations' => $policyCreateStruct->getLimitations() + ) + ); + + $policies = $role->getPolicies(); + $policies[] = $this->policies[$this->policyNextId]; + + $this->roles[$role->id] = new RoleStub( + array( + 'id' => $role->id, + 'identifier' => $role->identifier + ), + $policies + ); + + $this->role2policy[$role->id][$this->policyNextId] = $this->policyNextId; + + return $this->roles[$role->id]; + } + + /** + * removes a policy from the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy the policy to remove from the role + * + * @return \eZ\Publish\API\Repository\Values\User\Role the updated role + */ + public function removePolicy( Role $role, Policy $policy ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $policies = array(); + foreach ( $role->getPolicies() as $rolePolicy ) + { + if ( $rolePolicy->id !== $policy->id ) + { + $policies[] = $rolePolicy; + } + } + + unset( + $this->policies[$policy->id], + $this->role2policy[$role->id][$policy->id] + ); + + $this->roles[$role->id] = new RoleStub( + array( + 'id' => $role->id, + 'identifier' => $role->identifier + ), + $policies + ); + + return $this->roles[$role->id]; + } + + /** + * Updates the limitations of a policy. The module and function cannot be changed and + * the limitations are replaced by the ones in $roleUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to u�date a policy + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct $policyUpdateStruct + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function updatePolicy( Policy $policy, PolicyUpdateStruct $policyUpdateStruct ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $newPolicy = new PolicyStub( + array( + 'id' => $policy->id, + 'roleId' => $policy->roleId, + 'module' => $policy->module, + 'function' => $policy->function, + 'limitations' => $policyUpdateStruct->getLimitations() + ) + ); + + $this->policies[$newPolicy->id] = $newPolicy; + + $policies = $this->roles[$policy->roleId]->getPolicies(); + foreach ( $policies as $i => $rolePolicy ) + { + if ( $rolePolicy->id !== $policy->id ) + { + continue; + } + + $policies[$i] = $newPolicy; + break; + } + + $this->roles[$policy->roleId] = new RoleStub( + array( + 'id' => $this->roles[$policy->roleId]->id, + 'identifier' => $this->roles[$policy->roleId]->identifier + ), + $policies + ); + + return $newPolicy; + } + + /** + * Loads a role for the given id + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRole( $id ) + { + if ( false === isset( $this->roles[$id] ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $this->roles[$id]; + } + + /** + * Loads a role for the given name + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param string $name + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRoleByIdentifier( $name ) + { + if ( false === isset( $this->nameToRoleId[$name] ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $this->roles[$this->nameToRoleId[$name]]; + } + + /** + * Loads all roles + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the roles + * + * @return \eZ\Publish\API\Repository\Values\User\Role[] + */ + public function loadRoles() + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return array_values( $this->roles ); + } + + /** + * Deletes the given role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete this role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + */ + public function deleteRole( Role $role ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + unset( + $this->roles[$role->id], + $this->role2policy[$role->id], + $this->nameToRoleId[$role->identifier] + ); + } + + /** + * Loads all policies from roles which are assigned to a user or to user groups to which the user belongs + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + * + * @param mixed $userId + * + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function loadPoliciesByUserId( $userId ) + { + $contentIds = array( $userId ); + foreach ( $this->userService->loadUserGroupsByUserId( $userId ) as $group ) + { + $contentIds[] = $group->id; + } + + $roleIds = array(); + foreach ( $contentIds as $contentId ) + { + if ( false === isset( $this->content2roles[$contentId] ) ) + { + continue; + } + foreach ( $this->content2roles[$contentId] as $roleId ) + { + $roleIds[] = $roleId; + } + } + + if ( 0 === count( $roleIds ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + $policies = array(); + foreach ( $roleIds as $roleId ) + { + if ( false === isset( $this->role2policy[$roleId] ) ) + { + continue; + } + + foreach ( $this->role2policy[$roleId] as $policyId ) + { + $policy = $this->policies[$policyId]; + + $this->policies[$policyId] = $policies[] = new PolicyStub( + array( + 'id' => $policy->id, + 'roleId' => $policy->roleId, + 'module' => $policy->module, + 'function' => $policy->function, + 'limitations' => $policy->getLimitations() + ) + ); + } + } + return $policies; + } + + /** + * Loads all policies from a role + * + * @access private + * + * @internal + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function getRolePolicies( Role $role ) + { + $policies = array(); + foreach ( $this->role2policy[$role->id] as $policyId ) + { + $policies[] = $this->policies[$policyId]; + } + return $policies; + } + + /** + * Assigns a role to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUserGroup( Role $role, UserGroup $userGroup, RoleLimitation $roleLimitation = null ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + $this->assignRoleToContent( $role, $userGroup, $roleLimitation ); + } + + /** + * removes a role from the given user group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the given user group + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + */ + public function unassignRoleFromUserGroup( Role $role, UserGroup $userGroup ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + $this->unassignRoleFromContent( $role, $userGroup ); + } + + /** + * Assigns a role to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @todo add limitations + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUser( Role $role, User $user, RoleLimitation $roleLimitation = null ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + $this->assignRoleToContent( $role, $user, $roleLimitation ); + } + + /** + * removes a role from the given user. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the user + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + */ + public function unassignRoleFromUser( Role $role, User $user ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + $this->unassignRoleFromContent( $role, $user ); + } + + /** + * Returns the assigned user and user groups to this role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + public function getRoleAssignments( Role $role ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $roleAssignments = array(); + $processedContentIds = array(); + foreach ( $this->content2roles as $contentId => $roleIds ) + { + foreach ( $roleIds as $roleId ) + { + if ( $roleId !== $role->id ) + { + continue; + } + + if ( in_array( $contentId, $processedContentIds ) ) + { + continue; + } + + $roleAssignments = array_merge( + $roleAssignments, + $this->getRoleAssignmentsForRoleAndContent( + $role, + $contentId + ) + ); + + $processedContentIds[] = $contentId; + } + } + + return $roleAssignments; + } + + /** + * Returns the roles assigned to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param boolean $inherited + * + * @return \eZ\Publish\API\Repository\Values\User\UserRoleAssignment[] + */ + public function getRoleAssignmentsForUser( User $user, $inherited = false ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $roleAssignments = $this->getRoleAssignmentsForContent( $user ); + + if ( $inherited ) + { + $userGroups = $this->repository->getUserService()->loadUserGroupsByUserId( $user->id ); + foreach ( $userGroups as $userGroup ) + { + $roleAssignments = array_merge( + $roleAssignments, + $this->getRoleAssignmentsForContent( $userGroup ) + ); + } + } + + return $roleAssignments; + } + + /** + * Returns the roles assigned to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment[] + */ + public function getRoleAssignmentsForUserGroup( UserGroup $userGroup ) + { + if ( false === $this->repository->hasAccess( 'role', '*' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $this->getRoleAssignmentsForContent( $userGroup ); + } + + /** + * Instantiates a role create class + * + * @param string $name + * + * @return \eZ\Publish\API\Repository\Values\User\RoleCreateStruct + */ + public function newRoleCreateStruct( $name ) + { + return new RoleCreateStructStub( $name ); + } + + /** + * Instantiates a policy create class + * + * @param string $module + * @param string $function + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct + */ + public function newPolicyCreateStruct( $module, $function ) + { + return new PolicyCreateStructStub( $module, $function ); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct + */ + public function newPolicyUpdateStruct() + { + return new PolicyUpdateStructStub(); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct + */ + public function newRoleUpdateStruct() + { + return new RoleUpdateStruct(); + } + + /** + * Returns the LimitationType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\SPI\Limitation\Type + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if there is no LimitationType with $identifier + */ + public function getLimitationType( $identifier ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns the LimitationType's assigned to a given module/function + * + * Typically used for: + * - Internal validation limitation value use on Policies + * - Role admin gui for editing policy limitations incl list limitation options via valueSchema() + * + * @param string $module Legacy name of "controller", it's a unique identifier like "content" + * @param string $function Legacy name of a controller "action", it's a unique within the controller like "read" + * + * @return \eZ\Publish\SPI\Limitation\Type[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If module/function to limitation type mapping + * refers to a non existing identifier. + */ + public function getLimitationTypesByModuleFunction( $module, $function ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns the roles assigned to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user group + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + private function getRoleAssignmentsForContent( Content $content ) + { + if ( false === isset( $this->content2roles[$content->id] ) ) + { + return array(); + } + + $roleAssignments = array(); + $processedRoleIds = array(); + foreach ( $this->content2roles[$content->id] as $roleId ) + { + if ( in_array( $roleId, $processedRoleIds ) ) + { + continue; + } + + $roleAssignments = array_merge( + $roleAssignments, + $this->getRoleAssignmentsForRoleAndContent( + $this->loadRole( $roleId ), + $content->id + ) + ); + + $processedRoleIds[] = $roleId; + } + + return $roleAssignments; + } + + /** + * Assigns a role to the given content object. + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation + * + * return void + */ + private function assignRoleToContent(Role $role, Content $content, RoleLimitation $roleLimitation = null ) + { + if ( false === isset( $this->content2roles[$content->id] ) ) + { + $this->content2roles[$content->id] = array(); + } + + if ( $roleLimitation ) + { + foreach ( $roleLimitation->limitationValues as $value ) + { + $this->content2roles[$content->id][++$this->limitationId] = $role->id; + $this->roleLimitations[$this->limitationId] = array( + 'id' => $this->limitationId, + 'roleId' => $role->id, + 'contentId' => $content->id, + 'identifier' => $roleLimitation->getIdentifier(), + 'value' => array( $value ) + ); + } + } + else + { + $this->content2roles[$content->id][++$this->limitationId] = $role->id; + } + } + + /** + * removes a role from the given content object. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the given user group + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return void + */ + private function unassignRoleFromContent( Role $role, Content $content ) + { + if ( false === isset( $this->content2roles[$content->id] ) + || false === in_array( $role->id, $this->content2roles[$content->id] ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $index = array_search( $role->id, $this->content2roles[$content->id] ); + unset( + $this->content2roles[$content->id][$index], + $this->roleLimitations[$index] + ); + } + + /** + * Returns list of role assignments for specific role and content. + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param int $contentId + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + private function getRoleAssignmentsForRoleAndContent( Role $role, $contentId ) + { + $contentService = $this->repository->getContentService(); + $userService = $this->repository->getUserService(); + + $contentType = $contentService->loadContent( $contentId )->contentType; + if ( $contentType->identifier != 'user_group' && $contentType->identifier != 'user' ) + { + throw new \ErrorException( + "Implementation error, unknown contentType '{$contentType->identifier}'." + ); + } + + $roleAssignments = array(); + foreach ( $this->roleLimitations as $limit ) + { + if ( $limit['roleId'] == $role->id && $limit['contentId'] == $contentId ) + { + $limitIdentifier = $limit['identifier']; + if ( !isset( $roleAssignments[$limitIdentifier] ) ) + { + if ( 'user_group' === $contentType->identifier ) + { + $roleAssignments[$limitIdentifier] = new UserGroupRoleAssignmentStub( + array( + 'role' => $role, + 'userGroup' => $userService->loadUserGroup( $contentId ), + 'limitation' => $this->getOptionalRoleLimitation( $role->id, $contentId, $limitIdentifier ), + ) + ); + } + else if ( 'user' === $contentType->identifier ) + { + $roleAssignments[$limitIdentifier] = new UserRoleAssignmentStub( + array( + 'role' => $role, + 'user' => $userService->loadUser( $contentId ), + 'limitation' => $this->getOptionalRoleLimitation( $role->id, $contentId, $limitIdentifier ), + ) + ); + } + } + } + } + + if ( empty( $roleAssignments ) ) + { + if ( 'user_group' === $contentType->identifier ) + { + $roleAssignments[] = new UserGroupRoleAssignmentStub( + array( + 'role' => $role, + 'userGroup' => $userService->loadUserGroup( $contentId ), + 'limitation' => null, + ) + ); + } + else if ( 'user' === $contentType->identifier ) + { + $roleAssignments[] = new UserRoleAssignmentStub( + array( + 'role' => $role, + 'user' => $userService->loadUser( $contentId ), + 'limitation' => null, + ) + ); + } + } + + return array_values( $roleAssignments ); + } + + /** + * Returns the associated limitation or NULL. + * + * @param int $roleId + * @param int $contentId + * @param string $limitationIdentifier + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + private function getOptionalRoleLimitation( $roleId, $contentId, $limitationIdentifier ) + { + $limitationValues = array(); + foreach ( $this->roleLimitations as $limit ) + { + if ( $roleId == $limit['roleId'] && $contentId == $limit['contentId'] && $limitationIdentifier == $limit['identifier'] ) + { + $limitationValues = array_merge( $limitationValues, $limit['value'] ); + } + } + + if ( empty( $limitationValues ) ) + { + return null; + } + + switch ( $limitationIdentifier ) + { + case 'Subtree': + return new \eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation( + array( + 'limitationValues' => $limitationValues + ) + ); + + case 'Section': + return new \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation( + array( + 'limitationValues' => $limitationValues + ) + ); + } + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + list( + $this->roles, + $this->nameToRoleId, + $this->nextRoleId, + $this->content2roles, + $this->policies, + $this->policyNextId, + $this->role2policy, + $this->roleLimitations + ) = $this->repository->loadFixture( 'Role' ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/SectionServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/SectionServiceStub.php new file mode 100644 index 0000000..2532e66 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/SectionServiceStub.php @@ -0,0 +1,328 @@ +repository = $repository; + + $this->initFromFixture(); + } + + /** + * Creates the a new Section in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier in $sectionCreateStruct already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct $sectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section The newly create section + */ + public function createSection( SectionCreateStruct $sectionCreateStruct ) + { + if ( true !== $this->repository->hasAccess( 'section', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( isset( $this->identifiers[$sectionCreateStruct->identifier] ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $section = new Section( + array( + 'id' => ++$this->nextId, + 'name' => $sectionCreateStruct->name, + 'identifier' => $sectionCreateStruct->identifier + ) + ); + + $this->sections[$section->id] = $section; + $this->identifiers[$section->identifier] = $section->id; + + return $section; + } + + /** + * Updates the given in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier already exists (if set in the update struct) + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * @param \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct $sectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function updateSection( Section $section, SectionUpdateStruct $sectionUpdateStruct ) + { + if ( true !== $this->repository->hasAccess( 'section', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + if ( isset( $this->identifiers[$sectionUpdateStruct->identifier] ) && + ( $this->identifiers[$sectionUpdateStruct->identifier] !== $section->id ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + $updatedSection = new Section( + array( + 'id' => $section->id, + 'name' => ( $sectionUpdateStruct->name ? $sectionUpdateStruct->name : $section->name ), + 'identifier' => ( $sectionUpdateStruct->identifier ? $sectionUpdateStruct->identifier : $section->identifier ) + ) + ); + + unset( $this->identifiers[$section->identifier] ); + + $this->sections[$updatedSection->id] = $updatedSection; + $this->identifiers[$updatedSection->identifier] = $updatedSection->id; + + return $updatedSection; + } + + /** + * Loads a Section from its id ($sectionId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param int $sectionId + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSection( $sectionId ) + { + if ( true !== $this->repository->hasAccess( 'section', 'view' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( isset( $this->sections[$sectionId] ) ) + { + return $this->sections[$sectionId]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads all sections + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @return array of {@link \eZ\Publish\API\Repository\Values\Content\Section} + */ + public function loadSections() + { + if ( true !== $this->repository->hasAccess( 'section', 'view' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return array_values( $this->sections ); + } + + /** + * Loads a Section from its identifier ($sectionIdentifier) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param string $sectionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSectionByIdentifier( $sectionIdentifier ) + { + if ( true !== $this->repository->hasAccess( 'section', 'view' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( isset( $this->identifiers[$sectionIdentifier] ) ) + { + return $this->sections[$this->identifiers[$sectionIdentifier]]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Counts the contents which $section is assigned to + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * + * @return int + */ + public function countAssignedContents( Section $section ) + { + if ( isset( $this->assignedContents[$section->id] ) ) + { + return count( $this->assignedContents[$section->id] ); + } + return 0; + } + + /** + * Assigns the content to the given section + * this method overrides the current assigned section + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to view provided object + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function assignSection( ContentInfo $contentInfo, Section $section ) + { + if ( true !== $this->repository->hasAccess( 'section', 'assign' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( false === isset( $this->assignedContents[$section->id] ) ) + { + $this->assignedContents[$section->id] = array(); + } + + // Unassign from previous section + foreach ( $this->assignedContents as $sectionId => $assignedContents ) + { + if ( isset( $assignedContents[$contentInfo->id] ) ) + { + unset( $this->assignedContents[$sectionId][$contentInfo->id] ); + } + } + + $this->assignedContents[$section->id][$contentInfo->id] = true; + } + + /** + * Deletes $section from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified section is not found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to delete a section + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if section can not be deleted + * because it is still assigned to some contents. + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function deleteSection( Section $section ) + { + if ( false === isset( $this->sections[$section->id] ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + if ( isset( $this->assignedContents[$section->id] ) ) + { + throw new BadStateExceptionStub( 'What error code should be used?' ); + } + if ( true !== $this->repository->hasAccess( 'section', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + unset( $this->sections[$section->id], $this->identifiers[$section->identifier] ); + } + + /** + * Instantiates a new SectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct + */ + public function newSectionCreateStruct() + { + return new SectionCreateStruct(); + } + + /** + * Instantiates a new SectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct + */ + public function newSectionUpdateStruct() + { + return new SectionUpdateStruct(); + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + list( + $this->sections, + $this->identifiers, + $this->assignedContents, + $this->nextId + ) = $this->repository->loadFixture( 'Section' ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/TrashServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/TrashServiceStub.php new file mode 100644 index 0000000..d01f469 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/TrashServiceStub.php @@ -0,0 +1,239 @@ +repository = $repository; + $this->locationService = $locationService; + } + + /** + * Loads a trashed location object from its $id. + * + * Note that $id is identical to original location, which has been previously trashed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the trashed location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the location with the given id does not exist + * + * @param int $trashItemId + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function loadTrashItem( $trashItemId ) + { + if ( false === isset( $this->trashItems[$trashItemId] ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + if ( false === $this->repository->canUser( 'content', 'edit', $this->trashItems[$trashItemId]->location ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $this->trashItems[$trashItemId]; + } + + /** + * Sends $location and all its children to trash and returns the corresponding trash item. + * + * Content is left untouched. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to trash the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function trash( Location $location ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $location ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + // Trash all children + foreach ( $this->locationService->trashLocation( $location ) as $trashedLocation ) + { + $this->trashItems[$trashedLocation->id] = $this->trashItemFromLocation( $trashedLocation ); + } + + $this->trashItems[$location->id] = $this->trashItemFromLocation( $location ); + return $this->trashItems[$location->id]; + } + + /** + * Creates a TrashItem for the given $location. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + protected function trashItemFromLocation( Location $location ) + { + return new TrashItemStub( + array( + 'id' => $location->id, + 'depth' => $location->depth, + 'hidden' => $location->hidden, + 'invisible' => $location->invisible, + 'parentLocationId' => $location->parentLocationId, + 'pathString' => $location->pathString, + 'priority' => $location->priority, + 'remoteId' => $location->remoteId, + 'sortField' => $location->sortField, + 'sortOrder' => $location->sortOrder, + + 'location' => $location + ) + ); + } + + /** + * Recovers the $trashedLocation at its original place if possible. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to recover the trash item at the parent location location + * + * If $newParentLocation is provided, $trashedLocation will be restored under it. + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created or recovered location + */ + public function recover( TrashItem $trashItem, Location $newParentLocation = null ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $trashItem ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $location = $this->locationService->recoverLocation( + $trashItem->location, + $newParentLocation + ); + + unset( + $this->trashItems[$trashItem->id], + $this->locations[$trashItem->id] + ); + + return $location; + } + + /** + * Empties trash. + * + * All locations contained in the trash will be removed. Content objects will be removed + * if all locations of the content are gone. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to empty the trash + */ + public function emptyTrash() + { + if ( false === $this->repository->hasAccess( 'content', 'remove' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $this->trashItems = array(); + } + + /** + * Deletes a trash item. + * + * The corresponding content object will be removed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete this trash item + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + */ + public function deleteTrashItem( TrashItem $trashItem ) + { + if ( false === $this->repository->canUser( 'content', 'remove', $trashItem ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + unset( + $this->trashItems[$trashItem->id], + $this->locations[$trashItem->id] + ); + } + + /** + * Returns a collection of Trashed locations contained in the trash. + * + * $query allows to filter/sort the elements to be contained in the collection. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * + * @return \eZ\Publish\API\Repository\Values\Content\SearchResult + */ + public function findTrashItems( Query $query ) + { + return new SearchResult( + array( + 'query' => $query, + 'count' => count( $this->trashItems ), + 'items' => array_values( $this->trashItems ), + ) + ); + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->emptyTrash(); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/URLAliasServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/URLAliasServiceStub.php new file mode 100644 index 0000000..1d04a74 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/URLAliasServiceStub.php @@ -0,0 +1,664 @@ +repository = $repository; + $this->initFromFixture(); + } + + /** + * Create a user chosen $alias pointing to $location in $languageCode. + * + * This method runs URL filters and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * $alwaysAvailable makes the alias available in all languages. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $path + * @param boolean $forward if true a redirect is performed + * @param string $languageCode the languageCode for which this alias is valid + * @param boolean $alwaysAvailable + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createUrlAlias( Location $location, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + $this->checkAliasNotExists( $path, $languageCode, true ); + + $data = array( + 'destination' => $location->id, + 'path' => $path, + 'languageCodes' => array( $languageCode ), + 'alwaysAvailable' => $alwaysAvailable, + 'forward' => $forwarding, + ); + + return $this->createLocationUrlAlias( $data ); + } + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * This method runs URL filters and and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * + * $alwaysAvailable makes the alias available in all languages. + * + * @param string $resource + * @param string $path + * @param string $languageCode + * @param boolean $forwarding + * @param boolean $alwaysAvailable + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createGlobalUrlAlias( $resource, $path, $languageCode, $forward = false, $alwaysAvailable = false ) + { + $this->checkAliasNotExists( $path, $languageCode, true ); + + $data = array( + 'id' => ++$this->nextAliasId, + 'type' => URLAlias::RESOURCE, + 'destination' => preg_replace( + '(^module:)', + '', + $resource + ), + 'path' => $path, + 'languageCodes' => array( $languageCode ), + 'alwaysAvailable' => $alwaysAvailable, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => $forward, + ); + return ( $this->aliases[$data['id']] = new URLAlias( $data ) ); + } + + /** + * List of url aliases pointing to $location. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * @param string $languageCode filters those which are valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listLocationAliases( Location $location, $custom = true, $languageCode = null ) + { + $locationAliases = array(); + foreach ( $this->aliases as $existingAlias ) + { + // Filter non-location aliases and location aliases for other + // locations + if ( $existingAlias->type != URLAlias::LOCATION || $existingAlias->destination != $location->id ) + { + continue; + } + // Filter for custom / non-custom + if ( $custom !== $existingAlias->isCustom ) + { + continue; + } + // Filter for language code + if ( $languageCode !== null && !in_array( $languageCode, $existingAlias->languageCodes ) ) + { + continue; + } + // Filter out history aliases + if ( $existingAlias->isHistory ) + { + continue; + } + + $locationAliases[] = $existingAlias; + } + if ( !count( $locationAliases ) && $languageCode !== '' ) + { + $locationAliases = $this->listLocationAliases( $location, $custom, '' );; + } + return $locationAliases; + } + + /** + * List global aliases + * + * @param string $languageCode filters those which are valid for the given language + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listGlobalAliases( $languageCode = null, $offset = 0, $limit = -1 ) + { + $globalAliases = array(); + foreach ( $this->aliases as $existingAlias ) + { + if ( !is_string( $existingAlias->destination ) ) + { + continue; + } + if ( $languageCode !== null && !in_array( $languageCode, $existingAlias->languageCodes ) ) + { + continue; + } + $globalAliases[] = $existingAlias; + } + + return array_slice( $globalAliases, $offset, ( $limit == -1 ? null : $limit ) ); + } + + /** + * Removes urls aliases. + * + * This method does not remove autogenerated aliases for locations. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias[] $aliasList + * + * @return boolean + */ + public function removeAliases( array $aliasList ) + { + foreach ( $aliasList as $aliasToRemove ) + { + if ( $aliasToRemove->isCustom ) + { + unset( $this->aliases[$aliasToRemove->id] ); + } + else + { + throw new Exceptions\InvalidArgumentExceptionStub( + 'What error code should be used?' + ); + } + } + return true; + } + + /** + * looks up the URLAlias for the given url. + * + * @param string $url + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the path does not exist or is not valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function lookUp( $url, $languageCode = null ) + { + foreach ( $this->aliases as $existingAlias ) + { + if ( $existingAlias->path == $url + && ( $languageCode === null || in_array( $languageCode, $existingAlias->languageCodes ) ) ) + { + return $existingAlias; + } + } + throw new Exceptions\NotFoundExceptionStub( + sprintf( + 'No alias for URL "%s" in language "%s" could be found.', + $url, + $languageCode + ) + ); + } + + /** + * Returns the URL alias for the given location in the given language. + * + * If $languageCode is null the method returns the url alias in the most prioritized language. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if no url alias exist for the given language + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function reverseLookup( Location $location, $languageCode = null ) + { + throw new \RuntimeException( '@todo: Implement.' ); + } + + /** + * Auto-generates the URL aliases for $versionInfo + * + * ATTENTION: This method is not part of the Public API but is only used + * internally in this implementation. + * + * @access private + * + * @internal + * + * @param \eZ\Publish\API\Repository\Content\VersionInfo $versionInfo + * + * @return void + */ + public function createAliasesForVersion( VersionInfo $versionInfo ) + { + $locationService = $this->repository->getLocationService(); + + $locations = $locationService->loadLocations( + $versionInfo->getContentInfo() + ); + + foreach ( $locations as $location ) + { + $this->obsoleteOldAliases( $location ); + $this->createAliasesForLocation( $location ); + } + } + + /** + * Auto-generates aliases for the given $location + * + * Old aliases will automatically be moved to history mode. + * + * ATTENTION: This method is not part of the Public API but is only used + * internally in this implementation. + * + * @access private + * + * @internal + * + * @param Location $location + * + * @return void + */ + public function createAliasesForLocation( Location $location ) + { + $contentService = $this->repository->getContentService(); + $content = $contentService->loadContent( + $location->getContentInfo()->id + ); + + if ( $content->getVersionInfo()->status !== VersionInfo::STATUS_PUBLISHED ) + { + // Skip not yet published content + return; + } + + $versionInfo = $content->getVersionInfo(); + $contentInfo = $versionInfo->getContentInfo(); + + $this->obsoleteOldAliases( $location ); + + foreach ( $versionInfo->getNames() as $languageCode => $name ) + { + $this->createInternalUrlAlias( + $location, + $this->createUrlAliasPath( $location, $name, $languageCode ), + $languageCode, + ( $contentInfo->mainLanguageCode === $languageCode + && $contentInfo->alwaysAvailable ) + ); + } + } + + /** + * Removes aliases for the given $location + * + * Does not move them to history mode, but actually deletes them. + * + * ATTENTION: This method is not part of the Public API but is only used + * internally in this implementation. + * + * @access private + * + * @internal + * + * @param Location $location + * + * @return void + */ + public function removeAliasesForLocation( Location $location ) + { + $this->removeAliases( $this->listLocationAliases( $location ) ); + } + + /** + * Creates the path for an alias to $location with $name in $languageCode + * + * @param Location $location + * @param mixed $name + * @param mixed $languageCode + * + * @return string + */ + private function createUrlAliasPath( Location $location, $name, $languageCode ) + { + $locationService = $this->repository->getLocationService(); + + $parentPath = ''; + + // 1 is the root location, which simply does not have aliases + if ( $location->parentLocationId !== 1 ) + { + $parentAliases = $this->listLocationAliases( + $locationService->loadLocation( $location->parentLocationId ), + false + ); + + $parentAlias = $this->guessCorrectParent( $parentAliases, $languageCode ); + + $parentPath = $parentAlias->path; + } + + return $parentPath . '/' . $this->generateAliasName( $name ); + } + + /** + * Guesses the correct parent alias from $parentAliases for $languageCode + * + * Performs the following steps: + * + * 1. Checks for alias with $languageCode and returns on success + * 2. Checks for alias with $alwaysAvailable and returns on success + * 3. Chooses the first alias from $parentAliases + * 4. Throws exception if $parentAliases is empty + * + * @param mixed $parentAliases + * @param mixed $languageCode + * + * @return void + */ + private function guessCorrectParent( $parentAliases, $languageCode ) + { + if ( !count( $parentAliases ) ) + { + throw new \RuntimeException( "No parent aliases found." ); + } + + foreach ( $parentAliases as $potentialParent ) + { + if ( in_array( $languageCode, $potentialParent->languageCodes ) ) + { + return $potentialParent; + } + } + + foreach ( $parentAliases as $potentialParent ) + { + if ( $potentialParent->alwaysAvailable ) + { + return $potentialParent; + } + } + + return reset( $parentAliases ); + } + + /** + * Generates a URLAlias path element for $name. + * + * Highly simplified. + * + * @param string $name + * + * @return string + * @todo Need to use the configured URL transformation here, as soon as the + * SPI and implementation are available. + */ + private function generateAliasName( $name ) + { + return strtr( + $name, + array( + ' ' => '-', + '²' => '2', + '³' => '3', + ) + ); + } + + /** + * Deprecates old aliases of $location + * + * @param Location $location + * + * @return void + */ + private function obsoleteOldAliases( Location $location ) + { + $aliases = $this->listLocationAliases( $location, false ); + foreach ( $aliases as $alias ) + { + $this->obsoleteAlias( $alias ); + } + } + + /** + * Creates an internal URL alias (autogeneration on publish) + * + * @param Location $location + * @param string $path + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + private function createInternalUrlAlias( Location $location, $path, $languageCode, $alwaysAvailable ) + { + $this->checkAliasNotExists( $path, $languageCode, false ); + + return $this->createLocationUrlAlias( + array( + 'destination' => $location->id, + 'path' => $path, + 'languageCodes' => array( $languageCode ), + 'isCustom' => false, + 'alwaysAvailable' => $alwaysAvailable, + ) + ); + } + + /** + * Marks the given alias as being historical. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias $alias + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + private function obsoleteAlias( URLAlias $alias ) + { + $this->purgeObsoleteAliases( $alias->path ); + + unset( $this->aliases[$alias->id] ); + + $this->createLocationUrlAlias( + array( + 'id' => $alias->id, + 'type' => $alias->type, + 'destination' => $alias->destination, + 'path' => $alias->path, + 'languageCodes' => $alias->languageCodes, + 'alwaysAvailable' => $alias->alwaysAvailable, + 'isCustom' => $alias->isCustom, + 'forward' => $alias->forward, + + 'isHistory' => true, + ) + ); + } + + /** + * Purges history aliases for $path. + * + * @param string $path + * + * @return void + */ + private function purgeObsoleteAliases( $path ) + { + foreach ( $this->aliases as $id => $existingAlias ) + { + if ( $existingAlias->path == $path && $existingAlias->isHistory && !$existingAlias->isCustom ) + { + unset( $this->aliases[$id] ); + } + } + } + + /** + * Creates a location URL alias from the given $properties + * + * @param array $properties + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + private function createLocationUrlAlias( array $properties ) + { + $properties = array_merge( + array( + 'id' => ++$this->nextAliasId, + 'type' => URLAlias::LOCATION, + 'isHistory' => false, + 'isCustom' => true, + 'alwaysAvailable' => true, + 'forward' => false, + ), + $properties + ); + return ( $this->aliases[$properties['id']] = new URLAlias( $properties ) ); + } + + /** + * Checks if an alias for the given $path already exists. + * + * @param string $path + * @param string $languageCodes + * @param boolean $custom + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given language + * + * @return void + */ + private function checkAliasNotExists( $path, $languageCode, $custom ) + { + foreach ( $this->aliases as $existingAlias ) + { + if ( $custom + && !$existingAlias->isHistory + && $existingAlias->path == $path + && in_array( $languageCode, $existingAlias->languageCodes ) ) + { + throw new Exceptions\InvalidArgumentExceptionStub( + sprintf( + 'An alias for path "%s" in language "%s" already exists.', + $path, + $languageCode + ) + ); + } + } + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + $this->aliases = array(); + $this->nextAliasId = 0; + + list( + $aliases, + $this->nextAliasId + ) = $this->repository->loadFixture( 'URLAlias' ); + + foreach ( $aliases as $alias ) + { + $this->aliases[$alias->id] = $alias; + $this->nextAliasId = max( $this->nextAliasId, $alias->id ); + } + } + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function load( $id ) + { + // @todo: Implement load() method. + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/URLWildcardServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/URLWildcardServiceStub.php new file mode 100644 index 0000000..9d77664 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/URLWildcardServiceStub.php @@ -0,0 +1,244 @@ +repository = $repository; + } + + /** + * Creates a new url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the $sourceUrl pattern already exists + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create url wildcards + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if the number of "*" patterns in $sourceUrl and + * the numbers in {\d} placeholders in $destinationUrl does not match. + * + * @param string $sourceUrl + * @param string $destinationUrl + * @param boolean $forward + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard + */ + public function create( $sourceUrl, $destinationUrl, $forward = false ) + { + if ( false === $this->repository->hasAccess( 'content', 'edit' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( $this->wildcards as $wildcard ) + { + if ( $wildcard->sourceUrl === $sourceUrl ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + + preg_match_all( '(\\*)', $sourceUrl, $patterns ); + preg_match_all( '(\{(\d+)\})', $destinationUrl, $placeholders ); + + $patterns = array_map( 'intval', $patterns[0] ); + $placeholders = array_map( 'intval', $placeholders[1] ); + + if ( count( $placeholders ) > 0 && max( $placeholders ) > count( $patterns ) ) + { + throw new ContentValidationExceptionStub( 'What error code should be used?' ); + } + + $wildcard = new URLWildcard( + array( + 'id' => ++$this->id, + 'sourceUrl' => $sourceUrl, + 'destinationUrl' => $destinationUrl, + 'forward' => $forward + ) + ); + + return ( $this->wildcards[$wildcard->id] = $wildcard ); + } + + /** + * removes an url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove url wildcards + * + * @param \eZ\Publish\API\Repository\Values\Content\UrlWildcard $urlWildcard the url wildcard to remove + */ + public function remove( URLWildcard $urlWildcard ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $urlWildcard ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + unset( $this->wildcards[$urlWildcard->id] ); + } + + /** + * Loads a url wild card + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard + */ + public function load( $id ) + { + if ( isset( $this->wildcards[$id] ) ) + { + return $this->wildcards[$id]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads all url wild card (paged) + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard[] + */ + public function loadAll( $offset = 0, $limit = -1 ) + { + return array_slice( $this->wildcards, $offset, -1 === $limit ? PHP_INT_MAX : $limit ); + } + + /** + * translates an url to an existing uri resource based on the + * source/destination patterns of the url wildcard. If the resulting + * url is an alias it will be translated to the system uri. + * + * This method runs also configured url translations and filter + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url could not be translated + * + * @param mixed $url + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult + */ + public function translate( $url ) + { + uasort( + $this->wildcards, + function( URLWildcard $w1, URLWildcard $w2 ) + { + return strlen( $w2->sourceUrl ) - strlen( $w1->sourceUrl ); + } + ); + + foreach ( $this->wildcards as $wildcard ) + { + if ( $uri = $this->match( $url, $wildcard ) ) + { + return new URLWildcardTranslationResult( + array( + 'uri' => $uri, + 'forward' => $wildcard->forward + ) + ); + } + } + + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Tests if the given url matches against the given url wildcard. + * + * if the wildcard matches on the given url this method will return a ready + * to use destination url, otherwise this method will return NULL. + * + * @param string $url + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $wildcard + * + * @return string|null + */ + private function match( $url, URLWildcard $wildcard ) + { + if ( preg_match( $this->compile( $wildcard->sourceUrl ), $url, $match ) ) + { + return $this->substitute( $wildcard->destinationUrl, $match ); + } + return null; + } + + /** + * Compiles the given url pattern into a regular expression. + * + * @param string $sourceUrl + * + * @return string + */ + private function compile( $sourceUrl ) + { + return '(^' . str_replace( '\\*', '(.*)', preg_quote( $sourceUrl ) ) . '$)U'; + } + + /** + * Substitutes all placesholder ({\d}) in the given $destinationUrl with + * the values from the given $values array. + * + * @param string $destinationUrl + * @param array $values + * + * @throws \eZ\Publish\API\Repository\Tests\Stubs\Exceptions\ContentValidationExceptionStub + * + * @return string + */ + private function substitute( $destinationUrl, array $values ) + { + preg_match_all( '(\{(\d+)\})', $destinationUrl, $matches ); + + foreach ( $matches[1] as $match ) + { + $destinationUrl = str_replace( "{{$match}}", $values[$match], $destinationUrl ); + } + return $destinationUrl; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/UserServiceStub.php b/eZ/Publish/API/Repository/Tests/Stubs/UserServiceStub.php new file mode 100644 index 0000000..520ac14 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/UserServiceStub.php @@ -0,0 +1,801 @@ +repository = $repository; + + $this->initFromFixture(); + } + + /** + * Creates a new user group using the data provided in the ContentCreateStruct parameter + * + * In 4.x in the content type parameter in the profile is ignored + * - the content type is determined via configuration and can be set to null. + * The returned version is published. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $userGroupCreateStruct a structure for setting all necessary data to create this user group + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $parentGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the input structure has invalid data + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing + */ + public function createUserGroup( UserGroupCreateStruct $userGroupCreateStruct, UserGroup $parentGroup ) + { + if ( false === $this->repository->canUser( 'content', 'create', $parentGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + + $locationCreate = $locationService->newLocationCreateStruct( + $parentGroup->contentInfo->mainLocationId + ); + + $draft = $contentService->createContent( + $userGroupCreateStruct, + array( $locationCreate ) + ); + + $content = $contentService->publishVersion( $draft->getVersionInfo() ); + + $userGroup = new UserGroupStub( + array( + 'parentId' => $parentGroup->id, + 'subGroupCount' => 0, + 'content' => $content + ) + ); + $this->userGroups[$userGroup->id] = $userGroup; + $this->userGroups[$parentGroup->id] = new UserGroupStub( + array( + 'parentId' => $parentGroup->parentId, + 'subGroupCount' => $parentGroup->subGroupCount + 1, + 'content' => $parentGroup->content + ) + ); + + return $userGroup; + } + + /** + * Loads a user group for the given id + * + * @param int $id + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the user group with the given id was not found + */ + public function loadUserGroup( $id ) + { + if ( false === isset( $this->userGroups[$id] ) ) + { + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + if ( false === $this->repository->canUser( 'content', 'read', $this->userGroups[$id] ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + return $this->userGroups[$id]; + } + + /** + * Loads the sub groups of a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the user group + */ + public function loadSubUserGroups( UserGroup $userGroup ) + { + if ( false === $this->repository->canUser( 'content', 'read', $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $subUserGroups = array(); + foreach ( $this->userGroups as $group ) + { + if ( (string)$group->parentId === (string)$userGroup->id ) + { + $subUserGroups[] = $group; + } + } + return $subUserGroups; + } + + /** + * Removes a user group + * + * the users which are not assigned to other groups will be deleted. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + */ + public function deleteUserGroup( UserGroup $userGroup ) + { + if ( false === $this->repository->canUser( 'content', 'remove', $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( array_keys( $this->user2groups ) as $userId ) + { + unset( $this->user2groups[$userId][$userGroup->id] ); + } + unset( $this->userGroups[$userGroup->id] ); + } + + /** + * Moves the user group to another parent + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $newParent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + */ + public function moveUserGroup( UserGroup $userGroup, UserGroup $newParent ) + { + if ( false === $this->repository->canUser( 'content', 'move', $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $contentService = $this->repository->getContentService(); + + $oldParent = $this->userGroups[$userGroup->parentId]; + + $this->userGroups[$oldParent->id] = new UserGroupStub( + array( + 'parentId' => $oldParent->parentId, + 'subGroupCount' => $oldParent->subGroupCount - 1, + 'content' => $contentService->loadContent( + $oldParent->id + ) + ) + ); + + $this->userGroups[$userGroup->id] = new UserGroupStub( + array( + 'parentId' => $newParent->id, + 'subGroupCount' => $userGroup->subGroupCount, + 'content' => $contentService->loadContent( + $userGroup->id + ) + ) + ); + + $this->userGroups[$newParent->id] = new UserGroupStub( + array( + 'parentId' => $newParent->parentId, + 'subGroupCount' => $newParent->subGroupCount + 1, + 'content' => $contentService->loadContent( + $newParent->id + ) + ) + ); + } + + /** + * Updates the group profile with fields and meta data + * + * 4.x: If the versionUpdateStruct is set in $userGroupUpdateStruct, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explicitly required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct $userGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + */ + public function updateUserGroup( UserGroup $userGroup, UserGroupUpdateStruct $userGroupUpdateStruct ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $contentService = $this->repository->getContentService(); + + $content = null; + if ( $userGroupUpdateStruct->contentUpdateStruct ) + { + $draft = $contentService->createContentDraft( $userGroup->contentInfo ); + $draft = $contentService->updateContent( + $draft->getVersionInfo(), + $userGroupUpdateStruct->contentUpdateStruct + ); + + $content = $contentService->publishVersion( $draft->getVersionInfo() ); + } + + if ( $userGroupUpdateStruct->contentMetadataUpdateStruct ) + { + $content = $contentService->updateContentMetadata( + $userGroup->contentInfo, + $userGroupUpdateStruct->contentMetadataUpdateStruct + ); + } + + if ( null !== $content ) + { + $this->userGroups[$userGroup->id] = new UserGroupStub( + array( + 'parentId' => $userGroup->parentId, + 'subGroupCount' => $userGroup->subGroupCount, + 'content' => $content + ) + ); + } + + return $this->userGroups[$userGroup->id]; + } + + /** + * Create a new user. The created user is published by this method + * + * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user + * @param array $parentGroups the groups of type {@link \eZ\Publish\API\Repository\Values\User\UserGroup} which are assigned to the user after creation + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user group was not found + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a user with provided login already exists + */ + public function createUser( UserCreateStruct $userCreateStruct, array $parentGroups ) + { + if ( false === $this->repository->hasAccess( 'content', 'create' ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + foreach ( $this->users as $user ) + { + if ( $user->login == $userCreateStruct->login ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + } + + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + + $locationCreateStruts = array(); + foreach ( $parentGroups as $parentGroup ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $parentGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $locationCreateStruts[] = $locationService->newLocationCreateStruct( + $parentGroup->contentInfo->mainLocationId + ); + } + + // Seems the is a back reference in the content object + $userCreateStruct->setField( 'user_account', new UserStub() ); + + $draft = $contentService->createContent( + $userCreateStruct, + $locationCreateStruts + ); + $content = $contentService->publishVersion( $draft->getVersionInfo() ); + + $user = new UserStub( + array( + 'login' => $userCreateStruct->login, + 'email' => $userCreateStruct->email, + 'passwordHash' => $this->createHash( + $userCreateStruct->login, + $userCreateStruct->password, + 2 + ), + 'hashAlgorithm' => 2, + 'enabled' => $userCreateStruct->enabled, + 'content' => $content + ) + ); + $this->users[$user->id] = $user; + + foreach ( $parentGroups as $parentGroup ) + { + $this->assignUserToUserGroup( $user, $parentGroup ); + } + + return $user; + } + + /** + * Loads a user + * + * @param int $userId + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + */ + public function loadUser( $userId ) + { + if ( isset( $this->users[$userId] ) ) + { + return $this->users[$userId]; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * Loads anonymous user + * + * @uses loadUser() + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function loadAnonymousUser() + { + // 10 is the contentId of the anon user in the test dump + return $this->loadUser( 10 ); + } + + /** + * Loads a user for the given login and password + * + * @param string $login + * @param string $password the plain password + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given credentials was not found + */ + public function loadUserByCredentials( $login, $password ) + { + foreach ( $this->users as $user ) + { + if ( $login !== $user->login ) + { + continue; + } + + $passwordHash = $this->createHash( + $login, + $password, + $user->hashAlgorithm + ); + + if ( $passwordHash !== $user->passwordHash ) + { + continue; + } + return $user; + } + throw new NotFoundExceptionStub( 'What error code should be used?' ); + } + + /** + * This method deletes a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete the user + */ + public function deleteUser( User $user ) + { + if ( false === $this->repository->canUser( 'content', 'remove', $user ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + unset( + $this->users[$user->id], + $this->user2groups[$user->id] + ); + } + + /** + * Updates a user + * + * 4.x: If the versionUpdateStruct is set in the user update structure, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explicitly required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserUpdateStruct $userUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update the user + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function updateUser( User $user, UserUpdateStruct $userUpdateStruct ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $user ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $contentService = $this->repository->getContentService(); + + $content = $contentService->loadContentByContentInfo( $user->contentInfo ); + + $contentUpdate = $userUpdateStruct->contentUpdateStruct; + if ( $contentUpdate === null ) + { + $contentUpdate = $contentService->newContentUpdateStruct(); + foreach ( $content->getFields() as $field ) + { + $contentUpdate->setField( $field->fieldDefIdentifier, $field->value, $field->languageCode ); + } + $contentUpdate->setField( 'user_account', $user ); + } + + $contentDraft = $contentService->createContentDraft( $user->contentInfo ); + $contentDraft = $contentService->updateContent( + $contentDraft->getVersionInfo(), + $contentUpdate + ); + + $content = $contentService->publishVersion( + $contentDraft->getVersionInfo() + ); + + if ( $userUpdateStruct->contentMetadataUpdateStruct ) + { + $content = $contentService->updateContentMetadata( + $content->contentInfo, + $userUpdateStruct->contentMetadataUpdateStruct + ); + } + + $this->users[$user->id] = new UserStub( + array( + 'login' => $user->login, + 'email' => $userUpdateStruct->email ?: $user->email, + 'enabled' => is_null( $userUpdateStruct->enabled ) ? $user->enabled : $userUpdateStruct->enabled, + 'maxLogin' => is_null( $userUpdateStruct->maxLogin ) ? $user->maxLogin : $userUpdateStruct->maxLogin, + 'hashAlgorithm' => $user->hashAlgorithm, + 'passwordHash' => $userUpdateStruct->password ? + $this->createHash( + $user->login, + $userUpdateStruct->password, + $user->hashAlgorithm + ) : $user->passwordHash, + + 'content' => $content, + ) + ); + + return $this->users[$user->id]; + } + + /** + * Assigns a new user group to the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign the user group to the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is already in the given user group + */ + public function assignUserToUserGroup( User $user, UserGroup $userGroup ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $user, $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( true === isset( $this->user2groups[$user->id][$userGroup->id] ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + + if ( false === isset( $this->user2groups[$user->id] ) ) + { + $this->user2groups[$user->id] = array(); + } + $this->user2groups[$user->id][$userGroup->id] = true; + } + + /** + * Removes a user group from the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove the user group from the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is not in the given user group + */ + public function unAssignUserFromUserGroup( User $user, UserGroup $userGroup ) + { + if ( false === $this->repository->canUser( 'content', 'edit', $user, $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + if ( false === isset( $this->user2groups[$user->id][$userGroup->id] ) ) + { + throw new InvalidArgumentExceptionStub( 'What error code should be used?' ); + } + unset( $this->user2groups[$user->id][$userGroup->id] ); + } + + /** + * Loads the user groups the user belongs to + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed read the user or user group + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + */ + public function loadUserGroupsOfUser( User $user) + { + if ( false === $this->repository->canUser( 'content', 'read', $user ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $userGroups = array(); + foreach ( array_keys( $this->user2groups[$user->id] ) as $groupId ) + { + $userGroups[] = $this->userGroups[$groupId]; + } + return $userGroups; + } + + /** + * Loads the users of a user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the users or user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\User\User[] + */ + public function loadUsersOfUserGroup( UserGroup $userGroup, $offset = 0, $limit = -1) + { + if ( false === $this->repository->canUser( 'content', 'read', $userGroup ) ) + { + throw new UnauthorizedExceptionStub( 'What error code should be used?' ); + } + + $users = array(); + foreach ( $this->user2groups as $userId => $userGroupIds ) + { + if ( isset( $userGroupIds[$userGroup->id] ) ) + { + $users[] = $this->users[$userId]; + } + } + return $users; + } + + /** + * Internal helper method. + * + * @access private + * + * @internal + * + * @param mixed $userId + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + */ + public function loadUserGroupsByUserId( $userId ) + { + if ( false === isset( $this->user2groups[$userId] ) ) + { + return array(); + } + + $groupIds = array_keys( $this->user2groups[$userId] ); + $userGroups = array(); + while ( !empty( $groupIds ) ) + { + $groupId = array_pop( $groupIds ); + + if ( $this->userGroups[$groupId]->parentId > 0 ) + { + $groupIds[] = $this->userGroups[$groupId]->parentId; + } + $userGroups[$groupId] = $this->userGroups[$groupId]; + } + return $userGroups; + } + + /** + * Instantiate a user create class + * + * @param string $login the login of the new user + * @param string $email the email of the new user + * @param string $password the plain password of the new user + * @param string $mainLanguageCode the main language for the underlying content object + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserCreateStruct + */ + public function newUserCreateStruct( $login, $email, $password, $mainLanguageCode, $contentType = null ) + { + $contentType = $contentType ?: + $this->repository->getContentTypeService()->loadContentTypeByIdentifier( 'user' ); + + return new UserCreateStructStub( + array( + 'login' => $login, + 'email' => $email, + 'password' => $password, + 'mainLanguageCode' => $mainLanguageCode, + 'contentType' => $contentType, + 'remoteId' => md5( uniqid( __METHOD__, true ) ) + ) + ); + + } + + /** + * Instantiate a user group create class + * + * @param string $mainLanguageCode The main language for the underlying content object + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + */ + public function newUserGroupCreateStruct( $mainLanguageCode, $contentType = null ) + { + $contentType = $contentType ?: + $this->repository->getContentTypeService()->loadContentTypeByIdentifier( 'user_group' ); + + return new UserGroupCreateStructStub( + array( + 'mainLanguageCode' => $mainLanguageCode, + 'contentType' => $contentType, + 'remoteId' => md5( uniqid( __METHOD__, true ) ) + ) + ); + } + + /** + * Instantiate a new user update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserUpdateStruct + */ + public function newUserUpdateStruct() + { + return new UserUpdateStruct(); + } + + /** + * Instantiate a new user group update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct + */ + public function newUserGroupUpdateStruct() + { + return new UserGroupUpdateStruct(); + } + + /** + * Internal helper method to emulate a rollback. + * + * @access private + * + * @internal + * + * @return void + */ + public function rollback() + { + $this->initFromFixture(); + } + + /** + * Helper method that initializes some default data from an existing legacy + * test fixture. + * + * @return void + */ + private function initFromFixture() + { + list( $this->userGroups ) = $this->repository->loadFixture( 'UserGroup' ); + list( $this->users ) = $this->repository->loadFixture( 'User' ); + + // Set the default relations. + $this->user2groups[10] = array( 42 => true ); + $this->user2groups[14] = array( 12 => true ); + } + + private function createHash( $login, $password, $type ) + { + switch ( $type ) + { + case 2: + /* PASSWORD_HASH_MD5_USER */ + return md5( "{$login}\n{$password}" ); + + case 3: + /* PASSWORD_HASH_MD5_SITE */ + $site = null; + return md5( "{$login}\n{$password}\n{$site}" ); + + case 5: + /* PASSWORD_HASH_PLAINTEXT */ + return $password; + } + /* PASSWORD_HASH_MD5_PASSWORD (1) */ + return md5( $password ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentCreateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentCreateStructStub.php new file mode 100644 index 0000000..ac24997 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentCreateStructStub.php @@ -0,0 +1,57 @@ +contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable ) + { + $language = $this->mainLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentInfoStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentInfoStub.php new file mode 100644 index 0000000..ae34358 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentInfoStub.php @@ -0,0 +1,67 @@ +repository->getContentTypeService()->loadContentType( $this->contentTypeId ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentType': + return $this->getContentType(); + } + return parent::__get( $property ); + } + + /** + * Internal helper method to modify the $mainLocationId property + * + * @access private + * + * @internal + * + * @param mixed $mainLocationId + * + * @return void + */ + public function setMainLocationId( $mainLocationId ) + { + $this->mainLocationId = $mainLocationId; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentStub.php new file mode 100644 index 0000000..b76308b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentStub.php @@ -0,0 +1,159 @@ +repository->getContentService()->loadVersionInfo( + $this->getContentInfo(), + $this->versionNo + ); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + $contentType = $this->getContentType(); + $translatable = $contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable; + + if ( null === $languageCode ) + { + $languageCode = $this->getVersionInfo()->getContentInfo()->mainLanguageCode; + } + + foreach ( $this->getFields() as $field ) + { + if ( $field->fieldDefIdentifier !== $fieldDefIdentifier ) + { + continue; + } + if ( $translatable && $field->languageCode !== $languageCode ) + { + continue; + } + return $field->value; + } + return null; + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} + */ + public function getFields() + { + return $this->fields; + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Field[] An array of {@link Field} with field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + // @todo: Implement getFieldsByLanguage() method. + } + + /** + * Returns the underlying ContentType for this content object. + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + private function getContentType() + { + return $this->repository->getContentTypeService()->loadContentType( $this->contentTypeId ); + } + + /** + * Returns the content info for this concrete content. + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + private function getContentInfo() + { + return $this->repository->getContentService()->loadContentInfo( $this->id ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentType': + return $this->getContentType(); + + case 'contentInfo': + return $this->getContentInfo(); + + case 'versionInfo': + return $this->getVersionInfo(); + } + + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentUpdateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentUpdateStructStub.php new file mode 100644 index 0000000..300b4ba --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/ContentUpdateStructStub.php @@ -0,0 +1,48 @@ +fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $languageCode + ) + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/FieldStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/FieldStub.php new file mode 100644 index 0000000..7b09712 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/FieldStub.php @@ -0,0 +1,33 @@ +value = $value; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/LocationStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/LocationStub.php new file mode 100644 index 0000000..770d145 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/LocationStub.php @@ -0,0 +1,249 @@ +contentInfo; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @param int $parentLocationId + * + * @return void + */ + public function setParentLocationId( $parentLocationId ) + { + $this->parentLocationId = $parentLocationId; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @return void + */ + public function hide() + { + $this->hidden = true; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @return void + */ + public function unhide() + { + $this->hidden = false; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @return void + */ + public function makeVisible() + { + $this->invisible = false; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @return void + */ + public function makeInvisible() + { + $this->invisible = true; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $newContentInfo + * + * @return void + */ + public function setContentInfo( ContentInfo $newContentInfo ) + { + $this->contentInfo = $newContentInfo; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @param int $depth + * + * @return void + */ + public function setDepth( $depth ) + { + $this->depth = $depth; + } + + /** + * FOR TEST USE ONLY! + * + * @access private + * + * @internal + * + * @param string $pathString + * + * @return void + */ + public function setPathString( $pathString ) + { + $this->pathString = $pathString; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/RelationStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/RelationStub.php new file mode 100644 index 0000000..731939c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/RelationStub.php @@ -0,0 +1,52 @@ +sourceContentInfo; + } + + /** + * the content of the destination content of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getDestinationContentInfo() + { + return $this->destinationContentInfo; + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/TrashItemStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/TrashItemStub.php new file mode 100644 index 0000000..01ad6a4 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/TrashItemStub.php @@ -0,0 +1,46 @@ +location->getContentInfo(); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentId': + return $this->getContentInfo()->id; + } + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/VersionInfoStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/VersionInfoStub.php new file mode 100644 index 0000000..5d54452 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/Content/VersionInfoStub.php @@ -0,0 +1,93 @@ + 2 ) + { + $trace = debug_backtrace(); + } + } + + /** + * Content of the content this version belongs to. + * + * @return ContentInfo + */ + public function getContentInfo() + { + return $this->repository->getContentService()->loadContentInfo( $this->contentId ); + } + + /** + * Returns the names computed from the name schema in the available languages. + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * Returns the name computed from the name schema in the given language. + * If no language is given the name in initial language of the version if present, otherwise null. + * + * @param string $languageCode + * + * @return string + */ + public function getName( $languageCode = null ) + { + return $this->name[$languageCode]; + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->getContentInfo(); + } + + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeCreateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeCreateStructStub.php new file mode 100644 index 0000000..ca70b6e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeCreateStructStub.php @@ -0,0 +1,37 @@ + $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * Adds a new field definition + * + * @param FieldDefinitionCreate $fieldDef + */ + public function addFieldDefinition( FieldDefinitionCreateStruct $fieldDef ) + { + $this->fieldDefinitions[] = $fieldDef; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeDraftStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeDraftStub.php new file mode 100644 index 0000000..06ebc0a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeDraftStub.php @@ -0,0 +1,150 @@ +innerContentType = $innerContentType; + } + + /** + * Returns the inner content type. + * + * ONLY FOR INTERNAL USE IN THE INTEGRATION TEST SUITE. + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function getInnerContentType() + { + return $this->innerContentType; + } + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getNames() + { + return $this->innerContentType->getNames(); + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + return $this->innerContentType->getName( $languageCode ); + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getDescriptions() + { + return $this->innerContentType->getDescriptions(); + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + return $this->innerContentType->getDescription( $languageCode ); + } + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function getContentTypeGroups() + { + return $this->innerContentType->getContentTypeGroups(); + } + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public function getFieldDefinitions() + { + return $this->innerContentType->getFieldDefinitions(); + } + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinition( $fieldDefinitionIdentifier ) + { + return $this->innerContentType->getFieldDefinition( $fieldDefinitionIdentifier ); + } + + public function __get( $propertyName ) + { + return $this->innerContentType->$propertyName; + } + + public function __set( $propertyName, $propertyValue ) + { + $this->innerContentType->$propertyName = $propertyValue; + } + + public function __isset( $propertyName ) + { + return isset( $this->innerContentType->$propertyName ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeGroupStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeGroupStub.php new file mode 100644 index 0000000..dd82e99 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeGroupStub.php @@ -0,0 +1,83 @@ + $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * 5.x only + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * 5.x only + * This method returns the name of the content type in the given language + * @param string $languageCode + * + * @return string the name for the given language or null if none existis. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * 5.x only + * This method returns the human readable description of the content type + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * 5.x only + * This method returns the name of the content type in the given language + * @param string $languageCode + * + * @return string the description for the given language or null if none existis. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeStub.php new file mode 100644 index 0000000..8afe632 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/ContentTypeStub.php @@ -0,0 +1,308 @@ +. + * An OR condition can be used : + * + * In this example, field_def will be used if available. If not, other_field_def will be used for content name generation + * + * @var string + */ + // protected $nameSchema; + // parent:: + + /** + * Determines if the type is a container + * + * @var boolean + */ + // parent:: + // protected $isContainer; + + /** + * Main language + * + * @var mixed + */ + // parent:: + // protected $mainLanguageCode; + + /** + * If an instance of a content type is created the always available flag is set + * by default this this value. + * + * @var boolean + */ + // parent:: + // protected $defaultAlwaysAvailable = true; + + /** + * Specifies which property the child locations should be sorted on by default when created + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + // parent:: + // protected $defaultSortField; + + /** + * Specifies whether the sort order should be ascending or descending by default when created + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + // parent:: + // protected $defaultSortOrder; + + /** + * Contains the content type groups this content type is assigned to + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + protected $contentTypeGroups; + + /** + * Contains the content type field definitions from this type + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + protected $fieldDefinitions; + + /** + * Field definitions indexed by identifier + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + private $fieldDefinitionsByIdentifier; + + function __construct( array $data = array() ) + { + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + foreach ( $this->fieldDefinitions as $fieldDefinition ) + { + $this->fieldDefinitionsByIdentifier[$fieldDefinition->identifier] = $fieldDefinition; + } + } + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function getContentTypeGroups() + { + return $this->contentTypeGroups; + } + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public function getFieldDefinitions() + { + return $this->fieldDefinitions; + } + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinition( $fieldDefinitionIdentifier ) + { + return $this->fieldDefinitionsByIdentifier[$fieldDefinitionIdentifier]; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/FieldDefinitionStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/FieldDefinitionStub.php new file mode 100644 index 0000000..6ecd5bc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ContentType/FieldDefinitionStub.php @@ -0,0 +1,224 @@ + $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * This method returns the human readable name of this field in all provided languages + * of the content type + * + * The structure of the return value is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the field + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } + + /** + * This method returns the validator configuration of this field definition supported by the field type + * + * @return mixed + */ + public function getValidatorConfiguration() + { + return $this->validatorConfiguration; + } + + /** + * This method returns settings for the field definition supported by the field type + * + * @return mixed + */ + public function getFieldSettings() + { + return $this->fieldSettings; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ObjectState/ObjectStateGroupStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ObjectState/ObjectStateGroupStub.php new file mode 100644 index 0000000..a78e176 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ObjectState/ObjectStateGroupStub.php @@ -0,0 +1,93 @@ + + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/ObjectState/ObjectStateStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/ObjectState/ObjectStateStub.php new file mode 100644 index 0000000..08f1185 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/ObjectState/ObjectStateStub.php @@ -0,0 +1,128 @@ + + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } + + /** + * The object state group this object state belongs to + * + * @return \eZ\Publish\API\Repository\Values\Content\ObjectStateGroup + */ + public function getObjectStateGroup() + { + return $this->stateGroup; + } + + /** + * Sets the priority. + * + * ONLY FOR INTERNAL USE IN THE INTEGRATION TEST SUITE. + * + * @access private + * + * @internal + * + * @param int $priority + * + * @return void + */ + public function setPriority( $priority ) + { + $this->priority = $priority; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyCreateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyCreateStructStub.php new file mode 100644 index 0000000..da84e20 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyCreateStructStub.php @@ -0,0 +1,65 @@ + $module, + 'function' => $function + ) + ); + } + + /** + * Returns list of limitations added to policy + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } + + /** + * Adds a limitation with the given identifier and list of values + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + * @return void + */ + public function addLimitation( Limitation $limitation ) + { + $this->limitations[] = $limitation; + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyStub.php new file mode 100644 index 0000000..f1bbf6a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyStub.php @@ -0,0 +1,34 @@ +limitations; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyUpdateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyUpdateStructStub.php new file mode 100644 index 0000000..57b745e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/PolicyUpdateStructStub.php @@ -0,0 +1,51 @@ +limitations; + } + + /** + * Adds a limitation to the policy - if a Limitation exists with the same identifier + * the existing limitation is replaced + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + * + * @return void + */ + public function addLimitation( Limitation $limitation ) + { + $this->limitations[] = $limitation; + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/RoleCreateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/RoleCreateStructStub.php new file mode 100644 index 0000000..e7c65d6 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/RoleCreateStructStub.php @@ -0,0 +1,57 @@ + $name ) ); + } + + /** + * Returns policies associated with the role + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct[] + */ + public function getPolicies() + { + return $this->policies; + } + + /** + * Adds a policy to this role + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreateStruct + */ + public function addPolicy( PolicyCreateStruct $policyCreateStruct ) + { + $this->policies[] = $policyCreateStruct; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/RoleStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/RoleStub.php new file mode 100644 index 0000000..2ea6974 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/RoleStub.php @@ -0,0 +1,48 @@ +policies = $policies; + } + + /** + * Returns the list of policies of this role + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function getPolicies() + { + return $this->policies; + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserCreateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserCreateStructStub.php new file mode 100644 index 0000000..dfca149 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserCreateStructStub.php @@ -0,0 +1,57 @@ +contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable ) + { + $language = $this->mainLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupCreateStructStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupCreateStructStub.php new file mode 100644 index 0000000..83d0486 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupCreateStructStub.php @@ -0,0 +1,58 @@ +contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable ) + { + $language = $this->mainLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupRoleAssignmentStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupRoleAssignmentStub.php new file mode 100644 index 0000000..d2b7608 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupRoleAssignmentStub.php @@ -0,0 +1,66 @@ +limitation; + } + + /** + * Returns the role to which the user or user group is assigned to + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Returns the user group to which the role is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + function getUserGroup() + { + return $this->userGroup; + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupStub.php new file mode 100644 index 0000000..177c2e9 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserGroupStub.php @@ -0,0 +1,100 @@ +content->getVersionInfo(); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + return $this->content->getFieldValue( $fieldDefIdentifier, $languageCode ); + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public function getFields() + { + return $this->content->getFields(); + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] With field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + return $this->content->getFieldsByLanguage( $languageCode ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->content->contentInfo; + + case 'contentType': + return $this->content->contentType; + + case 'id': + return $this->content->id; + + case 'versionInfo': + return $this->getVersionInfo(); + + case 'fields': + return $this->getFields(); + } + + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserRoleAssignmentStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserRoleAssignmentStub.php new file mode 100644 index 0000000..f2be3d1 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserRoleAssignmentStub.php @@ -0,0 +1,66 @@ +limitation; + } + + /** + * Returns the role to which the user or user group is assigned to + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Returns the user to which the role is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + function getUser() + { + return $this->user; + } + +} diff --git a/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserStub.php b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserStub.php new file mode 100644 index 0000000..4d13c80 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Stubs/Values/User/UserStub.php @@ -0,0 +1,100 @@ +content->getVersionInfo(); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + return $this->content->getFieldValue( $fieldDefIdentifier, $languageCode ); + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public function getFields() + { + return $this->content->getFields(); + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] With field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + return $this->content->getFieldsByLanguage( $languageCode ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->content->contentInfo; + + case 'contentType': + return $this->content->contentType; + + case 'id': + return $this->content->id; + + case 'versionInfo': + return $this->getVersionInfo(); + + case 'fields': + return $this->getFields(); + } + + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php new file mode 100644 index 0000000..cc2c45c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php @@ -0,0 +1,202 @@ +getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $trashItem = $this->createTrashItem(); + + // Load user service + $userService = $repository->getUserService(); + + // Set "Anonymous" as current user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an "UnauthorizedException" + $trashService->loadTrashItem( $trashItem->id ); + /* END: Use Case */ + } + + /** + * Test for the trash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::trash() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadAnonymousUser + */ + public function testTrashThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + // remoteId of the "Media" page main location + $mediaRemoteId = '75c715a51699d2d309a924eca6a95145'; + + $userService = $repository->getUserService(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + // Load "Media" page location + $mediaLocation = $locationService->loadLocationByRemoteId( + $mediaRemoteId + ); + + // Set "Anonymous" as current user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an "UnauthorizedException" + $trashService->trash( $mediaLocation ); + /* END: Inline */ + } + + /** + * Test for the recover() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::recover() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testRecover + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadAnonymousUser + */ + public function testRecoverThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $trashItem = $this->createTrashItem(); + + // Load user service + $userService = $repository->getUserService(); + + // Set "Anonymous" as current user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an "UnauthorizedException" + $trashService->recover( $trashItem ); + /* END: Use Case */ + } + + /** + * Test for the recover() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::recover($trashItem, $newParentLocation) + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testRecover + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadAnonymousUser + */ + public function testRecoverThrowsUnauthorizedExceptionWithNewParentLocationParameter() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + $homeLocationId = $this->generateId( 'location', 2 ); + /* BEGIN: Use Case */ + // $homeLocationId is the ID of the "Home" location in an eZ Publish + // demo installation + + $trashItem = $this->createTrashItem(); + + // Get the new parent location + $newParentLocation = $locationService->loadLocation( $homeLocationId ); + + // Load user service + $userService = $repository->getUserService(); + + // Set "Anonymous" as current user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an "UnauthorizedException" + $trashService->recover( $trashItem, $newParentLocation ); + /* END: Use Case */ + } + + /** + * Test for the emptyTrash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::emptyTrash() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testEmptyTrash + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadAnonymousUser + */ + public function testEmptyTrashThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $this->createTrashItem(); + + // Load user service + $userService = $repository->getUserService(); + + // Set "Anonymous" as current user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an "UnauthorizedException" + $trashService->emptyTrash(); + /* END: Use Case */ + } + + /** + * Test for the deleteTrashItem() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::deleteTrashItem() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testDeleteTrashItem + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadAnonymousUser + */ + public function testDeleteTrashItemThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $trashItem = $this->createTrashItem(); + + // Load user service + $userService = $repository->getUserService(); + + // Set "Anonymous" as current user + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an "UnauthorizedException" + $trashService->deleteTrashItem( $trashItem ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/TrashServiceTest.php b/eZ/Publish/API/Repository/Tests/TrashServiceTest.php new file mode 100644 index 0000000..bd6ab18 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/TrashServiceTest.php @@ -0,0 +1,552 @@ +createTrashItem(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\TrashItem', + $trashItem + ); + } + + /** + * Test for the trash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::trash() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testTrashSetsExpectedTrashItemProperties() + { + $repository = $this->getRepository(); + + $mediaRemoteId = '75c715a51699d2d309a924eca6a95145'; + + // Load the location that will be trashed + $location = $repository->getLocationService() + ->loadLocationByRemoteId( $mediaRemoteId ); + + $expected = array( + 'id' => $location->id, + 'depth' => $location->depth, + 'hidden' => $location->hidden, + 'invisible' => $location->invisible, + 'parentLocationId' => $location->parentLocationId, + 'pathString' => $location->pathString, + 'priority' => $location->priority, + 'remoteId' => $location->remoteId, + 'sortField' => $location->sortField, + 'sortOrder' => $location->sortOrder, + ); + + $trashItem = $this->createTrashItem(); + + $this->assertPropertiesCorrect( $expected, $trashItem ); + } + + /** + * Test for the trash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::trash() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testTrashRemovesLocationFromMainStorage() + { + $repository = $this->getRepository(); + + $mediaRemoteId = '75c715a51699d2d309a924eca6a95145'; + + /* BEGIN: Use Case */ + $this->createTrashItem(); + + // Load the location service + $locationService = $repository->getLocationService(); + + // This call will fail with a "NotFoundException", because the media + // location was marked as trashed in the main storage + $locationService->loadLocationByRemoteId( $mediaRemoteId ); + /* END: Use Case */ + } + + /** + * Test for the trash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::trash() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testTrashRemovesChildLocationsFromMainStorage() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $remoteIds = $this->createRemoteIdList(); + + $this->createTrashItem(); + + // All invocations to loadLocationByRemoteId() to one of the above + // collected remoteIds will return in an "NotFoundException" + /* END: Use Case */ + + $locationService = $repository->getLocationService(); + foreach ( $remoteIds as $remoteId ) + { + try + { + $locationService->loadLocationByRemoteId( $remoteId ); + $this->fail( "Location '{$remoteId}' should exist.'" ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + // echo $e->getFile(), ' +', $e->getLine(), PHP_EOL; + } + } + + $this->assertGreaterThan( + 0, + count( $remoteIds ), + "There should be at least one 'Community' child location." + ); + } + + /** + * Test for the trash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::trash() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testTrashDecrementsChildCountOnParentLocation() + { + $repository = $this->getRepository(); + $locationService = $repository->getLocationService(); + + $baseLocationId = $this->generateId( 'location', 1 ); + + $location = $locationService->loadLocation( $baseLocationId ); + + $childCount = $locationService->getLocationChildCount( $location ); + + $this->createTrashItem(); + + $this->assertEquals( + $childCount - 1, + $locationService->getLocationChildCount( $location ) + ); + } + + /** + * Test for the loadTrashItem() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::loadTrashItem() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testLoadTrashItem() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $trashItem = $this->createTrashItem(); + + // Reload the trash item + $trashItemReloaded = $trashService->loadTrashItem( $trashItem->id ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\TrashItem', + $trashItemReloaded + ); + + $this->assertEquals( + $trashItem->pathString, + $trashItemReloaded->pathString + ); + } + + /** + * Test for the loadTrashItem() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::loadTrashItem() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testLoadTrashItem + */ + public function testLoadTrashItemThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingTrashId = $this->generateId( 'trash', 2342 ); + /* BEGIN: Use Case */ + $trashService = $repository->getTrashService(); + + // This call will fail with a "NotFoundException", because no trash item + // with the ID 1342 should exist in an eZ Publish demo installation + $trashService->loadTrashItem( $nonExistingTrashId ); + /* END: Use Case */ + } + + /** + * Test for the recover() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::recover() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testRecover() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + $mediaRemoteId = '75c715a51699d2d309a924eca6a95145'; + + /* BEGIN: Use Case */ + $trashItem = $this->createTrashItem(); + + // Recover the trashed item + $location = $trashService->recover( $trashItem ); + + // Load the recovered location + $locationReloaded = $locationService->loadLocationByRemoteId( + $mediaRemoteId + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\Location', + $location + ); + + $this->assertEquals( + $location->pathString, + $locationReloaded->pathString + ); + } + + /** + * Test for the recover() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::recover() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testRecover + */ + public function testRecoverDoesNotRestoreChildLocations() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + $remoteIds = $this->createRemoteIdList(); + + // Unset remote ID of actually restored location + unset( $remoteIds[array_search( '3f6d92f8044aed134f32153517850f5a', $remoteIds )] ); + + $trashItem = $this->createTrashItem(); + + $trashService->recover( $trashItem ); + + $this->assertGreaterThan( + 0, + count( $remoteIds ), + "There should be at least one 'Community' child location." + ); + + // None of the child locations will be available again + foreach ( $remoteIds as $remoteId ) + { + try + { + $locationService->loadLocationByRemoteId( $remoteId ); + $this->fail( + sprintf( + 'Location with remote ID "%s" unexpectedly restored.', + $remoteId + ) + ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + // All well + } + } + } + + /** + * Test for the recover() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::recover($trashItem, $newParentLocation) + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testRecover + * @todo Fix naming + */ + public function testRecoverWithLocationCreateStructParameter() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + $homeLocationId = $this->generateId( 'location', 2 ); + /* BEGIN: Use Case */ + // $homeLocationId is the ID of the "Home" location in an eZ Publish + // demo installation + + $trashItem = $this->createTrashItem(); + + // Get the new parent location + $newParentLocation = $locationService->loadLocation( $homeLocationId ); + + // Recover location with new location + $location = $trashService->recover( $trashItem, $newParentLocation ); + /* END: Use Case */ + + $this->assertPropertiesCorrect( + array( + 'remoteId' => $trashItem->remoteId, + 'parentLocationId' => $homeLocationId, + // Not the full sub tree is restored + 'depth' => $newParentLocation->depth + 1, + 'hidden' => false, + 'invisible' => $trashItem->invisible, + 'pathString' => $newParentLocation->pathString . $this->parseId( 'location', $location->id ) . "/", + 'priority' => 0, + 'sortField' => Location::SORT_FIELD_NAME, + 'sortOrder' => Location::SORT_ORDER_ASC, + ), + $location + ); + } + + /** + * Test for the recover() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::recover($trashItem, $newParentLocation) + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testRecoverWithLocationCreateStructParameter + */ + public function testRecoverWithLocationCreateStructParameterIncrementsChildCountOnNewParent() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + $homeLocationId = $this->generateId( 'location', 2 ); + + $location = $locationService->loadLocation( $homeLocationId ); + + $childCount = $locationService->getLocationChildCount( $location ); + + /* BEGIN: Use Case */ + // $homeLocationId is the ID of the "Home" location in an eZ Publish + // demo installation + + $trashItem = $this->createTrashItem(); + + // Get the new parent location + $newParentLocation = $locationService->loadLocation( $homeLocationId ); + + // Recover location with new location + $trashService->recover( $trashItem, $newParentLocation ); + /* END: Use Case */ + + $this->assertEquals( + $childCount + 1, + $locationService->getLocationChildCount( $location ) + ); + } + + /** + * Test for the findTrashItems() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::findTrashItems() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testTrash + */ + public function testFindTrashItems() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $this->createTrashItem(); + + // Create a search query for all trashed items + $query = new Query(); + $query->criterion = new Criterion\LogicalAnd( + array( + new Criterion\Field( 'title', Criterion\Operator::LIKE, '*' ) + ) + ); + + // Load all trashed locations + $searchResult = $trashService->findTrashItems( $query ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\Content\SearchResult', + $searchResult + ); + + // 4 trashed locations from the sub tree + $this->assertEquals( 4, $searchResult->count ); + } + + /** + * Test for the emptyTrash() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::emptyTrash() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testFindTrashItems + */ + public function testEmptyTrash() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + + /* BEGIN: Use Case */ + $this->createTrashItem(); + + // Empty the trash + $trashService->emptyTrash(); + + // Create a search query for all trashed items + $query = new Query(); + $query->criterion = new Criterion\LogicalAnd( + array( + new Criterion\Field( 'title', Criterion\Operator::LIKE, '*' ) + ) + ); + + // Load all trashed locations, search result should be empty + $searchResult = $trashService->findTrashItems( $query ); + /* END: Use Case */ + + $this->assertEquals( 0, $searchResult->count ); + } + + /** + * Test for the deleteTrashItem() method. + * + * @return void + * @see \eZ\Publish\API\Repository\TrashService::deleteTrashItem() + * @depends eZ\Publish\API\Repository\Tests\TrashServiceTest::testFindTrashItems + */ + public function testDeleteTrashItem() + { + $repository = $this->getRepository(); + $trashService = $repository->getTrashService(); + $locationService = $repository->getLocationService(); + + $demoDesignLocationId = $this->generateId( 'location', 56 ); + /* BEGIN: Use Case */ + // $demoDesignLocationId is the ID of the "Demo Design" location in an eZ + // Publish demo installation + + $trashItem = $this->createTrashItem(); + + // Trash one more location + $trashService->trash( + $locationService->loadLocation( $demoDesignLocationId ) + ); + + // Empty the trash + $trashService->deleteTrashItem( $trashItem ); + + // Create a search query for all trashed items + $query = new Query(); + $query->criterion = new Criterion\LogicalAnd( + array( + new Criterion\Field( 'title', Criterion\Operator::LIKE, '*' ) + ) + ); + + // Load all trashed locations, should only contain the Demo Design location + $searchResult = $trashService->findTrashItems( $query ); + /* END: Use Case */ + + $foundIds = array_map( + function ( $trashItem ) + { + return $trashItem->id; + }, + $searchResult->items + ); + + $this->assertEquals( 4, $searchResult->count ); + $this->assertTrue( + array_search( $demoDesignLocationId, $foundIds ) !== false + ); + } + + /** + * Returns an array with the remoteIds of all child locations of the + * Community location. It is stored in a local variable named + * $remoteIds. + * + * @return string[] + */ + private function createRemoteIdList() + { + $repository = $this->getRepository(); + + /* BEGIN: Inline */ + // remoteId of the "Community" location in an eZ Publish demo installation + $mediaRemoteId = '75c715a51699d2d309a924eca6a95145'; + + // Load the location service + $locationService = $repository->getLocationService(); + + $remoteIds = array(); + foreach ( + $locationService->loadLocationChildren( + $locationService->loadLocationByRemoteId( $mediaRemoteId ) + )->locations as $child + ) + { + $remoteIds[] = $child->remoteId; + foreach ( $locationService->loadLocationChildren( $child )->locations as $grandChild ) + { + $remoteIds[] = $grandChild->remoteId; + } + } + /* END: Inline */ + + return $remoteIds; + } +} diff --git a/eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php b/eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php new file mode 100644 index 0000000..7ac3269 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php @@ -0,0 +1,892 @@ +LocationService::loadLocation() + * at least returns an object, because this method is utilized in several + * tests. + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + try + { + // Load the LocationService + $locationService = $this->getRepository()->getLocationService(); + + $membersUserGroupLocationId = 12; + + // Load a location instance + $location = $locationService->loadLocation( + $membersUserGroupLocationId + ); + + if ( false === is_object( $location ) ) + { + $this->markTestSkipped( + 'This test cannot be executed, because the utilized ' . + 'LocationService::loadLocation() does not ' . + 'return an object.' + ); + } + } + catch ( \Exception $e ) + { + $this->markTestSkipped( + 'This test cannot be executed, because the utilized ' . + 'LocationService::loadLocation() failed with ' . + PHP_EOL . PHP_EOL . + $e->getTraceAsString() + ); + } + + } + /** + * Test for the createUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createUrlAlias() + * + */ + public function testCreateUrlAlias() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + + $locationService = $repository->getLocationService(); + $urlAliasService = $repository->getURLAliasService(); + + $location = $locationService->loadLocation( $locationId ); + + $createdUrlAlias = $urlAliasService->createUrlAlias( + $location, '/Home/My-New-Site', 'eng-US' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $createdUrlAlias + ); + return array( $createdUrlAlias, $location->id ); + } + + /** + * @param array $testData + * + * @depends testCreateUrlAlias + * + * @return void + */ + public function testCreateUrlAliasPropertyValues( array $testData ) + { + list( $createdUrlAlias, $locationId ) = $testData; + + $this->assertNotNull( $createdUrlAlias->id ); + + $this->assertPropertiesCorrect( + array( + 'type' => URLAlias::LOCATION, + 'destination' => $locationId, + 'path' => '/Home/My-New-Site', + 'languageCodes' => array( 'eng-US' ), + 'alwaysAvailable' => false, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => false, + ), + $createdUrlAlias + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createUrlAlias($location, $path, $languageCode, $forwarding) + * @depends testCreateUrlAliasPropertyValues + */ + public function testCreateUrlAliasWithForwarding() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + + $locationService = $repository->getLocationService(); + $urlAliasService = $repository->getURLAliasService(); + + $location = $locationService->loadLocation( $locationId ); + + $createdUrlAlias = $urlAliasService->createUrlAlias( + $location, '/Home/My-New-Site', 'eng-US', true + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $createdUrlAlias + ); + return array( $createdUrlAlias, $location->id ); + } + + /** + * @param array $testData + * + * @depends testCreateUrlAliasWithForwarding + * + * @return void + */ + public function testCreateUrlAliasPropertyValuesWithForwarding( array $testData ) + { + list( $createdUrlAlias, $locationId ) = $testData; + + $this->assertNotNull( $createdUrlAlias->id ); + + $this->assertPropertiesCorrect( + array( + 'type' => URLAlias::LOCATION, + 'destination' => $locationId, + 'path' => '/Home/My-New-Site', + 'languageCodes' => array( 'eng-US' ), + 'alwaysAvailable' => false, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => true, + ), + $createdUrlAlias + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createUrlAlias($location, $path, $languageCode, $forwarding, $alwaysAvailable) + * + */ + public function testCreateUrlAliasWithAlwaysAvailable() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + + $locationService = $repository->getLocationService(); + $urlAliasService = $repository->getURLAliasService(); + + $location = $locationService->loadLocation( $locationId ); + + $createdUrlAlias = $urlAliasService->createUrlAlias( + $location, '/Home/My-New-Site', 'eng-US', false, true + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $createdUrlAlias + ); + return array( $createdUrlAlias, $location->id ); + } + + /** + * @param array $testData + * + * @depends testCreateUrlAliasWithAlwaysAvailable + * + * @return void + */ + public function testCreateUrlAliasPropertyValuesWithAlwaysAvailable( array $testData ) + { + list( $createdUrlAlias, $locationId ) = $testData; + + $this->assertNotNull( $createdUrlAlias->id ); + + $this->assertPropertiesCorrect( + array( + 'type' => URLAlias::LOCATION, + 'destination' => $locationId, + 'path' => '/Home/My-New-Site', + 'languageCodes' => array( 'eng-US' ), + 'alwaysAvailable' => true, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => false, + ), + $createdUrlAlias + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createUrlAlias() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateUrlAliasThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 5 ); + + /* BEGIN: Use Case */ + // $locationId is the ID of an existing location + + $locationService = $repository->getLocationService(); + $urlAliasService = $repository->getURLAliasService(); + + $location = $locationService->loadLocation( $locationId ); + + // Throws InvalidArgumentException, since this path already exists for the + // language + $createdUrlAlias = $urlAliasService->createUrlAlias( + $location, '/Design/Plain-site', 'eng-US' + ); + /* END: Use Case */ + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createGlobalUrlAlias() + * + */ + public function testCreateGlobalUrlAlias() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + $createdUrlAlias = $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=eZ', '/Home/My-New-Site', 'eng-US' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $createdUrlAlias + ); + return $createdUrlAlias; + } + + /** + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias + * + * @depends testCreateGlobalUrlAlias + * + * @return void + */ + public function testCreateGlobalUrlAliasPropertyValues( URLAlias $createdUrlAlias ) + { + $this->assertNotNull( $createdUrlAlias->id ); + + $this->assertPropertiesCorrect( + array( + 'type' => URLAlias::RESOURCE, + 'destination' => 'content/search?SearchText=eZ', + 'path' => '/Home/My-New-Site', + 'languageCodes' => array( 'eng-US' ), + 'alwaysAvailable' => false, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => false, + ), + $createdUrlAlias + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createGlobalUrlAlias($resource, $path, $languageCode, $forward) + * + */ + public function testCreateGlobalUrlAliasWithForward() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + $createdUrlAlias = $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=eZ', '/Home/My-New-Site', 'eng-US', true + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $createdUrlAlias + ); + return $createdUrlAlias; + } + + /** + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias + * + * @depends testCreateGlobalUrlAliasWithForward + * + * @return void + */ + public function testCreateGlobalUrlAliasWithForwardPropertyValues( URLAlias $createdUrlAlias ) + { + $this->assertNotNull( $createdUrlAlias->id ); + + $this->assertPropertiesCorrect( + array( + 'type' => URLAlias::RESOURCE, + 'destination' => 'content/search?SearchText=eZ', + 'path' => '/Home/My-New-Site', + 'languageCodes' => array( 'eng-US' ), + 'alwaysAvailable' => false, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => true, + ), + $createdUrlAlias + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createGlobalUrlAlias($resource, $path, $languageCode, $forward, $alwaysAvailable) + * + */ + public function testCreateGlobalUrlAliasWithAlwaysAvailable() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + $createdUrlAlias = $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=eZ', '/Home/My-New-Site', 'eng-US', false, true + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $createdUrlAlias + ); + return $createdUrlAlias; + } + + /** + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias + * + * @depends testCreateGlobalUrlAliasWithAlwaysAvailable + * + * @return void + */ + public function testCreateGlobalUrlAliasWithAlwaysAvailablePropertyValues( URLAlias $createdUrlAlias ) + { + $this->assertNotNull( $createdUrlAlias->id ); + + $this->assertPropertiesCorrect( + array( + 'type' => URLAlias::RESOURCE, + 'destination' => 'content/search?SearchText=eZ', + 'path' => '/Home/My-New-Site', + 'languageCodes' => array( 'eng-US' ), + 'alwaysAvailable' => true, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => false, + ), + $createdUrlAlias + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::createGlobalUrlAlias() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateGlobalUrlAliasThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Throws InvalidArgumentException, since this path already exists for the + // language + $createdUrlAlias = $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=eZ', '/Design/Plain-site', 'eng-US' + ); + /* END: Use Case */ + } + + /** + * Test for the listLocationAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listLocationAliases() + * + */ + public function testListLocationAliases() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 12 ); + + /* BEGIN: Use Case */ + // $locationId contains the ID of an existing Location + $urlAliasService = $repository->getURLAliasService(); + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + + // Create a custom URL alias for $location + $urlAliasService->createUrlAlias( + $location, '/My/Great-new-Site', 'eng-US' + ); + + // $loadedAliases will contain an array of custom URLAlias objects + $loadedAliases = $urlAliasService->listLocationAliases( $location ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + + // Only 1 non-history alias + $this->assertEquals( 1, count( $loadedAliases ) ); + + return array( $loadedAliases, $location ); + } + + /** + * @param array $testData + * + * @depends testListLocationAliases + * + * @return void + */ + public function testListLocationAliasesLoadsCorrectly( array $testData ) + { + list( $loadedAliases, $location ) = $testData; + + foreach ( $loadedAliases as $loadedAlias ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $loadedAlias + ); + $this->assertEquals( + $location->id, + $loadedAlias->destination + ); + } + } + + /** + * Test for the listLocationAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listLocationAliases($location, $custom, $languageCode) + * + */ + public function testListLocationAliasesWithCustomFilter() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 12 ); + + /* BEGIN: Use Case */ + // $locationId contains the ID of an existing Location + $urlAliasService = $repository->getURLAliasService(); + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + + // Create a second URL alias for $location, this is a "custom" one + $urlAliasService->createUrlAlias( + $location, '/My/Great-new-Site', 'ger-DE' + ); + + // $loadedAliases will contain 1 aliases in eng-US only + $loadedAliases = $urlAliasService->listLocationAliases( + $location, false, 'eng-US' + ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + $this->assertEquals( 1, count( $loadedAliases ) ); + } + + /** + * Test for the listLocationAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listLocationAliases($location, $custom) + * + */ + public function testListLocationAliasesWithLanguageCodeFilter() + { + $repository = $this->getRepository(); + + $locationId = $this->generateId( 'location', 12 ); + + /* BEGIN: Use Case */ + // $locationId contains the ID of an existing Location + $urlAliasService = $repository->getURLAliasService(); + $locationService = $repository->getLocationService(); + + $location = $locationService->loadLocation( $locationId ); + // Create a custom URL alias for $location + $urlAliasService->createUrlAlias( + $location, '/My/Great-new-Site', 'eng-US' + ); + + // $loadedAliases will contain only 1 of 3 aliases (custom in eng-US) + $loadedAliases = $urlAliasService->listLocationAliases( + $location, true, 'eng-US' + ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + $this->assertEquals( 1, count( $loadedAliases ) ); + } + + /** + * Test for the listGlobalAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listGlobalAliases() + * + */ + public function testListGlobalAliases() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Create some global aliases + $this->createGlobalAliases(); + + // $loadedAliases will contain all 3 global aliases + $loadedAliases = $urlAliasService->listGlobalAliases(); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + $this->assertEquals( 3, count( $loadedAliases ) ); + } + + /** + * Creates 3 global aliases. + * + * @return void + */ + private function createGlobalAliases() + { + $repository = $this->getRepository(); + $urlAliasService = $repository->getURLAliasService(); + + /* BEGIN: Inline */ + $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=eZ', '/My/Special-Support', 'eng-US' + ); + $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=eZ', '/My/London-Office', 'eng-GB' + ); + $urlAliasService->createGlobalUrlAlias( + 'module:content/search?SearchText=Sindelfingen', '/My/Fancy-Site', 'eng-US' + ); + /* END: Inline */ + } + + /** + * Test for the listGlobalAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listGlobalAliases($languageCode) + * + */ + public function testListGlobalAliasesWithLanguageFilter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Create some global aliases + $this->createGlobalAliases(); + + // $loadedAliases will contain only 2 of 3 global aliases + $loadedAliases = $urlAliasService->listGlobalAliases( 'eng-US' ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + $this->assertEquals( 2, count( $loadedAliases ) ); + } + + /** + * Test for the listGlobalAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listGlobalAliases($languageCode, $offset) + * + */ + public function testListGlobalAliasesWithOffset() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Create some global aliases + $this->createGlobalAliases(); + + // $loadedAliases will contain only 2 of 3 global aliases + $loadedAliases = $urlAliasService->listGlobalAliases( null, 1 ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + $this->assertEquals( 2, count( $loadedAliases ) ); + } + + /** + * Test for the listGlobalAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::listGlobalAliases($languageCode, $offset, $limit) + * + */ + public function testListGlobalAliasesWithLimit() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Create some global aliases + $this->createGlobalAliases(); + + // $loadedAliases will contain only 1 of 3 global aliases + $loadedAliases = $urlAliasService->listGlobalAliases( null, 0, 1 ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedAliases + ); + $this->assertEquals( 1, count( $loadedAliases ) ); + } + + /** + * Test for the removeAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::removeAliases() + * + */ + public function testRemoveAliases() + { + $repository = $this->getRepository(); + + $locationService = $repository->getLocationService(); + $someLocation = $locationService->loadLocation( + $this->generateId( 'location', 12 ) + ); + + /* BEGIN: Use Case */ + // $someLocation contains a location with automatically generated + // aliases assigned + $urlAliasService = $repository->getURLAliasService(); + + $initialAliases = $urlAliasService->listLocationAliases( $someLocation ); + + // Creates a custom alias for $someLocation + $urlAliasService->createUrlAlias( + $someLocation, + '/my/fancy/url/alias/sindelfingen', + 'eng-US' + ); + + $customAliases = $urlAliasService->listLocationAliases( $someLocation ); + + // The custom alias just created will be removed + // the automatic aliases stay in tact + $urlAliasService->removeAliases( $customAliases ); + /* END: Use Case */ + + $this->assertEquals( + $initialAliases, + $urlAliasService->listLocationAliases( $someLocation ) + ); + } + + /** + * Test for the removeAliases() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::removeAliases() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testRemoveAliasesThrowsInvalidArgumentExceptionIfAutogeneratedAliasesAreToBeRemoved() + { + $repository = $this->getRepository(); + + $locationService = $repository->getLocationService(); + $someLocation = $locationService->loadLocation( + $this->generateId( 'location', 12 ) + ); + + /* BEGIN: Use Case */ + // $someLocation contains a location with automatically generated + // aliases assigned + $urlAliasService = $repository->getURLAliasService(); + + $autogeneratedAliases = $urlAliasService->listLocationAliases( $someLocation, false ); + + // Throws an InvalidArgumentException, since autogeneratedAliases + // cannot be removed with this method + $urlAliasService->removeAliases( $autogeneratedAliases ); + /* END: Use Case */ + } + + /** + * Test for the lookUp() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::lookUp() + * + */ + public function testLookUp() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + $loadedAlias = $urlAliasService->lookUp( '/Setup2' ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $loadedAlias + ); + return $loadedAlias; + } + + /** + * Test for the lookUp() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::lookUp($url, $languageCode) + * + */ + public function testLookUpWithLanguageFilter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Create aliases in multiple languages + $this->createGlobalAliases(); + + $loadedAlias = $urlAliasService->lookUp( '/My/Special-Support', 'eng-US' ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias', + $loadedAlias + ); + $this->assertEquals( + 'content/search?SearchText=eZ', + $loadedAlias->destination + ); + } + + /** + * Test for the lookUp() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::lookUp() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLookUpThrowsNotFoundException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Throws NotFoundException + $loadedAlias = $urlAliasService->lookUp( '/non-existent-url' ); + /* END: Use Case */ + } + + /** + * Test for the lookUp() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLAliasService::lookUp($url, $languageCode) + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLookUpThrowsNotFoundExceptionWithLanguageFilter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlAliasService = $repository->getURLAliasService(); + + // Throws NotFoundException + $loadedAlias = $urlAliasService->lookUp( '/Contact-Us', 'ger-DE' ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php new file mode 100644 index 0000000..a2ade7d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php @@ -0,0 +1,73 @@ +getRepository(); + + /* BEGIN: Use Case */ + + $userService = $repository->getUserService(); + $urlWildcardService = $repository->getURLWildcardService(); + + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // This call will fail with an UnauthorizedException + $urlWildcardService->create( '/articles/*', '/content/{1}' ); + /* END: Use Case */ + } + + /** + * Test for the remove() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::remove() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testRemove + */ + public function testRemoveThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcardId = $urlWildcardService->create( '/articles/*', '/content/{1}' )->id; + + $repository->setCurrentUser( $userService->loadAnonymousUser() ); + + // Load newly created url wildcard + $urlWildcard = $urlWildcardService->load( $urlWildcardId ); + + // This call will fail with an UnauthorizedException + $urlWildcardService->remove( $urlWildcard ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php b/eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php new file mode 100644 index 0000000..4eb394f --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php @@ -0,0 +1,507 @@ +getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcard = $urlWildcardService->create( '/articles/*', '/content/{1}' ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\URLWildcard', + $urlWildcard + ); + + return $urlWildcard; + } + + /** + * Test for the create() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $urlWildcard + * + * @return void + * + * @see \eZ\Publish\API\Repository\URLWildcardService::create() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testCreateSetsIdPropertyOnURLWildcard( URLWildcard $urlWildcard ) + { + $this->assertNotNull( $urlWildcard->id ); + } + + /** + * Test for the create() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $urlWildcard + * + * @return void + * + * @see \eZ\Publish\API\Repository\URLWildcardService::create() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testCreateSetsPropertiesOnURLWildcard( URLWildcard $urlWildcard ) + { + $this->assertPropertiesCorrect( + array( + 'sourceUrl' => '/articles/*', + 'destinationUrl' => '/content/{1}', + 'forward' => false + ), + $urlWildcard + ); + } + + /** + * Test for the create() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::create() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testCreateWithOptionalForwardParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcard = $urlWildcardService->create( '/articles/*', '/content/{1}', true ); + /* END: Use Case */ + + $this->assertPropertiesCorrect( + array( + 'sourceUrl' => '/articles/*', + 'destinationUrl' => '/content/{1}', + 'forward' => true + ), + $urlWildcard + ); + } + + /** + * Test for the create() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::create() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testCreateThrowsInvalidArgumentExceptionOnDuplicateSourceUrl() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcardService->create( '/articles/*', '/content/{1}', true ); + + // This call will fail with an InvalidArgumentException because the + // sourceUrl '/articles/*' already exists. + $urlWildcardService->create( '/articles/*', '/content/data/{1}' ); + /* END: Use Case */ + } + + /** + * Test for the create() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::create() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testCreateThrowsContentValidationExceptionWhenPatternsAndPlaceholdersNotMatch() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // This call will fail with a ContentValidationException because the + // number of patterns '*' does not match the number of {\d} placeholders + $urlWildcardService->create( '/articles/*', '/content/{1}/year{2}' ); + /* END: Use Case */ + } + + /** + * Test for the create() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::create() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testCreateThrowsContentValidationExceptionWhenPlaceholdersNotValidNumberSequence() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // This call will fail with a ContentValidationException because the + // number of patterns '*' does not match the number of {\d} placeholders + $urlWildcardService->create( '/articles/*/*/*', '/content/{1}/year/{2}/{4}' ); + /* END: Use Case */ + } + + /** + * Test for the load() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcard + * @see \eZ\Publish\API\Repository\URLWildcardService::load() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testLoad() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcardId = $urlWildcardService->create( '/articles/*', '/content/{1}', true )->id; + + // Load newly created url wildcard + $urlWildcard = $urlWildcardService->load( $urlWildcardId ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\URLWildcard', + $urlWildcard + ); + + return $urlWildcard; + } + + /** + * Test for the load() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $urlWildcard + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::load() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testLoad + */ + public function testLoadSetsPropertiesOnURLWildcard( URLWildcard $urlWildcard ) + { + $this->assertPropertiesCorrect( + array( + 'sourceUrl' => '/articles/*', + 'destinationUrl' => '/content/{1}', + 'forward' => true + ), + $urlWildcard + ); + } + + /** + * Test for the load() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $urlWildcard + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::load() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testLoad + */ + public function testLoadThrowsNotFoundException( URLWildcard $urlWildcard ) + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // This call will fail with a NotFoundException + $urlWildcardService->load( 42 ); + /* END: Use Case */ + } + + /** + * Test for the remove() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::remove() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testLoad + */ + public function testRemove() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcard = $urlWildcardService->create( '/articles/*', '/content/{1}', true ); + + // Store wildcard url for later reuse + $urlWildcardId = $urlWildcard->id; + + // Remove the newly created url wildcard + $urlWildcardService->remove( $urlWildcard ); + + // This call will fail with a NotFoundException + $urlWildcardService->load( $urlWildcardId ); + /* END: Use Case */ + } + + /** + * Test for the loadAll() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::loadAll() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testLoadAll() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create new url wildcards + $urlWildcardOne = $urlWildcardService->create( '/articles/*', '/content/{1}', true ); + $urlWildcardTwo = $urlWildcardService->create( '/news/*', '/content/{1}', true ); + + // Load all available url wildcards + $allUrlWildcards = $urlWildcardService->loadAll(); + /* END: Use Case */ + + $this->assertEquals( + array( + $urlWildcardOne, + $urlWildcardTwo + ), + $allUrlWildcards + ); + } + + /** + * Test for the loadAll() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::loadAll() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testLoadAll + */ + public function testLoadAllWithOffsetParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create new url wildcards + $urlWildcardOne = $urlWildcardService->create( '/articles/*', '/content/{1}', true ); + $urlWildcardTwo = $urlWildcardService->create( '/news/*', '/content/{1}', true ); + + // Load all available url wildcards + $allUrlWildcards = $urlWildcardService->loadAll( 1 ); + /* END: Use Case */ + + $this->assertEquals( array( $urlWildcardTwo ), $allUrlWildcards ); + } + + /** + * Test for the loadAll() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::loadAll() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testLoadAll + */ + public function testLoadAllWithOffsetAndLimitParameter() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create new url wildcards + $urlWildcardOne = $urlWildcardService->create( '/articles/*', '/content/{1}' ); + $urlWildcardTwo = $urlWildcardService->create( '/news/*', '/content/{1}' ); + + // Load all available url wildcards + $allUrlWildcards = $urlWildcardService->loadAll( 0, 1 ); + /* END: Use Case */ + + $this->assertEquals( array( $urlWildcardOne ), $allUrlWildcards ); + } + + /** + * Test for the loadAll() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::loadAll() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testLoadAll + */ + public function testLoadAllReturnsEmptyArrayByDefault() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Load all available url wildcards + $allUrlWildcards = $urlWildcardService->loadAll(); + /* END: Use Case */ + + $this->assertSame( array(), $allUrlWildcards ); + } + + /** + * Test for the translate() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult + * @see \eZ\Publish\API\Repository\URLWildcardService::translate() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testCreate + */ + public function testTranslate() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcardService->create( '/articles/*', '/content/{1}' ); + + // Translate a given url + $result = $urlWildcardService->translate( '/articles/2012/05/sindelfingen' ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\URLWildcardTranslationResult', + $result + ); + + return $result; + } + + /** + * Test for the translate() method. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult $result + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::translate() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testTranslate + */ + public function testTranslateSetsPropertiesOnTranslationResult( URLWildcardTranslationResult $result ) + { + $this->assertPropertiesCorrect( + array( + 'uri' => '/content/2012/05/sindelfingen', + 'forward' => false + ), + $result + ); + } + + /** + * Test for the translate() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::translate() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testTranslate + */ + public function testTranslateWithForwardSetToTrue() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create a new url wildcard + $urlWildcardService->create( '/articles/*/05/*', '/content/{2}/year/{1}', true ); + + // Translate a given url + $result = $urlWildcardService->translate( '/articles/2012/05/sindelfingen' ); + /* END: Use Case */ + + $this->assertPropertiesCorrect( + array( + 'uri' => '/content/sindelfingen/year/2012', + 'forward' => true + ), + $result + ); + } + + /** + * Test for the translate() method. + * + * @return void + * @see \eZ\Publish\API\Repository\URLWildcardService::translate() + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testTranslate + */ + public function testTranslateReturnsLongestMatchingWildcard() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // Create new url wildcards + $urlWildcardService->create( '/articles/*/05/*', '/content/{2}/year/{1}' ); + $urlWildcardService->create( '/articles/*/05/sindelfingen/*', '/content/{2}/bar/{1}' ); + + // Translate a given url + $result = $urlWildcardService->translate( '/articles/2012/05/sindelfingen/42' ); + /* END: Use Case */ + + $this->assertEquals( '/content/42/bar/2012', $result->uri ); + } + + /** + * Test for the translate() method. + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + * @see \eZ\Publish\API\Repository\URLWildcardService::translate() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\URLWildcardServiceTest::testTranslate + */ + public function testTranslateThrowsNotFoundExceptionWhenNotAliasOrWildcardMatches() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $urlWildcardService = $repository->getURLWildcardService(); + + // This call will fail with a NotFoundException because no wildcard or + // url alias matches against the given url. + $urlWildcardService->translate( '/sindelfingen' ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php b/eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php new file mode 100644 index 0000000..80a60da --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php @@ -0,0 +1,447 @@ +getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->createUserGroupVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->loadUserGroup( $userGroup->id ); + /* END: Use Case */ + } + + /** + * Test for the loadSubUserGroups() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadSubUserGroups() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadSubUserGroups + */ + public function testLoadSubUserGroupsThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->createUserGroupVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->loadSubUserGroups( $userGroup ); + /* END: Use Case */ + } + + /** + * Test for the createUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testCreateUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the parent group + $parentUserGroup = $userService->loadUserGroup( $editorsGroupId ); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // Instantiate a new group create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-GB' ); + $userGroupCreate->setField( 'name', 'Example Group' ); + + // This call will fail with an "UnauthorizedException" + $userService->createUserGroup( $userGroupCreate, $parentUserGroup ); + /* END: Use Case */ + } + + /** + * Test for the deleteUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::deleteUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testDeleteUserGroup + */ + public function testDeleteUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->createUserGroupVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->deleteUserGroup( $userGroup ); + /* END: Use Case */ + } + + /** + * Test for the moveUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::moveUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup + */ + public function testMoveUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $memberGroupId = $this->generateId( 'group', 11 ); + /* BEGIN: Use Case */ + // $memberGroupId is the ID of the "Members" group in an eZ Publish + // demo installation + // + $user = $this->createUserVersion1(); + + $userGroup = $this->createUserGroupVersion1(); + + // Load new parent user group + $newParentUserGroup = $userService->loadUserGroup( $memberGroupId ); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->moveUserGroup( $userGroup, $newParentUserGroup ); + /* END: Use Case */ + } + + /** + * Test for the updateUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup + */ + public function testUpdateUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->createUserGroupVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // Load content service + $contentService = $repository->getContentService(); + + // Instantiate a content update struct + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->setField( 'name', 'New group name' ); + + $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct(); + $userGroupUpdateStruct->contentUpdateStruct = $contentUpdateStruct; + + // This call will fail with an "UnauthorizedException" + $userService->updateUserGroup( $userGroup, $userGroupUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the createUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testCreateUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // Instantiate a user create struct + $userCreateStruct = $userService->newUserCreateStruct( + 'test', + 'test@example.com', + 'password', + 'eng-GB' + ); + + $userCreateStruct->setField( 'first_name', 'Christian' ); + $userCreateStruct->setField( 'last_name', 'Bacher' ); + + $parentUserGroup = $userService->loadUserGroup( $editorsGroupId ); + + // This call will fail with an "UnauthorizedException" + $userService->createUser( + $userCreateStruct, + array( $parentUserGroup ) + ); + /* END: Use Case */ + } + + /** + * Test for the deleteUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::deleteUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testDeleteUser + */ + public function testDeleteUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->deleteUser( $user ); + /* END: Use Case */ + } + + /** + * Test for the updateUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testUpdateUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // Instantiate a user update struct + $userUpdateStruct = $userService->newUserUpdateStruct(); + $userUpdateStruct->maxLogin = 42; + + // This call will fail with an "UnauthorizedException" + $userService->updateUser( $user, $userUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the assignUserToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup + */ + public function testAssignUserToUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $administratorGroupId = $this->generateId( 'group', 12 ); + /* BEGIN: Use Case */ + // $administratorGroupId is the ID of the "Administrator" group in an + // eZ Publish demo installation + + $user = $this->createUserVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->assignUserToUserGroup( + $user, + $userService->loadUserGroup( $administratorGroupId ) + ); + /* END: Use Case */ + } + + /** + * Test for the unAssignUssrFromUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup + */ + public function testUnAssignUserFromUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + $memberGroupId = $this->generateId( 'group', 11 ); + + /* BEGIN: Use Case */ + // $memberGroupId is the ID of the "Members" group in an eZ Publish + // demo installation + + $user = $this->createUserVersion1(); + + // Assign group to newly created user + $userService->assignUserToUserGroup( + $user, + $userService->loadUserGroup( $memberGroupId ) + ); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->unAssignUserFromUserGroup( + $user, + $userService->loadUserGroup( $editorsGroupId ) + ); + /* END: Use Case */ + } + + /** + * Test for the loadUserGroupsOfUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser + */ + public function testLoadUserGroupsOfUserThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->loadUserGroupsOfUser( $user ); + /* END: Use Case */ + } + + /** + * Test for the loadUsersOfUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUsersOfUserGroup + */ + public function testLoadUsersOfUserGroupThrowsUnauthorizedException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->createUserGroupVersion1(); + + // Now set the currently created "Editor" as current user + $repository->setCurrentUser( $user ); + + // This call will fail with an "UnauthorizedException" + $userService->loadUsersOfUserGroup( $userGroup ); + /* END: Use Case */ + } + + /** + * Create a user group fixture in a variable named $userGroup, + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + private function createUserGroupVersion1() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Inline */ + // $mainGroupId is the ID of the main "Users" group in an eZ Publish + // demo installation + + $userService = $repository->getUserService(); + + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', 'Example Group' ); + + // Create the new user group + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $parentUserGroup + ); + /* END: Inline */ + + return $userGroup; + } +} diff --git a/eZ/Publish/API/Repository/Tests/UserServiceTest.php b/eZ/Publish/API/Repository/Tests/UserServiceTest.php new file mode 100644 index 0000000..c859e77 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/UserServiceTest.php @@ -0,0 +1,1727 @@ +getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Use Case */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + $userGroup = $userService->loadUserGroup( $mainGroupId ); + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserGroup', $userGroup ); + } + + /** + * Test for the loadUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup + */ + public function testLoadUserGroupThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingGroupId = $this->generateId( 'group', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + // This call will fail with a NotFoundException + $userService->loadUserGroup( $nonExistingGroupId ); + /* END: Use Case */ + } + + /** + * Test for the loadSubUserGroups() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadSubUserGroups() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup + */ + public function testLoadSubUserGroups() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Use Case */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + $userGroup = $userService->loadUserGroup( $mainGroupId ); + + $subUserGroups = $userService->loadSubUserGroups( $userGroup ); + foreach ( $subUserGroups as $subUserGroup ) + { + // Do something with the $subUserGroup + } + /* END: Use Case */ + + $this->assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserGroup', $subUserGroup ); + } + + /** + * Test for the newUserGroupCreateStruct() method. + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testNewUserGroupCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + $groupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct', + $groupCreate + ); + + return $groupCreate; + } + + /** + * Test for the newUserGroupCreateStruct() method. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct + */ + public function testNewUserGroupCreateStructSetsMainLanguageCode( $groupCreate ) + { + $this->assertEquals( 'eng-US', $groupCreate->mainLanguageCode ); + } + + /** + * Test for the newUserGroupCreateStruct() method. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $groupCreate + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct + */ + public function testNewUserGroupCreateStructSetsContentType( $groupCreate ) + { + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\ContentType\ContentType', + $groupCreate->contentType + ); + } + + /** + * Test for the newUserGroupCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct($mainLanguageCode, $contentType) + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testNewUserGroupCreateStructWithSecondParameter() + { + if ( $this->isVersion4() ) + { + $this->markTestSkipped( 'This test is only relevant for eZ Publish versions > 4' ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $userService = $repository->getUserService(); + + // Load the default ContentType for user groups + $groupType = $contentTypeService->loadContentTypeByIdentifier( 'user_group' ); + + // Instantiate a new group create struct + $groupCreate = $userService->newUserGroupCreateStruct( + 'eng-US', + $groupType + ); + /* END: Use Case */ + + $this->assertSame( $groupType, $groupCreate->contentType ); + } + + /** + * Test for the createUserGroup() method. + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateUserGroup() + { + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroup', + $userGroup + ); + + $versionInfo = $userGroup->getVersionInfo(); + + $this->assertEquals( VersionInfo::STATUS_PUBLISHED, $versionInfo->status ); + $this->assertEquals( 1, $versionInfo->versionNo ); + + return $userGroup; + } + + /** + * Test for the createUserGroup() method. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testCreateUserGroupSetsExpectedProperties( $userGroup ) + { + $this->assertEquals( + array( + 'parentId' => $this->generateId( 'group', 4 ), + 'subGroupCount' => 0 + ), + array( + 'parentId' => $userGroup->parentId, + 'subGroupCount' => $userGroup->subGroupCount + ) + ); + } + + /** + * Test for the createUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testCreateUserGroupIncrementsParentSubGroupCount() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + $mainGroupId = $this->generateId( 'group', 4 ); + + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + $parentGroupCount = $parentUserGroup->subGroupCount; + + /* BEGIN: Use Case */ + $this->createUserGroupVersion1(); + + // This should be one greater than before + $subGroupCount = $userService->loadUserGroup( $mainGroupId )->subGroupCount; + /* END: Use Case */ + + $this->assertEquals( $parentGroupCount + 1, $subGroupCount ); + } + + /** + * Test for the createUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testCreateUserGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Use Case */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', 'Example Group' ); + $userGroupCreate->remoteId = '5f7f0bdb3381d6a461d8c29ff53d908f'; + + // This call will fail with an "InvalidArgumentException", because the + // specified remoteId is already used for the "Members" user group. + $userService->createUserGroup( + $userGroupCreate, + $parentUserGroup + ); + /* END: Use Case */ + } + + /** + * Test for the createUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testCreateUserGroupThrowsInvalidArgumentExceptionFieldTypeNotAccept() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Use Case */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', new \stdClass() ); + + // This call will fail with an "InvalidArgumentException", because the + // specified remoteId is already used for the "Members" user group. + $userService->createUserGroup( + $userGroupCreate, + $parentUserGroup + ); + /* END: Use Case */ + } + + /** + * Test for the createUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testCreateUserGroupThrowsContentValidationException() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Use Case */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + + // This call will fail with a "ContentValidationException", because the + // only mandatory field "name" is not set. + $userService->createUserGroup( $userGroupCreate, $parentUserGroup ); + /* END: Use Case */ + } + + /** + * Test for the createUserGroup() method. + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * @see \eZ\Publish\API\Repository\UserService::createUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupCreateStruct + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateUserGroupInTransactionWithRollback() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Use Case */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + $repository->beginTransaction(); + + try + { + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', 'Example Group' ); + + // Create the new user group + $createdUserGroupId = $userService->createUserGroup( + $userGroupCreate, + $parentUserGroup + )->id; + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + $repository->rollback(); + + try + { + // Throws exception since creation of user group was rolled back + $loadedGroup = $userService->loadUserGroup( $createdUserGroupId ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'User group object still exists after rollback.' ); + } + + /** + * Test for the deleteUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::deleteUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + */ + public function testDeleteUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Delete the currently created user group again + $userService->deleteUserGroup( $userGroup ); + /* END: Use Case */ + + // We use the NotFoundException here for verification + $userService->loadUserGroup( $userGroup->id ); + } + + /** + * Test for the moveUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::moveUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadSubUserGroups + */ + public function testMoveUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $membersGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $membersGroupId is the ID of the "Members" user group in an eZ + // Publish demo installation + + $userGroup = $this->createUserGroupVersion1(); + + // Load the new parent group + $membersUserGroup = $userService->loadUserGroup( $membersGroupId ); + + // Move user group from "Users" to "Members" + $userService->moveUserGroup( $userGroup, $membersUserGroup ); + + // Reload the user group to get an updated $parentId + $userGroup = $userService->loadUserGroup( $userGroup->id ); + + // The returned array will no contain $userGroup + $subUserGroups = $userService->loadSubUserGroups( + $membersUserGroup + ); + /* END: Use Case */ + + $subUserGroupIds = array_map( + function ( $content ) + { + return $content->id; + }, + $subUserGroups + ); + + $this->assertEquals( $membersGroupId, $userGroup->parentId ); + $this->assertEquals( array( $userGroup->id ), $subUserGroupIds ); + } + + /** + * Test for the moveUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::moveUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup + */ + public function testMoveUserGroupIncrementsSubGroupCountOnNewParent() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $membersGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $membersGroupId is the ID of the "Members" user group in an eZ + // Publish demo installation + + $userGroup = $this->createUserGroupVersion1(); + + // Load the new parent group + $membersUserGroup = $userService->loadUserGroup( $membersGroupId ); + + // Move user group from "Users" to "Members" + $userService->moveUserGroup( $userGroup, $membersUserGroup ); + + // Reload the user group to get an updated $subGroupCount + $membersUserGroupUpdated = $userService->loadUserGroup( $membersGroupId ); + /* END: Use Case */ + + $this->assertEquals( 1, $membersUserGroupUpdated->subGroupCount ); + } + + /** + * Test for the moveUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::moveUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testMoveUserGroup + */ + public function testMoveUserGroupDecrementsSubGroupCountOnOldParent() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $membersGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $membersGroupId is the ID of the "Members" user group in an eZ + // Publish demo installation + + $userGroup = $this->createUserGroupVersion1(); + + // Load the new parent group + $membersUserGroup = $userService->loadUserGroup( $membersGroupId ); + + // Move user group from "Users" to "Members" + $userService->moveUserGroup( $userGroup, $membersUserGroup ); + /* END: Use Case */ + + $mainUserGroup = $userService->loadUserGroup( $this->generateId( 'group', 4 ) ); + + $this->assertEquals( 5, $mainUserGroup->subGroupCount ); + } + + /** + * Test for the newUserGroupUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserGroupUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService + */ + public function testNewUserGroupUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + $groupUpdate = $userService->newUserGroupUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct', + $groupUpdate + ); + } + + /** + * Test for the updateUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserGroupUpdateStruct + */ + public function testUpdateUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Create a group update struct and change nothing + $groupUpdate = $userService->newUserGroupUpdateStruct(); + + // This update will do nothing + $userGroup = $userService->updateUserGroup( + $userGroup, + $groupUpdate + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroup', + $userGroup + ); + + $this->assertEquals( 1, $userGroup->getVersionInfo()->versionNo ); + } + + /** + * Test for the updateUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup + */ + public function testUpdateUserGroupWithSubContentUpdateStruct() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the content service + $contentService = $repository->getContentService(); + + // Create a content update struct and update the group name + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'Sindelfingen', 'eng-US' ); + + // Create a group update struct and set content update struct + $groupUpdate = $userService->newUserGroupUpdateStruct(); + $groupUpdate->contentUpdateStruct = $contentUpdate; + + // This will update the name and the increment the group version number + $userGroup = $userService->updateUserGroup( + $userGroup, + $groupUpdate + ); + /* END: Use Case */ + + $this->assertEquals( 'Sindelfingen', $userGroup->getFieldValue( 'name', 'eng-US' ) ); + + $versionInfo = $userGroup->getVersionInfo(); + + $this->assertEquals( VersionInfo::STATUS_PUBLISHED, $versionInfo->status ); + $this->assertEquals( 2, $versionInfo->versionNo ); + } + + /** + * Test for the updateUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup + */ + public function testUpdateUserGroupWithSubContentMetadataUpdateStruct() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the content service + $contentService = $repository->getContentService(); + + // Create a metadata update struct and change the remoteId + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->remoteId = '3c61299780663bafa3af2101e52125da'; + + // Create a group update struct and set content update struct + $groupUpdate = $userService->newUserGroupUpdateStruct(); + $groupUpdate->contentMetadataUpdateStruct = $metadataUpdate; + + // This will update the name and the increment the group version number + $userGroup = $userService->updateUserGroup( + $userGroup, + $groupUpdate + ); + /* END: Use Case */ + + $this->assertEquals( + '3c61299780663bafa3af2101e52125da', + $userGroup->contentInfo->remoteId + ); + + $versionInfo = $userGroup->getVersionInfo(); + + $this->assertEquals( VersionInfo::STATUS_PUBLISHED, $versionInfo->status ); + $this->assertEquals( 1, $versionInfo->versionNo ); + } + + /** + * Test for the updateUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUserGroup + */ + public function testUpdateUserGroupThrowsInvalidArgumentExceptionOnFieldTypeNotAccept() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $userGroup = $this->createUserGroupVersion1(); + + // Load the content service + $contentService = $repository->getContentService(); + + // Create a content update struct and update the group name + $contentUpdate = $contentService->newContentUpdateStruct(); + // An object of stdClass is not accepted as a value by the field "name" + $contentUpdate->setField( 'name', new \stdClass(), 'eng-US' ); + + // Create a group update struct and set content update struct + $groupUpdate = $userService->newUserGroupUpdateStruct(); + $groupUpdate->contentUpdateStruct = $contentUpdate; + + // This call will fail with an InvalidArgumentException, because the + // field "name" does not accept the given value + $userService->updateUserGroup( $userGroup, $groupUpdate ); + /* END: Use Case */ + } + + /** + * Test for the newUserCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService + */ + public function testNewUserCreateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserCreateStruct', + $userCreate + ); + + return $userCreate; + } + + /** + * Test for the newUserCreateStruct() method. + * + * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreate + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct + */ + public function testNewUserCreateStructSetsExpectedProperties( $userCreate ) + { + $this->assertEquals( + array( + 'login' => 'user', + 'email' => 'user@example.com', + 'password' => 'secret', + 'mainLanguageCode' => 'eng-US', + ), + array( + 'login' => $userCreate->login, + 'email' => $userCreate->email, + 'password' => $userCreate->password, + 'mainLanguageCode' => $userCreate->mainLanguageCode, + ) + ); + } + + /** + * Test for the newUserCreateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserCreateStruct($login, $email, $password, $mainLanguageCode, $contentType) + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentTypeServiceTest::testLoadContentTypeByIdentifier + */ + public function testNewUserCreateStructWithFifthParameter() + { + if ( $this->isVersion4() ) + { + $this->markTestSkipped( 'This test is only relevant for eZ Publish versions > 4' ); + } + + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $contentTypeService = $repository->getContentTypeService(); + $userService = $repository->getUserService(); + + $userType = $contentTypeService->loadContentTypeByIdentifier( 'user' ); + + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US', + $userType + ); + /* END: Use Case */ + + $this->assertSame( $userType, $userCreate->contentType ); + } + + /** + * Test for the createUser() method. + * + * @return \eZ\Publish\API\Repository\Values\User\User + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateUser() + { + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\User', + $user + ); + + return $user; + } + + /** + * Test for the createUser() method. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testCreateUserSetsExpectedProperties( User $user ) + { + $this->assertEquals( + array( + 'login' => 'user', + 'email' => 'user@example.com', + 'passwordHash' => $this->createHash( + 'user', + 'secret', + $user->hashAlgorithm + ), + 'mainLanguageCode' => 'eng-US' + ), + array( + 'login' => $user->login, + 'email' => $user->email, + 'passwordHash' => $user->passwordHash, + 'mainLanguageCode' => $user->contentInfo->mainLanguageCode + ) + ); + } + + /** + * Test for the createUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testCreateUserThrowsContentValidationExceptionForMissingField() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $editorsGroupId is the ID of the "Editors" user group in an eZ + // Publish demo installation + + $userService = $repository->getUserService(); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US' + ); + + // Do not set the mandatory fields "first_name" and "last_name" + //$userCreate->setField( 'first_name', 'Example' ); + //$userCreate->setField( 'last_name', 'User' ); + + // Load parent group for the user + $group = $userService->loadUserGroup( $editorsGroupId ); + + // This call will fail with a "ContentValidationException", because the + // mandatory fields "first_name" and "last_name" are not set. + $userService->createUser( $userCreate, array( $group ) ); + /* END: Use Case */ + } + + /** + * Test for the createUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testCreateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $editorsGroupId is the ID of the "Editors" user group in an eZ + // Publish demo installation + + $userService = $repository->getUserService(); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US' + ); + + // An object of stdClass is not a valid value for the field first_name + $userCreate->setField( 'first_name', new \stdClass() ); + $userCreate->setField( 'last_name', 'User' ); + + // Load parent group for the user + $group = $userService->loadUserGroup( $editorsGroupId ); + + // This call will fail with an "InvalidArgumentException", because the + // value for the firled "first_name" is not accepted by the field type. + $userService->createUser( $userCreate, array( $group ) ); + /* END: Use Case */ + } + + /** + * Test for the createUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testCreateUserThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + // $editorsGroupId is the ID of the "Editors" user group in an eZ + // Publish demo installation + + $userService = $repository->getUserService(); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + // admin is an existing login + 'admin', + 'user@example.com', + 'secret', + 'eng-US' + ); + + $userCreate->setField( 'first_name', 'Example' ); + $userCreate->setField( 'last_name', 'User' ); + + // Load parent group for the user + $group = $userService->loadUserGroup( $editorsGroupId ); + + // This call will fail with a "InvalidArgumentException", because the + // user with "admin" login already exists. + $userService->createUser( $userCreate, array( $group ) ); + /* END: Use Case */ + } + + /** + * Test for the createUser() method. + * + * @return \eZ\Publish\API\Repository\Values\User\User + * @see \eZ\Publish\API\Repository\UserService::createUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroup + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserCreateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testCreateContent + */ + public function testCreateUserInTransactionWithRollback() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $repository->beginTransaction(); + + try + { + $user = $this->createUserVersion1(); + } + catch ( \Exception $e ) + { + // Cleanup hanging transaction on error + $repository->rollback(); + throw $e; + } + + $repository->rollback(); + + try + { + // Throws exception since creation of user was rolled back + $loadedUser = $userService->loadUser( $user->id ); + } + catch ( \eZ\Publish\API\Repository\Exceptions\NotFoundException $e ) + { + return; + } + /* END: Use Case */ + + $this->fail( 'User object still exists after rollback.' ); + } + + /** + * Test for the loadUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadUser() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the newly created user + $userReloaded = $userService->loadUser( $user->id ); + /* END: Use Case */ + + $this->assertEquals( $user, $userReloaded ); + } + + /** + * Test for the loadUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser + */ + public function testLoadUserThrowsNotFoundException() + { + $repository = $this->getRepository(); + + $nonExistingUserId = $this->generateId( 'useer', PHP_INT_MAX ); + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + // This call will fail with a "NotFoundException", because no user with + // an id equal to PHP_INT_MAX should exist. + $userService->loadUser( $nonExistingUserId ); + /* END: Use Case */ + } + + /** + * Test for the loadAnonymousUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadAnonymousUser() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService + */ + public function testLoadAnonymousUser() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + // Load default anonymous user available in each eZ Publish installation + $anonymousUser = $userService->loadAnonymousUser(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\User', + $anonymousUser + ); + + $this->assertEquals( 'anonymous', $anonymousUser->login ); + } + + /** + * Test for the loadUserByCredentials() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadUserByCredentials() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Load the newly created user + $userReloaded = $userService->loadUserByCredentials( 'user', 'secret' ); + /* END: Use Case */ + + $this->assertEquals( $user, $userReloaded ); + } + + /** + * Test for the loadUserByCredentials() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials + */ + public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownPassword() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $this->createUserVersion1(); + + // This call will fail with a "NotFoundException", because the given + // login/password combination does not exist. + $userService->loadUserByCredentials( 'user', 'SeCrEt' ); + /* END: Use Case */ + } + + /** + * Test for the loadUserByCredentials() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUserByCredentials() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserByCredentials + */ + public function testLoadUserByCredentialsThrowsNotFoundExceptionForUnknownLogin() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $this->createUserVersion1(); + + // This call will fail with a "NotFoundException", because the given + // login/password combination does not exist. + $userService->loadUserByCredentials( 'USER', 'secret' ); + /* END: Use Case */ + } + + /** + * Test for the deleteUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::deleteUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUser + */ + public function testDeleteUser() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Delete the currently created user + $userService->deleteUser( $user ); + /* END: Use Case */ + + // We use the NotFoundException here to verify that the user not exists + $userService->loadUser( $user->id ); + } + + /** + * Test for the newUserUpdateStruct() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::newUserUpdateStruct() + * @depends eZ\Publish\API\Repository\Tests\RepositoryTest::testGetUserService + */ + public function testNewUserUpdateStruct() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $userService = $repository->getUserService(); + + // Create a new update struct instance + $userUpdate = $userService->newUserUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserUpdateStruct', + $userUpdate + ); + } + + /** + * Test for the updateUser() method. + * + * @return \eZ\Publish\API\Repository\Values\User\User + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testNewUserUpdateStruct + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContent + * @depends eZ\Publish\API\Repository\Tests\ContentServiceTest::testUpdateContentMetadata + */ + public function testUpdateUser() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Create a new update struct instance + $userUpdate = $userService->newUserUpdateStruct(); + + // Set new values for password and maxLogin + $userUpdate->password = 'my-new-password'; + $userUpdate->maxLogin = 42; + $userUpdate->enabled = false; + + // Updated the user record. + $userVersion2 = $userService->updateUser( $user, $userUpdate ); + /* END: Use Case */ + + $this->assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\User', + $user + ); + + return $userVersion2; + } + + /** + * Test for the updateUser() method. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser + */ + public function testUpdateUserUpdatesExpectedProperties( User $user ) + { + $this->assertEquals( + array( + 'login' => 'user', + 'email' => 'user@example.com', + 'passwordHash' => $this->createHash( + 'user', + 'my-new-password', + $user->hashAlgorithm + ), + 'maxLogin' => 42, + 'enabled' => false + ), + array( + 'login' => $user->login, + 'email' => $user->email, + 'passwordHash' => $user->passwordHash, + 'maxLogin' => $user->maxLogin, + 'enabled' => $user->enabled + ) + ); + } + + /** + * Test for the updateUser() method. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser + */ + public function testUpdateUserReturnsPublishedVersion( $user ) + { + $this->assertEquals( + VersionInfo::STATUS_PUBLISHED, + $user->getVersionInfo()->status + ); + } + + /** + * Test for the updateUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser + */ + public function testUpdateUserWithContentMetadataUpdateStruct() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Get the ContentService implementation + $contentService = $repository->getContentService(); + + // Create a metadata update struct and change the remote id. + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->remoteId = '85e10037d1ac0a00aa75443ced483e08'; + + // Create a new update struct instance + $userUpdate = $userService->newUserUpdateStruct(); + + // Set the metadata update struct. + $userUpdate->contentMetadataUpdateStruct = $metadataUpdate; + + // Updated the user record. + $userVersion2 = $userService->updateUser( $user, $userUpdate ); + + // The contentInfo->remoteId will be changed now. + $remoteId = $userVersion2->contentInfo->remoteId; + /* END: Use Case */ + + $this->assertEquals( '85e10037d1ac0a00aa75443ced483e08', $remoteId ); + } + + /** + * Test for the updateUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser + */ + public function testUpdateUserWithContentUpdateStruct() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Get the ContentService implementation + $contentService = $repository->getContentService(); + + // Create a content update struct and change the remote id. + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'first_name', 'Hello', 'eng-US' ); + $contentUpdate->setField( 'last_name', 'World', 'eng-US' ); + + // Create a new update struct instance + $userUpdate = $userService->newUserUpdateStruct(); + + // Set the content update struct. + $userUpdate->contentUpdateStruct = $contentUpdate; + + // Updated the user record. + $userVersion2 = $userService->updateUser( $user, $userUpdate ); + + $name = sprintf( + '%s %s', + $userVersion2->getFieldValue( 'first_name' ), + $userVersion2->getFieldValue( 'last_name' ) + ); + /* END: Use Case */ + + $this->assertEquals( 'Hello World', $name ); + } + + /** + * Test for the updateUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser + */ + public function testUpdateUserThrowsContentValidationException() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Get the ContentService implementation + $contentService = $repository->getContentService(); + + // Create a content update struct and change the remote id. + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'first_name', null, 'eng-US' ); + + // Create a new update struct instance + $userUpdate = $userService->newUserUpdateStruct(); + + // Set the content update struct. + $userUpdate->contentUpdateStruct = $contentUpdate; + + // This call will fail with a "ContentValidationException" because the + // mandatory field "first_name" is set to an empty value. + $userService->updateUser( $user, $userUpdate ); + + /* END: Use Case */ + } + + /** + * Test for the updateUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::updateUser() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUpdateUser + */ + public function testUpdateUserThrowsInvalidArgumentExceptionOnFieldTypeNotAccept() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // Get the ContentService implementation + $contentService = $repository->getContentService(); + + $contentUpdate = $contentService->newContentUpdateStruct(); + // An object of stdClass is not valid for the field first_name + $contentUpdate->setField( 'first_name', new \stdClass(), 'eng-US' ); + + // Create a new update struct instance + $userUpdate = $userService->newUserUpdateStruct(); + + // Set the content update struct. + $userUpdate->contentUpdateStruct = $contentUpdate; + + // This call will fail with a "InvalidArgumentException" because the + // the field "first_name" does not accept the given value. + $userService->updateUser( $user, $userUpdate ); + + /* END: Use Case */ + } + + /** + * Test for the loadUserGroupsOfUser() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadUserGroupsOfUser() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + // This array will contain the "Editors" user group name + $userGroupNames = array(); + foreach ( $userService->loadUserGroupsOfUser( $user ) as $userGroup ) + { + $userGroupNames[] = $userGroup->getFieldValue( 'name' ); + } + /* END: Use Case */ + + $this->assertEquals( array( 'Editors' ), $userGroupNames ); + } + + /** + * Test for the loadUsersOfUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testCreateUser + */ + public function testLoadUsersOfUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $group = $userService->loadUserGroup( $this->generateId( 'group', 13 ) ); + + /* BEGIN: Use Case */ + $this->createUserVersion1(); + + // This array will contain the email of the newly created "Editor" user + $email = array(); + foreach ( $userService->loadUsersOfUserGroup( $group ) as $user ) + { + $email[] = $user->email; + } + /* END: Use Case */ + $this->assertEquals( array( 'user@example.com' ), $email ); + } + + /** + * Test for the assignUserToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser + */ + public function testAssignUserToUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $administratorGroupId = $this->generateId( 'group', 12 ); + /* BEGIN: Use Case */ + // $administratorGroupId is the ID of the "Administrator" group in an + // eZ Publish demo installation + + $user = $this->createUserVersion1(); + + // Assign group to newly created user + $userService->assignUserToUserGroup( + $user, + $userService->loadUserGroup( $administratorGroupId ) + ); + + // This array will contain "Editors" and "Administrator users" + $userGroupNames = array(); + foreach ( $userService->loadUserGroupsOfUser( $user ) as $userGroup ) + { + $userGroupNames[] = $userGroup->getFieldValue( 'name' ); + } + /* END: Use Case */ + + sort( $userGroupNames, SORT_STRING ); + + $this->assertEquals( + array( + 'Administrator users', + 'Editors' + ), + $userGroupNames + ); + } + + /** + * Test for the assignUserToUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::assignUserToUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testAssignUserToUserGroup + */ + public function testAssignUserToUserGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + // $editorsGroupId is the ID of the "Editors" group in an + // eZ Publish demo installation + + // This call will fail with an "InvalidArgumentException", because the + // user is already assigned to the "Editors" group + $userService->assignUserToUserGroup( + $user, + $userService->loadUserGroup( $editorsGroupId ) + ); + /* END: Use Case */ + } + + /** + * Test for the unAssignUssrFromUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::unAssignUssrFromUserGroup() + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testLoadUserGroupsOfUser + */ + public function testUnAssignUserFromUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $editorsGroupId = $this->generateId( 'group', 13 ); + $anonymousGroupId = $this->generateId( 'group', 42 ); + + /* BEGIN: Use Case */ + // $anonymousGroupId is the ID of the "Anonymous Users" group in an eZ + // Publish demo installation + + $user = $this->createUserVersion1(); + + // Assign group to newly created user + $userService->assignUserToUserGroup( + $user, + $userService->loadUserGroup( $anonymousGroupId ) + ); + + // Unassign user from "Editors" group + $userService->unAssignUserFromUserGroup( + $user, + $userService->loadUserGroup( $editorsGroupId ) + ); + + // This array will contain "Anonymous Users" + $userGroupNames = array(); + foreach ( $userService->loadUserGroupsOfUser( $user ) as $userGroup ) + { + $userGroupNames[] = $userGroup->getFieldValue( 'name' ); + } + /* END: Use Case */ + + $this->assertEquals( array( 'Anonymous Users' ), $userGroupNames ); + } + + /** + * Test for the unAssignUserFromUserGroup() method. + * + * @return void + * @see \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup() + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends eZ\Publish\API\Repository\Tests\UserServiceTest::testUnAssignUserFromUserGroup + */ + public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $administratorGroupId = $this->generateId( 'group', 12 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + // $administratorGroupId is the ID of the "Administrator" group in an + // eZ Publish demo installation + + // This call will fail with an "InvalidArgumentException", because the + // user is not assigned to the "Administrator" group + $userService->unAssignUserFromUserGroup( + $user, + $userService->loadUserGroup( $administratorGroupId ) + ); + /* END: Use Case */ + } + + /** + * Create a user group fixture in a variable named $userGroup, + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + private function createUserGroupVersion1() + { + $repository = $this->getRepository(); + + $mainGroupId = $this->generateId( 'group', 4 ); + /* BEGIN: Inline */ + // $mainGroupId is the ID of the main "Users" group + + $userService = $repository->getUserService(); + + // Load main group + $parentUserGroup = $userService->loadUserGroup( $mainGroupId ); + + // Instantiate a new create struct + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-US' ); + $userGroupCreate->setField( 'name', 'Example Group' ); + + // Create the new user group + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $parentUserGroup + ); + /* END: Inline */ + + return $userGroup; + } + + private function createHash( $login, $password, $type ) + { + switch ( $type ) + { + case 2: + /* PASSWORD_HASH_MD5_USER */ + return md5( "{$login}\n{$password}" ); + + case 3: + /* PASSWORD_HASH_MD5_SITE */ + $site = null; + return md5( "{$login}\n{$password}\n{$site}" ); + + case 5: + /* PASSWORD_HASH_PLAINTEXT */ + return $password; + } + /* PASSWORD_HASH_MD5_PASSWORD (1) */ + return md5( $password ); + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/BaseLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/BaseLimitationTest.php new file mode 100644 index 0000000..9cf3232 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/BaseLimitationTest.php @@ -0,0 +1,112 @@ +getRepository(); + + $contentService = $repository->getContentService(); + /* BEGIN: Inline */ + $draft = $this->createWikiPageDraft(); + + $content = $contentService->publishVersion( $draft->versionInfo ); + /* END: Inline */ + + return $content; + } + + /** + * Creates a fresh clean content draft. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createWikiPageDraft() + { + $repository = $this->getRepository(); + + $parentLocationId = $this->generateId( 'location', 60 ); + $sectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Inline */ + $contentTypeService = $repository->getContentTypeService(); + $locationService = $repository->getLocationService(); + $contentService = $repository->getContentService(); + + // Configure new location + // $parentLocationId is the id of the /Home/Contact-Us node + $locationCreate = $locationService->newLocationCreateStruct( $parentLocationId ); + + $locationCreate->priority = 23; + $locationCreate->hidden = true; + $locationCreate->remoteId = '0123456789abcdef0123456789abcdef'; + $locationCreate->sortField = Location::SORT_FIELD_NODE_ID; + $locationCreate->sortOrder = Location::SORT_ORDER_DESC; + + // Load content type + $wikiPageType = $contentTypeService->loadContentTypeByIdentifier( 'wiki_page' ); + + // Configure new content object + $wikiPageCreate = $contentService->newContentCreateStruct( $wikiPageType, 'eng-US' ); + + $wikiPageCreate->setField( 'title', 'An awesome wiki page' ); + $wikiPageCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + // $sectionId is the ID of section 1 + $wikiPageCreate->sectionId = $sectionId; + $wikiPageCreate->alwaysAvailable = true; + + // Create a draft + $draft = $contentService->createContent( + $wikiPageCreate, + array( $locationCreate ) + ); + /* END: Inline */ + + return $draft; + } + + /** + * Marks the limitation integration tests skipped against memory stub + * + * Since the limitations integration tests rely on multiple factors which are + * complicated and hard to mimic by the memory stub, these should only run + * against the real core implementation. + * + * @return void + */ + protected function setUp() + { + parent::setUp(); + + if ( $this->getRepository() instanceof RepositoryStub ) + { + $this->markTestSkipped( + 'Limitation integration tests cannot be run against memory stub.' + ); + } + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ContentTypeLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ContentTypeLimitationTest.php new file mode 100644 index 0000000..7e0d893 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ContentTypeLimitationTest.php @@ -0,0 +1,215 @@ +getRepository(); + + $contentService = $repository->getContentService(); + + $contentTypeId = $this->generateId( 'contentType', 22 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'edit' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( 'No content:edit policy found.' ); + } + + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + $roleService->assignRoleToUser( $roleService->loadRole( $role->id ), $user ); + + $content = $this->createWikiPage(); + + $repository->setCurrentUser( $user ); + + $updateDraft = $contentService->createContentDraft( $content->contentInfo ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'title', 'Your wiki page' ); + + $updateContent = $contentService->updateContent( + $updateDraft->versionInfo, + $contentUpdate + ); + /* END: Use Case */ + + $this->assertEquals( + 'Your wiki page', + $updateContent->getFieldValue( 'title' )->text + ); + } + + /** + * Test for the ContentTypeLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation + * @throws \ErrorException + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testContentTypeLimitationForbid() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + $contentTypeId = $this->generateId( 'contentType', 33 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'edit' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( 'No content:edit policy found.' ); + } + + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + $roleService->assignRoleToUser( $roleService->loadRole( $role->id ), $user ); + + $content = $this->createWikiPage(); + + $repository->setCurrentUser( $user ); + + // This call fails with an UnauthorizedException + $contentService->createContentDraft( $content->contentInfo ); + /* END: Use Case */ + } + + /** + * Test for the ContentTypeLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation + * @throws \ErrorException + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testContentTypeLimitationForbidVariant() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + $contentTypeId = $this->generateId( 'contentType', 33 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'edit' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( 'No content:edit policy found.' ); + } + + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + $roleService->assignRoleToUser( $roleService->loadRole( $role->id ), $user ); + + $content = $this->createWikiPage(); + + $updateDraft = $contentService->createContentDraft( $content->contentInfo ); + + $repository->setCurrentUser( $user ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'title', 'Your wiki page' ); + + // This call fails with an UnauthorizedException + $contentService->updateContent( + $updateDraft->versionInfo, + $contentUpdate + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/LanguageLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/LanguageLimitationTest.php new file mode 100644 index 0000000..75fd167 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/LanguageLimitationTest.php @@ -0,0 +1,159 @@ +getRepository(); + + $contentId = $this->generateId( 'content', 58 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'edit' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( 'No content:edit policy found.' ); + } + + // Only allow eng-GB content + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new LanguageLimitation( + array( 'limitationValues' => array( 'eng-GB' ) ) + ) + ); + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + + $roleService->assignRoleToUser( $role, $user ); + + $contentService = $repository->getContentService(); + + $repository->setCurrentUser( $user ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'Contact Me' ); + + $draft = $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + + // Update content object + $draft = $contentService->updateContent( + $draft->versionInfo, + $contentUpdate + ); + + $contentService->publishVersion( $draft->versionInfo ); + /* END: Use Case */ + + $this->assertEquals( + 'Contact Me', + $contentService->loadContent( $contentId ) + ->getFieldValue( 'name' )->text + ); + } + + /** + * Test for the LanguageLimitation + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\LanguageLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @throws \ErrorException + */ + public function testLanguageLimitationForbid() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'content', 58 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'edit' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( 'No content:edit policy found.' ); + } + + // Only allow eng-US content + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new LanguageLimitation( + array( 'limitationValues' => array( 'eng-US' ) ) + ) + ); + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + + $roleService->assignRoleToUser( $role, $user ); + + $contentService = $repository->getContentService(); + + $repository->setCurrentUser( $user ); + + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'Contact Me' ); + + // This call will fail with an UnauthorizedException + $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/LocationLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/LocationLimitationTest.php new file mode 100644 index 0000000..bcd7b32 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/LocationLimitationTest.php @@ -0,0 +1,101 @@ +getRepository(); + + $parentLocationId = $this->generateId( 'location', 60 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new LocationLimitation( + array( 'limitationValues' => array( $parentLocationId ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + /* END: Use Case */ + + $this->assertEquals( + 'An awesome wiki page', + $draft->getFieldValue( 'title' )->text + ); + } + + /** + * Tests a LocationLimitation + * + * @return void + * @see eZ\Publish\API\Repository\Values\User\Limitation\LocationLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLocationLimitationForbid() + { + $repository = $this->getRepository(); + + $parentLocationId = $this->generateId( 'location', 61 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new LocationLimitation( + array( 'limitationValues' => array( $parentLocationId ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $this->createWikiPageDraft(); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/NewSectionLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/NewSectionLimitationTest.php new file mode 100644 index 0000000..ecb961f --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/NewSectionLimitationTest.php @@ -0,0 +1,127 @@ +getRepository(); + + $sectionId = $this->generateId( 'section', 6 ); + $contentId = $this->generateId( 'content', 58 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $policyCreate = $roleService->newPolicyCreateStruct( 'section', 'assign' ); + $policyCreate->addLimitation( + new NewSectionLimitation( + array( 'limitationValues' => array( $sectionId ) ) + ) + ); + + $role = $roleService->addPolicy( + $roleService->loadRoleByIdentifier( 'Editor' ), + $policyCreate + ); + $role = $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'section', 'view' ) + ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $sectionService = $repository->getSectionService(); + $sectionService->assignSection( + $contentInfo, + $sectionService->loadSection( $sectionId ) + ); + /* END: Use Case */ + + $this->assertSame( + $sectionId, + $contentService->loadContentInfo( $contentId )->sectionId + ); + } + + /** + * Tests the NewSectionLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\NewSectionLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testNewSectionLimitationForbid() + { + $repository = $this->getRepository(); + + $contentId = $this->generateId( 'content', 58 ); + $sectionId = $this->generateId( 'section', 6 ); + $otherSectionId = $this->generateId( 'section', 1 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $policyCreate = $roleService->newPolicyCreateStruct( 'section', 'assign' ); + $policyCreate->addLimitation( + new NewSectionLimitation( + array( 'limitationValues' => array( $sectionId ) ) + ) + ); + + $role = $roleService->addPolicy( + $roleService->loadRoleByIdentifier( 'Editor' ), + $policyCreate + ); + $role = $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'section', 'view' ) + ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + $contentInfo = $contentService->loadContentInfo( $contentId ); + + $sectionService = $repository->getSectionService(); + $sectionService->assignSection( + $contentInfo, + $sectionService->loadSection( $otherSectionId ) + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ObjectStateLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ObjectStateLimitationTest.php new file mode 100644 index 0000000..6a960b8 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ObjectStateLimitationTest.php @@ -0,0 +1,156 @@ +getRepository(); + + $contentService = $repository->getContentService(); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $removePolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'versionremove' != $policy->function ) + { + continue; + } + $removePolicy = $policy; + break; + } + + if ( null === $removePolicy ) + { + throw new \ErrorException( 'No content:versionremove policy found.' ); + } + + // Only allow deletion of content with default state + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new ObjectStateLimitation( + array( + 'limitationValues' => array( + // 'not_locked' state + 2 + ) + ) + ) + ); + $roleService->updatePolicy( $removePolicy, $policyUpdate ); + + // Allow user to create everything + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + + $contentService->deleteVersion( $draft->versionInfo ); + /* END: Use Case */ + + $this->setExpectedException( '\\eZ\\Publish\\API\\Repository\\Exceptions\\NotFoundException' ); + $contentService->loadContent( $draft->id ); + } + + /** + * Tests a ObjectStateLimitation + * + * @return void + * @see eZ\Publish\API\Repository\Values\User\Limitation\ObjectStateLimitation + * @throws \ErrorException + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testObjectStateLimitationForbid() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $removePolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'versionremove' != $policy->function ) + { + continue; + } + $removePolicy = $policy; + break; + } + + if ( null === $removePolicy ) + { + throw new \ErrorException( 'No content:versionremove policy found.' ); + } + + // Only allow deletion of content with default state + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new ObjectStateLimitation( + array( + 'limitationValues' => array( + // 'locked' state + 1 + ) + ) + ) + ); + $roleService->updatePolicy( $removePolicy, $policyUpdate ); + + // Allow user to create everything + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + + $contentService->deleteVersion( $draft->versionInfo ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/OwnerLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/OwnerLimitationTest.php new file mode 100644 index 0000000..0ea5d5d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/OwnerLimitationTest.php @@ -0,0 +1,155 @@ +getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $removePolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'remove' != $policy->function ) + { + continue; + } + $removePolicy = $policy; + break; + } + + if ( null === $removePolicy ) + { + throw new \ErrorException( 'No content:remove policy found.' ); + } + + // Only allow remove for the user's own content + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new OwnerLimitation( + array( 'limitationValues' => array( 1 ) ) + ) + ); + $roleService->updatePolicy( $removePolicy, $policyUpdate ); + + $roleService->assignRoleToUser( $role, $user ); + + $content = $this->createWikiPage(); + + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->ownerId = $user->id; + + $contentService->updateContentMetadata( + $content->contentInfo, + $metadataUpdate + ); + + $repository->setCurrentUser( $user ); + + $contentService->deleteContent( + $contentService->loadContentInfo( $content->id ) + ); + /* END: Use Case */ + + $this->setExpectedException( + '\\eZ\\Publish\\API\\Repository\\Exceptions\\NotFoundException' + ); + $contentService->loadContent( $content->id ); + } + + /** + * Test for the OwnerLimitation + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\OwnerLimitation + * @throws \ErrorException + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testOwnerLimitationForbid() + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $removePolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'remove' != $policy->function ) + { + continue; + } + $removePolicy = $policy; + break; + } + + if ( null === $removePolicy ) + { + throw new \ErrorException( 'No content:remove policy found.' ); + } + + // Only allow remove for the user's own content + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new OwnerLimitation( + array( 'limitationValues' => array( 1 ) ) + ) + ); + $roleService->updatePolicy( $removePolicy, $policyUpdate ); + + $roleService->assignRoleToUser( $role, $user ); + + $content = $this->createWikiPage(); + + $repository->setCurrentUser( $user ); + + // This call fails with an UnauthorizedException, because the current + // user is not the content owner + $contentService->deleteContent( + $contentService->loadContentInfo( $content->id ) + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentContentTypeLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentContentTypeLimitationTest.php new file mode 100644 index 0000000..93b44e5 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentContentTypeLimitationTest.php @@ -0,0 +1,116 @@ +getRepository(); + + $parentContentTypeId = $this->generateId( 'contentType', 20 ); + $contentTypeId = $this->generateId( 'contentType', 22 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentContentTypeLimitation( + array( 'limitationValues' => array( $parentContentTypeId ) ) + ) + ); + $policyCreate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + /* END: Use Case */ + + $this->assertEquals( + 'An awesome wiki page', + $draft->getFieldValue( 'title' )->text + ); + } + + /** + * Test for ParentContentTypeLimitation and ContentTypeLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ParentContentTypeLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testParentContentTypeLimitationForbid() + { + $repository = $this->getRepository(); + + $parentContentTypeId = $this->generateId( 'contentType', 20 ); + $contentTypeId = $this->generateId( 'contentType', 33 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentContentTypeLimitation( + array( 'limitationValues' => array( $parentContentTypeId ) ) + ) + ); + $policyCreate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $this->createWikiPageDraft(); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentDepthLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentDepthLimitationTest.php new file mode 100644 index 0000000..aae753e --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentDepthLimitationTest.php @@ -0,0 +1,114 @@ +getRepository(); + + $contentTypeId = $this->generateId( 'contentType', 22 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentDepthLimitation( + array( 'limitationValues' => array( 2 ) ) + ) + ); + $policyCreate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + /* END: Use Case */ + + $this->assertEquals( + 'An awesome wiki page', + $draft->getFieldValue( 'title' )->text + ); + } + + /** + * Tests a combination of ParentDepthLimitation and ContentTypeLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ParentDepthLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testParentDepthLimitationForbid() + { + $repository = $this->getRepository(); + + $contentTypeId = $this->generateId( 'contentType', 22 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentDepthLimitation( + array( 'limitationValues' => array( 1, 3, 4 ) ) + ) + ); + $policyCreate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $contentTypeId ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $this->createWikiPageDraft(); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentOwnerLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentOwnerLimitationTest.php new file mode 100644 index 0000000..c68ad6d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentOwnerLimitationTest.php @@ -0,0 +1,110 @@ +getRepository(); + + $parentContentId = $this->generateId( 'content', 58 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentOwnerLimitation( + array( 'limitationValues' => array( 1 ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $contentService = $repository->getContentService(); + + $metadataUpdate = $contentService->newContentMetadataUpdateStruct(); + $metadataUpdate->ownerId = $user->id; + + $contentService->updateContentMetadata( + $contentService->loadContentInfo( $parentContentId ), + $metadataUpdate + ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + /* END: Use Case */ + + $this->assertEquals( + 'An awesome wiki page', + $draft->getFieldValue( 'title' )->text + ); + } + + /** + * Tests the ParentOwnerLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\ParentOwnerLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testParentOwnerLimitationForbid() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentOwnerLimitation( + array( 'limitationValues' => array( 1 ) ) + ) + ); + + $role = $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $this->createWikiPageDraft(); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentUserGroupLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentUserGroupLimitationTest.php new file mode 100644 index 0000000..013f236 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/ParentUserGroupLimitationTest.php @@ -0,0 +1,146 @@ +getRepository(); + $userService = $repository->getUserService(); + + $parentUserGroupId = $this->generateId( 'location', 4 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-GB' ); + $userGroupCreate->setField( 'name', 'Shared wiki' ); + + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $userService->loadUserGroup( + $parentUserGroupId + ) + ); + + // Assign system user and example user to same group + $userService->assignUserToUserGroup( $user, $userGroup ); + $userService->assignUserToUserGroup( $repository->getCurrentUser(), $userGroup ); + + $roleService = $repository->getRoleService(); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentUserGroupLimitation( + array( + 'limitationValues' => array( true ) + ) + ) + ); + + $role = $roleService->addPolicy( + $roleService->loadRoleByIdentifier( 'Editor' ), + $policyCreate + ); + + $role = $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'content', 'read' ) + ); + + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + $repository->setCurrentUser( $user ); + + $draft = $this->createWikiPageDraft(); + /* END: Use Case */ + + $this->assertEquals( + 'An awesome wiki page', + $draft->getFieldValue( 'title' )->text + ); + } + + /** + * Tests a ParentUserGroupLimitation + * + * @return void + * @see eZ\Publish\API\Repository\Values\User\Limitation\ParentUserGroupLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testParentUserGroupLimitationForbid() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $parentUserGroupId = $this->generateId( 'location', 4 ); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-GB' ); + $userGroupCreate->setField( 'name', 'Shared wiki' ); + + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $userService->loadUserGroup( + $parentUserGroupId + ) + ); + + // Assign only example user to new group + $userService->assignUserToUserGroup( $user, $userGroup ); + + $roleService = $repository->getRoleService(); + + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'create' ); + $policyCreate->addLimitation( + new ParentUserGroupLimitation( + array( + 'limitationValues' => array( true ) + ) + ) + ); + + $role = $roleService->addPolicy( + $roleService->loadRoleByIdentifier( 'Editor' ), + $policyCreate + ); + + $role = $roleService->addPolicy( + $role, + $roleService->newPolicyCreateStruct( 'content', 'read' ) + ); + + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + $repository->setCurrentUser( $user ); + + $this->createWikiPageDraft(); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/SectionLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/SectionLimitationTest.php new file mode 100644 index 0000000..058abbd --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/SectionLimitationTest.php @@ -0,0 +1,140 @@ +getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $readPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'read' != $policy->function ) + { + continue; + } + $readPolicy = $policy; + break; + } + + if ( null === $readPolicy ) + { + throw new \ErrorException( 'No content:read policy found.' ); + } + + // Only allow access to the media section + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new SectionLimitation( + array( 'limitationValues' => array( 3 ) ) + ) + ); + + $roleService->updatePolicy( $readPolicy, $policyUpdate ); + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + + // Load the images folder + $images = $contentService->loadContentByRemoteId( 'e7ff633c6b8e0fd3531e74c6e712bead' ); + /* END: Use Case */ + + $this->assertEquals( + 'Images', + $images->getFieldValue( 'name' )->text + ); + } + + /** + * Test for the SectionLimitation. + * + * @return void + * @see \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation + * @throws \ErrorException + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testSectionLimitationForbid() + { + $repository = $this->getRepository(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $readPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'read' != $policy->function ) + { + continue; + } + $readPolicy = $policy; + break; + } + + if ( null === $readPolicy ) + { + throw new \ErrorException( 'No content:read policy found.' ); + } + + // Give access to "Standard" and "Restricted" section + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new SectionLimitation( + array( 'limitationValues' => array( 1, 6 ) ) + ) + ); + + $roleService->updatePolicy( $readPolicy, $policyUpdate ); + $roleService->assignRoleToUser( $role, $user ); + + $repository->setCurrentUser( $user ); + + $contentService = $repository->getContentService(); + + // This call fails with an UnauthorizedException because the current user + // cannot access the "Media" section + $contentService->loadContentByRemoteId( 'e7ff633c6b8e0fd3531e74c6e712bead' ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/SubtreeLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/SubtreeLimitationTest.php new file mode 100644 index 0000000..60a6dcd --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/SubtreeLimitationTest.php @@ -0,0 +1,173 @@ +getRepository(); + + $userGroupId = $this->generateId( 'content', 13 ); + /* BEGIN: Use Case */ + $subtree = '/1/5/'; + + $this->prepareLimitation( $subtree ); + + $userService = $repository->getUserService(); + $contentService = $repository->getContentService(); + + $contentUpdate = $contentService->newContentUpdateStruct(); + $contentUpdate->setField( 'name', 'eZ Editors' ); + + $userGroup = $userService->loadUserGroup( $userGroupId ); + + $groupUpdate = $userService->newUserGroupUpdateStruct(); + $groupUpdate->contentUpdateStruct = $contentUpdate; + + $userService->updateUserGroup( $userGroup, $groupUpdate ); + /* END: Use Case */ + + $this->assertEquals( + 'eZ Editors', + $userService->loadUserGroup( $userGroupId ) + ->getFieldValue( 'name' ) + ->text + ); + } + + /** + * Tests a combination of SubtreeLimitation, SectionLimitation and + * the ContentTypeLimitation. + * + * @return void + * @see eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation + * @see eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation + * @see eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testSubtreeLimitationForbid() + { + $repository = $this->getRepository(); + + $userGroupId = $this->generateId( 'content', 13 ); + + /* BEGIN: Use Case */ + $subtree = '/1/5/14/'; + + $this->prepareLimitation( $subtree ); + + $userService = $repository->getUserService(); + + // This call will fail with an UnauthorizedException + $userService->loadUserGroup( $userGroupId ); + /* END: Use Case */ + } + + /** + * Prepares the Subtree limitation for the test user. + * + * @param string $subtree + * @return void + * @throws \ErrorException + */ + protected function prepareLimitation( $subtree ) + { + $repository = $this->getRepository(); + + $userTypeId = $this->generateId( 'contentType', 4 ); + $groupTypeId = $this->generateId( 'contentType', 3 ); + + $standardSectionId = $this->generateId( 'section', 1 ); + $userSectionId = $this->generateId( 'section', 2 ); + + /* BEGIN: Inline */ + $user = $this->createUserVersion1(); + + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'read' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( 'No content:read policy found.' ); + } + + // Give read access for the user section + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new SectionLimitation( + array( + 'limitationValues' => array( + $standardSectionId, + $userSectionId + ) + ) + ) + ); + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + + // Allow subtree access and user+user-group edit + $policyCreate = $roleService->newPolicyCreateStruct( 'content', 'edit' ); + $policyCreate->addLimitation( + new ContentTypeLimitation( + array( 'limitationValues' => array( $userTypeId, $groupTypeId ) ) + ) + ); + $roleService->addPolicy( $role, $policyCreate ); + + $roleService->assignRoleToUser( + $role, + $user, + new SubtreeLimitation( + array( 'limitationValues' => array( $subtree ) ) + ) + ); + + $repository->setCurrentUser( $user ); + /* END: Inline */ + } +} diff --git a/eZ/Publish/API/Repository/Tests/Values/User/Limitation/UserGroupLimitationTest.php b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/UserGroupLimitationTest.php new file mode 100644 index 0000000..138c8b3 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/Values/User/Limitation/UserGroupLimitationTest.php @@ -0,0 +1,171 @@ +getRepository(); + $userService = $repository->getUserService(); + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->prepareUserGroup(); + + // Assign system user and example user to same group + $userService->assignUserToUserGroup( $user, $userGroup ); + $userService->assignUserToUserGroup( $repository->getCurrentUser(), $userGroup ); + + $draft = $this->prepareLimitationAndContent( $user, $userGroup ); + /* END: Use Case */ + + $this->assertEquals( + 'An awesome wiki page', + $draft->getFieldValue( 'title' )->text + ); + } + + /** + * Tests a UserGroupLimitation + * + * @return void + * @see eZ\Publish\API\Repository\Values\User\Limitation\UserGroupLimitation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @throws \ErrorException if a mandatory test fixture not exists. + */ + public function testUserGroupLimitationForbid() + { + $repository = $this->getRepository(); + + $userService = $repository->getUserService(); + + /* BEGIN: Use Case */ + $user = $this->createUserVersion1(); + + $userGroup = $this->prepareUserGroup(); + + // Assign example user to new group + $userService->assignUserToUserGroup( $user, $userGroup ); + + $this->prepareLimitationAndContent( $user, $userGroup ); + /* END: Use Case */ + } + + /** + * Prepares the UserGroup fixture. + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + protected function prepareUserGroup() + { + $repository = $this->getRepository(); + $userService = $repository->getUserService(); + + $parentUserGroupId = $this->generateId( 'location', 4 ); + /* BEGIN: Inline */ + $userGroupCreate = $userService->newUserGroupCreateStruct( 'eng-GB' ); + $userGroupCreate->setField( 'name', 'Shared wiki' ); + + $userGroup = $userService->createUserGroup( + $userGroupCreate, + $userService->loadUserGroup( + $parentUserGroupId + ) + ); + /* END: Inline */ + + return $userGroup; + } + + /** + * Prepares the limitation fixture. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @throws \ErrorException + */ + protected function prepareLimitationAndContent( User $user, UserGroup $userGroup ) + { + $repository = $this->getRepository(); + + $contentService = $repository->getContentService(); + + /* BEGIN: Inline */ + $roleService = $repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Editor' ); + + $editPolicy = null; + foreach ( $role->getPolicies() as $policy ) + { + if ( 'content' != $policy->module || 'edit' != $policy->function ) + { + continue; + } + $editPolicy = $policy; + break; + } + + if ( null === $editPolicy ) + { + throw new \ErrorException( + 'Cannot find mandatory policy test fixture content::edit.' + ); + } + + // Give read access for the user section + $policyUpdate = $roleService->newPolicyUpdateStruct(); + $policyUpdate->addLimitation( + new UserGroupLimitation( + array( + 'limitationValues' => array( true ) + ) + ) + ); + $roleService->updatePolicy( $editPolicy, $policyUpdate ); + + $roleService->assignRoleToUserGroup( $role, $userGroup ); + + $content = $this->createWikiPage(); + $contentId = $content->id; + + $repository->setCurrentUser( $user ); + + $draft = $contentService->createContentDraft( + $contentService->loadContentInfo( $contentId ) + ); + /* END: Inline */ + + return $draft; + } +} diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/ContentFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/ContentFixture.php new file mode 100644 index 0000000..24fef63 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/ContentFixture.php @@ -0,0 +1,2075 @@ + new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 4, + "name" => "Users", + "contentTypeId" => 3, + "sectionId" => 2, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1033917596 ), + "publishedDate" => $this->createDateTime( 1033917596 ), + "alwaysAvailable" => true, + "remoteId" => "f5c88a2209584891056f987fd965b0ba", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 5, + ) + ), + 10 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 10, + "name" => "Anonymous User", + "contentTypeId" => 4, + "sectionId" => 2, + "currentVersionNo" => 2, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1072180405 ), + "publishedDate" => $this->createDateTime( 1033920665 ), + "alwaysAvailable" => true, + "remoteId" => "faaeb9be3bd98ed09f606fc16d144eca", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 45, + ) + ), + 11 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 11, + "name" => "Members", + "contentTypeId" => 3, + "sectionId" => 2, + "currentVersionNo" => 2, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1343140542 ), + "publishedDate" => $this->createDateTime( 1033920746 ), + "alwaysAvailable" => true, + "remoteId" => "5f7f0bdb3381d6a461d8c29ff53d908f", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 12, + ) + ), + 12 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 12, + "name" => "Administrator users", + "contentTypeId" => 3, + "sectionId" => 2, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1033920775 ), + "publishedDate" => $this->createDateTime( 1033920775 ), + "alwaysAvailable" => true, + "remoteId" => "9b47a45624b023b1a76c73b74d704acf", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 13, + ) + ), + 13 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 13, + "name" => "Editors", + "contentTypeId" => 3, + "sectionId" => 2, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1033920794 ), + "publishedDate" => $this->createDateTime( 1033920794 ), + "alwaysAvailable" => true, + "remoteId" => "3c160cca19fb135f83bd02d911f04db2", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 14, + ) + ), + 14 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 14, + "name" => "Administrator User", + "contentTypeId" => 4, + "sectionId" => 2, + "currentVersionNo" => 4, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1343140540 ), + "publishedDate" => $this->createDateTime( 1033920830 ), + "alwaysAvailable" => true, + "remoteId" => "1bb4fe25487f05527efa8bfd394cecc7", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 15, + ) + ), + 41 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 41, + "name" => "Media", + "contentTypeId" => 1, + "sectionId" => 3, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1060695457 ), + "publishedDate" => $this->createDateTime( 1060695457 ), + "alwaysAvailable" => true, + "remoteId" => "a6e35cbcb7cd6ae4b691f3eee30cd262", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 43, + ) + ), + 42 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 42, + "name" => "Anonymous Users", + "contentTypeId" => 3, + "sectionId" => 2, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1072180330 ), + "publishedDate" => $this->createDateTime( 1072180330 ), + "alwaysAvailable" => true, + "remoteId" => "15b256dbea2ae72418ff5facc999e8f9", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 44, + ) + ), + 45 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 45, + "name" => "Setup", + "contentTypeId" => 1, + "sectionId" => 4, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1079684190 ), + "publishedDate" => $this->createDateTime( 1079684190 ), + "alwaysAvailable" => true, + "remoteId" => "241d538ce310074e602f29f49e44e938", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 48, + ) + ), + 49 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 49, + "name" => "Images", + "contentTypeId" => 1, + "sectionId" => 3, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1080220197 ), + "publishedDate" => $this->createDateTime( 1080220197 ), + "alwaysAvailable" => true, + "remoteId" => "e7ff633c6b8e0fd3531e74c6e712bead", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 51, + ) + ), + 50 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 50, + "name" => "Files", + "contentTypeId" => 1, + "sectionId" => 3, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1080220220 ), + "publishedDate" => $this->createDateTime( 1080220220 ), + "alwaysAvailable" => true, + "remoteId" => "732a5acd01b51a6fe6eab448ad4138a9", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 52, + ) + ), + 51 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 51, + "name" => "Multimedia", + "contentTypeId" => 1, + "sectionId" => 3, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1080220233 ), + "publishedDate" => $this->createDateTime( 1080220233 ), + "alwaysAvailable" => true, + "remoteId" => "09082deb98662a104f325aaa8c4933d3", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 53, + ) + ), + 52 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 52, + "name" => "Common INI settings", + "contentTypeId" => 14, + "sectionId" => 4, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1082016591 ), + "publishedDate" => $this->createDateTime( 1082016591 ), + "alwaysAvailable" => false, + "remoteId" => "27437f3547db19cf81a33c92578b2c89", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 54, + ) + ), + 54 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 54, + "name" => "eZ Publish Demo Design (without demo content)", + "contentTypeId" => 15, + "sectionId" => 5, + "currentVersionNo" => 2, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1301062376 ), + "publishedDate" => $this->createDateTime( 1082016652 ), + "alwaysAvailable" => false, + "remoteId" => "8b8b22fe3c6061ed500fbd2b377b885f", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 56, + ) + ), + 56 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 56, + "name" => "Design", + "contentTypeId" => 1, + "sectionId" => 5, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1103023132 ), + "publishedDate" => $this->createDateTime( 1103023132 ), + "alwaysAvailable" => true, + "remoteId" => "08799e609893f7aba22f10cb466d9cc8", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 58, + ) + ), + 57 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 57, + "name" => "Home", + "contentTypeId" => 21, + "sectionId" => 1, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1196268696 ), + "publishedDate" => $this->createDateTime( 1195480486 ), + "alwaysAvailable" => true, + "remoteId" => "8a9c9c761004866fb458d89910f52bee", + "mainLanguageCode" => "eng-GB", + "repository" => $this, + "mainLocationId" => 2, + ) + ), + 58 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 58, + "name" => "Contact Us", + "contentTypeId" => 20, + "sectionId" => 1, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1332927282 ), + "publishedDate" => $this->createDateTime( 1332927205 ), + "alwaysAvailable" => false, + "remoteId" => "f8cc7a4cf8a964a1a0ea6666f5da7d0d", + "mainLanguageCode" => "eng-GB", + "repository" => $this, + "mainLocationId" => 60, + ) + ), + 59 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub( + array( + "id" => 59, + "name" => "Partners", + "contentTypeId" => 3, + "sectionId" => 2, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->createDateTime( 1343140541 ), + "publishedDate" => $this->createDateTime( 1343140541 ), + "alwaysAvailable" => true, + "remoteId" => "14e4411b264a6194a33847843919451a", + "mainLanguageCode" => "eng-US", + "repository" => $this, + "mainLocationId" => 61, + ) + ), + ), + 59, + array( + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 4, + "contentId" => 4, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 0 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 0 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Users", + ), + ) + ), + 474 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 474, + "contentId" => 10, + "status" => 1, + "versionNo" => 2, + "modificationDate" => $this->createDateTime( 1072180405 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1072180337 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Anonymous User", + ), + ) + ), + 508 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 508, + "contentId" => 11, + "status" => 1, + "versionNo" => 2, + "modificationDate" => $this->createDateTime( 1343140541 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1343140541 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Members", + ), + ) + ), + 439 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 439, + "contentId" => 11, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1033920746 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1033920737 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Guest accounts", + ), + ) + ), + 440 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 440, + "contentId" => 12, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1033920775 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1033920760 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Administrator users", + ), + ) + ), + 441 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 441, + "contentId" => 13, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1033920794 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1033920786 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Editors", + ), + ) + ), + 506 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 506, + "contentId" => 14, + "status" => 1, + "versionNo" => 4, + "modificationDate" => $this->createDateTime( 1343140540 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1343140540 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Administrator User", + ), + ) + ), + 499 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 499, + "contentId" => 14, + "status" => 1, + "versionNo" => 3, + "modificationDate" => $this->createDateTime( 1301062024 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1301061783 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Administrator User", + ), + ) + ), + 472 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 472, + "contentId" => 41, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1060695457 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1060695450 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Media", + ), + ) + ), + 473 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 473, + "contentId" => 42, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1072180330 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1072180278 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Anonymous Users", + ), + ) + ), + 477 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 477, + "contentId" => 45, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1079684190 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1079684084 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Setup", + ), + ) + ), + 488 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 488, + "contentId" => 49, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1080220197 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1080220181 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Images", + ), + ) + ), + 489 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 489, + "contentId" => 50, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1080220220 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1080220211 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Files", + ), + ) + ), + 490 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 490, + "contentId" => 51, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1080220233 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1080220225 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Multimedia", + ), + ) + ), + 491 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 491, + "contentId" => 52, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1082016591 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1082016497 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Common INI settings", + ), + ) + ), + 500 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 500, + "contentId" => 54, + "status" => 1, + "versionNo" => 2, + "modificationDate" => $this->createDateTime( 1301062375 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1301062300 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "eZ Publish Demo Design (without demo content)", + ), + ) + ), + 495 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 495, + "contentId" => 56, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1103023120 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1103023120 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Design", + ), + ) + ), + 504 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 504, + "contentId" => 57, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1196268696 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1196268655 ), + "initialLanguageCode" => "eng-GB", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-GB" => "Home", + ), + ) + ), + 505 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 505, + "contentId" => 58, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1332927282 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1332927277 ), + "initialLanguageCode" => "eng-GB", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-GB" => "Contact Us", + ), + ) + ), + 507 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub( + array( + "id" => 507, + "contentId" => 59, + "status" => 1, + "versionNo" => 1, + "modificationDate" => $this->createDateTime( 1343140541 ), + "creatorId" => 14, + "creationDate" => $this->createDateTime( 1343140541 ), + "initialLanguageCode" => "eng-US", + "languageCodes" => array( + ), + "repository" => $this, + "names" => array( + "eng-US" => "Partners", + ), + ) + ), + ), + 508, + array( + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 4, + "contentTypeId" => 3, + "fields" => array( + 7 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 7, + "value" => "Main group", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 8 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 8, + "value" => "Users", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 10 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 10, + "contentTypeId" => 4, + "fields" => array( + 19 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 19, + "value" => "Anonymous", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "first_name", + ) + ), + 20 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 20, + "value" => "User", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "last_name", + ) + ), + 21 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 21, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "user_account", + ) + ), + 177 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 177, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "signature", + ) + ), + 179 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 179, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "image", + ) + ), + ), + "versionNo" => 2, + "repository" => $this, + ) + ), + 11 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 11, + "contentTypeId" => 3, + "fields" => array( + 22 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 22, + "value" => "Members", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 23 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 23, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + ), + "versionNo" => 2, + "repository" => $this, + ) + ), + 11 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 11, + "contentTypeId" => 3, + "fields" => array( + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 12 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 12, + "contentTypeId" => 3, + "fields" => array( + 24 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 24, + "value" => "Administrator users", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 25 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 25, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 13 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 13, + "contentTypeId" => 3, + "fields" => array( + 26 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 26, + "value" => "Editors", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 27 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 27, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 14 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 14, + "contentTypeId" => 4, + "fields" => array( + 28 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 28, + "value" => "Administrator", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "first_name", + ) + ), + 29 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 29, + "value" => "User", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "last_name", + ) + ), + 30 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 30, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "user_account", + ) + ), + 178 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 178, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "signature", + ) + ), + 180 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 180, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "image", + ) + ), + ), + "versionNo" => 4, + "repository" => $this, + ) + ), + 14 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 14, + "contentTypeId" => 4, + "fields" => array( + ), + "versionNo" => 3, + "repository" => $this, + ) + ), + 41 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 41, + "contentTypeId" => 1, + "fields" => array( + 98 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 98, + "value" => "Media", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 99 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 99, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_description", + ) + ), + 103 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 103, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_name", + ) + ), + 105 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 105, + "value" => 1045487555, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 109 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 109, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "show_children", + ) + ), + 209 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 209, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "call_for_action", + ) + ), + 215 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 215, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tags", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 42 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 42, + "contentTypeId" => 3, + "fields" => array( + 100 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 100, + "value" => "Anonymous Users", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 101 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 101, + "value" => "User group for the anonymous user", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 45 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 45, + "contentTypeId" => 1, + "fields" => array( + 123 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 123, + "value" => "Setup", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 124 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 124, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_name", + ) + ), + 125 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 125, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_description", + ) + ), + 126 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 126, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 128 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 128, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "show_children", + ) + ), + 210 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 210, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "call_for_action", + ) + ), + 216 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 216, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tags", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 49 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 49, + "contentTypeId" => 1, + "fields" => array( + 142 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 142, + "value" => "Images", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 143 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 143, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_name", + ) + ), + 144 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 144, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_description", + ) + ), + 145 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 145, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 146 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 146, + "value" => 1, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "show_children", + ) + ), + 211 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 211, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "call_for_action", + ) + ), + 217 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 217, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tags", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 50 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 50, + "contentTypeId" => 1, + "fields" => array( + 147 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 147, + "value" => "Files", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 148 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 148, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_name", + ) + ), + 149 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 149, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_description", + ) + ), + 150 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 150, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 151 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 151, + "value" => 1, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "show_children", + ) + ), + 212 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 212, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "call_for_action", + ) + ), + 218 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 218, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tags", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 51 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 51, + "contentTypeId" => 1, + "fields" => array( + 152 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 152, + "value" => "Multimedia", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 153 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 153, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_name", + ) + ), + 154 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 154, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_description", + ) + ), + 155 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 155, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 156 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 156, + "value" => 1, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "show_children", + ) + ), + 213 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 213, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "call_for_action", + ) + ), + 219 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 219, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tags", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 52 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 52, + "contentTypeId" => 14, + "fields" => array( + 157 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 157, + "value" => "Common INI settings", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 158 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 158, + "value" => "/content/view/full/2/", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "indexpage", + ) + ), + 159 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 159, + "value" => "/content/view/full/2", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "defaultpage", + ) + ), + 160 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 160, + "value" => "disabled", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "debugoutput", + ) + ), + 161 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 161, + "value" => "disabled", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "debugbyip", + ) + ), + 162 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 162, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "debugiplist", + ) + ), + 163 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 163, + "value" => "enabled", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "debugredirection", + ) + ), + 164 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 164, + "value" => "disabled", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "viewcaching", + ) + ), + 165 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 165, + "value" => "enabled", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "templatecache", + ) + ), + 166 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 166, + "value" => "enabled", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "templatecompile", + ) + ), + 167 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 167, + "value" => "=geometry/scale=100;100", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "imagesmall", + ) + ), + 168 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 168, + "value" => "=geometry/scale=200;200", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "imagemedium", + ) + ), + 169 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 169, + "value" => "=geometry/scale=300;300", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "imagelarge", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 54 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 54, + "contentTypeId" => 15, + "fields" => array( + 170 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 170, + "value" => "eZ Publish Demo Design (without demo content)", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "title", + ) + ), + 171 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 171, + "value" => "author=eZ Systems +copyright=eZ Systems +description=Content Management System +keywords=cms, publish, e-commerce, content management, development framework", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "meta_data", + ) + ), + 172 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 172, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "image", + ) + ), + 173 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 173, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "sitestyle", + ) + ), + 175 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 175, + "value" => "spam@ez.no", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "email", + ) + ), + 176 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 176, + "value" => "ws2/dump_47_demo/index.php", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "siteurl", + ) + ), + 195 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 195, + "value" => "Site map", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "site_map_url", + ) + ), + 196 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 196, + "value" => "Tag cloud", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tag_cloud_url", + ) + ), + 197 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 197, + "value" => "Login", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "login_label", + ) + ), + 198 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 198, + "value" => "Logout", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "logout_label", + ) + ), + 199 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 199, + "value" => "My profile", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "my_profile_label", + ) + ), + 200 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 200, + "value" => "Register", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "register_user_label", + ) + ), + 201 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 201, + "value" => "/rss/feed/my_feed", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "rss_feed", + ) + ), + 202 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 202, + "value" => "Shopping basket", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "shopping_basket_label", + ) + ), + 203 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 203, + "value" => "Site settings", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "site_settings_label", + ) + ), + 204 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 204, + "value" => "Copyright © 2012 eZ Systems AS (except where otherwise noted). All rights reserved.", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "footer_text", + ) + ), + 205 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 205, + "value" => 0, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "hide_powered_by", + ) + ), + 206 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 206, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "footer_script", + ) + ), + ), + "versionNo" => 2, + "repository" => $this, + ) + ), + 56 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 56, + "contentTypeId" => 1, + "fields" => array( + 181 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 181, + "value" => "Design", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 182 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 182, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_name", + ) + ), + 183 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 183, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "short_description", + ) + ), + 184 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 184, + "value" => " +
      ", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + 185 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 185, + "value" => 1, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "show_children", + ) + ), + 214 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 214, + "value" => " + +", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "call_for_action", + ) + ), + 220 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 220, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "tags", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 57 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 57, + "contentTypeId" => 21, + "fields" => array( + 186 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 186, + "value" => "Home", + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "name", + ) + ), + 187 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 187, + "value" => " + +", + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "page", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 58 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 58, + "contentTypeId" => 20, + "fields" => array( + 188 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 188, + "value" => "Contact Us", + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "name", + ) + ), + 189 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 189, + "value" => "
      Please fill in the form below to contact us.You can also reach us at:Company NameAddressCityCountry�
      ", + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "description", + ) + ), + 190 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 190, + "value" => null, + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "sender_name", + ) + ), + 191 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 191, + "value" => null, + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "subject", + ) + ), + 192 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 192, + "value" => null, + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "message", + ) + ), + 193 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 193, + "value" => null, + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "email", + ) + ), + 194 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 194, + "value" => null, + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "recipient", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + 59 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + "id" => 59, + "contentTypeId" => 3, + "fields" => array( + 207 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 207, + "value" => "Partners", + "languageCode" => "eng-US", + "fieldDefIdentifier" => "name", + ) + ), + 208 => new \eZ\Publish\API\Repository\Values\Content\Field( + array( + "id" => 208, + "value" => null, + "languageCode" => "eng-US", + "fieldDefIdentifier" => "description", + ) + ), + ), + "versionNo" => 1, + "repository" => $this, + ) + ), + ), + array( + "f5c88a2209584891056f987fd965b0ba" => array( + "versionId" => array( + 4 => 4, + ), + "contentId" => array( + 4 => 4, + ), + ), + "4" => array( + "versionId" => array( + 4 => 4, + ), + "contentId" => array( + 4 => 4, + ), + ), + "faaeb9be3bd98ed09f606fc16d144eca" => array( + "versionId" => array( + 474 => 474, + ), + "contentId" => array( + 10 => 10, + ), + ), + "10" => array( + "versionId" => array( + 474 => 474, + ), + "contentId" => array( + 10 => 10, + ), + ), + "5f7f0bdb3381d6a461d8c29ff53d908f" => array( + "versionId" => array( + 439 => 439, + 508 => 508, + ), + "contentId" => array( + 11 => 11, + ), + ), + "11" => array( + "versionId" => array( + 439 => 439, + 508 => 508, + ), + "contentId" => array( + 11 => 11, + ), + ), + "9b47a45624b023b1a76c73b74d704acf" => array( + "versionId" => array( + 440 => 440, + ), + "contentId" => array( + 12 => 12, + ), + ), + "12" => array( + "versionId" => array( + 440 => 440, + ), + "contentId" => array( + 12 => 12, + ), + ), + "3c160cca19fb135f83bd02d911f04db2" => array( + "versionId" => array( + 441 => 441, + ), + "contentId" => array( + 13 => 13, + ), + ), + "13" => array( + "versionId" => array( + 441 => 441, + ), + "contentId" => array( + 13 => 13, + ), + ), + "1bb4fe25487f05527efa8bfd394cecc7" => array( + "versionId" => array( + 499 => 499, + 506 => 506, + ), + "contentId" => array( + 14 => 14, + ), + ), + "14" => array( + "versionId" => array( + 499 => 499, + 506 => 506, + ), + "contentId" => array( + 14 => 14, + ), + ), + "a6e35cbcb7cd6ae4b691f3eee30cd262" => array( + "versionId" => array( + 472 => 472, + ), + "contentId" => array( + 41 => 41, + ), + ), + "41" => array( + "versionId" => array( + 472 => 472, + ), + "contentId" => array( + 41 => 41, + ), + ), + "15b256dbea2ae72418ff5facc999e8f9" => array( + "versionId" => array( + 473 => 473, + ), + "contentId" => array( + 42 => 42, + ), + ), + "42" => array( + "versionId" => array( + 473 => 473, + ), + "contentId" => array( + 42 => 42, + ), + ), + "241d538ce310074e602f29f49e44e938" => array( + "versionId" => array( + 477 => 477, + ), + "contentId" => array( + 45 => 45, + ), + ), + "45" => array( + "versionId" => array( + 477 => 477, + ), + "contentId" => array( + 45 => 45, + ), + ), + "e7ff633c6b8e0fd3531e74c6e712bead" => array( + "versionId" => array( + 488 => 488, + ), + "contentId" => array( + 49 => 49, + ), + ), + "49" => array( + "versionId" => array( + 488 => 488, + ), + "contentId" => array( + 49 => 49, + ), + ), + "732a5acd01b51a6fe6eab448ad4138a9" => array( + "versionId" => array( + 489 => 489, + ), + "contentId" => array( + 50 => 50, + ), + ), + "50" => array( + "versionId" => array( + 489 => 489, + ), + "contentId" => array( + 50 => 50, + ), + ), + "09082deb98662a104f325aaa8c4933d3" => array( + "versionId" => array( + 490 => 490, + ), + "contentId" => array( + 51 => 51, + ), + ), + "51" => array( + "versionId" => array( + 490 => 490, + ), + "contentId" => array( + 51 => 51, + ), + ), + "27437f3547db19cf81a33c92578b2c89" => array( + "versionId" => array( + 491 => 491, + ), + "contentId" => array( + 52 => 52, + ), + ), + "52" => array( + "versionId" => array( + 491 => 491, + ), + "contentId" => array( + 52 => 52, + ), + ), + "8b8b22fe3c6061ed500fbd2b377b885f" => array( + "versionId" => array( + 500 => 500, + ), + "contentId" => array( + 54 => 54, + ), + ), + "54" => array( + "versionId" => array( + 500 => 500, + ), + "contentId" => array( + 54 => 54, + ), + ), + "08799e609893f7aba22f10cb466d9cc8" => array( + "versionId" => array( + 495 => 495, + ), + "contentId" => array( + 56 => 56, + ), + ), + "56" => array( + "versionId" => array( + 495 => 495, + ), + "contentId" => array( + 56 => 56, + ), + ), + "8a9c9c761004866fb458d89910f52bee" => array( + "versionId" => array( + 504 => 504, + ), + "contentId" => array( + 57 => 57, + ), + ), + "57" => array( + "versionId" => array( + 504 => 504, + ), + "contentId" => array( + 57 => 57, + ), + ), + "f8cc7a4cf8a964a1a0ea6666f5da7d0d" => array( + "versionId" => array( + 505 => 505, + ), + "contentId" => array( + 58 => 58, + ), + ), + "58" => array( + "versionId" => array( + 505 => 505, + ), + "contentId" => array( + 58 => 58, + ), + ), + "14e4411b264a6194a33847843919451a" => array( + "versionId" => array( + 507 => 507, + ), + "contentId" => array( + 59 => 59, + ), + ), + "59" => array( + "versionId" => array( + 507 => 507, + ), + "contentId" => array( + 59 => 59, + ), + ), + ) +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/ContentTypeFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/ContentTypeFixture.php new file mode 100644 index 0000000..eff84a1 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/ContentTypeFixture.php @@ -0,0 +1,4176 @@ + new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 1, + "status" => 0, + "identifier" => "folder", + "creationDate" => $this->createDateTime( 1024392098 ), + "modificationDate" => $this->createDateTime( 1082454875 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "a3d405b81be900468eb153d774f4f0d2", + "names" => array( + "eng-US" => "Folder", + ), + "descriptions" => array( + ), + "nameSchema" => "", + "isContainer" => true, + "mainLanguageCode" => "eng-US", + "defaultAlwaysAvailable" => true, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 4, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 119 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 119, + "identifier" => "short_description", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Summary", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 155 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 155, + "identifier" => "short_name", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Short name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 156 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 156, + "identifier" => "description", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 158 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 158, + "identifier" => "show_children", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezboolean", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Display sub items", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 291 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 291, + "identifier" => "call_for_action", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezpage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Call For Action", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 292 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 292, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Tags", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 3 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 3, + "status" => 0, + "identifier" => "user_group", + "creationDate" => $this->createDateTime( 1024392098 ), + "modificationDate" => $this->createDateTime( 1048494743 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "25b4268cdcd01921b808a0d854b877ef", + "names" => array( + "eng-US" => "User group", + ), + "descriptions" => array( + ), + "nameSchema" => "", + "isContainer" => true, + "mainLanguageCode" => "eng-US", + "defaultAlwaysAvailable" => true, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 6 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 6, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 7 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 7, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][2], + ), + ) + ), + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 4, + "status" => 0, + "identifier" => "user", + "creationDate" => $this->createDateTime( 1024392098 ), + "modificationDate" => $this->createDateTime( 1082018364 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "40faa822edc579b02c25f6bb7beec3ad", + "names" => array( + "eng-US" => "User", + ), + "descriptions" => array( + ), + "nameSchema" => " ", + "isContainer" => false, + "mainLanguageCode" => "eng-US", + "defaultAlwaysAvailable" => true, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 8 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 8, + "identifier" => "first_name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "First name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 9 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 9, + "identifier" => "last_name", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Last name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 12 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 12, + "identifier" => "user_account", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezuser", + "isTranslatable" => false, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "User account", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 179 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 179, + "identifier" => "signature", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Signature", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 180 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 180, + "identifier" => "image", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezimage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Image", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][2], + ), + ) + ), + 13 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 13, + "status" => 0, + "identifier" => "comment", + "creationDate" => $this->createDateTime( 1052385685 ), + "modificationDate" => $this->createDateTime( 1082455144 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "000c14f4f475e9f2955dedab72799941", + "names" => array( + "eng-US" => "Comment", + ), + "descriptions" => array( + ), + "nameSchema" => "", + "isContainer" => false, + "mainLanguageCode" => "eng-US", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 149 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 149, + "identifier" => "subject", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Subject", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 150 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 150, + "identifier" => "author", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Author", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 151 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 151, + "identifier" => "message", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Message", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 14 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 14, + "status" => 0, + "identifier" => "common_ini_settings", + "creationDate" => $this->createDateTime( 1081858024 ), + "modificationDate" => $this->createDateTime( 1081858024 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "ffedf2e73b1ea0c3e630e42e2db9c900", + "names" => array( + "eng-US" => "Common ini settings", + ), + "descriptions" => array( + ), + "nameSchema" => "", + "isContainer" => false, + "mainLanguageCode" => "eng-US", + "defaultAlwaysAvailable" => true, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 159 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 159, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-US" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 160 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 160, + "identifier" => "indexpage", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Index Page", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 161 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 161, + "identifier" => "defaultpage", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Default Page", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 162 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 162, + "identifier" => "debugoutput", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Debug Output", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 163 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 163, + "identifier" => "debugbyip", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Debug By IP", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 164 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 164, + "identifier" => "debugiplist", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Debug IP List", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 165 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 165, + "identifier" => "debugredirection", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Debug Redirection", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 166 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 166, + "identifier" => "viewcaching", + "fieldGroup" => "", + "position" => 8, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "View Caching", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 167 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 167, + "identifier" => "templatecache", + "fieldGroup" => "", + "position" => 9, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Template Cache", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 168 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 168, + "identifier" => "templatecompile", + "fieldGroup" => "", + "position" => 10, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Template Compile", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 169 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 169, + "identifier" => "imagesmall", + "fieldGroup" => "", + "position" => 11, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Image Small Size", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 170 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 170, + "identifier" => "imagemedium", + "fieldGroup" => "", + "position" => 12, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Image Medium Size", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 171 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 171, + "identifier" => "imagelarge", + "fieldGroup" => "", + "position" => 13, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Image Large Size", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][4], + ), + ) + ), + 15 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 15, + "status" => 0, + "identifier" => "template_look", + "creationDate" => $this->createDateTime( 1081858045 ), + "modificationDate" => $this->createDateTime( 1081858045 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "59b43cd9feaaf0e45ac974fb4bbd3f92", + "names" => array( + "eng-US" => "Template look", + ), + "descriptions" => array( + ), + "nameSchema" => "", + "isContainer" => false, + "mainLanguageCode" => "eng-US", + "defaultAlwaysAvailable" => true, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 172 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 172, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Title", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 173 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 173, + "identifier" => "meta_data", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Meta data", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 174 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 174, + "identifier" => "image", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezimage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Image", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 175 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 175, + "identifier" => "sitestyle", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezpackage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Sitestyle", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 177 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 177, + "identifier" => "email", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Email", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 178 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 178, + "identifier" => "siteurl", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezinisetting", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Site URL", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 279 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 279, + "identifier" => "site_map_url", + "fieldGroup" => "", + "position" => 8, + "fieldTypeIdentifier" => "ezurl", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Site map URL", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 280 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 280, + "identifier" => "tag_cloud_url", + "fieldGroup" => "", + "position" => 9, + "fieldTypeIdentifier" => "ezurl", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Tag Cloud URL", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 281 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 281, + "identifier" => "login_label", + "fieldGroup" => "", + "position" => 10, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Login (label)", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 282 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 282, + "identifier" => "logout_label", + "fieldGroup" => "", + "position" => 11, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Logout (label)", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 283 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 283, + "identifier" => "my_profile_label", + "fieldGroup" => "", + "position" => 12, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "My profile (label)", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 284 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 284, + "identifier" => "register_user_label", + "fieldGroup" => "", + "position" => 13, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Register new user (label)", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 285 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 285, + "identifier" => "rss_feed", + "fieldGroup" => "", + "position" => 14, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "RSS feed", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 286 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 286, + "identifier" => "shopping_basket_label", + "fieldGroup" => "", + "position" => 15, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Shopping basket (label)", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 287 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 287, + "identifier" => "site_settings_label", + "fieldGroup" => "", + "position" => 16, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Site settings (label)", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 288 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 288, + "identifier" => "footer_text", + "fieldGroup" => "", + "position" => 17, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Footer text", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 289 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 289, + "identifier" => "hide_powered_by", + "fieldGroup" => "", + "position" => 18, + "fieldTypeIdentifier" => "ezboolean", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Hide \"Powered by\"", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 290 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 290, + "identifier" => "footer_script", + "fieldGroup" => "", + "position" => 19, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-US" => "Footer Javascript", + ), + "descriptions" => array( + "eng-US" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][4], + ), + ) + ), + 16 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 16, + "status" => 0, + "identifier" => "article", + "creationDate" => $this->createDateTime( 1343140534 ), + "modificationDate" => $this->createDateTime( 1343140534 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "c15b600eb9198b1924063b5a68758232", + "names" => array( + "eng-GB" => "Article", + ), + "descriptions" => array( + ), + "nameSchema" => "<short_title|title>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 181 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 181, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 182 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 182, + "identifier" => "short_title", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Short title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 183 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 183, + "identifier" => "author", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezauthor", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Author", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 184 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 184, + "identifier" => "intro", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Summary", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 185 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 185, + "identifier" => "body", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Body", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 186 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 186, + "identifier" => "image", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezimage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Image", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 187 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 187, + "identifier" => "caption", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Caption (Image)", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 188 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 188, + "identifier" => "publish_date", + "fieldGroup" => "", + "position" => 8, + "fieldTypeIdentifier" => "ezdatetime", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Publish date", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 189 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 189, + "identifier" => "star_rating", + "fieldGroup" => "", + "position" => 9, + "fieldTypeIdentifier" => "ezsrrating", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Star Rating", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 190 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 190, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 10, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 191 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 191, + "identifier" => "location", + "fieldGroup" => "", + "position" => 11, + "fieldTypeIdentifier" => "ezgmaplocation", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Location", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 192 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 192, + "identifier" => "comments", + "fieldGroup" => "", + "position" => 12, + "fieldTypeIdentifier" => "ezcomcomments", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Comments", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 17 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 17, + "status" => 0, + "identifier" => "blog", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "3a6f9c1f075b3bf49d7345576b196fe8", + "names" => array( + "eng-GB" => "Blog", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 193 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 193, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 194 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 194, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 195 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 195, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 18 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 18, + "status" => 0, + "identifier" => "blog_post", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "7ecb961056b7cbb30f22a91357e0a007", + "names" => array( + "eng-GB" => "Blog post", + ), + "descriptions" => array( + ), + "nameSchema" => "<title>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 196 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 196, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 197 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 197, + "identifier" => "body", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Body", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 198 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 198, + "identifier" => "publication_date", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezdatetime", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Publication date", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 199 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 199, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 200 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 200, + "identifier" => "comments", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezcomcomments", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Comments", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 19 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 19, + "status" => 0, + "identifier" => "product", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "77f3ede996a3a39c7159cc69189c5307", + "names" => array( + "eng-GB" => "Product", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 201 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 201, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 202 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 202, + "identifier" => "product_number", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Product number", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 203 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 203, + "identifier" => "short_description", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Short description", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 204 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 204, + "identifier" => "description", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 205 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 205, + "identifier" => "price", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezprice", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Price", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 206 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 206, + "identifier" => "image", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezimage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Image", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 207 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 207, + "identifier" => "caption", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Caption (Image)", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 208 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 208, + "identifier" => "additional_options", + "fieldGroup" => "", + "position" => 8, + "fieldTypeIdentifier" => "ezmultioption", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Additional options", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 209 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 209, + "identifier" => "star_rating", + "fieldGroup" => "", + "position" => 9, + "fieldTypeIdentifier" => "ezsrrating", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Star Rating", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 210 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 210, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 10, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 211 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 211, + "identifier" => "comments", + "fieldGroup" => "", + "position" => 11, + "fieldTypeIdentifier" => "ezcomcomments", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Comments", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 20 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 20, + "status" => 0, + "identifier" => "feedback_form", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "df0257b8fc55f6b8ab179d6fb915455e", + "names" => array( + "eng-GB" => "Feedback form", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 212 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 212, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 213 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 213, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 214 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 214, + "identifier" => "sender_name", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => false, + "isRequired" => true, + "isInfoCollector" => true, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Sender name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 215 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 215, + "identifier" => "subject", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => true, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Subject", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 216 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 216, + "identifier" => "message", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => true, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Message", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 217 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 217, + "identifier" => "email", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezemail", + "isTranslatable" => false, + "isRequired" => true, + "isInfoCollector" => true, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Email", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 218 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 218, + "identifier" => "recipient", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezemail", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Recipient", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 21 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 21, + "status" => 0, + "identifier" => "landing_page", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "e36c458e3e4a81298a0945f53a2c81f4", + "names" => array( + "eng-GB" => "Landing Page", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 219 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 219, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 220 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 220, + "identifier" => "page", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezpage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Layout", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 22 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 22, + "status" => 0, + "identifier" => "wiki_page", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "d4a05eed0402e4d70fedfda2023f1aa2", + "names" => array( + "eng-GB" => "Wiki Page", + ), + "descriptions" => array( + ), + "nameSchema" => "<title>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 221 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 221, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 222 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 222, + "identifier" => "body", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Body", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 223 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 223, + "identifier" => "star_rating", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezsrrating", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Star Rating", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 224 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 224, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 225 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 225, + "identifier" => "comments", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezcomcomments", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Comments", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 226 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 226, + "identifier" => "show_children", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezboolean", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Display sub items", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 23 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 23, + "status" => 0, + "identifier" => "poll", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "232937a3a2eacbbf24e2601aebe16522", + "names" => array( + "eng-GB" => "Poll", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 227 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 227, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 228 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 228, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 229 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 229, + "identifier" => "question", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezoption", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => true, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Question", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 24 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 24, + "status" => 0, + "identifier" => "file", + "creationDate" => $this->createDateTime( 1343140535 ), + "modificationDate" => $this->createDateTime( 1343140535 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "637d58bfddf164627bdfd265733280a0", + "names" => array( + "eng-GB" => "File", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 230 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 230, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 231 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 231, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 232 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 232, + "identifier" => "file", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezbinaryfile", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "File", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 233 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 233, + "identifier" => "star_rating", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezsrrating", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Star Rating", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 234 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 234, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 235 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 235, + "identifier" => "comments", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezcomcomments", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Comments", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][3], + ), + ) + ), + 25 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 25, + "status" => 0, + "identifier" => "image", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "f6df12aa74e36230eb675f364fccd25a", + "names" => array( + "eng-GB" => "Image", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 236 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 236, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 237 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 237, + "identifier" => "caption", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Caption", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 238 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 238, + "identifier" => "image", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezimage", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Image", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 239 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 239, + "identifier" => "star_rating", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezsrrating", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Star Rating", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 240 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 240, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][3], + ), + ) + ), + 26 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 26, + "status" => 0, + "identifier" => "link", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "74ec6507063150bc813549b22534ad48", + "names" => array( + "eng-GB" => "Link", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 241 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 241, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 242 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 242, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 243 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 243, + "identifier" => "location", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezurl", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Location", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 244 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 244, + "identifier" => "open_in_new_window", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezboolean", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Open in new window", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 27 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 27, + "status" => 0, + "identifier" => "gallery", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "6a320cdc3e274841b82fcd63a86f80d1", + "names" => array( + "eng-GB" => "Gallery", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 245 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 245, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 246 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 246, + "identifier" => "short_description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Short description", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 247 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 247, + "identifier" => "description", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 248 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 248, + "identifier" => "image", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezobjectrelation", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Image", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 249 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 249, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 28 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 28, + "status" => 0, + "identifier" => "forum", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "b241f924b96b267153f5f55904e0675a", + "names" => array( + "eng-GB" => "Forum", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 250 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 250, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 251 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 251, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 29 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 29, + "status" => 0, + "identifier" => "forum_topic", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "71f99c516743a33562c3893ef98c9b60", + "names" => array( + "eng-GB" => "Forum topic", + ), + "descriptions" => array( + ), + "nameSchema" => "<subject>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 252 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 252, + "identifier" => "subject", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Subject", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 253 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 253, + "identifier" => "message", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Message", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 254 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 254, + "identifier" => "sticky", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezboolean", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Sticky", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 255 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 255, + "identifier" => "notify_me", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezsubtreesubscription", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Notify me about updates", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 30 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 30, + "status" => 0, + "identifier" => "forum_reply", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "80ee42a66b2b8b6ee15f5c5f4b361562", + "names" => array( + "eng-GB" => "Forum reply", + ), + "descriptions" => array( + ), + "nameSchema" => "<subject>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 256 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 256, + "identifier" => "subject", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Subject", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 257 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 257, + "identifier" => "message", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Message", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 31 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 31, + "status" => 0, + "identifier" => "event", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "563cb5edc2adfd2b240efa456c81525f", + "names" => array( + "eng-GB" => "Event", + ), + "descriptions" => array( + ), + "nameSchema" => "<short_title|title>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 258 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 258, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Full title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 259 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 259, + "identifier" => "short_title", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Short title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 260 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 260, + "identifier" => "text", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Text", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 261 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 261, + "identifier" => "category", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Category", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 262 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 262, + "identifier" => "from_time", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezdatetime", + "isTranslatable" => false, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "From Time", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 263 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 263, + "identifier" => "to_time", + "fieldGroup" => "", + "position" => 6, + "fieldTypeIdentifier" => "ezdatetime", + "isTranslatable" => false, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "To Time", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 264 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 264, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 7, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 32 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 32, + "status" => 0, + "identifier" => "event_calendar", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "020cbeb6382c8c89dcec2cd406fb47a8", + "names" => array( + "eng-GB" => "Event calendar", + ), + "descriptions" => array( + ), + "nameSchema" => "<title>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 265 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 265, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Title", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 266 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 266, + "identifier" => "view", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezselection", + "isTranslatable" => false, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "View", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 33 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 33, + "status" => 0, + "identifier" => "banner", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "9cb558e25fd946246bbb32950c00228e", + "names" => array( + "eng-GB" => "Banner", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 267 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 267, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 268 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 268, + "identifier" => "url", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "URL", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 269 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 269, + "identifier" => "image", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezimage", + "isTranslatable" => true, + "isRequired" => true, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Image", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 270 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 270, + "identifier" => "image_map", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "eztext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => false, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Image map", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 271 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 271, + "identifier" => "tags", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezkeyword", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Tags", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 34 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 34, + "status" => 0, + "identifier" => "forums", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "60a921e54c1efbb9456bd2283d9e66cb", + "names" => array( + "eng-GB" => "Forums", + ), + "descriptions" => array( + ), + "nameSchema" => "<title>", + "isContainer" => true, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 272 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 272, + "identifier" => "title", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Title", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 273 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 273, + "identifier" => "description", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Description", + ), + "descriptions" => array( + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][1], + ), + ) + ), + 35 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub( + array( + "id" => 35, + "status" => 0, + "identifier" => "video", + "creationDate" => $this->createDateTime( 1343140536 ), + "modificationDate" => $this->createDateTime( 1343140536 ), + "creatorId" => 14, + "modifierId" => 14, + "remoteId" => "b38417e8194fb8f893ca918d297b4fa8", + "names" => array( + "eng-GB" => "Video", + ), + "descriptions" => array( + ), + "nameSchema" => "<name>", + "isContainer" => false, + "mainLanguageCode" => "eng-GB", + "defaultAlwaysAvailable" => false, + "defaultSortField" => 1, + "defaultSortOrder" => 1, + "fieldDefinitions" => array( + 274 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 274, + "identifier" => "name", + "fieldGroup" => "", + "position" => 1, + "fieldTypeIdentifier" => "ezstring", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Name", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 275 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 275, + "identifier" => "caption", + "fieldGroup" => "", + "position" => 2, + "fieldTypeIdentifier" => "ezxmltext", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Caption", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 276 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 276, + "identifier" => "file", + "fieldGroup" => "", + "position" => 3, + "fieldTypeIdentifier" => "ezbinaryfile", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "File", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 277 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 277, + "identifier" => "star_rating", + "fieldGroup" => "", + "position" => 4, + "fieldTypeIdentifier" => "ezsrrating", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Star Rating", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + 278 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub( + array( + "id" => 278, + "identifier" => "comments", + "fieldGroup" => "", + "position" => 5, + "fieldTypeIdentifier" => "ezcomcomments", + "isTranslatable" => true, + "isRequired" => false, + "isInfoCollector" => false, + "isSearchable" => true, + "defaultValue" => null, + "names" => array( + "eng-GB" => "Comments", + ), + "descriptions" => array( + "eng-GB" => "", + ), + "fieldSettings" => array( + ), + "validatorConfiguration" => array( + ), + ) + ), + ), + "contentTypeGroups" => array( + 0 => $scopeValues["groups"][3], + ), + ) + ), + ), + 35, + 292 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/ContentTypeGroupFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/ContentTypeGroupFixture.php new file mode 100644 index 0000000..66b55be --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/ContentTypeGroupFixture.php @@ -0,0 +1,46 @@ +<?php +return array( + array( + 1 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeGroupStub( + array( + "id" => 1, + "identifier" => "Content", + "creationDate" => $this->createDateTime( 1031216928 ), + "modificationDate" => $this->createDateTime( 1033922106 ), + "creatorId" => 14, + "modifierId" => 14, + ) + ), + 2 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeGroupStub( + array( + "id" => 2, + "identifier" => "Users", + "creationDate" => $this->createDateTime( 1031216941 ), + "modificationDate" => $this->createDateTime( 1033922113 ), + "creatorId" => 14, + "modifierId" => 14, + ) + ), + 3 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeGroupStub( + array( + "id" => 3, + "identifier" => "Media", + "creationDate" => $this->createDateTime( 1032009743 ), + "modificationDate" => $this->createDateTime( 1033922120 ), + "creatorId" => 14, + "modifierId" => 14, + ) + ), + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeGroupStub( + array( + "id" => 4, + "identifier" => "Setup", + "creationDate" => $this->createDateTime( 1081858024 ), + "modificationDate" => $this->createDateTime( 1081858024 ), + "creatorId" => 14, + "modifierId" => 14, + ) + ), + ), + 4 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/LanguageFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/LanguageFixture.php new file mode 100644 index 0000000..25f2022 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/LanguageFixture.php @@ -0,0 +1,35 @@ +<?php +return array( + array( + 2 => new \eZ\Publish\API\Repository\Values\Content\Language( + array( + "id" => 2, + "name" => "English (American)", + "enabled" => true, + "languageCode" => "eng-US", + ) + ), + 4 => new \eZ\Publish\API\Repository\Values\Content\Language( + array( + "id" => 4, + "name" => "German", + "enabled" => true, + "languageCode" => "ger-DE", + ) + ), + 8 => new \eZ\Publish\API\Repository\Values\Content\Language( + array( + "id" => 8, + "name" => "English (United Kingdom)", + "enabled" => true, + "languageCode" => "eng-GB", + ) + ), + ), + array( + "eng-US" => 2, + "ger-DE" => 4, + "eng-GB" => 8, + ), + 8 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentId.php new file mode 100644 index 0000000..6f8a667 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentTypeGroupId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentTypeGroupId.php new file mode 100644 index 0000000..ca99538 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentTypeGroupId.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentTypeId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentTypeId.php new file mode 100644 index 0000000..650972c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ContentTypeId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataBetween.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataBetween.php new file mode 100644 index 0000000..8cc8305 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataBetween.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataCreated.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataCreated.php new file mode 100644 index 0000000..28d7a01 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataCreated.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataGt.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataGt.php new file mode 100644 index 0000000..b2eb724 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataGt.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataGte.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataGte.php new file mode 100644 index 0000000..285b85f --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataGte.php @@ -0,0 +1,60 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 4, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataIn.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataIn.php new file mode 100644 index 0000000..d850266 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataIn.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataLte.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataLte.php new file mode 100644 index 0000000..c2bf435 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/DateMetadataLte.php @@ -0,0 +1,125 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 8 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 9 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 14, +)); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Field.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Field.php new file mode 100644 index 0000000..51b2018 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Field.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldBetween.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldBetween.php new file mode 100644 index 0000000..1ab3418 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldBetween.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldIn.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldIn.php new file mode 100644 index 0000000..f35df2b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldIn.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldOr.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldOr.php new file mode 100644 index 0000000..b304507 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FieldOr.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FullText.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FullText.php new file mode 100644 index 0000000..927bbaa --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FullText.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FullTextWildcard.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FullTextWildcard.php new file mode 100644 index 0000000..b7817b2 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/FullTextWildcard.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LocationId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LocationId.php new file mode 100644 index 0000000..135de60 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LocationId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LocationRemoteId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LocationRemoteId.php new file mode 100644 index 0000000..135de60 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LocationRemoteId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalAnd.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalAnd.php new file mode 100644 index 0000000..582c125 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalAnd.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalNot.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalNot.php new file mode 100644 index 0000000..582c125 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalNot.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalOr.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalOr.php new file mode 100644 index 0000000..dde33c5 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/LogicalOr.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ParentLocationId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ParentLocationId.php new file mode 100644 index 0000000..910beb1 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/ParentLocationId.php @@ -0,0 +1,71 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 56, + 'title' => 'Design', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 5, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/RemoteId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/RemoteId.php new file mode 100644 index 0000000..6f8a667 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/RemoteId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SectionId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SectionId.php new file mode 100644 index 0000000..ca99538 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SectionId.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortContentName.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortContentName.php new file mode 100644 index 0000000..bab2586 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortContentName.php @@ -0,0 +1,148 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 8 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 9 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 10 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 11 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 12, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortDatePublished.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortDatePublished.php new file mode 100644 index 0000000..ca99538 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortDatePublished.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortDesc.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortDesc.php new file mode 100644 index 0000000..ca99538 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortDesc.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortFolderName.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortFolderName.php new file mode 100644 index 0000000..705eb37 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortFolderName.php @@ -0,0 +1,82 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 56, + 'title' => 'Design', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 6, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortLocationDepth.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortLocationDepth.php new file mode 100644 index 0000000..a70f16b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortLocationDepth.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortMultiple.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortMultiple.php new file mode 100644 index 0000000..9848022 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortMultiple.php @@ -0,0 +1,60 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 4, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortNone.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortNone.php new file mode 100644 index 0000000..b7836f8 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortNone.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortPathString.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortPathString.php new file mode 100644 index 0000000..30b8864 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortPathString.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortSectionIdentifier.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortSectionIdentifier.php new file mode 100644 index 0000000..6d1dc22 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortSectionIdentifier.php @@ -0,0 +1,170 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 8 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 9 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 10 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 11 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 12 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 13 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 52, + 'title' => 'Common INI settings', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 14, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortSectionName.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortSectionName.php new file mode 100644 index 0000000..875aba7 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortSectionName.php @@ -0,0 +1,170 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 52, + 'title' => 'Common INI settings', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 8 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 9 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 10 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 11 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 12 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 13 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 14, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortTemplateTitle.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortTemplateTitle.php new file mode 100644 index 0000000..7acfe40 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/SortTemplateTitle.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 54, + 'title' => 'eZ Publish Demo Design (without demo content)', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Status.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Status.php new file mode 100644 index 0000000..068cfdb --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Status.php @@ -0,0 +1,214 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 8 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 9 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 10 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 11 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 12 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 52, + 'title' => 'Common INI settings', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 13 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 54, + 'title' => 'eZ Publish Demo Design (without demo content)', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 14 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 56, + 'title' => 'Design', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 15 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 16 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 17 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 18, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Subtree.php b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Subtree.php new file mode 100644 index 0000000..ca99538 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Legacy/Subtree.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => NULL, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => NULL, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/LocationFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/LocationFixture.php new file mode 100644 index 0000000..6e62d9d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/LocationFixture.php @@ -0,0 +1,291 @@ +<?php +return array( + array( + 1 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 1, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "629709ba256fe317c3ddcee35453a96a", + "contentInfo" => null, + "parentLocationId" => 1, + "pathString" => "/1/", + "depth" => 0, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 2 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 2, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "f3e90596361e31d496d4026eb624c983", + "contentInfo" => $this->getContentService()->loadContentInfo( 57 ), + "parentLocationId" => 1, + "pathString" => "/1/2/", + "depth" => 1, + "sortField" => 8, + "sortOrder" => 1, + ) + ), + 5 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 5, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "3f6d92f8044aed134f32153517850f5a", + "contentInfo" => $this->getContentService()->loadContentInfo( 4 ), + "parentLocationId" => 1, + "pathString" => "/1/5/", + "depth" => 1, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 12 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 12, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "602dcf84765e56b7f999eaafd3821dd3", + "contentInfo" => $this->getContentService()->loadContentInfo( 11 ), + "parentLocationId" => 5, + "pathString" => "/1/5/12/", + "depth" => 2, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 13 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 13, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "769380b7aa94541679167eab817ca893", + "contentInfo" => $this->getContentService()->loadContentInfo( 12 ), + "parentLocationId" => 5, + "pathString" => "/1/5/13/", + "depth" => 2, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 14 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 14, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "f7dda2854fc68f7c8455d9cb14bd04a9", + "contentInfo" => $this->getContentService()->loadContentInfo( 13 ), + "parentLocationId" => 5, + "pathString" => "/1/5/14/", + "depth" => 2, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 15 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 15, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "e5161a99f733200b9ed4e80f9c16187b", + "contentInfo" => $this->getContentService()->loadContentInfo( 14 ), + "parentLocationId" => 13, + "pathString" => "/1/5/13/15/", + "depth" => 3, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 43 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 43, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "75c715a51699d2d309a924eca6a95145", + "contentInfo" => $this->getContentService()->loadContentInfo( 41 ), + "parentLocationId" => 1, + "pathString" => "/1/43/", + "depth" => 1, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 44 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 44, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "4fdf0072da953bb276c0c7e0141c5c9b", + "contentInfo" => $this->getContentService()->loadContentInfo( 42 ), + "parentLocationId" => 5, + "pathString" => "/1/5/44/", + "depth" => 2, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 45 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 45, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "2cf8343bee7b482bab82b269d8fecd76", + "contentInfo" => $this->getContentService()->loadContentInfo( 10 ), + "parentLocationId" => 44, + "pathString" => "/1/5/44/45/", + "depth" => 3, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 48 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 48, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "182ce1b5af0c09fa378557c462ba2617", + "contentInfo" => $this->getContentService()->loadContentInfo( 45 ), + "parentLocationId" => 1, + "pathString" => "/1/48/", + "depth" => 1, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 51 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 51, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "1b26c0454b09bb49dfb1b9190ffd67cb", + "contentInfo" => $this->getContentService()->loadContentInfo( 49 ), + "parentLocationId" => 43, + "pathString" => "/1/43/51/", + "depth" => 2, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 52 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 52, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "0b113a208f7890f9ad3c24444ff5988c", + "contentInfo" => $this->getContentService()->loadContentInfo( 50 ), + "parentLocationId" => 43, + "pathString" => "/1/43/52/", + "depth" => 2, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 53 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 53, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "4f18b82c75f10aad476cae5adf98c11f", + "contentInfo" => $this->getContentService()->loadContentInfo( 51 ), + "parentLocationId" => 43, + "pathString" => "/1/43/53/", + "depth" => 2, + "sortField" => 9, + "sortOrder" => 1, + ) + ), + 54 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 54, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "fa9f3cff9cf90ecfae335718dcbddfe2", + "contentInfo" => $this->getContentService()->loadContentInfo( 52 ), + "parentLocationId" => 48, + "pathString" => "/1/48/54/", + "depth" => 2, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 56 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 56, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "772da20ecf88b3035d73cbdfcea0f119", + "contentInfo" => $this->getContentService()->loadContentInfo( 54 ), + "parentLocationId" => 58, + "pathString" => "/1/58/56/", + "depth" => 2, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + 58 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 58, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "79f2d67372ab56f59b5d65bb9e0ca3b9", + "contentInfo" => $this->getContentService()->loadContentInfo( 56 ), + "parentLocationId" => 1, + "pathString" => "/1/58/", + "depth" => 1, + "sortField" => 2, + "sortOrder" => 0, + ) + ), + 60 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 60, + "priority" => -2, + "hidden" => false, + "invisible" => false, + "remoteId" => "86bf306624668ee9b8b979b0d56f7e0d", + "contentInfo" => $this->getContentService()->loadContentInfo( 58 ), + "parentLocationId" => 2, + "pathString" => "/1/2/60/", + "depth" => 2, + "sortField" => 8, + "sortOrder" => 1, + ) + ), + 61 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub( + array( + "id" => 61, + "priority" => 0, + "hidden" => false, + "invisible" => false, + "remoteId" => "66994c2fce0fd2a1c7ecce7115158971", + "contentInfo" => $this->getContentService()->loadContentInfo( 59 ), + "parentLocationId" => 5, + "pathString" => "/1/5/61/", + "depth" => 2, + "sortField" => 1, + "sortOrder" => 1, + ) + ), + ), + 61 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/ObjectStateFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/ObjectStateFixture.php new file mode 100644 index 0000000..a6d5a1b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/ObjectStateFixture.php @@ -0,0 +1,121 @@ +<?php +return array( + array( + 1 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ObjectState\ObjectStateStub( + array( + "id" => 1, + "identifier" => "not_locked", + "priority" => 0, + "defaultLanguageCode" => "eng-US", + "languageCodes" => array( + 0 => "eng-US", + ), + "stateGroup" => $scopeValues["groups"][2], + "names" => array( + ), + "descriptions" => array( + ), + ) + ), + 2 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ObjectState\ObjectStateStub( + array( + "id" => 2, + "identifier" => "locked", + "priority" => 1, + "defaultLanguageCode" => "eng-US", + "languageCodes" => array( + 0 => "eng-US", + ), + "stateGroup" => $scopeValues["groups"][2], + "names" => array( + "eng-US" => "Locked", + ), + "descriptions" => array( + "eng-US" => "", + ), + ) + ), + ), + array ( + 2 => + array ( + 1 => '1', + 2 => '2', + ), +), + array ( + 4 => + array ( + 2 => '1', + ), + 10 => + array ( + 2 => '1', + ), + 11 => + array ( + 2 => '1', + ), + 12 => + array ( + 2 => '1', + ), + 13 => + array ( + 2 => '1', + ), + 14 => + array ( + 2 => '1', + ), + 41 => + array ( + 2 => '1', + ), + 42 => + array ( + 2 => '1', + ), + 45 => + array ( + 2 => '1', + ), + 49 => + array ( + 2 => '1', + ), + 50 => + array ( + 2 => '1', + ), + 51 => + array ( + 2 => '1', + ), + 52 => + array ( + 2 => '1', + ), + 54 => + array ( + 2 => '1', + ), + 56 => + array ( + 2 => '1', + ), + 57 => + array ( + 2 => '1', + ), + 58 => + array ( + 2 => '1', + ), + 59 => + array ( + 2 => '1', + ), +), + 2 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/ObjectStateGroupFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/ObjectStateGroupFixture.php new file mode 100644 index 0000000..06dbda1 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/ObjectStateGroupFixture.php @@ -0,0 +1,19 @@ +<?php +return array( + array( + 2 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\ObjectState\ObjectStateGroupStub( + array( + "id" => 2, + "identifier" => "ez_lock", + "defaultLanguageCode" => "eng-US", + "names" => array( + "eng-US" => "Lock", + ), + "descriptions" => array( + "eng-US" => "", + ), + ) + ), + ), + 2 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/RoleFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/RoleFixture.php new file mode 100644 index 0000000..6b05463 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/RoleFixture.php @@ -0,0 +1,661 @@ +<?php +return array( + array( + 1 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\RoleStub( + array( + "id" => 1, + "identifier" => "Anonymous", + ) + ), + 2 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\RoleStub( + array( + "id" => 2, + "identifier" => "Administrator", + ) + ), + 3 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\RoleStub( + array( + "id" => 3, + "identifier" => "Editor", + ) + ), + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\RoleStub( + array( + "id" => 4, + "identifier" => "Partner", + ) + ), + 5 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\RoleStub( + array( + "id" => 5, + "identifier" => "Member", + ) + ), + ), + array( + "Anonymous" => 1, + "Administrator" => 2, + "Editor" => 3, + "Partner" => 4, + "Member" => 5, + ), + 5, + array( + "12" => array( + 25 => 2, + ), + "11" => array( + 28 => 1, + 34 => 5, + ), + "42" => array( + 31 => 1, + ), + "13" => array( + 32 => 3, + 33 => 3, + 38 => 5, + ), + "59" => array( + 35 => 4, + 36 => 5, + 37 => 1, + ), + ), + array( + 308 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 308, + "roleId" => 2, + "module" => "*", + "function" => "*", + "limitations" => array( + ), + ) + ), + 319 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 319, + "roleId" => 3, + "module" => "user", + "function" => "login", + "limitations" => array( + ), + ) + ), + 328 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 328, + "roleId" => 1, + "module" => "content", + "function" => "read", + "limitations" => array( + ), + ) + ), + 329 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 329, + "roleId" => 1, + "module" => "content", + "function" => "pdf", + "limitations" => array( + ), + ) + ), + 330 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 330, + "roleId" => 3, + "module" => "ezoe", + "function" => "*", + "limitations" => array( + ), + ) + ), + 332 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 332, + "roleId" => 3, + "module" => "ezoe", + "function" => "*", + "limitations" => array( + ), + ) + ), + 333 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 333, + "roleId" => 1, + "module" => "rss", + "function" => "feed", + "limitations" => array( + ), + ) + ), + 334 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 334, + "roleId" => 1, + "module" => "user", + "function" => "login", + "limitations" => array( + ), + ) + ), + 335 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 335, + "roleId" => 1, + "module" => "user", + "function" => "login", + "limitations" => array( + ), + ) + ), + 336 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 336, + "roleId" => 1, + "module" => "user", + "function" => "login", + "limitations" => array( + ), + ) + ), + 337 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 337, + "roleId" => 1, + "module" => "user", + "function" => "login", + "limitations" => array( + ), + ) + ), + 338 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 338, + "roleId" => 1, + "module" => "content", + "function" => "read", + "limitations" => array( + ), + ) + ), + 339 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 339, + "roleId" => 3, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 340 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 340, + "roleId" => 3, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 341 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 341, + "roleId" => 3, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 342 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 342, + "roleId" => 3, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 343 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 343, + "roleId" => 3, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 344 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 344, + "roleId" => 3, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 345 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 345, + "roleId" => 3, + "module" => "websitetoolbar", + "function" => "use", + "limitations" => array( + ), + ) + ), + 346 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 346, + "roleId" => 3, + "module" => "content", + "function" => "edit", + "limitations" => array( + ), + ) + ), + 347 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 347, + "roleId" => 3, + "module" => "content", + "function" => "read", + "limitations" => array( + ), + ) + ), + 348 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 348, + "roleId" => 3, + "module" => "notification", + "function" => "use", + "limitations" => array( + ), + ) + ), + 349 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 349, + "roleId" => 3, + "module" => "content", + "function" => "manage_locations", + "limitations" => array( + ), + ) + ), + 350 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 350, + "roleId" => 3, + "module" => "ezodf", + "function" => "*", + "limitations" => array( + ), + ) + ), + 351 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 351, + "roleId" => 3, + "module" => "ezflow", + "function" => "*", + "limitations" => array( + ), + ) + ), + 352 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 352, + "roleId" => 3, + "module" => "ezajax", + "function" => "*", + "limitations" => array( + ), + ) + ), + 353 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 353, + "roleId" => 3, + "module" => "content", + "function" => "diff", + "limitations" => array( + ), + ) + ), + 354 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 354, + "roleId" => 3, + "module" => "content", + "function" => "versionread", + "limitations" => array( + ), + ) + ), + 355 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 355, + "roleId" => 3, + "module" => "content", + "function" => "versionremove", + "limitations" => array( + ), + ) + ), + 356 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 356, + "roleId" => 3, + "module" => "content", + "function" => "remove", + "limitations" => array( + ), + ) + ), + 357 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 357, + "roleId" => 3, + "module" => "content", + "function" => "translate", + "limitations" => array( + ), + ) + ), + 358 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 358, + "roleId" => 3, + "module" => "rss", + "function" => "feed", + "limitations" => array( + ), + ) + ), + 359 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 359, + "roleId" => 3, + "module" => "content", + "function" => "bookmark", + "limitations" => array( + ), + ) + ), + 360 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 360, + "roleId" => 3, + "module" => "content", + "function" => "pendinglist", + "limitations" => array( + ), + ) + ), + 361 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 361, + "roleId" => 3, + "module" => "content", + "function" => "dashboard", + "limitations" => array( + ), + ) + ), + 362 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 362, + "roleId" => 3, + "module" => "content", + "function" => "view_embed", + "limitations" => array( + ), + ) + ), + 363 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 363, + "roleId" => 4, + "module" => "content", + "function" => "read", + "limitations" => array( + ), + ) + ), + 364 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 364, + "roleId" => 4, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 365 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 365, + "roleId" => 4, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 366 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 366, + "roleId" => 4, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 367 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 367, + "roleId" => 4, + "module" => "content", + "function" => "edit", + "limitations" => array( + ), + ) + ), + 368 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 368, + "roleId" => 4, + "module" => "user", + "function" => "selfedit", + "limitations" => array( + ), + ) + ), + 369 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 369, + "roleId" => 4, + "module" => "notification", + "function" => "use", + "limitations" => array( + ), + ) + ), + 370 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 370, + "roleId" => 5, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 371 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 371, + "roleId" => 5, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 372 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 372, + "roleId" => 5, + "module" => "content", + "function" => "create", + "limitations" => array( + ), + ) + ), + 373 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 373, + "roleId" => 5, + "module" => "content", + "function" => "edit", + "limitations" => array( + ), + ) + ), + 374 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 374, + "roleId" => 5, + "module" => "user", + "function" => "selfedit", + "limitations" => array( + ), + ) + ), + 375 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 375, + "roleId" => 5, + "module" => "notification", + "function" => "use", + "limitations" => array( + ), + ) + ), + 376 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 376, + "roleId" => 5, + "module" => "user", + "function" => "password", + "limitations" => array( + ), + ) + ), + 377 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub( + array( + "id" => 377, + "roleId" => 5, + "module" => "ezjscore", + "function" => "call", + "limitations" => array( + ), + ) + ), + ), + 377, + array( + "2" => array( + 0 => 308, + ), + "3" => array( + 0 => 319, + 1 => 330, + 2 => 332, + 3 => 339, + 4 => 340, + 5 => 341, + 6 => 342, + 7 => 343, + 8 => 344, + 9 => 345, + 10 => 346, + 11 => 347, + 12 => 348, + 13 => 349, + 14 => 350, + 15 => 351, + 16 => 352, + 17 => 353, + 18 => 354, + 19 => 355, + 20 => 356, + 21 => 357, + 22 => 358, + 23 => 359, + 24 => 360, + 25 => 361, + 26 => 362, + ), + "1" => array( + 0 => 328, + 1 => 329, + 2 => 333, + 3 => 334, + 4 => 335, + 5 => 336, + 6 => 337, + 7 => 338, + ), + "4" => array( + 0 => 363, + 1 => 364, + 2 => 365, + 3 => 366, + 4 => 367, + 5 => 368, + 6 => 369, + ), + "5" => array( + 0 => 370, + 1 => 371, + 2 => 372, + 3 => 373, + 4 => 374, + 5 => 375, + 6 => 376, + 7 => 377, + ), + ), + array( + "32" => array( + "id" => 32, + "roleId" => 3, + "contentId" => 13, + "identifier" => "Subtree", + "value" => array( + 0 => "/1/2/", + ), + ), + "33" => array( + "id" => 33, + "roleId" => 3, + "contentId" => 13, + "identifier" => "Subtree", + "value" => array( + 0 => "/1/43/", + ), + ), + ) +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/SectionFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/SectionFixture.php new file mode 100644 index 0000000..92e69a8 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/SectionFixture.php @@ -0,0 +1,85 @@ +<?php +return array( + array( + 1 => new \eZ\Publish\API\Repository\Values\Content\Section( + array( + "id" => 1, + "name" => "Standard", + "identifier" => "standard", + ) + ), + 2 => new \eZ\Publish\API\Repository\Values\Content\Section( + array( + "id" => 2, + "name" => "Users", + "identifier" => "users", + ) + ), + 3 => new \eZ\Publish\API\Repository\Values\Content\Section( + array( + "id" => 3, + "name" => "Media", + "identifier" => "media", + ) + ), + 4 => new \eZ\Publish\API\Repository\Values\Content\Section( + array( + "id" => 4, + "name" => "Setup", + "identifier" => "setup", + ) + ), + 5 => new \eZ\Publish\API\Repository\Values\Content\Section( + array( + "id" => 5, + "name" => "Design", + "identifier" => "design", + ) + ), + 6 => new \eZ\Publish\API\Repository\Values\Content\Section( + array( + "id" => 6, + "name" => "Restricted", + "identifier" => "", + ) + ), + ), + array( + "standard" => 1, + "users" => 2, + "media" => 3, + "setup" => 4, + "design" => 5, + ), + array( + "2" => array( + 4 => true, + 10 => true, + 11 => true, + 12 => true, + 13 => true, + 14 => true, + 42 => true, + 59 => true, + ), + "3" => array( + 41 => true, + 49 => true, + 50 => true, + 51 => true, + ), + "4" => array( + 45 => true, + 52 => true, + ), + "5" => array( + 54 => true, + 56 => true, + ), + "1" => array( + 57 => true, + 58 => true, + ), + ), + 6 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentId.php new file mode 100644 index 0000000..f79d6a3 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.57124877, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentTypeGroupId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentTypeGroupId.php new file mode 100644 index 0000000..2f28723 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentTypeGroupId.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.6931472, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentTypeId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentTypeId.php new file mode 100644 index 0000000..d68cf4d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ContentTypeId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.7917593, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataBetween.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataBetween.php new file mode 100644 index 0000000..3d3b355 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataBetween.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataCreated.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataCreated.php new file mode 100644 index 0000000..c590fa4 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataCreated.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataGt.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataGt.php new file mode 100644 index 0000000..d9dc2ec --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataGt.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataGte.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataGte.php new file mode 100644 index 0000000..bd8897c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataGte.php @@ -0,0 +1,60 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 4, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataIn.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataIn.php new file mode 100644 index 0000000..1bcec4b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataIn.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 0.61530614, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.61530614, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataLte.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataLte.php new file mode 100644 index 0000000..52479a3 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/DateMetadataLte.php @@ -0,0 +1,125 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 8 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 9 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 14, +)); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentType.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentType.php new file mode 100644 index 0000000..35c4a67 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentType.php @@ -0,0 +1,47 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\Facet\ContentTypeFacet::__set_state(array( + 'entries' => + array ( + 20 => 1, + 21 => 1, + ), + 'name' => 'type', + )), + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.7917593, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentTypeMinCount.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentTypeMinCount.php new file mode 100644 index 0000000..b8d8ec6 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentTypeMinCount.php @@ -0,0 +1,43 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\Facet\ContentTypeFacet::__set_state(array( + 'entries' => array (), + 'name' => 'type', + )), + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.7917593, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentTypeMinLimit.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentTypeMinLimit.php new file mode 100644 index 0000000..35c4a67 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetContentTypeMinLimit.php @@ -0,0 +1,47 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\Facet\ContentTypeFacet::__set_state(array( + 'entries' => + array ( + 20 => 1, + 21 => 1, + ), + 'name' => 'type', + )), + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.7917593, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetSection.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetSection.php new file mode 100644 index 0000000..95788f7 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetSection.php @@ -0,0 +1,46 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\Facet\SectionFacet::__set_state(array( + 'entries' => + array ( + 1 => 2, + ), + 'name' => 'section', + )), + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.7917593, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetUser.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetUser.php new file mode 100644 index 0000000..7018f8a --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FacetUser.php @@ -0,0 +1,46 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\Facet\UserFacet::__set_state(array( + 'entries' => + array ( + 14 => 2, + ), + 'name' => 'creator', + )), + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 2.7917593, + 'index' => NULL, + 'highlight' => NULL, + )) + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.7917593, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Field.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Field.php new file mode 100644 index 0000000..d5323fe --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Field.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 0.045726605, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.045726605, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldBetween.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldBetween.php new file mode 100644 index 0000000..41e6861 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldBetween.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldIn.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldIn.php new file mode 100644 index 0000000..b2e314b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldIn.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 0.016166795, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 0.016166795, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.016166795, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldOr.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldOr.php new file mode 100644 index 0000000..e1d8a14 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldOr.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 0.02753464, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 0.03347406, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 0.03347406, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.03347406, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldUnknown.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldUnknown.php new file mode 100644 index 0000000..122077b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FieldUnknown.php @@ -0,0 +1,16 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0, + 'totalCount' => 0, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FullText.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FullText.php new file mode 100644 index 0000000..a7f9631 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FullText.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 0.51916456, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.51916456, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FullTextWildcard.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FullTextWildcard.php new file mode 100644 index 0000000..41b5356 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/FullTextWildcard.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 58, + 'title' => 'Contact Us', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LocationId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LocationId.php new file mode 100644 index 0000000..daa8cbc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LocationId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.57124877, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LocationRemoteId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LocationRemoteId.php new file mode 100644 index 0000000..4f8ad57 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LocationRemoteId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.1303897, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 1.1303897, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.1303897, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalAnd.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalAnd.php new file mode 100644 index 0000000..8830a1b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalAnd.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.138094, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.138094, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalNot.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalNot.php new file mode 100644 index 0000000..eef4e5c --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalNot.php @@ -0,0 +1,27 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 0.57124877, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0.57124877, + 'totalCount' => 1, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalOr.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalOr.php new file mode 100644 index 0000000..96541d4 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/LogicalOr.php @@ -0,0 +1,49 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 0.22761878, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 0.34142816, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.138094, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.138094, + 'totalCount' => 3, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ParentLocationId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ParentLocationId.php new file mode 100644 index 0000000..19f1e73 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/ParentLocationId.php @@ -0,0 +1,71 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 2.098612, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => 2.098612, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 45, + 'title' => 'Setup', + ), + 'score' => 2.098612, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 56, + 'title' => 'Design', + ), + 'score' => 2.098612, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 57, + 'title' => 'Home', + ), + 'score' => 2.098612, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.098612, + 'totalCount' => 5, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/RemoteId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/RemoteId.php new file mode 100644 index 0000000..7ebdb60 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/RemoteId.php @@ -0,0 +1,38 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.1303897, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.1303897, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.1303897, + 'totalCount' => 2, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SectionId.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SectionId.php new file mode 100644 index 0000000..2f28723 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SectionId.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.6931472, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortLocationDepth.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortLocationDepth.php new file mode 100644 index 0000000..947a4bc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortLocationDepth.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.6931472, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortMultiple.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortMultiple.php new file mode 100644 index 0000000..4840b53 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortMultiple.php @@ -0,0 +1,60 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 51, + 'title' => 'Multimedia', + ), + 'score' => 2.2809339, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 50, + 'title' => 'Files', + ), + 'score' => 2.2809339, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 49, + 'title' => 'Images', + ), + 'score' => 2.2809339, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 41, + 'title' => 'Media', + ), + 'score' => 2.2809339, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 2.2809339, + 'totalCount' => 4, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortNone.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortNone.php new file mode 100644 index 0000000..947a4bc --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortNone.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.6931472, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortPathString.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortPathString.php new file mode 100644 index 0000000..3277554 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/SortPathString.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.6931472, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.6931472, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Status.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Status.php new file mode 100644 index 0000000..122077b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Status.php @@ -0,0 +1,16 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 0, + 'totalCount' => 0, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Subtree.php b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Subtree.php new file mode 100644 index 0000000..4560a9d --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/Solr/Subtree.php @@ -0,0 +1,104 @@ +<?php + +return eZ\Publish\API\Repository\Values\Content\Search\SearchResult::__set_state(array( + 'facets' => + array ( + ), + 'searchHits' => + array ( + 0 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 10, + 'title' => 'Anonymous User', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 1 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 11, + 'title' => 'Members', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 2 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 12, + 'title' => 'Administrator users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 3 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 13, + 'title' => 'Editors', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 4 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 14, + 'title' => 'Administrator User', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 5 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 4, + 'title' => 'Users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 6 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 42, + 'title' => 'Anonymous Users', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + 7 => + eZ\Publish\API\Repository\Values\Content\Search\SearchHit::__set_state(array( + 'valueObject' => + array ( + 'id' => 59, + 'title' => 'Partners', + ), + 'score' => 1.0, + 'index' => NULL, + 'highlight' => NULL, + )), + ), + 'spellSuggestion' => NULL, + 'time' => 1, + 'timedOut' => NULL, + 'maxScore' => 1.0, + 'totalCount' => 8, +)); + diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/URLAliasFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/URLAliasFixture.php new file mode 100644 index 0000000..77a277f --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/URLAliasFixture.php @@ -0,0 +1,563 @@ +<?php +return array( + array( + 14 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 14, + "type" => 2, + "destination" => null, + "path" => "/foo_bar_folder", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 39 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 39, + "type" => 0, + "destination" => 60, + "path" => "/Contact-Us", + "languageCodes" => array( + 0 => "eng-GB", + ), + "alwaysAvailable" => 0, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + /* + * @todo FIXME: Location for this alias not found in dump + 38 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 38, + "type" => 0, + "destination" => 59, + "path" => "/eZ-Publish", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + */ + 25 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 25, + "type" => 0, + "destination" => 58, + "path" => "/Design", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 13 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 13, + "type" => 0, + "destination" => 48, + "path" => "/Setup2", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 17 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 17, + "type" => 2, + "destination" => null, + "path" => "/media2", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 9 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 9, + "type" => 0, + "destination" => 43, + "path" => "/Media", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 21 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 21, + "type" => 2, + "destination" => null, + "path" => "/setup3", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 3 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 3, + "type" => 2, + "destination" => null, + "path" => "/users2", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 2 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 2, + "type" => 0, + "destination" => 5, + "path" => "/Users", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 1 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 1, + "type" => 0, + "destination" => 2, + "path" => "/", + "languageCodes" => array( + 0 => "eng-US", + 1 => "eng-GB", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 40 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 40, + "type" => 0, + "destination" => 61, + "path" => "/Users/Partners", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 6 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 6, + "type" => 0, + "destination" => 14, + "path" => "/Users/Editors", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 10 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 10, + "type" => 0, + "destination" => 44, + "path" => "/Users/Anonymous-Users", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 4 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 4, + "type" => 0, + "destination" => 12, + "path" => "/Users/Members", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 41 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 41, + "type" => 0, + "destination" => 12, + "path" => "/Users/Guest-accounts", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 5 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 5, + "type" => 0, + "destination" => 13, + "path" => "/Users/Administrator-users", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 11 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 11, + "type" => 2, + "destination" => null, + "path" => "/users2/anonymous_users2", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 26 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 26, + "type" => 0, + "destination" => 12, + "path" => "/users2/guest_accounts", + "languageCodes" => array( + ), + "alwaysAvailable" => 0, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 29 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 29, + "type" => 0, + "destination" => 14, + "path" => "/users2/editors", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 7 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 7, + "type" => 2, + "destination" => null, + "path" => "/users2/administrator_users2", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 27 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 27, + "type" => 0, + "destination" => 13, + "path" => "/users2/administrator_users", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 30 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 30, + "type" => 0, + "destination" => 44, + "path" => "/users2/anonymous_users", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 8 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 8, + "type" => 0, + "destination" => 15, + "path" => "/Users/Administrator-users/Administrator-User", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 28 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 28, + "type" => 0, + "destination" => 15, + "path" => "/users2/administrator_users2/administrator_user", + "languageCodes" => array( + ), + "alwaysAvailable" => 0, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 20 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 20, + "type" => 0, + "destination" => 53, + "path" => "/Media/Multimedia", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 19 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 19, + "type" => 0, + "destination" => 52, + "path" => "/Media/Files", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 18 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 18, + "type" => 0, + "destination" => 51, + "path" => "/Media/Images", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 12 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 12, + "type" => 0, + "destination" => 45, + "path" => "/Users/Anonymous-Users/Anonymous-User", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 1, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 31 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 31, + "type" => 0, + "destination" => 45, + "path" => "/users2/anonymous_users2/anonymous_user", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 22 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 22, + "type" => 0, + "destination" => 54, + "path" => "/Setup2/Common-INI-settings", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 0, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + 15 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 15, + "type" => 2, + "destination" => null, + "path" => "/foo_bar_folder/images", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 34 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 34, + "type" => 0, + "destination" => 53, + "path" => "/media2/multimedia", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 33 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 33, + "type" => 0, + "destination" => 52, + "path" => "/media2/files", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 32 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 32, + "type" => 0, + "destination" => 51, + "path" => "/media2/images", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 35 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 35, + "type" => 0, + "destination" => 54, + "path" => "/setup3/common_ini_settings", + "languageCodes" => array( + ), + "alwaysAvailable" => 1, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 37 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 37, + "type" => 0, + "destination" => 56, + "path" => "/Design/eZ-publish", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 0, + "isHistory" => true, + "isCustom" => false, + "forward" => true, + ) + ), + 24 => new \eZ\Publish\API\Repository\Values\Content\URLAlias( + array( + "id" => 24, + "type" => 0, + "destination" => 56, + "path" => "/Design/Plain-site", + "languageCodes" => array( + 0 => "eng-US", + ), + "alwaysAvailable" => 0, + "isHistory" => false, + "isCustom" => false, + "forward" => true, + ) + ), + ), + 41 +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/UserFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/UserFixture.php new file mode 100644 index 0000000..900b082 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/UserFixture.php @@ -0,0 +1,25 @@ +<?php +return array( + array( + 10 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserStub( + array( + "login" => "anonymous", + "email" => "nospam@ez.no", + "passwordHash" => "4e6f6184135228ccd45f8233d72a0363", + "hashAlgorithm" => 2, + "enabled" => true, + "content" => $this->getContentService()->loadContent( 10 ), + ) + ), + 14 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserStub( + array( + "login" => "admin", + "email" => "spam@ez.no", + "passwordHash" => "c78e3b0f3d9244ed8c6d1c29464bdff9", + "hashAlgorithm" => 2, + "enabled" => true, + "content" => $this->getContentService()->loadContent( 14 ), + ) + ), + ) +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/UserGroupFixture.php b/eZ/Publish/API/Repository/Tests/_fixtures/UserGroupFixture.php new file mode 100644 index 0000000..52d5779 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/UserGroupFixture.php @@ -0,0 +1,47 @@ +<?php +return array( + array( + 4 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub( + array( + "parentId" => 0, + "subGroupCount" => 5, + "content" => $this->getContentService()->loadContent( 4 ), + ) + ), + 11 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub( + array( + "parentId" => 4, + "subGroupCount" => 0, + "content" => $this->getContentService()->loadContent( 11 ), + ) + ), + 12 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub( + array( + "parentId" => 4, + "subGroupCount" => 0, + "content" => $this->getContentService()->loadContent( 12 ), + ) + ), + 13 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub( + array( + "parentId" => 4, + "subGroupCount" => 0, + "content" => $this->getContentService()->loadContent( 13 ), + ) + ), + 42 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub( + array( + "parentId" => 4, + "subGroupCount" => 0, + "content" => $this->getContentService()->loadContent( 42 ), + ) + ), + 59 => new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub( + array( + "parentId" => 4, + "subGroupCount" => 0, + "content" => $this->getContentService()->loadContent( 59 ), + ) + ), + ) +); diff --git a/eZ/Publish/API/Repository/Tests/_fixtures/generate-fixtures.php b/eZ/Publish/API/Repository/Tests/_fixtures/generate-fixtures.php new file mode 100755 index 0000000..6f29d8b --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/_fixtures/generate-fixtures.php @@ -0,0 +1,997 @@ +#!/usr/bin/env php +<?php +/** + * File containing a simple fixture generator + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\API\Repository\Tests; + +if ( false === isset( $argv[1] ) || false === isset( $argv[2] ) ) +{ + echo 'Usage: ', PHP_EOL, + basename( __FILE__ ), ' <dump-file> <output-dir>', PHP_EOL; + exit( 1 ); +} + +$fixture = include $argv[1]; + +writeFixtureFile( generateContentTypeGroupFixture( $fixture ), 'ContentTypeGroup', $argv[2] ); +// echo generateContentTypeFixture( $fixture ); +writeFixtureFile( generateContentTypeFixture( $fixture ), 'ContentType', $argv[2] ); +writeFixtureFile( generateSectionFixture( $fixture ), 'Section', $argv[2] ); +writeFixtureFile( generateLanguageFixture( $fixture ), 'Language', $argv[2] ); +writeFixtureFile( generateUserFixture( $fixture ), 'User', $argv[2] ); +writeFixtureFile( generateUserGroupFixture( $fixture ), 'UserGroup', $argv[2] ); +writeFixtureFile( generateRoleFixture( $fixture ), 'Role', $argv[2] ); +writeFixtureFile( generateContentInfoFixture( $fixture ), 'Content', $argv[2] ); +writeFixtureFile( generateLocationFixture( $fixture ), 'Location', $argv[2] ); +writeFixtureFile( generateURLAliasFixture( $fixture ), 'URLAlias', $argv[2] ); +writeFixtureFile( generateObjectStateGroupFixture( $fixture ), 'ObjectStateGroup', $argv[2] ); +writeFixtureFile( generateObjectStateFixture( $fixture ), 'ObjectState', $argv[2] ); + +function generateContentTypeGroupFixture( array $fixture ) +{ + $nextId = 0; + $groups = array(); + foreach ( getFixtureTable( 'ezcontentclassgroup', $fixture ) as $data ) + { + $groups[$data['id']] = array( + 'id' => $data['id'], + 'identifier' => $data['name'], + 'creationDate' => dateCreateCall( $data['created'] ), + 'modificationDate' => dateCreateCall( $data['modified'] ), + 'creatorId' => $data['creator_id'], + 'modifierId' => $data['modifier_id'] + ); + $nextId = max( $nextId, $data['id'] ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeGroupStub', $groups ), + $nextId + ); +} + +function generateContentTypeFixture( array $fixture ) +{ + $languageCodes = array(); + foreach ( getFixtureTable( 'ezcontent_language', $fixture ) as $data ) + { + $languageCodes[$data['id']] = $data['locale']; + } + + $typeNames = array(); + foreach ( getFixtureTable( 'ezcontentclass_name', $fixture ) as $data ) + { + if ( false === isset( $typeNames[$data['contentclass_id']] ) ) + { + $typeNames[$data['contentclass_id']] = array(); + } + $typeNames[$data['contentclass_id']][$data['language_locale']] = $data['name']; + } + + $typeGroups = array(); + foreach ( getFixtureTable( 'ezcontentclass_classgroup', $fixture ) as $data ) + { + if ( false === isset( $typeGroups[$data['contentclass_id']] ) ) + { + $typeGroups[$data['contentclass_id']] = array(); + } + $typeGroups[$data['contentclass_id']][] = '$scopeValues["groups"][' . valueToString( $data['group_id'] ) . ']'; + } + + list( $fieldDef, $nextFieldId ) = getContentTypeFieldDefinition( $fixture ); + + $nextTypeId = 0; + $types = array(); + foreach ( getFixtureTable( 'ezcontentclass', $fixture ) as $data ) + { + $types[$data['id']] = array( + 'id' => $data['id'], + 'status' => 0, // Type::STATUS_DEFINED + 'identifier' => $data['identifier'], + 'creationDate' => dateCreateCall( $data['created'] ), + 'modificationDate' => dateCreateCall( $data['modified'] ), + 'creatorId' => $data['creator_id'], + 'modifierId' => $data['modifier_id'], + 'remoteId' => $data['remote_id'], + // @todo: How do we build the userAliasSchema? + //'urlAliasSchema' => $data[] + 'names' => $typeNames[$data['id']], + 'descriptions' => array(), + 'nameSchema' => $data['contentobject_name'], + 'isContainer' => (boolean)$data['is_container'], + 'mainLanguageCode' => $languageCodes[$data['initial_language_id']], + 'defaultAlwaysAvailable' => (boolean)$data['always_available'], + 'defaultSortField' => $data['sort_field'], + 'defaultSortOrder' => $data['sort_order'], + + 'fieldDefinitions' => trim( generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\FieldDefinitionStub', isset( $fieldDef[$data['id']] ) ? $fieldDef[$data['id']] : array() ) ), + 'contentTypeGroups' => isset( $typeGroups[$data['id']] ) ? $typeGroups[$data['id']] : array(), + ); + + $nextTypeId = max( $nextTypeId, $data['id'] ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\ContentType\ContentTypeStub', $types ), + $nextTypeId, + $nextFieldId + ); +} + +function getContentTypeFieldDefinition( array $fixture ) +{ + $nextFieldId = 0; + $fieldDef = array(); + foreach ( getFixtureTable( 'ezcontentclass_attribute', $fixture ) as $data ) + { + if ( false === isset( $fieldDef[$data['contentclass_id']] ) ) + { + $fieldDef[$data['contentclass_id']] = array(); + } + + $names = filterTranslatedArray( unserialize( $data['serialized_name_list'] ) ); + + $description = filterTranslatedArray( unserialize( $data['serialized_description_list'] ) ); + + $fieldDef[$data['contentclass_id']][$data['id']] = array( + 'id' => (int)$data['id'], + 'identifier' => $data['identifier'], + 'fieldGroup' => $data['category'], + 'position' => (int)$data['placement'], + 'fieldTypeIdentifier' => $data['data_type_string'], + 'isTranslatable' => (boolean)$data['can_translate'], + 'isRequired' => (boolean)$data['is_required'], + 'isInfoCollector' => (boolean)$data['is_information_collector'], + 'isSearchable' => (boolean)$data['is_searchable'], + 'defaultValue' => null, + + 'names' => $names, + 'descriptions' => $description, + 'fieldSettings' => array(), + 'validatorConfiguration' => array(), + ); + + $nextFieldId = max( $nextFieldId, $data['id'] ); + } + + return array( $fieldDef, $nextFieldId ); +} + +function filterTranslatedArray( array $translated ) +{ + $filtered = array(); + foreach ( $translated as $languageCode => $translation ) + { + if ( is_string( $languageCode ) ) + { + $filtered[$languageCode] = $translation; + } + } + unset( $filtered['always-available'] ); + return $filtered; +} + +function generateSectionFixture( array $fixture ) +{ + $nextId = 0; + $sections = array(); + $identifiers = array(); + + foreach ( getFixtureTable( 'ezsection', $fixture ) as $data ) + { + $sections[$data['id']] = array( + 'id' => $data['id'], + 'name' => $data['name'], + 'identifier' => $data['identifier'], + ); + + if ( $data['identifier'] ) + { + $identifiers[$data['identifier']] = $data['id']; + } + + $nextId = max( $nextId, $data['id'] ); + } + + $assignedContents = array(); + + foreach ( getFixtureTable( 'ezcontentobject', $fixture ) as $data ) + { + $sectionId = (int)$data['section_id']; + + if ( !isset( $assignedContents[$sectionId] ) ) + { + $assignedContents[$sectionId] = array(); + } + $assignedContents[$sectionId][(int)$data['id']] = true; + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Values\Content\Section', $sections ), + generateMapping( $identifiers ), + generateMapping( $assignedContents ), + $nextId + ); +} + +function getLanguageCodes( array $fixture ) +{ + $languageCodes = array(); + foreach ( getFixtureTable( 'ezcontent_language', $fixture ) as $data ) + { + $languageCodes[$data['id']] = $data['locale']; + } + return $languageCodes; +} + +function generateContentInfoFixture( array $fixture ) +{ + $nextId = 0; + $contentInfos = array(); + $indexMap = array(); + $languageCodes = getLanguageCodes( $fixture ); + + $mainLocationIds = array(); + foreach ( getFixtureTable( 'ezcontentobject_tree', $fixture ) as $data ) + { + $mainLocationIds[$data['contentobject_id']] = $data['main_node_id']; + } + + foreach ( getFixtureTable( 'ezcontentobject', $fixture ) as $data ) + { + $indexMap[$data['remote_id']] = array( + 'versionId' => array(), + 'contentId' => array(), + ); + + $indexMap[$data['id']] = array( + 'versionId' => array(), + 'contentId' => array(), + ); + + $contentInfos[$data['id']] = array( + 'id' => $data['id'], + 'name' => $data['name'], + 'contentTypeId' => $data['contentclass_id'], + 'sectionId' => $data['section_id'], + 'currentVersionNo' => $data['current_version'], + 'published' => ( $data['published'] != 0 ), + 'ownerId' => $data['owner_id'], + 'modificationDate' => dateCreateCall( $data['modified'] ), + 'publishedDate' => dateCreateCall( $data['published'] ), + 'alwaysAvailable' => (boolean)( $data['language_mask'] & 1 ), + 'remoteId' => $data['remote_id'], + 'mainLanguageCode' => $languageCodes[$data['initial_language_id']], + 'repository' => '$this', + 'mainLocationId' => $mainLocationIds[$data['id']], + ); + $nextId = max( $nextId, $data['id'] ); + } + + list( $fieldDef ) = getContentTypeFieldDefinition( $fixture ); + + $fields = array(); + $fieldNextId = 0; + + foreach ( getFixtureTable( 'ezcontentobject_attribute', $fixture ) as $data ) + { + if ( trim( $data['data_text'] ) ) + { + $value = $data['data_text']; + } + else if ( is_numeric( $data['data_float'] ) && $data['data_float'] > 0 ) + { + $value = $data['data_float']; + } + else + { + $value = $data['data_int']; + } + + $identifier = null; + foreach ( $fieldDef as $def ) + { + if ( isset( $def[$data['contentclassattribute_id']] ) ) + { + $identifier = $def[$data['contentclassattribute_id']]['identifier']; + break; + } + } + + $fields[$data['id']] = array( + 'id' => $data['id'], + 'value' => $value, + 'languageCode' => $data['language_code'], + 'fieldDefIdentifier' => $identifier, + + 'contentId' => $data['contentobject_id'], + 'version' => $data['version'] + ); + + $fieldNextId = max( $fieldNextId, $data['id'] ); + } + + $names = array(); + foreach ( getFixtureTable( 'ezcontentobject_name', $fixture ) as $data ) + { + $objectId = $data['contentobject_id']; + $versionNo = $data['content_version']; + + if ( !isset( $names[$objectId] ) ) + { + $names[$objectId] = array(); + } + if ( !isset( $names[$objectId][$versionNo] ) ) + { + $names[$objectId][$versionNo] = array(); + } + + foreach ( $languageCodes as $bit => $code ) + { + if ( $data['language_id'] & $bit ) + { + $names[$objectId][$versionNo][$code] = $data['name']; + } + } + } + + $content = array(); + $versionInfo = array(); + $versionNextId = 0; + foreach ( getFixtureTable( 'ezcontentobject_version', $fixture ) as $data ) + { + $versionInfo[$data['id']] = array( + 'id' => $data['id'], + 'contentId' => $data['contentobject_id'], + 'status' => $data['status'] <= 2 ? $data['status'] : 1, + 'versionNo' => $data['version'], + 'modificationDate' => dateCreateCall( $data['modified'] ), + 'creatorId' => $data['creator_id'], + 'creationDate' => dateCreateCall( $data['created'] ), + 'initialLanguageCode' => $languageCodes[$data['initial_language_id']], + 'languageCodes' => array(), // @todo: Extract language codes from fields + 'repository' => '$this', + 'names' => $names[$data['contentobject_id']][$data['version']], + ); + + $versionNextId = max( $versionNextId, $data['id'] ); + + $contentFields = array(); + foreach ( $fields as $field ) + { + if ( $field['contentId'] != $data['contentobject_id'] ) + { + continue; + } + if ( $field['version'] != $data['version'] ) + { + continue; + } + + unset( $field['contentId'], $field['version'] ); + + $contentFields[] = $field; + } + + $contentFields = trim( generateValueObjects( '\eZ\Publish\API\Repository\Values\Content\Field', $contentFields ) ); + + $content[] = array( + 'id' => $data['contentobject_id'], + 'contentTypeId' => $contentInfos[$data['contentobject_id']]['contentTypeId'], + 'fields' => $contentFields, + 'versionNo' => $data['version'], + 'repository' => '$this' + ); + + $remoteId = $contentInfos[$data['contentobject_id']]['remoteId']; + + $versionId = $data['id']; + $contentId = $data['contentobject_id']; + + $indexMap[$remoteId]['versionId'][$versionId] = $versionId; + $indexMap[$remoteId]['contentId'][$contentId] = $contentId; + $indexMap[$contentId]['versionId'][$versionId] = $versionId; + $indexMap[$contentId]['contentId'][$contentId] = $contentId; + } + + uasort( + $versionInfo, + function( $versionInfo1, $versionInfo2 ) + { + if ( $versionInfo1['contentId'] === $versionInfo2['contentId'] ) + { + return $versionInfo2['versionNo'] - $versionInfo1['versionNo']; + } + return $versionInfo1['contentId'] - $versionInfo2['contentId']; + } + ); + + uasort( + $content, + function( $content1, $content2 ) + { + if ( $content1['id'] === $content2['id'] ) + { + return $content2['versionNo'] - $content1['versionNo']; + } + return $content1['id'] - $content2['id']; + } + ); + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentInfoStub', $contentInfos ), + $nextId, + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\Content\VersionInfoStub', $versionInfo ), + $versionNextId, + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub', $content ), + generateMapping( $indexMap ) + ); +} + +function generateLocationFixture( array $fixture ) +{ + $nextId = 0; + $locations = array(); + + foreach ( getFixtureTable( 'ezcontentobject_tree', $fixture ) as $data ) + { + $locations[$data['node_id']] = array( + 'id' => $data['node_id'], + 'priority' => $data['priority'], + 'hidden' => (bool)$data['is_hidden'], + 'invisible' => (bool)$data['is_invisible'], + 'remoteId' => $data['remote_id'], + 'contentInfo' => ( $data['node_id'] == 1 ? null :createRepoCall( + 'ContentService', + 'loadContentInfo', + array( $data['contentobject_id'] ) + ) ), + 'parentLocationId' => $data['parent_node_id'], + 'pathString' => $data['path_string'], + 'depth' => $data['depth'], + 'sortField' => $data['sort_field'], + 'sortOrder' => $data['sort_order'], + ); + $nextId = max( $nextId, $data['node_id'] ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\Content\LocationStub', $locations ), + $nextId + ); +} + +function createRepoCall( $serviceName, $methodName, array $params ) +{ + foreach ( $params as $id => $param ) + { + $params[$id] = valueToString( $param ); + } + return sprintf( + '$this->get%s()->%s( %s )', + $serviceName, + $methodName, + implode( ', ', $params ) + ); +} + +function dateCreateCall( $timestamp ) +{ + return sprintf( + '$this->createDateTime( %s )', + $timestamp + ); +} + +function generateLanguageFixture( array $fixture ) +{ + $nextId = 0; + $languages = array(); + $languageCodes = array(); + + foreach ( getFixtureTable( 'ezcontent_language', $fixture ) as $data ) + { + $languages[$data['id']] = array( + 'id' => $data['id'], + 'name' => $data['name'], + 'enabled' => !$data['disabled'], + 'languageCode' => $data['locale'] + ); + + $languageCodes[$data['locale']] = $data['id']; + + $nextId = max( $nextId, $data['id'] ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Values\Content\Language', $languages ), + generateMapping( $languageCodes ), + $nextId + ); +} + +function generateUserFixture( array $fixture ) +{ + $users = array(); + foreach ( getFixtureTable( 'ezuser', $fixture ) as $data ) + { + $users[] = array( + '_id' => $data['contentobject_id'], + 'login' => $data['login'], + 'email' => $data['email'], + 'passwordHash' => $data['password_hash'], + 'hashAlgorithm' => $data['password_hash_type'], + 'enabled' => true, + 'content' => '$this->getContentService()->loadContent( ' . $data['contentobject_id'] . ' )' + ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserStub', $users ) + ); +} + +function generateUserGroupFixture( array $fixture ) +{ + $classId = null; + foreach ( getFixtureTable( 'ezcontentclass', $fixture ) as $data ) + { + if ( 'user_group' === $data['identifier'] ) + { + $classId = $data['id']; + break; + } + } + + $node2parentId = array(); + $content2nodeId = array(); + foreach ( getFixtureTable( 'ezcontentobject_tree', $fixture ) as $data ) + { + $content2nodeId[$data['contentobject_id']] = $data['node_id']; + $node2parentId[$data['node_id']] = $data['parent_node_id']; + } + + $groups = array(); + foreach ( getFixtureTable( 'ezcontentobject', $fixture ) as $data ) + { + if ( $data['contentclass_id'] != $classId ) + { + continue; + } + + $parentId = null; + if ( isset( $content2nodeId[$data['id']] ) ) + { + $nodeId = $content2nodeId[$data['id']]; + if ( isset( $node2parentId[$nodeId] ) ) + { + $parentId = array_search( $node2parentId[$nodeId], $content2nodeId ); + } + } + + $groups[$data['id']] = array( + '_id' => $data['id'], + 'parentId' => is_numeric( $parentId ) ? $parentId : 'null', + 'subGroupCount' => 0, + 'content' => '$this->getContentService()->loadContent( ' . $data['id'] . ' )' + ); + } + + foreach ( $groups as $group ) + { + if ( isset( $groups[$group['parentId']] ) ) + { + ++$groups[$group['parentId']]['subGroupCount']; + } + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserGroupStub', $groups ) + ); +} + +function generateRoleFixture( array $fixture ) +{ + $nextId = 0; + $names = array(); + $roles = array(); + + foreach ( getFixtureTable( 'ezrole', $fixture ) as $data ) + { + $roles[$data['id']] = array( + 'id' => $data['id'], + 'identifier' => $data['name'] + ); + + $names[$data['name']] = $data['id']; + + $nextId = max( $nextId, $data['id'] ); + } + + $content2role = array(); + $roleLimitations = array(); + + foreach ( getFixtureTable( 'ezuser_role', $fixture ) as $data ) + { + if ( false === isset( $content2role[$data['contentobject_id']] ) ) + { + $content2role[$data['contentobject_id']] = array(); + } + $content2role[$data['contentobject_id']][$data['id']] = $data['role_id']; + + if ( '' === trim( $data['limit_identifier'] ) ) + { + continue; + } + + $roleLimitations[$data['id']] = array( + 'id' => $data['id'], + 'roleId' => $data['role_id'], + 'contentId' => $data['contentobject_id'], + 'identifier' => $data['limit_identifier'], + 'value' => array( $data['limit_value'] ) + ); + } + + $role2policy = array(); + $policies = array(); + $policyNextId = 0; + foreach ( getFixtureTable( 'ezpolicy', $fixture ) as $data ) + { + if ( false === isset( $role2policy[$data['role_id']] ) ) + { + $role2policy[$data['role_id']] = array(); + } + $role2policy[$data['role_id']][] = $data['id']; + + $policies[$data['id']] = array( + 'id' => $data['id'], + 'roleId' => $data['role_id'], + 'module' => $data['module_name'], + 'function' => $data['function_name'], + 'limitations' => array() + ); + + $policyNextId = max( $policyNextId, $data['id'] ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\User\RoleStub', $roles ), + generateMapping( $names ), + $nextId, + generateMapping( $content2role ), + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\User\PolicyStub', $policies ), + $policyNextId, + generateMapping( $role2policy ), + generateMapping( $roleLimitations ) + ); +} + +function generateURLAliasFixture( array $fixture ) +{ + $typeMap = array( + 'nop' => 2, + 'eznode' => 0, + 'module' => 1, + ); + + $languageCodes = getLanguageCodes( $fixture ); + + $nextId = 0; + $aliases = array(); + foreach ( getFixtureTable( 'ezurlalias_ml', $fixture ) as $data ) + { + if ( $data['id'] == 46 || $data['id'] == 16 || $data['id'] == 206 ) + { + // These 2 aliases are broken in the standard database, since they + // don't have a valid location assigned + continue; + } + + $destination = null; + switch ( $data['action_type'] ) + { + case 'nop': + $destination = null; + break; + + case 'eznode': + $destination = substr( $data['action'], 7 ); + break; + + case 'module': + $destination = substr( $data['action'], 7 ); + break; + } + + $aliases[$data['id']] = array( + 'id' => $data['id'], + 'type' => $typeMap[$data['action_type']], + 'destination' => $destination, + 'path' => getBaseUrlPath( $aliases, $data['parent'] ) . '/' . $data['text'], + 'languageCodes' => resolveLanguageMask( $languageCodes, $data['lang_mask'] ), + 'alwaysAvailable' => $data['lang_mask'] & 1, + 'isHistory' => !( $data['is_original'] ), + 'isCustom' => (bool)$data['is_alias'], + 'forward' => (bool)$data['alias_redirects'], + ); + $nextId = max( $nextId, $data['id'] ); + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Values\Content\URLAlias', $aliases ), + $nextId + ); +} + +function generateObjectStateGroupFixture( array $fixture ) +{ + $languageCodes = getLanguageCodes( $fixture ); + + $nextId = 0; + $groups = array(); + foreach ( getFixtureTable( 'ezcobj_state_group', $fixture ) as $data ) + { + $groups[$data['id']] = array( + 'id' => $data['id'], + 'identifier' => $data['identifier'], + 'defaultLanguageCode' => $languageCodes[$data['default_language_id']], + 'names' => array(), + 'descriptions' => array(), + ); + $nextId = max( $nextId, $data['id'] ); + } + + foreach ( getFixtureTable( 'ezcobj_state_group_language', $fixture ) as $data ) + { + $groupId = $data['contentobject_state_group_id']; + // Set lowest bit to 0 (always_available) + $langCode = $languageCodes[( $data['language_id'] & -2 )]; + + $groups[$groupId]['names'][$langCode] = $data['name']; + $groups[$groupId]['descriptions'][$langCode] = $data['description']; + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\ObjectState\ObjectStateGroupStub', $groups ), + $nextId + ); +} + +function generateObjectStateFixture( array $fixture ) +{ + $languageCodes = getLanguageCodes( $fixture ); + + $nextId = 0; + $states = array(); + $groupStateMap = array(); + $objectStateMap = array(); + // For internal use only + $stateGroupMap = array(); + + foreach ( getFixtureTable( 'ezcobj_state', $fixture ) as $data ) + { + $states[$data['id']] = array( + 'id' => $data['id'], + 'identifier' => $data['identifier'], + 'priority' => (int)$data['priority'], + 'defaultLanguageCode' => $languageCodes[$data['default_language_id']], + 'languageCodes' => resolveLanguageMask( $languageCodes, $data['language_mask'] ), + 'stateGroup' => '$scopeValues["groups"][' . valueToString( $data['group_id'] ) . ']', + 'names' => array(), + 'descriptions' => array(), + ); + $nextId = max( $nextId, $data['id'] ); + + $groupId = $data['group_id']; + if ( !isset( $groupStateMap[$groupId] ) ) + { + $groupStateMap[$groupId] = array(); + } + $groupStateMap[$groupId][$data['id']] = $data['id']; + + // For internal use only + $stateGroupMap[$data['id']] = $groupId; + } + + foreach ( getFixtureTable( 'ezcobj_state_language', $fixture ) as $data ) + { + $stateId = $data['contentobject_state_id']; + // Set lowest bit to 0 (always_available) + $langCode = $languageCodes[( $data['language_id'] & -2 )]; + + $states[$stateId]['names'][$langCode] = $data['name']; + $states[$stateId]['descriptions'][$langCode] = $data['description']; + } + + foreach ( getFixtureTable( 'ezcobj_state_link', $fixture ) as $data ) + { + $stateId = $data['contentobject_state_id']; + $objectId = $data['contentobject_id']; + + $groupId = $stateGroupMap[$stateId]; + + if ( !isset( $objectStateMap[$objectId] ) ) + { + $objectStateMap[$objectId] = array(); + } + $objectStateMap[$objectId][$groupId] = $stateId; + } + + return generateReturnArray( + generateValueObjects( '\eZ\Publish\API\Repository\Tests\Stubs\Values\ObjectState\ObjectStateStub', $states ), + var_export( $groupStateMap, true ), + var_export( $objectStateMap, true ), + $nextId + ); +} + +function resolveLanguageMask( array $languageCodes, $mask ) +{ + $assignedCodes = array(); + foreach ( $languageCodes as $id => $languageCode ) + { + if ( $mask & $id ) + { + $assignedCodes[] = $languageCode; + } + } + return $assignedCodes; +} + +function getBaseUrlPath( array $aliases, $parentId ) +{ + if ( $parentId == 0 ) + { + return ''; + } + if ( !isset( $aliases[$parentId] ) ) + { + throw new RuntimeException( sprintf( 'Alias with ID %s not found.', $parentId ) ); + } + return $aliases[$parentId]['path']; +} + +function getUser2GroupMapping( array $fixture ) +{ + $users = array(); + foreach ( getFixtureTable( 'ezuser', $fixture ) as $data ) + { + $users[] = (int)$data['contentobject_id']; + } + + $nodes = array(); + $contents = array(); + foreach ( getFixtureTable( 'ezcontentobject_tree', $fixture ) as $data ) + { + $nodes[$data['node_id']] = $data['parent_node_id']; + $contents[$data['node_id']] = $data['contentobject_id']; + } + + $groups = array(); + foreach ( $contents as $key => $contentId ) + { + if ( false === in_array( $contentId, $users ) ) + { + continue; + } + + if ( false === isset( $groups[$contentId] ) ) + { + $groups[$contentId] = array(); + } + $groups[$contentId][] = $contents[$nodes[$key]]; + } + + return $groups; +} + +function generateReturnArray() +{ + return '<?php' . PHP_EOL . + 'return array(' . PHP_EOL . + join( ',' . PHP_EOL . ' ', func_get_args() ) . PHP_EOL . + ');' . PHP_EOL; +} + +function generateMapping( array $mapping ) +{ + $code = 'array(' . PHP_EOL; + foreach ( $mapping as $key => $value ) + { + $code .= ' "' . $key . '" => ' . valueToString( $value ) . ',' . PHP_EOL; + } + $code .= ' )'; + + return $code; +} + +function generateValueObjects( $class, array $objects ) +{ + $code = ' array(' . PHP_EOL; + foreach ( $objects as $object ) + { + $code .= generateValueObject( $class, $object ); + } + $code .= ' )'; + + return $code; +} + +function generateValueObject( $class, array $object ) +{ + $id = isset( $object['id'] ) + ? $object['id'] + : $object['_id']; + $code = ' ' . $id . ' => new ' . $class . '(' . PHP_EOL . + ' array(' . PHP_EOL; + foreach ( $object as $name => $value ) + { + if ( $name[0] == '_' ) + { + continue; + } + + $code .= ' "' . $name . '" => ' . valueToString( $value ) . ',' . PHP_EOL; + } + + $code .= ' )' . PHP_EOL . + ' ),' . PHP_EOL; + + return $code; +} + +function valueToString( $value, $indent = 4 ) +{ + if ( is_numeric( $value ) ) + { + $value = $value; + } + else if ( is_bool( $value ) ) + { + $value = $value ? 'true' : 'false'; + } + else if ( is_null( $value ) ) + { + $value = 'null'; + } + else if ( is_string( $value ) && 0 !== strpos( $value, 'new \\' ) && 0 !== strpos( $value, '$scopeValues[' ) && 0 !== strpos( $value, 'array(' ) && 0 !== strpos( $value, '$this' ) ) + { + $value = '"' . str_replace( '"', '\"', $value ) . '"'; + } + else if ( is_array( $value ) ) + { + $code = 'array(' . PHP_EOL; + foreach ( $value as $key => $val ) + { + $code .= str_repeat( ' ', $indent + 1 ) . + valueToString( $key ) . + ' => ' . + valueToString( $val, $indent + 1 ) . + ',' . PHP_EOL; + } + $value = $code . str_repeat( ' ', $indent ) . ')'; + } + + return $value; +} + +function getFixtureTable( $tableName, array $fixture ) +{ + if ( isset( $fixture[$tableName] ) ) + { + return $fixture[$tableName]; + } + return array(); +} + +function writeFixtureFile( $code, $file, $dir ) +{ + file_put_contents( "{$dir}/{$file}Fixture.php", $code ); +} diff --git a/eZ/Publish/API/Repository/Tests/scripts/setupTestDatabase.php b/eZ/Publish/API/Repository/Tests/scripts/setupTestDatabase.php new file mode 100755 index 0000000..d6b81b0 --- /dev/null +++ b/eZ/Publish/API/Repository/Tests/scripts/setupTestDatabase.php @@ -0,0 +1,13 @@ +#!/usr/bin/env php +<?php + +require_once __DIR__ . '/../../../../../../bootstrap.php'; + +if ( isset( $argv[1] ) ) +{ + putenv( "DATABASE=$argv[1]" ); +} + +$setupFactory = new eZ\Publish\API\Repository\Tests\SetupFactory\Legacy(); + +$setupFactory->getRepository( true ); diff --git a/eZ/Publish/API/Repository/Translatable.php b/eZ/Publish/API/Repository/Translatable.php new file mode 100644 index 0000000..a79bf85 --- /dev/null +++ b/eZ/Publish/API/Repository/Translatable.php @@ -0,0 +1,29 @@ +<?php +/** + * File containing the eZ\Publish\API\Repository\ContentService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\API\Repository; + +/** + * Interface implemented by everything which should be translatable. This + * should for example be implemented by any exception, which might bubble up to + * a user, or validation errors. + * + * @package eZ\Publish\API\Repository + */ +interface Translatable +{ + /** + * Returns a translatable Message + * + * @return \eZ\Publish\API\Repository\Values\Translation + */ + public function getTranslatableMessage(); +} + diff --git a/eZ/Publish/API/Repository/TranslationService.php b/eZ/Publish/API/Repository/TranslationService.php new file mode 100644 index 0000000..4c80bc2 --- /dev/null +++ b/eZ/Publish/API/Repository/TranslationService.php @@ -0,0 +1,52 @@ +<?php +/** + * File containing the eZ\Publish\API\Repository\ContentService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\API\Repository; + +use eZ\Publish\API\Repository\Values\Translation; + +/** + * Interface for a translation service. + * + * Implement this to use translation backends like Symfony2 Translate, gettext + * or ezcTranslation. + * + * Call the translation method with the current target locale from your + * templates, for example. + * + * @package eZ\Publish\API\Repository + */ +interface TranslationService +{ + /** + * Translate + * + * Translate a Translation value object. + * + * @param Translation $translation + * @param string $locale + * + * @return string + */ + public function translate( Translation $translation, $locale ); + + /** + * Translate string + * + * Translate a string. Strings could be useful for the simplest cases. + * Usually you will always use Translation value objects for this. + * + * @param string $translation + * @param string $locale + * + * @return string + */ + public function translateString( $translation, $locale ); +} diff --git a/eZ/Publish/API/Repository/TrashService.php b/eZ/Publish/API/Repository/TrashService.php new file mode 100644 index 0000000..5b2b504 --- /dev/null +++ b/eZ/Publish/API/Repository/TrashService.php @@ -0,0 +1,96 @@ +<?php +/** + * File containing the eZ\Publish\API\Repository\TrashService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\API\Repository; + +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\TrashItem; +use eZ\Publish\API\Repository\Values\Content\Query; + +/** + * Trash service, used for managing trashed content + * + * @package eZ\Publish\API\Repository + */ +interface TrashService +{ + /** + * Loads a trashed location object from its $id. + * + * Note that $id is identical to original location, which has been previously trashed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the trashed location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the location with the given id does not exist + * + * @param int $trashItemId + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function loadTrashItem( $trashItemId ); + + /** + * Sends $location and all its children to trash and returns the corresponding trash item. + * + * Content is left untouched. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to trash the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return null|\eZ\Publish\API\Repository\Values\Content\TrashItem null if location was deleted, otherwise TrashItem + */ + public function trash( Location $location ); + + /** + * Recovers the $trashedLocation at its original place if possible. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to recover the trash item at the parent location location + * + * If $newParentLocation is provided, $trashedLocation will be restored under it. + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created or recovered location + */ + public function recover( TrashItem $trashItem, Location $newParentLocation = null ); + + /** + * Empties trash. + * + * All locations contained in the trash will be removed. Content objects will be removed + * if all locations of the content are gone. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to empty the trash + */ + public function emptyTrash(); + + /** + * Deletes a trash item. + * + * The corresponding content object will be removed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete this trash item + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + */ + public function deleteTrashItem( TrashItem $trashItem ); + + /** + * Returns a collection of Trashed locations contained in the trash. + * + * $query allows to filter/sort the elements to be contained in the collection. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * + * @return \eZ\Publish\API\Repository\Values\Content\SearchResult + */ + public function findTrashItems( Query $query ); +} diff --git a/eZ/Publish/API/Repository/Tutorials/eZPublicAPI/eZPublicAPI.pkg b/eZ/Publish/API/Repository/Tutorials/eZPublicAPI/eZPublicAPI.pkg new file mode 100644 index 0000000..2143d22 --- /dev/null +++ b/eZ/Publish/API/Repository/Tutorials/eZPublicAPI/eZPublicAPI.pkg @@ -0,0 +1,24 @@ + <refentry id="{@id}"> + <refnamediv> + <refname>The eZ Publish Public PHP API</refname> + <refpurpose></refpurpose> + </refnamediv> + <refsynopsisdiv> + <author> + cba + <authorblurb> + {@link mailto:cba@ez.no} + </authorblurb> + </author> + </refsynopsisdiv> + {@toc} + <refsect1 id="{@id intro}"> + <title>Concepts + + The public API is a set of service interfaces which operate on simple value objects. + The value objects are abstract classes with public properties and abstract methods for retrieving or setting + aggrate objects (where getters may be implemented with lazy loading). For all abstract methods there is an equivalent + magic setter or getter. That means that each magic getter or setter is documented by the corresponding method. + + + diff --git a/eZ/Publish/API/Repository/URLAliasService.php b/eZ/Publish/API/Repository/URLAliasService.php new file mode 100644 index 0000000..2e6bf5f --- /dev/null +++ b/eZ/Publish/API/Repository/URLAliasService.php @@ -0,0 +1,138 @@ +getContentInfo() + * @property-read \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType convenience getter for getVersionInfo()->getContentInfo()->contentType ( @deprecated Use getVersionInfo()->getContentInfo()->contentTypeId ) + * @property-read mixed $id convenience getter for retrieving the contentId: $versionInfo->contentInfo->id + * @property-read \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo calls getVersionInfo() + * @property-read array $fields access fields, calls getFields() + */ +abstract class Content extends ValueObject +{ + /** + * Returns the VersionInfo for this version + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + abstract public function getVersionInfo(); + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + abstract public function getFieldValue( $fieldDefIdentifier, $languageCode = null ); + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} + */ + abstract public function getFields(); + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} with field identifier as keys + */ + abstract public function getFieldsByLanguage( $languageCode = null ); +} diff --git a/eZ/Publish/API/Repository/Values/Content/ContentCreateStruct.php b/eZ/Publish/API/Repository/Values/Content/ContentCreateStruct.php new file mode 100644 index 0000000..1c5a0ef --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/ContentCreateStruct.php @@ -0,0 +1,93 @@ +remoteId string value. + * + * @var string + */ + public $remoteId; + + /** + * the main language code for the content. This language will also + * be used for as initial language for the first created version. + * It is also used as default language for added fields. + * + * @required + * + * @var string + */ + public $mainLanguageCode; + + /** + * Modification date. If not given the current timestamp is used. + * + * @var \DateTime + */ + public $modificationDate; + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + abstract public function setField( $fieldDefIdentifier, $value, $language = null ); +} diff --git a/eZ/Publish/API/Repository/Values/Content/ContentInfo.php b/eZ/Publish/API/Repository/Values/Content/ContentInfo.php new file mode 100644 index 0000000..6c56cd0 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/ContentInfo.php @@ -0,0 +1,125 @@ +remoteId string value. + * + * @var string + */ + public $remoteId; + + /** + * If set main location is changed to this value. + * + * If the content object has multiple locations, + * $mainLocationId will point to the main one. + * + * @var mixed + */ + public $mainLocationId; +} diff --git a/eZ/Publish/API/Repository/Values/Content/ContentUpdateStruct.php b/eZ/Publish/API/Repository/Values/Content/ContentUpdateStruct.php new file mode 100644 index 0000000..5c85477 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/ContentUpdateStruct.php @@ -0,0 +1,41 @@ +id + * @property-read mixed $id the id of the location + * @property-read int $priority Position of the Location among its siblings when sorted using priority + * @property-read boolean $hidden Indicates that the Location is implicitly marked as hidden by a parent location. + * @property-read boolean $invisible Indicates that the Location is implicitly marked as hidden by a parent location + * @property-read string $remoteId a global unique id of the content object + * @property-read mixed $parentLocationId the id of the parent location + * @property-read string $pathString the path to this location e.g. /1/2/4/23 where 23 is current id. + * @property-read string $path Same as $pathString but as array, e.g. [ 1, 2, 4, 23 ] + * @property-read int $depth Depth location has in the location tree + * @property-read int $sortField Specifies which property the child locations should be sorted on. Valid values are found at {@link Location::SORT_FIELD_*} + * @property-read int $sortOrder Specifies whether the sort order should be ascending or descending. Valid values are {@link Location::SORT_ORDER_*} + */ +abstract class Location extends ValueObject +{ + // @todo Rename these to better fit current naming, also reuse these in Persistence or copy the change over. + const SORT_FIELD_PATH = 1; + const SORT_FIELD_PUBLISHED = 2; + const SORT_FIELD_MODIFIED = 3; + const SORT_FIELD_SECTION = 4; + const SORT_FIELD_DEPTH = 5; + const SORT_FIELD_CLASS_IDENTIFIER = 6; + const SORT_FIELD_CLASS_NAME = 7; + const SORT_FIELD_PRIORITY = 8; + const SORT_FIELD_NAME = 9; + const SORT_FIELD_MODIFIED_SUBNODE = 10; + const SORT_FIELD_NODE_ID = 11; + const SORT_FIELD_CONTENTOBJECT_ID = 12; + + const SORT_ORDER_DESC = 0; + const SORT_ORDER_ASC = 1; + + /** + * Location ID. + * + * @var mixed Location ID. + */ + protected $id; + + /** + * Location priority + * + * Position of the Location among its siblings when sorted using priority + * sort order. + * + * @var int + */ + protected $priority; + + /** + * Indicates that the Location entity has been explicitly marked as hidden. + * + * @var boolean + */ + protected $hidden; + + /** + * Indicates that the Location is implicitly marked as hidden by a parent + * location. + * + * @var boolean + */ + protected $invisible; + + /** + * Remote ID. + * + * A universally unique identifier. + * + * @var mixed + */ + protected $remoteId; + + /** + * Returns the content info of the content object of this location + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + abstract public function getContentInfo(); + + /** + * Parent ID. + * + * @var mixed Location ID. + */ + protected $parentLocationId; + + /** + * The materialized path of the location entry, eg: /1/2/ + * + * @var string + */ + protected $pathString; + + /** + * Depth location has in the location tree. + * + * @var int + */ + protected $depth; + + /** + * Specifies which property the child locations should be sorted on. + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + protected $sortField; + + /** + * Specifies whether the sort order should be ascending or descending. + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + protected $sortOrder; +} diff --git a/eZ/Publish/API/Repository/Values/Content/LocationCreateStruct.php b/eZ/Publish/API/Repository/Values/Content/LocationCreateStruct.php new file mode 100644 index 0000000..7dc2fe2 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/LocationCreateStruct.php @@ -0,0 +1,71 @@ +remoteId string value. + * + * @var mixed + */ + public $remoteId; + + /** + * Specifies which property the child locations should be sorted on. + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField = Location::SORT_FIELD_NAME; + + /** + * Specifies whether the sort order should be ascending or descending. + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder = Location::SORT_ORDER_ASC; + + /** + * The id of the parent location under which the new location should be created. + * + * @required + * + * @var mixed + */ + public $parentLocationId; +} diff --git a/eZ/Publish/API/Repository/Values/Content/LocationList.php b/eZ/Publish/API/Repository/Values/Content/LocationList.php new file mode 100644 index 0000000..95c5d8e --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/LocationList.php @@ -0,0 +1,37 @@ +remoteId string value. + * + * @var mixed + */ + public $remoteId; + + /** + * If set the sortField is changed. + * The sort field specifies which property the child locations should be sorted on. + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField; + + /** + * If set the sortOrder is changed. + * The sort order specifies whether the sort order should be ascending or descending. + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder; +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query.php b/eZ/Publish/API/Repository/Values/Content/Query.php new file mode 100644 index 0000000..551809c --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query.php @@ -0,0 +1,65 @@ +getSpecifications() as $operatorSpecifications ) + { + if ( $operatorSpecifications->operator != $operator ) + { + continue; + } + $operatorFound = true; + + // input format check (single/array) + switch ( $operatorSpecifications->valueFormat ) + { + case Specifications::FORMAT_SINGLE: + if ( is_array( $value ) ) + { + throw new InvalidArgumentException( "The Criterion expects a single value" ); + } + break; + + case Specifications::FORMAT_ARRAY: + if ( !is_array( $value ) ) + { + throw new InvalidArgumentException( "The criterion expects an array of values" ); + } + break; + } + + // input value check + if ( $operatorSpecifications->valueTypes !== null ) + { + $callback = $this->getValueTypeCheckCallback( $operatorSpecifications->valueTypes ); + if ( !is_array( $value ) ) + { + $value = array( $value ); + } + foreach ( $value as $item ) + { + if ( $callback( $item ) === false ) + { + throw new InvalidArgumentException( "Unsupported value (" . gettype( $item ) . ")$item" ); + } + } + } + } + + // Operator wasn't found in the criterion specifications + if ( $operatorFound == false ) + { + throw new InvalidArgumentException( "Operator $operator isn't supported by the Criterion " . get_class( $this ) ); + } + + $this->operator = $operator; + $this->value = $value; + $this->target = $target; + } + + /** + * Returns a callback that checks the values types depending on the operator specifications + * @param int $valueTypes The accepted values, as a bit field of Specifications::TYPE_* constants + * + * @return \Closure + */ + private function getValueTypeCheckCallback( $valueTypes ) + { + $callback = function( $value ) + { + return false; + }; + + // the callback code will return true as soon as an accepted value type is found + if ( $valueTypes & Specifications::TYPE_INTEGER ) + { + $callback = function( $value ) use ( $callback ) + { + return is_numeric( $value ) || $callback( $value ); + }; + } + if ( $valueTypes & Specifications::TYPE_STRING ) + { + $callback = function( $value ) use ( $callback ) + { + return is_string( $value ) || $callback( $value ); + }; + } + if ( $valueTypes & Specifications::TYPE_BOOLEAN ) + { + $callback = function( $value ) use ( $callback ) + { + return is_bool( $value ) || $callback( $value ); + }; + } + + return $callback; + } + + public static function createFromQueryBuilder( $target, $operator, $value ) + { + return new static( $target, $operator, $value ); + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ContentId.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ContentId.php new file mode 100644 index 0000000..872db02 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ContentId.php @@ -0,0 +1,51 @@ + + * $createdCriterion = new Criterion\DateMetadata( + * Criterion\DateMetadata::CREATED, + * Operator::GTE, + * strtotime( 'yesterday' ) + * ); + * + */ +class DateMetadata extends Criterion implements CriterionInterface +{ + /** + * DateMetadata target: modification date + */ + const MODIFIED = 'modified'; + + /** + * DateMetadata target: creation date + */ + const CREATED = 'created'; + + /** + * Creates a new DateMetadata criterion on $metadata + * + * @throws \InvalidArgumentException If target is unknown + * + * @param string $target One of DateMetadata::CREATED or DateMetadata::MODIFIED + * @param string $operator One of the Operator constants + * @param mixed $value The match value, either as an array of as a single value, depending on the operator + */ + public function __construct( $target, $operator, $value ) + { + if ( $target != self::MODIFIED && $target != self::CREATED ) + { + throw new InvalidArgumentException( "Unknown DateMetadata $target" ); + } + parent::__construct( $target, $operator, $value ); + } + + public function getSpecifications() + { + return array( + new Specifications( + Operator::EQ, Specifications::FORMAT_SINGLE, Specifications::TYPE_INTEGER + ), + new Specifications( + Operator::GT, Specifications::FORMAT_SINGLE, Specifications::TYPE_INTEGER + ), + new Specifications( + Operator::GTE, Specifications::FORMAT_SINGLE, Specifications::TYPE_INTEGER + ), + new Specifications( + Operator::LT, Specifications::FORMAT_SINGLE, Specifications::TYPE_INTEGER + ), + new Specifications( + Operator::LTE, Specifications::FORMAT_SINGLE, Specifications::TYPE_INTEGER + ), + new Specifications( + Operator::IN, Specifications::FORMAT_ARRAY, Specifications::TYPE_INTEGER + ), + new Specifications( + Operator::BETWEEN, Specifications::FORMAT_ARRAY, Specifications::TYPE_INTEGER, 2 + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Field.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Field.php new file mode 100644 index 0000000..1adf061 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Field.php @@ -0,0 +1,51 @@ +fieldDefIdentifier + * + * @param string $fieldIdentifier The target field identifier + * @param string $operator The match operator + * @param mixed $value The value to match against + */ + public function __construct( $fieldIdentifier, $operator, $value ) + { + parent::__construct( $fieldIdentifier, $operator, $value ); + } + + public function getSpecifications() + { + return array( + new Specifications( Operator::IN, Specifications::FORMAT_ARRAY ), + new Specifications( Operator::EQ, Specifications::FORMAT_SINGLE ), + new Specifications( Operator::GT, Specifications::FORMAT_SINGLE ), + new Specifications( Operator::GTE, Specifications::FORMAT_SINGLE ), + new Specifications( Operator::LT, Specifications::FORMAT_SINGLE ), + new Specifications( Operator::LTE, Specifications::FORMAT_SINGLE ), + new Specifications( Operator::LIKE, Specifications::FORMAT_SINGLE ), + new Specifications( Operator::BETWEEN, Specifications::FORMAT_ARRAY, null, 2 ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/FullText.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/FullText.php new file mode 100644 index 0000000..1eccea0 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/FullText.php @@ -0,0 +1,59 @@ +criteria[] = $criterion; + } + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/LogicalOr.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/LogicalOr.php new file mode 100644 index 0000000..78d07ed --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/LogicalOr.php @@ -0,0 +1,28 @@ +type = $type; + + parent::__construct( null, null, $value ); + } + + public function getSpecifications() + { + return array( + new Specifications( Operator::EQ, Specifications::FORMAT_SINGLE ) + ); + + } + + public static function createFromQueryBuilder( $target, $operator, $value ) + { + return new self( $value ); + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ObjectStateId.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ObjectStateId.php new file mode 100644 index 0000000..edb71d1 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ObjectStateId.php @@ -0,0 +1,58 @@ +"; + const GTE = ">="; + const LT = "<"; + const LTE = "<="; + const IN = "in"; + const BETWEEN = "between"; + const LIKE = "like"; +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Operator/Specifications.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Operator/Specifications.php new file mode 100644 index 0000000..9baa85f --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Operator/Specifications.php @@ -0,0 +1,81 @@ +operator = $operator; + $this->valueFormat = $valueFormat; + $this->valueTypes = $valueTypes; + $this->valueCount = $valueCount; + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ParentLocationId.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ParentLocationId.php new file mode 100644 index 0000000..5d5bd06 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/ParentLocationId.php @@ -0,0 +1,60 @@ + + * $createdCriterion = new Criterion\UserMetadata( + * Criterion\UserMetadata::CREATOR, + * Operator::IN, + * array( 10, 14 ) + * ); + * + */ +class UserMetadata extends Criterion implements CriterionInterface +{ + /** + * UserMetadata target: Owner user + */ + const OWNER = 'owner'; + + /** + * UserMetadata target: Owner user group + */ + const GROUP = 'group'; + + /** + * UserMetadata target: Creator + */ + const CREATOR = 'creator'; + + /** + * UserMetadata target: Modifier + */ + const MODIFIER = 'modifier'; + + /** + * Creates a new UserMetadata criterion on $metadata + * + * @throws \InvalidArgumentException If target is unknown + * + * @param string $target One of UserMetadata::OWNER, UserMetadata::GROUP, UserMetadata::CREATED or UserMetadata::MODIFIED + * @param string $operator One of the Operator constants + * @param mixed $value The match value, either as an array of as a single value, depending on the operator + */ + public function __construct( $target, $operator, $value ) + { + if ( $target != self::OWNER && $target != self::GROUP && $target != self::CREATOR && $target != self::MODIFIER ) + { + throw new InvalidArgumentException( "Unknown UserMetadata $target" ); + } + parent::__construct( $target, $operator, $value ); + } + + public function getSpecifications() + { + return array( + new Specifications( + Operator::EQ, Specifications::FORMAT_SINGLE, Specifications::TYPE_INTEGER | Specifications::TYPE_STRING + ), + new Specifications( + Operator::IN, Specifications::FORMAT_ARRAY, Specifications::TYPE_INTEGER | Specifications::TYPE_STRING + ), + ); + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Visibility.php b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Visibility.php new file mode 100644 index 0000000..dcaba06 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/Criterion/Visibility.php @@ -0,0 +1,64 @@ + + * // IN and EQ are supported + * return array( + * // The EQ operator expects a single value, either as an integer or a string + * new Specifications( + * Operator::EQ, + * Specifications::INPUT_TYPE_SINGLE, + * array( Specifications::INPUT_VALUE_INTEGER, Specifications::INPUT_VALUE_STRING ), + * ), + * // The IN operator expects an array of values, of either integers or strings + * new Specifications( + * Operator::IN, + * Specifications::INPUT_TYPE_ARRAY, + * array( Specifications::INPUT_VALUE_INTEGER, Specifications::INPUT_VALUE_STRING ) + * ) + * )* + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator\Specifications[] + */ + public function getSpecifications(); +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/FacetBuilder.php b/eZ/Publish/API/Repository/Values/Content/Query/FacetBuilder.php new file mode 100644 index 0000000..a7efc94 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/FacetBuilder.php @@ -0,0 +1,57 @@ +direction = $sortDirection; + $this->target = $sortTarget; + + if ( $targetData !== null ) + { + $this->targetData = $targetData; + } + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Query/SortClause/ContentId.php b/eZ/Publish/API/Repository/Values/Content/Query/SortClause/ContentId.php new file mode 100644 index 0000000..8e4028d --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Query/SortClause/ContentId.php @@ -0,0 +1,30 @@ +typeIdentifier = $typeIdentifier; + $this->fieldIdentifier = $fieldIdentifier; + } +} diff --git a/eZ/Publish/API/Repository/Values/Content/Relation.php b/eZ/Publish/API/Repository/Values/Content/Relation.php new file mode 100644 index 0000000..3577916 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/Relation.php @@ -0,0 +1,91 @@ +identifier string value. + * + * @var string + */ + public $identifier; + + /** + * If set the name of the section is changed + * + * @var string + */ + public $name; +} diff --git a/eZ/Publish/API/Repository/Values/Content/TranslationInfo.php b/eZ/Publish/API/Repository/Values/Content/TranslationInfo.php new file mode 100644 index 0000000..3de794b --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/TranslationInfo.php @@ -0,0 +1,48 @@ +getContentInfo() + */ +class TranslationInfo extends ValueObject +{ + /** + * the language code of the source language of the translation + * + * @var string + */ + public $sourceLanguageCode; + + /** + * the language code of the destination language of the translation + * + * @var string + */ + public $destinationLanguageCode; + + /** + * the source version this translation is based on + * + * @var VersionInfo + */ + public $srcVersionInfo; + + /** + * the destination version this translation is placed in + * + * @var VersionInfo + */ + public $destinationVersionInfo; +} diff --git a/eZ/Publish/API/Repository/Values/Content/TranslationValues.php b/eZ/Publish/API/Repository/Values/Content/TranslationValues.php new file mode 100644 index 0000000..3b10cbd --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/TranslationValues.php @@ -0,0 +1,31 @@ +-) + * + * @var string + */ + protected $id; + + /** + * The type of the URL Alias i.e. one of URLAlias::LOCATION, URLAlias::RESOURCE, URLAlias::VIRTUAL + * + * @var int + */ + protected $type; + + /** + * If type = URLAlias::LOCATION it is a Location id + * otherwise a string (e.g. /content/search) + * + * @var mixed + */ + protected $destination; + + /** + * the full path of the alias + * + * @var string + */ + protected $path; + + /** + * The languageCodes for which this path is valid + * + * @var string[] + */ + protected $languageCodes; + + /** + * Fallback indicator for other languages + * + * @var boolean + */ + protected $alwaysAvailable; + + /** + * Indicates that this alias was autogenerated for an in the meanwhile archived version of the content + * + * @var boolean + */ + protected $isHistory; + + /** + * If false this alias was autogenerated otherwise manually created + * + * @var boolean + */ + protected $isCustom; + + /** + * Indicates if the url should be redirected + * + * @var boolean + */ + protected $forward; +} diff --git a/eZ/Publish/API/Repository/Values/Content/URLWildcard.php b/eZ/Publish/API/Repository/Values/Content/URLWildcard.php new file mode 100644 index 0000000..4ec569b --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Content/URLWildcard.php @@ -0,0 +1,52 @@ + + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getNames(); + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + abstract public function getName( $languageCode ); + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getDescriptions(); + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + abstract public function getDescription( $languageCode ); + + /** + * String identifier of a content type + * + * @var string + */ + protected $identifier; + + /** + * Creation date of the content type + * + * @var \DateTime + */ + protected $creationDate; + + /** + * Modification date of the content type + * + * @var \DateTime + */ + protected $modificationDate; + + /** + * Creator user id of the content type + * + * @var mixed + */ + protected $creatorId; + + /** + * Modifier user id of the content type + * + * @var mixed + * + */ + protected $modifierId; + + /** + * Unique remote ID of the content type + * + * @var string + */ + protected $remoteId; + + /** + * URL alias schema. + * + * If nothing is provided, $nameSchema will be used instead. + * + * @var string + */ + protected $urlAliasSchema; + + /** + * Name schema. + * + * Can be composed of FieldDefinition identifier place holders. + * These place holders must comply this pattern : . + * An OR condition can be used : + * + * In this example, field_def will be used if available. If not, other_field_def will be used for content name generation + * + * @var string + */ + protected $nameSchema; + + /** + * Determines if the type is a container + * + * @var boolean + */ + protected $isContainer; + + /** + * Main language + * + * @var string + */ + protected $mainLanguageCode; + + /** + * If an instance of a content type is created the always available flag is set + * by default to this value. + * + * @var boolean + */ + protected $defaultAlwaysAvailable = true; + + /** + * Specifies which property the child locations should be sorted on by default when created + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + protected $defaultSortField; + + /** + * Specifies whether the sort order should be ascending or descending by default when created + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + protected $defaultSortOrder; + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + abstract public function getContentTypeGroups(); + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + abstract public function getFieldDefinitions(); + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + abstract public function getFieldDefinition( $fieldDefinitionIdentifier ); +} diff --git a/eZ/Publish/API/Repository/Values/ContentType/ContentTypeCreateStruct.php b/eZ/Publish/API/Repository/Values/ContentType/ContentTypeCreateStruct.php new file mode 100644 index 0000000..5c6ade1 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/ContentType/ContentTypeCreateStruct.php @@ -0,0 +1,130 @@ + + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getNames(); + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + abstract public function getName( $languageCode ); + + /** + * This method returns the human readable description of the field + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getDescriptions(); + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + abstract public function getDescription( $languageCode ); + + /** + * Field group name + * + * @var string + */ + protected $fieldGroup; + + /** + * the position of the field definition in the content typr + * + * @var int + */ + protected $position; + + /** + * String identifier of the field type + * + * @var string + */ + protected $fieldTypeIdentifier; + + /** + * If the field is translatable + * + * @var boolean + */ + protected $isTranslatable; + + /** + * Is the field required + * + * @var boolean + */ + protected $isRequired; + + /** + * the flag if this field is used for information collection + * + * @var boolean + */ + protected $isInfoCollector; + + /** + * This method returns the validator configuration of this field definition supported by the field type + * + * @return mixed + */ + abstract public function getValidatorConfiguration(); + + /** + * This method returns settings for the field definition supported by the field type + * + * @return mixed + */ + abstract public function getFieldSettings(); + + /** + * Default value of the field + * + * @var mixed + */ + protected $defaultValue; + + /** + * Indicates if th the content is searchable by this attribute + * + * @var boolean + */ + protected $isSearchable; +} diff --git a/eZ/Publish/API/Repository/Values/ContentType/FieldDefinitionCreateStruct.php b/eZ/Publish/API/Repository/Values/ContentType/FieldDefinitionCreateStruct.php new file mode 100644 index 0000000..a8b2f9b --- /dev/null +++ b/eZ/Publish/API/Repository/Values/ContentType/FieldDefinitionCreateStruct.php @@ -0,0 +1,116 @@ + + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getNames(); + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + abstract public function getName( $languageCode ); + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getDescriptions(); + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + abstract public function getDescription( $languageCode ); + + /** + * The object state group this object state belongs to + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + abstract public function getObjectStateGroup(); + +} diff --git a/eZ/Publish/API/Repository/Values/ObjectState/ObjectStateCreateStruct.php b/eZ/Publish/API/Repository/Values/ObjectState/ObjectStateCreateStruct.php new file mode 100644 index 0000000..6251f62 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/ObjectState/ObjectStateCreateStruct.php @@ -0,0 +1,61 @@ + + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getNames(); + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + abstract public function getName( $languageCode ); + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * + * array( 'eng' => '', 'de' => '' ); + * + * + * @return string[] + */ + abstract public function getDescriptions(); + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + abstract public function getDescription( $languageCode ); + +} diff --git a/eZ/Publish/API/Repository/Values/ObjectState/ObjectStateGroupCreateStruct.php b/eZ/Publish/API/Repository/Values/ObjectState/ObjectStateGroupCreateStruct.php new file mode 100644 index 0000000..43aae15 --- /dev/null +++ b/eZ/Publish/API/Repository/Values/ObjectState/ObjectStateGroupCreateStruct.php @@ -0,0 +1,53 @@ +message = $message; + $this->values = $values; + } +} + diff --git a/eZ/Publish/API/Repository/Values/Translation/Plural.php b/eZ/Publish/API/Repository/Values/Translation/Plural.php new file mode 100644 index 0000000..9cc636f --- /dev/null +++ b/eZ/Publish/API/Repository/Values/Translation/Plural.php @@ -0,0 +1,79 @@ +singular = $singular; + $this->plural = $plural; + $this->values = $values; + } +} diff --git a/eZ/Publish/API/Repository/Values/User/Limitation.php b/eZ/Publish/API/Repository/Values/User/Limitation.php new file mode 100644 index 0000000..e144c5d --- /dev/null +++ b/eZ/Publish/API/Repository/Values/User/Limitation.php @@ -0,0 +1,53 @@ + <$var> in class doc in addition to inline property doc. + * Writable properties must be public and must be documented inline. + * + * @package eZ\Publish\API\Repository\Values + */ +abstract class ValueObject +{ + /** + * Construct object optionally with a set of properties + * + * Readonly properties values must be set using $properties as they are not writable anymore + * after object has been created. + * + * @param array $properties + */ + public function __construct( array $properties = array() ) + { + foreach ( $properties as $property => $value ) + { + $this->$property = $value; + } + } + + /** + * Function where list of properties are returned + * + * Used by {@see attributes()}, override to add dynamic properties + * @uses __isset() + * + * @todo Make object traversable and reuse this function there (hence why this is not exposed) + * + * @param array $dynamicProperties Additional dynamic properties exposed on the object + * + * @return array + */ + protected function getProperties( $dynamicProperties = array() ) + { + $properties = $dynamicProperties; + foreach ( get_object_vars( $this ) as $property => $propertyValue ) + { + if ( $this->__isset( $property ) ) + $properties[] = $property; + } + return $properties; + } + + /** + * Magic set function handling writes to non public properties + * + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException When property does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException When property is readonly (protected) + * + * @param string $property Name of the property + * @param string $value + * + * @return void + */ + public function __set( $property, $value ) + { + if ( property_exists( $this, $property ) ) + { + throw new PropertyReadOnlyException( $property, get_class( $this ) ); + } + throw new PropertyNotFoundException( $property, get_class( $this ) ); + } + + /** + * Magic get function handling read to non public properties + * + * Returns value for all readonly (protected) properties. + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException exception on all reads to undefined properties so typos are not silently accepted. + * + * @param string $property Name of the property + * + * @return mixed + */ + public function __get( $property ) + { + if ( property_exists( $this, $property ) ) + { + return $this->$property; + } + throw new PropertyNotFoundException( $property, get_class( $this ) ); + } + + /** + * Magic isset function handling isset() to non public properties + * + * Returns true for all (public/)protected/private properties. + * + * @param string $property Name of the property + * + * @return boolean + */ + public function __isset( $property ) + { + return property_exists( $this, $property ); + } + + /** + * Magic unset function handling unset() to non public properties + * + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException exception on all writes to undefined properties so typos are not silently accepted and + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException exception on readonly (protected) properties. + * + * @uses __set() + * @param string $property Name of the property + * + * @return boolean + */ + public function __unset( $property ) + { + $this->__set( $property, null ); + } + + /** + * Returns a new instance of this class with the data specified by $array. + * + * $array contains all the data members of this class in the form: + * array('member_name'=>value). + * + * __set_state makes this class exportable with var_export. + * var_export() generates code, that calls this method when it + * is parsed with PHP. + * + * @param mixed[] $array + * + * @return ValueObject + */ + static public function __set_state( array $array ) + { + return new static( $array ); + } + + /** + * Internal function for Legacy template engine compatibility to get property value + * + * @access private + * @deprecated Since 5.0, available purely for legacy eZTemplate compatibility + * @uses __get() + * + * @param string $property + * + * @return mixed + */ + final public function attribute( $property ) + { + return $this->__get( $property ); + } + + /** + * Internal function for Legacy template engine compatibility to get properties + * + * @access private + * @deprecated Since 5.0, available purely for legacy eZTemplate compatibility + * @uses __isset() + * + * @return array + */ + final public function attributes() + { + return $this->getProperties(); + } + + /** + * Internal function for Legacy template engine compatibility to check existence of property + * + * @access private + * @deprecated Since 5.0, available purely for legacy eZTemplate compatibility + * @uses __isset() + * + * @param string $property + * + * @return boolean + */ + final public function hasAttribute( $property ) + { + return $this->__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Base/Configuration.php b/eZ/Publish/Core/Base/Configuration.php new file mode 100644 index 0000000..8d04027 --- /dev/null +++ b/eZ/Publish/Core/Base/Configuration.php @@ -0,0 +1,594 @@ +moduleName = $moduleName; + $this->paths = $paths; + $this->globalConfiguration = $globalConfiguration; + + if ( isset( $globalConfiguration['base']['Configuration']['CacheFilePermission'] ) ) + $this->filePermission = $globalConfiguration['base']['Configuration']['CacheFilePermission']; + + if ( isset( $globalConfiguration['base']['Configuration']['CacheDirPermission'] ) ) + $this->dirPermission = $globalConfiguration['base']['Configuration']['CacheDirPermission']; + } + + /** + * Get raw instance override path list data. + * + * @throws InvalidArgumentValue If scope has wrong value + * @param string $scope See {@link $globalPaths} for scope values (first level keys) + * + * @return array + */ + public function getDirs( $scope = null ) + { + if ( $scope === null ) + return $this->paths; + if ( !isset( $this->paths[$scope] ) ) + throw new InvalidArgumentValue( 'scope', $scope, get_class( $this ) ); + + return $this->paths[$scope]; + } + + /** + * Get cache hash based on override dirs + * + * @return string md5 hash + */ + protected function pathsHash() + { + if ( $this->pathsHash === '' ) + { + $this->pathsHash = md5( serialize( $this->paths ) ); + } + return $this->pathsHash; + } + + /** + * Reload cache data conditionally if path hash has changed on current instance + */ + public function reload() + { + if ( !isset( $this->raw['hash'] ) || $this->raw['hash'] !== $this->pathsHash() ) + $this->load(); + } + + /** + * Loads the configuration from cache or from source (if $useCache is false or there is no cache) + * + * @param boolean|null $hasCache Lets you specify if there is a cache file, will check if null and $useCache is true + * @param boolean $useCache Will skip using cached config files (slow), when null depends on [ini]\use-cache setting + */ + public function load( $hasCache = null, $useCache = null ) + { + $cacheName = $this->createCacheName( $this->pathsHash() ); + if ( $useCache === null ) + { + $useCache = + isset( $this->globalConfiguration['base']['Configuration']['UseCache'] ) + ? $this->globalConfiguration['base']['Configuration']['UseCache'] + : false; + } + + if ( $hasCache === null && $useCache ) + { + $hasCache = $this->hasCache( $cacheName ); + } + + if ( $hasCache && $useCache ) + { + $this->raw = $this->readCache( $cacheName ); + $hasCache = $this->raw !== null; + } + + if ( !$hasCache ) + { + $sourceFiles = array(); + $configurationData = $this->parse( $this->getDirs(), $sourceFiles ); + $this->raw = $this->generateRawData( $this->pathsHash(), $configurationData, $sourceFiles, $this->getDirs() ); + + if ( $useCache ) + { + $this->storeCache( $cacheName, $this->raw ); + } + } + + // Merge global settings (not cached as they are runtime settings) + if ( !isset( $this->globalConfiguration[ $this->moduleName ] ) ) + return; + + foreach ( $this->globalConfiguration[ $this->moduleName ] as $section => $globalSettings ) + { + if ( !isset( $this->raw['data'][$section] ) ) + { + $this->raw['data'][$section] = $globalSettings; + continue; + } + + $this->setGlobalConfig( $globalSettings, $this->raw['data'][$section] ); + } + } + + /** + * Recursively set global configuration + * + * @param array $globalSettings + * @param array $conf + */ + protected function setGlobalConfig( array $globalSettings, array &$conf ) + { + foreach ( $globalSettings as $key => $globalSetting ) + { + if ( !empty( $conf[$key] ) && !is_numeric( $key ) && is_array( $conf[$key] ) && is_array( $globalSetting ) ) + $this->setGlobalConfig( $globalSetting, $conf[$key] ); + else + $conf[$key] = $globalSetting; + } + } + + /** + * Create cache name. + * + * @param string $configurationPathsHash + * + * @return string + */ + protected function createCacheName( $configurationPathsHash ) + { + return $this->moduleName . '-' . $configurationPathsHash; + } + + /** + * Check if cache file exists. + * + * @param string $cacheName As generated by {@link createCacheName()} + * + * @return boolean + */ + protected function hasCache( $cacheName ) + { + return is_file( self::CONFIG_CACHE_DIR . $cacheName . '.php' ); + } + + /** + * Loads cache file, use {@link hasCache()} to make sure it exists first! + * + * @param string $cacheName As generated by {@link createCacheName()} + * + * @return array|null + */ + protected function readCache( $cacheName ) + { + $cacheData = include self::CONFIG_CACHE_DIR . $cacheName . '.php'; + + // Check that cache has + if ( !isset( $cacheData['data'] ) || $cacheData['rev'] !== self::CONFIG_CACHE_REV ) + { + return null; + } + + // Check modified time if dev mode + if ( isset( $this->globalConfiguration['base']['Configuration']['DevelopmentMode'] ) + && $this->globalConfiguration['base']['Configuration']['DevelopmentMode'] ) + { + $currentTime = time(); + foreach ( $cacheData['files'] as $inputFile ) + { + $fileTime = is_file( $inputFile ) ? filemtime( $inputFile ) : false; + // Refresh cache & input files if file is gone + if ( $fileTime === false ) + { + return null; + } + if ( $fileTime > $currentTime ) + { + trigger_error( __METHOD__ . ': Input file "' . $inputFile . '" has a timestamp higher then current time, ignoring to avoid infinite recursion!', E_USER_WARNING ); + } + // Refresh cache if file has been changed + else if ( $fileTime > $cacheData['created'] ) + { + return null; + } + } + } + return $cacheData; + } + + /** + * Generate raw data for use in cache + * + * @param string $configurationPathsHash + * @param array $configurationData + * @param array $sourceFiles Optional, stored in cache to be able to check modified time in future devMode + * @param array $sourcePaths Optional, stored in cache to be able to debug it more easily + * + * @return array + */ + protected function generateRawData( $configurationPathsHash, array $configurationData, array $sourceFiles = array(), array $sourcePaths = array() ) + { + return array( + 'hash' => $configurationPathsHash, + 'paths' => $sourcePaths, + 'files' => $sourceFiles, + 'data' => $configurationData, + 'created' => time(), + 'rev' => self::CONFIG_CACHE_REV, + ); + } + + /** + * Parse configuration files + * + * Uses configured parsers to do the file parsing pr file, and then merges the result from them and: + * - Handles array clearing + * - Handles section extends ( "Section:Base" extends "Base" ) + * + * @param array $configurationPaths + * @param array $sourceFiles ByRef value or source files that has been/is going to be parsed + * files you pass in will not be checked if they exists. + * @throws \eZ\Publish\Core\Base\Exceptions\BadConfiguration If no parser have been defined + * + * @return array Data structure for parsed ini files + */ + protected function parse( array $configurationPaths, array &$sourceFiles ) + { + if ( empty( $this->globalConfiguration['base']['Configuration']['Parsers'] ) ) + { + throw new BadConfiguration( 'base\[Configuration]\Parsers', 'Could not parse configuration files' ); + } + $parsers = $this->globalConfiguration['base']['Configuration']['Parsers']; + foreach ( $configurationPaths as $scopeArray ) + { + foreach ( $scopeArray as $settingsDir ) + { + foreach ( $parsers as $suffix => $parser ) + { + $fileName = $settingsDir . $this->moduleName . $suffix; + if ( !isset( $sourceFiles[$fileName] ) && is_file( $fileName ) ) + { + $sourceFiles[$fileName] = $suffix; + } + } + } + } + + // No source files, no configuration + if ( empty( $sourceFiles ) ) + { + return array(); + } + + $configurationData = array(); + $configurationFileData = array(); + foreach ( $sourceFiles as $fileName => $suffix ) + { + if ( !$parsers[$suffix] instanceof Parser ) + $parsers[$suffix] = new $parsers[$suffix]( $this->globalConfiguration['base']['Configuration'] ); + + $configurationFileData[$fileName] = $parsers[$suffix]->parse( $fileName, file_get_contents( $fileName ) ); + } + + // Post processing to unset array self::TEMP_INI_UNSET_VAR values as set by parser to indicate array clearing + // and to merge configuration data from all configuration files + $extendedConfigurationFileData = array(); + foreach ( $configurationFileData as $fileName => $data ) + { + foreach ( $data as $section => $sectionArray ) + { + // Leave settings that extend others for second pass, key by depth + if ( ( $count = substr_count( $section, ':' ) ) !== 0 ) + { + $extendedConfigurationFileData[$count][$fileName][$section] = $sectionArray; + continue; + } + + if ( !isset( $configurationData[$section] ) ) + $configurationData[$section] = array(); + + $this->recursiveArrayClearing( $sectionArray, $configurationData[$section] ); + } + } + + // Second pass post processing dealing with settings that extends others + ksort( $extendedConfigurationFileData, SORT_NUMERIC ); + foreach ( $extendedConfigurationFileData as $configurationFileData ) + { + foreach ( $configurationFileData as $data ) + { + foreach ( $data as $section => $sectionArray ) + { + if ( !isset( $configurationData[$section] ) ) + { + $parent = substr( $section, stripos( $section, ':' ) + 1 ); + if ( isset( $configurationData[$parent] ) ) + $configurationData[$section] = $configurationData[$parent]; + else + $configurationData[$section] = array(); + } + + $this->recursiveArrayClearing( $sectionArray, $configurationData[$section] ); + } + } + } + + return $configurationData; + } + + /** + * Recursively clear array values + * + * @param array $iniArray + * @param array|null $configurationPiece + */ + protected function recursiveArrayClearing( array $iniArray, &$configurationPiece ) + { + foreach ( $iniArray as $setting => $settingValue ) + { + if ( isset( $settingValue[0] ) && $settingValue[0] === self::TEMP_INI_UNSET_VAR ) + { + array_shift( $settingValue ); + $configurationPiece[$setting] = $settingValue; + } + else if ( is_array( $settingValue ) ) + { + $this->recursiveArrayClearing( $settingValue, $configurationPiece[$setting] ); + } + else + { + $configurationPiece[$setting] = $settingValue; + } + } + + } + + /** + * Store cache file, overwrites any existing file + * + * @param string $cacheName As generated by {@link createCacheName()} + * @param array $rawData As generated by {@link generateRawData()} + */ + protected function storeCache( $cacheName, array $rawData ) + { + try + { + // Create ini dir if it does not exist + if ( !is_dir( self::CONFIG_CACHE_DIR ) ) + { + mkdir( self::CONFIG_CACHE_DIR, $this->dirPermission, true ); + } + + // Create cache hash + $cachedFile = self::CONFIG_CACHE_DIR . $cacheName . '.php'; + + // Store cache + $generator = new ezcPhpGenerator( $cachedFile ); + $generator->appendComment( "This file is auto generated based on configuration files for '{$this->moduleName}' module. Do not edit!" ); + $generator->appendComment( "Time created (server time): " . date( DATE_RFC822, $rawData['created'] ) ); + $generator->appendEmptyLines(); + + $generator->appendValueAssignment( 'cacheData', $rawData ); + $generator->appendCustomCode( 'return $cacheData;' ); + + $generator->finish(); + + // make sure file has correct file permissions + chmod( $cachedFile, $this->filePermission ); + } + catch ( Exception $e ) + { + // constructor : ezcBaseFileNotFoundException or ezcBaseFilePermissionException + // all other calls : ezcPhpGeneratorException + trigger_error( __METHOD__ . ': '. $e->getMessage(), E_USER_WARNING ); + } + } + + /** + * Gets a configuration value, or $fallBackValue if undefined + * Triggers warning if key is not set and $fallBackValue is null + * + * @param string $section The configuration section to get value for + * @param string $key The configuration key to get value for + * @param mixed $fallBackValue value to return if setting is undefined. + * + * @return mixed|null (null if key is undefined and no $fallBackValue is provided) + */ + public function get( $section, $key, $fallBackValue = null ) + { + if ( isset( $this->raw['data'][$section][$key] ) ) + { + return $this->raw['data'][$section][$key]; + } + if ( $fallBackValue === null ) + { + trigger_error( __METHOD__ . " could not find {$this->moduleName}.ini\[{$section}]$key setting", E_USER_WARNING ); + } + return $fallBackValue; + } + + /** + * Gets a configuration values for a section or $fallBackValue if undefined + * Triggers warning if section is not set and $fallBackValue is null + * + * @param string $section The configuration section to get value for + * @param mixed $fallBackValue value to return if section is undefined. + * + * @return array|null (null if key is undefined and no $fallBackValue is provided) + */ + public function getSection( $section, $fallBackValue = null ) + { + if ( isset( $this->raw['data'][$section] ) ) + { + return $this->raw['data'][$section]; + } + if ( $fallBackValue === null ) + { + trigger_error( __METHOD__ . " could not find {$this->moduleName}.ini\[{$section}]setting", E_USER_WARNING ); + } + return $fallBackValue; + } + + /** + * Gets all section and configuration value + * + * @return array + */ + public function getAll() + { + return $this->raw['data']; + } + + /** + * Gets a configuration value, or null if not set. + * + * @param string $section The configuration section to get value for + * @param string $key The configuration key to get value for + * @param mixed $value value to return if setting is not defined. + * + * @return boolean Return true if section existed and was overwritten + */ + public function set( $section, $key, $value = null ) + { + if ( isset( $this->raw['data'][$section] ) ) + { + $this->raw['data'][$section][$key] = $value; + return true; + } + + $this->raw['data'][$section] = array( $key => $value ); + return false; + } + + /** + * Checks if a configuration section and optionally key is set. + * + * @param string $section + * @param string $key Optional, only checks if section exists if null + * + * @return boolean Return true if setting exist + */ + public function has( $section, $key = null ) + { + if ( $key === null ) + return isset( $this->raw['data'][$section] ); + + return isset( $this->raw['data'][$section][$key] ); + } + + /** + * Checks if a configuration section & key is set and has a value. + * (ie. a check using !empty()) + * + * @param string $section + * @param string $key + * + * @return boolean Return true if setting exist and has value + */ + public function hasValue( $section, $key ) + { + return !empty( $this->raw['data'][$section][$key] ); + } +} diff --git a/eZ/Publish/Core/Base/Configuration/Parser.php b/eZ/Publish/Core/Base/Configuration/Parser.php new file mode 100644 index 0000000..045c0dc --- /dev/null +++ b/eZ/Publish/Core/Base/Configuration/Parser.php @@ -0,0 +1,74 @@ + array( + * 'list' => array( + * '__UNSET__', + * 'item', + * false, + * ), + * 'var' => true, + * 'num' => 2, + * 'float' => 1.2, + * 'string' => '1,5', + * ) + * ) + * + * @todo Define exceptions + */ + public function parse( $fileName, $fileContent ); + + /** + * Store raw configuration data to file + * + * @see parse() For $configurationData definition + * @param string $fileName A valid file name, will be overwritten if it exists + * @param array $configurationData + * + * @todo Define exceptions + */ + public function write( $fileName, array $configurationData ); +} diff --git a/eZ/Publish/Core/Base/Configuration/Parser/Ini.php b/eZ/Publish/Core/Base/Configuration/Parser/Ini.php new file mode 100644 index 0000000..2e35f5f --- /dev/null +++ b/eZ/Publish/Core/Base/Configuration/Parser/Ini.php @@ -0,0 +1,529 @@ +strictMode = $settings['IniParserStrict']; + + if ( isset( $settings['CacheFilePermission'] ) ) + $this->filePermission = $settings['CacheFilePermission']; + + if ( isset( $settings['CacheDirPermission'] ) ) + $this->dirPermission = $settings['CacheDirPermission']; + } + + /** + * Parse file and return raw configuration data + * + * @todo Change impl to use exceptions instead of trigger_error in most cases + * + * @param string $fileName A valid file name + * @param string $fileContent + * + * @return array + */ + public function parse( $fileName, $fileContent ) + { + if ( !$this->strictMode ) + { + return $this->parseFileEzc( $fileContent ); + } + + $configurationData = $this->parseFilePhp( $fileContent ); + if ( $configurationData === false ) + { + trigger_error( + "parse_ini_string( {$fileName} ) failed, see warning for line number. ", + E_USER_NOTICE + ); + return array(); + } + return $configurationData; + } + + /** + * Parse configuration file using parse_ini_string (only supported on php 5.3 and up) + * + * This parser is stricter then ezcConfigurationIniReader and does not support many of + * the ini files eZ Publish use because things like regex as ini variable and so on. + * + * @param string $fileContent + * + * @return array|false Data structure for parsed ini file or false if it fails + */ + protected function parseFilePhp( $fileContent ) + { + // First some pre processing to normalize result with ezc result (avoid 'true' becoming '1') + $fileContent = str_replace( + array( '#', "\r\n", "\r", "=true\n", "=false\n" ), + array( ';', "\n", "\n", "=" . self::TEMP_INI_TRUE_VAR . "\n", "=" . self::TEMP_INI_FALSE_VAR . "\n" ), + $fileContent . "\n" + ); + $fileContent = $this->parserPhpDimensionArraySupport( $fileContent ); + $fileContent = $this->parserClearArraySupport( $fileContent ); + $fileContent = $this->parserPhpQuoteSupport( $fileContent ); + + // Parse string + $configurationData = parse_ini_string( $fileContent, true ); + + // Post processing to turn en/disabled back to bool values (like ezc parser does for true/false strings) + // cast numeric values and unset array self::TEMP_INI_UNSET_VAR values as set in {@link self::parserClearArraySupport()} + if ( $configurationData === false ) + { + return $configurationData; + } + + foreach ( $configurationData as $section => $sectionArray ) + { + foreach ( $sectionArray as $setting => $settingValue ) + { + if ( is_array( $settingValue ) ) + { + $configurationData[$section][$setting] = self::parsePhpPostArrayFilter( $configurationData[$section][$setting] ); + } + else + { + $configurationData[$section][$setting] = self::parsePhpPostFilter( $settingValue ); + } + } + } + return $configurationData; + } + + /** + * Parse configuration file using ezcConfigurationIniReader + * + * @todo Change impl to use exceptions instead of trigger_error + * + * @param string $fileContent + * + * @return array Data structure for parsed ini file + */ + protected function parseFileEzc( $fileContent ) + { + // First some pre processing to normalize result with parse_ini_string result + $fileContent = str_replace( array( "\r\n", "\r" ), "\n", $fileContent . "\n" ); + $fileContent = preg_replace( array( '/^<\?php[^\/]\/\*\s*/', '/\*\/[^\?]\?>/' ), '', $fileContent ); + $fileContent = preg_replace_callback( + '/\n\[(\w+):[^\]]+\]\n/', + function ( $matches ) + { + // replace ':' in section names as it is not supported by ezcConfigurationIniReader + return str_replace( ':', '__EXT__', $matches[0] ); + }, + $fileContent + ); + $fileContent = $this->parserClearArraySupport( $fileContent ); + + // Create ini dir if it does not exist + if ( !is_dir( Configuration::CONFIG_CACHE_DIR ) ) + mkdir( Configuration::CONFIG_CACHE_DIR, $this->dirPermission, true ); + + // Create temp file + $tempFileName = Configuration::CONFIG_CACHE_DIR . 'temp-' . mt_rand() . '.tmp.ini'; + if ( file_put_contents( $tempFileName, $fileContent ) === false ) + { + trigger_error( __METHOD__ . ": temporary ini file ($tempFileName) needed for ini parsing not writable!", E_USER_WARNING ); + return array(); + } + + // Parse string + try + { + $reader = new ezcConfigurationIniReader( $tempFileName ); + $configuration = $reader->load(); + } + catch ( Exception $e) + { + trigger_error( __METHOD__ . ': Caught exception: ' . $e->getMessage() . " \n[" . $e->getFile() . ' (' . $e->getLine() . ')]', E_USER_WARNING ); + } + + $configurationData = array(); + $result = $reader->validate(); + if ( !$result->isValid ) + { + foreach ( $result->getResultList() as $resultItem ) + { + trigger_error( __METHOD__ . ': ezc parser error in ' . $resultItem->file . ':' . $resultItem->line . ':' . $resultItem->column. ': ' . $resultItem->details, E_USER_WARNING ); + } + } + else if ( $configuration instanceof ezcConfiguration ) + { + $configurationData = $configuration->getAllSettings(); + foreach ( $configurationData as $section => $sectionArray ) + { + // Fix : in section name + if ( stripos( $section, '__EXT__' ) !== false ) + { + unset( $configurationData[$section] ); + $section = str_replace( '__EXT__', ':', $section ); + $configurationData[$section] = $sectionArray; + } + + foreach ( $sectionArray as $setting => $value ) + { + // fix appending ##! and such lines + if ( isset( $value[0] ) && is_string( $value ) && strpos( $value, '#' ) !== false ) + { + $value = explode( '#', $value ); + $configurationData[$section][$setting] = $value[0]; + } + } + } + } + else + { + trigger_error( __METHOD__ . ': $configuration not instanceof ezcConfiguration', E_USER_WARNING ); + } + // Remove temp file + unlink( $tempFileName ); + return $configurationData; + } + + /** + * Pre processing needed for php ini parsers to support three dimensional arrays + * + * Injects constants which is later cleaned up in {@link parsePhpPostArrayFilter()}. + * + * @param string $fileContent + * + * @return string + */ + protected function parserPhpDimensionArraySupport( $fileContent ) + { + if ( preg_match_all( "/^([\w_-]+)\[([\w_-]+)?\]\[([\w_-]+)?\](\[([\w_-]+)?\])?(\[([\w_-]+)?\])?(\[([\w_-]+)?\])?/m", $fileContent, $valueArray, PREG_OFFSET_CAPTURE ) ) + { + $offsetDiff = 0;// Since we use offset captured before replace operations, we need to maintain an offset diff + foreach ( $valueArray[0] as $key => $match ) + { + // Variable name + $replaceString = $valueArray[1][$key][0] . '['; + + // If first key is empty use $key to make it unique + if ( empty( $valueArray[2][$key][0] ) ) + $replaceString .= $key; + else + $replaceString .= $valueArray[2][$key][0]; + + // Add key separator + $replaceString .= self::TEMP_INI_KEY_VAR; + + // If second key is empty use $key to make it unique + if ( empty( $valueArray[3][$key][0] ) ) + $replaceString .= $key; + else + $replaceString .= $valueArray[3][$key][0]; + + if ( !empty( $valueArray[4][$key][0] ) ) + { + $replaceString .= self::TEMP_INI_KEY_VAR; + if ( empty( $valueArray[5][$key][0] ) ) + $replaceString .= $key; + else + $replaceString .= $valueArray[5][$key][0]; + } + + if ( !empty( $valueArray[6][$key][0] ) ) + { + $replaceString .= self::TEMP_INI_KEY_VAR; + if ( empty( $valueArray[7][$key][0] ) ) + $replaceString .= $key; + else + $replaceString .= $valueArray[7][$key][0]; + } + + if ( !empty( $valueArray[8][$key][0] ) ) + { + $replaceString .= self::TEMP_INI_KEY_VAR; + if ( empty( $valueArray[9][$key][0] ) ) + $replaceString .= $key; + else + $replaceString .= $valueArray[9][$key][0]; + } + + $replaceString .= ']'; + + $fileContent = substr_replace( $fileContent, $replaceString, $match[1] + $offsetDiff, strlen( $match[0] ) ); + $offsetDiff += strlen( $replaceString ) - strlen( $match[0] ); + } + } + return $fileContent; + } + /** + * Pre processing needed for php ini parsers to support quotes in values + * + * Injects constants which is later cleaned up in {@link parsePhpPostArrayFilter()}. + * + * @param string $fileContent + * + * @return string + */ + protected function parserPhpQuoteSupport( $fileContent ) + { + if ( preg_match_all( "/^([^=]+)=([^'\n]+)?'(([^'\n]+)'(([^'\n]+)')?)?/m", $fileContent, $valueArray, PREG_OFFSET_CAPTURE ) ) + { + $offsetDiff = 0;// Since we use offset captured before replace operations, we need to maintain an offset diff + foreach ( $valueArray[0] as $key => $match ) + { + // Variable name + $replaceString = $valueArray[1][$key][0] . '='; + + // If first key is empty use $key to make it unique + if ( !empty( $valueArray[2][$key][0] ) ) + $replaceString .= $valueArray[2][$key][0]; + + $replaceString .= self::TEMP_INI_QUOTE_VAR; + + if ( !empty( $valueArray[4][$key][0] ) ) + { + $replaceString .= $valueArray[4][$key][0]; + $replaceString .= self::TEMP_INI_QUOTE_VAR; + } + + if ( !empty( $valueArray[6][$key][0] ) ) + { + $replaceString .= $valueArray[6][$key][0]; + $replaceString .= self::TEMP_INI_QUOTE_VAR; + } + + $fileContent = substr_replace( $fileContent, $replaceString, $match[1] + $offsetDiff, strlen( $match[0] ) ); + $offsetDiff += strlen( $replaceString ) - strlen( $match[0] ); + } + } + return $fileContent; + } + + /** + * Common pre processing needed for both ezc and php parsers + * + * Marks array clearing, so post parser code in {@link Configuration::parse()} can detect it + * + * @param string $fileContent + * + * @return string + */ + protected function parserClearArraySupport( $fileContent ) + { + if ( preg_match_all( "/^([\w_-]+)\[([\w_-]+)?\](\[([\w_-]+)?\])?$/m", $fileContent, $valueArray ) ) + { + foreach ( $valueArray[0] as $variableArrayClearing ) + { + $fileContent = str_replace( "\n$variableArrayClearing\n", "\n$variableArrayClearing=" . Configuration::TEMP_INI_UNSET_VAR . "\n", $fileContent ); + } + } + return $fileContent; + } + + /** + * Transform temporary values the php equivalent to make sure parsed ini settings + * are the same as with ezcConfigurationIniReader. + * + * @param mixed $iniValue + * + * @return mixed + */ + protected static function parsePhpPostFilter( $iniValue ) + { + if ( $iniValue === self::TEMP_INI_TRUE_VAR ) + return true; + + if ( $iniValue === self::TEMP_INI_FALSE_VAR ) + return false; + + if ( is_numeric( $iniValue ) ) + { + if ( strpos( $iniValue, '.' ) !== false ) + return (float)$iniValue; + + return (int)$iniValue; + } + + if ( $iniValue === self::TEMP_INI_QUOTE_VAR ) + return '\''; + + if ( strpos( $iniValue, self::TEMP_INI_QUOTE_VAR ) !== false ) + $iniValue = str_replace( self::TEMP_INI_QUOTE_VAR, '\'', $iniValue ); + + if ( isset( $iniValue[1] ) && is_string( $iniValue ) ) + return rtrim( $iniValue, ' ' ); + + return $iniValue; + } + + /** + * Transform temporary array values the php equivalent to make sure parsed ini settings + * are the same as with ezcConfigurationIniReader. + * + * Deals specifically with post parse fixes for three dimensional arrays. + * + * @param array $array + * + * @return array + */ + protected static function parsePhpPostArrayFilter( array $array ) + { + $newArray = array(); + foreach ( $array as $key => $value ) + { + if ( strpos( $key, self::TEMP_INI_KEY_VAR ) !== false ) + { + $subKeys = explode( self::TEMP_INI_KEY_VAR, $key ); + $value = self::parsePhpPostFilter( $value ); + foreach ( array_reverse( $subKeys ) as $subKey ) + { + if ( is_numeric( $subKey[0] ) ) + $value = array( $value ); + else + $value = array( $subKey => $value ); + } + + $newArray = array_merge_recursive( $newArray, $value ); + } + else + { + $newArray[ $key ] = self::parsePhpPostFilter( $value ); + } + } + return $newArray; + } + + /** + * Store raw configuration data to file + * + * @see eZ\Publish\Core\Base\Configuration\Parser::parse() For $configurationData definition + * @todo Test.. + * @param string $fileName A valid file name, will be overwritten if it exists + * @param array $configurationData + */ + public function write( $fileName, array $configurationData ) + { + if ( !is_writable( $fileName ) ) + { + throw new LogicException( "{$fileName} is not writable", "can not save configuration data!" ); + } + + if ( strpos( $fileName, '.php', 1 ) !== false ) + { + $iniStr = " $sectionData ) + { + $iniStr .= "\n\n[{$section}]"; + foreach ( $sectionData as $var => $value ) + { + if ( $value === true ) + { + $iniStr .= "\n{$var}=true"; + } + else if ( $value === false ) + { + $iniStr .= "\n{$var}=false"; + } + else if ( is_array( $value ) ) + { + if ( empty( $value ) ) + { + $iniStr .= "\n{$var}[]"; + continue; + } + foreach ( $value as $arrayKey => $arrayValue ) + { + if ( $arrayValue === Configuration::TEMP_INI_UNSET_VAR ) + { + $iniStr .= "\n{$var}[]"; + } + else if ( is_string( $arrayKey ) ) + { + $iniStr .= "\n{$var}[{$arrayKey}]={$arrayValue}"; + } + else + { + $iniStr .= "\n{$var}[]={$arrayValue}"; + } + } + } + } + } + file_put_contents( $fileName, $iniStr, LOCK_EX ); + } +} diff --git a/eZ/Publish/Core/Base/ConfigurationManager.php b/eZ/Publish/Core/Base/ConfigurationManager.php new file mode 100644 index 0000000..24f957b --- /dev/null +++ b/eZ/Publish/Core/Base/ConfigurationManager.php @@ -0,0 +1,187 @@ +getConfiguration( 'base' )->get( 'ClassLoader', 'Repositories' ); + * + * + * Usage2: + * + * $array = $manager->getConfiguration( 'content' )->get( 'Fields', 'Type' ); + * + * + * @uses \ezcPhpGenerator When generating cache files. + */ +class ConfigurationManager +{ + /** + * The global configuration path array, scoped in the order they should be parsed + * + * Usually something like: + * array( + * 'base' => array( 'settings/' ), + * 'modules' => array(), + * 'access' => array(), + * 'global' => array( 'settings/override/' ), + * ) + * @var array + */ + protected $globalPaths; + + /** + * The global configuration data (overrides all other configuration) + * + * @var array + */ + protected $globalConfiguration = array(); + + /** + * List of instances pr settings type (array key). + * + * @var Configuration[] + */ + protected $instances = array(); + + /** + * Create a instance of Configuration Manager + * + * @param array $globalConfiguration + */ + public function __construct( + array $globalConfiguration, + array $globalPaths = array( + 'base' => array( 'settings/' ), + 'modules' => array( 'eZ/Publish/Core/settings/' ), + 'access' => array(), + 'global' => array( 'settings/override/' ), + ) + ) + { + $this->globalConfiguration = $globalConfiguration; + $this->globalPaths = $globalPaths; + } + + /** + * Get configuration instance and load it automatically + * + * @uses load() Used the first time an instance is created + * @param string $moduleName The name of the module (w/o .ini suffix as we would want to support other formats in the future) + * + * @return \eZ\Publish\Core\Base\Configuration + */ + public function getConfiguration( $moduleName = 'base' ) + { + if ( !isset( $this->instances[ $moduleName ] ) ) + { + $this->instances[ $moduleName ] = new Configuration( + $moduleName, + $this->globalPaths, + $this->globalConfiguration + ); + $this->instances[ $moduleName ]->load(); + } + return $this->instances[ $moduleName ]; + } + + /** + * Get global configuration data. + * + * @return array + */ + public function getGlobalConfiguration() + { + return $this->globalConfiguration; + } + + /** + * Get raw global override path list data. + * + * @throws InvalidArgumentValue If scope has wrong value + * @param string $scope See {@link $globalPaths} for scope values (first level keys) + * + * @return array + */ + public function getGlobalDirs( $scope = null ) + { + if ( $scope === null ) + return $this->globalPaths; + if ( !isset( $this->globalPaths[$scope] ) ) + throw new InvalidArgumentValue( 'scope', $scope, __CLASS__ ); + + return $this->globalPaths[$scope]; + } + + /** + * Set raw global override path list data. + * + * Note: Full reset of Configuration instances are done when this function is called. + * + * @throws InvalidArgumentValue If scope has wrong value + * @param array $paths + * @param string $scope See {@link $globalPaths} for scope values (first level keys) + * + * @return boolean Return true if paths actually changed, and thus instances where reset. + */ + public function setGlobalDirs( array $paths, $scope = null ) + { + if ( $scope === null ) + { + if ( $this->globalPaths === $paths ) + return false; + $this->globalPaths = $paths; + } + else if ( !isset( $this->globalPaths[$scope] ) ) + { + throw new InvalidArgumentValue( 'scope', $scope, get_class( $this ) ); + } + else if ( $this->globalPaths[$scope] === $paths ) + { + return false; + } + else + { + $this->globalPaths[$scope] = $paths; + } + + $this->reset(); + return true; + } + + /** + * Reset instance list, in most cases it should be enough to call reloadAll + * + * @param string|null $moduleName Optionally Reset a specific instance if string + */ + public function reset( $moduleName = null ) + { + if ( $moduleName === null ) + { + $this->instances = array(); + } + else + unset( $this->instances[ $moduleName ] ); + } +} diff --git a/eZ/Publish/Core/Base/Exceptions/BadConfiguration.php b/eZ/Publish/Core/Base/Exceptions/BadConfiguration.php new file mode 100644 index 0000000..81ad123 --- /dev/null +++ b/eZ/Publish/Core/Base/Exceptions/BadConfiguration.php @@ -0,0 +1,39 @@ + + * $fieldErrors = $exception->getFieldErrors(); + * $fieldErrors["43"]["eng-GB"]->getTranslatableMessage(); + * + * + * @var \eZ\Publish\Core\FieldType\ValidationError[] + */ + protected $errors; + + /** + * Generates: Content fields did not validate + * + * Also sets the given $fieldErrors to the internal property, retrievable by getFieldErrors() + * + * @param \eZ\Publish\Core\FieldType\ValidationError[] $errors + */ + public function __construct( array $errors ) + { + $this->errors = $errors; + parent::__construct( "Content fields did not validate" ); + } + + /** + * Returns an array of field validation error messages + * + * @return \eZ\Publish\Core\FieldType\ValidationError[] + */ + public function getFieldErrors() + { + return $this->errors; + } +} diff --git a/eZ/Publish/Core/Base/Exceptions/ContentTypeFieldDefinitionValidationException.php b/eZ/Publish/Core/Base/Exceptions/ContentTypeFieldDefinitionValidationException.php new file mode 100644 index 0000000..a70176f --- /dev/null +++ b/eZ/Publish/Core/Base/Exceptions/ContentTypeFieldDefinitionValidationException.php @@ -0,0 +1,55 @@ + + * $fieldErrors = $exception->getFieldErrors(); + * $fieldErrors["43"]["eng-GB"]->getTranslatableMessage(); + * + * + * @var \eZ\Publish\Core\FieldType\ValidationError[] + */ + protected $errors; + + /** + * Generates: Content fields did not validate + * + * Also sets the given $fieldErrors to the internal property, retrievable by getFieldErrors() + * + * @param \eZ\Publish\Core\FieldType\ValidationError[] $errors + */ + public function __construct( array $errors ) + { + // var_dump( $errors ); + $this->errors = $errors; + parent::__construct( "ContentType FieldDefinitions did not validate" ); + } + + /** + * Returns an array of field validation error messages + * + * @return \eZ\Publish\Core\FieldType\ValidationError[] + */ + public function getFieldErrors() + { + return $this->errors; + } +} diff --git a/eZ/Publish/Core/Base/Exceptions/ContentValidationException.php b/eZ/Publish/Core/Base/Exceptions/ContentValidationException.php new file mode 100644 index 0000000..e942277 --- /dev/null +++ b/eZ/Publish/Core/Base/Exceptions/ContentValidationException.php @@ -0,0 +1,19 @@ + $value ) + { + $identificationString .= $identificationString === '' ? ' with' : ' and'; + $identificationString .= " {$name} '{$value}'"; + } + } + + parent::__construct( + "User does not have access to '{$function}' '{$module}'" . $identificationString, + self::UNAUTHORIZED, + $previous + ); + } +} diff --git a/eZ/Publish/Core/Base/ServiceContainer.php b/eZ/Publish/Core/Base/ServiceContainer.php new file mode 100644 index 0000000..9d63928 --- /dev/null +++ b/eZ/Publish/Core/Base/ServiceContainer.php @@ -0,0 +1,403 @@ +getConfiguration( 'service' )->getAll() ); + * $sc->getRepository->getContentService()...; + * + * Or overriding $dependencies (in unit tests): + * ( $dependencies keys should have same value as service.ini "arguments" values explained bellow ) + * + * $sc = new eZ\Publish\Core\Base\ServiceContainer( + * $configManager->getConfiguration( 'service' )->getAll(), + * array( + * '@persistence_handler' => new \eZ\Publish\Core\Persistence\InMemory\Handler() + * ) + * ); + * $sc->getRepository->getContentService()...; + * + * Settings are defined in service.ini like the following example: + * + * [repository] + * class=eZ\Publish\Core\Base\Repository + * arguments[persistence_handler]=@persistence_handler_inmemory + * + * [persistence_handler_inmemory] + * class=eZ\Publish\Core\Persistence\InMemory\Handler + * + * # @see \eZ\Publish\Core\settings\service.ini For more options and examples. + * + * "arguments" values in service.ini can start with either @ in case of other services being dependency, $ if a + * predefined global variable is to be used ( currently: $_SERVER, $_REQUEST, $_COOKIE, $_FILES ) + * or plain scalar if that is to be given directly as argument value. + * If the argument value starts with %, then it is a lazy loaded service provided as a callback (closure). + */ +class ServiceContainer implements Container +{ + /** + * Holds service objects and variables + * + * @var object[] + */ + private $dependencies; + + /** + * Array of optional settings overrides + * + * @var array[] + */ + private $settings; + + /** + * Construct object with optional configuration overrides + * + * @param array $settings Services settings + * @param mixed[]|object[] $dependencies Optional initial dependencies + */ + public function __construct( array $settings, array $dependencies = array() ) + { + // Set parameters as $dependencies, globals and settings parameters + $parameters = array( + '$_SERVER' => $_SERVER, + '$_REQUEST' => $_REQUEST, + '$_COOKIE' => $_COOKIE, + '$_FILES' => $_FILES, + '$_POST' => $_POST, + '$_GET' => $_GET, + ); + + if ( !empty( $settings['parameters'] ) ) + { + foreach ( $settings['parameters'] as $parameterKey => $parameter ) + { + $parameters['$' . $parameterKey ] = $parameter; + } + unset( $settings['parameters'] ); + } + + // Set properties + $this->settings = $settings; + $this->dependencies = $dependencies + $parameters; + } + + /** + * Service function to get Repository object + * + * Alias with type hints for $repo->get( 'repository' ); + * + * @uses get() + * + * @return \eZ\Publish\API\Repository\Repository + */ + public function getRepository() + { + if ( isset( $this->dependencies['@repository'] ) ) + return $this->dependencies['@repository']; + return $this->get( 'repository' ); + } + + /** + * Get a variable dependency + * + * @param string $variable + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException + * + * @return mixed + */ + public function getVariable( $variable ) + { + $variableKey = "\${$variable}"; + if ( isset( $this->dependencies[$variableKey] ) ) + { + return $this->dependencies[$variableKey]; + } + + throw new InvalidArgumentException( + "{$variableKey}", + 'Could not find this variable among existing dependencies' + ); + } + + /** + * Get service by name + * + * @uses lookupArguments() + * @throws \eZ\Publish\Core\Base\Exceptions\BadConfiguration + * @throws \eZ\Publish\Core\Base\Exceptions\MissingClass + * @param string $serviceName + * + * @return object + */ + public function get( $serviceName ) + { + // If you have endless loop here; Congrats, you have recursive aliases! + do + { + // Return directly if it already exists + if ( isset( $this->dependencies["@{$serviceName}"] ) ) + return $this->dependencies["@{$serviceName}"]; + + // Validate settings + if ( empty( $this->settings[$serviceName] ) ) + throw new BadConfiguration( "service\\[{$serviceName}]", "no settings exist for '{$serviceName}'" ); + + $origServiceName = $serviceName; + if ( isset( $this->settings[$serviceName]['alias'] ) ) + $serviceName = $this->settings[$serviceName]['alias']; + } + while ( $origServiceName !== $serviceName ); + + $settings = $this->settings[$serviceName] + array( 'shared' => true ); + if ( empty( $settings['class'] ) ) + { + throw new BadConfiguration( "service\\[{$serviceName}]\\class", 'class setting is not defined' ); + } + else if ( !class_exists( $settings['class'] ) ) + { + throw new MissingClass( $settings['class'], 'service' ); + } + + // Expand arguments with other service objects on arguments that start with @ and predefined variables that start with $ + if ( !empty( $settings['arguments'] ) ) + { + $arguments = $this->lookupArguments( $settings['arguments'], true ); + } + else + { + $arguments = array(); + } + + // Create new object + if ( !empty( $settings['factory'] ) ) + { + $serviceObject = call_user_func_array( "{$settings['class']}::{$settings['factory']}", $arguments ); + } + else if ( empty( $arguments ) ) + { + $serviceObject = new $settings['class'](); + } + else if ( isset( $arguments[0] ) && !isset( $arguments[2] ) ) + { + if ( !isset( $arguments[1] ) ) + $serviceObject = new $settings['class']( $arguments[0] ); + else + $serviceObject = new $settings['class']( $arguments[0], $arguments[1] ); + } + else + { + $reflectionObj = new ReflectionClass( $settings['class'] ); + $serviceObject = $reflectionObj->newInstanceArgs( $arguments ); + } + + if ( $settings['shared'] ) + $this->dependencies["@{$serviceName}"] = $serviceObject; + + if ( !empty( $settings['method'] ) ) + { + $list = $this->recursivelyLookupArguments( $settings['method'] ); + foreach ( $list as $methodName => $arguments ) + { + foreach ( $arguments as $argumentKey => $argumentValue ) + $serviceObject->$methodName( $argumentValue, $argumentKey ); + } + } + + return $serviceObject; + } + + /** + * Lookup arguments for variable, service or arrays for recursive lookup + * + * 1. Does not keep keys of first level arguments + * 2. Exists loop when it encounters optional non existing service dependencies + * + * @uses getServiceArgument() + * @uses recursivelyLookupArguments() + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If undefined variable is used. + * @param array $arguments + * @param boolean $recursively + * + * @return array + */ + protected function lookupArguments( array $arguments, $recursively = false ) + { + $builtArguments = array(); + foreach ( $arguments as $argument ) + { + if ( isset( $argument[0] ) && ( $argument[0] === '$' || $argument[0] === '@' || $argument[0] === '%' ) ) + { + $serviceObject = $this->getServiceArgument( $argument ); + if ( $argument[1] === '?' && $serviceObject === null ) + break; + + $builtArguments[] = $serviceObject; + } + else if ( $recursively && is_array( $argument ) ) + { + $builtArguments[] = $this->recursivelyLookupArguments( $argument ); + } + // Scalar values + else + { + $builtArguments[] = $argument; + } + } + return $builtArguments; + } + + /** + * Lookup arguments for variable, service or arrays for recursive lookup + * + * 1. Keep keys of arguments + * 2. Does not exit loop on optional non existing service dependencies + * + * @uses getServiceArgument() + * @uses recursivelyLookupArguments() + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If undefined variable is used. + * @param array $arguments + * + * @return array + */ + protected function recursivelyLookupArguments( array $arguments ) + { + $builtArguments = array(); + foreach ( $arguments as $key => $argument ) + { + if ( isset( $argument[0] ) && ( $argument[0] === '$' || $argument[0] === '@' || $argument[0] === '%' ) ) + { + $serviceObject = $this->getServiceArgument( $argument ); + if ( $argument[1] !== '?' || $serviceObject !== null ) + $builtArguments[$key] = $serviceObject; + } + else if ( is_array( $argument ) ) + { + $builtArguments[$key] = $this->recursivelyLookupArguments( $argument ); + } + // Scalar values + else + { + $builtArguments[$key] = $argument; + } + } + return $builtArguments; + } + + /** + * @uses getListOfExtendedServices() + * @uses recursivelyLookupArguments() + * @param string $argument + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * + * @return array|closure|mixed|object|null Null on non existing optional dependencies + */ + protected function getServiceArgument( $argument ) + { + $function = ''; + $serviceContainer = $this; + // callback + if ( stripos( $argument, '::' ) !== false ) + list( $argument, $function ) = explode( '::', $argument ); + + // expand extended services + if ( ( $argument[0] === '%' || $argument[0] === '@' ) && $argument[1] === ':' ) + { + return $this->recursivelyLookupArguments( $this->getListOfExtendedServices( $argument, $function ) ); + } + // lazy loaded services + else if ( $argument[0] === '%' ) + { + // Optional dependency handling + if ( $argument[1] === '?' && !isset( $this->settings[substr( $argument, 2 )] ) ) + return null; + + if ( $function !== '' ) + return function() use ( $serviceContainer, $argument, $function ) + { + $serviceObject = $serviceContainer->get( ltrim( $argument, '%' ) ); + return call_user_func_array( array( $serviceObject, $function ), func_get_args() ); + }; + else + return function() use ( $serviceContainer, $argument ) + { + return $serviceContainer->get( ltrim( $argument, '%' ) ); + }; + } + // Existing dependencies (@Service / $Variable) + else if ( isset( $this->dependencies[ $argument ] ) ) + { + $serviceObject = $this->dependencies[ $argument ]; + } + // Undefined variables will trow an exception + else if ( $argument[0] === '$' ) + { + // Optional dependency handling + if ( $argument[1] === '?' ) + return null; + + throw new InvalidArgumentValue( "\$arguments", $argument ); + } + // Try to load a @service dependency + else + { + // Optional dependency handling + if ( $argument[1] === '?' && !isset( $this->settings[substr( $argument, 2 )] ) ) + return null; + + $serviceObject = $this->get( ltrim( $argument, '@' ) ); + } + + if ( $function !== '' ) + return array( $serviceObject, $function ); + + return $serviceObject; + } + + /** + * @param string $parent Eg: %:controller + * @param string $function Optional function string + * + * @return array + */ + protected function getListOfExtendedServices( $parent, $function = '' ) + { + $prefix = $parent[0]; + $parent = ltrim( $parent, '@%' );// Keep starting ':' on parent for easier matching bellow + $services = array(); + if ( $function !== '' ) + $function = '::' . $function; + + foreach ( $this->settings as $service => $settings ) + { + if ( stripos( $service, $parent ) !== false && + !empty( $settings['class'] ) && + preg_match( "/^(?P[\w:]+){$parent}$/", $service, $match ) ) + { + $services[$match['prefix']] = $prefix . $match['prefix'] . $parent . $function; + } + } + return $services; + } +} diff --git a/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/Base.php b/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/Base.php new file mode 100644 index 0000000..29fa532 --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/Base.php @@ -0,0 +1,339 @@ +parser = $this->getParser(); + } + + /** + * Tear down test (properties) + */ + protected function tearDown() + { + unset( $this->parser ); + parent::tearDown(); + } + + /** + * Setup parser with settings + * + * @return \eZ\Publish\Core\Base\Configuration\Parser\Ini + */ + abstract protected function getParser(); + + /** + * Test that ending hash boom is stripped out + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFilePhp + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFileEzc + */ + public function testHashBoom() + { + $iniString = ' +[test] +HashBoomer=enabled##!'; + $expects = array( 'test' => array( 'HashBoomer' => 'enabled' ) ); + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertEquals( + $expects, + $result, + 'ini parser did not strip hash boom' + ); + } + + /** + * Test that types in ini is properly parsed to native php types + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parsePhpPostFilter + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFilePhp + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFileEzc + */ + public function testTypes() + { + $iniString = ' +[test] +Int=1 +Float=5.4 +Decimal=5,4 +BoolTrue=true +BoolFalse=false +BoolEnabled=enabled +BoolDisabled=disabled +String=Test'; + $expects = array( + 'test' => array( + 'Int' => 1, + 'Float' => 5.4, + 'Decimal' => '5,4', + 'BoolTrue' => true, + 'BoolFalse' => false, + 'BoolEnabled' => 'enabled', + 'BoolDisabled' => 'disabled', + 'String' => 'Test', + ) + ); + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertSame( + $expects, + $result, + 'ini parser did not cast type properly' + ); + } + + /** + * Test that types in ini is properly parsed to native php types in arrays + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFilePhp + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFileEzc + */ + public function testArrayTypes() + { + $iniString = ' +[test] +Mixed[]=true +Mixed[]=false +Mixed[]=string +Mixed[]=44 +Mixed[]=4.4 +Mixed[]=4,4'; + $expects = array( 'test' => array( 'Mixed' => array( true, false, 'string', 44, 4.4, '4,4' ) ) ); + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertSame( + $expects, + $result, + 'ini parser did not cast type properly' + ); + } + + /** + * Test that empty arrays are returned + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFilePhp + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFileEzc + */ + public function testEmptyArray() + { + $iniString = ' +[test] +empty-array[]'; + $expects = array( 'test' => array( 'empty-array' => array( Configuration::TEMP_INI_UNSET_VAR ) ) ); + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertEquals( + $expects, + $result, + 'ini parser did not return empty array' + ); + } + + /** + * Test that complex hash structures with symbol use in key and value are parsed + * + * Also tests two dimensional arrays + * + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFilePhp + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFileEzc + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parserPhpDimensionArraySupport + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parsePhpPostFilter + */ + public function testComplexHash() + { + $iniString = ' +[test] +conditions[eZ\\Testing\\Filter_Get::dev]=uri\\0:content\\uri\\1:^v\\auth:?php\\params:%php +conditions[$user_object->check]=ezp/system/router\\eZ\\Testing\\Filter_Get::dev +conditions[]=uri\\0:§£$content +conditions[][]=subOne +conditions[][]=subTwo +conditions[two][two]=subThree +conditions[two][two2]=subFour +conditions[two][two]=subFive +conditions[][][]=subSix +conditions[][][]=subSeven +conditions[three][three][three]=subEight +conditions[three][three][three3]=subNine +conditions[three][three][three]=subTen +conditions[events][pre_request][]=outputFn +conditions[routes][__ROOT__][item][uri]= +conditions[routes][content][item][uri]=content/some/ +conditions[routes][content][item][params][id]=\d+ +conditions[routes][content][item][controller]=%contentItem-controller::doList + +[contentItem:controller] +class=eZ\\Publish\\Core\\ContentItemController + +[LocationItem:contentItem:controller] +public=true +regex[]=?\w+ +regex[]=?P\w+ +regex[]=?\'name\'\w+ +#regex[]=(?\w+) +#regex[]=(?P\w+) +#regex[]=(?\'name\'\w+) +regex[]=content/location/?\w+ +regex[]=content/location/{?\w+} + +[parameters] +dsn=sqlite://:memory: +legacy.dsn=sqlite://:memory: +'; + $expects = array( + 'test' => array( + 'conditions' => array( + 'eZ\\Testing\\Filter_Get::dev' => 'uri\\0:content\\uri\\1:^v\\auth:?php\\params:%php', + '$user_object->check' => 'ezp/system/router\\eZ\\Testing\\Filter_Get::dev', + 0 => 'uri\\0:§£$content', + 1 => array( 'subOne' ), + 2 => array( 'subTwo' ), + 'two' => array( 'two' => 'subFive', 'two2' => 'subFour' ), + 3 => array( array( 'subSix' ) ), + 4 => array( array( 'subSeven' ) ), + 'three' => array( 'three' => array( 'three' => 'subTen', 'three3' => 'subNine' ) ), + 'events' => array( 'pre_request' => array( 'outputFn' ) ), + 'routes' => array( + '__ROOT__' => array( 'item' => array( 'uri' => '' ) ), + 'content' => array( + 'item' => array( + 'uri' => 'content/some/', + 'params' => array( 'id' => '\d+' ), + 'controller' => '%contentItem-controller::doList', + ) + ) + ), + ) + ), + 'contentItem:controller' => array( 'class' => 'eZ\\Publish\\Core\\ContentItemController' ), + 'LocationItem:contentItem:controller' => array( + 'public' => true, + 'regex' => array( + '?\w+', + '?P\w+', + '?\'name\'\w+', + //'(?\w+)', + //'(?P\w+)', + //'(?\'name\'\w+)', + 'content/location/?\w+', + 'content/location/{?\w+}', + ), + ), + 'parameters' => array( + 'dsn' => 'sqlite://:memory:', + 'legacy.dsn' => 'sqlite://:memory:', + ), + ); + + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertEquals( + $expects, + $result, + 'ini parser did not parse complex hash' + ); + } + + /** + * Test that arrays contain clearing hint to Configuration class + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parserClearArraySupport + */ + public function testArrayClearing() + { + $iniString = ' +[test] +sub[]=hi +sub[] +two[one][]=hi +two[one][] +'; + $expects = array( + 'test' => array( + 'sub' => array( 'hi', Configuration::TEMP_INI_UNSET_VAR ), + 'two' => array( 'one' => array( 'hi', Configuration::TEMP_INI_UNSET_VAR ) ), + ) + ); + + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertEquals( + $expects, + $result, + 'ini parser did not properly clear array' + ); + } + + /** + * Test that complex hash structures with utf8 values work + * + * Also tests two dimensional arrays + * + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFilePhp + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parseFileEzc + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parserPhpDimensionArraySupport + * @covers \eZ\Publish\Core\Base\Configuration\Parser\Ini::parsePhpPostFilter + */ + public function testUTF8Hash() + { + $iniString = " +[test] +CR[Name]=Costa Rica +CR[Alpha2]=CR +CR[Alpha3]=CRI +CR[IDC]=506 +CI[Name]=Côte d'Ivoire +CI[Alpha2]=CI +CI[Alpha3]=CIV +CI[IDC]=255 +VA[Name]=\"Holy See (Vatican City State)\" +VA[Alpha2]=VA +VA[Alpha3]=VAT +VA[IDC]=3906 +"; + $expects = array( + 'test' => array( + 'CR' => array( + 'Name' => 'Costa Rica', + 'Alpha2' => 'CR', + 'Alpha3' => 'CRI', + 'IDC' => 506, + ), + 'CI' => array( + 'Name' => 'Côte d\'Ivoire', + 'Alpha2' => 'CI', + 'Alpha3' => 'CIV', + 'IDC' => 255, + ), + 'VA' => array( + 'Name' => 'Holy See (Vatican City State)', + 'Alpha2' => 'VA', + 'Alpha3' => 'VAT', + 'IDC' => 3906, + ), + ), + ); + + $result = $this->parser->parse( 'DoesNotExist.ini', $iniString ); + $this->assertEquals( + $expects, + $result, + 'ini parser did not parse complex utf8 hash' + ); + } +} diff --git a/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/EzcTest.php b/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/EzcTest.php new file mode 100644 index 0000000..b8c6f91 --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/EzcTest.php @@ -0,0 +1,25 @@ + false ) + ); + } +} diff --git a/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/PhpTest.php b/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/PhpTest.php new file mode 100644 index 0000000..cb59b09 --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/Configuration/Parser/Ini/PhpTest.php @@ -0,0 +1,26 @@ + true ) + ); + } +} diff --git a/eZ/Publish/Core/Base/Tests/Configuration/test.ini b/eZ/Publish/Core/Base/Tests/Configuration/test.ini new file mode 100644 index 0000000..a47f35f --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/Configuration/test.ini @@ -0,0 +1 @@ +# empty file for use by Configuration tests diff --git a/eZ/Publish/Core/Base/Tests/ConfigurationTest.php b/eZ/Publish/Core/Base/Tests/ConfigurationTest.php new file mode 100644 index 0000000..71af923 --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/ConfigurationTest.php @@ -0,0 +1,222 @@ +parserMock = $this->getMock( 'eZ\\Publish\\Core\\Base\\Configuration\\Parser' ); + + $this->configuration = new Configuration( + 'test', + array( 'base' => array( __DIR__ . '/Configuration/' ) ), + array( 'base' => array( 'Configuration' => array( 'Parsers' => array( '.ini' => $this->parserMock ) ) ) ) + ); + } + + /** + * Tear down test (properties) + */ + protected function tearDown() + { + unset( $this->parserMock ); + unset( $this->configuration ); + parent::tearDown(); + } + + /** + * Test Configuration + * + * @covers \eZ\Publish\Core\Base\Configuration::load + * @covers \eZ\Publish\Core\Base\Configuration::parse + */ + public function testParserExecution() + { + $this->parserMock->expects( $this->once() ) + ->method( 'parse' ) + ->with( + $this->equalTo( __DIR__ . '/Configuration/test.ini' ), + $this->equalTo( file_get_contents( __DIR__ . '/Configuration/test.ini' ) ) + )->will( $this->returnValue( array() ) ); + $this->configuration->load(); + } + + /** + * Test Configuration + * + * @covers \eZ\Publish\Core\Base\Configuration::load + * @covers \eZ\Publish\Core\Base\Configuration::parse + */ + public function testParsing() + { + $config = array( + 'Test' => array( + 'String' => 'test ', + 'Int' => 42, + 'Bool' => true, + 'Array' => array( 1 ), + ) + ); + $this->parserMock->expects( $this->once() ) + ->method( 'parse' ) + ->will( $this->returnValue( $config ) ); + $this->configuration->load(); + + self::assertSame( $config, $this->configuration->getAll() ); + } + + /** + * Test Configuration + * + * @covers \eZ\Publish\Core\Base\Configuration::load + * @covers \eZ\Publish\Core\Base\Configuration::parse + * @covers \eZ\Publish\Core\Base\Configuration::recursiveArrayClearing + */ + public function testParsingAndArrayClearing() + { + $config = array( + 'Test' => array( + 'String' => 'test ', + 'Int' => 42, + 'Bool' => true, + 'Array' => array( Configuration::TEMP_INI_UNSET_VAR ), + ) + ); + $this->parserMock->expects( $this->once() ) + ->method( 'parse' ) + ->will( $this->returnValue( $config ) ); + $this->configuration->load(); + + $config['Test']['Array'] = array();// Change array to excepted return value + self::assertSame( $config, $this->configuration->getAll() ); + } + + /** + * Test Configuration + * + * @covers \eZ\Publish\Core\Base\Configuration::load + * @covers \eZ\Publish\Core\Base\Configuration::parse + * @covers \eZ\Publish\Core\Base\Configuration::recursiveArrayClearing + */ + public function testParsingAndRecursiveArrayClearing() + { + $config = array( + 'Test' => array( + 'String' => 'test ', + 'Int' => 42, + 'Bool' => true, + 'Array' => array( + 'one' => array( 1 ), + 'clear' => array( Configuration::TEMP_INI_UNSET_VAR ), + ), + ) + ); + $this->parserMock->expects( $this->once() ) + ->method( 'parse' ) + ->will( $this->returnValue( $config ) ); + $this->configuration->load(); + + $config['Test']['Array']['clear'] = array();// Change array to excepted return value + self::assertSame( $config, $this->configuration->getAll() ); + } + + /** + * Test Configuration + * + * @covers \eZ\Publish\Core\Base\Configuration::load + * @covers \eZ\Publish\Core\Base\Configuration::parse + */ + public function testParsingExtendedSections() + { + $config = array( + 'Test' => array( + 'String' => 'test ', + 'Int' => 42, + 'Bool' => true, + 'Array' => array( 1 ), + ), + 'Test3:Test2:Test' => array(), + 'Test2:Test' => array( 'Float' => 3.4 ), + ); + $this->parserMock->expects( $this->once() ) + ->method( 'parse' ) + ->will( $this->returnValue( $config ) ); + $this->configuration->load(); + + // Set extended value as we expect it + $config['Test2:Test'] += $config['Test']; + $config['Test3:Test2:Test'] = $config['Test2:Test']; + + self::assertEquals( $config, $this->configuration->getAll() ); + } + + /** + * Test Configuration + * + * @covers \eZ\Publish\Core\Base\Configuration::load + */ + public function testLoadGlobalConfig() + { + $globalConfig = array( + 'NonExistingSection' => array( 'Setting1' => 'Value' ), + 'ExistingSection' => array( + 'Setting1' => 'Value', + 'Setting2' => array( 'key1' => 1, 'Key2' => 2 ) + ) + ); + $configuration = new Configuration( + 'test', + array( 'base' => array( __DIR__ . '/Configuration/' ) ), + array( + 'base' => array( 'Configuration' => array( 'Parsers' => array( '.ini' => $this->parserMock ) ) ), + 'test' => $globalConfig + ) + ); + $config = array( + 'ExistingSection' => array( + 'Setting1' => 'ValueValue', + 'Setting2' => array( 'key1' => 3, 'Key2' => 3, 'Key3' => 3 ), + 'Setting3' => 'ValueValue' + ) + ); + $this->parserMock->expects( $this->once() ) + ->method( 'parse' ) + ->will( $this->returnValue( $config ) ); + $configuration->load(); + + // Set extended value as we expect it + $globalConfig['ExistingSection']['Setting2']['Key3'] = 3; + $globalConfig['ExistingSection']['Setting3'] = 'ValueValue'; + + self::assertEquals( $globalConfig, $configuration->getAll() ); + } +} diff --git a/eZ/Publish/Core/Base/Tests/ServiceContainerTest.php b/eZ/Publish/Core/Base/Tests/ServiceContainerTest.php new file mode 100644 index 0000000..f84c11d --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/ServiceContainerTest.php @@ -0,0 +1,379 @@ + array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\B', + ) + ) + ); + $b = $sc->get( 'BService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\B', $b ); + self::assertFalse( $b->factoryExecuted ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + */ + public function testSimpleAliasService() + { + $sc = new ServiceContainer( + array( + 'BService' => array( + 'alias' => 'BServiceXHandler', + ), + 'BServiceXHandler' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\B', + ) + ) + ); + $b = $sc->get( 'BService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\B', $b ); + self::assertFalse( $b->factoryExecuted ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testArgumentsService() + { + $sc = new ServiceContainer( + array( + 'BService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\B', + ), + 'CService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\C', + 'arguments' => array( '@BService' ), + ) + ) + ); + $c = $sc->get( 'CService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\C', $c ); + self::assertEquals( '', $c->string ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testComplexService() + { + $sc = new ServiceContainer( + array( + 'AService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\A', + 'arguments' => array( '@BService', '@CService', '__' ), + ), + 'BService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\B', + ), + 'CService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\C', + 'arguments' => array( '@BService' ), + ) + ) + ); + $a = $sc->get( 'AService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\A', $a ); + self::assertEquals( '__', $a->string ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\B', $a->b ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\C', $a->c ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testComplexServiceCustomDependencies() + { + $sc = new ServiceContainer( + array( + 'AService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\A', + 'arguments' => array( '@BService', '@CService', '__' ), + ), + 'CService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\C', + 'factory' => 'factory', + 'arguments' => array( '@BService', 'B', 'S' ), + ) + ), + array( '@BService' => new B ) + ); + $a = $sc->get( 'AService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\A', $a ); + self::assertEquals( '__', $a->string ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\B', $a->b ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\C', $a->c ); + self::assertEquals( 'BS', $a->c->string ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testComplexServiceUsingVariables() + { + $sc = new ServiceContainer( + array( + 'DService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\D', + 'arguments' => array( '$_SERVER', '$B' ), + ), + ), + array( '$B' => new B ) + ); + $d = $sc->get( 'DService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\D', $d ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testSimpleServiceUsingHash() + { + $sc = new ServiceContainer( + array( + 'EService' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\E', + 'arguments' => array( + array( + 'bool' => true, + 'int' => 42, + 'string' => 'Archer', + 'array' => array( 'ezfile' => 'eZ\\Publish\\Core\\FieldType\\File', 'something' ), + ) + ), + ), + ) + ); + $obj = $sc->get( 'EService' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\E', $obj ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testComplexServiceUsingHash() + { + $sc = new ServiceContainer( + array( + 'F' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\F', + 'arguments' => array( + array( + 'b' => '@B', + 'sub' => array( 'c' => '@C' ), + ) + ), + ), + 'C' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\C', + 'arguments' => array( '@B' ), + ) + ), + array( '@B' => new B ) + ); + $obj = $sc->get( 'F' ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\Base\\Tests\\F', $obj ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testComplexLazyLoadedServiceUsingHash() + { + $sc = new ServiceContainer( + array( + 'G' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\G', + 'arguments' => array( + 'lazyHServiceCall' => '%H:parent::timesTwo', + 'hIntValue' => 42, + 'lazyHService' => '%H:parent', + ), + ), + 'H:parent' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\H', + 'shared' => false, + 'arguments' => array(), + ), + 'parent' => array( + 'arguments' => array( 'test' => 33 ), + ), + ) + ); + $obj = $sc->get( 'G' ); + self::assertEquals( 42 * 2, $obj->hIntValue ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + * @covers \eZ\Publish\Core\Base\ServiceContainer::getListOfExtendedServices + */ + public function testComplexExtendedServicesUsingHash() + { + $sc = new ServiceContainer( + array( + 'ExtendedTestCheck' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTestCheck', + 'arguments' => array( + 'extendedTests' => '@:ExtendedTest', + ), + ), + 'ExtendedTest1:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest1', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest2:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest2', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest3:ExtendedTest2:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest3', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest' => array( + 'arguments' => array( 'h' => '$H' ), + ), + ), + array( '$H' => new H ) + ); + $obj = $sc->get( 'ExtendedTestCheck' ); + self::assertEquals( 3, $obj->count ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + * @covers \eZ\Publish\Core\Base\ServiceContainer::getListOfExtendedServices + */ + public function testComplexLazyExtendedServicesUsingHash() + { + $sc = new ServiceContainer( + array( + 'ExtendedTestLacyCheck' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTestLacyCheck', + 'arguments' => array( + 'extendedTests' => '%:ExtendedTest', + ), + ), + 'ExtendedTest1:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest1', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest2:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest2', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest3:ExtendedTest2:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest3', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest' => array( + 'arguments' => array( 'h' => '$H' ), + ), + ), + array( '$H' => new H ) + ); + $obj = $sc->get( 'ExtendedTestLacyCheck' ); + self::assertEquals( 3, $obj->count ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + * @covers \eZ\Publish\Core\Base\ServiceContainer::getListOfExtendedServices + */ + public function testComplexLazyExtendedCallbackUsingHash() + { + $sc = new ServiceContainer( + array( + 'ExtendedTestLacyCheck' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTestLacyCheck', + 'arguments' => array( + 'extendedTests' => '%:ExtendedTest::setTest', + 'test' => 'newValue', + ), + ), + 'ExtendedTest1:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest1', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest2:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest2', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest3:ExtendedTest2:ExtendedTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ExtendedTest3', + 'arguments' => array( 'h' => '$H' ), + ), + 'ExtendedTest' => array( + 'arguments' => array( 'h' => '$H' ), + ), + ), + array( '$H' => new H ) + ); + $obj = $sc->get( 'ExtendedTestLacyCheck' ); + self::assertEquals( 3, $obj->count ); + } + + /** + * @covers \eZ\Publish\Core\Base\ServiceContainer::__construct + * @covers \eZ\Publish\Core\Base\ServiceContainer::get + * @covers \eZ\Publish\Core\Base\ServiceContainer::lookupArguments + */ + public function testParameters() + { + $testPath = "TestValue/Path"; + $sc = new ServiceContainer( + array( + 'parameters' => array( + 'storage_path' => $testPath + ), + 'ParameterTest' => array( + 'class' => 'eZ\\Publish\\Core\\Base\\Tests\\ParameterTest', + 'arguments' => array( + 'path' => '$storage_path', + ), + ), + ) + ); + $obj = $sc->get( 'ParameterTest' ); + self::assertEquals( $testPath, $obj->parameter ); + } +} diff --git a/eZ/Publish/Core/Base/Tests/_fixtures/classes.php b/eZ/Publish/Core/Base/Tests/_fixtures/classes.php new file mode 100644 index 0000000..2f19aec --- /dev/null +++ b/eZ/Publish/Core/Base/Tests/_fixtures/classes.php @@ -0,0 +1,189 @@ +b = $b; + $this->c = $c; + $this->string = $string; + } +} + +class B +{ + public $factoryExecuted = false; + public function __construct(){} + public static function factory() + { + $b = new self(); + $b->factoryExecuted = true; + return $b; + } +} + +class C +{ + public $string = ''; + public function __construct( B $b ){} + public static function factory( B $b, $string, $string2 ) + { + $c = new self( $b ); + $c->string = $string.$string2; + return $c; + } +} + +class D +{ + public function __construct( array $server, B $b ){} +} + +class E +{ + public function __construct( array $config ) + { + if ( $config['bool'] !== true ) + throw new \Exception( "Bool was not 'true' value" ); + if ( $config['string'] !== 'Archer' ) + throw new \Exception( "String was not 'Archer' value" ); + if ( $config['int'] !== 42 ) + throw new \Exception( "Int was not '42' value" ); + if ( $config['array'] !== array( 'ezfile' => 'eZ\\Publish\\Core\\FieldType\\File', 'something' ) ) + throw new \Exception( "Array was not expected value" ); + } +} + +class F +{ + public function __construct( array $config ) + { + if ( !$config['b'] instanceof B ) + throw new \Exception( "b was not instance of 'B'" ); + if ( !$config['sub']['c'] instanceof C ) + throw new \Exception( "sub.c was not instance of 'C'" ); + } +} + +class G +{ + public $hIntValue = null; + public function __construct( Closure $lazyHServiceCall, $hIntValue, Closure $lazyHService ) + { + $this->hIntValue = $lazyHServiceCall( $hIntValue ); + $service = $lazyHService(); + if ( !$service instanceof H ) + throw new \Exception( "\$lazyHService() did not return instance of 'H'" ); + } +} + +class H +{ + public function __construct( $notUsedArgument = null ) + { + if ( $notUsedArgument !== null ) + throw new \Exception( "\$notUsedArgument should be a value of null, got: " . $notUsedArgument ); + } + + public function timesTwo( $hIntValue ) + { + return $hIntValue * 2; + } +} + +abstract class ExtendedTest +{ + public $test = null; + public function __construct( H $h ){} + public function setTest( $test ) + { + if ( $test === null ) + throw new \Exception( "Got null as \$test" ); + + $this->test = $test; + return $this; + } +} + +class ExtendedTest1 extends ExtendedTest {} +class ExtendedTest2 extends ExtendedTest {} +class ExtendedTest3 extends ExtendedTest {} + +class ExtendedTestCheck +{ + public $count; + public function __construct( array $extendedTests ) + { + if ( empty( $extendedTests ) ) + throw new \Exception( "Empty argument \$extendedTests" ); + + $key = 0; + foreach ( $extendedTests as $extendedTestName => $extendedTest ) + { + $key++; + if ( !$extendedTest instanceof ExtendedTest ) + throw new \Exception( "Values in \$extendedTests must extend ExtendedTest" ); + else if ( $key !== 3 && $extendedTestName !== "ExtendedTest{$key}" ) + throw new \Exception( "Keys had wrong value in \$extendedTests, got: $extendedTestName" ); + else if ( $key === 3 && $extendedTestName !== "ExtendedTest3:ExtendedTest2" ) + throw new \Exception( "Keys had wrong value in \$extendedTests, got: $extendedTestName" ); + } + $this->count = $key; + } +} + +class ExtendedTestLacyCheck +{ + public $count; + public function __construct( array $extendedTests, $test = null ) + { + if ( empty( $extendedTests ) ) + throw new \Exception( "Empty argument \$extendedTests" ); + + $key = 0; + foreach ( $extendedTests as $extendedTestName => $extendedTest ) + { + $key++; + if ( !is_callable( $extendedTest ) ) + throw new \Exception( "Values in \$extendedTests must be callable" ); + + $extendedTest = $extendedTest( $test ); + if ( !$extendedTest instanceof ExtendedTest ) + throw new \Exception( "Values in \$extendedTests must extend ExtendedTest" ); + else if ( $key !== 3 && $extendedTestName !== "ExtendedTest{$key}" ) + throw new \Exception( "Keys had wrong value in \$extendedTests, got: $extendedTestName" ); + else if ( $key === 3 && $extendedTestName !== "ExtendedTest3:ExtendedTest2" ) + throw new \Exception( "Keys had wrong value in \$extendedTests, got: $extendedTestName" ); + else if ( $extendedTest->test !== $test ) + throw new \Exception( "\$extendedTest->test is supposed to be '{$test}', got: {$extendedTest->test}" ); + + } + $this->count = $key; + } +} + +class ParameterTest +{ + public $parameter; + public function __construct( $parameter, $test = null ) + { + if ( empty( $parameter ) ) + throw new \Exception( "Empty argument \$parameter" ); + + if ( !empty( $test ) ) + throw new \Exception( "Argument should have been empty: \$test" ); + + $this->parameter = $parameter; + } +} diff --git a/eZ/Publish/Core/FieldType/Author/Author.php b/eZ/Publish/Core/FieldType/Author/Author.php new file mode 100644 index 0000000..5c8e898 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Author/Author.php @@ -0,0 +1,40 @@ +offsetSet() + parent::__construct(); + foreach ( $elements as $i => $author ) + { + $this->offsetSet( $i, $author ); + } + } + + /** + * Adds a new author to the collection + * + * @throws InvalidArgumentType When $value is not of type Author + * @param int $offset + * @param \eZ\Publish\Core\FieldType\Author\Author $value + */ + public function offsetSet( $offset, $value ) + { + if ( !$value instanceof Author ) + { + throw new InvalidArgumentType( + '$value', + 'eZ\\Publish\\Core\\FieldType\\Author\\Author', + $value + ); + } + + $aAuthors = $this->getArrayCopy(); + parent::offsetSet( $offset, $value ); + if ( !isset( $value->id ) || $value->id == -1 ) + { + if ( !empty( $aAuthors ) ) + { + $value->id = end( $aAuthors )->id + 1; + } + else + { + $value->id = 1; + } + } + } + + /** + * Removes authors from current collection with a list of Ids + * + * @param array $authorIds Author's Ids to remove from current collection + */ + public function removeAuthorsById( array $authorIds ) + { + $aAuthors = $this->getArrayCopy(); + foreach ( $aAuthors as $i => $author ) + { + if ( in_array( $author->id, $authorIds ) ) + { + unset( $aAuthors[$i] ); + } + } + + $this->exchangeArray( $aAuthors ); + } +} diff --git a/eZ/Publish/Core/FieldType/Author/Type.php b/eZ/Publish/Core/FieldType/Author/Type.php new file mode 100644 index 0000000..348bb0a --- /dev/null +++ b/eZ/Publish/Core/FieldType/Author/Type.php @@ -0,0 +1,164 @@ +acceptValue( $value ); + + return isset( $value->authors[0] ) ? $value->authors[0]->name : ""; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Author\Value + */ + public function getEmptyValue() + { + return new Value(); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Author\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_array( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Author\\Value', + $inputValue + ); + } + + if ( !$inputValue->authors instanceof AuthorCollection ) + { + throw new InvalidArgumentType( + '$inputValue->authors', + 'eZ\\Publish\\Core\\FieldType\\Author\\AuthorCollection', + $inputValue->authors + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Author\Value $value + */ + public function fromHash( $hash ) + { + return new Value( + array_map( + function ( $author ) + { + return new Author( $author ); + }, + $hash + ) + ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Author\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return array_map( + function ( $author ) + { + return (array)$author; + }, + $value->authors->getArrayCopy() + ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } +} diff --git a/eZ/Publish/Core/FieldType/Author/Value.php b/eZ/Publish/Core/FieldType/Author/Value.php new file mode 100644 index 0000000..9b52cec --- /dev/null +++ b/eZ/Publish/Core/FieldType/Author/Value.php @@ -0,0 +1,56 @@ +authors = new AuthorCollection( $authors ); + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + if ( empty( $this->authors ) ) + return ""; + + $authorNames = array(); + + if ( $this->authors instanceof AuthorCollection ) + { + foreach ( $this->authors as $author ) + { + $authorNames[] = $author->name; + } + } + + return implode( ', ', $authorNames ); + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryBase/BinaryBaseStorage.php b/eZ/Publish/Core/FieldType/BinaryBase/BinaryBaseStorage.php new file mode 100644 index 0000000..a067a14 --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryBase/BinaryBaseStorage.php @@ -0,0 +1,208 @@ +fileService = $fileService; + $this->pathGenerator = $pathGenerator; + } + + /** + * Allows custom field types to store data in an external source (e.g. another DB table). + * + * Stores value for $field in an external data source. + * The whole {@link eZ\Publish\SPI\Persistence\Content\Field} ValueObject is passed and its value + * is accessible through the {@link eZ\Publish\SPI\Persistence\Content\FieldValue} 'value' property. + * This value holds the data filled by the user as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * $field->id = unique ID from the attribute tables (needs to be generated by + * database back end on create, before the external data source may be + * called from storing). + * + * The context array provides some context for the field handler about the + * currently used storage engine. + * The array should at least define 2 keys : + * - identifier (connection identifier) + * - connection (the connection handler) + * For example, using Legacy storage engine, $context will be: + * - identifier = 'LegacyStorage' + * - connection = {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} object handler (for DB connection), + * to be used accordingly to + * {@link http://incubator.apache.org/zetacomponents/documentation/trunk/Database/tutorial.html ezcDatabase} usage + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + if ( $field->value->externalData === null ) + { + // Nothing to store + return false; + } + + $storedValue = $field->value->externalData; + + if ( !$this->fileService->exists( $storedValue['path'] ) ) + { + // Only store a new file copy, if it does not exist, yet + $targetPath = $this->pathGenerator->getStoragePathForField( $field, $versionInfo ); + + $storedValue['path'] = $this->fileService->storeFile( + $storedValue['path'], + $this->fileService->getStorageIdentifier( $targetPath ) + ); + } + + $field->value->externalData = $storedValue; + + $this->removeOldFile( $field->id, $versionInfo->versionNo, $context ); + + return $this->getGateway( $context )->storeFileReference( $versionInfo, $field ); + } + + /** + * Removes the old file referenced by $fieldId in $versionNo, if not + * referenced else where + * + * @param mixed $fieldId + * @param string $versionNo + * @param array $context + * + * @return void + */ + protected function removeOldFile( $fieldId, $versionNo, array $context ) + { + $gateway = $this->getGateway( $context ); + + $fileReference = $gateway->getFileReferenceData( $fieldId, $versionNo ); + + if ( $fileReference === null ) + { + // No previous file + return; + } + + $gateway->removeFileReference( $fieldId, $versionNo ); + + $fileCounts = $gateway->countFileReferences( array( $fileReference['path'] ) ); + + if ( $fileCounts[$fileReference['path']] === 0 ) + { + $this->fileService->remove( $fileReference['path'] ); + } + } + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $field->value->externalData = $this->getGateway( $context )->getFileReferenceData( $field->id, $versionInfo->versionNo ); + + if ( $field->value->externalData !== null ) + { + $field->value->externalData['fileSize'] = $this->fileService->getFileSize( $field->value->externalData['path'] ); + } + } + + /** + * @param array $fieldIds + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + $gateway = $this->getGateway( $context ); + + $referencedFiles = $gateway->getReferencedFiles( $fieldIds, $versionInfo->versionNo ); + + $gateway->removeFileReferences( $fieldIds, $versionInfo->versionNo ); + + $referenceCountMap = $gateway->countFileReferences( $referencedFiles ); + + foreach ( $referenceCountMap as $filePath => $count ) + { + if ( $count === 0 ) + { + $this->fileService->remove( $filePath ); + } + } + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryBase/BinaryBaseStorage/Gateway.php b/eZ/Publish/Core/FieldType/BinaryBase/BinaryBaseStorage/Gateway.php new file mode 100644 index 0000000..4ccde4e --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryBase/BinaryBaseStorage/Gateway.php @@ -0,0 +1,76 @@ + array( + 'name' => 'path', + 'cast' => 'strval', + ), + 'mime_type' => array( + 'name' => 'mimeType', + 'cast' => 'strval', + ), + 'original_filename' => array( + 'name' => 'fileName', + 'cast' => 'strval', + ) + ); + } + + /** + * Set columns to be fetched from the database + * + * This method is intended to be overwritten by derived classes in order to + * add additional columns to be fetched from the database. Please do not + * forget to call the parent when overwriting this method. + * + * @param \ezcQuerySelect $selectQuery + * @param int $fieldId + * @param int $versionNo + * + * @return void + */ + protected function setFetchColumns( \ezcQuerySelect $selectQuery, $fieldId, $versionNo ) + { + $connection = $this->getConnection(); + + $selectQuery->select( + $connection->quoteColumn( 'filename' ), + $connection->quoteColumn( 'mime_type' ), + $connection->quoteColumn( 'original_filename' ) + ); + } + + /** + * Sets the required insert columns to $selectQuery. + * + * This method is intended to be overwritten by derived classes in order to + * add additional columns to be set in the database. Please do not forget + * to call the parent when overwriting this method. + * + * @param \ezcQueryInsert $insertQuery + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + protected function setInsertColumns( \ezcQueryInsert $insertQuery, VersionInfo $versionInfo, Field $field ) + { + $connection = $this->getConnection(); + + $insertQuery->set( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $insertQuery->bindValue( $field->id, null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'filename' ), + $insertQuery->bindValue( + $this->removeMimeFromPath( $field->value->externalData['path'] ) + ) + )->set( + $connection->quoteColumn( 'mime_type' ), + $insertQuery->bindValue( $field->value->externalData['mimeType'] ) + )->set( + $connection->quoteColumn( 'original_filename' ), + $insertQuery->bindValue( $field->value->externalData['fileName'] ) + )->set( + $connection->quoteColumn( 'version' ), + $insertQuery->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + ); + } + + /** + * Set database handler for this gateway + * + * @param mixed $dbHandler + * + * @return void + * @throws \RuntimeException if $dbHandler is not an instance of + * {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} + */ + public function setConnection( $dbHandler ) + { + // This obviously violates the Liskov substitution Principle, but with + // the given class design there is no sane other option. Actually the + // dbHandler *should* be passed to the constructor, and there should + // not be the need to post-inject it. + if ( !$dbHandler instanceof \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler ) + { + throw new \RuntimeException( "Invalid dbHandler passed" ); + } + + $this->dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * Stores the file reference in $field for $versionNo + * + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + public function storeFileReference( VersionInfo $versionInfo, Field $field ) + { + $connection = $this->getConnection(); + + $insertQuery = $connection->createInsertQuery(); + $insertQuery->insertInto( + $connection->quoteTable( $this->getStorageTable() ) + ); + + $this->setInsertColumns( $insertQuery, $versionInfo, $field ); + + $insertQuery->prepare()->execute(); + + return false; + } + + /** + * Removes the prepended mime-type directory from $path for legacy storage. + * + * @param string $path + * + * @protected + * + * @return string + */ + public function removeMimeFromPath( $path ) + { + $res = substr( $path, strpos( $path, '/' ) + 1 ); + return $res; + } + + /** + * Returns the file reference data for the given $fieldId in $versionNo + * + * @param mixed $fieldId + * @param int $versionNo + * + * @return array|void + */ + public function getFileReferenceData( $fieldId, $versionNo ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + + $this->setFetchColumns( $selectQuery, $fieldId, $versionNo ); + + $selectQuery->from( + $connection->quoteTable( $this->getStorageTable() ) + )->where( + $selectQuery->expr->lAnd( + $selectQuery->expr->eq( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $selectQuery->bindValue( $fieldId, null, \PDO::PARAM_INT ) + ), + $selectQuery->expr->eq( + $connection->quoteColumn( 'version' ), + $selectQuery->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $selectQuery->prepare(); + $statement->execute(); + + $result = $statement->fetchAll( \PDO::FETCH_ASSOC ); + + if ( count( $result ) < 1 ) + { + return null; + } + + $propertyMap = $this->getPropertyMapping(); + + $convertedResult = array(); + foreach ( reset( $result ) as $column => $value ) + { + $convertedResult[$this->toPropertyName( $column )] = $this->castToPropertyValue( $value, $column ); + } + $convertedResult['path'] = $this->prependMimeToPath( + $convertedResult['path'], + $convertedResult['mimeType'] + ); + + return $convertedResult; + } + + /** + * Returns the property name for the given $columnName + * + * @param string $columnName + * + * @return string + */ + protected function toPropertyName( $columnName ) + { + $propertyMap = $this->getPropertyMapping(); + return ( $propertyMap[$columnName]['name'] ); + } + + /** + * Returns $value casted as specified by {@link getPropertyMapping()}. + * + * @param mixed $value + * @param string $columnName + * + * @return mixed + */ + protected function castToPropertyValue( $value, $columnName ) + { + $propertyMap = $this->getPropertyMapping(); + $castFunction = $propertyMap[$columnName]['cast']; + return $castFunction( $value ); + } + + /** + * Prepends $path with the first part of the given $mimeType. + * + * @param string $path + * @param string $mimeType + * + * @protected + * + * @return string + */ + public function prependMimeToPath( $path, $mimeType ) + { + $res = substr( $mimeType, 0, strpos( $mimeType, '/' ) ) . '/' . $path; + return $res; + } + + /** + * Removes all file references for the given $fieldIds + * + * @param array $fieldIds + * + * @return void + */ + public function removeFileReferences( array $fieldIds, $versionNo ) + { + $connection = $this->getConnection(); + + $deleteQuery = $connection->createDeleteQuery(); + $deleteQuery->deleteFrom( + $connection->quoteTable( $this->getStorageTable() ) + )->where( + $deleteQuery->expr->lAnd( + $deleteQuery->expr->in( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $fieldIds + ), + $deleteQuery->expr->eq( + $connection->quoteColumn( 'version' ), + $deleteQuery->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $deleteQuery->prepare()->execute(); + } + + /** + * Removes a specific file reference for $fieldId and $versionId + * + * @param mixed $fieldId + * @param int $versionNo + * + * @return void + */ + public function removeFileReference( $fieldId, $versionNo ) + { + $connection = $this->getConnection(); + + $deleteQuery = $connection->createDeleteQuery(); + $deleteQuery->deleteFrom( + $connection->quoteTable( $this->getStorageTable() ) + )->where( + $deleteQuery->expr->lAnd( + $deleteQuery->expr->eq( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $deleteQuery->bindValue( $fieldId, null, \PDO::PARAM_INT ) + ), + $deleteQuery->expr->eq( + $connection->quoteColumn( 'version' ), + $deleteQuery->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $deleteQuery->prepare()->execute(); + } + + /** + * Returns a set o file references, referenced by the given $fieldIds. + * + * @param array $fieldIds + * + * @return array + */ + public function getReferencedFiles( array $fieldIds, $versionNo ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + $selectQuery->select( + $connection->quoteColumn( 'filename' ), + $connection->quoteColumn( 'mime_type' ) + )->from( + $connection->quoteTable( $this->getStorageTable() ) + )->where( + $selectQuery->expr->lAnd( + $selectQuery->expr->in( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $fieldIds + ), + $selectQuery->expr->eq( + $connection->quoteColumn( 'version' ), + $selectQuery->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $selectQuery->prepare(); + $statement->execute(); + + $gateway = $this; + return array_map( + function ( $row ) use ( $gateway ) + { + return $gateway->prependMimeToPath( $row['filename'], $row['mime_type'] ); + }, + $statement->fetchAll( \PDO::FETCH_ASSOC ) + ); + } + + /** + * Returns a map with the number of references each file from $files has + * + * @param array $files + * + * @return array + */ + public function countFileReferences( array $files ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + $selectQuery->select( + $connection->quoteColumn( 'filename' ), + $connection->quoteColumn( 'mime_type' ), + $selectQuery->alias( + $selectQuery->expr->count( $connection->quoteColumn( 'contentobject_attribute_id' ) ), + 'count' + ) + )->from( + $connection->quoteTable( $this->getStorageTable() ) + )->where( + $selectQuery->expr->in( + $connection->quoteColumn( 'filename' ), + array_map( + array( $this, 'removeMimeFromPath' ), + $files + ) + ) + )->groupBy( $connection->quoteColumn( 'filename' ) ); + + $statement = $selectQuery->prepare(); + $statement->execute(); + + $countMap = array(); + foreach ( $statement->fetchAll( \PDO::FETCH_ASSOC ) as $row ) + { + $path = $this->prependMimeToPath( $row['filename'], $row['mime_type'] ); + $countMap[$path] = (int)$row['count']; + } + + // Complete counts + foreach ( $files as $path ) + { + // This is already the correct path + if ( !isset( $countMap[$path] ) ) + { + $countMap[$path] = 0; + } + } + + return $countMap; + } +} + diff --git a/eZ/Publish/Core/FieldType/BinaryBase/MimeTypeDetector.php b/eZ/Publish/Core/FieldType/BinaryBase/MimeTypeDetector.php new file mode 100644 index 0000000..d7083f9 --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryBase/MimeTypeDetector.php @@ -0,0 +1,22 @@ +getFileInfo()->file( $path ); + } + + /** + * Creates a new (or re-uses) finfo object and returns it + * + * @return \finfo + */ + protected function getFileInfo() + { + if ( !isset( $this->fileInfo ) ) + { + $this->fileInfo = new \finfo( FILEINFO_MIME_TYPE ); + } + return $this->fileInfo; + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryBase/PathGenerator.php b/eZ/Publish/Core/FieldType/BinaryBase/PathGenerator.php new file mode 100644 index 0000000..3f5ec7e --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryBase/PathGenerator.php @@ -0,0 +1,18 @@ +value->externalData['fileName'], PATHINFO_EXTENSION ); + + return $this->getFirstPartOfMimeType( $field->value->externalData['mimeType'] ) + . '/' . md5( uniqid( microtime( true ), true ) ) + . ( !empty( $extension ) ? '.' . $extension : '' ); + } + + /** + * Extracts the first part (before the '/') from the given $mimeType. + * + * @param string $mimeType + * + * @return string + */ + protected function getFirstPartOfMimeType( $mimeType ) + { + return substr( $mimeType, 0, strpos( $mimeType, '/' ) ); + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryBase/Type.php b/eZ/Publish/Core/FieldType/BinaryBase/Type.php new file mode 100644 index 0000000..03386a0 --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryBase/Type.php @@ -0,0 +1,420 @@ + array( + 'maxFileSize' => array( + 'type' => 'int', + 'default' => false, + ) + ) + ); + + /** + * File service for storing binary files + * + * @var FileService + */ + protected $fileService; + + /** + * MIME type detector + * + * @var MimeTypeDetector + */ + protected $mimeTypeDetector; + + /** + * Creates a new Image FieldType + * + * @param FileService $fileService + * @param MimeTypeDetector $mimeTypeDetector + */ + public function __construct( FileService $fileService, MimeTypeDetector $mimeTypeDetector ) + { + $this->fileService = $fileService; + $this->mimeTypeDetector = $mimeTypeDetector; + } + + /** + * Creates a specific value of the derived class from $inputValue + * + * @param array $inputValue + * + * @return Value + */ + abstract protected function createValue( array $inputValue ); + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + $value = $this->acceptValue( $value ); + + return $value->fileName; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\BinaryBase\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + // construction only from path + if ( is_string( $inputValue ) ) + { + $inputValue = array( 'path' => $inputValue ); + } + + // default construction from array + if ( is_array( $inputValue ) ) + { + $inputValue = $this->createValue( $inputValue ); + } + + if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\BinaryBase\\Value', + $inputValue + ); + } + + // Required parameter $path + if ( !isset( $inputValue->path ) || !$this->fileExists( $inputValue->path ) ) + { + throw new InvalidArgumentType( + '$inputValue->path', + 'Existing fileName', + $inputValue->path + ); + } + + $this->completeValue( $inputValue ); + + // Required parameter $fileName + if ( !isset( $inputValue->fileName ) || !is_string( $inputValue->fileName ) ) + { + throw new InvalidArgumentType( + '$inputValue->fileName', + 'string', + $inputValue->fileName + ); + } + + // Required parameter $fileSize + if ( !isset( $inputValue->fileSize ) || !is_int( $inputValue->fileSize ) ) + { + throw new InvalidArgumentType( + '$inputValue->fileSize', + 'int', + $inputValue->fileSize + ); + } + + return $inputValue; + } + + /** + * Attempts to complete the data in $value + * + * @param Value $value + * + * @return void + */ + protected function completeValue( $value ) + { + if ( !isset( $value->fileSize ) ) + { + $value->fileSize = filesize( $value->path ); + } + + if ( !isset( $value->fileName ) ) + { + $value->fileName = basename( $value->path ); + } + + if ( !isset( $value->mimeType ) ) + { + $value->mimeType = $this->mimeTypeDetector->getMimeType( $value->path ); + } + } + + /** + * BinaryBase does not support sorting + * + * @return boolean + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\BinaryBase\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + // empty value + return null; + } + + return $this->createValue( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\BinaryBase\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + + return array( + 'fileName' => $value->fileName, + 'fileSize' => $value->fileSize, + 'path' => $value->path, + 'mimeType' => $value->mimeType, + ); + } + + /** + * Converts a $value to a persistence value. + * + * In this method the field type puts the data which is stored in the field of content in the repository + * into the property FieldValue::data. The format of $data is a primitive, an array (map) or an object, which + * is then canonically converted to e.g. json/xml structures by future storage engines without + * further conversions. For mapping the $data to the legacy database an appropriate Converter + * (implementing eZ\Publish\Core\Persistence\Legacy\FieldValue\Converter) has implemented for the field + * type. Note: $data should only hold data which is actually stored in the field. It must not + * hold data which is stored externally. + * + * The $externalData property in the FieldValue is used for storing data externally by the + * FieldStorage interface method storeFieldData. + * + * The FieldValuer::sortKey is build by the field type for using by sort operations. + * + * @see \eZ\Publish\SPI\Persistence\Content\FieldValue + * + * @param mixed $value The value of the field type + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue the value processed by the storage engine + */ + public function toPersistenceValue( $value ) + { + // Store original data as external (to indicate they need to be stored) + return new FieldValue( + array( + "data" => null, + "externalData" => $this->toHash( $value ), + "sortKey" => $this->getSortInfo( $value ), + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * This method builds a field type value from the $data and $externalData properties. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + if ( $fieldValue->externalData === null ) + { + // empty value + return null; + } + + // Restored data comes in $data, since it has already been processed + // there might be more data in the persistence value than needed here + $result = $this->fromHash( + array( + 'path' => ( isset( $fieldValue->externalData['path'] ) + ? $fieldValue->externalData['path'] + : null ), + 'fileName' => ( isset( $fieldValue->externalData['fileName'] ) + ? $fieldValue->externalData['fileName'] + : null ), + 'fileSize' => ( isset( $fieldValue->externalData['fileSize'] ) + ? $fieldValue->externalData['fileSize'] + : null ), + 'mimeType' => ( isset( $fieldValue->externalData['mimeType'] ) + ? $fieldValue->externalData['mimeType'] + : null ), + ) + ); + return $result; + } + + /** + * Returns if the given $path exists on the local disc or in the file + * storage + * + * @param string $path + * + * @return boolean + */ + protected function fileExists( $path ) + { + return ( + ( substr( $path, 0, 1 ) === '/' && file_exists( $path ) ) + || $this->fileService->exists( $this->fileService->getStorageIdentifier( $path ) ) + ); + } + + /** + * Validates a field based on the validators in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $errors = array(); + foreach ( (array)$fieldDefinition->getValidatorConfiguration() as $validatorIdentifier => $parameters ) + { + switch ( $validatorIdentifier ) + { + case 'FileSizeValidator': + if ( !isset( $parameters['maxFileSize'] ) || $parameters['maxFileSize'] == false ) + { + // No file size limit + break; + } + // Database stores maxFileSize in MB + if ( $fieldValue !== null && ( $parameters['maxFileSize'] * 1024 * 1024 ) < $fieldValue->fileSize ) + { + $errors[] = new ValidationError( + "The file size cannot exceed %size% byte.", + "The file size cannot exceed %size% bytes.", + array( + "size" => $parameters['maxFileSize'], + ) + ); + } + break; + } + } + return $errors; + } + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + + foreach ( $validatorConfiguration as $validatorIdentifier => $parameters ) + { + switch ( $validatorIdentifier ) + { + case 'FileSizeValidator': + if ( !isset( $parameters['maxFileSize'] ) ) + { + $validationErrors[] = new ValidationError( + "Validator %validator% expects parameter %parameter% to be set.", + null, + array( + "validator" => $validatorIdentifier, + "parameter" => 'maxFileSize', + ) + ); + break; + } + if ( !is_int( $parameters['maxFileSize'] ) && !is_bool( $parameters['maxFileSize'] ) ) + { + $validationErrors[] = new ValidationError( + "Validator %validator% expects parameter %parameter% to be of %type%.", + null, + array( + "validator" => $validatorIdentifier, + "parameter" => 'maxFileSize', + "type" => 'integer', + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + } + } + + return $validationErrors; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryBase/Value.php b/eZ/Publish/Core/FieldType/BinaryBase/Value.php new file mode 100644 index 0000000..29904ca --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryBase/Value.php @@ -0,0 +1,85 @@ + $value ) + { + try + { + $this->$key = $value; + } + catch ( PropertyNotFoundException $e ) + { + throw new InvalidArgumentType( + sprintf( '$imageData->%s', $key ), + 'Property not found', + $value + ); + } + } + } + + /** + * Returns a string representation of the field value. + * This string representation must be compatible with format accepted via + * {@link \eZ\Publish\SPI\FieldType\FieldType::buildValue} + * + * @return string + */ + public function __toString() + { + return (string)$this->path; + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryFile/BinaryFileStorage.php b/eZ/Publish/Core/FieldType/BinaryFile/BinaryFileStorage.php new file mode 100644 index 0000000..0e2f16a --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryFile/BinaryFileStorage.php @@ -0,0 +1,19 @@ + 'downloadCount', + 'cast' => 'intval', + ); + return $propertyMap; + } + + /** + * Set columns to be fetched from the database + * + * This method is intended to be overwritten by derived classes in order to + * add additional columns to be fetched from the database. Please do not + * forget to call the parent when overwriting this method. + * + * @param \ezcQuerySelect $selectQuery + * @param int $fieldId + * @param int $versionNo + * + * @return void + */ + protected function setFetchColumns( \ezcQuerySelect $selectQuery, $fieldId, $versionNo ) + { + $connection = $this->getConnection(); + + parent::setFetchColumns( $selectQuery, $fieldId, $versionNo ); + $selectQuery->select( + $connection->quoteColumn( 'download_count' ) + ); + } + + /** + * Sets the required insert columns to $selectQuery. + * + * This method is intended to be overwritten by derived classes in order to + * add additional columns to be set in the database. Please do not forget + * to call the parent when overwriting this method. + * + * @param \ezcQueryInsert $insertQuery + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + protected function setInsertColumns( \ezcQueryInsert $insertQuery, VersionInfo $versionInfo, Field $field ) + { + $connection = $this->getConnection(); + + parent::setInsertColumns( $insertQuery, $versionInfo, $field ); + $insertQuery->set( + $connection->quoteColumn( 'download_count' ), + $insertQuery->bindValue( $field->value->externalData['downloadCount'], null, \PDO::PARAM_INT ) + ); + } +} + diff --git a/eZ/Publish/Core/FieldType/BinaryFile/Type.php b/eZ/Publish/Core/FieldType/BinaryFile/Type.php new file mode 100644 index 0000000..47d0180 --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryFile/Type.php @@ -0,0 +1,142 @@ +downloadCount ) ) + { + $value->downloadCount = 0; + } + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\BinaryFile\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + $hash = parent::toHash( $value ); + + if ( $hash === null ) + { + return $hash; + } + + $hash['downloadCount'] = $value->downloadCount; + + return $hash; + } + + /** + * Converts a persistence $fieldValue to a Value + * + * This method builds a field type value from the $data and $externalData properties. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + $result = parent::fromPersistenceValue( $fieldValue ); + + if ( $result === null ) + { + // empty value + return null; + } + + $result->downloadCount = ( isset( $fieldValue->externalData['downloadCount'] ) + ? $fieldValue->externalData['downloadCount'] + : 0 ); + + return $result; + } +} diff --git a/eZ/Publish/Core/FieldType/BinaryFile/Value.php b/eZ/Publish/Core/FieldType/BinaryFile/Value.php new file mode 100644 index 0000000..a263860 --- /dev/null +++ b/eZ/Publish/Core/FieldType/BinaryFile/Value.php @@ -0,0 +1,25 @@ +acceptValue( $value ); + + return $value->bool ? '1' : '0'; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Checkbox\Value + */ + public function getEmptyValue() + { + return new Value( false ); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Checkbox\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_bool( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Checkbox\\Value', + $inputValue + ); + } + + if ( !is_bool( $inputValue->bool ) ) + { + throw new InvalidArgumentType( + '$inputValue->bool', + 'boolean', + $inputValue->bool + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + return (int)$value->bool; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Checkbox\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Checkbox\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return $value->bool; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } +} diff --git a/eZ/Publish/Core/FieldType/Checkbox/Value.php b/eZ/Publish/Core/FieldType/Checkbox/Value.php new file mode 100644 index 0000000..841a163 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Checkbox/Value.php @@ -0,0 +1,45 @@ +bool = $boolValue; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + * + * @return string + */ + public function __toString() + { + return $this->bool ? '1' : '0'; + } +} diff --git a/eZ/Publish/Core/FieldType/Country/Exception/InvalidValue.php b/eZ/Publish/Core/FieldType/Country/Exception/InvalidValue.php new file mode 100644 index 0000000..8ca8ebc --- /dev/null +++ b/eZ/Publish/Core/FieldType/Country/Exception/InvalidValue.php @@ -0,0 +1,30 @@ + array( + "type" => "boolean", + "default" => false + ) + ); + + /** + * @var array + */ + protected $countriesInfo; + + /** + * @param array $countriesInfo Array of countries data + */ + public function __construct( array $countriesInfo ) + { + $this->countriesInfo = $countriesInfo; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezcountry"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + return implode( + ", ", + array_map( + function ( $countryInfo ) + { + return $countryInfo["Name"]; + }, + $this->countriesInfo + ) + ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Country\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Country\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_array( $inputValue ) ) + { + if ( empty( $inputValue ) ) + return $this->getEmptyValue(); + + $inputValue = $this->fromHash( $inputValue ); + } + + if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Country\\Value', + $inputValue + ); + } + + if ( !is_array( $inputValue->countries ) ) + { + throw new InvalidArgumentType( + '$inputValue->countries', + 'array', + $inputValue->countries + ); + } + + return $inputValue; + } + + /** + * Validates field value against 'isMultiple' setting. + * + * Does not use validators. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $validationErrors = array(); + $fieldSettings = $fieldDefinition->fieldSettings; + + if ( ( !isset( $fieldSettings["isMultiple"] ) || $fieldSettings["isMultiple"] === false ) + && count( $fieldValue->countries ) > 1 ) + { + $validationErrors[] = new ValidationError( + "Field definition does not allow multiple countries to be selected.", + null, + array() + ); + } + + foreach ( $fieldValue->countries as $alpha2 => $countryInfo ) + { + if ( !isset( $this->countriesInfo[$alpha2] ) ) + { + $validationErrors[] = new ValidationError( + "Country with Alpha2 code '%alpha2%' is not defined in FieldType settings.", + null, + array( + "alpha2" => $alpha2 + ) + ); + } + } + + return $validationErrors; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + if ( $value === null ) + { + return ""; + } + + $countries = array(); + foreach ( $value->countries as $countryInfo ) + { + $countries[] = strtolower( $countryInfo["Name"] ); + } + + sort( $countries ); + + return implode( ",", $countries ); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Country\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + + $countries = array(); + foreach ( $hash as $country ) + { + foreach ( $this->countriesInfo as $countryInfo ) + { + switch ( $country ) + { + case $countryInfo["Name"]: + case $countryInfo["Alpha2"]: + case $countryInfo["Alpha3"]: + $countries[$countryInfo["Alpha2"]] = $countryInfo; + continue 3; + } + } + + throw new InvalidValue( $country ); + } + + return new Value( $countries ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Country\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + + return array_keys( $value->countries ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + foreach ( (array)$fieldSettings as $name => $value ) + { + if ( isset( $this->settingsSchema[$name] ) ) + { + switch ( $name ) + { + case "isMultiple": + if ( !is_bool( $value ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' value must be of boolean type", + null, + array( + "setting" => $name + ) + ); + } + break; + } + } + else + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + "setting" => $name + ) + ); + } + } + + return $validationErrors; + } +} diff --git a/eZ/Publish/Core/FieldType/Country/Value.php b/eZ/Publish/Core/FieldType/Country/Value.php new file mode 100644 index 0000000..419b4d3 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Country/Value.php @@ -0,0 +1,64 @@ + + * array( + * "JP" => array( + * "Name" => "Japan", + * "Alpha2" => "JP", + * "Alpha3" => "JPN", + * "IDC" => 81 + * ) + * ) + * + * + * @var array[] + */ + public $countries = array(); + + /** + * Construct a new Value object and initialize it with given $data + * + * @param array[] $countries + */ + public function __construct( array $countries = array() ) + { + $this->countries = $countries; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return implode( + ", ", + array_map( + function ( $country ) + { + return $country["Name"]; + }, + $this->countries + ) + ); + } +} diff --git a/eZ/Publish/Core/FieldType/DateAndTime/Type.php b/eZ/Publish/Core/FieldType/DateAndTime/Type.php new file mode 100644 index 0000000..75965a7 --- /dev/null +++ b/eZ/Publish/Core/FieldType/DateAndTime/Type.php @@ -0,0 +1,346 @@ + array( + "type" => "bool", + "default" => false + ), + // One of the DEFAULT_* class constants + "defaultType" => array( + "type" => "choice", + "default" => self::DEFAULT_EMPTY + ), + /* + * @var \DateInterval + * Used only if defaultValueType is set to DEFAULT_CURRENT_DATE_ADJUSTED + */ + "dateInterval" => array( + "type" => "dateInterval", + "default" => null + ) + ); + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezdatetime"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + if ( $value === null ) + { + return ''; + } + + return $value->value->format( 'D Y-d-m H:i:s' ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\DateAndTime\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\DateAndTime\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_string( $inputValue ) ) + { + $inputValue = Value::fromString( $inputValue ); + } + if ( is_int( $inputValue ) ) + { + $inputValue = Value::fromTimestamp( $inputValue ); + } + if ( $inputValue instanceof \DateTime ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\DateAndTime\\Value', + $inputValue + ); + } + + if ( isset( $inputValue->value ) && !$inputValue->value instanceof DateTime ) + { + throw new InvalidArgumentType( + '$inputValue->value', + 'DateTime', + $inputValue->value + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @param \eZ\Publish\Core\FieldType\DateAndTime\Value $value + * + * @return array + */ + protected function getSortInfo( $value ) + { + if ( $value === null || $value->value === null ) + { + return null; + } + return $value->value->getTimestamp(); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param int $hash Number of seconds since Unix Epoch + * + * @return \eZ\Publish\Core\FieldType\DateAndTime\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + + if ( isset( $hash['rfc850'] ) && $hash['rfc850'] ) + { + return Value::fromString( $hash['rfc850'] ); + } + + return Value::fromTimestamp( (int)$hash['timestamp'] ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\DateAndTime\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + + if ( $value->value instanceof DateTime ) + { + return array( + 'timestamp' => $value->value->getTimestamp(), + 'rfc850' => $value->value->format( \DateTime::RFC850 ), + ); + } + + return array( + 'timestamp' => 0, + 'rfc850' => null, + ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + foreach ( $fieldSettings as $name => $value ) + { + if ( isset( $this->settingsSchema[$name] ) ) + { + switch ( $name ) + { + case "useSeconds": + if ( !is_bool( $value ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' value must be of boolean type", + null, + array( + "setting" => $name + ) + ); + } + break; + case "defaultType": + $definedTypes = array( + self::DEFAULT_EMPTY, + self::DEFAULT_CURRENT_DATE, + self::DEFAULT_CURRENT_DATE_ADJUSTED + ); + if ( !in_array( $value, $definedTypes ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is of unknown type", + null, + array( + "setting" => $name + ) + ); + } + break; + case "dateInterval": + if ( isset( $value ) ) + { + if ( isset( $fieldSettings["defaultType"] ) && + $fieldSettings["defaultType"] !== self::DEFAULT_CURRENT_DATE_ADJUSTED ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' can be used only when setting '%defaultType%' is set to '%DEFAULT_CURRENT_DATE_ADJUSTED%'", + null, + array( + "setting" => $name, + "defaultType" => "defaultType", + "DEFAULT_CURRENT_DATE_ADJUSTED" => "DEFAULT_CURRENT_DATE_ADJUSTED" + ) + ); + } + else if ( !( $value instanceof \DateInterval ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' value must be an instance of 'DateInterval' class", + null, + array( + "setting" => $name + ) + ); + } + } + break; + } + } + else + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + "setting" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Converts the given $fieldSettings to a simple hash format + * + * This is the default implementation, which just returns the given + * $fieldSettings, assuming they are already in a hash format. Overwrite + * this in your specific implementation, if necessary. + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ) + { + $fieldSettingsHash = parent::fieldSettingsToHash( $fieldSettings ); + + if ( isset( $fieldSettingsHash['dateInterval'] ) ) + { + $fieldSettingsHash['dateInterval'] = $fieldSettingsHash['dateInterval']->format( + 'P%r%yY%r%mM%r%dDT%r%hH%iM%r%sS' + ); + } + + return $fieldSettingsHash; + } + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * + * This is the default implementation, which just returns the given + * $fieldSettingsHash, assuming the supported field settings are already in + * a hash format. Overwrite this in your specific implementation, if + * necessary. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ) + { + $fieldSettings = parent::fieldSettingsFromHash( $fieldSettingsHash ); + + if ( isset( $fieldSettings['dateInterval'] ) ) + { + $fieldSettings['dateInterval'] = new \DateInterval( $fieldSettings['dateInterval'] ); + } + + return $fieldSettings; + } +} diff --git a/eZ/Publish/Core/FieldType/DateAndTime/Value.php b/eZ/Publish/Core/FieldType/DateAndTime/Value.php new file mode 100644 index 0000000..5ae92ed --- /dev/null +++ b/eZ/Publish/Core/FieldType/DateAndTime/Value.php @@ -0,0 +1,98 @@ +value = $dateTime; + } + + /** + * Creates a Value from the given $dateString + * + * @param string $dateString + * + * @return \eZ\Publish\Core\FieldType\DateAndTime\Value + */ + public static function fromString( $dateString ) + { + try + { + return new static( new DateTime( $dateString ) ); + } + catch ( Exception $e ) + { + throw new InvalidArgumentValue( '$dateString', $dateString, __CLASS__, $e ); + } + } + + /** + * Creates a Value from the given $timestamp + * + * @param int $timestamp + * + * @return \eZ\Publish\Core\FieldType\DateAndTime\Value + */ + public static function fromTimestamp( $timestamp ) + { + try + { + return new static( new DateTime( "@{$timestamp}" ) ); + } + catch ( Exception $e ) + { + throw new InvalidArgumentValue( '$timestamp', $timestamp, __CLASS__, $e ); + } + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + if ( !$this->value instanceof DateTime ) + return ""; + + return $this->value->format( $this->stringFormat ); + } +} diff --git a/eZ/Publish/Core/FieldType/EmailAddress/Type.php b/eZ/Publish/Core/FieldType/EmailAddress/Type.php new file mode 100644 index 0000000..9b64aff --- /dev/null +++ b/eZ/Publish/Core/FieldType/EmailAddress/Type.php @@ -0,0 +1,218 @@ + array() + ); + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + $validator = new EmailAddressValidator(); + + foreach ( (array)$validatorConfiguration as $validatorIdentifier => $constraints ) + { + if ( $validatorIdentifier !== 'EmailAddressValidator' ) + { + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + continue; + } + $validationErrors += $validator->validateConstraints( $constraints ); + } + + return $validationErrors; + } + + /** + * Validates a field based on the validators in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); + $constraints = isset($validatorConfiguration['EmailAddressValidator']) ? + $validatorConfiguration['EmailAddressValidator'] : + array(); + $validator = new EmailAddressValidator(); + $validator->initializeWithConstraints( $constraints ); + + if ( !$validator->validate( $fieldValue ) ) + return $validator->getMessage(); + + return array(); + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezemail"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + if ( $value === null ) + { + return ''; + } + + $value = $this->acceptValue( $value ); + return (string)$value->email; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\EmailAddress\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\EmailAddress\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_string( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\EmailAddress\\Value', + $inputValue + ); + } + + if ( !is_string( $inputValue->email ) ) + { + throw new InvalidArgumentType( + '$inputValue->text', + 'string', + $inputValue->email + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @todo String normalization should occur here. + * + * @return array + */ + protected function getSortInfo( $value ) + { + if ( $value === null ) + { + return ''; + } + return $value->email; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\EmailAddress\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\EmailAddress\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return $value->email; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/EmailAddress/Value.php b/eZ/Publish/Core/FieldType/EmailAddress/Value.php new file mode 100644 index 0000000..6b77868 --- /dev/null +++ b/eZ/Publish/Core/FieldType/EmailAddress/Value.php @@ -0,0 +1,43 @@ +email = $email; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->email; + } +} diff --git a/eZ/Publish/Core/FieldType/FieldSettings.php b/eZ/Publish/Core/FieldType/FieldSettings.php new file mode 100644 index 0000000..5f94d92 --- /dev/null +++ b/eZ/Publish/Core/FieldType/FieldSettings.php @@ -0,0 +1,58 @@ +settingsSchema; + } + + /** + * Returns a schema for the validator configuration expected by the FieldType + * + * @see FieldTypeInterface::getValidatorConfigurationSchema() + * + * This implementation returns a three dimensional map containing for each validator configuration + * referenced by identifier a map of supported parameters which are defined by a type and a default value + * (see example). + * + * + * array( + * 'stringLength' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * + * + * @return mixed + */ + public function getValidatorConfigurationSchema() + { + return $this->validatorConfigurationSchema; + } + + /** + * Validates a field based on the validators in the field definition + * + * This is a base implementation, returning an empty array() that indicates + * that no validation errors occurred. Overwrite in derived types, if + * validation is supported. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + return array(); + } + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * This is a base implementation, returning a validation error for each + * specified validator, since by default no validators are supported. + * Overwrite in derived types, if validation is supported. + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + + foreach ( (array)$validatorConfiguration as $validatorIdentifier => $constraints ) + { + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + } + + return $validationErrors; + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + if ( !empty( $fieldSettings ) ) + { + return array( + new ValidationError( + "FieldType '%fieldType%' does not accept settings", + null, + array( + "fieldType" => $this->getFieldTypeIdentifier() + ) + ) + ); + } + + return array(); + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * Return value is mixed. It should be something which is sensible for + * sorting. + * + * It is up to the persistence implementation to handle those values. + * Common string and integer values are safe. + * + * For the legacy storage it is up to the field converters to set this + * value in either sort_key_string or sort_key_int. + * + * @param mixed $value + * + * @return mixed + */ + protected function getSortInfo( $value ) + { + throw new \RuntimeException( "Not implemented, yet." ); + } + + /** + * Converts a $value to a persistence value + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function toPersistenceValue( $value ) + { + // @todo Evaluate if creating the sortKey in every case is really needed + // Couldn't this be retrieved with a method, which would initialize + // that info on request only? + return new FieldValue( + array( + "data" => $this->toHash( $value ), + "externalData" => null, + "sortKey" => $this->getSortInfo( $value ), + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + return $this->fromHash( $fieldValue->data ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return false; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * Default implementation, which performs a "==" check with the value + * returned by {@link getEmptyValue()}. Overwrite in the specific field + * type, if necessary. + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value == $this->getEmptyValue(); + } + + /** + * Potentially builds and checks the type and structure of the $inputValue. + * + * This method first inspects $inputValue and convert it into a dedicated + * value object. + * + * After that, the value is checked for structural validity. + * Note that this does not include validation after the rules + * from validators, but only plausibility checks for the general data + * format. + * + * Note that this method must also cope with the empty value for the field + * type as e.g. returned by {@link getEmptyValue()}. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the parameter is not of the supported value sub type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the value does not match the expected structure + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Value The potentially converted and structurally plausible value. + */ + final public function acceptValue( $inputValue ) + { + if ( $inputValue === null ) + { + return $this->getEmptyValue(); + } + + return $this->internalAcceptValue( $inputValue ); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Value The potentially converted and structurally plausible value. + */ + abstract protected function internalAcceptValue( $inputValue ); + + /** + * Converts the given $fieldSettings to a simple hash format + * + * This is the default implementation, which just returns the given + * $fieldSettings, assuming they are already in a hash format. Overwrite + * this in your specific implementation, if necessary. + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ) + { + return $fieldSettings; + } + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * + * This is the default implementation, which just returns the given + * $fieldSettingsHash, assuming the supported field settings are already in + * a hash format. Overwrite this in your specific implementation, if + * necessary. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ) + { + return $fieldSettingsHash; + } + + /** + * Converts the given $validatorConfiguration to a simple hash format + * + * Default implementation, which just returns the given + * $validatorConfiguration, which is by convention an array for all + * internal field types. Overwrite this method, if necessary. + * + * @param mixed $validatorConfiguration + * + * @return array|hash|scalar|null + */ + public function validatorConfigurationToHash( $validatorConfiguration ) + { + return $validatorConfiguration; + } + + /** + * Converts the given $validatorConfigurationHash to a validator + * configuration of the type + * + * Default implementation, which just returns the given + * $validatorConfigurationHash, since the validator configuration is by + * convention an array for all internal field types. Overwrite this method, + * if necessary. + * + * @param array|hash|scalar|null $validatorConfigurationHash + * + * @return mixed + */ + public function validatorConfigurationFromHash( $validatorConfigurationHash ) + { + return $validatorConfigurationHash; + } +} diff --git a/eZ/Publish/Core/FieldType/FileService.php b/eZ/Publish/Core/FieldType/FileService.php new file mode 100644 index 0000000..825b07c --- /dev/null +++ b/eZ/Publish/Core/FieldType/FileService.php @@ -0,0 +1,92 @@ + , + * 'height' => , + * 'mime' => , + * ); + * + * @param string $storageIdentifier + * + * @return array + * @todo This method should be extracted later into a dedicated class to + * handle meta data. + */ + public function getMetaData( $storageIdentifier ); + + /** + * Returns the file size of the file identified by $storageIdentifier + * + * @param string $storageIdentifier + * + * @return int + */ + public function getFileSize( $storageIdentifier ); + + /** + * Removes the path identified by $storageIdentifier, potentially + * $recursive. + * + * Attempts to removed the path identified by $storageIdentifier. If + * $storageIdentifier is a directory which is not empty and $recursive is + * set to false, an exception is thrown. Attempting to remove a non + * existing $storageIdentifier is silently ignored. + * + * @param string $storageIdentifier + * @param boolean $recursive + * + * @return void + * @throws \RuntimeException if children of $storageIdentifier exist and + * $recursive is false + * @throws \RuntimeException if $storageIdentifier could not be removed (most + * likely permission issues) + */ + public function remove( $storageIdentifier, $recursive = false ); + + /** + * Returns a storage identifier for the given $path + * + * The storage identifier is used to identify $path inside the storage + * encapsulated by the file service. + * + * @param string $path + * + * @return string + */ + public function getStorageIdentifier( $path ); + + /** + * Returns is a file/directory with the given $storageIdentifier exists + * + * @param string $storageIdentifier + * + * @return boolean + */ + public function exists( $storageIdentifier ); +} diff --git a/eZ/Publish/Core/FieldType/FileService/LocalFileService.php b/eZ/Publish/Core/FieldType/FileService/LocalFileService.php new file mode 100644 index 0000000..4d48d54 --- /dev/null +++ b/eZ/Publish/Core/FieldType/FileService/LocalFileService.php @@ -0,0 +1,305 @@ +installDir = $installDir; + $this->storageDir = $storageDir; + $this->identifierPrefix = $identifierPrefix; + } + + /** + * Returns the full path for $path + * + * @param string $path + * + * @return string + */ + protected function getFullPath( $path, $allowLocal = false ) + { + if ( $allowLocal && substr( $path, 0, 1 ) === '/' ) + { + return $path; + } + return $this->installDir . '/' . ( !empty( $this->storageDir ) ? $this->storageDir . '/' : '' ) . $path; + } + + /** + * Store the local file identified by $sourcePath in a location that corresponds + * to $storageIdentifier. Returns an $storageIdentifier again. + * + * @param string $sourcePath + * @param string $storageIdentifier + * + * @return string + */ + public function storeFile( $sourcePath, $storageIdentifier ) + { + $fullSourcePath = $this->getFullPath( $sourcePath, true ); + $fullTargetPath = $this->getFullPath( $storageIdentifier ); + + if ( $fullSourcePath == $fullTargetPath ) + { + // Updating the field, no copy needed + return $storageIdentifier; + } + + $this->createDirectoryRecursive( + dirname( $fullTargetPath ) + ); + + $copyResult = copy( $fullSourcePath, $fullTargetPath ); + + if ( false === $copyResult ) + { + throw new RuntimeException( + sprintf( + 'Could not copy "%s" to "%s"', + $fullSourcePath, + $fullTargetPath + ) + ); + } + + $chmodResult = chmod( $fullTargetPath, 0664 ); + + if ( false === $chmodResult ) + { + throw new RuntimeException( + sprintf( + 'Could not change permissions of "%s" to "%s"', + $fullTargetPath, + '0644' + ) + ); + } + + return $storageIdentifier; + } + + /** + * Removes the path identified by $storageIdentifier, potentially + * $recursive. + * + * Attempts to removed the path identified by $storageIdentifier. If + * $storageIdentifier is a directory which is not empty and $recursive is + * set to false, an exception is thrown. Attempting to remove a non + * existing $storageIdentifier is silently ignored. + * + * @param string $storageIdentifier + * @param boolean $recursive + * + * @return void + * @throws \RuntimeException if children of $storageIdentifier exist and + * $recursive is false + * @throws \RuntimeException if $storageIdentifier could not be removed (most + * likely permission issues) + */ + public function remove( $storageIdentifier, $recursive = false ) + { + $fullPath = $this->getFullPath( $storageIdentifier ); + + $this->removePathInternal( $fullPath, $recursive ); + } + + /** + * Deletes $path, $recursive or not + * + * @param string $path + * @param boolean $recursive + * + * @return void + * @throws RuntimeException if $path is a non-empty directory and + * $recursive is false + * @throws RuntimeException if error occurs during removal + */ + protected function removePathInternal( $path, $recursive ) + { + if ( is_dir( $path ) ) + { + $iterator = new \FilesystemIterator( + $path, + \FilesystemIterator::CURRENT_AS_FILEINFO | \FilesystemIterator::KEY_AS_PATHNAME | \FileSystemIterator::SKIP_DOTS + ); + foreach ( $iterator as $childPath => $fileInfo ) + { + if ( !$recursive ) + { + throw new RuntimeException( + sprintf( + 'Cannot remove "%s", because directory is not empty.', + $path + ) + ); + } + $this->removePathInternal( $childPath, $recursive ); + } + + $rmdirResult = @rmdir( $path ); + if ( false === $rmdirResult ) + { + throw new RuntimeException( + sprintf( 'Could not remove directory "%s"', $path ) + ); + } + } + else if ( is_file( $path ) ) + { + $unlinkResult = @unlink( $path ); + if ( false === $unlinkResult ) + { + throw new RuntimeException( + sprintf( 'Could not remove file "%s"', $path ) + ); + } + } + // If target does not exist, ignore it + } + + /** + * Returns a storage identifier for the given $path + * + * The storage identifier is used to identify $path inside the storage + * encapsulated by the file service. + * + * @param string $path + * + * @return string + */ + public function getStorageIdentifier( $path ) + { + return ( !empty( $this->identifierPrefix ) + ? $this->identifierPrefix . '/' + : '' ) . $path; + } + + /** + * Returns a hash of meta data + * + * array( + * 'width' => , + * 'height' => , + * 'mime' => , + * ); + * + * @param string $storageIdentifier + * + * @return array + */ + public function getMetaData( $storageIdentifier ) + { + // Does not depend on GD + $metaData = getimagesize( $this->getFullPath( $storageIdentifier ) ); + + return array( + 'width' => $metaData[0], + 'height' => $metaData[1], + 'mime' => $metaData['mime'], + ); + } + + /** + * Returns the file size of the file identified by $storageIdentifier + * + * @param string $storageIdentifier + * + * @return int + */ + public function getFileSize( $storageIdentifier ) + { + return filesize( + $this->getFullPath( $storageIdentifier ) + ); + } + + /** + * Returns is a file/directory with the given $storageIdentifier exists + * + * @param string $storageIdentifier + * + * @return boolean + */ + public function exists( $storageIdentifier ) + { + return file_exists( $this->getFullPath( $storageIdentifier ) ); + } + + /** + * Creates the given directory recursively + * + * @param string $directory + * + * @throws RuntimeException if the $directory could not be created + * + * @return void + */ + protected function createDirectoryRecursive( $directory ) + { + if ( is_dir( $directory ) ) + { + return; + } + + if ( $directory === '' ) + { + throw new RuntimeException( "Unable to create empty directory!" ); + } + + $this->createDirectoryRecursive( dirname( $directory ) ); + + $result = @mkdir( $directory, 0775 ); + + if ( false === $result ) + { + throw new RuntimeException( "Could not create directory '{$directory}'." ); + } + + $chmodResult = @chmod( $directory, 0775 ); + + if ( false === $chmodResult ) + { + throw new RuntimeException( + "Could not set permissions 0775 on directory '{$directory}'." + ); + } + } +} diff --git a/eZ/Publish/Core/FieldType/Float/Type.php b/eZ/Publish/Core/FieldType/Float/Type.php new file mode 100644 index 0000000..2cd04fe --- /dev/null +++ b/eZ/Publish/Core/FieldType/Float/Type.php @@ -0,0 +1,272 @@ + array( + 'minFloatValue' => array( + 'type' => 'float', + 'default' => false + ), + 'maxFloatValue' => array( + 'type' => 'float', + 'default' => false + ) + ) + ); + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + + foreach ( (array)$validatorConfiguration as $validatorIdentifier => $constraints ) + { + if ( $validatorIdentifier !== 'FloatValueValidator' ) + { + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + + continue; + } + + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "minFloatValue": + case "maxFloatValue": + if ( $value !== false && !is_numeric( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of numeric type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + } + + return $validationErrors; + } + + /** + * Validates a field based on the validators in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); + $constraints = isset($validatorConfiguration['FloatValueValidator']) ? + $validatorConfiguration['FloatValueValidator'] : + array(); + + $validationErrors = array(); + + if ( isset( $constraints['maxFloatValue'] ) && + $constraints['maxFloatValue'] !== false && $fieldValue->value > $constraints['maxFloatValue'] ) + { + $validationErrors[] = new ValidationError( + "The value can not be higher than %size%.", + null, + array( + "size" => $constraints['maxFloatValue'] + ) + ); + } + + if ( isset( $constraints['minFloatValue'] ) && + $constraints['minFloatValue'] !== false && $fieldValue->value < $constraints['minFloatValue'] ) + { + $validationErrors[] = new ValidationError( + "The value can not be lower than %size%.", + null, + array( + "size" => $constraints['minFloatValue'] + ) + ); + } + + return $validationErrors; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return 'ezfloat'; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + $value = $this->acceptValue( $value ); + + return (string)$value->value; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Float\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value->value === null; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Float\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_int( $inputValue ) ) + { + $inputValue = (float)$inputValue; + } + if ( is_float( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Float\\Value', + $inputValue + ); + } + + if ( !is_float( $inputValue->value ) ) + { + throw new InvalidArgumentType( + '$inputValue->value', + 'float', + $inputValue->value + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @todo Sort seems to not be supported by this FieldType, is this handled correctly? + * + * @return array + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Float\Value $value + */ + public function fromHash( $hash ) + { + if ( empty( $hash ) ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Float\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return $value->value; + } +} diff --git a/eZ/Publish/Core/FieldType/Float/Value.php b/eZ/Publish/Core/FieldType/Float/Value.php new file mode 100644 index 0000000..362b202 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Float/Value.php @@ -0,0 +1,43 @@ +value = $value; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->value; + } +} diff --git a/eZ/Publish/Core/FieldType/GatewayBasedStorage.php b/eZ/Publish/Core/FieldType/GatewayBasedStorage.php new file mode 100644 index 0000000..bcdb388 --- /dev/null +++ b/eZ/Publish/Core/FieldType/GatewayBasedStorage.php @@ -0,0 +1,82 @@ + $gateway ) + { + $this->addGateway( $identifier, $gateway ); + } + } + + /** + * Adds a storage $gateway assigned to the given $identifier + * + * @param string $identifier + * @param \eZ\Publish\Core\FieldType\StorageGateway $gateway + * + * @return void + */ + public function addGateway( $identifier, StorageGateway $gateway ) + { + $this->gateways[$identifier] = $gateway; + } + + /** + * Retrieve the fitting gateway, base on the identifier in $context + * + * @param array $context + * + * @return \eZ\Publish\Core\FieldType\StorageGateway + */ + protected function getGateway( array $context ) + { + if ( !isset( $this->gateways[$context['identifier']] ) ) + { + throw new \OutOfBoundsException( "No gateway for ${context['identifier']} available." ); + } + + $gateway = $this->gateways[$context['identifier']]; + $gateway->setConnection( $context['connection'] ); + + return $gateway; + } +} diff --git a/eZ/Publish/Core/FieldType/Handler.php b/eZ/Publish/Core/FieldType/Handler.php new file mode 100644 index 0000000..441b5f8 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Handler.php @@ -0,0 +1,36 @@ +value->externalData. $field->value->data is simply empty, because no + * internal data is store. + */ +class ImageStorage extends GatewayBasedStorage +{ + /** + * File service to be used + * + * @var FileService + */ + protected $fileService; + + /** + * Path generator + * + * @var PathGenerator + */ + protected $pathGenerator; + + /** + * Construct from gateways + * + * @param \eZ\Publish\Core\FieldType\StorageGateway[] $gateways + * @param FileService $fileService + * @param PathGenerator $pathGenerator + */ + public function __construct( array $gateways, FileService $fileService, PathGenerator $pathGenerator ) + { + parent::__construct( $gateways ); + $this->fileService = $fileService; + $this->pathGenerator = $pathGenerator; + } + + /** + * @see \eZ\Publish\SPI\FieldType\FieldStorage + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $storedValue = isset( $field->value->externalData ) + // New image + ? $field->value->externalData + // Copied / updated image + : $field->value->data; + + $contentMetaData = array( + 'fieldId' => $field->id, + 'versionNo' => $versionInfo->versionNo, + 'languageCode' => $field->languageCode, + ); + + if ( $storedValue === null ) + { + // Store empty value only with content meta data + $field->value->data = $contentMetaData; + return true; + } + + if ( !$this->fileService->exists( $storedValue['path'] ) ) + { + // Only store a new copy of the image, if it does not exist, yet + $nodePathString = $this->getGateway( $context )->getNodePathString( $versionInfo, $field->id ); + + $targetPath = $this->getFieldPath( + $field->id, + $versionInfo->versionNo, + $field->languageCode, + $nodePathString + ) . '/' . $storedValue['fileName']; + + $storedValue['path'] = $this->fileService->storeFile( + $storedValue['path'], + $this->fileService->getStorageIdentifier( $targetPath ) + ); + } + + $this->getGateway( $context )->storeImageReference( $storedValue['path'], $field->id ); + + $storedValue = array_merge( + // Basic value data + $storedValue, + // Image meta data + $this->fileService->getMetaData( $storedValue['path'] ), + // Content meta data + $contentMetaData + ); + + $field->value->data = $storedValue; + $field->value->externalData = null; + + // Data has been updated and needs to be stored! + return true; + } + + /** + * Returns the path where images for the defined $fieldId are stored + * + * @param mixed $fieldId + * @param int $versionNo + * @param string $languageCode + * @param string $nodePathString + * + * @return string + */ + protected function getFieldPath( $fieldId, $versionNo, $languageCode, $nodePathString ) + { + return $this->pathGenerator->getStoragePathForField( + $fieldId, + $versionNo, + $languageCode, + $nodePathString + ); + } + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + if ( $field->value->data !== null ) + { + $field->value->data['fileSize'] = $this->fileService->getFileSize( $field->value->data['path'] ); + } + } + + /** + * @param array $fieldIds + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + $gateway = $this->getGateway( $context ); + + $fieldXmls = $gateway->getXmlForImages( $versionInfo->versionNo, $fieldIds ); + + foreach ( $fieldXmls as $fieldId => $xml ) + { + $fieldStorageIdentifier = $this->extractStorageIdentifier( $xml ); + + if ( $fieldStorageIdentifier === false ) + { + continue; + } + + $gateway->removeImageReferences( $fieldStorageIdentifier, $versionInfo->versionNo, $fieldId ); + + if ( $gateway->countImageReferences( $fieldStorageIdentifier ) === 0 ) + { + $storedFieldFiles = $this->fileService->remove( $fieldStorageIdentifier, true ); + } + } + } + + /** + * Extracts the field storage path from the given $xml string + * + * @param string $xml + * + * @return string|false + */ + protected function extractStorageIdentifier( $xml ) + { + if ( empty( $xml ) ) + { + // Empty image value + return false; + } + + $dom = new \DOMDocument(); + $dom->loadXml( $xml ); + + if ( $dom->documentElement->hasAttribute( 'dirpath' ) ) + { + return $dom->documentElement->getAttribute( 'dirpath' ); + } + return false; + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + // @todo: Correct? + return null; + } +} diff --git a/eZ/Publish/Core/FieldType/Image/ImageStorage/Gateway.php b/eZ/Publish/Core/FieldType/Image/ImageStorage/Gateway.php new file mode 100644 index 0000000..e9b30d0 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Image/ImageStorage/Gateway.php @@ -0,0 +1,66 @@ + 'fieldId', + 'version' => 'versionNo', + 'language_code' => 'languageCode', + 'path_identification_string' => 'nodePathString', + 'data_string' => 'xml', + ); + + /** + * Set database handler for this gateway + * + * @param mixed $dbHandler + * + * @return void + * @throws \RuntimeException if $dbHandler is not an instance of + * {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} + */ + public function setConnection( $dbHandler ) + { + // This obviously violates the Liskov substitution Principle, but with + // the given class design there is no sane other option. Actually the + // dbHandler *should* be passed to the constructor, and there should + // not be the need to post-inject it. + if ( !$dbHandler instanceof \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler ) + { + throw new \RuntimeException( "Invalid dbHandler passed" ); + } + + $this->dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * Returns the node path string of $versionInfo + * + * @param VersionInfo $versionInfo + * + * @return string + */ + public function getNodePathString( VersionInfo $versionInfo ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + $selectQuery->select( 'path_identification_string' ) + ->from( $connection->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $selectQuery->expr->lAnd( + $selectQuery->expr->eq( + $connection->quoteColumn( 'contentobject_id' ), + $selectQuery->bindValue( $versionInfo->contentInfo->id ) + ), + $selectQuery->expr->eq( + $connection->quoteColumn( 'contentobject_version' ), + $selectQuery->bindValue( $versionInfo->versionNo ) + ), + $selectQuery->expr->eq( + $connection->quoteColumn( 'node_id' ), + $connection->quoteColumn( 'main_node_id' ) + ) + ) + ); + $statement = $selectQuery->prepare(); + $statement->execute(); + + return $statement->fetchColumn(); + } + + /** + * Stores a reference to the image in $path for $fieldId + * + * @param string $path + * @param mixed $fieldId + * + * @return void + */ + public function storeImageReference( $path, $fieldId ) + { + $connection = $this->getConnection(); + + $insertQuery = $connection->createInsertQuery(); + $insertQuery->insertInto( $connection->quoteTable( 'ezimagefile' ) ) + ->set( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $insertQuery->bindValue( $fieldId, null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'filepath' ), + $insertQuery->bindValue( $path ) + ); + + $statement = $insertQuery->prepare(); + $statement->execute(); + } + + /** + * Returns a the XML content stored for the given $fieldIds + * + * @param int $versionNo + * @param array $fieldIds + * + * @return array + */ + public function getXmlForImages( $versionNo, array $fieldIds ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + $selectQuery->select( + $connection->quoteColumn( 'id', 'ezcontentobject_attribute' ), + $connection->quoteColumn( 'data_text', 'ezcontentobject_attribute' ) + )->from( + $connection->quoteTable( 'ezcontentobject_attribute' ) + )->where( + $selectQuery->expr->lAnd( + $selectQuery->expr->in( + $connection->quoteColumn( 'id', 'ezcontentobject_attribute' ), + $fieldIds + ) + ) + ); + + $statement = $selectQuery->prepare(); + $statement->execute(); + + $fieldLookup = array(); + foreach ( $statement->fetchAll( \PDO::FETCH_ASSOC ) as $row ) + { + $fieldLookup[$row['id']] = $row['data_text']; + } + + return $fieldLookup; + } + + /** + * Removes all references from $fieldId to a path that starts with $path + * + * @param string $path + * @param mixed $fieldId + * + * @return void + */ + public function removeImageReferences( $path, $versionNo, $fieldId ) + { + $connection = $this->getConnection(); + + $deleteQuery = $connection->createDeleteQuery(); + $deleteQuery->deleteFrom( + $connection->quoteTable( 'ezimagefile' ) + )->where( + $deleteQuery->expr->lAnd( + $deleteQuery->expr->eq( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $deleteQuery->bindValue( $fieldId, null, \PDO::PARAM_INT ) + ), + $deleteQuery->expr->like( + $connection->quoteColumn( 'filepath' ), + $deleteQuery->bindValue( $path . '%' ) + ) + ) + ); + + $statement = $deleteQuery->prepare(); + $statement->execute(); + } + + /** + * Returns the number of recorded references to the given $path + * + * @param string $path + * + * @return int + */ + public function countImageReferences( $path ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + $selectQuery->select( + $selectQuery->expr->count( + $connection->quoteColumn( 'id' ) + ) + )->from( + $connection->quoteTable( 'ezimagefile' ) + )->where( + $selectQuery->expr->like( + $connection->quoteColumn( 'filepath' ), + $selectQuery->bindValue( $path . '%' ) + ) + ); + + $statement = $selectQuery->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } +} + diff --git a/eZ/Publish/Core/FieldType/Image/PathGenerator.php b/eZ/Publish/Core/FieldType/Image/PathGenerator.php new file mode 100644 index 0000000..ebbedf1 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Image/PathGenerator.php @@ -0,0 +1,27 @@ + array( + 'maxFileSize' => array( + 'type' => 'int', + 'default' => false, + ) + ) + ); + + /** + * File service + * + * @var FileService + */ + protected $fileService; + + /** + * Creates a new Image FieldType + * + * @param FileService $fileService + */ + public function __construct( FileService $fileService ) + { + $this->fileService = $fileService; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return 'ezimage'; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + $value = $this->acceptValue( $value ); + + return !empty( $value->alternativeText ) ? $value->alternativeText : $value->originalFilename; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Image\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Image\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + // default construction from array + if ( is_array( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + // just given the file path as a string + else if ( is_string( $inputValue ) ) + { + $inputValue = Value::fromString( $inputValue ); + } + + if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Image\\Value', + $inputValue + ); + } + + // Required parameter $path + if ( !isset( $inputValue->path ) || !$this->fileExists( $inputValue->path ) ) + { + throw new InvalidArgumentType( + '$inputValue->path', + 'Existing fileName', + $inputValue->path + ); + } + // Required parameter $fileName + if ( !isset( $inputValue->fileName ) || !is_string( $inputValue->fileName ) ) + { + throw new InvalidArgumentType( + '$inputValue->fileName', + 'string', + $inputValue->fileName + ); + } + + // Required parameter $fileSize + if ( !isset( $inputValue->fileSize ) || !is_int( $inputValue->fileSize ) ) + { + throw new InvalidArgumentType( + '$inputValue->fileSize', + 'string', + $inputValue->fileSize + ); + } + + // Optional parameter $alternativeText + if ( isset( $inputValue->alternativeText ) && !is_string( $inputValue->alternativeText ) ) + { + throw new InvalidArgumentType( + '$inputValue->alternativeText', + 'string', + $inputValue->alternativeText + ); + } + + return $inputValue; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value->fileName === null; + } + + /** + * Returns if the given $path exists on the local disc or in the file + * storage + * + * @param string $path + * + * @return boolean + */ + protected function fileExists( $path ) + { + return ( + ( substr( $path, 0, 1 ) === '/' && file_exists( $path ) ) + || $this->fileService->exists( $path ) + ); + } + + /** + * Validates a field based on the validators in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $errors = array(); + foreach ( (array)$fieldDefinition->getValidatorConfiguration() as $validatorIdentifier => $parameters ) + { + switch ( $validatorIdentifier ) + { + case 'FileSizeValidator': + if ( !isset( $parameters['maxFileSize'] ) || $parameters['maxFileSize'] == false ) + { + // No file size limit + break; + } + // Database stores maxFileSize in MB + if ( $fieldValue !== null && ( $parameters['maxFileSize'] * 1024 * 1024 ) < $fieldValue->fileSize ) + { + $errors[] = new ValidationError( + "The file size cannot exceed %size% byte.", + "The file size cannot exceed %size% bytes.", + array( + "size" => $parameters['maxFileSize'], + ) + ); + } + break; + } + } + return $errors; + } + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + + foreach ( $validatorConfiguration as $validatorIdentifier => $parameters ) + { + switch ( $validatorIdentifier ) + { + case 'FileSizeValidator': + if ( !isset( $parameters['maxFileSize'] ) ) + { + $validationErrors[] = new ValidationError( + "Validator %validator% expects parameter %parameter% to be set.", + null, + array( + "validator" => $validatorIdentifier, + "parameter" => 'maxFileSize', + ) + ); + break; + } + if ( !is_int( $parameters['maxFileSize'] ) && !is_bool( $parameters['maxFileSize'] ) ) + { + $validationErrors[] = new ValidationError( + "Validator %validator% expects parameter %parameter% to be of %type%.", + null, + array( + "validator" => $validatorIdentifier, + "parameter" => 'maxFileSize', + "type" => 'integer', + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + } + } + + return $validationErrors; + } + + /** + * @see \eZ\Publish\Core\FieldType::getSortInfo() + * @todo Correct? + * + * @return boolean + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Image\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + // empty value + return null; + } + + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Image\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + + return array( + 'alternativeText' => $value->alternativeText, + 'fileName' => $value->fileName, + 'fileSize' => $value->fileSize, + 'path' => $value->path, + ); + } + + /** + * Converts a $value to a persistence value + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function toPersistenceValue( $value ) + { + // Store original data as external (to indicate they need to be stored) + return new FieldValue( + array( + "data" => null, + "externalData" => $this->toHash( $value ), + "sortKey" => $this->getSortInfo( $value ), + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + if ( $fieldValue->data === null ) + { + // empty value + return null; + } + + // Restored data comes in $data, since it has already been processed + // there might be more data in the persistence value than needed here + $result = $this->fromHash( + array( + 'alternativeText' => ( isset( $fieldValue->data['alternativeText'] ) + ? $fieldValue->data['alternativeText'] + : null ), + 'fileName' => ( isset( $fieldValue->data['fileName'] ) + ? $fieldValue->data['fileName'] + : null ), + 'fileSize' => ( isset( $fieldValue->data['fileSize'] ) + ? $fieldValue->data['fileSize'] + : null ), + 'path' => ( isset( $fieldValue->data['path'] ) + ? $fieldValue->data['path'] + : null ), + ) + ); + return $result; + } + +} diff --git a/eZ/Publish/Core/FieldType/Image/Value.php b/eZ/Publish/Core/FieldType/Image/Value.php new file mode 100644 index 0000000..84672ff --- /dev/null +++ b/eZ/Publish/Core/FieldType/Image/Value.php @@ -0,0 +1,127 @@ + $value ) + { + try + { + $this->$key = $value; + } + catch ( PropertyNotFoundException $e ) + { + throw new InvalidArgumentType( + sprintf( '$imageData->%s', $key ), + 'Property not found', + $value + ); + } + } + } + + /** + * Creates a value only from a file path + * + * @param string $path + * + * @return Value + */ + public static function fromString( $path ) + { + if ( !file_exists( $path ) ) + { + throw new InvalidArgumentType( + '$path', + 'existing file', + $path + ); + } + return new static( + array( + 'path' => $path, + 'fileName' => basename( $path ), + 'fileSize' => filesize( $path ), + 'alternativeText' => '', + ) + ); + } + + /** + * Returns the image file size in byte + * + * @return integer + */ + public function getFileSize() + { + return $this->fileSize; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->fileName; + } +} diff --git a/eZ/Publish/Core/FieldType/Integer/Type.php b/eZ/Publish/Core/FieldType/Integer/Type.php new file mode 100644 index 0000000..695e5cc --- /dev/null +++ b/eZ/Publish/Core/FieldType/Integer/Type.php @@ -0,0 +1,279 @@ + array( + 'minIntegerValue' => array( + 'type' => 'int', + 'default' => 0 + ), + 'maxIntegerValue' => array( + 'type' => 'int', + 'default' => false + ) + ) + ); + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + + foreach ( (array)$validatorConfiguration as $validatorIdentifier => $constraints ) + { + if ( $validatorIdentifier !== 'IntegerValueValidator' ) + { + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + + continue; + } + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "minIntegerValue": + case "maxIntegerValue": + if ( $value !== false && !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of integer type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + } + + return $validationErrors; + } + + /** + * Validates a field based on the validators in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); + $constraints = isset($validatorConfiguration['IntegerValueValidator']) ? + $validatorConfiguration['IntegerValueValidator'] : + array(); + + $validationErrors = array(); + + if ( isset( $constraints['maxIntegerValue'] ) && + $constraints['maxIntegerValue'] !== false && $fieldValue->value > $constraints['maxIntegerValue'] ) + { + $validationErrors[] = new ValidationError( + "The value can not be higher than %size%.", + null, + array( + "size" => $constraints['maxIntegerValue'] + ) + ); + } + + if ( isset( $constraints['minIntegerValue'] ) && + $constraints['minIntegerValue'] !== false && $fieldValue->value < $constraints['minIntegerValue'] ) + { + $validationErrors[] = new ValidationError( + "The value can not be lower than %size%.", + null, + array( + "size" => $constraints['minIntegerValue'] + ) + ); + } + + return $validationErrors; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return 'ezinteger'; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + $value = $this->acceptValue( $value ); + + return (string)$value->value; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Integer\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value->value === null; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Integer\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_int( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Integer\\Value', + $inputValue + ); + } + + if ( !is_integer( $inputValue->value ) ) + { + throw new InvalidArgumentType( + '$inputValue->value', + 'integer', + $inputValue->value + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + if ( $value === null ) + { + return null; + } + return $value->value; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Integer\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Integer\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return $value->value; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/Integer/Value.php b/eZ/Publish/Core/FieldType/Integer/Value.php new file mode 100644 index 0000000..c00af56 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Integer/Value.php @@ -0,0 +1,43 @@ +value = $value; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->value; + } +} diff --git a/eZ/Publish/Core/FieldType/Keyword/KeywordStorage.php b/eZ/Publish/Core/FieldType/Keyword/KeywordStorage.php new file mode 100644 index 0000000..0146166 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Keyword/KeywordStorage.php @@ -0,0 +1,88 @@ +value->externalData. $field->value->data is simply empty, because no + * internal data is store. + */ +class KeywordStorage extends GatewayBasedStorage +{ + /** + * @see \eZ\Publish\SPI\FieldType\FieldStorage + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + if ( empty( $field->value->externalData ) ) + { + return; + } + + $gateway = $this->getGateway( $context ); + + $contentTypeID = $gateway->getContentTypeID( $field ); + return $gateway->storeFieldData( $field, $contentTypeID ); + } + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $gateway = $this->getGateway( $context ); + // @todo: This should already retrieve the ContentType ID + return $gateway->getFieldData( $field ); + } + + /** + * @param array $fieldId + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldId, array $context ) + { + // @todo: What about deleting keywords? + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + return null; + } +} diff --git a/eZ/Publish/Core/FieldType/Keyword/KeywordStorage/Gateway.php b/eZ/Publish/Core/FieldType/Keyword/KeywordStorage/Gateway.php new file mode 100644 index 0000000..835d605 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Keyword/KeywordStorage/Gateway.php @@ -0,0 +1,40 @@ +value->externalData + * + * @param Field $field + * + * @return void + */ + abstract public function getFieldData( Field $field ); + + /** + * Retrieve the ContentType ID for the given $field + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * + * @return mixed + */ + abstract public function getContentTypeID( Field $field ); +} + diff --git a/eZ/Publish/Core/FieldType/Keyword/KeywordStorage/Gateway/LegacyStorage.php b/eZ/Publish/Core/FieldType/Keyword/KeywordStorage/Gateway/LegacyStorage.php new file mode 100644 index 0000000..7a56cef --- /dev/null +++ b/eZ/Publish/Core/FieldType/Keyword/KeywordStorage/Gateway/LegacyStorage.php @@ -0,0 +1,329 @@ +dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * Stores the keyword list from $field->value->externalData + * + * @param \eZ\Publish\SPI\Persistence\Content\Field + * @param mixed $contentTypeID + */ + public function storeFieldData( Field $field, $contentTypeID ) + { + $existingKeywordMap = $this->getExistingKeywords( $field->value->externalData, $contentTypeID ); + + $this->deleteOldKeywordAssignements( $field ); + + $this->assignKeywords( + $field->id, + $this->insertKeywords( + array_diff_key( + array_fill_keys( $field->value->externalData, true ), + $existingKeywordMap + ), + $contentTypeID + ) + $existingKeywordMap + ); + } + + /** + * Sets the list of assigned keywords into $field->value->externalData + * + * @param Field $field + * + * @return void + */ + public function getFieldData( Field $field ) + { + $field->value->externalData = $this->getAssignedKeywords( $field->id ); + } + + /** + * Retrieve the ContentType ID for the given $field + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * + * @return mixed + */ + public function getContentTypeID( Field $field ) + { + return $this->loadContentTypeID( $field->fieldDefinitionId ); + } + + /** + * Returns a list of keywords assigned to $fieldId + * + * @param mixed $fieldId + * + * @return string[] + */ + protected function getAssignedKeywords( $fieldId ) + { + $dbHandler = $this->getConnection(); + + $query = $dbHandler->createSelectQuery(); + $query->select( "keyword" ) + ->from( $dbHandler->quoteTable( "ezkeyword" ) ) + ->innerJoin( + $dbHandler->quoteTable( "ezkeyword_attribute_link" ), + $query->expr->eq( + $dbHandler->quoteColumn( "id", "ezkeyword" ), + $dbHandler->quoteColumn( "keyword_id", "ezkeyword_attribute_link" ) + ) + ) + ->where( + $query->expr->eq( + $dbHandler->quoteColumn( "objectattribute_id", "ezkeyword_attribute_link" ), + $fieldId + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_COLUMN, 0 ); + } + + /** + * Retrieves the content type ID for the given $fieldDefinitionId + * + * @param mixed $fieldDefinitionId + * + * @return mixed + */ + protected function loadContentTypeID( $fieldDefinitionId ) + { + $dbHandler = $this->getConnection(); + + $query = $dbHandler->createSelectQuery(); + $query->select( 'contentclass_id' ) + ->from( $dbHandler->quoteTable( 'ezcontentclass_attribute' ) ) + ->where( + $query->expr->eq( 'id', $fieldDefinitionId ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $row = $statement->fetch( \PDO::FETCH_ASSOC ); + + if ( $row === false ) + throw new \RuntimeException( + sprintf( + 'Content Type ID cannot be retrieved based on the field definition ID "%s"', + $fieldDefinitionId + ) + ); + + return $row['contentclass_id']; + } + + /** + * Returns already existing keywords from $keywordList as a map + * + * The map has the following format: + * + * array( + * '' => , + * // ... + * ); + * + * + * @param string[] $keywordList + * @param mixed $contentTypeID + * + * @return mixed[] + */ + protected function getExistingKeywords( $keywordList, $contentTypeID ) + { + $dbHandler = $this->getConnection(); + + // Retrieving potentially existing keywords + $q = $dbHandler->createSelectQuery(); + $q->select( "id", "keyword" ) + ->from( $dbHandler->quoteTable( "ezkeyword" ) ) + ->where( + $q->expr->lAnd( + $q->expr->in( + "keyword", + $keywordList + ), + $q->expr->eq( "class_id", $contentTypeID ) + ) + ); + $statement = $q->prepare(); + $statement->execute(); + + $existingKeywordMap = array(); + + foreach ( $statement->fetchAll( \PDO::FETCH_ASSOC ) as $row ) + { + $existingKeywordMap[$row["keyword"]] = $row["id"]; + } + + return $existingKeywordMap; + } + + /** + * Inserts $keywordsToInsert for $fieldDefinitionId and returns a map of + * these keywords to their ID + * + * The returned array has the following format: + * + * array( + * '' => , + * // ... + * ); + * + * + * @param string[] $keywordsToInsert + * @param mixed $fieldDefinitionId + * + * @return mixed[] + */ + protected function insertKeywords( array $keywordsToInsert, $contentTypeID ) + { + $dbHandler = $this->getConnection(); + + $keywordIdMap = array(); + + // Inserting keywords not yet registered + if ( !empty( $keywordsToInsert ) ) + { + $insertQuery = $dbHandler->createInsertQuery(); + $insertQuery->insertInto( + $dbHandler->quoteTable( "ezkeyword" ) + )->set( + $dbHandler->quoteColumn( "class_id" ), + $insertQuery->bindValue( $contentTypeID, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "keyword" ), + $insertQuery->bindParam( $keyword ) + ); + + $statement = $insertQuery->prepare(); + + foreach ( array_keys( $keywordsToInsert ) as $keyword ) + { + $statement->execute(); + $keywordIdMap[$keyword] = $dbHandler->lastInsertId( + $dbHandler->getSequenceName( 'ezkeyword', 'id' ) + ); + } + unset( $keyword ); + } + + return $keywordIdMap; + } + + protected function deleteOldKeywordAssignements( Field $field ) + { + $dbHandler = $this->getConnection(); + + $deleteQuery = $dbHandler->createDeleteQuery(); + $deleteQuery->deleteFrom( + $dbHandler->quoteTable( "ezkeyword_attribute_link" ) + )->where( + $deleteQuery->expr->eq( + $dbHandler->quoteColumn( "objectattribute_id", "ezkeyword_attribute_link" ), + $deleteQuery->bindValue( $field->id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $deleteQuery->prepare(); + $statement->execute(); + } + + /** + * Assigns keywords from $keywordMap to the field with $fieldId + * + * $keywordMap has the format: + * + * array( + * '' => , + * // ... + * ); + * + * + * @param mixed $fieldId + * @param mixed[] $keywordMap + * + * @return void + */ + protected function assignKeywords( $fieldId, $keywordMap ) + { + $dbHandler = $this->getConnection(); + + $keywordId = null; + + $insertQuery = $dbHandler->createInsertQuery(); + $insertQuery->insertInto( + $dbHandler->quoteTable( "ezkeyword_attribute_link" ) + )->set( + $dbHandler->quoteColumn( "keyword_id" ), + $insertQuery->bindParam( $keywordId ) + )->set( + $dbHandler->quoteColumn( "objectattribute_id" ), + $insertQuery->bindValue( $fieldId ) + ); + + $statement = $insertQuery->prepare(); + + foreach ( $keywordMap as $keyword => $keywordId ) + { + $keywordId = $keywordMap[$keyword]; + $statement->execute(); + } + } +} diff --git a/eZ/Publish/Core/FieldType/Keyword/Type.php b/eZ/Publish/Core/FieldType/Keyword/Type.php new file mode 100644 index 0000000..efe9975 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Keyword/Type.php @@ -0,0 +1,182 @@ +acceptValue( $value ); + + return implode( ', ', $value->values ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Keyword\Value + */ + public function getEmptyValue() + { + return new Value( array() ); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Keyword\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_array( $inputValue ) || is_string( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !( $inputValue instanceof Value ) ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Keyword\\Value', + $inputValue + ); + } + + if ( !is_array( $inputValue->values ) ) + { + throw new InvalidArgumentType( + '$inputValue->values', + 'array', + $inputValue->values + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @todo Review this, created from copy/paste to unblock failing tests! + * According to me (PA) sorting on keywords should not be supported. + * @return array + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Keyword\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Keyword\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return $value->values; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } + + /** + * Converts a $value to a persistence value + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function toPersistenceValue( $value ) + { + return new FieldValue( + array( + "data" => null, + "externalData" => $value->values, + "sortKey" => $this->getSortInfo( $value ), + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + return new Value( $fieldValue->externalData ); + } +} diff --git a/eZ/Publish/Core/FieldType/Keyword/Value.php b/eZ/Publish/Core/FieldType/Keyword/Value.php new file mode 100644 index 0000000..1514913 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Keyword/Value.php @@ -0,0 +1,60 @@ +values = array_unique( $values ); + } + } + + /** + * Returns a string representation of the keyword value. + * + * @return string A comma separated list of tags, eg: "php, eZ Publish, html5" + */ + public function __toString() + { + return implode( ', ', $this->values ); + } +} diff --git a/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage.php b/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage.php new file mode 100644 index 0000000..2b18a82 --- /dev/null +++ b/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage.php @@ -0,0 +1,78 @@ +getGateway( $context ); + + return $gateway->storeFieldData( $versionInfo, $field ); + } + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $gateway = $this->getGateway( $context ); + $gateway->getFieldData( $versionInfo, $field ); + } + + /** + * @param VersionInfo $versionInfo + * @param array $fieldId + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + $this->getGateway( $context )->deleteFieldData( $versionInfo, $fieldIds ); + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + return ( is_array( $field->value->externalData ) ? $field->value->externalData['address'] : null ); + } +} diff --git a/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage/Gateway.php b/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage/Gateway.php new file mode 100644 index 0000000..bba97a4 --- /dev/null +++ b/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage/Gateway.php @@ -0,0 +1,51 @@ +externalData. + * + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return array + */ + abstract public function getFieldData( VersionInfo $versionInfo, Field $field ); + + /** + * Deletes the data for all given $fieldIds + * + * @param VersionInfo $versionInfo + * @param array $fieldIds + * + * @return void + */ + abstract public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds ); +} + diff --git a/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage/Gateway/LegacyStorage.php b/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage/Gateway/LegacyStorage.php new file mode 100644 index 0000000..a42b46e --- /dev/null +++ b/eZ/Publish/Core/FieldType/MapLocation/MapLocationStorage/Gateway/LegacyStorage.php @@ -0,0 +1,281 @@ +dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * Stores the data stored in the given $field + * + * Potentially rewrites data in $field and returns true, if the $field + * needs to be updated in the database. + * + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return boolean If restoring of the internal field data is required + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field ) + { + if ( $field->value->externalData === null ) + { + // Store empty value and return + $this->deleteFieldData( $versionInfo, array( $field->id ) ); + $field->value->data = array( + 'sortKey' => null, + 'hasData' => false, + ); + return; + } + + if ( $this->hasFieldData( $field->id, $versionInfo->versionNo ) ) + { + $this->updateFieldData( $versionInfo, $field ); + } + else + { + $this->storeNewFieldData( $versionInfo, $field ); + } + + $field->value->data = array( + 'sortKey' => $field->value->externalData['address'], + 'hasData' => true, + ); + return true; + } + + /** + * Performs an update on the field data + * + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return boolean + */ + protected function updateFieldData( VersionInfo $versionInfo, Field $field ) + { + $connection = $this->getConnection(); + + $updateQuery = $connection->createUpdateQuery(); + $updateQuery->update( $connection->quoteTable( 'ezgmaplocation' ) ) + ->set( + $connection->quoteColumn( 'latitude' ), + $updateQuery->bindValue( $field->value->externalData['latitude'] ) + )->set( + $connection->quoteColumn( 'longitude' ), + $updateQuery->bindValue( $field->value->externalData['longitude'] ) + )->set( + $connection->quoteColumn( 'address' ), + $updateQuery->bindValue( $field->value->externalData['address'] ) + )->where( + $updateQuery->expr->lAnd( + $updateQuery->expr->eq( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $updateQuery->bindValue( $field->id, null, \PDO::PARAM_INT ) + ), + $updateQuery->expr->eq( + $connection->quoteColumn( 'contentobject_version' ), + $updateQuery->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $updateQuery->prepare()->execute(); + } + + /** + * Stores new field data + * + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + protected function storeNewFieldData( VersionInfo $versionInfo, Field $field ) + { + $connection = $this->getConnection(); + + $insertQuery = $connection->createInsertQuery(); + $insertQuery->insertInto( $connection->quoteTable( 'ezgmaplocation' ) ) + ->set( + $connection->quoteColumn( 'latitude' ), + $insertQuery->bindValue( $field->value->externalData['latitude'] ) + )->set( + $connection->quoteColumn( 'longitude' ), + $insertQuery->bindValue( $field->value->externalData['longitude'] ) + )->set( + $connection->quoteColumn( 'address' ), + $insertQuery->bindValue( $field->value->externalData['address'] ) + )->set( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $insertQuery->bindValue( $field->id, null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'contentobject_version' ), + $insertQuery->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + ); + + $insertQuery->prepare()->execute(); + } + + /** + * Sets the loaded field data into $field->externalData. + * + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return array + */ + public function getFieldData( VersionInfo $versionInfo, Field $field ) + { + $field->value->externalData = $this->loadFieldData( $field->id, $versionInfo->versionNo ); + } + + /** + * Returns the data for the given $fieldId + * + * If no data is found, null is returned. + * + * @param int $fieldId + * + * @return array|null + */ + protected function loadFieldData( $fieldId, $versionNo ) + { + $connection = $this->getConnection(); + + $selectQuery = $connection->createSelectQuery(); + $selectQuery->select( + $connection->quoteColumn( 'latitude' ), + $connection->quoteColumn( 'longitude' ), + $connection->quoteColumn( 'address' ) + )->from( + $connection->quoteTable( 'ezgmaplocation' ) + )->where( + $selectQuery->expr->lAnd( + $selectQuery->expr->eq( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $selectQuery->bindValue( $fieldId, null, \PDO::PARAM_INT ) + ), + $selectQuery->expr->eq( + $connection->quoteColumn( 'contentobject_version' ), + $selectQuery->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $selectQuery->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + + return ( isset( $rows[0] ) ? $rows[0] : null ); + } + + /** + * Returns if field data exists for $fieldId + * + * @param int $fieldId + * @param int $versionNo + * + * @return boolean + */ + protected function hasFieldData( $fieldId, $versionNo ) + { + return ( $this->loadFieldData( $fieldId, $versionNo ) !== null ); + } + + /** + * Deletes the data for all given $fieldIds + * + * @param VersionInfo $versionInfo + * @param array $fieldIds + * + * @return void + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds ) + { + if ( empty( $fieldIds ) ) + { + // Nothing to do + return; + } + + $connection = $this->getConnection(); + + $deleteQuery = $connection->createDeleteQuery(); + $deleteQuery->deleteFrom( + $connection->quoteTable( 'ezgmaplocation' ) + )->where( + $deleteQuery->expr->lAnd( + $deleteQuery->expr->in( + $connection->quoteColumn( 'contentobject_attribute_id' ), + $fieldIds + ), + $deleteQuery->expr->eq( + $connection->quoteColumn( 'contentobject_version' ), + $deleteQuery->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + + $deleteQuery->prepare()->execute(); + } +} + diff --git a/eZ/Publish/Core/FieldType/MapLocation/Type.php b/eZ/Publish/Core/FieldType/MapLocation/Type.php new file mode 100644 index 0000000..fddb7c7 --- /dev/null +++ b/eZ/Publish/Core/FieldType/MapLocation/Type.php @@ -0,0 +1,230 @@ +acceptValue( $value ); + + if ( $value !== null ) + { + return $value->address; + } + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\MapLocation\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value->latitude === null || $value->longitude === null; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\MapLocation\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_array( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\MapLocation\\Value', + $inputValue + ); + } + + if ( !is_float( $inputValue->latitude ) ) + { + throw new InvalidArgumentType( + '$inputValue->latitude', + 'float', + $inputValue->latitude + ); + } + if ( !is_float( $inputValue->longitude ) ) + { + throw new InvalidArgumentType( + '$inputValue->longitude', + 'float', + $inputValue->longitude + ); + } + if ( !is_string( $inputValue->address ) ) + { + throw new InvalidArgumentType( + '$inputValue->address', + 'string', + $inputValue->address + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return string + */ + protected function getSortInfo( $value ) + { + if ( $value !== null ) + { + return $value->address; + } + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\MapLocation\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\MapLocation\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return array( + 'latitude' => $value->latitude, + 'longitude' => $value->longitude, + 'address' => $value->address, + ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } + + /** + * Converts a $value to a persistence value + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function toPersistenceValue( $value ) + { + return new FieldValue( + array( + "data" => null, + "externalData" => $this->toHash( $value ), + "sortKey" => $this->getSortInfo( $value ), + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + if ( $fieldValue->externalData === null ) + { + return null; + } + return $this->fromHash( $fieldValue->externalData ); + } +} diff --git a/eZ/Publish/Core/FieldType/MapLocation/Value.php b/eZ/Publish/Core/FieldType/MapLocation/Value.php new file mode 100644 index 0000000..9b5ae25 --- /dev/null +++ b/eZ/Publish/Core/FieldType/MapLocation/Value.php @@ -0,0 +1,62 @@ + $value ) + { + $this->$key = $value; + } + } + + /** + * Returns a string representation of the keyword value. + * + * @return string A comma separated list of tags, eg: "php, eZ Publish, html5" + */ + public function __toString() + { + return (string)$this->address; + } +} diff --git a/eZ/Publish/Core/FieldType/Media/MediaStorage.php b/eZ/Publish/Core/FieldType/Media/MediaStorage.php new file mode 100644 index 0000000..56e9efb --- /dev/null +++ b/eZ/Publish/Core/FieldType/Media/MediaStorage.php @@ -0,0 +1,19 @@ + 'hasController', + 'cast' => + function ( $val ) + { + return (bool)$val; + }, + ); + $propertyMap['is_autoplay'] = array( + 'name' => 'autoplay', + 'cast' => + function ( $val ) + { + return (bool)$val; + }, + ); + $propertyMap['is_loop'] = array( + 'name' => 'loop', + 'cast' => + function ( $val ) + { + return (bool)$val; + }, + ); + $propertyMap['width'] = array( + 'name' => 'width', + 'cast' => 'intval', + ); + $propertyMap['height'] = array( + 'name' => 'height', + 'cast' => 'intval', + ); + return $propertyMap; + } + + /** + * Set columns to be fetched from the database + * + * This method is intended to be overwritten by derived classes in order to + * add additional columns to be fetched from the database. Please do not + * forget to call the parent when overwriting this method. + * + * @param \ezcQuerySelect $selectQuery + * @param int $fieldId + * @param int $versionNo + * + * @return void + */ + protected function setFetchColumns( \ezcQuerySelect $selectQuery, $fieldId, $versionNo ) + { + $connection = $this->getConnection(); + + parent::setFetchColumns( $selectQuery, $fieldId, $versionNo ); + $selectQuery->select( + $connection->quoteColumn( 'has_controller' ), + $connection->quoteColumn( 'is_autoplay' ), + $connection->quoteColumn( 'is_loop' ), + $connection->quoteColumn( 'width' ), + $connection->quoteColumn( 'height' ) + ); + } + + /** + * Sets the required insert columns to $selectQuery. + * + * This method is intended to be overwritten by derived classes in order to + * add additional columns to be set in the database. Please do not forget + * to call the parent when overwriting this method. + * + * @param \ezcQueryInsert $insertQuery + * @param VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + protected function setInsertColumns( \ezcQueryInsert $insertQuery, VersionInfo $versionInfo, Field $field ) + { + $connection = $this->getConnection(); + + parent::setInsertColumns( $insertQuery, $versionInfo, $field ); + $insertQuery->set( + $connection->quoteColumn( 'controls' ), + $insertQuery->bindValue( '' ) + )->set( + $connection->quoteColumn( 'has_controller' ), + $insertQuery->bindValue( (int)$field->value->externalData['hasController'], null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'height' ), + $insertQuery->bindValue( (int)$field->value->externalData['height'], null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'is_autoplay' ), + $insertQuery->bindValue( (int)$field->value->externalData['autoplay'], null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'is_loop' ), + $insertQuery->bindValue( (int)$field->value->externalData['loop'], null, \PDO::PARAM_INT ) + )->set( + $connection->quoteColumn( 'pluginspage' ), + $insertQuery->bindValue( '' ) + )->set( + $connection->quoteColumn( 'quality' ), + $insertQuery->bindValue( 'high' ) + )->set( + $connection->quoteColumn( 'width' ), + $insertQuery->bindValue( (int)$field->value->externalData['width'], null, \PDO::PARAM_INT ) + ); + } +} + diff --git a/eZ/Publish/Core/FieldType/Media/Type.php b/eZ/Publish/Core/FieldType/Media/Type.php new file mode 100644 index 0000000..889c302 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Media/Type.php @@ -0,0 +1,299 @@ + array( + 'type' => 'choice', + 'default' => self::TYPE_HTML5_VIDEO, + ) + ); + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezmedia"; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Media\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + foreach ( $fieldSettings as $name => $value ) + { + if ( isset( $this->settingsSchema[$name] ) ) + { + switch ( $name ) + { + case "mediaType": + if ( !in_array( $value, self::$availableTypes ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is of unknown type", + null, + array( + "setting" => $name + ) + ); + } + break; + } + } + else + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + "setting" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Creates a specific value of the derived class from $inputValue + * + * @param array $inputValue + * + * @return Value + */ + protected function createValue( array $inputValue ) + { + return new Value( $inputValue ); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Media\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + $inputValue = parent::internalAcceptValue( $inputValue ); + + if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Media\\Value', + $inputValue + ); + } + + if ( !is_bool( $inputValue->hasController ) ) + { + throw new InvalidArgumentType( + '$inputValue->hasController', + 'bool', + $inputValue->hasController + ); + } + if ( !is_bool( $inputValue->autoplay ) ) + { + throw new InvalidArgumentType( + '$inputValue->autoplay', + 'bool', + $inputValue->autoplay + ); + } + if ( !is_bool( $inputValue->loop ) ) + { + throw new InvalidArgumentType( + '$inputValue->loop', + 'bool', + $inputValue->loop + ); + } + + if ( !is_int( $inputValue->height ) ) + { + throw new InvalidArgumentType( + '$inputValue->height', + 'int', + $inputValue->height + ); + } + if ( !is_int( $inputValue->width ) ) + { + throw new InvalidArgumentType( + '$inputValue->width', + 'int', + $inputValue->width + ); + } + + return $inputValue; + } + + /** + * Attempts to complete the data in $value + * + * @param Value $value + * + * @return void + */ + protected function completeValue( $value ) + { + parent::completeValue( $value ); + + if ( !isset( $value->hasController ) ) + { + $value->hasController = false; + } + if ( !isset( $value->autoplay ) ) + { + $value->autoplay = false; + } + if ( !isset( $value->loop ) ) + { + $value->loop = false; + } + + if ( !isset( $value->height ) ) + { + $value->height = 0; + } + if ( !isset( $value->width ) ) + { + $value->width = 0; + } + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Media\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + $hash = parent::toHash( $value ); + + if ( $hash === null ) + { + return $hash; + } + + $hash['hasController'] = $value->hasController; + $hash['autoplay'] = $value->autoplay; + $hash['loop'] = $value->loop; + $hash['width'] = $value->width; + $hash['height'] = $value->height; + + return $hash; + } + + /** + * Converts a persistence $fieldValue to a Value + * + * This method builds a field type value from the $data and $externalData properties. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + $result = parent::fromPersistenceValue( $fieldValue ); + + if ( $result === null ) + { + // empty value + return null; + } + + $result->hasController = ( isset( $fieldValue->externalData['hasController'] ) + ? $fieldValue->externalData['hasController'] + : false ); + $result->autoplay = ( isset( $fieldValue->externalData['autoplay'] ) + ? $fieldValue->externalData['autoplay'] + : false ); + $result->loop = ( isset( $fieldValue->externalData['loop'] ) + ? $fieldValue->externalData['loop'] + : false ); + $result->height = ( isset( $fieldValue->externalData['height'] ) + ? $fieldValue->externalData['height'] + : 0 ); + $result->width = ( isset( $fieldValue->externalData['width'] ) + ? $fieldValue->externalData['width'] + : 0 ); + + return $result; + } +} diff --git a/eZ/Publish/Core/FieldType/Media/Value.php b/eZ/Publish/Core/FieldType/Media/Value.php new file mode 100644 index 0000000..ae48953 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Media/Value.php @@ -0,0 +1,53 @@ +fieldTypeIdentifier = $fieldTypeIdentifier; + } + + /** + * Build a Value object of current FieldType + * + * Build a FiledType\Value object with the provided $value as value. + * + * @param int $value + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @return \eZ\Publish\Core\FieldType\Null\Value + */ + public function buildValue( $value ) + { + return new Value( $value ); + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return $this->fieldTypeIdentifier; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + $value = $this->acceptValue( $value ); + + return (string)$value->value; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Null\Value + */ + public function getEmptyValue() + { + return new Value( null ); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Null\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + if ( isset( $value->value ) ) + { + return $value->value; + } + + return null; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Null\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Null\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( isset( $value->value ) ) + { + return $value->value; + } + + return null; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/Null/Value.php b/eZ/Publish/Core/FieldType/Null/Value.php new file mode 100644 index 0000000..d3ee7af --- /dev/null +++ b/eZ/Publish/Core/FieldType/Null/Value.php @@ -0,0 +1,43 @@ +value = $value; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->value; + } +} diff --git a/eZ/Publish/Core/FieldType/NullStorage.php b/eZ/Publish/Core/FieldType/NullStorage.php new file mode 100644 index 0000000..1c25ee1 --- /dev/null +++ b/eZ/Publish/Core/FieldType/NullStorage.php @@ -0,0 +1,70 @@ +pageService = $pageService; + } + + /** + * Sets property $value for a given $name + * + * @param string $name + * @param mixed $value + */ + public function __set( $name, $value ) + { + $this->properties[$name] = $value; + } + + /** + * Returns property value for a given $name + * + * @param string $name + * + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + * + * @return null + */ + public function __get( $name ) + { + if ( isset( $this->properties[$name] ) ) + return $this->properties[$name]; + + throw new PropertyNotFoundException( $name, get_class( $this ) ); + } + + /** + * Checks whether property for given $name exists + * + * @param string $name + * + * @return boolean + */ + public function __isset( $name ) + { + return isset( $this->properties[$name] ); + } + + /** + * Getter for property list + * + * @return array + */ + public function getProperties() + { + return $this->properties; + } +} diff --git a/eZ/Publish/Core/FieldType/Page/Parts/Block.php b/eZ/Publish/Core/FieldType/Page/Parts/Block.php new file mode 100644 index 0000000..cee135d --- /dev/null +++ b/eZ/Publish/Core/FieldType/Page/Parts/Block.php @@ -0,0 +1,18 @@ +properties['items'][] = $item; + } +} diff --git a/eZ/Publish/Core/FieldType/Page/Parts/Item.php b/eZ/Publish/Core/FieldType/Page/Parts/Item.php new file mode 100644 index 0000000..3151f3a --- /dev/null +++ b/eZ/Publish/Core/FieldType/Page/Parts/Item.php @@ -0,0 +1,15 @@ +properties['zones'][] = $zone; + return $zone; + } + + /** + * Returns zone object by given $index + * + * @param int $index + * + * @return \eZ\Publish\Core\FieldType\Page\Parts\Zone + */ + public function getZone( $index ) + { + return isset( $this->properties['zones'][$index] ) ? $this->properties['zones'][$index] : null; + } +} diff --git a/eZ/Publish/Core/FieldType/Page/Parts/Zone.php b/eZ/Publish/Core/FieldType/Page/Parts/Zone.php new file mode 100644 index 0000000..3251e18 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Page/Parts/Zone.php @@ -0,0 +1,26 @@ +properties['blocks'][] = $block; + return $block; + } +} diff --git a/eZ/Publish/Core/FieldType/Page/Service.php b/eZ/Publish/Core/FieldType/Page/Service.php new file mode 100644 index 0000000..0ee5392 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Page/Service.php @@ -0,0 +1,71 @@ +zoneDefinition = $zoneDefinition; + $this->blockDefinition = $blockDefinition; + } + + /** + * Returns zone definition as an array + * + * @return array + */ + public function getZoneDefinition() + { + return $this->zoneDefinition; + } + + /** + * Returns block definition as an array + * + * @return array + */ + public function getBlockDefinition() + { + return $this->blockDefinition; + } + + /** + * Returns list of available zone definitions + * + * @return array + */ + public function getAvailableZoneTypes() + { + return array_keys( $this->zoneDefinition ); + } +} diff --git a/eZ/Publish/Core/FieldType/Page/Type.php b/eZ/Publish/Core/FieldType/Page/Type.php new file mode 100644 index 0000000..5aac404 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Page/Type.php @@ -0,0 +1,246 @@ + array( + 'type' => 'string', + 'default' => '', + ) + ); + + /** + * @var Service + */ + protected $pageService; + + /** + * @param \eZ\Publish\Core\FieldType\Page\Service $pageService + */ + public function __construct( PageService $pageService ) + { + $this->pageService = $pageService; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezpage"; + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + foreach ( $fieldSettings as $name => $value ) + { + if ( isset( $this->settingsSchema[$name] ) ) + { + switch ( $name ) + { + case 'defaultLayout': + if ( !in_array( $value, $this->pageService->getAvailableZoneTypes() ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is of unknown type", + null, + array( + 'setting' => $name + ) + ); + } + break; + } + } + else + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + 'setting' => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Returns the empty value for this field type. + * + * This value will be used, if no value was provided for a field of this + * type and no default value was specified in the field definition. + * + * @return mixed + */ + public function getEmptyValue() + { + return new Value(); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return mixed + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( unserialize( $hash ) ); + } + + /** + * Converts a Value to a hash + * + * @param mixed $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return serialize( $value->page ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + if ( $fieldValue->data === null ) + { + return null; + } + + return new Value( $fieldValue->data ); + } + + /** + * Converts a $value to a persistence value + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function toPersistenceValue( $value ) + { + if ( $value === null ) + { + return new FieldValue( + array( + "data" => null, + "externalData" => null, + "sortKey" => null + ) + ); + } + + return new FieldValue( + array( + "data" => $value->page, + "externalData" => null, + "sortKey" => $this->getSortInfo( $value ) + ) + ); + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * Return value is mixed. It should be something which is sensible for + * sorting. + * + * It is up to the persistence implementation to handle those values. + * Common string and integer values are safe. + * + * For the legacy storage it is up to the field converters to set this + * value in either sort_key_string or sort_key_int. + * + * @param mixed $value + * + * @return mixed + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + return ''; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Page\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Page\\Value', + $inputValue + ); + } + + return $inputValue; + } +} diff --git a/eZ/Publish/Core/FieldType/Page/Value.php b/eZ/Publish/Core/FieldType/Page/Value.php new file mode 100644 index 0000000..2ef4ff3 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Page/Value.php @@ -0,0 +1,45 @@ +page = $page; + } + + /** + * Returns a string representation of the field value. + * This string representation must be compatible with format accepted via + * {@link \eZ\Publish\SPI\FieldType\FieldType::buildValue} + * + * @return string + */ + public function __toString() + { + return ''; + } +} diff --git a/eZ/Publish/Core/FieldType/Price/SearchField.php b/eZ/Publish/Core/FieldType/Price/SearchField.php new file mode 100644 index 0000000..68e75c9 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Price/SearchField.php @@ -0,0 +1,53 @@ +value->sortKey['sort_key_int'] / 1000, + new Search\FieldType\PriceField() + ), + ); + } + + /** + * Get index field types for search backend + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\FieldType[] + */ + public function getIndexDefinition() + { + return array( + 'value' => new Search\FieldType\PriceField(), + ); + } +} + diff --git a/eZ/Publish/Core/FieldType/Rating/Type.php b/eZ/Publish/Core/FieldType/Rating/Type.php new file mode 100644 index 0000000..c2bedf7 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Rating/Type.php @@ -0,0 +1,159 @@ +isDisabled ) ) + { + throw new InvalidArgumentType( + '$inputValue->isDisabled', + 'boolean', + $inputValue->isDisabled + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Rating\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Rating\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return $value->isDisabled; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } +} diff --git a/eZ/Publish/Core/FieldType/Rating/Value.php b/eZ/Publish/Core/FieldType/Rating/Value.php new file mode 100644 index 0000000..8f53021 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Rating/Value.php @@ -0,0 +1,43 @@ +isDisabled = (bool)$isDisabled; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return $this->isDisabled ? "1" : "0"; + } +} diff --git a/eZ/Publish/Core/FieldType/Relation/RelationStorage.php b/eZ/Publish/Core/FieldType/Relation/RelationStorage.php new file mode 100644 index 0000000..d4b7d92 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Relation/RelationStorage.php @@ -0,0 +1,76 @@ +getGateway( $context ); + return $gateway->storeFieldData( $versionInfo, $field ); + } + + /** + * Populates $field value property based on the external data. + * We don't need to query storage for this, as identical data is stored in data & externalData + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $field->value->externalData = $field->value->data; + } + + /** + * @param VersionInfo $versionInfo + * @param array $fieldId + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + $gateway = $this->getGateway( $context ); + return $gateway->deleteFieldData( $versionInfo, $fieldIds, $context ); + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + } +} diff --git a/eZ/Publish/Core/FieldType/Relation/RelationStorage/Gateway.php b/eZ/Publish/Core/FieldType/Relation/RelationStorage/Gateway.php new file mode 100644 index 0000000..bcab1a6 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Relation/RelationStorage/Gateway.php @@ -0,0 +1,52 @@ +dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * @see \eZ\Publish\Core\FieldType\Url\UrlStorage\Gateway + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field ) + { + $dbHandler = $this->getConnection(); + + if ( empty( $field->value->data['destinationContentId'] ) ) + { + return false; + } + + // insert relation to ezcontentobject_link + $q = $dbHandler->createInsertQuery(); + $q->insertInto( + $dbHandler->quoteTable( self::TABLE ) + )->set( + $dbHandler->quoteColumn( "contentclassattribute_id" ), + $q->bindValue( $field->fieldDefinitionId, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "from_contentobject_id" ), + $q->bindValue( $versionInfo->contentInfo->id, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "from_contentobject_version" ), + $q->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "op_code" ), + $q->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "relation_type" ), + $q->bindValue( APIRelationValue::FIELD, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "to_contentobject_id" ), + $q->bindValue( $field->value->data['destinationContentId'], null, \PDO::PARAM_INT ) + ); + + $q->prepare()->execute(); + + return false; + } + + /** + * @see \eZ\Publish\Core\FieldType\Relation\RelationStorage\Gateway + */ + public function getFieldData( Field $field ) + { + // @todo This is a bit ugly but it should do for now. A roundtrip to the DB isn't really needed here. + $field->value->externalData = $field->value->data; + } + + /** + * @see \eZ\Publish\Core\FieldType\Relation\RelationStorage\Gateway + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldId, array $context ) + { + // @todo implement when content deleting is fixed in the service + } +} diff --git a/eZ/Publish/Core/FieldType/Relation/Type.php b/eZ/Publish/Core/FieldType/Relation/Type.php new file mode 100644 index 0000000..2910a4c --- /dev/null +++ b/eZ/Publish/Core/FieldType/Relation/Type.php @@ -0,0 +1,209 @@ + (int)$destinationContentId ); + */ +class Type extends FieldType +{ + const SELECTION_BROWSE = 0, + SELECTION_DROPDOWN = 1; + + protected $settingsSchema = array( + 'selectionMethod' => array( + 'type' => 'int', + 'default' => self::SELECTION_BROWSE, + ), + 'selectionRoot' => array( + 'type' => 'string', + 'default' => '', + ), + ); + + /** + * @see \eZ\Publish\Core\FieldType\FieldType::validateFieldSettings() + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationResult = array(); + + foreach ( array_keys( $fieldSettings ) as $setting ) + { + if ( !in_array( $setting, array_keys( $this->settingsSchema ) ) ) + { + $validationResult[] = new ValidationError( + "Unknown setting %setting%", + null, + array( 'setting' => $setting ) + ); + } + } + if ( !isset( $fieldSettings['selectionMethod'] ) || + ( $fieldSettings['selectionMethod'] != self::SELECTION_BROWSE && $fieldSettings['selectionMethod'] != self::SELECTION_DROPDOWN ) ) + { + $validationResult[] = new ValidationError( + "Setting selection method must be either %selection_browse% or %selection_dropdown%", + null, + array( 'selection_browse' => self::SELECTION_BROWSE, 'selection_dropdown' => self::SELECTION_DROPDOWN ) + ); + } + + if ( !isset( $fieldSettings['selectionRoot'] ) || + ( !is_string( $fieldSettings['selectionRoot'] ) && !is_numeric( $fieldSettings['selectionRoot'] ) ) ) + { + $validationResult[] = new ValidationError( + "Setting selection root must be either a string or numeric integer" + ); + } + + return $validationResult; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezobjectrelation"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + throw new \RuntimeException( '@todo Implement this method' ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Relation\Value + */ + public function getEmptyValue() + { + return new Value(); + } + + /** + * Checks the type and structure of the $Value. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the parameter is not of the supported value sub type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the value does not match the expected structure + * + * @param mixed $inputValue A ContentInfo or content ID to build from, or a Relation\Value + * + * @return \eZ\Publish\Core\FieldType\Relation\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + // ContentInfo + if ( $inputValue instanceof ContentInfo ) + { + $inputValue = new Value( $inputValue->id ); + } + // content id + else if ( is_integer( $inputValue ) || is_string( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\Repository\\FieldType\\Relation\\Value', + $inputValue + ); + } + + if ( !is_integer( $inputValue->destinationContentId ) && !is_string( $inputValue->destinationContentId ) && $inputValue->destinationContentId !== null ) + { + throw new InvalidArgumentType( + '$inputValue->destinationContentId', + 'string|int', + $inputValue->destinationContentId + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * For this FieldType, the related object's name is returned. + * + * @todo Repository needs to be provided to be able to get Content Relation name(s), and it is in ctor + * + * @return array + */ + protected function getSortInfo( $value ) + { + return (string)$value; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Relation\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash['destinationContentId'] ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Relation\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return array( 'destinationContentId' => $value->destinationContentId ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/Relation/Value.php b/eZ/Publish/Core/FieldType/Relation/Value.php new file mode 100644 index 0000000..39a48f5 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Relation/Value.php @@ -0,0 +1,44 @@ +destinationContentId = $destinationContentId; + } + + /** + * Returns the related content's name + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->destinationContentId; + } +} diff --git a/eZ/Publish/Core/FieldType/RelationList/RelationListStorage/Gateway/LegacyStorage.php b/eZ/Publish/Core/FieldType/RelationList/RelationListStorage/Gateway/LegacyStorage.php new file mode 100644 index 0000000..1543cb3 --- /dev/null +++ b/eZ/Publish/Core/FieldType/RelationList/RelationListStorage/Gateway/LegacyStorage.php @@ -0,0 +1,67 @@ +getConnection(); + $destinationContentId = 0; + + // insert relation to ezcontentobject_link, but bind by reference to $destinationContentId + // to avoid having to create several insert queries. + $q = $dbHandler->createInsertQuery(); + $q->insertInto( + $dbHandler->quoteTable( self::TABLE ) + )->set( + $dbHandler->quoteColumn( "contentclassattribute_id" ), + $q->bindValue( $field->fieldDefinitionId, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "from_contentobject_id" ), + $q->bindValue( $versionInfo->contentInfo->id, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "from_contentobject_version" ), + $q->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "op_code" ), + $q->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "relation_type" ), + $q->bindValue( APIRelationValue::FIELD, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "to_contentobject_id" ), + $q->bindParam( $destinationContentId, null, \PDO::PARAM_INT )// Reference to $destinationContentId + ); + + $stmt = $q->prepare(); + foreach ( $field->value->data['destinationContentIds'] as $dataDestinationContentId ) + { + if ( $dataDestinationContentId === null ) + throw new \RuntimeException( "\$destinationContentId can not be of value null" ); + + $destinationContentId = $dataDestinationContentId; + $stmt->execute(); + } + + return false; + } +} diff --git a/eZ/Publish/Core/FieldType/RelationList/Type.php b/eZ/Publish/Core/FieldType/RelationList/Type.php new file mode 100644 index 0000000..3afefe3 --- /dev/null +++ b/eZ/Publish/Core/FieldType/RelationList/Type.php @@ -0,0 +1,233 @@ + array( (int)$destinationContentId ) ); + */ +class Type extends FieldType +{ + /** + * @todo Consider to add all 6 selection options + * + */ + const SELECTION_BROWSE = 0, + SELECTION_DROPDOWN = 1; + + protected $settingsSchema = array( + 'selectionMethod' => array( + 'type' => 'int', + 'default' => self::SELECTION_BROWSE, + ), + 'selectionDefaultLocation' => array( + 'type' => 'string', + 'default' => null, + ), + 'selectionContentTypes' => array( + 'type' => 'array', + 'default' => array(), + ), + ); + + /** + * @see \eZ\Publish\Core\FieldType\FieldType::validateFieldSettings() + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationResult = array(); + + foreach ( array_keys( $fieldSettings ) as $setting ) + { + if ( !in_array( $setting, array_keys( $this->settingsSchema ) ) ) + { + $validationResult[] = new ValidationError( + "Unknown setting %setting%", + null, + array( 'setting' => $setting ) + ); + } + } + + if ( !isset( $fieldSettings['selectionMethod'] ) + || ( $fieldSettings['selectionMethod'] !== self::SELECTION_BROWSE && $fieldSettings['selectionMethod'] !== self::SELECTION_DROPDOWN ) ) + { + $validationResult[] = new ValidationError( + "Setting selection method must be either %selection_browse% or %selection_dropdown%", + null, + array( 'selection_browse' => self::SELECTION_BROWSE, 'selection_dropdown' => self::SELECTION_DROPDOWN ) + ); + } + + if ( !isset( $fieldSettings['selectionDefaultLocation'] ) + || ( !is_string( $fieldSettings['selectionDefaultLocation'] ) && !is_numeric( $fieldSettings['selectionDefaultLocation'] ) ) ) + { + $validationResult[] = new ValidationError( + "Setting selectionDefaultLocation must be either a string or numeric integer" + ); + } + + if ( isset( $fieldSettings['selectionContentTypes'] ) && !is_array( $fieldSettings['selectionContentTypes'] ) ) + { + $validationResult[] = new ValidationError( + "Setting selectionContentTypes must be a array" + ); + } + + return $validationResult; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezobjectrelationlist"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + throw new \RuntimeException( '@todo Implement this method' ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\RelationList\Value + */ + public function getEmptyValue() + { + return new Value(); + } + + /** + * Checks the type and structure of the $Value. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the parameter is not of the supported value sub type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the value does not match the expected structure + * + * @param mixed $inputValue A ContentInfo, content ID or list of content ID's to build from, or a RelationList\Value + * + * @return \eZ\Publish\Core\FieldType\RelationList\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + // ContentInfo + if ( $inputValue instanceof ContentInfo ) + { + $inputValue = new Value( array( $inputValue->id ) ); + } + // content id + else if ( is_integer( $inputValue ) || is_string( $inputValue ) ) + { + $inputValue = new Value( array( $inputValue ) ); + } + // content id's + else if ( is_array( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\Repository\\FieldType\\RelationList\\Value', + $inputValue + ); + } + + foreach ( $inputValue->destinationContentIds as $key => $destinationContentId ) + { + if ( !is_integer( $destinationContentId ) && !is_string( $destinationContentId ) ) + { + throw new InvalidArgumentType( + "\$inputValue->destinationContentIds[$key]", + 'string|int', + $destinationContentId + ); + } + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * For this FieldType, the related object's name is returned. + * + * @todo What to do here? + * + * @return array + */ + protected function getSortInfo( $value ) + { + return (string)$value; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\RelationList\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash['destinationContentIds'] ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\RelationList\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return array( 'destinationContentIds' => $value->destinationContentIds ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/RelationList/Value.php b/eZ/Publish/Core/FieldType/RelationList/Value.php new file mode 100644 index 0000000..6d923d8 --- /dev/null +++ b/eZ/Publish/Core/FieldType/RelationList/Value.php @@ -0,0 +1,43 @@ +destinationContentIds = $destinationContentIds; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return implode( ',', $this->destinationContentIds ); + } +} diff --git a/eZ/Publish/Core/FieldType/Selection/Type.php b/eZ/Publish/Core/FieldType/Selection/Type.php new file mode 100644 index 0000000..a5c1bd9 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Selection/Type.php @@ -0,0 +1,281 @@ + array( + 'type' => 'bool', + 'default' => false, + ), + 'options' => array( + 'type' => 'hash', + 'default' => array(), + ), + ); + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + if ( !is_array( $fieldSettings ) ) + { + $validationErrors[] = new ValidationError( + "FieldType '%fieldType%' expects settings to be a hash map", + null, + array( + "fieldType" => $this->getFieldTypeIdentifier() + ) + ); + return $validationErrors; + } + + foreach ( $fieldSettings as $settingKey => $settingValue ) + { + switch ( $settingKey ) + { + case 'isMultiple': + if ( !is_bool( $settingValue ) ) + { + $validationErrors[] = new ValidationError( + "FieldType '%fieldType%' expects setting %setting% to be a of type %type%", + null, + array( + "fieldType" => $this->getFieldTypeIdentifier(), + "setting" => $settingKey, + "type" => "bool", + ) + ); + } + break; + case 'options': + if ( !is_array( $settingValue ) ) + { + $validationErrors[] = new ValidationError( + "FieldType '%fieldType%' expects setting %setting% to be a of type %type%", + null, + array( + "fieldType" => $this->getFieldTypeIdentifier(), + "setting" => $settingKey, + "type" => "hash", + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + "setting" => $settingKey + ) + ); + } + } + + return $validationErrors; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezselection"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + throw new \RuntimeException( 'Implement this method' ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Selection\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Selection\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_array( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Selection\\Value', + $inputValue + ); + } + + if ( !is_array( $inputValue->selection ) ) + { + throw new InvalidArgumentType( + '$inputValue->selection', + 'array', + $inputValue->selection + ); + } + + return $inputValue; + } + + /** + * Validates field value against 'isMultiple' and 'options' settings. + * + * Does not use validators. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $validationErrors = array(); + $fieldSettings = $fieldDefinition->fieldSettings; + + if ( ( !isset( $fieldSettings["isMultiple"] ) || $fieldSettings["isMultiple"] === false ) + && count( $fieldValue->selection ) > 1 ) + { + $validationErrors[] = new ValidationError( + "Field definition does not allow multiple options to be selected.", + null, + array() + ); + } + + foreach ( $fieldValue->selection as $optionIndex ) + { + if ( !isset( $fieldSettings["options"][$optionIndex] ) ) + { + $validationErrors[] = new ValidationError( + "Option with index %index% does not exist in the field definition.", + null, + array( + "index" => $optionIndex + ) + ); + } + } + + return $validationErrors; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + return implode( '-', $value->selection ); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Selection\Value $value + */ + public function fromHash( $hash ) + { + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Selection\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return $value->selection; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Get index data for field data for search backend + * + * @param mixed $value + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( $value ) + { + throw new \RuntimeException( '@todo: Implement' ); + } +} diff --git a/eZ/Publish/Core/FieldType/Selection/Value.php b/eZ/Publish/Core/FieldType/Selection/Value.php new file mode 100644 index 0000000..2a23fbd --- /dev/null +++ b/eZ/Publish/Core/FieldType/Selection/Value.php @@ -0,0 +1,43 @@ +selection = $selection; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return implode( ",", $this->selection ); + } +} diff --git a/eZ/Publish/Core/FieldType/StorageGateway.php b/eZ/Publish/Core/FieldType/StorageGateway.php new file mode 100644 index 0000000..e72bf7c --- /dev/null +++ b/eZ/Publish/Core/FieldType/StorageGateway.php @@ -0,0 +1,36 @@ +authors = array( + new Author( array( 'name' => 'Boba Fett', 'email' => 'boba.fett@bountyhunters.com' ) ), + new Author( array( 'name' => 'Darth Vader', 'email' => 'darth.vader@evilempire.biz' ) ), + new Author( array( 'name' => 'Luke Skywalker', 'email' => 'luke@imtheone.net' ) ) + ); + } + + /** + * Returns the field type under test. + * + * This method is used by all test cases to retrieve the field type under + * test. Just create the FieldType instance using mocks from the provided + * get*Mock() methods and/or custom get*Mock() implementations. You MUST + * NOT take care for test case wide caching of the field type, just return + * a new instance from this method! + * + * @return FieldType + */ + protected function createFieldTypeUnderTest() + { + return new AuthorType(); + } + + /** + * Returns the validator configuration schema expected from the field type. + * + * @return array + */ + protected function getValidatorConfigurationSchemaExpectation() + { + return array(); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array(); + } + + /** + * Returns the empty value expected from the field type. + * + * @return \eZ\Publish\Core\FieldType\Author\Value + */ + protected function getEmptyValueExpectation() + { + return new AuthorValue(); + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 'My name', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array( 'foo' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + array(), + new AuthorValue( array() ), + ), + array( + array( + new Author( array( 'name' => 'Boba Fett', 'email' => 'boba.fett@example.com' ) ) + ), + new AuthorValue( + array( + new Author( array( 'id' => 1, 'name' => 'Boba Fett', 'email' => 'boba.fett@example.com' ) ) + ) + ), + ), + array( + array( + new Author( array( 'name' => 'Boba Fett', 'email' => 'boba.fett@example.com' ) ), + new Author( array( 'name' => 'Darth Vader', 'email' => 'darth.vader@example.com' ) ), + ), + new AuthorValue( + array( + new Author( array( 'id' => 1, 'name' => 'Boba Fett', 'email' => 'boba.fett@example.com' ) ), + new Author( array( 'id' => 2, 'name' => 'Darth Vader', 'email' => 'darth.vader@example.com' ) ), + ) + ), + ) + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new AuthorValue( array() ), + array(), + ), + array( + new AuthorValue( + array( + new Author( array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ) ), + ) + ), + array( + array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ), + ), + ), + array( + new AuthorValue( + array( + new Author( array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ) ), + new Author( array( 'id' => 2, 'name' => 'Joe Bielefeld', 'email' => 'bielefeld@example.com' ) ), + ) + ), + array( + array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ), + array( 'id' => 2, 'name' => 'Joe Bielefeld', 'email' => 'bielefeld@example.com' ), + ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + array(), + new AuthorValue( array() ), + ), + array( + array( + array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ), + ), + new AuthorValue( + array( + new Author( array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ) ), + ) + ), + ), + array( + array( + array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ), + array( 'id' => 2, 'name' => 'Joe Bielefeld', 'email' => 'bielefeld@example.com' ), + ), + new AuthorValue( + array( + new Author( array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ) ), + new Author( array( 'id' => 2, 'name' => 'Joe Bielefeld', 'email' => 'bielefeld@example.com' ) ), + ) + ), + ), + ); + } + + protected function tearDown() + { + unset( $this->authors ); + parent::tearDown(); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::getValidatorConfigurationSchema + */ + public function testValidatorConfigurationSchema() + { + $ft = new AuthorType(); + self::assertEmpty( + $ft->getValidatorConfigurationSchema(), + "The validator configuration schema does not match what is expected." + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::getSettingsSchema + */ + public function testSettingsSchema() + { + $ft = new AuthorType(); + self::assertEmpty( + $ft->getSettingsSchema(), + "The settings schema does not match what is expected." + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Type::acceptValue + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testAcceptValueInvalidType() + { + $ft = new AuthorType(); + $ft->acceptValue( $this->getMock( 'eZ\\Publish\\Core\\FieldType\\Value' ) ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Type::acceptValue + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testAcceptValueInvalidFormat() + { + $ft = new AuthorType(); + $value = new AuthorValue; + $value->authors = 'This is not a valid author collection'; + $ft->acceptValue( $value ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Type::acceptValue + */ + public function testAcceptValueValidFormat() + { + $ft = new AuthorType(); + $author = new Author; + $author->name = 'Boba Fett'; + $author->email = 'boba.fett@bountyhunters.com'; + $value = new AuthorValue( array( $author ) ); + $newValue = $ft->acceptValue( $value ); + self::assertSame( $value, $newValue ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Value::__construct + */ + public function testBuildFieldValueWithoutParam() + { + $value = new AuthorValue; + self::assertInstanceOf( 'eZ\\Publish\\Core\\FieldType\\Author\\AuthorCollection', $value->authors ); + self::assertSame( array(), $value->authors->getArrayCopy() ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Value::__construct + */ + public function testBuildFieldValueWithParam() + { + $value = new AuthorValue( $this->authors ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\FieldType\\Author\\AuthorCollection', $value->authors ); + self::assertSame( $this->authors, $value->authors->getArrayCopy() ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Value::__toString + */ + public function testFieldValueToString() + { + $value = new AuthorValue( $this->authors ); + + $authorsName = array(); + foreach ( $this->authors as $author ) + { + $authorsName[] = $author->name; + } + + self::assertSame( implode( ', ', $authorsName ), $value->__toString() ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Type::getName + */ + public function testFieldValueTitle() + { + $ft = new AuthorType(); + $value = new AuthorValue( $this->authors ); + self::assertSame( $this->authors[0]->name, $ft->getName( $value ) ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\AuthorCollection::offsetSet + */ + public function testAddAuthor() + { + $value = new AuthorValue; + $value->authors[] = $this->authors[0]; + self::assertSame( 1, $this->authors[0]->id ); + self::assertSame( 1, count( $value->authors ) ); + + $this->authors[1]->id = 10; + $value->authors[] = $this->authors[1]; + self::assertSame( 10, $this->authors[1]->id ); + + $this->authors[2]->id = -1; + $value->authors[] = $this->authors[2]; + self::assertSame( $this->authors[1]->id + 1, $this->authors[2]->id ); + self::assertSame( 3, count( $value->authors ) ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\AuthorCollection::removeAuthorsById + */ + public function testRemoveAuthors() + { + $existingIds = array(); + foreach ( $this->authors as $author ) + { + $id = mt_rand( 1, 100 ); + if ( in_array( $id, $existingIds ) ) + continue; + $author->id = $id; + $existingIds[] = $id; + } + + $value = new AuthorValue( $this->authors ); + $value->authors->removeAuthorsById( array( $this->authors[1]->id, $this->authors[2]->id ) ); + self::assertSame( count( $this->authors ) - 2, count( $value->authors ) ); + self::assertSame( array( $this->authors[0] ), $value->authors->getArrayCopy() ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/BinaryBaseTest.php b/eZ/Publish/Core/FieldType/Tests/BinaryBaseTest.php new file mode 100644 index 0000000..408c308 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/BinaryBaseTest.php @@ -0,0 +1,200 @@ +getMimeTypeDetectorMock()->expects( $this->any() ) + ->method( 'getMimeType' ) + ->will( $this->returnValue( 'text/plain' ) ); + } + + protected function getValidatorConfigurationSchemaExpectation() + { + return array( + "FileSizeValidator" => array( + "maxFileSize" => array( + "type" => "int", + "default" => false + ) + ) + ); + } + + protected function getSettingsSchemaExpectation() + { + return array(); + } + + public function provideInvalidInputForAcceptValue() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array( 'path' => '/foo/bar' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * valid by the {@link validateValidatorConfiguration()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * 'minIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidValidatorConfiguration() + { + return array( + array( + array() + ), + array( + array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2342, + ) + ) + ), + array( + array( + 'FileSizeValidator' => array( + 'maxFileSize' => false, + ) + ) + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * invalid by the {@link validateValidatorConfiguration()} method. The + * method must return a non-empty array of validation errors when receiving + * one of the provided values. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array( + * 'NonExistentValidator' => array(), + * ), + * ), + * array( + * array( + * // Typos + * 'InTEgervALUeVALIdator' => array( + * 'minIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * // Incorrect value types + * 'minIntegerValue' => true, + * 'maxIntegerValue' => false, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidValidatorConfiguration() + { + return array( + array( + array( + 'NonExistingValidator' => array() + ) + ), + array( + // maxFileSize must be int or bool + array( + 'FileSizeValidator' => array( + 'maxFileSize' => 'foo', + ) + ) + ), + array( + // maxFileSize is required for this validator + array( + 'FileSizeValidator' => array() + ) + ), + ); + } + + protected function getMimeTypeDetectorMock() + { + if ( !isset( $this->mimeTypeDetectorMock ) ) + { + $this->mimeTypeDetectorMock = $this->getMock( + 'eZ\\Publish\\Core\\FieldType\\BinaryBase\\MimeTypeDetector', + array(), + array(), + '', + false + ); + } + return $this->mimeTypeDetectorMock; + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/BinaryFileTest.php b/eZ/Publish/Core/FieldType/Tests/BinaryFileTest.php new file mode 100644 index 0000000..1f953ae --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/BinaryFileTest.php @@ -0,0 +1,267 @@ +getFileServiceMock(), + $this->getMimeTypeDetectorMock() + ); + } + + protected function getEmptyValueExpectation() + { + return new BinaryFileValue; + } + + public function provideInvalidInputForAcceptValue() + { + $baseInput = parent::provideInvalidInputForAcceptValue(); + $binaryFileInput = array( + array( + new BinaryFileValue(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new BinaryFileValue( array( 'path' => '/foo/bar' ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + return array_merge( $baseInput, $binaryFileInput ); + } + + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new BinaryFileValue + ), + array( + __FILE__, + new BinaryFileValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'downloadCount' => 0, + 'mimeType' => 'text/plain', + ) + ) + ), + array( + array( 'path' => __FILE__ ), + new BinaryFileValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'downloadCount' => 0, + 'mimeType' => 'text/plain', + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'fileSize' => 23, + ), + new BinaryFileValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => 23, + 'downloadCount' => 0, + 'mimeType' => 'text/plain', + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'downloadCount' => 42, + ), + new BinaryFileValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'downloadCount' => 42, + 'mimeType' => 'text/plain', + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'mimeType' => 'application/text+php', + ), + new BinaryFileValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'downloadCount' => 0, + 'mimeType' => 'application/text+php', + ) + ) + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new BinaryFileValue( + array( + 'path' => 'some/file/here', + 'fileName' => 'sindelfingen.jpg', + 'fileSize' => 2342, + 'downloadCount' => 0, + 'mimeType' => 'image/jpeg', + ) + ), + array( + 'path' => 'some/file/here', + 'fileName' => 'sindelfingen.jpg', + 'fileSize' => 2342, + 'downloadCount' => 0, + 'mimeType' => 'image/jpeg', + ) + ), + // ... + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null + ), + array( + array( + 'path' => 'some/file/here', + 'fileName' => 'sindelfingen.jpg', + 'fileSize' => 2342, + 'downloadCount' => 0, + 'mimeType' => 'image/jpeg', + ), + new BinaryFileValue( + array( + 'path' => 'some/file/here', + 'fileName' => 'sindelfingen.jpg', + 'fileSize' => 2342, + 'downloadCount' => 0, + 'mimeType' => 'image/jpeg', + ) + ) + ), + // @todo: Provide upload struct (via REST)! + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/CheckboxTest.php b/eZ/Publish/Core/FieldType/Tests/CheckboxTest.php new file mode 100644 index 0000000..fbff333 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/CheckboxTest.php @@ -0,0 +1,288 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new CheckboxValue( 42 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + false, + new CheckboxValue( false ) + ), + array( + true, + new CheckboxValue( true ) + ) + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new CheckboxValue( true ), + true, + ), + array( + new CheckboxValue( false ), + false, + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + true, + new CheckboxValue( true ), + ), + array( + false, + new CheckboxValue( false ), + ), + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Checkbox\Type::toPersistenceValue + */ + public function testToPersistenceValue() + { + $ft = new Checkbox(); + $fieldValue = $ft->toPersistenceValue( new CheckboxValue( true ) ); + + self::assertSame( true, $fieldValue->data ); + self::assertSame( 1, $fieldValue->sortKey ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Checkbox\Value::__construct + */ + public function testBuildFieldValueWithParam() + { + $bool = true; + $value = new CheckboxValue( $bool ); + self::assertSame( $bool, $value->bool ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Checkbox\Value::__construct + */ + public function testBuildFieldValueWithoutParam() + { + $value = new CheckboxValue; + self::assertSame( false, $value->bool ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Checkbox\Value::__toString + */ + public function testFieldValueToString() + { + $valueTrue = new CheckboxValue( true ); + $valueFalse = new CheckboxValue( false ); + self::assertSame( '1', (string)$valueTrue ); + self::assertSame( '0', (string)$valueFalse ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/CountryTest.php b/eZ/Publish/Core/FieldType/Tests/CountryTest.php new file mode 100644 index 0000000..0419c6b --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/CountryTest.php @@ -0,0 +1,395 @@ + array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ), + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ), + "NO" => array( + "Name" => "Norway", + "Alpha2" => "NO", + "Alpha3" => "NOR", + "IDC" => 47, + ), + "KP" => array( + "Name" => "Korea, Democratic People's Republic of", + "Alpha2" => "KP", + "Alpha3" => "PRK", + "IDC" => 850, + ), + "TF" => array( + "Name" => "French Southern Territories", + "Alpha2" => "TF", + "Alpha3" => "ATF", + "IDC" => 0, + ), + "CF" => array( + "Name" => "Central African Republic", + "Alpha2" => "CF", + "Alpha3" => "CAF", + "IDC" => 236, + ), + ) + ); + } + + /** + * Returns the validator configuration schema expected from the field type. + * + * @return array + */ + protected function getValidatorConfigurationSchemaExpectation() + { + return array(); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array( + "isMultiple" => array( + "type" => "boolean", + "default" => false + ) + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return \eZ\Publish\Core\FieldType\Checkbox\Value + */ + protected function getEmptyValueExpectation() + { + return new CountryValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + "LegoLand", + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array( "Norway", "France", "LegoLand" ), + 'eZ\\Publish\\Core\\FieldType\\Country\\Exception\\InvalidValue', + ), + array( + array( "FR", "BE", "LE" ), + 'eZ\\Publish\\Core\\FieldType\\Country\\Exception\\InvalidValue', + ), + array( + array( "FRE", "BEL", "LEG" ), + 'eZ\\Publish\\Core\\FieldType\\Country\\Exception\\InvalidValue', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + array( "BE", "FR" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ), + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ) + ), + array( + array( "Belgium" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ) + ), + array( + array( "BE" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ) + ), + array( + array( "BEL" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ) + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ), + array( "BE" ), + ), + array( + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ), + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ), + array( "BE", "FR" ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + array( "BE" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ) + ) + ), + ), + array( + array( "BE", "FR" ), + new CountryValue( + array( + "BE" => array( + "Name" => "Belgium", + "Alpha2" => "BE", + "Alpha3" => "BEL", + "IDC" => 32, + ), + "FR" => array( + "Name" => "France", + "Alpha2" => "FR", + "Alpha3" => "FRA", + "IDC" => 33, + ) + ) + ), + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/DateAndTimeTest.php b/eZ/Publish/Core/FieldType/Tests/DateAndTimeTest.php new file mode 100644 index 0000000..c5fb173 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/DateAndTimeTest.php @@ -0,0 +1,384 @@ + array( + "type" => "bool", + "default" => false + ), + "defaultType" => array( + "type" => "choice", + "default" => DateAndTime::DEFAULT_EMPTY + ), + "dateInterval" => array( + "type" => "dateInterval", + "default" => null + ) + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new DateAndTimeValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new DateAndTimeValue, + ), + array( + '2012-08-28 12:20 Europe/Berlin', + DateAndTimeValue::fromString( '2012-08-28 12:20 Europe/Berlin' ), + ), + array( + 1346149200, + DateAndTimeValue::fromTimestamp( 1346149200 ) + ), + array( + ( $dateTime = new \DateTime() ), + new DateAndTimeValue( $dateTime ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null, + ), + array( + new DateAndTimeValue( $date = new \DateTime( 'Tue, 28 Aug 2012 12:20:00 +0200' ) ), + array( + 'rfc850' => $date->format( \DateTime::RFC850 ), + 'timestamp' => $date->getTimeStamp(), + ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + $date = new \DateTime( 'Tue, 28 Aug 2012 12:20:00 +0200' ); + + return array( + array( + null, + null, + ), + array( + array( + 'rfc850' => $date->format( \DateTime::RFC850 ), + 'timestamp' => $date->getTimeStamp(), + ), + new DateAndTimeValue( $date ), + ), + array( + array( + 'timestamp' => $date->getTimeStamp(), + ), + DateAndTimeValue::fromTimestamp( $date->getTimeStamp() ), + ), + ); + } + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array() + ), + array( + array( + 'useSeconds' => true, + 'defaultType' => DateAndTime::DEFAULT_EMPTY, + ) + ), + array( + array( + 'useSeconds' => false, + 'defaultType' => DateAndTime::DEFAULT_CURRENT_DATE, + ) + ), + array( + array( + 'useSeconds' => false, + 'defaultType' => DateAndTime::DEFAULT_CURRENT_DATE_ADJUSTED, + 'dateInterval' => new DateInterval( 'P2Y' ), + ) + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + array( + // useSeconds must be bool + 'useSeconds' => 23, + ) + ), + array( + array( + // defaultType must be constant + 'defaultType' => 42, + ) + ), + array( + array( + // No dateInterval allowed with this defaultType + 'defaultType' => DateAndTime::DEFAULT_EMPTY, + 'dateInterval' => new DateInterval( 'P2Y' ), + ) + ), + array( + array( + // dateInterval must be a \DateInterval + 'defaultType' => DateAndTime::DEFAULT_CURRENT_DATE_ADJUSTED, + 'dateInterval' => new stdClass(), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/EmailAddressTest.php b/eZ/Publish/Core/FieldType/Tests/EmailAddressTest.php new file mode 100644 index 0000000..b748688 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/EmailAddressTest.php @@ -0,0 +1,382 @@ + array() + ); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array(); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new EmailAddressValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new EmailAddressValue( 23 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new EmailAddressValue, + ), + array( + 'spam_mail@ex-something.no', + new EmailAddressValue( 'spam_mail@ex-something.no' ), + ), + array( + new EmailAddressValue( 'spam_mail@ex-something.no' ), + new EmailAddressValue( 'spam_mail@ex-something.no' ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new EmailAddressValue(), + '', + ), + array( + new EmailAddressValue( 'spam_mail@ex-something.no' ), + 'spam_mail@ex-something.no', + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null, + ), + array( + '', + new EmailAddressValue(), + ), + array( + 'spam_mail@ex-something.no', + new EmailAddressValue( 'spam_mail@ex-something.no' ), + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * valid by the {@link validateValidatorConfiguration()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( + * 'StringLengthValidator' => array( + * 'minStringLength' => 0, + * 'maxStringLength' => 23, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidValidatorConfiguration() + { + return array( + array( + array() + ), + array( + array( + 'EmailAddressValidator' => array() + ) + ), + array( + array( + 'EmailAddressValidator' => array( + 'Extent' => 'regex', + ) + ) + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * invalid by the {@link validateValidatorConfiguration()} method. The + * method must return a non-empty array of validation errors when receiving + * one of the provided values. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array( + * 'NonExistentValidator' => array(), + * ), + * ), + * array( + * array( + * // Typos + * 'InTEgervALUeVALIdator' => array( + * 'iinStringLength' => 0, + * 'maxStringLength' => 23, + * ) + * ) + * ), + * array( + * array( + * 'StringLengthValidator' => array( + * // Incorrect value types + * 'minStringLength' => true, + * 'maxStringLength' => false, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidValidatorConfiguration() + { + return array( + array( + array( + 'NonExistentValidator' => array(), + ), + ), + array( + array( + 'EmailAddressValidator' => array( + 'Extent' => 23 + ), + ), + ), + array( + array( + 'EmailAddressValidator' => array( + 'Extent' => '', + ), + ), + ), + array( + array( + 'EmailAddressValidator' => array( + 'Extent' => '\\http\\', + ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/EmailAddressValidatorTest.php b/eZ/Publish/Core/FieldType/Tests/EmailAddressValidatorTest.php new file mode 100644 index 0000000..e5333f9 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/EmailAddressValidatorTest.php @@ -0,0 +1,115 @@ +assertInstanceOf( + "eZ\\Publish\\Core\\FieldType\\Validator", + new EmailAddressValidator + ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsInitializeGet() + { + $constraints = array( + "Extent" => "regex", + ); + $validator = new EmailAddressValidator; + $validator->initializeWithConstraints( + $constraints + ); + $this->assertSame( $constraints["Extent"], $validator->Extent ); + + } + + /** + * Test getting constraints schema + * + * @covers \eZ\Publish\Core\FieldType\Validator::getConstraintsSchema + */ + public function testGetConstraintsSchema() + { + $constraintsSchema = array( + "Extent" => array( + "type" => "string", + "default" => "regex" + ), + ); + $validator = new EmailAddressValidator; + $this->assertSame( $constraintsSchema, $validator->getConstraintsSchema() ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsSetGet() + { + $constraints = array( + "Extent" => "regex", + ); + $validator = new EmailAddressValidator; + $validator->Extent = $constraints["Extent"]; + $this->assertSame( $constraints["Extent"], $validator->Extent ); + } + + public function testValidateCorrectEmailAddresses() + { + $validator = new EmailAddressValidator; + $validator->Extent = 'regex'; + $emailAddresses = array( 'john.doe@example.com', 'Info@eZ.No' ); + foreach ( $emailAddresses as $value ) + { + $this->assertTrue( $validator->validate( new EmailAddressValue( $value ) ) ); + $this->assertSame( array(), $validator->getMessage() ); + } + + } + + /** + * Tests validating a wrong value + * + * @covers \eZ\Publish\Core\FieldType\Validator\EmailAddressValidator::validate + */ + public function testValidateWrongEmailAddresses( ) + { + $validator = new EmailAddressValidator; + $validator->Extent = "regex"; + $emailAddresses = array( '.john.doe@example.com', 'Info-at-eZ.No' ); + foreach ( $emailAddresses as $value ) + { + $this->assertFalse( $validator->validate( new EmailAddressValue( $value ) ) ); + } + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/FieldTypeTest.php b/eZ/Publish/Core/FieldType/Tests/FieldTypeTest.php new file mode 100644 index 0000000..3a03454 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/FieldTypeTest.php @@ -0,0 +1,57 @@ +fileServiceMock ); + parent::tearDown(); + } + + /** + * Returns a re-usable file service mock. + * + * Returns a mock unique for the execution of a single test case. The same + * instance can be received multiple times by calling this method. + * + * @return \eZ\Publish\Core\FieldType\FileService + */ + protected function getFileServiceMock() + { + if ( !isset( $this->fileServiceMock ) ) + { + $this->fileServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\FieldType\\FileService', + array(), + array(), + '', + false + ); + } + return $this->fileServiceMock; + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/FileService/LocalFileServiceTest.php b/eZ/Publish/Core/FieldType/Tests/FileService/LocalFileServiceTest.php new file mode 100644 index 0000000..ca41397 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/FileService/LocalFileServiceTest.php @@ -0,0 +1,293 @@ +tmpDir ) ) + { + $tmpPath = tempnam( + sys_get_temp_dir(), + 'eZ-Image-Field-Type' + ); + unlink( $tmpPath ); + mkdir( $tmpPath ); + + $this->tmpDir = $tmpPath; + } + return $this->tmpDir; + } + + /** + * Returns the storage dir used by the file handler + * + * @return string + */ + protected function getStorageDir() + { + return $this->getTempDir() . '/' . $this->storagePath; + } + + /** + * Cleans up the $tmpDir + * + * @return void + */ + protected function tearDown() + { + if ( $this->tmpDir === null ) + { + return; + } + + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator( + $this->getTempDir(), + \FileSystemIterator::KEY_AS_PATHNAME | \FileSystemIterator::SKIP_DOTS | \FilesystemIterator::CURRENT_AS_FILEINFO + ), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ( $iterator as $path => $fileInfo ) + { + if ( $fileInfo->isDir() ) + { + rmdir( $path ); + } + else + { + unlink( $path ); + } + } + + rmdir( $this->getTempDir() ); + } + + /** + * Returns the file service under test + * + * @return LocalFileService + */ + protected function getFileService() + { + if ( !isset( $this->fileService ) ) + { + $this->fileService = new LocalFileService( + $this->getTempDir(), + $this->storagePath, + $this->storageIdentifierPrefix + ); + } + return $this->fileService; + } + + public function testGetStorageIdentifier() + { + $this->assertEquals( + 'my/fancy/site/some/sindelfingen/file.foo', + $this->getFileService()->getStorageIdentifier( 'some/sindelfingen/file.foo' ) + ); + } + + public function testStoreExternalFile() + { + $externalFile = __FILE__; + $target = 'some/target/file.foo'; + + $fileService = $this->getFileService(); + + $storedPath = $fileService->storeFile( + $externalFile, + $fileService->getStorageIdentifier( $target ) + ); + + $this->assertEquals( + sprintf( + '%s/%s', + $this->storageIdentifierPrefix, + $target + ), + $storedPath + ); + + return $storedPath; + } + + public function testStoreExternalFileExists() + { + $storedPath = $this->testStoreExternalFile(); + + $this->assertTrue( + file_exists( $this->getStorageDir() . '/' . $storedPath ) + ); + } + + public function testStoreExternalFilePermissions() + { + $storedPath = $this->testStoreExternalFile(); + + $this->assertEquals( + 0664, + fileperms( $this->getStorageDir() . '/' . $storedPath ) & 0777 + ); + } + + public function testStoreExternalFileDirectoryPermissions() + { + $storedPath = $this->testStoreExternalFile(); + + $this->assertEquals( + 0775, + fileperms( dirname( $this->getStorageDir() . '/' . $storedPath ) ) & 0777 + ); + } + + public function testStoreExternalFileContent() + { + $storedPath = $this->testStoreExternalFile(); + + $this->assertSame( + file_get_contents( __FILE__ ), + file_get_contents( $this->getStorageDir() . '/' . $storedPath ) + ); + } + + public function testStoreInternalFile() + { + $internalFile = $this->testStoreExternalFile(); + + $fileService = $this->getFileService(); + + $storedPath = $fileService->storeFile( $internalFile, 'new/destination/bar.foo' ); + + $this->assertTrue( + file_exists( $this->getStorageDir() . '/' . $storedPath ) + ); + + return $storedPath; + } + + public function testStoreInternalFileContent() + { + $storedPath = $this->testStoreInternalFile(); + + $this->assertSame( + file_get_contents( __FILE__ ), + file_get_contents( $this->getStorageDir() . '/' . $storedPath ) + ); + } + + public function testRemovePathFile() + { + $storedPath = $this->testStoreExternalFile(); + + $fileService = $this->getFileService(); + + $fileService->remove( $storedPath ); + + $this->assertFalse( + file_exists( $this->getStorageDir() . '/' . $storedPath ) + ); + } + + public function testRemovePathDirNonRecursive() + { + $storedPath = $this->testStoreExternalFile(); + + $fileService = $this->getFileService(); + + $fileService->remove( $storedPath ); + $fileService->remove( dirname( $storedPath ) ); + + $this->assertFalse( + file_exists( dirname( $this->getStorageDir() . '/' . $storedPath ) ) + ); + } + + /** + * @expectedException \RuntimeException + */ + public function testRemovePathDirNonRecursiveFailure() + { + $storedPath = $this->testStoreExternalFile(); + + $fileService = $this->getFileService(); + + $fileService->remove( dirname( $storedPath ) ); + } + + public function testRemovePathDirRecursive() + { + $storedPath = $this->testStoreExternalFile(); + + $fileService = $this->getFileService(); + + $fileService->remove( dirname( $storedPath ), true ); + + $this->assertFalse( + file_exists( dirname( $this->getStorageDir() . '/' . $storedPath ) ) + ); + } + + public function testGetFileSize() + { + $storedPath = $this->testStoreExternalFile(); + + $fileService = $this->getFileService(); + + $size = $fileService->getFileSize( $storedPath ); + + $this->assertEquals( + filesize( __FILE__ ), + $size + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/FileSizeValidatorTest.php b/eZ/Publish/Core/FieldType/Tests/FileSizeValidatorTest.php new file mode 100644 index 0000000..af3d557 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/FileSizeValidatorTest.php @@ -0,0 +1,302 @@ +assertInstanceOf( + "eZ\\Publish\\Core\\FieldType\\Validator", + new FileSizeValidator + ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsInitializeGet() + { + $constraints = array( + "maxFileSize" => 4096, + ); + $validator = new FileSizeValidator; + $validator->initializeWithConstraints( + $constraints + ); + $this->assertSame( $constraints["maxFileSize"], $validator->maxFileSize ); + } + + /** + * Test getting constraints schema + * + * @covers \eZ\Publish\Core\FieldType\Validator::getConstraintsSchema + */ + public function testGetConstraintsSchema() + { + $constraintsSchema = array( + "maxFileSize" => array( + "type" => "int", + "default" => false + ) + ); + $validator = new FileSizeValidator; + $this->assertSame( $constraintsSchema, $validator->getConstraintsSchema() ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsSetGet() + { + $constraints = array( + "maxFileSize" => 4096, + ); + $validator = new FileSizeValidator; + $validator->maxFileSize = $constraints["maxFileSize"]; + $this->assertSame( $constraints["maxFileSize"], $validator->maxFileSize ); + } + + /** + * Tests initializing with a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testInitializeBadConstraint() + { + $constraints = array( + "unexisting" => 0, + ); + $validator = new FileSizeValidator; + $validator->initializeWithConstraints( + $constraints + ); + } + + /** + * Tests setting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testSetBadConstraint() + { + $validator = new FileSizeValidator; + $validator->unexisting = 0; + } + + /** + * Tests getting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__get + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testGetBadConstraint() + { + $validator = new FileSizeValidator; + $null = $validator->unexisting; + } + + /** + * Tests validating a correct value + * + * @param int $size + * + * @dataProvider providerForValidateOK + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validate + * @covers \eZ\Publish\Core\FieldType\Validator::getMessage + */ + public function testValidateCorrectValues( $size ) + { + $this->markTestIncomplete( 'BinaryFile field type does not use this validator anymore.' ); + $validator = new FileSizeValidator; + $validator->maxFileSize = 4096; + $this->assertTrue( $validator->validate( $this->getBinaryFileValue( $size ) ) ); + $this->assertSame( array(), $validator->getMessage() ); + } + + /** + * @param int $size + * + * @return \eZ\Publish\Core\FieldType\BinaryFile\Value + */ + protected function getBinaryFileValue( $size ) + { + $this->markTestIncomplete( 'BinaryFile field type does not use this validator anymore.' ); + $value = new BinaryFileValue( $this->getMock( 'eZ\\Publish\\API\\Repository\\IOService' ) ); + $value->file = new BinaryFile( array( "size" => $size ) ); + + return $value; + } + + public function providerForValidateOK() + { + return array( + array( 0 ), + array( 512 ), + array( 4096 ), + ); + } + + /** + * Tests validating a wrong value + * + * @dataProvider providerForValidateKO + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validate + */ + public function testValidateWrongValues( $size, $message, $values ) + { + $this->markTestIncomplete( 'BinaryFile field type does not use this validator anymore.' ); + $validator = new FileSizeValidator; + $validator->maxFileSize = $this->getMaxFileSize(); + $this->assertFalse( $validator->validate( $this->getBinaryFileValue( $size ) ) ); + $messages = $validator->getMessage(); + $this->assertCount( 1, $messages ); + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\FieldType\\ValidationError", + $messages[0] + ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Plural", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $message[0], + $messages[0]->getTranslatableMessage()->singular + ); + $this->assertEquals( + $message[1], + $messages[0]->getTranslatableMessage()->plural + ); + $this->assertEquals( + $values, + $messages[0]->getTranslatableMessage()->values + ); + } + + public function providerForValidateKO() + { + return array( + array( + 8192, + array( + "The file size cannot exceed %size% byte.", + "The file size cannot exceed %size% bytes." + ), + array( "size" => $this->getMaxFileSize() ) + ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsOK + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsCorrectValues( $constraints ) + { + $validator = new FileSizeValidator; + + $this->assertEmpty( + $validator->validateConstraints( $constraints ) + ); + } + + public function providerForValidateConstraintsOK() + { + return array( + array( + array(), + array( "maxFileSize" => false ), + array( "maxFileSize" => 0 ), + array( "maxFileSize" => -5 ), + array( "maxFileSize" => 4096 ), + ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsKO + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsWrongValues( $constraints, $expectedMessages, $values ) + { + $validator = new FileSizeValidator; + $messages = $validator->validateConstraints( $constraints ); + + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Message", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $expectedMessages[0], + $messages[0]->getTranslatableMessage()->message + ); + $this->assertEquals( + $values, + $messages[0]->getTranslatableMessage()->values + ); + } + + public function providerForValidateConstraintsKO() + { + return array( + array( + array( "maxFileSize" => true ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( "parameter" => "maxFileSize" ) + ), + array( + array( "maxFileSize" => "five thousand bytes" ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( "parameter" => "maxFileSize" ) + ), + array( + array( "maxFileSize" => new \DateTime() ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( "parameter" => "maxFileSize" ) + ), + array( + array( "brljix" => 12345 ), + array( "Validator parameter '%parameter%' is unknown" ), + array( "parameter" => "brljix" ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/FloatTest.php b/eZ/Publish/Core/FieldType/Tests/FloatTest.php new file mode 100644 index 0000000..eb42b63 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/FloatTest.php @@ -0,0 +1,415 @@ + array( + "minFloatValue" => array( + "type" => "float", + "default" => false + ), + "maxFloatValue" => array( + "type" => "float", + "default" => false + ) + ) + ); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array(); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new FloatValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 'foo', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new FloatValue( 'foo' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new FloatValue, + ), + array( + 42.23, + new FloatValue( 42.23 ), + ), + array( + 23, + new FloatValue( 23. ), + ), + array( + new FloatValue( 23.42 ), + new FloatValue( 23.42 ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null, + ), + array( + new FloatValue( 23.42 ), + 23.42, + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null, + ), + array( + 23.42, + new FloatValue( 23.42 ), + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * valid by the {@link validateValidatorConfiguration()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * 'minIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidValidatorConfiguration() + { + return array( + array( + array() + ), + array( + array( + 'FloatValueValidator' => array( + 'minFloatValue' => false, + ) + ) + ), + array( + array( + 'FloatValueValidator' => array( + 'minFloatValue' => .23, + ) + ) + ), + array( + array( + 'FloatValueValidator' => array( + 'maxFloatValue' => false, + ) + ) + ), + array( + array( + 'FloatValueValidator' => array( + 'maxFloatValue' => .23, + ) + ) + ), + array( + array( + 'FloatValueValidator' => array( + 'minFloatValue' => .23, + 'maxFloatValue' => .42, + ) + ) + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * invalid by the {@link validateValidatorConfiguration()} method. The + * method must return a non-empty array of validation errors when receiving + * one of the provided values. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array( + * 'NonExistentValidator' => array(), + * ), + * ), + * array( + * array( + * // Typos + * 'InTEgervALUeVALIdator' => array( + * 'iinIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * // Incorrect value types + * 'minIntegerValue' => true, + * 'maxIntegerValue' => false, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidValidatorConfiguration() + { + return array( + array( + array( + 'NonExistentValidator' => array(), + ), + ), + array( + array( + 'FloatValueValidator' => array( + 'nonExistentValue' => .23 + ), + ), + ), + array( + array( + 'FloatValueValidator' => array( + 'minFloatValue' => 'foo', + ), + ), + ), + array( + array( + 'FloatValueValidator' => array( + 'maxFloatValue' => 'bar', + ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/FloatValueValidatorTest.php b/eZ/Publish/Core/FieldType/Tests/FloatValueValidatorTest.php new file mode 100644 index 0000000..fdeb0e8 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/FloatValueValidatorTest.php @@ -0,0 +1,378 @@ +assertInstanceOf( + "eZ\\Publish\\Core\\FieldType\\Validator", + new FloatValueValidator + ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsInitializeGet() + { + $constraints = array( + "minFloatValue" => 0.5, + "maxFloatValue" => 22 / 7, + ); + $validator = new FloatValueValidator; + $validator->initializeWithConstraints( + $constraints + ); + $this->assertSame( $constraints["minFloatValue"], $validator->minFloatValue ); + $this->assertSame( $constraints["maxFloatValue"], $validator->maxFloatValue ); + } + + /** + * Test getting constraints schema + * + * @covers \eZ\Publish\Core\FieldType\Validator::getConstraintsSchema + */ + public function testGetConstraintsSchema() + { + $constraintsSchema = array( + "minFloatValue" => array( + "type" => "float", + "default" => false + ), + "maxFloatValue" => array( + "type" => "float", + "default" => false + ) + ); + $validator = new FloatValueValidator; + $this->assertSame( $constraintsSchema, $validator->getConstraintsSchema() ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsSetGet() + { + $constraints = array( + "minFloatValue" => 0.5, + "maxFloatValue" => 22 / 7, + ); + $validator = new FloatValueValidator; + $validator->minFloatValue = $constraints["minFloatValue"]; + $validator->maxFloatValue = $constraints["maxFloatValue"]; + $this->assertSame( $constraints["minFloatValue"], $validator->minFloatValue ); + $this->assertSame( $constraints["maxFloatValue"], $validator->maxFloatValue ); + } + + /** + * Tests initializing with a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testInitializeBadConstraint() + { + $constraints = array( + "unexisting" => 0, + ); + $validator = new FloatValueValidator; + $validator->initializeWithConstraints( + $constraints + ); + } + + /** + * Tests setting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testSetBadConstraint() + { + $validator = new FloatValueValidator; + $validator->unexisting = 0; + } + + /** + * Tests getting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__get + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testGetBadConstraint() + { + $validator = new FloatValueValidator; + $null = $validator->unexisting; + } + + /** + * Tests validating a correct value + * + * @dataProvider providerForValidateOK + * @covers \eZ\Publish\Core\FieldType\Validator\FloatValueValidator::validate + * @covers \eZ\Publish\Core\FieldType\Validator::getMessage + */ + public function testValidateCorrectValues( $value ) + { + $validator = new FloatValueValidator; + $validator->minFloatValue = 10 / 7; + $validator->maxFloatValue = 11 / 7; + $this->assertTrue( $validator->validate( new FloatValue( $value ) ) ); + $this->assertSame( array(), $validator->getMessage() ); + } + + public function providerForValidateOK() + { + return array( + array( 100 / 70 ), + array( 101 / 70 ), + array( 105 / 70 ), + array( 109 / 70 ), + array( 110 / 70 ), + ); + } + + /** + * Tests validating a wrong value + * + * @dataProvider providerForValidateKO + * @covers \eZ\Publish\Core\FieldType\Validator\FloatValueValidator::validate + */ + public function testValidateWrongValues( $value, $message, $values ) + { + $validator = new FloatValueValidator; + $validator->minFloatValue = $this->getMinFloatValue(); + $validator->maxFloatValue = $this->getMaxFloatValue(); + $this->assertFalse( $validator->validate( new FloatValue( $value ) ) ); + $messages = $validator->getMessage(); + $this->assertCount( 1, $messages ); + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\FieldType\\ValidationError", + $messages[0] + ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Message", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $message, + $messages[0]->getTranslatableMessage()->message + ); + $this->assertEquals( + $values, + $messages[0]->getTranslatableMessage()->values + ); + } + + public function providerForValidateKO() + { + return array( + array( -10 / 7, "The value can not be lower than %size%.", array( "size" => $this->getMinFloatValue() ) ), + array( 0, "The value can not be lower than %size%.", array( "size" => $this->getMinFloatValue() ) ), + array( 99 / 70, "The value can not be lower than %size%.", array( "size" => $this->getMinFloatValue() ) ), + array( 111 / 70, "The value can not be higher than %size%.", array( "size" => $this->getMaxFloatValue() ) ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsOK + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsCorrectValues( $constraints ) + { + $validator = new FloatValueValidator; + + $this->assertEmpty( + $validator->validateConstraints( $constraints ) + ); + } + + public function providerForValidateConstraintsOK() + { + return array( + array( + array(), + array( + "minFloatValue" => 5, + ), + array( + "maxFloatValue" => 2.2, + ), + array( + "minFloatValue" => false, + "maxFloatValue" => false + ), + array( + "minFloatValue" => -5, + "maxFloatValue" => false + ), + array( + "minFloatValue" => false, + "maxFloatValue" => 12.7 + ), + array( + "minFloatValue" => 6, + "maxFloatValue" => 8.3 + ), + ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsKO + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsWrongValues( $constraints, $expectedMessages, $values ) + { + $validator = new FloatValueValidator; + $messages = $validator->validateConstraints( $constraints ); + + foreach ( $expectedMessages as $index => $expectedMessage ) + { + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Message", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $expectedMessage, + $messages[$index]->getTranslatableMessage()->message + ); + $this->assertEquals( + $values[$index], + $messages[$index]->getTranslatableMessage()->values + ); + } + } + + public function providerForValidateConstraintsKO() + { + return array( + array( + array( + "minFloatValue" => true + ), + array( "Validator parameter '%parameter%' value must be of numeric type" ), + array( + array( "parameter" => "minFloatValue" ), + ) + ), + array( + array( + "minFloatValue" => "five thousand bytes" + ), + array( "Validator parameter '%parameter%' value must be of numeric type" ), + array( + array( "parameter" => "minFloatValue" ), + ) + ), + array( + array( + "minFloatValue" => "five thousand bytes", + "maxFloatValue" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of numeric type" ), + array( + array( "parameter" => "minFloatValue" ), + ) + ), + array( + array( + "maxFloatValue" => new \DateTime(), + "minFloatValue" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of numeric type" ), + array( + array( "parameter" => "maxFloatValue" ), + ) + ), + array( + array( + "minFloatValue" => true, + "maxFloatValue" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of numeric type" ), + array( + array( "parameter" => "minFloatValue" ), + ) + ), + array( + array( + "minFloatValue" => "five thousand bytes", + "maxFloatValue" => "ten billion bytes" + ), + array( + "Validator parameter '%parameter%' value must be of numeric type", + "Validator parameter '%parameter%' value must be of numeric type" + ), + array( + array( "parameter" => "minFloatValue" ), + array( "parameter" => "maxFloatValue" ), + ) + ), + array( + array( + "brljix" => 12345 + ), + array( "Validator parameter '%parameter%' is unknown" ), + array( + array( "parameter" => "brljix" ), + ) + ), + array( + array( + "minFloatValue" => 12345, + "brljix" => 12345 + ), + array( "Validator parameter '%parameter%' is unknown" ), + array( + array( "parameter" => "brljix" ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/Image/PathGenerator/LegacyPathGeneratorTest.php b/eZ/Publish/Core/FieldType/Tests/Image/PathGenerator/LegacyPathGeneratorTest.php new file mode 100644 index 0000000..024d892 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/Image/PathGenerator/LegacyPathGeneratorTest.php @@ -0,0 +1,76 @@ +assertEquals( + $expectedPath, + $pathGenerator->getStoragePathForField( + $data['fieldId'], + $data['versionNo'], + $data['languageCode'], + $data['nodePathString'] + ) + ); + } + + public function provideStoragePathForFieldData() + { + return array( + array( + array( + 'fieldId' => 23, + 'versionNo' => 1, + 'languageCode' => 'eng-US', + 'nodePathString' => 'sindelfingen/bielefeld/', + ), + 'sindelfingen/bielefeld/23-1-eng-US', + ), + array( + array( + 'fieldId' => 23, + 'versionNo' => 42, + 'languageCode' => 'ger-DE', + 'nodePathString' => 'sindelfingen/', + ), + 'sindelfingen/23-42-ger-DE', + ), + array( + array( + 'fieldId' => 23, + 'versionNo' => 2, + 'languageCode' => 'eng-GB', + 'nodePathString' => null, + ), + '23-2-eng-GB', + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/ImageTest.php b/eZ/Publish/Core/FieldType/Tests/ImageTest.php new file mode 100644 index 0000000..b80b0f6 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/ImageTest.php @@ -0,0 +1,376 @@ +fileServiceMock ) ) + { + $this->fileServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\FieldType\\FileService', + array(), + array(), + '', + false + ); + } + return $this->fileServiceMock; + } + + /** + * Returns the field type under test. + * + * This method is used by all test cases to retrieve the field type under + * test. Just create the FieldType instance using mocks from the provided + * get*Mock() methods and/or custom get*Mock() implementations. You MUST + * NOT take care for test case wide caching of the field type, just return + * a new instance from this method! + * + * @return FieldType + */ + protected function createFieldTypeUnderTest() + { + return new ImageType( + $this->getFileServiceMock() + ); + } + + /** + * Returns the validator configuration schema expected from the field type. + * + * @return array + */ + protected function getValidatorConfigurationSchemaExpectation() + { + return array( + "FileSizeValidator" => array( + 'maxFileSize' => array( + 'type' => 'int', + 'default' => false, + ) + ) + ); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array(); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new ImageValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 'foo', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new ImageValue(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new ImageValue( + array( + 'path' => 'non/existent/path', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new ImageValue( + array( + 'path' => __FILE__, + 'fileName' => array() + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new ImageValue( + array( + 'path' => __FILE__, + 'fileName' => 'ImageTest.php', + 'fileSize' => 'truebar' + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new ImageValue( + array( + 'path' => __FILE__, + 'fileName' => 'ImageTest.php', + 'fileSize' => 23, + 'alternativeText' => array() + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new ImageValue, + ), + array( + $this->getImagePath(), + new ImageValue( + array( + 'path' => $this->getImagePath(), + 'fileName' => basename( $this->getImagePath() ), + 'fileSize' => filesize( $this->getImagePath() ), + 'alternativeText' => null, + ) + ), + ), + array( + array( + 'path' => $this->getImagePath(), + 'fileName' => 'Sindelfingen-Squirrels.jpg', + 'fileSize' => 23, + 'alternativeText' => 'This is so Sindelfingen!', + ), + new ImageValue( + array( + 'path' => $this->getImagePath(), + 'fileName' => 'Sindelfingen-Squirrels.jpg', + 'fileSize' => 23, + 'alternativeText' => 'This is so Sindelfingen!', + ) + ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null, + ), + array( + new ImageValue( + array( + 'path' => $this->getImagePath(), + 'fileName' => 'Sindelfingen-Squirrels.jpg', + 'fileSize' => 23, + 'alternativeText' => 'This is so Sindelfingen!', + ) + ), + array( + 'path' => $this->getImagePath(), + 'fileName' => 'Sindelfingen-Squirrels.jpg', + 'fileSize' => 23, + 'alternativeText' => 'This is so Sindelfingen!', + ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null, + ), + array( + array( + 'path' => $this->getImagePath(), + 'fileName' => 'Sindelfingen-Squirrels.jpg', + 'fileSize' => 23, + 'alternativeText' => 'This is so Sindelfingen!', + ), + new ImageValue( + array( + 'path' => $this->getImagePath(), + 'fileName' => 'Sindelfingen-Squirrels.jpg', + 'fileSize' => 23, + 'alternativeText' => 'This is so Sindelfingen!', + ) + ), + ), + // @todo: Provide REST upload tests + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/IntegerTest.php b/eZ/Publish/Core/FieldType/Tests/IntegerTest.php new file mode 100644 index 0000000..4d16e1d --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/IntegerTest.php @@ -0,0 +1,415 @@ + array( + "minIntegerValue" => array( + "type" => "int", + "default" => 0 + ), + "maxIntegerValue" => array( + "type" => "int", + "default" => false + ) + ) + ); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array(); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new IntegerValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 'foo', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new IntegerValue( 'foo' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new IntegerValue, + ), + array( + 42, + new IntegerValue( 42 ), + ), + array( + 23, + new IntegerValue( 23 ), + ), + array( + new IntegerValue( 23 ), + new IntegerValue( 23 ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null, + ), + array( + new IntegerValue( 42 ), + 42, + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null, + ), + array( + 42, + new IntegerValue( 42 ), + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * valid by the {@link validateValidatorConfiguration()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * 'minIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidValidatorConfiguration() + { + return array( + array( + array() + ), + array( + array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => false, + ) + ) + ), + array( + array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => 23, + ) + ) + ), + array( + array( + 'IntegerValueValidator' => array( + 'maxIntegerValue' => false, + ) + ) + ), + array( + array( + 'IntegerValueValidator' => array( + 'maxIntegerValue' => 23, + ) + ) + ), + array( + array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => 23, + 'maxIntegerValue' => 42, + ) + ) + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * invalid by the {@link validateValidatorConfiguration()} method. The + * method must return a non-empty array of validation errors when receiving + * one of the provided values. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array( + * 'NonExistentValidator' => array(), + * ), + * ), + * array( + * array( + * // Typos + * 'InTEgervALUeVALIdator' => array( + * 'iinIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * // Incorrect value types + * 'minIntegerValue' => true, + * 'maxIntegerValue' => false, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidValidatorConfiguration() + { + return array( + array( + array( + 'NonExistentValidator' => array(), + ), + ), + array( + array( + 'IntegerValueValidator' => array( + 'nonExistentValue' => 23 + ), + ), + ), + array( + array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => .23, + ), + ), + ), + array( + array( + 'IntegerValueValidator' => array( + 'maxIntegerValue' => .42, + ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/IntegerValueValidatorTest.php b/eZ/Publish/Core/FieldType/Tests/IntegerValueValidatorTest.php new file mode 100644 index 0000000..318cb79 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/IntegerValueValidatorTest.php @@ -0,0 +1,380 @@ +assertInstanceOf( + "eZ\\Publish\\Core\\FieldType\\Validator", + new IntegerValueValidator + ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsInitializeGet() + { + $constraints = array( + "minIntegerValue" => 0, + "maxIntegerValue" => 100, + ); + $validator = new IntegerValueValidator; + $validator->initializeWithConstraints( + $constraints + ); + $this->assertSame( $constraints["minIntegerValue"], $validator->minIntegerValue ); + $this->assertSame( $constraints["maxIntegerValue"], $validator->maxIntegerValue ); + } + + /** + * Test getting constraints schema + * + * @covers \eZ\Publish\Core\FieldType\Validator::getConstraintsSchema + */ + public function testGetConstraintsSchema() + { + $constraintsSchema = array( + "minIntegerValue" => array( + "type" => "int", + "default" => 0 + ), + "maxIntegerValue" => array( + "type" => "int", + "default" => false + ) + ); + $validator = new IntegerValueValidator; + $this->assertSame( $constraintsSchema, $validator->getConstraintsSchema() ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsSetGet() + { + $constraints = array( + "minIntegerValue" => 0, + "maxIntegerValue" => 100, + ); + $validator = new IntegerValueValidator; + $validator->minIntegerValue = $constraints["minIntegerValue"]; + $validator->maxIntegerValue = $constraints["maxIntegerValue"]; + $this->assertSame( $constraints["minIntegerValue"], $validator->minIntegerValue ); + $this->assertSame( $constraints["maxIntegerValue"], $validator->maxIntegerValue ); + } + + /** + * Tests initializing with a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testInitializeBadConstraint() + { + $constraints = array( + "unexisting" => 0, + ); + $validator = new IntegerValueValidator; + $validator->initializeWithConstraints( + $constraints + ); + } + + /** + * Tests setting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testSetBadConstraint() + { + $validator = new IntegerValueValidator; + $validator->unexisting = 0; + } + + /** + * Tests getting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__get + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testGetBadConstraint() + { + $validator = new IntegerValueValidator; + $null = $validator->unexisting; + } + + /** + * Tests validating a correct value + * + * @dataProvider providerForValidateOK + * @covers \eZ\Publish\Core\FieldType\Validator\IntegerValueValidator::validate + * @covers \eZ\Publish\Core\FieldType\Validator::getMessage + */ + public function testValidateCorrectValues( $value ) + { + $validator = new IntegerValueValidator; + $validator->minIntegerValue = 10; + $validator->maxIntegerValue = 15; + $this->assertTrue( $validator->validate( new IntegerValue( $value ) ) ); + $this->assertSame( array(), $validator->getMessage() ); + } + + public function providerForValidateOK() + { + return array( + array( 10 ), + array( 11 ), + array( 12 ), + array( 12.5 ), + array( 13 ), + array( 14 ), + array( 15 ), + ); + } + + /** + * Tests validating a wrong value + * + * @dataProvider providerForValidateKO + * @covers \eZ\Publish\Core\FieldType\Validator\IntegerValueValidator::validate + */ + public function testValidateWrongValues( $value, $message, $values ) + { + $validator = new IntegerValueValidator; + $validator->minIntegerValue = $this->getMinIntegerValue(); + $validator->maxIntegerValue = $this->getMaxIntegerValue(); + $this->assertFalse( $validator->validate( new IntegerValue( $value ) ) ); + $messages = $validator->getMessage(); + $this->assertCount( 1, $messages ); + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\FieldType\\ValidationError", + $messages[0] + ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Message", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $message, + $messages[0]->getTranslatableMessage()->message + ); + $this->assertEquals( + $values, + $messages[0]->getTranslatableMessage()->values + ); + } + + public function providerForValidateKO() + { + return array( + array( -12, "The value can not be lower than %size%.", array( "size" => $this->getMinIntegerValue() ) ), + array( 0, "The value can not be lower than %size%.", array( "size" => $this->getMinIntegerValue() ) ), + array( 9, "The value can not be lower than %size%.", array( "size" => $this->getMinIntegerValue() ) ), + array( 16, "The value can not be higher than %size%.", array( "size" => $this->getMaxIntegerValue() ) ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsOK + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsCorrectValues( $constraints ) + { + $validator = new IntegerValueValidator; + + $this->assertEmpty( + $validator->validateConstraints( $constraints ) + ); + } + + public function providerForValidateConstraintsOK() + { + return array( + array( + array(), + array( + "minIntegerValue" => 5, + ), + array( + "maxIntegerValue" => 2, + ), + array( + "minIntegerValue" => false, + "maxIntegerValue" => false + ), + array( + "minIntegerValue" => -5, + "maxIntegerValue" => false + ), + array( + "minIntegerValue" => false, + "maxIntegerValue" => 12 + ), + array( + "minIntegerValue" => 6, + "maxIntegerValue" => 8 + ), + ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsKO + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsWrongValues( $constraints, $expectedMessages, $values ) + { + $validator = new IntegerValueValidator; + $messages = $validator->validateConstraints( $constraints ); + + foreach ( $expectedMessages as $index => $expectedMessage ) + { + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Message", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $expectedMessage, + $messages[$index]->getTranslatableMessage()->message + ); + $this->assertEquals( + $values[$index], + $messages[$index]->getTranslatableMessage()->values + ); + } + } + + public function providerForValidateConstraintsKO() + { + return array( + array( + array( + "minIntegerValue" => true + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minIntegerValue" ), + ) + ), + array( + array( + "minIntegerValue" => "five thousand bytes" + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minIntegerValue" ), + ) + ), + array( + array( + "minIntegerValue" => "five thousand bytes", + "maxIntegerValue" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minIntegerValue" ), + ) + ), + array( + array( + "maxIntegerValue" => new \DateTime(), + "minIntegerValue" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "maxIntegerValue" ), + ) + ), + array( + array( + "minIntegerValue" => true, + "maxIntegerValue" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minIntegerValue" ), + ) + ), + array( + array( + "minIntegerValue" => "five thousand bytes", + "maxIntegerValue" => "ten billion bytes" + ), + array( + "Validator parameter '%parameter%' value must be of integer type", + "Validator parameter '%parameter%' value must be of integer type" + ), + array( + array( "parameter" => "minIntegerValue" ), + array( "parameter" => "maxIntegerValue" ), + ) + ), + array( + array( + "brljix" => 12345 + ), + array( "Validator parameter '%parameter%' is unknown" ), + array( + array( "parameter" => "brljix" ), + ) + ), + array( + array( + "minIntegerValue" => 12345, + "brljix" => 12345 + ), + array( "Validator parameter '%parameter%' is unknown" ), + array( + array( "parameter" => "brljix" ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/KeywordTest.php b/eZ/Publish/Core/FieldType/Tests/KeywordTest.php new file mode 100644 index 0000000..8b22916 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/KeywordTest.php @@ -0,0 +1,249 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new KeywordValue( array() ), + ), + array( + array(), + new KeywordValue( array() ), + ), + array( + array( 'foo' ), + new KeywordValue( array( 'foo' ) ), + ), + array( + new KeywordValue( array( 'foo' ) ), + new KeywordValue( array( 'foo' ) ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new KeywordValue( array() ), + array(), + ), + array( + new KeywordValue( array( 'foo', 'bar' ) ), + array( 'foo', 'bar' ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + array(), + new KeywordValue( array() ), + ), + array( + array( 'foo', 'bar' ), + new KeywordValue( array( 'foo', 'bar' ) ), + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/MapLocationTest.php b/eZ/Publish/Core/FieldType/Tests/MapLocationTest.php new file mode 100644 index 0000000..b1e5b56 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/MapLocationTest.php @@ -0,0 +1,319 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 'some string', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MapLocation\Value( array() ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MapLocation\Value( + array( + 'latitude' => 'foo', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 'bar', + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => array(), + ) + ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new MapLocation\Value + ), + array( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ), + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ) + ), + ), + array( + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ) + ), + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ) + ), + ) + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null, + ), + array( + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ) + ), + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null + ), + array( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ), + new MapLocation\Value( + array( + 'latitude' => 23.42, + 'longitude' => 42.23, + 'address' => 'Nowhere', + ) + ), + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/MediaTest.php b/eZ/Publish/Core/FieldType/Tests/MediaTest.php new file mode 100644 index 0000000..c75d381 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/MediaTest.php @@ -0,0 +1,493 @@ +getFileServiceMock(), + $this->getMimeTypeDetectorMock() + ); + } + + protected function getEmptyValueExpectation() + { + return new MediaValue; + } + + protected function getSettingsSchemaExpectation() + { + return array( + 'mediaType' => array( + 'type' => 'choice', + 'default' => MediaType::TYPE_HTML5_VIDEO, + ) + ); + } + + public function provideInvalidInputForAcceptValue() + { + $baseInput = parent::provideInvalidInputForAcceptValue(); + $binaryFileInput = array( + array( + new MediaValue(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MediaValue( array( 'path' => '/foo/bar' ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MediaValue( array( 'hasController' => 'yes' ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MediaValue( array( 'autoplay' => 'yes' ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MediaValue( array( 'loop' => 'yes' ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MediaValue( array( 'height' => array() ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new MediaValue( array( 'width' => new \stdClass() ) ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + return array_merge( $baseInput, $binaryFileInput ); + } + + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new MediaValue + ), + array( + __FILE__, + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( 'path' => __FILE__ ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'fileSize' => 23, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => 23, + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'mimeType' => 'application/text+php', + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'application/text+php', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'hasController' => true, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => true, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'autoplay' => true, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => true, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'loop' => true, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => true, + 'width' => 0, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'width' => 23, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 23, + 'height' => 0, + ) + ) + ), + array( + array( + 'path' => __FILE__, + 'height' => 42, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 42, + ) + ) + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => true, + 'width' => 0, + 'height' => 0, + ) + ), + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => true, + 'width' => 0, + 'height' => 0, + ) + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null + ), + array( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => true, + 'width' => 0, + 'height' => 0, + ), + new MediaValue( + array( + 'path' => __FILE__, + 'fileName' => basename( __FILE__ ), + 'fileSize' => filesize( __FILE__ ), + 'mimeType' => 'text/plain', + 'hasController' => false, + 'autoplay' => false, + 'loop' => true, + 'width' => 0, + 'height' => 0, + ) + ), + ), + // @todo: Test for REST upload hash + ); + } + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array() + ), + array( + array( + 'mediaType' => MediaType::TYPE_FLASH, + ) + ), + array( + array( + 'mediaType' => MediaType::TYPE_REALPLAYER, + ) + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + array( + 'not-existing' => 23, + ) + ), + array( + // mediaType must be constant + array( + 'mediaType' => 23, + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/PageTest.php b/eZ/Publish/Core/FieldType/Tests/PageTest.php new file mode 100644 index 0000000..64602f8 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/PageTest.php @@ -0,0 +1,275 @@ +pageServiceMock ) ) + { + $this->pageServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\FieldType\\Page\\Service', + array(), + array(), + '', + false + ); + } + return $this->pageServiceMock; + } + + /** + * Returns the field type under test. + * + * This method is used by all test cases to retrieve the field type under + * test. Just create the FieldType instance using mocks from the provided + * get*Mock() methods and/or custom get*Mock() implementations. You MUST + * NOT take care for test case wide caching of the field type, just return + * a new instance from this method! + * + * @return FieldType + */ + protected function createFieldTypeUnderTest() + { + return new PageType( + $this->getPageServiceMock() + ); + } + + /** + * Returns the validator configuration schema expected from the field type. + * + * @return array + */ + protected function getValidatorConfigurationSchemaExpectation() + { + return array(); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array( + 'defaultLayout' => array( + 'type' => 'string', + 'default' => '', + ) + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new PageValue(); + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + new \stdClass(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException' + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new PageValue() + ), + array( + new PageValue(), + new PageValue() + ), + array( + new PageValue( new Page( $this->getPageServiceMock() ) ), + new PageValue( new Page( $this->getPageServiceMock() ) ) + ) + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new PageValue( new Page( $this->getPageServiceMock() ) ), + serialize( new Page( $this->getPageServiceMock() ) ), + ) + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null + ), + array( + serialize( new Page( $this->getPageServiceMock() ) ), + new PageValue( new Page( $this->getPageServiceMock() ) ) + ) + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/RatingTest.php b/eZ/Publish/Core/FieldType/Tests/RatingTest.php new file mode 100644 index 0000000..575b30c --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/RatingTest.php @@ -0,0 +1,383 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 'sindelfingen', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + array(), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new Value( 'sindelfingen' ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + false, + new Value( false ) + ), + array( + true, + new Value( true ) + ), + array( + new Value(), + new Value( false ) + ), + array( + new Value( true ), + new Value( true ) + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new Value( true ), + true, + ), + array( + new Value( false ), + false, + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + new Value( true ), + true, + ), + array( + new Value( false ), + false, + ), + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::getValidatorConfigurationSchema + */ + public function testValidatorConfigurationSchema() + { + $ft = new Rating(); + self::assertEmpty( + $ft->getValidatorConfigurationSchema(), + "The validator configuration schema does not match what is expected." + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::getSettingsSchema + */ + public function testSettingsSchema() + { + $ft = new Rating(); + self::assertEmpty( + $ft->getSettingsSchema(), + "The settings schema does not match what is expected." + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Type::acceptValue + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testAcceptValueInvalidFormat() + { + $ft = new Rating(); + $ref = new ReflectionObject( $ft ); + $refMethod = $ref->getMethod( "acceptValue" ); + $refMethod->setAccessible( true ); + $ratingValue = new RatingValue(); + $ratingValue->isDisabled = "Strings should not work."; + $refMethod->invoke( $ft, $ratingValue ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Type::acceptValue + */ + public function testAcceptValueValidFormat() + { + $ft = new Rating(); + $ref = new ReflectionObject( $ft ); + $refMethod = $ref->getMethod( "acceptValue" ); + $refMethod->setAccessible( true ); + + $value = new RatingValue( false ); + self::assertSame( $value, $refMethod->invoke( $ft, $value ) ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Type::toPersistenceValue + */ + public function testToPersistenceValue() + { + $rating = false; + $ft = new Rating(); + $fieldValue = $ft->toPersistenceValue( $fv = new RatingValue( $rating ) ); + + self::assertSame( $rating, $fieldValue->data ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Value::__construct + */ + public function testBuildFieldValueWithParamFalse() + { + $value = new RatingValue( false ); + self::assertSame( false, $value->isDisabled ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Value::__construct + */ + public function testBuildFieldValueWithParamTrue() + { + $value = new RatingValue( true ); + self::assertSame( true, $value->isDisabled ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Value::__construct + */ + public function testBuildFieldValueWithoutParam() + { + $value = new RatingValue; + self::assertSame( false, $value->isDisabled ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Value::__toString + */ + public function testFieldValueToStringFalse() + { + $rating = "0"; + $value = new RatingValue( $rating ); + self::assertSame( $rating, (string)$value ); + + $value2 = new RatingValue( (string)$value ); + self::assertSame( + (bool)$rating, + $value2->isDisabled, + "fromString() and __toString() must be compatible" + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Rating\Value::__toString + */ + public function testFieldValueToStringTrue() + { + $rating = "1"; + $value = new RatingValue( $rating ); + self::assertSame( $rating, (string)$value ); + + $value2 = new RatingValue( (string)$value ); + self::assertSame( + (bool)$rating, + $value2->isDisabled, + "fromString() and __toString() must be compatible" + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/RelationListTest.php b/eZ/Publish/Core/FieldType/Tests/RelationListTest.php new file mode 100644 index 0000000..495e1e6 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/RelationListTest.php @@ -0,0 +1,379 @@ + array( + 'type' => 'int', + 'default' => RelationList::SELECTION_BROWSE, + ), + 'selectionDefaultLocation' => array( + 'type' => 'string', + 'default' => null, + ), + 'selectionContentTypes' => array( + 'type' => 'array', + 'default' => array(), + ), + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + // @todo FIXME: Is this correct? + return new Value(); + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + true, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ) + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + new Value(), + new Value(), + ), + array( + 23, + new Value( array( 23 ) ), + ), + array( + new ContentInfo( array( 'id' => 23 ) ), + new Value( array( 23 ) ), + ), + array( + array( 23, 42 ), + new Value( array( 23, 42 ) ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new Value( array( 23, 42 ) ), + array( 'destinationContentIds' => array( 23, 42 ) ), + ), + array( + new Value(), + array( 'destinationContentIds' => array() ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + array( 'destinationContentIds' => array( 23, 42 ) ), + new Value( array( 23, 42 ) ), + ), + array( + array( 'destinationContentIds' => array() ), + new Value(), + ), + ); + } + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array( + 'selectionMethod' => RelationList::SELECTION_BROWSE, + 'selectionDefaultLocation' => 23, + ) + ), + array( + array( + 'selectionMethod' => RelationList::SELECTION_DROPDOWN, + 'selectionDefaultLocation' => 'foo', + ) + ), + array( + array( + 'selectionMethod' => RelationList::SELECTION_DROPDOWN, + 'selectionDefaultLocation' => 'foo', + 'selectionContentTypes' => array( 1, 2, 3 ) + ) + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * ATTENTION: This is a default implementation, which must be overwritten + * if a FieldType supports field settings! + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + // Missing mandatory keys 'selectionMethod' and 'selectionDefaultLocation' + array() + ), + array( + // Missing mandatory key 'selectionDefaultLocation' + array( + 'selectionMethod' => RelationList::SELECTION_DROPDOWN, + ) + ), + array( + // Missing mandatory key 'selectionMethod' + array( + 'selectionDefaultLocation' => 23 + ) + ), + array( + // Invalid value for 'selectionMethod' + array( + 'selectionMethod' => true, + 'selectionDefaultLocation' => 23 + ) + ), + array( + // Invalid value for 'selectionDefaultLocation' + array( + 'selectionMethod' => RelationList::SELECTION_DROPDOWN, + 'selectionDefaultLocation' => array() + ) + ), + array( + // Invalid value for 'selectionContentTypes' + array( + 'selectionMethod' => RelationList::SELECTION_DROPDOWN, + 'selectionDefaultLocation' => 23, + 'selectionContentTypes' => true, + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/RelationTest.php b/eZ/Publish/Core/FieldType/Tests/RelationTest.php new file mode 100644 index 0000000..bf6f3f6 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/RelationTest.php @@ -0,0 +1,356 @@ + array( + 'type' => 'int', + 'default' => Relation::SELECTION_BROWSE, + ), + 'selectionRoot' => array( + 'type' => 'string', + 'default' => '', + ), + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + // @todo FIXME: Is this correct? + return new Value(); + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + true, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ) + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + new Value(), + new Value(), + ), + array( + 23, + new Value( 23 ), + ), + array( + new ContentInfo( array( 'id' => 23 ) ), + new Value( 23 ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new Value( 23 ), + array( 'destinationContentId' => 23 ), + ), + array( + new Value(), + array( 'destinationContentId' => null ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + array( 'destinationContentId' => 23 ), + new Value( 23 ), + ), + array( + array( 'destinationContentId' => null ), + new Value(), + ), + ); + } + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array( + 'selectionMethod' => Relation::SELECTION_BROWSE, + 'selectionRoot' => 42, + ) + ), + array( + array( + 'selectionMethod' => Relation::SELECTION_DROPDOWN, + 'selectionRoot' => 'some-key', + ) + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + // Unknown key + array( + 'unknownKey' => 23, + 'selectionMethod' => Relation::SELECTION_BROWSE, + 'selectionRoot' => 42 + ) + ), + array( + // Missing selectionMethod + array( + 'selectionRoot' => 42 + ) + ), + array( + // Missing selectionRoot + array( + 'selectionMethod' => Relation::SELECTION_BROWSE, + ) + ), + array( + // Invalid selectionMethod + array( + 'selectionMethod' => 2342, + 'selectionRoot' => 42 + ) + ), + array( + // Invalid selectionRoot + array( + 'selectionMethod' => Relation::SELECTION_DROPDOWN, + 'selectionRoot' => array() + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/SelectionTest.php b/eZ/Publish/Core/FieldType/Tests/SelectionTest.php new file mode 100644 index 0000000..70cceaf --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/SelectionTest.php @@ -0,0 +1,346 @@ + array( + 'type' => 'bool', + 'default' => false, + ), + 'options' => array( + 'type' => 'hash', + 'default' => array(), + ), + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new SelectionValue(); + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + 'sindelfingen', + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + array(), + new SelectionValue(), + ), + array( + array( 23 ), + new SelectionValue( array( 23 ) ), + ), + array( + array( 23, 42 ), + new SelectionValue( array( 23, 42 ) ), + ), + array( + new SelectionValue( array( 23, 42 ) ), + new SelectionValue( array( 23, 42 ) ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new SelectionValue(), + array(), + ), + array( + new SelectionValue( array( 23, 42 ) ), + array( 23, 42 ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + array(), + new SelectionValue(), + ), + array( + array( 23, 42 ), + new SelectionValue( array( 23, 42 ) ), + ), + ); + } + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array() + ), + array( + array( + 'isMultiple' => true, + 'options' => array( 'foo', 'bar' ), + ) + ), + array( + array( + 'isMultiple' => false, + 'options' => array( 23, 42 ), + ) + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + array( + // isMultiple must be bool + 'isMultiple' => 23, + ) + ), + array( + array( + // options must be array + 'options' => 23, + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/StandardizedFieldTypeTest.php b/eZ/Publish/Core/FieldType/Tests/StandardizedFieldTypeTest.php new file mode 100644 index 0000000..ffe97b5 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/StandardizedFieldTypeTest.php @@ -0,0 +1,734 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + abstract public function provideInvalidInputForAcceptValue(); + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + abstract public function provideValidInputForAcceptValue(); + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + abstract public function provideInputForToHash(); + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + abstract public function provideInputForFromHash(); + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * ATTENTION: This is a default implementation, which must be overwritten + * if a FieldType supports field settings! + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array() + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * ATTENTION: This is a default implementation, which must be overwritten + * if a FieldType supports field settings! + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + array( 'nonempty' ) + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * valid by the {@link validateValidatorConfiguration()} method. + * + * ATTENTION: This is a default implementation, which must be overwritten + * if a FieldType supports validators! + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * 'minIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidValidatorConfiguration() + { + return array( + array( + array() + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * invalid by the {@link validateValidatorConfiguration()} method. The + * method must return a non-empty array of valiation errors when receiving + * one of the provided values. + * + * ATTENTION: This is a default implementation, which must be overwritten + * if a FieldType supports validators! + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array( + * 'NonExistentValidator' => array(), + * ), + * ), + * array( + * array( + * // Typos + * 'InTEgervALUeVALIdator' => array( + * 'minIntegerValue' => 0, + * 'maxIntegerValue' => 23, + * ) + * ) + * ), + * array( + * array( + * 'IntegerValueValidator' => array( + * // Incorrect value types + * 'minIntegerValue' => true, + * 'maxIntegerValue' => false, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidValidatorConfiguration() + { + return array( + array( + array( + 'NonExistentValidator' => array(), + ), + ) + ); + } + + /** + * Retrieves a test wide cached version of the field type under test. + * + * Uses {@link createFieldTypeUnderTest()} to create the instance + * initially. + * + * @return \eZ\Publish\SPI\FieldType\FieldType + */ + protected function getFieldTypeUnderTest() + { + if ( !isset( $this->fieldTypeUnderTest ) ) + { + $this->fieldTypeUnderTest = $this->createFieldTypeUnderTest(); + } + return $this->fieldTypeUnderTest; + } + + public function testValidatorConfigurationSchema() + { + $fieldType = $this->getFieldTypeUnderTest(); + + self::assertSame( + $this->getValidatorConfigurationSchemaExpectation(), + $fieldType->getValidatorConfigurationSchema(), + 'Validator configuration schema not returned correctly.' + ); + } + + public function testSettingsSchema() + { + $fieldType = $this->getFieldTypeUnderTest(); + + self::assertSame( + $this->getSettingsSchemaExpectation(), + $fieldType->getSettingsSchema(), + 'Settings schema not returned correctly.' + ); + } + + public function testEmptyValue() + { + $fieldType = $this->getFieldTypeUnderTest(); + + $this->assertEquals( + $this->getEmptyValueExpectation(), + $fieldType->getEmptyValue() + ); + } + + /** + * @param mixed $inputValue + * @param mixed $expectedOutputValue + * + * @dataProvider provideValidInputForAcceptValue + */ + public function testAcceptValue( $inputValue, $expectedOutputValue ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $outputValue = $fieldType->acceptValue( $inputValue ); + + $this->assertEquals( + $expectedOutputValue, + $outputValue, + 'acceptValue() did not convert properly.' + ); + } + + /** + * @param mixed $inputValue + * @param \Exception $expectedException + * + * @dataProvider provideInvalidInputForAcceptValue + */ + public function testAcceptValueFailsOnInvalidValues( $inputValue, $expectedException ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + try + { + $fieldType->acceptValue( $inputValue ); + $this->fail( + sprintf( + 'Expected exception of type "%s" not thrown on incorrect input to acceptValue().', + $expectedException + ) + ); + } + catch ( \Exception $e ) + { + if ( $e instanceof \PHPUnit_Framework_Exception + || $e instanceof \PHPUnit_Framework_Error + || $e instanceof \PHPUnit_Framework_AssertionFailedError ) + { + throw $e; + } + + $this->assertInstanceOf( + $expectedException, + $e + ); + } + } + + /** + * @param mixed $inputValue + * @param array $expectedResult + * + * @dataProvider provideInputForToHash + */ + public function testToHash( $inputValue, $expectedResult ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $actualResult = $fieldType->toHash( $inputValue ); + + $this->assertIsValidHashValue( $actualResult ); + + $this->assertEquals( + $expectedResult, + $actualResult, + 'toHash() method did not create expected result.' + ); + } + + /** + * @param mixed $inputValue + * @param array $expectedResult + * + * @dataProvider provideInputForFromHash + */ + public function testFromHash( $inputHash, $expectedResult ) + { + $this->assertIsValidHashValue( $inputHash ); + + $fieldType = $this->getFieldTypeUnderTest(); + + $actualResult = $fieldType->fromHash( $inputHash ); + + $this->assertEquals( + $expectedResult, + $actualResult, + 'fromHash() method did not create expected result.' + ); + } + + public function testEmptyValueIsEmpty() + { + $fieldType = $this->getFieldTypeUnderTest(); + + $this->assertTrue( + $fieldType->isEmptyValue( $fieldType->getEmptyValue() ) + ); + } + + /** + * @param mixed $inputSettings + * + * @dataProvider provideValidFieldSettings + * + * @return void + */ + public function testValidateFieldSettingsValid( $inputSettings ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $validationResult = $fieldType->validateFieldSettings( $inputSettings ); + + $this->assertInternalType( + 'array', + $validationResult, + 'The method validateFieldSettings() must return an array.' + ); + $this->assertEquals( + array(), + $validationResult, + 'validateFieldSettings() did not consider the input settings valid.' + ); + } + + /** + * @param mixed $inputSettings + * + * @dataProvider provideInvalidFieldSettings + * + * @return void + */ + public function testValidateFieldSettingsInvalid( $inputSettings ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $validationResult = $fieldType->validateFieldSettings( $inputSettings ); + + $this->assertInternalType( + 'array', + $validationResult, + 'The method validateFieldSettings() must return an array.' + ); + + $this->assertNotEquals( + array(), + $validationResult, + 'validateFieldSettings() did consider the input settings valid, which should be invalid.' + ); + + foreach ( $validationResult as $actualResultElement ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\FieldType\\ValidationError', + $actualResultElement, + 'Validation result of incorrect type.' + ); + } + } + + /** + * @param mixed $inputConfiguration + * + * @dataProvider provideValidValidatorConfiguration + * + * @return void + */ + public function testValidateValidatorConfigurationValid( $inputConfiguration ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $validationResult = $fieldType->validateValidatorConfiguration( $inputConfiguration ); + + $this->assertInternalType( + 'array', + $validationResult, + 'The method validateValidatorConfiguration() must return an array.' + ); + $this->assertEquals( + array(), + $validationResult, + 'validateValidatorConfiguration() did not consider the input configuration valid.' + ); + } + + /** + * @param mixed $inputConfiguration + * + * @dataProvider provideInvalidValidatorConfiguration + * + * @return void + */ + public function testValidateValidatorConfigurationInvalid( $inputConfiguration ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $validationResult = $fieldType->validateValidatorConfiguration( $inputConfiguration ); + + $this->assertInternalType( + 'array', + $validationResult, + 'The method validateValidatorConfiguration() must return an array.' + ); + + $this->assertNotEquals( + array(), + $validationResult, + 'validateValidatorConfiguration() did consider the input settings valid, which should be invalid.' + ); + + foreach ( $validationResult as $actualResultElement ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\FieldType\\ValidationError', + $actualResultElement, + 'Validation result of incorrect type.' + ); + } + } + + /** + * @param mixed $inputConfiguration + * + * @dataProvider provideValidFieldSettings + * + * @return void + */ + public function testFieldSettingsToHash( $inputSettings ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $hash = $fieldType->fieldSettingsToHash( $inputSettings ); + + $this->assertIsValidHashValue( $hash ); + } + + /** + * @param mixed $inputConfiguration + * + * @dataProvider provideValidValidatorConfiguration + * + * @return void + */ + public function testValidatorConfigurationToHash( $inputConfiguration ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $hash = $fieldType->validatorConfigurationToHash( $inputConfiguration ); + + $this->assertIsValidHashValue( $hash ); + } + + /** + * @param mixed $inputConfiguration + * + * @dataProvider provideValidFieldSettings + * + * @return void + */ + public function testFieldSettingsFromHash( $inputSettings ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $hash = $fieldType->fieldSettingsToHash( $inputSettings ); + $restoredSettings = $fieldType->fieldSettingsFromHash( $hash ); + + $this->assertEquals( $inputSettings, $restoredSettings ); + } + + /** + * @param mixed $inputConfiguration + * + * @dataProvider provideValidValidatorConfiguration + * + * @return void + */ + public function testValidatorConfigurationFromHash( $inputConfiguration ) + { + $fieldType = $this->getFieldTypeUnderTest(); + + $hash = $fieldType->validatorConfigurationToHash( $inputConfiguration ); + $restoredConfiguration = $fieldType->validatorConfigurationFromHash( $hash ); + + $this->assertEquals( $inputConfiguration, $restoredConfiguration ); + } + + /** + * Asserts that the given $actualHash complies to the rules for hashes + * + * @param mixed $actualHash + * @param array $keyChain + * + * @return void + */ + protected function assertIsValidHashValue( $actualHash, $keyChain = array() ) + { + switch( ( $actualHashType = gettype( $actualHash ) ) ) + { + case 'boolean': + case 'integer': + case 'double': + case 'string': + case 'NULL': + // All valid, just return + return; + + case 'array': + foreach ( $actualHash as $key => $childHash ) + { + $this->assertIsValidHashValue( + $childHash, + array_merge( $keyChain, array( $key ) ) + ); + } + return; + + case 'resource': + case 'object': + $this->fail( + sprintf( + 'Value for $hash[%s] is of invalid type "%s".', + implode( '][', $keyChain ), + $actualHashType + ) + ); + } + } + + // @todo: More test methods … +} diff --git a/eZ/Publish/Core/FieldType/Tests/StringLengthValidatorTest.php b/eZ/Publish/Core/FieldType/Tests/StringLengthValidatorTest.php new file mode 100644 index 0000000..520a538 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/StringLengthValidatorTest.php @@ -0,0 +1,394 @@ +assertInstanceOf( + "eZ\\Publish\\Core\\FieldType\\Validator", + new StringLengthValidator + ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsInitializeGet() + { + $constraints = array( + "minStringLength" => 5, + "maxStringLength" => 10, + ); + $validator = new StringLengthValidator; + $validator->initializeWithConstraints( + $constraints + ); + $this->assertSame( $constraints["minStringLength"], $validator->minStringLength ); + $this->assertSame( $constraints["maxStringLength"], $validator->maxStringLength ); + } + + /** + * Test getting constraints schema + * + * @covers \eZ\Publish\Core\FieldType\Validator::getConstraintsSchema + */ + public function testGetConstraintsSchema() + { + $constraintsSchema = array( + "minStringLength" => array( + "type" => "int", + "default" => 0 + ), + "maxStringLength" => array( + "type" => "int", + "default" => null + ) + ); + $validator = new StringLengthValidator; + $this->assertSame( $constraintsSchema, $validator->getConstraintsSchema() ); + } + + /** + * Tests setting and getting constraints + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @covers \eZ\Publish\Core\FieldType\Validator::__get + */ + public function testConstraintsSetGet() + { + $constraints = array( + "minStringLength" => 5, + "maxStringLength" => 10, + ); + $validator = new StringLengthValidator; + $validator->minStringLength = $constraints["minStringLength"]; + $validator->maxStringLength = $constraints["maxStringLength"]; + $this->assertSame( $constraints["minStringLength"], $validator->minStringLength ); + $this->assertSame( $constraints["maxStringLength"], $validator->maxStringLength ); + } + + /** + * Tests initializing with a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::initializeWithConstraints + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testInitializeBadConstraint() + { + $constraints = array( + "unexisting" => 0, + ); + $validator = new StringLengthValidator; + $validator->initializeWithConstraints( + $constraints + ); + } + + /** + * Tests setting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__set + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testSetBadConstraint() + { + $validator = new StringLengthValidator; + $validator->unexisting = 0; + } + + /** + * Tests getting a wrong constraint + * + * @covers \eZ\Publish\Core\FieldType\Validator::__get + * @expectedException \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function testGetBadConstraint() + { + $validator = new StringLengthValidator; + $null = $validator->unexisting; + } + + /** + * Tests validating a correct value + * + * @dataProvider providerForValidateOK + * @covers \eZ\Publish\Core\FieldType\Validator\StringLengthValidator::validate + * @covers \eZ\Publish\Core\FieldType\Validator::getMessage + */ + public function testValidateCorrectValues( $value ) + { + $validator = new StringLengthValidator; + $validator->minStringLength = 5; + $validator->maxStringLength = 10; + $this->assertTrue( $validator->validate( new TextLineValue( $value ) ) ); + $this->assertSame( array(), $validator->getMessage() ); + } + + public function providerForValidateOK() + { + return array( + array( "hello" ), + array( "hello!" ), + array( "0123456789" ), + ); + } + + /** + * Tests validating a wrong value + * + * @dataProvider providerForValidateKO + * @covers \eZ\Publish\Core\FieldType\Validator\StringLengthValidator::validate + */ + public function testValidateWrongValues( $value, $messageSingular, $messagePlural, $values ) + { + $validator = new StringLengthValidator; + $validator->minStringLength = $this->getMinStringLength(); + $validator->maxStringLength = $this->getMaxStringLength(); + $this->assertFalse( $validator->validate( new TextLineValue( $value ) ) ); + $messages = $validator->getMessage(); + $this->assertCount( 1, $messages ); + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\FieldType\\ValidationError", + $messages[0] + ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Plural", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $messageSingular, + $messages[0]->getTranslatableMessage()->singular + ); + $this->assertEquals( + $messagePlural, + $messages[0]->getTranslatableMessage()->plural + ); + $this->assertEquals( + $values, + $messages[0]->getTranslatableMessage()->values + ); + } + + public function providerForValidateKO() + { + return array( + array( + "", + "The string can not be shorter than %size% character.", + "The string can not be shorter than %size% characters.", + array( "size" => $this->getMinStringLength() ) + ), + array( + "Hi!", + "The string can not be shorter than %size% character.", + "The string can not be shorter than %size% characters.", + array( "size" => $this->getMinStringLength() ) + ), + array( + "0123456789!", + "The string can not exceed %size% character.", + "The string can not exceed %size% characters.", + array( "size" => $this->getMaxStringLength() ) + ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsOK + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsCorrectValues( $constraints ) + { + $validator = new StringLengthValidator; + + $this->assertEmpty( + $validator->validateConstraints( $constraints ) + ); + } + + public function providerForValidateConstraintsOK() + { + return array( + array( + array(), + array( + "minStringLength" => 5, + ), + array( + "maxStringLength" => 2, + ), + array( + "minStringLength" => false, + "maxStringLength" => false + ), + array( + "minStringLength" => -5, + "maxStringLength" => false + ), + array( + "minStringLength" => false, + "maxStringLength" => 12 + ), + array( + "minStringLength" => 6, + "maxStringLength" => 8 + ), + ), + ); + } + + /** + * Tests validation of constraints + * + * @dataProvider providerForValidateConstraintsKO + * @covers \eZ\Publish\Core\FieldType\Validator\FileSizeValidator::validateConstraints + */ + public function testValidateConstraintsWrongValues( $constraints, $expectedMessages, $values ) + { + $validator = new StringLengthValidator; + $messages = $validator->validateConstraints( $constraints ); + + foreach ( $expectedMessages as $index => $expectedMessage ) + { + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Translation\\Message", + $messages[0]->getTranslatableMessage() + ); + $this->assertEquals( + $expectedMessage, + $messages[$index]->getTranslatableMessage()->message + ); + $this->assertEquals( + $values[$index], + $messages[$index]->getTranslatableMessage()->values + ); + } + } + + public function providerForValidateConstraintsKO() + { + return array( + array( + array( + "minStringLength" => true + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minStringLength" ), + ) + ), + array( + array( + "minStringLength" => "five thousand characters" + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minStringLength" ), + ) + ), + array( + array( + "minStringLength" => "five thousand characters", + "maxStringLength" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minStringLength" ), + ) + ), + array( + array( + "maxStringLength" => new \DateTime(), + "minStringLength" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "maxStringLength" ), + ) + ), + array( + array( + "minStringLength" => true, + "maxStringLength" => 1234 + ), + array( "Validator parameter '%parameter%' value must be of integer type" ), + array( + array( "parameter" => "minStringLength" ), + ) + ), + array( + array( + "minStringLength" => "five thousand characters", + "maxStringLength" => "ten billion characters" + ), + array( + "Validator parameter '%parameter%' value must be of integer type", + "Validator parameter '%parameter%' value must be of integer type" + ), + array( + array( "parameter" => "minStringLength" ), + array( "parameter" => "maxStringLength" ), + ) + ), + array( + array( + "brljix" => 12345 + ), + array( "Validator parameter '%parameter%' is unknown" ), + array( + array( "parameter" => "brljix" ), + ) + ), + array( + array( + "minStringLength" => 12345, + "brljix" => 12345 + ), + array( "Validator parameter '%parameter%' is unknown" ), + array( + array( "parameter" => "brljix" ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/TextBlockTest.php b/eZ/Publish/Core/FieldType/Tests/TextBlockTest.php new file mode 100644 index 0000000..f02365e --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/TextBlockTest.php @@ -0,0 +1,342 @@ + array( + 'type' => 'int', + 'default' => 10, + ), + ); + } + + /** + * Returns the empty value expected from the field type. + * + * @return \eZ\Publish\Core\FieldType\TextLine\Value + */ + protected function getEmptyValueExpectation() + { + return new TextBlockValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new TextBlockValue( 23 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new TextBlockValue, + ), + array( + '', + new TextBlockValue, + ), + array( + 'sindelfingen', + new TextBlockValue( 'sindelfingen' ), + ), + array( + new TextBlockValue( 'sindelfingen' ), + new TextBlockValue( 'sindelfingen' ), + ), + array( + new TextBlockValue( '' ), + new TextBlockValue, + ), + array( + new TextBlockValue( null ), + new TextBlockValue, + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + new TextBlockValue(), + '', + ), + array( + new TextBlockValue( 'sindelfingen' ), + 'sindelfingen', + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + '', + new TextBlockValue(), + ), + array( + 'sindelfingen', + new TextBlockValue( 'sindelfingen' ), + ), + ); + } + + /** + * Provide data sets with field settings which are considered valid by the + * {@link validateFieldSettings()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( 'rows' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidFieldSettings() + { + return array( + array( + array() + ), + array( + array( + 'textRows' => 23, + ) + ), + ); + } + + /** + * Provide data sets with field settings which are considered invalid by the + * {@link validateFieldSettings()} method. The method must return a + * non-empty array of validation error when receiving such field settings. + * + * Returns an array of data provider sets with a single argument: A valid + * set of field settings. + * For example: + * + * + * return array( + * array( + * true, + * ), + * array( + * array( 'nonExistentKey' => 2 ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInValidFieldSettings() + { + return array( + array( + array( + 'non-existent' => 'foo', + ) + ), + array( + array( + // textRows must be integer + 'textRows' => 'foo', + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/TextLineTest.php b/eZ/Publish/Core/FieldType/Tests/TextLineTest.php new file mode 100644 index 0000000..f3c6e2c --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/TextLineTest.php @@ -0,0 +1,435 @@ + array( + 'minStringLength' => array( + 'type' => 'int', + 'default' => 0 + ), + 'maxStringLength' => array( + 'type' => 'int', + 'default' => null + ) + ) + ); + } + + /** + * Returns the settings schema expected from the field type. + * + * @return array + */ + protected function getSettingsSchemaExpectation() + { + return array(); + } + + /** + * Returns the empty value expected from the field type. + * + * @return void + */ + protected function getEmptyValueExpectation() + { + return new TextLineValue; + } + + /** + * Data provider for invalid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The invalid + * input to acceptValue(), 2. The expected exception type as a string. For + * example: + * + * + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new TextLineValue( 23 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new TextLineValue, + ), + array( + "", + new TextLineValue, + ), + array( + " ", + new TextLineValue, + ), + array( + ' sindelfingen ', + new TextLineValue( ' sindelfingen ' ), + ), + array( + new TextLineValue( ' sindelfingen ' ), + new TextLineValue( ' sindelfingen ' ), + ), + array( + new TextLineValue( '' ), + new TextLineValue, + ), + array( + new TextLineValue( ' ' ), + new TextLineValue, + ), + array( + new TextLineValue( null ), + new TextLineValue, + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new TextLineValue(), + '', + ), + array( + new TextLineValue( 'sindelfingen' ), + 'sindelfingen', + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null, + ), + array( + '', + new TextLineValue(), + ), + array( + 'sindelfingen', + new TextLineValue( 'sindelfingen' ), + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * valid by the {@link validateValidatorConfiguration()} method. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array(), + * ), + * array( + * array( + * 'StringLengthValidator' => array( + * 'minStringLength' => 0, + * 'maxStringLength' => 23, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidValidatorConfiguration() + { + return array( + array( + array() + ), + array( + array( + 'StringLengthValidator' => array( + 'minStringLength' => false, + ) + ) + ), + array( + array( + 'StringLengthValidator' => array( + 'minStringLength' => 23, + ) + ) + ), + array( + array( + 'StringLengthValidator' => array( + 'maxStringLength' => false, + ) + ) + ), + array( + array( + 'StringLengthValidator' => array( + 'maxStringLength' => 23, + ) + ) + ), + array( + array( + 'StringLengthValidator' => array( + 'minStringLength' => 23, + 'maxStringLength' => 42, + ) + ) + ), + ); + } + + /** + * Provide data sets with validator configurations which are considered + * invalid by the {@link validateValidatorConfiguration()} method. The + * method must return a non-empty array of valiation errors when receiving + * one of the provided values. + * + * Returns an array of data provider sets with a single argument: A valid + * set of validator configurations. + * + * For example: + * + * + * return array( + * array( + * array( + * 'NonExistentValidator' => array(), + * ), + * ), + * array( + * array( + * // Typos + * 'InTEgervALUeVALIdator' => array( + * 'iinStringLength' => 0, + * 'maxStringLength' => 23, + * ) + * ) + * ), + * array( + * array( + * 'StringLengthValidator' => array( + * // Incorrect value types + * 'minStringLength' => true, + * 'maxStringLength' => false, + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidValidatorConfiguration() + { + return array( + array( + array( + 'NonExistentValidator' => array(), + ), + ), + array( + array( + 'StringLengthValidator' => array( + 'nonExistentValue' => 23 + ), + ), + ), + array( + array( + 'StringLengthValidator' => array( + 'minStringLength' => .23, + ), + ), + ), + array( + array( + 'StringLengthValidator' => array( + 'maxStringLength' => .42, + ), + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/UrlTest.php b/eZ/Publish/Core/FieldType/Tests/UrlTest.php new file mode 100644 index 0000000..5756b94 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/UrlTest.php @@ -0,0 +1,269 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + array( + new UrlValue( 23 ), + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new UrlValue, + ), + array( + 'http://example.com/sindelfingen', + new UrlValue( 'http://example.com/sindelfingen' ), + ), + array( + new UrlValue( 'http://example.com/sindelfingen', 'Sindelfingen!' ), + new UrlValue( 'http://example.com/sindelfingen', 'Sindelfingen!' ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new UrlValue( 'http://example.com/sindelfingen' ), + array( + 'link' => 'http://example.com/sindelfingen', + 'text' => '', + ), + ), + array( + new UrlValue( 'http://example.com/sindelfingen', 'Sindelfingen!' ), + array( + 'link' => 'http://example.com/sindelfingen', + 'text' => 'Sindelfingen!', + ), + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null + ), + array( + array( + 'link' => 'http://example.com/sindelfingen', + 'text' => null, + ), + new UrlValue( 'http://example.com/sindelfingen' ), + ), + array( + array( + 'link' => 'http://example.com/sindelfingen', + 'text' => 'Sindelfingen!', + ), + new UrlValue( 'http://example.com/sindelfingen', 'Sindelfingen!' ), + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/UserTest.php b/eZ/Publish/Core/FieldType/Tests/UserTest.php new file mode 100644 index 0000000..3e7e2ad --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/UserTest.php @@ -0,0 +1,297 @@ + + * return array( + * array( + * new \stdClass(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * array( + * array(), + * 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInvalidInputForAcceptValue() + { + return array( + array( + 23, + 'eZ\\Publish\\Core\\Base\\Exceptions\\InvalidArgumentException', + ), + ); + } + + /** + * Data provider for valid input to acceptValue(). + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to acceptValue(), 2. The expected return value from acceptValue(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * __FILE__, + * new BinaryFileValue( array( + * 'path' => __FILE__, + * 'fileName' => basename( __FILE__ ), + * 'fileSize' => filesize( __FILE__ ), + * 'downloadCount' => 0, + * 'mimeType' => 'text/plain', + * ) ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideValidInputForAcceptValue() + { + return array( + array( + null, + new UserValue, + ), + array( + array(), + new UserValue( array() ), + ), + array( + new UserValue( array( 'login' => 'sindelfingen' ) ), + new UserValue( array( 'login' => 'sindelfingen' ) ), + ), + array( + $userData = array( + 'hasStoredLogin' => true, + 'contentId' => 23, + 'login' => 'sindelfingen', + 'email' => 'sindelfingen@example.com', + 'passwordHash' => '1234567890abcdef', + 'passwordHashType' => 'md5', + 'enabled' => true, + 'maxLogin' => 1000, + ), + new UserValue( $userData ), + ), + array( + new UserValue( + $userData = array( + 'hasStoredLogin' => true, + 'contentId' => 23, + 'login' => 'sindelfingen', + 'email' => 'sindelfingen@example.com', + 'passwordHash' => '1234567890abcdef', + 'passwordHashType' => 'md5', + 'enabled' => true, + 'maxLogin' => 1000, + ) + ), + new UserValue( $userData ), + ), + ); + } + + /** + * Provide input for the toHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to toHash(), 2. The expected return value from toHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * new BinaryFileValue( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForToHash() + { + return array( + array( + null, + null + ), + array( + new UserValue( + $userData = array( + 'hasStoredLogin' => true, + 'contentId' => 23, + 'login' => 'sindelfingen', + 'email' => 'sindelfingen@example.com', + 'passwordHash' => '1234567890abcdef', + 'passwordHashType' => 'md5', + 'enabled' => true, + 'maxLogin' => 1000, + ) + ), + $userData, + ), + ); + } + + /** + * Provide input to fromHash() method + * + * Returns an array of data provider sets with 2 arguments: 1. The valid + * input to fromHash(), 2. The expected return value from fromHash(). + * For example: + * + * + * return array( + * array( + * null, + * null + * ), + * array( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ), + * new BinaryFileValue( + * array( + * 'path' => 'some/file/here', + * 'fileName' => 'sindelfingen.jpg', + * 'fileSize' => 2342, + * 'downloadCount' => 0, + * 'mimeType' => 'image/jpeg', + * ) + * ) + * ), + * // ... + * ); + * + * + * @return array + */ + public function provideInputForFromHash() + { + return array( + array( + null, + null + ), + array( + $userData = array( + 'hasStoredLogin' => true, + 'contentId' => 23, + 'login' => 'sindelfingen', + 'email' => 'sindelfingen@example.com', + 'passwordHash' => '1234567890abcdef', + 'passwordHashType' => 'md5', + 'enabled' => true, + 'maxLogin' => 1000, + ), + new UserValue( $userData ), + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/XmlText/Input/EzXmlTest.php b/eZ/Publish/Core/FieldType/Tests/XmlText/Input/EzXmlTest.php new file mode 100644 index 0000000..9d943a0 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/XmlText/Input/EzXmlTest.php @@ -0,0 +1,77 @@ +assertEquals( $xmlString, $input->getInternalRepresentation() ); + } + + public function providerForTestConvertCorrect() + { + return array( + array( + ' +
      <test>
      +', + ), + ); + } + + /** + * @dataProvider providerForTestConvertIncorrect + */ + public function testConvertIncorrect( $xmlString, $exceptionMessage ) + { + try + { + $input = new EzXml( $xmlString ); + } + catch ( \Exception $e ) + { + $this->assertEquals( $exceptionMessage, $e->getMessage() ); + return; + } + + $this->fail( "Expecting an Exception with message: " . $exceptionMessage ); + } + + public function providerForTestConvertIncorrect() + { + return array( + array( + '
      ', + "Argument 'xmlString' is invalid: Validation of XML content failed: Element 'wrongTag': This element is not expected. Expected is one of ( section, paragraph, header ).", + ), + array( + '
      Some content + +
      +This is a link +
      +
      ', + "Argument 'xmlString' is invalid: Validation of XML content failed: Element 'paragraph', attribute 'wrongAttribute': The attribute 'wrongAttribute' is not allowed. +Element 'tr': Missing child element(s). Expected is one of ( th, td ). +Element 'link', attribute 'node_id': 'abc' is not a valid value of the atomic type 'xs:integer'. +Element 'link': This element is not expected. Expected is one of ( custom, strong, emphasize, embed, embed-inline ).", + ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/XmlTextTest.php b/eZ/Publish/Core/FieldType/Tests/XmlTextTest.php new file mode 100644 index 0000000..4a49e59 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Tests/XmlTextTest.php @@ -0,0 +1,295 @@ +getMock( 'eZ\\Publish\\Core\\FieldType\\XmlText\\Input\\Parser' ) ); + * + * But there is a bug in PHPUnit when mocking an interface and calling the test in a certain way + * (eg. with --group switch), when invocationMocker is missing. + * + * Possibly described here: + * https://github.com/sebastianbergmann/phpunit-mock-objects/issues/26 + */ + protected function getFieldType() + { + return new XmlTextType( + $this->getValidatorServiceMock(), + $this->getFieldTypeToolsMock() + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::getValidatorConfigurationSchema + */ + public function testValidatorConfigurationSchema() + { + $ft = $this->getFieldType(); + self::assertEmpty( + $ft->getValidatorConfigurationSchema(), + "The validator configuration schema does not match what is expected." + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\FieldType::getSettingsSchema + */ + public function testSettingsSchema() + { + $ft = $this->getFieldType(); + self::assertSame( + array( + "numRows" => array( + "type" => "int", + "default" => 10 + ), + "tagPreset" => array( + "type" => "choice", + "default" => XmlTextType::TAG_PRESET_DEFAULT + ), + ), + $ft->getSettingsSchema(), + "The settings schema does not match what is expected." + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\XmlText\Type::acceptValue + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testAcceptValueInvalidType() + { + $this->getFieldType()->acceptValue( $this->getMockBuilder( 'eZ\\Publish\\Core\\FieldType\\Value' )->disableOriginalConstructor()->getMock() ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Type::acceptValue + * @dataProvider providerForTestAcceptValueValidFormat + */ + public function testAcceptValueValidFormat( $input ) + { + $fieldType = new XmlTextType( $this->getValidatorServiceMock(), $this->getFieldTypeToolsMock() ); + $fieldType->acceptValue( $input ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\Author\Type::acceptValue + * @dataProvider providerForTestAcceptValueInvalidFormat + */ + public function testAcceptValueInvalidFormat( $input, $errorMessage ) + { + try + { + $fieldType = new XmlTextType( $this->getValidatorServiceMock(), $this->getFieldTypeToolsMock() ); + $fieldType->acceptValue( $input ); + $this->fail( "An InvalidArgumentException was expected! None thrown." ); + } + catch ( InvalidArgumentException $e ) + { + $this->assertEquals( $errorMessage, $e->getMessage() ); + } + catch ( Exception $e ) + { + $this->fail( + "An InvalidArgumentException was expected! " . get_class( $e ) . " thrown with message: " . $e->getMessage() + ); + } + } + + /** + * @covers \eZ\Publish\Core\FieldType\XmlText\Type::toPersistenceValue + */ + public function testToPersistenceValue() + { + $xmlData = ' +
      Header 1
      '; + $xmlDoc = new DOMDocument; + $xmlDoc->loadXML( $xmlData ); + // @todo Do one per value class + $ft = $this->getFieldType(); + + $fieldValue = $ft->toPersistenceValue( $ft->acceptValue( $xmlData ) ); + + self::assertInstanceOf( 'DOMDocument', $fieldValue->data ); + self::assertSame( $xmlDoc->saveXML(), $fieldValue->data->saveXML() ); + } + + public static function providerForTestAcceptValueValidFormat() + { + return array( + + array( + $xml = ' +
      This is a piece of text
      ', + ), + array( new EzXml( $xml ) ), + + array( + $xml = ' +
      ', + ), + array( new EzXml( $xml ) ), + ); + } + + public static function providerForTestAcceptValueInvalidFormat() + { + return array( + + array( + ' +

      This is a piece of text

      ', + "Argument 'xmlString' is invalid: Validation of XML content failed: Element 'h1': This element is not expected. Expected is one of ( section, paragraph, header )." + ), + + array( + 'This is not XML at all!', + "Argument 'xmlString' is invalid: Validation of XML content failed: Start tag expected, '<' not found\nThe document has no document element." + ), + + array( + '', + "Argument 'xmlString' is invalid: Validation of XML content failed: Element 'unknown': No matching global declaration available for the validation root." + ), + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\XmlText\Type::getName + * @dataProvider providerForTestGetName + */ + public function testGetNamePassingValue( $xml, $value ) + { + $ft = $this->getFieldType(); + $this->assertEquals( + $value, + $ft->getName( $ft->acceptValue( $xml ) ) + ); + } + + /** + * @covers \eZ\Publish\Core\FieldType\XmlText\Type::getName + * @dataProvider providerForTestGetName + */ + public function testGetNamePassingXML( $xml, $value ) + { + $ft = $this->getFieldType(); + $this->assertEquals( + $value, + $ft->getName( $xml ) + ); + } + + public static function providerForTestGetName() + { + return array( + + array( + ' +
      This is a piece of text
      ', + "This is a piece of text" + ), + + array( + ' +
      This is a piece of text
      ', + /** @todo FIXME: should probably be "This is a piece of text" */ + "This is a piece of" + ), + + array( + ' +
      This is a piece of text
      ', + /** @todo FIXME: should probably be "This is a piece of text" */ + "This is a piece" + ), + + array( + ' +
      This is a piece of text
      ', + /** @todo FIXME: should probably be "This is a piece of text" */ + "This is" + ), + + array( + ' +
      First cellSecond cell
      Third cellFourth cell
      Text after table
      ', + /** @todo FIXME: should probably be "First cell" */ + "First cellSecond cell" + ), + + array( + ' +
      • List item
      ', + "List item" + ), + + array( + ' +
      • List item
      ', + "List item" + ), + + array( + ' +
      ', + "" + ), + + array( + ' +
      A simple paragraph!
      ', + "A simple" + ), + + array( '
      test
      ', "test" ), + + array( '
      testtest
      ', "test" ), + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Tests/developer-got-hurt.m4v b/eZ/Publish/Core/FieldType/Tests/developer-got-hurt.m4v new file mode 100644 index 0000000..6d50c56 Binary files /dev/null and b/eZ/Publish/Core/FieldType/Tests/developer-got-hurt.m4v differ diff --git a/eZ/Publish/Core/FieldType/Tests/squirrel-developers.jpg b/eZ/Publish/Core/FieldType/Tests/squirrel-developers.jpg new file mode 100644 index 0000000..8bab899 Binary files /dev/null and b/eZ/Publish/Core/FieldType/Tests/squirrel-developers.jpg differ diff --git a/eZ/Publish/Core/FieldType/TextBlock/Type.php b/eZ/Publish/Core/FieldType/TextBlock/Type.php new file mode 100644 index 0000000..d5b673e --- /dev/null +++ b/eZ/Publish/Core/FieldType/TextBlock/Type.php @@ -0,0 +1,225 @@ + array( + "type" => "int", + "default" => 10 + ) + ); + + protected $validatorConfigurationSchema = array(); + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "eztext"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + if ( $value === null ) + { + return ""; + } + return (string)$value->text; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\TextBlock\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value->text === null || trim( $value->text ) === ""; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\TextBlock\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( $inputValue === "" ) + { + return $this->getEmptyValue(); + } + + if ( is_string( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\TextBlock\\Value', + $inputValue + ); + } + + if ( $inputValue->text === null || $inputValue->text === "" ) + { + return $this->getEmptyValue(); + } + + if ( !is_string( $inputValue->text ) ) + { + throw new InvalidArgumentType( + '$inputValue->text', + 'string', + $inputValue->text + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @return array + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\TextBlock\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\TextBlock\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return $value->text; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + foreach ( (array)$fieldSettings as $name => $value ) + { + if ( isset( $this->settingsSchema[$name] ) ) + { + switch ( $name ) + { + case "textRows": + if ( !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' value must be of integer type", + null, + array( + "setting" => $name + ) + ); + } + break; + } + } + else + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + "setting" => $name + ) + ); + } + } + + return $validationErrors; + } +} diff --git a/eZ/Publish/Core/FieldType/TextBlock/Value.php b/eZ/Publish/Core/FieldType/TextBlock/Value.php new file mode 100644 index 0000000..0aabf38 --- /dev/null +++ b/eZ/Publish/Core/FieldType/TextBlock/Value.php @@ -0,0 +1,19 @@ +value->data, + new Search\FieldType\StringField() + ), + ); + } + + /** + * Get index fied types for search backend + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\FieldType[] + */ + public function getIndexDefinition() + { + return array( + 'value' => new Search\FieldType\StringField(), + ); + } +} + diff --git a/eZ/Publish/Core/FieldType/TextLine/Type.php b/eZ/Publish/Core/FieldType/TextLine/Type.php new file mode 100644 index 0000000..d8b9df8 --- /dev/null +++ b/eZ/Publish/Core/FieldType/TextLine/Type.php @@ -0,0 +1,296 @@ + array( + 'minStringLength' => array( + 'type' => 'int', + 'default' => 0 + ), + 'maxStringLength' => array( + 'type' => 'int', + 'default' => null + ) + ) + ); + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ) + { + $validationErrors = array(); + + foreach ( (array)$validatorConfiguration as $validatorIdentifier => $constraints ) + { + if ( $validatorIdentifier !== 'StringLengthValidator' ) + { + $validationErrors[] = new ValidationError( + "Validator '%validator%' is unknown", + null, + array( + "validator" => $validatorIdentifier + ) + ); + + continue; + } + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "minStringLength": + case "maxStringLength": + if ( $value !== false && !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of integer type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + } + + return $validationErrors; + } + + /** + * Validates a field based on the validators in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition The field definition of the field + * @param \eZ\Publish\Core\FieldType\Value $fieldValue The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDefinition, $fieldValue ) + { + $validatorConfiguration = $fieldDefinition->getValidatorConfiguration(); + $constraints = isset( $validatorConfiguration['StringLengthValidator'] ) + ? $validatorConfiguration['StringLengthValidator'] + : array(); + + $validationErrors = array(); + + if ( isset( $constraints['maxStringLength'] ) && + $constraints['maxStringLength'] !== false && + $constraints['maxStringLength'] !== 0 && + strlen( $fieldValue->text ) > $constraints['maxStringLength'] ) + { + $validationErrors[] = new ValidationError( + "The string can not exceed %size% character.", + "The string can not exceed %size% characters.", + array( + "size" => $constraints['maxStringLength'] + ) + ); + } + + if ( isset( $constraints['minStringLength'] ) && + $constraints['minStringLength'] !== false && + $constraints['minStringLength'] !== 0 && + strlen( $fieldValue->text ) < $constraints['minStringLength'] ) + { + $validationErrors[] = new ValidationError( + "The string can not be shorter than %size% character.", + "The string can not be shorter than %size% characters.", + array( + "size" => $constraints['minStringLength'] + ) + ); + } + + return $validationErrors; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezstring"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + if ( $value === null ) + { + return ""; + } + return (string)$value->text; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\TextLine\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + return $value === null || $value->text === null || trim( $value->text ) === ""; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\TextLine\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_string( $inputValue ) ) + { + if ( trim( $inputValue, " " ) === "" ) + return $this->getEmptyValue(); + + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\TextLine\\Value', + $inputValue + ); + } + + if ( $inputValue->text === null + || ( is_string( $inputValue->text ) && trim( $inputValue->text, " " ) === "" ) ) + { + return $this->getEmptyValue(); + } + + if ( !is_string( $inputValue->text ) ) + { + throw new InvalidArgumentType( + '$inputValue->text', + 'string', + $inputValue->text + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @todo String normalization should occur here. + * + * @return array + */ + protected function getSortInfo( $value ) + { + if ( $value === null ) + { + return ''; + } + return $value->text; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\TextLine\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\TextLine\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return $value->text; + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } +} diff --git a/eZ/Publish/Core/FieldType/TextLine/Value.php b/eZ/Publish/Core/FieldType/TextLine/Value.php new file mode 100644 index 0000000..58e6c80 --- /dev/null +++ b/eZ/Publish/Core/FieldType/TextLine/Value.php @@ -0,0 +1,43 @@ +text = $text; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->text; + } +} diff --git a/eZ/Publish/Core/FieldType/Unindexed.php b/eZ/Publish/Core/FieldType/Unindexed.php new file mode 100644 index 0000000..561c19f --- /dev/null +++ b/eZ/Publish/Core/FieldType/Unindexed.php @@ -0,0 +1,42 @@ +acceptValue( $value ); + return (string)$value->text; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\Url\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Url\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_string( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\Url\\Value', + $inputValue + ); + } + + if ( !is_string( $inputValue->link ) ) + { + throw new InvalidArgumentType( + '$inputValue->link', + 'string', + $inputValue->link + ); + } + + if ( isset( $inputValue->text ) && !is_string( $inputValue->text ) ) + { + throw new InvalidArgumentType( + '$inputValue->text', + 'string', + $inputValue->text + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @todo Sort seems to not be supported by this FieldType, is this handled correctly? + * + * @return array + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\Url\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + + if ( isset( $hash["text"] ) ) + return new Value( $hash["link"], $hash["text"] ); + + return new Value( $hash["link"] ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\Url\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + + return array( "link" => $value->link, "text" => $value->text ); + } + + /** + * Converts a $value to a persistence value. + * + * In this method the field type puts the data which is stored in the field of content in the repository + * into the property FieldValue::data. The format of $data is a primitive, an array (map) or an object, which + * is then canonically converted to e.g. json/xml structures by future storage engines without + * further conversions. For mapping the $data to the legacy database an appropriate Converter + * (implementing eZ\Publish\Core\Persistence\Legacy\FieldValue\Converter) has implemented for the field + * type. Note: $data should only hold data which is actually stored in the field. It must not + * hold data which is stored externally. + * + * The $externalData property in the FieldValue is used for storing data externally by the + * FieldStorage interface method storeFieldData. + * + * The FieldValuer::sortKey is build by the field type for using by sort operations. + * + * @see \eZ\Publish\SPI\Persistence\Content\FieldValue + * + * @param mixed $value The value of the field type + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue the value processed by the storage engine + */ + public function toPersistenceValue( $value ) + { + if ( $value === null ) + { + return new FieldValue( + array( + "data" => array(), + "externalData" => null, + "sortKey" => null, + ) + ); + } + + return new FieldValue( + array( + "data" => array( + 'urlId' => null, + 'text' => $value->text + ), + "externalData" => $value->link, + "sortKey" => $this->getSortInfo( $value ), + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * This method builds a field type value from the $data and $externalData properties. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + if ( $fieldValue->externalData === null ) + { + return null; + } + + return new Value( + $fieldValue->externalData, + $fieldValue->data['text'] + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Url/UrlStorage.php b/eZ/Publish/Core/FieldType/Url/UrlStorage.php new file mode 100644 index 0000000..7784f77 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Url/UrlStorage.php @@ -0,0 +1,77 @@ +getGateway( $context ); + return $gateway->storeFieldData( $versionInfo, $field ); + } + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $gateway = $this->getGateway( $context ); + return $gateway->getFieldData( $field ); + } + + /** + * @param VersionInfo $versionInfo + * @param array $fieldIds + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + } +} diff --git a/eZ/Publish/Core/FieldType/Url/UrlStorage/Gateway.php b/eZ/Publish/Core/FieldType/Url/UrlStorage/Gateway.php new file mode 100644 index 0000000..b1eebb2 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Url/UrlStorage/Gateway.php @@ -0,0 +1,39 @@ +dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * @see \eZ\Publish\Core\FieldType\Url\UrlStorage\Gateway + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field ) + { + $dbHandler = $this->getConnection(); + + if ( ( $row = $this->fetchByLink( $field->value->externalData ) ) !== false ) + $urlId = $row["id"]; + else + $urlId = $this->insert( $versionInfo, $field ); + + $field->value->data["urlId"] = $urlId; + + // Signals that the Value has been modified and that an update is to be performed + return true; + } + + /** + * @see \eZ\Publish\Core\FieldType\Url\UrlStorage\Gateway + */ + public function getFieldData( Field $field ) + { + $url = $this->fetchById( $field->value->data["urlId"] ); + $field->value->externalData = $url["url"]; + } + + /** + * Fetches a row in ezurl table referenced by its $id + * + * @param mixed $id + * + * @return null|array Hash with columns as keys or null if no entry can be found + */ + private function fetchById( $id ) + { + $dbHandler = $this->getConnection(); + + $q = $dbHandler->createSelectQuery(); + $e = $q->expr; + $q->select( "*" ) + ->from( $dbHandler->quoteTable( self::URL_TABLE ) ) + ->where( + $e->eq( "id", $q->bindValue( $id, null, \PDO::PARAM_INT ) ) + ); + + $statement = $q->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + if ( count( $rows ) ) + { + return $rows[0]; + } + + return false; + } + + /** + * Fetches a row in ezurl table referenced by $link + * + * @param string $link + * + * @return null|array Hash with columns as keys or null if no entry can be found + */ + private function fetchByLink( $link ) + { + $dbHandler = $this->getConnection(); + + $q = $dbHandler->createSelectQuery(); + $e = $q->expr; + $q->select( "*" ) + ->from( $dbHandler->quoteTable( self::URL_TABLE ) ) + ->where( + $e->eq( "url", $q->bindValue( $link ) ) + ); + + $statement = $q->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + if ( count( $rows ) ) + { + return $rows[0]; + } + + return false; + } + + /** + * Inserts a new entry in ezurl table with $field value data + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler $dbHandler + * + * @return mixed + */ + private function insert( VersionInfo $versionInfo, Field $field ) + { + $dbHandler = $this->getConnection(); + + $time = time(); + + $q = $dbHandler->createInsertQuery(); + $q->insertInto( + $dbHandler->quoteTable( self::URL_TABLE ) + )->set( + $dbHandler->quoteColumn( "created" ), + $q->bindValue( $time, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "modified" ), + $q->bindValue( $time, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "original_url_md5" ), + $q->bindValue( md5( $field->value->externalData ) ) + )->set( + $dbHandler->quoteColumn( "url" ), + $q->bindValue( $field->value->externalData ) + ); + + $q->prepare()->execute(); + + return $dbHandler->lastInsertId( + $dbHandler->getSequenceName( self::URL_TABLE, "id" ) + ); + } +} diff --git a/eZ/Publish/Core/FieldType/Url/Value.php b/eZ/Publish/Core/FieldType/Url/Value.php new file mode 100644 index 0000000..26e2e92 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Url/Value.php @@ -0,0 +1,52 @@ +link = $link; + $this->text = $text; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return (string)$this->link; + } +} diff --git a/eZ/Publish/Core/FieldType/User/Type.php b/eZ/Publish/Core/FieldType/User/Type.php new file mode 100644 index 0000000..6a794af --- /dev/null +++ b/eZ/Publish/Core/FieldType/User/Type.php @@ -0,0 +1,174 @@ +acceptValue( $value ); + + return (string)$value->login; + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\User\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\User\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_array( $inputValue ) ) + { + $inputValue = new Value( $inputValue ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\User\\Value', + $inputValue + ); + } + + return $inputValue; + } + + /** + * Returns information for FieldValue->$sortKey relevant to the field type. + * + * @todo: Implement. + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\User\Value $value + */ + public function fromHash( $hash ) + { + if ( $hash === null ) + { + return null; + } + return new Value( $hash ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\User\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + if ( $this->isEmptyValue( $value ) ) + { + return null; + } + return (array)$value; + } + + /** + * Converts a $value to a persistence value. + * + * In this method the field type puts the data which is stored in the field of content in the repository + * into the property FieldValue::data. The format of $data is a primitive, an array (map) or an object, which + * is then canonically converted to e.g. json/xml structures by future storage engines without + * further conversions. For mapping the $data to the legacy database an appropriate Converter + * (implementing eZ\Publish\Core\Persistence\Legacy\FieldValue\Converter) has implemented for the field + * type. Note: $data should only hold data which is actually stored in the field. It must not + * hold data which is stored externally. + * + * The $externalData property in the FieldValue is used for storing data externally by the + * FieldStorage interface method storeFieldData. + * + * The FieldValuer::sortKey is build by the field type for using by sort operations. + * + * @see \eZ\Publish\SPI\Persistence\Content\FieldValue + * + * @param mixed $value The value of the field type + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue the value processed by the storage engine + */ + public function toPersistenceValue( $value ) + { + return new FieldValue( + array( + "data" => null, + "externalData" => $this->toHash( $value ), + "sortKey" => null, + ) + ); + } + + /** + * Converts a persistence $fieldValue to a Value + * + * This method builds a field type value from the $data and $externalData properties. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + return $this->acceptValue( $fieldValue->externalData ); + } +} diff --git a/eZ/Publish/Core/FieldType/User/UserStorage.php b/eZ/Publish/Core/FieldType/User/UserStorage.php new file mode 100644 index 0000000..8e14ab2 --- /dev/null +++ b/eZ/Publish/Core/FieldType/User/UserStorage.php @@ -0,0 +1,138 @@ +id = unique ID from the attribute tables (needs to be generated by + * database back end on create, before the external data source may be + * called from storing). + * + * The context array provides some context for the field handler about the + * currently used storage engine. + * The array should at least define 2 keys : + * - identifier (connection identifier) + * - connection (the connection handler) + * For example, using Legacy storage engine, $context will be: + * - identifier = 'LegacyStorage' + * - connection = {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} object handler (for DB connection), + * to be used accordingly to + * The context array provides some context for the field handler about the + * currently used storage engine. + * The array should at least define 2 keys : + * - identifier (connection identifier) + * - connection (the connection handler) + * For example, using Legacy storage engine, $context will be: + * - identifier = 'LegacyStorage' + * - connection = {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} object handler (for DB connection), + * to be used accordingly to + * {@link http://incubator.apache.org/zetacomponents/documentation/trunk/Database/tutorial.html ezcDatabase} usage + * + * This method might return true if $field needs to be updated after storage done here (to store a PK for instance). + * In any other case, this method must not return anything (null). + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return null|true + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + // Only the UserService may update user data + } + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $gateway = $this->getGateway( $context ); + $field->value->externalData = $gateway->getFieldData( $field->id ); + } + + /** + * @param VersionInfo $versionInfo + * @param array $fieldIds Array of field Ids + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + // Only the UserService may update user data + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + // @todo: How to call this function? Yet undefined. + echo __METHOD__, PHP_EOL; + var_dump( func_get_args() ); + } +} diff --git a/eZ/Publish/Core/FieldType/User/UserStorage/Gateway.php b/eZ/Publish/Core/FieldType/User/UserStorage/Gateway.php new file mode 100644 index 0000000..39a76e2 --- /dev/null +++ b/eZ/Publish/Core/FieldType/User/UserStorage/Gateway.php @@ -0,0 +1,41 @@ + false, + 'contentId' => null, + 'login' => null, + 'email' => null, + 'passwordHash' => null, + 'passwordHashType' => null, + 'enabled' => false, + 'maxLogin' => null, + ); + + /** + * Maps legacy database column names to property names + * + * @var array + */ + protected function getPropertyMap() + { + return array( + 'has_stored_login' => array( + 'name' => 'hasStoredlogin', + 'cast' => + function ( $input ) + { + return ( $input == "1" ); + }, + ), + 'contentobject_id' => array( + 'name' => 'contentId', + 'cast' => 'intval' + ), + 'login' => array( + 'name' => 'login', + 'cast' => 'strval' + ), + 'email' => array( + 'name' => 'email', + 'cast' => 'strval' + ), + 'password_hash' => array( + 'name' => 'passwordHash', + 'cast' => 'strval' + ), + 'password_hash_type' => array( + 'name' => 'passwordHashType', + 'cast' => 'strval' + ), + 'is_enabled' => array( + 'name' => 'enabled', + 'cast' => + function ( $input ) + { + return ( $input == "1" ); + } + ), + 'max_login' => array( + 'name' => 'maxLogin', + 'cast' => 'intval' + ), + ); + } + + /** + * Set dbHandler for gateway + * + * @param mixed $dbHandler + * + * @return void + */ + public function setConnection( $dbHandler ) + { + // This obviously violates the Liskov substitution Principle, but with + // the given class design there is no sane other option. Actually the + // dbHandler *should* be passed to the constructor, and there should + // not be the need to post-inject it. + if ( !$dbHandler instanceof \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler ) + { + throw new \RuntimeException( "Invalid dbHandler passed" ); + } + + $this->dbHandler = $dbHandler; + } + + /** + * Get field data + * + * The User storage handles the following attributes, following the user field + * type in eZ Publish 4: + * - hasStoredLogin + * - contentobjectId + * - login + * - email + * - passwordHash + * - passwordHashType + * - isEnabled + * - maxLogin + * + * @param mixed $fieldId + * @param mixed $userId + * + * @return array + */ + public function getFieldData( $fieldId, $userId = null ) + { + $userId = $userId ?: $this->fetchUserId( $fieldId ); + $userData = $this->fetchUserData( $userId ); + + if ( !isset( $userData['login'] ) ) + { + return $this->defaultValues; + } + + $result = array_merge( + $this->defaultValues, + array( + 'hasStoredLogin' => true, + ), + $userData, + $this->fetchUserSettings( $userId ) + ); + + return $result; + } + + /** + * Converts the given database values to properties + * + * @param array $databaseValues + * + * @return array + */ + protected function convertColumnsToProperties( array $databaseValues ) + { + $propertyValues = array(); + $propertyMap = $this->getPropertyMap(); + + foreach ( $databaseValues as $columnName => $value ) + { + $conversionFunction = $propertyMap[$columnName]['cast']; + + $propertyValues[$propertyMap[$columnName]['name']] = $conversionFunction( $value ); + } + + return $propertyValues; + } + + /** + * Fetch basic user data + * + * @param mixed $fieldId + * + * @return array + */ + protected function fetchUserId( $fieldId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + ) + ->from( $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject_attribute' ), + $query->bindValue( $fieldId ) + ) + ); + + $stmt = $query->prepare(); + $stmt->execute(); + + return $stmt->fetchColumn(); + } + + /** + * Fetch user data + * + * @param mixed $userId + * + * @return array + */ + protected function fetchUserData( $userId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezuser' ), + $this->dbHandler->quoteColumn( 'login', 'ezuser' ), + $this->dbHandler->quoteColumn( 'email', 'ezuser' ), + $this->dbHandler->quoteColumn( 'password_hash', 'ezuser' ), + $this->dbHandler->quoteColumn( 'password_hash_type', 'ezuser' ) + ) + ->from( $this->dbHandler->quoteTable( 'ezuser' ) ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezuser' ), + $query->bindValue( $userId ) + ) + ); + + $stmt = $query->prepare(); + $stmt->execute(); + + $rows = $stmt->fetchAll( \PDO::FETCH_ASSOC ); + return isset( $rows[0] ) ? $this->convertColumnsToProperties( $rows[0] ) : array(); + } + + /** + * Fetch user settings + * + * Naturally this would be a RIGHT OUTER JOIN, but this is not supported by + * ezcDatabase nor by databases like SQLite + * + * @param mixed $userId + * + * @return array + */ + protected function fetchUserSettings( $userId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query + ->select( + $this->dbHandler->quoteColumn( 'is_enabled', 'ezuser_setting' ), + $this->dbHandler->quoteColumn( 'max_login', 'ezuser_setting' ) + ) + ->from( $this->dbHandler->quoteTable( 'ezuser_setting' ) ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'user_id', 'ezuser_setting' ), + $query->bindValue( $userId ) + ) + ); + + $stmt = $query->prepare(); + $stmt->execute(); + + $rows = $stmt->fetchAll( \PDO::FETCH_ASSOC ); + return isset( $rows[0] ) ? $this->convertColumnsToProperties( $rows[0] ) : array(); + } +} + diff --git a/eZ/Publish/Core/FieldType/User/Value.php b/eZ/Publish/Core/FieldType/User/Value.php new file mode 100644 index 0000000..2509d02 --- /dev/null +++ b/eZ/Publish/Core/FieldType/User/Value.php @@ -0,0 +1,83 @@ +login; + } +} + diff --git a/eZ/Publish/Core/FieldType/ValidationError.php b/eZ/Publish/Core/FieldType/ValidationError.php new file mode 100644 index 0000000..17c8e7a --- /dev/null +++ b/eZ/Publish/Core/FieldType/ValidationError.php @@ -0,0 +1,71 @@ +singular = $singular; + $this->plural = $plural; + $this->values = $values; + } + + /** + * Returns a translatable Message + * + * @return \eZ\Publish\API\Repository\Values\Translation + */ + public function getTranslatableMessage() + { + if ( isset( $this->plural ) ) + { + return new Plural( + $this->singular, + $this->plural, + $this->values + ); + } + else + { + return new Message( + $this->singular, + $this->values + ); + } + } +} diff --git a/eZ/Publish/Core/FieldType/Validator.php b/eZ/Publish/Core/FieldType/Validator.php new file mode 100644 index 0000000..9a94fbc --- /dev/null +++ b/eZ/Publish/Core/FieldType/Validator.php @@ -0,0 +1,186 @@ + + * // With no default value + * protected $constraints = array( + * "maxStringLength" => false + * ); + * + * // With a default value + * protected $constraints = array( + * "minIntegerValue" => 0, + * "maxIntegerValue" => 40 + * ); + * + * + * @var array + */ + protected $constraints = array(); + + /** + * A one dimensional map with validator parameters + * + * @var mixed + */ + protected $constraintsSchema = array(); + + /** + * Returns a schema for supported validator configurations. + * + * This implementation returns a three dimensional map containing for each validator configuration + * referenced by identifier a map of supported parameters which are defined by a type and a default value + * (see example). + * Example: + * + * array( + * 'stringLength' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * + * The validator identifier. + */ + public function getConstraintsSchema() + { + return $this->constraintsSchema; + } + + /** + * @param mixed $constraints + * + * @return mixed + */ + abstract public function validateConstraints( $constraints ); + + /** + * Perform validation on $value. + * + * Will return true when all constraints are matched. If one or more + * constraints fail, the method will return false. + * + * When a check against a constraint has failed, an entry will be added to the + * $errors array. + * + * @param \eZ\Publish\Core\FieldType\Value $value + * + * @return boolean + */ + abstract public function validate( Value $value ); + + /** + * Returns array of messages on performed validations. + * + * When no validation errors occurred, the returned array should be empty. + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function getMessage() + { + return $this->errors; + } + + /** + * Initialized an instance of Validator, with earlier configured constraints. + * + * @internal + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + * @param array $constraints + * + * @return void + */ + public function initializeWithConstraints( array $constraints ) + { + // Reset errors + $this->errors = array(); + // Set existing constraint values to false + foreach ( $this->constraints as $constraint => $value ) + { + $this->constraints[$constraint] = false; + } + // Initialize constraints with new values + foreach ( $constraints as $constraint => $value ) + { + if ( !isset( $this->constraints[$constraint] ) ) + { + throw new PropertyNotFound( "The constraint '{$constraint}' is not valid for this validator." ); + } + + $this->constraints[$constraint] = $value; + } + } + + /** + * Magic getter. + * Returns constraint value, from its $name + * + * @param string $name + * + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + * + * @return mixed + */ + public function __get( $name ) + { + if ( !isset( $this->constraints[$name] ) ) + { + throw new PropertyNotFound( "The constraint '{$name}' is not valid for this validator." ); + } + + return $this->constraints[$name]; + } + + /** + * Magic setter. + * Sets $value to constraint, identified by $name + * + * @param string $name + * @param mixed $value + * + * @throws \eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException + */ + public function __set( $name, $value ) + { + if ( !isset( $this->constraints[$name] ) ) + { + throw new PropertyNotFound( "The constraint '{$name}' is not valid for this validator." ); + } + + $this->constraints[$name] = $value; + } +} diff --git a/eZ/Publish/Core/FieldType/Validator/EmailAddressValidator.php b/eZ/Publish/Core/FieldType/Validator/EmailAddressValidator.php new file mode 100644 index 0000000..be66eab --- /dev/null +++ b/eZ/Publish/Core/FieldType/Validator/EmailAddressValidator.php @@ -0,0 +1,107 @@ + false, + ); + + protected $constraintsSchema = array( + "Extent" => array( + "type" => "string", + "default" => "regex" + ) + ); + + /** + * @abstract + * + * @param mixed $constraints + * + * @return mixed + */ + public function validateConstraints( $constraints ) + { + $validationErrors = array(); + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "Extent": + + if ( $value !== false && $value !== "regex" ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be regex for now", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Perform validation on $value. + * + * Will return true when all constraints are matched. If one or more + * constraints fail, the method will return false. + * + * When a check against a constraint has failed, an entry will be added to the + * $errors array. + * + * @abstract + * + * @param \eZ\Publish\Core\FieldType\Value $value + * + * @return boolean + */ + public function validate( BaseValue $value ) + { + $pattern = '/^((\"[^\"\f\n\r\t\v\b]+\")|([A-Za-z0-9_\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[A-Za-z0-9_\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]{2,}))$/'; + + if ( preg_match( $pattern, $value->email ) ) + { + return true; + } + + $this->errors[] = new ValidationError( + "The value must be a valid email address.", + null, + array() + ); + return false; + } +} diff --git a/eZ/Publish/Core/FieldType/Validator/FileSizeValidator.php b/eZ/Publish/Core/FieldType/Validator/FileSizeValidator.php new file mode 100644 index 0000000..5989ddf --- /dev/null +++ b/eZ/Publish/Core/FieldType/Validator/FileSizeValidator.php @@ -0,0 +1,93 @@ + false + ); + + protected $constraintsSchema = array( + "maxFileSize" => array( + "type" => "int", + "default" => false + ) + ); + + public function validateConstraints( $constraints ) + { + $validationErrors = array(); + + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "maxFileSize": + if ( $value !== false && !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of integer type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Checks if $value->file has the appropriate size + * + * @param \eZ\Publish\Core\FieldType\BinaryFile\Value $value + * + * @return boolean + */ + public function validate( BaseValue $value ) + { + $isValid = true; + + if ( $this->constraints['maxFileSize'] !== false && $value->file->size > $this->constraints['maxFileSize'] ) + { + $this->errors[] = new ValidationError( + "The file size cannot exceed %size% byte.", + "The file size cannot exceed %size% bytes.", + array( + "size" => $this->constraints['maxFileSize'] + ) + ); + $isValid = false; + } + + return $isValid; + } +} diff --git a/eZ/Publish/Core/FieldType/Validator/FloatValueValidator.php b/eZ/Publish/Core/FieldType/Validator/FloatValueValidator.php new file mode 100644 index 0000000..5751eb3 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Validator/FloatValueValidator.php @@ -0,0 +1,121 @@ + false, + 'maxFloatValue' => false + ); + + protected $constraintsSchema = array( + "minFloatValue" => array( + "type" => "float", + "default" => false + ), + "maxFloatValue" => array( + "type" => "float", + "default" => false + ) + ); + + public function validateConstraints( $constraints ) + { + $validationErrors = array(); + + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "minFloatValue": + case "maxFloatValue": + if ( $value !== false && !is_numeric( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of numeric type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Perform validation on $value. + * + * Will return true when all constraints are matched. If one or more + * constraints fail, the method will return false. + * + * When a check against a constant has failed, an entry will be added to the + * $errors array. + * + * @param \eZ\Publish\Core\FieldType\Float\Value $value + * + * @return boolean + */ + public function validate( BaseValue $value ) + { + $isValid = true; + + if ( $this->constraints['maxFloatValue'] !== false && $value->value > $this->constraints['maxFloatValue'] ) + { + $this->errors[] = new ValidationError( + "The value can not be higher than %size%.", + null, + array( + "size" => $this->constraints['maxFloatValue'] + ) + ); + $isValid = false; + } + + if ( $this->constraints['minFloatValue'] !== false && $value->value < $this->constraints['minFloatValue'] ) + { + $this->errors[] = new ValidationError( + "The value can not be lower than %size%.", + null, + array( + "size" => $this->constraints['minFloatValue'] + ) + ); + $isValid = false; + } + + return $isValid; + } +} diff --git a/eZ/Publish/Core/FieldType/Validator/IntegerValueValidator.php b/eZ/Publish/Core/FieldType/Validator/IntegerValueValidator.php new file mode 100644 index 0000000..7de0604 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Validator/IntegerValueValidator.php @@ -0,0 +1,117 @@ + false, + 'maxIntegerValue' => false + ); + + protected $constraintsSchema = array( + "minIntegerValue" => array( + "type" => "int", + "default" => 0 + ), + "maxIntegerValue" => array( + "type" => "int", + "default" => false + ) + ); + + public function validateConstraints( $constraints ) + { + $validationErrors = array(); + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "minIntegerValue": + case "maxIntegerValue": + if ( $value !== false && !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of integer type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Perform validation on $value. + * + * Will return true when all constraints are matched. If one or more + * constraints fail, the method will return false. + * + * When a check against a constraint has failed, an entry will be added to the + * $errors array. + * + * @param \eZ\Publish\Core\FieldType\Integer\Value $value + * + * @return boolean + */ + public function validate( BaseValue $value ) + { + $isValid = true; + + if ( $this->constraints['maxIntegerValue'] !== false && $value->value > $this->constraints['maxIntegerValue'] ) + { + $this->errors[] = new ValidationError( + "The value can not be higher than %size%.", + null, + array( + "size" => $this->constraints['maxIntegerValue'] + ) + ); + $isValid = false; + } + + if ( $this->constraints['minIntegerValue'] !== false && $value->value < $this->constraints['minIntegerValue'] ) + { + $this->errors[] = new ValidationError( + "The value can not be lower than %size%.", + null, + array( + "size" => $this->constraints['minIntegerValue'] + ) + ); + $isValid = false; + } + + return $isValid; + } +} diff --git a/eZ/Publish/Core/FieldType/Validator/StringLengthValidator.php b/eZ/Publish/Core/FieldType/Validator/StringLengthValidator.php new file mode 100644 index 0000000..c1a17c4 --- /dev/null +++ b/eZ/Publish/Core/FieldType/Validator/StringLengthValidator.php @@ -0,0 +1,116 @@ + false, + "minStringLength" => false + ); + + protected $constraintsSchema = array( + "minStringLength" => array( + "type" => "int", + "default" => 0 + ), + "maxStringLength" => array( + "type" => "int", + "default" => null + ) + ); + + public function validateConstraints( $constraints ) + { + $validationErrors = array(); + foreach ( $constraints as $name => $value ) + { + switch ( $name ) + { + case "minStringLength": + case "maxStringLength": + if ( $value !== false && !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' value must be of integer type", + null, + array( + "parameter" => $name + ) + ); + } + break; + default: + $validationErrors[] = new ValidationError( + "Validator parameter '%parameter%' is unknown", + null, + array( + "parameter" => $name + ) + ); + } + } + + return $validationErrors; + } + + /** + * Checks if the string $value is in desired range. + * + * The range is determined by $maxStringLength and $minStringLength. + * + * @param \eZ\Publish\Core\FieldType\TextLine\Value $value + * + * @return boolean + */ + public function validate( BaseValue $value ) + { + $isValid = true; + + if ( $this->constraints['maxStringLength'] !== false && + $this->constraints['maxStringLength'] !== 0 && + strlen( $value->text ) > $this->constraints['maxStringLength'] ) + { + $this->errors[] = new ValidationError( + "The string can not exceed %size% character.", + "The string can not exceed %size% characters.", + array( + "size" => $this->constraints['maxStringLength'] + ) + ); + $isValid = false; + } + if ( $this->constraints['minStringLength'] !== false && + $this->constraints['minStringLength'] !== 0 && + strlen( $value->text ) < $this->constraints['minStringLength'] ) + { + $this->errors[] = new ValidationError( + "The string can not be shorter than %size% character.", + "The string can not be shorter than %size% characters.", + array( + "size" => $this->constraints['minStringLength'] + ) + ); + $isValid = false; + } + + return $isValid; + } +} diff --git a/eZ/Publish/Core/FieldType/Value.php b/eZ/Publish/Core/FieldType/Value.php new file mode 100644 index 0000000..33f56aa --- /dev/null +++ b/eZ/Publish/Core/FieldType/Value.php @@ -0,0 +1,26 @@ +viewManager = $viewManager; + $this->repository = $repository; + } + + /** + * Converts embed elements in $xmlDoc from internal representation to HTML5 + * + * @param \DOMDocument $xmlDoc + * + * @return null + */ + public function convert( DOMDocument $xmlDoc ) + { + foreach ( $xmlDoc->getElementsByTagName( "embed" ) as $embed ) + { + if ( !$view = $embed->getAttribute( "view" ) ) + { + $view = "embed"; + } + + $embedContent = null; + $parameters = array( + "noLayout" => true, + ); + + if ( $attribute = $embed->getAttribute( "size" ) ) + { + $parameters["size"] = $attribute; + } + + $customNS = "http://ez.no/namespaces/ezpublish3/custom/"; + if ( $attribute = $embed->getAttributeNS( $customNS, "offset" ) ) + { + $parameters["offset"] = $attribute; + } + if ( $attribute = $embed->getAttributeNS( $customNS, "limit" ) ) + { + $parameters["limit"] = $attribute; + } + + if ( $contentId = $embed->getAttribute( "object_id" ) ) + { + $embedContent = $this->viewManager->renderContent( + $this->repository->getContentService()->loadContent( $contentId ), + $view, + $parameters + ); + } + else if ( $locationId = $embed->getAttribute( "node_id" ) ) + { + $embedContent = $this->viewManager->renderLocation( + $this->repository->getLocationService()->loadLocation( $locationId ), + $view, + $parameters + ); + } + + if ( $embedContent !== null ) + $embed->appendChild( $xmlDoc->createCDATASection( $embedContent ) ); + } + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/Converter/Html5.php b/eZ/Publish/Core/FieldType/XmlText/Converter/Html5.php new file mode 100644 index 0000000..0e47885 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Converter/Html5.php @@ -0,0 +1,82 @@ +stylesheet = $stylesheet; + + foreach ( $preConverters as $preConverter ) + { + if ( !$preConverter instanceof Converter ) + throw new InvalidArgumentType( + '$preConverters', + "eZ\\Publish\\Core\\FieldType\\XmlText\\Converter[]", + $preConverter + ); + } + + $this->preConverters = $preConverters; + } + + /** + * Convert $xmlDoc from internal representation DOMDocument to HTML5 + * + * @param \DOMDocument $xmlDoc + * + * @return string + */ + public function convert( DOMDocument $xmlDoc ) + { + foreach ( $this->preConverters as $preConverter ) + { + $preConverter->convert( $xmlDoc ); + } + + $xslDoc = new DOMDocument; + $xslDoc->load( $this->stylesheet ); + $xsl = new XSLTProcessor(); + $xsl->importStyleSheet( $xslDoc ); + + return $xsl->transformToXML( $xmlDoc ); + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/Input.php b/eZ/Publish/Core/FieldType/XmlText/Input.php new file mode 100644 index 0000000..18ae047 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input.php @@ -0,0 +1,30 @@ +internalRepresentation; + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/Input/EzXml.php b/eZ/Publish/Core/FieldType/XmlText/Input/EzXml.php new file mode 100644 index 0000000..0ea5623 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input/EzXml.php @@ -0,0 +1,56 @@ +loadXML( $xmlString ); + if ( !$doc->schemaValidate( $schemaPath ) ) + { + $messages = array(); + + foreach ( libxml_get_errors() as $error ) + $messages[] = trim( $error->message ); + + throw new InvalidArgumentException( + "xmlString", + "Validation of XML content failed: " . join( "\n", $messages ) + ); + } + + $this->internalRepresentation = $xmlString; + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/Input/Resources/schemas/ezxml.xsd b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/schemas/ezxml.xsd new file mode 100644 index 0000000..fef913e --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/schemas/ezxml.xsd @@ -0,0 +1,196 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/eZ/Publish/Core/FieldType/XmlText/Input/Resources/schemas/xhtml.xsd b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/schemas/xhtml.xsd new file mode 100644 index 0000000..6663b98 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/schemas/xhtml.xsd @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5.xsl b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5.xsl new file mode 100644 index 0000000..0bea33e --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5.xsl @@ -0,0 +1,7 @@ + + + + + + + diff --git a/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5_core.xsl b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5_core.xsl new file mode 100644 index 0000000..c86479e --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5_core.xsl @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +

      +
      +
      + + + +
      +
      + +
      + + + + + + + + + + + + + + 2 + + + + + + + + 0 + + + + width: ; + + + + + + + + + + + + + vertical-align: ; + + + top + vertical-align: top; + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      _self + + + + + + + +
      +
      + + + + + + + + +
      diff --git a/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5_custom.xsl b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5_custom.xsl new file mode 100644 index 0000000..58c3936 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Input/Resources/stylesheets/eZXml2Html5_custom.xsl @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/eZ/Publish/Core/FieldType/XmlText/Type.php b/eZ/Publish/Core/FieldType/XmlText/Type.php new file mode 100644 index 0000000..8578835 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Type.php @@ -0,0 +1,300 @@ + array( + "type" => "int", + "default" => 10 + ), + "tagPreset" => array( + "type" => "choice", + "default" => self::TAG_PRESET_DEFAULT + ) + ); + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return "ezxmltext"; + } + + /** + * Returns the name of the given field value. + * + * It will be used to generate content name and url alias if current field is designated + * to be used in the content name/urlAlias pattern. + * + * @param mixed $value + * + * @return mixed + */ + public function getName( $value ) + { + $value = $this->acceptValue( $value ); + + $result = null; + if ( $section = $value->xml->documentElement->firstChild ) + { + $textDom = $section->firstChild; + + if ( $textDom && $textDom->hasChildNodes() ) + { + $result = $textDom->firstChild->textContent; + } + else if ( $textDom ) + { + $result = $textDom->textContent; + } + } + + if ( $result === null ) + $result = $value->xml->documentElement->textContent; + + return trim( $result ); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return \eZ\Publish\Core\FieldType\XmlText\Value + */ + public function getEmptyValue() + { + return new Value; + } + + /** + * Returns if the given $value is considered empty by the field type + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ) + { + if ( $value === null || $value->xml === null ) + return true; + + return !$value->xml->documentElement->hasChildNodes(); + } + + /** + * Implements the core of {@see acceptValue()}. + * + * @param \eZ\Publish\Core\FieldType\XmlText\Value|\eZ\Publish\Core\FieldType\XmlText\Input|string $inputValue + * + * @return \eZ\Publish\Core\FieldType\XmlText\Value The potentially converted and structurally plausible value. + */ + protected function internalAcceptValue( $inputValue ) + { + if ( is_string( $inputValue ) ) + { + if ( empty( $inputValue ) ) + $inputValue = Value::EMPTY_VALUE; + $inputValue = new EzXml( $inputValue ); + } + + if ( $inputValue instanceof Input ) + { + $doc = new DOMDocument; + $doc->loadXML( $inputValue->getInternalRepresentation() ); + $inputValue = new Value( $doc ); + } + else if ( !$inputValue instanceof Value ) + { + throw new InvalidArgumentType( + '$inputValue', + 'eZ\\Publish\\Core\\FieldType\\XmlText\\Value', + $inputValue + ); + } + + return $inputValue; + } + + /** + * Returns sortKey information + * + * @see \eZ\Publish\Core\FieldType + * + * @param mixed $value + * + * @return array|bool + */ + protected function getSortInfo( $value ) + { + return false; + } + + /** + * Converts an $hash to the Value defined by the field type. + * $hash accepts the following keys: + * - xml (XML string which complies internal format) + * + * @param mixed $hash + * + * @return \eZ\Publish\Core\FieldType\XmlText\Value $value + */ + public function fromHash( $hash ) + { + $doc = new DOMDocument; + $doc->loadXML( $hash['xml'] ); + return new Value( $doc ); + } + + /** + * Converts a $Value to a hash + * + * @param \eZ\Publish\Core\FieldType\XmlText\Value $value + * + * @return mixed + */ + public function toHash( $value ) + { + return array( 'xml' => (string)$value ); + } + + /** + * Creates a new Value object from persistence data. + * $fieldValue->data is supposed to be a DOMDocument object. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return Value + */ + public function fromPersistenceValue( FieldValue $fieldValue ) + { + return new Value( $fieldValue->data ); + } + + /** + * @param Value $value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function toPersistenceValue( $value ) + { + return new FieldValue( + array( + 'data' => $value->xml, + 'externalData' => null, + 'sortKey' => $this->getSortInfo( $value ) + ) + ); + } + + /** + * Returns whether the field type is searchable + * + * @return boolean + */ + public function isSearchable() + { + return true; + } + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ) + { + $validationErrors = array(); + + foreach ( $fieldSettings as $name => $value ) + { + if ( isset( $this->settingsSchema[$name] ) ) + { + switch ( $name ) + { + case "numRows": + if ( !is_integer( $value ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' value must be of integer type", + null, + array( + "setting" => $name + ) + ); + } + break; + case "tagPreset": + $definedTagPresets = array( + self::TAG_PRESET_DEFAULT, + self::TAG_PRESET_SIMPLE_FORMATTING + ); + if ( !in_array( $value, $definedTagPresets ) ) + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is of unknown tag preset", + null, + array( + "setting" => $name + ) + ); + } + break; + } + } + else + { + $validationErrors[] = new ValidationError( + "Setting '%setting%' is unknown", + null, + array( + "setting" => $name + ) + ); + } + } + + return $validationErrors; + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/Value.php b/eZ/Publish/Core/FieldType/XmlText/Value.php new file mode 100644 index 0000000..b497613 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/Value.php @@ -0,0 +1,57 @@ + +
      +EOT; + + /** + * XML content as DOMDocument + * + * @var \DOMDocument + */ + public $xml; + + /** + * Initializes a new XmlText Value object with $xmlDoc in + * + * @param \DOMDocument $xmlDoc + */ + public function __construct( DOMDocument $xmlDoc = null ) + { + if ( $xmlDoc === null ) + { + $xmlDoc = new DOMDocument; + $xmlDoc->loadXML( self::EMPTY_VALUE ); + } + + $this->xml = $xmlDoc; + } + + /** + * @see \eZ\Publish\Core\FieldType\Value + */ + public function __toString() + { + return isset( $this->xml ) ? $this->xml->saveXML() : self::EMPTY_VALUE; + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage.php b/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage.php new file mode 100644 index 0000000..168cb70 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage.php @@ -0,0 +1,57 @@ +getGateway( $context )->storeFieldData( $versionInfo, $field ); + } + + /** + * Modifies $field if needed, using external data (like for Urls) + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ) + { + $this->getGateway( $context )->getFieldData( $field ); + } + + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ) + { + } + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData() + { + return true; + } + + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ) + { + } +} diff --git a/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage/Gateway.php b/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage/Gateway.php new file mode 100644 index 0000000..4217556 --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage/Gateway.php @@ -0,0 +1,38 @@ +value->externalData with external data + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + */ + abstract public function getFieldData( Field $field ); + + /** + * Stores data, external to XMLText type + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * + * @return boolean + */ + abstract public function storeFieldData( VersionInfo $versionInfo, Field $field ); +} diff --git a/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage/Gateway/LegacyStorage.php b/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage/Gateway/LegacyStorage.php new file mode 100644 index 0000000..17c93be --- /dev/null +++ b/eZ/Publish/Core/FieldType/XmlText/XmlTextStorage/Gateway/LegacyStorage.php @@ -0,0 +1,232 @@ +dbHandler = $dbHandler; + } + + /** + * Returns the active connection + * + * @throws \RuntimeException if no connection has been set, yet. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected function getConnection() + { + if ( $this->dbHandler === null ) + { + throw new \RuntimeException( "Missing database connection." ); + } + return $this->dbHandler; + } + + /** + * Populates $field->value with external data + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + */ + public function getFieldData( Field $field ) + { + if ( !$field->value->data instanceof DOMDocument ) + return; + + /** @var $linkTagsById \DOMElement[] */ + $linkTagsById = array(); + $linkIds = array(); + $linkTags = $field->value->data->getElementsByTagName( 'link' ); + if ( $linkTags->length > 0 ) + { + foreach ( $linkTags as $link ) + { + $urlId = $link->getAttribute( 'url_id' ); + $linkIds[] = $urlId; + $linkTagsById[$urlId] = $link; + } + + foreach ( $this->getLinksUrl( $linkIds ) as $id => $url ) + { + $linkTagsById[$id]->setAttribute( 'url', $url ); + } + } + } + + /** + * Fetches rows in ezurl table referenced by IDs in $linkIds array. + * Returns as hash with URL id as key and corresponding URL as value. + * + * @param array $linkIds + * + * @return array + */ + private function getLinksUrl( array $linkIds ) + { + /** @var $q \ezcQuerySelect */ + $q = $this->getConnection()->createSelectQuery(); + $q + ->select( "id", "url" ) + ->from( UrlStorage::URL_TABLE ) + ->where( $q->expr->in( 'id', $linkIds ) ); + + $statement = $q->prepare(); + $statement->execute(); + $linkUrls = array(); + foreach ( $statement->fetchAll( \PDO::FETCH_ASSOC ) as $row ) + { + $linkUrls[$row['id']] = $row['url']; + } + + return $linkUrls; + } + + /** + * Stores data, external to XMLText type + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * + * @return boolean + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field ) + { + if ( !$field->value->data instanceof DOMDocument ) + return; + + $linksUrls = array(); + $linkTagsByUrl = array(); + $linkTags = $field->value->data->getElementsByTagName( 'link' ); + if ( $linkTags->length > 0 ) + { + // First loop on $linkTags to populate $linksUrls + /** @var $link \DOMElement */ + foreach ( $linkTags as $link ) + { + if ( $link->hasAttribute( 'url' ) ) + $url = $link->getAttribute( 'url' ); + else if ( $link->hasAttribute( 'href' ) ) + $url = $link->getAttribute( 'href' ); + else + continue; + + $linksUrls[] = $url; + $linkTagsByUrl[$url] = $link; + } + + $linksIds = $this->getLinksId( $linksUrls ); + + // Now loop against $linkTagsByUrl to insert the right value in "url_id" attribute + /** @var $link \DOMElement */ + foreach ( $linkTagsByUrl as $url => $link ) + { + if ( isset( $linksIds[$url] ) ) + $linkId = $linksIds[$url]; + else + $linkId = $this->insertLink( $url ); + + $link->setAttribute( 'url_id', $linkId ); + $link->removeAttribute( 'url' ); + $link->removeAttribute( 'href' ); + } + } + } + + /** + * Fetches rows in ezurl table referenced by URLs in $linksUrls array. + * Returns as hash with URL as key and corresponding URL id as value. + * + * @param array $linksUrls + * + * @return array + */ + private function getLinksId( array $linksUrls ) + { + /** @var $q \ezcQuerySelect */ + $q = $this->getConnection()->createSelectQuery(); + $q + ->select( "id", "url" ) + ->from( UrlStorage::URL_TABLE ) + ->where( $q->expr->in( 'url', $linksUrls ) ); + + $statement = $q->prepare(); + $statement->execute(); + $linkIds = array(); + foreach ( $statement->fetchAll( \PDO::FETCH_ASSOC ) as $row ) + { + $linkIds[$row['url']] = $row['id']; + } + + return $linkIds; + } + + /** + * Inserts a new entry in ezurl table and returns the table last insert id + * + * @param string $url The URL to insert in the database + */ + private function insertLink( $url ) + { + $time = time(); + $dbHandler = $this->getConnection(); + + /** @var $q \ezcQueryInsert */ + $q = $dbHandler->createInsertQuery(); + $q->insertInto( + $dbHandler->quoteTable( UrlStorage::URL_TABLE ) + )->set( + $dbHandler->quoteColumn( "created" ), + $q->bindValue( $time, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "modified" ), + $q->bindValue( $time, null, \PDO::PARAM_INT ) + )->set( + $dbHandler->quoteColumn( "original_url_md5" ), + $q->bindValue( md5( $url ) ) + )->set( + $dbHandler->quoteColumn( "url" ), + $q->bindValue( $url ) + ); + + $q->prepare()->execute(); + + return $dbHandler->lastInsertId( + $dbHandler->getSequenceName( self::URL_TABLE, "id" ) + ); + } +} diff --git a/eZ/Publish/Core/IO/DispatcherHandler.php b/eZ/Publish/Core/IO/DispatcherHandler.php new file mode 100644 index 0000000..62e2b4c --- /dev/null +++ b/eZ/Publish/Core/IO/DispatcherHandler.php @@ -0,0 +1,250 @@ + Handler, .. ), .. ) + * ie: + * array( + * array( + * 'handler' => $handler1, + * // match conditions: + * 'prefix' => 'var/original/', + * 'suffix' => '.gif,.jpg', + * 'contains' => 'image-versioned' + * ), + * (...) + * ) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If $config does not contain default handler that implements + * Handler, handlers is unset or empty (hence you could have used default directly), one of the 'patterns' + * is unset or empty (hence it could have been default) or a 'handler' item does not implement Handler + */ + public function __construct( IoHandlerInterface $defaultHandler, array $alternativeHandlers ) + { + if ( empty( $alternativeHandlers ) ) + { + throw new InvalidArgumentException( "\$config['handlers']", "must be of type array" ); + } + + // Validate handlers so it does not need to be done on every call to getHandler() + foreach ( $alternativeHandlers as $key => $handlerConfig ) + { + if ( empty( $handlerConfig['contains'] ) && empty( $handlerConfig['prefix'] ) && empty( $handlerConfig['suffix'] ) ) + { + throw new InvalidArgumentException( + "\$alternativeHandlers[$key][contains|prefix|suffix]", + "either of these must be present and of type string" + ); + } + else if ( empty( $handlerConfig['handler'] ) || !$handlerConfig['handler'] instanceof IoHandlerInterface ) + { + throw new InvalidArgumentException( + "\$alternativeHandlers[$key]['handler']", + "must be of type eZ\\Publish\\SPI\\IO\\Handler" + ); + } + } + + $this->defaultHandler = $defaultHandler; + $this->alternativeHandlers = $alternativeHandlers; + } + + /** + * Creates and stores a new BinaryFile based on the BinaryFileCreateStruct $file + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the target path already exists + * + * @param \eZ\Publish\SPI\IO\BinaryFileCreateStruct $createFilestruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The newly created BinaryFile object + */ + public function create( BinaryFileCreateStruct $createFilestruct ) + { + return $this->getHandler( $createFilestruct->path )->create( $createFilestruct ); + } + + /** + * Deletes the existing BinaryFile with path $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the file doesn't exist + * + * @param string $path + */ + public function delete( $path ) + { + $this->getHandler( $path )->delete( $path ); + } + + /** + * Updates the file identified by $path with data from $updateFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the source path doesn't exist + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the target path already exists + * + * @param string $path + * @param \eZ\Publish\SPI\IO\BinaryFileUpdateStruct $updateFileStruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The updated BinaryFile + */ + public function update( $path, BinaryFileUpdateStruct $updateFileStruct ) + { + if ( $path === $updateFileStruct->path ) + return $this->getHandler( $path )->update( $path, $updateFileStruct ); + + // When file path has changed, check if we should move from one handler to another + $oldHandler = $this->getHandler( $path ); + $newHandler = $this->getHandler( $updateFileStruct->path ); + if ( $oldHandler === $newHandler ) + return $oldHandler->update( $path, $updateFileStruct ); + + // Move file from old to new handler + throw new \Exception( '@todo: Moving from one io handler to another one is not implemented!' ); + /*$newHandler->create( $updateFile ); + try + { + $oldHandler->delete( $path ); + } + catch ( \Exception $e ) + { + $newHandler->delete( $updateFile->path ); + throw $e; + }*/ + } + + /** + * Checks if the BinaryFile with path $path exists + * + * @param string $path + * + * @return boolean + */ + public function exists( $path ) + { + return $this->getHandler( $path )->exists( $path ); + } + + /** + * Loads the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return \eZ\Publish\SPI\IO\BinaryFile + */ + public function load( $path ) + { + return $this->getHandler( $path )->load( $path ); + } + + /** + * Returns a file resource to the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return resource + */ + public function getFileResource( $path ) + { + return $this->getHandler( $path )->getFileResource( $path ); + } + + /** + * Returns the contents of the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the file couldn't be found + * + * @param string $path + * + * @return string + */ + public function getFileContents( $path ) + { + return $this->getHandler( $path )->getFileContents( $path ); + } + + /** + * Returns the appropriate handler for $path + * + * @internal Depends on {@link $config} being validated by {@link __construct()}! + * + * @param string $path + * + * @return \eZ\Publish\SPI\IO\Handler + */ + private function getHandler( $path ) + { + foreach ( $this->alternativeHandlers as $handlerConfig ) + { + // Match handler using strpos & strstr for speed, and to avoid having regex in ini files + if ( !empty( $handlerConfig['contains'] ) && strpos( $path, $handlerConfig['contains'] ) === false ) + { + continue; + } + + if ( !empty( $handlerConfig['prefix'] ) && strpos( $path, $handlerConfig['prefix'] ) !== 0 ) + { + continue; + } + + if ( !empty( $handlerConfig['suffix'] ) ) + { + $suffixMatch = false; + foreach ( explode( ',', $handlerConfig['suffix'] ) as $suffix ) + { + if ( strstr( $path, $suffix ) === $suffix ) + { + $suffixMatch = true; + break; + } + } + + if ( !$suffixMatch ) + continue; + } + // Everything matched (incl one of suffixes), and since __construct made sure not all where empty + // it should be fairly safe to return this handler + return $handlerConfig['handler']; + } + + return $this->defaultHandler; + } +} diff --git a/eZ/Publish/Core/IO/InMemoryHandler.php b/eZ/Publish/Core/IO/InMemoryHandler.php new file mode 100644 index 0000000..f9f6cf0 --- /dev/null +++ b/eZ/Publish/Core/IO/InMemoryHandler.php @@ -0,0 +1,229 @@ +binaryData) + */ + private $data; + + public function __construct( array $storage = array() ) + { + $this->storage = $storage; + } + + /** + * Creates and stores a new BinaryFile based on the BinaryFileCreateStruct $file + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the target path already exists + * + * @param \eZ\Publish\SPI\IO\BinaryFileCreateStruct $createFilestruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The newly created BinaryFile object + */ + public function create( BinaryFileCreateStruct $createFilestruct ) + { + if ( isset( $this->storage[$createFilestruct->path] ) ) + { + throw new InvalidArgumentException( + "\$createFilestruct->path", + "file '{$createFilestruct->path}' already exists" + ); + } + + $this->data[$createFilestruct->path] = base64_encode( + fread( $createFilestruct->getInputStream(), $createFilestruct->size ) + ); + + $binaryFile = new BinaryFile(); + $binaryFile->path = $createFilestruct->path; + $binaryFile->uri = $createFilestruct->path; + $binaryFile->mimeType = $createFilestruct->mimeType; + $binaryFile->ctime = new DateTime; + $binaryFile->mtime = clone $binaryFile->ctime; + $binaryFile->originalFile = $createFilestruct->originalFile; + $binaryFile->size = $createFilestruct->size; + + return $this->storage[$binaryFile->path] = $binaryFile; + } + + /** + * Deletes the existing BinaryFile with path $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the file doesn't exist + * + * @param string $path + */ + public function delete( $path ) + { + if ( !isset( $this->storage[$path] ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + unset( $this->storage[$path] ); + unset( $this->data[$path] ); + } + + /** + * Updates the file identified by $path with data from $updateFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the source path doesn't exist + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the target path already exists + * + * @param string $path + * @param \eZ\Publish\SPI\IO\BinaryFileUpdateStruct $updateFileStruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The updated BinaryFile + */ + public function update( $path, BinaryFileUpdateStruct $updateFileStruct ) + { + if ( !isset( $this->storage[$path] ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + // path + if ( $updateFileStruct->path !== null && $updateFileStruct->path != $path ) + { + if ( isset( $this->storage[$updateFileStruct->path] ) ) + { + throw new InvalidArgumentException( + "\$updateFileStruct->path", + "file '{$updateFileStruct->path}' already exists" + ); + } + + $oldPath = $path; + $newPath = $updateFileStruct->path; + + $this->storage[$newPath] = $this->storage[$oldPath]; + $this->data[$newPath] = $this->data[$oldPath]; + + $this->storage[$newPath]->path = $newPath; + + unset( $this->storage[$oldPath] ); + unset( $this->data[$oldPath] ); + + $path = $newPath; + } + + $resource = $updateFileStruct->getInputStream(); + if ( $resource !== null ) + { + $this->data[$path] = base64_encode( fread( $resource, $updateFileStruct->size ) ); + if ( $updateFileStruct->size !== null ) + { + $this->storage[$path]->size = $updateFileStruct->size; + } + } + + if ( $updateFileStruct->mtime !== null && $updateFileStruct->mtime !== $this->storage[$path]->mtime ) + { + $this->storage[$path]->mtime = $updateFileStruct->mtime; + } + + if ( $updateFileStruct->ctime !== null && $updateFileStruct->ctime !== $this->storage[$path]->ctime ) + { + $this->storage[$path]->ctime = $updateFileStruct->ctime; + } + + return $this->storage[$path]; + } + + /** + * Checks if the BinaryFile with path $path exists + * + * @param string $path + * + * @return boolean + */ + public function exists( $path ) + { + return isset( $this->storage[$path] ); + } + + /** + * Loads the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return \eZ\Publish\SPI\IO\BinaryFile + */ + public function load( $path ) + { + if ( !isset( $this->storage[$path] ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + return $this->storage[$path]; + } + + /** + * Returns a file resource to the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return resource + */ + public function getFileResource( $path ) + { + if ( !isset( $this->storage[$path] ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + $uri = 'data://' . $this->storage[$path]->mimeType . ';base64,' . $this->data[$path]; + + return fopen( $uri, 'rb' ); + } + + /** + * Returns the contents of the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the file couldn't be found + * + * @param string $path + * + * @return string + */ + public function getFileContents( $path ) + { + if ( !isset( $this->storage[$path] ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + return base64_decode( $this->data[$path] ); + } +} diff --git a/eZ/Publish/Core/IO/LegacyHandler.php b/eZ/Publish/Core/IO/LegacyHandler.php new file mode 100644 index 0000000..3e60bfe --- /dev/null +++ b/eZ/Publish/Core/IO/LegacyHandler.php @@ -0,0 +1,365 @@ +legacyKernel = $legacyKernel; + } + + /** + * Creates and stores a new BinaryFile based on the BinaryFileCreateStruct $file + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException If the target path already exists + * + * @param \eZ\Publish\SPI\IO\BinaryFileCreateStruct $createFilestruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The newly created BinaryFile object + */ + public function create( BinaryFileCreateStruct $createFilestruct ) + { + if ( $this->exists( $createFilestruct->path ) ) + { + throw new InvalidArgumentException( + "\$createFilestruct->path", + "file '{$createFilestruct->path}' already exists" + ); + } + + $clusterHandler = $this->getClusterHandler(); + $this->legacyKernel->runCallback( + function () use ( $createFilestruct, $clusterHandler ) + { + // @todo Build a path / scope mapper + $scope = 'todo'; + $clusterHandler->fileStoreContents( + $createFilestruct->path, + fread( $createFilestruct->getInputStream(), $createFilestruct->size ), + $createFilestruct->mimeType, + $scope + ); + }, + false + ); + + return $this->load( $createFilestruct->path ); + } + + /** + * Deletes the existing BinaryFile with path $path + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException If the file doesn't exist + * + * @param string $path + */ + public function delete( $path ) + { + if ( !$this->exists( $path ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + $clusterHandler = $this->getClusterHandler(); + $this->legacyKernel->runCallback( + function () use ( $path, $clusterHandler ) + { + $clusterHandler->fileDelete( $path ); + }, + false + ); + } + + /** + * Updates the file identified by $path with data from $updateFile + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException If the source path doesn't exist + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException If the target path already exists + * + * @param string $path + * @param \eZ\Publish\SPI\IO\BinaryFileUpdateStruct $updateFileStruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The updated BinaryFile + */ + public function update( $path, BinaryFileUpdateStruct $updateFileStruct ) + { + if ( !$this->exists( $path ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + $clusterHandler = $this->getClusterHandler(); + $path = $this->legacyKernel->runCallback( + function () use ( $path, $updateFileStruct, $clusterHandler ) + { + // path + if ( $updateFileStruct->path !== null && $updateFileStruct->path != $path ) + { + if ( $clusterHandler->fileExists( $updateFileStruct->path ) ) + { + throw new InvalidArgumentException( + "\$updateFileStruct->path", + "file '{$updateFileStruct->path}' already exists" + ); + } + $clusterHandler->fileMove( $path, $updateFileStruct->path ); + + // update the path we are working on + $path = $updateFileStruct->path; + } + + $resource = $updateFileStruct->getInputStream(); + if ( $resource !== null ) + { + $binaryUpdateData = fread( $resource, $updateFileStruct->size ); + $clusterFile = eZClusterFileHandler::instance( $path ); + $metaData = $clusterFile->metaData; + $scope = isset( $metaData['scope'] ) ? $metaData['scope'] : false; + $datatype = isset( $metaData['datatype'] ) ? $metaData['datatype'] : false; + $clusterFile->storeContents( $binaryUpdateData, $scope, $datatype ); + } + + // mtime and ctime have no effect as mtime isn't modifiable, and ctime isn't really supported (=mtime) + return $path; + }, + false + ); + + return $this->load( $path ); + } + + /** + * Checks if the BinaryFile with path $path exists + * + * @param string $path + * + * @return boolean + */ + public function exists( $path ) + { + $clusterHandler = $this->getClusterHandler(); + return $this->legacyKernel->runCallback( + function () use ( $clusterHandler, $path ) + { + return $clusterHandler->fileExists( $path ); + }, + false + ); + } + + /** + * Loads the BinaryFile identified by $path + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return \eZ\Publish\SPI\IO\BinaryFile + */ + public function load( $path ) + { + if ( !$this->exists( $path ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + $metaData = $this->legacyKernel->runCallback( + function () use ( $path ) + { + $clusterFile = eZClusterFileHandler::instance( $path ); + return $clusterFile->metaData; + }, + false + ); + + $file = new BinaryFile(); + $file->path = $path; + + $file->mtime = new DateTime(); + $file->mtime->setTimestamp( $metaData['mtime'] ); + + // Setting the same timestamp as mtime, since ctime is not supported in Legacy + $file->ctime = clone $file->mtime; + + $file->size = $metaData['size']; + + // will only work with some ClusterFileHandlers (DB based ones, not with FS ones) + if ( isset( $metaData['datatype'] ) ) + { + $file->mimeType = $metaData['datatype']; + } + else + { + $file->mimeType = $this->getMimeTypeFromLocalFile( $path ); + } + + $file->uri = $file->path; + $file->originalFile = basename( $file->path ); + + return $file; + } + + /** + * Returns a file resource to the BinaryFile identified by $path + * + * @param string $path + * + * @return resource + */ + public function getFileResource( $path ) + { + return $this->getFileResourceProvider()->getResource( $this->load( $path ) );// @todo incorrect object provided to getResource? + } + + /** + * Returns the contents of the BinaryFile identified by $path + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException if the file couldn't be found + * + * @param string $path + * + * @return string + */ + public function getFileContents( $path ) + { + if ( !$this->exists( $path ) ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + $clusterHandler = $this->getClusterHandler(); + return $this->legacyKernel->runCallback( + function () use ( $path, $clusterHandler ) + { + return $clusterHandler->fileFetchContents( $path ); + }, + false + ); + } + + /** + * Returns the appropriate FileResourceProvider depending on the cluster handler in use + * + * @throws \Exception + * + * @return \eZ\Publish\Core\IO\LegacyHandler\FileResourceProvider + */ + private function getFileResourceProvider() + { + if ( !isset( $this->fileResourceProvider ) ) + { + $class = __CLASS__ . '\\FileResourceProvider\\' . get_class( $this->getClusterHandler() ); + if ( !class_exists( $class ) ) + { + throw new \Exception( "FileResourceProvider $class couldn't be found" ); + } + $this->fileResourceProvider = new $class; + $this->fileResourceProvider->setLegacyKernel( $this->legacyKernel ); + } + + return $this->fileResourceProvider; + } + + /** + * Lazy loads eZClusterFileHandler + * + * @return \eZClusterFileHandler + */ + private function getClusterHandler() + { + if ( $this->clusterHandler === null ) + { + $this->clusterHandler = $this->legacyKernel->runCallback( + function () + { + return eZClusterFileHandler::instance(); + }, + false + ); + } + + return $this->clusterHandler; + } + + /** + * Returns a mimeType from a local file, using fileinfo + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException If file does not exist + * + * @todo If legacy path is made available then this function can use that to skip executing legacy kernel + * + * @param string $path + * + * @return string + */ + protected function getMimeTypeFromLocalFile( $path ) + { + $returnValue = $this->legacyKernel->runCallback( + function () use ( $path ) + { + if ( !is_file( $path ) ) + return null; + + $fileInfo = new finfo( FILEINFO_MIME_TYPE ); + return $fileInfo->file( $path ); + }, + false + ); + + if ( $returnValue === null ) + { + throw new NotFoundException( 'BinaryFile', $path ); + } + + return $returnValue; + } +} diff --git a/eZ/Publish/Core/IO/LegacyHandler/FileResourceProvider.php b/eZ/Publish/Core/IO/LegacyHandler/FileResourceProvider.php new file mode 100644 index 0000000..99c84a6 --- /dev/null +++ b/eZ/Publish/Core/IO/LegacyHandler/FileResourceProvider.php @@ -0,0 +1,25 @@ +legacyKernel = $legacyKernel; + } + + /** + * Gets the legacy kernel instance. + * + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected function getLegacyKernel() + { + return $this->legacyKernel; + } +} diff --git a/eZ/Publish/Core/IO/LegacyHandler/FileResourceProvider/eZFS2FileHandler.php b/eZ/Publish/Core/IO/LegacyHandler/FileResourceProvider/eZFS2FileHandler.php new file mode 100644 index 0000000..ea72b50 --- /dev/null +++ b/eZ/Publish/Core/IO/LegacyHandler/FileResourceProvider/eZFS2FileHandler.php @@ -0,0 +1,19 @@ +legacyKernel->enterLegacyRootDir(); + $fh = fopen( $file->path, 'rb' ); + $this->legacyKernel->leaveLegacyRootDir(); + + return $fh; + } +} diff --git a/eZ/Publish/Core/IO/Tests/Base.php b/eZ/Publish/Core/IO/Tests/Base.php new file mode 100644 index 0000000..2870b0c --- /dev/null +++ b/eZ/Publish/Core/IO/Tests/Base.php @@ -0,0 +1,372 @@ +ioHandler = $this->getIoHandler(); + $this->imageInputPath = __DIR__ . DIRECTORY_SEPARATOR . 'ezplogo.gif'; + } + + /** + * @return \eZ\Publish\SPI\IO\Handler + */ + abstract protected function getIoHandler(); + + /** + * Tear down test + */ + protected function tearDown() + { + unset( $this->ioHandler ); + unset( $this->imageInputPath ); + parent::tearDown(); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::create + */ + public function testCreate() + { + $repositoryPath = 'var/test/storage/images/ezplogo.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + self::assertInstanceOf( 'eZ\\Publish\\SPI\\IO\\BinaryFile', $binaryFile ); + self::assertEquals( $repositoryPath, $binaryFile->path ); + self::assertEquals( 1928, $binaryFile->size ); + self::assertInstanceOf( 'DateTime', $binaryFile->mtime ); + self::assertNotEquals( 0, $binaryFile->mtime->getTimestamp() ); + self::assertEquals( 'image/gif', $binaryFile->mimeType ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::create + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreatePathExists() + { + $repositoryPath = 'var/test/storage/images/testCreateFileExists.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + + $binaryFile = $this->ioHandler->create( $struct ); + $binaryFile = $this->ioHandler->create( $struct ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::update + */ + public function testUpdate() + { + $this->urlFopenPrecheck(); + $firstPath = 'var/test/update-before.gif'; + $secondPath = 'var/test/update-after.png'; + + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $firstPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + self::assertTrue( $this->ioHandler->exists( $firstPath ) ); + self::assertFalse( $this->ioHandler->exists( $secondPath ) ); + self::assertEquals( + md5_file( $this->imageInputPath ), + md5( fread( $this->ioHandler->getFileResource( $firstPath ), $binaryFile->size ) ) + ); + + $newFilePath = __DIR__ . DIRECTORY_SEPARATOR . 'ezplogo2.png'; + $updateStruct = new BinaryFileUpdateStruct(); + $updateStruct->path = $secondPath; + $updateStruct->setInputStream( fopen( $newFilePath, 'rb' ) ); + $updateStruct->size = filesize( $newFilePath ); + + $updatedFile = $this->ioHandler->update( $firstPath, $updateStruct ); + + self::assertFalse( $this->ioHandler->exists( $firstPath ), "$firstPath should not exist" ); + self::assertTrue( $this->ioHandler->exists( $secondPath ), "$secondPath should exist" ); + self::assertEquals( $updateStruct->size, $updatedFile->size ); + self::assertEquals( + md5_file( $newFilePath ), + md5( fread( $this->ioHandler->getFileResource( $secondPath ), $updatedFile->size ) ) + ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::update + */ + public function testUpdateMtime() + { + $path = 'var/test/updateMtime.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $path ); + $binaryFile = $this->ioHandler->create( $struct ); + + $newMtime = new DateTime( 'last week' ); + $updateStruct = new BinaryFileUpdateStruct(); + $updateStruct->mtime = $newMtime; + + $updatedBinaryFile = $this->ioHandler->update( $path, $updateStruct ); + self::assertEquals( $binaryFile->path, $updatedBinaryFile->path ); + self::assertEquals( $binaryFile->ctime, $updatedBinaryFile->ctime ); + self::assertEquals( $binaryFile->size, $updatedBinaryFile->size ); + + self::assertEquals( $newMtime, $updatedBinaryFile->mtime ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::update + */ + public function testUpdateCtime() + { + $path = 'var/test/updateMtime.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $path ); + $binaryFile = clone $this->ioHandler->create( $struct ); + + $newCtime = new DateTime( 'last week' ); + $updateStruct = new BinaryFileUpdateStruct(); + $updateStruct->ctime = $newCtime; + + $updatedBinaryFile = $this->ioHandler->update( $path, $updateStruct ); + self::assertEquals( $binaryFile->path, $updatedBinaryFile->path ); + self::assertEquals( $binaryFile->mtime, $updatedBinaryFile->mtime ); + self::assertEquals( $binaryFile->size, $updatedBinaryFile->size ); + + self::assertEquals( $newCtime, $updatedBinaryFile->ctime ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::update + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testUpdateNonExistingSource() + { + $updateStruct = new BinaryFileUpdateStruct(); + $updateStruct->path = 'var/test/testUpdateSourceNotFoundTarget.png'; + + $this->ioHandler->update( 'var/test/testUpdateSourceNotFoundSource.png', $updateStruct ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::update + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUpdateTargetExists() + { + $firstPath = 'var/test/testUpdateTargetExists-1.gif'; + $secondPath = 'var/test/testUpdateTargetExists-2.png'; + + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $firstPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $secondPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + self::assertTrue( $this->ioHandler->exists( $firstPath ) ); + self::assertTrue( $this->ioHandler->exists( $secondPath ) ); + + $updateStruct = new BinaryFileUpdateStruct(); + $updateStruct->path = $secondPath; + + $this->ioHandler->update( $firstPath, $updateStruct ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::exists + */ + public function testExists() + { + $repositoryPath = 'var/test/storage/exists.gif'; + + self::assertFalse( $this->ioHandler->exists( $repositoryPath ) ); + + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + self::assertTrue( $this->ioHandler->exists( $repositoryPath ) ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::delete + */ + public function testDelete() + { + $repositoryPath = 'var/test/storage/delete.gif'; + + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + self::assertTrue( $this->ioHandler->exists( $repositoryPath ) ); + + $this->ioHandler->delete( $repositoryPath ); + + self::assertFalse( $this->ioHandler->exists( $repositoryPath ) ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::delete + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteNonExistingFile() + { + $this->ioHandler->delete( 'var/test/storage/deleteNonExisting.gif' ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::load + */ + public function testLoad() + { + $repositoryPath = 'var/test/storage/load.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + $loadedFile = $this->ioHandler->load( $repositoryPath ); + + self::assertInstanceOf( 'eZ\\Publish\\SPI\\IO\\BinaryFile', $loadedFile ); + + self::assertEquals( 'var/test/storage/load.gif', $loadedFile->path ); + self::assertEquals( 1928, $loadedFile->size ); + self::assertInstanceOf( 'DateTime', $loadedFile->mtime ); + self::assertInstanceOf( 'DateTime', $loadedFile->ctime ); + self::assertEquals( 'image/gif', $loadedFile->mimeType ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadNonExistingFile() + { + $this->ioHandler->load( 'var/test/storage/loadNotFound.png' ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::getFileResource + */ + public function testGetFileResource() + { + $this->urlFopenPrecheck(); + $repositoryPath = 'var/test/storage/getfileresource.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + $resource = $this->ioHandler->getFileResource( $repositoryPath ); + + $storedDataSum = md5( fread( $resource, $binaryFile->size ) ); + $originalDataSum = md5( file_get_contents( $this->imageInputPath ) ); + self::assertEquals( $originalDataSum, $storedDataSum ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::getFileResource + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testGetFileResourceNonExistingFile() + { + $this->ioHandler->getFileResource( 'var/test/testGetFileResourceNonExistingFile.png' ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::getFileContents + */ + public function testGetFileContents() + { + $repositoryPath = 'var/test/testGetFileContents.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + + self::assertEquals( file_get_contents( $this->imageInputPath ), $this->ioHandler->getFileContents( $repositoryPath ) ); + } + + /** + * @covers \eZ\Publish\SPI\IO\Handler::getFileContents + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testGetFileContentsNonExistingFile() + { + $this->ioHandler->getFileContents( 'var/test/testGetFileContentsNonExistingFile.gif' ); + } + + /** + * Creates a BinaryFile object from $localFile + * + * @throws \Exception When given a non existing / unreadable file + * @param string $localFile Path to local file + * @param string $repositoryPath The path the file must be stored as + * + * @return \eZ\Publish\SPI\IO\BinaryFileCreateStruct + */ + protected function getCreateStructFromLocalFile( $localFile, $repositoryPath ) + { + if ( !file_exists( $localFile ) || !is_readable( $localFile ) ) + { + throw new \Exception( "Could not find/read file: {$localFile}" ); + } + + $struct = new BinaryFileCreateStruct(); + $struct->originalFile = basename( $localFile ); + $struct->size = filesize( $localFile ); + $struct->mimeType = self::getMimeTypeFromPath( $localFile ); + $struct->path = $repositoryPath; + + $inputStream = fopen( $localFile, 'rb' ); + $struct->setInputStream( $inputStream ); + + return $struct; + } + + /** + * Returns a mimeType from a file path, using fileinfo + * + * @throws \Exception If file does not exist + * @param string $path + * + * @return string + */ + protected static function getMimeTypeFromPath( $path ) + { + if ( !file_exists( $path ) ) + { + throw new \Exception( "Could not fine file: {$path}" ); + } + + $finfo = new finfo( FILEINFO_MIME_TYPE ); + return $finfo->file( $path ); + } + + /** + * Reusable function for tests that needs allow_url_fopen, skip if disabled + */ + protected function urlFopenPrecheck() + { + if ( ini_get( "allow_url_fopen" ) != 1 ) + $this->markTestSkipped( "allow_url_fopen must be 'On' for this test." ); + } +} diff --git a/eZ/Publish/Core/IO/Tests/DispatcherTest.php b/eZ/Publish/Core/IO/Tests/DispatcherTest.php new file mode 100644 index 0000000..aea60f5 --- /dev/null +++ b/eZ/Publish/Core/IO/Tests/DispatcherTest.php @@ -0,0 +1,156 @@ +defaultBackend = new InMemory(); + $this->alternativeBackend = new InMemory(); + return new Dispatcher( + $this->defaultBackend, + array( + array( + 'handler' => $this->alternativeBackend, + // match conditions: + 'prefix' => 'var/test/', + 'suffix' => '.gif,.jpg', + 'contains' => 'image-versioned' + ) + ) + ); + } + + /** + * Test that file is created in default handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::__construct + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testDispatcherInvalidAlternativeHandlerParam() + { + new Dispatcher( + $this->defaultBackend, + array() + ); + } + + /** + * Test that file is created in default handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::__construct + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testDispatcherInvalidAlternativeHandler() + { + new Dispatcher( + $this->defaultBackend, + array( + array( + 'handler' => 555, + // match conditions: + 'prefix' => 'var/test/', + 'suffix' => '.gif,.jpg', + 'contains' => 'image-versioned' + ) + ) + ); + } + + /** + * Test that file is created in default handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::__construct + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testDispatcherInvalidAlternativeHandlerConfig() + { + new Dispatcher( + $this->defaultBackend, + array( + array( + 'handler' => $this->alternativeBackend, + ) + ) + ); + } + + /** + * Test that file is created in default handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::getHandler + */ + public function testDispatcherDefaultBackendCreate() + { + $repositoryPath = 'var/test/storage/images/ezplogo.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + $binaryFile2 = $this->defaultBackend->load( $repositoryPath ); + + self::assertEquals( $binaryFile, $binaryFile2 ); + } + + /** + * Test that file is created in default handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::getHandler + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDispatcherDefaultBackendCreateNotFound() + { + $repositoryPath = 'var/test/storage/images/ezplogo.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + $this->alternativeBackend->load( $repositoryPath ); + } + + /** + * Test that file is created in alternative handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::getHandler + */ + public function testDispatcherAlternativeBackendCreate() + { + $repositoryPath = 'var/test/storage/image-versioned/ezplogo.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + $binaryFile2 = $this->alternativeBackend->load( $repositoryPath ); + + self::assertEquals( $binaryFile, $binaryFile2 ); + } + + /** + * Test that file is created in alternative handler + * @covers \eZ\Publish\Core\IO\DispatcherHandler::getHandler + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDispatcherAlternativeBackendCreateNotFound() + { + $repositoryPath = 'var/test/storage/image-versioned/ezplogo.gif'; + $struct = $this->getCreateStructFromLocalFile( $this->imageInputPath, $repositoryPath ); + $binaryFile = $this->ioHandler->create( $struct ); + $this->defaultBackend->load( $repositoryPath ); + } +} diff --git a/eZ/Publish/Core/IO/Tests/InMemoryTest.php b/eZ/Publish/Core/IO/Tests/InMemoryTest.php new file mode 100644 index 0000000..00829f1 --- /dev/null +++ b/eZ/Publish/Core/IO/Tests/InMemoryTest.php @@ -0,0 +1,27 @@ +legacyPath = $_ENV['legacyPath']; + $this->originalDir = getcwd(); + } + + protected function tearDown() + { + chdir( $this->legacyPath ); + if ( file_exists( 'var/test' ) ) + { + ezcBaseFile::removeRecursive( 'var/test' ); + } + chdir( $this->originalDir ); + parent::tearDown(); + } + + /** + * Updating mtime isn't supported by the Legacy handler + */ + public function testUpdateMtime() + { + self::markTestIncomplete( "Not supported by Legacy io handler, aka incomplete" ); + } + + /** + * Updating ctime isn't supported by the Legacy handler + */ + public function testUpdateCtime() + { + self::markTestIncomplete( "Not supported by Legacy io handler, aka incomplete" ); + } +} diff --git a/eZ/Publish/Core/IO/Tests/LegacyTest/ezdebug.php b/eZ/Publish/Core/IO/Tests/LegacyTest/ezdebug.php new file mode 100644 index 0000000..9f56150 --- /dev/null +++ b/eZ/Publish/Core/IO/Tests/LegacyTest/ezdebug.php @@ -0,0 +1,22 @@ +handlerParams !== null && count( $options->handlerParams === 1 ) ) + { + return new eZFSFileHandler( $options->handlerParams[0] ); + } + + return new eZFSFileHandler; + } +} diff --git a/eZ/Publish/Core/IO/Tests/LegacyTest/ezini.php b/eZ/Publish/Core/IO/Tests/LegacyTest/ezini.php new file mode 100644 index 0000000..9ec1724 --- /dev/null +++ b/eZ/Publish/Core/IO/Tests/LegacyTest/ezini.php @@ -0,0 +1,61 @@ +file = $file; + } + + public function variable( $group, $variable ) + { + if ( !isset( self::$data[ $this->file][$group][$variable] ) ) + { + throw new Exception( "eZINI setting not found: $this->file / $group / $variable" ); + } + + return self::$data[ $this->file][$group][$variable]; + } + + public function __call( $method, $args ) + { + + } + + public static function __callStatic( $method, $args ) + { + + } + + private static $data = array( + 'site.ini' => array( + 'FileSettings' => array( + 'StorageDirPermissions' => '0777', + 'StorageFilePermissions' => '0666', + ), + ), + 'file.ini' => array( + 'FileSettings' => array( + 'Handlers' => array(), + ), + ), + ); + + private $file; +} diff --git a/eZ/Publish/Core/IO/Tests/LegacyTest/ezpextensionoptions.php b/eZ/Publish/Core/IO/Tests/LegacyTest/ezpextensionoptions.php new file mode 100644 index 0000000..6d0fc11 --- /dev/null +++ b/eZ/Publish/Core/IO/Tests/LegacyTest/ezpextensionoptions.php @@ -0,0 +1,21 @@ +handlerParams = $options['handlerParams']; + } + } + + public $handlerParams; +} diff --git a/eZ/Publish/Core/IO/Tests/ezplogo.gif b/eZ/Publish/Core/IO/Tests/ezplogo.gif new file mode 100644 index 0000000..f2444dc Binary files /dev/null and b/eZ/Publish/Core/IO/Tests/ezplogo.gif differ diff --git a/eZ/Publish/Core/IO/Tests/ezplogo2.png b/eZ/Publish/Core/IO/Tests/ezplogo2.png new file mode 100644 index 0000000..74487fb Binary files /dev/null and b/eZ/Publish/Core/IO/Tests/ezplogo2.png differ diff --git a/eZ/Publish/Core/Limitation/ContentTypeLimitationType.php b/eZ/Publish/Core/Limitation/ContentTypeLimitationType.php new file mode 100644 index 0000000..0402fa6 --- /dev/null +++ b/eZ/Publish/Core/Limitation/ContentTypeLimitationType.php @@ -0,0 +1,140 @@ +limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIContentTypeLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIContentTypeLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APIContentTypeLimitation' ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( !$object instanceof ContentInfo && !$object instanceof ContentCreateStruct ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + if ( $object instanceof ContentCreateStruct ) + { + return in_array( $object->contentType->id, $value->limitationValues ); + } + + /** + * @var $object ContentInfo + */ + return in_array( $object->contentTypeId, $value->limitationValues ); + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( !isset( $value->limitationValues[1] ) )// 1 limitation value: EQ operation + return new Criterion\ContentTypeId( $value->limitationValues[0] ); + + // several limitation values: IN operation + return new Criterion\ContentTypeId( $value->limitationValues ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/LanguageLimitationType.php b/eZ/Publish/Core/Limitation/LanguageLimitationType.php new file mode 100644 index 0000000..d05c00b --- /dev/null +++ b/eZ/Publish/Core/Limitation/LanguageLimitationType.php @@ -0,0 +1,143 @@ +limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APILanguageLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APILanguageLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APILanguageLimitation' ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo(); + } + else if ( !$object instanceof VersionInfo && !$object instanceof ContentInfo && !$object instanceof ContentCreateStruct ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + if ( $object instanceof ContentInfo || $object instanceof ContentCreateStruct ) + { + return in_array( $object->mainLanguageCode, $value->limitationValues, true ); + } + + /** + * @var $object VersionInfo + */ + foreach ( $value->limitationValues as $limitationLanguageCode ) + { + if ( $object->initialLanguageCode === $limitationLanguageCode ) + return true; + if ( in_array( $limitationLanguageCode, $object->languageCodes, true ) ) + return true; + } + return false; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( !isset( $value->limitationValues[1] ) )// 1 limitation value: EQ operation + return new Criterion\LanguageCode( $value->limitationValues[0] ); + + // several limitation values: IN operation + return new Criterion\LanguageCode( $value->limitationValues ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/LocationLimitationType.php b/eZ/Publish/Core/Limitation/LocationLimitationType.php new file mode 100644 index 0000000..99225da --- /dev/null +++ b/eZ/Publish/Core/Limitation/LocationLimitationType.php @@ -0,0 +1,191 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APILocationLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APILocationLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APILocationLimitation' ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( $object instanceof ContentCreateStruct ) + { + // If target is null return false as user does not have access to content w/o location with this limitation + if ( $target === null ) + return false; + + if ( !$target instanceof LocationCreateStruct ) + { + throw new InvalidArgumentException( + '$object', + 'Cannot be ContentCreateStruct unless $target is LocationCreateStruct' + ); + } + } + else if ( !$object instanceof ContentInfo ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + if ( $target !== null && !$target instanceof Location && !$target instanceof LocationCreateStruct ) + { + throw new InvalidArgumentException( '$target', 'Must be of type: Location' ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + /** + * Use $target if provided, optionally used to check the specific location instead of all + * e.g.: 'remove' in the context of removal of a specific location, or in case of 'create' + */ + if ( $target instanceof Location ) + { + return in_array( $target->id, $value->limitationValues ); + } + if ( $target instanceof LocationCreateStruct ) + { + return in_array( $target->parentLocationId, $value->limitationValues ); + } + + /** + * Check all locations if no specific placement was provided + * + * @var $object ContentInfo + */ + $locations = $this->persistence->locationHandler()->loadLocationsByContent( $object->id ); + foreach ( $locations as $location ) + { + if ( in_array( $location->id, $value->limitationValues ) ) + return true; + } + return false; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( !isset( $value->limitationValues[1] ) )// 1 limitation value: EQ operation + return new Criterion\LocationId( $value->limitationValues[0] ); + + // several limitation values: IN operation + return new Criterion\LocationId( $value->limitationValues ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + self::VALUE_SCHEMA_LOCATION_ID; + } +} diff --git a/eZ/Publish/Core/Limitation/NewSectionLimitationType.php b/eZ/Publish/Core/Limitation/NewSectionLimitationType.php new file mode 100644 index 0000000..bd71a8b --- /dev/null +++ b/eZ/Publish/Core/Limitation/NewSectionLimitationType.php @@ -0,0 +1,121 @@ +limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APINewSectionLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APINewSectionLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APINewSectionLimitation' ); + } + + if ( !$object instanceof ContentInfo && !$object instanceof Content && !$object instanceof VersionInfo ) + { + throw new InvalidArgumentException( '$object', 'Must be of type: Content, VersionInfo or ContentInfo' ); + } + + if ( !$target instanceof Section ) + { + throw new InvalidArgumentException( '$target', 'Must be of type: Section' ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + /** + * @var $target Section + */ + return in_array( $target->id, $value->limitationValues ); + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/ObjectStateLimitationType.php b/eZ/Publish/Core/Limitation/ObjectStateLimitationType.php new file mode 100644 index 0000000..16dda46 --- /dev/null +++ b/eZ/Publish/Core/Limitation/ObjectStateLimitationType.php @@ -0,0 +1,189 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIObjectStateLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIObjectStateLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APIObjectStateLimitation' ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( !$object instanceof ContentInfo && !$object instanceof ContentCreateStruct ) + { + throw new InvalidArgumentException( '$object', 'Must be of type: Content, VersionInfo or ContentInfo' ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + $objectStateIdArray = array(); + $objectStateHandler = $this->persistence->objectStateHandler(); + $stateGroups = $objectStateHandler->loadAllGroups(); + + // First deal with unpublished content + if ( $object instanceof ContentCreateStruct || !$object->published ) + { + foreach ( $stateGroups as $stateGroup ) + { + $states = $objectStateHandler->loadObjectStates( $stateGroup->id ); + if ( empty( $states ) ) + continue; + + $defaultStateId = null; + $defaultStatePriority = -1; + foreach ( $states as $state ) + { + if ( $state->priority > $defaultStatePriority ) + { + $defaultStateId = $state->id; + $defaultStatePriority = $state->priority; + } + } + + if ( $defaultStateId === null ) + throw new BadStateException( + '$defaultStateId', + "Could not find a default state for object state group {$stateGroup->id}" + ); + + $objectStateIdArray[] = $defaultStateId; + } + } + else + { + /** + * @var $object ContentInfo + */ + foreach ( $stateGroups as $stateGroup ) + { + $objectStateIdArray[] = $objectStateHandler->getContentState( $object->id, $stateGroup->id )->id; + } + } + + $intersect = array_intersect( $value->limitationValues, $objectStateIdArray ); + return !empty( $intersect ); + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( !isset( $value->limitationValues[1] ) )// 1 limitation value: EQ operation + return new Criterion\ObjectStateId( $value->limitationValues[0] ); + + // several limitation values: IN operation + return new Criterion\ObjectStateId( $value->limitationValues ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/OwnerLimitationType.php b/eZ/Publish/Core/Limitation/OwnerLimitationType.php new file mode 100644 index 0000000..8aa4849 --- /dev/null +++ b/eZ/Publish/Core/Limitation/OwnerLimitationType.php @@ -0,0 +1,151 @@ +limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIOwnerLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + * + * @todo Add support for $limitationValues[0] == 2 when session values can be injected somehow, or deprecate + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIOwnerLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APIOwnerLimitation' ); + } + + if ( $value->limitationValues[0] != 1 && $value->limitationValues[0] != 2 ) + { + throw new BadStateException( + 'Owner limitation', + 'expected limitation value to be 1 or 2 but got:' . $value->limitationValues[0] + ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( !$object instanceof ContentInfo && !$object instanceof ContentCreateStruct ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + /** + * @var $object ContentInfo + */ + return $object->ownerId === $currentUser->id; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + * + * @todo Add support for $limitationValues[0] == 2 when session values can be injected somehow, or deprecate + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( $value->limitationValues[0] != 1 && $value->limitationValues[0] != 2 ) + { + throw new BadStateException( + 'Parent User Group limitation', + 'expected limitation value to be 1 but got:' . $value->limitationValues[0] + ); + } + + return new Criterion\UserMetadata( + Criterion\UserMetadata::OWNER, + Criterion\Operator::EQ, + $currentUser->id + ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/ParentContentTypeLimitationType.php b/eZ/Publish/Core/Limitation/ParentContentTypeLimitationType.php new file mode 100644 index 0000000..6e7a5e8 --- /dev/null +++ b/eZ/Publish/Core/Limitation/ParentContentTypeLimitationType.php @@ -0,0 +1,130 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIParentContentTypeLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIParentContentTypeLimitation ) + throw new InvalidArgumentException( '$value', 'Must be of type: APIParentContentTypeLimitation' ); + + if ( $target instanceof LocationCreateStruct ) + { + $spiLocation = $this->persistence->locationHandler()->load( $target->parentLocationId ); + $spiContentInfo = $this->persistence->contentHandler()->loadContentInfo( $spiLocation->contentId ); + return in_array( $spiContentInfo->contentTypeId, $value->limitationValues ); + } + + if ( $target !== null && !$target instanceof Location ) + throw new InvalidArgumentException( '$target', 'Must be of type: Location' ); + else if ( $target === null ) + return false; + + /** + * @var $target Location + */ + return in_array( $target->getContentInfo()->contentTypeId, $value->limitationValues ); + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/ParentDepthLimitationType.php b/eZ/Publish/Core/Limitation/ParentDepthLimitationType.php new file mode 100644 index 0000000..f7c1244 --- /dev/null +++ b/eZ/Publish/Core/Limitation/ParentDepthLimitationType.php @@ -0,0 +1,126 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIParentDepthLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIParentDepthLimitation ) + throw new InvalidArgumentException( '$value', 'Must be of type: APIParentDepthLimitation' ); + + if ( $target instanceof LocationCreateStruct ) + $target = $this->persistence->locationHandler()->load( $target->parentLocationId ); + else if ( $target !== null && !$target instanceof Location ) + throw new InvalidArgumentException( '$target', 'Must be of type: Location' ); + + if ( $target === null ) + return false; + + /** + * @var $target Location|\eZ\Publish\SPI\Persistence\Content\Location + */ + return in_array( $target->depth, $value->limitationValues ); + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/ParentOwnerLimitationType.php b/eZ/Publish/Core/Limitation/ParentOwnerLimitationType.php new file mode 100644 index 0000000..d39eef1 --- /dev/null +++ b/eZ/Publish/Core/Limitation/ParentOwnerLimitationType.php @@ -0,0 +1,141 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIParentOwnerLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + * + * @todo Add support for $limitationValues[0] == 2 when session values can be injected somehow + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIParentOwnerLimitation ) + throw new InvalidArgumentException( '$value', 'Must be of type: APIParentOwnerLimitation' ); + + if ( $value->limitationValues[0] != 1 && $value->limitationValues[0] != 2 ) + { + throw new BadStateException( + 'Parent Owner limitation', + 'expected limitation value to be 1 or 2 but got:' . $value->limitationValues[0] + ); + } + + if ( $target instanceof LocationCreateStruct ) + { + $spiLocation = $this->persistence->locationHandler()->load( $target->parentLocationId ); + $spiContentInfo = $this->persistence->contentHandler()->loadContentInfo( $spiLocation->contentId ); + return $spiContentInfo->ownerId === $currentUser->id; + } + + if ( $target !== null && !$target instanceof Location ) + throw new InvalidArgumentException( '$target', 'Must be of type: Location' ); + else if ( $target === null ) + return false; + + /** + * @var $target Location + */ + return $target->getContentInfo()->ownerId === $currentUser->id; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/ParentUserGroupLimitationType.php b/eZ/Publish/Core/Limitation/ParentUserGroupLimitationType.php new file mode 100644 index 0000000..00c9107 --- /dev/null +++ b/eZ/Publish/Core/Limitation/ParentUserGroupLimitationType.php @@ -0,0 +1,162 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIParentUserGroupLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIParentUserGroupLimitation ) + throw new InvalidArgumentException( '$value', 'Must be of type: APIParentUserGroupLimitation' ); + + if ( $value->limitationValues[0] != 1 ) + { + throw new BadStateException( + 'Parent User Group limitation', + 'expected limitation value to be 1 but got:' . $value->limitationValues[0] + ); + } + + if ( $target instanceof LocationCreateStruct ) + { + $spiLocation = $this->persistence->locationHandler()->load( $target->parentLocationId ); + $spiContentInfo = $this->persistence->contentHandler()->loadContentInfo( $spiLocation->contentId ); + $parentOwnerId = $spiContentInfo->ownerId; + } + else if ( $target !== null && !$target instanceof Location ) + throw new InvalidArgumentException( '$target', 'Must be of type: Location' ); + else if ( $target === null ) + return false; + else // $target is assumed to be parent in this case + $parentOwnerId = $target->getContentInfo()->ownerId; + + if ( $parentOwnerId === $currentUser->id ) + return true; + + /** + * As long as SPI userHandler and API UserService does not speak the same language, this is the ugly truth; + */ + $locationHandler = $this->persistence->locationHandler(); + $parentOwnerLocations = $locationHandler->loadLocationsByContent( $parentOwnerId ); + if ( empty( $parentOwnerLocations ) ) + return false; + + $currentUserLocations = $locationHandler->loadLocationsByContent( $currentUser->id ); + if ( empty( $currentUserLocations ) ) + return false; + + // @todo Needs to take care of inherited groups as well when UserHandler gets knowledge about user groups + foreach ( $parentOwnerLocations as $parentOwnerLocation ) + { + foreach ( $currentUserLocations as $currentUserLocation ) + { + if ( $parentOwnerLocation->parentId === $currentUserLocation->parentId ) + return true; + } + } + + return false; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/SectionLimitationType.php b/eZ/Publish/Core/Limitation/SectionLimitationType.php new file mode 100644 index 0000000..2669177 --- /dev/null +++ b/eZ/Publish/Core/Limitation/SectionLimitationType.php @@ -0,0 +1,135 @@ +limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APISectionLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APISectionLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APISectionLimitation' ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( !$object instanceof ContentInfo && !$object instanceof $object ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + /** + * @var $object ContentInfo|ContentCreateStruct + */ + return in_array( $object->sectionId, $value->limitationValues ); + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( !isset( $value->limitationValues[1] ) )// 1 limitation value: EQ operation + return new Criterion\SectionId( $value->limitationValues[0] ); + + // several limitation values: IN operation + return new Criterion\SectionId( $value->limitationValues ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/SiteAccessLimitationType.php b/eZ/Publish/Core/Limitation/SiteAccessLimitationType.php new file mode 100644 index 0000000..9169903 --- /dev/null +++ b/eZ/Publish/Core/Limitation/SiteAccessLimitationType.php @@ -0,0 +1,117 @@ +limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APISiteAccessLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APISiteAccessLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APISiteAccessLimitation' ); + } + + if ( !$object instanceof ContentInfo && !$object instanceof Content && !$object instanceof VersionInfo ) + { + throw new InvalidArgumentException( '$object', 'Must be of type: Content, VersionInfo or ContentInfo' ); + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + /** + * @todo Use current siteaccess as dependency in constructor, or define a way it can be injected in this function + * 4.x limitationValues in default 64bit mode is: sprintf( '%u', crc32( $siteAccessName ) ) + */ + return false; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/Limitation/SubtreeLimitationType.php b/eZ/Publish/Core/Limitation/SubtreeLimitationType.php new file mode 100644 index 0000000..bcee287 --- /dev/null +++ b/eZ/Publish/Core/Limitation/SubtreeLimitationType.php @@ -0,0 +1,193 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APISubtreeLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APISubtreeLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APISubtreeLimitation' ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( $object instanceof ContentCreateStruct ) + { + // If target is null return false as user does not have access to content w/o location with this limitation + if ( $target === null ) + return false; + + if ( !$target instanceof LocationCreateStruct ) + { + throw new InvalidArgumentException( + '$object', + 'Cannot be ContentCreateStruct unless $target is LocationCreateStruct' + ); + } + } + else if ( !$object instanceof ContentInfo ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + if ( $target !== null && !$target instanceof Location && !$target instanceof LocationCreateStruct ) + { + // Since this limitation is used as role limitation, "wrong" $target simply returns false + return false; + } + + if ( empty( $value->limitationValues ) ) + { + return false; + } + + // Load location in case of LocationCreateStruct for the path comparison below + if ( $target instanceof LocationCreateStruct ) + { + $target = $this->persistence->locationHandler()->load( $target->parentLocationId ); + } + + /** + * Use $target if provided, optionally used to check the specific location instead of all + * e.g.: 'remove' in the context of removal of a specific location, or in case of 'create' + * + * @var $object ContentInfo + */ + $locations = $target !== null ? + array( $target ) : + $this->persistence->locationHandler()->loadLocationsByContent( $object->id ); + foreach ( $locations as $location ) + { + foreach ( $value->limitationValues as $limitationPathString ) + { + if ( $location->pathString === $limitationPathString ) + return true; + if ( strpos( $location->pathString, $limitationPathString ) === 0 ) + return true; + } + } + return false; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( !isset( $value->limitationValues[1] ) )// 1 limitation value: EQ operation + return new Criterion\Subtree( $value->limitationValues[0] ); + + // several limitation values: IN operation + return new Criterion\Subtree( $value->limitationValues ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + self::VALUE_SCHEMA_LOCATION_PATH; + } +} diff --git a/eZ/Publish/Core/Limitation/UserGroupLimitationType.php b/eZ/Publish/Core/Limitation/UserGroupLimitationType.php new file mode 100644 index 0000000..7e15936 --- /dev/null +++ b/eZ/Publish/Core/Limitation/UserGroupLimitationType.php @@ -0,0 +1,195 @@ +persistence = $persistence; + } + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Create the Limitation Value + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ) + { + return new APIUserGroupLimitation( array( 'limitationValues' => $limitationValues ) ); + } + + /** + * Evaluate permission against content & target(placement/parent/assignment) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, ValueObject $object, ValueObject $target = null ) + { + if ( !$value instanceof APIUserGroupLimitation ) + { + throw new InvalidArgumentException( '$value', 'Must be of type: APIUserGroupLimitation' ); + } + + if ( $value->limitationValues[0] != 1 ) + { + throw new BadStateException( + 'Parent User Group limitation', + 'expected limitation value to be 1 but got:' . $value->limitationValues[0] + ); + } + + if ( $object instanceof Content ) + { + $object = $object->getVersionInfo()->getContentInfo(); + } + else if ( $object instanceof VersionInfo ) + { + $object = $object->getContentInfo(); + } + else if ( !$object instanceof ContentInfo && !$object instanceof ContentCreateStruct ) + { + throw new InvalidArgumentException( + '$object', + 'Must be of type: ContentCreateStruct, Content, VersionInfo or ContentInfo' + ); + } + + /** + * @var $object ContentInfo|ContentCreateStruct + */ + if ( $object->ownerId === $currentUser->id ) + return true; + + /** + * As long as SPI userHandler and API UserService does not speak the same language, this is the ugly truth; + */ + $locationHandler = $this->persistence->locationHandler(); + $ownerLocations = $locationHandler->loadLocationsByContent( $object->ownerId ); + if ( empty( $ownerLocations ) ) + return false; + + $currentUserLocations = $locationHandler->loadLocationsByContent( $currentUser->id ); + if ( empty( $currentUserLocations ) ) + return false; + + // @todo Needs to take care of inherited groups as well when UserHandler gets knowledge about user groups + foreach ( $ownerLocations as $ownerLocation ) + { + foreach ( $currentUserLocations as $currentUserLocation ) + { + if ( $ownerLocation->parentId === $currentUserLocation->parentId ) + return true; + } + } + + return false; + } + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ) + { + if ( empty( $value->limitationValues ) )// no limitation values + throw new \RuntimeException( "\$value->limitationValues is empty, it should not have been stored in the first place" ); + + if ( $value->limitationValues[0] != 1 ) + { + throw new BadStateException( + 'Parent User Group limitation', + 'expected limitation value to be 1 but got:' . $value->limitationValues[0] + ); + } + + $groupIds = array(); + // @todo Needs to take care of inherited groups as well when UserHandler gets knowledge about user groups + $currentUserLocations = $this->persistence->locationHandler()->loadLocationsByContent( $currentUser->id ); + if ( !empty( $currentUserLocations ) ) + { + foreach ( $currentUserLocations as $currentUserLocation ) + $groupIds[] = $currentUserLocation->parentId; + } + + return new Criterion\UserMetadata( + Criterion\UserMetadata::GROUP, + Criterion\Operator::IN, + $groupIds + ); + } + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_ constants. + */ + public function valueSchema() + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/MVC/ConfigResolverInterface.php b/eZ/Publish/Core/MVC/ConfigResolverInterface.php new file mode 100644 index 0000000..f562024 --- /dev/null +++ b/eZ/Publish/Core/MVC/ConfigResolverInterface.php @@ -0,0 +1,58 @@ +..parameter.name". + */ +interface ConfigResolverInterface +{ + /** + * Returns value for $paramName, in $namespace. + * + * @param string $paramName The parameter name, without $prefix and the current scope (i.e. siteaccess name). + * @param string $namespace Namespace for the parameter name. If null, the default namespace should be used. + * @param string $scope The scope you need $paramName value for. + * + * @return mixed + */ + public function getParameter( $paramName, $namespace = null, $scope = null ); + + /** + * Checks if $paramName exists in $namespace + * + * @param string $paramName + * @param string $namespace If null, the default namespace should be used. + * @param string $scope The scope you need $paramName value for. + * + * @return boolean + */ + public function hasParameter( $paramName, $namespace = null, $scope = null ); + + /** + * Changes the default namespace to look parameter into. + * + * @param string $defaultNamespace + */ + public function setDefaultNamespace( $defaultNamespace ); + + /** + * Returns the current default namespace. + * + * @return string + */ + public function getDefaultNamespace(); +} diff --git a/eZ/Publish/Core/MVC/Exception/InvalidSiteAccessException.php b/eZ/Publish/Core/MVC/Exception/InvalidSiteAccessException.php new file mode 100644 index 0000000..626f681 --- /dev/null +++ b/eZ/Publish/Core/MVC/Exception/InvalidSiteAccessException.php @@ -0,0 +1,28 @@ +message = "Parameter '$paramName' with namespace '$namespace' could not be found."; + if ( !empty( $triedScopes ) ) + $this->message .= " Tried scopes: " . implode( ', ', $triedScopes ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Event/PreBuildKernelEvent.php b/eZ/Publish/Core/MVC/Legacy/Event/PreBuildKernelEvent.php new file mode 100644 index 0000000..07fbf36 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Event/PreBuildKernelEvent.php @@ -0,0 +1,42 @@ +parameters = $parameters; + } + + /** + * @return \Symfony\Component\HttpFoundation\ParameterBag + */ + public function getParameters() + { + return $this->parameters; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Event/PreBuildKernelWebHandlerEvent.php b/eZ/Publish/Core/MVC/Legacy/Event/PreBuildKernelWebHandlerEvent.php new file mode 100644 index 0000000..b0ccd23 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Event/PreBuildKernelWebHandlerEvent.php @@ -0,0 +1,55 @@ +parameters = $parameters; + $this->request = $request; + } + + /** + * @return \Symfony\Component\HttpFoundation\Request + */ + public function getRequest() + { + return $this->request; + } + + /** + * @return \Symfony\Component\HttpFoundation\ParameterBag + */ + public function getParameters() + { + return $this->parameters; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/EventListener/APIContentExceptionListener.php b/eZ/Publish/Core/MVC/Legacy/EventListener/APIContentExceptionListener.php new file mode 100644 index 0000000..47459dd --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/EventListener/APIContentExceptionListener.php @@ -0,0 +1,87 @@ +legacyCVP = $legacyCVP; + $this->legacyLVP = $legacyLVP; + $this->logger = $logger; + } + + public static function getSubscribedEvents() + { + return array( + MVCEvents::API_CONTENT_EXCEPTION => 'onAPIContentException' + ); + } + + public function onAPIContentException( APIContentExceptionEvent $event ) + { + $exception = $event->getApiException(); + $contentMeta = $event->getContentMeta(); + if ( $exception instanceof ConverterNotFound ) + { + if ( isset( $this->logger ) ) + $this->logger->notice( + 'Missing field converter in legacy storage engine, forwarding to legacy kernel.', + array( 'content' => $contentMeta ) + ); + + if ( isset( $contentMeta['locationId'] ) ) + { + $event->setContentView( + $this->legacyLVP->getView( + new Location( array( 'id' => $contentMeta['locationId'] ) ), + $contentMeta['viewType'] + ) + ); + } + else if ( isset( $contentMeta['contentId'] ) ) + { + $event->setContentView( + $this->legacyCVP->getView( + new ContentInfo( array( 'id' => $contentMeta['contentId'] ) ), + $contentMeta['viewType'] + ) + ); + } + + $event->stopPropagation(); + } + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Image/AliasGenerator.php b/eZ/Publish/Core/MVC/Legacy/Image/AliasGenerator.php new file mode 100644 index 0000000..80f38e1 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Image/AliasGenerator.php @@ -0,0 +1,115 @@ +--. + * Storing them avoids to run the legacy kernel each time if there are similar images variations required. + * + * @var \eZ\Publish\SPI\Variation\Values\ImageVariation[] + */ + private $variations; + + public function __construct( Closure $legacyKernelClosure ) + { + $this->kernelClosure = $legacyKernelClosure; + } + + /** + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected function getLegacyKernel() + { + $kernelClosure = $this->kernelClosure; + return $kernelClosure(); + } + + /** + * Returns an image variant object. + * Variation creation will be done through the legacy eZImageAliasHandler, using the legacy kernel. + * + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param string $variationName + * @param array $parameters + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidVariationException + * + * @return \eZ\Publish\SPI\Variation\Values\ImageVariation + */ + public function getVariation( Field $field, VersionInfo $versionInfo, $variationName, array $parameters = array() ) + { + $variationIdentifier = "$field->id-$versionInfo->versionNo-$variationName"; + if ( isset( $this->variations[$variationIdentifier] ) ) + return $this->variations[$variationIdentifier]; + + // Assigning by reference to be able to modify those arrays within the closure (due to PHP 5.3 limitation with access to $this) + $allAliasHandlers = &$this->aliasHandlers; + $allVariations = &$this->variations; + + return $this->getLegacyKernel()->runCallback( + function () use ( $field, $versionInfo, $variationName, &$allAliasHandlers, &$allVariations, $variationIdentifier ) + { + $aliasHandlerIdentifier = "$field->id-$versionInfo->versionNo"; + if ( !isset( $allAliasHandlers[$aliasHandlerIdentifier] ) ) + { + $allAliasHandlers[$aliasHandlerIdentifier] = new eZImageAliasHandler( + eZContentObjectAttribute::fetch( $field->id, $versionInfo->versionNo ) + ); + } + + /** @var $imageAliasHandler \eZImageAliasHandler */ + $imageAliasHandler = $allAliasHandlers[$aliasHandlerIdentifier]; + $aliasArray = $imageAliasHandler->imageAlias( $variationName ); + if ( $aliasArray === null ) + throw new InvalidVariationException( $variationName, 'image' ); + + $allVariations[$variationIdentifier] = new ImageVariation( + array( + 'name' => $variationName, + 'fileName' => $aliasArray['filename'], + 'dirPath' => $aliasArray['dirpath'], + 'fileSize' => isset( $aliasArray['filesize'] ) ? $aliasArray['filesize'] : 0, + 'mimeType' => $aliasArray['mime_type'], + 'lastModified' => new \DateTime( '@' . $aliasArray['timestamp'] ), + 'uri' => $aliasArray['url'], + 'width' => $aliasArray['width'], + 'height' => $aliasArray['height'], + ) + ); + + return $allVariations[$variationIdentifier]; + }, + false + ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Kernel.php b/eZ/Publish/Core/MVC/Legacy/Kernel.php new file mode 100644 index 0000000..018c600 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Kernel.php @@ -0,0 +1,97 @@ +legacyRootDir = $legacyRootDir; + $this->webRootDir = $webRootDir; + + $this->enterLegacyRootDir(); + parent::__construct( $kernelHandler ); + $this->leaveLegacyRootDir(); + $this->setUseExceptions( true ); + } + + /** + * Changes the current working directory to the legacy root dir. + * Calling this method is mandatory to use legacy kernel since a lot of resources in eZ Publish 4.x relatively defined. + */ + public function enterLegacyRootDir() + { + chdir( $this->legacyRootDir ); + } + + /** + * Leaves the legacy root dir and switches back to the initial webroot dir. + */ + public function leaveLegacyRootDir() + { + chdir( $this->webRootDir ); + } + + /** + * Runs current request through legacy kernel. + * + * @return array + */ + public function run() + { + $this->enterLegacyRootDir(); + $return = parent::run(); + $this->leaveLegacyRootDir(); + return $return; + } + + /** + * Runs a callback function in the legacy kernel environment. + * This is useful to run eZ Publish 4.x code from a non-related context (like eZ Publish 5) + * + * @param \Closure $callback + * @param boolean $postReinitialize Default is true. + * If set to false, the kernel environment will not be reinitialized. + * This can be useful to optimize several calls to the kernel within the same context. + * @return mixed The result of the callback + */ + public function runCallback( \Closure $callback, $postReinitialize = true ) + { + $this->enterLegacyRootDir(); + $return = parent::runCallback( $callback, $postReinitialize ); + $this->leaveLegacyRootDir(); + return $return; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Kernel/CLIHandler.php b/eZ/Publish/Core/MVC/Legacy/Kernel/CLIHandler.php new file mode 100644 index 0000000..ec1daa1 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Kernel/CLIHandler.php @@ -0,0 +1,134 @@ +container = $container; + if ( isset( $settings['injected-settings'] ) ) + { + $injectedSettings = array(); + foreach ( $settings["injected-settings"] as $keySetting => $injectedSetting ) + { + list( $file, $section, $setting ) = explode( "/", $keySetting ); + $injectedSettings[$file][$section][$setting] = $injectedSetting; + } + // those settings override anything else in local .ini files and + // their overrides + eZINI::injectSettings( $injectedSettings ); + } + + $this->script = eZScript::instance( $settings ); + $this->script->startup(); + if ( isset( $siteAccess ) ) + $this->script->setUseSiteAccess( $siteAccess->name ); + + $this->script->initialize(); + } + + /** + * Not supported by CLIHandler + * + * @throws \RuntimeException + */ + public function run() + { + throw new RuntimeException( 'run() method is not supported by CLIHandler' ); + } + + /** + * Runs a callback function in the legacy kernel environment. + * This is useful to run eZ Publish 4.x code from a non-related context (like eZ Publish 5) + * + * @param \Closure $callback + * @param boolean $postReinitialize Default is true. + * If set to false, the kernel environment will not be reinitialized. + * This can be useful to optimize several calls to the kernel within the same context. + * @return mixed The result of the callback + */ + public function runCallback( \Closure $callback, $postReinitialize = true ) + { + $return = $callback(); + $this->script->shutdown(); + if ( !$postReinitialize ) + $this->script->setIsInitialized( true ); + + return $return; + } + + /** + * Not supported by CLIHandler + * + * @param boolean $useExceptions + * + * @throws \RuntimeException + */ + public function setUseExceptions( $useExceptions ) + { + } + + /** + * Reinitializes the kernel environment. + * + * @return void + */ + public function reInitialize() + { + $this->script->setIsInitialized( false ); + } + + /** + * Checks whether the kernel handler has the Symfony Dependency Injection + * container or not. + * + * @return boolean + */ + public function hasServiceContainer() + { + return isset( $this->container ); + } + + /** + * Returns the Symfony Dependency Injection container if it has been injected, + * otherwise returns null. + * + * @return \Symfony\Component\DependencyInjection\ContainerInterface|null + */ + public function getServiceContainer() + { + return $this->container; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Kernel/Loader.php b/eZ/Publish/Core/MVC/Legacy/Kernel/Loader.php new file mode 100644 index 0000000..7dacdf1 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Kernel/Loader.php @@ -0,0 +1,181 @@ +legacyRootDir = $legacyRootDir; + $this->webrootDir = $webrootDir; + $this->logger = $logger; + } + + /** + * Builds up the legacy kernel and encapsulates it inside a closure, allowing lazy loading. + * + * @param \ezpKernelHandler|\Closure A kernel handler instance or a closure returning a kernel handler instance + * + * @return \Closure + */ + public function buildLegacyKernel( $legacyKernelHandler ) + { + $legacyRootDir = $this->legacyRootDir; + $webrootDir = $this->webrootDir; + return function () use ( $legacyKernelHandler, $legacyRootDir, $webrootDir ) + { + static $legacyKernel; + if ( !$legacyKernel instanceof LegacyKernel ) + { + if ( $legacyKernelHandler instanceof \Closure ) + $legacyKernelHandler = $legacyKernelHandler(); + $legacyKernel = new LegacyKernel( $legacyKernelHandler, $legacyRootDir, $webrootDir ); + } + + return $legacyKernel; + }; + } + + /** + * Builds up the legacy kernel web handler and encapsulates it inside a closure, allowing lazy loading. + * + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + * @param string $webHandlerClass The legacy kernel handler class to use + * @param array $defaultLegacyOptions Hash of options to pass to the legacy kernel handler + * + * @throws \InvalidArgumentException + * + * @return \Closure|void + */ + public function buildLegacyKernelHandlerWeb( ContainerInterface $container, $webHandlerClass, array $defaultLegacyOptions = array() ) + { + $legacyRootDir = $this->legacyRootDir; + $webrootDir = $this->webrootDir; + + return function () use ( $legacyRootDir, $webrootDir, $container, $defaultLegacyOptions, $webHandlerClass ) + { + static $webHandler; + if ( !$webHandler instanceof ezpKernelHandler ) + { + chdir( $legacyRootDir ); + + $legacyParameters = new ParameterBag( $defaultLegacyOptions ); + $legacyParameters->set( 'service-container', $container ); + $request = $container->get( 'request' ); + $eventDispatcher = $container->get( 'event_dispatcher' ); + + // PRE_BUILD_LEGACY_KERNEL for non request related stuff (potentially available in CLI context as well + $eventDispatcher->dispatch( LegacyEvents::PRE_BUILD_LEGACY_KERNEL, new PreBuildKernelEvent( $legacyParameters ) ); + + // Pure web stuff + $buildEventWeb = new PreBuildKernelWebHandlerEvent( + $legacyParameters, $request + ); + $eventDispatcher->dispatch( + LegacyEvents::PRE_BUILD_LEGACY_KERNEL_WEB, $buildEventWeb + ); + + $interfaces = class_implements( $webHandlerClass ); + if ( !isset( $interfaces['ezpKernelHandler'] ) ) + throw new \InvalidArgumentException( 'A legacy kernel handler must be an instance of ezpKernelHandler.' ); + + $webHandler = new $webHandlerClass( $legacyParameters->all() ); + $uri = eZURI::instance(); + $uri->setURIString( + $request->attributes->get( + 'semanticPathinfo', + $request->getPathinfo() + ) . $request->attributes->get( 'viewParametersString' ) + ); + chdir( $webrootDir ); + } + + return $webHandler; + }; + } + + /** + * Builds legacy kernel handler CLI + * + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + * + * @return CLIHandler + */ + public function buildLegacyKernelHandlerCLI( ContainerInterface $container ) + { + $legacyRootDir = $this->legacyRootDir; + $webrootDir = $this->webrootDir; + + return function () use ( $legacyRootDir, $webrootDir, $container ) + { + static $cliHandler; + if ( !$cliHandler instanceof ezpKernelHandler ) + { + chdir( $legacyRootDir ); + + $legacyParameters = new ParameterBag( $container->getParameter( 'ezpublish_legacy.kernel_handler.cli.options' ) ); + $eventDispatcher = $container->get( 'event_dispatcher' ); + $eventDispatcher->dispatch( LegacyEvents::PRE_BUILD_LEGACY_KERNEL, new PreBuildKernelEvent( $legacyParameters ) ); + + $cliHandler = new CLIHandler( $legacyParameters->all(), $container->get( 'ezpublish.siteaccess' ), $container ); + chdir( $webrootDir ); + } + + return $cliHandler; + }; + } + + /** + * Builds the legacy kernel handler for the tree menu in admin interface. + * + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + * + * @return \Closure A closure returning an \ezpKernelTreeMenu instance. + */ + public function buildLegacyKernelHandlerTreeMenu( ContainerInterface $container ) + { + return $this->buildLegacyKernelHandlerWeb( + $container, + $container->getParameter( 'ezpublish_legacy.kernel_handler.treemenu.class' ), + array( + 'use-cache-headers' => false, + 'use-exceptions' => true + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/LegacyEvents.php b/eZ/Publish/Core/MVC/Legacy/LegacyEvents.php new file mode 100644 index 0000000..9917862 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/LegacyEvents.php @@ -0,0 +1,35 @@ +cookies->has( 'is_logged_in' ) && $request->cookies->get( 'is_logged_in' ) === 'true' ) + { + $userId = $request->getSession()->get( 'eZUserLoggedInID' ); + } + + // -1 stands for not logged in user (aka anonymous), since PreAuthenticatedAuthenticationProvider needs a non empty value + $userId = $userId ?: -1; + + return array( (string)$userId, '' ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Templating/Converter/ApiContentConverter.php b/eZ/Publish/Core/MVC/Legacy/Templating/Converter/ApiContentConverter.php new file mode 100644 index 0000000..ee024ea --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Templating/Converter/ApiContentConverter.php @@ -0,0 +1,122 @@ +legacyKernelClosure = $legacyKernelClosure; + $this->apiObjects = array(); + } + + /** + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + final protected function getLegacyKernel() + { + $closure = $this->legacyKernelClosure; + return $closure(); + } + + /** + * Converts $object to make it compatible with eZTemplate API. + * + * @param object $object + * + * @throws \InvalidArgumentException If $object is actually not an object + * + * @return mixed|\eZ\Publish\Core\MVC\Legacy\Templating\LegacyCompatible + */ + public function convert( $object ) + { + if ( !is_object( $object ) ) + throw new \InvalidArgumentException( 'Transferred object must be a real object. Got ' . gettype( $object ) ); + + return $this->getLegacyKernel()->runCallback( + function () use ( $object ) + { + if ( $object instanceof Content ) + { + return eZContentObject::fetch( $object->getVersionInfo()->getContentInfo()->id ); + } + else if ( $object instanceof Location ) + { + return eZContentObjectTreeNode::fetch( $object->id ); + } + } + ); + } + + /** + * Registers an object to the converter. + * $alias is the variable name that will be exposed in the legacy template. + * + * @param mixed $object + * @param string $alias + * + * @throws \InvalidArgumentException If $object is not an object + * + * @return void + */ + public function register( $object, $alias ) + { + if ( !is_object( $object ) ) + throw new \InvalidArgumentException( 'Transferred object must be a real object. Got ' . gettype( $object ) ); + + $this->apiObjects[$alias] = $object; + } + + /** + * Converts all registered objects and returns them in a hash where the object's alias is the key. + * + * @return array|\eZ\Publish\Core\MVC\Legacy\Templating\LegacyCompatible[] + */ + public function convertAll() + { + $apiObjects = $this->apiObjects; + return $this->getLegacyKernel()->runCallback( + function () use ( $apiObjects ) + { + $convertedObjects = array(); + foreach ( $apiObjects as $alias => $apiObject ) + { + if ( $apiObject instanceof Content ) + { + $convertedObjects[$alias] = eZContentObject::fetch( $apiObject->getVersionInfo()->getContentInfo()->id ); + } + else if ( $apiObject instanceof Location ) + { + $convertedObjects[$alias] = eZContentObjectTreeNode::fetch( $apiObject->id ); + } + } + + return $convertedObjects; + } + ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Templating/Converter/DelegatingConverter.php b/eZ/Publish/Core/MVC/Legacy/Templating/Converter/DelegatingConverter.php new file mode 100644 index 0000000..094a64f --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Templating/Converter/DelegatingConverter.php @@ -0,0 +1,130 @@ +convertersMap = array(); + $this->objectsToConvert = array(); + $this->genericConverter = $genericConverter; + } + + /** + * Registers $converter for classes contained in $classes + * + * @param \eZ\Publish\Core\MVC\Legacy\Templating\Converter\ObjectConverter $converter + * @param string $class Class the converter is for + */ + public function addConverter( ObjectConverter $converter, $class ) + { + $this->convertersMap[$class] = $converter; + } + + /** + * Registers an object to the converter. + * $alias is the variable name that will be exposed in the legacy template. + * + * @param mixed $object + * @param string $alias + * + * @throws \InvalidArgumentException If $object is not an object + * + * @return void + */ + public function register( $object, $alias ) + { + $this->objectsToConvert[$alias] = $object; + } + + /** + * Converts all registered objects and returns them in a hash where the object's alias is the key. + * + * @return array|\eZ\Publish\Core\MVC\Legacy\Templating\LegacyCompatible[] + */ + public function convertAll() + { + $convertedObjects = array(); + $delegatingConverters = array(); + + foreach ( $this->objectsToConvert as $alias => $obj ) + { + $className = get_class( $obj ); + if ( isset( $this->convertersMap[$className] ) ) + { + $converter = $this->convertersMap[$className]; + // MultipleObjectConverter => Register it for later conversion + if ( $converter instanceof MultipleObjectConverter ) + { + $converter->register( $obj, $alias ); + $delegatingConverters[] = $converter; + } + else + { + $convertedObjects[$alias] = $converter->convert( $obj ); + } + } + // No registered converter => fallback to generic converter + else + { + $convertedObjects[$alias] = $this->genericConverter->convert( $obj ); + } + } + + // Finally loop against delegating converters (aka MultipleObjectConverter instances) to convert all registered objects + foreach ( $delegatingConverters as $converter ) + { + $convertedObjects += $converter->convertAll(); + } + + return $convertedObjects; + } + + /** + * Converts $object to make it compatible with eZTemplate API. + * + * @param object $object + * + * @throws \InvalidArgumentException If $object is actually not an object + * + * @return mixed|\eZ\Publish\Core\MVC\Legacy\Templating\LegacyCompatible + */ + public function convert( $object ) + { + $className = get_class( $object ); + if ( isset( $this->convertersMap[$className] ) ) + $converter = $this->convertersMap[$className]; + else + $converter = $this->genericConverter; + + return $converter->convert( $object ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Templating/Converter/GenericConverter.php b/eZ/Publish/Core/MVC/Legacy/Templating/Converter/GenericConverter.php new file mode 100644 index 0000000..c293463 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Templating/Converter/GenericConverter.php @@ -0,0 +1,35 @@ +object = $transferredObject; + + // Registering available public properties + $this->properties = array_map( + function () + { + return true; + }, + get_object_vars( $transferredObject ) + ); + + // Registering available getters + $this->getters = array_fill_keys( + array_filter( + get_class_methods( $transferredObject ), + function ( $method ) + { + return strpos( $method, 'get' ) === 0; + } + ), + true + ); + } + + /** + * Returns true if object supports attribute $name + * + * @param string $name + * + * @return boolean + */ + public function hasAttribute( $name ) + { + return isset( $this->properties[$name] ) || isset( $this->getters['get' . ucfirst( $name )] ); + } + + /** + * Returns the value of attribute $name. + * + * @param string $name + * + * @throws \InvalidArgumentException If $name is not supported by aggregated object + * + * @return mixed + */ + public function attribute( $name ) + { + if ( isset( $this->properties[$name] ) ) + return $this->object->$name; + + $getterName = 'get' . ucfirst( $name ); + if ( isset( $this->getters[$getterName] ) ) + return $this->object->$getterName(); + + throw new \InvalidArgumentException( "Unsupported attribute '$name' for " . get_class( $this->object ) ); + } + + /** + * Returns an array of supported attributes (only their names). + * + * @return array + */ + public function attributes() + { + $getters = $this->getters; + array_walk( + $getters, + function ( $methodName ) + { + return lcfirst( substr( $methodName, 3 ) ); + } + ); + + return array_keys( $this->properties + $getters ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Templating/LegacyCompatible.php b/eZ/Publish/Core/MVC/Legacy/Templating/LegacyCompatible.php new file mode 100644 index 0000000..00ca398 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Templating/LegacyCompatible.php @@ -0,0 +1,43 @@ +legacyKernelClosure = $legacyKernelClosure; + $this->objectConverter = $objectConverter; + } + + /** + * Renders a legacy template. + * + * @param string $tplPath Path to template (i.e. "design:setup/info.tpl") + * @param array $params Parameters to pass to template. + * Consists of a hash with key as the variable name available in the template. + * @return string The legacy template result + */ + public function renderTemplate( $tplPath, array $params = array() ) + { + $objectConverter = $this->objectConverter; + return $this->getLegacyKernel()->runCallback( + function() use ( $tplPath, $params, $objectConverter ) + { + $tpl = eZTemplate::factory(); + foreach ( $params as $varName => $param ) + { + if ( !is_object( $param ) || $param instanceof LegacyCompatible ) + { + $tpl->setVariable( $varName, $param ); + } + else + { + $objectConverter->register( $param, $varName ); + } + } + + // Get converted objects if any and pass them to the template + foreach ( $objectConverter->convertAll() as $varName => $obj ) + { + $tpl->setVariable( $varName, $obj ); + } + + return $tpl->fetch( $tplPath ); + } + ); + } + + /** + * Returns the legacy kernel object. + * + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + final protected function getLegacyKernel() + { + $closure = $this->legacyKernelClosure; + return $closure(); + } + + public function getTokenParsers() + { + return array( + new LegacyIncludeParser() + ); + } + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + public function getName() + { + return 'ezpublish.legacy'; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Templating/Twig/Node/LegacyIncludeNode.php b/eZ/Publish/Core/MVC/Legacy/Templating/Twig/Node/LegacyIncludeNode.php new file mode 100644 index 0000000..ed67ed1 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Templating/Twig/Node/LegacyIncludeNode.php @@ -0,0 +1,44 @@ + $tplPath, + 'params' => $params + ), + array(), + $lineno, + $tag + ); + } + + public function compile( Twig_Compiler $compiler ) + { + $compiler + ->addDebugInfo( $this ) + ->write( "echo \$this->env->getExtension( 'ezpublish.legacy' )->renderTemplate( " ) + ->subcompile( $this->getNode( 'tplPath' ) ) + ->raw( ', ' ) + ->subcompile( $this->getNode( 'params' ) ) + ->raw( " );\n" ); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Templating/Twig/TokenParser/LegacyIncludeParser.php b/eZ/Publish/Core/MVC/Legacy/Templating/Twig/TokenParser/LegacyIncludeParser.php new file mode 100644 index 0000000..970a6be --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Templating/Twig/TokenParser/LegacyIncludeParser.php @@ -0,0 +1,59 @@ +parser->getExpressionParser(); + $stream = $this->parser->getStream(); + + // Template path is the first token to be parsed + $tplPath = $exprParser->parseExpression(); + + // Parameters + if ( $stream->test( Twig_Token::NAME_TYPE, 'with' ) ) + { + $stream->next(); + $params = $exprParser->parseExpression(); + } + else + { + $params = new Twig_Node_Expression_Array( array(), $token->getLine() ); + } + + $stream->expect( Twig_Token::BLOCK_END_TYPE ); + + return new LegacyIncludeNode( $tplPath, $params, $token->getLine(), $this->getTag() ); + } + + /** + * Gets the tag name associated with this token parser. + * + * @return string The tag name + */ + public function getTag() + { + return 'ez_legacy_include'; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/Tests/LegacyBasedTestCase.php b/eZ/Publish/Core/MVC/Legacy/Tests/LegacyBasedTestCase.php new file mode 100644 index 0000000..a6739ea --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/Tests/LegacyBasedTestCase.php @@ -0,0 +1,31 @@ +legacyKernelClosure = $legacyKernelClosure; + $this->decorator = $decorator; + $this->logger = $logger; + } + + /** + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected function getLegacyKernel() + { + $legacyKernelClosure = $this->legacyKernelClosure; + return $legacyKernelClosure(); + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/View/Provider/Content.php b/eZ/Publish/Core/MVC/Legacy/View/Provider/Content.php new file mode 100644 index 0000000..b9d604c --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/View/Provider/Content.php @@ -0,0 +1,81 @@ +getLegacyKernel(); + $legacyContentClosure = function ( array $params ) use ( $contentInfo, $viewType, $legacyKernel ) + { + return $legacyKernel->runCallback( + function () use ( $contentInfo, $viewType, $params ) + { + $tpl = eZTemplate::factory(); + /** + * @var \eZObjectForwarder + */ + $funcObject = $tpl->fetchFunctionObject( 'content_view_gui' ); + $children = array(); + $params['content_object'] = array( + array( + eZTemplate::TYPE_ARRAY, + // eZTemplate::TYPE_OBJECT does not exist because + // it's not possible to create "inline" objects in + // legacy template engine (ie objects are always + // stored in a tpl variable). + // TYPE_ARRAY is used here to allow to directly + // retrieve the object without creating a variable. + // (TYPE_STRING, TYPE_BOOLEAN, ... have the same + // behaviour, see eZTemplate::elementValue()) + eZContentObject::fetch( $contentInfo->id ) + ) + ); + $params['view'] = array( + array( + eZTemplate::TYPE_STRING, + $viewType + ) + ); + $funcObject->process( + $tpl, $children, 'content_view_gui', false, + $params, array(), '', '' + ); + if ( is_array( $children ) && isset( $children[0] ) ) + { + return $children[0]; + } + return ''; + }, + false + ); + }; + $this->decorator->setContentView( + new ContentView( $legacyContentClosure ) + ); + return $this->decorator; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/View/Provider/Location.php b/eZ/Publish/Core/MVC/Legacy/View/Provider/Location.php new file mode 100644 index 0000000..0c2f8ed --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/View/Provider/Location.php @@ -0,0 +1,91 @@ +request = $request; + } + + /** + * Returns a ContentView object corresponding to $location. + * Will basically run content/view legacy module with appropriate parameters. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $viewType Variation of display for your content. + * + * @return \eZ\Publish\Core\MVC\Symfony\View\ContentView|void + */ + public function getView( APILocation $location, $viewType ) + { + $legacyKernel = $this->getLegacyKernel(); + $logger = $this->logger; + $viewParameters = array(); + if ( isset( $this->request ) ) + $viewParameters = $this->request->attributes->get( 'viewParameters', array() ); + + $legacyContentClosure = function ( array $params ) use ( $location, $viewType, $legacyKernel, $logger, $viewParameters ) + { + // Additional parameters (aka user parameters in legacy) are expected to be scalar + foreach ( $params as $paramName => $param ) + { + if ( !is_scalar( $param ) ) + { + unset( $params[$paramName] ); + if ( isset( $logger ) ) + $logger->notice( + "'$paramName' is not scalar, cannot pass it to legacy content module. Skipping.", + array( __METHOD__ ) + ); + } + } + + // viewbaseLayout is useless in legacy views + unset( $params['viewbaseLayout'] ); + $params += $viewParameters; + + return $legacyKernel->runCallback( + function () use ( $location, $viewType, $params ) + { + $contentViewModule = eZModule::findModule( 'content' ); + $moduleResult = $contentViewModule->run( + 'view', + array( $viewType, $location->id ), + false, + $params + ); + // @todo: What about persistent variable & css/js added from ezjscore ? We ideally want to handle that as well + return $moduleResult['content']; + }, + false + ); + + }; + + $this->decorator->setContentView( + new ContentView( $legacyContentClosure ) + ); + return $this->decorator; + } +} diff --git a/eZ/Publish/Core/MVC/Legacy/View/TwigContentViewLayoutDecorator.php b/eZ/Publish/Core/MVC/Legacy/View/TwigContentViewLayoutDecorator.php new file mode 100644 index 0000000..e5aa144 --- /dev/null +++ b/eZ/Publish/Core/MVC/Legacy/View/TwigContentViewLayoutDecorator.php @@ -0,0 +1,159 @@ +twig = $twig; + $this->options = $options + array( 'contentBlockName' => 'content' ); + } + + /** + * Injects the content view object to decorate. + * + * @param \eZ\Publish\Core\MVC\Symfony\View\ContentView $contentView + */ + public function setContentView( ContentView $contentView ) + { + $this->contentView = $contentView; + } + + /** + * Sets $templateIdentifier to the content view. + * This decorator only supports closures. + * + * Must throw a \eZ\Publish\Core\Base\Exceptions\InvalidArgumentType exception if $templateIdentifier is invalid. + * + * @param \Closure $templateIdentifier + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentType + */ + public function setTemplateIdentifier( $templateIdentifier ) + { + if ( !$templateIdentifier instanceof \Closure ) + throw new InvalidArgumentType( 'templateIdentifier', '\\Closure', $templateIdentifier ); + + $this->contentView->setTemplateIdentifier( $templateIdentifier ); + } + + /** + * Returns the registered template identifier. + * + * @throws \RuntimeException + * + * @return \Closure + */ + public function getTemplateIdentifier() + { + $options = $this->options; + $contentView = $this->contentView; + $twig = $this->twig; + + return function ( array $params ) use ( $options, $contentView, $twig ) + { + $contentViewClosure = $contentView->getTemplateIdentifier(); + $layout = $options['layout']; + if ( isset( $params['noLayout'] ) && $params['noLayout'] ) + { + $layout = $options['viewbaseLayout']; + } + $twigContentTemplate = <<render( + $twigContentTemplate, + array( + 'viewResult' => $contentViewClosure( $params ) + ) + ); + }; + } + + /** + * Sets $parameters that will later be injected to the template/closure. + * If some parameters were already present, $parameters will replace them. + * + * @param array $parameters Hash of parameters + */ + public function setParameters( array $parameters ) + { + $this->contentView->setParameters( $parameters ); + } + + /** + * Adds a hash of parameters to the existing parameters. + * + * @param array $parameters + */ + public function addParameters( array $parameters ) + { + $this->contentView->addParameters( $parameters ); + } + + /** + * Returns registered parameters. + * + * @return array + */ + public function getParameters() + { + return $this->contentView->getParameters(); + } + + /** + * Checks if $parameterName exists. + * + * @param string $parameterName + * + * @return boolean + */ + public function hasParameter( $parameterName ) + { + return $this->contentView->hasParameter( $parameterName ); + } + + /** + * Returns parameter value by $parameterName. + * Throws an \InvalidArgumentException if $parameterName is not set. + * + * @param string $parameterName + * + * @throws \InvalidArgumentException + * + * @return mixed + */ + public function getParameter( $parameterName ) + { + return $this->contentView->getParameter( $parameterName ); + } +} diff --git a/eZ/Publish/Core/MVC/RepositoryAware.php b/eZ/Publish/Core/MVC/RepositoryAware.php new file mode 100644 index 0000000..1973d2b --- /dev/null +++ b/eZ/Publish/Core/MVC/RepositoryAware.php @@ -0,0 +1,28 @@ +repository = $repository; + } +} diff --git a/eZ/Publish/Core/MVC/RepositoryAwareInterface.php b/eZ/Publish/Core/MVC/RepositoryAwareInterface.php new file mode 100644 index 0000000..9f56184 --- /dev/null +++ b/eZ/Publish/Core/MVC/RepositoryAwareInterface.php @@ -0,0 +1,22 @@ +logger = $logger; + $this->setTimeout( $timeout ); + $this->setOption( CURLOPT_NOBODY, true ); + } + + public function send( RequestInterface $request, MessageInterface $response, array $options = array() ) + { + try + { + parent::send( $request, $response, $options ); + } + catch ( \RuntimeException $e ) + { + // Catch but do not do anything as we consider the request to be ~ asynchronous + if ( isset( $this->logger ) ) + { + $this->logger->notice( "An issue occurred while handling HttpCache purge: {$e->getMessage()}." ); + } + } + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Http/InstantCachePurger.php b/eZ/Publish/Core/MVC/Symfony/Cache/Http/InstantCachePurger.php new file mode 100644 index 0000000..6233cbb --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Http/InstantCachePurger.php @@ -0,0 +1,45 @@ +purgeClient = $purgeClient; + } + + /** + * Instantly triggers the cache purge of given $cacheElements. + * + * @param mixed $cacheElements + * + * @return mixed + */ + public function purge( $cacheElements ) + { + $this->purgeClient->purge( $cacheElements ); + + return $cacheElements; + } + + public function purgeAll() + { + $this->purgeClient->purgeAll(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Http/LocalPurgeClient.php b/eZ/Publish/Core/MVC/Symfony/Cache/Http/LocalPurgeClient.php new file mode 100644 index 0000000..ccb78de --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Http/LocalPurgeClient.php @@ -0,0 +1,61 @@ +cacheStore = $cacheStore; + } + + /** + * Triggers the cache purge $cacheElements. + * + * @param mixed $locationIds Cache resource(s) to purge (e.g. array of URI to purge in a reverse proxy) + * + * @return void + */ + public function purge( $locationIds ) + { + if ( empty( $locationIds ) ) + return; + + if ( !is_array( $locationIds ) ) + $locationIds = array( $locationIds ); + + $purgeRequest = Request::create( 'http://localhost/', 'PURGE' ); + $purgeRequest->headers->set( 'X-Group-Location-Id', implode( '; ', $locationIds ) ); + $this->cacheStore->purgeByRequest( $purgeRequest ); + } + + /** + * Purges all content elements currently in cache. + * + * @return void + */ + public function purgeAll() + { + $this->cacheStore->purgeAllContent(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Http/LocationAwareStore.php b/eZ/Publish/Core/MVC/Symfony/Cache/Http/LocationAwareStore.php new file mode 100644 index 0000000..6a5b3fc --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Http/LocationAwareStore.php @@ -0,0 +1,253 @@ +fs = $fs; + } + + /** + * @return \Symfony\Component\Filesystem\Filesystem + */ + public function getFilesystem() + { + if ( !isset( $this->fs ) ) + $this->fs = new Filesystem(); + + return $this->fs; + } + + /** + * Injects eZ Publish specific information in the content digest if needed. + * X-Location-Id response header is set in the ViewController + * + * @see \eZ\Publish\Core\MVC\Symfony\Controller\Content\ViewController::viewLocation() + * + * @param \Symfony\Component\HttpFoundation\Response $response + * + * @return string + */ + protected function generateContentDigest( Response $response ) + { + $digest = parent::generateContentDigest( $response ); + if ( !$response->headers->has( 'X-Location-Id' ) ) + { + return $digest; + } + + return static::LOCATION_CACHE_DIR . "/{$response->headers->get( 'X-Location-Id' )}/$digest"; + } + + /** + * Returns the right path where cache is being stored. + * Will detect if $key is eZ Publish specific. + * + * @param string $key + * + * @return string + */ + public function getPath( $key ) + { + if ( strpos( $key, static::LOCATION_CACHE_DIR ) === false ) + return parent::getPath( $key ); + + $prefix = ''; + if ( ( $pos = strrpos( $key, '/' ) ) !== false ) + { + $prefix = substr( $key, 0, $pos ) . DIRECTORY_SEPARATOR; + $key = substr( $key, $pos + 1 ); + + list( $locationCacheDir, $locationId ) = explode( '/', $prefix ); + // If cache purge is in progress, serve stale cache instead of regular cache. + // We first check for a global cache purge, then for the current location. + foreach ( array( $this->getLocationCacheLockName(), $this->getLocationCacheLockName( $locationId ) ) as $cacheLockFile ) + { + if ( is_file( $cacheLockFile ) ) + { + if ( function_exists( 'posix_kill' ) ) + { + // Check if purge process is still running. If not, remove the lock file to unblock future cache purge + if ( !posix_kill( file_get_contents( $cacheLockFile ), 0 ) ) + { + $fs = $this->getFilesystem(); + $fs->remove( array( $cacheLockFile, $this->getLocationCacheDir( $locationId ) ) ); + goto returnCachePath; + } + } + + $prefix = str_replace( static::LOCATION_CACHE_DIR, static::LOCATION_STALE_CACHE_DIR, $prefix ); + } + } + } + + returnCachePath: + return $this->root . DIRECTORY_SEPARATOR . $prefix . + substr( $key, 0, 2 ) . DIRECTORY_SEPARATOR . + substr( $key, 2, 2 ) . DIRECTORY_SEPARATOR . + substr( $key, 4, 2 ) . DIRECTORY_SEPARATOR . + substr( $key, 6 ); + } + + /** + * Purges data from $request. + * If X-Location-Id or X-Group-Location-Id header is present, the store will purge cache for given locationId or group of locationIds. + * If not, regular purge by URI will occur. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * + * @return boolean True if purge was successful. False otherwise + */ + public function purgeByRequest( Request $request ) + { + if ( !$request->headers->has( 'X-Location-Id' ) && !$request->headers->has( 'X-Group-Location-Id' ) ) + { + return $this->purge( $request->getUri() ); + } + + // Purge everything + if ( $request->headers->get( 'X-Location-Id' ) === '*' ) + { + return $this->purgeAllContent(); + } + + if ( $request->headers->has( 'X-Group-Location-Id' ) ) + $aLocationId = explode( '; ', $request->headers->get( 'X-Group-Location-Id' ) ); + else + $aLocationId = array( $request->headers->get( 'X-Location-Id' ) ); + + if ( empty( $aLocationId ) ) + return false; + + foreach ( $aLocationId as $locationId ) + { + $this->purgeLocation( $locationId ); + } + + return true; + } + + /** + * Purges all cached content + * + * @return boolean + */ + public function purgeAllContent() + { + return $this->purgeLocation( null ); + } + + /** + * Purges cache for $locationId + * + * @param int|null $locationId. If null, all locations will be purged. + * + * @return boolean + */ + private function purgeLocation( $locationId ) + { + $fs = $this->getFilesystem(); + $locationCacheDir = $this->getLocationCacheDir( $locationId ); + if ( $fs->exists( $locationCacheDir ) ) + { + // 1. Copy cache files to stale cache dir + // 2. Place a lock file indicating to use the stale cache + // 3. Remove real cache dir + // 4. Remove lock file + // 5. Remove stale cache dir + // Note that there is no need to remove the meta-file + $staleCacheDir = str_replace( static::LOCATION_CACHE_DIR, static::LOCATION_STALE_CACHE_DIR, $locationCacheDir ); + $fs->mkdir( $staleCacheDir ); + $fs->mirror( $locationCacheDir, $staleCacheDir ); + $lockFile = $this->getLocationCacheLockName( $locationId ); + file_put_contents( $lockFile, getmypid() ); + try + { + // array of removal is in reverse order on purpose since remove() starts from the end. + $fs->remove( array( $staleCacheDir, $lockFile, $locationCacheDir ) ); + return true; + } + catch ( IOException $e ) + { + // Log the error in the standard error log and at least try to remove the lock file + error_log( $e->getMessage() ); + @unlink( $lockFile ); + return false; + } + } + + return false; + } + + /** + * Returns cache lock name for $locationId. + * + * This method is public only for unit tests. + * Use it only if you know what you are doing. + * + * @internal + * + * @param int $locationId. If null, will return a global cache lock name (purging all content) + * + * @return string + */ + public function getLocationCacheLockName( $locationId = null ) + { + $locationId = $locationId ?: 'all'; + return "$this->root/_ezloc_$locationId.purging"; + } + + /** + * Returns cache dir for $locationId. + * + * This method is public only for unit tests. + * Use it only if you know what you are doing. + * + * @internal + * + * @param int $locationId + * + * @return string + */ + public function getLocationCacheDir( $locationId = null ) + { + $cacheDir = "$this->root/" . static::LOCATION_CACHE_DIR; + if ( $locationId ) + $cacheDir .= "/$locationId"; + + return $cacheDir; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Http/PurgeClient.php b/eZ/Publish/Core/MVC/Symfony/Cache/Http/PurgeClient.php new file mode 100644 index 0000000..c610e89 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Http/PurgeClient.php @@ -0,0 +1,105 @@ +httpBrowser = $httpBrowser; + $this->purgeServers = $configResolver->getParameter( 'http_cache.purge_servers' ); + } + + /** + * Triggers the cache purge $cacheElements. + * + * @param mixed $locationIds Cache resource(s) to purge (array of locationId to purge in the reverse proxy) + * + * @return void + */ + public function purge( $locationIds ) + { + if ( empty( $locationIds ) ) + return; + + if ( !is_array( $locationIds ) ) + $locationIds = array( $locationIds ); + + // Purging all HTTP gateways + foreach ( $this->purgeServers as $server ) + { + $this->doPurge( $server, $locationIds ); + + $client = $this->httpBrowser->getClient(); + if ( $client instanceof BatchClientInterface ) + $client->flush(); + } + } + + /** + * Effectively triggers the purge. + * Sends one HTTP PURGE request per location Id. + * Used request header is X-Location-Id. + * + * @param string $server Current purge server (e.g. http://localhost/foo/bar) + * @param array $locationIds Location Ids to purge + * + * @return void + */ + protected function doPurge( $server, array $locationIds ) + { + foreach ( $locationIds as $locationId ) + { + $this->httpBrowser->call( $server, 'PURGE', array( 'X-Location-Id' => $locationId ) ); + } + } + + /** + * Purges all content elements currently in cache. + * + * @return void + */ + public function purgeAll() + { + foreach ( $this->purgeServers as $server ) + { + $this->httpBrowser->call( $server, 'PURGE', array( 'X-Location-Id' => '*' ) ); + + $client = $this->httpBrowser->getClient(); + if ( $client instanceof BatchClientInterface ) + $client->flush(); + } + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Http/PurgeClientSingleRequest.php b/eZ/Publish/Core/MVC/Symfony/Cache/Http/PurgeClientSingleRequest.php new file mode 100644 index 0000000..8d180fe --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Http/PurgeClientSingleRequest.php @@ -0,0 +1,32 @@ +httpBrowser->call( + $server, + 'PURGE', + array( + 'X-Group-Location-Id' => implode( '; ', $locationIds ) + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Http/RequestAwarePurger.php b/eZ/Publish/Core/MVC/Symfony/Cache/Http/RequestAwarePurger.php new file mode 100644 index 0000000..ee98304 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Http/RequestAwarePurger.php @@ -0,0 +1,27 @@ + + */ +class Store implements StoreInterface +{ + protected $root; + private $keyCache; + private $locks; + + /** + * Constructor. + * + * @param string $root The path to the cache directory + */ + public function __construct( $root ) + { + $this->root = $root; + if ( !is_dir( $this->root ) ) + { + mkdir( $this->root, 0777, true ); + } + $this->keyCache = new \SplObjectStorage(); + $this->locks = array(); + } + + /** + * Cleanups storage. + */ + public function cleanup() + { + // unlock everything + foreach ( $this->locks as $lock ) + { + @unlink( $lock ); + } + + $error = error_get_last(); + if ( 1 === $error['type'] && false === headers_sent() ) + { + // send a 503 + header( 'HTTP/1.0 503 Service Unavailable' ); + header( 'Retry-After: 10' ); + echo '503 Service Unavailable'; + } + } + + /** + * Locks the cache for a given Request. + * + * @param Request $request A Request instance + * + * @return Boolean|string true if the lock is acquired, the path to the current lock otherwise + */ + public function lock( Request $request ) + { + if ( false !== $lock = @fopen( $path = $this->getPath( $this->getCacheKey( $request ) . '.lck' ), 'x' ) ) + { + fclose( $lock ); + + $this->locks[] = $path; + + return true; + } + + return $path; + } + + /** + * Releases the lock for the given Request. + * + * @param Request $request A Request instance + */ + public function unlock( Request $request ) + { + return @unlink( $this->getPath( $this->getCacheKey( $request ) . '.lck' ) ); + } + + /** + * Locates a cached Response for the Request provided. + * + * @param Request $request A Request instance + * + * @return Response|null A Response instance, or null if no cache entry was found + */ + public function lookup( Request $request ) + { + $key = $this->getCacheKey( $request ); + + if ( !$entries = $this->getMetadata( $key ) ) + { + return null; + } + + // find a cached entry that matches the request. + $match = null; + foreach ( $entries as $entry ) + { + if ( $this->requestsMatch( isset( $entry[1]['vary'][0] ) ? $entry[1]['vary'][0] : '', $request->headers->all(), $entry[0] ) ) + { + $match = $entry; + break; + } + } + + if ( null === $match ) + { + return null; + } + + list( $req, $headers ) = $match; + if ( is_file( $body = $this->getPath( $headers['x-content-digest'][0] ) ) ) + { + return $this->restoreResponse( $headers, $body ); + } + + // @todo the metaStore referenced an entity that doesn't exist in + // the entityStore. We definitely want to return nil but we should + // also purge the entry from the meta-store when this is detected. + return null; + } + + /** + * Writes a cache entry to the store for the given Request and Response. + * + * Existing entries are read and any that match the response are removed. This + * method calls write with the new list of cache entries. + * + * @param Request $request A Request instance + * @param Response $response A Response instance + * + * @return string The key under which the response is stored + */ + public function write( Request $request, Response $response ) + { + $key = $this->getCacheKey( $request ); + $storedEnv = $this->persistRequest( $request ); + + // write the response body to the entity store if this is the original response + if ( !$response->headers->has( 'X-Content-Digest' ) ) + { + $digest = $this->generateContentDigest( $response ); + + if ( false === $this->save( $digest, $response->getContent() ) ) + { + throw new \RuntimeException( 'Unable to store the entity.' ); + } + + $response->headers->set( 'X-Content-Digest', $digest ); + + if ( !$response->headers->has( 'Transfer-Encoding' ) ) + { + $response->headers->set( 'Content-Length', strlen( $response->getContent() ) ); + } + } + + // read existing cache entries, remove non-varying, and add this one to the list + $entries = array(); + $vary = $response->headers->get( 'vary' ); + foreach ( $this->getMetadata( $key ) as $entry ) + { + if ( !isset( $entry[1]['vary'][0] ) ) + { + $entry[1]['vary'] = array( '' ); + } + + if ( $vary != $entry[1]['vary'][0] || !$this->requestsMatch( $vary, $entry[0], $storedEnv ) ) + { + $entries[] = $entry; + } + } + + $headers = $this->persistResponse( $response ); + unset( $headers['age'] ); + + array_unshift( $entries, array( $storedEnv, $headers ) ); + + if ( false === $this->save( $key, serialize( $entries ) ) ) + { + throw new \RuntimeException( 'Unable to store the metadata.' ); + } + + return $key; + } + + /** + * Returns content digest for $response + * + * @param Response $response + * + * @return string + */ + protected function generateContentDigest( Response $response ) + { + return 'en' . sha1( $response->getContent() ); + } + + /** + * Invalidates all cache entries that match the request. + * + * @param Request $request A Request instance + */ + public function invalidate( Request $request ) + { + $modified = false; + $key = $this->getCacheKey( $request ); + + $entries = array(); + foreach ( $this->getMetadata( $key ) as $entry ) + { + $response = $this->restoreResponse( $entry[1] ); + if ( $response->isFresh() ) + { + $response->expire(); + $modified = true; + $entries[] = array( $entry[0], $this->persistResponse( $response ) ); + } + else + { + $entries[] = $entry; + } + } + + if ( $modified ) + { + if ( false === $this->save( $key, serialize( $entries ) ) ) + { + throw new \RuntimeException( 'Unable to store the metadata.' ); + } + } + + // As per the RFC, invalidate Location and Content-Location URLs if present + foreach ( array( 'Location', 'Content-Location' ) as $header ) + { + if ( $uri = $request->headers->get( $header ) ) + { + $subRequest = Request::create( $uri, 'get', array(), array(), array(), $request->server->all() ); + + $this->invalidate( $subRequest ); + } + } + } + + /** + * Determines whether two Request HTTP header sets are non-varying based on + * the vary response header value provided. + * + * @param string $vary A Response vary header + * @param array $env1 A Request HTTP header array + * @param array $env2 A Request HTTP header array + * + * @return Boolean true if the the two environments match, false otherwise + */ + private function requestsMatch( $vary, $env1, $env2 ) + { + if ( empty( $vary ) ) + { + return true; + } + + foreach ( preg_split( '/[\s,]+/', $vary ) as $header ) + { + $key = strtr( strtolower( $header ), '_', '-' ); + $v1 = isset( $env1[$key] ) ? $env1[$key] : null; + $v2 = isset( $env2[$key] ) ? $env2[$key] : null; + if ( $v1 !== $v2 ) + { + return false; + } + } + + return true; + } + + /** + * Gets all data associated with the given key. + * + * Use this method only if you know what you are doing. + * + * @param string $key The store key + * + * @return array An array of data associated with the key + */ + private function getMetadata( $key ) + { + if ( false === $entries = $this->load( $key ) ) + { + return array(); + } + + return unserialize( $entries ); + } + + /** + * Purges data for the given URL. + * + * @param string $url A URL + * + * @return Boolean true if the URL exists and has been purged, false otherwise + */ + public function purge( $url ) + { + if ( is_file( $path = $this->getPath( $this->getCacheKey( Request::create( $url ) ) ) ) ) + { + unlink( $path ); + + return true; + } + + return false; + } + + /** + * Loads data for the given key. + * + * @param string $key The store key + * + * @return string The data associated with the key + */ + private function load( $key ) + { + $path = $this->getPath( $key ); + + return is_file( $path ) ? file_get_contents( $path ) : false; + } + + /** + * Save data for the given key. + * + * @param string $key The store key + * @param string $data The data to store + */ + private function save( $key, $data ) + { + $path = $this->getPath( $key ); + if ( !is_dir( dirname( $path ) ) && false === @mkdir( dirname( $path ), 0777, true ) ) + { + return false; + } + + $tmpFile = tempnam( dirname( $path ), basename( $path ) ); + if ( false === $fp = @fopen( $tmpFile, 'wb' ) ) + { + return false; + } + @fwrite( $fp, $data ); + @fclose( $fp ); + + if ( $data != file_get_contents( $tmpFile ) ) + { + return false; + } + + if ( false === @rename( $tmpFile, $path ) ) + { + return false; + } + + @chmod( $path, 0666 & ~umask() ); + } + + public function getPath( $key ) + { + return $this->root . DIRECTORY_SEPARATOR . substr( $key, 0, 2 ) . DIRECTORY_SEPARATOR . substr( $key, 2, 2 ) . DIRECTORY_SEPARATOR . substr( $key, 4, 2 ) . DIRECTORY_SEPARATOR . substr( $key, 6 ); + } + + /** + * Returns a cache key for the given Request. + * + * @param Request $request A Request instance + * + * @return string A key for the given Request + */ + private function getCacheKey( Request $request ) + { + if ( isset( $this->keyCache[$request] ) ) + { + return $this->keyCache[$request]; + } + + return $this->keyCache[$request] = 'md' . sha1( $request->getUri() ); + } + + /** + * Persists the Request HTTP headers. + * + * @param Request $request A Request instance + * + * @return array An array of HTTP headers + */ + private function persistRequest( Request $request ) + { + return $request->headers->all(); + } + + /** + * Persists the Response HTTP headers. + * + * @param Response $response A Response instance + * + * @return array An array of HTTP headers + */ + private function persistResponse( Response $response ) + { + $headers = $response->headers->all(); + $headers['X-Status'] = array( $response->getStatusCode() ); + + return $headers; + } + + /** + * Restores a Response from the HTTP headers and body. + * + * @param array $headers An array of HTTP headers for the Response + * @param string $body The Response body + */ + private function restoreResponse( $headers, $body = null ) + { + $status = $headers['X-Status'][0]; + unset( $headers['X-Status'] ); + + if ( null !== $body ) + { + $headers['X-Body-File'] = array( $body ); + } + + return new Response( $body, $status, $headers ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/PurgeClientInterface.php b/eZ/Publish/Core/MVC/Symfony/Cache/PurgeClientInterface.php new file mode 100644 index 0000000..1ba0fb6 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/PurgeClientInterface.php @@ -0,0 +1,29 @@ +httpClient = $this->getMock( 'Buzz\\Client\\BatchClientInterface' ); + $this->httpBrowser = $this + ->getMockBuilder( 'Buzz\\Browser' ) + ->setConstructorArgs( array( $this->httpClient ) ) + ->getMock(); + $this->httpBrowser + ->expects( $this->any() ) + ->method( 'getClient' ) + ->will( $this->returnValue( $this->httpClient ) ); + + $this->configResolver = $this->getMock( 'eZ\\Publish\\Core\\MVC\\ConfigResolverInterface' ); + } + + abstract public function testPurge(); +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/InstantCachePurgerTest.php b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/InstantCachePurgerTest.php new file mode 100644 index 0000000..a9f7a52 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/InstantCachePurgerTest.php @@ -0,0 +1,55 @@ +purgeClient = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\Cache\\PurgeClientInterface' ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\InstantCachePurger::purge + */ + public function testPurge() + { + $locationIds = array( 123, 456, 789 ); + $this->purgeClient + ->expects( $this->once() ) + ->method( 'purge' ) + ->with( $locationIds ) + ->will( $this->returnArgument( 0 ) ); + + $purger = new InstantCachePurger( $this->purgeClient ); + $this->assertSame( $locationIds, $purger->purge( $locationIds ) ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\InstantCachePurger::purgeAll + */ + public function testPurgeAll() + { + $this->purgeClient + ->expects( $this->once() ) + ->method( 'purgeAll' ); + + $purger = new InstantCachePurger( $this->purgeClient ); + $purger->purgeAll(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/LocalPurgeClientTest.php b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/LocalPurgeClientTest.php new file mode 100644 index 0000000..a1bd975 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/LocalPurgeClientTest.php @@ -0,0 +1,46 @@ +getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\Cache\\Http\\ContentPurger' ); + $cacheStore + ->expects( $this->once() ) + ->method( 'purgeByRequest' ) + ->with( $this->isInstanceOf( 'Symfony\\Component\\HttpFoundation\\Request' ) ); + + $purgeClient = new LocalPurgeClient( $cacheStore ); + $purgeClient->purge( array( 123, 456, 789 ) ); + } + + /** + * @covers eZ\Publish\Core\MVC\Symfony\Cache\Http\LocalPurgeClient::__construct + * @covers eZ\Publish\Core\MVC\Symfony\Cache\Http\LocalPurgeClient::purgeAll + */ + public function testPurgeAll() + { + $cacheStore = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\Cache\\Http\\ContentPurger' ); + $cacheStore + ->expects( $this->once() ) + ->method( 'purgeAllContent' ); + + $purgeClient = new LocalPurgeClient( $cacheStore ); + $purgeClient->purgeAll(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/LocationAwareStoreTest.php b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/LocationAwareStoreTest.php new file mode 100644 index 0000000..108f5ac --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/LocationAwareStoreTest.php @@ -0,0 +1,257 @@ +store = new LocationAwareStore( __DIR__ ); + } + + protected function tearDown() + { + array_map( 'unlink', glob( __DIR__ . '/*.purging' ) ); + parent::tearDown(); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getFilesystem + */ + public function testGetFilesystem() + { + $this->assertInstanceOf( 'Symfony\\Component\\Filesystem\\Filesystem', $this->store->getFilesystem() ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::setFilesystem + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getFilesystem + */ + public function testSetFilesystem() + { + $fs = new Filesystem(); + $this->store->setFilesystem( $fs ); + $this->assertSame( $fs, $this->store->getFilesystem() ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getPath + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + */ + public function testGetPath() + { + $prefix = LocationAwareStore::LOCATION_CACHE_DIR . '/123/'; + $path = $this->store->getPath( "$prefix/en" . sha1( 'someContent' ) ); + $this->assertTrue( strpos( $path, __DIR__ . "/$prefix" ) === 0 ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getPath + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + */ + public function testGetStalePath() + { + // Generate the lock file to force using the stale cache dir + $locationId = 123; + $prefix = LocationAwareStore::LOCATION_CACHE_DIR . "/$locationId"; + $prefixStale = LocationAwareStore::LOCATION_STALE_CACHE_DIR . "/$locationId"; + $lockFile = $this->store->getLocationCacheLockName( $locationId ); + file_put_contents( $lockFile, getmypid() ); + + $path = $this->store->getPath( "$prefix/en" . sha1( 'someContent' ) ); + $this->assertTrue( strpos( $path, __DIR__ . "/$prefixStale" ) === 0 ); + @unlink( $lockFile ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getPath + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + */ + public function testGetPathDeadProcess() + { + if ( !function_exists( 'posix_kill' ) ) + self::markTestSkipped( 'posix_kill() function is needed for this test' ); + + $locationId = 123; + $prefix = LocationAwareStore::LOCATION_CACHE_DIR . "/$locationId"; + $lockFile = $this->store->getLocationCacheLockName( $locationId ); + file_put_contents( $lockFile, '99999999999999999' ); + + $path = $this->store->getPath( "$prefix/en" . sha1( 'someContent' ) ); + $this->assertTrue( strpos( $path, __DIR__ . "/$prefix" ) === 0 ); + $this->assertFalse( file_exists( $lockFile ) ); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function getFilesystemMock() + { + return $this->getMock( 'Symfony\\Component\\Filesystem\\Filesystem' ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeByRequest + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeLocation + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheDir + */ + public function testPurgeByRequestSingleLocation() + { + $fs = $this->getFilesystemMock(); + $this->store->setFilesystem( $fs ); + $locationId = 123; + $locationCacheDir = $this->store->getLocationCacheDir( $locationId ); + $staleCacheDir = str_replace( LocationAwareStore::LOCATION_CACHE_DIR, LocationAwareStore::LOCATION_STALE_CACHE_DIR, $locationCacheDir ); + + $fs + ->expects( $this->any() ) + ->method( 'exists' ) + ->with( $locationCacheDir ) + ->will( $this->returnValue( true ) ); + $fs + ->expects( $this->once() ) + ->method( 'mkdir' ) + ->with( $staleCacheDir ); + $fs + ->expects( $this->once() ) + ->method( 'mirror' ) + ->with( $locationCacheDir, $staleCacheDir ); + $fs + ->expects( $this->once() ) + ->method( 'remove' ) + ->with( array( $staleCacheDir, $this->store->getLocationCacheLockName( $locationId ), $locationCacheDir ) ); + + $request = Request::create( '/', 'PURGE' ); + $request->headers->set( 'X-Location-Id', $locationId ); + $this->store->purgeByRequest( $request ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeByRequest + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeLocation + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheDir + */ + public function testPurgeByRequestMultipleLocations() + { + $fs = $this->getFilesystemMock(); + $this->store->setFilesystem( $fs ); + $locationIds = array( 123, 456, 789 ); + $i = 0; + foreach ( $locationIds as $locationId ) + { + $locationCacheDir = $this->store->getLocationCacheDir( $locationId ); + $staleCacheDir = str_replace( LocationAwareStore::LOCATION_CACHE_DIR, LocationAwareStore::LOCATION_STALE_CACHE_DIR, $locationCacheDir ); + + $fs + ->expects( $this->at( $i++ ) ) + ->method( 'exists' ) + ->with( $locationCacheDir ) + ->will( $this->returnValue( true ) ); + $fs + ->expects( $this->at( $i++ ) ) + ->method( 'mkdir' ) + ->with( $staleCacheDir ); + $fs + ->expects( $this->at( $i++ ) ) + ->method( 'mirror' ) + ->with( $locationCacheDir, $staleCacheDir ); + $fs + ->expects( $this->at( $i++ ) ) + ->method( 'remove' ) + ->with( array( $staleCacheDir, $this->store->getLocationCacheLockName( $locationId ), $locationCacheDir ) ); + } + + $request = Request::create( '/', 'PURGE' ); + $request->headers->set( 'X-Group-Location-Id', implode( '; ', $locationIds ) ); + $this->store->purgeByRequest( $request ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeAllContent + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeLocation + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheDir + */ + public function testPurgeAllContent() + { + $fs = $this->getFilesystemMock(); + $this->store->setFilesystem( $fs ); + $locationCacheDir = $this->store->getLocationCacheDir(); + $staleCacheDir = str_replace( LocationAwareStore::LOCATION_CACHE_DIR, LocationAwareStore::LOCATION_STALE_CACHE_DIR, $locationCacheDir ); + + $fs + ->expects( $this->any() ) + ->method( 'exists' ) + ->with( $locationCacheDir ) + ->will( $this->returnValue( true ) ); + $fs + ->expects( $this->once() ) + ->method( 'mkdir' ) + ->with( $staleCacheDir ); + $fs + ->expects( $this->once() ) + ->method( 'mirror' ) + ->with( $locationCacheDir, $staleCacheDir ); + $fs + ->expects( $this->once() ) + ->method( 'remove' ) + ->with( array( $staleCacheDir, $this->store->getLocationCacheLockName(), $locationCacheDir ) ); + + $this->store->purgeAllContent(); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeByRequest + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::purgeLocation + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheLockName + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\LocationAwareStore::getLocationCacheDir + */ + public function testPurgeAllContentByRequest() + { + $fs = $this->getFilesystemMock(); + $this->store->setFilesystem( $fs ); + $locationCacheDir = $this->store->getLocationCacheDir(); + $staleCacheDir = str_replace( LocationAwareStore::LOCATION_CACHE_DIR, LocationAwareStore::LOCATION_STALE_CACHE_DIR, $locationCacheDir ); + + $fs + ->expects( $this->any() ) + ->method( 'exists' ) + ->with( $locationCacheDir ) + ->will( $this->returnValue( true ) ); + $fs + ->expects( $this->once() ) + ->method( 'mkdir' ) + ->with( $staleCacheDir ); + $fs + ->expects( $this->once() ) + ->method( 'mirror' ) + ->with( $locationCacheDir, $staleCacheDir ); + $fs + ->expects( $this->once() ) + ->method( 'remove' ) + ->with( array( $staleCacheDir, $this->store->getLocationCacheLockName(), $locationCacheDir ) ); + + $request = Request::create( '/', 'PURGE' ); + $request->headers->set( 'X-Location-Id', '*' ); + $this->store->purgeByRequest( $request ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/PurgeClientSingleRequestTest.php b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/PurgeClientSingleRequestTest.php new file mode 100644 index 0000000..f4b8c67 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/PurgeClientSingleRequestTest.php @@ -0,0 +1,38 @@ +configResolver + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( 'http_cache.purge_servers' ) + ->will( $this->returnValue( array( $purgeServer ) ) ); + + $locations = array( 123, 456, 789 ); + + $this->httpBrowser + ->expects( $this->once() ) + ->method( 'call' ) + ->with( $purgeServer, 'PURGE', array( 'X-Group-Location-Id' => implode( '; ', $locations ) ) ); + + $purgeClient = new PurgeClientSingleRequest( $this->configResolver, $this->httpBrowser ); + $purgeClient->purge( $locations ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/PurgeClientTest.php b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/PurgeClientTest.php new file mode 100644 index 0000000..d020388 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Cache/Tests/Http/PurgeClientTest.php @@ -0,0 +1,72 @@ +configResolver + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( 'http_cache.purge_servers' ) + ->will( $this->returnValue( array( $purgeServer ) ) ); + + $locations = array( 123, 456, 789 ); + + $this->httpBrowser + ->expects( $this->at( 0 ) ) + ->method( 'call' ) + ->with( $purgeServer, 'PURGE', array( 'X-Location-Id' => $locations[0] ) ); + $this->httpBrowser + ->expects( $this->at( 1 ) ) + ->method( 'call' ) + ->with( $purgeServer, 'PURGE', array( 'X-Location-Id' => $locations[1] ) ); + $this->httpBrowser + ->expects( $this->at( 2 ) ) + ->method( 'call' ) + ->with( $purgeServer, 'PURGE', array( 'X-Location-Id' => $locations[2] ) ); + $this->httpClient + ->expects( $this->once() ) + ->method( 'flush' ); + + $purgeClient = new PurgeClient( $this->configResolver, $this->httpBrowser ); + $purgeClient->purge( $locations ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\PurgeClient::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\Cache\Http\PurgeClient::purge + */ + public function testPurgeAll() + { + $purgeServer = 'http://localhost/'; + $this->configResolver + ->expects( $this->once() ) + ->method( 'getParameter' ) + ->with( 'http_cache.purge_servers' ) + ->will( $this->returnValue( array( $purgeServer ) ) ); + + $this->httpBrowser + ->expects( $this->once() ) + ->method( 'call' ) + ->with( $purgeServer, 'PURGE', array( 'X-Location-Id' => '*' ) ); + + $purgeClient = new PurgeClient( $this->configResolver, $this->httpBrowser ); + $purgeClient->purgeAll(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/ConfigDumperInterface.php b/eZ/Publish/Core/MVC/Symfony/ConfigDumperInterface.php new file mode 100644 index 0000000..e9558cf --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/ConfigDumperInterface.php @@ -0,0 +1,30 @@ +getParameter( 'var_dir' ) . '/' . $resolver->getParameter( 'storage_dir' ) . '/' . $resolver->getParameter( 'binary_dir' ) + ); + } +} + diff --git a/eZ/Publish/Core/MVC/Symfony/Controller/Content/ViewController.php b/eZ/Publish/Core/MVC/Symfony/Controller/Content/ViewController.php new file mode 100644 index 0000000..f3452b9 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Controller/Content/ViewController.php @@ -0,0 +1,210 @@ +viewManager = $viewManager; + } + + /** + * Build the response so that depending on settings it's cacheable + * + * @param string $etag + * @param \DateTime $lastModified + * + * @return \Symfony\Component\HttpFoundation\Response + */ + protected function buildResponse( $etag, DateTime $lastModified ) + { + $request = $this->getRequest(); + $response = new Response(); + if ( $this->getParameter( 'content.view_cache' ) === true ) + { + $response->setPublic(); + $response->setEtag( $etag ); + + // If-None-Match is the request counterpart of Etag response header + // Making the response to vary against it ensures that an HTTP + // reverse proxy caches the different possible variations of the + // response as it can depend on user role for instance. + if ( $request->headers->has( 'If-None-Match' ) + && $this->getParameter( 'content.ttl_cache' ) === true ) + { + $response->setVary( 'If-None-Match' ); + $response->setSharedMaxAge( + $this->getParameter( 'content.default_ttl' ) + ); + } + + $response->setLastModified( $lastModified ); + } + return $response; + } + + /** + * Main action for viewing content through a location in the repository. + * Response will be cached with HttpCache validation model (Etag) + * + * @param int $locationId + * @param string $viewType + * @param boolean $layout + * + * @throws \Symfony\Component\Security\Core\Exception\AccessDeniedException + * @throws \Exception + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function viewLocation( $locationId, $viewType, $layout = false ) + { + if ( !$this->isGranted( new AuthorizationAttribute( 'content', 'read' ) ) ) + throw new AccessDeniedException(); + + try + { + // Assume that location is cached by the repository + $location = $this->getRepository()->getLocationService()->loadLocation( $locationId ); + $contentInfo = $location->getContentInfo(); + + // @todo: Use a dedicated etag generator, generating a hash + // instead of plain text + $response = $this->buildResponse( + "ezpublish-location-$locationId-$contentInfo->currentVersionNo-$viewType-$layout", + $contentInfo->modificationDate + ); + $response->headers->set( 'X-Location-Id', $locationId ); + + if ( $response->isNotModified( $this->getRequest() ) ) + { + return $response; + } + + $response->setContent( + $this->viewManager->renderLocation( + $location, + $viewType, + array( 'noLayout' => !$layout ) + ) + ); + + return $response; + } + catch ( \Exception $e ) + { + $event = new APIContentExceptionEvent( + $e, + array( + 'contentId' => null, + 'locationId' => $locationId, + 'viewType' => $viewType + ) + ); + $this->getEventDispatcher()->dispatch( MVCEvents::API_CONTENT_EXCEPTION, $event ); + if ( $event->hasContentView() ) + { + $response->setContent( + $this->viewManager->renderContentView( + $event->getContentView() + ) + ); + + return $response; + } + + throw $e; + } + } + + /** + * Main action for viewing content. + * Response will be cached with HttpCache validation model (Etag) + * + * @param int $contentId + * @param string $viewType + * @param boolean $layout + * + * @throws \Symfony\Component\Security\Core\Exception\AccessDeniedException + * @throws \Exception + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function viewContent( $contentId, $viewType, $layout = false ) + { + if ( !$this->isGranted( new AuthorizationAttribute( 'content', 'read' ) ) ) + throw new AccessDeniedException(); + + try + { + $content = $this->getRepository()->getContentService()->loadContent( $contentId ); + + // @todo: Use a dedicated etag generator, generating a hash + // instead of plain text + $response = $this->buildResponse( + "ezpublish-content-$contentId-$viewType-$layout", + $content->contentInfo->modificationDate + ); + + if ( $response->isNotModified( $this->getRequest() ) ) + { + return $response; + } + + $response->setContent( + $this->viewManager->renderContent( + $content, + $viewType, + array( 'noLayout' => !$layout ) + ) + ); + + return $response; + } + catch ( \Exception $e ) + { + $event = new APIContentExceptionEvent( + $e, + array( + 'contentId' => $contentId, + 'locationId' => null, + 'viewType' => $viewType + ) + ); + $this->getEventDispatcher()->dispatch( MVCEvents::API_CONTENT_EXCEPTION, $event ); + if ( $event->hasContentView() ) + { + $response->setContent( + $this->viewManager->renderContentView( + $event->getContentView() + ) + ); + + return $response; + } + + throw $e; + } + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Controller/Controller.php b/eZ/Publish/Core/MVC/Symfony/Controller/Controller.php new file mode 100644 index 0000000..c6f0d1e --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Controller/Controller.php @@ -0,0 +1,126 @@ +getConfigResolver()->hasParameter( $parameterName ) ) + return $this->getConfigResolver()->getParameter( $parameterName ); + + return $defaultValue; + } + + /** + * Checks if $parameterName is defined + * + * @param string $parameterName + * + * @return boolean + */ + public function hasParameter( $parameterName ) + { + return $this->getConfigResolver()->hasParameter( $parameterName ); + } + + /** + * @return \eZ\Publish\Core\MVC\ConfigResolverInterface + */ + public function getConfigResolver() + { + return $this->container->get( 'ezpublish.config.resolver' ); + } + + /** + * Renders a view. + * + * @param string $view The view name + * @param array $parameters An array of parameters to pass to the view + * @param \Symfony\Component\HttpFoundation\Response $response + * + * @return \Symfony\Component\HttpFoundation\Response + */ + public function render( $view, array $parameters = array(), Response $response = null ) + { + if ( !isset( $response ) ) + { + $response = new Response(); + } + + $response->setContent( $this->getTemplateEngine()->render( $view, $parameters ) ); + return $response; + } + + /** + * @return \Symfony\Component\Templating\EngineInterface + */ + public function getTemplateEngine() + { + return $this->container->get( 'templating' ); + } + + /** + * @return \Symfony\Component\HttpKernel\Log\LoggerInterface|null + */ + public function getLogger() + { + return $this->container->get( 'logger', ContainerInterface::NULL_ON_INVALID_REFERENCE ); + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + public function getRepository() + { + return $this->container->get( 'ezpublish.api.repository' ); + } + + /** + * @return \Symfony\Component\HttpFoundation\Request + */ + public function getRequest() + { + return $this->container->get( 'request' ); + } + + /** + * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface + */ + public function getEventDispatcher() + { + return $this->container->get( 'event_dispatcher' ); + } + + /** + * Checks if current user has granted access to provided attribute + * + * @param \eZ\Publish\Core\MVC\Symfony\Security\Authorization\Attribute $attribute + * + * @return boolean + */ + public function isGranted( AuthorizationAttribute $attribute ) + { + return $this->container->get( 'security.context' )->isGranted( $attribute ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Controller/Tests/ControllerTest.php b/eZ/Publish/Core/MVC/Symfony/Controller/Tests/ControllerTest.php new file mode 100644 index 0000000..bac7e31 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Controller/Tests/ControllerTest.php @@ -0,0 +1,79 @@ +templateEngineMock = $this->getMock( 'Symfony\\Component\\Templating\\EngineInterface' ); + $this->containerMock = $this->getMock( 'Symfony\\Component\\DependencyInjection\\ContainerInterface' ); + $this->controller = $this->getMockForAbstractClass( 'eZ\\Publish\\Core\\MVC\\Symfony\\Controller\\Controller' ); + $this->controller->setContainer( $this->containerMock ); + $this->containerMock + ->expects( $this->any() ) + ->method( 'get' ) + ->with( 'templating' ) + ->will( $this->returnValue( $this->templateEngineMock ) ); + } + /** + * @covers \eZ\Publish\Core\MVC\Symfony\Controller\Controller::render + */ + public function testRender() + { + $view = 'some:valid:view.html.twig'; + $params = array( 'foo' => 'bar', 'truc' => 'muche' ); + $tplResult = "I'm a template result"; + $this->templateEngineMock + ->expects( $this->once() ) + ->method( 'render' ) + ->with( $view, $params ) + ->will( $this->returnValue( $tplResult ) ); + $response = $this->controller->render( $view, $params ); + self::assertInstanceOf( 'Symfony\\Component\\HttpFoundation\\Response', $response ); + self::assertSame( $tplResult, $response->getContent() ); + } + + public function testRenderWithResponse() + { + $response = new Response(); + $view = 'some:valid:view.html.twig'; + $params = array( 'foo' => 'bar', 'truc' => 'muche' ); + $tplResult = "I'm a template result"; + $this->templateEngineMock + ->expects( $this->once() ) + ->method( 'render' ) + ->with( $view, $params ) + ->will( $this->returnValue( $tplResult ) ); + + self::assertSame( $response, $this->controller->render( $view, $params, $response ) ); + self::assertSame( $tplResult, $response->getContent() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Event/APIContentExceptionEvent.php b/eZ/Publish/Core/MVC/Symfony/Event/APIContentExceptionEvent.php new file mode 100644 index 0000000..6d00209 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Event/APIContentExceptionEvent.php @@ -0,0 +1,91 @@ +apiException = $apiException; + $this->contentMeta = $contentMeta; + } + + /** + * @return \Exception + */ + public function getApiException() + { + return $this->apiException; + } + + /** + * Injects the ContentView object to display content from. + * It is a good idea to call {@link stopPropagation()} after that so that other listeners won't override it. + * + * @param \eZ\Publish\Core\MVC\Symfony\View\ContentViewInterface $contentView + */ + public function setContentView( ContentViewInterface $contentView ) + { + $this->contentView = $contentView; + } + + /** + * @return \eZ\Publish\Core\MVC\Symfony\View\ContentView + */ + public function getContentView() + { + return $this->contentView; + } + + /** + * @return boolean + */ + public function hasContentView() + { + return isset( $this->contentView ); + } + + /** + * Returns an array of metadata concerning the content that failed to load through API. + * This array includes: + * - contentId Content Id when applicable (not available if a location was looked up) + * - locationId Location Id when applicable (not available if a content was looked up) + * - viewType full/line/... + * + * @return array + */ + public function getContentMeta() + { + return $this->contentMeta; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Event/PostSiteAccessMatchEvent.php b/eZ/Publish/Core/MVC/Symfony/Event/PostSiteAccessMatchEvent.php new file mode 100644 index 0000000..02ac525 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Event/PostSiteAccessMatchEvent.php @@ -0,0 +1,54 @@ +siteAccess = $siteAccess; + $this->request = $request; + } + + /** + * @return \Symfony\Component\HttpFoundation\Request + */ + public function getRequest() + { + return $this->request; + } + + /** + * Returns matched SiteAccess instance + * + * @return \eZ\Publish\Core\MVC\Symfony\SiteAccess + */ + public function getSiteAccess() + { + return $this->siteAccess; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Event/PreContentViewEvent.php b/eZ/Publish/Core/MVC/Symfony/Event/PreContentViewEvent.php new file mode 100644 index 0000000..57d694c --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Event/PreContentViewEvent.php @@ -0,0 +1,57 @@ + + * $contentView = $event->getContentView(); + * // Returns the location when applicable (viewing a location basically) + * if ( $contentView->hasParameter( 'location' ) ) + * $location = $contentView->getParameter( 'location' ); + * + * // Content is always available. + * $content = $contentView->getParameter( 'content' ); + * + * // Set your own variables that will be exposed in the template + * // The following will expose "foo" and "complex" variables in the view template. + * $contentView->addParameters( + * array( + * 'foo' => 'bar', + * 'complex' => $someObject + * ) + * ); + * + */ +class PreContentViewEvent extends Event +{ + /** + * @var \eZ\Publish\Core\MVC\Symfony\View\ContentView + */ + private $contentView; + + public function __construct( ContentViewInterface $contentView ) + { + $this->contentView = $contentView; + } + + /** + * @return \eZ\Publish\Core\MVC\Symfony\View\ContentView + */ + public function getContentView() + { + return $this->contentView; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/EventListener/SiteAccessMatchListener.php b/eZ/Publish/Core/MVC/Symfony/EventListener/SiteAccessMatchListener.php new file mode 100644 index 0000000..810d1c9 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/EventListener/SiteAccessMatchListener.php @@ -0,0 +1,76 @@ +siteAccessRouter = $siteAccessRouter; + $this->eventDispatcher = $eventDispatcher; + } + + /** + * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event + */ + public function onKernelRequest( GetResponseEvent $event ) + { + $request = $event->getRequest(); + + if ( !$request->attributes->has( 'siteaccess' ) ) + { + $request->attributes->set( + 'siteaccess', + $this->siteAccessRouter->match( + new SimplifiedRequest( + array( + 'scheme' => $request->getScheme(), + 'host' => $request->getHost(), + 'port' => $request->getPort(), + 'pathinfo' => $request->getPathInfo(), + 'queryParams' => $request->query->all(), + 'languages' => $request->getLanguages(), + 'headers' => $request->headers->all() + ) + ) + ) + ); + } + + $siteaccess = $request->attributes->get( 'siteaccess' ); + if ( $siteaccess instanceof SiteAccess ) + { + $siteAccessEvent = new PostSiteAccessMatchEvent( $siteaccess, $request ); + $this->eventDispatcher->dispatch( MVCEvents::SITEACCESS, $siteAccessEvent ); + } + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/File/ConfiguredLocalImageService.php b/eZ/Publish/Core/MVC/Symfony/File/ConfiguredLocalImageService.php new file mode 100644 index 0000000..44430c5 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/File/ConfiguredLocalImageService.php @@ -0,0 +1,28 @@ +getParameter( 'var_dir' ) . '/' . $resolver->getParameter( 'storage_dir' ) . '/images' + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/MVCEvents.php b/eZ/Publish/Core/MVC/Symfony/MVCEvents.php new file mode 100644 index 0000000..808364d --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/MVCEvents.php @@ -0,0 +1,39 @@ +requestContext = $requestContext; + } + + /** + * Triggers URL generation for $urlResource and $parameters. + * + * @param mixed $urlResource Type can be anything, depending on the context. It's up to the router to pass the appropriate value to the implementor. + * @param array $parameters + * @param boolean $absolute + * + * @return string + */ + public function generate( $urlResource, array $parameters, $absolute = false ) + { + $url = $this->requestContext->getBaseUrl() . $this->doGenerate( $urlResource, $parameters ); + if ( $absolute ) + { + $url = $this->generateAbsoluteUrl( $url ); + } + + return $url; + } + + /** + * Generates the URL from $urlResource and $parameters. + * + * @param mixed $urlResource + * @param array $parameters + * + * @return string + */ + abstract public function doGenerate( $urlResource, array $parameters ); + + /** + * Generates an absolute URL from $uri and the request context + * + * @param string $uri + * + * @return string + */ + protected function generateAbsoluteUrl( $uri ) + { + $scheme = $this->requestContext->getScheme(); + $port = ''; + if ( $scheme === 'http' && $this->requestContext->getHttpPort() != 80 ) + { + $port = ':' . $this->requestContext->getHttpPort(); + } + else if ( $scheme === 'https' && $this->requestContext->getHttpsPort() != 443 ) + { + $port = ':' . $this->requestContext->getHttpsPort(); + } + + return $scheme . '://' . $this->requestContext->getHost() . $port . $uri; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Routing/Generator/UrlAliasGenerator.php b/eZ/Publish/Core/MVC/Symfony/Routing/Generator/UrlAliasGenerator.php new file mode 100644 index 0000000..647abb7 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Routing/Generator/UrlAliasGenerator.php @@ -0,0 +1,75 @@ +lazyRepository = $lazyRepository; + $this->router = $router; + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + $lazyRepository = $this->lazyRepository; + return $lazyRepository(); + } + + /** + * Generates the URL from $urlResource and $parameters. + * Entries in $parameters will be added in the query string. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param array $parameters + * + * @return string + */ + public function doGenerate( $location, array $parameters ) + { + $urlAliases = $this->getRepository()->getURLAliasService()->listLocationAliases( $location, false ); + + $queryString = ''; + if ( !empty( $parameters ) ) + { + $queryString = '?' . http_build_query( $parameters, '', '&' ); + } + + if ( !empty( $urlAliases ) ) + $path = $urlAliases[0]->path; + else + $path = $this->router->generate( + self::INTERNAL_LOCATION_ROUTE, + array( 'locationId' => $location->id ) + ); + + return $path . $queryString; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Routing/SimplifiedRequest.php b/eZ/Publish/Core/MVC/Symfony/Routing/SimplifiedRequest.php new file mode 100644 index 0000000..ff4cc08 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Routing/SimplifiedRequest.php @@ -0,0 +1,100 @@ + 'http', + 'host' => 'www.example.com', + 'pathinfo' => '/foo/bar' + ) + ) + ), + array( + 'https://www.example.com/', + new SimplifiedRequest( + array( + 'scheme' => 'https', + 'host' => 'www.example.com', + 'pathinfo' => '/' + ) + ) + ), + array( + 'http://www.example.com/foo?param=value&this=that', + new SimplifiedRequest( + array( + 'scheme' => 'http', + 'host' => 'www.example.com', + 'pathinfo' => '/foo', + 'queryParams' => array( 'param' => 'value', 'this' => 'that' ) + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Routing/UrlAliasRouter.php b/eZ/Publish/Core/MVC/Symfony/Routing/UrlAliasRouter.php new file mode 100644 index 0000000..87e605e --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Routing/UrlAliasRouter.php @@ -0,0 +1,255 @@ +lazyRepository = $lazyRepository; + $this->generator = $generator; + $this->requestContext = isset( $requestContext ) ? $requestContext : new RequestContext(); + $this->logger = $logger; + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + $lazyRepository = $this->lazyRepository; + return $lazyRepository(); + } + + /** + * Tries to match a request with a set of routes. + * + * If the matcher can not find information, it must throw one of the exceptions documented + * below. + * + * @param Request $request The request to match + * + * @return array An array of parameters + * + * @throws \Symfony\Component\Routing\Exception\ResourceNotFoundException If no matching resource could be found + * @throws MethodNotAllowedException If a matching resource was found but the request method is not allowed + */ + public function matchRequest( Request $request ) + { + try + { + $urlAlias = $this->getRepository()->getURLAliasService()->lookup( + $request->attributes->get( + 'semanticPathinfo', + $request->getPathInfo() + ) + ); + + $params = array( + '_route' => self::URL_ALIAS_ROUTE_NAME + ); + switch ( $urlAlias->type ) + { + case UrlAlias::LOCATION: + $params += array( + '_controller' => 'ezpublish.controller.content.view:viewLocation', + 'locationId' => $urlAlias->destination, + 'viewType' => ViewManager::VIEW_TYPE_FULL, + 'layout' => true, + ); + + $request->attributes->set( 'locationId', $urlAlias->destination ); + + if ( isset( $this->logger ) ) + $this->logger->info( "UrlAlias matched location #{$urlAlias->destination}. Forwarding to ViewController" ); + + break; + + case UrlAlias::RESOURCE: + case UrlAlias::VIRTUAL: + $request->attributes->set( 'semanticPathinfo', "/$urlAlias->destination" ); + // In URLAlias terms, "forward" means "redirect". + if ( $urlAlias->forward ) + $request->attributes->set( 'needsRedirect', true ); + else + $request->attributes->set( 'needsForward', true ); + break; + } + + return $params; + } + catch ( NotFoundException $e ) + { + throw new ResourceNotFoundException( $e->getMessage(), $e->getCode(), $e ); + } + } + + /** + * Gets the RouteCollection instance associated with this Router. + * + * @return RouteCollection A RouteCollection instance + */ + public function getRouteCollection() + { + return new RouteCollection(); + } + + /** + * Generates a URL for a location, from the given parameters. + * + * It is possible to directly pass a Location object as the route name, as the ChainRouter allows it through ChainedRouterInterface. + * + * If $name is a route name, the "location" key in $parameters must be set to a valid eZ\Publish\API\Repository\Values\Content\Location object. + * "locationId" can also be provided. + * + * If the generator is not able to generate the url, it must throw the RouteNotFoundException + * as documented below. + * + * @see UrlAliasRouter::supports() + * + * @param string|\eZ\Publish\API\Repository\Values\Content\Location $name The name of the route or a Location instance + * @param mixed $parameters An array of parameters + * @param boolean $absolute Whether to generate an absolute URL + * + * @throws \LogicException + * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException + * @throws \InvalidArgumentException + * + * @return string The generated URL + * + * @api + */ + public function generate( $name, $parameters = array(), $absolute = false ) + { + // Direct access to Location + if ( $name instanceof Location ) + { + return $this->generator->generate( $name, $parameters, $absolute ); + } + + // Normal route name + if ( $name === self::URL_ALIAS_ROUTE_NAME ) + { + // We must have at least 'location' or 'locationId' to retrieve the UrlAlias + if ( !isset( $parameters['location'] ) && !isset( $parameters['locationId'] ) ) + { + throw new \InvalidArgumentException( + "When generating an UrlAlias route, either 'location' or 'locationId must be provided." + ); + } + + // Check if location is a valid Location object + if ( isset( $parameters['location'] ) && !$parameters['location'] instanceof Location ) + { + throw new \LogicException( + "When generating an UrlAlias route, 'location' parameter must be a valid eZ\\Publish\\API\\Repository\\Values\\Content\\Location." + ); + } + + $location = isset( $parameters['location'] ) ? $parameters['location'] : $this->getRepository()->getLocationService()->loadLocation( $parameters['locationId'] ); + unset( $parameters['location'], $parameters['locationId'] ); + return $this->generator->generate( $location, $parameters, $absolute ); + } + + throw new RouteNotFoundException( 'Could not match route' ); + } + + public function setContext( RequestContext $context ) + { + $this->requestContext = $context; + } + + public function getContext() + { + return $this->requestContext; + } + + /** + * Not supported. Please use matchRequest() instead. + * + * @param $pathinfo + * + * @throws \RuntimeException + * + * @return void + */ + public function match( $pathinfo ) + { + throw new \RuntimeException( "The UrlAliasRouter doesn't support the match() method. Please use matchRequest() instead." ); + } + + /** + * Whether the router supports the thing in $name to generate a route. + * + * This check does not need to look if the specific instance can be + * resolved to a route, only whether the router can generate routes from + * objects of this class. + * @param mixed $name The route name or route object + * + * @return boolean + */ + public function supports( $name ) + { + return $name instanceof Location || $name === self::URL_ALIAS_ROUTE_NAME; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Security/Authentication/BasicAuthProvider.php b/eZ/Publish/Core/MVC/Symfony/Security/Authentication/BasicAuthProvider.php new file mode 100644 index 0000000..d4b05c9 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Security/Authentication/BasicAuthProvider.php @@ -0,0 +1,69 @@ +lazyRepository = $lazyRepository; + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + $lazyRepository = $this->lazyRepository; + return $lazyRepository(); + } + + /** + * {@inheritdoc} + */ + protected function retrieveUser( $username, UsernamePasswordToken $token ) + { + $repository = $this->getRepository(); + + try + { + $apiUser = $repository->getUserService()->loadUserByCredentials( $username, $token->getCredentials() ); + $repository->setCurrentUser( $apiUser ); + return new User( $apiUser ); + } + catch ( NotFoundException $e ) + { + throw new AuthenticationException( 'Authentication to eZ Publish failed', null, $e->getCode(), $e ); + } + } + + /** + * {@inheritdoc} + */ + protected function checkAuthentication( UserInterface $user, UsernamePasswordToken $token ) + { + // No additional checks needed since everything is handled by the repository + return; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Security/Authentication/Provider.php b/eZ/Publish/Core/MVC/Symfony/Security/Authentication/Provider.php new file mode 100644 index 0000000..b4aa2e9 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Security/Authentication/Provider.php @@ -0,0 +1,68 @@ +lazyRepository = $lazyRepository; + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + $lazyRepository = $this->lazyRepository; + return $lazyRepository(); + } + + /** + * Attempts to authenticates a TokenInterface object. + * + * @param \Symfony\Component\Security\Core\Authentication\Token\TokenInterface $token The TokenInterface instance to authenticate + * + * @return \Symfony\Component\Security\Core\Authentication\Token\TokenInterface An authenticated TokenInterface instance, never null + * + * @throws \Symfony\Component\Security\Core\Exception\AuthenticationException if the authentication fails + */ + public function authenticate( TokenInterface $token ) + { + if ( !$this->supports( $token ) ) + return null; + + $authenticatedToken = parent::authenticate( $token ); + if ( $authenticatedToken instanceof PreAuthenticatedToken ) + { + $user = $authenticatedToken->getUser(); + if ( !$user instanceof User ) + throw new AuthenticationException( 'Invalid eZ Publish user. Expected type is eZ\\Publish\\Core\\MVC\\Symfony\\Security\\User. Got ' . get_class( $user ) ); + + // Inject current user in the repository + $this->getRepository()->setCurrentUser( $user->getAPIUser() ); + + return $authenticatedToken; + } + + throw new AuthenticationException( 'The eZ Publish user could not be retrieved from the session' ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Security/Authorization/Attribute.php b/eZ/Publish/Core/MVC/Symfony/Security/Authorization/Attribute.php new file mode 100644 index 0000000..28b057d --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Security/Authorization/Attribute.php @@ -0,0 +1,68 @@ + 3 )) + * + * Usage example: + * + * use eZ\Publish\Core\MVC\Symfony\Security\Authorization\Attribute as AuthorizationAttribute; + * + * // From inside a controller + * // Will check if current user has access to content/read for section 3 (media) + * $hasAccess = $this->isGranted( + * new AuthorizationAttribute( 'content', 'read', array( 'SectionID' => 3 ) ) + * ); + * + */ +class Attribute +{ + /** + * @var string + */ + public $module; + + /** + * @var string + */ + public $function; + + /** + * @var array + */ + public $limitations; + + /** + * @param string $module + * @param string $function + * @param array $limitations + */ + public function __construct( $module = null, $function = null, array $limitations = array() ) + { + $this->module = $module; + $this->function = $function; + $this->limitations = $limitations; + } + + /** + * String representation so that it's understandable by basic voters + * + * @return string + */ + public function __toString() + { + return "ROLE_EZ_{$this->module}_{$this->function}"; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Security/Authorization/Voter/CoreVoter.php b/eZ/Publish/Core/MVC/Symfony/Security/Authorization/Voter/CoreVoter.php new file mode 100644 index 0000000..3524655 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Security/Authorization/Voter/CoreVoter.php @@ -0,0 +1,95 @@ +lazyRepository = $lazyRepository; + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + $lazyRepository = $this->lazyRepository; + return $lazyRepository(); + } + + /** + * Checks if the voter supports the given attribute. + * + * @param string $attribute An attribute + * + * @return Boolean true if this Voter supports the attribute, false otherwise + */ + public function supportsAttribute( $attribute ) + { + return $attribute instanceof AuthorizationAttribute; + } + + /** + * Checks if the voter supports the given class. + * + * @param string $class A class name + * + * @return true if this Voter can process the class + */ + public function supportsClass( $class ) + { + return true; + } + + /** + * Returns the vote for the given parameters. + * + * This method must return one of the following constants: + * ACCESS_GRANTED, ACCESS_DENIED, or ACCESS_ABSTAIN. + * + * @param TokenInterface $token A TokenInterface instance + * @param object $object The object to secure + * @param array $attributes An array of attributes associated with the method being invoked + * + * @return integer either ACCESS_GRANTED, ACCESS_ABSTAIN, or ACCESS_DENIED + */ + public function vote( TokenInterface $token, $object, array $attributes ) + { + $user = $token->getUser(); + if ( $user instanceof User ) + { + foreach ( $attributes as $attribute ) + { + if ( $this->supportsAttribute( $attribute ) ) + { + // @todo: add limitation when available in the repository + if ( $this->getRepository()->hasAccess( $attribute->module, $attribute->function ) === false ) + return VoterInterface::ACCESS_DENIED; + + return VoterInterface::ACCESS_GRANTED; + } + } + } + + return VoterInterface::ACCESS_ABSTAIN; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Security/User.php b/eZ/Publish/Core/MVC/Symfony/Security/User.php new file mode 100644 index 0000000..808724f --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Security/User.php @@ -0,0 +1,207 @@ +user = $user; + $this->roles = $roles; + } + + /** + * Returns the roles granted to the user. + * + * + * public function getRoles() + * { + * return array( 'ROLE_USER' ); + * } + * + * + * Alternatively, the roles might be stored on a ``roles`` property, + * and populated in any number of different ways when the user object + * is created. + * + * @return Role[] The user roles + */ + public function getRoles() + { + return $this->roles; + } + + /** + * Returns the password used to authenticate the user. + * + * This should be the encoded password. On authentication, a plain-text + * password will be salted, encoded, and then compared to this value. + * + * @return string The password + */ + public function getPassword() + { + return $this->user->passwordHash; + } + + /** + * Returns the salt that was originally used to encode the password. + * + * This can return null if the password was not encoded using a salt. + * + * @return string The salt + */ + public function getSalt() + { + return null; + } + + /** + * Returns the username used to authenticate the user. + * + * @return string The username + */ + public function getUsername() + { + return $this->user->login; + } + + /** + * Removes sensitive data from the user. + * + * This is important if, at any given point, sensitive information like + * the plain-text password is stored on this object. + * + * @return void + */ + public function eraseCredentials() + { + } + + /** + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getAPIUser() + { + return $this->user; + } + + /** + * @param \eZ\Publish\API\Repository\Values\User\User $user + */ + public function setAPIUser( APIUser $user ) + { + $this->user = $user; + } + + /** + * The equality comparison should neither be done by referential equality + * nor by comparing identities (i.e. getId() === getId()). + * + * However, you do not need to compare every attribute, but only those that + * are relevant for assessing whether re-authentication is required. + * + * Also implementation should consider that $user instance may implement + * the extended user interface `AdvancedUserInterface`. + * + * @param UserInterface $user + * + * @return Boolean + */ + public function isEqualTo( UserInterface $user ) + { + if ( $user instanceof User && $this->user instanceof User ) + { + return $user->getUserObject()->id === $this->user->id; + } + + return false; + } + + public function __toString() + { + return $this->user->contentInfo->name; + } + + /** + * Checks whether the user's account has expired. + * + * Internally, if this method returns false, the authentication system + * will throw an AccountExpiredException and prevent login. + * + * @return Boolean true if the user's account is non expired, false otherwise + * + * @see AccountExpiredException + */ + public function isAccountNonExpired() + { + return $this->user->enabled; + } + + /** + * Checks whether the user is locked. + * + * Internally, if this method returns false, the authentication system + * will throw a LockedException and prevent login. + * + * @return Boolean true if the user is not locked, false otherwise + * + * @see LockedException + */ + public function isAccountNonLocked() + { + return $this->user->enabled; + } + + /** + * Checks whether the user's credentials (password) has expired. + * + * Internally, if this method returns false, the authentication system + * will throw a CredentialsExpiredException and prevent login. + * + * @return Boolean true if the user's credentials are non expired, false otherwise + * + * @see CredentialsExpiredException + */ + public function isCredentialsNonExpired() + { + return true; + } + + /** + * Checks whether the user is enabled. + * + * Internally, if this method returns false, the authentication system + * will throw a DisabledException and prevent login. + * + * @return Boolean true if the user is enabled, false otherwise + * + * @see DisabledException + */ + public function isEnabled() + { + return $this->user->enabled; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/Security/User/APIUserProviderInterface.php b/eZ/Publish/Core/MVC/Symfony/Security/User/APIUserProviderInterface.php new file mode 100644 index 0000000..63bdd5d --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Security/User/APIUserProviderInterface.php @@ -0,0 +1,28 @@ +lazyRepository = $lazyRepository; + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository() + { + $lazyRepository = $this->lazyRepository; + return $lazyRepository(); + } + + /** + * @return \eZ\Publish\API\Repository\UserService + */ + protected function getUserService() + { + return $this->getRepository()->getUserService(); + } + + /** + * Loads the user for the given user ID. + * $user can be either the user ID or an instance of \eZ\Publish\Core\MVC\Symfony\Security\User + * (anonymous user we try to check access via SecurityContext::isGranted()) + * + * @param string|\eZ\Publish\Core\MVC\Symfony\Security\User $user Either the user ID to load an instance of User object. A value of -1 represents an anonymous user. + * + * @return \Symfony\Component\Security\Core\User\UserInterface + * @throws \Symfony\Component\Security\Core\Exception\UsernameNotFoundException if the user is not found + * + */ + public function loadUserByUsername( $user ) + { + try + { + // SecurityContext always tries to authenticate anonymous users when checking granted access. + // In that case $user is an instance of \eZ\Publish\Core\MVC\Symfony\Security\User. + // We don't need to reload the user here. + if ( $user instanceof User ) + return $user; + + $isLoggedIn = $user != -1; + $apiUser = $isLoggedIn ? $this->getUserService()->loadUser( $user ) : $this->getUserService()->loadAnonymousUser(); + $roles = $isLoggedIn ? array( 'ROLE_USER' ) : array(); + return new User( $apiUser, $roles ); + } + catch ( NotFoundException $e ) + { + throw new UsernameNotFoundException( $e->getMessage(), null, 0, $e ); + } + } + + /** + * Refreshes the user for the account interface. + * + * It is up to the implementation to decide if the user data should be + * totally reloaded (e.g. from the database), or if the UserInterface + * object can just be merged into some internal array of users / identity + * map. + * @param UserInterface $user + * + * @throws \Symfony\Component\Security\Core\Exception\UsernameNotFoundException + * + * @return UserInterface + */ + public function refreshUser( UserInterface $user ) + { + return $user; + } + + /** + * Whether this provider supports the given user class + * + * @param string $class + * + * @return Boolean + */ + public function supportsClass( $class ) + { + $supportedClass = 'eZ\\Publish\\Core\\MVC\\Symfony\\Security\\User'; + return $class === $supportedClass || is_subclass_of( $class, $supportedClass ); + } + + /** + * Loads a regular user object, usable by Symfony Security component, from a user object returned by Public API + * + * @param \eZ\Publish\API\Repository\Values\User\User $apiUser + * + * @return \eZ\Publish\Core\MVC\Symfony\Security\User + */ + public function loadUserByAPIUser( APIUser $apiUser ) + { + return new User( $apiUser ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess.php new file mode 100644 index 0000000..e6b806f --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess.php @@ -0,0 +1,50 @@ +name = $name; + $this->matchingType = $matchingType; + $this->matcher = $matcher; + } + + public function __toString() + { + return "$this->name (matched by '$this->matchingType')"; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher.php new file mode 100644 index 0000000..ed3f274 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher.php @@ -0,0 +1,42 @@ +elementNumber = (int)$elementNumber; + } + + /** + * Returns matching Siteaccess. + * + * @return string|false Siteaccess matched or false. + */ + public function match() + { + $elements = explode( ".", $this->request->host ); + + return isset( $elements[$this->elementNumber - 1] ) ? $elements[$this->elementNumber - 1] : false; + } + + public function getName() + { + return 'host:element'; + } + + /** + * Injects the request object to match against. + * + * @param \eZ\Publish\Core\MVC\Symfony\Routing\SimplifiedRequest $request + * + * @return void + */ + public function setRequest( SimplifiedRequest $request ) + { + $this->request = $request; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/HostText.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/HostText.php new file mode 100644 index 0000000..3fa6a95 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/HostText.php @@ -0,0 +1,50 @@ +setMatchElement( $request->host ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map.php new file mode 100644 index 0000000..e649520 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map.php @@ -0,0 +1,61 @@ +map = $map; + } + + /** + * Injects the key that will be used for matching against the map configuration + * + * @param string $key + */ + public function setMapKey( $key ) + { + $this->key = $key; + } + + /** + * Returns matching Siteaccess. + * + * @return string|false Siteaccess matched or false. + */ + public function match() + { + return isset( $this->map[$this->key] ) + ? $this->map[$this->key] + : false; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/Host.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/Host.php new file mode 100644 index 0000000..741dc47 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/Host.php @@ -0,0 +1,44 @@ +setMapKey( $request->host ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/Port.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/Port.php new file mode 100644 index 0000000..7a99d36 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/Port.php @@ -0,0 +1,62 @@ +port ) ) + { + $key = $request->port; + } + else + { + switch ( $request->scheme ) + { + case "https": + $key = 443; + break; + + case "http": + default: + $key = 80; + } + } + + $this->setMapKey( $key ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/URI.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/URI.php new file mode 100644 index 0000000..61c9612 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Map/URI.php @@ -0,0 +1,76 @@ +pathinfo, "/%[^/]", $key ); + $this->setMapKey( $key ); + } + + public function getName() + { + return 'uri:map'; + } + + /** + * Fixes up $uri to remove the siteaccess part, if needed. + * + * @param string $uri The original URI + * + * @return string + */ + public function analyseURI( $uri ) + { + return str_replace( "/$this->key", '', $uri ); + } + + /** + * Analyses $linkUri when generating a link to a route, in order to have the siteaccess part back in the URI. + * + * @param string $linkUri + * + * @return string The modified link URI + */ + public function analyseLink( $linkUri ) + { + if ( strpos( $linkUri, $this->key ) === false ) + { + $linkUri = '/' . $this->key . $linkUri; + } + + return $linkUri; + } + +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex.php new file mode 100644 index 0000000..4ebdc44 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex.php @@ -0,0 +1,74 @@ +regex = $regex; + $this->itemNumber = $itemNumber; + } + + /** + * Returns matching Siteaccess. + * + * @return string|false Siteaccess matched or false. + */ + public function match() + { + preg_match( + "@{$this->regex}@", + $this->element, + $match + ); + + return isset( $match[$this->itemNumber] ) ? $match[$this->itemNumber] : false; + } + + /** + * Injects element to match against with the regexp + * + * @param string $element + */ + public function setMatchElement( $element ) + { + $this->element = $element; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex/Host.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex/Host.php new file mode 100644 index 0000000..b5efadc --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex/Host.php @@ -0,0 +1,47 @@ +setMatchElement( $request->host ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex/URI.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex/URI.php new file mode 100644 index 0000000..fe0f33a --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/Regex/URI.php @@ -0,0 +1,47 @@ +setMatchElement( $request->pathinfo ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/URIElement.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/URIElement.php new file mode 100644 index 0000000..99ecdbf --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/URIElement.php @@ -0,0 +1,134 @@ +elementNumber = (int)$elementNumber; + } + + /** + * Returns matching Siteaccess. + * + * @return string|false Siteaccess matched or false. + */ + public function match() + { + try + { + return implode( "_", $this->getURIElements() ); + } + catch ( \LogicException $e ) + { + return false; + } + } + + /** + * Returns URI elements as an array. + * @throws \LogicException + * + * @return array + */ + protected function getURIElements() + { + $elements = array_slice( + explode( "/", $this->request->pathinfo ), + 1, + $this->elementNumber + ); + + // If one of the elements is empty, we do not match. + foreach ( $elements as $element ) + { + if ( $element === "" ) + throw new \LogicException( 'One of the URI elements was empty' ); + } + + if ( count( $elements ) !== $this->elementNumber ) + throw new \LogicException( 'The number of provided elements to consider is different than the number of elements found in the URI' ); + + return $elements; + } + + public function getName() + { + return 'uri:element'; + } + + /** + * Injects the request object to match against. + * + * @param \eZ\Publish\Core\MVC\Symfony\Routing\SimplifiedRequest $request + * + * @return void + */ + public function setRequest( SimplifiedRequest $request ) + { + $this->request = $request; + } + + /** + * Analyses $uri and removes the siteaccess part, if needed. + * + * @param string $uri The original URI + * + * @return string The modified URI + */ + public function analyseURI( $uri ) + { + $uriElements = '/' . implode( '/', $this->getURIElements() ); + if ( $uri == $uriElements ) + { + $uri = ''; + } + else if ( strpos( $uri, $uriElements ) === 0 ) + { + sscanf( $uri, "$uriElements%s", $uri ); + } + return $uri; + } + + /** + * Analyses $linkUri when generating a link to a route, in order to have the siteaccess part back in the URI. + * + * @param string $linkUri + * + * @return string The modified link URI + */ + public function analyseLink( $linkUri ) + { + $uriElements = implode( '/', $this->getURIElements() ); + return "/{$uriElements}{$linkUri}"; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/URIText.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/URIText.php new file mode 100644 index 0000000..e82a348 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Matcher/URIText.php @@ -0,0 +1,49 @@ +setMatchElement( $request->pathinfo ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Router.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Router.php new file mode 100644 index 0000000..691ee8e --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Router.php @@ -0,0 +1,176 @@ + + * array( + * // Using built-in URI matcher. Key is the prefix that matches the siteaccess, in the value + * "Map\\URI" => array( + * "ezdemo_site" => "ezdemo_site", + * "ezdemo_site_admin" => "ezdemo_site_admin", + * ), + * // Using built-in HOST matcher. Key is the hostname, value is the siteaccess name + * "Map\\Host" => array( + * "ezpublish.dev" => "ezdemo_site", + * "ezpublish.admin.dev" => "ezdemo_site_admin", + * ), + * // Using a custom matcher (class must begin with a '\', as a full qualified class name). + * // The custom matcher must implement eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher interface. + * "\\My\\Custom\\Matcher" => array( + * "something_to_match_against" => "siteaccess_name" + * ) + * ) + * + * @var array + */ + protected $siteAccessesConfiguration; + + /** + * List of configured siteaccesses. + * Siteaccess name is the key, "true" is the value. + * + * @var array + */ + protected $siteAccessList; + + /** + * @var \eZ\Publish\Core\MVC\Symfony\SiteAccess + */ + protected $siteAccess; + + protected $siteAccessClass; + + /** + * Constructor. + * + * @param string $defaultSiteAccess + * @param array $siteAccessesConfiguration + * @param array $siteAccessList + * @param null $siteAccessClass + */ + public function __construct( $defaultSiteAccess, array $siteAccessesConfiguration, array $siteAccessList, $siteAccessClass = null ) + { + $this->defaultSiteAccess = $defaultSiteAccess; + $this->siteAccessesConfiguration = $siteAccessesConfiguration; + $this->siteAccessList = array_fill_keys( $siteAccessList, true ); + $this->siteAccessClass = $siteAccessClass; + } + + /** + * Performs SiteAccess matching given the $request. + * + * @param \eZ\Publish\Core\MVC\Symfony\Routing\SimplifiedRequest $request + * + * @throws \eZ\Publish\Core\MVC\Exception\InvalidSiteAccessException + * + * @return \eZ\Publish\Core\MVC\Symfony\SiteAccess + */ + public function match( SimplifiedRequest $request ) + { + if ( isset( $this->siteAccess ) ) + return $this->siteAccess; + + $siteAccessClass = $this->siteAccessClass ?: 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess'; + $this->siteAccess = new $siteAccessClass(); + + // Request header always have precedence + if ( isset( $request->headers['X-Siteaccess'] ) ) + { + $siteaccessName = $request->headers['X-Siteaccess']; + if ( !isset( $this->siteAccessList[$siteaccessName] ) ) + { + unset( $this->siteAccess ); + throw new InvalidSiteAccessException( $siteaccessName, array_keys( $this->siteAccessList ), 'X-Siteaccess request header' ); + } + + $this->siteAccess->name = $request->headers['X-Siteaccess']; + $this->siteAccess->matchingType = 'header'; + return $this->siteAccess; + } + + // Then check environment variable + $siteaccessEnvName = getenv( 'EZPUBLISH_SITEACCESS' ); + if ( $siteaccessEnvName !== false ) + { + if ( !isset( $this->siteAccessList[$siteaccessEnvName] ) ) + { + unset( $this->siteAccess ); + throw new InvalidSiteAccessException( $siteaccessEnvName, array_keys( $this->siteAccessList ), 'EZPUBLISH_SITEACCESS Environment variable' ); + } + + $this->siteAccess->name = $siteaccessEnvName; + $this->siteAccess->matchingType = 'env'; + return $this->siteAccess; + } + + foreach ( $this->siteAccessesConfiguration as $matchingClass => $matchingConfiguration ) + { + // If class begins with a '\' it means it's a FQ class name, + // otherwise it is relative to this namespace. + if ( $matchingClass[0] !== '\\' ) + $matchingClass = __NAMESPACE__ . "\\Matcher\\$matchingClass"; + + $matcher = new $matchingClass( $matchingConfiguration ); + $matcher->setRequest( $request ); + + if ( ( $siteaccessName = $matcher->match() ) !== false ) + { + if ( isset( $this->siteAccessList[$siteaccessName] ) ) + { + $this->siteAccess->name = $siteaccessName; + $this->siteAccess->matchingType = $matcher->getName(); + $this->siteAccess->matcher = $matcher; + return $this->siteAccess; + } + } + } + + $this->siteAccess->name = $this->defaultSiteAccess; + $this->siteAccess->matchingType = 'default'; + return $this->siteAccess; + } + + /** + * @return \eZ\Publish\Core\MVC\Symfony\SiteAccess|null + */ + public function getSiteAccess() + { + return $this->siteAccess; + } + + /** + * @param \eZ\Publish\Core\MVC\Symfony\SiteAccess $siteAccess + * + * @access private Only for unit tests use + */ + public function setSiteAccess( SiteAccess $siteAccess = null ) + { + $this->siteAccess = $siteAccess; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostElementTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostElementTest.php new file mode 100644 index 0000000..f3b7f4b --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostElementTest.php @@ -0,0 +1,126 @@ + 2, + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + "second_sa" => "second_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa', 'example' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\HostElement::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\HostElement::match + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://www.example.com" ), "example" ), + array( SimplifiedRequest::fromUrl( "https://www.example.com" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/" ), "example" ), + array( SimplifiedRequest::fromUrl( "https://www.example.com/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com//" ), "example" ), + array( SimplifiedRequest::fromUrl( "https://www.example.com//" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com:8080/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/first_siteaccess/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/?first_siteaccess" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/?first_sa" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/first_salt" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/first_sa.foo" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/test" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/test/foo/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/test/foo/bar/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/test/foo/bar/first_sa" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/default_sa" ), "example" ), + + array( SimplifiedRequest::fromUrl( "http://www.example.com/first_sa" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/first_sa/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com//first_sa//" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com///first_sa///test" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com//first_sa//foo/bar" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/first_sa/foo" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com:82/first_sa/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:83/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/foobar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:82/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:83/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:82/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:83/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa/foobar/" ), "second_sa" ), + + array( SimplifiedRequest::fromUrl( "http://dev.example.com/second_sa" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://dev.example.com/second_sa/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://dev.example.com/second_sa?param1=foo" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://dev.example.com/second_sa/foo/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://dev.example.com:82/second_sa/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://dev.example.com:83/second_sa/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::getName + */ + public function testGetName() + { + $matcher = new HostMapMatcher( array( 'host' => 'foo' ), array() ); + $this->assertSame( 'host:map', $matcher->getName() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostPortURITest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostPortURITest.php new file mode 100644 index 0000000..f79f373 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostPortURITest.php @@ -0,0 +1,133 @@ + array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + "third_siteaccess" => "third_sa", + ), + "Map\\Port" => array( + 80 => "fifth_sa", + 81 => "third_sa", + 82 => "fourth_sa", + 83 => "first_sa", + 85 => "first_sa", + 443 => "fourth_sa", + ), + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Port::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "fifth_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa//" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa///test" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo/bar" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://first_sa:123/second_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:123/second_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa/foo/" ), "second_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo/bar" ), "third_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/foo" ), "fourth_sa" ), + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostRegexTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostRegexTest.php new file mode 100644 index 0000000..76ad4de --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostRegexTest.php @@ -0,0 +1,129 @@ + array( + "regex" => "^(\\w+_sa)$", + ), + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex\Host::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com///first_sa///test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//foo/bar" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:83/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/foobar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:82/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:83/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:82/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa:83/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://second_sa/foobar/" ), "second_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex\Host::getName + */ + public function testGetName() + { + $matcher = new HostRegexMatcher( array( 'host' => 'foo' ), array() ); + $this->assertSame( 'host:regexp', $matcher->getName() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostTextTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostTextTest.php new file mode 100644 index 0000000..63272ee --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterHostTextTest.php @@ -0,0 +1,129 @@ + array( + "prefix" => "www.", + "suffix" => ".com", + ), + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa', 'example' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\HostText::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com///first_sa///test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//foo/bar" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://www.example.com/" ), "example" ), + array( SimplifiedRequest::fromUrl( "https://www.example.com/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com:81/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com:82/" ), "example" ), + array( SimplifiedRequest::fromUrl( "https://www.example.com:83/" ), "example" ), + array( SimplifiedRequest::fromUrl( "http://www.example.com/foo/" ), "example" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\HostText::getName + */ + public function testGetName() + { + $matcher = new HostTextMatcher( array( 'host' => 'foo' ), array() ); + $this->assertSame( 'host:text', $matcher->getName() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterMapURITest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterMapURITest.php new file mode 100644 index 0000000..8fc3802 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterMapURITest.php @@ -0,0 +1,56 @@ +setRequest( + new SimplifiedRequest( array( 'pathinfo' => $uri ) ) + ); + $this->assertSame( $expectedFixedUpURI, $matcher->analyseURI( $uri ) ); + } + + /** + * @param string $fullUri + * @param string $linkUri + * + * @dataProvider fixupURIProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::analyseLink + */ + public function testAnalyseLink( $fullUri, $linkUri ) + { + $matcher = new URIMapMatcher( array() ); + $matcher->setRequest( + new SimplifiedRequest( array( 'pathinfo' => $fullUri ) ) + ); + $this->assertSame( $fullUri, $matcher->analyseLink( $linkUri ) ); + } + + public function fixupURIProvider() + { + return array( + array( '/my_siteaccess/foo/bar', '/foo/bar' ), + array( '/vive/le/sucre', '/le/sucre' ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterPortHostURITest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterPortHostURITest.php new file mode 100644 index 0000000..f1824b3 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterPortHostURITest.php @@ -0,0 +1,136 @@ + array( + 80 => "fifth_sa", + 81 => "third_sa", + 82 => "fourth_sa", + 83 => "first_sa", + 85 => "first_sa", + 443 => "fourth_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + "third_siteaccess" => "third_sa", + ), + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::setRequest + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::setRequest + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Port::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Port::setRequest + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "fifth_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa//" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa///test" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo/bar" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://first_sa:123/second_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:123/second_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:123/second_sa/foo/" ), "second_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo/bar" ), "third_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/foo" ), "fourth_sa" ), + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterSpecialPortsTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterSpecialPortsTest.php new file mode 100644 index 0000000..6bbbbbb --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterSpecialPortsTest.php @@ -0,0 +1,136 @@ + array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + "third_siteaccess" => "third_sa", + ), + "Map\\Port" => array( + 80 => "fifth_sa", + 81 => "third_sa", + 82 => "fourth_sa", + 83 => "first_sa", + 85 => "first_sa", + 443 => "fourth_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Port::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "fifth_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Shouldn't match "first_sa" because of double slash + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa/" ), "fifth_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa//" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa///test" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo/bar" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo/bar" ), "third_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/foo" ), "fourth_sa" ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Port::getName + */ + public function testGetName() + { + $matcher = new PortMatcher( array( 'port' => '8080', 'scheme' => 'http' ), array() ); + $this->assertSame( 'port', $matcher->getName() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterTest.php new file mode 100644 index 0000000..f828392 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterTest.php @@ -0,0 +1,179 @@ + array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + "third_siteaccess" => "third_sa", + ), + "Map\\Port" => array( + 81 => "third_sa", + 82 => "fourth_sa", + 83 => "first_sa", + 85 => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'headerbased_sa' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Port::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + /** + * @depends testConstruct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @expectedException \eZ\Publish\Core\MVC\Exception\InvalidSiteAccessException + */ + public function testMatchWithEnvFail( $router ) + { + $saName = 'foobar_sa'; + putenv( "EZPUBLISH_SITEACCESS=$saName" ); + $router->match( new SimplifiedRequest() ); + } + + /** + * @depends testConstruct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + */ + public function testMatchWithEnv( $router ) + { + $saName = 'first_sa'; + putenv( "EZPUBLISH_SITEACCESS=$saName" ); + $sa = $router->match( new SimplifiedRequest() ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $saName, $sa->name ); + $this->assertSame( 'env', $sa->matchingType ); + $router->setSiteAccess(); + } + + /** + * @param \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router $router + * + * @depends testConstruct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + */ + public function testMatchWithRequestHeader( $router ) + { + $saName = 'headerbased_sa'; + $sa = $router->match( + new SimplifiedRequest( + array( + 'headers' => array( 'X-Siteaccess' => $saName ) + ) + ) + ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $saName, $sa->name ); + $this->assertSame( 'header', $sa->matchingType ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa//" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa///test" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo/bar" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "first_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:81/" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo" ), "third_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:81/foo/bar" ), "third_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/" ), "fourth_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com:82/foo" ), "fourth_sa" ), + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIElement2Test.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIElement2Test.php new file mode 100644 index 0000000..9d6eac3 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIElement2Test.php @@ -0,0 +1,166 @@ + 2, + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa', 'foo_baz', 'test_foo', 'first_sa_foo', 'second_sa_foo' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::setRequest + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::getURIElements + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "test_foo" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "test_foo" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "test_foo" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com///first_sa///test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//foo/bar" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo//bar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa_foo" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/baz/" ), "foo_baz" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa_foo" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @param int $level + * @param string $uri + * @param string $expectedFixedUpURI + * + * @dataProvider analyseProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::analyseURI + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::setRequest + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::getURIElements + */ + public function testAnalyseURI( $level, $uri, $expectedFixedUpURI ) + { + $matcher = new URIElementMatcher( $level ); + $matcher->setRequest( + new SimplifiedRequest( array( 'pathinfo' => $uri ) ) + ); + $this->assertSame( $expectedFixedUpURI, $matcher->analyseURI( $uri ) ); + } + + /** + * @param int $level + * @param string $fullUri + * @param string $linkUri + * + * @dataProvider analyseProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::analyseLink + */ + public function testAnalyseLink( $level, $fullUri, $linkUri ) + { + $matcher = new URIElementMatcher( $level ); + $matcher->setRequest( + new SimplifiedRequest( array( 'pathinfo' => $fullUri ) ) + ); + $this->assertSame( $fullUri, $matcher->analyseLink( $linkUri ) ); + } + + public function analyseProvider() + { + return array( + array( 2, '/my/siteaccess/foo/bar', '/foo/bar' ), + array( 2, '/vive/le/sucre/en-poudre', '/sucre/en-poudre' ), + // Issue https://jira.ez.no/browse/EZP-20125 + array( 1, '/fre/content/edit/104/1/fre-FR', '/content/edit/104/1/fre-FR' ), + array( 1, '/fre/utf8-with-accent/é/fre/à/à/fre/é', '/utf8-with-accent/é/fre/à/à/fre/é' ), + array( 2, '/é/fre/utf8-with-accent/é/fre/à/à/fre/é', '/utf8-with-accent/é/fre/à/à/fre/é' ), + array( 2, '/prefix/fre/url/alias/prefix/fre/prefix/fre/url', '/url/alias/prefix/fre/prefix/fre/url' ), + // regression after the first fix of EZP-20125 + array( 1, '/sitaccess', '' ), + array( 1, '/sitaccess/', '/' ), + array( 2, '/prefix/siteaccess', '' ), + array( 2, '/prefix/siteaccess/', '/' ), + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIElementTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIElementTest.php new file mode 100644 index 0000000..e21be96 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIElementTest.php @@ -0,0 +1,159 @@ + 1, + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'first_siteaccess', 'first_salt', 'first_sa.foo', 'test', 'foo' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::match + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "first_siteaccess" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "first_salt" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "first_sa.foo" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com///first_sa///test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//foo/bar" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "foo" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "foo" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "foo" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::getName + */ + public function testGetName() + { + $matcher = new URIElementMatcher( array(), array() ); + $this->assertSame( 'uri:element', $matcher->getName() ); + } + + /** + * @param string $uri + * @param string $expectedFixedUpURI + * + * @dataProvider analyseProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::analyseURI + */ + public function testAnalyseURI( $uri, $expectedFixedUpURI ) + { + $matcher = new URIElementMatcher( 1 ); + $matcher->setRequest( + new SimplifiedRequest( array( 'pathinfo' => $uri ) ) + ); + $this->assertSame( $expectedFixedUpURI, $matcher->analyseURI( $uri ) ); + } + + /** + * @param string $fullUri + * @param string $linkUri + * + * @dataProvider analyseProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIElement::analyseLink + */ + public function testAnalyseLink( $fullUri, $linkUri ) + { + $matcher = new URIElementMatcher( 1 ); + $matcher->setRequest( + new SimplifiedRequest( array( 'pathinfo' => $fullUri ) ) + ); + $this->assertSame( $fullUri, $matcher->analyseLink( $linkUri ) ); + } + + public function analyseProvider() + { + return array( + array( '/my_siteaccess/foo/bar', '/foo/bar' ), + array( '/vive/le/sucre', '/le/sucre' ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIRegexTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIRegexTest.php new file mode 100644 index 0000000..f4a2f1a --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURIRegexTest.php @@ -0,0 +1,129 @@ + array( + "regex" => "^/foo(\\w+)bar", + ), + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'foowoobar', 'test' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex\URI::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com///first_sa///test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//foo/bar" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foobar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess//foobar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess//footestbar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/footestbar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/footestbar/foobazbar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/footestbar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/footestbar/" ), "test" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @covers eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex\URI::getName + */ + public function testGetName() + { + $matcher = new RegexMatcher( array(), array() ); + $this->assertSame( 'uri:regexp', $matcher->getName() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURITextTest.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURITextTest.php new file mode 100644 index 0000000..c049ce7 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/Tests/RouterURITextTest.php @@ -0,0 +1,130 @@ + array( + "prefix" => "foo", + "suffix" => "bar", + ), + "Map\\URI" => array( + "first_sa" => "first_sa", + "second_sa" => "second_sa", + ), + "Map\\Host" => array( + "first_sa" => "first_sa", + "first_siteaccess" => "first_sa", + ), + ), + array( 'first_sa', 'second_sa', 'third_sa', 'fourth_sa', 'fifth_sa', 'test' ) + ); + } + + /** + * @depends testConstruct + * @dataProvider matchProvider + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Router::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\URI::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Map\Host::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\Regex::match + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIText::__construct + */ + public function testMatch( $request, $siteAccess, $router ) + { + $sa = $router->match( $request ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\SiteAccess', $sa ); + $this->assertSame( $siteAccess, $sa->name ); + $router->setSiteAccess(); + } + + public function matchProvider() + { + return array( + array( SimplifiedRequest::fromUrl( "http://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "https://example.com//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:8080/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_siteaccess/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_siteaccess" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/?first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_salt" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa.foo" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/test/foo/bar/first_sa" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/default_sa" ), "default_sa" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/" ), "first_sa" ), + // Double slashes shouldn't be considered as one + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com///first_sa///test" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com//first_sa//foo/bar" ), "default_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/first_sa/foo" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://third_siteaccess/first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "https://first_sa/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_sa:81/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/foo/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/foobar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess//foobar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess//footestbar/" ), "first_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/footestbar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess/footestbar/foobazbar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/footestbar/" ), "test" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/footestbar/" ), "test" ), + + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa?param1=foo" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com/second_sa/foo/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://example.com:83/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:82/second_sa/" ), "second_sa" ), + array( SimplifiedRequest::fromUrl( "http://first_siteaccess:83/second_sa/" ), "second_sa" ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\SiteAccess\Matcher\URIText::getName + */ + public function testGetName() + { + $matcher = new URITextMatcher( array(), array() ); + $this->assertSame( 'uri:text', $matcher->getName() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/SiteAccess/URILexer.php b/eZ/Publish/Core/MVC/Symfony/SiteAccess/URILexer.php new file mode 100644 index 0000000..e4bd3e5 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/SiteAccess/URILexer.php @@ -0,0 +1,35 @@ +/my/awesome/uri" + */ +interface URILexer +{ + /** + * Analyses $uri and removes the siteaccess part, if needed. + * + * @param string $uri The original URI + * + * @return string The modified URI + */ + public function analyseURI( $uri ); + + /** + * Analyses $linkUri when generating a link to a route, in order to have the siteaccess part back in the URI. + * + * @param string $linkUri + * + * @return string The modified link URI + */ + public function analyseLink( $linkUri ); +} diff --git a/eZ/Publish/Core/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php b/eZ/Publish/Core/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php new file mode 100644 index 0000000..c4dfd6b --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/Templating/Twig/Extension/ContentExtension.php @@ -0,0 +1,404 @@ +resources = $resolver->getParameter( 'field_templates' ); + usort( + $this->resources, + function ( $a, $b ) + { + return $b['priority'] - $a['priority']; + } + ); + + $this->blocks = new SplObjectStorage(); + $this->container = $container; + } + + /** + * Initializes the template runtime (aka Twig environment). + * + * @param \Twig_Environment $environment + */ + public function initRuntime( Twig_Environment $environment ) + { + $this->environment = $environment; + } + + /** + * Returns a list of functions to add to the existing list. + * + * @return array + */ + public function getFunctions() + { + return array( + 'ez_render_field' => new Twig_Function_Method( + $this, + 'renderField', + array( 'is_safe' => array( 'html' ) ) + ), + 'ez_image_alias' => new Twig_Function_Method( $this, 'getImageVariation' ) + ); + } + + /** + * Returns a list of filters to add to the existing list + * + * @return array + */ + public function getFilters() + { + return array( + 'xmltext_to_html5' => new Twig_Filter_Method( $this, 'xmltextToHtml5' ), + ); + } + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + public function getName() + { + return 'ezpublish.content'; + } + + /** + * Generates the array of parameter to pass to the field template. + * + * @param \eZ\Publish\Core\Repository\Values\Content\Content $content + * @param \eZ\Publish\Core\Repository\Values\Content\Field $field the Field to display + * @param array $params An array of parameters to pass to the field view + * + * @return array + */ + protected function getRenderFieldBlockParameters( + Content $content, Field $field, array $params = array() + ) + { + // Merging passed parameters to default ones + $params += array( + 'parameters' => array(), // parameters dedicated to template processing + 'attr' => array() // attributes to add on the enclosing HTML tags + ); + + $versionInfo = $content->getVersionInfo(); + $contentInfo = $versionInfo->getContentInfo(); + $contentType = $contentInfo->getContentType(); + // Adding Field, FieldSettings and ContentInfo objects to + // parameters to be passed to the template + $params += array( + 'field' => $field, + 'contentInfo' => $contentInfo, + 'versionInfo' => $versionInfo, + 'fieldSettings' => $contentType + ->getFieldDefinition( $field->fieldDefIdentifier ) + ->getFieldSettings() + ); + + // make sure we can easily add class="-field" to the + // generated HTML + if ( isset( $params['attr']['class'] ) ) + { + $params['attr']['class'] .= ' ' . $this->getFieldTypeIdentifier( $content, $field ) . '-field'; + } + else + { + $params['attr']['class'] = $this->getFieldTypeIdentifier( $content, $field ) . '-field'; + } + return $params; + } + + /** + * Renders the HTML for a given field. + * + * @param \eZ\Publish\Core\Repository\Values\Content\Content $content + * @param string $fieldIdentifier Identifier for the field we want to render + * @param array $params An array of parameters to pass to the field view + * @throws \InvalidArgumentException If $fieldIdentifier is invalid in $content + * @return string The HTML markup + */ + public function renderField( Content $content, $fieldIdentifier, array $params = array() ) + { + $lang = null; + if ( isset( $params['lang'] ) ) + { + $lang = $params['lang']; + unset( $params['lang'] ); + } + $field = $content->getField( $fieldIdentifier, $lang ); + if ( !$field instanceof Field ) + { + throw new InvalidArgumentException( + "Invalid field identifier '$fieldIdentifier' for content #{$content->contentInfo->id}" + ); + } + + $localTemplate = null; + if ( isset( $params['template'] ) ) + { + // local override of the template + // this template is put on the top the templates stack + $localTemplate = $params['template']; + unset( $params['template'] ); + } + + $params = $this->getRenderFieldBlockParameters( $content, $field, $params ); + + // Getting instance of Twig_Template that will be used to render blocks + if ( !$this->template instanceof Twig_Template ) + { + $tpl = reset( $this->resources ); + $this->template = $this->environment->loadTemplate( $tpl['template'] ); + } + + return $this->template->renderBlock( + $this->getFieldBlockName( $content, $field ), + $params, + $this->getBlocksByField( $content, $field, $localTemplate ) + ); + } + + /** + * @return \eZ\Publish\Core\FieldType\XmlText\Converter\Html5 + */ + protected function getXmlTextConverter() + { + if ( !isset( $this->xmlTextConverter ) ) + $this->xmlTextConverter = $this->container->get( "ezpublish.fieldType.ezxmltext.converter.html5" ); + + return $this->xmlTextConverter; + } + + /** + * Implements the "xmltext_to_html5" filter + * + * @param string $xmlData + * + * @return string + */ + public function xmltextToHtml5( $xmlData ) + { + return $this->getXmlTextConverter()->convert( $xmlData ); + } + + /** + * Returns the image variant object for $field/$versionInfo + * + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param string $variationName + * + * @return \eZ\Publish\API\Repository\Values\File\ImageVariant + */ + public function getImageVariation( Field $field, VersionInfo $versionInfo, $variationName ) + { + if ( !isset( $this->imageVariationService ) ) + $this->imageVariationService = $this->container->get( 'ezpublish.fieldType.ezimage.variation_service' ); + + return $this->imageVariationService->getVariation( $field, $versionInfo, $variationName ); + } + + /** + * Returns the block named $blockName in the given template. If it's not + * found, returns null. + * + * @param string $blockName + * @param \Twig_Template $tpl + * + * @return array|null + */ + protected function searchBlock( $blockName, Twig_Template $tpl ) + { + // Current template might have parents, so we need to loop against + // them to find a matching block + do + { + foreach ( $tpl->getBlocks() as $name => $block ) + { + if ( $name === $blockName ) + { + return $block; + } + } + } + while ( ( $tpl = $tpl->getParent( array() ) ) instanceof Twig_Template ); + + return null; + } + + /** + * Returns template blocks for $field. First check in the $localTemplate if + * it's provided. + * Template block convention name is _field + * Example: 'ezstring_field' will be relevant for a full view of ezstring field type + * + * @param Content $content + * @param Field $field + * @param null|string $localTemplate a file where to look for the block first + * + * @throws \LogicException If no template block can be found for $field + * + * @return array + */ + protected function getBlocksByField( Content $content, Field $field, $localTemplate = null ) + { + $fieldBlockName = $this->getFieldBlockName( $content, $field ); + if ( $localTemplate !== null ) + { + $tpl = $this->environment->loadTemplate( $localTemplate ); + $block = $this->searchBlock( $fieldBlockName, $tpl ); + if ( $block !== null ) + { + return array( $fieldBlockName => $block ); + } + } + + if ( $this->blocks->contains( $field ) ) + return $this->blocks[$field]; + + // Looping against available resources to find template blocks for $field + $blocks = array(); + foreach ( $this->resources as &$template ) + { + if ( !$template instanceof Twig_Template ) + $template = $this->environment->loadTemplate( $template['template'] ); + + $tpl = $template; + + $block = $this->searchBlock( $fieldBlockName, $tpl ); + if ( $block !== null ) + { + $blocks[$fieldBlockName] = $block; + break; + } + } + + if ( empty( $blocks ) ) + throw new LogicException( "Cannot find '$fieldBlockName' template block field type." ); + + $this->blocks->attach( $field, $blocks ); + + return $blocks; + } + + /** + * Returns expected block name for $field, attached in $content. + * + * @param \eZ\Publish\Core\Repository\Values\Content\Content $content + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * + * @return string + */ + protected function getFieldBlockName( Content $content, Field $field ) + { + return $this->getFieldTypeIdentifier( $content, $field ) . '_field'; + } + + /** + * Returns the field type identifier for $field + * + * @param \eZ\Publish\Core\Repository\Values\Content\Content $content + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * + * @return string + */ + protected function getFieldTypeIdentifier( Content $content, Field $field ) + { + if ( !isset( $this->fieldTypeIdentifiers[$field->fieldDefIdentifier] ) ) + { + $this->fieldTypeIdentifiers[$field->fieldDefIdentifier] = $content + ->getVersionInfo() + ->getContentInfo() + ->getContentType() + ->getFieldDefinition( $field->fieldDefIdentifier ) + ->fieldTypeIdentifier; + } + + return $this->fieldTypeIdentifiers[$field->fieldDefIdentifier]; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentView.php b/eZ/Publish/Core/MVC/Symfony/View/ContentView.php new file mode 100644 index 0000000..0f2b1ce --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentView.php @@ -0,0 +1,144 @@ + + * namespace Foo; + * use eZ\Publish\API\Repository\Values\Content\ContentInfo, + * eZ\Publish\API\Repository\Values\Content\Location; + * + * // For a content + * function ( ContentInfo $contentInfo, array $parameters = array() ) + * { + * // Do something to render + * // Must return a string to display + * } + * + * // For a location + * function ( Location $location, array $parameters = array() ) + * { + * // Do something to render + * // Must return a string to display + * } + * + */ +class ContentView implements ContentViewInterface +{ + /** + * @var string|\Closure + */ + protected $templateIdentifier; + + /** + * @var array + */ + protected $parameters; + + /** + * @param string|\Closure $templateIdentifier Valid path to the template. Can also be a closure. + * @param array $parameters Hash of parameters to pass to the template/closure. + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentType + */ + public function __construct( $templateIdentifier = null, array $parameters = array() ) + { + if ( isset( $templateIdentifier ) && !is_string( $templateIdentifier ) && !$templateIdentifier instanceof \Closure ) + throw new InvalidArgumentType( 'templateIdentifier', 'string or \Closure', $templateIdentifier ); + + $this->templateIdentifier = $templateIdentifier; + $this->parameters = $parameters; + } + + /** + * @param array $parameters Hash of parameters to pass to the template/closure + */ + public function setParameters( array $parameters ) + { + $this->parameters = $parameters; + } + + /** + * Adds a hash of parameters to the existing parameters + * + * @param array $parameters + */ + public function addParameters( array $parameters ) + { + $this->parameters += $parameters; + } + + /** + * @return array + */ + public function getParameters() + { + return $this->parameters; + } + + /** + * Checks if $parameterName exists + * + * @param string $parameterName + * + * @return boolean + */ + public function hasParameter( $parameterName ) + { + return isset( $this->parameters[$parameterName] ); + } + + /** + * Returns parameter value by $parameterName. + * Throws an \InvalidArgumentException if $parameterName is not set. + * + * @param string $parameterName + * + * @throws \InvalidArgumentException + * + * @return mixed + */ + public function getParameter( $parameterName ) + { + if ( $this->hasParameter( $parameterName ) ) + return $this->parameters[$parameterName]; + + throw new \InvalidArgumentException( "Parameter '$parameterName' is not set." ); + } + + /** + * @param string|\Closure $templateIdentifier + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentType + */ + public function setTemplateIdentifier( $templateIdentifier ) + { + if ( !is_string( $templateIdentifier ) || !$templateIdentifier instanceof \Closure ) + throw new InvalidArgumentType( 'templateIdentifier', 'string or \Closure', $templateIdentifier ); + + $this->templateIdentifier = $templateIdentifier; + } + + /** + * @return string|\Closure + */ + public function getTemplateIdentifier() + { + return $this->templateIdentifier; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewInterface.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewInterface.php new file mode 100644 index 0000000..ec41aaa --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewInterface.php @@ -0,0 +1,76 @@ +values[$location->depth] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + $location = $this->repository->getLocationService()->loadLocation( $contentInfo->mainLocationId ); + return isset( $this->values[$location->depth] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Content.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Content.php new file mode 100644 index 0000000..02d9fb5 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Content.php @@ -0,0 +1,41 @@ +values[$location->getContentInfo()->id] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return isset( $this->values[$contentInfo->id] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ContentType.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ContentType.php new file mode 100644 index 0000000..d06dd39 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ContentType.php @@ -0,0 +1,41 @@ +values[$location->getContentInfo()->getContentType()->id] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return isset( $this->values[$contentInfo->getContentType()->id] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ContentTypeGroup.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ContentTypeGroup.php new file mode 100644 index 0000000..27f75b2 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ContentTypeGroup.php @@ -0,0 +1,47 @@ +matchContentInfo( $location->getContentInfo() ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + foreach ( $contentInfo->getContentType()->getContentTypeGroups() as $group ) + { + if ( isset( $this->values[$group->id] ) ) + return true; + } + + return false; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Location.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Location.php new file mode 100644 index 0000000..b45dcb2 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Location.php @@ -0,0 +1,41 @@ +values[$location->id] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return isset( $this->values[$contentInfo->mainLocationId] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ParentContentType.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ParentContentType.php new file mode 100644 index 0000000..0353d4a --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ParentContentType.php @@ -0,0 +1,45 @@ +repository->getLocationService()->loadLocation( $location->parentLocationId ); + $parentContentType = $parent->getContentInfo()->getContentType(); + return isset( $this->values[$parentContentType->id] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return $this->matchLocation( + $this->repository->getLocationService()->loadLocation( $contentInfo->mainLocationId ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ParentLocation.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ParentLocation.php new file mode 100644 index 0000000..a22d406 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/ParentLocation.php @@ -0,0 +1,42 @@ +values[$location->parentLocationId] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + $location = $this->repository->getLocationService()->loadLocation( $contentInfo->mainLocationId ); + return isset( $this->values[$location->parentLocationId] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Remote.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Remote.php new file mode 100644 index 0000000..49697bc --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Remote.php @@ -0,0 +1,41 @@ +values[$location->remoteId] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return isset( $this->values[$contentInfo->remoteId] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Section.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Section.php new file mode 100644 index 0000000..f6506eb --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Id/Section.php @@ -0,0 +1,41 @@ +values[$location->getContentInfo()->sectionId] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return isset( $this->values[$contentInfo->sectionId] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/ContentType.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/ContentType.php new file mode 100644 index 0000000..35cf44a --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/ContentType.php @@ -0,0 +1,41 @@ +values[$location->getContentInfo()->getContentType()->identifier] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return isset( $this->values[$contentInfo->getContentType()->identifier] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/ParentContentType.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/ParentContentType.php new file mode 100644 index 0000000..614e4a4 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/ParentContentType.php @@ -0,0 +1,45 @@ +repository->getLocationService()->loadLocation( $location->parentLocationId ); + $parentContentType = $parent->getContentInfo()->getContentType(); + return isset( $this->values[$parentContentType->identifier] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + return $this->matchLocation( + $this->repository->getLocationService()->loadLocation( $contentInfo->mainLocationId ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/Section.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/Section.php new file mode 100644 index 0000000..d696c60 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/Identifier/Section.php @@ -0,0 +1,47 @@ +repository->getSectionService()->loadSection( + $location->getContentInfo()->sectionId + ); + return isset( $this->values[$section->identifier] ); + } + + /** + * Checks if a ContentInfo object matches. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + $section = $this->repository->getSectionService()->loadSection( + $contentInfo->sectionId + ); + return isset( $this->values[$section->identifier] ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/MultipleValued.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/MultipleValued.php new file mode 100644 index 0000000..7f90a89 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/MultipleValued.php @@ -0,0 +1,58 @@ +values = array_fill_keys( $matchingConfig, true ); + } + + /** + * Returns matcher's values + * + * @return array + */ + public function getValues() + { + return array_keys( $this->values ); + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + public function getRepository() + { + return $this->repository; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/UrlAlias.php b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/UrlAlias.php new file mode 100644 index 0000000..3b18ff9 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/ContentViewProvider/Configured/Matcher/UrlAlias.php @@ -0,0 +1,72 @@ +repository->getURLAliasService()->listLocationAliases( $location, true ); + foreach ( $this->values as $pattern => $val ) + { + foreach ( $locationUrls as $urlAlias ) + { + if ( strpos( $urlAlias->path, $pattern ) === 0 ) + { + return true; + } + } + } + + return false; + } + + /** + * Not supported since UrlAlias is meaningful for location objects only. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @throws \RuntimeException + * + * @return boolean + */ + public function matchContentInfo( ContentInfo $contentInfo ) + { + throw new \RuntimeException( 'matchContentInfo() is not supported by UrlAlias matcher' ); + } + + public function setMatchingConfig( $matchingConfig ) + { + if ( !is_array( $matchingConfig ) ) + { + $matchingConfig = array( $matchingConfig ); + } + + array_walk( + $matchingConfig, + function ( &$item, $key ) { + $item = trim( $item, '/ ' ); + } + ); + + parent::setMatchingConfig( $matchingConfig ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Manager.php b/eZ/Publish/Core/MVC/Symfony/View/Manager.php new file mode 100644 index 0000000..f765cbb --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Manager.php @@ -0,0 +1,253 @@ +templateEngine = $templateEngine; + $this->eventDispatcher = $eventDispatcher; + $this->repository = $repository; + $this->viewBaseLayout = $viewBaseLayout; + $this->logger = $logger; + } + + /** + * Helper for {@see addContentViewProvider()} and {@see addLocationViewProvider()} + * @param array $property + * @param \eZ\Publish\Core\MVC\Symfony\View\Provider\Content $viewProvider + * @param int $priority + */ + private function addViewProvider( &$property, $viewProvider, $priority ) + { + $priority = (int)$priority; + if ( !isset( $property[$priority] ) ) + $property[$priority] = array(); + + $property[$priority][] = $viewProvider; + } + + /** + * Registers $viewProvider as a valid content view provider. + * When this view provider will be called in the chain depends on $priority. The highest $priority is, the earliest the router will be called. + * + * @param \eZ\Publish\Core\MVC\Symfony\View\Provider\Content $viewProvider + * @param int $priority + */ + public function addContentViewProvider( ContentViewProvider $viewProvider, $priority = 0 ) + { + $this->addViewProvider( $this->contentViewProviders, $viewProvider, $priority ); + } + + /** + * Registers $viewProvider as a valid location view provider. + * When this view provider will be called in the chain depends on $priority. The highest $priority is, the earliest the router will be called. + * + * @param \eZ\Publish\Core\MVC\Symfony\View\Provider\Location $viewProvider + * @param int $priority + */ + public function addLocationViewProvider( LocationViewProvider $viewProvider, $priority = 0 ) + { + $this->addViewProvider( $this->locationViewProviders, $viewProvider, $priority ); + } + + /** + * @return \eZ\Publish\Core\MVC\Symfony\View\Provider\Content[] + */ + public function getAllContentViewProviders() + { + if ( empty( $this->sortedContentViewProviders ) ) + $this->sortedContentViewProviders = $this->sortViewProviders( $this->contentViewProviders ); + + return $this->sortedContentViewProviders; + } + + /** + * @return \eZ\Publish\Core\MVC\Symfony\View\Provider\Location[] + */ + public function getAllLocationViewProviders() + { + if ( empty( $this->sortedLocationViewProviders ) ) + $this->sortedLocationViewProviders = $this->sortViewProviders( $this->locationViewProviders ); + + return $this->sortedLocationViewProviders; + } + + /** + * Sort the registered view providers by priority. + * The highest priority number is the highest priority (reverse sorting) + * + * @return \eZ\Publish\Core\MVC\Symfony\View\Provider\Content[]|\eZ\Publish\Core\MVC\Symfony\View\Provider\Location[] + */ + protected function sortViewProviders( $property ) + { + $sortedViewProviders = array(); + krsort( $property ); + + foreach ( $property as $viewProvider ) + { + $sortedViewProviders = array_merge( $sortedViewProviders, $viewProvider ); + } + + return $sortedViewProviders; + } + + /** + * Renders $content by selecting the right template. + * $content will be injected in the selected template. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param string $viewType Variation of display for your content. Default is 'full'. + * @param array $parameters Parameters to pass to the template called to + * render the view. By default, it's empty. 'content' entry is + * reserved for the Content that is rendered. + * @throws \RuntimeException + * + * @return string + */ + public function renderContent( Content $content, $viewType = self::VIEW_TYPE_FULL, $parameters = array() ) + { + $contentInfo = $content->getVersionInfo()->getContentInfo(); + foreach ( $this->getAllContentViewProviders() as $viewProvider ) + { + $view = $viewProvider->getView( $contentInfo, $viewType ); + if ( $view instanceof ContentViewInterface ) + { + $parameters['content'] = $content; + return $this->renderContentView( $view, $parameters ); + } + } + + throw new \RuntimeException( "Unable to find a template for #$contentInfo->id" ); + } + + /** + * Renders $location by selecting the right template for $viewType. + * $content and $location will be injected in the selected template. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $viewType Variation of display for your content. Default is 'full'. + * @param array $parameters Parameters to pass to the template called to + * render the view. By default, it's empty. 'location' and 'content' + * entries are reserved for the Location (and its Content) that is + * viewed. + * @throws \RuntimeException + * + * @return string + */ + public function renderLocation( Location $location, $viewType = self::VIEW_TYPE_FULL, $parameters = array() ) + { + foreach ( $this->getAllLocationViewProviders() as $viewProvider ) + { + $view = $viewProvider->getView( $location, $viewType ); + if ( $view instanceof ContentViewInterface ) + { + $parameters['location'] = $location; + $parameters['content'] = $this->repository->getContentService()->loadContentByContentInfo( $location->getContentInfo() ); + return $this->renderContentView( $view, $parameters ); + } + } + + throw new \RuntimeException( "Unable to find a view for location #$location->id" ); + } + + /** + * Renders passed ContentView object via the template engine. + * If $view's template identifier is a closure, then it is called directly and the result is returned as is. + * + * @param \eZ\Publish\Core\MVC\Symfony\View\ContentViewInterface $view + * @param array $defaultParams + * + * @return string + */ + public function renderContentView( ContentViewInterface $view, array $defaultParams = array() ) + { + $defaultParams['viewbaseLayout'] = $this->viewBaseLayout; + $view->addParameters( $defaultParams ); + $this->eventDispatcher->dispatch( + MVCEvents::PRE_CONTENT_VIEW, + new PreContentViewEvent( $view ) + ); + + $templateIdentifier = $view->getTemplateIdentifier(); + $params = $view->getParameters(); + if ( $templateIdentifier instanceof \Closure ) + return $templateIdentifier( $params ); + + return $this->templateEngine->render( $templateIdentifier, $params ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Provider/Configured.php b/eZ/Publish/Core/MVC/Symfony/View/Provider/Configured.php new file mode 100644 index 0000000..5eb9bb0 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Provider/Configured.php @@ -0,0 +1,56 @@ +repository = $repository; + $this->matchConfig = $matchConfig; + $this->matchers = array(); + } + + /** + * Returns the matcher object. + * + * @param string $matcherIdentifier The matcher class. If it begins with a '\' it means it's a FQ class name, otherwise it is relative to this namespace. + * + * @return \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher + */ + protected function getMatcher( $matcherIdentifier ) + { + if ( $matcherIdentifier[0] !== '\\' ) + $matcherIdentifier = "eZ\\Publish\\Core\\MVC\\Symfony\\View\\ContentViewProvider\\Configured\\Matcher\\$matcherIdentifier"; + + return new $matcherIdentifier(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Provider/Content.php b/eZ/Publish/Core/MVC/Symfony/View/Provider/Content.php new file mode 100644 index 0000000..ea0c648 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Provider/Content.php @@ -0,0 +1,30 @@ +matchConfig[$viewType] ) ) + return; + + foreach ( $this->matchConfig[$viewType] as $configHash ) + { + $hasMatched = true; + foreach ( $configHash['match'] as $matcherIdentifier => $value ) + { + // Caching the matcher instance in memory + if ( !isset( $this->matchers[$matcherIdentifier] ) ) + { + $this->matchers[$matcherIdentifier] = $this->getMatcher( $matcherIdentifier ); + } + $matcher = $this->matchers[$matcherIdentifier]; + + if ( !$matcher instanceof Matcher ) + throw new \InvalidArgumentException( + 'Matcher for ContentViewProvider\\Configured must implement eZ\\Publish\\MVC\\View\\ContentViewProvider\\Configured\\Matcher interface.' + ); + + if ( $matcher instanceof RepositoryAwareInterface ) + $matcher->setRepository( $this->repository ); + + $matcher->setMatchingConfig( $value ); + if ( !$matcher->matchLocation( $location ) ) + $hasMatched = false; + } + + if ( $hasMatched ) + { + return new ContentView( $configHash['template'] ); + } + } + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/BaseTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/BaseTest.php new file mode 100644 index 0000000..cdf9191 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/BaseTest.php @@ -0,0 +1,80 @@ +repositoryMock = $this->getRepositoryMock(); + } + + /** + * @param array $matchingConfig + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartiallyMockedLocationViewProvider( array $matchingConfig = array() ) + { + return $this + ->getMockBuilder( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location\\Configured' ) + ->setConstructorArgs( + array( + $this->repositoryMock, + $matchingConfig + ) + ) + ->setMethods( array( 'getMatcher' ) ) + ->getMock(); + } + + /** + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getRepositoryMock() + { + return $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\Repository' ) + ->disableOriginalConstructor() + ->getMock(); + } + + /** + * @param array $properties + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getLocationMock( array $properties = array() ) + { + return $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ) + ->setConstructorArgs( array( $properties ) ) + ->getMockForAbstractClass(); + } + + /** + * @param array $properties + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getContentInfoMock( array $properties = array() ) + { + return $this-> + getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\Content\\ContentInfo' ) + ->setConstructorArgs( array( $properties ) ) + ->getMockForAbstractClass(); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/ConfiguredTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/ConfiguredTest.php new file mode 100644 index 0000000..7a4a7c1 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/ConfiguredTest.php @@ -0,0 +1,147 @@ +getPartiallyMockedLocationViewProvider( + array( + 'full' => array( + 'failingMatchBlock' => array( + 'match' => array( + 'wrongMatcher' => 'bibou est un gentil garçon' + ), + 'template' => "mytemplate" + ) + ) + ) + ); + $lvp + ->expects( $this->once() ) + ->method( 'getMatcher' ) + ->with( 'wrongMatcher' ) + ->will( $this->returnValue( new \stdClass() ) ); + + $lvp->getView( + $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ), + 'full' + ); + } + + /** + * @param \PHPUnit_Framework_MockObject_MockObject[] $matchers + * @param array $matchingConfig + * @param boolean $match + * + * @return void + * @covers eZ\Publish\Core\MVC\Symfony\View\Provider\Content\Configured::__construct + * @covers eZ\Publish\Core\MVC\Symfony\View\Provider\Content\Configured::getView + * + * @dataProvider getViewLocationProvider + */ + public function testGetViewLocation( array $matchers, array $matchingConfig, $match ) + { + $lvp = $this->getPartiallyMockedLocationViewProvider( $matchingConfig ); + $lvp + ->expects( + $this->exactly( count( $matchers ) ) + ) + ->method( 'getMatcher' ) + ->will( + $this->onConsecutiveCalls( + $matchers[0], $matchers[1] + ) + ); + + $contentView = $lvp->getView( + $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ), + 'full' + ); + if ( $match ) + $this->assertInstanceOf( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\ContentViewInterface', $contentView ); + else + $this->assertNull( $contentView ); + } + + /** + * Provides a configuration with different matchers. + * One on two set of matchers will force matching to fail. + * + * @return array + */ + public function getViewLocationProvider() + { + $arguments = array(); + for ( $i = 0; $i < 10; ++$i ) + { + $matchValue = "foo-$i"; + $matchers = array(); + $matchingConfig = array(); + $doMatch = true; + + $matcherMock1 = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\ContentViewProvider\\Configured\\Matcher' ); + $matcherMock1 + ->expects( $this->any() ) + ->method( 'setMatchingConfig' ) + ->with( $matchValue ); + $matcherMock1 + ->expects( $this->any() ) + ->method( 'matchLocation' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ) ) + ->will( $this->returnValue( true ) ); + $matchers[] = $matcherMock1; + $matchingConfig[get_class( $matcherMock1 )] = $matchValue; + + // Introducing a failing matcher every even iteration + if ( $i % 2 == 0 ) + { + $failingMatcher = clone $matcherMock1; + $failingMatcher + ->expects( $this->once() ) + ->method( 'matchLocation' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ) ) + ->will( $this->returnValue( true ) ); + $matchers[] = $failingMatcher; + $matchingConfig[get_class( $failingMatcher ) . 'failing'] = $matchValue; + } + else + { + // Cloning the first mock as it is supposed to match as well. + $matcherMock2 = clone $matcherMock1; + $matchers[] = $matcherMock2; + $matchingConfig[get_class( $matcherMock2 ) . 'second'] = $matchValue; + } + + $arguments[] = array( + $matchers, + array( + 'full' => array( + "matchingBlock-$i" => array( + 'match' => $matchingConfig, + 'template' => "mytemplate-$i" + ) + ) + ), + $doMatch + ); + } + + return $arguments; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/DepthTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/DepthTest.php new file mode 100644 index 0000000..bac246e --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/DepthTest.php @@ -0,0 +1,160 @@ +matcher = new DepthMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Depth::matchLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + return array( + array( + 1, + $this->getLocationMock( array( 'depth' => 1 ) ), + true + ), + array( + 1, + $this->getLocationMock( array( 'depth' => 2 ) ), + false + ), + array( + array( 1, 3 ), + $this->getLocationMock( array( 'depth' => 2 ) ), + false + ), + array( + array( 1, 3 ), + $this->getLocationMock( array( 'depth' => 3 ) ), + true + ), + array( + array( 1, 3 ), + $this->getLocationMock( array( 'depth' => 0 ) ), + false + ), + array( + array( 0, 1 ), + $this->getLocationMock( array( 'depth' => 0 ) ), + true + ) + ); + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Depth::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchContentInfo( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchContentInfo( $this->getContentInfoMock( array( "mainLocationId" => 42 ) ) ) + ); + } + + public function matchContentInfoProvider() + { + return array( + array( + 1, + $this->generateRepositoryMockForDepth( 1 ), + true + ), + array( + 1, + $this->generateRepositoryMockForDepth( 2 ), + false + ), + array( + array( 1, 3 ), + $this->generateRepositoryMockForDepth( 2 ), + false + ), + array( + array( 1, 3 ), + $this->generateRepositoryMockForDepth( 3 ), + true + ) + ); + } + + /** + * Returns a Repository mock configured to return the appropriate Location object with given parent location Id + * + * @param int $depth + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateRepositoryMockForDepth( $depth ) + { + $locationServiceMock = $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\LocationService' ) + ->disableOriginalConstructor() + ->getMock(); + $locationServiceMock->expects( $this->once() ) + ->method( 'loadLocation' ) + ->with( 42 ) + ->will( + $this->returnValue( + $this->getLocationMock( array( 'depth' => $depth ) ) + ) + ); + + $repository = $this->getRepositoryMock(); + $repository + ->expects( $this->once() ) + ->method( 'getLocationService' ) + ->will( $this->returnValue( $locationServiceMock ) ); + + return $repository; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTest.php new file mode 100644 index 0000000..0db7144 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTest.php @@ -0,0 +1,133 @@ +matcher = new ContentIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Content::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + return array( + array( + 123, + $this->generateLocationForContentId( 123 ), + true + ), + array( + 123, + $this->generateLocationForContentId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateLocationForContentId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateLocationForContentId( 789 ), + true + ) + ); + } + + /** + * Generates a Location mock in respect of a given content Id + * + * @param int $contentId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateLocationForContentId( $contentId ) + { + $location = $this->getLocationMock(); + $location + ->expects( $this->any() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( + $this->getContentInfoMock( array( 'id' => $contentId ) ) + ) + ); + + return $location; + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Content::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, ContentInfo $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + return array( + array( + 123, + $this->getContentInfoMock( array( 'id' => 123 ) ), + true + ), + array( + 123, + $this->getContentInfoMock( array( 'id' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getContentInfoMock( array( 'id' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getContentInfoMock( array( 'id' => 789 ) ), + true + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTypeGroupTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTypeGroupTest.php new file mode 100644 index 0000000..eae6ba1 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTypeGroupTest.php @@ -0,0 +1,179 @@ +matcher = new ContentTypeGroupIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ContentTypeGroup::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + $data = array(); + + $data[] = array( + 123, + $this->generateLocationForContentTypeGroup( 123 ), + true + ); + + $data[] = array( + 123, + $this->generateLocationForContentTypeGroup( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateLocationForContentTypeGroup( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateLocationForContentTypeGroup( 789 ), + true + ); + + return $data; + } + + /** + * Generates a Location object in respect of a given content type identifier + * + * @param int $contentTypeGroupId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateLocationForContentTypeGroup( $contentTypeGroupId ) + { + $location = $this->getLocationMock(); + $location + ->expects( $this->any() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( + $this->generateContentInfoForContentTypeGroup( $contentTypeGroupId ) + ) + ); + + return $location; + } + + /** + * Generates a ContentInfo object in respect of a given content type identifier + * + * @param int $contentTypeGroupId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateContentInfoForContentTypeGroup( $contentTypeGroupId ) + { + // First a group that will never match, then the right group. + // This ensures to test even if the content type belongs to several groups at once + $contentTypeGroups = array( + $this->getMockForAbstractClass( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ), + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup' ) + ->setConstructorArgs( + array( array( 'id' => $contentTypeGroupId ) ) + ) + ->getMockForAbstractClass() + ); + + $contentType = $this->getMockForAbstractClass( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ); + $contentType + ->expects( $this->once() ) + ->method( 'getContentTypeGroups' ) + ->will( $this->returnValue( $contentTypeGroups ) ); + + $contentInfo = $this->getContentInfoMock(); + $contentInfo + ->expects( $this->any() ) + ->method( 'getContentType' ) + ->will( $this->returnValue( $contentType ) ); + + return $contentInfo; + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ContentTypeGroup::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, ContentInfo $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + $data = array(); + + $data[] = array( + 123, + $this->generateContentInfoForContentTypeGroup( 123 ), + true + ); + + $data[] = array( + 123, + $this->generateContentInfoForContentTypeGroup( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateContentInfoForContentTypeGroup( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateContentInfoForContentTypeGroup( 789 ), + true + ); + + return $data; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTypeTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTypeTest.php new file mode 100644 index 0000000..6a2ec9d --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ContentTypeTest.php @@ -0,0 +1,170 @@ +matcher = new ContentTypeIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ContentType::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + $data = array(); + + $data[] = array( + 123, + $this->generateLocationForContentType( 123 ), + true + ); + + $data[] = array( + 123, + $this->generateLocationForContentType( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateLocationForContentType( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateLocationForContentType( 789 ), + true + ); + + return $data; + } + + /** + * Generates a Location object in respect of a given content type identifier + * + * @param int $contentTypeId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateLocationForContentType( $contentTypeId ) + { + $location = $this->getLocationMock(); + $location + ->expects( $this->any() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( + $this->generateContentInfoForContentType( $contentTypeId ) + ) + ); + + return $location; + } + + /** + * Generates a ContentInfo object in respect of a given content type identifier + * + * @param int $contentTypeId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateContentInfoForContentType( $contentTypeId ) + { + $contentInfo = $this->getContentInfoMock(); + $contentInfo + ->expects( $this->any() ) + ->method( 'getContentType' ) + ->will( + $this->returnValue( + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ) + ->setConstructorArgs( + array( array( 'id' => $contentTypeId ) ) + ) + ->getMockForAbstractClass() + ) + ); + + return $contentInfo; + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ContentType::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, ContentInfo $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + $data = array(); + + $data[] = array( + 123, + $this->generateContentInfoForContentType( 123 ), + true + ); + + $data[] = array( + 123, + $this->generateContentInfoForContentType( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateContentInfoForContentType( 456 ), + false + ); + + $data[] = array( + array( 123, 789 ), + $this->generateContentInfoForContentType( 789 ), + true + ); + + return $data; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/LocationTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/LocationTest.php new file mode 100644 index 0000000..0f2eb5c --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/LocationTest.php @@ -0,0 +1,111 @@ +matcher = new LocationIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Location::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + return array( + array( + 123, + $this->getLocationMock( array( 'id' => 123 ) ), + true + ), + array( + 123, + $this->getLocationMock( array( 'id' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getLocationMock( array( 'id' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getLocationMock( array( 'id' => 789 ) ), + true + ) + ); + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Location::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, ContentInfo $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + return array( + array( + 123, + $this->getContentInfoMock( array( 'mainLocationId' => 123 ) ), + true + ), + array( + 123, + $this->getContentInfoMock( array( 'mainLocationId' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getContentInfoMock( array( 'mainLocationId' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getContentInfoMock( array( 'mainLocationId' => 789 ) ), + true + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ParentContentTypeTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ParentContentTypeTest.php new file mode 100644 index 0000000..c6d991a --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ParentContentTypeTest.php @@ -0,0 +1,154 @@ +matcher = new ParentContentTypeMatcher; + } + + /** + * Returns a Repository mock configured to return the appropriate Section object with given section identifier + * + * @param int $contentTypeId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateRepositoryMockForContentTypeId( $contentTypeId ) + { + $parentContentInfo = $this->getContentInfoMock(); + $parentContentInfo->expects( $this->once() ) + ->method( 'getContentType' ) + ->will( + $this->returnValue( + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ) + ->setConstructorArgs( + array( + array( 'id' => $contentTypeId ) + ) + ) + ->getMockForAbstractClass() + ) + ); + $parentLocation = $this->getLocationMock(); + $parentLocation->expects( $this->once() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( $parentContentInfo ) + ); + + $locationServiceMock = $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\LocationService' ) + ->disableOriginalConstructor() + ->getMock(); + $locationServiceMock->expects( $this->atLeastOnce() ) + ->method( 'loadLocation' ) + ->will( + $this->returnValue( $parentLocation ) + ); + // The following is used in the case of a match by contentInfo + $locationServiceMock->expects( $this->any() ) + ->method( 'loadLocation' ) + ->will( + $this->returnValue( $this->getLocationMock() ) + ); + + $repository = $this->getRepositoryMock(); + $repository + ->expects( $this->any() ) + ->method( 'getLocationService' ) + ->will( $this->returnValue( $locationServiceMock ) ); + + return $repository; + } + + /** + * @dataProvider matchLocationProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ParentContentType::matchLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchLocation( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchLocation( $this->getLocationMock() ) + ); + } + + public function matchLocationProvider() + { + return array( + array( + 123, + $this->generateRepositoryMockForContentTypeId( 123 ), + true + ), + array( + 123, + $this->generateRepositoryMockForContentTypeId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateRepositoryMockForContentTypeId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateRepositoryMockForContentTypeId( 789 ), + true + ) + ); + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ParentContentType::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchContentInfo( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchContentInfo( $this->getContentInfoMock() ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ParentLocationTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ParentLocationTest.php new file mode 100644 index 0000000..10b2165 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/ParentLocationTest.php @@ -0,0 +1,150 @@ +matcher = new ParentLocationIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ParentLocation::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + return array( + array( + 123, + $this->getLocationMock( array( 'parentLocationId' => 123 ) ), + true + ), + array( + 123, + $this->getLocationMock( array( 'parentLocationId' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getLocationMock( array( 'parentLocationId' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getLocationMock( array( 'parentLocationId' => 789 ) ), + true + ) + ); + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\ParentLocation::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchContentInfo( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchContentInfo( $this->getContentInfoMock( array( "mainLocationId" => 42 ) ) ) + ); + } + + public function matchContentInfoProvider() + { + return array( + array( + 123, + $this->generateRepositoryMockForParentLocationId( 123 ), + true + ), + array( + 123, + $this->generateRepositoryMockForParentLocationId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateRepositoryMockForParentLocationId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateRepositoryMockForParentLocationId( 789 ), + true + ) + ); + } + + /** + * Returns a Repository mock configured to return the appropriate Location object with given parent location Id + * + * @param int $parentLocationId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateRepositoryMockForParentLocationId( $parentLocationId ) + { + $locationServiceMock = $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\LocationService' ) + ->disableOriginalConstructor() + ->getMock(); + $locationServiceMock->expects( $this->once() ) + ->method( 'loadLocation' ) + ->with( 42 ) + ->will( + $this->returnValue( + $this->getLocationMock( array( 'parentLocationId' => $parentLocationId ) ) + ) + ); + + $repository = $this->getRepositoryMock(); + $repository + ->expects( $this->once() ) + ->method( 'getLocationService' ) + ->will( $this->returnValue( $locationServiceMock ) ); + + return $repository; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/RemoteTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/RemoteTest.php new file mode 100644 index 0000000..2d2d548 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/RemoteTest.php @@ -0,0 +1,111 @@ +matcher = new RemoteIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Remote::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + return array( + array( + 'foo', + $this->getLocationMock( array( 'remoteId' => 'foo' ) ), + true + ), + array( + 'foo', + $this->getLocationMock( array( 'remoteId' => 'bar' ) ), + false + ), + array( + array( 'foo', 'baz' ), + $this->getLocationMock( array( 'remoteId' => 'bar' ) ), + false + ), + array( + array( 'foo', 'baz' ), + $this->getLocationMock( array( 'remoteId' => 'baz' ) ), + true + ) + ); + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Remote::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, ContentInfo $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + return array( + array( + 'foo', + $this->getContentInfoMock( array( 'remoteId' => 'foo' ) ), + true + ), + array( + 'foo', + $this->getContentInfoMock( array( 'remoteId' => 'bar' ) ), + false + ), + array( + array( 'foo', 'baz' ), + $this->getContentInfoMock( array( 'remoteId' => 'bar' ) ), + false + ), + array( + array( 'foo', 'baz' ), + $this->getContentInfoMock( array( 'remoteId' => 'baz' ) ), + true + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/SectionTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/SectionTest.php new file mode 100644 index 0000000..67b5881 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Id/SectionTest.php @@ -0,0 +1,133 @@ +matcher = new SectionIdMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Section::matchLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, Location $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + return array( + array( + 123, + $this->generateLocationForSectionId( 123 ), + true + ), + array( + 123, + $this->generateLocationForSectionId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateLocationForSectionId( 456 ), + false + ), + array( + array( 123, 789 ), + $this->generateLocationForSectionId( 789 ), + true + ) + ); + } + + /** + * Generates a Location mock in respect of a given content Id + * + * @param int $sectionId + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateLocationForSectionId( $sectionId ) + { + $location = $this->getLocationMock(); + $location + ->expects( $this->any() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( + $this->getContentInfoMock( array( 'sectionId' => $sectionId ) ) + ) + ); + + return $location; + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Id\Section::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param int|int[] $matchingConfig + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, ContentInfo $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + return array( + array( + 123, + $this->getContentInfoMock( array( 'sectionId' => 123 ) ), + true + ), + array( + 123, + $this->getContentInfoMock( array( 'sectionId' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getContentInfoMock( array( 'sectionId' => 456 ) ), + false + ), + array( + array( 123, 789 ), + $this->getContentInfoMock( array( 'sectionId' => 789 ) ), + true + ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/ContentTypeTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/ContentTypeTest.php new file mode 100644 index 0000000..222cb96 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/ContentTypeTest.php @@ -0,0 +1,170 @@ +matcher = new ContentTypeIdentifierMatcher; + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Identifier\ContentType::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param string|string[] $matchingConfig + * @param \PHPUnit_Framework_MockObject_MockObject $location + * @param boolean $expectedResult + */ + public function testMatchLocation( $matchingConfig, $location, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchLocation( $location ) ); + } + + public function matchLocationProvider() + { + $data = array(); + + $data[] = array( + 'foo', + $this->generateLocationForContentType( 'foo' ), + true + ); + + $data[] = array( + 'foo', + $this->generateLocationForContentType( 'bar' ), + false + ); + + $data[] = array( + array( 'foo', 'baz' ), + $this->generateLocationForContentType( 'bar' ), + false + ); + + $data[] = array( + array( 'foo', 'baz' ), + $this->generateLocationForContentType( 'baz' ), + true + ); + + return $data; + } + + /** + * Generates a Location object in respect of a given content type identifier + * + * @param string $contentTypeIdentifier + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateLocationForContentType( $contentTypeIdentifier ) + { + $location = $this->getLocationMock(); + $location + ->expects( $this->any() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( + $this->generateContentInfoForContentType( $contentTypeIdentifier ) + ) + ); + + return $location; + } + + /** + * Generates a ContentInfo object in respect of a given content type identifier + * + * @param string $contentTypeIdentifier + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateContentInfoForContentType( $contentTypeIdentifier ) + { + $contentInfo = $this->getContentInfoMock(); + $contentInfo + ->expects( $this->any() ) + ->method( 'getContentType' ) + ->will( + $this->returnValue( + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ) + ->setConstructorArgs( + array( array( 'identifier' => $contentTypeIdentifier ) ) + ) + ->getMockForAbstractClass() + ) + ); + + return $contentInfo; + } + + /** + * @dataProvider matchContentInfoProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Identifier\ContentType::matchLocation + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param string|string[] $matchingConfig + * @param \PHPUnit_Framework_MockObject_MockObject $contentInfo + * @param boolean $expectedResult + */ + public function testMatchContentInfo( $matchingConfig, $contentInfo, $expectedResult ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( $expectedResult, $this->matcher->matchContentInfo( $contentInfo ) ); + } + + public function matchContentInfoProvider() + { + $data = array(); + + $data[] = array( + 'foo', + $this->generateContentInfoForContentType( 'foo' ), + true + ); + + $data[] = array( + 'foo', + $this->generateContentInfoForContentType( 'bar' ), + false + ); + + $data[] = array( + array( 'foo', 'baz' ), + $this->generateContentInfoForContentType( 'bar' ), + false + ); + + $data[] = array( + array( 'foo', 'baz' ), + $this->generateContentInfoForContentType( 'baz' ), + true + ); + + return $data; + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/ParentContentTypeTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/ParentContentTypeTest.php new file mode 100644 index 0000000..cae6adc --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/ParentContentTypeTest.php @@ -0,0 +1,154 @@ +matcher = new ParentContentTypeMatcher; + } + + /** + * Returns a Repository mock configured to return the appropriate Section object with given section identifier + * + * @param string $contentTypeIdentifier + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateRepositoryMockForContentTypeIdentifier( $contentTypeIdentifier ) + { + $parentContentInfo = $this->getContentInfoMock(); + $parentContentInfo->expects( $this->once() ) + ->method( 'getContentType' ) + ->will( + $this->returnValue( + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ) + ->setConstructorArgs( + array( + array( 'identifier' => $contentTypeIdentifier ) + ) + ) + ->getMockForAbstractClass() + ) + ); + $parentLocation = $this->getLocationMock(); + $parentLocation->expects( $this->once() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( $parentContentInfo ) + ); + + $locationServiceMock = $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\LocationService' ) + ->disableOriginalConstructor() + ->getMock(); + $locationServiceMock->expects( $this->atLeastOnce() ) + ->method( 'loadLocation' ) + ->will( + $this->returnValue( $parentLocation ) + ); + // The following is used in the case of a match by contentInfo + $locationServiceMock->expects( $this->any() ) + ->method( 'loadLocation' ) + ->will( + $this->returnValue( $this->getLocationMock() ) + ); + + $repository = $this->getRepositoryMock(); + $repository + ->expects( $this->any() ) + ->method( 'getLocationService' ) + ->will( $this->returnValue( $locationServiceMock ) ); + + return $repository; + } + + /** + * @dataProvider matchLocationProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Identifier\ParentContentType::matchLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchLocation( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchLocation( $this->getLocationMock() ) + ); + } + + public function matchLocationProvider() + { + return array( + array( + 'foo', + $this->generateRepositoryMockForContentTypeIdentifier( 'foo' ), + true + ), + array( + 'foo', + $this->generateRepositoryMockForContentTypeIdentifier( 'bar' ), + false + ), + array( + array( 'foo', 'baz' ), + $this->generateRepositoryMockForContentTypeIdentifier( 'bar' ), + false + ), + array( + array( 'foo', 'baz' ), + $this->generateRepositoryMockForContentTypeIdentifier( 'baz' ), + true + ) + ); + } + + /** + * @dataProvider matchLocationProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Identifier\ParentContentType::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchContentInfo( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchContentInfo( $this->getContentInfoMock() ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/SectionTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/SectionTest.php new file mode 100644 index 0000000..17872cb --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/Identifier/SectionTest.php @@ -0,0 +1,146 @@ +matcher = new SectionIdentifierMatcher; + } + + /** + * Returns a Repository mock configured to return the appropriate Section object with given section identifier + * + * @param string $sectionIdentifier + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateRepositoryMockForSectionIdentifier( $sectionIdentifier ) + { + $sectionServiceMock = $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\SectionService' ) + ->disableOriginalConstructor() + ->getMock(); + $sectionServiceMock->expects( $this->once() ) + ->method( 'loadSection' ) + ->will( + $this->returnValue( + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Section' ) + ->setConstructorArgs( + array( + array( 'identifier' => $sectionIdentifier ) + ) + ) + ->getMockForAbstractClass() + ) + ); + + $repository = $this->getRepositoryMock(); + $repository + ->expects( $this->once() ) + ->method( 'getSectionService' ) + ->will( $this->returnValue( $sectionServiceMock ) ); + + return $repository; + } + + /** + * @dataProvider matchSectionProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Identifier\Section::matchLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchLocation( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $location = $this->getLocationMock(); + $location + ->expects( $this->once() ) + ->method( 'getContentInfo' ) + ->will( + $this->returnValue( + $this->getContentInfoMock() + ) + ); + $this->assertSame( + $expectedResult, + $this->matcher->matchLocation( $location ) + ); + } + + public function matchSectionProvider() + { + return array( + array( + 'foo', + $this->generateRepositoryMockForSectionIdentifier( 'foo' ), + true + ), + array( + 'foo', + $this->generateRepositoryMockForSectionIdentifier( 'bar' ), + false + ), + array( + array( 'foo', 'baz' ), + $this->generateRepositoryMockForSectionIdentifier( 'bar' ), + false + ), + array( + array( 'foo', 'baz' ), + $this->generateRepositoryMockForSectionIdentifier( 'baz' ), + true + ) + ); + } + + /** + * @dataProvider matchSectionProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\Identifier\Section::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchContentInfo( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchContentInfo( $this->getContentInfoMock() ) + ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/MultipleValuedTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/MultipleValuedTest.php new file mode 100644 index 0000000..20f87e4 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/MultipleValuedTest.php @@ -0,0 +1,67 @@ +getMultipleValuedMatcherMock(); + $matcher->setMatchingConfig( $matchingConfig ); + $values = $matcher->getValues(); + $this->assertInternalType( 'array', $values ); + + $matchingConfig = is_array( $matchingConfig ) ? $matchingConfig : array( $matchingConfig ); + foreach ( $matchingConfig as $val ) + { + $this->assertContains( $val, $values ); + } + } + + /** + * Returns a set of matching values, either single or multiple. + * + * @return array + */ + public function matchingConfigProvider() + { + return array( + array( + 'singleValue', + array( 'one', 'two', 'three' ), + array( 123, 'nous irons au bois' ), + 456 + ) + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::getRepository + */ + public function testInjectRepository() + { + $matcher = $this->getMultipleValuedMatcherMock(); + $matcher->setRepository( $this->repositoryMock ); + $this->assertSame( $this->repositoryMock, $matcher->getRepository() ); + } + + private function getMultipleValuedMatcherMock() + { + return $this->getMockForAbstractClass( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\ContentViewProvider\\Configured\\Matcher\\MultipleValued' ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/UrlAliasTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/UrlAliasTest.php new file mode 100644 index 0000000..542aa9e --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewProvider/Configured/Matcher/UrlAliasTest.php @@ -0,0 +1,155 @@ +matcher = new UrlAliasMatcher; + } + + /** + * @dataProvider setMatchingConfigProvider + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\UrlAlias::setMatchingConfig + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\MultipleValued::setMatchingConfig + * + * @param string $matchingConfig + * @param string[] $expectedValues + */ + public function testSetMatchingConfig( $matchingConfig, $expectedValues ) + { + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $this->matcher->getValues(), + $expectedValues + ); + } + + public function setMatchingConfigProvider() + { + return array( + array( '/foo/bar/', array( 'foo/bar' ) ), + array( '/foo/bar/', array( 'foo/bar' ) ), + array( '/foo/bar', array( 'foo/bar' ) ), + array( array( '/foo/bar/', 'baz/biz/' ), array( 'foo/bar', 'baz/biz' ) ), + array( array( 'foo/bar', 'baz/biz' ), array( 'foo/bar', 'baz/biz' ) ), + ); + } + + /** + * Returns a Repository mock configured to return the appropriate Section object with given section identifier + * + * @param string $path + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + private function generateRepositoryMockForUrlAlias( $path ) + { + // First an url alias that will never match, then the right url alias. + // This ensures to test even if the location has several url aliases. + $urlAliasList = array( + $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias' ), + $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias' ) + ->setConstructorArgs( array( array( 'path' => $path ) ) ) + ->getMockForAbstractClass() + ); + + $urlAliasServiceMock = $this + ->getMockBuilder( 'eZ\\Publish\\API\\Repository\\URLAliasService' ) + ->disableOriginalConstructor() + ->getMock(); + $urlAliasServiceMock->expects( $this->once() ) + ->method( 'listLocationAliases' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ), + $this->isType( 'boolean' ) + ) + ->will( $this->returnValue( $urlAliasList ) ); + + $repository = $this->getRepositoryMock(); + $repository + ->expects( $this->once() ) + ->method( 'getUrlAliasService' ) + ->will( $this->returnValue( $urlAliasServiceMock ) ); + + return $repository; + } + + /** + * @dataProvider matchLocationProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\UrlAlias::matchLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\UrlAlias::setMatchingConfig + * @covers \eZ\Publish\Core\MVC\RepositoryAware::setRepository + * + * @param string|string[] $matchingConfig + * @param \eZ\Publish\API\Repository\Repository $repository + * @param boolean $expectedResult + * + * @return void + */ + public function testMatchLocation( $matchingConfig, Repository $repository, $expectedResult ) + { + $this->matcher->setRepository( $repository ); + $this->matcher->setMatchingConfig( $matchingConfig ); + $this->assertSame( + $expectedResult, + $this->matcher->matchLocation( $this->getLocationMock() ) + ); + } + + public function matchLocationProvider() + { + return array( + array( + 'foo/url', + $this->generateRepositoryMockForUrlAlias( 'foo/url' ), + true + ), + array( + 'foo/url', + $this->generateRepositoryMockForUrlAlias( 'bar/url' ), + false + ), + array( + array( 'foo/url', 'baz' ), + $this->generateRepositoryMockForUrlAlias( 'bar/url' ), + false + ), + array( + array( 'foo/url', 'baz' ), + $this->generateRepositoryMockForUrlAlias( 'baz' ), + true + ) + ); + } + + /** + * @expectedException \RuntimeException + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\UrlAlias::matchContentInfo + * @covers eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher\UrlAlias::setMatchingConfig + */ + public function testMatchContentInfo() + { + $this->matcher->setMatchingConfig( 'foo/bar' ); + $this->matcher->matchContentInfo( $this->getContentInfoMock() ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewTest.php new file mode 100644 index 0000000..0b74501 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ContentViewTest.php @@ -0,0 +1,138 @@ +getTemplateIdentifier() ); + self::assertSame( $params, $contentView->getParameters() ); + } + + public function constructProvider() + { + return array( + array( 'some:valid:identifier', array( 'foo' => 'bar' ) ), + array( 'another::identifier', array() ), + array( 'oops:i_did_it:again', array( 'singer' => 'Britney Spears' ) ), + array( + function () + { + return true; + }, + array() + ), + array( + function () + { + return true; + }, + array( 'truc' => 'muche' ) + ), + ); + } + + /** + * @dataProvider constructFailProvider + * @expectedException \eZ\Publish\Core\Base\Exceptions\InvalidArgumentType + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::__construct + */ + public function testConstructFail( $templateIdentifier ) + { + new ContentView( $templateIdentifier ); + } + + public function constructFailProvider() + { + return array( + array( 123 ), + array( new \stdClass ), + array( array( 1, 2, 3 ) ), + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::setParameters + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::getParameters + */ + public function testGetSetParameters() + { + $params = array( 'bar' => 'baz', 'fruit' => 'apple' ); + $contentView = new ContentView( 'foo' ); + $contentView->setParameters( $params ); + self::assertSame( $params, $contentView->getParameters() ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::setParameters + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::getParameters + */ + public function testAddParameters() + { + $params = array( 'bar' => 'baz', 'fruit' => 'apple' ); + $contentView = new ContentView( 'foo', $params ); + + $additionalParams = array( 'truc' => 'muche', 'laurel' => 'hardy' ); + $contentView->addParameters( $additionalParams ); + self::assertSame( $params + $additionalParams, $contentView->getParameters() ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::setParameters + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::getParameters + */ + public function testHasParameter() + { + $contentView = new ContentView( __METHOD__, array( 'foo' => 'bar' ) ); + self::assertTrue( $contentView->hasParameter( 'foo' ) ); + self::assertFalse( $contentView->hasParameter( 'nonExistent' ) ); + return $contentView; + } + + /** + * @depends testHasParameter + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::setParameters + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::getParameters + */ + public function testGetParameter( ContentView $contentView ) + { + self::assertSame( 'bar', $contentView->getParameter( 'foo' ) ); + return $contentView; + } + + /** + * @depends testGetParameter + * @expectedException \InvalidArgumentException + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::__construct + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::setParameters + * @covers \eZ\Publish\Core\MVC\Symfony\View\ContentView::getParameters + */ + public function testGetParameterFail( ContentView $contentView ) + { + $contentView->getParameter( 'nonExistent' ); + } +} diff --git a/eZ/Publish/Core/MVC/Symfony/View/Tests/ViewManagerTest.php b/eZ/Publish/Core/MVC/Symfony/View/Tests/ViewManagerTest.php new file mode 100644 index 0000000..deba118 --- /dev/null +++ b/eZ/Publish/Core/MVC/Symfony/View/Tests/ViewManagerTest.php @@ -0,0 +1,351 @@ +templateEngineMock = $this->getMock( 'Symfony\\Component\\Templating\\EngineInterface' ); + $this->eventDispatcherMock = $this->getMock( 'Symfony\\Component\\EventDispatcher\\EventDispatcherInterface' ); + $this->repositoryMock = $this->getMockBuilder( 'eZ\\Publish\\Core\\Repository\\Repository' ) + ->disableOriginalConstructor() + ->getMock(); + $this->viewManager = new Manager( + $this->templateEngineMock, + $this->eventDispatcherMock, + $this->repositoryMock, + $this->viewBaseLayout + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::addContentViewProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::getAllContentViewProviders + */ + public function testAddContentViewProvider() + { + self::assertSame( array(), $this->viewManager->getAllContentViewProviders() ); + $viewProvider = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Content' ); + $this->viewManager->addContentViewProvider( $viewProvider ); + self::assertSame( array( $viewProvider ), $this->viewManager->getAllContentViewProviders() ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::addLocationViewProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::getAllLocationViewProviders + */ + public function testAddLocationViewProvider() + { + self::assertSame( array(), $this->viewManager->getAllLocationViewProviders() ); + $viewProvider = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location' ); + $this->viewManager->addLocationViewProvider( $viewProvider ); + self::assertSame( array( $viewProvider ), $this->viewManager->getAllLocationViewProviders() ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::addContentViewProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::sortViewProviders + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::getAllContentViewProviders + */ + public function testContentViewProvidersPriority() + { + list( $high, $medium, $low ) = $this->createContentViewProviderMocks(); + $this->viewManager->addContentViewProvider( $medium, 33 ); + $this->viewManager->addContentViewProvider( $high, 100 ); + $this->viewManager->addContentViewProvider( $low, -100 ); + self::assertSame( + array( $high, $medium, $low ), + $this->viewManager->getAllContentViewProviders() + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::addLocationViewProvider + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::sortViewProviders + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::getAllLocationViewProviders + */ + public function testLocationViewProvidersPriority() + { + list( $high, $medium, $low ) = $this->createLocationViewProviderMocks(); + $this->viewManager->addLocationViewProvider( $medium, 33 ); + $this->viewManager->addLocationViewProvider( $high, 100 ); + $this->viewManager->addLocationViewProvider( $low, -100 ); + self::assertSame( + array( $high, $medium, $low ), + $this->viewManager->getAllLocationViewProviders() + ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderContent + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderContentView + */ + public function testRenderContent() + { + $viewProvider = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Content' ); + $this->viewManager->addContentViewProvider( $viewProvider ); + + // Configuring content mocks + $content = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content' ); + $versionInfo = $this->getMock( 'eZ\\Publish\\Core\\Repository\\Values\\Content\\VersionInfo' ); + $contentInfo = $this->getMock( 'eZ\\Publish\\Core\\Repository\\Values\\Content\\ContentInfo' ); + $content + ->expects( $this->once() ) + ->method( 'getVersionInfo' ) + ->will( $this->returnValue( $versionInfo ) ); + $versionInfo + ->expects( $this->once() ) + ->method( 'getContentInfo' ) + ->will( $this->returnValue( $contentInfo ) ); + + // Configuring view provider behaviour + $templateIdentifier = 'foo:bar:baz'; + $params = array( 'foo' => 'bar' ); + $viewProvider + ->expects( $this->once() ) + ->method( 'getView' ) + ->with( $contentInfo, 'customViewType' ) + ->will( + $this->returnValue( + new ContentView( $templateIdentifier, $params ) + ) + ); + + // Configuring template engine behaviour + $expectedTemplateResult = 'This is content rendering'; + $this->templateEngineMock + ->expects( $this->once() ) + ->method( 'render' ) + ->with( $templateIdentifier, $params + array( 'content' => $content, 'viewbaseLayout' => $this->viewBaseLayout ) ) + ->will( $this->returnValue( $expectedTemplateResult ) ); + + self::assertSame( $expectedTemplateResult, $this->viewManager->renderContent( $content, 'customViewType' ) ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderContent + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderContentView + */ + public function testRenderContentWithClosure() + { + $viewProvider = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Content' ); + $this->viewManager->addContentViewProvider( $viewProvider ); + + // Configuring content mocks + $content = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content' ); + $versionInfo = $this->getMock( 'eZ\\Publish\\Core\\Repository\\Values\\Content\\VersionInfo' ); + $contentInfo = $this->getMock( 'eZ\\Publish\\Core\\Repository\\Values\\Content\\ContentInfo' ); + $content + ->expects( $this->once() ) + ->method( 'getVersionInfo' ) + ->will( $this->returnValue( $versionInfo ) ); + $versionInfo + ->expects( $this->once() ) + ->method( 'getContentInfo' ) + ->will( $this->returnValue( $contentInfo ) ); + + // Configuring view provider behaviour + $closure = function ( $params ) + { + return serialize( array_keys( $params ) ); + }; + $params = array( 'foo' => 'bar' ); + $viewProvider + ->expects( $this->once() ) + ->method( 'getView' ) + ->with( $contentInfo ) + ->will( + $this->returnValue( + new ContentView( $closure, $params ) + ) + ); + + // Configuring template engine behaviour + $params += array( 'content' => $content, 'viewbaseLayout' => $this->viewBaseLayout ); + $expectedTemplateResult = serialize( array_keys( $params ) ); + $this->templateEngineMock + ->expects( $this->never() ) + ->method( 'render' ); + + self::assertSame( $expectedTemplateResult, $this->viewManager->renderContent( $content ) ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderContentView + */ + public function testRenderLocation() + { + $viewProvider = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location' ); + $this->viewManager->addLocationViewProvider( $viewProvider ); + + $location = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ); + $content = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content' ); + $contentInfo = $this->getMock( 'eZ\\Publish\\Core\\Repository\\Values\\Content\\ContentInfo' ); + + // Configuring view provider behaviour + $templateIdentifier = 'foo:bar:baz'; + $params = array( 'foo' => 'bar' ); + $viewProvider + ->expects( $this->once() ) + ->method( 'getView' ) + ->with( $location, 'customViewType' ) + ->will( + $this->returnValue( + new ContentView( $templateIdentifier, $params ) + ) + ); + + $contentService = $this->getMockBuilder( "eZ\\Publish\\Core\\Repository\\ContentService" ) + ->disableOriginalConstructor() + ->getMock(); + + $contentService->expects( $this->any() ) + ->method( "loadContentByContentInfo" ) + ->with( $contentInfo ) + ->will( + $this->returnValue( $content ) + ); + + $this->repositoryMock + ->expects( $this->any() ) + ->method( "getContentService" ) + ->will( + $this->returnValue( + $contentService + ) + ); + + $location->expects( $this->any() ) + ->method( "getContentInfo" ) + ->will( $this->returnValue( $contentInfo ) ); + + // Configuring template engine behaviour + $expectedTemplateResult = 'This is location rendering'; + $this->templateEngineMock + ->expects( $this->once() ) + ->method( 'render' ) + ->with( $templateIdentifier, $params + array( 'location' => $location, 'content' => $content, 'viewbaseLayout' => $this->viewBaseLayout ) ) + ->will( $this->returnValue( $expectedTemplateResult ) ); + + self::assertSame( $expectedTemplateResult, $this->viewManager->renderLocation( $location, 'customViewType' ) ); + } + + /** + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderLocation + * @covers \eZ\Publish\Core\MVC\Symfony\View\Manager::renderContentView + */ + public function testRenderLocationWithClosure() + { + $viewProvider = $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location' ); + $this->viewManager->addLocationViewProvider( $viewProvider ); + + $location = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ); + $content = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content' ); + $contentInfo = $this->getMock( 'eZ\\Publish\\Core\\Repository\\Values\\Content\\ContentInfo' ); + + // Configuring view provider behaviour + $closure = function ( $params ) + { + return serialize( array_keys( $params ) ); + }; + $params = array( 'foo' => 'bar' ); + $viewProvider + ->expects( $this->once() ) + ->method( 'getView' ) + ->with( $location ) + ->will( + $this->returnValue( + new ContentView( $closure, $params ) + ) + ); + + $contentService = $this->getMockBuilder( "eZ\\Publish\\Core\\Repository\\ContentService" ) + ->disableOriginalConstructor() + ->getMock(); + + $contentService->expects( $this->any() ) + ->method( "loadContentByContentInfo" ) + ->with( $contentInfo ) + ->will( + $this->returnValue( $content ) + ); + + $this->repositoryMock + ->expects( $this->any() ) + ->method( "getContentService" ) + ->will( + $this->returnValue( + $contentService + ) + ); + + $location->expects( $this->any() ) + ->method( "getContentInfo" ) + ->will( $this->returnValue( $contentInfo ) ); + + // Configuring template engine behaviour + $params += array( 'location' => $location, 'content' => $content, 'viewbaseLayout' => $this->viewBaseLayout ); + $expectedTemplateResult = serialize( array_keys( $params ) ); + $this->templateEngineMock + ->expects( $this->never() ) + ->method( 'render' ); + + self::assertSame( $expectedTemplateResult, $this->viewManager->renderLocation( $location ) ); + } + + private function createContentViewProviderMocks() + { + return array( + $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Content' ), + $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Content' ), + $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Content' ), + ); + } + + private function createLocationViewProviderMocks() + { + return array( + $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location' ), + $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location' ), + $this->getMock( 'eZ\\Publish\\Core\\MVC\\Symfony\\View\\Provider\\Location' ), + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Cache/Tests/FactoryTest.php b/eZ/Publish/Core/Persistence/Cache/Tests/FactoryTest.php new file mode 100644 index 0000000..c3edea7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Cache/Tests/FactoryTest.php @@ -0,0 +1,206 @@ +containerMock = $this->getMock( "Symfony\\Component\\DependencyInjection\\ContainerInterface" ); + $this->persistenceFactory = new Factory( $this->containerMock, 'persistence_mock' ); + + $this->persistenceMock = $this->getMock( "eZ\\Publish\\SPI\\Persistence\\Handler" ); + $this->containerMock->expects( $this->once() ) + ->method( 'get' ) + ->with( 'persistence_mock' ) + ->will( $this->returnValue( $this->persistenceMock ) ); + } + + /** + * Tear down test (properties) + */ + protected function tearDown() + { + unset( $this->containerMock ); + unset( $this->persistenceFactory ); + unset( $this->persistenceMock ); + parent::tearDown(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getPersistenceHandler + */ + public function testGetPersistenceHandler() + { + $persistenceHandler = $this->persistenceFactory->getPersistenceHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Handler', $persistenceHandler ); + $this->assertSame( $this->persistenceMock, $persistenceHandler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getContentHandler + * @depends testGetPersistenceHandler + */ + public function testGetContentHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'contentHandler' ); + $this->persistenceFactory->getContentHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getSearchHandler + * @depends testGetPersistenceHandler + */ + public function testGetSearchHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'searchHandler' ); + $this->persistenceFactory->getSearchHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getContentLanguageHandler + * @depends testGetPersistenceHandler + */ + public function testGetContentLanguageHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'contentLanguageHandler' ); + $this->persistenceFactory->getContentLanguageHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getContentTypeHandler + * @depends testGetPersistenceHandler + */ + public function testGetContentTypeHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'contentTypeHandler' ); + $this->persistenceFactory->getContentTypeHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getLocationHandler + * @depends testGetPersistenceHandler + */ + public function testGetContentLocationHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'locationHandler' ); + $this->persistenceFactory->getLocationHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getObjectStateHandler + * @depends testGetPersistenceHandler + */ + public function testGetObjectStateHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'objectStateHandler' ); + $this->persistenceFactory->getObjectStateHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getTrashHandler + * @depends testGetPersistenceHandler + */ + public function testGetTrashHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'trashHandler' ); + $this->persistenceFactory->getTrashHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getSectionHandler + * @depends testGetPersistenceHandler + */ + public function testGetSectionHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'sectionHandler' ); + $this->persistenceFactory->getSectionHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getUserHandler + * @depends testGetPersistenceHandler + */ + public function testGetUserHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'userHandler' ); + $this->persistenceFactory->getUserHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getUrlAliasHandler + * @depends testGetPersistenceHandler + */ + public function testGetUrlAliasHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'urlAliasHandler' ); + $this->persistenceFactory->getUrlAliasHandler(); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\Factory::getUrlWildcardHandler + * @depends testGetPersistenceHandler + */ + public function testGetUrlWildcardHandler() + { + $this->persistenceMock->expects( $this->once() )->method( 'urlWildcardHandler' ); + $this->persistenceFactory->getUrlWildcardHandler(); + } +} diff --git a/eZ/Publish/Core/Persistence/Factory.php b/eZ/Publish/Core/Persistence/Factory.php new file mode 100644 index 0000000..ffb5a6f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Factory.php @@ -0,0 +1,140 @@ +container = $container; + $this->persistenceId = $persistenceId; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Handler + */ + public function getPersistenceHandler() + { + return $this->container->get( $this->persistenceId ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function getContentHandler() + { + return $this->getPersistenceHandler()->contentHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Search\Handler + */ + public function getSearchHandler() + { + return $this->getPersistenceHandler()->searchHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + public function getContentTypeHandler() + { + return $this->getPersistenceHandler()->contentTypeHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Language\Handler + */ + public function getContentLanguageHandler() + { + return $this->getPersistenceHandler()->contentLanguageHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function getLocationHandler() + { + return $this->getPersistenceHandler()->locationHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler + */ + public function getObjectStateHandler() + { + return $this->getPersistenceHandler()->objectStateHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function getTrashHandler() + { + return $this->getPersistenceHandler()->trashHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\User\Handler + */ + public function getUserHandler() + { + return $this->getPersistenceHandler()->userHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function getSectionHandler() + { + return $this->getPersistenceHandler()->sectionHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler + */ + public function getUrlAliasHandler() + { + return $this->getPersistenceHandler()->urlAliasHandler(); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler + */ + public function getUrlWildcardHandler() + { + return $this->getPersistenceHandler()->urlWildcardHandler(); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Backend.php b/eZ/Publish/Core/Persistence/InMemory/Backend.php new file mode 100644 index 0000000..4421b6c --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Backend.php @@ -0,0 +1,647 @@ +data = $data + $this->data; + } + + /** + * Creates data in in memory store + * + * @param string $type + * @param array $data + * @param boolean $autoIncrement + * @param string $idColumn By default, id column is 'id', but this can be customized here (e.g. for 'contentId') + * + * @return object + * @throws InvalidArgumentValue On invalid $type + * @throws LogicException If $autoIncrement is false but $data does not include an id + * @throws LogicException If provided id already exists (and if defined, data contain same status property value) + */ + public function create( $type, array $data, $autoIncrement = true, $idColumn = 'id' ) + { + if ( !is_scalar( $type ) || !isset( $this->data[$type] ) ) + throw new InvalidArgumentValue( 'type', $type ); + + if ( $autoIncrement ) + { + $data[$idColumn] = $this->getNextId( $type, $idColumn ); + } + else if ( !$data[$idColumn] ) + { + throw new LogicException( '\'create\' logic error, $autoIncrement is false but no id is provided' ); + } + + foreach ( $this->data[$type] as $item ) + { + if ( + // Same identifier + $item[$idColumn] == $data[$idColumn] && + ( + // and "status" matches + ( isset( $item['status'] ) && $item['status'] == $data['status'] ) || + // or "_status" matches + ( isset( $item['_status'] ) && $item['_status'] == $data['_status'] ) || + // or no status available + !( isset( $item['status'] ) || isset( $item['_status'] ) ) + ) + ) + throw new LogicException( "'create' logic error, provided id already exist" ); + } + + /*foreach ( $data as $prop => $value ) + { + if ( $value === null ) + throw new InvalidArgumentValue( 'data', "'$prop' on '$type' was of value NULL" ); + }*/ + + $this->data[$type][] = $data; + return $this->toValue( $type, $data ); + } + + /** + * Reads data from in memory store + * + * @param string $type + * @param int|string $id + * @param string $idColumn + * + * @return object + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue On invalid $type + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If data does not exist + * @throws LogicException If several items exists with same id + */ + public function load( $type, $id, $idColumn = 'id' ) + { + if ( !is_scalar( $type ) || !isset( $this->data[$type] ) ) + throw new InvalidArgumentValue( 'type', $type ); + + $return = null; + $found = false; + foreach ( $this->data[$type] as $item ) + { + if ( $item[$idColumn] != $id ) + continue; + if ( $return ) + throw new LogicException( "Logic error, more than one item exist with id: {$id}" ); + + $return = $this->toValue( $type, $item ); + $found = true; + } + + if ( !$found ) + throw new NotFound( $type, $id ); + + return $return; + } + + /** + * Find data from in memory store for a specific type that matches $match (empty array will match all) + * + * Note does not support joins, so only properties on $type is matched. + * + * @param string $type + * @param array $match A multi level array with property => value to match against + * @param array $joinInfo Optional info on how to join in other objects to become part of a + * aggregate where $type is root. + * Format: + * array( '' => array( + * 'type' => '', + * 'match' => array( '' => '' ) ), + * ['sub' => <$joinInfo>] + * ) + * Example (joining Location when finding Content): + * array( 'locations' => array( + * 'type' => 'Content\\Location', + * 'match' => array( 'contentId' => 'id' ) ) + * ) + * Value of 'sub' follows exactly same format as $joinInfo allowing recursive joining. + * @uses rawFind() + * + * @return object[] + */ + public function find( $type, array $match = array(), array $joinInfo = array() ) + { + $items = $this->rawFind( $type, $match, $joinInfo ); + foreach ( $items as $key => $item ) + $items[$key] = $this->toValue( $type, $item, $joinInfo ); + + return $items; + } + + /** + * Updates data in in memory store + * + * @param string $type + * @param int|string $id + * @param array $data + * @param boolean $union Specifies if data should be merged with existing data or not + * + * @uses updateByMatch() + * + * @return boolean False if data does not exist and can not be updated + */ + public function update( $type, $id, array $data, $union = true, $idColumn = 'id' ) + { + return $this->updateByMatch( $type, array( $idColumn => $id ), $data, $union, $idColumn ); + } + + /** + * Updates data in in memory store by match + * + * Useful in cases where a specific state of an object should be updated, + * Type with version=0 for instance. + * + * @param string $type + * @param array $match A flat array with property => value to match against + * @param array $data + * @param boolean $union Specifies if data should be merged with existing data or not + * + * @throws InvalidArgumentValue On invalid $type + * + * @return boolean False if data does not exist and can not be updated + */ + public function updateByMatch( $type, array $match, array $data, $union = true, $idColumn = 'id' ) + { + if ( !is_scalar( $type ) || !isset( $this->data[$type] ) ) + throw new InvalidArgumentValue( 'type', $type ); + + // Make sure id isn't changed + unset( $data[$idColumn] ); + + /*foreach ( $data as $prop => $value ) + { + if ( $value === null ) + throw new InvalidArgumentValue( 'data', "'$prop' on '$type' was of value NULL" ); + }*/ + + $return = false; + foreach ( $this->data[$type] as $key => $item ) + { + if ( $this->match( $item, $match ) ) + { + if ( $union ) + $this->data[$type][$key] = $data + $this->data[$type][$key]; + else + $this->data[$type][$key] = $data; + $return = true; + } + } + return $return; + } + + /** + * Deletes data in in memory store + * + * @param string $type + * @param int|string $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If data does not exist + * @uses deleteByMatch() + */ + public function delete( $type, $id, $idColumn = 'id' ) + { + $this->deleteByMatch( $type, array( $idColumn => $id ) ); + } + + /** + * Deletes data in in memory store + * + * Useful in cases where a specific state of an object should be updated, + * Type with version=0 for instance. + * + * @param string $type + * @param array $match A flat array with property => value to match against + * + * @throws InvalidArgumentValue On invalid $type + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no data to delete have been found + */ + public function deleteByMatch( $type, array $match ) + { + if ( !is_scalar( $type ) || !isset( $this->data[$type] ) ) + throw new InvalidArgumentValue( 'type', $type ); + + $found = false; + foreach ( $this->data[$type] as $key => $item ) + { + if ( $this->match( $item, $match ) ) + { + unset( $this->data[$type][$key] ); + $found = true; + } + } + + if ( !$found ) + throw new NotFound( $type, $match ); + } + + /** + * Find count of objects of a given type matching a simple $match (empty array will match all) + * + * Note does not support joins, so only properties on $type is matched. + * + * @param string $type + * @param array $match A flat array with property => value to match against + * @param array $joinInfo See {@link find()} + * + * @uses rawFind() + * + * @return int + */ + public function count( $type, array $match = array(), array $joinInfo = array() ) + { + return count( $this->rawFind( $type, $match, $joinInfo ) ); + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + // copy current data to transaction stack + $this->transactionDataStack[] = $this->data; + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit() + { + if ( empty( $this->transactionDataStack ) ) + throw new \RuntimeException( "No transactions in progress" ); + + // remove one level of data from transaction stack + array_pop( $this->transactionDataStack ); + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback() + { + if ( empty( $this->transactionDataStack ) ) + throw new \RuntimeException( "No transactions in progress" ); + + // pop last data set from transaction stack back to live $data set to wipe out changes + $this->data = array_pop( $this->transactionDataStack ); + } + + /** + * Find data from in memory store for a specific type that matches $match (empty array will match all) + * + * Note does not support joins, so only properties on $type is matched. + * + * @param string $type + * @param array $match A multi level array with property => value to match against + * @param array $joinInfo See {@link find()} + * + * @return array[] + * @throws InvalidArgumentValue On invalid $type + * @throws LogicException When there is a collision between match rules in $joinInfo and $match + */ + protected function rawFind( $type, array $match = array(), array $joinInfo = array() ) + { + if ( !is_scalar( $type ) || !isset( $this->data[$type] ) ) + throw new InvalidArgumentValue( 'type', $type ); + + $items = array(); + foreach ( $this->data[$type] as $item ) + { + foreach ( $joinInfo as $joinProperty => $joinItem ) + { + foreach ( $joinItem['match'] as $joinMatchKey => $joinMatchProperty ) + { + $joinItem['match'][$joinMatchKey] = $item[$joinMatchProperty]; + if ( isset( $match[$joinProperty][$joinMatchKey] ) ) + throw new LogicException( "\$match[$joinProperty][$joinMatchKey] logic error, collision with match in \$joinInfo" ); + } + $item[$joinProperty] = $this->rawFind( + $joinItem['type'], + $joinItem['match'], + ( isset( $joinItem['sub'] ) ? $joinItem['sub'] : array() ) + ); + } + if ( $this->match( $item, $match ) ) + $items[] = $item; + } + return $items; + } + + /** + * Checks if a $item (a raw VO item) matches $match recursively + * + * @param array $item + * @param array $match + * + * @return boolean + */ + private function match( array $item, array $match ) + { + foreach ( $match as $matchProperty => $matchValue ) + { + if ( !isset( $item[$matchProperty] ) ) + return false; + + if ( is_array( $item[$matchProperty] ) ) + { + // sub match. When $matchValue is array, assume it's a joined + // list of value objects and look if one of them matches + if ( is_array( $matchValue ) ) + { + $hasSubMatch = false; + foreach ( $item[$matchProperty] as $subItem ) + { + if ( $this->match( $subItem, $matchValue ) ) + $hasSubMatch = true; + } + if ( !$hasSubMatch ) + return false; + } + // otherwise check if match value is part of array + else if ( !in_array( $matchValue, $item[$matchProperty] ) ) + { + return false; + } + } + // A property trying to match a list of values + // Like an SQL IN() statement + else if ( is_array( $matchValue ) ) + { + if ( !in_array( $item[$matchProperty], $matchValue ) ) + return false; + } + // Use of wildcards like in SQL, at the start and/or end of $matchValue + // i.e. %/5/% (for pathString) + else if ( $ends = substr( $matchValue, -1 ) === "%" || substr( $matchValue, 0, 1 ) === "%" ) + { + $starts = substr( $matchValue, 0, 1 ) === "%"; + if ( $starts ) $matchValue = substr( $matchValue, 1 ); + if ( $ends ) $matchValue = substr( $matchValue, 0, -1 ); + + if ( $matchValue === $item[$matchProperty] ) + return false; + + $pos = strpos( $item[$matchProperty], $matchValue ); + + if ( $pos === false ) + return false; + + if ( !$starts && $pos !== 0 ) + return false; + + if ( !$ends && $pos !== ( strlen( $item[$matchProperty] ) - strlen( $matchValue ) ) ) + return false; + } + // plain equal match + else if ( $item[$matchProperty] != $matchValue ) + { + return false; + } + } + + return true; + } + + /** + * Finds the max id number and that +1 + * + * Makes sure no id conflicts occur if data for some reason contains gaps in id numbers. + * + * @param string $type + * + * @return int + */ + private function getNextId( $type, $idColumn = 'id' ) + { + $id = 0; + foreach ( $this->data[$type] as $item ) + { + $id = max( $id, $item[$idColumn] ); + } + return $id + 1; + } + + /** + * Creates Value object based on array value from Backend. + * + * @param string $type + * @param array $data + * @param array $joinInfo See {@link find()} + * + * @return object + */ + protected function toValue( $type, array $data, array $joinInfo = array() ) + { + $className = "eZ\\Publish\\SPI\\Persistence\\$type"; + $obj = new $className; + foreach ( $obj as $prop => &$value ) + { + if ( isset( $data[$prop] ) ) + { + if ( $type === "Content\\Field" && $prop === "value" && ! $data["value"] instanceof FieldValue ) + { + $fieldTypeNS = $this->getFieldTypeNamespace( $obj ); + $fieldValueClassName = "$fieldTypeNS\\Value"; + $fieldTypeValue = new $fieldValueClassName; + foreach ( $data["value"] as $fieldValuePropertyName => $fieldValuePropertyValue ) + { + $fieldTypeValue->$fieldValuePropertyName = $fieldValuePropertyValue; + } + + $fieldTypeClassName = "$fieldTypeNS\\Type"; + /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */ + $fieldType = new $fieldTypeClassName(); + $value = $fieldType->toPersistenceValue( $fieldTypeValue ); + } + else if ( $type === "Content\\Type\\FieldDefinition" && $prop === "fieldTypeConstraints" && !$data["fieldTypeConstraints"] instanceof FieldTypeConstraints ) + { + $value = new FieldTypeConstraints; + foreach ( $data["fieldTypeConstraints"] as $constraintName => $constraintValue ) + { + $value->$constraintName = $constraintValue; + } + } + else if ( $type === "Content\\Type\\FieldDefinition" && $prop === "defaultValue" && !$data["defaultValue"] instanceof FieldValue ) + { + $value = new FieldValue; + foreach ( $data["defaultValue"] as $propertyName => $propertyValue ) + { + $value->$propertyName = $propertyValue; + } + } + else if ( $type === "Content\\UrlAlias" && $prop === "id" ) + { + // id should be -, but as there is no property for link in VO and we need it in handler, + // returning everything here + // Note: before returning in handler id must be overwritten with - + $value = array( + "id" => $data["id"], + "parent" => $data["parent"], + "link" => $data["link"], + ); + } + else + { + $value = $data[$prop]; + } + } + } + + try + { + return $this->joinToValue( $obj, $joinInfo ); + } + catch ( \Exception $e ) + { + throw new \RuntimeException( "Could not join value using: " . var_export( $data, true ), 0, $e ); + } + } + + /** + * Creates value objects on join properties + * + * @param \eZ\Publish\SPI\Persistence\ValueObject $item + * @param array $joinInfo See {@link find()} + * + * @return ValueObject + */ + private function joinToValue( ValueObject $item, array $joinInfo = array() ) + { + foreach ( $joinInfo as $property => $info ) + { + if ( isset( $info['skip'] ) && $info['skip'] ) + continue; + + if ( isset( $info['single'] ) && $info['single'] ) + { + $value =& $item->$property; + if ( !empty( $value ) ) + { + $value = $this->toValue( + $info['type'], + $value[0], + ( isset( $info['sub'] ) ? $info['sub'] : array() ) + ); + } + else + { + throw new \RuntimeException( "$property is supposed to be single(1), found none!" ); + $value = null; + } + continue; + } + + foreach ( $item->$property as &$joinItem ) + { + $joinItem = $this->toValue( + $info['type'], + $joinItem, + ( isset( $info['sub'] ) ? $info['sub'] : array() ) + ); + } + } + return $item; + } + + /** + * @param \eZ\Publish\SPI\Persistence\ValueObject $obj + * + * @return string + */ + protected function getFieldTypeNamespace( $obj ) + { + if ( isset( $this->tempFieldTypeMapping[ $obj->type ] ) ) + return $this->tempFieldTypeMapping[ $obj->type ]; + + throw new \Exception( "Following FieldType is not supported by InMemory storage {$obj->type}" ); + } + + /** + * @var array + */ + private $tempFieldTypeMapping = array( + 'ezstring' => 'eZ\\Publish\\Core\\FieldType\\TextLine', + 'ezinteger' => 'eZ\\Publish\\Core\\FieldType\\Integer', + 'ezauthor' => 'eZ\\Publish\\Core\\FieldType\\Author', + 'ezfloat' => 'eZ\\Publish\\Core\\FieldType\\Float', + 'eztext' => 'eZ\\Publish\\Core\\FieldType\\TextBlock', + 'ezboolean' => 'eZ\\Publish\\Core\\FieldType\\Checkbox', + 'ezdatetime' => 'eZ\\Publish\\Core\\FieldType\\DateAndTime', + 'ezkeyword' => 'eZ\\Publish\\Core\\FieldType\\Keyword', + 'ezurl' => 'eZ\\Publish\\Core\\FieldType\\Url', + 'ezcountry' => 'eZ\\Publish\\Core\\FieldType\\Country', + 'ezbinaryfile' => 'eZ\\Publish\\Core\\FieldType\\BinaryFile', + 'ezmedia' => 'eZ\\Publish\\Core\\FieldType\\Media', + 'ezxmltext' => 'eZ\\Publish\\Core\\FieldType\\XmlText', + 'ezobjectrelationlist' => 'eZ\\Publish\\Core\\FieldType\\RelationList', + 'ezselection' => 'eZ\\Publish\\Core\\FieldType\\Selection', + 'ezsrrating' => 'eZ\\Publish\\Core\\FieldType\\Rating', + 'ezimage' => 'eZ\\Publish\\Core\\FieldType\\Image', + 'ezobjectrelation' => 'eZ\\Publish\\Core\\FieldType\\Relation', + ); +} diff --git a/eZ/Publish/Core/Persistence/InMemory/ContentHandler.php b/eZ/Publish/Core/Persistence/InMemory/ContentHandler.php new file mode 100644 index 0000000..40a470a --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/ContentHandler.php @@ -0,0 +1,879 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function create( CreateStruct $content ) + { + /** @var \eZ\Publish\SPI\Persistence\Content $contentObj */ + $contentObj = $this->backend->create( 'Content', array( '_currentVersionNo' => 1 ) ); + /** @var \eZ\Publish\SPI\Persistence\Content\ContentInfo $contentInfo */ + $mainLanguageCode = $this->handler->contentLanguageHandler() + ->load( $content->initialLanguageId )->languageCode; + $contentInfo = $this->backend->create( + 'Content\\ContentInfo', + array( + 'contentTypeId' => $content->typeId, + 'sectionId' => $content->sectionId, + 'isPublished' => false, + 'ownerId' => $content->ownerId, + 'status' => VersionInfo::STATUS_DRAFT, + 'currentVersionNo' => 1, + 'name' => isset( $content->name[$mainLanguageCode] ) ? + $content->name[$mainLanguageCode] : + null, + // Published and modified timestamps for drafts is 0 + 'modificationDate' => 0, + 'publicationDate' => 0, + 'alwaysAvailable' => $content->alwaysAvailable, + 'remoteId' => $content->remoteId, + 'mainLanguageCode' => $mainLanguageCode + ), + true + ); + $languageCodes = array(); + $languageIds = array(); + foreach ( $content->fields as $field ) + { + $contentObj->fields[] = $this->backend->create( + 'Content\\Field', + array( + 'versionNo' => 1, + // Using internal _contentId since it's not directly exposed by Persistence + '_contentId' => $contentInfo->id, + 'value' => new FieldValue( + array( + 'data' => $field->value->data, + 'sortKey' => array( 'sort_key_string' => $field->value->sortKey ) + ) + ) + ) + (array)$field + ); + $languageCodes[] = $field->languageCode; + } + foreach ( array_unique( $languageCodes ) as $languageCode ) + { + $languageIds[] = $this->handler->contentLanguageHandler() + ->loadByLanguageCode( $languageCode )->id; + } + /** @var \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo */ + $versionInfo = $this->backend->create( + 'Content\\VersionInfo', + array( + // @todo: Name should be computed! + 'names' => $content->name, + 'creatorId' => $content->ownerId, + 'creationDate' => $content->modified, + 'modificationDate' => $content->modified, + '_contentId' => $contentInfo->id, + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => 1, + 'languageIds' => $languageIds, + 'initialLanguageCode' => $this->handler->contentLanguageHandler() + ->load( $content->initialLanguageId )->languageCode + ) + ); + $locations = array(); + foreach ( $content->locations as $location ) + { + $location->contentId = $contentInfo->id; + $location->contentVersion = 1; + $locations[] = $this->handler->locationHandler()->create( $location ); + } + if ( count( $locations ) ) + { + $contentInfo->mainLocationId = $locations[0]->id; + } + $versionInfo->contentInfo = $contentInfo; + $contentObj->versionInfo = $versionInfo; + return $contentObj; + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function createDraftFromVersion( $contentId, $srcVersion, $userId ) + { + $content = $this->load( $contentId, $srcVersion ); + $contentInfo = $content->versionInfo->contentInfo; + $fields = $content->fields; + /** @var \eZ\Publish\SPI\Persistence\Content\VersionInfo $aVersion */ + $aVersion = $this->backend->find( + 'Content\\VersionInfo', + array( + '_contentId' => $contentId, + 'versionNo' => $srcVersion + ) + ); + if ( empty( $aVersion ) ) + throw new NotFound( "Version", "contentId: $contentId // versionNo: $srcVersion" ); + + // Create new version + $newVersionNo = $this->getLastVersionNumber( $contentId ) + 1; + $time = time(); + $content->versionInfo = $this->backend->create( + 'Content\\VersionInfo', + array( + 'modificationDate' => $time, + 'creatorId' => $userId, + 'creationDate' => $time, + '_contentId' => $contentId, + 'status' => VersionInfo::STATUS_DRAFT, + 'versionNo' => $newVersionNo, + 'initialLanguageCode' => $content->versionInfo->initialLanguageCode, + 'languageIds' => $content->versionInfo->languageIds, + "names" => $content->versionInfo->names + ) + ); + + // Duplicate fields + $content->fields = array(); + foreach ( $fields as $field ) + { + $content->fields[] = $this->backend->create( + 'Content\\Field', + array( 'versionNo' => $newVersionNo, '_contentId' => $contentId ) + (array)$field + ); + } + + // set content info back on new version info + $content->versionInfo->contentInfo = $contentInfo; + + return $content; + } + + /** + * Copy Content with Fields and Versions from $contentId in $version. + * + * Copies all fields from $contentId in $version (or all versions if false) + * to a new object which is returned. Version numbers are maintained. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content or version is not found + * + * @param mixed $contentId + * @param mixed|null $versionNo Copy all versions if left null + * + * @todo Language support + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function copy( $contentId, $versionNo = null ) + { + $originalContentInfo = $this->backend->load( 'Content\\ContentInfo', $contentId ); + if ( !$originalContentInfo ) + throw new NotFound( 'Content\\ContentInfo', "contentId: $contentId" ); + + $time = time(); + + $currentVersionNo = isset( $versionNo ) ? $versionNo : $originalContentInfo->currentVersionNo; + $contentObj = $this->backend->create( 'Content', array( '_currentVersionNo' => $currentVersionNo ) ); + $contentInfo = $this->backend->create( + 'Content\\ContentInfo', + array( + "contentTypeId" => $originalContentInfo->contentTypeId, + "sectionId" => $originalContentInfo->sectionId, + "ownerId" => $originalContentInfo->ownerId, + "isPublished" => false, + "currentVersionNo" => $currentVersionNo, + "mainLanguageCode" => $originalContentInfo->mainLanguageCode, + "modificationDate" => 0, + "publicationDate" => 0, + "alwaysAvailable" => $originalContentInfo->alwaysAvailable + ) + ); + + // Copy version(s) + foreach ( + $this->backend->find( + "Content\\VersionInfo", + isset( $versionNo ) ? + array( "_contentId" => $originalContentInfo->id, "versionNo" => $versionNo ) : + array( "_contentId" => $originalContentInfo->id ) + ) as $versionInfo ) + { + $this->backend->create( + "Content\\VersionInfo", + array( + "names" => $versionInfo->names, + "versionNo" => $versionInfo->versionNo, + "modificationDate" => $time, + "creatorId" => $versionInfo->creatorId, + "creationDate" => $time, + "_contentId" => $contentInfo->id, + "initialLanguageCode" => $versionInfo->initialLanguageCode, + "languageIds" => $versionInfo->languageIds, + "status" => $versionInfo->versionNo === $currentVersionNo ? + VersionInfo::STATUS_DRAFT : + $versionInfo->status + ) + ); + } + + // Associate last version to content VO + $aVersion = $this->backend->find( + 'Content\\VersionInfo', + array( + '_contentId' => $contentInfo->id, + 'versionNo' => $currentVersionNo + ) + ); + if ( empty( $aVersion ) ) + throw new NotFound( "Version", "contentId: {$contentInfo->id} // versionNo: $currentVersionNo" ); + + $contentObj->versionInfo = $aVersion[0]; + $contentObj->versionInfo->contentInfo = $contentInfo; + + // Copy fields + // @todo: language support + foreach ( + $this->backend->find( + "Content\\Field", + // Using internal _contentId since it's not directly exposed by Persistence + isset( $versionNo ) ? + array( "_contentId" => $originalContentInfo->id, "versionNo" => $versionNo ) : + array( "_contentId" => $originalContentInfo->id ) + ) as $field + ) + { + $this->backend->create( + 'Content\\Field', + array( '_contentId' => $contentInfo->id ) + (array)$field + ); + } + + // Associate last version's fields + // @todo: Throw NotFound if no fields at all ? + $contentObj->fields = $this->backend->find( + "Content\\Field", + array( + "_contentId" => $contentInfo->id, + "versionNo" => $currentVersionNo + ) + ); + + return $contentObj; + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function load( $id, $version, $translations = null ) + { + $res = $this->backend->find( + 'Content', + array( 'id' => $id ) + ); + if ( empty( $res ) ) + throw new NotFound( "Content", "contentId:{$id}" ); + + $content = $res[0]; + $versions = $this->backend->find( + 'Content\\VersionInfo', + array( + '_contentId' => $id, + 'versionNo' => $version + ), + array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ) + ) + ); + if ( !isset( $versions[0] ) ) + throw new NotFound( "Version", "contentId:{$id}, versionNo:{$version}" ); + + if ( !$versions[0]->contentInfo instanceof ContentInfo ) + throw new NotFound( "Content\\ContentInfo", "contentId:{$id}" ); + + $fieldMatch = array( + "_contentId" => $id, + "versionNo" => $version + ); + if ( isset( $translations ) ) + $fieldMatch["languageCode"] = $translations; + $content->fields = $this->backend->find( 'Content\\Field', $fieldMatch ); + + $content->versionInfo = $versions[0]; + + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $content->versionInfo->contentInfo->id ) + ); + if ( !empty( $locations ) ) + { + $content->versionInfo->contentInfo->mainLocationId = $locations[0]->mainLocationId; + } + + return $content; + } + + /** + * Returns the metadata object for a content identified by $contentId. + * + * @param int|string $contentId + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public function loadContentInfo( $contentId ) + { + $contentInfo = $this->backend->load( 'Content\\ContentInfo', $contentId ); + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $contentInfo->id ) + ); + if ( !empty( $locations ) ) + { + $contentInfo->mainLocationId = $locations[0]->mainLocationId; + } + + return $contentInfo; + } + + /** + * Returns the version object for a content/version identified by $contentId and $versionNo + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If version is not found + * + * @param int|string $contentId + * @param int $versionNo Version number to load + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + public function loadVersionInfo( $contentId, $versionNo ) + { + $versionInfoList = $this->backend->find( + 'Content\\VersionInfo', + array( + '_contentId' => $contentId, + 'versionNo' => $versionNo + ), + array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ) + ) + ); + + if ( empty( $versionInfoList ) ) + throw new NotFound( "Content\\VersionInfo", "contentId: $contentId, versionNo: $versionNo" ); + + $versionInfo = reset( $versionInfoList ); + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $contentId ) + ); + if ( !empty( $locations ) ) + { + $versionInfo->contentInfo->mainLocationId = $locations[0]->mainLocationId; + } + + return $versionInfo; + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function loadDraftsForUser( $userId ) + { + $versionInfoList = $this->backend->find( + 'Content\\VersionInfo', + array( + "status" => VersionInfo::STATUS_DRAFT, + "creatorId" => $userId + ), + array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ) + ) + ); + + foreach ( $versionInfoList as $versionInfo ) + { + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $versionInfo->contentInfo->id ) + ); + if ( !empty( $locations ) ) + { + $versionInfo->contentInfo->mainLocationId = $locations[0]->mainLocationId; + } + } + + return $versionInfoList; + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function setStatus( $contentId, $status, $version ) + { + $versions = $this->backend->find( 'Content\\VersionInfo', array( '_contentId' => $contentId, 'versionNo' => $version ) ); + + if ( !count( $versions ) ) + { + throw new NotFound( "Version", "contentId: $contentId, versionNo: $version" ); + } + return $this->backend->update( 'Content\\VersionInfo', $versions[0]->id, array( 'status' => $status ) ); + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function updateMetadata( $contentId, MetadataUpdateStruct $content ) + { + $updateData = (array)$content; + $updateData["alwaysAvailable"] = $updateData["alwaysAvailable"]; + $updateData["mainLanguageCode"] = $this->handler->contentLanguageHandler() + ->load( $content->mainLanguageId )->languageCode; + + $this->backend->update( + "Content\\ContentInfo", + $contentId, + $updateData, + true + ); + + return $this->loadContentInfo( $contentId ); + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function updateContent( $contentId, $versionNo, UpdateStruct $content ) + { + $versionInfo = $this->loadVersionInfo( $contentId, $versionNo ); + $versionLanguageIds = $versionInfo->languageIds; + + $versionUpdateData = array( + "creatorId" => $content->creatorId, + "modificationDate" => $content->modificationDate, + "names" => $content->name, + "initialLanguageCode" => $this->handler->contentLanguageHandler() + ->load( $content->initialLanguageId )->languageCode + ); + + foreach ( $content->fields as $field ) + { + if ( !isset( $field->id ) ) + { + $versionLanguageIds[] = + $this->handler->contentLanguageHandler()->loadByLanguageCode( $field->languageCode )->id; + $this->backend->create( + 'Content\\Field', + array( '_contentId' => $contentId, 'versionNo' => $versionNo ) + (array)$field + ); + } + else + { + $fieldDefinition = $this->backend->load( "Content\\Type\\FieldDefinition", $field->fieldDefinitionId ); + if ( $fieldDefinition->isTranslatable ) + { + $this->backend->updateByMatch( + "Content\\Field", + array( + "id" => $field->id, + "versionNo" => $versionNo + ), + array( "value" => $field->value ) + ); + } + else + { + $this->backend->updateByMatch( + "Content\\Field", + array( + "fieldDefinitionId" => $field->fieldDefinitionId, + "versionNo" => $versionNo, + "_contentId" => $contentId + ), + array( "value" => $field->value ) + ); + } + } + } + + $versionUpdateData["languageIds"] = array_unique( $versionLanguageIds ); + $this->backend->updateByMatch( + "Content\\VersionInfo", + array( "_contentId" => $contentId, "versionNo" => $versionNo ), + $versionUpdateData + ); + + return $this->load( $contentId, $versionNo ); + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + * @todo add deleting of relations + */ + public function deleteContent( $contentId ) + { + $this->backend->delete( 'Content', $contentId ); + $this->backend->delete( 'Content\\ContentInfo', $contentId ); + + $versions = $this->backend->find( 'Content\\VersionInfo', array( '_contentId' => $contentId ) ); + foreach ( $versions as $version ) + { + $fields = $this->backend->find( + 'Content\\Field', + array( + '_contentId' => $contentId, + 'versionNo' => $version->versionNo + ) + ); + foreach ( $fields as $field ) + $this->backend->delete( 'Content\\Field', $field->id ); + + $this->backend->delete( 'Content\\VersionInfo', $version->id ); + } + + // @todo Deleting Locations by content object id should be possible using handler API? + $locationHandler = $this->handler->locationHandler(); + $locations = $this->backend->find( 'Content\\Location', array( 'contentId' => $contentId ) ); + foreach ( $locations as $location ) + { + $locationHandler->removeSubtree( $location->id ); + } + } + + /** + * Deletes given version, its fields, node assignment, relations and names. + * + * Removes the relations, but not the related objects. + * + * @param int $contentId + * @param int $versionNo + * + * @return boolean + * + * @todo add deleting of relations + */ + public function deleteVersion( $contentId, $versionNo ) + { + $versions = $this->backend->find( + 'Content\\VersionInfo', + array( + "_contentId" => $contentId, + "versionNo" => $versionNo + ) + ); + foreach ( $versions as $version ) + { + $fields = $this->backend->find( + 'Content\\Field', + array( + '_contentId' => $contentId, + 'versionNo' => $version->versionNo + ) + ); + foreach ( $fields as $field ) + $this->backend->delete( 'Content\\Field', $field->id ); + + $this->backend->delete( 'Content\\VersionInfo', $version->id ); + } + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function trash( $contentId ) + { + throw new RuntimeException( '@todo: Implement' ); + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function untrash( $contentId ) + { + throw new RuntimeException( '@todo: Implement' ); + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Handler + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no version found + */ + public function listVersions( $contentId ) + { + $versions = $this->backend->find( + 'Content\\VersionInfo', + array( + '_contentId' => $contentId + ), + array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ) + ) + ); + + if ( empty( $versions ) ) + throw new NotFound( "Content\\VersionInfo", "contentId: $contentId" ); + + return $versions; + } + + /** + * Creates a relation between $sourceContentId in $sourceContentVersionNo + * and $destinationContentId with a specific $type. + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $relation + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation + */ + public function addRelation( RelationCreateStruct $relation ) + { + // Ensure source content exists + $sourceContent = $this->backend->find( 'Content\\ContentInfo', array( "id" => $relation->sourceContentId ) ); + + if ( empty( $sourceContent ) ) + throw new NotFound( 'Content\\ContentInfo', "contentId: {$relation->sourceContentId}" ); + + // Ensure source content exists if version is specified + if ( $relation->sourceContentVersionNo !== null ) + { + $version = $this->backend->find( "Content\\VersionInfo", array( "_contentId" => $relation->sourceContentId, "versionNo" => $relation->sourceContentVersionNo ) ); + + if ( empty( $version ) ) + throw new NotFound( "Content\\VersionInfo", "contentId: {$relation->sourceContentId}, versionNo: {$relation->sourceContentVersionNo}" ); + } + + // Ensure destination content exists + $destinationContent = $this->backend->find( 'Content\\ContentInfo', array( "id" => $relation->destinationContentId ) ); + + if ( empty( $destinationContent ) ) + throw new NotFound( 'Content\\ContentInfo', "contentId: {$relation->destinationContentId}" ); + + return $this->backend->create( "Content\\Relation", (array)$relation ); + } + + /** + * Removes a relation by relation Id. + * + * @param mixed $relationId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if relation to be removed is not found. + */ + public function removeRelation( $relationId ) + { + $requestedRelation = $this->backend->find( "Content\\Relation", array( "id" => $relationId ) ); + if ( empty( $requestedRelation ) ) + { + throw new NotFound( "Content\\Relation", "id: " . $relationId ); + } + $this->backend->delete( "Content\\Relation", $relationId ); + } + + /** + * Loads relations from $sourceContentId. Optionally, loads only those with $type and $sourceContentVersionNo. + * + * @param mixed $sourceContentId Source Content ID + * @param mixed|null $sourceContentVersionNo Source Content Version, null if not specified + * @param int|null $type {@see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD} + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation[] + */ + public function loadRelations( $sourceContentId, $sourceContentVersionNo = null, $type = null ) + { + $filter = array( "sourceContentId" => $sourceContentId ); + if ( $sourceContentVersionNo !== null ) + $filter["sourceContentVersionNo"] = $sourceContentVersionNo; + + $relations = $this->backend->find( "Content\\Relation", $filter ); + + if ( $type === null ) + return $relations; + + foreach ( $relations as $key => $relation ) + { + // Is there a bit present in $type not appearing in $relation->type? + if ( ~$relation->type & $type ) + { + // In such case, remove the result from the array + unset( $relations[$key] ); + } + } + + return $relations; + } + + /** + * Loads relations from $contentId. Optionally, loads only those with $type. + * + * Only loads relations against published versions. + * + * @param mixed $destinationContentId Destination Content ID + * @param int|null $type {@see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD} + * @return \eZ\Publish\SPI\Persistence\Content\Relation[] + */ + public function loadReverseRelations( $destinationContentId, $type = null ) + { + $filter = array( "destinationContentId" => $destinationContentId ); + $relations = $this->backend->find( "Content\\Relation", $filter ); + + if ( $type === null ) + return $relations; + + foreach ( $relations as $key => $relation ) + { + if ( ~$relation->type & $type ) + { + unset( $relations[$key] ); + } + } + return $relations; + } + + /** + * Performs the publishing operations required to set the version identified by $updateStruct->versionNo and + * $updateStruct->id as the published one. + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $metaDataUpdateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content The published Content + */ + public function publish( $contentId, $versionNo, MetadataUpdateStruct $metaDataUpdateStruct ) + { + // Change Content currentVersionNo to the published version + $this->backend->update( + 'Content', + $contentId, + array( + '_currentVersionNo' => $versionNo, + ) + ); + + // Update ContentInfo published flag and change the currentVersionNo to the published version + $contentInfoUpdateData = array( + "currentVersionNo" => $versionNo, + "isPublished" => true, + ); + // Update ContentInfo with set properties in $metaDataUpdateStruct + foreach ( $metaDataUpdateStruct as $propertyName => $propertyValue ) + { + if ( isset( $propertyValue ) ) + { + if ( $propertyName === "alwaysAvailable" ) + { + $contentInfoUpdateData["alwaysAvailable"] = $propertyValue; + } + else if ( $propertyName === "mainLanguageId" ) + { + $contentInfoUpdateData["mainLanguageCode"] = + $this->handler->contentLanguageHandler()->load( $propertyValue )->languageCode; + } + else $contentInfoUpdateData[$propertyName] = $propertyValue; + } + } + $this->backend->update( + 'Content\\ContentInfo', + $contentId, + $contentInfoUpdateData, + true + ); + + // Update VersionInfo with modified timestamp and published status + $this->backend->updateByMatch( + 'Content\\VersionInfo', + array( '_contentId' => $contentId, 'versionNo' => $versionNo ), + array( + "modificationDate" => $metaDataUpdateStruct->modificationDate, + "status" => VersionInfo::STATUS_PUBLISHED, + ) + ); + + return $this->load( $contentId, $versionNo ); + } + + /** + * Returns last version number for content identified by $contentId + * + * @param int $contentId + * + * @return int + */ + private function getLastVersionNumber( $contentId ) + { + $versionNumbers = array(); + $allVersions = $this->backend->find( + 'Content\\VersionInfo', + array( + '_contentId' => $contentId + ) + ); + + if ( empty( $allVersions ) ) + throw new NotFound( "Version", "contentId: $contentId" ); + + foreach ( $allVersions as $version ) + { + $versionNumbers[] = $version->versionNo; + } + + return max( $versionNumbers ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/ContentTypeHandler.php b/eZ/Publish/Core/Persistence/InMemory/ContentTypeHandler.php new file mode 100644 index 0000000..f224738 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/ContentTypeHandler.php @@ -0,0 +1,594 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct $group + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function createGroup( GroupCreateStruct $group ) + { + $groupArr = (array)$group; + return $this->backend->create( 'Content\\Type\\Group', $groupArr ); + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct $group + */ + public function updateGroup( GroupUpdateStruct $group ) + { + $groupArr = (array)$group; + $this->backend->update( 'Content\\Type\\Group', $groupArr['id'], $groupArr ); + } + + /** + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type group contains types + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + */ + public function deleteGroup( $groupId ) + { + if ( $this->backend->count( 'Content\\Type', array( 'groupIds' => $groupId ) ) ) + { + throw new BadStateException( '$groupId', "Group {$groupId} still contains Types and can not be deleted" ); + } + $this->backend->delete( 'Content\\Type\\Group', $groupId ); + } + + /** + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function loadGroup( $groupId ) + { + return $this->backend->load( 'Content\\Type\\Group', $groupId ); + } + + /** + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function loadGroupByIdentifier( $identifier ) + { + $group = $this->backend->find( 'Content\\Type\\Group', array( 'identifier' => $identifier ) ); + if ( !$group ) + throw new NotFound( 'Content\\Type\\Group', $identifier ); + + return $group[0]; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group[] + */ + public function loadAllGroups() + { + return $this->backend->find( 'Content\\Type\\Group', array() ); + } + + /** + * @param mixed $groupId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return \eZ\Publish\SPI\Persistence\Content\Type[] + */ + public function loadContentTypes( $groupId, $status = Type::STATUS_DEFINED ) + { + return $this->backend->find( + 'Content\\Type', + array( 'groupIds' => $groupId, 'status' => $status ), + array( + 'fieldDefinitions' => array( + 'type' => 'Content\\Type\\FieldDefinition', + 'match' => array( '_typeId' => 'id', '_status' => 'status' ) + ) + ) + ); + } + + /** + * Loads a content type by id and status + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with provided status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function load( $contentTypeId, $status = Type::STATUS_DEFINED ) + { + $type = $this->backend->find( + 'Content\\Type', + array( 'id' => $contentTypeId, 'status' => $status ), + array( + 'fieldDefinitions' => array( + 'type' => 'Content\\Type\\FieldDefinition', + 'match' => array( '_typeId' => 'id', '_status' => 'status' ) + ) + ) + ); + + if ( !$type ) + throw new NotFound( 'Content\\Type', "{$contentTypeId}' and status '{$status}" ); + + return $type[0]; + } + + /** + * Loads a (defined) content type by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If defined type is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function loadByIdentifier( $identifier ) + { + $type = $this->backend->find( + 'Content\\Type', + array( 'identifier' => $identifier, 'status' => Type::STATUS_DEFINED ), + array( + 'fieldDefinitions' => array( + 'type' => 'Content\\Type\\FieldDefinition', + 'match' => array( '_typeId' => 'id', '_status' => 'status' ) + ) + ) + ); + + if ( !$type ) + throw new NotFound( 'Content\\Type', "{$identifier}' and status '" . Type::STATUS_DEFINED ); + + return $type[0]; + } + + /** + * Loads a (defined) content type by remote id + * + * @param mixed $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If defined type is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function loadByRemoteId( $remoteId ) + { + $type = $this->backend->find( + 'Content\\Type', + array( 'remoteId' => $remoteId, 'status' => Type::STATUS_DEFINED ), + array( + 'fieldDefinitions' => array( + 'type' => 'Content\\Type\\FieldDefinition', + 'match' => array( '_typeId' => 'id', '_status' => 'status' ) + ) + ) + ); + + if ( !$type ) + throw new NotFound( 'Content\\Type', "{$remoteId}' and status '" . Type::STATUS_DEFINED ); + + return $type[0]; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct $contentType + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function create( CreateStruct $contentType ) + { + $contentTypeArr = (array)$contentType; + unset( $contentTypeArr['fieldDefinitions'] ); + $contentTypeObj = $this->backend->create( 'Content\\Type', $contentTypeArr ); + foreach ( $contentType->fieldDefinitions as $field ) + { + $contentTypeObj->fieldDefinitions[] = $this->backend->create( + 'Content\\Type\\FieldDefinition', + array( '_typeId' => $contentTypeObj->id, '_status' => $contentTypeObj->status ) + (array)$field + ); + } + return $contentTypeObj; + } + + /** + * @param mixed $typeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct $contentType + */ + public function update( $typeId, $status, UpdateStruct $contentType ) + { + $contentTypeArr = (array)$contentType; + $this->backend->updateByMatch( + 'Content\\Type', + array( 'id' => $typeId, 'status' => $status ), + $contentTypeArr + ); + } + + /** + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type is defined and still has content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type is not found + */ + public function delete( $contentTypeId, $status ) + { + if ( Type::STATUS_DEFINED === $status && $this->backend->count( 'Content\\ContentInfo', array( 'contentTypeId' => $contentTypeId ) ) ) + { + throw new BadStateException( '$contentTypeId', "Content of Type {$contentTypeId} still exists, can not delete" ); + } + // This will throw if none are found + $this->backend->deleteByMatch( + 'Content\\Type', + array( 'id' => $contentTypeId, 'status' => $status ) + ); + // So will this, which means you can not delete types with no fields (fix?) + $this->backend->deleteByMatch( + 'Content\\Type\\FieldDefinition', + array( '_typeId' => $contentTypeId, '_status' => $status ) + ); + } + + /** + * Creates a draft of existing defined content type + * + * Updates modified date, sets $modifierId and status to Type::STATUS_DRAFT on the new returned draft. + * + * @param mixed $modifierId + * @param mixed $contentTypeId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with defined status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function createDraft( $modifierId, $contentTypeId ) + { + $contentType = $this->load( $contentTypeId ); + $contentType->modified = time(); + $contentType->modifierId = $modifierId; + $contentType->status = Type::STATUS_DRAFT; + + $contentTypeArr = (array)$contentType; + unset( $contentTypeArr['fieldDefinitions'] ); + + $contentTypeObj = $this->backend->create( 'Content\\Type', $contentTypeArr, false ); + foreach ( $contentType->fieldDefinitions as $field ) + { + $contentTypeObj->fieldDefinitions[] = $this->backend->create( + 'Content\\Type\\FieldDefinition', + array( + '_typeId' => $contentTypeObj->id, + '_status' => $contentTypeObj->status + ) + (array)$field, + false + ); + } + return $contentTypeObj; + } + + /** + * Copy a Type incl fields and group-relations from a given status to a new Type with status {@link Type::STATUS_DRAFT} + * + * New Content Type will have $userId as creator / modifier, created / modified should be updated, new remoteId + * and identifier should be appended with '_' and new remoteId or another unique number. + * + * @param mixed $userId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If user or type with provided status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function copy( $userId, $contentTypeId, $status ) + { + $type = $this->load( $contentTypeId, $status ); + + // @todo Validate $userId + $struct = new CreateStruct(); + foreach ( $struct as $property => $value ) + { + $struct->$property = $type->$property; + } + $struct->created = $struct->modified = time(); + $struct->creatorId = $struct->modifierId = $userId; + $struct->status = $status; + $struct->identifier .= '_' . ( $struct->remoteId = md5( uniqid( get_class( $struct ), true ) ) ); + return $this->create( $struct );// this takes care of resetting _typeId and _status on fields + } + + /** + * Unlink a content type group from a content type + * + * @param mixed $groupId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or type with provided status is not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $groupId is last group on $contentTypeId or + * not a group assigned to type + */ + public function unlink( $groupId, $contentTypeId, $status ) + { + $list = $this->backend->find( 'Content\\Type', array( 'id' => $contentTypeId, 'status' => $status ) ); + if ( !isset( $list[0] ) ) + throw new NotFound( 'Content\\Type', "{$contentTypeId}' and status '{$status}" ); + + $type = $list[0]; + if ( !in_array( $groupId, $type->groupIds ) ) + throw new BadStateException( '$groupId', "Group {$groupId} is not a group on Type {$contentTypeId}" ); + + if ( !isset( $type->groupIds[1] ) ) + throw new BadStateException( + '$groupId', + "Group {$groupId} is last on Type {$contentTypeId}, delete type or add another group before unlinking" + ); + + if ( !$this->backend->load( 'Content\\Type\\Group', $groupId ) ) + throw new NotFound( 'Content\\Type\\Group', $groupId ); + + $this->backend->updateByMatch( + 'Content\\Type', + array( 'id' => $contentTypeId, 'status' => $status ), + array( 'groupIds' => array_values( array_diff( $type->groupIds, array( $groupId ) ) ) ) + ); + } + + /** + * Link a content type group with a content type + * + * @param mixed $groupId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or type with provided status is not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type is already part of group + */ + public function link( $groupId, $contentTypeId, $status ) + { + $list = $this->backend->find( 'Content\\Type', array( 'id' => $contentTypeId, 'status' => $status ) ); + if ( !isset( $list[0] ) ) + throw new NotFound( 'Content\\Type', "{$contentTypeId}' and status '{$status}" ); + + $type = $list[0]; + if ( in_array( $groupId, $type->groupIds ) ) + throw new BadStateException( '$groupId', "Group {$groupId} is already linked to Type {$contentTypeId}" ); + + if ( !$this->backend->load( 'Content\\Type\\Group', $groupId ) ) + throw new NotFound( 'Content\\Type\\Group', $groupId ); + + $this->backend->updateByMatch( + 'Content\\Type', + array( 'id' => $contentTypeId, 'status' => $status ), + array( 'groupIds' => array_merge( $type->groupIds, array( $groupId ) ) ) + ); + } + + /** + * Returns field definition for the given field definition id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field definition is not found + * + * @param mixed $id + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + public function getFieldDefinition( $id, $status ) + { + $fieldDefinition = $this->backend->find( + "Content\\Type\\FieldDefinition", + array( "id" => $id, "_status" => $status ) + ); + + if ( !isset( $fieldDefinition[0] ) ) + throw new NotFound( + "Content\\Type\\FieldDefinition", + array( + "id" => $id, + "status" => $status + ) + ); + + return $fieldDefinition[0]; + } + + /** + * Adds a new field definition to an existing Type. + * + * This method creates a new version of the Type with the $fieldDefinition + * added. It does not update existing content objects depending on the + * field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type is not found + * @todo Add FieldDefintion\CreateStruct? + */ + public function addFieldDefinition( $contentTypeId, $status, FieldDefinition $fieldDefinition ) + { + $list = $this->backend->find( 'Content\\Type', array( 'id' => $contentTypeId, 'status' => $status ) ); + if ( !isset( $list[0] ) ) + throw new NotFound( 'Content\\Type', "{$contentTypeId}' and status '{$status}" ); + + $fieldDefinitionArr = (array)$fieldDefinition; + $fieldDefinitionArr['_typeId'] = $contentTypeId; + $fieldDefinitionArr['_status'] = $status; + + return $this->backend->create( 'Content\\Type\\FieldDefinition', $fieldDefinitionArr ); + } + + /** + * Removes a field definition from an existing Type. + * + * This method creates a new version of the Type with the field definition + * referred to by $fieldDefinitionId removed. It does not update existing + * content objects depending on the field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param mixed $fieldDefinitionId + * + * @return void + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field is not found + * @todo Add FieldDefinition\UpdateStruct? + */ + public function removeFieldDefinition( $contentTypeId, $status, $fieldDefinitionId ) + { + $this->backend->deleteByMatch( + 'Content\\Type\\FieldDefinition', + array( + '_typeId' => $contentTypeId, + '_status' => $status, + 'id' => $fieldDefinitionId, + ) + ); + } + + /** + * This method updates the given $fieldDefinition on a Type. + * + * This method creates a new version of the Type with the updated + * $fieldDefinition. It does not update existing content objects depending + * on the + * field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field is not found + * + * @return void + */ + public function updateFieldDefinition( $contentTypeId, $status, FieldDefinition $fieldDefinition ) + { + $fieldDefinitionArr = (array)$fieldDefinition; + $updated = $this->backend->updateByMatch( + 'Content\\Type\\FieldDefinition', + array( + '_typeId' => $contentTypeId, + '_status' => $status, + 'id' => $fieldDefinition->id, + ), + $fieldDefinitionArr + ); + if ( !$updated ) + throw new NotFound( 'Content\\Type\\FieldDefinition', $fieldDefinition->id ); + } + + /** + * Update content objects + * + * Updates content objects, depending on the changed field definitions. + * + * A content type has a state which tells if its content objects yet have + * been adapted. + * + * Flags the content type as updated. + * + * @param mixed $contentTypeId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with $contentTypeId and Type::STATUS_DRAFT is not found + * + * @return void + */ + public function publish( $contentTypeId ) + { + $draftType = $this->load( $contentTypeId, Type::STATUS_DRAFT ); + try + { + $publishedType = $this->load( $contentTypeId ); + } + catch ( NotFound $e ) + { + // No published version of type, jump to last section where draft is promoted to defined + GOTO updateType; + } + + // @todo update content based on new type data change (field/scheme changes from $publishedType to $draftType) + $this->backend->deleteByMatch( + 'Content\\Type', + array( 'id' => $contentTypeId, 'status' => Type::STATUS_DEFINED ) + ); + $this->backend->deleteByMatch( + 'Content\\Type\\FieldDefinition', + array( '_typeId' => $contentTypeId, '_status' => Type::STATUS_DEFINED ) + ); + + updateType: + { + $this->backend->updateByMatch( + 'Content\\Type', + array( 'id' => $contentTypeId, 'status' => Type::STATUS_DRAFT ), + array( 'status' => Type::STATUS_DEFINED ) + ); + $this->backend->updateByMatch( + 'Content\\Type\\FieldDefinition', + array( + '_typeId' => $contentTypeId, + '_status' => Type::STATUS_DRAFT, + ), + array( '_status' => Type::STATUS_DEFINED ) + ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Handler.php b/eZ/Publish/Core/Persistence/InMemory/Handler.php new file mode 100644 index 0000000..88dd064 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Handler.php @@ -0,0 +1,184 @@ +backend = new Backend( json_decode( file_get_contents( __DIR__ . '/data.json' ), true ) ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function contentHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\ContentHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Search\Handler + */ + public function searchHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\SearchHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + public function contentTypeHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\ContentTypeHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Language\Handler + */ + public function contentLanguageHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\LanguageHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function locationHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\LocationHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler + */ + public function objectStateHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\ObjectStateHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\User\Handler + */ + public function userHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\UserHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function sectionHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\SectionHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function trashHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\TrashHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler + */ + public function urlAliasHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\UrlAliasHandler' ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler + */ + public function urlWildcardHandler() + { + return $this->serviceHandler( 'eZ\\Publish\\Core\\Persistence\\InMemory\\UrlWildcardHandler' ); + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + $this->backend->beginTransaction(); + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit() + { + $this->backend->commit(); + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback() + { + $this->backend->rollback(); + } + + /** + * Get/create instance of service handler objects + * + * @param string $className + * + * @throws \eZ\Publish\Core\Base\Exceptions\MissingClass + * + * @return object + */ + protected function serviceHandler( $className ) + { + if ( isset( $this->serviceHandlers[$className] ) ) + return $this->serviceHandlers[$className]; + + if ( class_exists( $className ) ) + return $this->serviceHandlers[$className] = new $className( $this, $this->backend ); + + throw new MissingClass( $className, 'service handler' ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/LanguageHandler.php b/eZ/Publish/Core/Persistence/InMemory/LanguageHandler.php new file mode 100644 index 0000000..54f350f --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/LanguageHandler.php @@ -0,0 +1,135 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * Create a new language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function create( CreateStruct $struct ) + { + return $this->backend->create( 'Content\\Language', (array)$struct ); + } + + /** + * Update language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language $struct + */ + public function update( Language $struct ) + { + $this->backend->update( + 'Content\\Language', + $struct->id, + (array)$struct + ); + } + + /** + * Get language by id + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $id + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function load( $id ) + { + return $this->backend->load( 'Content\\Language', $id ); + } + + /** + * Get language by Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $languageCode + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function loadByLanguageCode( $languageCode ) + { + $languages = $this->backend->find( 'Content\\Language', array( 'languageCode' => $languageCode ) ); + if ( empty( $languages ) ) + throw new NotFound( 'Content\\Language', $languageCode ); + + return $languages[0]; + } + + /** + * Get all languages + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function loadAll() + { + $languages = array(); + foreach ( $this->backend->find( 'Content\\Language', array() ) as $language ) + { + $languages[$language->languageCode] = $language; + } + return $languages; + } + + /** + * Delete a language + * + * @throws \LogicException If language could not be deleted + * + * @param mixed $id + */ + public function delete( $id ) + { + $versions = $this->backend->find( 'Content\\VersionInfo', array( 'languageIds' => $id ) ); + if ( !empty( $versions ) ) + { + throw new LogicException( "Deleting language logic error, some content still references that language and therefore it can't be deleted" ); + } + + $this->backend->delete( 'Content\\Language', $id ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/LocationHandler.php b/eZ/Publish/Core/Persistence/InMemory/LocationHandler.php new file mode 100644 index 0000000..70ac1b9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/LocationHandler.php @@ -0,0 +1,678 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function load( $locationId ) + { + return $this->backend->load( 'Content\\Location', $locationId ); + } + + /** + * Loads all locations for $contentId, optionally limited to a sub tree + * identified by $rootLocationId + * + * @param int $contentId + * @param int $rootLocationId + * + * @todo Add support for $rootLocationId when not child of node 1 + * + * @return \eZ\Publish\SPI\Persistence\Content\Location[] + */ + public function loadLocationsByContent( $contentId, $rootLocationId = null ) + { + if ( $rootLocationId ) + return $this->backend->find( + 'Content\\Location', + array( 'contentId' => $contentId, 'pathString' => "%/{$rootLocationId}/%" ) + ); + + return $this->backend->find( + 'Content\\Location', + array( 'contentId' => $contentId ) + ); + } + + /** + * Loads the data for the location identified by $remoteId. + * + * @param string $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function loadByRemoteId( $remoteId ) + { + $locations = $this->backend->find( + 'Content\\Location', + array( 'remoteId' => $remoteId ) + ); + + if ( empty( $locations ) ) + throw new NotFound( 'Location by remote id', $remoteId ); + else if ( isset( $locations[1] ) ) + throw new \RuntimeException( "Several Locations found with same remote id: {$remoteId}" ); + + return $locations[0]; + } + + /** + * Get all subtree locations for the given location (including), sorted by path string + * + * @param \eZ\Publish\SPI\Persistence\Content\Location $location + * @param array $locations + * + * @return array + */ + protected function getSubtreeLocations( $location, &$locations = array() ) + { + if ( empty( $locations ) ) $locations[] = $location; + + $subLocations = $this->backend->find( "Content\\Location", array( "parentId" => $location->id ) ); + usort( + $subLocations, + function ( $subLocationA, $subLocationB ) + { + return strnatcmp( $subLocationA->pathString, $subLocationB->pathString ); + } + ); + foreach ( $subLocations as $subLocation ) + { + $locations[] = $subLocation; + $this->getSubtreeLocations( $subLocation, $locations ); + } + + return $locations; + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function copySubtree( $sourceId, $destinationParentId ) + { + $sourceLocation = $this->load( $sourceId ); + $children = $this->getSubtreeLocations( $sourceLocation ); + $parentLocation = $this->load( $destinationParentId ); + $contentMap = array(); + $locationMap = array( + $children[0]->parentId => array( + "id" => $destinationParentId, + "hidden" => $parentLocation->hidden, + "invisible" => $parentLocation->invisible + ) + ); + + $locations = array(); + foreach ( $children as $child ) + { + $locations[$child->contentId][] = $child->id; + } + + $time = time(); + $mainLocations = array(); + $mainLocationsUpdate = array(); + foreach ( $children as $index => $child ) + { + $originalContentInfo = $this->handler->contentHandler()->loadContentInfo( $child->contentId ); + + if ( !isset( $contentMap[$child->contentId] ) ) + { + $content = $this->handler->contentHandler()->copy( + $child->contentId, + $originalContentInfo->currentVersionNo + ); + $newContentId = $content->versionInfo->contentInfo->id; + + $content = $this->handler->contentHandler()->publish( + $newContentId, + $content->versionInfo->versionNo, + new MetadataUpdateStruct( + array( + "publicationDate" => $time, + "modificationDate" => $time + ) + ) + ); + + $contentMap[$child->contentId] = $newContentId; + } + + $createStruct = new CreateStruct(); + $createStruct->contentVersion = $originalContentInfo->currentVersionNo; + $createStruct->hidden = $child->hidden; + $createStruct->pathIdentificationString = $child->pathIdentificationString; + $createStruct->priority = $child->priority; + $createStruct->remoteId = md5( uniqid( get_class( $this ), true ) ); + $createStruct->sortField = $child->sortField; + $createStruct->sortOrder = $child->sortOrder; + $createStruct->contentId = $contentMap[$child->contentId]; + $createStruct->parentId = $locationMap[$child->parentId]["id"]; + $createStruct->invisible = $createStruct->hidden || + $locationMap[$child->parentId]["hidden"] || + $locationMap[$child->parentId]["invisible"]; + + // Use content main node if already set, otherwise use this node as main + if ( isset( $mainLocations[$child->contentId] ) ) + { + $createStruct->mainLocationId = $locationMap[$mainLocations[$child->contentId]]["id"]; + } + else + { + $createStruct->mainLocationId = true; + $mainLocations[$child->contentId] = $child->id; + + // If needed mark for later update + if ( + in_array( $child->mainLocationId, $locations[$child->contentId] ) && + count( $locations[$child->contentId] ) > 1 && + $child->id !== $child->mainLocationId + ) + { + $mainLocationsUpdate[$child->contentId] = $child->mainLocationId; + } + } + + $newLocation = $this->create( $createStruct ); + + $locationMap[$child->id] = array( + "id" => $newLocation->id, + "hidden" => $newLocation->hidden, + "invisible" => $newLocation->invisible + ); + if ( $index === 0 ) $copiedSubtreeRootLocation = $newLocation; + } + + // Update main locations + foreach ( $mainLocationsUpdate as $contentId => $mainLocationId ) + { + $this->changeMainLocation( + $contentMap[$contentId], + $locationMap[$mainLocationId]["id"] + ); + } + + // If subtree root is main location for its content, update subtree section to the one of the + // parent location content + if ( $copiedSubtreeRootLocation->mainLocationId === $copiedSubtreeRootLocation->id ) + { + $this->setSectionForSubtree( + $copiedSubtreeRootLocation->id, + $this->handler->contentHandler()->loadContentInfo( $this->load( $destinationParentId )->contentId )->sectionId + ); + } + + return $copiedSubtreeRootLocation; + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function move( $sourceId, $destinationParentId ) + { + $vo = $this->load( $sourceId ); + $newParentVO = $this->load( $destinationParentId ); + $oldPathString = $vo->pathString; + $newPathString = $newParentVO->pathString . $sourceId . '/'; + $oldPathIdentificationString = $vo->pathIdentificationString; + $newPathIdentificationString = ''; + if ( $newParentVO->parentId == 1 ) + $newPathIdentificationString = $this->getStrippedContentName( $vo ); + else + $newPathIdentificationString = $this->getPathIdentificationString( $newParentVO ) . '/' . $this->getStrippedContentName( $vo ); + + $this->backend->update( + 'Content\\Location', + $sourceId, + array( + 'parentId' => $destinationParentId, + 'pathString' => $newPathString, + 'pathIdentificationString' => $newPathIdentificationString + ) + ); + + $children = $this->backend->find( 'Content\\Location', array( 'pathString' => "$vo->pathString%" ) ); + foreach ( $children as $child ) + { + $this->backend->update( + 'Content\\Location', + $child->id, + array( + 'pathString' => str_replace( $oldPathString, $newPathString, $child->pathString ), + 'pathIdentificationString' => str_replace( $oldPathIdentificationString, $newPathIdentificationString, $child->pathIdentificationString ) + ) + ); + } + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function markSubtreeModified( $locationId, $timestamp = null ) + { + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function hide( $id ) + { + $this->backend->update( 'Content\\Location', $id, array( 'hidden' => true, 'invisible' => true ) ); + + $locationVO = $this->backend->load( 'Content\\Location', $id ); + $this->backend->updateByMatch( + "Content\\Location", + array( "pathString" => "{$locationVO->pathString}%" ), + array( "invisible" => true ) + ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function unHide( $id ) + { + $this->backend->update( 'Content\\Location', $id, array( 'hidden' => false, 'invisible' => false ) ); + + $locationVO = $this->backend->load( 'Content\\Location', $id ); + $hiddenLocations = $this->backend->find( + "Content\\Location", + array( + "pathString" => "{$locationVO->pathString}%", + "hidden" => true + ) + ); + + $invisibleLocations = $this->backend->find( + "Content\\Location", + array( + "pathString" => "{$locationVO->pathString}%", + "invisible" => true, + "hidden" => false + ) + ); + + $locationsToUnhide = array(); + // Loop against all invisible locations and figure out + // if they are under a hidden one. + // If this is the case, the location won't be made visible + foreach ( $invisibleLocations as $loc ) + { + foreach ( $hiddenLocations as $hiddenLoc ) + { + if ( strpos( $loc->pathString, $hiddenLoc->pathString ) === 0 ) + { + continue 2; + } + } + $locationsToUnhide[] = $loc->id; + } + + $this->backend->updateByMatch( 'Content\\Location', array( 'id' => $locationsToUnhide ), array( 'invisible' => false ) ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function swap( $locationId1, $locationId2 ) + { + $location1 = $this->backend->load( 'Content\\Location', $locationId1 ); + $content1 = $this->backend->load( 'Content', $location1->contentId ); + + $location2 = $this->backend->load( 'Content\\Location', $locationId2 ); + $content2 = $this->backend->load( 'Content', $location2->contentId ); + + $this->backend->update( + 'Content\\Location', + $locationId1, + array( + 'contentId' => $location2->contentId, + ) + ); + $this->backend->update( + 'Content\\Location', + $locationId2, + array( + 'contentId' => $location1->contentId, + ) + ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function update( UpdateStruct $location, $locationId ) + { + return $this->backend->update( + 'Content\\Location', + $locationId, + (array)$location + ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function create( CreateStruct $locationStruct ) + { + $parentId = $locationStruct->parentId; + $parent = $this->load( $parentId ); + $params = (array)$locationStruct; + $params['parentId'] = $parentId; + $params['depth'] = $parent->depth + 1; + $params['hidden'] = (bool)$locationStruct->hidden; + if ( !isset( $params['remoteId'] ) ) + { + $params['remoteId'] = md5( uniqid( 'Content\\Location', true ) ); + } + + // Creation, then update for pathString/pathIdentificationString/mainLocationId + $mainLocationId = null; + $otherLocationsForContent = $this->backend->find( 'Content\\Location', array( 'contentId' => $locationStruct->contentId ) ); + if ( !empty( $otherLocationsForContent ) ) + { + $mainLocationId = $otherLocationsForContent[0]->id; + } + $vo = $this->backend->create( 'Content\\Location', $params ); + $pathString = $parent->pathString . $vo->id . '/'; + $this->backend->update( + 'Content\\Location', + $vo->id, + array( + 'pathString' => $pathString, + 'pathIdentificationString' => $this->getPathIdentificationString( $vo ), + 'mainLocationId' => isset( $mainLocationId ) ? $mainLocationId : $vo->id + ) + ); + return $this->load( $vo->id ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function removeSubtree( $locationId ) + { + $location = $this->load( $locationId ); + + // Begin recursive call on children, if any + $directChildren = $this->backend->find( 'Content\\Location', array( 'parentId' => $locationId ) ); + if ( !empty( $directChildren ) ) + { + foreach ( $directChildren as $child ) + { + $this->removeSubtree( $child->id ); + } + } + + $this->delete( $locationId ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function setSectionForSubtree( $locationId, $sectionId ) + { + $location = $this->load( $locationId ); + $aContentIds = array( $location->contentId ); + $children = $this->backend->find( 'Content\\Location', array( 'pathString' => "$location->pathString%" ) ); + foreach ( $children as $child ) + { + // Only get main locations + if ( $child->mainLocationId == $child->id ) + { + $aContentIds[] = $child->contentId; + } + } + + $this->backend->updateByMatch( + 'Content\\ContentInfo', + array( 'id' => $aContentIds ), + array( 'sectionId' => $sectionId ), + true + ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function storeUrlAliasPath( $path, $locationId, $languageCode = null, $alwaysAvailable = false ) + { + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function createCustomUrlAlias( $alias, $locationId, $forwarding = false, $languageCode = null, $alwaysAvailable = false ) + { + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function createUrlHistoryEntry( $historicUrl, $locationId ) + { + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function listUrlsForLocation( $locationId, $urlType ) + { + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function removeUrlsForLocation( $locationId, array $urlIdentifier ) + { + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function getPath( $locationId, $language ) + { + } + + /** + * Removes a location from its $locationId (but not its descendants) + * Content which looses its main Location will get the first + * of its other Locations assigned as the new main Location. + * If content has no location left, it's removed from backend + * + * @param mixed $locationId + */ + public function delete( $locationId ) + { + $location = $this->load( $locationId ); + $this->backend->delete( 'Content\\Location', $locationId ); + $remainingLocations = $this->backend->find( 'Content\\Location', array( 'contentId' => $location->contentId ) ); + // If no remaining location for associated content, remove the content as well + // Else, update the mainLocationId if needed + if ( empty( $remainingLocations ) ) + { + try + { + $this->handler->contentHandler()->deleteContent( $location->contentId ); + } + // Ignoring a NotFound exception since the content handler also takes care of removing itself and locations + catch ( NotFound $e ) + { + } + } + else + { + $this->backend->updateByMatch( + 'Content\\Location', + array( 'contentId' => $location->contentId ), + array( 'mainLocationId' => $remainingLocations[0]->id ) + ); + } + } + + /** + * Returns locations given a parent $locationId. + * + * @todo Requires approbation + * @param mixed $locationId + * + * @return \eZ\Publish\SPI\Persistence\Content\Location[] + */ + public function loadByParentId( $locationId ) + { + $result = $this->backend->find( "Content\\Location", array( "parentId" => $locationId ) ); + + // If no result is found this might be caused by an unexisting location ID. + // We call load() to trigger a NotFound exception in such case for consistencies + // across the API. + if ( empty( $result ) ) + { + $this->load( $locationId ); + } + + return $result; + } + + /** + * Changes main location of content identified by given $contentId to location identified by given $locationId + * + * @param mixed $contentId + * @param mixed $locationId + * + * @return void + */ + public function changeMainLocation( $contentId, $locationId ) + { + $this->backend->updateByMatch( + "Content\\Location", + array( "contentId" => $contentId ), + array( "mainLocationId" => $locationId ) + ); + + $parentLocation = $this->backend->load( + "Content\\Location", + $this->backend->load( "Content\\Location", $locationId )->parentId + ); + $parentContent = $this->backend->load( + "Content\\ContentInfo", + $parentLocation->contentId + ); + + $this->setSectionForSubtree( $locationId, $parentContent->sectionId ); + } + + /** + * Returns parent path string for $pathString + * @param string $pathString + * + * @return string + */ + private function getParentPathString( $pathString ) + { + return substr( $pathString, 0, -2 ); + } + + /** + * Returns pathIdentificationString for provided location value object + * @param \eZ\Publish\SPI\Persistence\Content\Location $vo + * + * @return string + */ + private function getPathIdentificationString( LocationValue $vo ) + { + $parent = $this->load( $vo->parentId ); + if ( $vo->parentId == 1 ) + { + return ''; + } + + if ( empty( $parent->pathIdentificationString ) ) + { + return $this->getStrippedContentName( $vo ); + } + + return $parent->pathIdentificationString . '/' . $this->getStrippedContentName( $vo ); + } + + /** + * Returns stripped content name from location value + * All downcase, special chars to underscores + * e.g. my_content_name + * @param LocationValue $vo + * + * @return string + */ + private function getStrippedContentName( LocationValue $vo ) + { + $version = $this->backend->find( + "Content\\VersionInfo", + array( + "contentId" => $vo->contentId, + "versionNo" => $this->backend->load( 'Content\\ContentInfo', $vo->contentId )->currentVersionNo + ) + ); + return isset( $version[0]->names["eng-GB"] ) + ? preg_replace( + '`[^a-z0-9_]`i', + '_', + strtolower( + trim( + strtr( + // @todo Remove hardcoding of eng-GB + $version[0]->names["eng-GB"], + self::CHARS_ACCENT, + self::CHARS_NOACCENT + ) + ) + ) + ) + : null; + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/ObjectStateHandler.php b/eZ/Publish/Core/Persistence/InMemory/ObjectStateHandler.php new file mode 100644 index 0000000..b1469f2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/ObjectStateHandler.php @@ -0,0 +1,480 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * Creates a new object state group + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function createGroup( InputStruct $input ) + { + return $this->backend->create( 'Content\\ObjectState\\Group', $this->getInputData( $input ) ); + } + + /** + * Loads a object state group + * + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function loadGroup( $groupId ) + { + return $this->backend->load( 'Content\\ObjectState\\Group', $groupId ); + } + + /** + * Loads a object state group by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function loadGroupByIdentifier( $identifier ) + { + $objectStateGroups = $this->backend->find( 'Content\\ObjectState\\Group', array( 'identifier' => $identifier ) ); + if ( empty( $objectStateGroups ) ) + { + throw new NotFound( "Content\\ObjectState\\Group", array( "identifier" => $identifier ) ); + } + + return reset( $objectStateGroups ); + } + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group[] + */ + public function loadAllGroups( $offset = 0, $limit = -1 ) + { + $objectStateGroups = array(); + foreach ( $this->backend->find( 'Content\\ObjectState\\Group', array() ) as $objectStateGroup ) + { + $objectStateGroups[] = $objectStateGroup; + } + return array_slice( $objectStateGroups, $offset, $limit >= 0 ? $limit : null ); + } + + /** + * This method returns the ordered list of object states of a group + * + * @param mixed $groupId + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState[] + */ + public function loadObjectStates( $groupId ) + { + $objectStates = $this->backend->find( 'Content\\ObjectState', array( 'groupId' => $groupId ) ); + + usort( + $objectStates, + function( ObjectState $first, ObjectState $second ) + { + if ( $first->priority == $second->priority ) + return 0; + + return $first->priority > $second->priority ? 1 : -1; + } + ); + + return $objectStates; + } + + /** + * Updates an object state group + * + * @param mixed $groupId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function updateGroup( $groupId, InputStruct $input ) + { + $this->backend->update( 'Content\\ObjectState\\Group', $groupId, $this->getInputData( $input ) ); + return $this->loadGroup( $groupId ); + } + + /** + * Deletes a object state group including all states and links to content + * + * @param mixed $groupId + */ + public function deleteGroup( $groupId ) + { + $this->backend->deleteByMatch( 'Content\\ObjectState', array( 'groupId' => $groupId ) ); + $this->backend->delete( 'Content\\ObjectState\\Group', $groupId ); + } + + /** + * Creates a new object state in the given group. + * The new state gets the last priority. + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @param mixed $groupId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function create( $groupId, InputStruct $input ) + { + $inputData = $this->getInputData( $input ); + + $newPriority = 0; + $objectStates = $this->loadObjectStates( $groupId ); + if ( !empty( $objectStates ) ) + { + $newPriority = $objectStates[count( $objectStates ) - 1]->priority + 1; + } + + $inputData["groupId"] = (int)$groupId; + $inputData["priority"] = $newPriority; + + $createdState = $this->backend->create( 'Content\\ObjectState', $inputData ); + + if ( $newPriority == 0 ) + { + $allContentInfos = $this->backend->find( "Content\\ContentInfo" ); + $allContentIds = array_map( + function( ContentInfo $contentInfo ) + { + return $contentInfo->id; + }, + $allContentInfos + ); + + $this->backend->update( "Content\\ObjectState", $createdState->id, array( "_contentId" => $allContentIds ) ); + } + + return $createdState; + } + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function load( $stateId ) + { + return $this->backend->load( 'Content\\ObjectState', $stateId ); + } + + /** + * Loads an object state by identifier and group it belongs to + * + * @param string $identifier + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function loadByIdentifier( $identifier, $groupId ) + { + $objectStates = $this->backend->find( + 'Content\\ObjectState', + array( + 'identifier' => $identifier, + 'groupId' => $groupId + ) + ); + + if ( empty( $objectStates ) ) + { + throw new NotFound( "Content\\ObjectState", array( "identifier" => $identifier, "groupId" => $groupId ) ); + } + + return reset( $objectStates ); + } + + /** + * Updates an object state + * + * @param mixed $stateId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function update( $stateId, InputStruct $input ) + { + $this->backend->update( 'Content\\ObjectState', $stateId, $this->getInputData( $input ) ); + return $this->load( $stateId ); + } + + /** + * Changes the priority of the state + * + * @param mixed $stateId + * @param int $priority + */ + public function setPriority( $stateId, $priority ) + { + $objectState = $this->load( $stateId ); + $groupStates = $this->loadObjectStates( $objectState->groupId ); + + $priorityList = array(); + foreach ( $groupStates as $index => $groupState ) + { + $priorityList[$groupState->id] = $index; + } + + $priorityList[$objectState->id] = (int)$priority; + asort( $priorityList ); + + foreach ( array_keys( $priorityList ) as $objectStatePriority => $objectStateId ) + { + $this->backend->update( 'Content\\ObjectState', $objectStateId, array( "priority" => $objectStatePriority ) ); + } + } + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @param mixed $stateId + */ + public function delete( $stateId ) + { + // We need to load the object state as we need $groupId + $objectState = $this->load( $stateId ); + + // Find all content for the current $stateId + $contentList = $this->getObjectStateContentList( $stateId ); + + // Delete the state + $this->backend->delete( 'Content\\ObjectState', $stateId ); + + // Update the priorities of the group states if there are any more states in the group + $groupStates = $this->loadObjectStates( $objectState->groupId ); + if ( empty( $groupStates ) ) + return; + + $priority = 0; + foreach ( $groupStates as $groupState ) + { + $this->backend->update( 'Content\\ObjectState', $groupState->id, array( "priority" => $priority ) ); + $priority++; + } + + // Now reassign content from old state to the first state in the group + $firstObjectState = current( $this->backend->find( "Content\\ObjectState", array( "priority" => 0 ) ) ); + + $existingContent = $this->getObjectStateContentList( $firstObjectState->id ) + $contentList; + $existingContent = array_values( array_unique( $existingContent ) ); + + $this->backend->update( 'Content\\ObjectState', $firstObjectState->id, array( "_contentId" => $existingContent ) ); + } + + /** + * Sets the object-state of a state group to $stateId for the given content. + * + * @param mixed $contentId + * @param mixed $groupId + * @param mixed $stateId + * + * @return boolean + */ + public function setContentState( $contentId, $groupId, $stateId ) + { + $groupStateIds = $this->getGroupStateList( $groupId ); + if ( empty( $groupStateIds ) || !in_array( $stateId, $groupStateIds ) ) + return false; + + $contentToStateMap = $this->getContentToStateMap(); + + // If the content was in one of the group states, + // find all content for the old state and update the old state with excluded $contentId + $existingStateIds = array_values( array_intersect( $groupStateIds, $contentToStateMap[(int)$contentId] ) ); + if ( !empty( $existingStateIds ) ) + { + $oldStateContentList = $this->getObjectStateContentList( $existingStateIds[0] ); + $oldStateContentList = array_values( array_diff( $oldStateContentList, array( $contentId ) ) ); + + $this->backend->update( "Content\\ObjectState", $existingStateIds[0], array( "_contentId" => $oldStateContentList ) ); + } + + // Find all content for the new state and update the new state with added $contentId + $newStateContentList = $this->getObjectStateContentList( $stateId ); + $newStateContentList[] = $contentId; + + $this->backend->update( "Content\\ObjectState", $stateId, array( "_contentId" => $newStateContentList ) ); + + return true; + } + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @param mixed $contentId + * @param mixed $stateGroupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if no state is found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function getContentState( $contentId, $stateGroupId ) + { + $groupStateIds = $this->getGroupStateList( $stateGroupId ); + if ( empty( $groupStateIds ) ) + throw new NotFound( "Content\\ObjectState", array( "groupId" => $stateGroupId ) ); + + $contentId = (int)$contentId; + + $contentToStateMap = $this->getContentToStateMap(); + if ( !isset( $contentToStateMap[$contentId] ) ) + throw new NotFound( "Content\\ObjectState", array( "groupId" => $stateGroupId ) ); + + $foundStates = array_values( array_intersect( $groupStateIds, $contentToStateMap[$contentId] ) ); + if ( empty( $foundStates ) ) + throw new NotFound( "Content\\ObjectState", array( "groupId" => $stateGroupId ) ); + + return $this->load( $foundStates[0] ); + } + + /** + * Returns the number of objects which are in this state + * + * @param mixed $stateId + * + * @return int + */ + public function getContentCount( $stateId ) + { + return count( $this->getObjectStateContentList( $stateId ) ); + } + + /** + * Converts InputStruct to array and adds missing languageCodes array into it + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return array + */ + protected function getInputData( InputStruct $input ) + { + $inputData = (array)$input; + $inputData["languageCodes"] = array_keys( $input->name ); + return $inputData; + } + + /** + * Gets a mapping array of all content and states they belong to + * + * This method serves as a hack because InMemory storage is unable to + * store M:N relations between content and object states as there's no + * value object for the link + * + * @return array + */ + protected function getContentToStateMap() + { + $contentToStateMap = array(); + + $contentInfoArray = $this->backend->find( "Content\\ContentInfo" ); + foreach ( $contentInfoArray as $contentInfo ) + { + $objectStates = $this->backend->find( "Content\\ObjectState", array( "_contentId" => $contentInfo->id ) ); + foreach ( $objectStates as $objectState ) + { + $contentToStateMap[$contentInfo->id][] = $objectState->id; + } + } + + return $contentToStateMap; + } + + /** + * Returns all content IDs that belong to $stateId + * + * @param int $stateId + * + * @return array + */ + protected function getObjectStateContentList( $stateId ) + { + $contentList = array(); + foreach ( $this->getContentToStateMap() as $contentId => $stateList ) + { + if ( in_array( $stateId, $stateList ) ) + $contentList[] = $contentId; + } + + return $contentList; + } + + /** + * Returns all state IDs that belong to $groupId + * + * @param int $groupId + * + * @return array + */ + protected function getGroupStateList( $groupId ) + { + $groupStates = $this->loadObjectStates( $groupId ); + return array_map( + function ( ObjectState $objectState ) + { + return $objectState->id; + }, + $groupStates + ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/SearchHandler.php b/eZ/Publish/Core/Persistence/InMemory/SearchHandler.php new file mode 100644 index 0000000..2ee57cb --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/SearchHandler.php @@ -0,0 +1,336 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: array("languages" => array(,..)). + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array() ) + { + // Only some criteria are supported as getting full support for all in InMemory engine is not a priority + $match = array(); + $this->generateMatchByCriteria( array( $query->criterion ), $match ); + + if ( empty( $match ) ) + { + throw new Exception( "Logical error: \$match is empty" ); + } + + $list = $this->backend->find( + 'Content', + $match, + array( + 'locations' => array( + 'type' => 'Content\\Location', + 'match' => array( 'contentId' => 'id' ), + 'skip' => true + ), + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ), + 'objectStates' => array( + 'type' => 'Content\\ObjectState', + 'match' => array( '_contentId' => 'id' ), + 'skip' => true + ) + ) + ); + + $resultList = array(); + foreach ( $list as $item ) + { + if ( !$item instanceof Content ) + throw new \RuntimeException( "item is not instance of Content, it is ". var_export( $item, true ) ); + else if ( !$item->versionInfo instanceof VersionInfo ) + throw new \RuntimeException( "item->versionInfo is not instance of VersionInfo, it is ". var_export( $item, true ) ); + else if ( !$item->versionInfo->contentInfo instanceof ContentInfo ) + throw new \RuntimeException( "item->versionInfo->contentInfo is not instance of ContentInfo, it is ". var_export( $item, true ) ); + else + { + $item->fields = $this->backend->find( + 'Content\\Field', + array( + '_contentId' => $item->versionInfo->contentInfo->id, + 'versionNo' => $item->versionInfo->contentInfo->currentVersionNo + ) + ); + + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $item->versionInfo->contentInfo->id ) + ); + if ( !empty( $locations ) ) + { + $item->versionInfo->contentInfo->mainLocationId = $locations[0]->mainLocationId; + } + + $resultList[] = $item; + } + } + + $result = new SearchResult(); + $result->time = 0; + $result->totalCount = count( $resultList ); + + if ( empty( $resultList ) || ( $query->limit === null && $query->offset === 0 ) ) + $result->searchHits = $resultList; + else if ( $query->limit === null ) + $result->searchHits = array_slice( $resultList, $query->offset ); + else + $result->searchHits = array_slice( $resultList, $query->offset, $query->limit ); + + $result->searchHits = array_map( + function ( $content ) + { + return new SearchHit( + array( + 'valueObject' => $content, + ) + ); + }, + $result->searchHits + ); + + return $result; + } + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: array("languages" => array(,..)). + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Criterion $criterion, array $fieldFilters = array() ) + { + $list = $this->findContent( new Query( array( 'criterion' => $criterion ) ) ); + + if ( !$list->totalCount ) + throw new NotFound( 'Content', var_export( $criterion, true ) ); + else if ( $list->totalCount > 1 ) + throw new InvalidArgumentException( "totalCount", "findSingle() found more then one item for query" ); + + return $list->searchHits[0]->valueObject; + } + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldPaths + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ) + { + throw new \Exception( "Not implemented yet." ); + } + + /** + * @see \eZ\Publish\SPI\Persistence\Content\Search\Handler + */ + public function indexContent( Content $content ) + { + throw new \Exception( "Not implemented yet." ); + } + + /** + * Generate match array for use with Backend based on criteria + * + * @param array $criteria + * @param array $match + * + * @return void + */ + protected function generateMatchByCriteria( array $criteria, array &$match ) + { + foreach ( $criteria as $criterion ) + { + if ( $criterion instanceof LogicalAnd ) + { + $this->generateMatchByCriteria( $criterion->criteria, $match ); + } + else if ( $criterion instanceof ContentId && !isset( $match['id'] ) ) + { + $match['id'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof ContentTypeId && !isset( $match['versionInfo']['contentInfo']['typeId'] ) ) + { + $match['versionInfo']['contentInfo']['contentTypeId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof LocationId && !isset( $match['locations']['id'] ) ) + { + $match['locations']['id'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof RemoteId && !isset( $match['versionInfo']['contentInfo']['remoteId'] ) ) + { + $match['versionInfo']['contentInfo']['remoteId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof LocationRemoteId && !isset( $match['locations']['remoteId'] ) ) + { + $match['locations']['remoteId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof ObjectStateId && !isset( $match['objectStates']['id'] ) ) + { + $match['objectStates']['id'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof LanguageCode && !isset( $match['versionInfo']['languageIds'] ) ) + { + $languageHandler = $this->handler->contentLanguageHandler(); + $languageIds = array_map( + function( $languageCode ) use ( $languageHandler ) + { + return $languageHandler->loadByLanguageCode( $languageCode )->id; + }, + $criterion->value + ); + + $match['versionInfo']['languageIds'] = $criterion->operator === Operator::IN ? $languageIds : $languageIds[0]; + } + else if ( $criterion instanceof SectionId && !isset( $match['versionInfo']['contentInfo']['sectionId'] ) ) + { + $match['versionInfo']['contentInfo']['sectionId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof Status && !isset( $match['versionInfo']['status'] ) ) + { + switch ( $criterion->value[0] ) + { + case Status::STATUS_ARCHIVED: + $match['versionInfo']['status'] = VersionInfo::STATUS_ARCHIVED; + break; + case Status::STATUS_DRAFT: + $match['versionInfo']['status'] = VersionInfo::STATUS_DRAFT; + break; + case Status::STATUS_PUBLISHED: + $match['versionInfo']['status'] = VersionInfo::STATUS_PUBLISHED; + break; + default: + throw new Exception( "Unsupported StatusCriterion->value[0]: " . $criterion->value[0] ); + } + } + else if ( $criterion instanceof ParentLocationId && !isset( $match['locations']['parentId'] ) ) + { + $match['locations']['parentId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + } + else if ( $criterion instanceof Subtree && !isset( $match['locations']['pathString'] ) ) + { + $match['locations']['pathString'] = $criterion->value[0] . '%'; + } + else + { + if ( $criterion instanceof UserMetadata && $criterion->target !== $criterion::MODIFIER ) + { + if ( $criterion->target === $criterion::OWNER && !isset( $match['versionInfo']['contentInfo']['ownerId'] ) ) + $match['versionInfo']['contentInfo']['ownerId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + else if ( $criterion->target === $criterion::CREATOR && !isset( $match['versionInfo']['creatorId'] ) ) + $match['versionInfo']['creatorId'] = $criterion->operator === Operator::IN ? $criterion->value : $criterion->value[0]; + //else if ( $criterion->target === $criterion::MODIFIER && !isset( $match['version']['creatorId'] ) ) + //$match['version']['creatorId'] = $criterion->value[0]; + continue; + } + throw new Exception( "Support for provided criterion not supported or used more then once: " . get_class( $criterion ) ); + } + } + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/SectionHandler.php b/eZ/Publish/Core/Persistence/InMemory/SectionHandler.php new file mode 100644 index 0000000..9b16b18 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/SectionHandler.php @@ -0,0 +1,146 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function create( $name, $identifier ) + { + return $this->backend->create( + 'Content\\Section', + array( + 'name' => $name, + 'identifier' => $identifier + ) + ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function update( $id, $name, $identifier ) + { + $this->backend->update( + 'Content\\Section', + $id, + array( + 'id' => $id, + 'name' => $name, + 'identifier' => $identifier + ) + ); + return $this->load( $id ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function load( $id ) + { + return $this->backend->load( 'Content\\Section', $id ); + } + + /** + * Get all section data + * + * @return \eZ\Publish\SPI\Persistence\Content\Section[] + */ + public function loadAll() + { + return $this->backend->find( 'Content\\Section' ); + } + + /** + * Get section data by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If section is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function loadByIdentifier( $identifier ) + { + $list = $this->backend->find( 'Content\\Section', array( 'identifier' => $identifier ) ); + if ( empty( $list ) ) + throw new NotFound( 'Section', $identifier ); + if ( isset( $list[1] ) ) + throw new LogicException( 'Several Sections with same identifier' ); + + return $list[0]; + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function delete( $id ) + { + $this->backend->delete( 'Content\\Section', $id ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function assign( $sectionId, $contentId ) + { + $this->backend->update( + 'Content\\ContentInfo', + $contentId, + array( + 'sectionId' => $sectionId, + ), + true + ); + } + + /** + * Number of content assignments a Section has + * + * @param mixed $sectionId + * + * @return int + */ + public function assignmentsCount( $sectionId ) + { + return $this->backend->count( 'Content\\ContentInfo', array( 'sectionId' => $sectionId ) ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/Content/Type/ContentTypeCreateStructTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/Content/Type/ContentTypeCreateStructTest.php new file mode 100644 index 0000000..b173142 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/Content/Type/ContentTypeCreateStructTest.php @@ -0,0 +1,60 @@ +identifier = "foo"; + $cStruct->fieldDefinitions = array( + new FieldDefinition(), + ); + + $cStructClone = clone $cStruct; + + $this->assertEquals( + $cStruct->identifier, + $cStructClone->identifier, + "Identifier not cloned correctly" + ); + $this->assertNotSame( + $cStruct->fieldDefinitions[0], + $cStructClone->fieldDefinitions[0], + "Field definitions not cloned" + ); + $this->assertEquals( + $cStruct->fieldDefinitions[0], + $cStructClone->fieldDefinitions[0], + "Field definitions not clonedc correctly" + ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/ContentHandlerRelationTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/ContentHandlerRelationTest.php new file mode 100644 index 0000000..d85d7ff --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/ContentHandlerRelationTest.php @@ -0,0 +1,467 @@ +createContentStruct( "test", "Welcome" ); + + $this->content = $this->persistenceHandler->contentHandler()->create( $struct ); + $this->contentToDelete[] = $this->content; + $this->contentId = $this->content->versionInfo->contentInfo->id; + + $this->lastRelationId = $this->persistenceHandler + ->contentHandler() + ->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 1, + 'destinationContentId' => $this->contentId, + 'type' => Relation::COMMON | Relation::EMBED + ) + ) + )->id; + + $this->content2 = $this->persistenceHandler->contentHandler()->create( + $this->createContentStruct( "Second object", "Do you relate to me?" ) + ); + $this->contentToDelete[] = $this->content2; + } + + protected function createContentStruct( $name, $textValue ) + { + $struct = new CreateStruct(); + $struct->name = $name; + $struct->ownerId = 14; + $struct->sectionId = 1; + $struct->typeId = 2; + $struct->initialLanguageId = 2; + $struct->fields[] = new Field( + array( + 'type' => 'ezstring', + // FieldValue object compatible with ezstring + 'value' => new FieldValue( + array( + 'data' => $textValue + ) + ), + 'languageCode' => 'eng-GB', + ) + ); + return $struct; + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + + try + { + // Removing default objects as well as those created by tests + foreach ( $this->contentToDelete as $content ) + { + $contentHandler->deleteContent( $content->versionInfo->contentInfo->id ); + } + } + catch ( NotFound $e ) + { + } + unset( $this->contentId ); + parent::tearDown(); + } + + /** + * Test addRelation function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::addRelation + */ + public function testAddRelation1() + { + $relation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 14, + 'destinationContentId' => 10, + 'type' => Relation::COMMON + ) + ) + ); + $this->assertEquals( $this->lastRelationId + 1, $relation->id ); + $this->assertEquals( 14, $relation->sourceContentId ); + $this->assertNull( $relation->sourceContentVersionNo ); + $this->assertEquals( 10, $relation->destinationContentId ); + } + + /** + * Test addRelation function with a version + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::addRelation + */ + public function testAddRelation2() + { + $relation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 14, + 'sourceContentVersionNo' => 1, + 'destinationContentId' => 10, + 'type' => Relation::COMMON + ) + ) + ); + $this->assertEquals( $this->lastRelationId + 1, $relation->id ); + $this->assertEquals( 14, $relation->sourceContentId ); + $this->assertEquals( 1, $relation->sourceContentVersionNo ); + $this->assertEquals( 10, $relation->destinationContentId ); + } + + /** + * Test addRelation function with unexisting source content ID + * + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::addRelation + */ + public function testAddRelationSourceDoesNotExist1() + { + $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 123456, + 'sourceContentVersionNo' => null, + 'destinationContentId' => 10, + 'type' => Relation::COMMON + ) + ) + ); + } + + /** + * Test addRelation function with unexisting source content version + * + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::addRelation + */ + public function testAddRelationSourceDoesNotExist2() + { + $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 14, + 'sourceContentVersionNo' => 123456, + 'destinationContentId' => 10, + 'type' => Relation::COMMON + ) + ) + ); + } + + /** + * Test loadRelations function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadRelations + */ + public function testLoadRelations() + { + $relations = $this->persistenceHandler->contentHandler()->loadRelations( 1 ); + $this->assertEquals( 1, count( $relations ) ); + $this->assertEquals( 1, $relations[0]->sourceContentId ); + $this->assertNull( $relations[0]->sourceContentVersionNo ); + $this->assertEquals( $this->contentId, $relations[0]->destinationContentId ); + $this->assertEquals( Relation::COMMON | Relation::EMBED, $relations[0]->type ); + } + + /** + * Test loadRelations function with a type + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadRelations + */ + public function testLoadRelationsWithType1() + { + $relations = $this->persistenceHandler->contentHandler()->loadRelations( 1, null, Relation::EMBED ); + $this->assertEquals( 1, count( $relations ) ); + $this->assertEquals( 1, $relations[0]->sourceContentId ); + $this->assertNull( $relations[0]->sourceContentVersionNo ); + $this->assertEquals( $this->contentId, $relations[0]->destinationContentId ); + $this->assertEquals( Relation::COMMON | Relation::EMBED, $relations[0]->type ); + } + + /** + * Test loadRelations function with combined types + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadRelations + */ + public function testLoadRelationsWithType2() + { + $relations = $this->persistenceHandler->contentHandler()->loadRelations( 1, null, Relation::COMMON | Relation::EMBED ); + $this->assertEquals( 1, count( $relations ) ); + $this->assertEquals( 1, $relations[0]->sourceContentId ); + $this->assertNull( $relations[0]->sourceContentVersionNo ); + $this->assertEquals( $this->contentId, $relations[0]->destinationContentId ); + $this->assertEquals( Relation::COMMON | Relation::EMBED, $relations[0]->type ); + } + + /** + * Test loadRelations function with no associated results + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadRelations + */ + public function testLoadRelationsWithTypeNoResult1() + { + $this->assertEmpty( + $this->persistenceHandler->contentHandler()->loadRelations( + 1, + null, + Relation::COMMON | Relation::EMBED | Relation::LINK + ) + ); + } + + /** + * Test loadRelations function with no associated results + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadRelations + */ + public function testLoadRelationsWithTypeNoResult2() + { + $this->assertEmpty( + $this->persistenceHandler->contentHandler()->loadRelations( + 1, + null, + Relation::LINK + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadReverseRelations + */ + public function testLoadReverseRelationsOneEntry() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id ); + self::assertEquals( 1, count( $reverseRelations ) ); + self::assertEquals( $this->contentId, $reverseRelations[0]->sourceContentId ); + self::assertNull( $reverseRelations[0]->sourceContentVersionNo ); + self::assertEquals( $this->content2->versionInfo->contentInfo->id, $reverseRelations[0]->destinationContentId ); + self::assertEquals( Relation::COMMON, $reverseRelations[0]->type ); + } + + /** + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadReverseRelations + */ + public function testLoadReverseRelationsOneEntryMatchingType() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id, Relation::COMMON ); + self::assertEquals( 1, count( $reverseRelations ) ); + self::assertEquals( $this->contentId, $reverseRelations[0]->sourceContentId ); + self::assertNull( $reverseRelations[0]->sourceContentVersionNo ); + self::assertEquals( $this->content2->versionInfo->contentInfo->id, $reverseRelations[0]->destinationContentId ); + self::assertEquals( Relation::COMMON, $reverseRelations[0]->type ); + } + + /** + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadReverseRelations + */ + public function testLoadReverseRelationsOneEntryNoMatchingType() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id, Relation::EMBED ); + self::assertEmpty( $reverseRelations ); + } + + /** + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadReverseRelations + */ + public function testLoadReverseRelationsTwoEntries() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $newRelation2 = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 1, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id ); + self::assertEquals( 2, count( $reverseRelations ) ); + + $approvedRelatedObjectIds = array( $this->contentId, 1 ); + + foreach ( $reverseRelations as $revRel ) + { + self::assertContains( $revRel->sourceContentId, $approvedRelatedObjectIds ); + } + } + + /** + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadReverseRelations + */ + public function testLoadReverseRelationsTwoEntriesDifferentTypes() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $newRelation2 = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => 1, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::FIELD + ) + ) + ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id ); + self::assertEquals( 2, count( $reverseRelations ) ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id, Relation::FIELD ); + self::assertEquals( 1, count( $reverseRelations ) ); + self::assertEquals( Relation::FIELD, current( $reverseRelations )->type ); + + $reverseRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( $this->content2->versionInfo->contentInfo->id, Relation::COMMON ); + self::assertEquals( 1, count( $reverseRelations ) ); + self::assertEquals( Relation::COMMON, current( $reverseRelations )->type ); + } + + /** + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::removeRelation + */ + public function testRemoveRelation() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $relations = $this->persistenceHandler->contentHandler()->loadRelations( $this->contentId ); + self::assertEquals( 1, count( $relations ) ); + self::assertEquals( $newRelation->id, $relations[0]->id ); + + $this->persistenceHandler->contentHandler()->removeRelation( $newRelation->id ); + $relations = $this->persistenceHandler->contentHandler()->loadRelations( $this->contentId ); + self::assertEmpty( $relations ); + } + + /** + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::removeRelation + */ + public function testRemoveRelationDoesNotExist() + { + $newRelation = $this->persistenceHandler->contentHandler()->addRelation( + new RelationCreateStruct( + array( + 'sourceContentId' => $this->contentId, + 'destinationContentId' => $this->content2->versionInfo->contentInfo->id, + 'type' => Relation::COMMON + ) + ) + ); + + $this->persistenceHandler->contentHandler()->removeRelation( 42 ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/ContentHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/ContentHandlerTest.php new file mode 100644 index 0000000..52c5973 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/ContentHandlerTest.php @@ -0,0 +1,511 @@ +name = array( "eng-GB" => "Welcome" ); + $struct->ownerId = 14; + $struct->sectionId = 1; + $struct->typeId = 2; + $struct->initialLanguageId = 2; + $struct->fields[] = new Field( + array( + 'type' => 'ezstring', + 'fieldDefinitionId' => 6, + // FieldValue object compatible with ezstring + 'value' => new FieldValue( + array( + 'data' => "Welcome" + ) + ), + 'languageCode' => 'eng-GB', + ) + ); + + $this->content = $this->persistenceHandler->contentHandler()->create( $struct ); + $this->contentToDelete[] = $this->content; + $this->contentId = $this->content->versionInfo->contentInfo->id; + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + + try + { + // Removing default objects as well as those created by tests + foreach ( $this->contentToDelete as $content ) + { + $contentHandler->deleteContent( $content->versionInfo->contentInfo->id ); + } + } + catch ( NotFound $e ) + { + } + unset( $this->contentId ); + //$contentHandler->deleteContent( 2 ); + parent::tearDown(); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::create + * @group contentHandler + */ + public function testCreate() + { + $struct = new CreateStruct(); + $struct->name = array( 'eng-GB' => "test" ); + $struct->ownerId = 14; + $struct->sectionId = 1; + $struct->typeId = 2; + $struct->initialLanguageId = 8; + $struct->modified = time(); + $struct->fields[] = new Field( + array( + 'type' => 'ezstring', + // FieldValue object compatible with ezstring + "value" => new FieldValue( + array( + "data" => "Welcome" + ) + ), + 'languageCode' => 'eng-GB', + ) + ); + + $content = $this->persistenceHandler->contentHandler()->create( $struct ); + $this->contentToDelete[] = $content; + $this->assertTrue( $content instanceof Content ); + $this->assertEquals( $this->contentId + 1, $content->versionInfo->contentInfo->id ); + $this->assertEquals( 14, $content->versionInfo->contentInfo->ownerId ); + $this->assertEquals( false, $content->versionInfo->contentInfo->isPublished ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo', $content->versionInfo ); + $this->assertEquals( 14, $content->versionInfo->creatorId ); + $this->assertEquals( array( 'eng-GB' => 'test' ), $content->versionInfo->names ); + $this->assertEquals( VersionInfo::STATUS_DRAFT, $content->versionInfo->status ); + $this->assertGreaterThanOrEqual( $struct->modified, $content->versionInfo->creationDate ); + $this->assertGreaterThanOrEqual( $struct->modified, $content->versionInfo->modificationDate ); + $this->assertEquals( "eng-GB", $content->versionInfo->initialLanguageCode ); + $this->assertEquals( array( $struct->initialLanguageId ), $content->versionInfo->languageIds ); + $this->assertEquals( $content->versionInfo->contentInfo->id, $content->versionInfo->contentInfo->id ); + $this->assertEquals( 1, count( $content->fields ) ); + + $field = $content->fields[0]; + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field', $field ); + $this->assertEquals( 'ezstring', $field->type ); + $this->assertEquals( 'eng-GB', $field->languageCode ); + $this->assertEquals( 'Welcome', $field->value->data ); + $this->assertEquals( $content->versionInfo->versionNo, $field->versionNo ); + } + + /** + * Test publish function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::publish + * @group contentHandler + */ + public function testPublish() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + $time = time(); + $metadataUpdateStruct = new MetadataUpdateStruct( array( "modificationDate" => $time ) ); + + $publishedContent = $contentHandler->publish( 1, 2, $metadataUpdateStruct ); + + $this->assertEquals( 2, $publishedContent->versionInfo->contentInfo->currentVersionNo ); + $this->assertTrue( $publishedContent->versionInfo->contentInfo->isPublished ); + $this->assertEquals( $time, $publishedContent->versionInfo->contentInfo->modificationDate ); + + $this->assertEquals( VersionInfo::STATUS_PUBLISHED, $publishedContent->versionInfo->status ); + $this->assertEquals( $time, $publishedContent->versionInfo->modificationDate ); + } + + /** + * Test for the updateMetadata() function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::updateMetadata + * @group contentHandler + */ + public function testUpdateMetadata() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + $updateStruct = new MetadataUpdateStruct( + array( + "ownerId" => 10, + "name" => "the all new name", + "publicationDate" => time(), + "modificationDate" => time(), + "mainLanguageId" => 8, + "alwaysAvailable" => false, + "remoteId" => "the-all-new-remoteid" + ) + ); + + $contentInfo = $contentHandler->updateMetadata( 4, $updateStruct ); + + $this->assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\ContentInfo", $contentInfo ); + $this->assertEquals( $updateStruct->ownerId, $contentInfo->ownerId ); + $this->assertEquals( $updateStruct->name, $contentInfo->name ); + $this->assertEquals( $updateStruct->publicationDate, $contentInfo->publicationDate ); + $this->assertEquals( $updateStruct->modificationDate, $contentInfo->modificationDate ); + $this->assertEquals( "eng-GB", $contentInfo->mainLanguageCode ); + $this->assertFalse( $contentInfo->alwaysAvailable ); + $this->assertEquals( $updateStruct->remoteId, $contentInfo->remoteId ); + } + + /** + * Test delete function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\ContentHandler::deleteContent + * @group contentHandler + */ + public function testDelete() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + $contentHandler->deleteContent( $this->content->versionInfo->contentInfo->id ); + + try + { + $this->persistenceHandler->searchHandler()->findSingle( new ContentId( $this->content->versionInfo->contentInfo->id ) ); + $this->fail( "Content not removed correctly" ); + } + catch ( NotFound $e ) + { + } + + try + { + $contentHandler->listVersions( $this->content->versionInfo->contentInfo->id ); + $this->fail( "No version should have been returned but a NotFound exception!" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test loadVersionInfo function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadVersionInfo + * @group contentHandler + */ + public function testLoadVersionInfo() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + + $versionInfo = $contentHandler->loadVersionInfo( 1, 2 ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo', $versionInfo ); + + $this->assertEquals( 2, $versionInfo->id ); + $this->assertEquals( 2, $versionInfo->versionNo ); + $this->assertEquals( 1, $versionInfo->contentInfo->id ); + } + + /** + * Test deleteVersion function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\ContentHandler::deleteVersion + * @covers \eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadVersionInfo + * @group contentHandler + */ + public function testDeleteVersion() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + $contentHandler->deleteVersion( 1, 2 ); + + try + { + $versionInfo = $contentHandler->loadVersionInfo( 1, 2 ); + $this->fail( "Version not removed correctly" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test loadDraftsForUser function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\ContentHandler::loadDraftsForUser + * @group contentHandler + */ + public function testLoadDraftsForUser() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + + $versionInfos = $contentHandler->loadDraftsForUser( 14 ); + + $this->assertEquals( + 2, + count( $versionInfos ) + ); + + $this->assertEquals( + 2, + $versionInfos[0]->id + ); + $this->assertEquals( + 0, + $versionInfos[0]->status + ); + $this->assertEquals( + $this->content->versionInfo->id, + $versionInfos[1]->id + ); + $this->assertEquals( + 0, + $versionInfos[1]->status + ); + } + + /** + * Test copy function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\ContentHandler::copy + * @group contentHandler + */ + public function testCopyVersion1() + { + $time = time(); + $contentHandler = $this->persistenceHandler->contentHandler(); + $copy = $contentHandler->copy( 1, 1 ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->sectionId, "Section ID does not match" ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->contentTypeId, "Type ID does not match" ); + $this->assertEquals( 14, $copy->versionInfo->contentInfo->ownerId, "Owner ID does not match" ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->currentVersionNo, "Current version no does not match" ); + $locations = $this->persistenceHandler->locationHandler()->loadLocationsByContent( + $copy->versionInfo->contentInfo->id + ); + $this->assertEmpty( $locations, "Locations must be empty" ); + + $versions = $contentHandler->listVersions( $copy->versionInfo->contentInfo->id ); + $this->assertEquals( 1, count( $versions ) ); + $this->assertEquals( array( "eng-GB" => "eZ Publish" ), $versions[0]->names ); + $this->assertEquals( 1, $versions[0]->versionNo, "Version number does not match" ); + $this->assertEquals( 14, $versions[0]->creatorId, "Creator ID does not match" ); + $this->assertEquals( $copy->versionInfo->contentInfo->id, $versions[0]->contentInfo->id ); + $this->assertGreaterThanOrEqual( $time, $versions[0]->modificationDate ); + $this->assertGreaterThanOrEqual( $time, $versions[0]->creationDate ); + } + + /** + * Test copy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::copy + * @group contentHandler + */ + public function testCopyVersion2() + { + $time = time(); + $versionNoToCopy = 2; + $contentHandler = $this->persistenceHandler->contentHandler(); + $copy = $contentHandler->copy( 1, $versionNoToCopy ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->sectionId, "Section ID does not match" ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->contentTypeId, "Type ID does not match" ); + $this->assertEquals( 14, $copy->versionInfo->contentInfo->ownerId, "Owner ID does not match" ); + $this->assertEquals( $versionNoToCopy, $copy->versionInfo->contentInfo->currentVersionNo, "Current version no does not match" ); + $locations = $this->persistenceHandler->locationHandler()->loadLocationsByContent( + $copy->versionInfo->contentInfo->id + ); + $this->assertEmpty( $locations, "Locations must be empty" ); + + $versions = $contentHandler->listVersions( $copy->versionInfo->contentInfo->id ); + $this->assertEquals( 1, count( $versions ) ); + $this->assertEquals( array( "eng-GB" => "eZ Publish" ), $versions[0]->names ); + $this->assertEquals( 2, $versions[0]->versionNo, "Version number does not match" ); + $this->assertEquals( 14, $versions[0]->creatorId, "Creator ID does not match" ); + $this->assertEquals( $copy->versionInfo->contentInfo->id, $versions[0]->contentInfo->id ); + $this->assertGreaterThanOrEqual( $time, $versions[0]->modificationDate ); + $this->assertGreaterThanOrEqual( $time, $versions[0]->creationDate ); + } + + /** + * Test copy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::copy + * @group contentHandler + */ + public function testCopyAllVersions() + { + $time = time(); + $contentHandler = $this->persistenceHandler->contentHandler(); + $copy = $contentHandler->copy( 1 ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->sectionId, "Section ID does not match" ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->contentTypeId, "Type ID does not match" ); + $this->assertEquals( 14, $copy->versionInfo->contentInfo->ownerId, "Owner ID does not match" ); + $this->assertEquals( 1, $copy->versionInfo->contentInfo->currentVersionNo, "Current version no does not match" ); + $locations = $this->persistenceHandler->locationHandler()->loadLocationsByContent( + $copy->versionInfo->contentInfo->id + ); + $this->assertEmpty( $locations, "Locations must be empty" ); + + $versions = $contentHandler->listVersions( $copy->versionInfo->contentInfo->id ); + $this->assertEquals( 2, count( $versions ) ); + $this->assertEquals( array( "eng-GB" => "eZ Publish" ), $versions[0]->names ); + $this->assertEquals( array( "eng-GB" => "eZ Publish" ), $versions[1]->names ); + $this->assertEquals( 1, $versions[0]->versionNo ); + $this->assertEquals( 2, $versions[1]->versionNo ); + $this->assertEquals( 14, $versions[0]->creatorId ); + $this->assertEquals( 14, $versions[1]->creatorId ); + $this->assertEquals( $copy->versionInfo->contentInfo->id, $versions[0]->contentInfo->id ); + $this->assertEquals( $copy->versionInfo->contentInfo->id, $versions[1]->contentInfo->id ); + $this->assertGreaterThanOrEqual( $time, $versions[0]->modificationDate ); + $this->assertGreaterThanOrEqual( $time, $versions[1]->modificationDate ); + $this->assertGreaterThanOrEqual( $time, $versions[0]->creationDate ); + $this->assertGreaterThanOrEqual( $time, $versions[1]->creationDate ); + } + + /** + * Test updateContent function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::updateContent + * @group contentHandler + */ + public function testUpdateContent() + { + $time = time(); + $struct = new UpdateStruct; + $struct->name = array( "eng-GB" => "All shiny new name" ); + $struct->creatorId = 10; + $struct->modificationDate = $time; + $struct->initialLanguageId = 2; + $struct->fields[] = new Field( + array( + "id" => $this->content->fields[0]->id, + "fieldDefinitionId" => $this->content->fields[0]->fieldDefinitionId, + "value" => new FieldValue( + array( + "data" => "Welcome back" + ) + ) + ) + ); + + $content = $this->persistenceHandler->contentHandler()->updateContent( $this->contentId, 1, $struct ); + + $this->assertTrue( $content instanceof Content ); + $this->assertEquals( $this->contentId, $content->versionInfo->contentInfo->id ); + $this->assertEquals( VersionInfo::STATUS_DRAFT, $content->versionInfo->status ); + $this->assertEquals( 10, $content->versionInfo->creatorId ); + $this->assertEquals( $time, $content->versionInfo->modificationDate ); + $this->assertEquals( array( "eng-GB" => "All shiny new name" ), $content->versionInfo->names ); + $this->assertEquals( + $this->persistenceHandler->contentLanguageHandler()->load( $struct->initialLanguageId )->languageCode, + $content->versionInfo->initialLanguageCode + ); + + $this->assertEquals( + reset( $struct->fields )->value->data, + reset( $content->fields )->value->data + ); + } + + /** + * Tests createDraftFromVersion() + * + * @group contentHandler + * @covers \eZ\Publish\SPI\Persistence\Content\Handler::createDraftFromVersion + */ + public function testCreateDraftFromVersion() + { + $time = time(); + $contentHandler = $this->persistenceHandler->contentHandler(); + $content = $contentHandler->copy( 1, 1 ); + $this->contentToDelete[] = $content; + + $draft = $contentHandler->createDraftFromVersion( $content->versionInfo->contentInfo->id, 1, 10 ); + + self::assertSame( $content->versionInfo->contentInfo->currentVersionNo + 1, $draft->versionInfo->versionNo ); + self::assertGreaterThanOrEqual( $time, $draft->versionInfo->creationDate ); + self::assertGreaterThanOrEqual( $time, $draft->versionInfo->modificationDate ); + self::assertSame( VersionInfo::STATUS_DRAFT, $draft->versionInfo->status, 'Created version must be a draft' ); + self::assertSame( $content->versionInfo->contentInfo->id, $draft->versionInfo->contentInfo->id ); + self::assertSame( $content->versionInfo->initialLanguageCode, $draft->versionInfo->initialLanguageCode ); + self::assertSame( $content->versionInfo->languageIds, $draft->versionInfo->languageIds ); + + // Indexing fields by definition id to be able to compare them + $aOriginalIndexedFields = array(); + $aIndexedFields = array(); + foreach ( $content->fields as $field ) + { + $aOriginalIndexedFields[$field->fieldDefinitionId] = $field; + } + + foreach ( $draft->fields as $field ) + { + $aIndexedFields[$field->fieldDefinitionId] = $field; + } + + // Now comparing original version vs new draft + foreach ( $aOriginalIndexedFields as $definitionId => $field ) + { + self::assertTrue( isset( $aIndexedFields[$definitionId] ), 'Created version must have the same fields as original version' ); + self::assertSame( $field->type, $aIndexedFields[$definitionId]->type, 'Fields must have the same type' ); + self::assertEquals( $field->value, $aIndexedFields[$definitionId]->value, 'Fields must have the same value' ); + self::assertEquals( $field->languageCode, $aIndexedFields[$definitionId]->languageCode, 'Fields language code must be equal' ); + self::assertSame( $field->versionNo + 1, $aIndexedFields[$definitionId]->versionNo, 'Field version number must be incremented' ); + } + } + + public function testSetStatus() + { + $content = $this->content; + + self::assertEquals( VersionInfo::STATUS_DRAFT, $content->versionInfo->status ); + $this->persistenceHandler->contentHandler()->setStatus( $content->versionInfo->contentInfo->id, VersionInfo::STATUS_PUBLISHED, $content->versionInfo->versionNo ); + $content = $this->persistenceHandler->contentHandler()->load( $content->versionInfo->contentInfo->id, $content->versionInfo->versionNo ); + + self::assertEquals( VersionInfo::STATUS_PUBLISHED, $content->versionInfo->status ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/ContentTypeHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/ContentTypeHandlerTest.php new file mode 100644 index 0000000..580eb00 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/ContentTypeHandlerTest.php @@ -0,0 +1,828 @@ +persistenceHandler->ContentTypeHandler()->createGroup( $this->getGroupCreateStruct() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', $group ); + $this->assertEquals( array( 'eng-GB' => 'Media' ), $group->name ); + } + + /** + * Test update group function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::updateGroup + */ + public function testUpdateGroup() + { + $struct = new GroupUpdateStruct(); + $struct->id = 1; + $struct->modified = time(); + $struct->modifierId = 14; + $struct->name = array( 'eng-GB' => 'Content2' ); + $struct->description = array( 'eng-GB' => 'TestTest' ); + $struct->identifier = 'content2'; + $this->persistenceHandler->ContentTypeHandler()->updateGroup( $struct ); + $group = $this->persistenceHandler->ContentTypeHandler()->loadGroup( 1 ); + $this->assertEquals( 1, $group->id ); + $this->assertEquals( array( 'eng-GB' => 'Content2' ), $group->name ); + } + + /** + * Test delete group function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::deleteGroup + */ + public function testDeleteGroup() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $group = $handler->createGroup( $this->getGroupCreateStruct() ); + $handler->deleteGroup( $group->id ); + + try + { + $handler->loadGroup( $group->id ); + $this->fail( "Group not deleted correctly" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test delete group function where group is assigned to type + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::deleteGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testDeleteGroupBadState() + { + $this->persistenceHandler->ContentTypeHandler()->deleteGroup( 1 ); + } + + /** + * Test load group function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadGroup + */ + public function testLoadGroup() + { + $obj = $this->persistenceHandler->ContentTypeHandler()->loadGroup( 1 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( array( 'eng-GB' => 'Content' ), $obj->name ); + } + + /** + * Test load group by identifier function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadGroupByIdentifier + */ + public function testLoadGroupByIdentifier() + { + $obj = $this->persistenceHandler->ContentTypeHandler()->loadGroupByIdentifier( 'Content' );// data is in sync with legacy + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( array( 'eng-GB' => 'Content' ), $obj->name ); + } + + /** + * Test load all groups function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadAllGroups + */ + public function testLoadAllGroups() + { + $list = $this->persistenceHandler->ContentTypeHandler()->loadAllGroups(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', $list[0] ); + $this->assertEquals( 1, $list[0]->id ); + $this->assertEquals( array( 'eng-GB' => 'Content' ), $list[0]->name ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadContentTypes + */ + public function testLoadByGroup() + { + $list = $this->persistenceHandler->ContentTypeHandler()->loadContentTypes( 1, 0 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $list[0] ); + $this->assertEquals( 1, $list[0]->id ); + $this->assertEquals( 'folder', $list[0]->identifier ); + + $list = $this->persistenceHandler->ContentTypeHandler()->loadContentTypes( 22, 0 ); + $this->assertEquals( array(), $list ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::load + */ + public function testLoad() + { + $obj = $this->persistenceHandler->ContentTypeHandler()->load( 1, 0 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( 'folder', $obj->identifier ); + $this->assertEquals( 'Name', $obj->fieldDefinitions[0]->name['eng-GB'] ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::load + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadUnExistingTypeId() + { + $this->persistenceHandler->ContentTypeHandler()->load( 22, 0 ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::load + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadUnExistingStatus() + { + $this->persistenceHandler->ContentTypeHandler()->load( 1, 1 ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadByIdentifier + */ + public function testLoadByIdentifier() + { + $obj = $this->persistenceHandler->ContentTypeHandler()->loadByIdentifier( 'folder' ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( 'folder', $obj->identifier ); + $this->assertEquals( 'Name', $obj->fieldDefinitions[0]->name['eng-GB'] ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadByIdentifier + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadByIdentifierUnExistingType() + { + // eZ Publish does not now about this unless you teach it + $this->persistenceHandler->ContentTypeHandler()->loadByIdentifier( 'kamasutra' ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadByRemoteId + */ + public function testLoadByRemoteId() + { + $obj = $this->persistenceHandler->ContentTypeHandler()->loadByRemoteId( 'a3d405b81be900468eb153d774f4f0d2' ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( 'folder', $obj->identifier ); + $this->assertEquals( 'Name', $obj->fieldDefinitions[0]->name['eng-GB'] ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::loadByRemoteId + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadByRemoteIdUnExistingType() + { + $this->persistenceHandler->ContentTypeHandler()->loadByRemoteId( 'l33t' ); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::create + */ + public function testCreate() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $obj = $handler->create( $this->getTypeCreateStruct() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( 'article', $obj->identifier ); + $this->assertEquals( "", $obj->nameSchema ); + $this->assertEquals( array(), $obj->fieldDefinitions ); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::create + */ + public function testCreateWithFieldDefinition() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $struct = $this->getTypeCreateStruct(); + $struct->fieldDefinitions[] = $field = $this->getTypeFieldDefinition(); + + $obj = $handler->create( $struct ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( 'article', $obj->identifier ); + $this->assertEquals( "", $obj->nameSchema ); + $field->id = $obj->fieldDefinitions[0]->id; + $this->assertEquals( array( $field ), $obj->fieldDefinitions ); + } + + /** + * Test update function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::update + */ + public function testUpdate() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->update( 1, 0, $this->getTypeUpdateStruct() ); + $obj = $handler->load( 1, 0 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( 'article', $obj->identifier ); + $this->assertEquals( "", $obj->nameSchema ); + $this->assertEquals( 10, $obj->modifierId ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::delete + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testDelete() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $obj = $handler->create( $this->getTypeCreateStruct() ); + $handler->delete( $obj->id, 0 ); + $this->assertNull( $handler->load( $obj->id, 0 ) ); + } + + /** + * Test delete function whit existing content assigned to type + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::delete + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testDeleteBadState() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->delete( 1, 0 ); + $this->assertNull( $handler->load( 1, 0 ) ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::delete + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteNotFound() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->delete( 9999, 0 ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::delete + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteNotFoundStatus() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->delete( 1, 2 ); + } + + /** + * Test createDraft function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::createDraft + */ + public function testCreateDraft() + { + $userId = 10; + $time = time(); + $obj = $this->persistenceHandler->ContentTypeHandler()->createDraft( $userId, 1 ); + $original = $this->persistenceHandler->ContentTypeHandler()->load( 1, Type::STATUS_DEFINED ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertEquals( $original->creatorId, $obj->creatorId ); + $this->assertEquals( $original->created, $obj->created );//ehm + $this->assertEquals( $userId, $obj->modifierId ); + $this->assertGreaterThanOrEqual( $time, $obj->modified );//ehm + $this->assertEquals( Type::STATUS_DRAFT, $obj->status ); + $this->assertEquals( 3, count( $obj->fieldDefinitions ) ); + $this->assertEquals( 'Name', $obj->fieldDefinitions[0]->name['eng-GB'] ); + } + + /** + * Test createDraft function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::createDraft + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testCreateDraftNonExistingTypeId() + { + $this->persistenceHandler->ContentTypeHandler()->createDraft( 10, 999 ); + } + + /** + * Test createDraft function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::createDraft + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testCreateDraftNonExistingDefinedType() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $obj = $handler->create( $this->getTypeCreateStruct( Type::STATUS_DRAFT ) ); + $obj2 = $handler->createDraft( 10, $obj->id ); + } + + /** + * Test copy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::copy + */ + public function testCopy() + { + $userId = 10; + $time = time(); + $obj = $this->persistenceHandler->ContentTypeHandler()->copy( $userId, 1, Type::STATUS_DEFINED ); + $original = $this->persistenceHandler->ContentTypeHandler()->load( 1, Type::STATUS_DEFINED ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', $obj ); + $this->assertStringStartsWith( 'folder_', $obj->identifier ); + $this->assertEquals( $userId, $obj->creatorId ); + $this->assertEquals( $userId, $obj->modifierId ); + $this->assertGreaterThanOrEqual( $time, $obj->created ); + $this->assertGreaterThanOrEqual( $time, $obj->modified ); + $this->assertEquals( Type::STATUS_DEFINED, $obj->status ); + $this->assertGreaterThan( $original->created, $obj->created ); + $this->assertEquals( 3, count( $obj->fieldDefinitions ) ); + $this->assertEquals( 'Name', $obj->fieldDefinitions[0]->name['eng-GB'] ); + } + + /** + * Test copy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::copy + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testCopyNonExistingTypeId() + { + $this->persistenceHandler->ContentTypeHandler()->copy( 10, 22, 0 ); + } + + /** + * Test copy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::copy + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testCopyNonExistingStatus() + { + $this->persistenceHandler->ContentTypeHandler()->copy( 10, 1, 1 ); + } + + /** + * Test link function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::link + */ + public function testLink() + { + $group = $this->getGroupCreateStruct(); + $handler = $this->persistenceHandler->ContentTypeHandler(); + $vo = $handler->createGroup( $group ); + $handler->link( $vo->id, 1, 0 ); + $type = $handler->load( 1, 0 ); + $this->assertEquals( array( 1, $vo->id ), $type->groupIds ); + } + + /** + * Test link function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::link + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLinkMissingGroup() + { + $this->persistenceHandler->contentTypeHandler()->link( 64, 1, 0 ); + } + + /** + * Test link function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::link + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLinkMissingType() + { + $this->persistenceHandler->contentTypeHandler()->link( 1, 64, 0 ); + } + + /** + * Test link function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::link + * @expectedException \eZ\Publish\Core\Base\Exceptions\BadStateException + */ + public function testLinkExistingGroupLink() + { + $this->persistenceHandler->contentTypeHandler()->link( 1, 1, 0 ); + } + + /** + * Test unlink function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::unlink + */ + public function testUnLink() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $group = $this->getGroupCreateStruct(); + $vo = $handler->createGroup( $group ); + $handler->link( $vo->id, 1, 0 ); + $handler->unlink( 1, 1, 0 ); + $type = $handler->load( 1, 0 ); + $this->assertEquals( array( $vo->id ), $type->groupIds ); + } + + /** + * Test unlink function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::unlink + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testUnLinkMissingGroup() + { + $this->persistenceHandler->contentTypeHandler()->unlink( 64, 1, 0 ); + } + + /** + * Test unlink function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::unlink + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testUnLinkMissingType() + { + $this->persistenceHandler->contentTypeHandler()->unlink( 1, 64, 0 ); + } + + /** + * Test unlink function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::unlink + * @expectedException \eZ\Publish\Core\Base\Exceptions\BadStateException + */ + public function testUnLinkNotInGroup() + { + $this->persistenceHandler->contentTypeHandler()->unlink( 2, 1, 0 ); + } + + /** + * Test unlink function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::unlink + * @expectedException \eZ\Publish\Core\Base\Exceptions\BadStateException + */ + public function testUnLinkLastGroup() + { + $this->persistenceHandler->contentTypeHandler()->unlink( 1, 1, 0 ); + } + + /** + * Test getFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::getFieldDefinition + */ + public function testGetFieldDefinition() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + + $fieldDefinition = $handler->getFieldDefinition( 1, 0 ); + + $this->assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition", $fieldDefinition ); + $this->assertEquals( "name", $fieldDefinition->identifier ); + } + + /** + * Test addFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::addFieldDefinition + */ + public function testAddFieldDefinition() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $field = $this->getTypeFieldDefinition(); + $vo = $handler->addFieldDefinition( 1, 0, $field ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition', $vo ); + $type = $handler->load( 1, 0 ); + $this->assertEquals( 4, count( $type->fieldDefinitions ) ); + } + + /** + * Test addFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::addFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testAddFieldDefinitionInvalidTypeId() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $field = $this->getTypeFieldDefinition(); + $handler->addFieldDefinition( 22, 0, $field ); + } + + /** + * Test addFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::addFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testAddFieldDefinitionInvalidStatus() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $field = $this->getTypeFieldDefinition(); + $handler->addFieldDefinition( 1, 1, $field ); + } + + /** + * Test removeFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::removeFieldDefinition + */ + public function testRemoveFieldDefinitionDefinition() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->removeFieldDefinition( 1, 0, 1 ); + $type = $handler->load( 1, 0 ); + $this->assertEquals( 2, count( $type->fieldDefinitions ) ); + } + + /** + * Test removeFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::removeFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testRemoveFieldDefinitionInvalidTypeId() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->removeFieldDefinition( 22, 0, 1 ); + } + + /** + * Test removeFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::removeFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testRemoveFieldDefinitionInvalidStatus() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->removeFieldDefinition( 1, 1, 1 ); + } + + /** + * Test removeFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::removeFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testRemoveFieldDefinitionInvalidFieldId() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->removeFieldDefinition( 1, 0, 22 ); + } + + /** + * Test updateFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::updateFieldDefinition + */ + public function testUpdateFieldDefinitionDefinition() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $type = $handler->load( 1, 0 ); + $fieldDefinition = $type->fieldDefinitions[0]; + $fieldDefinition->name = $fieldDefinition->name + array( 'nor-NB' => 'Navn' ); + $handler->updateFieldDefinition( 1, 0, $fieldDefinition ); + $type = $handler->load( 1, 0 ); + $this->assertEquals( 3, count( $type->fieldDefinitions ) ); + $this->assertEquals( array( 'eng-GB' => 'Name', 'nor-NB' => 'Navn' ), $type->fieldDefinitions[0]->name ); + } + + /** + * Test updateFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::updateFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testUpdateFieldDefinitionDefinitionInvalidTypeId() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $type = $handler->load( 1, 0 ); + $fieldDefinition = $type->fieldDefinitions[0]; + $fieldDefinition->name = $fieldDefinition->name + array( 'nor-NB' => 'Navn' ); + $handler->updateFieldDefinition( 22, 0, $fieldDefinition ); + } + + /** + * Test updateFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::updateFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testUpdateFieldDefinitionDefinitionInvalidStatus() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $type = $handler->load( 1, 0 ); + $fieldDefinition = $type->fieldDefinitions[0]; + $fieldDefinition->name = $fieldDefinition->name + array( 'nor-NB' => 'Navn' ); + $handler->updateFieldDefinition( 1, 1, $fieldDefinition ); + } + + /** + * Test updateFieldDefinition function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::updateFieldDefinition + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testUpdateFieldDefinitionDefinitionInvalidFieldDefinitionId() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $type = $handler->load( 1, 0 ); + $fieldDefinition = $type->fieldDefinitions[0]; + $fieldDefinition->id = 22; + $fieldDefinition->name = $fieldDefinition->name + array( 'nor-NB' => 'Navn' ); + $handler->updateFieldDefinition( 1, 0, $fieldDefinition ); + } + + /** + * Test publish function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::publish + */ + public function testPublish() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $type = $handler->copy( 10, 1, Type::STATUS_DEFINED ); + try + { + $handler->load( $type->id, Type::STATUS_DRAFT ); + $this->fail( "Draft of Type still exists after publish()" ); + } + catch ( \Exception $e ) + { + } + $type = $handler->load( $type->id, Type::STATUS_DEFINED ); + + $this->assertEquals( 10, $type->creatorId ); + $this->assertEquals( 10, $type->modifierId ); + $this->assertEquals( array( 'eng-GB' => 'Folder' ), $type->name ); + $this->assertEquals( 3, count( $type->fieldDefinitions ) ); + $this->assertEquals( array( 'eng-GB' => 'Name' ), $type->fieldDefinitions[0]->name ); + + $org = $handler->load( 1, Type::STATUS_DEFINED ); + $this->assertNotEquals( $org->id, $type->id ); + $this->assertNotEquals( $org->remoteId, $type->remoteId ); + $this->assertNotEquals( $org->identifier, $type->identifier ); + $this->assertGreaterThan( $org->created, $type->created ); + $this->assertGreaterThan( $org->modified, $type->modified ); + } + + /** + * Test publish function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::publish + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testPublishInvalidTypeId() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->publish( 999 ); + } + + /** + * Test publish function + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::publish + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testPublishNoDraft() + { + $handler = $this->persistenceHandler->ContentTypeHandler(); + $handler->publish( 1 ); + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct + */ + private function getTypeCreateStruct( $status = Type::STATUS_DEFINED ) + { + $struct = new CreateStruct(); + $struct->created = $struct->modified = time(); + $struct->creatorId = $struct->modifierId = 14; + $struct->name = array( 'eng-GB' => 'Article' ); + $struct->description = array( 'eng-GB' => 'Article content type' ); + $struct->identifier = 'article'; + $struct->isContainer = true; + $struct->status = $status; + $struct->initialLanguageId = 2; + $struct->nameSchema = ""; + $struct->fieldDefinitions = array(); + $struct->groupIds = array( 1 ); + return $struct; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct + */ + protected function getTypeUpdateStruct() + { + $struct = new UpdateStruct(); + $struct->modified = time(); + $struct->modifierId = 10; + $struct->name = array( 'eng-GB' => 'Article' ); + $struct->description = array( 'eng-GB' => 'Article content type' ); + $struct->identifier = 'article'; + $struct->isContainer = true; + $struct->initialLanguageId = 2; + $struct->nameSchema = ""; + return $struct; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct + */ + protected function getGroupCreateStruct() + { + $struct = new GroupCreateStruct(); + $struct->created = $struct->modified = time(); + $struct->creatorId = $struct->modifierId = 14; + $struct->name = array( 'eng-GB' => 'Media' ); + $struct->description = array( 'eng-GB' => 'Group for media content types' ); + $struct->identifier = 'media'; + return $struct; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + protected function getTypeFieldDefinition() + { + $field = new FieldDefinition(); + $field->identifier = 'title'; + $field->fieldType = 'ezstring'; + $field->position = 0; + $field->isTranslatable = $field->isRequired = true; + $field->isInfoCollector = false; + $field->defaultValue = new FieldValue( + array( + "data" => "New Article" + ) + ); + $field->name = array( 'eng-GB' => "Title" ); + $field->description = array( 'eng-GB' => "Title, used for headers, and url if short_title is empty" ); + return $field; + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/HandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/HandlerTest.php new file mode 100644 index 0000000..ac4838a --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/HandlerTest.php @@ -0,0 +1,44 @@ +persistenceHandler = new InMemoryHandler(); + } + + /** + * Tear down test (properties) + */ + protected function tearDown() + { + unset( $this->persistenceHandler ); + parent::tearDown(); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/InMemory/BackendDataTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/InMemory/BackendDataTest.php new file mode 100644 index 0000000..72b1000 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/InMemory/BackendDataTest.php @@ -0,0 +1,739 @@ +backend = new Backend( + json_decode( file_get_contents( str_replace( '/Tests/InMemory', '', __DIR__ ) . '/data.json' ), true ) + ); + $this->insertCustomContent(); + } + + protected function tearDown() + { + unset( $this->backend ); + parent::tearDown(); + } + + /** + * Clear Content in backend data and custom data for testing + */ + protected function insertCustomContent() + { + $refObj = new ReflectionObject( $this->backend ); + $refData = $refObj->getProperty( 'data' ); + $refData->setAccessible( true ); + $data = $refData->getValue( $this->backend ); + $data['Content\\VersionInfo'] = array(); + $refData->setValue( $this->backend, $data ); + + for ( $i = 0; $i < 10; ++$i) + $this->backend->create( + "Content\\VersionInfo", + array( + "_contentId" => 1, + "versionNo" => 1, + "names" => array( "eng-GB" => "bar{$i}" ), + "creatorId" => 42, + ) + ); + + for ( $i = 0; $i < 10; ++$i) + $this->backend->create( + "Content\\VersionInfo", + array( + "_contentId" => 1, + "versionNo" => 1, + "names" => array( "eng-GB" => "foo{$i}" ), + ) + ); + for ( $i = 0; $i < 10; ++$i) + $this->backend->create( + "Content\\Language", + array( + "languageCode" => "lan-{$i}", + "isEnabled" => true, + "name" => "lang{$i}" + ) + ); + } + + /** + * Test finding content without results + * + * @dataProvider providerForFindEmpty + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindEmpty( $searchData ) + { + $this->assertEquals( + array(), + $this->backend->find( "Content\\VersionInfo", $searchData ) + ); + } + + public function providerForFindEmpty() + { + return array( + array( array( "unexistingKey" => "bar0" ) ), + array( array( "unexistingKey" => "bar0", "baz0" => "buzz0" ) ), + array( array( "foo0" => "unexistingValue" ) ), + array( array( "foo0" => "unexistingValue", "baz0" => "buzz0" ) ), + array( array( "foo0" => "" ) ), + array( array( "foo0" => "bar0", "baz0" => "" ) ), + array( array( "foo0" => "bar0", "baz0" => "buzz1" ) ), + array( array( "foo0" ) ), + array( array( "int" ) ), + array( array( "float" ) ), + ); + } + + /** + * Test finding content with results + * + * @dataProvider providerForFind + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFind( $searchData, $result ) + { + foreach ( $this->backend->find( "Content\\VersionInfo", $searchData ) as $key => $version ) + { + $this->assertEquals( $result[$key]['id'], $version->id ); + $this->assertEquals( array( "eng-GB" => $result[$key]['names'] ), $version->names ); + } + } + + public function providerForFind() + { + return array( + array( + array( "names" => "bar0" ), + array( + array( + "id" => 1, + "names" => "bar0", + ) + ) + ), + array( + array( "names" => "foo5" ), + array( + array( + "id" => 16, + "names" => "foo5", + ) + ) + ), + array( + array( "creatorId" => 42 ), + array( + array( + "id" => 1, + "names" => "bar0", + ), + array( + "id" => 2, + "names" => "bar1", + ), + array( + "id" => 3, + "names" => "bar2", + ), + array( + "id" => 4, + "names" => "bar3", + ), + array( + "id" => 5, + "names" => "bar4", + ), + array( + "id" => 6, + "names" => "bar5", + ), + array( + "id" => 7, + "names" => "bar6", + ), + array( + "id" => 8, + "names" => "bar7", + ), + array( + "id" => 9, + "names" => "bar8", + ), + array( + "id" => 10, + "names" => "bar9", + ), + ), + ), + ); + } + + /** + * Test finding content with multiple ids + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindMultipleIds() + { + $searchIds = array( 3, 5, 7 ); + $list = $this->backend->find( 'Content\\VersionInfo', array( 'id' => $searchIds ) ); + self::assertEquals( count( $searchIds ), count( $list ) ); + + foreach ( $list as $vo ) + { + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo', $vo ); + self::assertContains( $vo->id, $searchIds ); + } + } + + /** + * Test finding content with results + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindMatchOnArray() + { + $types = $this->backend->find( "Content\\Type", array( "groupIds" => 1 ) ); + $this->assertEquals( 2, count( $types ) ); + + $this->assertEquals( 1, $types[0]->id ); + $this->assertEquals( 'folder', $types[0]->identifier ); + $this->assertEquals( 13, $types[1]->id ); + $this->assertEquals( 'comment', $types[1]->identifier ); + } + + /** + * Test finding content with results using join + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindJoin() + { + /** + * @var \eZ\Publish\SPI\Persistence\Content[] $list + */ + $list = $this->backend->find( + 'Content', + array( 'id' => 1 ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ) + ) + ); + + $this->assertEquals( 1, count( $list ) ); + foreach ( $list as $key => $content ) + { + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content', $content ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->id ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->sectionId ); + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $content->versionInfo->contentInfo->id ) + ); + $this->assertEquals( 1, count( $locations ) ); + foreach ( $locations as $location ) + { + $this->assertInstanceof( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location', $location ); + $this->assertEquals( 2, $location->id ); + $this->assertEquals( 1, $location->contentId ); + } + } + } + + /** + * Test finding content with results using join and deep matching + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindJoinDeepMatch() + { + /** + * @var \eZ\Publish\SPI\Persistence\Content[] $list + */ + $list = $this->backend->find( + 'Content', + array( "versionInfo" => array( 'id' => 2 ) ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ) + ) + ); + + $this->assertEquals( 1, count( $list ) ); + foreach ( $list as $content ) + { + $this->assertTrue( $content instanceof Content ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->id ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->sectionId ); + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $content->versionInfo->contentInfo->id ) + ); + $this->assertEquals( 1, count( $locations ) ); + foreach ( $locations as $location ) + { + $this->assertTrue( $location instanceof Location ); + $this->assertEquals( 2, $location->id ); + $this->assertEquals( 1, $location->contentId ); + } + } + } + + /** + * Test finding content with results using join and deep matching where there are several sub elements + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindJoinDeepMatchWithSeveral() + { + // Create a new location on content object 1 so it has 2 + $location = new LocationCreateStruct(); + $location->contentId = 1; + $location->contentVersion = 1; + $location->parentId = 1; + $location->mainLocationId = 2; + $location->remoteId = 'string'; + $location->pathIdentificationString = '/1/3/'; + $location->sortField = Location::SORT_FIELD_MODIFIED; + $location->sortOrder = Location::SORT_ORDER_DESC; + $this->backend->create( 'Content\\Location', (array)$location ); + /** + * @var \eZ\Publish\SPI\Persistence\Content[] $list + */ + $list = $this->backend->find( + 'Content', + array( "versionInfo" => array( 'id' => 2 ) ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ) + ) + ); + $this->assertEquals( 1, count( $list ) ); + foreach ( $list as $content ) + { + $this->assertTrue( $content instanceof Content ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->id ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->sectionId ); + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $content->versionInfo->contentInfo->id ) + ); + $this->assertEquals( 2, count( $locations ) ); + foreach ( $locations as $location ) + { + $this->assertTrue( $location instanceof Location ); + $this->assertEquals( 1, $location->contentId ); + } + } + } + + /** + * Test finding content with results using join and deep matching where match collides with join + * + * @expectedException LogicException + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindJoinDeepMatchCollision() + { + $this->backend->find( + 'Content', + array( "locations" => array( 'contentId' => 2 ) ), + array( + 'locations' => array( + 'type' => 'Content\\Location', + 'match' => array( 'contentId' => 'id' ) + ) + ) + ); + } + + /** + * Test finding content with results using several levels of join + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindSubJoin() + { + self::markTestIncomplete( "Reimplement this test as Fields are not version sub joins any more" ); + /** + * @var \eZ\Publish\SPI\Persistence\Content[] $list + */ + $list = $this->backend->find( + 'Content\\ContentInfo', + array( "locations" => array( 'id' => 2 ) ), + array( + 'version' => array( + 'type' => 'Content\\VersionInfo', + 'single' => true, + 'match' => array( '_contentId' => 'id', 'versionNo' => 'currentVersionNo' ), + 'sub' => array( + 'fields' => array( + 'type' => 'Content\\Field', + 'match' => array( '_contentId' => '_contentId', 'versionNo' => 'versionNo' ), + ) + ) + ), + ) + ); + $this->assertEquals( 1, count( $list ) ); + foreach ( $list as $content ) + { + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content', $content ); + $this->assertEquals( 1, $content->id ); + $locations = $this->backend->find( + 'Content\\Location', + array( 'contentId' => $content->versionInfo->contentInfo->id ) + ); + $this->assertEquals( 1, count( $locations ) ); + foreach ( $locations as $location ) + { + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location', $location ); + $this->assertEquals( 2, $location->id ); + $this->assertEquals( 1, $location->contentId ); + } + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo', $content->version ); + $this->assertEquals( 3, count( $content->version->fields ) ); + $this->assertEquals( array( "eng-GB" => "bar0" ), $content->version->name ); + foreach ( $content->version->fields as $field ) + { + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field', $field ); + $this->assertEquals( $content->currentVersionNo, $field->versionNo ); + } + } + } + + /** + * Test finding content with wildcard + * + * @covers \eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testFindWildcard() + { + $list = $this->backend->find( 'Content\\Language', array( 'name' => "lang%" ) ); + $this->assertEquals( 10, count( $list ) ); + foreach ( $list as $vo ) + { + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $vo ); + self::assertTrue( strpos( $vo->name, 'lang' ) === 0 ); + } + } + + /** + * Test counting content without results + * + * @dataProvider providerForFindEmpty + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::count + * @group inMemoryBackend + */ + public function testCountEmpty( $searchData ) + { + $this->assertEquals( + 0, + $this->backend->count( 'Content\\ContentInfo', $searchData ) + ); + } + + /** + * Test counting content with results + * + * @dataProvider providerForFind + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::count + * @group inMemoryBackend + */ + public function testCount( $searchData, $result ) + { + $this->assertEquals( + count( $result ), + $this->backend->count( "Content\\VersionInfo", $searchData ) + ); + } + + /** + * Test counting content with results using join and deep matching + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::count + * @group inMemoryBackend + */ + public function testCountJoinDeepMatch() + { + $this->assertEquals( + 1, + $this->backend->count( + 'Content', + array( "versionInfo" => array( 'id' => 2 ) ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ) + ) + ) + ); + } + + /** + * Test count content with results using join and deep matching where match collides with join + * + * @expectedException LogicException + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + * @group inMemoryBackend + */ + public function testCountJoinDeepMatchCollision() + { + $this->backend->count( + 'Content', + array( "locations" => array( 'contentId' => 2 ) ), + array( + 'locations' => array( + 'type' => 'Content\\Location', + 'match' => array( 'contentId' => 'id' ) + ) + ) + ); + } + + /** + * Test loading content without results + * + * @dataProvider providerForLoadEmpty + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::load + * @group inMemoryBackend + */ + public function testLoadEmpty( $searchData ) + { + $this->backend->load( 'Content', $searchData ); + } + + public function providerForLoadEmpty() + { + return array( + array( "" ), + array( null ), + array( 0 ), + array( 0.1 ), + array( "0" ), + array( "unexistingKey" ), + ); + } + + /** + * Test loading content with results + * + * @dataProvider providerForLoad + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::load + * @group inMemoryBackend + */ + public function testLoad( $searchData, $result ) + { + $version = $this->backend->load( "Content\\VersionInfo", $searchData ); + foreach ( $result as $name => $value ) + $this->assertEquals( $value, $version->$name ); + } + + public function providerForLoad() + { + return array( + array( + 1, + array( + "id" => 1, + "names" => array( "eng-GB" => "bar0" ), + "creatorId" => 42, + ) + ), + array( + 2, + array( + "id" => 2, + "names" => array( "eng-GB" => "bar1" ), + "creatorId" => 42, + ) + ), + array( + 11, + array( + "id" => 11, + "names" => array( "eng-GB" => "foo0" ), + "creatorId" => null, + ) + ), + ); + } + + /** + * Test updating content on unexisting ID + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::update + * @group inMemoryBackend + */ + public function testUpdateUnexistingId() + { + $this->assertFalse( + $this->backend->update( 'Content\\ContentInfo', 0, array() ) + ); + } + + /** + * Test updating content with an extra attribute + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::update + * @group inMemoryBackend + */ + public function testUpdateNewAttribute() + { + $this->assertTrue( + $this->backend->update( 'Content\\ContentInfo', 1, array( "ownerId" => 5 ), true ) + ); + $content = $this->backend->load( 'Content\\ContentInfo', 1 ); + $this->assertEquals( 1, $content->id ); + $this->assertEquals( 1, $content->sectionId ); + $this->assertEquals( 5, $content->ownerId ); + } + + /** + * Test updating content + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::update + * @group inMemoryBackend + */ + public function testUpdate() + { + $this->assertTrue( + $this->backend->update( "Content\\VersionInfo", 2, array( "names" => array( "eng-GB" => "Testing" ) ) ) + ); + $versionInfo = $this->backend->load( "Content\\VersionInfo", 2 ); + $this->assertEquals( array( "eng-GB" => "Testing" ), $versionInfo->names ); + } + + /** + * Test updating content with a null value + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::update + * @group inMemoryBackend + */ + public function testUpdateWithNullValue() + { + $this->assertTrue( + $this->backend->update( "Content\\VersionInfo", 3, array( "names" => null ) ) + ); + $versionInfo = $this->backend->load( "Content\\VersionInfo", 3 ); + $this->assertEquals( null, $versionInfo->names ); + } + + /** + * Test deleting content + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::delete + * @group inMemoryBackend + */ + public function testDelete() + { + $this->backend->delete( "Content\\VersionInfo", 1 ); + try + { + $this->backend->load( "Content\\VersionInfo", 1 ); + $this->fail( "Content has not been deleted" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test deleting content which does not exist + * + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::delete + * @group inMemoryBackend + */ + public function testDeleteNotFound() + { + $this->backend->delete( "Content\\VersionInfo", 999 ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/InMemory/BackendTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/InMemory/BackendTest.php new file mode 100644 index 0000000..e2ae692 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/InMemory/BackendTest.php @@ -0,0 +1,178 @@ +backend = new Backend( + array( + 'Content' => array(), + 'Content\\ContentInfo' => array() + ) + ); + } + + /** + * Tear down test (properties) + */ + protected function tearDown() + { + unset( $this->backend ); + parent::tearDown(); + } + + /** + * Test creating content with a wrong type. + * + * @param mixed $type Wrong type to create + * + * @expectedException eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * @dataProvider providerForWrongType + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::create + */ + public function testCreateWrongType( $type ) + { + $this->backend->create( $type, array() ); + } + + /** + * Test loading content with a wrong type. + * + * @param mixed $type Wrong type to load + * + * @expectedException eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * @dataProvider providerForWrongType + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::load + */ + public function testLoadWrongType( $type ) + { + $this->backend->load( $type, 1 ); + } + + /** + * Test finding content with a wrong type. + * + * @param mixed $type Wrong type to find + * + * @expectedException eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * @dataProvider providerForWrongType + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::find + */ + public function testFindWrongType( $type ) + { + $this->backend->find( $type, array() ); + } + + /** + * Test counting content with a wrong type. + * + * @param mixed $type Wrong type to count + * + * @expectedException eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * @dataProvider providerForWrongType + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::count + */ + public function testCountWrongType( $type ) + { + $this->backend->count( $type, array() ); + } + + /** + * Test updating content with a wrong type. + * + * @param mixed $type Wrong type to update + * + * @expectedException eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * @dataProvider providerForWrongType + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::update + */ + public function testUpdateWrongType( $type ) + { + $this->backend->update( $type, 1, array() ); + } + + /** + * Test deleting content with a wrong type. + * + * @param mixed $type Wrong type to delete + * + * @expectedException eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue + * @dataProvider providerForWrongType + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::delete + */ + public function testDeleteWrongType( $type ) + { + $this->backend->delete( $type, 1 ); + } + + /** + * Test creating content + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::create + */ + public function testCreate() + { + $content = $this->backend->create( "Content\\ContentInfo", array( "sectionId" => 2 ), true ); + $this->assertEquals( 1, $content->id ); + $this->assertEquals( 2, $content->sectionId ); + $this->assertEquals( null, $content->ownerId ); + } + + /** + * Test creating multiple content + * + * @covers eZ\Publish\Core\Persistence\InMemory\Backend::create + */ + public function testCreateMultiple() + { + for ( $i = 1; $i <= 10; ++$i ) + { + $content = $this->backend->create( "Content\\ContentInfo", array( "sectionId" => 2 ), true ); + $this->assertEquals( $i, $content->id ); + } + } + + /** + * Provider for test*WrongType. + * + * @see testCreateWrongType + * @see testLoadWrongType + */ + public function providerForWrongType() + { + return array( + array( 'wrongType' ), + array( null ), + array( false ), + array( true ), + array( array() ), + array( new stdClass ), + ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/LanguageHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/LanguageHandlerTest.php new file mode 100644 index 0000000..0428ef0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/LanguageHandlerTest.php @@ -0,0 +1,180 @@ +handler = $this->persistenceHandler->contentLanguageHandler(); + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + parent::tearDown(); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::load + */ + public function testLoad() + { + $language = $this->handler->load( 2 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $language ); + $this->assertEquals( 'eng-US', $language->languageCode ); + $this->assertEquals( 'English (American)', $language->name ); + $this->assertTrue( $language->isEnabled ); + } + + /** + * Test load function by language code + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::loadByLanguageCode + */ + public function testLoadByLanguageCode() + { + $language = $this->handler->loadByLanguageCode( 'eng-US' ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $language ); + $this->assertEquals( 'eng-US', $language->languageCode ); + $this->assertEquals( 'English (American)', $language->name ); + $this->assertTrue( $language->isEnabled ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::loadAll + */ + public function testLoadAll() + { + $languages = $this->handler->loadAll(); + + $this->assertEquals( 3, count( $languages ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $languages['eng-GB'] ); + $this->assertEquals( 'eng-GB', $languages['eng-GB']->languageCode ); + $this->assertEquals( 'English (United Kingdom)', $languages['eng-GB']->name ); + $this->assertTrue( $languages['eng-GB']->isEnabled ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $languages['eng-US'] ); + $this->assertEquals( 'eng-US', $languages['eng-US']->languageCode ); + $this->assertEquals( 'English (American)', $languages['eng-US']->name ); + $this->assertTrue( $languages['eng-US']->isEnabled ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $languages['ger-DE'] ); + $this->assertEquals( 'ger-DE', $languages['ger-DE']->languageCode ); + $this->assertEquals( 'German', $languages['ger-DE']->name ); + $this->assertTrue( $languages['ger-DE']->isEnabled ); + + $struct = new CreateStruct(); + $struct->languageCode = 'nor-NB'; + $struct->name = 'Norwegian Bokmål'; + $struct->isEnabled = false; + $this->handler->create( $struct ); + + $languages = $this->handler->loadAll(); + + $this->assertEquals( 4, count( $languages ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $languages['nor-NB'] ); + $this->assertEquals( 'nor-NB', $languages['nor-NB']->languageCode ); + $this->assertEquals( 'Norwegian Bokmål', $languages['nor-NB']->name ); + $this->assertFalse( $languages['nor-NB']->isEnabled ); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::create + */ + public function testCreate() + { + $struct = new CreateStruct(); + $struct->languageCode = 'nor-NB'; + $struct->name = 'Norwegian Bokmål'; + $struct->isEnabled = false; + $language = $this->handler->create( $struct ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', $language ); + $this->assertEquals( 9, $language->id ); + $this->assertEquals( 'nor-NB', $language->languageCode ); + $this->assertEquals( 'Norwegian Bokmål', $language->name ); + $this->assertFalse( $language->isEnabled ); + } + + /** + * Test update function + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::update + */ + public function testUpdate() + { + $language = $this->handler->load( 2 ); + $language->languageCode = 'Changed'; + $language->name = 'Changed'; + $language->isEnabled = false; + $this->handler->update( $language ); + + $language = $this->handler->load( 2 ); + $this->assertEquals( 2, $language->id ); + $this->assertEquals( 'Changed', $language->name ); + $this->assertEquals( 'Changed', $language->languageCode ); + $this->assertFalse( $language->isEnabled ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::delete + */ + public function testDelete() + { + $this->handler->delete( 4 ); + try + { + $this->handler->load( 4 ); + $this->fail( "Language has not been deleted" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test delete function throwing LogicException + * + * @expectedException \LogicException + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::delete + */ + public function testDeleteThrowsLogicException() + { + $language = $this->handler->loadByLanguageCode( 'eng-GB' ); + $this->handler->delete( $language->id ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/LocationHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/LocationHandlerTest.php new file mode 100644 index 0000000..fe05e7d --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/LocationHandlerTest.php @@ -0,0 +1,435 @@ +lastLocationId = 2; + for ( $i = 0; $i < $this->entriesGenerated; ++$i ) + { + $this->contents[] = $content = $this->persistenceHandler->contentHandler()->create( + new ContentCreateStruct( + array( + "name" => array( "eng-GB" => "test_$i" ), + "ownerId" => 14, + "sectionId" => 1, + "typeId" => 2, + "initialLanguageId" => 2, + "fields" => array( + new Field( + array( + "type" => "ezstring", + // FieldValue object compatible with ezstring + "value" => new FieldValue( + array( + 'data' => "Welcome $i" + ) + ), + "languageCode" => "eng-GB", + ) + ) + ) + ) + ) + ); + + $this->lastContentId = $content->versionInfo->contentInfo->id; + + $this->locations[] = $location = $this->persistenceHandler->locationHandler()->create( + new CreateStruct( + array( + "contentId" => $this->lastContentId, + "contentVersion" => 1, + "mainLocationId" => $this->lastLocationId, + "sortField" => Location::SORT_FIELD_NAME, + "sortOrder" => Location::SORT_ORDER_ASC, + "parentId" => $this->lastLocationId, + ) + ) + ); + + $this->lastLocationId = $location->id; + } + + $this->locationToDelete = $this->locations; + $this->contentToDelete = $this->contents; + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + $locationHandler = $this->persistenceHandler->locationHandler(); + + // Removing default objects as well as those created by tests + foreach ( $this->locationToDelete as $location ) + { + try + { + $locationHandler->removeSubtree( $location->id ); + } + catch ( NotFound $e ) + { + } + } + + $contentHandler = $this->persistenceHandler->contentHandler(); + foreach ( $this->contentToDelete as $content ) + { + try + { + $contentHandler->deleteContent( $content->versionInfo->contentInfo->id ); + } + catch ( NotFound $e ) + { + } + } + + unset( $this->lastLocationId, $this->lastContentId ); + parent::tearDown(); + } + + /** + * Test load function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::load + * @group locationHandler + */ + public function testLoad() + { + $location = $this->persistenceHandler->locationHandler()->load( $this->lastLocationId ); + $this->assertTrue( $location instanceof LocationValue ); + $this->assertEquals( $this->lastLocationId, $location->id ); + $this->assertEquals( $this->lastContentId, $location->contentId ); + // @todo contentVersion not yet implemented + //$this->assertEquals( 1, $location->contentVersion ); + $this->assertEmpty( $location->pathIdentificationString ); + $this->assertEquals( $this->lastLocationId, $location->mainLocationId ); + $this->assertEquals( Location::SORT_FIELD_NAME, $location->sortField ); + $this->assertEquals( Location::SORT_ORDER_ASC, $location->sortOrder ); + $this->assertEquals( $this->lastLocationId - 1, $location->parentId ); + } + + /** + * Test create function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::create + * @group locationHandler + */ + public function testCreate() + { + $location = $this->persistenceHandler->locationHandler()->create( + new CreateStruct( + array( + "contentId" => 1, + "contentVersion" => 1, + "pathIdentificationString" => "", + "mainLocationId" => 2, + "sortField" => Location::SORT_FIELD_NAME, + "sortOrder" => Location::SORT_ORDER_ASC, + "parentId" => 1, + ) + ) + ); + $this->locationToDelete[] = $location; + $this->assertTrue( $location instanceof LocationValue ); + $this->assertEquals( $this->lastLocationId + 1, $location->id ); + $this->assertEquals( 1, $location->contentId ); + // @todo contentVersion not yet implemented + //$this->assertEquals( 1, $location->contentVersion ); + $this->assertEmpty( $location->pathIdentificationString ); + $this->assertEquals( 2, $location->mainLocationId ); + $this->assertEquals( Location::SORT_FIELD_NAME, $location->sortField ); + $this->assertEquals( Location::SORT_ORDER_ASC, $location->sortOrder ); + $this->assertEquals( 1, $location->parentId ); + } + + /** + * Test removeSubtree function with no children + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::removeSubtree + * @group locationHandler + */ + public function testRemoveSubtreeNoChildren() + { + $locationHandler = $this->persistenceHandler->locationHandler(); + $locationHandler->removeSubtree( $this->lastLocationId ); + + try + { + $locationHandler->load( $this->lastLocationId ); + $this->fail( "Content not removed correctly" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test removeSubtree function with children + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::removeSubtree + * @group locationHandler + */ + public function testRemoveSubtreeChildren() + { + $locationHandler = $this->persistenceHandler->locationHandler(); + $locationHandler->removeSubtree( $this->lastLocationId - 2 ); + + try + { + $locationHandler->load( $this->lastLocationId ); + $this->fail( "Content not removed correctly" ); + } + catch ( NotFound $e ) + { + } + + try + { + $locationHandler->load( $this->lastLocationId - 1 ); + $this->fail( "Content not removed correctly" ); + } + catch ( NotFound $e ) + { + } + + try + { + $locationHandler->load( $this->lastLocationId - 2 ); + $this->fail( "Content not removed correctly" ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test copySubtree function with no children + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::copySubtree + * @group locationHandler + */ + public function testCopySubtreeNoChildren() + { + // Copy the last location created in setUp + $newLocation = $this->persistenceHandler->locationHandler()->copySubtree( $this->lastLocationId, 2 ); + $this->assertTrue( $newLocation instanceof LocationValue ); + $this->assertEquals( $this->lastLocationId + 1, $newLocation->id ); + $this->assertEquals( $this->lastContentId + 1, $newLocation->contentId ); + $this->assertEquals( 2, $newLocation->depth ); + $this->assertEquals( Location::SORT_FIELD_NAME, $newLocation->sortField ); + $this->assertEquals( Location::SORT_ORDER_ASC, $newLocation->sortOrder ); + + // SearchHandler::findSingle() needs reimplementation + /*$this->assertEquals( + $this->persistenceHandler->searchHandler()->findSingle( + new ContentId( $newLocation->contentId ) + )->locations[0], + $newLocation, + "Location does not match" + );*/ + } + + /** + * Test copySubtree function with children + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::copySubtree + * @group locationHandler + */ + public function testCopySubtreeChildren() + { + // Copy the grand parent of the last location created in setUp + $newLocation = $this->persistenceHandler->locationHandler()->copySubtree( $this->lastLocationId - 2, 2 ); + $this->assertTrue( $newLocation instanceof LocationValue ); + $this->assertEquals( $this->lastLocationId + 1, $newLocation->id ); + $this->assertEquals( $this->lastContentId + 1, $newLocation->contentId ); + $this->assertEquals( 2, $newLocation->depth ); + $this->assertEquals( Location::SORT_FIELD_NAME, $newLocation->sortField ); + $this->assertEquals( Location::SORT_ORDER_ASC, $newLocation->sortOrder ); + + // Verifying the deepest child is present + // SearchHandler::findSingle() needs reimplementation + /*foreach ( + $this->persistenceHandler->searchHandler()->findSingle( + new ContentId( $newLocation->contentId ) + )->locations[0] as $property => $value + ) + { + self::assertEquals( $newLocation->$property, $value, "Location does not match" ); + } + + // Verifying the direct child is present + $loc = $this->persistenceHandler->locationHandler()->load( $newLocation->id - 1 ); + foreach ( + $this->persistenceHandler->searchHandler()->findSingle( + new ContentId( $newLocation->contentId - 1 ) + )->locations[0] as $property => $value + ) + { + self::assertEquals( $loc->$property, $value, "Location does not match" ); + } + unset( $loc ); + + // Verifying the top most copied location (the grand parent) is present + $loc = $this->persistenceHandler->locationHandler()->load( $newLocation->id - 2 ); + foreach ( + $this->persistenceHandler->searchHandler()->findSingle( + new ContentId( $newLocation->contentId - 2 ) + )->locations[0] as $property => $value + ) + { + self::assertEquals( $loc->$property, $value, "Location does not match" ); + }*/ + } + + /** + * Tests loadByParentId function with no children + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::loadByParentId + * @group locationHandler + */ + public function testLoadByParentIdNoChildren() + { + $this->assertEmpty( $this->persistenceHandler->locationHandler()->loadByParentId( $this->lastLocationId ) ); + } + + /** + * Tests loadByParentId function with children + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::loadByParentId + * @group locationHandler + */ + public function testLoadByParentIdChildren() + { + $this->assertEquals( + array( end( $this->locations ) ), + $this->persistenceHandler->locationHandler()->loadByParentId( $this->lastLocationId - 1 ) + ); + } + + /** + * Tests loadByParentId function on unexisting id + * + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::loadByParentId + * @group locationHandler + */ + public function testLoadByParentIdNotExisting() + { + $this->persistenceHandler->locationHandler()->loadByParentId( 123456 ); + } + + /** + * Test for the changeMainLocation() method. + * + * @covers \eZ\Publish\Core\Persistence\InMemory\LocationHandler::changeMainLocation + * @group locationHandler + */ + public function testChangeMainLocation() + { + // Create additional location to perform this test + $location = $this->persistenceHandler->locationHandler()->create( + new CreateStruct( + array( + "contentId" => 1, + "contentVersion" => 1, + "pathIdentificationString" => "", + "mainLocationId" => 2, + "sortField" => Location::SORT_FIELD_NAME, + "sortOrder" => Location::SORT_ORDER_ASC, + "parentId" => 44, + ) + ) + ); + $this->persistenceHandler->locationHandler()->changeMainLocation( + 1, + $location->id + ); + + $content = $this->persistenceHandler->contentHandler()->load( 1, 1 ); + + $this->assertEquals( + $location->id, + $content->versionInfo->contentInfo->mainLocationId, + "Main location has not been changed" + ); + + $this->assertEquals( + 2, + $content->versionInfo->contentInfo->sectionId, + "Subtree section has not been changed" + ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/ObjectStateHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/ObjectStateHandlerTest.php new file mode 100644 index 0000000..b242c48 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/ObjectStateHandlerTest.php @@ -0,0 +1,429 @@ +handler = $this->persistenceHandler->objectStateHandler(); + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + parent::tearDown(); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::createGroup + */ + public function testCreateGroup() + { + $createdGroup = $this->handler->createGroup( $this->getInputStructFixture() ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', $createdGroup ); + + $this->assertEquals( 3, $createdGroup->id ); + $this->assertEquals( 'test', $createdGroup->identifier ); + $this->assertEquals( 'eng-US', $createdGroup->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $createdGroup->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Test' ), $createdGroup->name ); + $this->assertEquals( array( 'eng-US' => 'Test description' ), $createdGroup->description ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadGroup + */ + public function testLoadGroup() + { + $group = $this->handler->loadGroup( 2 ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', $group ); + + $this->assertEquals( 2, $group->id ); + $this->assertEquals( 'ez_lock', $group->identifier ); + $this->assertEquals( 'eng-US', $group->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $group->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Lock' ), $group->name ); + $this->assertEquals( array( 'eng-US' => '' ), $group->description ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadGroupThrowsNotFoundException() + { + $this->handler->loadGroup( PHP_INT_MAX ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadGroupByIdentifier + */ + public function testLoadGroupByIdentifier() + { + $group = $this->handler->loadGroupByIdentifier( 'ez_lock' ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', $group ); + + $this->assertEquals( 2, $group->id ); + $this->assertEquals( 'ez_lock', $group->identifier ); + $this->assertEquals( 'eng-US', $group->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $group->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Lock' ), $group->name ); + $this->assertEquals( array( 'eng-US' => '' ), $group->description ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadGroupByIdentifier + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadGroupByIdentifierThrowsNotFoundException() + { + $this->handler->loadGroup( 'unknown' ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadAllGroups + */ + public function testLoadAllGroups() + { + $groups = $this->handler->loadAllGroups(); + + $this->assertCount( 1, $groups ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', $groups[0] ); + + $this->assertEquals( 2, $groups[0]->id ); + $this->assertEquals( 'ez_lock', $groups[0]->identifier ); + $this->assertEquals( 'eng-US', $groups[0]->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $groups[0]->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Lock' ), $groups[0]->name ); + $this->assertEquals( array( 'eng-US' => '' ), $groups[0]->description ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadObjectStates + */ + public function testLoadObjectStates() + { + $states = $this->handler->loadObjectStates( 2 ); + + $this->assertCount( 2, $states ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $states[0] ); + + $this->assertEquals( 1, $states[0]->id ); + $this->assertEquals( 2, $states[0]->groupId ); + $this->assertEquals( 'not_locked', $states[0]->identifier ); + $this->assertEquals( 'eng-US', $states[0]->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $states[0]->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Not locked' ), $states[0]->name ); + $this->assertEquals( array( 'eng-US' => '' ), $states[0]->description ); + $this->assertEquals( 0, $states[0]->priority ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $states[1] ); + + $this->assertEquals( 2, $states[1]->id ); + $this->assertEquals( 2, $states[1]->groupId ); + $this->assertEquals( 'locked', $states[1]->identifier ); + $this->assertEquals( 'eng-US', $states[1]->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $states[1]->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Locked' ), $states[1]->name ); + $this->assertEquals( array( 'eng-US' => '' ), $states[1]->description ); + $this->assertEquals( 1, $states[1]->priority ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::updateGroup + */ + public function testUpdateGroup() + { + $updatedGroup = $this->handler->updateGroup( 2, $this->getInputStructFixture() ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', $updatedGroup ); + + $this->assertEquals( 2, $updatedGroup->id ); + $this->assertEquals( 'test', $updatedGroup->identifier ); + $this->assertEquals( 'eng-US', $updatedGroup->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $updatedGroup->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Test' ), $updatedGroup->name ); + $this->assertEquals( array( 'eng-US' => 'Test description' ), $updatedGroup->description ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::deleteGroup + */ + public function testDeleteGroup() + { + $this->handler->deleteGroup( 2 ); + + try + { + $this->handler->loadGroup( 2 ); + $this->fail( 'Successfully loaded deleted object state group' ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + try + { + $this->handler->load( 1 ); + $this->fail( 'Successfully loaded one of the states from deleted object state group' ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + try + { + $this->handler->load( 2 ); + $this->fail( 'Successfully loaded one of the states from deleted object state group' ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::create + */ + public function testCreate() + { + $createdState = $this->handler->create( 2, $this->getInputStructFixture() ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $createdState ); + + $this->assertEquals( 3, $createdState->id ); + $this->assertEquals( 2, $createdState->groupId ); + $this->assertEquals( 'test', $createdState->identifier ); + $this->assertEquals( 'eng-US', $createdState->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $createdState->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Test' ), $createdState->name ); + $this->assertEquals( array( 'eng-US' => 'Test description' ), $createdState->description ); + $this->assertEquals( 2, $createdState->priority ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::create + */ + public function testCreateInEmptyGroup() + { + $createdGroup = $this->handler->createGroup( $this->getInputStructFixture() ); + $createdState = $this->handler->create( $createdGroup->id, $this->getInputStructFixture() ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $createdState ); + + $this->assertEquals( 3, $createdState->id ); + $this->assertEquals( $createdGroup->id, $createdState->groupId ); + $this->assertEquals( 'test', $createdState->identifier ); + $this->assertEquals( 'eng-US', $createdState->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $createdState->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Test' ), $createdState->name ); + $this->assertEquals( array( 'eng-US' => 'Test description' ), $createdState->description ); + $this->assertEquals( 0, $createdState->priority ); + + $this->assertEquals( $this->handler->getContentCount( 1 ), $this->handler->getContentCount( $createdState->id ) ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::load + */ + public function testLoad() + { + $state = $this->handler->load( 1 ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $state ); + + $this->assertEquals( 1, $state->id ); + $this->assertEquals( 2, $state->groupId ); + $this->assertEquals( 'not_locked', $state->identifier ); + $this->assertEquals( 'eng-US', $state->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $state->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Not locked' ), $state->name ); + $this->assertEquals( array( 'eng-US' => '' ), $state->description ); + $this->assertEquals( 0, $state->priority ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadThrowsNotFoundException() + { + $this->handler->load( PHP_INT_MAX ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadByIdentifier + */ + public function testLoadByIdentifier() + { + $state = $this->handler->loadByIdentifier( 'not_locked', 2 ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $state ); + + $this->assertEquals( 1, $state->id ); + $this->assertEquals( 2, $state->groupId ); + $this->assertEquals( 'not_locked', $state->identifier ); + $this->assertEquals( 'eng-US', $state->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $state->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Not locked' ), $state->name ); + $this->assertEquals( array( 'eng-US' => '' ), $state->description ); + $this->assertEquals( 0, $state->priority ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::loadByIdentifier + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadByIdentifierThrowsNotFoundException() + { + $this->handler->loadByIdentifier( 'unknown', 2 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::update + */ + public function testUpdate() + { + $updatedState = $this->handler->update( 1, $this->getInputStructFixture() ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $updatedState ); + + $this->assertEquals( 1, $updatedState->id ); + $this->assertEquals( 2, $updatedState->groupId ); + $this->assertEquals( 'test', $updatedState->identifier ); + $this->assertEquals( 'eng-US', $updatedState->defaultLanguage ); + $this->assertEquals( array( 'eng-US' ), $updatedState->languageCodes ); + $this->assertEquals( array( 'eng-US' => 'Test' ), $updatedState->name ); + $this->assertEquals( array( 'eng-US' => 'Test description' ), $updatedState->description ); + $this->assertEquals( 0, $updatedState->priority ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::setPriority + */ + public function testSetPriority() + { + $this->handler->setPriority( 2, 0 ); + + $firstObjectState = $this->handler->load( 1 ); + $this->assertEquals( 1, $firstObjectState->priority ); + + $firstObjectState = $this->handler->load( 2 ); + $this->assertEquals( 0, $firstObjectState->priority ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::delete + */ + public function testDelete() + { + $expectedCount = $this->handler->getContentCount( 1 ); + $this->handler->delete( 1 ); + try + { + $this->handler->load( 1 ); + $this->fail( 'Successfully loaded deleted object state' ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + $this->assertEquals( 0, $this->handler->getContentCount( 1 ) ); + $this->assertEquals( $expectedCount, $this->handler->getContentCount( 2 ) ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::delete + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteThrowsNotFoundException() + { + $this->handler->delete( PHP_INT_MAX ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::setContentState + */ + public function testSetContentState() + { + $returnValue = $this->handler->setContentState( 14, 2, 2 ); + $this->assertEquals( true, $returnValue ); + + $newObjectState = $this->handler->getContentState( 14, 2 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $newObjectState ); + $this->assertEquals( 2, $newObjectState->id ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::getContentState + */ + public function testGetContentState() + { + $objectState = $this->handler->getContentState( 14, 2 ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', $objectState ); + $this->assertEquals( 1, $objectState->id ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::getContentCount + */ + public function testGetContentCount() + { + $count = $this->handler->getContentCount( 1 ); + + // 9 is the count of objects in test fixtures as of writing + $this->assertGreaterThanOrEqual( 9, $count ); + } + + /** + * Returns the input struct fixture for object states and groups + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function getInputStructFixture() + { + $inputStruct = new InputStruct(); + + $inputStruct->identifier = 'test'; + $inputStruct->defaultLanguage = 'eng-US'; + $inputStruct->name = array( 'eng-US' => 'Test' ); + $inputStruct->description = array( 'eng-US' => 'Test description' ); + + return $inputStruct; + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/PersistenceHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/PersistenceHandlerTest.php new file mode 100644 index 0000000..3c3b8a6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/PersistenceHandlerTest.php @@ -0,0 +1,159 @@ +assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Handler', $this->persistenceHandler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\Handler', $this->persistenceHandler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentHandler::__construct + */ + public function testContentHandler() + { + $handler = $this->persistenceHandler->contentHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\ContentHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\SearchHandler::__construct + */ + public function testSearchHandler() + { + $handler = $this->persistenceHandler->searchHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Search\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\SearchHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\LanguageHandler::__construct + */ + public function testLanguageHandler() + { + $handler = $this->persistenceHandler->contentLanguageHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\LanguageHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\ContentTypeHandler::__construct + */ + public function testContentTypeHandler() + { + $handler = $this->persistenceHandler->contentTypeHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\ContentTypeHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\LocationHandler::__construct + */ + public function testContentLocationHandler() + { + $handler = $this->persistenceHandler->locationHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\LocationHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\TrashHandler::__construct + */ + public function testTrashHandler() + { + $handler = $this->persistenceHandler->trashHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\Trash\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\TrashHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\ObjectStateHandler::__construct + */ + public function testObjectStateHandler() + { + $handler = $this->persistenceHandler->objectStateHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\ObjectStateHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::__construct + */ + public function testSectionHandler() + { + $handler = $this->persistenceHandler->sectionHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Section\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\SectionHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::__construct + */ + public function testUserHandler() + { + $handler = $this->persistenceHandler->userHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\UserHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\UrlAliasHandler::__construct + */ + public function testUrlAliasHandler() + { + $handler = $this->persistenceHandler->urlAliasHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\UrlAliasHandler', $handler ); + } + + /** + * Test that instance is of correct type + * + * @covers eZ\Publish\Core\Persistence\InMemory\UrlWildcardHandler::__construct + */ + public function testUrlWildcardHandler() + { + $handler = $this->persistenceHandler->urlWildcardHandler(); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\UrlWildcard\\Handler', $handler ); + $this->assertInstanceOf( 'eZ\\Publish\\Core\\Persistence\\InMemory\\UrlWildcardHandler', $handler ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/SearchHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/SearchHandlerTest.php new file mode 100644 index 0000000..54930c9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/SearchHandlerTest.php @@ -0,0 +1,187 @@ +name = array( 'eng-GB' => "test" ); + $struct->ownerId = 14; + $struct->sectionId = 1; + $struct->typeId = 2; + $struct->initialLanguageId = 2; + $struct->fields[] = new Field( + array( + "type" => "ezstring", + // FieldValue object compatible with ezstring + "value" => new FieldValue( + array( + "data" => "Welcome" + ) + ), + "languageCode" => "eng-GB", + ) + ); + + $this->content = $this->persistenceHandler->contentHandler()->create( $struct ); + $this->contentToDelete[] = $this->content; + $this->contentId = $this->content->versionInfo->contentInfo->id; + } + + protected function tearDown() + { + $contentHandler = $this->persistenceHandler->contentHandler(); + + try + { + // Removing default objects as well as those created by tests + foreach ( $this->contentToDelete as $content ) + { + $contentHandler->deleteContent( $content->versionInfo->contentInfo->id ); + } + } + catch ( NotFound $e ) + { + } + unset( $this->contentId ); + parent::tearDown(); + } + + /** + * Test findContent function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SearchHandler::findContent + */ + public function testFindContent() + { + $result = $this->persistenceHandler->searchHandler()->findContent( + new Query( + array( + 'criterion' => new ContentId( $this->content->versionInfo->contentInfo->id ), + ) + ) + ); + + $this->assertInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Search\\SearchResult', $result ); + $this->assertEquals( 1, $result->totalCount ); + $this->assertInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Search\\SearchHit', $result->searchHits[0] ); + + $content = $result->searchHits[0]->valueObject; + $this->assertEquals( 14, $content->versionInfo->contentInfo->ownerId ); + $this->assertEquals( array( 'eng-GB' => 'test' ), $content->versionInfo->names ); + $this->assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo", $content->versionInfo ); + } + + /** + * Test findSingle function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SearchHandler::findSingle + */ + public function testFindSingle() + { + $content = $this->persistenceHandler->searchHandler()->findSingle( new ContentId( $this->content->versionInfo->contentInfo->id ) ); + $this->assertInstanceOf( 'eZ\Publish\SPI\Persistence\Content', $content ); + $this->assertEquals( $this->contentId, $content->versionInfo->contentInfo->id ); + $this->assertEquals( 14, $content->versionInfo->contentInfo->ownerId ); + $this->assertEquals( array( 'eng-GB' => 'test' ), $content->versionInfo->names ); + $this->assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo", $content->versionInfo ); + } + + /** + * Test finding content by location remote ID + * + * @covers eZ\Publish\Core\Persistence\InMemory\SearchHandler::findSingle + */ + public function testFindByLocationRemoteId() + { + $content = $this->persistenceHandler->searchHandler()->findSingle( new LocationRemoteId( 'f3e90596361e31d496d4026eb624c983' ) ); + $this->assertTrue( $content instanceof Content ); + $this->assertEquals( 1, $content->versionInfo->contentInfo->id ); + } + + /** + * Test finding content by object state ID + * + * @covers eZ\Publish\Core\Persistence\InMemory\SearchHandler::findContent + */ + public function testFindByObjectStateId() + { + $searchResult = $this->persistenceHandler->searchHandler()->findContent( + new Query( + array( + 'criterion' => new ObjectStateId( 1 ) + ) + ) + ); + $this->assertEquals( 9, $searchResult->totalCount ); + } + + /** + * Test finding content by language code + * + * @covers eZ\Publish\Core\Persistence\InMemory\SearchHandler::findContent + */ + public function testFindByLanguageCode() + { + $searchResult = $this->persistenceHandler->searchHandler()->findContent( + new Query( + array( + 'criterion' => new LanguageCode( 'eng-US' ) + ) + ) + ); + + $contentIds = array_map( + function( $searchHit ) + { + return $searchHit->valueObject->versionInfo->contentInfo->id; + }, + $searchResult->searchHits + ); + + $this->assertEquals( array( 4, 11, 42, 41, 51 ), $contentIds ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/SectionHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/SectionHandlerTest.php new file mode 100644 index 0000000..95b7ffa --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/SectionHandlerTest.php @@ -0,0 +1,143 @@ +section = $this->persistenceHandler->sectionHandler()->create( "Test", "test" ); + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + $sectionHandler = $this->persistenceHandler->sectionHandler(); + // Removing default objects as well as those created by + try + { + $sectionHandler->delete( 2 ); + $sectionHandler->delete( 3 ); + } + catch ( NotFound $e ) + { + } + parent::tearDown(); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::load + */ + public function testLoad() + { + $section = $this->persistenceHandler->sectionHandler()->load( $this->section->id ); + $this->assertTrue( $section instanceof Section ); + $this->assertEquals( 'Test', $section->name ); + $this->assertEquals( 'test', $section->identifier ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::loadAll + */ + public function testLoadAll() + { + $section = $this->persistenceHandler->sectionHandler()->loadAll(); + $this->assertTrue( $section[0] instanceof Section ); + $this->assertEquals( 'Standard', $section[0]->name ); + $this->assertEquals( 'standard', $section[0]->identifier ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::loadByIdentifier + */ + public function testLoadByIdentifier() + { + $section = $this->persistenceHandler->sectionHandler()->loadByIdentifier( $this->section->identifier ); + $this->assertTrue( $section instanceof Section ); + $this->assertEquals( 'Test', $section->name ); + $this->assertEquals( 'test', $section->identifier ); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::create + */ + public function testCreate() + { + $section = $this->persistenceHandler->sectionHandler()->create( 'Test2', 'test2' ); + $this->assertTrue( $section instanceof Section ); + $this->assertEquals( $this->section->id + 1, $section->id ); + $this->assertEquals( 'Test2', $section->name ); + $this->assertEquals( 'test2', $section->identifier ); + } + + /** + * Test update function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::update + */ + public function testUpdate() + { + $sectionHandler = $this->persistenceHandler->sectionHandler(); + + $updatedSection = $sectionHandler->update( $this->section->id, 'Change', 'change' ); + + $section = $sectionHandler->load( $this->section->id ); + $this->assertEquals( $this->section->id, $section->id ); + $this->assertEquals( 'Change', $section->name ); + $this->assertEquals( 'change', $section->identifier ); + $this->assertEquals( $updatedSection, $section ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\SectionHandler::delete + */ + public function testDelete() + { + $sectionHandler = $this->persistenceHandler->sectionHandler(); + + $sectionHandler->delete( $this->section->id ); + try + { + $sectionHandler->load( $this->section->id ); + $this->fail( "Section has not been deleted" ); + } + catch ( NotFound $e ) + { + } + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/TrashHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/TrashHandlerTest.php new file mode 100644 index 0000000..4b909d0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/TrashHandlerTest.php @@ -0,0 +1,244 @@ +trashHandler = $this->persistenceHandler->trashHandler(); + $this->lastLocationId = 2; + for ( $i = 0; $i < $this->entriesGenerated; ++$i ) + { + $this->contents[] = $content = $this->persistenceHandler->contentHandler()->create( + new ContentCreateStruct( + array( + "name" => array( "eng-GB" => "test_$i" ), + "ownerId" => 14, + "sectionId" => 1, + "typeId" => 2, + "initialLanguageId" => 2, + "fields" => array( + new Field( + array( + "type" => "ezstring", + // FieldValue object compatible with ezstring + "value" => new FieldValue( + array( + "data" => "Welcome $i" + ) + ), + "languageCode" => "eng-GB", + ) + ) + ) + ) + ) + ); + + $this->lastContentId = $content->versionInfo->contentInfo->id; + + $this->locations[] = $location = $this->persistenceHandler->locationHandler()->create( + new CreateStruct( + array( + "contentId" => $this->lastContentId, + "contentVersion" => 1, + "mainLocationId" => $this->lastLocationId, + "sortField" => Location::SORT_FIELD_NAME, + "sortOrder" => Location::SORT_ORDER_ASC, + "parentId" => $this->lastLocationId, + ) + ) + ); + + $this->lastLocationId = $location->id; + } + + $this->locationToDelete = $this->locations; + $this->contentToDelete = $this->contents; + } + + /** + * Removes stuff created in setUp(). + */ + protected function tearDown() + { + $this->trashHandler->emptyTrash(); + $this->trashHandler = null; + $locationHandler = $this->persistenceHandler->locationHandler(); + + // Removing default objects as well as those created by tests + foreach ( $this->locationToDelete as $location ) + { + try + { + $locationHandler->removeSubtree( $location->id ); + } + catch ( NotFound $e ) + { + } + } + + $contentHandler = $this->persistenceHandler->contentHandler(); + foreach ( $this->contentToDelete as $content ) + { + try + { + $contentHandler->deleteContent( $content->versionInfo->contentInfo->id ); + } + catch ( NotFound $e ) + { + } + } + + unset( $this->lastLocationId, $this->lastContentId ); + parent::tearDown(); + } + + /** + * Test load function + * + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::loadTrashItem + * @group trashHandler + */ + public function testLoad() + { + $trashed = $this->trashHandler->trashSubtree( $this->locations[0]->id ); + $trashedId = $trashed->id; + unset( $trashed ); + + $trashed = $this->trashHandler->loadTrashItem( $trashedId ); + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\Trashed', $trashed ); + foreach ( $this->locations[0] as $property => $value ) + { + self::assertEquals( $value, $trashed->$property, "Property {$property} did not match" ); + } + } + + /** + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::loadTrashItem + * @group trashHandler + */ + public function testLoadNonExistent() + { + $this->trashHandler->loadTrashItem( 0 ); + } + + /** + * @group trashHandler + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::trashSubtree + */ + public function testTrashSubtree() + { + $this->markTestIncomplete(); + } + + /** + * @group trashHandler + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::untrashLocation + */ + public function testUntrashLocation() + { + $this->markTestIncomplete(); + } + + /** + * @group trashHandler + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::listTrashed + */ + public function testListTrashed() + { + $this->markTestIncomplete(); + } + + /** + * @group trashHandler + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::emptyTrash + */ + public function testEmptyTrash() + { + $this->markTestIncomplete(); + } + + /** + * @group trashHandler + * @covers \eZ\Publish\Core\Persistence\InMemory\TrashHandler::emptyOne + */ + public function testEmptyOne() + { + $this->markTestIncomplete(); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/Tests/UserHandlerTest.php b/eZ/Publish/Core/Persistence/InMemory/Tests/UserHandlerTest.php new file mode 100644 index 0000000..78d130c --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/Tests/UserHandlerTest.php @@ -0,0 +1,1030 @@ +persistenceHandler->userHandler()->load( 10 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User', $obj ); + $this->assertEquals( 10, $obj->id ); + $this->assertEquals( 'nospam@ez.no', $obj->email ); + $this->assertEquals( 'anonymous', $obj->login ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::load + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadUnExistingUserId() + { + $this->persistenceHandler->userHandler()->load( 22 ); + } + + /** + * Test loadByLogin function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadByLogin + */ + public function testLoadByLogin() + { + $users = $this->persistenceHandler->userHandler()->loadByLogin( 'anonymous' ); + $this->assertEquals( 1, count( $users ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User', $users[0] ); + $this->assertEquals( 10, $users[0]->id ); + $this->assertEquals( 'nospam@ez.no', $users[0]->email ); + $this->assertEquals( 'anonymous', $users[0]->login ); + + $users = $this->persistenceHandler->userHandler()->loadByLogin( 'anonymous', true ); + $this->assertEquals( 1, count( $users ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User', $users[0] ); + $this->assertEquals( 10, $users[0]->id ); + $this->assertEquals( 'nospam@ez.no', $users[0]->email ); + $this->assertEquals( 'anonymous', $users[0]->login ); + } + + /** + * Test loadByLogin function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadByLogin + */ + public function testLoadByLoginWithEmail() + { + try + { + $this->persistenceHandler->userHandler()->loadByLogin( 'nospam@ez.no' ); + $this->fail( 'Succeeded loading user by non existent email' ); + } + catch ( NotFound $e ) + { + } + + $users = $this->persistenceHandler->userHandler()->loadByLogin( 'nospam@ez.no', true ); + $this->assertEquals( 1, count( $users ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User', $users[0] ); + $this->assertEquals( 10, $users[0]->id ); + $this->assertEquals( 'nospam@ez.no', $users[0]->email ); + $this->assertEquals( 'anonymous', $users[0]->login ); + } + + /** + * Test loadByLogin function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadByLogin + */ + public function testLoadByLoginUnExistingUser() + { + try + { + $this->persistenceHandler->userHandler()->loadByLogin( 'kamelåså' ); + $this->fail( 'Succeeded loading user by non existent login' ); + } + catch ( NotFound $e ) + { + } + + try + { + $this->persistenceHandler->userHandler()->loadByLogin( 'kamelåså@ez.no', true ); + $this->fail( 'Succeeded loading user by non existent email' ); + } + catch ( NotFound $e ) + { + } + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::create + */ + public function testCreate() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = new User(); + $obj->id = 1; + $obj->email = 'unit@ez.no'; + $obj->hashAlgorithm = 2; + $obj->login = 'unit'; + $obj->passwordHash = 'SomeRandomStuffShouldHaveBeenHash'; + $obj = $handler->create( $obj ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User', $obj ); + $this->assertEquals( 1, $obj->id ); + $this->assertEquals( 'unit@ez.no', $obj->email ); + $this->assertEquals( 2, $obj->hashAlgorithm ); + $this->assertEquals( 'unit', $obj->login ); + $this->assertEquals( 'SomeRandomStuffShouldHaveBeenHash', $obj->passwordHash ); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::create + * @expectedException LogicException + */ + public function testCreateMissingId() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = new User(); + $obj->email = 'unit@ez.no'; + $obj->hashAlgorithm = 2; + $obj->login = 'unit'; + $obj->passwordHash = 'SomeRandomStuffShouldHaveBeenHash'; + $handler->create( $obj ); + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::create + * @expectedException LogicException + */ + public function testCreateExistingId() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = new User(); + $obj->id = 14; + $obj->email = 'unit@ez.no'; + $obj->hashAlgorithm = 2; + $obj->login = 'unit'; + $obj->passwordHash = 'SomeRandomStuffShouldHaveBeenHash'; + $handler->create( $obj ); + } + + /** + * Test update function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::update + */ + public function testUpdate() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->load( 10 ); + $obj->email = 'unit@ez.no'; + $handler->update( $obj ); + $obj = $handler->load( 10 ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User', $obj ); + $this->assertEquals( 10, $obj->id ); + $this->assertEquals( 'unit@ez.no', $obj->email ); + $this->assertEquals( 2, $obj->hashAlgorithm ); + $this->assertEquals( 'anonymous', $obj->login ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::delete + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testDelete() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->delete( 10 ); + $this->assertNull( $handler->load( 10 ) ); + $this->persistenceHandler->ContentHandler()->load( 10, 1 );//exception + } + + /** + * Test create function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::createRole + */ + public function testCreateRole() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $this->assertEquals( array( 'eng-GB' => 'Test' ), $obj->name ); + // $this->assertEquals( array( 'eng-GB' => 'Test role' ), $obj->description ); + + $this->assertEquals( 'test', $obj->identifier ); + $this->assertEquals( 3, count( $obj->policies ) ); + $this->assertEquals( $obj->id, $obj->policies[0]->roleId ); + } + + /** + * Test load role function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRole + */ + public function testLoadRole() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $obj = $handler->loadRole( $obj->id ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $this->assertEquals( array( 'eng-GB' => 'Test' ), $obj->name ); + // $this->assertEquals( array( 'eng-GB' => 'Test role' ), $obj->description ); + + $this->assertEquals( 'test', $obj->identifier ); + $this->assertEquals( 3, count( $obj->policies ) ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRole + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadRoleNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->loadRole( 999 );//exception + } + + /** + * Test load role function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleByIdentifier + */ + public function testLoadRoleByIdentifier() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $obj = $handler->loadRoleByIdentifier( $obj->identifier ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $this->assertEquals( array( 'eng-GB' => 'Test' ), $obj->name ); + // $this->assertEquals( array( 'eng-GB' => 'Test role' ), $obj->description ); + + $this->assertEquals( 'test', $obj->identifier ); + $this->assertEquals( 3, count( $obj->policies ) ); + } + + /** + * Test load function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleByIdentifier + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadRoleByIdentifierNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->loadRoleByIdentifier( 'lima' );//exception + } + + /** + * Test load roles function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoles + */ + public function testLoadRoles() + { + $handler = $this->persistenceHandler->userHandler(); + $roles = $handler->loadRoles(); + $this->assertCount( 2, $roles ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $roles[0] ); + + $handler->createRole( self::getRole() ); + $roles = $handler->loadRoles(); + $this->assertCount( 3, $roles ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $roles[0] ); + } + + /** + * Test loadRolesByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRolesByGroupId + */ + public function testLoadRolesByGroupId() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 4, $obj->id );// 4: Users + + // add a policy and check that it is part of returned permission after re fetch + $handler->addPolicy( + $obj->id, + new Policy( + array( + 'module' => 'Foo', + 'function' => 'Bar', + 'limitations' => array( 'Limit' => array( 'Test' ) ) + ) + ) + ); + $list = $handler->loadRolesByGroupId( 4 ); + $this->assertEquals( 1, count( $list ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $list[0] ); + $role = $list[0]; + $this->assertEquals( 'Foo', $role->policies[3]->module ); + $this->assertEquals( 'Bar', $role->policies[3]->function ); + $this->assertEquals( array( 'Test' ), $role->policies[3]->limitations['Limit'] ); + } + + /** + * Test loadRolesByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRolesByGroupId + */ + public function testLoadRolesByGroupIdEmpty() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $list = $handler->loadRolesByGroupId( 42 ); + $this->assertEquals( 0, count( $list ) ); + $this->assertEquals( array(), $list ); + } + + /** + * Test loadRolesByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRolesByGroupId + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadRolesByGroupIdNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->loadRolesByGroupId( 999 ); + } + + /** + * Test loadRolesByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRolesByGroupId + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadRolesByGroupIdNotFoundWithCorrectType() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->loadRolesByGroupId( 1 ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsByGroupId() + { + $handler = $this->persistenceHandler->userHandler(); + + $this->assertEquals( + array( + new RoleAssignment( + array( + 'role' => $handler->loadRole( 1 ), + 'contentId' => 11, + 'limitationIdentifier' => null, + 'values' => null + ) + ) + ), + $handler->loadRoleAssignmentsByGroupId( 11 ) + ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $list = $handler->loadRoleAssignmentsByGroupId( 999 ); + $this->assertEquals( array(), $list ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsInherited() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + + $list = $handler->loadRoleAssignmentsByGroupId( 10, true );// 10: Anonymous User + $this->assertEquals( 0, count( $list ) ); + + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $list = $handler->loadRoleAssignmentsByGroupId( 10, true );// 10: Anonymous User + $this->assertEquals( 1, count( $list ) ); + + // add a policy and check that it is part of returned permission after re fetch + $handler->addPolicy( + $obj->id, + new Policy( + array( + 'module' => 'Foo', + 'function' => 'Bar', + 'limitations' => array( 'Limit' => array( 'Test' ) ) + ) + ) + ); + $list = $handler->loadRoleAssignmentsByGroupId( 10, true ); + $this->assertEquals( 1, count( $list ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\RoleAssignment', $list[0] ); + $this->assertEquals( $obj->id, $list[0]->role->id ); + $this->assertEquals( 42, $list[0]->contentId ); + $this->assertEquals( null, $list[0]->limitationIdentifier ); + $this->assertEquals( null, $list[0]->values ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsInheritedDeep() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $role = new Role(); + $role->identifier = 'test2'; + + // @todo uncomment when support for multilingual names and descriptions is added + // $role->name = array( 'eng-GB' => 'Test2' ); + // $role->description = array( 'eng-GB' => 'Test2 role' ); + + $role->policies = array( + new Policy( array( 'module' => 'tag', 'function' => '*', 'limitations' => '*' ) ), + ); + $obj = $handler->createRole( $role ); + $handler->assignRole( 4, $obj->id );// 4: Users + + $list = $handler->loadRoleAssignmentsByGroupId( 10, true );// 10: Anonymous User + $this->assertEquals( 2, count( $list ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\RoleAssignment', $list[1] ); + $this->assertEquals( $obj->id, $list[1]->role->id ); + $this->assertEquals( 4, $list[1]->contentId ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsInheritedDuplicates() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $handler->assignRole( 4, $obj->id, array( 'Section' => array( 1 ) ) );// 4: Users + $handler->assignRole( 4, $obj->id );// 4: Users + $handler->assignRole( 4, $obj->id, array( 'Section' => array( 2 ) ) );// 4: Users + + $list = $handler->loadRoleAssignmentsByGroupId( 10, true );// 10: Anonymous User + $this->assertEquals( 2, count( $list ), "Duplicate RoleAssignments should be merged" ); + $this->assertEquals( $obj->id, $list[0]->role->id ); + $this->assertEquals( null, $list[0]->limitationIdentifier ); + $this->assertEquals( null, $list[0]->values ); + $this->assertEquals( $obj->id, $list[1]->role->id ); + $this->assertEquals( null, $list[1]->limitationIdentifier ); + $this->assertEquals( null, $list[1]->values ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsInheritedNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $list = $handler->loadRoleAssignmentsByGroupId( 999, true ); + $this->assertEquals( array(), $list ); + } + + /** + * Test loadRoleAssignmentsByGroupId function + * + * Make sure several policies that have same values are not merged (when not same entity) + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadRoleAssignmentsByGroupId + */ + public function testLoadRoleAssignmentsInheritedWithSameValueRoleAssignments() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $role = new Role(); + $role->identifier = 'test2'; + + // @todo uncomment when support for multilingual names and descriptions is added + // $role->name = array( 'eng-GB' => 'Test2' ); + // $role->description = array( 'eng-GB' => 'Test2 role' ); + + $role->policies = array( + new Policy( + array( + 'module' => $obj->policies[2]->module, + 'function' => $obj->policies[2]->function, + 'limitations' => $obj->policies[2]->limitations, + ) + ), + ); + $obj = $handler->createRole( $role ); + $handler->assignRole( 4, $obj->id );// 4: Users + + $list = $handler->loadRoleAssignmentsByGroupId( 10, true );// 10: Anonymous User + $this->assertEquals( 2, count( $list ) ); + } + + /** + * Test update function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::updateRole + */ + public function testUpdateRole() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $id = $obj->id; + + $struct = new RoleUpdateStruct(); + $struct->id = $id; + $struct->identifier = $obj->identifier; + + // @todo uncomment when support for multilingual names and descriptions is added + // $struct->name = array( 'eng-GB' => 'newName' ); + // $struct->description = $obj->description; + + $handler->updateRole( $struct ); + $obj = $handler->loadRole( $id ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( $id, $obj->id ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $this->assertEquals( array( 'eng-GB' => 'newName' ), $obj->name ); + + $this->assertEquals( 3, count( $obj->policies ) ); + } + + /** + * Test delete function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::deleteRole + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testDeleteRole() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $handler->loadRole( 1 ) ); + + $handler->deleteRole( 1 ); + $handler->loadRole( 1 );//exception + } + + /** + * Test addPolicy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::addPolicy + */ + public function testAddPolicy() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( 3, count( $obj->policies ) ); + $id = $obj->id; + + $handler->addPolicy( + $id, + new Policy( + array( + 'module' => 'Foo', + 'function' => 'Bar', + 'limitations' => array( 'Limit' => array( 'Test' ) ) + ) + ) + ); + $obj = $handler->loadRole( $id ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( 4, count( $obj->policies ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Policy', $obj->policies[3] ); + $this->assertEquals( 'Foo', $obj->policies[3]->module ); + $this->assertEquals( $id, $obj->policies[3]->roleId ); + $this->assertEquals( 'Bar', $obj->policies[3]->function ); + $this->assertEquals( 1, count( $obj->policies[3]->limitations ) ); + $this->assertEquals( array( 'Test' ), $obj->policies[3]->limitations['Limit'] ); + } + + /** + * Test updatePolicy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::updatePolicy + */ + public function testUpdatePolicy() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( 3, count( $obj->policies ) ); + $this->assertEquals( 'content', $obj->policies[0]->module ); + $this->assertEquals( 'write', $obj->policies[0]->function ); + $this->assertEquals( array( 'SubTree' => array( '/1/2/' ) ), $obj->policies[0]->limitations ); + + $id = $obj->id; + $policy = $obj->policies[0]; + $policy->limitations = array( 'Node' => array( 2, 45 ) ); + $handler->updatePolicy( $policy ); + + $obj = $handler->loadRole( $id ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( 3, count( $obj->policies ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Policy', $obj->policies[0] ); + $this->assertEquals( 'content', $obj->policies[0]->module ); + $this->assertEquals( 'write', $obj->policies[0]->function ); + $this->assertEquals( array( 'Node' => array( 2, 45 ) ), $obj->policies[0]->limitations ); + } + + /** + * Test removePolicy function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::removePolicy + */ + public function testRemovePolicy() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( 3, count( $obj->policies ) ); + $id = $obj->id; + + $handler->removePolicy( $id, $obj->policies[2]->id ); + $obj = $handler->loadRole( $id ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Role', $obj ); + $this->assertEquals( 2, count( $obj->policies ) ); + } + + /** + * Test assignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::assignRole + */ + public function testAssignRole() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $roleAssignments = $handler->loadRoleAssignmentsByGroupId( 42 ); + // See if our role was properly assigned to the user group + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment->role->id == $obj->id ) + return; + } + + $this->fail( 'Role was not properly assigned to User Group with id: 42' ); + } + + /** + * Test assignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::assignRole + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testAssignRoleWrongGroupType() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 1, $obj->id ); + } + + /** + * Test assignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::assignRole + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testAssignRoleGroupNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 999, $obj->id ); + } + + /** + * Test assignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::assignRole + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testAssignRoleRoleNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->assignRole( 42, 999 ); + } + + /** + * Test unAssignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::unAssignRole + */ + public function testUnAssignRole() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $roleAssignments = $handler->loadRoleAssignmentsByGroupId( 42 ); + // See if our role was properly assigned to the user group + $roleAssigned = false; + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment->role->id == $obj->id ) + $roleAssigned = true; + } + + if ( !$roleAssigned ) + { + $this->fail( 'Role was not properly assigned to User Group with id: 42' ); + } + + $handler->unAssignRole( 42, $obj->id );// 42: Anonymous Users + + $roleAssignments = $handler->loadRoleAssignmentsByGroupId( 42 ); + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment->role->id == $obj->id ) + $this->fail( 'Role was not unassigned from User Group with id: 42' ); + } + } + + /** + * Test unAssignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::unAssignRole + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testUnAssignRoleWrongGroupType() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->unAssignRole( 1, $obj->id ); + } + + /** + * Test unAssignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::unAssignRole + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testUnAssignRoleGroupNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->unAssignRole( 999, $obj->id ); + } + + /** + * Test unAssignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::unAssignRole + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testUnAssignRoleRoleNotFound() + { + $handler = $this->persistenceHandler->userHandler(); + $handler->unAssignRole( 42, 999 ); + } + + /** + * Test unAssignRole function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::unAssignRole + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUnAssignRoleNotAssigned() + { + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->unAssignRole( 42, $obj->id );// 42: Anonymous Users + } + + /** + * Test loadPoliciesByUserId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadPoliciesByUserId + */ + public function testLoadPoliciesByUserId() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $list = $handler->loadPoliciesByUserId( 10 );// 10: Anonymous User + $this->assertEquals( 3, count( $list ) ); + + // add a policy and check that it is part of returned permission after re fetch + $handler->addPolicy( + $obj->id, + new Policy( + array( + 'module' => 'Foo', + 'function' => 'Bar', + 'limitations' => array( 'Limit' => array( 'Test' ) ) + ) + ) + ); + $list = $handler->loadPoliciesByUserId( 10 ); + $this->assertEquals( 4, count( $list ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Policy', $list[3] ); + $this->assertEquals( 'Foo', $list[3]->module ); + $this->assertEquals( 'Bar', $list[3]->function ); + $this->assertEquals( array( 'Test' ), $list[3]->limitations['Limit'] ); + } + + /** + * Test loadPoliciesByUserId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadPoliciesByUserId + */ + public function testLoadPoliciesByUserIdDeep() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $role = new Role(); + $role->identifier = 'test2'; + + // @todo uncomment when support for multilingual names and descriptions is added + // $role->name = array( 'eng-GB' => 'Test2' ); + // $role->description = array( 'eng-GB' => 'Test2 role' ); + + $role->policies = array( + new Policy( array( 'module' => 'tag', 'function' => '*', 'limitations' => '*' ) ), + ); + $obj = $handler->createRole( $role ); + $handler->assignRole( 4, $obj->id );// 4: Users + + $list = $handler->loadPoliciesByUserId( 10 );// 10: Anonymous User + $this->assertEquals( 4, count( $list ) ); + $this->assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\User\\Policy', $list[3] ); + $this->assertEquals( 'tag', $list[3]->module ); + $this->assertEquals( '*', $list[3]->function ); + $this->assertEquals( '*', $list[3]->limitations ); + } + + /** + * Test loadPoliciesByUserId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadPoliciesByUserId + */ + public function testLoadPoliciesByUserIdDuplicates() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $handler->assignRole( 4, $obj->id );// 4: Users + + $list = $handler->loadPoliciesByUserId( 10 );// 10: Anonymous User + $this->assertEquals( 3, count( $list ) ); + } + + /** + * Test loadPoliciesByUserId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadPoliciesByUserId + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadPoliciesByUserIdNotFound() + { + $this->persistenceHandler->userHandler()->loadPoliciesByUserId( 999 ); + } + + /** + * Test loadPoliciesByUserId function + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadPoliciesByUserId + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadPoliciesByUserIdNotFoundWithType() + { + $this->persistenceHandler->userHandler()->loadPoliciesByUserId( 42 );// 42: Anonymous Users (user group) + } + + /** + * Test loadPoliciesByUserId function + * + * Make sure several policies that have same values are not merged (when not same entity) + * + * @covers eZ\Publish\Core\Persistence\InMemory\UserHandler::loadPoliciesByUserId + */ + public function testLoadPoliciesByUserIdWithSameValuePolicies() + { + $this->clearRolesByGroupId( 42 ); + + $handler = $this->persistenceHandler->userHandler(); + $obj = $handler->createRole( self::getRole() ); + $handler->assignRole( 42, $obj->id );// 42: Anonymous Users + + $role = new Role(); + $role->identifier = 'test2'; + + // @todo uncomment when support for multilingual names and descriptions is added + // $role->name = array( 'eng-GB' => 'Test2' ); + // $role->description = array( 'eng-GB' => 'Test2 role' ); + + $role->policies = array( + new Policy( + array( + 'module' => $obj->policies[2]->module, + 'function' => $obj->policies[2]->function, + 'limitations' => $obj->policies[2]->limitations, + ) + ), + ); + $obj = $handler->createRole( $role ); + $handler->assignRole( 4, $obj->id );// 4: Users + + $list = $handler->loadPoliciesByUserId( 10 );// 10: Anonymous User + $this->assertEquals( 4, count( $list ) ); + } + + /** + * Create Role with content/write/SubTree:/1/2/, content/read/* and user/*\/* policy + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + protected static function getRole() + { + $role = new Role(); + $role->identifier = 'test'; + + // @todo uncomment when support for multilingual names and descriptions is added + // $role->name = array( 'eng-GB' => 'Test' ); + // $role->description = array( 'eng-GB' => 'Test role' ); + + $role->policies = array( + new Policy( array( 'module' => 'content', 'function' => 'write', 'limitations' => array( 'SubTree' => array( '/1/2/' ) ) ) ), + new Policy( array( 'module' => 'content', 'function' => 'read', 'limitations' => '*' ) ), + new Policy( array( 'module' => 'user', 'function' => '*', 'limitations' => '*' ) ), + ); + return $role; + } + + /** + * Clear all roles (and policies) assignments on a user group + * + * @param mixed $groupId + */ + protected function clearRolesByGroupId( $groupId ) + { + $handler = $this->persistenceHandler->userHandler(); + foreach ( $handler->loadRolesByGroupId( $groupId ) as $role ) + { + $handler->unAssignRole( $groupId, $role->id ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/TrashHandler.php b/eZ/Publish/Core/Persistence/InMemory/TrashHandler.php new file mode 100644 index 0000000..d6e2a51 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/TrashHandler.php @@ -0,0 +1,171 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function loadTrashItem( $id ) + { + return $this->backend->load( 'Content\\Location\\Trashed', $id ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + * @todo Handle field types actions + */ + public function trashSubtree( $locationId ) + { + $location = $this->handler->locationHandler()->load( $locationId ); + $subtreeLocations = $this->backend->find( + 'Content\\Location', + array( 'pathString' => $location->pathString . '%' ) + ); + $isLocationRemoved = false; + $parentLocationId = null; + + $subtreeLocations[] = $location; + foreach ( $subtreeLocations as $location ) + { + if ( $location->id == $locationId ) + { + $parentLocationId = $location->parentId; + } + + if ( count( $this->backend->find( 'Content\\Location', array( 'contentId' => $location->contentId ) ) ) == 1 ) + { + $this->backend->delete( 'Content\\Location', $location->id ); + $this->backend->create( 'Content\\Location\\Trashed', (array)$location, false ); + } + else + { + if ( $location->id == $locationId ) + { + $isLocationRemoved = true; + } + $this->backend->delete( 'Content\\Location', $location->id ); + $remainingLocations = $this->backend->find( 'Content\\Location', array( 'contentId' => $location->contentId ) ); + $this->backend->updateByMatch( + 'Content\\Location', + array( 'contentId' => $location->contentId ), + array( 'mainLocationId' => $remainingLocations[0]->id ) + ); + } + } + + return $isLocationRemoved ? null : $this->loadTrashItem( $locationId ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + * @todo Handle field types actions + */ + public function recover( $trashedId, $newParentId ) + { + $trashedLocation = $this->loadTrashItem( $trashedId ); + $newParent = $this->handler->locationHandler()->load( $newParentId ); + + // Restore location under $newParent + $struct = new CreateStruct; + foreach ( $struct as $property => $value ) + { + if ( isset( $trashedLocation->$property ) ) + { + $struct->$property = $trashedLocation->$property; + } + } + + $struct->parentId = $newParent->id; + return $this->handler->locationHandler()->create( $struct )->id; + } + + /** + * Limited implementation (no criterion/sort support). + * Will return all trashed locations, regardless criterion filter or sort clauses provided. + * Offset/Limit is however supported + * + * @see eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function findTrashItems( Criterion $criterion = null, $offset = 0, $limit = null, array $sort = null ) + { + return array_slice( + $this->backend->find( 'Content\\Location\\Trashed' ), + $offset, + $limit + ); + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function emptyTrash() + { + $trashedIds = array(); + $contentIds = array(); + foreach ( $this->backend->find( 'Content\\Location\\Trashed' ) as $trashed ) + { + $trashedIds[] = $trashed->id; + $contentIds[] = $trashed->contentId; + } + + if ( !empty( $trashedIds ) ) + { + // Remove associated content for trashed locations + foreach ( $contentIds as $contentId ) + { + $this->handler->contentHandler()->deleteContent( $contentId ); + } + + // Remove trashed locations + $this->backend->deleteByMatch( 'Content\\Location\\Trashed', array( 'id' => $trashedIds ) ); + } + } + + /** + * @see eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function deleteTrashItem( $trashedId ) + { + $vo = $this->loadTrashItem( $trashedId ); + $this->handler->contentHandler()->deleteContent( $vo->contentId ); + $this->backend->delete( 'Content\\Location\\Trashed', $trashedId ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/UrlAliasHandler.php b/eZ/Publish/Core/Persistence/InMemory/UrlAliasHandler.php new file mode 100644 index 0000000..f55c840 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/UrlAliasHandler.php @@ -0,0 +1,864 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * This method creates or updates an urlalias from a new or changed content name in a language + * (if published). It also can be used to create an alias for a new location of content. + * On update the old alias is linked to the new one (i.e. a history alias is generated). + * + * $alwaysAvailable controls whether the url alias is accessible in all + * languages. + * + * @param mixed $locationId + * @param mixed $parentLocationId In case of empty( $parentLocationId ), threat as root + * @param string $name the new name computed by the name schema or url alias schema + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return void Does not return the UrlAlias created / updated with type URLAlias::LOCATION + */ + public function publishUrlAliasForLocation( $locationId, $parentLocationId, $name, $languageCode, $alwaysAvailable = false ) + { + // Get parent url alias + $parentLocationAlias = $this->loadAutogeneratedAlias( $parentLocationId ); + if ( !isset( $parentLocationAlias ) ) + { + throw new \RuntimeException( "Did not find any url alias for location: {$parentLocationId}" ); + } + $parentId = $parentLocationAlias->id["link"]; + $pathData = $parentLocationAlias->pathData; + $data = array( + 'parent' => $parentLocationAlias->id["link"], + 'type' => URLAlias::LOCATION, + 'destination' => $locationId, + 'pathData' => $pathData, + 'languageCodes' => array( $languageCode ), + 'alwaysAvailable' => $alwaysAvailable, + 'isHistory' => false, + 'isCustom' => false, + 'forward' => false, + ); + + $uniqueCounter = 1; + // Exiting the loop with break; + while ( true ) + { + $newText = $name . ( $uniqueCounter > 1 ? $uniqueCounter : "" ); + // Try to load possibly reusable alias + $reusableAlias = $this->loadAlias( $parentId, $newText ); + + if ( !isset( $reusableAlias ) ) + { + // Check for existing active location entry on this level and reuse it + $existingAlias = $this->loadAutogeneratedAlias( $locationId, $parentId ); + if ( isset( $existingAlias ) ) + { + $this->historizeAndUpdateExistingAlias( $data, $existingAlias, $languageCode, $newText, $alwaysAvailable ); + } + else + { + $this->createNewAlias( $this->getNextLinkId(), $data, $languageCode, $newText, $alwaysAvailable ); + } + + break; + } + + // Possibly reusable alias exists, check if it is reusable + if ( $reusableAlias->type == URLAlias::VIRTUAL + || ( $reusableAlias->type == URLAlias::LOCATION && $reusableAlias->destination == $locationId ) + || $reusableAlias->isHistory ) + { + // Check for existing active location entry on this level and reuse it + $existingAlias = $this->loadAutogeneratedAlias( $locationId, $parentId ); + if ( isset( $existingAlias ) ) + { + $this->historizeAndUpdateExistingAlias( $data, $existingAlias, $languageCode, $newText, $alwaysAvailable ); + + if ( $existingAlias->id["link"] != $reusableAlias->id["link"] ) + { + $this->downgrade( $reusableAlias, $languageCode ); + } + } + else + { + $this->downgrade( $reusableAlias, $languageCode ); + $this->createNewAlias( $reusableAlias->id["link"], $data, $languageCode, $newText, $alwaysAvailable ); + } + + break; + } + + // If existing row is not reusable, increment $uniqueCounter and try again + $uniqueCounter += 1; + } + } + + /** + * Creates new alias. + * + * @param mixed $linkId + * @param array $data + * @param string $languageCode + * @param string $name + * @param boolean $alwaysAvailable + * + * @return void + */ + public function createNewAlias( $linkId, $data, $languageCode, $name, $alwaysAvailable ) + { + $data["link"] = $linkId; + $data["pathData"][] = array( + 'always-available' => $alwaysAvailable, + 'translations' => array( + $languageCode => $name + ) + ); + $this->backend->create( 'Content\\UrlAlias', $data ); + } + + /** + * Updates existing location alias and creates history if necessary. + * + * @param array $data + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias $existingAlias + * @param string $languageCode + * @param string $name + * @param boolean $alwaysAvailable + * + * @return void + */ + protected function historizeAndUpdateExistingAlias( $data, $existingAlias, $languageCode, $name, $alwaysAvailable ) + { + $existingTranslation = $this->getTranslation( $existingAlias, $languageCode ); + // Do not historize letter case changes + if ( isset( $existingTranslation ) && strcasecmp( $name, $existingTranslation ) !== 0 ) + { + $this->historize( $existingAlias, $languageCode ); + } + + $pathData = $existingAlias->pathData; + $lastPathElementData = end( $pathData ); + $lastPathElementData["always-available"] = $alwaysAvailable; + $lastPathElementData["translations"][$languageCode] = $name; + $data["pathData"][] = $lastPathElementData; + if ( !in_array( $languageCode, $data["languageCodes"] ) ) + { + $data["languageCodes"][] = $languageCode; + } + $data["alwaysAvailable"] = $alwaysAvailable; + + $this->backend->update( 'Content\\UrlAlias', $existingAlias->id["id"], $data ); + } + + /** + * Returns translation in given $languageCode or null if it does not exist. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias $urlAlias + * @param string $languageCode + * + * @return string|null + */ + protected function getTranslation( $urlAlias, $languageCode ) + { + $lastIndex = count( $urlAlias->pathData ) - 1; + if ( isset( $urlAlias->pathData[$lastIndex]["translations"][$languageCode] ) ) + { + return $urlAlias->pathData[$lastIndex]["translations"][$languageCode]; + } + + return null; + } + + /** + * Remove translation in given $languageCode from alias or delete alias if given translation is the last one. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias $urlAlias + * @param string $languageCode + * + * @return void + */ + protected function downgrade( $urlAlias, $languageCode ) + { + $urlAlias = clone $urlAlias; + $lastIndex = count( $urlAlias->pathData ) - 1; + unset( $urlAlias->pathData[$lastIndex]["translations"][$languageCode] ); + + if ( empty( $urlAlias->pathData[$lastIndex]["translations"] ) ) + { + $urlAlias->languageCodes = array_diff( $urlAlias->languageCodes, array( $languageCode ) ); + $this->backend->update( + 'Content\\UrlAlias', + $urlAlias->id["id"], + array( + 'pathData' => $urlAlias->pathData, + 'languageCodes' => $urlAlias->languageCodes + ) + ); + } + else + { + $this->backend->delete( 'Content\\UrlAlias', $urlAlias->id ); + } + } + + /** + * Creates history for one translation. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias $urlAlias + * @param string $languageCode + * + * @return void + */ + protected function historize( $urlAlias, $languageCode ) + { + $data = (array)$urlAlias; + $lastIndex = count( $data["pathData"] ) - 1; + $data["pathData"][$lastIndex]["translations"] = array( + $languageCode => $data["pathData"][$lastIndex]["translations"][$languageCode] + ); + $data["languageCodes"] = array( $languageCode ); + $data["isHistory"] = true; + + $this->backend->update( 'Content\\UrlAlias', $urlAlias->id["id"], $data ); + } + + /** + * Create a user chosen $alias pointing to $locationId in $languageCode. + * + * If $languageCode is null the $alias is created in the system's default + * language. $alwaysAvailable makes the alias available in all languages. + * + * @param mixed $locationId + * @param string $path + * @param boolean $forwarding + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function createCustomUrlAlias( $locationId, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ) + { + return $this->createUrlAlias( + "eznode:" . $locationId, + $path, + $forwarding, + $languageCode, + $alwaysAvailable + ); + } + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * + * If $languageCode is null the $alias is created in the system's default + * language. $alwaysAvailable makes the alias available in all languages. + * + * @throws \eZ\Publish\API\Repository\Exceptions\ForbiddenException if the path already exists for the given language + * + * @param string $resource + * @param string $path + * @param boolean $forwarding + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function createGlobalUrlAlias( $resource, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ) + { + return $this->createUrlAlias( + $resource, + $path, + $forwarding, + $languageCode, + $alwaysAvailable + ); + } + + /** + * Internal method for creating global or custom URL alias (these are handled in the same way) + * + * @throws \eZ\Publish\Core\Base\Exceptions\ForbiddenException if the path already exists for the given language + * + * @param string $resource + * @param string $path + * @param boolean $forwarding + * @param string|null $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias With $type = URLAlias::RESOURCE + */ + protected function createUrlAlias( $resource, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ) + { + if ( $languageCode === null ) + $languageCode = 'eng-GB';// @todo Reuse settings used in Service layer here + + $pathArray = explode( '/', $path ); + $pathCount = count( $pathArray ); + $pathData = array(); + $parentId = 0; + foreach ( $pathArray as $index => $pathItem ) + { + if ( $index + 1 !== $pathCount ) + { + $existingAlias = $this->loadAlias( $parentId, $pathItem ); + if ( !isset( $existingAlias ) ) + { + $pathData[] = array( + 'always-available' => true, + 'translations' => array( 'always-available' => $pathItem ) + ); + $virtualAlias = $this->backend->create( + 'Content\\UrlAlias', + array( + 'parent' => $parentId, + 'link' => $this->getNextLinkId(), + 'type' => URLAlias::VIRTUAL, + 'destination' => null, + 'pathData' => $pathData, + 'languageCodes' => array(), + 'alwaysAvailable' => true, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => true, + ) + ); + $parentId = $virtualAlias->id["link"]; + } + else + { + $parentId = $existingAlias->id["link"]; + $pathData = $existingAlias->pathData; + } + } + else + { + $pathData[] = array( + 'always-available' => $alwaysAvailable, + 'translations' => array( $languageCode => $pathItem ) + ); + } + } + + preg_match( "#^([a-zA-Z0-9_]+):(.+)?$#", $resource, $matches ); + $data = array( + 'parent' => $parentId, + 'link' => $this->getNextLinkId(), + 'type' => $matches[1] === "eznode" ? URLAlias::LOCATION : URLAlias::RESOURCE, + 'destination' => isset( $matches[2] ) ? $matches[2] : false, + 'pathData' => $pathData, + 'languageCodes' => array( $languageCode ), + 'alwaysAvailable' => $alwaysAvailable, + 'isHistory' => false, + 'isCustom' => true, + 'forward' => $forwarding, + ); + $reusableAlias = $this->loadAlias( $parentId, $pathItem ); + + if ( !isset( $reusableAlias ) ) + { + $alias = $this->backend->create( 'Content\\UrlAlias', $data ); + } + else if ( $reusableAlias->type == URLAlias::VIRTUAL || $reusableAlias->isHistory ) + { + $this->downgrade( $reusableAlias, $languageCode ); + $alias = $this->backend->create( 'Content\\UrlAlias', $data ); + } + else + { + throw new ForbiddenException( "Path '$path' already exists for the given language" ); + } + + $alias->id = $alias->id["parent"] . "-" . $this->getHash( $pathItem ); + + return $alias; + } + + /** + * Loads alias by given $parentId and $text. + * + * @param mixed $parentId + * @param string $text + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias|null + */ + protected function loadAlias( $parentId, $text ) + { + $list = $this->backend->find( 'Content\\UrlAlias', array( 'parent' => $parentId ) ); + + $filteredList = array(); + foreach ( $list as $alias ) + { + $pathData = end( $alias->pathData ); + foreach ( $pathData["translations"] as $translation ) + { + if ( strcasecmp( $text, $translation ) === 0 ) + { + $filteredList[] = $alias; + break; + } + } + } + + if ( isset( $filteredList[1] ) ) + { + throw new \RuntimeException( + "Found more then 1 url alias for the parent '{$parentId}' and text '{$text}'" + ); + } + + return isset( $filteredList[0] ) ? $filteredList[0] : null; + } + + /** + * List global aliases. + * + * @param string|null $languageCode + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function listGlobalURLAliases( $languageCode = null, $offset = 0, $limit = -1 ) + { + $filter = array( + 'type' => URLAlias::RESOURCE, + 'isHistory' => false, + 'isCustom' => true + ); + + if ( $languageCode !== null ) + $filter['languageCodes'] = $languageCode; + + $list = $this->backend->find( + 'Content\\UrlAlias', + $filter + ); + + if ( !empty( $list ) && !( $offset === 0 && $limit === -1 ) ) + { + $list = array_slice( $list, $offset, ( $limit === -1 ? null : $limit ) ); + } + + foreach ( $list as &$alias ) + { + $pathData = end( $alias->pathData ); + $alias->id = $alias->id["parent"] . "-" . $this->getHash( reset( $pathData["translations"] ) ); + } + + return $list; + } + + /** + * List of url entries of $urlType, pointing to $locationId. + * + * @param mixed $locationId + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function listURLAliasesForLocation( $locationId, $custom = false ) + { + $list = $this->backend->find( + 'Content\\UrlAlias', + array( + 'destination' => $locationId, + 'type' => URLAlias::LOCATION, + 'isCustom' => $custom, + 'isHistory' => false + ) + ); + + $expanded = array(); + foreach ( $list as $alias ) + { + $expanded = array_merge( $expanded, $this->expandAlias( $alias ) ); + } + + return $expanded; + } + + /** + * Expands given $alias to array of new aliases for each different translation. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias $alias + * + * @return array + */ + protected function expandAlias( $alias ) + { + // extract names + $names = array(); + $pathData = end( $alias->pathData ); + foreach ( $pathData["translations"] as $text ) + { + $names[$text] = true; + } + + // expand + $expanded = array(); + foreach ( $names as $name => $dummy ) + { + $cloned = clone $alias; + $cloned->id = $cloned->id["parent"] . "-" . $this->getHash( $name ); + $expanded[] = $cloned; + } + + return $expanded; + } + + /** + * Removes url aliases. + * + * Autogenerated aliases are not removed by this method. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias[] $urlAliases + * + * @return boolean + */ + public function removeURLAliases( array $urlAliases ) + { + foreach ( $urlAliases as $index => $urlAlias ) + { + if ( !$urlAlias instanceof UrlAlias ) + throw new \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException( "\$urlAliases[$index]", 'Expected UrlAlias instance' ); + + if ( !$urlAlias->isCustom ) + continue; + + $this->backend->delete( 'Content\\UrlAlias', $urlAlias->id ); + } + } + + /** + * Looks up a url alias for the given url + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $url + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function lookup( $url ) + { + $paths = explode( '/', $url ); + + /** + * @var \eZ\Publish\SPI\Persistence\Content\UrlAlias[] $urlAliases + */ + $urlAliases = array_reverse( $this->backend->find( 'Content\\UrlAlias' ), true ); + foreach ( $urlAliases as $urlAlias ) + { + foreach ( $paths as $index => $path ) + { + // skip if url alias does not have this depth + if ( empty( $urlAlias->pathData[$index]['translations'] ) ) + continue 2; + + // check path against translations in a case in-sensitive manner + $match = false; + foreach ( $urlAlias->pathData[$index]['translations'] as $translatedPath ) + { + if ( strcasecmp( $path, $translatedPath ) === 0 ) + { + $match = true; + break; + } + } + + if ( !$match ) + continue 2; + } + + // skip if url alias has paths on a deeper depth then what $url has + if ( isset( $urlAlias->pathData[$index + 1]['translations'] ) ) + continue; + + // This urlAlias seems to match, return it + $urlAlias->id = $urlAlias->id["parent"] . "-" . $this->getHash( $translatedPath ); + return $urlAlias; + } + + throw new NotFoundException( 'UrlAlias', $url ); + } + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function loadUrlAlias( $id ) + { + return $this->backend->load( 'Content\\UrlAlias', $id ); + } + + /** + * Notifies the underlying engine that a location has moved. + * + * This method triggers the change of the autogenerated aliases + * + * @param mixed $locationId + * @param mixed $oldParentId + * @param mixed $newParentId + */ + public function locationMoved( $locationId, $oldParentId, $newParentId ) + { + // Get url alias for old parent location + $oldParentLocationAlias = $this->loadAutogeneratedAlias( $oldParentId ); + if ( !isset( $oldParentLocationAlias ) ) + { + throw new \RuntimeException( "Did not find any url alias for location: {$oldParentLocationAlias}" ); + } + // Get url alias for new parent location + $newParentLocationAlias = $this->loadAutogeneratedAlias( $newParentId ); + if ( !isset( $newParentLocationAlias ) ) + { + throw new \RuntimeException( "Did not find any url alias for location: {$newParentLocationAlias}" ); + } + // Get url alias for old location + $oldLocationAlias = $this->loadAutogeneratedAlias( $locationId, $oldParentLocationAlias->id["link"] ); + if ( !isset( $oldLocationAlias ) ) + { + throw new \RuntimeException( "Did not find any url alias for location: {$oldLocationAlias}" ); + } + + // Mark as history and use pathData form existing location + /** @var \eZ\Publish\SPI\Persistence\Content\UrlAlias[] $list */ + $this->backend->update( 'Content\\UrlAlias', $oldLocationAlias->id["id"], array( 'isHistory' => true ) ); + $pathItem = array_pop( $oldLocationAlias->pathData ); + + // Make path data based on new location and the original + $pathData = $newParentLocationAlias->pathData; + $pathData[] = $pathItem; + $pathIndex = count( $pathData ) - 1; + + // Create the new url alias object + $newAlias = $this->backend->create( + 'Content\\UrlAlias', + array( + 'parent' => $newParentLocationAlias->id["link"], + 'link' => $this->getNextLinkId(), + 'type' => URLAlias::LOCATION, + 'destination' => $locationId, + 'pathData' => $pathData, + 'languageCodes' => array_keys( $pathData[$pathIndex]['translations'] ), + 'alwaysAvailable' => $pathData[$pathIndex]['always-available'], + 'isHistory' => false, + 'isCustom' => false, + 'forward' => false, + ) + ); + + // Fetch old location children + $children = $this->backend->find( + 'Content\\UrlAlias', + array( + 'parent' => $oldParentLocationAlias->id["link"], + 'type' => URLAlias::LOCATION, + 'isHistory' => false, + 'isCustom' => false + ) + ); + + // @todo: this needs to recursively historize and copy (with updated path data) the complete subtree + // Reparent + foreach ( $children as $child ) + { + $this->backend->update( + 'Content\\UrlAlias', + $child->id["id"], + array( + 'parent' => $newAlias->id["link"] + ) + ); + } + } + + /** + * Loads autogenerated location alias for given $locationId, optionally limited by given $parentId. + * + * @throws \RuntimeException + * + * @param mixed $locationId + * @param null $parentId + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias|null + */ + protected function loadAutogeneratedAlias( $locationId, $parentId = null ) + { + $match = array( + 'destination' => $locationId, + 'type' => URLAlias::LOCATION, + 'isHistory' => false, + 'isCustom' => false + ); + if ( isset( $parentId ) ) + { + $match["parent"] = $parentId; + } + $list = $this->backend->find( 'Content\\UrlAlias', $match ); + + if ( isset( $list[1] ) ) + { + throw new \RuntimeException( 'Found more then 1 url alias pointing to same location: ' . $locationId ); + } + else if ( empty( $list ) ) + { + return null; + } + + return $list[0]; + } + + /** + * Notifies the underlying engine that a location has moved. + * + * This method triggers the creation of the autogenerated aliases for the copied locations + * + * @param mixed $locationId + * @param mixed $oldParentId + * @param mixed $newParentId + */ + public function locationCopied( $locationId, $oldParentId, $newParentId ) + { + // Get url alias for location + $list = $this->backend->find( + 'Content\\UrlAlias', + array( + 'destination' => $locationId, + 'type' => URLAlias::LOCATION, + 'isHistory' => false, + 'isCustom' => false + ) + ); + + if ( isset( $list[1] ) ) + throw new \RuntimeException( 'Found more then 1 url alias pointing to same location: ' . $locationId ); + else if ( empty( $list ) ) + throw new \RuntimeException( "Did not find any url alias for location: {$locationId}" ); + + // Use pathData from existing location + /** @var \eZ\Publish\SPI\Persistence\Content\UrlAlias[] $list */ + $pathItem = array_pop( $list[0]->pathData ); + + // Get url alias for new parent location + $list = $this->backend->find( + 'Content\\UrlAlias', + array( + 'destination' => $newParentId, + 'type' => URLAlias::LOCATION, + 'isHistory' => false, + 'isCustom' => false + ) + ); + + if ( isset( $list[1] ) ) + throw new \RuntimeException( 'Found more then 1 url alias pointing to same location: ' . $newParentId ); + else if ( empty( $list ) ) + throw new \RuntimeException( "Did not find any url alias for new parent location: {$newParentId}" ); + + // Make path data based on new location and the original + $pathData = $list[0]->pathData; + $pathData[] = $pathItem; + $pathIndex = count( $pathData ) - 1; + + // Create the new url alias object + $this->backend->create( + 'Content\\UrlAlias', + array( + 'parent' => $list[0]->id["link"], + 'link' => $this->getNextLinkId(), + 'type' => URLAlias::LOCATION, + 'destination' => $locationId, + 'pathData' => $pathData, + 'languageCodes' => array_keys( $pathData[$pathIndex]['translations'] ), + 'alwaysAvailable' => $pathData[$pathIndex]['always-available'], + 'isHistory' => false, + 'isCustom' => false, + 'forward' => false, + ) + ); + } + + /** + * Notifies the underlying engine that a location was deleted or moved to trash + * + * @param mixed $locationId + */ + public function locationDeleted( $locationId ) + { + $this->backend->deleteByMatch( 'Content\\UrlAlias', array( 'destination' => $locationId ) ); + } + + /** + * @param string $text + * + * @return string + */ + protected function getHash( $text ) + { + return md5( strtolower( $text ) ); + } + + /** + * Returns max found link id incremented by 1 + * + * @return int + */ + protected function getNextLinkId() + { + $list = $this->backend->find( 'Content\\UrlAlias' ); + + $id = 0; + foreach ( $list as $alias ) + { + $id = max( $id, $alias->id["link"] ); + } + return $id + 1; + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/UrlWildcardHandler.php b/eZ/Publish/Core/Persistence/InMemory/UrlWildcardHandler.php new file mode 100644 index 0000000..6ce64b9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/UrlWildcardHandler.php @@ -0,0 +1,107 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * Creates a new url wildcard + * + * @param string $sourceUrl + * @param string $destinationUrl + * @param boolean $forward + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function create( $sourceUrl, $destinationUrl, $forward = false ) + { + return $this->backend->create( + 'Content\\UrlWildcard', + array( + 'sourceUrl' => $sourceUrl, + 'destinationUrl' => $destinationUrl, + 'forward' => (bool)$forward + ) + ); + } + + /** + * removes an url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + */ + public function remove( $id ) + { + $this->backend->delete( 'Content\\UrlWildcard', $id ); + } + + /** + * Loads a url wild card + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function load( $id ) + { + return $this->backend->load( 'Content\\UrlWildcard', $id ); + } + + /** + * Loads all url wild card (paged) + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard[] + */ + public function loadAll( $offset = 0, $limit = -1 ) + { + $list = $this->backend->find( 'Content\\UrlWildcard' ); + + if ( empty( $list ) || ( $offset === 0 && $limit === -1 ) ) + return $list; + + return array_slice( $list, $offset, ( $limit === -1 ? null : $limit ) ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/UserHandler.php b/eZ/Publish/Core/Persistence/InMemory/UserHandler.php new file mode 100644 index 0000000..f260fb8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/UserHandler.php @@ -0,0 +1,715 @@ +handler = $handler; + $this->backend = $backend; + } + + /** + * Create a user + * + * The User struct used to create the user will contain an ID which is used + * to reference the user. + * + * @param \eZ\Publish\SPI\Persistence\User $user + * + * @throws LogicException If no id was provided or if it already exists + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function create( User $user ) + { + $userArr = (array)$user; + return $this->backend->create( 'User', $userArr, false ); + } + + /** + * Loads user with user ID. + * + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function load( $userId ) + { + return $this->backend->load( 'User', $userId ); + } + + /** + * Loads user with user login / email. + * + * @param string $login + * @param boolean $alsoMatchEmail Also match user email, caller must verify that $login is a valid email address. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no users are found + * + * @return \eZ\Publish\SPI\Persistence\User[] + */ + public function loadByLogin( $login, $alsoMatchEmail = false ) + { + $users = $this->backend->find( 'User', array( 'login' => $login ) ); + if ( !$alsoMatchEmail ) + { + if ( empty( $users ) ) + throw new NotFound( 'User', $login ); + + return $users; + } + + foreach ( $this->backend->find( 'User', array( 'email' => $login ) ) as $emailUser ) + { + foreach ( $users as $loginUser ) + { + if ( $emailUser->id === $loginUser->id ) + continue 2; + } + $users[] = $emailUser; + } + + if ( empty( $users ) ) + throw new NotFound( 'User', $login ); + + return $users; + } + + /** + * Update the user information specified by the user struct + * + * @param \eZ\Publish\SPI\Persistence\User $user + */ + public function update( User $user ) + { + $userArr = (array)$user; + $this->backend->update( 'User', $userArr['id'], $userArr ); + } + + /** + * Delete user with the given ID. + * + * @param mixed $userId + * + * @todo Throw on missing user? + */ + public function delete( $userId ) + { + $this->backend->delete( 'User', $userId ); + $this->backend->deleteByMatch( 'User\\RoleAssignment', array( 'contentId' => $userId ) ); + } + + /** + * Create new role + * + * @param \eZ\Publish\SPI\Persistence\User\Role $role + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function createRole( Role $role ) + { + if ( !$role->identifier ) + throw new InvalidArgumentValue( '$role->identifier', $role->identifier ); + + $roleArr = (array)$role; + $roleArr['policies'] = array(); + $newRole = $this->backend->create( 'User\\Role', $roleArr ); + foreach ( $role->policies as $policy ) + { + $newRole->policies[] = $this->addPolicy( $newRole->id, $policy ); + } + return $newRole; + } + + /** + * Loads a specified role by id + * + * @param mixed $roleId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If role is not found + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function loadRole( $roleId ) + { + $list = $this->backend->find( + 'User\\Role', + array( 'id' => $roleId ), + array( + 'policies' => array( + 'type' => 'User\\Policy', + 'match' => array( 'roleId' => 'id' ) + ) + ) + ); + if ( !$list ) + throw new NotFound( 'User\\Role', $roleId ); + + return $list[0]; + } + + /** + * Loads a specified role by $identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If role is not found + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function loadRoleByIdentifier( $identifier ) + { + $list = $this->backend->find( + 'User\\Role', + array( 'identifier' => $identifier ), + array( + 'policies' => array( + 'type' => 'User\\Policy', + 'match' => array( 'roleId' => 'id' ) + ) + ) + ); + if ( !$list ) + throw new NotFound( 'User\\Role', $identifier ); + + return $list[0]; + } + + /** + * Loads all roles + * + * @return \eZ\Publish\SPI\Persistence\User\Role[] + */ + public function loadRoles() + { + return $this->backend->find( + 'User\\Role', + array(), + array( + 'policies' => array( + 'type' => 'User\\Policy', + 'match' => array( 'roleId' => 'id' ) + ) + ) + ); + } + + /** + * Loads roles assigned to a user/group + * + * @param mixed $groupId + * + * @return \eZ\Publish\SPI\Persistence\User\Role[] + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If user (it's content object atm) is not found + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group is not of user_group Content Type + */ + public function loadRolesByGroupId( $groupId ) + { + $content = $this->backend->load( 'Content\\ContentInfo', $groupId ); + + if ( !$content ) + throw new NotFound( 'Group', $groupId ); + if ( $content->contentTypeId != 3 && $content->contentTypeId != 4 ) + throw new NotFound( "Content", $groupId ); + + return $this->backend->find( + 'User\\Role', + array( 'groupIds' => $groupId ), + array( + 'policies' => array( + 'type' => 'User\\Policy', + 'match' => array( 'roleId' => 'id' ) + ) + ) + ); + } + + /** + * Loads roles assignments Role + * + * Role Assignments with same roleId and limitationIdentifier will be merged together into one. + * + * @param mixed $roleId + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function loadRoleAssignmentsByRoleId( $roleId ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Loads roles assignments to a user/group + * + * Role Assignments with same roleId and limitationIdentifier will be merged together into one. + * + * @param mixed $groupId In legacy storage engine this is the content object id roles are assigned to in ezuser_role. + * By the nature of legacy this can currently also be used to get by $userId. + * @param boolean $inherit If true also return inherited role assignments from user groups. + * + * @throws \LogicException Internal data corruption error + * @uses getRoleAssignmentForContent() + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function loadRoleAssignmentsByGroupId( $groupId, $inherit = false ) + { + if ( $inherit === false ) + return $this->getRoleAssignmentForContent( array( $groupId ) ); + + $contentIds = array( $groupId ); + $locations = $this->handler->locationHandler()->loadLocationsByContent( $groupId ); + if ( empty( $locations ) ) + return array(); + + // crawl up path on all locations + foreach ( $locations as $location ) + { + $parentIds = array_reverse( explode( '/', trim( $location->pathString, '/' ) ) ); + foreach ( $parentIds as $parentId ) + { + if ( $parentId == $location->id ) + continue; + + $location = $this->backend->load( 'Content\\Location', $parentId ); + $list = $this->backend->find( + 'Content', + array( 'id' => $location->contentId ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ), + ) + ); + + if ( isset( $list[1] ) ) + throw new LogicException( "'content tree' logic error, there is more than one item with parentId: $parentId" ); + if ( $list ) + $contentIds[] = $list[0]->versionInfo->contentInfo->id; + } + } + + return $this->getRoleAssignmentForContent( $contentIds ); + } + + /** + * @param array $contentIds + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + protected function getRoleAssignmentForContent( array $contentIds ) + { + /** fetch possible roles assigned to this object + * @var \eZ\Publish\SPI\Persistence\User\RoleAssignment[] $list + */ + $list = $this->backend->find( + 'User\\RoleAssignment', + array( 'contentId' => $contentIds ), + array( + 'role' => array( + 'type' => 'User\\Role', + 'match' => array( 'id' => '_roleId' ), + 'single' => true, + 'sub' => array( + 'policies' => array( + 'type' => 'User\\Policy', + 'match' => array( 'roleId' => 'id' ) + ) + ) + ) + ) + ); + + // merge policies + $data = array(); + foreach ( $list as $new ) + { + // if user already have full access to a role, continue + if ( isset( $data[$new->role->id][$new->contentId] ) + && $data[$new->role->id][$new->contentId] instanceof RoleAssignment ) + continue; + + if ( !empty( $new->limitationIdentifier ) ) + { + if ( !isset( $data[$new->role->id][$new->contentId][$new->limitationIdentifier] ) ) + { + $new->values = array( $new->values ); + $data[$new->role->id][$new->contentId][$new->limitationIdentifier] = $new; + } + // merge limitation values + else + { + $data[$new->role->id][$new->contentId][$new->limitationIdentifier]->values[] = $new->values; + } + } + else + { + $data[$new->role->id][$new->contentId] = $new; + } + } + + // flatten structure + $roleAssignments = array(); + array_walk_recursive( + $data, + function( $roleAssignment ) use ( &$roleAssignments ) + { + $roleAssignments[] = $roleAssignment; + } + ); + + return $roleAssignments; + } + + /** + * Update role + * + * @param \eZ\Publish\SPI\Persistence\User\RoleUpdateStruct $role + */ + public function updateRole( RoleUpdateStruct $role ) + { + if ( !$role->id ) + throw new InvalidArgumentValue( '$role->id', $role->id ); + + if ( !$role->identifier ) + throw new InvalidArgumentValue( '$role->identifier', $role->identifier ); + + $roleArr = (array)$role; + $this->backend->update( 'User\\Role', $roleArr['id'], $roleArr ); + } + + /** + * Delete the specified role + * + * @param mixed $roleId + */ + public function deleteRole( $roleId ) + { + $this->backend->delete( 'User\\Role', $roleId ); + $this->backend->deleteByMatch( 'User\\Policy', array( 'roleId' => $roleId ) ); + $this->backend->deleteByMatch( 'User\\RoleAssignment', array( '_roleId' => $roleId ) ); + } + + /** + * Adds a policy to a role + * + * @param mixed $roleId + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * + * @return \eZ\Publish\SPI\Persistence\User\Policy + * @todo Throw on invalid Role Id? + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue If $policy->limitation is empty (null, empty string/array..) + */ + public function addPolicy( $roleId, Policy $policy ) + { + if ( empty( $policy->limitations ) ) + throw new InvalidArgumentValue( '->limitations', $policy->limitations, get_class( $policy ) ); + + $policyArr = array( 'roleId' => $roleId ) + ( (array)$policy ); + return $this->backend->create( 'User\\Policy', $policyArr ); + } + + /** + * Update a policy + * + * Replaces limitations values with new values. + * + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue If $policy->limitation is empty (null, empty string/array..) + */ + public function updatePolicy( Policy $policy ) + { + if ( empty( $policy->limitations ) ) + throw new InvalidArgumentValue( '->limitations', $policy->limitations, get_class( $policy ) ); + + $policyArr = (array)$policy; + $this->backend->update( 'User\\Policy', $policyArr['id'], $policyArr, false ); + } + + /** + * Removes a policy from a role + * + * @param mixed $roleId + * @param mixed $policyId + * + * @todo Throw exception on missing role / policy? + * + * @return void + */ + public function removePolicy( $roleId, $policyId ) + { + $this->backend->deleteByMatch( 'User\\Policy', array( 'id' => $policyId, 'roleId' => $roleId ) ); + } + + /** + * Returns the user policies associated with the user (including inherited policies from user groups) + * + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\User\Policy[] + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If user (it's content object atm) is not found + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If user is not of user Content Type + */ + public function loadPoliciesByUserId( $userId ) + { + $list = $this->backend->find( + 'Content', + array( 'id' => $userId ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ) + ) + ); + + if ( !$list ) + throw new NotFound( 'User', $userId ); + + $policies = array(); + $this->getPermissionsForObject( $list[0], 4, $policies ); + + // crawl up path on all locations + $locations = $this->handler->locationHandler()->loadLocationsByContent( + $list[0]->versionInfo->contentInfo->id + ); + foreach ( $locations as $location ) + { + $parentIds = array_reverse( explode( '/', trim( $location->pathString, '/' ) ) ); + foreach ( $parentIds as $parentId ) + { + if ( $parentId == $location->id ) + continue; + + $location = $this->backend->load( 'Content\\Location', $parentId ); + $list2 = $this->backend->find( + 'Content', + array( 'id' => $location->contentId ), + array( + 'versionInfo' => array( + 'type' => 'Content\\VersionInfo', + 'match' => array( '_contentId' => 'id', 'versionNo' => '_currentVersionNo' ), + 'single' => true, + 'sub' => array( + 'contentInfo' => array( + 'type' => 'Content\\ContentInfo', + 'match' => array( 'id' => '_contentId' ), + 'single' => true + ), + ) + ) + ) + ); + + if ( isset( $list2[1] ) ) + throw new LogicException( "'content tree' logic error, there is more than one item with parentId: $parentId" ); + if ( $list2 ) + $this->getPermissionsForObject( $list2[0], 3, $policies ); + } + } + return array_values( $policies ); + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content $content + * @param mixed $typeId + * @param array $policies + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If $content is not type $typeId + * + * @return void + */ + protected function getPermissionsForObject( Content $content, $typeId, array &$policies ) + { + if ( $content->versionInfo->contentInfo->contentTypeId != $typeId ) + throw new NotFound( "Content with TypeId:$typeId", $content->versionInfo->contentInfo->id ); + + // fetch possible roles assigned to this object + $list = $this->backend->find( + 'User\\Role', + array( 'groupIds' => $content->versionInfo->contentInfo->id ), + array( + 'policies' => array( + 'type' => 'User\\Policy', + 'match' => array( 'roleId' => 'id' ) + ) + ) + ); + + // merge policies + foreach ( $list as $role ) + { + foreach ( $role->policies as $policy ) + { + if ( !isset( $policies[$policy->id] ) ) + $policies[$policy->id] = $policy; + } + } + } + + /** + * Assigns role to a user or user group with given limitations + * + * The limitation array looks like: + * + * array( + * 'Subtree' => array( + * '/1/2/', + * '/1/4/', + * ), + * 'Foo' => array( 'Bar' ), + * … + * ) + * + * + * Where the keys are the limitation identifiers, and the respective values + * are an array of limitation values. The limitation parameter is optional. + * + * @param mixed $contentId The groupId or userId to assign the role to. + * @param mixed $roleId + * @param array $limitation + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or role is not found + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group is not of user_group Content Type + */ + public function assignRole( $contentId, $roleId, array $limitation = null ) + { + $content = $this->backend->load( 'Content\\ContentInfo', $contentId ); + if ( !$content ) + throw new NotFound( 'User Group', $contentId ); + + $role = $this->backend->load( 'User\\Role', $roleId ); + if ( !$role ) + throw new NotFound( 'Role', $roleId ); + + // @todo Use eZ Publish settings for this, and maybe a better exception + if ( $content->contentTypeId != 3 && $content->contentTypeId != 4 ) + throw new NotFound( "Content", $contentId ); + + if ( is_array( $limitation ) ) + { + foreach ( $limitation as $limitIdentifier => $limitValues ) + { + $this->backend->create( + 'User\\RoleAssignment', + array( + '_roleId' => $roleId, + 'contentId' => $contentId, + 'limitationIdentifier' => $limitIdentifier, + 'values' => $limitValues + ) + ); + } + } + else + { + $this->backend->create( + 'User\\RoleAssignment', + array( + '_roleId' => $roleId, + 'contentId' => $contentId, + 'limitationIdentifier' => null, + 'values' => null + ) + ); + } + + $role->groupIds[] = $contentId; + $this->backend->update( 'User\\Role', $roleId, (array)$role ); + } + + /** + * Un-assign a role + * + * @param mixed $contentId The user or user group Id to un-assign the role from. + * @param mixed $roleId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or role is not found + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group is not of user[_group] Content Type + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue If group does not contain role + */ + public function unAssignRole( $contentId, $roleId ) + { + $content = $this->backend->load( 'Content\\ContentInfo', $contentId ); + if ( !$content ) + throw new NotFound( 'User Group', $contentId ); + + $role = $this->backend->load( 'User\\Role', $roleId ); + if ( !$role ) + throw new NotFound( 'Role', $roleId ); + + // @todo Use eZ Publish settings for this, and maybe a better exception + if ( $content->contentTypeId != 3 && $content->contentTypeId != 4 ) + throw new NotFound( "3 or 4", $contentId ); + + $roleAssignments = $this->backend->find( + 'User\\RoleAssignment', + array( '_roleId' => $roleId, 'contentId' => $contentId ) + ); + + if ( empty( $roleAssignments ) ) + throw new InvalidArgumentValue( '$roleId', $roleId ); + + $this->backend->deleteByMatch( 'User\\RoleAssignment', array( '_roleId' => $roleId, 'contentId' => $contentId ) ); + + $role->groupIds = array_values( array_diff( $role->groupIds, array( $contentId ) ) ); + $this->backend->update( 'User\\Role', $roleId, (array)$role ); + } +} diff --git a/eZ/Publish/Core/Persistence/InMemory/data.json b/eZ/Publish/Core/Persistence/InMemory/data.json new file mode 100644 index 0000000..61c1db3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/InMemory/data.json @@ -0,0 +1,158 @@ +{ + "Content": [ + {"id": 1, "_currentVersionNo" : 1 }, + {"id": 4, "_currentVersionNo" : 1}, + {"id": 11, "_currentVersionNo" : 2}, + {"id": 12, "_currentVersionNo" : 1}, + {"id": 14, "_currentVersionNo" : 1}, + {"id": 42, "_currentVersionNo" : 1}, + {"id": 10, "_currentVersionNo" : 1}, + {"id": 41, "_currentVersionNo" : 1}, + {"id": 51, "_currentVersionNo" : 1} + ], + "Content\\ContentInfo": [ + {"id": 1, "contentTypeId": 1, "sectionId": 1, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1310792400, "publicationDate": 1310792400, "alwaysAvailable": true, "remoteId": "remoteIdForContent1", "mainLanguageCode": "eng-GB", "isPublished": true, "name": "eZ Publish"}, + {"id": 4, "contentTypeId": 3, "sectionId": 2, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1033917596, "publicationDate": 1033917596, "alwaysAvailable": true, "remoteId": "f5c88a2209584891056f987fd965b0ba", "mainLanguageCode": "eng-US", "isPublished": true, "name": "Users"}, + {"id": 11, "contentTypeId": 3, "sectionId": 2, "ownerId": 14, "currentVersionNo": 2, "status": 1, "modificationDate": 1311154215, "publicationDate": 1033920746, "alwaysAvailable": true, "remoteId": "5f7f0bdb3381d6a461d8c29ff53d908f", "mainLanguageCode": "eng-US", "isPublished": true, "name": "Members"}, + {"id": 12, "contentTypeId": 3, "sectionId": 2, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1310792400, "publicationDate": 1310792400, "alwaysAvailable": true, "remoteId": "9b47a45624b023b1a76c73b74d704acf", "mainLanguageCode": "eng-GB", "isPublished": true, "name": "Administrator users"}, + {"id": 14, "contentTypeId": 4, "sectionId": 2, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1310792400, "publicationDate": 1310792400, "alwaysAvailable": true, "remoteId": "1bb4fe25487f05527efa8bfd394cecc7", "mainLanguageCode": "eng-GB", "isPublished": true, "name": "Administrator user"}, + {"id": 42, "contentTypeId": 3, "sectionId": 2, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1310792400, "publicationDate": 1310792400, "alwaysAvailable": true, "remoteId": "15b256dbea2ae72418ff5facc999e8f9", "mainLanguageCode": "eng-US", "isPublished": true, "name": "Anonymous Users"}, + {"id": 10, "contentTypeId": 4, "sectionId": 2, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1310792400, "publicationDate": 1310792400, "alwaysAvailable": true, "remoteId": "faaeb9be3bd98ed09f606fc16d144eca", "mainLanguageCode": "eng-GB", "isPublished": true, "name": "Anonymous User"}, + {"id": 41, "contentTypeId": 1, "sectionId": 3, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1311154215, "publicationDate": 1033920746, "alwaysAvailable": true, "remoteId": "a6e35cbcb7cd6ae4b691f3eee30cd262", "mainLanguageCode": "eng-US", "isPublished": true, "name": "Media"}, + {"id": 51, "contentTypeId": 1, "sectionId": 3, "ownerId": 14, "currentVersionNo": 1, "status": 1, "modificationDate": 1311154215, "publicationDate": 1033920746, "alwaysAvailable": true, "remoteId": "09082deb98662a104f325aaa8c4933d3", "mainLanguageCode": "eng-US", "isPublished": true, "name": "Multimedia"} + ], + "Content\\Field": [ + {"id": 1, "fieldDefinitionId": 1, "type": "ezstring", "value": {"text": "eZ Publish NextGen"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 1}, + {"id": 3, "fieldDefinitionId": 6, "type": "ezstring", "value": {"text": "NextGen"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 1}, + {"id": 2, "fieldDefinitionId": 5, "type": "eztext", "value": {"text": "This is a plain text description"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 1}, + {"id": 4, "fieldDefinitionId": 1, "type": "ezstring", "value": {"text": "eZ Publish NextGen Draft"}, "languageCode": "eng-GB", "versionNo": 2, "_contentId": 1}, + {"id": 6, "fieldDefinitionId": 6, "type": "ezstring", "value": {"text": "NextGen Draft"}, "languageCode": "eng-GB", "versionNo": 2, "_contentId": 1}, + {"id": 5, "fieldDefinitionId": 5, "type": "eztext", "value": {"text": "This is a plain text description, in a draft"}, "languageCode": "eng-GB", "versionNo": 2, "_contentId": 1}, + {"id": 7, "fieldDefinitionId": 4, "type": "ezstring", "value": {"text": "Main group"}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 4}, + {"id": 8, "fieldDefinitionId": 2, "type": "ezstring", "value": {"text": "Users"}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 4}, + {"id": 9, "fieldDefinitionId": 2, "type": "ezstring", "value": {"text": "Administrator users"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 12}, + {"id": 10, "fieldDefinitionId": 4, "type": "ezstring", "value": {"text": ""}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 12}, + {"id": 11, "fieldDefinitionId": 2, "type": "ezstring", "value": {"text": "Anonymous Users"}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 42}, + {"id": 12, "fieldDefinitionId": 4, "type": "ezstring", "value": {"text": ""}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 42}, + {"id": 13, "fieldDefinitionId": 3, "type": "ezstring", "value": {"text": "Administrator user"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 10}, + {"id": 23, "fieldDefinitionId": 2, "type": "ezstring", "value": {"text": "Guest accounts"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 11}, + {"id": 24, "fieldDefinitionId": 2, "type": "ezstring", "value": {"text": "Members"}, "languageCode": "eng-GB", "versionNo": 2, "_contentId": 11}, + {"id": 25, "fieldDefinitionId": 4, "type": "ezstring", "value": {"text": ""}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 11}, + {"id": 26, "fieldDefinitionId": 4, "type": "ezstring", "value": {"text": ""}, "languageCode": "eng-GB", "versionNo": 2, "_contentId": 11}, + {"id": 1331, "fieldDefinitionId": 3, "type": "ezstring", "value": {"text": "Anonymous User"}, "languageCode": "eng-GB", "versionNo": 1, "_contentId": 14}, + {"id": 98, "fieldDefinitionId": 1, "type": "ezstring", "value": {"text": "Media"}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 41}, + {"id": 103, "fieldDefinitionId": 6, "type": "ezstring", "value": {"text": ""}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 41}, + {"id": 99, "fieldDefinitionId": 5, "type": "eztext", "value": {"text": ""}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 41}, + {"id": 152, "fieldDefinitionId": 1, "type": "ezstring", "value": {"text": "Multimedia"}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 51}, + {"id": 153, "fieldDefinitionId": 6, "type": "ezstring", "value": {"text": ""}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 51}, + {"id": 154, "fieldDefinitionId": 5, "type": "eztext", "value": {"text": ""}, "languageCode": "eng-US", "versionNo": 1, "_contentId": 51} + ], + "Content\\Language" : [ + {"id": 2, "languageCode": "eng-US", "isEnabled": true, "name": "English (American)" }, + {"id": 4, "languageCode": "ger-DE", "isEnabled": true, "name": "German" }, + {"id": 8, "languageCode": "eng-GB", "isEnabled": true, "name": "English (United Kingdom)" } + ], + "Content\\Location" : [ + {"id": 1, "remoteId": "629709ba256fe317c3ddcee35453a96a", "contentId": 0, "parentId": 0, "pathIdentificationString": "", "mainLocationId": 1, "depth": 0, "pathString": "/1/", "priority": 0, "hidden": false, "invisible": false, "sortField": 1, "sortOrder": 1}, + {"id": 2, "remoteId": "f3e90596361e31d496d4026eb624c983", "contentId": 1, "parentId": 1, "pathIdentificationString": "", "mainLocationId": 2, "depth": 1, "pathString": "/1/2/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 5, "remoteId": "3f6d92f8044aed134f32153517850f5a", "contentId": 4, "parentId": 1, "pathIdentificationString": "", "mainLocationId": 5, "depth": 1, "pathString": "/1/5/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 12, "remoteId": "602dcf84765e56b7f999eaafd3821dd3", "contentId": 11, "parentId": 5, "pathIdentificationString": "", "mainLocationId": 12, "depth": 2, "pathString": "/1/5/12/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 13, "remoteId": "769380b7aa94541679167eab817ca893", "contentId": 12, "parentId": 5, "pathIdentificationString": "", "mainLocationId": 13, "depth": 2, "pathString": "/1/5/13/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 15, "remoteId": "e5161a99f733200b9ed4e80f9c16187b", "contentId": 14, "parentId": 13, "pathIdentificationString": "", "mainLocationId": 15, "depth": 3, "pathString": "/1/5/13/15/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 44, "remoteId": "4fdf0072da953bb276c0c7e0141c5c9b", "contentId": 42, "parentId": 5, "pathIdentificationString": "", "mainLocationId": 44, "depth": 2, "pathString": "/1/5/44/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 45, "remoteId": "2cf8343bee7b482bab82b269d8fecd76", "contentId": 10, "parentId": 44, "pathIdentificationString": "", "mainLocationId": 45, "depth": 3, "pathString": "/1/5/44/45/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 43, "remoteId": "75c715a51699d2d309a924eca6a95145", "contentId": 41, "parentId": 1, "pathIdentificationString": "", "mainLocationId": 43, "depth": 1, "pathString": "/1/43/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1}, + {"id": 53, "remoteId": "4f18b82c75f10aad476cae5adf98c11f", "contentId": 51, "parentId": 43, "pathIdentificationString": "", "mainLocationId": 53, "depth": 2, "pathString": "/1/43/53/", "priority": 0, "hidden": false, "invisible": false, "sortField": 8, "sortOrder": 1} + ], + "Content\\Location\\Trashed" : [], + "Content\\VersionInfo" : [ + {"id": 1, "_contentId": 1, "versionNo" : 1, "modificationDate": 1310792400, "creationDate": 1310792400, "creatorId": 14, "status": 1, "names": {"eng-GB": "eZ Publish"}, "initialLanguageCode": "eng-GB", "languageIds": [8]}, + {"id": 2, "_contentId": 1, "versionNo" : 2, "modificationDate": 1310793400, "creationDate": 1310793400, "creatorId": 14, "status": 0, "names": {"eng-GB": "eZ Publish"}, "initialLanguageCode": "eng-GB", "languageIds": [8]}, + {"id": 4, "_contentId": 4, "versionNo" : 1, "modificationDate": 0, "creationDate": 0, "creatorId": 14, "status": 1, "names": {"eng-US": "Users"}, "initialLanguageCode": "eng-US", "languageIds": [2]}, + {"id": 5, "_contentId": 12, "versionNo" : 1, "modificationDate": 1310793400, "creationDate": 1310793400, "creatorId": 14, "status": 1, "names": {"eng-GB": "Administrator users"}, "initialLanguageCode": "eng-GB", "languageIds": [8]}, + {"id": 6, "_contentId": 14, "versionNo" : 1, "modificationDate": 1310793400, "creationDate": 1310793400, "creatorId": 14, "status": 1, "names": {"eng-GB": "Administrator user"}, "initialLanguageCode": "eng-GB", "languageIds": [8]}, + {"id": 7, "_contentId": 42, "versionNo" : 1, "modificationDate": 1310793400, "creationDate": 1310793400, "creatorId": 14, "status": 1, "names": {"eng-GB": "Anonymous Users"}, "initialLanguageCode": "eng-US", "languageIds": [2]}, + {"id": 8, "_contentId": 10, "versionNo" : 1, "modificationDate": 1310793400, "creationDate": 1310793400, "creatorId": 14, "status": 1, "names": {"eng-GB": "Anonymous User"}, "initialLanguageCode": "eng-GB", "languageIds": [8]}, + {"id": 439, "_contentId": 11, "versionNo" : 1, "modificationDate": 1033920746, "creationDate": 1033920737, "creatorId": 14, "status": 3, "names": {"eng-US": "Guest accounts"}, "initialLanguageCode": "eng-US", "languageIds": [2]}, + {"id": 674, "_contentId": 11, "versionNo" : 2, "modificationDate": 1311154215, "creationDate": 1311154215, "creatorId": 14, "status": 1, "names": {"eng-US": "Members"}, "initialLanguageCode": "eng-US", "languageIds": [2]}, + {"id": 472, "_contentId": 41, "versionNo" : 1, "modificationDate": 1311154215, "creationDate": 1311154215, "creatorId": 14, "status": 1, "names": {"eng-US": "Media"}, "initialLanguageCode": "eng-US", "languageIds": [2]}, + {"id": 490, "_contentId": 51, "versionNo" : 1, "modificationDate": 1311154215, "creationDate": 1311154215, "creatorId": 14, "status": 1, "names": {"eng-US": "Multimedia"}, "initialLanguageCode": "eng-US", "languageIds": [2]} + ], + "Content\\Section" : [ + {"id": 1, "identifier": "standard", "name": "Standard"}, + {"id": 2, "identifier": "users", "name": "Users"}, + {"id": 3, "identifier": "media", "name": "Media"} + ], + "Content\\Type": [ + {"id": 1, "status": 0, "name": {"eng-GB": "Folder"}, "description": {"eng-GB": "A simple folder"}, "identifier": "folder", "remoteId": "a3d405b81be900468eb153d774f4f0d2", "created": 1312473387, "modified": 1312473387, "creatorId": 14, "modifierId": 14, "nameSchema": "", "urlAliasSchema": "", "isContainer": true, "initialLanguageId": 8, "groupIds": [1]}, + {"id": 3, "status": 0, "name": {"eng-GB": "User Group"}, "description": {"eng-GB": "A simple user group"}, "identifier": "user_group", "remoteId": "25b4268cdcd01921b808a0d854b877ef", "created": 1312473387, "modified": 1312473387, "creatorId": 14, "modifierId": 14, "nameSchema": "", "urlAliasSchema": "", "isContainer": true, "initialLanguageId": 8, "groupIds": [2]}, + {"id": 4, "status": 0, "name": {"eng-GB": "User"}, "description": {"eng-GB": "A simple user"}, "identifier": "user", "remoteId": "40faa822edc579b02c25f6bb7beec3ad", "created": 1312473387, "modified": 1312473387, "creatorId": 14, "modifierId": 14, "nameSchema": "", "urlAliasSchema": "", "isContainer": false, "initialLanguageId": 8, "groupIds": [2]}, + {"id": 13, "status": 0, "name": {"eng-GB": "Comment"}, "description": {"eng-GB": "A simple comment"}, "identifier": "comment", "remoteId": "000c14f4f475e9f2955dedab72799941", "created": 1312473387, "modified": 1312473387, "creatorId": 14, "modifierId": 14, "nameSchema": "", "urlAliasSchema": "", "isContainer": true, "initialLanguageId": 8, "groupIds": [1]} + ], + "Content\\Type\\FieldDefinition" : [ + {"id": 1, "name": {"eng-GB": "Name"}, "description": {"eng-GB": "Folder name"}, "identifier": "name", "isSearchable": true, "fieldGroup": "", "position": 0, "fieldType": "ezstring", "isTranslatable": true, "isRequired": true, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": "New Folder"}, "_typeId": 1, "_status": 0}, + {"id": 6, "name": {"eng-GB": "Short name"}, "description": {"eng-GB": "Folder short name"}, "identifier": "short_name", "isSearchable": true, "fieldGroup": "", "position": 1, "fieldType": "ezstring", "isTranslatable": true, "isRequired": false, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": ""}, "_typeId": 1, "_status": 0}, + {"id": 5, "name": {"eng-GB": "Description"}, "description": {"eng-GB": "Folder description"}, "identifier": "description", "isSearchable": true, "fieldGroup": "", "position": 2, "fieldType": "eztext", "isTranslatable": true, "isRequired": false, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": ""}, "_typeId": 1, "_status": 0}, + {"id": 2, "name": {"eng-GB": "Name"}, "description": {"eng-GB": "User Group name"}, "identifier": "name", "isSearchable": true, "fieldGroup": "", "position": 0, "fieldType": "ezstring", "isTranslatable": true, "isRequired": true, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": ""}, "_typeId": 3, "_status": 0}, + {"id": 4, "name": {"eng-GB": "Description"}, "description": {"eng-GB": "User Group description"}, "identifier": "description", "isSearchable": true, "fieldGroup": "", "position": 1, "fieldType": "ezstring", "isTranslatable": true, "isRequired": false, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": ""}, "_typeId": 3, "_status": 0}, + {"id": 3, "name": {"eng-GB": "Name"}, "description": {"eng-GB": "User name"}, "identifier": "name", "isSearchable": true, "fieldGroup": "", "position": 0, "fieldType": "ezstring", "isTranslatable": true, "isRequired": true, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": "New User"}, "_typeId": 4, "_status": 0}, + {"id": 7, "name": {"eng-GB": "Subject"}, "description": {"eng-GB": "Comment subject"}, "identifier": "subject", "isSearchable": true, "fieldGroup": "", "position": 0, "fieldType": "ezstring", "isTranslatable": true, "isRequired": true, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": "New Comment"}, "_typeId": 13, "_status": 0}, + {"id": 8, "name": {"eng-GB": "Author"}, "description": {"eng-GB": "Comment author"}, "identifier": "author", "isSearchable": true, "fieldGroup": "", "position": 1, "fieldType": "ezstring", "isTranslatable": true, "isRequired": false, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": ""}, "_typeId": 13, "_status": 0}, + {"id": 9, "name": {"eng-GB": "Message"}, "description": {"eng-GB": "Comment message"}, "identifier": "message", "isSearchable": true, "fieldGroup": "", "position": 2, "fieldType": "eztext", "isTranslatable": true, "isRequired": false, "isInfoCollector": false, "fieldTypeConstraints": {}, "defaultValue": {"data": ""}, "_typeId": 13, "_status": 0} + ], + "Content\\Type\\Group" : [ + {"id": 1, "name": {"eng-GB": "Content"}, "description": {"eng-GB": "Content type group"}, "identifier": "Content", "modified": 1310793400, "created": 1310793400, "creatorId": 14, "modifierId": 14 }, + {"id": 2, "name": {"eng-GB": "Users"}, "description": {"eng-GB": "User content type group"}, "identifier": "Users", "modified": 1310793400, "created": 1310793400, "creatorId": 14, "modifierId": 14 }, + {"id": 3, "name": {"eng-GB": "Media"}, "description": {"eng-GB": "Media content type group"}, "identifier": "Media", "modified": 1310793400, "created": 1310793400, "creatorId": 14, "modifierId": 14 }, + {"id": 4, "name": {"eng-GB": "Setup"}, "description": {"eng-GB": "Setup content type group"}, "identifier": "Setup", "modified": 1310793400, "created": 1310793400, "creatorId": 14, "modifierId": 14 } + ], + "Content\\Relation": [], + "Content\\UrlAlias": [ + { "id": 1, "parent": "0", "link": 1, "type": 0, "destination": 2, "pathData": [ { "always-available": true, "translations": { "eng-US": "", "eng-GB": "" } } ], "languageCodes": [ "eng-US", "eng-GB" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 2, "parent": "0", "link": 2, "type": 0, "destination": 5, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 3, "parent": "2", "link": 4, "type": 0, "destination": 12, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Members" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 4, "parent": "2", "link": 5, "type": 0, "destination": 13, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Administrator-users" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 5, "parent": "2", "link": 6, "type": 0, "destination": 14, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Editors" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 6, "parent": "5", "link": 8, "type": 0, "destination": 15, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Administrator-users" } }, { "always-available": true, "translations": { "eng-US": "Administrator-User" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 7, "parent": "0", "link": 9, "type": 0, "destination": 43, "pathData": [ { "always-available": true, "translations": { "eng-US": "Media" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 8, "parent": "2", "link": 10, "type": 0, "destination": 44, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Anonymous-Users" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 9, "parent": "3", "link": 11, "type": 0, "destination": 45, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Anonymous-Users" } }, { "always-available": true, "translations": { "eng-US": "Anonymous-User" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 10, "parent": "9", "link": 18, "type": 0, "destination": 51, "pathData": [ { "always-available": true, "translations": { "eng-US": "Media" } }, { "always-available": true, "translations": { "eng-US": "Images" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 11, "parent": "9", "link": 19, "type": 0, "destination": 52, "pathData": [ { "always-available": true, "translations": { "eng-US": "Media" } }, { "always-available": true, "translations": { "eng-US": "Files" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 12, "parent": "9", "link": 20, "type": 0, "destination": 53, "pathData": [ { "always-available": true, "translations": { "eng-US": "Media" } }, { "always-available": true, "translations": { "eng-US": "Multimedia" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 13, "parent": "0", "link": 38, "type": 0, "destination": 59, "pathData": [ { "always-available": true, "translations": { "eng-US": "Home", "eng-US": "eZ-Publish" } } ], "languageCodes": [ "eng-US", "eng-GB" ], "alwaysAvailable": true, "isHistory": false, "isCustom": false, "forward": false }, + { "id": 14, "parent": "2", "link": 40, "type": 0, "destination": 12, "pathData": [ { "always-available": true, "translations": { "eng-US": "Users" } }, { "always-available": true, "translations": { "eng-US": "Guest-accounts" } } ], "languageCodes": [ "eng-US" ], "alwaysAvailable": true, "isHistory": true, "isCustom": false, "forward": false } + ], + "Content\\UrlWildcard": [], + "User": [ + {"id": 14, "login": "admin", "email": "spam@ez.no", "passwordHash": "c78e3b0f3d9244ed8c6d1c29464bdff9", "hashAlgorithm": 2, "isEnabled": true, "maxLogin": 10}, + {"id": 10, "login": "anonymous", "email": "nospam@ez.no", "passwordHash": "4e6f6184135228ccd45f8233d72a0363", "hashAlgorithm": 2, "isEnabled": true, "maxLogin": 1000} + ], + "User\\Role" : [ + {"id": 1, "identifier": "Anonymous", "groupIds": [11, 42]}, + {"id": 2, "identifier": "Administrator", "groupIds": [12]} + ], + "User\\Policy" : [ + {"id": 1, "roleId": 2, "module": "*", "function": "*", "limitations": "*" }, + {"id": 2, "roleId": 1, "module": "content", "function": "pdf", "limitations": { "Section" : [ 1 ] } }, + {"id": 3, "roleId": 1, "module": "content", "function": "read", "limitations": { "Section" : [ 1 ] }}, + {"id": 4, "roleId": 1, "module": "content", "function": "read", "limitations": { "Class" : [ 29, 30, 32, 33, 34, 42 ], "Section" : [ 3 ] } }, + {"id": 5, "roleId": 1, "module": "rss", "function": "feed", "limitations": "*" }, + {"id": 6, "roleId": 1, "module": "user", "function": "login", "limitations": { "SiteAccess" : [ 2576532274 ] } }, + {"id": 7, "roleId": 1, "module": "user", "function": "login", "limitations": { "SiteAccess" : [ 2582995467 ] } }, + {"id": 8, "roleId": 1, "module": "user", "function": "login", "limitations": { "SiteAccess" : [ 2479546403 ] } }, + {"id": 9, "roleId": 1, "module": "user", "function": "login", "limitations": { "SiteAccess" : [ 3781580864 ] } } + ], + "User\\RoleAssignment" : [ + {"id": 1, "_roleId": 1, "contentId": 11, "limitationIdentifier": null, "values": null}, + {"id": 2, "_roleId": 1, "contentId": 42, "limitationIdentifier": null, "values": null}, + {"id": 3, "_roleId": 2, "contentId": 12, "limitationIdentifier": null, "values": null} + ], + "Content\\ObjectState" : [ + {"id": 1, "identifier": "not_locked", "groupId": 2, "priority": 0, "defaultLanguage": "eng-US", "languageCodes": ["eng-US"], "name": {"eng-US": "Not locked"}, "description": {"eng-US": ""}, "_contentId": [1, 4, 10, 11, 12, 14, 42, 41, 51]}, + {"id": 2, "identifier": "locked", "groupId": 2, "priority": 1, "defaultLanguage": "eng-US", "languageCodes": ["eng-US"], "name": {"eng-US": "Locked"}, "description": {"eng-US": ""}, "_contentId": []} + ], + "Content\\ObjectState\\Group" : [ + {"id": 2, "identifier": "ez_lock", "defaultLanguage": "eng-US", "languageCodes": ["eng-US"], "name": {"eng-US": "Lock"}, "description": {"eng-US": ""}} + ] +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php new file mode 100644 index 0000000..aaa5552 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldHandler.php @@ -0,0 +1,234 @@ +contentGateway = $contentGateway; + $this->typeGateway = $typeGateway; + $this->mapper = $mapper; + $this->storageHandler = $storageHandler; + } + + /** + * Creates new fields in the database from $content + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return void + */ + public function createNewFields( Content $content ) + { + foreach ( $content->fields as $field ) + { + $this->createNewField( $field, $content ); + } + } + + /** + * Creates existing fields in a new version for $content + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return void + */ + public function createExistingFieldsInNewVersion( Content $content ) + { + foreach ( $content->fields as $field ) + { + $this->createExistingFieldInNewVersion( $field, $content ); + } + } + + /** + * Creates a new field in the database + * + * Used by self::createNewFields() and self::updateFields() + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * return void + */ + protected function createNewField( Field $field, Content $content ) + { + $field->versionNo = $content->versionInfo->versionNo; + + $field->id = $this->contentGateway->insertNewField( + $content, + $field, + $this->mapper->convertToStorageValue( $field ) + ); + + // If the storage handler returns true, it means that $field value has been modified + // So we need to update it in order to store those modifications + // Field converter is called once again via the Mapper + if ( $this->storageHandler->storeFieldData( $content->versionInfo, $field ) === true ) + { + $this->contentGateway->updateField( + $field, + $this->mapper->convertToStorageValue( $field ) + ); + } + } + + /** + * Creates an existing field in a new version, no new ID is generated + * + * @param Field $field + * @param Content $content + * + * @return void + */ + public function createExistingFieldInNewVersion( Field $field, Content $content ) + { + $field->versionNo = $content->versionInfo->versionNo; + + $this->contentGateway->insertExistingField( + $content, + $field, + $this->mapper->convertToStorageValue( $field ) + ); + + // If the storage handler returns true, it means that $field value has been modified + // So we need to update it in order to store those modifications + // Field converter is called once again via the Mapper + if ( $this->storageHandler->storeFieldData( $content->versionInfo, $field ) === true ) + { + $this->contentGateway->updateField( + $field, + $this->mapper->convertToStorageValue( $field ) + ); + } + } + + /** + * Performs external loads for the fields in $content + * + * @param Content $content + * + * @return void + */ + public function loadExternalFieldData( Content $content ) + { + foreach ( $content->fields as $field ) + { + $this->storageHandler->getFieldData( $content->versionInfo, $field ); + } + } + + /** + * Updates the fields in for content identified by $contentId and $versionNo in the database in respect to $updateStruct + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * @param \eZ\Publish\SPI\Persistence\Content\UpdateStruct $updateStruct + * + * @return void + */ + public function updateFields( $content, UpdateStruct $updateStruct ) + { + foreach ( $updateStruct->fields as $field ) + { + $field->versionNo = $content->versionInfo->versionNo; + if ( isset( $field->id ) ) + { + $this->contentGateway->updateField( + $field, + $this->mapper->convertToStorageValue( $field ) + ); + } + else + { + $this->createNewField( $field, $content ); + } + + // If the storage handler returns true, it means that $field value has been modified + // So we need to update it in order to store those modifications + // Field converter is called once again via the Mapper + if ( $this->storageHandler->storeFieldData( $content->versionInfo, $field ) === true ) + { + $this->contentGateway->updateField( + $field, + $this->mapper->convertToStorageValue( $field ) + ); + } + } + } + + /** + * Deletes the fields for $contentId in $versionInfo from the database + * + * @param int $contentId + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * + * @return void + */ + public function deleteFields( $contentId, VersionInfo $versionInfo ) + { + foreach ( $this->contentGateway->getFieldIdsByType( $contentId, $versionInfo->versionNo ) + as $fieldType => $ids ) + { + $this->storageHandler->deleteFieldData( $fieldType, $versionInfo, $ids ); + } + $this->contentGateway->deleteFields( $contentId, $versionInfo->versionNo ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter.php new file mode 100644 index 0000000..e1a05a9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter.php @@ -0,0 +1,64 @@ +dataText = $this->generateXmlString( $value->data ); + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $this->restoreValueFromXmlString( $value->dataText ); + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + // Nothing to store + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->defaultValue->data = array(); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return false; + } + + /** + * Generates XML string from $authorValue to be stored in storage engine + * + * @param array $authorValue + * + * @return string The generated XML string + */ + private function generateXmlString( array $authorValue ) + { + $doc = new DOMDocument( '1.0', 'utf-8' ); + + $root = $doc->createElement( 'ezauthor' ); + $doc->appendChild( $root ); + + $authors = $doc->createElement( 'authors' ); + $root->appendChild( $authors ); + + foreach ( $authorValue as $author ) + { + $authorNode = $doc->createElement( 'author' ); + $authorNode->setAttribute( 'id', $author["id"] ); + $authorNode->setAttribute( 'name', $author["name"] ); + $authorNode->setAttribute( 'email', $author["email"] ); + $authors->appendChild( $authorNode ); + unset( $authorNode ); + } + + return $doc->saveXML(); + } + + /** + * Restores an author Value object from $xmlString + * + * @param string $xmlString XML String stored in storage engine + * + * @return \eZ\Publish\Core\FieldType\Author\Value + */ + private function restoreValueFromXmlString( $xmlString ) + { + $dom = new DOMDocument( '1.0', 'utf-8' ); + $authors = array(); + + if ( $dom->loadXML( $xmlString ) === true ) + { + foreach ( $dom->getElementsByTagName( 'author' ) as $author ) + { + $authors[] = array( + 'id' => $author->getAttribute( 'id' ), + 'name' => $author->getAttribute( 'name' ), + 'email' => $author->getAttribute( 'email' ) + ); + } + } + + return $authors; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/BinaryFile.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/BinaryFile.php new file mode 100644 index 0000000..3ba02b1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/BinaryFile.php @@ -0,0 +1,101 @@ +dataInt1 = ( isset( $fieldDef->fieldTypeConstraints->validators['FileSizeValidator']['maxFileSize'] ) + ? $fieldDef->fieldTypeConstraints->validators['FileSizeValidator']['maxFileSize'] + : 0 ); + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints = new FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => ( $storageDef->dataInt1 != 0 + ? $storageDef->dataInt1 + : false ), + ) + ) + ) + ); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + // @todo: Correct? + return 'sort_key_string'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Checkbox.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Checkbox.php new file mode 100644 index 0000000..59f2ab7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Checkbox.php @@ -0,0 +1,92 @@ +dataInt = (int)$value->data; + $storageFieldValue->sortKeyInt = (int)$value->data; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = (bool)$value->dataInt; + $fieldValue->sortKey = $value->dataInt; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $storageDef->dataInt3 = (int)$fieldDef->defaultValue->data; + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->defaultValue->data = !empty( $storageDef->dataInt3 ) ? (bool)$storageDef->dataInt3 : false; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_int'; + } + +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Country.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Country.php new file mode 100644 index 0000000..e9cb553 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Country.php @@ -0,0 +1,107 @@ +dataText = empty( $value->data ) ? "" : implode( ",", $value->data ); + $storageFieldValue->sortKeyString = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = empty( $value->dataText ) ? null : explode( ",", $value->dataText ); + $fieldValue->sortKey = $value->sortKeyString; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + if ( isset( $fieldDef->fieldTypeConstraints->fieldSettings["isMultiple"] ) ) + { + $storageDef->dataInt1 = (int)$fieldDef->fieldTypeConstraints->fieldSettings["isMultiple"]; + } + + $storageDef->dataText5 = $fieldDef->defaultValue->data === null + ? "" + : implode( ",", $fieldDef->defaultValue->data ); + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + "isMultiple" => !empty( $storageDef->dataInt1 ) ? (bool)$storageDef->dataInt1 : false + ) + ); + + $fieldDef->defaultValue->data = empty( $storageDef->dataText5 ) + ? null + : explode( ",", $storageDef->dataText5 ); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return "sort_key_string"; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/DateAndTime.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/DateAndTime.php new file mode 100644 index 0000000..80a86e2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/DateAndTime.php @@ -0,0 +1,225 @@ +dataInt = ( $value->data !== null ? $value->data['timestamp'] : null ); + $storageFieldValue->sortKeyInt = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + if ( $value->dataInt === null ) + { + return; + } + + $fieldValue->data = array( + 'rfc850' => null, + 'timestamp' => $value->dataInt, + ); + $fieldValue->sortKey = $value->sortKeyInt; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $storageDef->dataInt2 = $fieldDef->fieldTypeConstraints->fieldSettings['useSeconds'] ? 1 : 0; + $storageDef->dataInt1 = $fieldDef->fieldTypeConstraints->fieldSettings['defaultType']; + + if ( $fieldDef->fieldTypeConstraints->fieldSettings['defaultType'] === DateAndTimeType::DEFAULT_CURRENT_DATE_ADJUSTED ) + { + $storageDef->dataText5 = $this->generateDateIntervalXML( + $fieldDef->fieldTypeConstraints->fieldSettings['dateInterval'] + ); + } + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $useSeconds = (bool)$storageDef->dataInt2; + $dateInterval = $this->getDateIntervalFromXML( $storageDef->dataText5 ); + + $fieldDef->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'defaultType' => $storageDef->dataInt1, + 'useSeconds' => $useSeconds, + 'dateInterval' => $dateInterval + ) + ); + + // Building default value + switch ( $fieldDef->fieldTypeConstraints->fieldSettings['defaultType'] ) + { + case DateAndTimeType::DEFAULT_CURRENT_DATE: + $data = array( + 'rfc850' => null, + 'timestamp' => time(), + ); + break; + + case DateAndTimeType::DEFAULT_CURRENT_DATE_ADJUSTED: + if ( !$useSeconds ) + { + $dateInterval->s = 0; + } + $date = new DateTime; + $date->add( $dateInterval ); + $data = array( + 'rfc850' => null, + 'timestamp' => $date->getTimestamp(), + ); + break; + + default: + $data = null; + } + + $fieldDef->defaultValue->data = $data; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_int'; + } + + /** + * Generates the internal XML structure for $dateInterval, used for date adjustment + * + * @param \DateInterval $dateInterval + * + * @return string The generated XML string + */ + protected function generateDateIntervalXML( DateInterval $dateInterval ) + { + // Constructing XML structure + $doc = new DOMDocument( '1.0', 'utf-8' ); + $root = $doc->createElement( 'adjustment' ); + + $year = $doc->createElement( 'year' ); + $year->setAttribute( 'value', $dateInterval->format( '%y' ) ); + $root->appendChild( $year ); + unset( $year ); + + $month = $doc->createElement( 'month' ); + $month->setAttribute( 'value', $dateInterval->format( '%m' ) ); + $root->appendChild( $month ); + unset( $month ); + + $day = $doc->createElement( 'day' ); + $day->setAttribute( 'value', $dateInterval->format( '%d' ) ); + $root->appendChild( $day ); + unset( $day ); + + $hour = $doc->createElement( 'hour' ); + $hour->setAttribute( 'value', $dateInterval->format( '%h' ) ); + $root->appendChild( $hour ); + unset( $hour ); + + $minute = $doc->createElement( 'minute' ); + $minute->setAttribute( 'value', $dateInterval->format( '%i' ) ); + $root->appendChild( $minute ); + unset( $minute ); + + $second = $doc->createElement( 'second' ); + $second->setAttribute( 'value', $dateInterval->format( '%s' ) ); + $root->appendChild( $second ); + unset( $second ); + + $doc->appendChild( $root ); + return $doc->saveXML(); + } + + /** + * Generates a DateInterval object from $xmlText + * + * @param string $xmlText + * + * @return \DateInterval + */ + protected function getDateIntervalFromXML( $xmlText ) + { + if ( empty( $xmlText ) ) + return; + + $xml = new SimpleXMLElement( $xmlText ); + $aIntervalString = array( + (int)$xml->year['value'] . ' years', + (int)$xml->month['value'] . ' months', + (int)$xml->day['value'] . ' days', + (int)$xml->hour['value'] . ' hours', + (int)$xml->minute['value'] . ' minutes', + (int)$xml->second['value'] . ' seconds', + ); + + return DateInterval::createFromDateString( implode( ', ', $aIntervalString ) ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/EmailAddress.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/EmailAddress.php new file mode 100644 index 0000000..5105be1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/EmailAddress.php @@ -0,0 +1,95 @@ +dataText = $value->data; + $storageFieldValue->sortKeyString = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $value->dataText; + $fieldValue->sortKey = $value->sortKeyString; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $storageDef->dataText1 = $fieldDef->defaultValue->data; + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $validatorConstraints = array( self::VALIDATOR_IDENTIFIER => array() ); + $fieldDef->fieldTypeConstraints->validators = $validatorConstraints; + $fieldDef->defaultValue->data = isset( $storageDef->dataText1 ) ? $storageDef->dataText1 : ''; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_string'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Exception/NotFound.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Exception/NotFound.php new file mode 100644 index 0000000..6610437 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Exception/NotFound.php @@ -0,0 +1,31 @@ +dataFloat = $value->data; + $storageFieldValue->sortKeyInt = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $value->dataFloat; + $fieldValue->sortKey = $value->sortKeyInt; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + if ( isset( $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['minFloatValue'] ) ) + { + $storageDef->dataFloat1 = $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['minFloatValue']; + } + + if ( isset( $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['maxFloatValue'] ) ) + { + $storageDef->dataFloat2 = $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['maxFloatValue']; + } + + // Defining dataInt4 which holds the validator state (min value/max value/minMax value) + $storageDef->dataFloat4 = $this->getStorageDefValidatorState( $storageDef->dataFloat1, $storageDef->dataFloat2 ); + $storageDef->dataFloat3 = $fieldDef->defaultValue->data; + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints->validators = array( + self::FLOAT_VALIDATOR_IDENTIFIER => array( 'minFloatValue' => false, 'maxFloatValue' => false ) + ); + + if ( $storageDef->dataFloat4 !== self::NO_MIN_MAX_VALUE ) + { + if ( !empty( $storageDef->dataFloat1 ) ) + { + $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['minFloatValue'] = $storageDef->dataFloat1; + } + + if ( !empty( $storageDef->dataFloat2 ) ) + { + $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['maxFloatValue'] = $storageDef->dataFloat2; + } + } + + $fieldDef->defaultValue->data = isset( $storageDef->dataFloat3 ) ? $storageDef->dataFloat3 : 0.0; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_int'; + } + + /** + * Returns validator state for storage definition. + * Validator state is a bitfield value composed of: + * - {@link self::NO_MIN_MAX_VALUE} + * - {@link self::HAS_MAX_VALUE} + * - {@link self::HAS_MIN_VALUE} + * + * @param int|null $minValue Minimum int value, or null if not set + * @param int|null $maxValue Maximum int value, or null if not set + * + * @return int + */ + private function getStorageDefValidatorState( $minValue, $maxValue ) + { + $state = self::NO_MIN_MAX_VALUE; + + if ( $minValue !== null ) + $state += self::HAS_MIN_VALUE; + + if ( $maxValue !== null ) + $state += self::HAS_MAX_VALUE; + + return $state; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Image.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Image.php new file mode 100644 index 0000000..7b90b3a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Image.php @@ -0,0 +1,267 @@ +data ) ) + { + // Determine what needs to be stored + if ( isset( $value->data['mime'] ) ) + { + // $data['mime'] is only set for real images, which have been + // stored + $storageFieldValue->dataText = $this->createLegacyXml( $value->data ); + } + else if ( isset( $value->data['fieldId'] ) ) + { + // $fieldId is only set if data is to be stored at all + $storageFieldValue->dataText = $this->createEmptyLegacyXml( $value->data ); + } + // otherwise the image is unprocessed and the DB field stays empty + // there will be a subsequent call to this method, after the image + // has been stored + } + } + + /** + * Creates an XML considered "empty" by the legacy storage + * + * @param array $contentMetaData + * + * @return string + */ + protected function createEmptyLegacyXml( $contentMetaData ) + { + return $this->fillXml( + array_merge( + array( + 'path' => '', + 'width' => '', + 'height' => '', + 'mime' => '', + 'alternativeText' => '', + ), + $contentMetaData + ), + array( + 'basename' => '', + 'extension' => '', + 'dirname' => '', + 'filename' => '', + ), + time() + ); + } + + /** + * Returns the XML required by the legacy database + * + * @param array $data + * + * @return string + */ + protected function createLegacyXml( array $data ) + { + $pathInfo = pathinfo( $data['path'] ); + return $this->fillXml( $data, $pathInfo, time() ); + } + + /** + * Fill the XML template with the data provided + * + * @param array $imageData + * @param array $pathInfo + * @param int $timestamp + * + * @return string + */ + protected function fillXml( $imageData, $pathInfo, $timestamp ) + { + // + // + // + // +$xml = << + + + + +EOT; + + return sprintf( + $xml, + // + htmlspecialchars( $pathInfo['basename'] ), // filename="%s" + htmlspecialchars( $pathInfo['extension'] ), // suffix="%s" + htmlspecialchars( $pathInfo['filename'] ), // basename="%s" + htmlspecialchars( $pathInfo['dirname'] ), // dirpath + htmlspecialchars( $imageData['path'] ), // url + htmlspecialchars( $pathInfo['basename'] ), // @todo: Needs original file name, for whatever reason? + htmlspecialchars( $imageData['mime'] ), // mime_type + htmlspecialchars( $imageData['width'] ), // width + htmlspecialchars( $imageData['height'] ), // height + htmlspecialchars( $imageData['alternativeText'] ), // alternative_text + htmlspecialchars( 1293033771 ), // alias_key, fixed for the original image + htmlspecialchars( $timestamp ), // timestamp + // + $imageData['fieldId'], + $imageData['versionNo'], + $imageData['languageCode'], + // + $imageData['height'], // Height + $imageData['width'], // Width + 1 // IsColor @todo Do we need to fix that here? + ); + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + if ( empty( $value->dataText ) ) + { + // Special case for anonymous user + return; + } + $fieldValue->data = $this->parseLegacyXml( $value->dataText ); + } + + /** + * Parses the XML from the legacy database + * + * Returns only the data required by the FieldType, nothing more. + * + * @param string $xml + * + * @return array + */ + protected function parseLegacyXml( $xml ) + { + $extractedData = array(); + + $dom = new \DOMDocument(); + $dom->loadXml( $xml ); + + $ezimageTag = $dom->documentElement; + + if ( !$ezimageTag->hasAttribute( 'url' ) ) + { + throw new \RuntimeException( 'Missing attribute "url" in tag.' ); + } + + if ( ( $url = $ezimageTag->getAttribute( 'url' ) ) === '' ) + { + // Detected XML considered "empty" by the legacy storage + return null; + } + + $extractedData['path'] = $url; + + if ( !$ezimageTag->hasAttribute( 'filename' ) ) + { + throw new \RuntimeException( 'Missing attribute "filename" in tag.' ); + } + $extractedData['fileName'] = $ezimageTag->getAttribute( 'filename' ); + + if ( !$ezimageTag->hasAttribute( 'alternative_text' ) ) + { + throw new \RuntimeException( 'Missing attribute "alternative_text" in tag.' ); + } + $extractedData['alternativeText'] = $ezimageTag->getAttribute( 'alternative_text' ); + + return $extractedData; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $storageDef->dataInt1 = ( isset( $fieldDef->fieldTypeConstraints->validators['FileSizeValidator']['maxFileSize'] ) + ? round( $fieldDef->fieldTypeConstraints->validators['FileSizeValidator']['maxFileSize'] / 1024 / 1024 ) + : 0 ); + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints = new FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => ( $storageDef->dataInt1 != 0 + ? (int)$storageDef->dataInt1 * 1024 * 1024 + : false ), + ) + ) + ) + ); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + // @todo: Correct? + return 'sort_key_string'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Integer.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Integer.php new file mode 100644 index 0000000..1774121 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Integer.php @@ -0,0 +1,155 @@ +dataInt = $value->data; + $storageFieldValue->sortKeyInt = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $value->dataInt; + $fieldValue->sortKey = $value->sortKeyInt; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + if ( isset( $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['minIntegerValue'] ) ) + { + $storageDef->dataInt1 = $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['minIntegerValue']; + } + + if ( isset( $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['maxIntegerValue'] ) ) + { + $storageDef->dataInt2 = $fieldDef->fieldTypeConstraints->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['maxIntegerValue']; + } + + // Defining dataInt4 which holds the validator state (min value/max value/minMax value) + $storageDef->dataInt4 = $this->getStorageDefValidatorState( $storageDef->dataInt1, $storageDef->dataInt2 ); + $storageDef->dataInt3 = $fieldDef->defaultValue->data; + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints->validators = array( + self::FLOAT_VALIDATOR_IDENTIFIER => array( 'minIntegerValue' => false, 'maxIntegerValue' => false ) + ); + + if ( $storageDef->dataInt4 !== self::NO_MIN_MAX_VALUE ) + { + if ( !empty( $storageDef->dataInt1 ) ) + { + $fieldDef + ->fieldTypeConstraints + ->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['minIntegerValue'] = $storageDef->dataInt1; + } + + if ( !empty( $storageDef->dataInt2 ) ) + { + $fieldDef + ->fieldTypeConstraints + ->validators[self::FLOAT_VALIDATOR_IDENTIFIER]['maxIntegerValue'] = $storageDef->dataInt2; + } + } + + $fieldDef->defaultValue->data = isset( $storageDef->dataInt3 ) ? $storageDef->dataInt3 : 0; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_int'; + } + + /** + * Returns validator state for storage definition. + * Validator state is a bitfield value composed of: + * - {@link self::NO_MIN_MAX_VALUE} + * - {@link self::HAS_MAX_VALUE} + * - {@link self::HAS_MIN_VALUE} + * + * @param int|null $minValue Minimum int value, or null if not set + * @param int|null $maxValue Maximum int value, or null if not set + * + * @return int + */ + private function getStorageDefValidatorState( $minValue, $maxValue ) + { + $state = self::NO_MIN_MAX_VALUE; + + if ( $minValue !== null ) + $state += self::HAS_MIN_VALUE; + + if ( $maxValue !== null ) + $state += self::HAS_MAX_VALUE; + + return $state; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Keyword.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Keyword.php new file mode 100644 index 0000000..af87ee6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Keyword.php @@ -0,0 +1,87 @@ +data = array(); + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return false; + } + +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/MapLocation.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/MapLocation.php new file mode 100644 index 0000000..d9fc7a2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/MapLocation.php @@ -0,0 +1,89 @@ +dataInt = isset( $value->externalData['address'] ) ? 1 : 0; + $storageFieldValue->dataText = ''; + $storageFieldValue->sortKeyString = (string)$value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_string'; + } + +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Media.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Media.php new file mode 100644 index 0000000..5d9db35 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Media.php @@ -0,0 +1,62 @@ +dataText1 = ( isset( $fieldDef->fieldTypeConstraints->fieldSettings['mediaType'] ) + ? $fieldDef->fieldTypeConstraints->fieldSettings['mediaType'] + : MediaType::TYPE_HTML5_VIDEO ); + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + parent::toFieldDefinition( $storageDef, $fieldDef ); + $fieldDef->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'mediaType' => $storageDef->dataText1, + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/NullConverter.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/NullConverter.php new file mode 100644 index 0000000..c47c7c6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/NullConverter.php @@ -0,0 +1,96 @@ +pageService = $pageService; + } + + /** + * Converts data from $value to $storageFieldValue + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $value + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $storageFieldValue + */ + public function toStorageValue( FieldValue $value, StorageFieldValue $storageFieldValue ) + { + $storageFieldValue->dataText = $value->data === null + ? null + : $this->generateXmlString( $value->data ); + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $value->dataText === null + ? null + : $this->restoreValueFromXmlString( $value->dataText ); + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $storageDef->dataText1 = ( isset( $fieldDef->fieldTypeConstraints->fieldSettings['defaultLayout'] ) + ? $fieldDef->fieldTypeConstraints->fieldSettings['defaultLayout'] + : '' ); + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'defaultLayout' => $storageDef->dataText1, + ) + ); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return false; + } + + /** + * Generates XML string from $page object to be stored in storage engine + * + * @param \eZ\Publish\Core\FieldType\Page\Parts\Page $page + * + * @return string + */ + public function generateXmlString( $page ) + { + $dom = new DOMDocument( '1.0', 'utf-8' ); + $dom->formatOutput = true; + $success = $dom->loadXML( '' ); + + $pageNode = $dom->documentElement; + + foreach ( $page->getProperties() as $attrName => $attrValue ) + { + switch ( $attrName ) + { + case 'id': + $pageNode->setAttribute( 'id', $attrValue ); + break; + case 'zones': + foreach ( $page->{$attrName} as $zone ) + { + $pageNode->appendChild( $this->generateZoneXmlString( $zone, $dom ) ); + } + break; + default: + $node = $dom->createElement( $attrName ); + $nodeValue = $dom->createTextNode( $attrValue ); + $node->appendChild( $nodeValue ); + $pageNode->appendChild( $node ); + break; + } + } + + return $dom->saveXML(); + } + + /** + * Generates XML string for a given $zone object + * + * @param \eZ\Publish\Core\FieldType\Page\Parts\Zone $zone + * @param \DOMDocument $dom + * + * @return \DOMElement + */ + protected function generateZoneXmlString( $zone, DOMDocument $dom ) + { + $zoneNode = $dom->createElement( 'zone' ); + foreach ( $zone->getProperties() as $attrName => $attrValue ) + { + switch ( $attrName ) + { + case 'id': + $zoneNode->setAttribute( 'id', 'id_' . $attrValue ); + break; + case 'action': + $zoneNode->setAttribute( 'action', $attrValue ); + break; + case 'blocks': + foreach ( $zone->{$attrName} as $block ) + { + $zoneNode->appendChild( $this->generateBlockXmlString( $block, $dom ) ); + } + break; + default: + $node = $dom->createElement( $attrName ); + $nodeValue = $dom->createTextNode( $attrValue ); + $node->appendChild( $nodeValue ); + $zoneNode->appendChild( $node ); + break; + } + } + + return $zoneNode; + } + + /** + * Generates XML string for a given $block object + * + * @param \eZ\Publish\Core\FieldType\Page\Parts\Block $block + * @param \DOMDocument $dom + * + * @return \DOMElement + */ + protected function generateBlockXmlString( $block, DOMDocument $dom ) + { + $blockNode = $dom->createElement( 'block' ); + + foreach ( $block->getProperties() as $attrName => $attrValue ) + { + switch ( $attrName ) + { + case 'id': + $blockNode->setAttribute( 'id', 'id_' . $attrValue ); + break; + case 'action': + $blockNode->setAttribute( 'action', $attrValue ); + break; + case 'items': + foreach ( $block->{$attrName} as $item ) + { + $itemNode = $this->generateItemXmlString( $item, $dom ); + if ( $itemNode ) + { + $blockNode->appendChild( $itemNode ); + } + } + break; + case 'rotation': + case 'custom_attributes': + $node = $dom->createElement( $attrName ); + $blockNode->appendChild( $node ); + + foreach ( $attrValue as $arrayItemKey => $arrayItemValue ) + { + $tmp = $dom->createElement( $arrayItemKey ); + $tmpValue = $dom->createTextNode( $arrayItemValue ); + $tmp->appendChild( $tmpValue ); + $node->appendChild( $tmp ); + } + break; + default: + $node = $dom->createElement( $attrName ); + $nodeValue = $dom->createTextNode( $attrValue ); + $node->appendChild( $nodeValue ); + $blockNode->appendChild( $node ); + break; + } + } + + return $blockNode; + } + + /** + * Generates XML string for a given $item object + * + * @param \eZ\Publish\Core\FieldType\Page\Parts\Item $item + * @param \DOMDocument $dom + * + * @return boolean|\DOMElement + */ + protected function generateItemXmlString( $item, DOMDocument $dom ) + { + if ( !$item->XMLStorable ) + { + return false; + } + + $itemNode = $dom->createElement( 'item' ); + + foreach ( $item->getProperties() as $attrName => $attrValue ) + { + switch ( $attrName ) + { + case 'id': + $itemNode->setAttribute( 'id', $attrValue ); + break; + case 'action': + $itemNode->setAttribute( 'action', $attrValue ); + break; + default: + $node = $dom->createElement( $attrName ); + $nodeValue = $dom->createTextNode( $attrValue ); + $node->appendChild( $nodeValue ); + $itemNode->appendChild( $node ); + break; + } + } + + return $itemNode; + } + + /** + * Restores value from XML string + * + * @param string $xmlString + * + * @return \eZ\Publish\Core\FieldType\Page\Parts\Page + */ + public function restoreValueFromXmlString( $xmlString ) + { + $page = new Parts\Page( $this->pageService ); + + if ( $xmlString ) + { + $dom = new DOMDocument( '1.0', 'utf-8' ); + $success = $dom->loadXML( $xmlString ); + $root = $dom->documentElement; + + foreach ( $root->childNodes as $node ) + { + if ( $node->nodeType == XML_ELEMENT_NODE && $node->nodeName == 'zone' ) + { + $page->addZone( $this->restoreZoneFromXml( $node ) ); + } + else if ( $node->nodeType == XML_ELEMENT_NODE ) + { + $page->{$node->nodeName} = $node->nodeValue; + } + } + + if ( $root->hasAttributes() ) + { + foreach ( $root->attributes as $attr ) + { + $page->{$attr->name} = $attr->value; + } + } + } + + return $page; + } + + /** + * Restores value for a given Zone $node + * + * @param \DOMElement $node + * + * @return \eZ\Publish\Core\FieldType\Page\Parts\Zone + */ + protected function restoreZoneFromXml( DOMElement $node ) + { + $zone = new Parts\Zone( $this->pageService ); + + if ( $node->hasAttributes() ) + { + foreach ( $node->attributes as $attr ) + { + if ( $attr->name == 'id' ) + { + $value = explode( '_', $attr->value ); + $zone->{$attr->name} = $value[1]; + } + else + { + $zone->{$attr->name} = $attr->value; + } + } + } + + foreach ( $node->childNodes as $node ) + { + if ( $node->nodeType == XML_ELEMENT_NODE && $node->nodeName == 'block' ) + { + $zone->addBlock( $this->restoreBlockFromXml( $node ) ); + } + else if ( $node->nodeType == XML_ELEMENT_NODE ) + { + $zone->{$node->nodeName} = $node->nodeValue; + } + } + + return $zone; + } + + /** + * Restores value for a given Block $node + * + * @param \DOMElement $node + * + * @return \eZ\Publish\Core\FieldType\Page\Parts\Block + */ + protected function restoreBlockFromXml( DOMElement $node ) + { + $block = new Parts\Block( $this->pageService ); + + if ( $node->hasAttributes() ) + { + foreach ( $node->attributes as $attr ) + { + if ( $attr->name == 'id' ) + { + $value = explode( '_', $attr->value ); + $block->{$attr->name} = $value[1]; + } + else + { + $block->{$attr->name} = $attr->value; + } + } + } + + foreach ( $node->childNodes as $node ) + { + if ( $node->nodeType == XML_ELEMENT_NODE && $node->nodeName == 'item' ) + { + $block->addItem( $this->restoreItemFromXml( $node ) ); + } + else if ( $node->nodeType == XML_ELEMENT_NODE && $node->nodeName == 'rotation' ) + { + $attrValue = array(); + + foreach ( $node->childNodes as $subNode ) + { + if ( $subNode->nodeType == XML_ELEMENT_NODE ) + { + $attrValue[$subNode->nodeName] = $subNode->nodeValue; + } + } + + $block->{$node->nodeName} = $attrValue; + } + else if ( $node->nodeType == XML_ELEMENT_NODE && $node->nodeName == 'custom_attributes' ) + { + $attrValue = array(); + + foreach ( $node->childNodes as $subNode ) + { + if ( $subNode->nodeType == XML_ELEMENT_NODE ) + { + $attrValue[$subNode->nodeName] = $subNode->nodeValue; + } + } + + $block->{$node->nodeName} = $attrValue; + } + else + { + if ( $node->nodeType == XML_ELEMENT_NODE ) + { + $block->{$node->nodeName} = $node->nodeValue; + } + } + } + + return $block; + } + + /** + * Restores value for a given Item $node + * + * @param \DOMElement $node + * + * @return \eZ\Publish\Core\FieldType\Page\Parts\Item + */ + protected function restoreItemFromXml( DOMElement $node ) + { + $item = new Parts\Item( $this->pageService ); + + if ( $node->hasAttributes() ) + { + foreach ( $node->attributes as $attr ) + { + $item->{$attr->name} = $attr->value; + } + } + + foreach ( $node->childNodes as $node ) + { + if ( $node->nodeType == XML_ELEMENT_NODE ) + { + $item->{$node->nodeName} = $node->nodeValue; + } + } + + return $item; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Rating.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Rating.php new file mode 100644 index 0000000..7a44a22 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Rating.php @@ -0,0 +1,87 @@ +dataInt = $value->data ? 1 : null; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = (bool)$value->dataInt; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return false; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Relation.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Relation.php new file mode 100644 index 0000000..6f8a675 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Relation.php @@ -0,0 +1,107 @@ +dataInt = isset( $value->data['destinationContentId'] ) + ? $value->data['destinationContentId'] + : null; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = array( + "destinationContentId" => $value->dataInt, + ); + $fieldValue->sortKey = false; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + // Selection method, 0 = browse, 1 = dropdown + $storageDef->dataInt1 = $fieldDef->fieldTypeConstraints->fieldSettings['selectionMethod']; + + // Selection root, location ID + $storageDef->dataInt2 = $fieldDef->fieldTypeConstraints->fieldSettings['selectionRoot']; + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + // Selection method, 0 = browse, 1 = dropdown + $fieldDef->fieldTypeConstraints->fieldSettings['selectionMethod'] = $storageDef->dataInt1; + + // Selection root, location ID + + $fieldDef->fieldTypeConstraints->fieldSettings['selectionRoot'] = + $storageDef->dataInt2 === 0 + ? '' + : $storageDef->dataInt2; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return false + */ + public function getIndexColumn() + { + return 'sort_key_int'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/RelationList.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/RelationList.php new file mode 100644 index 0000000..3bd17b6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/RelationList.php @@ -0,0 +1,301 @@ +db = $db; + } + + /** + * Converts data from $value to $storageFieldValue + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $value + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $storageFieldValue + */ + public function toStorageValue( FieldValue $value, StorageFieldValue $storageFieldValue ) + { + $doc = new DOMDocument( '1.0', 'utf-8' ); + $root = $doc->createElement( 'related-objects' ); + $doc->appendChild( $root ); + + $relationList = $doc->createElement( 'relation-list' ); + foreach ( $this->getRelationXmlHashFromDB( $value->data['destinationContentIds'] ) as $row ) + { + $relationItem = $doc->createElement( 'relation-item' ); + foreach ( self::dbAttributeMap() as $domAttrKey => $propertyKey ) + { + if ( !isset( $row[$propertyKey] ) ) + throw new \RuntimeException( "Missing relation-item external data property: $propertyKey" ); + + $relationItem->setAttribute( $domAttrKey, $row[$propertyKey] ); + } + $relationList->appendChild( $relationItem ); + unset( $relationItem ); + } + + $root->appendChild( $relationList ); + $doc->appendChild( $root ); + + $storageFieldValue->dataText = $doc->saveXML(); + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = array( 'destinationContentIds' => array() ); + if ( $value->dataText === null ) + return; + + $dom = new DOMDocument( '1.0', 'utf-8' ); + if ( $dom->loadXML( $value->dataText ) === true ) + { + foreach ( $dom->getElementsByTagName( 'relation-item' ) as $relationItem ) + { + /** @var \DOMElement $relationItem */ + $fieldValue->data['destinationContentIds'][] = $relationItem->getAttribute( 'contentobject-id' ); + } + } + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $fieldSettings = $fieldDef->fieldTypeConstraints->fieldSettings; + $doc = new DOMDocument( '1.0', 'utf-8' ); + $root = $doc->createElement( 'related-objects' ); + $doc->appendChild( $root ); + + $constraints = $doc->createElement( 'constraints' ); + if ( !empty( $fieldSettings['selectionContentTypes'] ) ) + { + foreach ( $fieldSettings['selectionContentTypes'] as $typeIdentifier ) + { + $allowedClass = $doc->createElement( 'allowed-class' ); + $allowedClass->setAttribute( 'contentclass-identifier', $typeIdentifier ); + $constraints->appendChild( $allowedClass ); + unset( $allowedClass ); + } + } + $root->appendChild( $constraints ); + + $type = $doc->createElement( 'type' ); + $type->setAttribute( 'value', 2 );//Deprecated advance object relation list type, set since 4.x does + $root->appendChild( $type ); + + $objectClass = $doc->createElement( 'object_class' ); + $objectClass->setAttribute( 'value', '' );//Deprecated advance object relation class type, set since 4.x does + $root->appendChild( $objectClass ); + + $selectionType = $doc->createElement( 'selection_type' ); + if ( isset( $fieldSettings['selectionMethod'] ) ) + $selectionType->setAttribute( 'value', (int)$fieldSettings['selectionMethod'] ); + else + $selectionType->setAttribute( 'value', 0 ); + $root->appendChild( $selectionType ); + + $defaultLocation = $doc->createElement( 'contentobject-placement' ); + if ( !empty( $fieldSettings['selectionDefaultLocation'] ) ) + $defaultLocation->setAttribute( 'node-id', (int)$fieldSettings['selectionDefaultLocation'] ); + $root->appendChild( $defaultLocation ); + + $doc->appendChild( $root ); + $storageDef->dataText5 = $doc->saveXML(); + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + // default settings + $fieldDef->fieldTypeConstraints->fieldSettings = array( + 'selectionMethod' => 0, + 'selectionDefaultLocation' => null, + 'selectionContentTypes' => array() + ); + + // default value + $fieldDef->defaultValue = new FieldValue(); + $fieldDef->defaultValue->data = array( 'destinationContentIds' => array() ); + + if ( $storageDef->dataText5 === null ) + return; + + // read settings from storage + $fieldSettings =& $fieldDef->fieldTypeConstraints->fieldSettings; + $dom = new DOMDocument( '1.0', 'utf-8' ); + if ( $dom->loadXML( $storageDef->dataText5 ) !== true ) + return; + + if ( $selectionType = $dom->getElementsByTagName( 'selection_type' ) ) + $fieldSettings['selectionMethod'] = (int)$selectionType->item( 0 )->getAttribute( 'value' ); + + if ( + ( $defaultLocation = $dom->getElementsByTagName( 'contentobject-placement' ) ) && + $defaultLocation->item( 0 )->hasAttribute( 'node-id' ) + ) + $fieldSettings['selectionDefaultLocation'] = (int)$defaultLocation->item( 0 )->getAttribute( 'node-id' ); + + if ( !( $constraints = $dom->getElementsByTagName( 'constraints' ) ) ) + return; + + foreach ( $constraints->item( 0 )->childNodes as $allowedClass ) + $fieldSettings['selectionContentTypes'][] = $allowedClass->getAttribute( 'contentclass-identifier' ); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return boolean + */ + public function getIndexColumn() + { + return 'sort_key_string'; + } + + /** + * @param mixed[] $destinationContentIds + * + * @throws \Exception + * + * @return array + */ + private function getRelationXmlHashFromDB( array $destinationContentIds ) + { + if ( empty( $destinationContentIds ) ) + return array(); + + $q = $this->db->createSelectQuery(); + $q + ->select( + $this->db->aliasedColumn( $q, 'id', 'ezcontentobject' ), + $this->db->aliasedColumn( $q, 'remote_id', 'ezcontentobject' ), + $this->db->aliasedColumn( $q, 'current_version', 'ezcontentobject' ), + $this->db->aliasedColumn( $q, 'contentclass_id', 'ezcontentobject' ), + $this->db->aliasedColumn( $q, 'node_id', 'ezcontentobject_tree' ), + $this->db->aliasedColumn( $q, 'parent_node_id', 'ezcontentobject_tree' ) + ) + ->from( $this->db->quoteTable( 'ezcontentobject' ) ) + ->leftJoin( + $this->db->quoteTable( 'ezcontentobject_tree' ), + $q->expr->lAnd( + $q->expr->eq( + $this->db->quoteColumn( 'contentobject_id', 'ezcontentobject_tree' ), + $this->db->quoteColumn( 'id', 'ezcontentobject' ) + ), + $q->expr->eq( + $this->db->quoteColumn( 'node_id', 'ezcontentobject_tree' ), + $this->db->quoteColumn( 'main_node_id', 'ezcontentobject_tree' ) + ) + ) + ) + ->where( + $q->expr->in( + $this->db->quoteColumn( 'id' ), + $destinationContentIds + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + $rows = $stmt->fetchAll( \PDO::FETCH_ASSOC ); + + if ( empty( $rows ) ) + throw new \Exception( "Could find Content with id's" . var_export( $destinationContentIds, true ) ); + else if ( count( $rows ) !== count( $destinationContentIds ) ) + throw new \Exception( "Miss match of rows & id count:" . var_export( $destinationContentIds, true ) ); + + // Add priority starting from 1 + for ( $i = 0; isset( $rows[$i] ); ++$i ) + { + $rows[$i]['priority'] = $i + 1; + } + + return $rows; + } + + /** + * @return array + */ + static private function dbAttributeMap() + { + return array( + // 'identifier' => 'identifier',// not used + 'priority' => 'priority', + // 'in-trash' => 'in_trash',// false by default and implies + 'contentobject-id' => 'ezcontentobject_id', + 'contentobject-version' => 'ezcontentobject_current_version', + 'node-id' => 'ezcontentobject_tree_node_id', + 'parent-node-id' => 'ezcontentobject_tree_parent_node_id', + 'contentclass-id' => 'ezcontentobject_contentclass_id', + //'contentclass-identifier' => 'contentclass_identifier',@todo Re add + // 'is-modified' => 'is_modified',// deprecated and not used + 'contentobject-remote-id' => 'ezcontentobject_remote_id' + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Selection.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Selection.php new file mode 100644 index 0000000..3df738a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Selection.php @@ -0,0 +1,142 @@ +sortKeyString = $storageFieldValue->dataText = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + if ( $value->dataText !== '' ) + { + $fieldValue->data = array_map( + 'intval', + explode( '-', $value->dataText ) + ); + } + else + { + $fieldValue->data = array(); + } + $fieldValue->sortKey = $value->sortKeyString; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + $fieldSettings = $fieldDef->fieldTypeConstraints->fieldSettings; + + if ( isset( $fieldSettings["isMultiple"] ) ) + $storageDef->dataInt1 = (int)$fieldSettings["isMultiple"]; + + if ( !empty( $fieldSettings["options"] ) ) + { + $xml = new DOMDocument( "1.0", "utf-8" ); + $xml->appendChild( + $selection = $xml->createElement( "ezselection" ) + ); + $selection->appendChild( + $options = $xml->createElement( "options" ) + ); + foreach ( $fieldSettings["options"] as $id => $name ) + { + $options->appendChild( + $option = $xml->createElement( "option" ) + ); + $option->setAttribute( "id", $id ); + $option->setAttribute( "name", $name ); + } + $storageDef->dataText5 = $xml->saveXML(); + } + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $options = array(); + + foreach ( simplexml_load_string( $storageDef->dataText5 )->options->option as $option ) + { + $options[(int)$option["id"]] = (string)$option["name"]; + } + + $fieldDef->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + "isMultiple" => !empty( $storageDef->dataInt1 ) ? (bool)$storageDef->dataInt1 : false, + "options" => $options, + ) + ); + + // @todo: Can Selection store a default value in the DB? + $fieldDef->defaultValue = new FieldValue(); + $fieldDef->defaultValue->data = array(); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return "sort_key_string"; + } + +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/TextBlock.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/TextBlock.php new file mode 100644 index 0000000..c6047cb --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/TextBlock.php @@ -0,0 +1,100 @@ +dataText = $value->data; + $storageFieldValue->sortKeyString = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $value->dataText; + $fieldValue->sortKey = $value->sortKeyString; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + if ( isset( $fieldDef->fieldTypeConstraints->fieldSettings["textRows"] ) ) + { + $storageDef->dataInt1 = $fieldDef->fieldTypeConstraints->fieldSettings["textRows"]; + } + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $fieldDef->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + "textRows" => $storageDef->dataInt1 + ) + ); + $fieldDef->defaultValue->data = null; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_string'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/TextLine.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/TextLine.php new file mode 100644 index 0000000..b7099c0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/TextLine.php @@ -0,0 +1,123 @@ +dataText = $value->data; + $storageFieldValue->sortKeyString = $value->sortKey; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = $value->dataText; + $fieldValue->sortKey = $value->sortKeyString; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + if ( isset( $fieldDef->fieldTypeConstraints->validators[self::STRING_LENGTH_VALIDATOR_IDENTIFIER]['maxStringLength'] ) ) + { + $storageDef->dataInt1 = $fieldDef->fieldTypeConstraints->validators[self::STRING_LENGTH_VALIDATOR_IDENTIFIER]['maxStringLength']; + } + else + { + $storageDef->dataInt1 = 0; + } + + if ( isset( $fieldDef->fieldTypeConstraints->validators[self::STRING_LENGTH_VALIDATOR_IDENTIFIER]['minStringLength'] ) ) + { + $storageDef->dataInt2 = $fieldDef->fieldTypeConstraints->validators[self::STRING_LENGTH_VALIDATOR_IDENTIFIER]['minStringLength']; + } + else + { + $storageDef->dataInt2 = 0; + } + + $storageDef->dataText1 = $fieldDef->defaultValue->data; + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + $validatorConstraints = array(); + + if ( isset( $storageDef->dataInt1 ) ) + { + $validatorConstraints[self::STRING_LENGTH_VALIDATOR_IDENTIFIER]["maxStringLength"] = (int)$storageDef->dataInt1; + } + if ( isset( $storageDef->dataInt2 ) ) + { + $validatorConstraints[self::STRING_LENGTH_VALIDATOR_IDENTIFIER]["minStringLength"] = (int)$storageDef->dataInt2; + } + + $fieldDef->fieldTypeConstraints->validators = $validatorConstraints; + $fieldDef->defaultValue->data = $storageDef->dataText1 ?: null; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return 'sort_key_string'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Url.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Url.php new file mode 100644 index 0000000..40c07c3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/Url.php @@ -0,0 +1,99 @@ +dataText = isset( $value->data['text'] ) + ? $value->data['text'] + : null; + $storageFieldValue->dataInt = isset( $value->data['urlId'] ) + ? $value->data['urlId'] + : null; + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $fieldValue->data = array( + "urlId" => $value->dataInt, + 'text' => $value->dataText, + ); + $fieldValue->sortKey = false; + } + + /** + * Converts field definition data in $fieldDef into $storageFieldDef + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDef, StorageFieldDefinition $storageDef ) + { + } + + /** + * Converts field definition data in $storageDef into $fieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + */ + public function toFieldDefinition( StorageFieldDefinition $storageDef, FieldDefinition $fieldDef ) + { + // @todo: Is it possible to store a default value in the DB? + $fieldDef->defaultValue = new FieldValue(); + $fieldDef->defaultValue->data = array( 'text' => null ); + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return false + */ + public function getIndexColumn() + { + return false; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/XmlText.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/XmlText.php new file mode 100644 index 0000000..3cf0d52 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/Converter/XmlText.php @@ -0,0 +1,111 @@ +dataText = $value->data->saveXML(); + } + + /** + * Converts data from $value to $fieldValue + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + */ + public function toFieldValue( StorageFieldValue $value, FieldValue $fieldValue ) + { + $domDoc = new DOMDocument; + $domDoc->loadXML( $value->dataText ?: Value::EMPTY_VALUE ); + $fieldValue->data = $domDoc; + } + + /** + * Converts field definition data from $fieldDefinition into $storageFieldDefinition + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDefinition + */ + public function toStorageFieldDefinition( FieldDefinition $fieldDefinition, StorageFieldDefinition $storageDefinition ) + { + $storageDefinition->dataInt1 = $fieldDefinition->fieldTypeConstraints->fieldSettings['numRows']; + $storageDefinition->dataText2 = $fieldDefinition->fieldTypeConstraints->fieldSettings['tagPreset']; + if ( !empty( $fieldDefinition->defaultValue->data ) ) + $storageDefinition->dataText1 = $fieldDefinition->defaultValue->data->saveXML(); + } + + /** + * Converts field definition data from $storageDefinition into $fieldDefinition + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageDefinition + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + */ + public function toFieldDefinition( StorageFieldDefinition $storageDefinition, FieldDefinition $fieldDefinition ) + { + $fieldDefinition->fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'numRows' => $storageDefinition->dataInt1, + 'tagPreset' => $storageDefinition->dataText2 + ) + ); + + $defaultValue = null; + if ( !empty( $storageDefinition->dataText1 ) ) + { + $defaultValue = new DOMDocument; + $defaultValue->loadXML( $storageDefinition->dataText1 ); + } + $fieldDefinition->defaultValue->data = $defaultValue; + } + + /** + * Returns the name of the index column in the attribute table + * + * Returns the name of the index column the datatype uses, which is either + * "sort_key_int" or "sort_key_string". This column is then used for + * filtering and sorting for this type. + * + * @return string + */ + public function getIndexColumn() + { + return null; + } + +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/ConverterRegistry.php b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/ConverterRegistry.php new file mode 100644 index 0000000..479cbc7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/FieldValue/ConverterRegistry.php @@ -0,0 +1,93 @@ +converterMap = $converterMap; + } + + /** + * Register a $converter for $typeName + * + * @param string $typeName + * @param mixed $converter Callable or converter instance + * + * @return void + */ + public function register( $typeName, $converter ) + { + $this->converterMap[$typeName] = $converter; + } + + /** + * Returns converter for $typeName + * + * @param string $typeName + * + * @throws \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Exception\NotFound + * @throws \RuntimeException When type is neither Converter instance or callable factory + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter + */ + public function getConverter( $typeName ) + { + if ( !isset( $this->converterMap[$typeName] ) ) + { + throw new NotFound( $typeName ); + } + else if ( !$this->converterMap[$typeName] instanceof Converter ) + { + if ( !is_callable( $this->converterMap[$typeName] ) ) + { + var_dump($this->converterMap[$typeName]);exit; +// throw new \RuntimeException( "Converter '$typeName' is neither callable or instance" ); + } + + $factory = $this->converterMap[$typeName]; + $this->converterMap[$typeName] = call_user_func( $factory ); + + if ( !$this->converterMap[$typeName] instanceof Converter ) + { + throw new \RuntimeException( + "Converter '$typeName' callable did not return a converter, instead: " + . gettype( $this->converterMap[$typeName] ) + ); + } + } + return $this->converterMap[$typeName]; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway.php new file mode 100644 index 0000000..2217c78 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway.php @@ -0,0 +1,360 @@ + Boolean indicating if content's language mask contains alwaysAvailable bit field + * - main_language_code => Language code for main (initial) language. E.g. "eng-GB" + * + * @param int $contentId + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException + * + * @return array + */ + abstract public function loadContentInfo( $contentId ); + + /** + * Loads version info for content identified by $contentId and $versionNo. + * Will basically return a hash containing all field values from ezcontentobject_version table plus following keys: + * - names => Hash of content object names. Key is the language code, value is the name. + * - languages => Hash of language ids. Key is the language code (e.g. "eng-GB"), value is the language numeric id without the always available bit. + * - initial_language_code => Language code for initial language in this version. + * + * @param int $contentId + * @param int $versionNo + * + * @return array + */ + abstract public function loadVersionInfo( $contentId, $versionNo ); + + /** + * Returns data for all versions with given status created by the given $userId + * + * @param int $userId + * @param int $status + * + * @return string[][] + */ + abstract public function listVersionsForUser( $userId, $status = VersionInfo::STATUS_DRAFT ); + + /** + * Returns all version data for the given $contentId + * + * @param mixed $contentId + * + * @return string[][] + */ + abstract public function listVersions( $contentId ); + + /** + * Returns last version number for content identified by $contentId + * + * @param int $contentId + * + * @return int + */ + abstract public function getLastVersionNumber( $contentId ); + + /** + * Returns all IDs for locations that refer to $contentId + * + * @param int $contentId + * + * @return int[] + */ + abstract public function getAllLocationIds( $contentId ); + + /** + * Returns all field IDs of $contentId grouped by their type. + * If $versionNo is set only field IDs for that version are returned. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return int[][] + */ + abstract public function getFieldIdsByType( $contentId, $versionNo = null ); + + /** + * Deletes relations to and from $contentId. + * If $versionNo is set only relations for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + abstract public function deleteRelations( $contentId, $versionNo = null ); + + /** + * Deletes the field with the given $fieldId + * + * @param int $fieldId + * @param int $version + * + * @return void + */ + abstract public function deleteField( $fieldId, $version ); + + /** + * Deletes all fields of $contentId in all versions. + * If $versionNo is set only fields for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + abstract public function deleteFields( $contentId, $versionNo = null ); + + /** + * Deletes all versions of $contentId. + * If $versionNo is set only that version is deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + abstract public function deleteVersions( $contentId, $versionNo = null ); + + /** + * Deletes all names of $contentId. + * If $versionNo is set only names for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + abstract public function deleteNames( $contentId, $versionNo = null ); + + /** + * Sets the content object name + * + * @param int $contentId + * @param int $version + * @param string $name + * @param string $language + * + * @return void + */ + abstract public function setName( $contentId, $version, $name, $language ); + + /** + * Deletes the actual content object referred to by $contentId + * + * @param int $contentId + * + * @return void + */ + abstract public function deleteContent( $contentId ); + + /** + * Loads data for the latest published version of the content identified by + * $contentId + * + * @param mixed $contentId + * + * @return array + */ + abstract public function loadLatestPublishedData( $contentId ); + + /** + * Loads data of related to/from $contentId + * + * @param int $contentId + * @param int $contentVersionNo + * @param int $relationType + * + * @return mixed[][] Content data, array structured like {@see \eZ\Publish\Core\Persistence\Legacy\Content\Gateway::load()} + */ + abstract public function loadRelations( $contentId, $contentVersionNo = null, $relationType = null ); + + /** + * Loads data of related to/from $contentId + * + * @param int $contentId + * @param boolean $reverse Reverse relation, default false + * @param int $contentVersionNo + * @param int $relationType + * + * @return mixed[][] Content data, array structured like {@see \eZ\Publish\Core\Persistence\Legacy\Content\Gateway::load()} + */ + abstract public function loadReverseRelations( $contentId, $relationType = null ); + + /** + * Deletes the relation with the given $relationId + * + * @param int $relationId + * + * @return void + */ + abstract public function deleteRelation( $relationId ); + + /** + * Inserts a new relation database record + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $createStruct + * + * @return int ID the inserted ID + */ + abstract public function insertRelation( RelationCreateStruct $createStruct ); +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/ExceptionConversion.php b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/ExceptionConversion.php new file mode 100644 index 0000000..ac0814b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/ExceptionConversion.php @@ -0,0 +1,815 @@ +innerGateway = $innerGateway; + } + + /** + * Get context definition for external storage layers + * + * @return array + */ + public function getContext() + { + try + { + return $this->innerGateway->getContext(); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new content object. + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $struct + * @param mixed $currentVersionNo + * + * @return int ID + */ + public function insertContentObject( CreateStruct $struct, $currentVersionNo = 1 ) + { + try + { + return $this->innerGateway->insertContentObject( $struct, $currentVersionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new version. + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field[] $fields + * + * @return int ID + */ + public function insertVersion( VersionInfo $versionInfo, array $fields ) + { + try + { + return $this->innerGateway->insertVersion( $versionInfo, $fields ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates an existing content identified by $contentId in respect to $struct + * + * @param int $contentId + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $struct + * + * @return void + */ + public function updateContent( $contentId, MetadataUpdateStruct $struct ) + { + try + { + return $this->innerGateway->updateContent( $contentId, $struct ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates version $versionNo for content identified by $contentId, in respect to $struct + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\UpdateStruct $struct + * + * @return void + */ + public function updateVersion( $contentId, $versionNo, UpdateStruct $struct ) + { + try + { + return $this->innerGateway->updateVersion( $contentId, $versionNo, $struct ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates "always available" flag for content identified by $contentId, in respect to $alwaysAvailable. + * + * @param int $contentId + * @param boolean $newAlwaysAvailable New "always available" value + */ + public function updateAlwaysAvailableFlag( $contentId, $newAlwaysAvailable ) + { + try + { + return $this->innerGateway->updateAlwaysAvailableFlag( $contentId, $newAlwaysAvailable ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Sets the state of object identified by $contentId and $version to $state. + * + * The $status can be one of STATUS_DRAFT, STATUS_PUBLISHED, STATUS_ARCHIVED + * + * @param int $contentId + * @param int $version + * @param int $status + * + * @return boolean + */ + public function setStatus( $contentId, $version, $status ) + { + try + { + return $this->innerGateway->setStatus( $contentId, $version, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new field. + * + * Only used when a new field is created (i.e. a new object or a field in a + * new language!). After that, field IDs need to stay the same, only the + * version number changes. + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * + * @return int ID + */ + public function insertNewField( Content $content, Field $field, StorageFieldValue $value ) + { + try + { + return $this->innerGateway->insertNewField( $content, $field, $value ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts an existing field. + * + * Used to insert a field with an exsting ID but a new version number. + * + * @param Content $content + * @param Field $field + * @param StorageFieldValue $value + * + * @return void + */ + public function insertExistingField( Content $content, Field $field, StorageFieldValue $value ) + { + try + { + return $this->innerGateway->insertExistingField( $content, $field, $value ); + } + catch ( \ezcDbException $e ) + { + throw $e; + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw $e; + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates an existing field + * + * @param Field $field + * @param StorageFieldValue $value + * + * @return void + */ + public function updateField( Field $field, StorageFieldValue $value ) + { + try + { + return $this->innerGateway->updateField( $field, $value ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates an existing, non-translatable field + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param int $contentId + * + * @return void + */ + public function updateNonTranslatableField( + Field $field, + StorageFieldValue $value, + $contentId ) + { + try + { + return $this->innerGateway->updateNonTranslatableField( $field, $value, $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for a content object + * + * Returns an array with the relevant data. + * + * @param mixed $contentId + * @param mixed $version + * @param string[] $translations + * + * @return array + */ + public function load( $contentId, $version, $translations = null ) + { + try + { + return $this->innerGateway->load( $contentId, $version, $translations ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads info for content identified by $contentId. + * Will basically return a hash containing all field values for ezcontentobject table plus following keys: + * - always_available => Boolean indicating if content's language mask contains alwaysAvailable bit field + * - main_language_code => Language code for main (initial) language. E.g. "eng-GB" + * + * @param int $contentId + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException + * + * @return array + */ + public function loadContentInfo( $contentId ) + { + try + { + return $this->innerGateway->loadContentInfo( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads version info for content identified by $contentId and $versionNo. + * Will basically return a hash containing all field values from ezcontentobject_version table plus following keys: + * - names => Hash of content object names. Key is the language code, value is the name. + * - languages => Hash of language ids. Key is the language code (e.g. "eng-GB"), value is the language numeric id without the always available bit. + * - initial_language_code => Language code for initial language in this version. + * + * @param int $contentId + * @param int $versionNo + * + * @return array + */ + public function loadVersionInfo( $contentId, $versionNo ) + { + try + { + return $this->innerGateway->loadVersionInfo( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns data for all versions with given status created by the given $userId + * + * @param int $userId + * @param int $status + * + * @return string[][] + */ + public function listVersionsForUser( $userId, $status = VersionInfo::STATUS_DRAFT ) + { + try + { + return $this->innerGateway->listVersionsForUser( $userId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns all version data for the given $contentId + * + * @param mixed $contentId + * + * @return string[][] + */ + public function listVersions( $contentId ) + { + try + { + return $this->innerGateway->listVersions( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns last version number for content identified by $contentId + * + * @param int $contentId + * + * @return int + */ + public function getLastVersionNumber( $contentId ) + { + try + { + return $this->innerGateway->getLastVersionNumber( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns all IDs for locations that refer to $contentId + * + * @param int $contentId + * + * @return int[] + */ + public function getAllLocationIds( $contentId ) + { + try + { + return $this->innerGateway->getAllLocationIds( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns all field IDs of $contentId grouped by their type. + * If $versionNo is set only field IDs for that version are returned. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return int[][] + */ + public function getFieldIdsByType( $contentId, $versionNo = null ) + { + try + { + return $this->innerGateway->getFieldIdsByType( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes relations to and from $contentId. + * If $versionNo is set only relations for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteRelations( $contentId, $versionNo = null ) + { + try + { + return $this->innerGateway->deleteRelations( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the field with the given $fieldId + * + * @param int $fieldId + * @param int $version + * + * @return void + */ + public function deleteField( $fieldId, $version ) + { + try + { + return $this->innerGateway->deleteField( $fieldId, $version ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes all fields of $contentId in all versions. + * If $versionNo is set only fields for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteFields( $contentId, $versionNo = null ) + { + try + { + return $this->innerGateway->deleteFields( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes all versions of $contentId. + * If $versionNo is set only that version is deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteVersions( $contentId, $versionNo = null ) + { + try + { + return $this->innerGateway->deleteVersions( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes all names of $contentId. + * If $versionNo is set only names for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteNames( $contentId, $versionNo = null ) + { + try + { + return $this->innerGateway->deleteNames( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Sets the content object name + * + * @param int $contentId + * @param int $version + * @param string $name + * @param string $language + * + * @return void + */ + public function setName( $contentId, $version, $name, $language ) + { + try + { + return $this->innerGateway->setName( $contentId, $version, $name, $language ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the actual content object referred to by $contentId + * + * @param int $contentId + * + * @return void + */ + public function deleteContent( $contentId ) + { + try + { + return $this->innerGateway->deleteContent( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for the latest published version of the content identified by + * $contentId + * + * @param mixed $contentId + * + * @return array + */ + public function loadLatestPublishedData( $contentId ) + { + try + { + return $this->innerGateway->loadLatestPublishedData( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data of related to/from $contentId + * + * @param int $contentId + * @param int $contentVersionNo + * @param int $relationType + * + * @return mixed[][] Content data, array structured like {@see \eZ\Publish\Core\Persistence\Legacy\Content\Gateway::load()} + */ + public function loadRelations( $contentId, $contentVersionNo = null, $relationType = null ) + { + try + { + return $this->innerGateway->loadRelations( $contentId, $contentVersionNo, $relationType ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data of related to/from $contentId + * + * @param int $contentId + * @param boolean $reverse Reverse relation, default false + * @param int $contentVersionNo + * @param int $relationType + * + * @return mixed[][] Content data, array structured like {@see \eZ\Publish\Core\Persistence\Legacy\Content\Gateway::load()} + */ + public function loadReverseRelations( $contentId, $relationType = null ) + { + try + { + return $this->innerGateway->loadReverseRelations( $contentId, $relationType ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the relation with the given $relationId + * + * @param int $relationId + * + * @return void + */ + public function deleteRelation( $relationId ) + { + try + { + return $this->innerGateway->deleteRelation( $relationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new relation database record + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $createStruct + * + * @return int ID the inserted ID + */ + public function insertRelation( RelationCreateStruct $struct ) + { + try + { + return $this->innerGateway->insertRelation( $struct ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/EzcDatabase.php new file mode 100644 index 0000000..a3069c5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/EzcDatabase.php @@ -0,0 +1,1496 @@ +dbHandler = $db; + $this->queryBuilder = $queryBuilder; + $this->languageHandler = $languageHandler; + $this->languageMaskGenerator = $languageMaskGenerator; + } + + /** + * Get context definition for external storage layers + * + * @return array + */ + public function getContext() + { + return array( + 'identifier' => 'LegacyStorage', + 'connection' => $this->dbHandler, + ); + } + + /** + * Inserts a new content object. + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $struct + * @param mixed $currentVersionNo + * + * @return int ID + */ + public function insertContentObject( CreateStruct $struct, $currentVersionNo = 1 ) + { + $initialLanguageCode = $this->languageHandler->load( $struct->initialLanguageId )->languageCode; + if ( isset( $struct->name[$initialLanguageCode] ) ) + { + $name = $struct->name[$initialLanguageCode]; + } + else + { + $name = ''; + } + + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcontentobject', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'current_version' ), + $q->bindValue( $currentVersionNo, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $q->bindValue( $name, null, \PDO::PARAM_STR ) + )->set( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $struct->typeId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'section_id' ), + $q->bindValue( $struct->sectionId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'owner_id' ), + $q->bindValue( $struct->ownerId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'initial_language_id' ), + $q->bindValue( $struct->initialLanguageId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'remote_id' ), + $q->bindValue( $struct->remoteId, null, \PDO::PARAM_STR ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'published' ), + $q->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'status' ), + $q->bindValue( ContentInfo::STATUS_DRAFT, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $q->bindValue( + $this->generateLanguageMask( + $struct->fields, $struct->alwaysAvailable + ), + null, + \PDO::PARAM_INT + ) + ); + + $q->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentobject', 'id' ) + ); + } + + /** + * Generates a language mask for $version + * + * @param \eZ\Publish\SPI\Persistence\Content\Field[] $fields + * @param boolean $alwaysAvailable + * + * @return int + */ + protected function generateLanguageMask( array $fields, $alwaysAvailable ) + { + $languages = array(); + foreach ( $fields as $field ) + { + if ( isset( $languages[$field->languageCode] ) ) + continue; + + $languages[$field->languageCode] = true; + } + + if ( $alwaysAvailable ) + { + $languages['always-available'] = true; + } + return $this->languageMaskGenerator->generateLanguageMask( $languages ); + } + + /** + * Inserts a new version. + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field[] $fields + * + * @return int ID + */ + public function insertVersion( VersionInfo $versionInfo, array $fields ) + { + /** @var $q \ezcQueryInsert */ + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( + $this->dbHandler->quoteTable( 'ezcontentobject_version' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcontentobject_version', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $versionInfo->versionNo, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( $versionInfo->modificationDate, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'creator_id' ), + $q->bindValue( $versionInfo->creatorId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'created' ), + $q->bindValue( $versionInfo->creationDate, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'status' ), + $q->bindValue( $versionInfo->status, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'initial_language_id' ), + $q->bindValue( $this->languageHandler->loadByLanguageCode( $versionInfo->initialLanguageCode )->id, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $versionInfo->contentInfo->id, null, \PDO::PARAM_INT ) + )->set( + // As described in field mapping document + $this->dbHandler->quoteColumn( 'workflow_event_pos' ), + $q->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $q->bindValue( + $this->generateLanguageMask( + $fields, $versionInfo->contentInfo->alwaysAvailable + ), + null, + \PDO::PARAM_INT + ) + ); + + $q->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentobject_version', 'id' ) + ); + } + + /** + * Updates an existing content identified by $contentId in respect to $struct + * + * @param int $contentId + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $struct + * + * @return void + */ + public function updateContent( $contentId, MetadataUpdateStruct $struct ) + { + $q = $this->dbHandler->createUpdateQuery(); + $q->update( $this->dbHandler->quoteTable( 'ezcontentobject' ) ); + + if ( isset( $struct->name ) ) + { + $q->set( + $this->dbHandler->quoteColumn( 'name' ), + $q->bindValue( $struct->name, null, \PDO::PARAM_STR ) + ); + } + if ( isset( $struct->mainLanguageId ) ) + { + $q->set( + $this->dbHandler->quoteColumn( 'initial_language_id' ), + $q->bindValue( $struct->mainLanguageId, null, \PDO::PARAM_INT ) + ); + } + if ( isset( $struct->modificationDate ) ) + { + $q->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( $struct->modificationDate, null, \PDO::PARAM_INT ) + ); + } + if ( isset( $struct->ownerId ) ) + { + $q->set( + $this->dbHandler->quoteColumn( 'owner_id' ), + $q->bindValue( $struct->ownerId, null, \PDO::PARAM_INT ) + ); + } + if ( isset( $struct->publicationDate ) ) + { + $q->set( + $this->dbHandler->quoteColumn( 'published' ), + $q->bindValue( $struct->publicationDate, null, \PDO::PARAM_INT ) + ); + } + if ( isset( $struct->remoteId ) ) + { + $q->set( + $this->dbHandler->quoteColumn( 'remote_id' ), + $q->bindValue( $struct->remoteId, null, \PDO::PARAM_STR ) + ); + } + + $q->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $q->prepare()->execute(); + + // Handle alwaysAvailable flag update separately as it's a more complex task and has impact on several tables + if ( isset( $struct->alwaysAvailable ) ) + { + $this->updateAlwaysAvailableFlag( $contentId, $struct->alwaysAvailable ); + } + } + + /** + * Updates version $versionNo for content identified by $contentId, in respect to $struct + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\UpdateStruct $struct + * + * @return void + */ + public function updateVersion( $contentId, $versionNo, UpdateStruct $struct ) + { + $q = $this->dbHandler->createUpdateQuery(); + $q->update( + $this->dbHandler->quoteTable( 'ezcontentobject_version' ) + )->set( + $this->dbHandler->quoteColumn( 'creator_id' ), + $q->bindValue( $struct->creatorId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( $struct->modificationDate, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'initial_language_id' ), + $q->bindValue( $struct->initialLanguageId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $q->expr->bitOr( + $this->dbHandler->quoteColumn( 'language_mask' ), + $q->bindValue( $this->generateLanguageMask( $struct->fields, false ), null, \PDO::PARAM_INT ) + ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Updates "always available" flag for content identified by $contentId, in respect to $alwaysAvailable. + * + * @param int $contentId + * @param boolean $newAlwaysAvailable New "always available" value + */ + public function updateAlwaysAvailableFlag( $contentId, $newAlwaysAvailable ) + { + // We will need to know some info on the current language mask to update the flag everywhere needed + $contentInfoRow = $this->loadContentInfo( $contentId ); + + // Only update if old and new flags differs + if ( $contentInfoRow['language_mask'] & 1 == $newAlwaysAvailable ) + { + return; + } + + /** @var $q \ezcQueryUpdate */ + $q = $this->dbHandler->createUpdateQuery(); + $q + ->update( $this->dbHandler->quoteTable( 'ezcontentobject' ) ) + ->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $newAlwaysAvailable ? + $q->expr->bitOr( $this->dbHandler->quoteColumn( 'language_mask' ), 1 ) : + $q->expr->bitAnd( $this->dbHandler->quoteColumn( 'language_mask' ), -2 ) + ) + ->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $q->prepare()->execute(); + + // Now we need to update ezcontentobject_name + /** @var $qName \ezcQueryUpdate */ + $qName = $this->dbHandler->createUpdateQuery(); + $qName + ->update( $this->dbHandler->quoteTable( 'ezcontentobject_name' ) ) + ->set( + $this->dbHandler->quoteColumn( 'language_id' ), + $newAlwaysAvailable ? + $qName->expr->bitOr( $this->dbHandler->quoteColumn( 'language_id' ), 1 ) : + $qName->expr->bitAnd( $this->dbHandler->quoteColumn( 'language_id' ), -2 ) + ) + ->where( + $qName->expr->lAnd( + $qName->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $qName->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $qName->expr->eq( + $this->dbHandler->quoteColumn( 'content_version' ), + $qName->bindValue( + $contentInfoRow['current_version'], + null, + \PDO::PARAM_INT + ) + ) + ) + ); + $qName->prepare()->execute(); + + // Now update ezcontentobject_attribute for current version + /** @var $qAttr \ezcQueryUpdate */ + $qAttr = $this->dbHandler->createUpdateQuery(); + $qAttr + ->update( $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) ) + ->set( + $this->dbHandler->quoteColumn( 'language_id' ), + $newAlwaysAvailable ? + $qAttr->expr->bitOr( $this->dbHandler->quoteColumn( 'language_id' ), 1 ) : + $qAttr->expr->bitAnd( $this->dbHandler->quoteColumn( 'language_id' ), -2 ) + ) + ->where( + $qAttr->expr->lAnd( + $qAttr->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $qAttr->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $qAttr->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $qAttr->bindValue( + $contentInfoRow['current_version'], + null, + \PDO::PARAM_INT + ) + ) + ) + ); + $qAttr->prepare()->execute(); + } + + /** + * Sets the status of the version identified by $contentId and $version to $status. + * + * The $status can be one of STATUS_DRAFT, STATUS_PUBLISHED, STATUS_ARCHIVED + * + * @param int $contentId + * @param int $version + * @param int $status + * + * @return boolean + */ + public function setStatus( $contentId, $version, $status ) + { + $q = $this->dbHandler->createUpdateQuery(); + $q->update( + $this->dbHandler->quoteTable( 'ezcontentobject_version' ) + )->set( + $this->dbHandler->quoteColumn( 'status' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( time(), null, \PDO::PARAM_INT ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $version, null, \PDO::PARAM_INT ) + ) + ) + ); + $statement = $q->prepare(); + $statement->execute(); + + if ( (bool)$statement->rowCount() === false ) + return false; + + if ( $status !== APIVersionInfo::STATUS_PUBLISHED ) + { + return true; + } + + // If the version's status is PUBLISHED, we set the content to published status as well + $q = $this->dbHandler->createUpdateQuery(); + $q->update( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->set( + $this->dbHandler->quoteColumn( 'status' ), + $q->bindValue( ContentInfo::STATUS_PUBLISHED, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'current_version' ), + $q->bindValue( $version, null, \PDO::PARAM_INT ) + )->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $statement = $q->prepare(); + $statement->execute(); + + return (bool)$statement->rowCount(); + } + + /** + * Inserts a new field. + * + * Only used when a new field is created (i.e. a new object or a field in a + * new language!). After that, field IDs need to stay the same, only the + * version number changes. + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * + * @return int ID + */ + public function insertNewField( Content $content, Field $field, StorageFieldValue $value ) + { + $q = $this->dbHandler->createInsertQuery(); + + $this->setInsertFieldValues( $q, $content, $field, $value ); + + // Insert with auto increment ID + $q->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcontentobject_attribute', 'id' ) + ); + + $q->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentobject_attribute', 'id' ) + ); + } + + /** + * Inserts an existing field. + * + * Used to insert a field with an exsting ID but a new version number. + * + * @param Content $content + * @param Field $field + * @param StorageFieldValue $value + * + * @return void + */ + public function insertExistingField( Content $content, Field $field, StorageFieldValue $value ) + { + $q = $this->dbHandler->createInsertQuery(); + + $this->setInsertFieldValues( $q, $content, $field, $value ); + + $q->set( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $field->id, null, \PDO::PARAM_INT ) + ); + + $q->prepare()->execute(); + } + + /** + * Inserts $field with $newFieldId or not + * + * @param Content $content + * @param Field $field + * @param StorageFieldValue $value + * @param mixed $newFieldId + * + * @return int|null Maybe a new field ID + */ + protected function setInsertFieldValues( \ezcQueryInsert $q, Content $content, Field $field, StorageFieldValue $value ) + { + $q->insertInto( + $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $content->versionInfo->contentInfo->id, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'contentclassattribute_id' ), + $q->bindValue( $field->fieldDefinitionId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_type_string' ), + $q->bindValue( $field->type ) + )->set( + $this->dbHandler->quoteColumn( 'language_code' ), + $q->bindValue( $field->languageCode ) + )->set( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $field->versionNo ) + )->set( + $this->dbHandler->quoteColumn( 'data_float' ), + $q->bindValue( $value->dataFloat ) + )->set( + $this->dbHandler->quoteColumn( 'data_int' ), + $q->bindValue( $value->dataInt ) + )->set( + $this->dbHandler->quoteColumn( 'data_text' ), + $q->bindValue( $value->dataText ) + )->set( + $this->dbHandler->quoteColumn( 'sort_key_int' ), + $q->bindValue( $value->sortKeyInt ) + )->set( + $this->dbHandler->quoteColumn( 'sort_key_string' ), + $q->bindValue( $value->sortKeyString ) + )->set( + $this->dbHandler->quoteColumn( 'language_id' ), + $q->bindValue( + $this->languageMaskGenerator->generateLanguageIndicator( + $field->languageCode, + $content->versionInfo->contentInfo->alwaysAvailable + ), + null, + \PDO::PARAM_INT + ) + ); + } + + /** + * Updates an existing field + * + * @param Field $field + * @param StorageFieldValue $value + * + * @return void + */ + public function updateField( Field $field, StorageFieldValue $value ) + { + // Note, no need to care for language_id here, since Content->$alwaysAvailable + // cannot change on update + $q = $this->dbHandler->createUpdateQuery(); + $this->setFieldUpdateValues( $q, $value ); + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $field->id, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $field->versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Sets update fields for $value on $q + * + * @param \ezcQueryUpdate $q + * @param StorageFieldValue $value + * + * @return void + */ + protected function setFieldUpdateValues( ezcQueryUpdate $q, StorageFieldValue $value ) + { + $q->update( + $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) + )->set( + $this->dbHandler->quoteColumn( 'data_float' ), + $q->bindValue( $value->dataFloat ) + )->set( + $this->dbHandler->quoteColumn( 'data_int' ), + $q->bindValue( $value->dataInt, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_text' ), + $q->bindValue( $value->dataText ) + )->set( + $this->dbHandler->quoteColumn( 'sort_key_int' ), + $q->bindValue( $value->sortKeyInt, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'sort_key_string' ), + $q->bindValue( $value->sortKeyString ) + ); + } + + /** + * Updates an existing, non-translatable field + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue $value + * @param int $contentId + * + * @return void + */ + public function updateNonTranslatableField( + Field $field, + StorageFieldValue $value, + $contentId ) + { + // Note, no need to care for language_id here, since Content->$alwaysAvailable + // cannot change on update + $q = $this->dbHandler->createUpdateQuery(); + $this->setFieldUpdateValues( $q, $value ); + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclassattribute_id' ), + $q->bindValue( $field->fieldDefinitionId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $field->versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Loads data for a content object + * + * Returns an array with the relevant data. + * + * @param mixed $contentId + * @param mixed $version + * @param string[] $translations + * + * @return array + */ + public function load( $contentId, $version, $translations = null ) + { + $query = $this->queryBuilder->createFindQuery( $translations ); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $query->bindValue( $contentId ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ), + $query->bindValue( $version ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for the latest published version of the content identified by + * $contentId + * + * @param mixed $contentId + * + * @return array + */ + public function loadLatestPublishedData( $contentId ) + { + $query = $this->queryBuilder->createFindQuery(); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ), + $this->dbHandler->quoteColumn( 'current_version', 'ezcontentobject' ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads info for content identified by $contentId. + * Will basically return a hash containing all field values for ezcontentobject table plus some additional keys: + * - always_available => Boolean indicating if content's language mask contains alwaysAvailable bit field + * - main_language_code => Language code for main (initial) language. E.g. "eng-GB" + * + * @param int $contentId + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException + * + * @return array + */ + public function loadContentInfo( $contentId ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + "ezcontentobject.*", + $this->dbHandler->aliasedColumn( $query, 'main_node_id', 'ezcontentobject_tree' ) + )->from( + $this->dbHandler->quoteTable( "ezcontentobject" ) + )->leftJoin( + $this->dbHandler->quoteTable( "ezcontentobject_tree" ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "contentobject_id", "ezcontentobject_tree" ), + $this->dbHandler->quoteColumn( "id", "ezcontentobject" ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "main_node_id", "ezcontentobject_tree" ), + $this->dbHandler->quoteColumn( "node_id", "ezcontentobject_tree" ) + ) + ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + $row = $statement->fetch( \PDO::FETCH_ASSOC ); + + if ( empty( $row ) ) + { + throw new NotFound( "content", $contentId ); + } + + return $row; + } + + /** + * Loads version info for content identified by $contentId and $versionNo. + * Will basically return a hash containing all field values from ezcontentobject_version table plus following keys: + * - names => Hash of content object names. Key is the language code, value is the name. + * - languages => Hash of language ids. Key is the language code (e.g. "eng-GB"), value is the language numeric id without the always available bit. + * - initial_language_code => Language code for initial language in this version. + * + * @param int $contentId + * @param int $versionNo + * + * @return array + */ + public function loadVersionInfo( $contentId, $versionNo ) + { + $query = $this->queryBuilder->createVersionInfoFindQuery(); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns data for all versions with given status created by the given $userId + * + * @param int $userId + * @param int $status + * + * @return string[][] + */ + public function listVersionsForUser( $userId, $status = VersionInfo::STATUS_DRAFT ) + { + $query = $this->queryBuilder->createVersionInfoFindQuery(); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'status', 'ezcontentobject_version' ), + $query->bindValue( $status, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'creator_id', 'ezcontentobject_version' ), + $query->bindValue( $userId, null, \PDO::PARAM_INT ) + ) + ) + )->groupBy( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject_version' ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns all version data for the given $contentId + * + * @param mixed $contentId + * + * @return string[][] + */ + public function listVersions( $contentId ) + { + $query = $this->queryBuilder->createVersionInfoFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + )->groupBy( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject_version' ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns last version number for content identified by $contentId + * + * @param int $contentId + * + * @return int + */ + public function getLastVersionNumber( $contentId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->expr->max( $this->dbHandler->quoteColumn( 'version' ) ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_version' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Returns all IDs for locations that refer to $contentId + * + * @param int $contentId + * + * @return int[] + */ + public function getAllLocationIds( $contentId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( 'node_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_COLUMN ); + } + + /** + * Returns all field IDs of $contentId grouped by their type. + * If $versionNo is set only field IDs for that version are returned. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return int[][] + */ + public function getFieldIdsByType( $contentId, $versionNo = null ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->quoteColumn( 'data_type_string' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + if ( isset( $versionNo ) ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + $result = array(); + foreach ( $statement->fetchAll() as $row ) + { + if ( !isset( $result[$row['data_type_string']] ) ) + { + $result[$row['data_type_string']] = array(); + } + $result[$row['data_type_string']][] = (int)$row['id']; + } + return $result; + } + + /** + * Deletes relations to and from $contentId. + * If $versionNo is set only relations for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteRelations( $contentId, $versionNo = null ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentobject_link' ) + ); + + if ( isset( $versionNo ) ) + { + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'from_contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'from_contentobject_version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ) + ); + } + else + { + $query->where( + $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'from_contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'to_contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ) + ); + } + + $query->prepare()->execute(); + } + + /** + * Deletes the field with the given $fieldId + * + * @param int $fieldId + * @param int $version + * + * @return void + */ + public function deleteField( $fieldId, $version ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $fieldId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $version, null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Deletes all fields of $contentId in all versions. + * If $versionNo is set only fields for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteFields( $contentId, $versionNo = null ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( 'ezcontentobject_attribute' ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + if ( isset( $versionNo ) ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ); + } + + $query->prepare()->execute(); + } + + /** + * Deletes all versions of $contentId. + * If $versionNo is set only that version is deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteVersions( $contentId, $versionNo = null ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( 'ezcontentobject_version' ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + if ( isset( $versionNo ) ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ); + } + + $query->prepare()->execute(); + } + + /** + * Deletes all names of $contentId. + * If $versionNo is set only names for that version are deleted. + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteNames( $contentId, $versionNo = null ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( 'ezcontentobject_name' ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + if ( isset( $versionNo ) ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'content_version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ); + } + + $query->prepare()->execute(); + } + + /** + * Sets the name for Content $contentId in version $version to $name in $language + * + * @param int $contentId + * @param int $version + * @param string $name + * @param string $language + * + * @return void + */ + public function setName( $contentId, $version, $name, $language ) + { + $language = $this->languageHandler->loadByLanguageCode( $language ); + + // Is it an insert or an update ? + $qSelect = $this->dbHandler->createSelectQuery(); + $qSelect + ->select( + $qSelect->alias( $qSelect->expr->count( '*' ), 'count' ) + ) + ->from( $this->dbHandler->quoteTable( 'ezcontentobject_name' ) ) + ->where( + $qSelect->expr->lAnd( + $qSelect->expr->eq( $this->dbHandler->quoteColumn( 'contentobject_id' ), $qSelect->bindValue( $contentId ) ), + $qSelect->expr->eq( $this->dbHandler->quoteColumn( 'content_version' ), $qSelect->bindValue( $version ) ), + $qSelect->expr->eq( $this->dbHandler->quoteColumn( 'content_translation' ), $qSelect->bindValue( $language->languageCode ) ) + ) + ); + $stmt = $qSelect->prepare(); + $stmt->execute(); + $res = $stmt->fetchAll( \PDO::FETCH_ASSOC ); + + $insert = $res[0]['count'] == 0; + if ( $insert ) + { + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( $this->dbHandler->quoteTable( 'ezcontentobject_name' ) ); + } + else + { + $q = $this->dbHandler->createUpdateQuery(); + $q->update( $this->dbHandler->quoteTable( 'ezcontentobject_name' ) ) + ->where( + $q->expr->lAnd( + $q->expr->eq( $this->dbHandler->quoteColumn( 'contentobject_id' ), $q->bindValue( $contentId ) ), + $q->expr->eq( $this->dbHandler->quoteColumn( 'content_version' ), $q->bindValue( $version ) ), + $q->expr->eq( $this->dbHandler->quoteColumn( 'content_translation' ), $q->bindValue( $language->languageCode ) ) + ) + ); + } + + $q->set( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'content_version' ), + $q->bindValue( $version, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'language_id' ), + $q->bindValue( $language->id, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'content_translation' ), + $q->bindValue( $language->languageCode ) + )->set( + $this->dbHandler->quoteColumn( 'real_translation' ), + $q->bindValue( $language->languageCode ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $q->bindValue( $name ) + ); + $q->prepare()->execute(); + } + + /** + * Deletes the actual content object referred to by $contentId + * + * @param int $contentId + * + * @return void + */ + public function deleteContent( $contentId ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( 'ezcontentobject' ) + ->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Loads relations from $contentId to published content, optionally only from $contentVersionNo. + * + * $relationType can also be filtered. + * + * @param int $contentId + * @param int $contentVersionNo + * @param int $relationType + * + * @return string[][] array of relation data + */ + public function loadRelations( $contentId, $contentVersionNo = null, $relationType = null ) + { + $query = $this->queryBuilder->createRelationFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'from_contentobject_id', 'ezcontentobject_link' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + // source version number + if ( isset( $contentVersionNo ) ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'from_contentobject_version', 'ezcontentobject_link' ), + $query->bindValue( $contentVersionNo, null, \PDO::PARAM_INT ) + ) + ); + } + // from published version only + else + { + $query->from( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $this->dbHandler->quoteColumn( 'from_contentobject_id', 'ezcontentobject_link' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'current_version', 'ezcontentobject' ), + $this->dbHandler->quoteColumn( 'from_contentobject_version', 'ezcontentobject_link' ) + ) + ) + ); + } + + // relation type + if ( isset( $relationType ) ) + { + $query->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( 'relation_type', 'ezcontentobject_link' ), + $query->bindValue( $relationType, null, \PDO::PARAM_INT ) + ) + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data that related to $toContentId + * + * @param int $toContentId + * @param int $relationType + * + * @return mixed[][] Content data, array structured like {@see \eZ\Publish\Core\Persistence\Legacy\Content\Gateway::load()} + */ + public function loadReverseRelations( $toContentId, $relationType = null ) + { + $query = $this->queryBuilder->createRelationFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'to_contentobject_id', 'ezcontentobject_link' ), + $query->bindValue( $toContentId, null, \PDO::PARAM_INT ) + ) + ); + + // ezcontentobject join + $query->from( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $this->dbHandler->quoteColumn( 'from_contentobject_id', 'ezcontentobject_link' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'current_version', 'ezcontentobject' ), + $this->dbHandler->quoteColumn( 'from_contentobject_version', 'ezcontentobject_link' ) + ) + ) + ); + + // relation type + if ( isset( $relationType ) ) + { + $query->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( 'relation_type', 'ezcontentobject_link' ), + $query->bindValue( $relationType, null, \PDO::PARAM_INT ) + ) + ); + } + + $statement = $query->prepare(); + + $statement->execute(); + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Inserts a new relation database record + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $createStruct + * + * @return int ID the inserted ID + */ + public function insertRelation( RelationCreateStruct $createStruct ) + { + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( + $this->dbHandler->quoteTable( 'ezcontentobject_link' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcontentobject_link', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'contentclassattribute_id' ), + $q->bindValue( (int)$createStruct->sourceFieldDefinitionId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'from_contentobject_id' ), + $q->bindValue( $createStruct->sourceContentId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'from_contentobject_version' ), + $q->bindValue( $createStruct->sourceContentVersionNo, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'relation_type' ), + $q->bindValue( $createStruct->type, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'to_contentobject_id' ), + $q->bindValue( $createStruct->destinationContentId, null, \PDO::PARAM_INT ) + ); + + $q->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentobject_link', 'id' ) + ); + } + + /** + * Deletes the relation with the given $relationId + * + * @param int $relationId + * + * @return void + */ + public function deleteRelation( $relationId ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( 'ezcontentobject_link' ) + ->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $relationId, null, \PDO::PARAM_INT ) + ) + ); + + $q->prepare()->execute(); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/EzcDatabase/QueryBuilder.php b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/EzcDatabase/QueryBuilder.php new file mode 100644 index 0000000..9da115c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Gateway/EzcDatabase/QueryBuilder.php @@ -0,0 +1,263 @@ +dbHandler = $dbHandler; + } + + /** + * Creates a select query for content objects + * + * Creates a select query with all necessary joins to fetch a complete + * content object. Does not apply any WHERE conditions. + * + * @param string[] $translations + * + * @return \ezcQuerySelect + */ + public function createFindQuery( array $translations = null ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + // Content object + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'contentclass_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'section_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'owner_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'remote_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'current_version', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'initial_language_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'modified', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'published', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'status', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'name', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'language_mask', 'ezcontentobject' ), + // Content object version + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'version', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'modified', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'creator_id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'created', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'status', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'contentobject_id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'language_mask', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'initial_language_id', 'ezcontentobject_version' ), + // Content object fields + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'contentclassattribute_id', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'data_type_string', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'language_code', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'language_id', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'version', 'ezcontentobject_attribute' ), + // Content object field data + $this->dbHandler->aliasedColumn( $query, 'data_float', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'data_int', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'data_text', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'sort_key_int', 'ezcontentobject_attribute' ), + $this->dbHandler->aliasedColumn( $query, 'sort_key_string', 'ezcontentobject_attribute' ), + // Content object names + $this->dbHandler->aliasedColumn( $query, 'name', 'ezcontentobject_name' ), + $this->dbHandler->aliasedColumn( $query, 'content_translation', 'ezcontentobject_name' ), + // Content object locations + $this->dbHandler->aliasedColumn( $query, 'main_node_id', 'ezcontentobject_tree' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject_version' ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ), + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ) + ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_attribute' ), + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_attribute' ), + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ) + ) + ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_tree' ), + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_version', 'ezcontentobject_tree' ), + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ) + ) + ) + ) + // @todo: Joining with ezcontentobject_name is probably a VERY bad way to gather that information + // since it creates an additional cartesian product with translations. + ->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject_name' ), + $query->expr->lAnd( + // ezcontentobject_name.content_translation is also part of the PK but can't be + // easily joined with something at this level + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_name' ), + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'content_version', 'ezcontentobject_name' ), + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ) + ) + ) + ); + + if ( $translations !== null ) + { + $query->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'language_code', 'ezcontentobject_attribute' ), + $translations + ) + ); + } + + return $query; + } + + /** + * Creates a select query for content relations + * + * @return \ezcQuerySelect + */ + public function createRelationFindQuery() + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcontentobject_link' ), + $this->dbHandler->aliasedColumn( $query, 'contentclassattribute_id', 'ezcontentobject_link' ), + $this->dbHandler->aliasedColumn( $query, 'from_contentobject_id', 'ezcontentobject_link' ), + $this->dbHandler->aliasedColumn( $query, 'from_contentobject_version', 'ezcontentobject_link' ), + $this->dbHandler->aliasedColumn( $query, 'op_code', 'ezcontentobject_link' ), + $this->dbHandler->aliasedColumn( $query, 'relation_type', 'ezcontentobject_link' ), + $this->dbHandler->aliasedColumn( $query, 'to_contentobject_id', 'ezcontentobject_link' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_link' ) + ); + + return $query; + } + + /** + * Creates a select query for content version objects + * + * Creates a select query with all necessary joins to fetch a complete + * content object. Does not apply any WHERE conditions. + * + * @return \ezcQuerySelect + */ + public function createVersionInfoFindQuery() + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + // Content object version + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'version', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'modified', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'creator_id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'created', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'status', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'contentobject_id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'initial_language_id', 'ezcontentobject_version' ), + $this->dbHandler->aliasedColumn( $query, 'language_mask', 'ezcontentobject_version' ), + // Content main location + $this->dbHandler->aliasedColumn( $query, 'main_node_id', 'ezcontentobject_tree' ), + // Content object + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'contentclass_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'section_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'owner_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'remote_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'current_version', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'initial_language_id', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'modified', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'published', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'status', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'name', 'ezcontentobject' ), + $this->dbHandler->aliasedColumn( $query, 'language_mask', 'ezcontentobject' ), + // Content object names + $this->dbHandler->aliasedColumn( $query, 'name', 'ezcontentobject_name' ), + $this->dbHandler->aliasedColumn( $query, 'content_translation', 'ezcontentobject_name' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_version' ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject' ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ) + ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_tree' ), + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_version', 'ezcontentobject_tree' ), + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'main_node_id', 'ezcontentobject_tree' ), + $this->dbHandler->quoteColumn( 'node_id', 'ezcontentobject_tree' ) + ) + ) + ) + // @todo: Joining with ezcontentobject_name is probably a VERY bad way to gather that information + // since it creates an additional cartesian product with translations. + ->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentobject_name' ), + $query->expr->lAnd( + // ezcontentobject_name.content_translation is also part of the PK but can't be + // easily joined with something at this level + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_name' ), + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_version' ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'content_version', 'ezcontentobject_name' ), + $this->dbHandler->quoteColumn( 'version', 'ezcontentobject_version' ) + ) + ) + ); + + return $query; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Handler.php new file mode 100644 index 0000000..377f9a3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Handler.php @@ -0,0 +1,618 @@ +contentGateway = $contentGateway; + $this->locationGateway = $locationGateway; + $this->mapper = $mapper; + $this->fieldHandler = $fieldHandler; + } + + /** + * Creates a new Content entity in the storage engine. + * + * The values contained inside the $content will form the basis of stored + * entity. + * + * Will contain always a complete list of fields. + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $struct Content creation struct. + * + * @return \eZ\Publish\SPI\Persistence\Content Content value object + */ + public function create( CreateStruct $struct ) + { + return $this->internalCreate( $struct ); + } + + /** + * Creates a new Content entity in the storage engine. + * + * The values contained inside the $content will form the basis of stored + * entity. + * + * Will contain always a complete list of fields. + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $struct Content creation struct. + * @param mixed $versionNo Used by self::copy() to maintain version numbers + * + * @return \eZ\Publish\SPI\Persistence\Content Content value object + */ + protected function internalCreate( CreateStruct $struct, $versionNo = 1 ) + { + $content = new Content(); + + $content->fields = $struct->fields; + $content->versionInfo = $this->mapper->createVersionInfoFromCreateStruct( $struct, $versionNo ); + + $content->versionInfo->contentInfo->id = $this->contentGateway->insertContentObject( $struct, $versionNo ); + $content->versionInfo->id = $this->contentGateway->insertVersion( + $content->versionInfo, + $struct->fields + ); + + $this->fieldHandler->createNewFields( $content ); + + // Create node assignments + foreach ( $struct->locations as $location ) + { + $location->contentId = $content->versionInfo->contentInfo->id; + $location->contentVersion = $content->versionInfo->versionNo; + $this->locationGateway->createNodeAssignment( + $location, + $location->parentId, + LocationGateway::NODE_ASSIGNMENT_OP_CODE_CREATE + ); + } + + // Create names + foreach ( $content->versionInfo->names as $language => $name ) + { + $this->contentGateway->setName( + $content->versionInfo->contentInfo->id, + $content->versionInfo->versionNo, + $name, + $language + ); + } + + return $content; + } + + /** + * Performs the publishing operations required to set the version identified by $updateStruct->versionNo and + * $updateStruct->id as the published one. + * + * The publish procedure will: + * - Create location nodes based on the node assignments + * - Update the content object using the provided metadata update struct + * - Update the node assignments + * - Update location nodes of the content with the new published version + * - Set content and version status to published + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $metaDataUpdateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content The published Content + */ + public function publish( $contentId, $versionNo, MetadataUpdateStruct $metaDataUpdateStruct ) + { + // Archive currently published version + $versionInfo = $this->loadVersionInfo( $contentId, $versionNo ); + if ( $versionInfo->contentInfo->currentVersionNo != $versionNo ) + { + $this->setStatus( + $contentId, + VersionInfo::STATUS_ARCHIVED, + $versionInfo->contentInfo->currentVersionNo + ); + } + + // Set always available name for the content + $metaDataUpdateStruct->name = $versionInfo->names[$versionInfo->contentInfo->mainLanguageCode]; + + $this->contentGateway->updateContent( $contentId, $metaDataUpdateStruct ); + $this->locationGateway->createLocationsFromNodeAssignments( + $contentId, + $versionNo + ); + + $this->locationGateway->updateLocationsContentVersionNo( $contentId, $versionNo ); + $this->setStatus( $contentId, VersionInfo::STATUS_PUBLISHED, $versionNo ); + + return $this->load( $contentId, $versionNo ); + } + + /** + * Creates a new draft version from $contentId in $version. + * + * Copies all fields from $contentId in $srcVersion and creates a new + * version of the referred Content from it. + * + * Note: When creating a new draft in the old admin interface there will + * also be an entry in the `eznode_assignment` created for the draft. This + * is ignored in this implementation. + * + * @param mixed $contentId + * @param mixed $srcVersion + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function createDraftFromVersion( $contentId, $srcVersion, $userId ) + { + $content = $this->load( $contentId, $srcVersion ); + + // Create new version + $content->versionInfo = $this->mapper->createVersionInfoForContent( + $content, + $this->contentGateway->getLastVersionNumber( $contentId ) + 1, + $userId + ); + $content->versionInfo->id = $this->contentGateway->insertVersion( + $content->versionInfo, + $content->fields + ); + + // Clone fields from previous version and append them to the new one + $fields = $content->fields; + $content->fields = array(); + foreach ( $fields as $field ) + { + $newField = clone $field; + $newField->versionNo = $content->versionInfo->versionNo; + $content->fields[] = $newField; + } + $this->fieldHandler->createExistingFieldsInNewVersion( $content ); + + // Create name + foreach ( $content->versionInfo->names as $language => $name ) + { + $this->contentGateway->setName( + $contentId, + $content->versionInfo->versionNo, + $name, + $language + ); + } + + return $content; + } + + /** + * Returns the raw data of a content object identified by $id, in a struct. + * + * A version to load must be specified. If you want to load the current + * version of a content object use SearchHandler::findSingle() with the + * ContentId criterion. + * + * Optionally a translation filter may be specified. If specified only the + * translations with the listed language codes will be retrieved. If not, + * all translations will be retrieved. + * + * @param int|string $id + * @param int|string $version + * @param string[] $translations + * + * @return \eZ\Publish\SPI\Persistence\Content Content value object + */ + public function load( $id, $version, $translations = null ) + { + $rows = $this->contentGateway->load( $id, $version, $translations ); + + if ( empty( $rows ) ) + { + throw new NotFound( 'content', "contentId: $id, versionNo: $version" ); + } + + $contentObjects = $this->mapper->extractContentFromRows( $rows ); + $content = $contentObjects[0]; + + $this->fieldHandler->loadExternalFieldData( $content ); + + return $content; + } + + /** + * Returns the metadata object for a content identified by $contentId. + * + * @param int|string $contentId + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public function loadContentInfo( $contentId ) + { + return $this->mapper->extractContentInfoFromRow( + $this->contentGateway->loadContentInfo( $contentId ) + ); + } + + /** + * Returns the version object for a content/version identified by $contentId and $versionNo + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If version is not found + * + * @param int|string $contentId + * @param int $versionNo Version number to load + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + public function loadVersionInfo( $contentId, $versionNo ) + { + $rows = $this->contentGateway->loadVersionInfo( $contentId, $versionNo ); + if ( empty( $rows ) ) + { + throw new NotFound( 'content', $contentId ); + } + + $versionInfo = $this->mapper->extractVersionInfoListFromRows( $rows ); + + return reset( $versionInfo ); + } + + /** + * Returns all versions with draft status created by the given $userId + * + * @param int $userId + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo[] + */ + public function loadDraftsForUser( $userId ) + { + return $this->mapper->extractVersionInfoListFromRows( + $this->contentGateway->listVersionsForUser( $userId, VersionInfo::STATUS_DRAFT ) + ); + } + + /** + * Sets the status of object identified by $contentId and $version to $status. + * + * The $status can be one of VersionInfo::STATUS_DRAFT, VersionInfo::STATUS_PUBLISHED, VersionInfo::STATUS_ARCHIVED + * When status is set to VersionInfo::STATUS_PUBLISHED content status is updated to ContentInfo::STATUS_PUBLISHED + * + * @param int $contentId + * @param int $status + * @param int $version + * + * @return boolean + */ + public function setStatus( $contentId, $status, $version ) + { + return $this->contentGateway->setStatus( $contentId, $version, $status ); + } + + /** + * Updates a content object meta data, identified by $contentId + * + * @param int $contentId + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $content + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public function updateMetadata( $contentId, MetadataUpdateStruct $content ) + { + $this->contentGateway->updateContent( $contentId, $content ); + return $this->loadContentInfo( $contentId ); + } + + /** + * Updates a content version, identified by $contentId and $versionNo + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\UpdateStruct $updateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function updateContent( $contentId, $versionNo, UpdateStruct $updateStruct ) + { + $content = $this->load( $contentId, $versionNo ); + $this->contentGateway->updateVersion( $contentId, $versionNo, $updateStruct ); + $this->fieldHandler->updateFields( $content, $updateStruct ); + foreach ( $updateStruct->name as $language => $name ) + { + $this->contentGateway->setName( + $contentId, + $versionNo, + $name, + $language + ); + } + + return $this->load( $contentId, $versionNo ); + } + + /** + * Deletes all versions and fields, all locations (subtree), and all relations. + * + * Removes the relations, but not the related objects. All subtrees of the + * assigned nodes of this content objects are removed (recursively). + * + * @param int $contentId + * + * @return boolean + */ + public function deleteContent( $contentId ) + { + $contentLocations = $this->contentGateway->getAllLocationIds( $contentId ); + if ( empty( $contentLocations ) ) + { + $this->removeRawContent( $contentId ); + } + else + { + foreach ( $contentLocations as $locationId ) + { + $this->locationHandler->removeSubtree( $locationId ); + } + } + } + + /** + * Deletes raw content data + * + * @param int $contentId + */ + public function removeRawContent( $contentId ) + { + $contentInfo = $this->loadContentInfo( $contentId ); + $this->locationGateway->removeElementFromTrash( + $contentInfo->mainLocationId + ); + + $versionInfos = $this->listVersions( $contentId ); + foreach ( $versionInfos as $versionInfo ) + { + $this->fieldHandler->deleteFields( $contentId, $versionInfo ); + } + $this->contentGateway->deleteRelations( $contentId ); + $this->contentGateway->deleteVersions( $contentId ); + $this->contentGateway->deleteNames( $contentId ); + $this->contentGateway->deleteContent( $contentId ); + } + + /** + * Deletes given version, its fields, node assignment, relations and names. + * + * Removes the relations, but not the related objects. + * + * @param int $contentId + * @param int $versionNo + * + * @return boolean + */ + public function deleteVersion( $contentId, $versionNo ) + { + $versionInfo = $this->loadVersionInfo( $contentId, $versionNo ); + + $this->locationGateway->deleteNodeAssignment( $contentId, $versionNo ); + + $this->fieldHandler->deleteFields( $contentId, $versionInfo ); + + $this->contentGateway->deleteRelations( $contentId, $versionNo ); + $this->contentGateway->deleteVersions( $contentId, $versionNo ); + $this->contentGateway->deleteNames( $contentId, $versionNo ); + } + + /** + * Returns the versions for $contentId + * + * @param int $contentId + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo[] + */ + public function listVersions( $contentId ) + { + return $this->mapper->extractVersionInfoListFromRows( + $this->contentGateway->listVersions( $contentId ) + ); + } + + /** + * Copy Content with Fields and Versions from $contentId in $version. + * + * Copies all fields from $contentId in $versionNo (or all versions if null) + * to a new object which is returned. Version numbers are maintained. + * + * @todo Should relations be copied? Which ones? + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content or version is not found + * + * @param mixed $contentId + * @param mixed|null $versionNo Copy all versions if left null + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function copy( $contentId, $versionNo = null ) + { + $currentVersionNo = isset( $versionNo ) ? + $versionNo : + $this->loadContentInfo( $contentId )->currentVersionNo; + + // Copy content in given version or current version + $createStruct = $this->mapper->createCreateStructFromContent( + $this->load( $contentId, $currentVersionNo ) + ); + $content = $this->internalCreate( $createStruct, $currentVersionNo ); + + // If version was not passed also copy other versions + if ( !isset( $versionNo ) ) + { + foreach ( $this->listVersions( $contentId ) as $versionInfo ) + { + if ( $versionInfo->versionNo === $currentVersionNo ) + { + continue; + } + + $versionContent = $this->load( $contentId, $versionInfo->versionNo ); + + $versionContent->versionInfo->contentInfo->id = $content->versionInfo->contentInfo->id; + $versionContent->versionInfo->modificationDate = $createStruct->modified; + $versionContent->versionInfo->creationDate = $createStruct->modified; + $versionContent->versionInfo->id = $this->contentGateway->insertVersion( + $versionContent->versionInfo, + $versionContent->fields + ); + + $this->fieldHandler->createNewFields( $versionContent ); + + // Create names + foreach ( $versionContent->versionInfo->names as $language => $name ) + { + $this->contentGateway->setName( + $content->versionInfo->contentInfo->id, + $versionInfo->versionNo, + $name, + $language + ); + } + } + } + + return $content; + } + + /** + * Creates a relation between $sourceContentId in $sourceContentVersionNo + * and $destinationContentId with a specific $type. + * + * @todo Should the existence verifications happen here or is this supposed to be handled at a higher level? + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $createStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation + */ + public function addRelation( RelationCreateStruct $createStruct ) + { + $relation = $this->mapper->createRelationFromCreateStruct( $createStruct ); + + $relation->id = $this->contentGateway->insertRelation( $createStruct ); + + return $relation; + } + + /** + * Removes a relation by $relationId. + * + * @param mixed $relationId + * + * @return void + */ + public function removeRelation( $relationId ) + { + $this->contentGateway->deleteRelation( $relationId ); + } + + /** + * Loads relations from $sourceContentId. Optionally, loads only those with $type and $sourceContentVersionNo. + * + * @param mixed $sourceContentId Source Content ID + * @param mixed|null $sourceContentVersionNo Source Content Version, null if not specified + * @param int|null $type {@see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD} + * @return \eZ\Publish\SPI\Persistence\Content\Relation[] + */ + public function loadRelations( $sourceContentId, $sourceContentVersionNo = null, $type = null ) + { + $rows = $this->contentGateway->loadRelations( $sourceContentId, $sourceContentVersionNo, $type ); + + $relationObjects = $this->mapper->extractRelationsFromRows( $rows ); + return $relationObjects; + } + + /** + * Loads relations from $contentId. Optionally, loads only those with $type. + * + * Only loads relations against published versions. + * + * @param mixed $destinationContentId Destination Content ID + * @param int|null $type {@see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD} + * @return \eZ\Publish\SPI\Persistence\Content\Relation[] + */ + public function loadReverseRelations( $destinationContentId, $type = null ) + { + $rows = $this->contentGateway->loadReverseRelations( $destinationContentId, $type ); + + $relationObjects = $this->mapper->extractRelationsFromRows( $rows ); + return $relationObjects; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/Cache.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Cache.php new file mode 100644 index 0000000..1c22b95 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Cache.php @@ -0,0 +1,111 @@ +mapById[$language->id] = $language; + $this->mapByLocale[$language->languageCode] = $language; + } + + /** + * Removes the language with $id from the cache + * + * @param mixed $id + * + * @return void + */ + public function remove( $id ) + { + unset( $this->mapById[$id] ); + foreach ( $this->mapByLocale as $languageCode => $language ) + { + if ( $language->id == $id ) + { + unset( $this->mapByLocale[$languageCode] ); + } + } + } + + /** + * Returns the Language with $id from the cache + * + * @param mixed $id + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * if the Language could not be found + */ + public function getById( $id ) + { + if ( !isset( $this->mapById[$id] ) ) + { + throw new NotFoundException( 'Language', $id ); + } + return $this->mapById[$id]; + } + + /** + * Returns the Language with $languageCode from the cache + * + * @param string $languageCode + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * if the Language could not be found + */ + public function getByLocale( $languageCode ) + { + if ( !isset( $this->mapByLocale[$languageCode] ) ) + { + throw new NotFoundException( 'Language', $languageCode ); + } + return $this->mapByLocale[$languageCode]; + } + + /** + * Returns all languages in the cache with locale as key + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function getAll() + { + return $this->mapByLocale; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/CachingHandler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/CachingHandler.php new file mode 100644 index 0000000..4f69ebc --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/CachingHandler.php @@ -0,0 +1,150 @@ +innerHandler = $innerHandler; + $this->languageCache = $languageCache; + } + + /** + * Initializes the cache if necessary + * + * @return void + */ + protected function initializeCache() + { + if ( false === $this->isCacheInitialized ) + { + $languages = $this->innerHandler->loadAll(); + foreach ( $languages as $language ) + { + $this->languageCache->store( $language ); + } + $this->isCacheInitialized = true; + } + } + + /** + * Create a new language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function create( CreateStruct $struct ) + { + $this->initializeCache(); + $language = $this->innerHandler->create( $struct ); + $this->languageCache->store( $language ); + return $language; + } + + /** + * Update language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language $language + */ + public function update( Language $language ) + { + $this->initializeCache(); + $this->innerHandler->update( $language ); + $this->languageCache->store( $language ); + } + + /** + * Get language by id + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $id + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function load( $id ) + { + $this->initializeCache(); + return $this->languageCache->getById( $id ); + } + + /** + * Get language by Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $languageCode + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function loadByLanguageCode( $languageCode ) + { + $this->initializeCache(); + return $this->languageCache->getByLocale( $languageCode ); + } + + /** + * Get all languages + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function loadAll() + { + $this->initializeCache(); + return $this->languageCache->getAll(); + } + + /** + * Delete a language + * + * @param mixed $id + */ + public function delete( $id ) + { + $this->initializeCache(); + $this->innerHandler->delete( $id ); + $this->languageCache->remove( $id ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Gateway.php new file mode 100644 index 0000000..21cd9c5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Gateway.php @@ -0,0 +1,79 @@ +innerGateway = $innerGateway; + } + + /** + * Inserts the given $language + * + * @param Language $language + * + * @return int ID of the new language + */ + public function insertLanguage( Language $language ) + { + try + { + return $this->innerGateway->insertLanguage( $language ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates the data of the given $language + * + * @param Language $language + * + * @return void + */ + public function updateLanguage( Language $language ) + { + try + { + return $this->innerGateway->updateLanguage( $language ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for the Language with $id + * + * @param int $id + * + * @return string[][] + */ + public function loadLanguageData( $id ) + { + try + { + return $this->innerGateway->loadLanguageData( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for the Language with Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @return string[][] + */ + public function loadLanguageDataByLanguageCode( $languageCode ) + { + try + { + return $this->innerGateway->loadLanguageDataByLanguageCode( $languageCode ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads the data for all languages + * + * @return string[][] + */ + public function loadAllLanguagesData() + { + try + { + return $this->innerGateway->loadAllLanguagesData(); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the language with $id + * + * @param int $id + * + * @return void + */ + public function deleteLanguage( $id ) + { + try + { + return $this->innerGateway->deleteLanguage( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Check whether a language may be deleted + * + * @param int $id + * + * @return boolean + */ + public function canDeleteLanguage( $id ) + { + try + { + return $this->innerGateway->canDeleteLanguage( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Gateway/EzcDatabase.php new file mode 100644 index 0000000..96fbb4b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Gateway/EzcDatabase.php @@ -0,0 +1,462 @@ +dbHandler = $dbHandler; + } + + /** + * Inserts the given $language + * + * @param Language $language + * + * @return int ID of the new language + */ + public function insertLanguage( Language $language ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->expr->max( $this->dbHandler->quoteColumn( 'id' ) ) + )->from( $this->dbHandler->quoteTable( 'ezcontent_language' ) ); + + $statement = $query->prepare(); + $statement->execute(); + + $lastId = (int)$statement->fetchColumn(); + // Next power of 2 for bit masks + $nextId = ( $lastId !== 0 ? $lastId << 1 : 2 ); + + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezcontent_language' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $nextId, null, \PDO::PARAM_INT ) + ); + $this->setCommonLanguageColumns( $query, $language ); + + $query->prepare()->execute(); + + return $nextId; + } + + /** + * Sets columns in $query from $language + * + * @param \ezcQuery $query + * @param \eZ\Publish\SPI\Persistence\Content\Language $language + * + * @return void + */ + protected function setCommonLanguageColumns( ezcQuery $query, Language $language ) + { + $query->set( + $this->dbHandler->quoteColumn( 'locale' ), + $query->bindValue( $language->languageCode ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $query->bindValue( $language->name ) + )->set( + $this->dbHandler->quoteColumn( 'disabled' ), + $query->bindValue( + ( (int)( ! $language->isEnabled ) ), + null, + \PDO::PARAM_INT + ) + ); + } + + /** + * Updates the data of the given $language + * + * @param Language $language + * + * @return void + */ + public function updateLanguage( Language $language ) + { + $query = $this->dbHandler->createUpdateQuery(); + $query->update( $this->dbHandler->quoteTable( 'ezcontent_language' ) ); + + $this->setCommonLanguageColumns( $query, $language ); + + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $language->id, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Loads data for the Language with $id + * + * @param int $id + * + * @return string[][] + */ + public function loadLanguageData( $id ) + { + $query = $this->createFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for the Language with Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @return string[][] + */ + public function loadLanguageDataByLanguageCode( $languageCode ) + { + $query = $this->createFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'locale' ), + $query->bindValue( $languageCode, null, \PDO::PARAM_STR ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Creates a Language find query + * + * @return \ezcQuerySelect + */ + protected function createFindQuery() + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->quoteColumn( 'locale' ), + $this->dbHandler->quoteColumn( 'name' ), + $this->dbHandler->quoteColumn( 'disabled' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontent_language' ) + ); + return $query; + } + + /** + * Loads the data for all languages + * + * @return string[][] + */ + public function loadAllLanguagesData() + { + $query = $this->createFindQuery(); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Deletes the language with $id + * + * @param int $id + * + * @return void + */ + public function deleteLanguage( $id ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontent_language' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Check whether a language may be deleted + * + * @param int $id + * + * @return boolean + */ + public function canDeleteLanguage( $id ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcobj_state" ) + )->where( + $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( "default_language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ), + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_mask" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcobj_state_group" ) + )->where( + $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( "default_language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ), + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_mask" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcobj_state_group_language" ) + )->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcobj_state_language" ) + )->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcontentclass" ) + )->where( + $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( "initial_language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ), + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_mask" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcontentclass_name" ) + )->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcontentobject" ) + )->where( + $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( "initial_language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ), + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_mask" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcontentobject_attribute" ) + )->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcontentobject_name" ) + )->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezcontentobject_version" ) + )->where( + $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( "initial_language_id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ), + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "language_mask" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + if ( $statement->fetchColumn() > 0 ) + return false; + + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( "*" ), "count" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "lang_mask" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchColumn() == 0; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Handler.php new file mode 100644 index 0000000..3c95b2c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Handler.php @@ -0,0 +1,147 @@ +languageGateway = $languageGateway; + $this->languageMapper = $languageMapper; + } + + /** + * Create a new language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function create( CreateStruct $struct ) + { + $language = $this->languageMapper->createLanguageFromCreateStruct( + $struct + ); + $language->id = $this->languageGateway->insertLanguage( $language ); + return $language; + } + + /** + * Update language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language $language + */ + public function update( Language $language ) + { + $this->languageGateway->updateLanguage( $language ); + } + + /** + * Get language by id + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $id + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function load( $id ) + { + $languages = $this->languageMapper->extractLanguagesFromRows( + $this->languageGateway->loadLanguageData( $id ) + ); + + if ( count( $languages ) < 1 ) + { + throw new NotFoundException( 'Language', $id ); + } + return reset( $languages ); + } + + /** + * Get language by Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $languageCode + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function loadByLanguageCode( $languageCode ) + { + $languages = $this->languageMapper->extractLanguagesFromRows( + $this->languageGateway->loadLanguageDataByLanguageCode( $languageCode ) + ); + + if ( count( $languages ) < 1 ) + { + throw new NotFoundException( 'Language', $languageCode ); + } + return reset( $languages ); + } + + /** + * Get all languages + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function loadAll() + { + return $this->languageMapper->extractLanguagesFromRows( + $this->languageGateway->loadAllLanguagesData() + ); + } + + /** + * Delete a language + * + * @param mixed $id + * + * @throws LogicException If language could not be deleted + */ + public function delete( $id ) + { + if ( !$this->languageGateway->canDeleteLanguage( $id ) ) + { + throw new LogicException( "Deleting language logic error, some content still references that language and therefore it can't be deleted" ); + } + + $this->languageGateway->deleteLanguage( $id ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Mapper.php new file mode 100644 index 0000000..d6828c5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/Mapper.php @@ -0,0 +1,63 @@ +languageCode = $struct->languageCode; + $language->name = $struct->name; + $language->isEnabled = $struct->isEnabled; + + return $language; + } + + /** + * Extracts Language objects from $rows + * + * @param array $rows + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function extractLanguagesFromRows( array $rows ) + { + $languages = array(); + + foreach ( $rows as $row ) + { + $language = new Language(); + + $language->id = (int)$row['id']; + $language->languageCode = $row['locale']; + $language->name = $row['name']; + $language->isEnabled = !( (int)$row['disabled'] ); + + $languages[$row['locale']] = $language; + } + + return $languages; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Language/MaskGenerator.php b/eZ/Publish/Core/Persistence/Legacy/Content/Language/MaskGenerator.php new file mode 100644 index 0000000..7ba5f54 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Language/MaskGenerator.php @@ -0,0 +1,154 @@ +languageHandler = $languageHandler; + } + + /** + * Generates a language mask from the keys of $languages + * + * @param array $languages + * + * @return int + */ + public function generateLanguageMask( array $languages ) + { + $mask = 0; + if ( isset( $languages['always-available'] ) ) + { + $mask |= $languages['always-available'] ? 1 : 0; + unset( $languages['always-available'] ); + } + + foreach ( $languages as $language => $value ) + { + $mask |= $this->languageHandler->loadByLanguageCode( $language )->id; + } + + return $mask; + } + + /** + * Generates a language indicator from $languageCode and $alwaysAvailable + * + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return int + */ + public function generateLanguageIndicator( $languageCode, $alwaysAvailable ) + { + return $this->languageHandler->loadByLanguageCode( $languageCode )->id | ( $alwaysAvailable ? 1 : 0 ); + } + + /** + * Checks if $language is always available in $languages; + * + * @param string $language + * @param array $languages + * + * @return boolean + */ + public function isLanguageAlwaysAvailable( $language, array $languages ) + { + return ( isset( $languages['always-available'] ) + && ( $languages['always-available'] == $language ) + ); + } + + /** + * Checks if $languageMask contains the alwaysAvailable bit field + * + * @param int $languageMask + * + * @return boolean + */ + public function isAlwaysAvailable( $languageMask ) + { + return (bool)( $languageMask & 1 ); + } + + /** + * Removes the alwaysAvailable flag from $languageId and returns cleaned up $languageId + * + * @param int $languageId + * + * @return int + */ + public function removeAlwaysAvailableFlag( $languageId ) + { + return $languageId & ~1; + } + + /** + * Extracts every language Ids contained in $languageMask + * + * @param int $languageMask + * + * @return array Array of language Id + */ + public function extractLanguageIdsFromMask( $languageMask ) + { + $exp = 2; + $result = array(); + + // Decomposition of $languageMask into its binary components. + while ( $exp <= $languageMask ) + { + if ( $languageMask & $exp ) + $result[] = $exp; + + $exp *= 2; + } + + return $result; + } + + /** + * Extracts Language codes contained in given $languageMask. + * + * @param int $languageMask + * + * @return array + */ + public function extractLanguageCodesFromMask( $languageMask ) + { + $languageCodes = array(); + + foreach ( $this->extractLanguageIdsFromMask( $languageMask ) as $languageId ) + { + $languageCodes[] = $this->languageHandler->load( $languageId )->languageCode; + } + + return $languageCodes; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Location/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Gateway.php new file mode 100644 index 0000000..2a62416 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Gateway.php @@ -0,0 +1,346 @@ +innerGateway = $innerGateway; + } + + /** + * Returns an array with basic node data + * + * We might want to cache this, since this method is used by about every + * method in the location handler. + * + * @todo optimize + * @param mixed $nodeId + * + * @return array + */ + public function getBasicNodeData( $nodeId ) + { + try + { + return $this->innerGateway->getBasicNodeData( $nodeId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns an array with basic node data for the node with $remoteId + * + * @todo optimize + * @param mixed $remoteId + * + * @return array + */ + public function getBasicNodeDataByRemoteId( $remoteId ) + { + try + { + return $this->innerGateway->getBasicNodeDataByRemoteId( $remoteId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for all Locations for $contentId, optionally only in the + * subtree starting at $rootLocationId + * + * @param int $contentId + * @param int $rootLocationId + * + * @return array + */ + public function loadLocationDataByContent( $contentId, $rootLocationId = null ) + { + try + { + return $this->innerGateway->loadLocationDataByContent( $contentId, $rootLocationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Find all content in the given subtree + * + * @param mixed $sourceId + * + * @return array + */ + public function getSubtreeContent( $sourceId ) + { + try + { + return $this->innerGateway->getSubtreeContent( $sourceId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns data for the first level children of the location identified by given $locationId + * + * @param mixed $locationId + * + * @return array + */ + public function getChildren( $locationId ) + { + try + { + return $this->innerGateway->getChildren( $locationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Update path strings to move nodes in the ezcontentobject_tree table + * + * This query can likely be optimized to use some more advanced string + * operations, which then depend on the respective database. + * + * @todo optimize + * @param string $fromPathString + * @param string $toPathString + * + * @return void + */ + public function moveSubtreeNodes( $fromPathString, $toPathString ) + { + try + { + return $this->innerGateway->moveSubtreeNodes( $fromPathString, $toPathString ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updated subtree modification time for all nodes on path + * + * @param string $pathString + * @param int|null $timestamp + * + * @return void + */ + public function updateSubtreeModificationTime( $pathString, $timestamp = null ) + { + try + { + return $this->innerGateway->updateSubtreeModificationTime( $pathString, $timestamp ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Update node assignment table + * + * @param int $contentObjectId + * @param int $oldParent + * @param int $newParent + * @param int $opcode + * + * @return void + */ + public function updateNodeAssignment( $contentObjectId, $oldParent, $newParent, $opcode ) + { + try + { + return $this->innerGateway->updateNodeAssignment( $contentObjectId, $oldParent, $newParent, $opcode ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Create locations from node assignments + * + * Convert existing node assignments into real locations. + * + * @param mixed $contentId + * @param mixed $versionNo + * + * @return void + */ + public function createLocationsFromNodeAssignments( $contentId, $versionNo ) + { + try + { + return $this->innerGateway->createLocationsFromNodeAssignments( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates all Locations of content identified with $contentId with $versionNo + * + * @param mixed $contentId + * @param mixed $versionNo + * + * @return void + */ + public function updateLocationsContentVersionNo( $contentId, $versionNo ) + { + try + { + return $this->innerGateway->updateLocationsContentVersionNo( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Sets a location to be hidden, and it self + all children to invisible. + * + * @param string $pathString + */ + public function hideSubtree( $pathString ) + { + try + { + return $this->innerGateway->hideSubtree( $pathString ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Sets a location to be unhidden, and self + children to visible unless a parent is hiding the tree. + * If not make sure only children down to first hidden node is marked visible. + * + * @param string $pathString + */ + public function unHideSubtree( $pathString ) + { + try + { + return $this->innerGateway->unHideSubtree( $pathString ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Swaps the content object being pointed to by a location object. + * + * Make the location identified by $locationId1 refer to the Content + * referred to by $locationId2 and vice versa. + * + * @param mixed $locationId1 + * @param mixed $locationId2 + * + * @return boolean + */ + public function swap( $locationId1, $locationId2 ) + { + try + { + return $this->innerGateway->swap( $locationId1, $locationId2 ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Creates a new location in given $parentNode + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct $createStruct + * @param array $parentNode + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function create( CreateStruct $createStruct, array $parentNode ) + { + try + { + return $this->innerGateway->create( $createStruct, $parentNode ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Create an entry in the node assignment table + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct $createStruct + * @param mixed $parentNodeId + * @param int $type + * + * @return void + */ + public function createNodeAssignment( CreateStruct $createStruct, $parentNodeId, $type = self::NODE_ASSIGNMENT_OP_CODE_CREATE_NOP ) + { + try + { + return $this->innerGateway->createNodeAssignment( $createStruct, $parentNodeId, $type ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes node assignment for given $contentId and $versionNo + * + * @param int $contentId + * @param int $versionNo + * + * @return void + */ + public function deleteNodeAssignment( $contentId, $versionNo = null ) + { + try + { + return $this->innerGateway->deleteNodeAssignment( $contentId, $versionNo ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates an existing location. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\UpdateStruct $location + * @param int $locationId + * + * @return boolean + */ + public function update( UpdateStruct $location, $locationId ) + { + try + { + return $this->innerGateway->update( $location, $locationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates path identification string for given $locationId. + * + * @param mixed $locationId + * @param mixed $parentLocationId + * @param string $text + * + * @return void + */ + public function updatePathIdentificationString( $locationId, $parentLocationId, $text ) + { + try + { + return $this->innerGateway->updatePathIdentificationString( $locationId, $parentLocationId, $text ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes ezcontentobject_tree row for given $locationId (node_id) + * + * @param mixed $locationId + */ + public function removeLocation( $locationId ) + { + try + { + return $this->innerGateway->removeLocation( $locationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns id of the next in line node to be set as a new main node + * + * This returns lowest node id for content identified by $contentId, and not of + * the node identified by given $locationId (current main node). + * Assumes that content has more than one location. + * + * @param mixed $contentId + * @param mixed $locationId + * + * @return array + */ + public function getFallbackMainNodeData( $contentId, $locationId ) + { + try + { + return $this->innerGateway->getFallbackMainNodeData( $contentId, $locationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Sends a single location identified by given $locationId to the trash. + * + * The associated content object is left untouched. + * + * @param mixed $locationId + * + * @return boolean + */ + public function trashLocation( $locationId ) + { + try + { + return $this->innerGateway->trashLocation( $locationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns a trashed location to normal state. + * + * Recreates the originally trashed location in the new position. If no new + * position has been specified, it will be tried to re-create the location + * at the old position. If this is not possible ( because the old location + * does not exist any more) and exception is thrown. + * + * @param mixed $locationId + * @param mixed $newParentId + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function untrashLocation( $locationId, $newParentId = null ) + { + try + { + return $this->innerGateway->untrashLocation( $locationId, $newParentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads trash data specified by location ID + * + * @param mixed $locationId + * + * @return array + */ + public function loadTrashByLocation( $locationId ) + { + try + { + return $this->innerGateway->loadTrashByLocation( $locationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Removes every entries in the trash. + * Will NOT remove associated content objects nor attributes. + * + * Basically truncates ezcontentobject_trash table. + * + * @return void + */ + public function cleanupTrash() + { + try + { + return $this->innerGateway->cleanupTrash(); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Lists trashed items. + * Returns entries from ezcontentobject_trash. + * + * @param int $offset + * @param int $limit + * @param array $sort + * + * @return array + */ + public function listTrashed( $offset, $limit, array $sort = null ) + { + try + { + return $this->innerGateway->listTrashed( $offset, $limit, $sort ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Removes trashed element identified by $id from trash. + * Will NOT remove associated content object nor attributes. + * + * @param int $id The trashed location Id + * + * @return void + */ + public function removeElementFromTrash( $id ) + { + try + { + return $this->innerGateway->removeElementFromTrash( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Set section on all content objects in the subtree + * + * @param mixed $pathString + * @param mixed $sectionId + * + * @return boolean + */ + public function setSectionForSubtree( $pathString, $sectionId ) + { + try + { + return $this->innerGateway->setSectionForSubtree( $pathString, $sectionId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns how many locations given content object identified by $contentId has + * + * @param int $contentId + * + * @return int + */ + public function countLocationsByContentId( $contentId ) + { + try + { + return $this->innerGateway->countLocationsByContentId( $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Changes main location of content identified by given $contentId to location identified by given $locationId + * + * Updates ezcontentobject_tree table for the given $contentId and eznode_assignment table for the given + * $contentId, $parentLocationId and $versionNo + * + * @param mixed $contentId + * @param mixed $locationId + * @param mixed $versionNo version number, needed to update eznode_assignment table + * @param mixed $parentLocationId parent location of location identified by $locationId, needed to update + * eznode_assignment table + * + * @return void + */ + public function changeMainLocation( $contentId, $locationId, $versionNo, $parentLocationId ) + { + try + { + return $this->innerGateway->changeMainLocation( $contentId, $locationId, $versionNo, $parentLocationId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Location/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Gateway/EzcDatabase.php new file mode 100644 index 0000000..b2b9429 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Gateway/EzcDatabase.php @@ -0,0 +1,1402 @@ +handler = $handler; + } + + /** + * Returns an array with basic node data + * + * We might want to cache this, since this method is used by about every + * method in the location handler. + * + * @todo optimize + * @param mixed $nodeId + * + * @return array + */ + public function getBasicNodeData( $nodeId ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( '*' ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $nodeId ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + if ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + return $row; + } + + throw new NotFound( 'location', $nodeId ); + } + + /** + * Returns an array with basic node data + * + * @todo optimize + * @param mixed $remoteId + * + * @return array + */ + public function getBasicNodeDataByRemoteId( $remoteId ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( '*' ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'remote_id' ), + $query->bindValue( $remoteId ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + if ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + return $row; + } + + throw new NotFound( 'location', $remoteId ); + } + + /** + * Loads data for all Locations for $contentId, optionally only in the + * subtree starting at $rootLocationId + * + * @param int $contentId + * @param int $rootLocationId + * + * @return array + */ + public function loadLocationDataByContent( $contentId, $rootLocationId = null ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( '*' ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId ) + ) + ); + + if ( $rootLocationId !== null ) + { + $this->applySubtreeLimitation( $query, $rootLocationId ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Find all content in the given subtree + * + * @param mixed $sourceId + * + * @return array + */ + public function getSubtreeContent( $sourceId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( '*' )->from( + $this->handler->quoteTable( 'ezcontentobject_tree' ) + ); + $this->applySubtreeLimitation( $query, $sourceId ); + $query->orderBy( + $this->handler->quoteColumn( 'depth', 'ezcontentobject_tree' ) + )->orderBy( + $this->handler->quoteColumn( 'node_id', 'ezcontentobject_tree' ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Limits the given $query to the subtree starting at $rootLocationId + * + * @param \ezcQuery $query + * @param string $rootLocationId + * + * @return void + */ + protected function applySubtreeLimitation( \ezcQuery $query, $rootLocationId ) + { + $query->where( + $query->expr->like( + $this->handler->quoteColumn( 'path_string', 'ezcontentobject_tree' ), + $query->bindValue( '%/' . $rootLocationId . '/%' ) + ) + ); + } + + /** + * Returns data for the first level children of the location identified by given $locationId + * + * @param mixed $locationId + * + * @return array + */ + public function getChildren( $locationId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( "*" )->from( + $this->handler->quoteTable( "ezcontentobject_tree" ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( "parent_node_id", "ezcontentobject_tree" ), + $query->bindValue( $locationId, null, \PDO::PARAM_INT ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Update path strings to move nodes in the ezcontentobject_tree table + * + * This query can likely be optimized to use some more advanced string + * operations, which then depend on the respective database. + * + * @todo optimize + * @param string $sourceNodeData + * @param string $destinationNodeData + * + * @return void + */ + public function moveSubtreeNodes( $sourceNodeData, $destinationNodeData ) + { + $fromPathString = $sourceNodeData["path_string"]; + + /** @var $query \ezcQuerySelect */ + $query = $this->handler->createSelectQuery(); + $query + ->select( + $this->handler->quoteColumn( 'node_id' ), + $this->handler->quoteColumn( 'parent_node_id' ), + $this->handler->quoteColumn( 'path_string' ), + $this->handler->quoteColumn( 'path_identification_string' ) + ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->like( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $fromPathString . '%' ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll(); + $oldParentPathString = implode( '/', array_slice( explode( '/', $fromPathString ), 0, -2 ) ) . '/'; + $oldParentPathIdentificationString = implode( + '/', array_slice( explode( '/', $sourceNodeData["path_identification_string"] ), 0, -1 ) + ); + foreach ( $rows as $row ) + { + // Prefixing ensures correct replacement when old parent is root node + $newPathString = str_replace( + "prefix" . $oldParentPathString, + $destinationNodeData["path_string"], + "prefix" . $row['path_string'] + ); + $newPathIdentificationString = str_replace( + "prefix" . $oldParentPathIdentificationString, + $destinationNodeData["path_identification_string"] . "/", + "prefix" . $row['path_identification_string'] + ); + + $newParentId = $row['parent_node_id']; + if ( $row['path_string'] === $fromPathString ) + { + $newParentId = (int)implode( '', array_slice( explode( '/', $newPathString ), -3, 1 ) ); + } + + /** @var $query \ezcQueryUpdate */ + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $newPathString ) + ) + ->set( + $this->handler->quoteColumn( 'path_identification_string' ), + $query->bindValue( $newPathIdentificationString ) + ) + ->set( + $this->handler->quoteColumn( 'depth' ), + $query->bindValue( substr_count( $newPathString, '/' ) - 2 ) + ) + ->set( + $this->handler->quoteColumn( 'parent_node_id' ), + $query->bindValue( $newParentId ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $row['node_id'] ) + ) + ); + $query->prepare()->execute(); + } + } + + /** + * Updated subtree modification time for all nodes on path + * + * @param string $pathString + * @param int|null $timestamp + * + * @return void + */ + public function updateSubtreeModificationTime( $pathString, $timestamp = null ) + { + $nodes = array_filter( explode( '/', $pathString ) ); + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'modified_subnode' ), + $query->bindValue( + $timestamp ?: time() + ) + ) + ->where( + $query->expr->in( + $this->handler->quoteColumn( 'node_id' ), + $nodes + ) + ); + $query->prepare()->execute(); + } + + /** + * Sets a location to be hidden, and it self + all children to invisible. + * + * @param string $pathString + */ + public function hideSubtree( $pathString ) + { + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'is_invisible' ), + $query->bindValue( 1 ) + ) + ->set( + $this->handler->quoteColumn( 'modified_subnode' ), + $query->bindValue( time() ) + ) + ->where( + $query->expr->like( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $pathString . '%' ) + ) + ); + $query->prepare()->execute(); + + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'is_hidden' ), + $query->bindValue( 1 ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $pathString ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Sets a location to be unhidden, and self + children to visible unless a parent is hiding the tree. + * If not make sure only children down to first hidden node is marked visible. + * + * @param string $pathString + */ + public function unHideSubtree( $pathString ) + { + // Unhide the requested node + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'is_hidden' ), + $query->bindValue( 0 ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $pathString ) + ) + ); + $query->prepare()->execute(); + + // Check if any parent nodes are explicitly hidden + $query = $this->handler->createSelectQuery(); + $query + ->select( $this->handler->quoteColumn( 'path_string' ) ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->handler->quoteColumn( 'is_hidden' ), + $query->bindValue( 1 ) + ), + $query->expr->in( + $this->handler->quoteColumn( 'node_id' ), + array_filter( explode( '/', $pathString ) ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + if ( count( $statement->fetchAll( \PDO::FETCH_COLUMN ) ) ) + { + // There are parent nodes set hidden, so that we can skip marking + // something visible again. + return; + } + + // Find nodes of explicitly hidden subtrees in the subtree which + // should be unhidden + $query = $this->handler->createSelectQuery(); + $query + ->select( $this->handler->quoteColumn( 'path_string' ) ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->handler->quoteColumn( 'is_hidden' ), + $query->bindValue( 1 ) + ), + $query->expr->like( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $pathString . '%' ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + $hiddenSubtrees = $statement->fetchAll( \PDO::FETCH_COLUMN ); + + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'is_invisible' ), + $query->bindValue( 0 ) + ) + ->set( + $this->handler->quoteColumn( 'modified_subnode' ), + $query->bindValue( time() ) + ); + + // Build where expression selecting the nodes, which should be made + // visible again + $where = $query->expr->like( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $pathString . '%' ) + ); + if ( count( $hiddenSubtrees ) ) + { + $handler = $this->handler; + $where = $query->expr->lAnd( + $where, + $query->expr->lAnd( + array_map( + function ( $pathString ) use ( $query, $handler ) + { + return $query->expr->not( + $query->expr->like( + $handler->quoteColumn( 'path_string' ), + $query->bindValue( $pathString . '%' ) + ) + ); + }, + $hiddenSubtrees + ) + ) + ); + } + $query->where( $where ); + $statement = $query->prepare()->execute(); + } + + /** + * Swaps the content object being pointed to by a location object. + * + * Make the location identified by $locationId1 refer to the Content + * referred to by $locationId2 and vice versa. + * + * @param mixed $locationId1 + * @param mixed $locationId2 + * + * @return boolean + */ + public function swap( $locationId1, $locationId2 ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( + $this->handler->quoteColumn( 'node_id' ), + $this->handler->quoteColumn( 'contentobject_id' ), + $this->handler->quoteColumn( 'contentobject_version' ) + ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->in( + $this->handler->quoteColumn( 'node_id' ), + array( $locationId1, $locationId2 ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + foreach ( $statement->fetchAll() as $row ) + { + $contentObjects[$row['node_id']] = $row; + } + + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentObjects[$locationId2]['contentobject_id'] ) + ) + ->set( + $this->handler->quoteColumn( 'contentobject_version' ), + $query->bindValue( $contentObjects[$locationId2]['contentobject_version'] ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $locationId1 ) + ) + ); + $query->prepare()->execute(); + + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentObjects[$locationId1]['contentobject_id'] ) + ) + ->set( + $this->handler->quoteColumn( 'contentobject_version' ), + $query->bindValue( $contentObjects[$locationId1]['contentobject_version'] ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $locationId2 ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Creates a new location in given $parentNode + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct $createStruct + * @param array $parentNode + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function create( CreateStruct $createStruct, array $parentNode ) + { + $location = new Location(); + /** @var $query \ezcQueryInsert */ + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $location->contentId = $createStruct->contentId, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'contentobject_is_published' ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'contentobject_version' ), + $query->bindValue( $createStruct->contentVersion, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'depth' ), + $query->bindValue( $location->depth = $parentNode['depth'] + 1, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'is_hidden' ), + $query->bindValue( $location->hidden = $createStruct->hidden, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'is_invisible' ), + $query->bindValue( $location->invisible = $createStruct->invisible, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'modified_subnode' ), + $query->bindValue( time(), null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'node_id' ), + $this->handler->getAutoIncrementValue( 'ezcontentobject_tree', 'node_id' ) + )->set( + $this->handler->quoteColumn( 'parent_node_id' ), + $query->bindValue( $location->parentId = $parentNode['node_id'], null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'path_identification_string' ), + $query->bindValue( $location->pathIdentificationString = $createStruct->pathIdentificationString, null, \PDO::PARAM_STR ) + )->set( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( 'dummy' ) // Set later + )->set( + $this->handler->quoteColumn( 'priority' ), + $query->bindValue( $location->priority = $createStruct->priority, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'remote_id' ), + $query->bindValue( $location->remoteId = $createStruct->remoteId, null, \PDO::PARAM_STR ) + )->set( + $this->handler->quoteColumn( 'sort_field' ), + $query->bindValue( $location->sortField = $createStruct->sortField, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'sort_order' ), + $query->bindValue( $location->sortOrder = $createStruct->sortOrder, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + + $location->id = $this->handler->lastInsertId( $this->handler->getSequenceName( 'ezcontentobject_tree', 'node_id' ) ); + + $location->mainLocationId = $createStruct->mainLocationId === true ? $location->id : $createStruct->mainLocationId; + $location->pathString = $parentNode['path_string'] . $location->id . '/'; + /** @var $query \ezcQueryUpdate */ + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'path_string' ), + $query->bindValue( $location->pathString ) + ) + ->set( + $this->handler->quoteColumn( 'main_node_id' ), + $query->bindValue( $location->mainLocationId, null, \PDO::PARAM_INT ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $location->id, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + + return $location; + } + + /** + * Create an entry in the node assignment table + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct $createStruct + * @param mixed $parentNodeId + * @param int $type + * + * @return void + */ + public function createNodeAssignment( CreateStruct $createStruct, $parentNodeId, $type = self::NODE_ASSIGNMENT_OP_CODE_CREATE_NOP ) + { + $isMain = ( $createStruct->mainLocationId === true ? 1 : 0 ); + + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'eznode_assignment' ) ) + ->set( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $createStruct->contentId, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'contentobject_version' ), + $query->bindValue( $createStruct->contentVersion, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'from_node_id' ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) // unused field + )->set( + $this->handler->quoteColumn( 'id' ), + $this->handler->getAutoIncrementValue( 'eznode_assignment', 'id' ) + )->set( + $this->handler->quoteColumn( 'is_main' ), + $query->bindValue( $isMain, null, \PDO::PARAM_INT ) // Changed by the business layer, later + )->set( + $this->handler->quoteColumn( 'op_code' ), + $query->bindValue( $type, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'parent_node' ), + $query->bindValue( $parentNodeId, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'parent_remote_id' ), + $query->bindValue( '' ) + )->set( + $this->handler->quoteColumn( 'remote_id' ), + $query->bindValue( $createStruct->remoteId, null, \PDO::PARAM_STR ) + )->set( + $this->handler->quoteColumn( 'sort_field' ), + $query->bindValue( Location::SORT_FIELD_PUBLISHED, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'sort_order' ), + $query->bindValue( Location::SORT_ORDER_DESC, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + } + + /** + * Deletes node assignment for given $contentId and $versionNo + * + * If $versionNo is not passed all node assignments for given $contentId are deleted + * + * @param int $contentId + * @param int|null $versionNo + * + * @return void + */ + public function deleteNodeAssignment( $contentId, $versionNo = null ) + { + $query = $this->handler->createDeleteQuery(); + $query->deleteFrom( + 'eznode_assignment' + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + if ( isset( $versionNo ) ) + { + $query->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ) + ); + } + $query->prepare()->execute(); + } + + /** + * Update node assignment table + * + * @param int $contentObjectId + * @param int $oldParent + * @param int $newParent + * @param int $opcode + * + * @return void + */ + public function updateNodeAssignment( $contentObjectId, $oldParent, $newParent, $opcode ) + { + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'eznode_assignment' ) ) + ->set( + $this->handler->quoteColumn( 'parent_node' ), + $query->bindValue( $newParent, null, \PDO::PARAM_INT ) + ) + ->set( + $this->handler->quoteColumn( 'op_code' ), + $query->bindValue( $opcode, null, \PDO::PARAM_INT ) + ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentObjectId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->handler->quoteColumn( 'parent_node' ), + $query->bindValue( $oldParent, null, \PDO::PARAM_INT ) + ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Create locations from node assignments + * + * Convert existing node assignments into real locations. + * + * @param mixed $contentId + * @param mixed $versionNo + * + * @return void + */ + public function createLocationsFromNodeAssignments( $contentId, $versionNo ) + { + // select all node assignments with OP_CODE_CREATE (3) for this content + $query = $this->handler->createSelectQuery(); + $query + ->select( '*' ) + ->from( $this->handler->quoteTable( 'eznode_assignment' ) ) + ->where( + $query->expr->lAnd( + $query->expr->like( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->like( + $this->handler->quoteColumn( 'contentobject_version' ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ), + $query->expr->like( + $this->handler->quoteColumn( 'op_code' ), + $query->bindValue( self::NODE_ASSIGNMENT_OP_CODE_CREATE, null, \PDO::PARAM_INT ) + ) + ) + )->orderBy( 'id' ); + $statement = $query->prepare(); + $statement->execute(); + + // convert all these assignments to nodes + + while ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + if ( (bool)$row['is_main'] === true ) + { + $mainLocationId = true; + } + else + { + $mainLocationId = $this->getMainNodeId( $contentId ); + } + $this->create( + new CreateStruct( + array( + 'contentId' => $row['contentobject_id'], + 'contentVersion' => $row['contentobject_version'], + 'mainLocationId' => $mainLocationId, + 'remoteId' => $row['remote_id'], + 'sortField' => $row['sort_field'], + 'sortOrder' => $row['sort_order'], + ) + ), + $this->getBasicNodeData( $row['parent_node'] ) + ); + + $this->updateNodeAssignment( + $row['contentobject_id'], + $row['parent_node'], + $row['parent_node'], + self::NODE_ASSIGNMENT_OP_CODE_CREATE_NOP + ); + } + } + + /** + * Updates all Locations of content identified with $contentId with $versionNo + * + * @param mixed $contentId + * @param mixed $versionNo + * + * @return void + */ + public function updateLocationsContentVersionNo( $contentId, $versionNo ) + { + $query = $this->handler->createUpdateQuery(); + $query->update( + $this->handler->quoteTable( "ezcontentobject_tree" ) + )->set( + $this->handler->quoteColumn( "contentobject_version" ), + $query->bindValue( $versionNo, null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( "contentobject_id" ), + $contentId + ) + ); + $query->prepare()->execute(); + } + + /** + * Searches for the main nodeId of $contentId in $versionId + * + * @param int $contentId + * + * @return int|bool + */ + private function getMainNodeId( $contentId ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( 'node_id' ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $this->handler->quoteColumn( 'main_node_id' ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + $result = $statement->fetchAll( \PDO::FETCH_ASSOC ); + if ( count( $result ) === 1 ) + { + return (int)$result[0]['node_id']; + } + else + { + return false; + } + } + + /** + * Updates an existing location. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\UpdateStruct $location + * @param int $locationId + * + * @return boolean + */ + public function update( UpdateStruct $location, $locationId ) + { + $query = $this->handler->createUpdateQuery(); + + $query + ->update( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( + $this->handler->quoteColumn( 'priority' ), + $query->bindValue( $location->priority ) + ) + ->set( + $this->handler->quoteColumn( 'remote_id' ), + $query->bindValue( $location->remoteId ) + ) + ->set( + $this->handler->quoteColumn( 'sort_order' ), + $query->bindValue( $location->sortOrder ) + ) + ->set( + $this->handler->quoteColumn( 'sort_field' ), + $query->bindValue( $location->sortField ) + ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $locationId + ) + ); + $query->prepare()->execute(); + } + + /** + * Updates path identification string for given $locationId. + * + * @param mixed $locationId + * @param mixed $parentLocationId + * @param string $text + * + * @return void + */ + public function updatePathIdentificationString( $locationId, $parentLocationId, $text ) + { + $parentData = $this->getBasicNodeData( $parentLocationId ); + + $newPathIdentificationString = $parentData["path_identification_string"] . "/" . $text; + + /** @var $query \ezcQueryUpdate */ + $query = $this->handler->createUpdateQuery(); + $query->update( + "ezcontentobject_tree" + )->set( + $this->handler->quoteColumn( "path_identification_string" ), + $query->bindValue( $newPathIdentificationString, null, \PDO::PARAM_STR ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( "node_id" ), + $query->bindValue( $locationId, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Deletes ezcontentobject_tree row for given $locationId (node_id) + * + * @param mixed $locationId + */ + public function removeLocation( $locationId ) + { + $query = $this->handler->createDeleteQuery(); + $query->deleteFrom( + "ezcontentobject_tree" + )->where( + $query->expr->eq( + $this->handler->quoteColumn( "node_id" ), + $query->bindValue( $locationId, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Returns id of the next in line node to be set as a new main node + * + * This returns lowest node id for content identified by $contentId, and not of + * the node identified by given $locationId (current main node). + * Assumes that content has more than one location. + * + * @param mixed $contentId + * @param mixed $locationId + * + * @return array + */ + public function getFallbackMainNodeData( $contentId, $locationId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->quoteColumn( "node_id" ), + $this->handler->quoteColumn( "contentobject_version" ), + $this->handler->quoteColumn( "parent_node_id" ) + )->from( + $this->handler->quoteTable( "ezcontentobject_tree" ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->handler->quoteColumn( "contentobject_id" ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->neq( + $this->handler->quoteColumn( "node_id" ), + $query->bindValue( $locationId, null, \PDO::PARAM_INT ) + ) + ) + )->orderBy( "node_id", Query::SORT_ASC )->limit( 1 ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetch( \PDO::FETCH_ASSOC ); + } + + /** + * Sends a single location identified by given $locationId to the trash. + * + * The associated content object is left untouched. + * + * @param mixed $locationId + * + * @return boolean + */ + public function trashLocation( $locationId ) + { + $locationRow = $this->getBasicNodeData( $locationId ); + + /** @var $query \ezcQueryInsert */ + $query = $this->handler->createInsertQuery(); + $query->insertInto( $this->handler->quoteTable( "ezcontentobject_trash" ) ); + + unset( $locationRow["contentobject_is_published"] ); + foreach ( $locationRow as $key => $value ) + { + $query->set( $key, $query->bindValue( $value ) ); + } + + $query->prepare()->execute(); + + $this->removeLocation( $locationRow["node_id"] ); + $this->setContentStatus( $locationRow["contentobject_id"], ContentInfo::STATUS_ARCHIVED ); + } + + /** + * Returns a trashed location to normal state. + * + * Recreates the originally trashed location in the new position. If no new + * position has been specified, it will be tried to re-create the location + * at the old position. If this is not possible ( because the old location + * does not exist any more) and exception is thrown. + * + * @param mixed $locationId + * @param mixed|null $newParentId + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function untrashLocation( $locationId, $newParentId = null ) + { + $row = $this->loadTrashByLocation( $locationId ); + + $newLocation = $this->create( + new CreateStruct( + array( + 'priority' => $row['priority'], + 'hidden' => $row['is_hidden'], + 'invisible' => $row['is_invisible'], + 'remoteId' => $row['remote_id'], + 'contentId' => $row['contentobject_id'], + 'contentVersion' => $row['contentobject_version'], + 'mainLocationId' => true,// Restored location is always main location + 'sortField' => $row['sort_field'], + 'sortOrder' => $row['sort_order'], + ) + ), + $this->getBasicNodeData( $newParentId ?: $row['parent_node_id'] ) + ); + + $this->removeElementFromTrash( $locationId ); + $this->setContentStatus( $row['contentobject_id'], ContentInfo::STATUS_PUBLISHED ); + + return $newLocation; + } + + /** + * @param mixed $contentId + * @param int $status + */ + protected function setContentStatus( $contentId, $status ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->handler->createUpdateQuery(); + $query->update( + "ezcontentobject" + )->set( + $this->handler->quoteColumn( "status" ), + $query->bindValue( $status, null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( "id" ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Loads trash data specified by location ID + * + * @param mixed $locationId + * + * @return array + */ + public function loadTrashByLocation( $locationId ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( '*' ) + ->from( $this->handler->quoteTable( 'ezcontentobject_trash' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $locationId ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + if ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + return $row; + } + + throw new NotFound( 'trash', $locationId ); + } + + /** + * List trashed items + * + * @param int $offset + * @param int $limit + * @param array $sort + * + * @return array + */ + public function listTrashed( $offset, $limit, array $sort = null ) + { + $query = $this->handler->createSelectQuery(); + $query + ->select( '*' ) + ->from( $this->handler->quoteTable( 'ezcontentobject_trash' ) ); + + $sort = $sort ?: array(); + foreach ( $sort as $condition ) + { + $sortDirection = $condition->direction === Query::SORT_ASC ? \ezcQuerySelect::ASC : \ezcQuerySelect::DESC; + switch ( true ) + { + case $condition instanceof SortClause\LocationDepth: + $query->orderBy( 'depth', $sortDirection ); + break; + + case $condition instanceof SortClause\LocationPathString: + $query->orderBy( 'path_string', $sortDirection ); + break; + + case $condition instanceof SortClause\LocationPriority: + $query->orderBy( 'priority', $sortDirection ); + break; + + default: + // Only handle location related sort clauses. The others + // require data aggregation which is not sensible here. + // Since also criteria are yet ignored, because they are + // simply not used yet in eZ Publish, we skip that for now. + throw new RuntimeException( 'Unhandled sort clause: ' . get_class( $condition ) ); + } + } + + if ( $limit !== null ) + { + $query->limit( $limit, $offset ); + } + + $statement = $query->prepare(); + $statement->execute(); + + $rows = array(); + while ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + $rows[] = $row; + } + + return $rows; + } + + /** + * Removes every entries in the trash. + * Will NOT remove associated content objects nor attributes. + * + * Basically truncates ezcontentobject_trash table. + * + * @return void + */ + public function cleanupTrash() + { + $query = $this->handler->createDeleteQuery(); + $query->deleteFrom( 'ezcontentobject_trash' ); + $query->prepare()->execute(); + } + + /** + * Removes trashed element identified by $id from trash. + * Will NOT remove associated content object nor attributes. + * + * @param int $id The trashed location Id + * + * @return void + */ + public function removeElementFromTrash( $id ) + { + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( 'ezcontentobject_trash' ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'node_id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Set section on all content objects in the subtree + * + * @param mixed $pathString + * @param mixed $sectionId + * + * @return boolean + */ + public function setSectionForSubtree( $pathString, $sectionId ) + { + $query = $this->handler->createUpdateQuery(); + + $subSelect = $query->subSelect(); + $subSelect + ->select( $this->handler->quoteColumn( 'contentobject_id' ) ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $subSelect->expr->like( + $this->handler->quoteColumn( 'path_string' ), + $subSelect->bindValue( $pathString . '%' ) + ) + ); + + $query + ->update( $this->handler->quoteTable( 'ezcontentobject' ) ) + ->set( + $this->handler->quoteColumn( 'section_id' ), + $query->bindValue( $sectionId ) + ) + ->where( + $query->expr->in( + $this->handler->quoteColumn( 'id' ), + $subSelect + ) + ); + $query->prepare()->execute(); + } + + /** + * Returns how many locations given content object identified by $contentId has + * + * @param int $contentId + * + * @return int + */ + public function countLocationsByContentId( $contentId ) + { + $q = $this->handler->createSelectQuery(); + $q + ->select( + $q->alias( $q->expr->count( '*' ), 'count' ) + ) + ->from( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->where( + $q->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + $res = $stmt->fetchAll( \PDO::FETCH_ASSOC ); + return (int)$res[0]['count']; + } + + /** + * Changes main location of content identified by given $contentId to location identified by given $locationId + * + * Updates ezcontentobject_tree table for the given $contentId and eznode_assignment table for the given + * $contentId, $parentLocationId and $versionNo + * + * @param mixed $contentId + * @param mixed $locationId + * @param mixed $versionNo version number, needed to update eznode_assignment table + * @param mixed $parentLocationId parent location of location identified by $locationId, needed to update + * eznode_assignment table + * + * @return void + */ + public function changeMainLocation( $contentId, $locationId, $versionNo, $parentLocationId ) + { + // Update ezcontentobject_tree table + $q = $this->handler->createUpdateQuery(); + $q->update( + $this->handler->quoteTable( "ezcontentobject_tree" ) + )->set( + $this->handler->quoteColumn( "main_node_id" ), + $q->bindValue( $locationId, null, \PDO::PARAM_INT ) + )->where( + $q->expr->eq( + $this->handler->quoteColumn( "contentobject_id" ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + $q->prepare()->execute(); + + // Erase is_main in eznode_assignment table + $q = $this->handler->createUpdateQuery(); + $q->update( + $this->handler->quoteTable( "eznode_assignment" ) + )->set( + $this->handler->quoteColumn( "is_main" ), + $q->bindValue( 0, null, \PDO::PARAM_INT ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->handler->quoteColumn( "contentobject_id" ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->handler->quoteColumn( "contentobject_version" ), + $q->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ), + $q->expr->neq( + $this->handler->quoteColumn( "parent_node" ), + $q->bindValue( $parentLocationId, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + + // Set new is_main in eznode_assignment table + $q = $this->handler->createUpdateQuery(); + $q->update( + $this->handler->quoteTable( "eznode_assignment" ) + )->set( + $this->handler->quoteColumn( "is_main" ), + $q->bindValue( 1, null, \PDO::PARAM_INT ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->handler->quoteColumn( "contentobject_id" ), + $q->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->handler->quoteColumn( "contentobject_version" ), + $q->bindValue( $versionNo, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->handler->quoteColumn( "parent_node" ), + $q->bindValue( $parentLocationId, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Location/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Handler.php new file mode 100644 index 0000000..06255bb --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Handler.php @@ -0,0 +1,481 @@ +locationGateway = $locationGateway; + $this->locationMapper = $locationMapper; + $this->contentHandler = $contentHandler; + $this->contentMapper = $contentMapper; + } + + /** + * Returns parent path string for a path string + * + * @param string $pathString + * + * @return string + */ + protected function getParentPathString( $pathString ) + { + return implode( '/', array_slice( explode( '/', $pathString ), 0, -2 ) ) . '/'; + } + + /** + * Loads the data for the location identified by $locationId. + * + * @param int $locationId + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function load( $locationId ) + { + $data = $this->locationGateway->getBasicNodeData( $locationId ); + return $this->locationMapper->createLocationFromRow( $data ); + } + + /** + * Loads the data for the location identified by $remoteId. + * + * @param string $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function loadByRemoteId( $remoteId ) + { + $data = $this->locationGateway->getBasicNodeDataByRemoteId( $remoteId ); + return $this->locationMapper->createLocationFromRow( $data ); + } + + /** + * Loads all locations for $contentId, optionally limited to a sub tree + * identified by $rootLocationId + * + * @param int $contentId + * @param int $rootLocationId + * + * @return \eZ\Publish\SPI\Persistence\Content\Location[] + */ + public function loadLocationsByContent( $contentId, $rootLocationId = null ) + { + $rows = $this->locationGateway->loadLocationDataByContent( $contentId, $rootLocationId ); + return $this->locationMapper->createLocationsFromRows( $rows ); + } + + /** + * Copy location object identified by $sourceId, into destination identified by $destinationParentId. + * + * Performs a deep copy of the location identified by $sourceId and all of + * its child locations, copying the most recent published content object + * for each location to a new content object without any additional version + * information. Relations are not copied. URLs are not touched at all. + * + * @todo update subtree modification time, optionally retain dates and set creator + * + * @param mixed $sourceId + * @param mixed $destinationParentId + * + * @return Location the newly created Location. + */ + public function copySubtree( $sourceId, $destinationParentId ) + { + $children = $this->locationGateway->getSubtreeContent( $sourceId ); + $destinationParentData = $this->locationGateway->getBasicNodeData( $destinationParentId ); + $contentMap = array(); + $locationMap = array( + $children[0]["parent_node_id"] => array( + "id" => $destinationParentId, + "hidden" => (boolean)$destinationParentData["is_hidden"], + "invisible" => (boolean)$destinationParentData["is_invisible"], + "path_identification_string" => $destinationParentData["path_identification_string"] + ) + ); + + $locations = array(); + foreach ( $children as $child ) + { + $locations[$child["contentobject_id"]][$child["node_id"]] = true; + } + + $time = time(); + $mainLocations = array(); + $mainLocationsUpdate = array(); + foreach ( $children as $index => $child ) + { + // Copy content + if ( !isset( $contentMap[$child["contentobject_id"]] ) ) + { + $content = $this->contentHandler->copy( + $child["contentobject_id"], + $child["contentobject_version"] + ); + + $content = $this->contentHandler->publish( + $content->versionInfo->contentInfo->id, + $content->versionInfo->contentInfo->currentVersionNo, + new MetadataUpdateStruct( + array( + "publicationDate" => $time, + "modificationDate" => $time + ) + ) + ); + + $contentMap[$child["contentobject_id"]] = $content->versionInfo->contentInfo->id; + } + + $createStruct = $this->locationMapper->getLocationCreateStruct( $child ); + $createStruct->contentId = $contentMap[$child["contentobject_id"]]; + $parentData = $locationMap[$child["parent_node_id"]]; + $createStruct->parentId = $parentData["id"]; + $createStruct->invisible = $createStruct->hidden || $parentData["hidden"] || $parentData["invisible"]; + $pathString = explode( "/", $child["path_identification_string"] ); + $pathString = end( $pathString ); + $createStruct->pathIdentificationString = strlen( $pathString ) > 0 + ? $parentData["path_identification_string"] . "/" . $pathString + : null; + + // Use content main location if already set, otherwise create location as main + if ( isset( $mainLocations[$child["contentobject_id"]] ) ) + { + $createStruct->mainLocationId = $locationMap[$mainLocations[$child["contentobject_id"]]]["id"]; + } + else + { + $createStruct->mainLocationId = true; + $mainLocations[$child["contentobject_id"]] = $child["node_id"]; + + // If needed mark for update + if ( + isset( $locations[$child["contentobject_id"]][$child["main_node_id"]] ) && + count( $locations[$child["contentobject_id"]] ) > 1 && + $child["node_id"] !== $child["main_node_id"] + ) + { + $mainLocationsUpdate[$child["contentobject_id"]] = $child["main_node_id"]; + } + } + + $newLocation = $this->create( $createStruct ); + + $locationMap[$child["node_id"]] = array( + "id" => $newLocation->id, + "hidden" => $newLocation->hidden, + "invisible" => $newLocation->invisible, + "path_identification_string" => $newLocation->pathIdentificationString + ); + if ( $index === 0 ) + { + $copiedSubtreeRootLocation = $newLocation; + } + } + + // Update main locations + foreach ( $mainLocationsUpdate as $contentId => $mainLocationId ) + { + $this->changeMainLocation( + $contentMap[$contentId], + $locationMap[$mainLocationId]["id"] + ); + } + + // If subtree root is main location for its content, update subtree section to the one of the + // parent location content + /** @var $copiedSubtreeRootLocation */ + if ( $copiedSubtreeRootLocation->mainLocationId === $copiedSubtreeRootLocation->id ) + { + $this->setSectionForSubtree( + $copiedSubtreeRootLocation->id, + $this->contentHandler->loadContentInfo( $this->load( $destinationParentId )->contentId )->sectionId + ); + } + + return $copiedSubtreeRootLocation; + } + + /** + * Moves location identified by $sourceId into new parent identified by $destinationParentId. + * + * Performs a full move of the location identified by $sourceId to a new + * destination, identified by $destinationParentId. Relations do not need + * to be updated, since they refer to Content. URLs are not touched. + * + * @param mixed $sourceId + * @param mixed $destinationParentId + * + * @return boolean + */ + public function move( $sourceId, $destinationParentId ) + { + $sourceNodeData = $this->locationGateway->getBasicNodeData( $sourceId ); + $destinationNodeData = $this->locationGateway->getBasicNodeData( $destinationParentId ); + + $this->locationGateway->moveSubtreeNodes( + $sourceNodeData, + $destinationNodeData + ); + + $this->locationGateway->updateNodeAssignment( + $sourceNodeData['contentobject_id'], + $sourceNodeData['parent_node_id'], + $destinationParentId, + Gateway::NODE_ASSIGNMENT_OP_CODE_MOVE + ); + } + + /** + * Marks the given nodes and all ancestors as modified + * + * Optionally a time stamp with the modification date may be specified, + * otherwise the current time is used. + * + * @param int|string $locationId + * @param int $timestamp + * + * @return void + */ + public function markSubtreeModified( $locationId, $timestamp = null ) + { + $nodeData = $this->locationGateway->getBasicNodeData( $locationId ); + $timestamp = $timestamp ?: time(); + $this->locationGateway->updateSubtreeModificationTime( $nodeData['path_string'], $timestamp ); + } + + /** + * Sets a location to be hidden, and it self + all children to invisible. + * + * @param mixed $id Location ID + */ + public function hide( $id ) + { + $sourceNodeData = $this->locationGateway->getBasicNodeData( $id ); + + $this->locationGateway->hideSubtree( $sourceNodeData['path_string'] ); + } + + /** + * Sets a location to be unhidden, and self + children to visible unless a parent is hiding the tree. + * If not make sure only children down to first hidden node is marked visible. + * + * @param mixed $id + */ + public function unHide( $id ) + { + $sourceNodeData = $this->locationGateway->getBasicNodeData( $id ); + + $this->locationGateway->unhideSubtree( $sourceNodeData['path_string'] ); + } + + /** + * Swaps the content object being pointed to by a location object. + * + * Make the location identified by $locationId1 refer to the Content + * referred to by $locationId2 and vice versa. + * + * @param mixed $locationId1 + * @param mixed $locationId2 + * + * @return boolean + */ + public function swap( $locationId1, $locationId2 ) + { + $this->locationGateway->swap( $locationId1, $locationId2 ); + } + + /** + * Updates an existing location. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\UpdateStruct $location + * @param int $locationId + * + * @return boolean + */ + public function update( UpdateStruct $location, $locationId ) + { + $this->locationGateway->update( $location, $locationId ); + } + + /** + * Creates a new location rooted at $location->parentId. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct $createStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function create( CreateStruct $createStruct ) + { + $parentNodeData = $this->locationGateway->getBasicNodeData( $createStruct->parentId ); + $locationStruct = $this->locationGateway->create( $createStruct, $parentNodeData ); + $this->locationGateway->createNodeAssignment( + $createStruct, + $parentNodeData['node_id'], + LocationGateway::NODE_ASSIGNMENT_OP_CODE_CREATE_NOP + ); + + return $locationStruct; + } + + /** + * Removes all Locations under and including $locationId. + * + * Performs a recursive delete on the location identified by $locationId, + * including all of its child locations. Content which is not referred to + * by any other location is automatically removed. Content which looses its + * main Location will get the first of its other Locations assigned as the + * new main Location. + * + * @param mixed $locationId + * + * @return boolean + */ + public function removeSubtree( $locationId ) + { + $locationRow = $this->locationGateway->getBasicNodeData( $locationId ); + $contentId = $locationRow["contentobject_id"]; + $mainLocationId = $locationRow["main_node_id"]; + + $subLocations = $this->locationGateway->getChildren( $locationId ); + foreach ( $subLocations as $subLocation ) + { + $this->removeSubtree( $subLocation["node_id"] ); + } + + if ( $locationId == $mainLocationId ) + { + if ( 1 == $this->locationGateway->countLocationsByContentId( $contentId ) ) + { + $this->contentHandler->removeRawContent( $contentId ); + } + else + { + $newMainLocationRow = $this->locationGateway->getFallbackMainNodeData( + $contentId, + $locationId + ); + + $this->changeMainLocation( + $contentId, + $newMainLocationRow["node_id"], + $newMainLocationRow["contentobject_version"], + $newMainLocationRow["parent_node_id"] + ); + } + } + + $this->locationGateway->removeLocation( $locationId ); + $this->locationGateway->deleteNodeAssignment( $contentId ); + } + + /** + * Set section on all content objects in the subtree + * + * @param mixed $locationId + * @param mixed $sectionId + * + * @return void + */ + public function setSectionForSubtree( $locationId, $sectionId ) + { + $nodeData = $this->locationGateway->getBasicNodeData( $locationId ); + + $this->locationGateway->setSectionForSubtree( $nodeData['path_string'], $sectionId ); + } + + /** + * Changes main location of content identified by given $contentId to location identified by given $locationId + * + * Updates ezcontentobject_tree and eznode_assignment tables (eznode_assignment for content current version number). + * + * @param mixed $contentId + * @param mixed $locationId + * + * @return void + */ + public function changeMainLocation( $contentId, $locationId ) + { + $parentLocationId = $this->load( $locationId )->parentId; + + // Update ezcontentobject_tree and eznode_assignment tables + $this->locationGateway->changeMainLocation( + $contentId, + $locationId, + $this->contentHandler->loadContentInfo( $contentId )->currentVersionNo, + $parentLocationId + ); + + // Update subtree section to the one of the new main location parent location content + $this->setSectionForSubtree( + $locationId, + $this->contentHandler->loadContentInfo( $this->load( $parentLocationId )->contentId )->sectionId + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Location/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Mapper.php new file mode 100644 index 0000000..8c10f16 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Mapper.php @@ -0,0 +1,104 @@ +id = $data[$prefix . 'node_id']; + $location->priority = $data[$prefix . 'priority']; + $location->hidden = $data[$prefix . 'is_hidden']; + $location->invisible = $data[$prefix . 'is_invisible']; + $location->remoteId = $data[$prefix . 'remote_id']; + $location->contentId = $data[$prefix . 'contentobject_id']; + $location->parentId = $data[$prefix . 'parent_node_id']; + $location->pathIdentificationString = $data[$prefix . 'path_identification_string']; + $location->pathString = $data[$prefix . 'path_string']; + $location->mainLocationId = $data[$prefix . 'main_node_id']; + $location->depth = $data[$prefix . 'depth']; + $location->sortField = $data[$prefix . 'sort_field']; + $location->sortOrder = $data[$prefix . 'sort_order']; + + return $location; + } + + /** + * Creates Location objects from the given $rows, optionally with key + * $prefix + * + * @param array $rows + * @param string $prefix + * + * @return \eZ\Publish\SPI\Persistence\Content\Location[] + */ + public function createLocationsFromRows( array $rows, $prefix = '' ) + { + $locations = array(); + + foreach ( $rows as $row ) + { + $id = $row[$prefix . 'node_id']; + if ( !isset( $locations[$id] ) ) + { + $locations[$id] = $this->createLocationFromRow( $row, $prefix ); + } + } + + return array_values( $locations ); + } + + /** + * Creates a Location CreateStruct from a $data row + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct + */ + public function getLocationCreateStruct( array $data ) + { + $struct = new CreateStruct(); + + $struct->contentId = $data["contentobject_id"]; + $struct->contentVersion = $data["contentobject_version"]; + $struct->hidden = $data["is_hidden"]; + $struct->invisible = $data["is_invisible"]; + $struct->mainLocationId = $data["main_node_id"]; + $struct->parentId = $data["parent_node_id"]; + $struct->pathIdentificationString = $data["path_identification_string"]; + $struct->priority = $data["priority"]; + $struct->remoteId = md5( uniqid( get_class( $this ), true ) ); + $struct->sortField = $data["sort_field"]; + $struct->sortOrder = $data["sort_order"]; + + return $struct; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Location/Trash/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Trash/Handler.php new file mode 100644 index 0000000..dddba92 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Location/Trash/Handler.php @@ -0,0 +1,248 @@ +locationHandler = $locationHandler; + $this->locationGateway = $locationGateway; + $this->locationMapper = $locationMapper; + $this->contentHandler = $contentHandler; + } + + /** + * Loads the data for the trashed location identified by $id. + * $id is the same as original location (which has been previously trashed) + * + * @param int $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trashed + */ + public function loadTrashItem( $id ) + { + $data = $this->locationGateway->loadTrashByLocation( $id ); + return $this->locationMapper->createLocationFromRow( $data, null, new Trashed() ); + } + + /** + * Sends a subtree starting to $locationId to the trash + * and returns a Trashed object corresponding to $locationId. + * + * Moves all locations in the subtree to the Trash. The associated content + * objects are left untouched. + * + * @param mixed $locationId + * + * @todo Handle field types actions + * + * @return null|\eZ\Publish\SPI\Persistence\Content\Location\Trashed null if location was deleted, otherwise Trashed object + */ + public function trashSubtree( $locationId ) + { + $locationRows = $this->locationGateway->getSubtreeContent( $locationId ); + $isLocationRemoved = false; + $parentLocationId = null; + + foreach ( $locationRows as $locationRow ) + { + if ( $locationRow["node_id"] == $locationId ) + { + $parentLocationId = $locationRow["parent_node_id"]; + } + + if ( $this->locationGateway->countLocationsByContentId( $locationRow["contentobject_id"] ) == 1 ) + { + $this->locationGateway->trashLocation( $locationRow["node_id"] ); + } + else + { + if ( $locationRow["node_id"] == $locationId ) + { + $isLocationRemoved = true; + } + $this->locationGateway->removeLocation( $locationRow["node_id"] ); + + if ( $locationRow["node_id"] == $locationRow["main_node_id"] ) + { + $newMainLocationRow = $this->locationGateway->getFallbackMainNodeData( + $locationRow["contentobject_id"], + $locationRow["node_id"] + ); + + $this->locationHandler->changeMainLocation( + $locationRow["contentobject_id"], + $newMainLocationRow["node_id"], + $newMainLocationRow["contentobject_version"], + $newMainLocationRow["parent_node_id"] + ); + } + } + } + + if ( isset( $parentLocationId ) ) + { + $this->locationHandler->markSubtreeModified( $parentLocationId, time() ); + } + + return $isLocationRemoved ? null : $this->loadTrashItem( $locationId ); + } + + /** + * Returns a trashed location to normal state. + * + * Recreates the originally trashed location in the new position. + * If this is not possible (because the old location does not exist any more), + * a ParentNotFound exception is thrown. + * + * Returns newly restored location Id. + * + * @param mixed $trashedId + * @param mixed $newParentId + * + * @return int Newly restored location id + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException If $newParentId is invalid + * @todo Handle field types actions + */ + public function recover( $trashedId, $newParentId ) + { + return $this->locationGateway->untrashLocation( $trashedId, $newParentId )->id; + } + + /** + * Returns an array of all trashed locations satisfying the $criterion (if provided), + * sorted with SortClause objects contained in $sort (if any). + * If no criterion is provided (null), no filter is applied + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param int $offset Offset to start listing from, 0 by default + * @param int $limit Limit for the listing. Null by default (no limit) + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause[] $sort + * + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trashed[] + */ + public function findTrashItems( Criterion $criterion = null, $offset = 0, $limit = null, array $sort = null ) + { + // CBA: Ignore criterion for now. + $rows = $this->locationGateway->listTrashed( $offset, $limit, $sort ); + $items = array(); + + foreach ( $rows as $row ) + { + $items[] = $this->locationMapper->createLocationFromRow( $row, null, new Trashed() ); + } + + return $items; + } + + /** + * Empties the trash + * Everything contained in the trash must be removed + * + * @return void + */ + public function emptyTrash() + { + $trashedItems = $this->findTrashItems(); + foreach ( $trashedItems as $item ) + { + $this->delete( $item ); + } + + $this->locationGateway->cleanupTrash(); + } + + /** + * Removes a trashed location identified by $trashedLocationId from trash + * Associated content has to be deleted + * + * @param int $trashedId + * + * @return void + */ + public function deleteTrashItem( $trashedId ) + { + $this->delete( $this->loadTrashItem( $trashedId ) ); + } + + /** + * Triggers delete operations for $trashItem. + * If there is no more locations for corresponding content, then it will be deleted as well. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\Trashed $trashItem + * + * @return void + */ + protected function delete( Trashed $trashItem ) + { + $this->locationGateway->removeElementFromTrash( $trashItem->id ); + + if ( $this->locationGateway->countLocationsByContentId( $trashItem->contentId ) < 1 ) + $this->contentHandler->deleteContent( $trashItem->contentId ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php new file mode 100644 index 0000000..27f3484 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Mapper.php @@ -0,0 +1,496 @@ +converterRegistry = $converterRegistry; + $this->languageHandler = $languageHandler; + } + + /** + * Creates a Content from the given $struct and $currentVersionNo + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $struct + * @param mixed $currentVersionNo + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + private function createContentInfoFromCreateStruct( CreateStruct $struct, $currentVersionNo = 1 ) + { + $contentInfo = new ContentInfo; + + $contentInfo->id = null; + $contentInfo->contentTypeId = $struct->typeId; + $contentInfo->sectionId = $struct->sectionId; + $contentInfo->ownerId = $struct->ownerId; + $contentInfo->alwaysAvailable = $struct->alwaysAvailable; + $contentInfo->remoteId = $struct->remoteId; + $contentInfo->mainLanguageCode = $this->languageHandler->load( $struct->initialLanguageId )->languageCode; + $contentInfo->name = isset( $struct->name[$contentInfo->mainLanguageCode] ) + ? $struct->name[$contentInfo->mainLanguageCode] + : ""; + // For drafts published and modified timestamps should be 0 + $contentInfo->publicationDate = 0; + $contentInfo->modificationDate = 0; + $contentInfo->currentVersionNo = $currentVersionNo; + $contentInfo->isPublished = false; + + return $contentInfo; + } + + /** + * Creates a new version for the given $struct and $versionNo + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $struct + * @param mixed $versionNo + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + public function createVersionInfoFromCreateStruct( CreateStruct $struct, $versionNo ) + { + $versionInfo = new VersionInfo; + + $versionInfo->id = null; + $versionInfo->contentInfo = $this->createContentInfoFromCreateStruct( $struct, $versionNo ); + $versionInfo->versionNo = $versionNo; + $versionInfo->creatorId = $struct->ownerId; + $versionInfo->status = VersionInfo::STATUS_DRAFT; + $versionInfo->initialLanguageCode = $this->languageHandler->load( $struct->initialLanguageId )->languageCode; + $versionInfo->creationDate = $struct->modified; + $versionInfo->modificationDate = $struct->modified; + $versionInfo->names = $struct->name; + + $languageIds = array(); + foreach ( $struct->fields as $field ) + { + if ( !isset( $languageIds[$field->languageCode] ) ) + { + $languageIds[$field->languageCode] = + $this->languageHandler->loadByLanguageCode( $field->languageCode )->id; + } + } + $versionInfo->languageIds = array_values( $languageIds ); + + return $versionInfo; + } + + /** + * Creates a new version for the given $content + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * @param mixed $versionNo + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + public function createVersionInfoForContent( Content $content, $versionNo, $userId ) + { + $versionInfo = new VersionInfo; + + $versionInfo->contentInfo = $content->versionInfo->contentInfo; + $versionInfo->versionNo = $versionNo; + $versionInfo->creatorId = $userId; + $versionInfo->status = VersionInfo::STATUS_DRAFT; + $versionInfo->initialLanguageCode = $content->versionInfo->initialLanguageCode; + $versionInfo->creationDate = time(); + $versionInfo->modificationDate = $versionInfo->creationDate; + $versionInfo->names = is_object( $content->versionInfo ) ? $content->versionInfo->names : array(); + $versionInfo->languageIds = $content->versionInfo->languageIds; + + return $versionInfo; + } + + /** + * Converts value of $field to storage value + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue + */ + public function convertToStorageValue( Field $field ) + { + $converter = $this->converterRegistry->getConverter( + $field->type + ); + $storageValue = new StorageFieldValue(); + $converter->toStorageValue( + $field->value, + $storageValue + ); + return $storageValue; + } + + /** + * Extracts Content objects (and nested) from database result $rows + * + * Expects database rows to be indexed by keys of the format + * + * "$tableName_$columnName" + * + * @param array $rows + * + * @return \eZ\Publish\SPI\Persistence\Content[] + */ + public function extractContentFromRows( array $rows ) + { + $contentInfos = array(); + $versionInfos = array(); + + $fields = array(); + + foreach ( $rows as $row ) + { + $contentId = (int)$row['ezcontentobject_id']; + if ( !isset( $contentInfos[$contentId] ) ) + { + $contentInfos[$contentId] = $this->extractContentInfoFromRow( $row, 'ezcontentobject_' ); + } + if ( !isset( $versionInfos[$contentId] ) ) + { + $versionInfos[$contentId] = array(); + } + + $versionId = (int)$row['ezcontentobject_version_id']; + if ( !isset( $versionInfos[$contentId][$versionId] ) ) + { + $versionInfos[$contentId][$versionId] = $this->extractVersionInfoFromRow( $row ); + } + if ( !isset( $versionInfos[$contentId][$versionId]->names[$row['ezcontentobject_name_content_translation']] ) ) + { + $versionInfos[$contentId][$versionId]->names[$row['ezcontentobject_name_content_translation']] = $row['ezcontentobject_name_name']; + } + + $fieldId = (int)$row['ezcontentobject_attribute_id']; + if ( !isset( $fields[$contentId][$versionId][$fieldId] ) ) + { + $fields[$contentId][$versionId][$fieldId] = $this->extractFieldFromRow( $row ); + } + } + + $results = array(); + foreach ( $contentInfos as $contentId => $contentInfo ) + { + foreach ( $versionInfos[$contentId] as $versionId => $versionInfo ) + { + $content = new Content; + $content->versionInfo = $versionInfo; + $content->versionInfo->contentInfo = $contentInfo; + $content->fields = array_values( $fields[$contentId][$versionId] ); + $results[] = $content; + } + } + return $results; + } + + /** + * Extracts a ContentInfo object from $row + * + * @param array $row + * @param string $prefix Prefix for row keys, which are initially mapped by ezcontentobject fields + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public function extractContentInfoFromRow( array $row, $prefix = '' ) + { + $contentInfo = new ContentInfo; + $contentInfo->id = (int)$row["{$prefix}id"]; + $contentInfo->name = $row["{$prefix}name"]; + $contentInfo->contentTypeId = (int)$row["{$prefix}contentclass_id"]; + $contentInfo->sectionId = (int)$row["{$prefix}section_id"]; + $contentInfo->currentVersionNo = (int)$row["{$prefix}current_version"]; + $contentInfo->isPublished = (bool)( $row["{$prefix}status"] == ContentInfo::STATUS_PUBLISHED ); + $contentInfo->ownerId = (int)$row["{$prefix}owner_id"]; + $contentInfo->publicationDate = (int)$row["{$prefix}published"]; + $contentInfo->modificationDate = (int)$row["{$prefix}modified"]; + $contentInfo->alwaysAvailable = (int)$row["{$prefix}language_mask"] & 1; + $contentInfo->mainLanguageCode = $this->languageHandler->load( $row["{$prefix}initial_language_id"] )->languageCode; + $contentInfo->remoteId = $row["{$prefix}remote_id"]; + $contentInfo->mainLocationId = $row["ezcontentobject_tree_main_node_id"]; + + return $contentInfo; + } + + /** + * Extracts a VersionInfo object from $row. + * + * This method will return VersionInfo with incomplete data. It is intended to be used only by + * {@link self::extractContentFromRows} where missing data will be filled in. + * + * @param array $row + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + private function extractVersionInfoFromRow( array $row ) + { + $versionInfo = new VersionInfo; + $versionInfo->id = (int)$row["ezcontentobject_version_id"]; + $versionInfo->contentInfo = null; + $versionInfo->versionNo = (int)$row["ezcontentobject_version_version"]; + $versionInfo->creatorId = (int)$row["ezcontentobject_version_creator_id"]; + $versionInfo->creationDate = (int)$row["ezcontentobject_version_created"]; + $versionInfo->modificationDate = (int)$row["ezcontentobject_version_modified"]; + $versionInfo->initialLanguageCode = $this->languageHandler->load( $row["ezcontentobject_version_initial_language_id"] )->languageCode; + $versionInfo->languageIds = $this->extractLanguageIdsFromMask( $row["ezcontentobject_version_language_mask"] ); + $versionInfo->status = (int)$row["ezcontentobject_version_status"]; + $versionInfo->names = array(); + + return $versionInfo; + } + + /** + * Extracts a VersionInfo object from $row + * + * @param array $rows + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo[] + */ + public function extractVersionInfoListFromRows( array $rows ) + { + $versionInfoList = array(); + foreach ( $rows as $row ) + { + $versionId = (int)$row['ezcontentobject_version_id']; + if ( !isset( $versionInfoList[$versionId] ) ) + { + $versionInfo = new VersionInfo; + $versionInfo->id = (int)$row["ezcontentobject_version_id"]; + $versionInfo->contentInfo = $this->extractContentInfoFromRow( $row, "ezcontentobject_" ); + $versionInfo->versionNo = (int)$row["ezcontentobject_version_version"]; + $versionInfo->creatorId = (int)$row["ezcontentobject_version_creator_id"]; + $versionInfo->creationDate = (int)$row["ezcontentobject_version_created"]; + $versionInfo->modificationDate = (int)$row["ezcontentobject_version_modified"]; + $versionInfo->initialLanguageCode = $this->languageHandler->load( $row["ezcontentobject_version_initial_language_id"] )->languageCode; + $versionInfo->languageIds = $this->extractLanguageIdsFromMask( (int)$row["ezcontentobject_version_language_mask"] );//array(); + $versionInfo->status = (int)$row["ezcontentobject_version_status"]; + $versionInfo->names = array(); + $versionInfoList[$versionId] = $versionInfo; + } + + if ( !isset( $versionInfoList[$versionId]->names[$row['ezcontentobject_name_content_translation']] ) ) + { + $versionInfoList[$versionId]->names[$row['ezcontentobject_name_content_translation']] = $row['ezcontentobject_name_name']; + } + } + return array_values( $versionInfoList ); + } + + /** + * @todo use langmask handler for this + * + * @param int $languageMask + * + * @return array + */ + public function extractLanguageIdsFromMask( $languageMask ) + { + $exp = 2; + $result = array(); + + // Decomposition of $languageMask into its binary components. + while ( $exp <= $languageMask ) + { + if ( $languageMask & $exp ) + $result[] = $exp; + + $exp *= 2; + } + + return $result; + } + + /** + * Extracts a Field from $row + * + * @param array $row + * + * @return Field + */ + protected function extractFieldFromRow( array $row ) + { + $field = new Field(); + + $field->id = (int)$row['ezcontentobject_attribute_id']; + $field->fieldDefinitionId = (int)$row['ezcontentobject_attribute_contentclassattribute_id']; + $field->type = $row['ezcontentobject_attribute_data_type_string']; + $field->value = $this->extractFieldValueFromRow( $row, $field->type ); + $field->languageCode = $row['ezcontentobject_attribute_language_code']; + $field->versionNo = (int)$row['ezcontentobject_attribute_version']; + + return $field; + } + + /** + * Extracts a FieldValue of $type from $row + * + * @param array $row + * @param string $type + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + * @throws \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Exception\NotFound + * if the necessary converter for $type could not be found. + */ + protected function extractFieldValueFromRow( array $row, $type ) + { + $storageValue = new StorageFieldValue(); + + // Nullable field + $storageValue->dataFloat = isset( $row['ezcontentobject_attribute_data_float'] ) + ? (float)$row['ezcontentobject_attribute_data_float'] + : null; + // Nullable field + $storageValue->dataInt = isset( $row['ezcontentobject_attribute_data_int'] ) + ? (int)$row['ezcontentobject_attribute_data_int'] + : null; + $storageValue->dataText = $row['ezcontentobject_attribute_data_text']; + // Not nullable field + $storageValue->sortKeyInt = (int)$row['ezcontentobject_attribute_sort_key_int']; + $storageValue->sortKeyString = $row['ezcontentobject_attribute_sort_key_string']; + + $fieldValue = new FieldValue(); + + $converter = $this->converterRegistry->getConverter( $type ); + $converter->toFieldValue( $storageValue, $fieldValue ); + + return $fieldValue; + } + + /** + * Creates CreateStruct from $content + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return \eZ\Publish\SPI\Persistence\Content\CreateStruct + */ + public function createCreateStructFromContent( Content $content ) + { + $struct = new CreateStruct(); + $struct->name = $content->versionInfo->names; + $struct->typeId = $content->versionInfo->contentInfo->contentTypeId; + $struct->sectionId = $content->versionInfo->contentInfo->sectionId; + $struct->ownerId = $content->versionInfo->contentInfo->ownerId; + $struct->locations = array(); + $struct->alwaysAvailable = $content->versionInfo->contentInfo->alwaysAvailable; + $struct->remoteId = md5( uniqid( get_class( $this ), true ) ); + $struct->initialLanguageId = $this->languageHandler->loadByLanguageCode( $content->versionInfo->initialLanguageCode )->id; + $struct->modified = time(); + + foreach ( $content->fields as $field ) + { + $newField = clone $field; + $newField->id = null; + $struct->fields[] = $newField; + } + + return $struct; + } + + /** + * Extracts relation objects from $rows + */ + public function extractRelationsFromRows( array $rows ) + { + $relations = array(); + + foreach ( $rows as $row ) + { + $id = (int)$row['ezcontentobject_link_id']; + if ( !isset( $relations[$id] ) ) + { + $relations[$id] = $this->extractRelationFromRow( $row ); + } + } + + return $relations; + } + + /** + * Extracts a Relation object from a $row + * + * @param array $row Associative array representing a relation + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation + */ + protected function extractRelationFromRow( array $row ) + { + $relation = new Relation(); + $relation->id = (int)$row['ezcontentobject_link_id']; + $relation->sourceContentId = (int)$row['ezcontentobject_link_from_contentobject_id']; + $relation->sourceContentVersionNo = (int)$row['ezcontentobject_link_from_contentobject_version']; + $relation->destinationContentId = (int)$row['ezcontentobject_link_to_contentobject_id']; + $relation->type = (int)$row['ezcontentobject_link_relation_type']; + + $contentClassAttributeId = (int)$row['ezcontentobject_link_contentclassattribute_id']; + if ( $contentClassAttributeId > 0 ) + { + $relation->sourceFieldDefinitionId = $contentClassAttributeId; + } + + return $relation; + } + + /** + * Creates a Content from the given $struct + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation + */ + public function createRelationFromCreateStruct( RelationCreateStruct $struct ) + { + $relation = new Relation(); + + $relation->destinationContentId = $struct->destinationContentId; + $relation->sourceContentId = $struct->sourceContentId; + $relation->sourceContentVersionNo = $struct->sourceContentVersionNo; + $relation->sourceFieldDefinitionId = $struct->sourceFieldDefinitionId; + $relation->type = $struct->type; + + return $relation; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Gateway.php new file mode 100644 index 0000000..bb1e321 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Gateway.php @@ -0,0 +1,169 @@ +innerGateway = $innerGateway; + } + + /** + * Loads data for an object state + * + * @param mixed $stateId + * + * @return array + */ + public function loadObjectStateData( $stateId ) + { + try + { + return $this->innerGateway->loadObjectStateData( $stateId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for an object state by identifier + * + * @param string $identifier + * @param mixed $groupId + * + * @return array + */ + public function loadObjectStateDataByIdentifier( $identifier, $groupId ) + { + try + { + return $this->innerGateway->loadObjectStateDataByIdentifier( $identifier, $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for all object states belonging to group with $groupId ID + * + * @param mixed $groupId + * + * @return array + */ + public function loadObjectStateListData( $groupId ) + { + try + { + return $this->innerGateway->loadObjectStateListData( $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for an object state group + * + * @param mixed $groupId + * + * @return array + */ + public function loadObjectStateGroupData( $groupId ) + { + try + { + return $this->innerGateway->loadObjectStateGroupData( $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for an object state group by identifier + * + * @param string $identifier + * + * @return array + */ + public function loadObjectStateGroupDataByIdentifier( $identifier ) + { + try + { + return $this->innerGateway->loadObjectStateGroupDataByIdentifier( $identifier ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for all object state groups, filtered by $offset and $limit + * + * @param int $offset + * @param int $limit + * + * @return array + */ + public function loadObjectStateGroupListData( $offset, $limit ) + { + try + { + return $this->innerGateway->loadObjectStateGroupListData( $offset, $limit ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new object state into database + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState $objectState + * @param int $groupId + */ + public function insertObjectState( ObjectState $objectState, $groupId ) + { + try + { + return $this->innerGateway->insertObjectState( $objectState, $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates the stored object state with provided data + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState $objectState + */ + public function updateObjectState( ObjectState $objectState ) + { + try + { + return $this->innerGateway->updateObjectState( $objectState ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes object state identified by $stateId + * + * @param int $stateId + */ + public function deleteObjectState( $stateId ) + { + try + { + return $this->innerGateway->deleteObjectState( $stateId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Update object state links from $oldStateId to $newStateId + * + * @param int $oldStateId + * @param int $newStateId + */ + public function updateObjectStateLinks( $oldStateId, $newStateId ) + { + try + { + return $this->innerGateway->updateObjectStateLinks( $oldStateId, $newStateId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes object state links identified by $stateId + * + * @param int $stateId + */ + public function deleteObjectStateLinks( $stateId ) + { + try + { + return $this->innerGateway->deleteObjectStateLinks( $stateId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new object state group into database + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Group $objectStateGroup + */ + public function insertObjectStateGroup( Group $objectStateGroup ) + { + try + { + return $this->innerGateway->insertObjectStateGroup( $objectStateGroup ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates the stored object state group with provided data + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Group $objectStateGroup + */ + public function updateObjectStateGroup( Group $objectStateGroup ) + { + try + { + return $this->innerGateway->updateObjectStateGroup( $objectStateGroup ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the object state group identified by $groupId + * + * @param mixed $groupId + */ + public function deleteObjectStateGroup( $groupId ) + { + try + { + return $this->innerGateway->deleteObjectStateGroup( $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Sets the object state $stateId to content with $contentId ID + * + * @param mixed $contentId + * @param mixed $groupId + * @param mixed $stateId + */ + public function setContentState( $contentId, $groupId, $stateId ) + { + try + { + return $this->innerGateway->setContentState( $contentId, $groupId, $stateId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads object state data for $contentId content from $stateGroupId state group + * + * @param int $contentId + * @param int $stateGroupId + * + * @return array + */ + public function loadObjectStateDataForContent( $contentId, $stateGroupId ) + { + try + { + return $this->innerGateway->loadObjectStateDataForContent( $contentId, $stateGroupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns the number of objects which are in this state + * + * @param mixed $stateId + * + * @return int + */ + public function getContentCount( $stateId ) + { + try + { + return $this->innerGateway->getContentCount( $stateId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates the object state priority to provided value + * + * @param mixed $stateId + * @param int $priority + */ + public function updateObjectStatePriority( $stateId, $priority ) + { + try + { + return $this->innerGateway->updateObjectStatePriority( $stateId, $priority ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Gateway/EzcDatabase.php new file mode 100644 index 0000000..33a35d6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Gateway/EzcDatabase.php @@ -0,0 +1,841 @@ +dbHandler = $dbHandler; + $this->maskGenerator = $maskGenerator; + } + + /** + * Loads data for an object state + * + * @param mixed $stateId + * + * @return array + */ + public function loadObjectStateData( $stateId ) + { + $query = $this->createObjectStateFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcobj_state' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for an object state by identifier + * + * @param string $identifier + * @param mixed $groupId + * + * @return array + */ + public function loadObjectStateDataByIdentifier( $identifier, $groupId ) + { + $query = $this->createObjectStateFindQuery(); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'identifier', 'ezcobj_state' ), + $query->bindValue( $identifier, null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'group_id', 'ezcobj_state' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for all object states belonging to group with $groupId ID + * + * @param mixed $groupId + * + * @return array + */ + public function loadObjectStateListData( $groupId ) + { + $query = $this->createObjectStateFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'group_id', 'ezcobj_state' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + )->orderBy( $this->dbHandler->quoteColumn( 'priority', 'ezcobj_state' ), $query::ASC ); + + $statement = $query->prepare(); + $statement->execute(); + + $rows = array(); + while ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + $rows[$row['ezcobj_state_id']][] = $row; + } + + return array_values( $rows ); + } + + /** + * Loads data for an object state group + * + * @param mixed $groupId + * + * @return array + */ + public function loadObjectStateGroupData( $groupId ) + { + $query = $this->createObjectStateGroupFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcobj_state_group' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for an object state group by identifier + * + * @param string $identifier + * + * @return array + */ + public function loadObjectStateGroupDataByIdentifier( $identifier ) + { + $query = $this->createObjectStateGroupFindQuery(); + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'identifier', 'ezcobj_state_group' ), + $query->bindValue( $identifier, null, \PDO::PARAM_STR ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for all object state groups, filtered by $offset and $limit + * + * @param int $offset + * @param int $limit + * + * @return array + */ + public function loadObjectStateGroupListData( $offset, $limit ) + { + $query = $this->createObjectStateGroupFindQuery(); + $query->limit( $limit > 0 ? $limit : PHP_INT_MAX, $offset ); + + $statement = $query->prepare(); + $statement->execute(); + + $rows = array(); + while ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + $rows[$row['ezcobj_state_group_id']][] = $row; + } + + return array_values( $rows ); + } + + /** + * Inserts a new object state into database + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState $objectState + * @param int $groupId + */ + public function insertObjectState( ObjectState $objectState, $groupId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->expr->max( $this->dbHandler->quoteColumn( 'priority' ) ) + )->from( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'group_id' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $maxPriority = $statement->fetchColumn(); + + $objectState->priority = $maxPriority === null ? 0 : (int)$maxPriority + 1; + $objectState->groupId = (int)$groupId; + + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcobj_state', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'group_id' ), + $query->bindValue( $objectState->groupId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'default_language_id' ), + $query->bindValue( + $this->maskGenerator->generateLanguageIndicator( $objectState->defaultLanguage, false ), + null, \PDO::PARAM_INT + ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $objectState->identifier ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $query->bindValue( $this->generateLanguageMask( $objectState->languageCodes ), null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'priority' ), + $query->bindValue( $objectState->priority, null, \PDO::PARAM_INT ) + ); + + $query->prepare()->execute(); + + $objectState->id = (int)$this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcobj_state', 'id' ) + ); + + $this->insertObjectStateTranslations( $objectState ); + + // If this is a first state in group, assign it to all content objects + if ( $maxPriority === null ) + { + // @todo Hm... How do we perform this with query object? + $this->dbHandler->query( + "INSERT INTO ezcobj_state_link (contentobject_id, contentobject_state_id) + SELECT id, {$objectState->id} FROM ezcontentobject" + ); + } + } + + /** + * Updates the stored object state with provided data + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState $objectState + */ + public function updateObjectState( ObjectState $objectState ) + { + // First update the state + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->set( + $this->dbHandler->quoteColumn( 'default_language_id' ), + $query->bindValue( + $this->maskGenerator->generateLanguageIndicator( $objectState->defaultLanguage, false ), + null, \PDO::PARAM_INT + ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $objectState->identifier ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $query->bindValue( $this->generateLanguageMask( $objectState->languageCodes ), null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $objectState->id, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + + // And then refresh object state translations + // by removing existing ones and adding new ones + $this->deleteObjectStateTranslations( $objectState->id ); + $this->insertObjectStateTranslations( $objectState ); + } + + /** + * Deletes object state identified by $stateId + * + * @param int $stateId + */ + public function deleteObjectState( $stateId ) + { + $this->deleteObjectStateTranslations( $stateId ); + + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Update object state links to $newStateId + * + * @param int $oldStateId + * @param int $newStateId + */ + public function updateObjectStateLinks( $oldStateId, $newStateId ) + { + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $newStateId, null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $oldStateId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Deletes object state links identified by $stateId + * + * @param int $stateId + */ + public function deleteObjectStateLinks( $stateId ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Inserts a new object state group into database + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Group $objectStateGroup + */ + public function insertObjectStateGroup( Group $objectStateGroup ) + { + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezcobj_state_group' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcobj_state_group', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'default_language_id' ), + $query->bindValue( + $this->maskGenerator->generateLanguageIndicator( $objectStateGroup->defaultLanguage, false ), + null, \PDO::PARAM_INT + ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $objectStateGroup->identifier ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $query->bindValue( $this->generateLanguageMask( $objectStateGroup->languageCodes ), null, \PDO::PARAM_INT ) + ); + + $query->prepare()->execute(); + + $objectStateGroup->id = (int)$this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcobj_state_group', 'id' ) + ); + + $this->insertObjectStateGroupTranslations( $objectStateGroup ); + } + + /** + * Updates the stored object state group with provided data + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Group $objectStateGroup + */ + public function updateObjectStateGroup( Group $objectStateGroup ) + { + // First update the group + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcobj_state_group' ) + )->set( + $this->dbHandler->quoteColumn( 'default_language_id' ), + $query->bindValue( + $this->maskGenerator->generateLanguageIndicator( $objectStateGroup->defaultLanguage, false ), + null, \PDO::PARAM_INT + ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $objectStateGroup->identifier ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $query->bindValue( $this->generateLanguageMask( $objectStateGroup->languageCodes ), null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $objectStateGroup->id, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + + // And then refresh group translations + // by removing old ones and adding new ones + $this->deleteObjectStateGroupTranslations( $objectStateGroup->id ); + $this->insertObjectStateGroupTranslations( $objectStateGroup ); + } + + /** + * Deletes the object state group identified by $groupId + * + * @param mixed $groupId + */ + public function deleteObjectStateGroup( $groupId ) + { + $this->deleteObjectStateGroupTranslations( $groupId ); + + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcobj_state_group' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Sets the object state $stateId to content with $contentId ID + * + * @param mixed $contentId + * @param mixed $groupId + * @param mixed $stateId + */ + public function setContentState( $contentId, $groupId, $stateId ) + { + // First find out if $contentId is related to existing states in $groupId + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcobj_state' ) + )->from( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->innerJoin( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcobj_state' ), + $this->dbHandler->quoteColumn( 'contentobject_state_id', 'ezcobj_state_link' ) + ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'group_id', 'ezcobj_state' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcobj_state_link' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + + if ( !empty( $rows ) ) + { + // We already have a state assigned to $contentId, update to new one + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $rows[0]['ezcobj_state_id'], null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + } + else + { + // No state assigned to $contentId from specified group, create assignment + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ); + + $query->prepare()->execute(); + } + } + + /** + * Loads object state data for $contentId content from $stateGroupId state group + * + * @param int $contentId + * @param int $stateGroupId + * + * @return array + */ + public function loadObjectStateDataForContent( $contentId, $stateGroupId ) + { + $query = $this->createObjectStateFindQuery(); + $query->innerJoin( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcobj_state' ), + $this->dbHandler->quoteColumn( 'contentobject_state_id', 'ezcobj_state_link' ) + ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'group_id', 'ezcobj_state' ), + $query->bindValue( $stateGroupId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcobj_state_link' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns the number of objects which are in this state + * + * @param mixed $stateId + * + * @return int + */ + public function getContentCount( $stateId ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( $query->expr->count( '*' ), 'count' ) + )->from( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $count = $statement->fetchColumn(); + + return $count !== null ? (int)$count : 0; + } + + /** + * Updates the object state priority to provided value + * + * @param mixed $stateId + * @param int $priority + */ + public function updateObjectStatePriority( $stateId, $priority ) + { + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->set( + $this->dbHandler->quoteColumn( 'priority' ), + $query->bindValue( $priority, null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Creates a generalized query for fetching object state(s) + * + * @return \ezcQuerySelect + */ + protected function createObjectStateFindQuery() + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + // Object state + $this->dbHandler->aliasedColumn( $query, 'default_language_id', 'ezcobj_state' ), + $this->dbHandler->aliasedColumn( $query, 'group_id', 'ezcobj_state' ), + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcobj_state' ), + $this->dbHandler->aliasedColumn( $query, 'identifier', 'ezcobj_state' ), + $this->dbHandler->aliasedColumn( $query, 'language_mask', 'ezcobj_state' ), + $this->dbHandler->aliasedColumn( $query, 'priority', 'ezcobj_state' ), + // Object state language + $this->dbHandler->aliasedColumn( $query, 'description', 'ezcobj_state_language' ), + $this->dbHandler->aliasedColumn( $query, 'language_id', 'ezcobj_state_language' ), + $this->dbHandler->aliasedColumn( $query, 'name', 'ezcobj_state_language' ) + )->from( + $this->dbHandler->quoteTable( 'ezcobj_state' ) + )->innerJoin( + $this->dbHandler->quoteTable( 'ezcobj_state_language' ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcobj_state' ), + $this->dbHandler->quoteColumn( 'contentobject_state_id', 'ezcobj_state_language' ) + ) + ); + + return $query; + } + + /** + * Creates a generalized query for fetching object state group(s) + * + * @return \ezcQuerySelect + */ + protected function createObjectStateGroupFindQuery() + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + // Object state group + $this->dbHandler->aliasedColumn( $query, 'default_language_id', 'ezcobj_state_group' ), + $this->dbHandler->aliasedColumn( $query, 'id', 'ezcobj_state_group' ), + $this->dbHandler->aliasedColumn( $query, 'identifier', 'ezcobj_state_group' ), + $this->dbHandler->aliasedColumn( $query, 'language_mask', 'ezcobj_state_group' ), + // Object state group language + $this->dbHandler->aliasedColumn( $query, 'description', 'ezcobj_state_group_language' ), + $this->dbHandler->aliasedColumn( $query, 'language_id', 'ezcobj_state_group_language' ), + $this->dbHandler->aliasedColumn( $query, 'real_language_id', 'ezcobj_state_group_language' ), + $this->dbHandler->aliasedColumn( $query, 'name', 'ezcobj_state_group_language' ) + )->from( + $this->dbHandler->quoteTable( 'ezcobj_state_group' ) + )->innerJoin( + $this->dbHandler->quoteTable( 'ezcobj_state_group_language' ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcobj_state_group' ), + $this->dbHandler->quoteColumn( 'contentobject_state_group_id', 'ezcobj_state_group_language' ) + ) + ); + + return $query; + } + + /** + * Inserts object state group translations into database + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState $objectState + */ + protected function insertObjectStateTranslations( ObjectState $objectState ) + { + foreach ( $objectState->languageCodes as $languageCode ) + { + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezcobj_state_language' ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $objectState->id, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'description' ), + $query->bindValue( $objectState->description[$languageCode] ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $query->bindValue( $objectState->name[$languageCode] ) + )->set( + $this->dbHandler->quoteColumn( 'language_id' ), + $query->bindValue( + $this->maskGenerator->generateLanguageIndicator( + $languageCode, $languageCode === $objectState->defaultLanguage + ), + null, \PDO::PARAM_INT + ) + ); + + $query->prepare()->execute(); + } + } + + /** + * Deletes all translations of the $stateId state + * + * @param mixed $stateId + */ + protected function deleteObjectStateTranslations( $stateId ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcobj_state_language' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $query->bindValue( $stateId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Inserts object state group translations into database + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Group $objectStateGroup + */ + protected function insertObjectStateGroupTranslations( Group $objectStateGroup ) + { + foreach ( $objectStateGroup->languageCodes as $languageCode ) + { + $languageId = $this->maskGenerator->generateLanguageIndicator( + $languageCode, $languageCode === $objectStateGroup->defaultLanguage + ); + + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezcobj_state_group_language' ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_state_group_id' ), + $query->bindValue( $objectStateGroup->id, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'description' ), + $query->bindValue( $objectStateGroup->description[$languageCode] ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $query->bindValue( $objectStateGroup->name[$languageCode] ) + )->set( + $this->dbHandler->quoteColumn( 'language_id' ), + $query->bindValue( $languageId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'real_language_id' ), + $query->bindValue( $languageId & ~1, null, \PDO::PARAM_INT ) + ); + + $query->prepare()->execute(); + } + } + + /** + * Deletes all translations of the $groupId state group + * + * @param mixed $groupId + */ + protected function deleteObjectStateGroupTranslations( $groupId ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezcobj_state_group_language' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_state_group_id' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Generates language mask from provided language codes + * Also sets always available bit + * + * @param array $languageCodes + * + * @return int + */ + protected function generateLanguageMask( array $languageCodes ) + { + $maskLanguageCodes = array(); + foreach ( $languageCodes as $languageCode ) + { + $maskLanguageCodes[$languageCode] = 1; + } + $maskLanguageCodes['always-available'] = 1; + + return $this->maskGenerator->generateLanguageMask( $maskLanguageCodes ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Handler.php new file mode 100644 index 0000000..8cf5a2e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Handler.php @@ -0,0 +1,357 @@ +objectStateGateway = $objectStateGateway; + $this->objectStateMapper = $objectStateMapper; + } + + /** + * Creates a new object state group + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function createGroup( InputStruct $input ) + { + $objectStateGroup = $this->objectStateMapper->createObjectStateGroupFromInputStruct( $input ); + $this->objectStateGateway->insertObjectStateGroup( $objectStateGroup ); + + return $objectStateGroup; + } + + /** + * Loads an object state group + * + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function loadGroup( $groupId ) + { + $data = $this->objectStateGateway->loadObjectStateGroupData( $groupId ); + + if ( empty( $data ) ) + { + throw new NotFoundException( "ObjectStateGroup", $groupId ); + } + + return $this->objectStateMapper->createObjectStateGroupFromData( $data ); + } + + /** + * Loads a object state group by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function loadGroupByIdentifier( $identifier ) + { + $data = $this->objectStateGateway->loadObjectStateGroupDataByIdentifier( $identifier ); + + if ( empty( $data ) ) + { + throw new NotFoundException( "ObjectStateGroup", $identifier ); + } + + return $this->objectStateMapper->createObjectStateGroupFromData( $data ); + } + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group[] + */ + public function loadAllGroups( $offset = 0, $limit = -1 ) + { + $data = $this->objectStateGateway->loadObjectStateGroupListData( $offset, $limit ); + return $this->objectStateMapper->createObjectStateGroupListFromData( $data ); + } + + /** + * This method returns the ordered list of object states of a group + * + * @param mixed $groupId + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState[] + */ + public function loadObjectStates( $groupId ) + { + $data = $this->objectStateGateway->loadObjectStateListData( $groupId ); + return $this->objectStateMapper->createObjectStateListFromData( $data ); + } + + /** + * Updates an object state group + * + * @param mixed $groupId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function updateGroup( $groupId, InputStruct $input ) + { + $objectStateGroup = $this->objectStateMapper->createObjectStateGroupFromInputStruct( $input ); + $objectStateGroup->id = (int)$groupId; + + $this->objectStateGateway->updateObjectStateGroup( $objectStateGroup ); + + return $this->loadGroup( $objectStateGroup->id ); + } + + /** + * Deletes a object state group including all states and links to content + * + * @param mixed $groupId + */ + public function deleteGroup( $groupId ) + { + $objectStates = $this->loadObjectStates( $groupId ); + foreach ( $objectStates as $objectState ) + { + $this->objectStateGateway->deleteObjectStateLinks( $objectState->id ); + $this->objectStateGateway->deleteObjectState( $objectState->id ); + } + + $this->objectStateGateway->deleteObjectStateGroup( $groupId ); + } + + /** + * Creates a new object state in the given group. + * The new state gets the last priority. + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @param mixed $groupId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function create( $groupId, InputStruct $input ) + { + $objectState = $this->objectStateMapper->createObjectStateFromInputStruct( $input ); + $this->objectStateGateway->insertObjectState( $objectState, $groupId ); + + return $objectState; + } + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function load( $stateId ) + { + $data = $this->objectStateGateway->loadObjectStateData( $stateId ); + + if ( empty( $data ) ) + { + throw new NotFoundException( "ObjectState", $stateId ); + } + + return $this->objectStateMapper->createObjectStateFromData( $data ); + } + + /** + * Loads an object state by identifier and group it belongs to + * + * @param string $identifier + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function loadByIdentifier( $identifier, $groupId ) + { + $data = $this->objectStateGateway->loadObjectStateDataByIdentifier( $identifier, $groupId ); + + if ( empty( $data ) ) + { + throw new NotFoundException( "ObjectState", array( 'identifier' => $identifier, 'groupId' => $groupId ) ); + } + + return $this->objectStateMapper->createObjectStateFromData( $data ); + } + + /** + * Updates an object state + * + * @param mixed $stateId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function update( $stateId, InputStruct $input ) + { + $objectState = $this->objectStateMapper->createObjectStateFromInputStruct( $input ); + $objectState->id = (int)$stateId; + + $this->objectStateGateway->updateObjectState( $objectState ); + + return $this->load( $objectState->id ); + } + + /** + * Changes the priority of the state + * + * @param mixed $stateId + * @param int $priority + */ + public function setPriority( $stateId, $priority ) + { + $objectState = $this->load( $stateId ); + $groupStates = $this->loadObjectStates( $objectState->groupId ); + + $priorityList = array(); + foreach ( $groupStates as $index => $groupState ) + { + $priorityList[$groupState->id] = $index; + } + + $priorityList[$objectState->id] = (int)$priority; + asort( $priorityList ); + + foreach ( array_keys( $priorityList ) as $objectStatePriority => $objectStateId ) + { + $this->objectStateGateway->updateObjectStatePriority( $objectStateId, $objectStatePriority ); + } + } + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If state with $stateId doesn't exist + * + * @param mixed $stateId + */ + public function delete( $stateId ) + { + // Get the object state first as we need group ID + // to reorder the priorities and reassign content to another state in the group + $objectState = $this->load( $stateId ); + + $this->objectStateGateway->deleteObjectState( $objectState->id ); + + $remainingStates = $this->loadObjectStates( $objectState->groupId ); + if ( empty( $remainingStates ) ) + { + // If there are no more states in the group, just remove the state links + $this->objectStateGateway->deleteObjectStateLinks( $objectState->id ); + return; + } + + $priority = 0; + foreach ( $remainingStates as $remainingState ) + { + $this->objectStateGateway->updateObjectStatePriority( $remainingState->id, $priority ); + $priority++; + } + + $remainingStates = $this->loadObjectStates( $objectState->groupId ); + $this->objectStateGateway->updateObjectStateLinks( $objectState->id, current( $remainingStates )->id ); + } + + /** + * Sets the object-state of a state group to $stateId for the given content. + * + * @param mixed $contentId + * @param mixed $groupId + * @param mixed $stateId + * + * @return boolean + */ + public function setContentState( $contentId, $groupId, $stateId ) + { + $this->objectStateGateway->setContentState( $contentId, $groupId, $stateId ); + return true; + } + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no state is found + * + * @param mixed $contentId + * @param mixed $stateGroupId + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function getContentState( $contentId, $stateGroupId ) + { + $data = $this->objectStateGateway->loadObjectStateDataForContent( $contentId, $stateGroupId ); + + if ( empty( $data ) ) + { + throw new NotFoundException( "ObjectState", array( "groupId" => $stateGroupId ) ); + } + + return $this->objectStateMapper->createObjectStateFromData( $data ); + } + + /** + * Returns the number of objects which are in this state + * + * @param mixed $stateId + * + * @return int + */ + public function getContentCount( $stateId ) + { + return $this->objectStateGateway->getContentCount( $stateId ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Mapper.php new file mode 100644 index 0000000..0ad4e4c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/ObjectState/Mapper.php @@ -0,0 +1,198 @@ +languageHandler = $languageHandler; + } + + /** + * Creates ObjectState object from provided $data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function createObjectStateFromData( array $data ) + { + $objectState = new ObjectState(); + + $objectState->id = (int)$data[0]['ezcobj_state_id']; + $objectState->groupId = (int)$data[0]['ezcobj_state_group_id']; + $objectState->identifier = $data[0]['ezcobj_state_identifier']; + $objectState->priority = (int)$data[0]['ezcobj_state_priority']; + $objectState->defaultLanguage = $this->languageHandler->load( + $data[0]['ezcobj_state_default_language_id'] + )->languageCode; + + $objectState->languageCodes = array(); + $objectState->name = array(); + $objectState->description = array(); + + foreach ( $data as $stateTranslation ) + { + $languageCode = $this->languageHandler->load( + $stateTranslation['ezcobj_state_language_language_id'] & ~1 + )->languageCode; + + $objectState->languageCodes[] = $languageCode; + $objectState->name[$languageCode] = $stateTranslation['ezcobj_state_language_name']; + $objectState->description[$languageCode] = $stateTranslation['ezcobj_state_language_description']; + } + + return $objectState; + } + + /** + * Creates ObjectState array of objects from provided $data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState[] + */ + public function createObjectStateListFromData( array $data ) + { + $objectStates = array(); + + foreach ( $data as $objectStateData ) + { + $objectStates[] = $this->createObjectStateFromData( $objectStateData ); + } + + return $objectStates; + } + + /** + * Creates ObjectStateGroup object from provided $data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function createObjectStateGroupFromData( array $data ) + { + $objectStateGroup = new Group(); + + $objectStateGroup->id = (int)$data[0]['ezcobj_state_group_id']; + $objectStateGroup->identifier = $data[0]['ezcobj_state_group_identifier']; + $objectStateGroup->defaultLanguage = $this->languageHandler->load( + $data[0]['ezcobj_state_group_default_language_id'] + )->languageCode; + + $objectStateGroup->languageCodes = array(); + $objectStateGroup->name = array(); + $objectStateGroup->description = array(); + + foreach ( $data as $groupTranslation ) + { + $languageCode = $this->languageHandler->load( + $groupTranslation['ezcobj_state_group_language_real_language_id'] + )->languageCode; + + $objectStateGroup->languageCodes[] = $languageCode; + $objectStateGroup->name[$languageCode] = $groupTranslation['ezcobj_state_group_language_name']; + $objectStateGroup->description[$languageCode] = $groupTranslation['ezcobj_state_group_language_description']; + } + + return $objectStateGroup; + } + + /** + * Creates ObjectStateGroup array of objects from provided $data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group[] + */ + public function createObjectStateGroupListFromData( array $data ) + { + $objectStateGroups = array(); + + foreach ( $data as $objectStateGroupData ) + { + $objectStateGroups[] = $this->createObjectStateGroupFromData( $objectStateGroupData ); + } + + return $objectStateGroups; + } + + /** + * Creates an instance of ObjectStateGroup object from provided $input struct + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function createObjectStateGroupFromInputStruct( InputStruct $input ) + { + $objectStateGroup = new Group(); + + $objectStateGroup->identifier = $input->identifier; + $objectStateGroup->defaultLanguage = $input->defaultLanguage; + $objectStateGroup->name = $input->name; + $objectStateGroup->description = $input->description; + + $objectStateGroup->languageCodes = array(); + foreach ( $input->name as $languageCode => $name ) + { + $objectStateGroup->languageCodes[] = $languageCode; + } + + return $objectStateGroup; + } + + /** + * Creates an instance of ObjectState object from provided $input struct + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function createObjectStateFromInputStruct( InputStruct $input ) + { + $objectState = new ObjectState(); + + $objectState->identifier = $input->identifier; + $objectState->defaultLanguage = $input->defaultLanguage; + $objectState->name = $input->name; + $objectState->description = $input->description; + + $objectState->languageCodes = array(); + foreach ( $input->name as $languageCode => $name ) + { + $objectState->languageCodes[] = $languageCode; + } + + return $objectState; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway.php new file mode 100644 index 0000000..d21a7dc --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway.php @@ -0,0 +1,33 @@ +handler = $handler; + } + + /** + * Generic converter of criteria into query fragments + * + * @param \ezcQuerySelect $query + * @param Criterion $criterion + * + * @return \ezcQueryExpression + */ + public function convertCriteria( ezcQuerySelect $query, Criterion $criterion ) + { + foreach ( $this->handler as $handler ) + { + if ( $handler->accept( $criterion ) ) + { + return $handler->handle( $this, $query, $criterion ); + } + } + + throw new RuntimeException( 'No conversion for criterion found.' ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler.php new file mode 100644 index 0000000..34f41c6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler.php @@ -0,0 +1,73 @@ + "eq", + CriterionOperator::GT => "gt", + CriterionOperator::GTE => "gte", + CriterionOperator::LT => "lt", + CriterionOperator::LTE => "lte", + ); + + /** + * Database handler + * + * @var \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected $dbHandler; + + /** + * Creates a new criterion handler + * + * @param \EzcDbHandler $dbHandler + */ + public function __construct( EzcDbHandler $dbHandler ) + { + $this->dbHandler = $dbHandler; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param Criterion $criterion + * + * @return boolean + */ + abstract public function accept( Criterion $criterion ); + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param CriteriaConverter $converter + * @param \ezcQuerySelect $query + * @param Criterion $criterion + * + * @return \ezcQueryExpression + */ + abstract public function handle( CriteriaConverter $converter, ezcQuerySelect $query, Criterion $criterion ); +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentId.php new file mode 100644 index 0000000..3215dac --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentId.php @@ -0,0 +1,51 @@ +expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $criterion->value + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentTypeGroupId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentTypeGroupId.php new file mode 100644 index 0000000..4252830 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentTypeGroupId.php @@ -0,0 +1,64 @@ +subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentclass_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'group_id' ), + $criterion->value + ) + ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'contentclass_id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentTypeId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentTypeId.php new file mode 100644 index 0000000..db9dade --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ContentTypeId.php @@ -0,0 +1,51 @@ +expr->in( + $this->dbHandler->quoteColumn( 'contentclass_id', 'ezcontentobject' ), + $criterion->value + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/DateMetadata.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/DateMetadata.php new file mode 100644 index 0000000..450121d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/DateMetadata.php @@ -0,0 +1,85 @@ +dbHandler->quoteColumn( + $criterion->target === Criterion\DateMetadata::MODIFIED ? + 'modified' : + 'published', + 'ezcontentobject' + ); + + switch ( $criterion->operator ) + { + case Criterion\Operator::IN: + return $query->expr->in( + $column, + $criterion->value + ); + + case Criterion\Operator::BETWEEN: + return $query->expr->between( + $column, + $query->bindValue( $criterion->value[0] ), + $query->bindValue( $criterion->value[1] ) + ); + + case Criterion\Operator::EQ: + case Criterion\Operator::GT: + case Criterion\Operator::GTE: + case Criterion\Operator::LT: + case Criterion\Operator::LTE: + $operatorFunction = $this->comparatorMap[$criterion->operator]; + return $query->expr->$operatorFunction( + $column, + $query->bindValue( reset( $criterion->value ) ) + ); + + default: + throw new RuntimeException( 'Unknown operator.' ); + } + + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Field.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Field.php new file mode 100644 index 0000000..5d47588 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Field.php @@ -0,0 +1,207 @@ +dbHandler = $dbHandler; + $this->fieldConverterRegistry = $fieldConverterRegistry; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion$criterion + * + * @return boolean + */ + public function accept( Criterion $criterion ) + { + return $criterion instanceof Criterion\Field; + } + + /** + * Returns relevant field information for the specified field + * + * The returned information is returned as an array of the attribute + * identifier and the sort column, which should be used. + * + * @caching + * @param string $fieldIdentifier + * + * @return array + */ + protected function getFieldInformation( $fieldIdentifier ) + { + $query = $this->dbHandler->createSelectQuery(); + $query + ->select( + $this->dbHandler->quoteColumn( 'id', 'ezcontentclass_attribute' ), + $this->dbHandler->quoteColumn( 'data_type_string', 'ezcontentclass_attribute' ) + ) + ->from( + $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ) + ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'identifier', 'ezcontentclass_attribute' ), + $query->bindValue( $fieldIdentifier ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + if ( !( $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ) ) ) + { + throw new \OutOfBoundsException( "Content type field $fieldIdentifier not found." ); + } + + $fieldMapArray = array(); + foreach ( $rows as $row ) + { + if ( !isset( $fieldMapArray[ $row['data_type_string'] ] ) ) + { + $converter = $this->fieldConverterRegistry->getConverter( $row['data_type_string'] ); + + if ( !$converter instanceof Converter ) + { + throw new RuntimeException( + "getConverter({$row['data_type_string']}) did not return a converter, got: " . + gettype( $converter ) + ); + } + + $fieldMapArray[ $row['data_type_string'] ] = array( + 'ids' => array(), + 'column' => $converter->getIndexColumn(), + ); + } + + $fieldMapArray[ $row['data_type_string'] ]['ids'][] = $row['id']; + } + + return $fieldMapArray; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriteriaConverter$converter + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion$criterion + * + * @return \ezcQueryExpression + */ + public function handle( CriteriaConverter $converter, ezcQuerySelect $query, Criterion $criterion ) + { + $fieldInformations = $this->getFieldInformation( $criterion->target ); + + $subSelect = $query->subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_attribute' ) + ); + + $whereExpressions = array(); + foreach ( $fieldInformations as $fieldInformation ) + { + $column = $this->dbHandler->quoteColumn( $fieldInformation['column'] ); + switch ( $criterion->operator ) + { + case Criterion\Operator::IN: + $filter = $subSelect->expr->in( + $column, + $criterion->value + ); + break; + + case Criterion\Operator::BETWEEN: + $filter = $subSelect->expr->between( + $column, + $subSelect->bindValue( $criterion->value[0] ), + $subSelect->bindValue( $criterion->value[1] ) + ); + break; + + case Criterion\Operator::EQ: + case Criterion\Operator::GT: + case Criterion\Operator::GTE: + case Criterion\Operator::LT: + case Criterion\Operator::LTE: + $operatorFunction = $this->comparatorMap[$criterion->operator]; + $filter = $subSelect->expr->$operatorFunction( + $column, + $subSelect->bindValue( $criterion->value ) + ); + break; + + default: + throw new RuntimeException( 'Unknown operator.' ); + } + + $whereExpressions[] = $subSelect->expr->lAnd( + $subSelect->expr->in( + $this->dbHandler->quoteColumn( 'contentclassattribute_id' ), + $fieldInformation['ids'] + ), + $filter + ); + } + + if ( isset( $whereExpressions[1] ) ) + $subSelect->where( $subSelect->expr->lOr( $whereExpressions ) ); + else + $subSelect->where( $whereExpressions[0] ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/FullText.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/FullText.php new file mode 100644 index 0000000..b1e1337 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/FullText.php @@ -0,0 +1,220 @@ + 20, + 'enableWildcards' => true, + 'commands' => array( + 'apostrophe_normalize', + 'apostrophe_to_doublequote', + 'ascii_lowercase', + 'ascii_search_cleanup', + 'cyrillic_diacritical', + 'cyrillic_lowercase', + 'cyrillic_search_cleanup', + 'cyrillic_transliterate_ascii', + 'doublequote_normalize', + 'endline_search_normalize', + 'greek_diacritical', + 'greek_lowercase', + 'greek_normalize', + 'greek_transliterate_ascii', + 'hebrew_transliterate_ascii', + 'hyphen_normalize', + 'inverted_to_normal', + 'latin1_diacritical', + 'latin1_lowercase', + 'latin1_transliterate_ascii', + 'latin-exta_diacritical', + 'latin-exta_lowercase', + 'latin-exta_transliterate_ascii', + 'latin_lowercase', + 'latin_search_cleanup', + 'latin_search_decompose', + 'math_to_ascii', + 'punctuation_normalize', + 'space_normalize', + 'special_decompose', + 'specialwords_search_normalize', + 'tab_search_normalize', + ) + ); + + /** + * Transformation processor to normalize search strings + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor + */ + protected $processor; + + /** + * Construct from full text search configuration + * + * @param array $configuration + * + * @return void + */ + public function __construct( EzcDbHandler $dbHandler, TransformationProcessor $processor, array $configuration = array() ) + { + parent::__construct( $dbHandler ); + + $this->configuration = $configuration + $this->configuration; + $this->processor = $processor; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion$criterion + * + * @return boolean + */ + public function accept( Criterion $criterion ) + { + return $criterion instanceof Criterion\FullText; + } + + /** + * Tokenize String + * + * @param string $string + * + * @return array + */ + protected function tokenizeString( $string ) + { + return array_filter( + array_map( + 'trim', + preg_split( '(\\p{Z})u', strtr( $string, '\'"', '' ) ) + ) + ); + } + + /** + * Get single word query expression + * + * Depending on the configuration of the full text search criterion + * converter wildcards are either transformed into the respective LIKE + * queries, or everything is just compared using equal. + * + * @param \ezcQuerySelect $query + * @param string $token + * + * @return \ezcQueryExpression + */ + protected function getWordExpression( ezcQuerySelect $query, $token ) + { + if ( $this->configuration['enableWildcards'] && + $token[0] === '*' ) + { + return $query->expr->like( + $this->dbHandler->quoteColumn( 'word' ), + $query->bindValue( '%' . substr( $token, 1 ) ) + ); + } + + if ( $this->configuration['enableWildcards'] && + $token[strlen( $token ) - 1] === '*' ) + { + return $query->expr->like( + $this->dbHandler->quoteColumn( 'word' ), + $query->bindValue( substr( $token, 0, -1 ) . '%' ) + ); + } + + return $query->expr->eq( + $this->dbHandler->quoteColumn( 'word' ), + $query->bindValue( $token ) + ); + } + + /** + * Get subquery to select relevant word IDs + * + * @param string $string + * + * @return \ezcQuerySelect + */ + protected function getWordIdSubquery( $query, $string ) + { + $subQuery = $query->subSelect(); + $tokens = $this->tokenizeString( + $this->processor->transform( $string, $this->configuration['commands'] ) + ); + $wordExpressions = array(); + foreach ( $tokens as $token ) + { + $wordExpressions[] = $this->getWordExpression( $subQuery, $token ); + } + + $subQuery + ->select( $this->dbHandler->quoteColumn( 'id' ) ) + ->from( $this->dbHandler->quoteTable( 'ezsearch_word' ) ) + ->where( + $subQuery->expr->lAnd( + $subQuery->expr->lOr( $wordExpressions ), + $subQuery->expr->lt( + $this->dbHandler->quoteColumn( 'object_count' ), + $subQuery->bindValue( $this->configuration['searchThresholdValue'] ) + ) + ) + ); + return $subQuery; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriteriaConverter$converter + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion$criterion + * + * @return \ezcQueryExpression + */ + public function handle( CriteriaConverter $converter, ezcQuerySelect $query, Criterion $criterion ) + { + $subSelect = $query->subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezsearch_object_word_link' ) + )->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'word_id' ), + $this->getWordIdSubquery( $subSelect, $criterion->value ) + ) + ); + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LanguageCode.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LanguageCode.php new file mode 100644 index 0000000..6c6d45a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LanguageCode.php @@ -0,0 +1,76 @@ +maskGenerator = $maskGenerator; + parent::__construct( $dbHandler ); + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * + * @return boolean + */ + public function accept( Criterion $criterion ) + { + return $criterion instanceof Criterion\LanguageCode; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriteriaConverter $converter + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * + * @return \ezcQueryExpression + */ + public function handle( CriteriaConverter $converter, ezcQuerySelect $query, Criterion $criterion ) + { + $languages = $criterion->value; + $languages['always-available'] = 0; + + return $query->expr->gt( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( 'language_mask', 'ezcontentobject' ), + // @todo: Use a cached version of mask generator when implemented + $this->maskGenerator->generateLanguageMask( $languages ) + ), + 0 + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LocationId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LocationId.php new file mode 100644 index 0000000..efbed0e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LocationId.php @@ -0,0 +1,64 @@ +subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ) + )->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'node_id' ), + $criterion->value + ) + ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LocationRemoteId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LocationRemoteId.php new file mode 100644 index 0000000..08a7303 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LocationRemoteId.php @@ -0,0 +1,64 @@ +subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ) + )->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'remote_id', 'ezcontentobject_tree' ), + $criterion->value + ) + ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalAnd.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalAnd.php new file mode 100644 index 0000000..8b45bdc --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalAnd.php @@ -0,0 +1,53 @@ +criteria as $subCriterion ) + { + $subexpressions[] = $converter->convertCriteria( $query, $subCriterion ); + } + return $query->expr->lAnd( $subexpressions ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalNot.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalNot.php new file mode 100644 index 0000000..0484783 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalNot.php @@ -0,0 +1,50 @@ +expr->not( + $converter->convertCriteria( $query, $criterion->criteria[0] ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalOr.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalOr.php new file mode 100644 index 0000000..909208b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/LogicalOr.php @@ -0,0 +1,53 @@ +criteria as $subCriterion ) + { + $subexpressions[] = $converter->convertCriteria( $query, $subCriterion ); + } + return $query->expr->lOr( $subexpressions ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ObjectStateId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ObjectStateId.php new file mode 100644 index 0000000..4b07e26 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ObjectStateId.php @@ -0,0 +1,69 @@ +subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcobj_state_link' ) + )->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'contentobject_state_id' ), + $criterion->value + ) + ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ParentLocationId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ParentLocationId.php new file mode 100644 index 0000000..5f37833 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/ParentLocationId.php @@ -0,0 +1,64 @@ +subSelect(); + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ) + )->where( + $query->expr->in( + $this->dbHandler->quoteColumn( 'parent_node_id' ), + $criterion->value + ) + ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/RemoteId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/RemoteId.php new file mode 100644 index 0000000..91adeb8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/RemoteId.php @@ -0,0 +1,51 @@ +expr->in( + $this->dbHandler->quoteColumn( 'remote_id', 'ezcontentobject' ), + $criterion->value + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/SectionId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/SectionId.php new file mode 100644 index 0000000..398a094 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/SectionId.php @@ -0,0 +1,51 @@ +expr->in( + $this->dbHandler->quoteColumn( 'section_id', 'ezcontentobject' ), + $criterion->value + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Status.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Status.php new file mode 100644 index 0000000..da3cfd8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Status.php @@ -0,0 +1,68 @@ + 0, + Criterion\Status::STATUS_PUBLISHED => 1, + Criterion\Status::STATUS_ARCHIVED => 2, + ); + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion$criterion + * + * @return boolean + */ + public function accept( Criterion $criterion ) + { + return $criterion instanceof Criterion\Status; + } + + /** + * Check if this criterion handler accepts to handle the given criterion. + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriteriaConverter$converter + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion$criterion + * + * @return \ezcQueryExpression + */ + public function handle( CriteriaConverter $converter, ezcQuerySelect $query, Criterion $criterion ) + { + $status = array(); + foreach ( $criterion->value as $value ) + { + $status[] = $this->statusMap[$value]; + } + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'status', 'ezcontentobject' ), + $status + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Subtree.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Subtree.php new file mode 100644 index 0000000..cf6a8a2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Subtree.php @@ -0,0 +1,71 @@ +subSelect(); + + $statements = array(); + foreach ( $criterion->value as $pattern ) + { + $statements[] = $subSelect->expr->like( + $this->dbHandler->quoteColumn( 'path_string', 'ezcontentobject_tree' ), + $subSelect->bindValue( $pattern . '%' ) + ); + } + + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id', 'ezcontentobject_tree' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ) + )->where( + $query->expr->lOr( $statements ) + ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Visibility.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Visibility.php new file mode 100644 index 0000000..08b638e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/CriterionHandler/Visibility.php @@ -0,0 +1,92 @@ +subSelect(); + + if ( $criterion->value[0] === Criterion\Visibility::VISIBLE ) + { + $expression = $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'is_hidden', 'ezcontentobject_tree' ), + 0 + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'is_invisible', 'ezcontentobject_tree' ), + 0 + ) + ); + } + else + { + $expression = $query->expr->lOr( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'is_hidden', 'ezcontentobject_tree' ), + 1 + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'is_invisible', 'ezcontentobject_tree' ), + 1 + ) + ); + } + + $subSelect + ->select( + $this->dbHandler->quoteColumn( 'contentobject_id' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ) + )->where( $expression ); + + return $query->expr->in( + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ), + $subSelect + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/ExceptionConversion.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/ExceptionConversion.php new file mode 100644 index 0000000..14d9e84 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/ExceptionConversion.php @@ -0,0 +1,65 @@ +innerGateway = $innerGateway; + } + + /** + * Returns a list of object satisfying the $criterion. + * + * @param Criterion $criterion + * @param int $offset + * @param int|null $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause[] $sort + * @param string[] $translations + * + * @return mixed[][] + */ + public function find( Criterion $criterion, $offset = 0, $limit = null, array $sort = null, array $translations = null ) + { + try + { + return $this->innerGateway->find( $criterion, $offset, $limit, $sort, $translations ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/EzcDatabase.php new file mode 100644 index 0000000..6168189 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/EzcDatabase.php @@ -0,0 +1,305 @@ +handler = $handler; + $this->criteriaConverter = $criteriaConverter; + $this->sortClauseConverter = $sortClauseConverter; + $this->queryBuilder = $queryBuilder; + $this->languageHandler = $languageHandler; + $this->languageMaskGenerator = $languageMaskGenerator; + } + + /** + * Returns a list of object satisfying the $criterion. + * + * @todo Check Query recreation in this method. Something breaks if we reuse + * the query, after we have added the applyJoin() stuff here. + * + * @param Criterion $criterion + * @param int $offset + * @param int|null $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause[] $sort + * @param string[] $translations + * + * @return mixed[][] + */ + public function find( Criterion $criterion, $offset = 0, $limit = null, array $sort = null, array $translations = null ) + { + $limit = $limit !== null ? $limit : self::MAX_LIMIT; + + // Get full object count + $query = $this->handler->createSelectQuery(); + $condition = $this->getQueryCondition( $criterion, $query, $translations ); + + $query + ->select( 'COUNT( * )' ) + ->from( $this->handler->quoteTable( 'ezcontentobject' ) ) + ->innerJoin( + 'ezcontentobject_version', + 'ezcontentobject.id', + 'ezcontentobject_version.contentobject_id' + ); + + if ( $sort !== null ) + { + $this->sortClauseConverter->applyJoin( $query, $sort ); + } + + $query->where( + $query->expr->eq( + 'ezcontentobject_version.status', + VersionInfo::STATUS_PUBLISHED + ), + $condition + ); + + $statement = $query->prepare(); + $statement->execute(); + + $count = (int)$statement->fetchColumn(); + + if ( $count === 0 || $limit === 0 ) + { + return array( 'count' => $count, 'rows' => array() ); + } + + // Get clean query, Not sure why we cannot reuse the existing query + // and conditions. + $query = $this->handler->createSelectQuery(); + $condition = $this->getQueryCondition( $criterion, $query, $translations ); + + $query + ->select( 'COUNT( * )' ) + ->from( $this->handler->quoteTable( 'ezcontentobject' ) ) + ->where( $condition ); + + $contentIds = $this->getContentIds( $query, $condition, $sort, $offset, $limit ); + + return array( + 'count' => $count, + 'rows' => $this->loadContent( $contentIds, $translations ), + ); + } + + /** + * Get query condition + * + * @param Criterion $criterion + * @param \ezcQuerySelect $query + * @param mixed $translations + * + * @return string + */ + protected function getQueryCondition( Criterion $criterion, ezcQuerySelect $query, $translations ) + { + $condition = $this->criteriaConverter->convertCriteria( $query, $criterion ); + + if ( $translations === null ) + { + return $condition; + } + + $translationQuery = $query->subSelect(); + $translationQuery->select( + $this->handler->quoteColumn( 'contentobject_id' ) + )->from( + $this->handler->quoteTable( 'ezcontentobject_attribute' ) + )->where( + $translationQuery->expr->in( + $this->handler->quoteColumn( 'language_code' ), + $translations + ) + ); + + return $query->expr->lAnd( + $condition, + $query->expr->in( + $this->handler->quoteColumn( 'id' ), + $translationQuery + ) + ); + } + + /** + * Get sorted arrays of content IDs, which should be returned + * + * @param \ezcQuerySelect mixed $query + * @param string $condition + * @param mixed $sort + * @param int $offset + * @param int $limit + * + * @return int[] + */ + protected function getContentIds( ezcQuerySelect $query, $condition, $sort, $offset, $limit ) + { + $query->reset(); + $query->select( + $this->handler->quoteColumn( 'id', 'ezcontentobject' ) + ); + + if ( $sort !== null ) + { + $this->sortClauseConverter->applySelect( $query, $sort ); + } + + $query->from( + $this->handler->quoteTable( 'ezcontentobject' ) + ); + + if ( $sort !== null ) + { + $this->sortClauseConverter->applyJoin( $query, $sort ); + } + + $query->where( $condition ); + + if ( $sort !== null ) + { + $this->sortClauseConverter->applyOrderBy( $query, $sort ); + } + + $query->limit( $limit, $offset ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_COLUMN ); + } + + /** + * Loads the actual content based on the provided IDs + * + * @param array $contentIds + * @param mixed $translations + * + * @return mixed[] + */ + protected function loadContent( array $contentIds, $translations ) + { + $loadQuery = $this->queryBuilder->createFindQuery( $translations ); + $loadQuery->where( + $loadQuery->expr->eq( + 'ezcontentobject_version.status', + VersionInfo::STATUS_PUBLISHED + ), + $loadQuery->expr->in( + $this->handler->quoteColumn( 'id', 'ezcontentobject' ), + $contentIds + ) + ); + + $statement = $loadQuery->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + + // Sort array, as defined in the $contentIds array + $contentIdOrder = array_flip( $contentIds ); + usort( + $rows, + function ( $current, $next ) use ( $contentIdOrder ) + { + return $contentIdOrder[$current['ezcontentobject_id']] - + $contentIdOrder[$next['ezcontentobject_id']]; + } + ); + + foreach ( $rows as &$row ) + { + $row['ezcontentobject_always_available'] = $this->languageMaskGenerator->isAlwaysAvailable( $row['ezcontentobject_language_mask'] ); + $row['ezcontentobject_main_language_code'] = $this->languageHandler->load( $row['ezcontentobject_initial_language_id'] )->languageCode; + $row['ezcontentobject_version_languages'] = $this->languageMaskGenerator->extractLanguageIdsFromMask( $row['ezcontentobject_version_language_mask'] ); + $row['ezcontentobject_version_initial_language_code'] = $this->languageHandler->load( $row['ezcontentobject_version_initial_language_id'] )->languageCode; + } + + return $rows; + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseConverter.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseConverter.php new file mode 100644 index 0000000..eae12cf --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseConverter.php @@ -0,0 +1,127 @@ +handlers = $handlers; + } + + /** + * Apply select parts of sort clauses to query + * + * @param \ezcQuerySelect $query + * @param array $sortClauses + * + * @return void + */ + public function applySelect( ezcQuerySelect $query, array $sortClauses ) + { + $sortColumn = array(); + foreach ( $sortClauses as $nr => $sortClause ) + { + foreach ( $this->handlers as $handler ) + { + if ( $handler->accept( $sortClause ) ) + { + foreach ( (array)$handler->applySelect( $query, $sortClause, $nr ) as $column ) + { + $this->sortColumns[$column] = $sortClause->direction; + } + continue 2; + } + } + + throw new RuntimeException( 'No handler available for sort clause: ' . get_class( $sortClause ) ); + } + } + + /** + * Apply join parts of sort clauses to query + * + * @param \ezcQuerySelect $query + * @param array $sortClauses + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, array $sortClauses ) + { + foreach ( $sortClauses as $nr => $sortClause ) + { + foreach ( $this->handlers as $handler ) + { + if ( $handler->accept( $sortClause ) ) + { + $handler->applyJoin( $query, $sortClause, $nr ); + continue 2; + } + } + + throw new RuntimeException( 'No handler available for sort clause: ' . get_class( $sortClause ) ); + } + } + + /** + * Apply order by parts of sort clauses to query + * + * @param \ezcQuerySelect $query + * @param array $sortClauses + * + * @return void + */ + public function applyOrderBy( ezcQuerySelect $query, array $sortClauses ) + { + foreach ( $this->sortColumns as $column => $direction ) + { + $query->orderBy( + $column, + $direction === Query::SORT_ASC ? ezcQuerySelect::ASC : ezcQuerySelect::DESC + ); + } + + // @todo Review needed + // The following line was added because without it, loading sub user groups through the Public API + // fails with the database error "Unknown column sort_column_0". The change does not break any + // integration tests or legacy persistence tests, but it can break something else, so review is needed + // Discussion: https://github.com/ezsystems/ezp-next/commit/8749d0977307858c3e2a7d82f3be90fa21973357#L1R102 + $this->sortColumns = array(); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler.php new file mode 100644 index 0000000..26bd1e8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler.php @@ -0,0 +1,98 @@ +dbHandler = $dbHandler; + } + + /** + * Check if this sort clause handler accepts to handle the given sort clause. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * + * @return boolean + */ + abstract public function accept( SortClause $sortClause ); + + /** + * Apply selects to the query + * + * Returns the name of the (aliased) column, which information should be + * used for sorting. + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return string + */ + abstract public function applySelect( ezcQuerySelect $query, SortClause $sortClause, $number ); + + /** + * Applies joins to the query + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, SortClause $sortClause, $number ) + { + } + + /** + * Returns the quoted sort column name + * + * @param int $number + * + * @return string + */ + protected function getSortColumnName( $number ) + { + return $this->dbHandler->quoteIdentifier( 'sort_column_' . $number ); + } + + /** + * Returns the sort table name + * + * @param int $number + * + * @return string + */ + protected function getSortTableName( $number ) + { + return 'sort_table_' . $number; + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/ContentId.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/ContentId.php new file mode 100644 index 0000000..b4c7497 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/ContentId.php @@ -0,0 +1,60 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "id", + "ezcontentobject" + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/ContentName.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/ContentName.php new file mode 100644 index 0000000..4e70c77 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/ContentName.php @@ -0,0 +1,60 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "name", + "ezcontentobject" + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/DateModified.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/DateModified.php new file mode 100644 index 0000000..885eb03 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/DateModified.php @@ -0,0 +1,60 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "modified", + "ezcontentobject" + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/DatePublished.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/DatePublished.php new file mode 100644 index 0000000..ed7f2af --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/DatePublished.php @@ -0,0 +1,60 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "published", + "ezcontentobject" + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/Field.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/Field.php new file mode 100644 index 0000000..2b17f6a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/Field.php @@ -0,0 +1,130 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "sort_key_int", + $this->getSortTableName( $number ) + ), + $column1 = $this->getSortColumnName( $number ) + ), + $query->alias( + $this->dbHandler->quoteColumn( + "sort_key_string", + $this->getSortTableName( $number ) + ), + $column2 = $this->getSortColumnName( $number . "_bis" ) + ) + ); + + return array( $column1, $column2 ); + } + + /** + * Applies joins to the query, required to fetch sort data + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, SortClause $sortClause, $number ) + { + $table = $this->getSortTableName( $number ); + $query + ->innerJoin( + $query->alias( + $this->dbHandler->quoteTable( "ezcontentobject_attribute" ), + $this->dbHandler->quoteIdentifier( $table ) + ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "contentobject_id", $table ), + $this->dbHandler->quoteColumn( "id", "ezcontentobject" ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "version", $table ), + $this->dbHandler->quoteColumn( "current_version", "ezcontentobject" ) + ) + ) + ) + ->innerJoin( + $query->alias( + $this->dbHandler->quoteTable( "ezcontentclass_attribute" ), + $this->dbHandler->quoteIdentifier( "cc_attr_$number" ) + ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "contentclassattribute_id", $table ), + $this->dbHandler->quoteColumn( "id", "cc_attr_$number" ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "identifier", "cc_attr_$number" ), + $query->bindValue( $sortClause->targetData->fieldIdentifier ) + ) + ) + ) + ->innerJoin( + $query->alias( + $this->dbHandler->quoteTable( "ezcontentclass" ), + $this->dbHandler->quoteIdentifier( "cc_$number" ) + ), + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "contentclass_id", "cc_attr_$number" ), + $this->dbHandler->quoteColumn( "id", "cc_$number" ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "identifier", "cc_$number" ), + $query->bindValue( $sortClause->targetData->typeIdentifier ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationDepth.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationDepth.php new file mode 100644 index 0000000..9627c52 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationDepth.php @@ -0,0 +1,86 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + 'depth', + $this->getSortTableName( $number ) + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } + + /** + * Applies joins to the query, required to fetch sort data + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, SortClause $sortClause, $number ) + { + $table = $this->getSortTableName( $number ); + $query + ->leftJoin( + $query->alias( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ), + $this->dbHandler->quoteIdentifier( $table ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', $table ), + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ) + ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationPathString.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationPathString.php new file mode 100644 index 0000000..27b908d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationPathString.php @@ -0,0 +1,86 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + 'path_string', + $this->getSortTableName( $number ) + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } + + /** + * Applies joins to the query, required to fetch sort data + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, SortClause $sortClause, $number ) + { + $table = $this->getSortTableName( $number ); + $query + ->leftJoin( + $query->alias( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ), + $this->dbHandler->quoteIdentifier( $table ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', $table ), + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ) + ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationPriority.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationPriority.php new file mode 100644 index 0000000..8a619cd --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/LocationPriority.php @@ -0,0 +1,86 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + 'priority', + $this->getSortTableName( $number ) + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } + + /** + * Applies joins to the query, required to fetch sort data + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, SortClause $sortClause, $number ) + { + $table = $this->getSortTableName( $number ); + $query + ->leftJoin( + $query->alias( + $this->dbHandler->quoteTable( 'ezcontentobject_tree' ), + $this->dbHandler->quoteIdentifier( $table ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentobject_id', $table ), + $this->dbHandler->quoteColumn( 'id', 'ezcontentobject' ) + ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/SectionIdentifier.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/SectionIdentifier.php new file mode 100644 index 0000000..dcf2799 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/SectionIdentifier.php @@ -0,0 +1,60 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "section_id", + "ezcontentobject" + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/SectionName.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/SectionName.php new file mode 100644 index 0000000..4a70dd1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Gateway/SortClauseHandler/SectionName.php @@ -0,0 +1,85 @@ +select( + $query->alias( + $this->dbHandler->quoteColumn( + "name", + $this->getSortTableName( $number ) + ), + $column = $this->getSortColumnName( $number ) + ) + ); + + return $column; + } + + /** + * Applies joins to the query, required to fetch sort data + * + * @param \ezcQuerySelect $query + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause $sortClause + * @param int $number + * + * @return void + */ + public function applyJoin( ezcQuerySelect $query, SortClause $sortClause, $number ) + { + $table = $this->getSortTableName( $number ); + $query + ->leftJoin( + $query->alias( + $this->dbHandler->quoteTable( 'ezsection' ), + $this->dbHandler->quoteIdentifier( $table ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id', $table ), + $this->dbHandler->quoteColumn( 'section_id', 'ezcontentobject' ) + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Handler.php new file mode 100644 index 0000000..4871735 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Handler.php @@ -0,0 +1,176 @@ +gateway = $gateway; + $this->contentMapper = $contentMapper; + $this->fieldHandler = $fieldHandler; + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: array("languages" => array(,..)). + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array() ) + { + $start = microtime( true ); + + if ( count( $query->facetBuilders ) ) + { + throw new NotImplementedException( "Facettes are not supported by the legacy search engine." ); + } + + $data = $this->gateway->find( $query->criterion, $query->offset, $query->limit, $query->sortClauses, null ); + + $result = new SearchResult(); + $result->time = microtime( true ) - $start; + $result->totalCount = $data['count']; + + foreach ( $this->contentMapper->extractContentFromRows( $data['rows'] ) as $content ) + { + $this->fieldHandler->loadExternalFieldData( $content ); + $searchHit = new SearchHit(); + $searchHit->valueObject = $content; + + $result->searchHits[] = $searchHit; + } + + return $result; + } + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: array("languages" => array(,..)). + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Criterion $criterion, array $fieldFilters = array() ) + { + $query = new Query(); + $query->criterion = $criterion; + $query->offset = 0; + $query->limit = 1; + $result = $this->findContent( $query, $fieldFilters ); + + if ( !$result->totalCount ) + throw new NotFoundException( 'Content', "findSingle() found no content for given \$criterion" ); + else if ( $result->totalCount > 1 ) + throw new InvalidArgumentException( "totalCount", "findSingle() found more then one item for given \$criterion" ); + + $first = reset( $result->searchHits ); + return $first->valueObject; + } + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldpath + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ) + { + throw new NotImplementedException( "Suggestions are not supported by legacy search engine." ); + } + + /** + * Indexes a content object + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return void + */ + public function indexContent( Content $content ) + { + throw new \Exception( "Not implemented yet." ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor.php new file mode 100644 index 0000000..0bb29c1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor.php @@ -0,0 +1,106 @@ +ruleFiles = $ruleFiles; + $this->compiler = $compiler; + } + + /** + * Loads rules + * + * @return array + */ + abstract protected function getRules(); + + /** + * Transform the given string + * + * Transform the given string using the given rules. If no rules are + * specified, all available rules will be used for the transformation. + * + * @param string $string + * @param array $ruleNames + * + * @return string + */ + public function transform( $string, array $ruleNames = null ) + { + $rules = $this->getRules(); + + foreach ( $ruleNames ?: array_keys( $rules ) as $ruleName ) + { + if ( !isset( $rules[$ruleName] ) ) + { + // Just continue on unknown rules, or should we throw an error + // here? + continue; + } + + foreach ( $rules[$ruleName] as $rule ) + { + $string = preg_replace_callback( + $rule['regexp'], + $rule['callback'], + $string + ); + } + } + + return $string; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/DefinitionBased.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/DefinitionBased.php new file mode 100644 index 0000000..da21275 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/DefinitionBased.php @@ -0,0 +1,71 @@ +parser = $parser; + } + + /** + * Loads rules + * + * @return array + */ + protected function getRules() + { + if ( $this->compiledRules === null ) + { + $rules = array(); + foreach ( $this->ruleFiles as $file ) + { + $rules = array_merge( + $rules, + $this->parser->parse( $file ) + ); + } + + $this->compiledRules = $this->compiler->compile( $rules ); + } + + return $this->compiledRules; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/DefinitionBased/Parser.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/DefinitionBased/Parser.php new file mode 100644 index 0000000..5738b8e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/DefinitionBased/Parser.php @@ -0,0 +1,212 @@ +installDir = $installDir; + + $character = '(?:U\\+[0-9a-fA-F]{4}|remove|keep|[0-9a-fA-F]+|"(?:[^\\\\"]+|\\\\\\\\|\\\\\'|\\\\")*?")'; + + $this->tokenSpecifications = array( + TransformationProcessor::T_COMMENT => '(\\A#(?P.*)$)m', + TransformationProcessor::T_WHITESPACE => '(\\A\\s+)', + TransformationProcessor::T_SECTION => '(\\A(?P
      [a-z0-9_-]+):\s*$)m', + TransformationProcessor::T_MAP => '(\\A(?P' . $character . ')\\s*=\\s*(?P' . $character . '))', + TransformationProcessor::T_REPLACE => + '(\\A(?P' . $character . ')\\s*-\\s*' . + '(?P' . $character . ')\\s*=\\s*' . + '(?P' . $character . '))', + TransformationProcessor::T_TRANSPOSE => + '(\\A(?P' . $character . ')\\s*-\\s*' . + '(?P' . $character . ')\\s*' . + '(?P[+-])\\s*' . + '(?P' . $character . '))', + TransformationProcessor::T_TRANSPOSE_MODULO => + '(\\A(?P' . $character . ')\\s*-\\s*' . + '(?P' . $character . ')\\s*%\\s*' . + '(?P' . $character . ')\\s*' . + '(?P[+-])\\s*' . + '(?P' . $character . '))', + ); + } + + /** + * Parse the specified transformation file into an AST + * + * @param string $file + * + * @return array + */ + public function parse( $file ) + { + return $this->parseString( + file_get_contents( + $this->installDir . '/' . $file + ) + ); + } + + /** + * Parse the given string into an AST + * + * @param string $string + * + * @return array + */ + public function parseString( $string ) + { + $tokens = $this->tokenize( $string ); + + $tokens = array_filter( + $tokens, + function ( $token ) + { + return !( $token['type'] === TransformationProcessor::T_WHITESPACE || + $token['type'] === TransformationProcessor::T_COMMENT ); + } + ); + + $ast = array(); + $section = null; + while ( $token = array_shift( $tokens ) ) + { + if ( $token['type'] === TransformationProcessor::T_SECTION ) + { + $section = $token['data']['section']; + continue; + } + + if ( $section === null ) + { + throw new RuntimeException( "Expected section." ); + } + + $ast[$section][] = $token; + } + + return $ast; + } + + /** + * Tokenize transformation input file + * + * Returns an array of tokens + * + * @param string $string + * + * @return array + */ + protected function tokenize( $string ) + { + $string = preg_replace( '(\\r\\n|\\r)', "\n", $string ); + $tokens = array(); + $line = 1; + + while ( strlen( $string ) ) + { + foreach ( $this->tokenSpecifications as $token => $regexp ) + { + if ( !preg_match( $regexp, $string, $matches ) ) + { + continue; + } + + // Remove matched string + $string = substr( $string, strlen( $matches[0] ) ); + $line += substr_count( $matches[0], "\n" ); + + // Append token to list + $tokens[] = array( + 'type' => $token, + 'data' => $this->filterValues( $matches ), + ); + + // Continue with outer loop + continue 2; + } + + throw new RuntimeException( "Parse error in line $line: " . substr( $string, 0, 100 ) ); + } + + return $tokens; + } + + /** + * Filter out numeric array keys + * + * @param array $data + * + * @return array + */ + protected function filterValues( array $data ) + { + foreach ( $data as $key => $value ) + { + if ( is_int( $key ) ) + { + unset( $data[$key] ); + } + } + + return $data; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/PcreCompiler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/PcreCompiler.php new file mode 100644 index 0000000..9b6ba6a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/PcreCompiler.php @@ -0,0 +1,290 @@ +converter = $converter; + } + + /** + * Compile AST into a set of regular expressions + * + * The returned array contains a set of regular expressions and their + * replacement callbacks. The regular expressions can then be applied to + * strings to executed the transformations. + * + * @param array $ast + * + * @return array + */ + public function compile( array $ast ) + { + $transformations = array(); + + foreach ( $ast as $section => $rules ) + { + foreach ( $rules as $rule ) + { + $transformations[$section][] = $this->compileRule( $rule ); + } + } + + return $transformations; + } + + /** + * Compiles a single rule + * + * @param array $rule + * + * @return array + */ + protected function compileRule( array $rule ) + { + switch ( $rule['type'] ) + { + case TransformationProcessor::T_MAP: + return $this->compileMap( $rule ); + + case TransformationProcessor::T_REPLACE: + return $this->compileReplace( $rule ); + + case TransformationProcessor::T_TRANSPOSE: + return $this->compileTranspose( $rule ); + + case TransformationProcessor::T_TRANSPOSE_MODULO: + return $this->compileTransposeModulo( $rule ); + + default: + throw new RuntimeException( "Unknown rule type: " . $rule['type'] ); + } + } + + /** + * Compile map rule + * + * @param array $rule + * + * @return array + */ + protected function compileMap( array $rule ) + { + return array( + 'regexp' => '(' . preg_quote( $this->compileCharacter( $rule['data']['src'] ) ) . ')us', + 'callback' => $this->compileTargetCharacter( $rule['data']['dest'] ), + ); + } + + /** + * Compile replace rule + * + * @param array $rule + * + * @return array + */ + protected function compileReplace( array $rule ) + { + return array( + 'regexp' => + '([' . + preg_quote( $this->compileCharacter( $rule['data']['srcStart'] ) ) . '-' . + preg_quote( $this->compileCharacter( $rule['data']['srcEnd'] ) ) . + '])us', + 'callback' => $this->compileTargetCharacter( $rule['data']['dest'] ), + ); + } + + /** + * Compile transpose rule + * + * @param array $rule + * + * @return array + */ + protected function compileTranspose( array $rule ) + { + return array( + 'regexp' => + '([' . + preg_quote( $this->compileCharacter( $rule['data']['srcStart'] ) ) . '-' . + preg_quote( $this->compileCharacter( $rule['data']['srcEnd'] ) ) . + '])us', + 'callback' => $this->getTransposeClosure( $rule['data']['op'], $rule['data']['dest'] ), + ); + } + + /** + * Compile transpose modulo rule + * + * @param array $rule + * + * @return array + */ + protected function compileTransposeModulo( array $rule ) + { + return array( + 'regexp' => + '([' . + preg_quote( + $this->getModuloCharRange( + $this->compileCharacter( $rule['data']['srcStart'] ), + $this->compileCharacter( $rule['data']['srcEnd'] ), + $rule['data']['modulo'] + ) + ) . + '])us', + 'callback' => $this->getTransposeClosure( $rule['data']['op'], $rule['data']['dest'] ), + ); + } + + /** + * Get string with all characters defined by parameters + * + * Returns a string containing all UTF-8 characters starting with the + * specified $start character up to the $end character with the step size + * defined in $modulo. + * + * @param string $start + * @param string $end + * @param string $modulo + * + * @return string + */ + protected function getModuloCharRange( $start, $end, $modulo ) + { + $start = $this->converter->toUnicodeCodepoint( $start ); + $end = $this->converter->toUnicodeCodepoint( $end ); + $modulo = hexdec( $modulo ); + + $chars = ''; + for ( $start; $start <= $end; $start += $modulo ) + { + $chars .= $this->converter->toUTF8Character( $start ); + } + + return $chars; + } + + /** + * Returns a closure which modifies the provided character by the given + * value + * + * @param string $operator + * @param string $value + * + * @return callback + */ + protected function getTransposeClosure( $operator, $value ) + { + $value = hexdec( $value ) * ( $operator === '-' ? -1 : 1 ); + $converter = $this->converter; + return function ( $matches ) use ( $value, $converter ) + { + return $converter->toUTF8Character( + $converter->toUnicodeCodepoint( $matches[0] ) + $value + ); + }; + } + + /** + * Compile target into a closure, which can be used by + * preg_replace_callback + * + * @param string $char + * + * @return callback + */ + protected function compileTargetCharacter( $char ) + { + switch ( true ) + { + case ( $char === 'remove' ): + return function( $matches ) + { + return ''; + }; + + case ( $char === 'keep' ): + return function( $matches ) + { + return $matches[0]; + }; + + case preg_match( '("(?:[^\\\\"]+|\\\\\\\\|\\\\\'|\\\\")*?")', $char ); + $string = str_replace( + array( '\\\\', '\\"', "\\'" ), + array( '\\', '"', "'" ), + substr( $char, 1, -1 ) + ); + + return function( $matches ) use ( $string ) + { + return $string; + }; + + default: + $char = $this->compileCharacter( $char ); + return function( $matches ) use ( $char ) + { + return $char; + }; + } + } + + /** + * Compile a single source character definition into a plain UTF-8 character + * + * Handles the two formats from the possible character definitions: + * - U+xxxx : Unicode value in hexadecimal + * - xx: Ascii value in hexadecimal + * + * @param string $char + * + * @return string + */ + protected function compileCharacter( $char ) + { + switch ( true ) + { + case preg_match( '(^U\\+[0-9a-fA-F]{4}$)', $char ): + return $this->converter->toUTF8Character( hexdec( substr( $char, 2 ) ) ); + + case preg_match( '(^[0-9a-fA-F]{2}$)', $char ): + return chr( hexdec( $char ) ); + + default: + throw new RuntimeException( "Invalid character definition: $char" ); + } + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/PreprocessedBased.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/PreprocessedBased.php new file mode 100644 index 0000000..e6fafe3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/TransformationProcessor/PreprocessedBased.php @@ -0,0 +1,60 @@ +installDir = $installDir; + } + + /** + * Loads rules + * + * @return array + */ + protected function getRules() + { + if ( $this->compiledRules === null ) + { + $rules = array(); + + foreach ( $this->ruleFiles as $file ) + { + $rules += require $this->installDir . "/" . $file; + } + + $this->compiledRules = $this->compiler->compile( $rules ); + } + + return $this->compiledRules; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Search/Utf8Converter.php b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Utf8Converter.php new file mode 100644 index 0000000..f9f910f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Search/Utf8Converter.php @@ -0,0 +1,211 @@ +> 6 ) & 0x1f ) ) . + chr( 0x80 | ( $charCode & 0x3f ) ) + ); + break; + case !( $charCode & 0xffff0000 ): // 16 bit + $char = ( + chr( 0xe0 | ( ( $charCode >> 12 ) & 0x0f ) ) . + chr( 0x80 | ( ( $charCode >> 6 ) & 0x3f ) ) . + chr( 0x80 | ( $charCode & 0x3f ) ) + ); + break; + case !( $charCode & 0xffe00000 ): // 21 bit + $char = ( + chr( 0xf0 | ( ( $charCode >> 18 ) & 0x07 ) ) . + chr( 0x80 | ( ( $charCode >> 12 ) & 0x3f ) ) . + chr( 0x80 | ( ( $charCode >> 6 ) & 0x3f ) ) . + chr( 0x80 | ( $charCode & 0x3f ) ) + ); + break; + case !( $charCode & 0xfc000000 ): // 26 bit + $char = ( + chr( 0xf8 | ( ( $charCode >> 24 ) & 0x03 ) ) . + chr( 0x80 | ( ( $charCode >> 18 ) & 0x3f ) ) . + chr( 0x80 | ( ( $charCode >> 12 ) & 0x3f ) ) . + chr( 0x80 | ( ( $charCode >> 6 ) & 0x3f ) ) . + chr( 0x80 | ( $charCode & 0x3f ) ) + ); + break; + default: // 31 bit + $char = ( + chr( 0xfc | ( ( $charCode >> 30 ) & 0x01 ) ) . + chr( 0x80 | ( ( $charCode >> 24 ) & 0x3f ) ) . + chr( 0x80 | ( ( $charCode >> 18 ) & 0x3f ) ) . + chr( 0x80 | ( ( $charCode >> 12 ) & 0x3f ) ) . + chr( 0x80 | ( ( $charCode >> 6 ) & 0x3f ) ) . + chr( 0x80 | ( $charCode & 0x3f ) ) + ); + } + + return $char; + } + + /** + * Convert a single UTF-8 character into its decimal code point + * + * @param string $char + * + * @return int + */ + public static function toUnicodeCodepoint( $char ) + { + $charCode = false; + // 7bits, 1 char + if ( ( ord( $char[0] ) & 0x80 ) == 0x00 ) + { + $charCode = ord( $char[0] ); + } + // 11 bits, 2 chars + else if ( ( ord( $char[0] ) & 0xe0 ) == 0xc0 ) + { + if ( ( ord( $char[1] ) & 0xc0 ) != 0x80 ) + { + return $charCode; + } + + $charCode = ( + ( ( ord( $char[0] ) & 0x1f ) << 6 ) + + ( ( ord( $char[1] ) & 0x3f ) ) + ); + + if ( $charCode < 128 ) + { + throw new RuntimeException( 'Illegal UTF-8 input character: ' . $char ); + } + } + // 16 bits, 3 chars + else if ( ( ord( $char[0] ) & 0xf0 ) == 0xe0 ) + { + if ( ( ord( $char[1] ) & 0xc0 ) != 0x80 || + ( ord( $char[2] ) & 0xc0 ) != 0x80 ) + { + return $charCode; + } + $charCode = ( + ( ( ord( $char[0] ) & 0x0f ) << 12 ) + + ( ( ord( $char[1] ) & 0x3f ) << 6 ) + + ( ( ord( $char[2] ) & 0x3f ) ) + ); + + if ( $charCode < 2048 ) + { + throw new RuntimeException( 'Illegal UTF-8 input character: ' . $char ); + } + } + // 21 bits, 4 chars + else if ( ( ord( $char[0] ) & 0xf8 ) == 0xf0 ) + { + if ( ( ord( $char[1] ) & 0xc0 ) != 0x80 || + ( ord( $char[2] ) & 0xc0 ) != 0x80 || + ( ord( $char[3] ) & 0xc0 ) != 0x80 ) + { + return $charCode; + } + + $charCode = ( + ( ( ord( $char[0] ) & 0x07 ) << 18 ) + + ( ( ord( $char[1] ) & 0x3f ) << 12 ) + + ( ( ord( $char[2] ) & 0x3f ) << 6 ) + + ( ( ord( $char[3] ) & 0x3f ) ) + ); + + if ( $charCode < 65536 ) + { + throw new RuntimeException( 'Illegal UTF-8 input character: ' . $char ); + } + } + // 26 bits, 5 chars + else if ( ( ord( $char[0] ) & 0xfc ) == 0xf8 ) + { + if ( ( ord( $char[1] ) & 0xc0 ) != 0x80 || + ( ord( $char[2] ) & 0xc0 ) != 0x80 || + ( ord( $char[3] ) & 0xc0 ) != 0x80 || + ( ord( $char[4] ) & 0xc0 ) != 0x80 ) + { + return $charCode; + } + + $charCode = ( + ( ( ord( $char[0] ) & 0x03 ) << 24 ) + + ( ( ord( $char[1] ) & 0x3f ) << 18 ) + + ( ( ord( $char[2] ) & 0x3f ) << 12 ) + + ( ( ord( $char[3] ) & 0x3f ) << 6 ) + + ( ( ord( $char[4] ) & 0x3f ) ) + ); + + if ( $charCode < 2097152 ) + { + throw new RuntimeException( 'Illegal UTF-8 input character: ' . $char ); + } + } + // 31 bits, 6 chars + else if ( ( ord( $char[0] ) & 0xfe ) == 0xfc ) + { + if ( ( ord( $char[1] ) & 0xc0 ) != 0x80 || + ( ord( $char[2] ) & 0xc0 ) != 0x80 || + ( ord( $char[3] ) & 0xc0 ) != 0x80 || + ( ord( $char[4] ) & 0xc0 ) != 0x80 || + ( ord( $char[5] ) & 0xc0 ) != 0x80 ) + { + return $charCode; + } + + $charCode = ( + ( ( ord( $char[0] ) & 0x01 ) << 30 ) + + ( ( ord( $char[1] ) & 0x3f ) << 24 ) + + ( ( ord( $char[2] ) & 0x3f ) << 18 ) + + ( ( ord( $char[3] ) & 0x3f ) << 12 ) + + ( ( ord( $char[4] ) & 0x3f ) << 6 ) + + ( ( ord( $char[5] ) & 0x3f ) ) + ); + + if ( $charCode < 67108864 ) + { + throw new RuntimeException( 'Illegal UTF-8 input character: ' . $char ); + } + } + + return $charCode; + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Section/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/Section/Gateway.php new file mode 100644 index 0000000..cc156f7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Section/Gateway.php @@ -0,0 +1,90 @@ +innerGateway = $innerGateway; + } + + /** + * Inserts a new section with $name and $identifier + * + * @param string $name + * @param string $identifier + * + * @return int The ID of the new section + */ + public function insertSection( $name, $identifier ) + { + try + { + return $this->innerGateway->insertSection( $name, $identifier ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates section with $id to have $name and $identifier + * + * @param int $id + * @param string $name + * @param string $identifier + * + * @return void + */ + public function updateSection( $id, $name, $identifier ) + { + try + { + return $this->innerGateway->updateSection( $id, $name, $identifier ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for section with $id + * + * @param int $id + * + * @return string[][] + */ + public function loadSectionData( $id ) + { + try + { + return $this->innerGateway->loadSectionData( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for all sections + * + * @return string[][] + */ + public function loadAllSectionData() + { + try + { + return $this->innerGateway->loadAllSectionData(); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for section with $identifier + * + * @param string $identifier + * + * @return string[][] + */ + public function loadSectionDataByIdentifier( $identifier ) + { + try + { + return $this->innerGateway->loadSectionDataByIdentifier( $identifier ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Counts the number of content objects assigned to section with $id + * + * @param int $id + * + * @return int + */ + public function countContentObjectsInSection( $id ) + { + try + { + return $this->innerGateway->countContentObjectsInSection( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the Section with $id + * + * @param int $id + * + * @return void + */ + public function deleteSection( $id ) + { + try + { + return $this->innerGateway->deleteSection( $id ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts the assignment of $contentId to $sectionId + * + * @param int $sectionId + * @param int $contentId + * + * @return void + */ + public function assignSectionToContent( $sectionId, $contentId ) + { + try + { + return $this->innerGateway->assignSectionToContent( $sectionId, $contentId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Section/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Section/Gateway/EzcDatabase.php new file mode 100644 index 0000000..935bfc1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Section/Gateway/EzcDatabase.php @@ -0,0 +1,257 @@ +dbHandler = $dbHandler; + } + + /** + * Inserts a new section with $name and $identifier + * + * @param string $name + * @param string $identifier + * + * @return int The ID of the new section + */ + public function insertSection( $name, $identifier ) + { + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( 'ezsection' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezsection', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $query->bindValue( $name ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $identifier ) + ); + + $query->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezsection', 'id' ) + ); + } + + /** + * Updates section with $id to have $name and $identifier + * + * @param int $id + * @param string $name + * @param string $identifier + * + * @return void + */ + public function updateSection( $id, $name, $identifier ) + { + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezsection' ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $query->bindValue( $name ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $identifier ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Loads data for section with $id + * + * @param int $id + * + * @return string[][] + */ + public function loadSectionData( $id ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->quoteColumn( 'identifier' ), + $this->dbHandler->quoteColumn( 'name' ) + )->from( + $this->dbHandler->quoteTable( 'ezsection' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for all sections + * + * @return string[][] + */ + public function loadAllSectionData() + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->quoteColumn( 'identifier' ), + $this->dbHandler->quoteColumn( 'name' ) + )->from( + $this->dbHandler->quoteTable( 'ezsection' ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data for section with $identifier + * + * @param int $identifier + * + * @return string[][] + */ + public function loadSectionDataByIdentifier( $identifier ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->quoteColumn( 'identifier' ), + $this->dbHandler->quoteColumn( 'name' ) + )->from( + $this->dbHandler->quoteTable( 'ezsection' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'identifier' ), + $query->bindValue( $identifier, null, \PDO::PARAM_STR ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Counts the number of content objects assigned to section with $id + * + * @param int $id + * + * @return int + */ + public function countContentObjectsInSection( $id ) + { + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->alias( + $query->expr->count( + $this->dbHandler->quoteColumn( 'id' ) + ), + 'content_count' + ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'section_id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Deletes the Section with $id + * + * @param int $id + * + * @return void + */ + public function deleteSection( $id ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( 'ezsection' ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Inserts the assignment of $contentId to $sectionId + * + * @param int $sectionId + * @param int $contentId + * + * @return void + */ + public function assignSectionToContent( $sectionId, $contentId ) + { + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->set( + $this->dbHandler->quoteColumn( 'section_id' ), + $query->bindValue( $sectionId, null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ) + ); + + $query->prepare()->execute(); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Section/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Section/Handler.php new file mode 100644 index 0000000..c3d62ad --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Section/Handler.php @@ -0,0 +1,210 @@ +sectionGateway = $sectionGateway; + } + + /** + * Create a new section + * + * @param string $name + * @param string $identifier + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function create( $name, $identifier ) + { + $section = new Section(); + + $section->name = $name; + $section->identifier = $identifier; + + $section->id = $this->sectionGateway->insertSection( $name, $identifier ); + + return $section; + } + + /** + * Update name and identifier of a section + * + * @param mixed $id + * @param string $name + * @param string $identifier + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function update( $id, $name, $identifier ) + { + $this->sectionGateway->updateSection( $id, $name, $identifier ); + + $section = new Section(); + $section->id = $id; + $section->name = $name; + $section->identifier = $identifier; + + return $section; + } + + /** + * Get section data + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If section is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function load( $id ) + { + $rows = $this->sectionGateway->loadSectionData( $id ); + + if ( empty( $rows ) ) + { + throw new NotFound( "Section", $id ); + } + return $this->createSectionFromArray( reset( $rows ) ); + } + + /** + * Get all section data + * + * @return \eZ\Publish\SPI\Persistence\Content\Section[] + */ + public function loadAll() + { + $rows = $this->sectionGateway->loadAllSectionData(); + return $this->createSectionsFromArray( $rows ); + } + + /** + * Get section data by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If section is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function loadByIdentifier( $identifier ) + { + $rows = $this->sectionGateway->loadSectionDataByIdentifier( $identifier ); + + if ( empty( $rows ) ) + { + throw new NotFound( "Section", $identifier ); + } + return $this->createSectionFromArray( reset( $rows ) ); + } + + /** + * Creates a Section from the given $data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + protected function createSectionFromArray( array $data ) + { + $section = new Section(); + + $section->id = (int)$data['id']; + $section->name = $data['name']; + $section->identifier = $data['identifier']; + + return $section; + } + + /** + * Creates a Section from the given $data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\Content\Section[] + */ + protected function createSectionsFromArray( array $data ) + { + $sections = array(); + foreach ( $data as $sectionData ) + { + $sections[] = $this->createSectionFromArray( $sectionData ); + } + return $sections; + } + + /** + * Delete a section + * + * Might throw an exception if the section is still associated with some + * content objects. Make sure that no content objects are associated with + * the section any more *before* calling this method. + * + * @param mixed $id + */ + public function delete( $id ) + { + $contentCount = $this->sectionGateway->countContentObjectsInSection( $id ); + + if ( $contentCount > 0 ) + { + throw new RuntimeException( + "Section with ID '{$id}' still has content assigned." + ); + } + $this->sectionGateway->deleteSection( $id ); + } + + /** + * Assigns section to single content object + * + * @param mixed $sectionId + * @param mixed $contentId + */ + public function assign( $sectionId, $contentId ) + { + $this->sectionGateway->assignSectionToContent( $sectionId, $contentId ); + } + + /** + * Number of content assignments a Section has + * + * @param mixed $sectionId + * + * @return int + */ + public function assignmentsCount( $sectionId ) + { + return $this->sectionGateway->countContentObjectsInSection( $sectionId ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/StorageFieldDefinition.php b/eZ/Publish/Core/Persistence/Legacy/Content/StorageFieldDefinition.php new file mode 100644 index 0000000..3acfa1e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/StorageFieldDefinition.php @@ -0,0 +1,113 @@ +storageRegistry = $storageRegistry; + $this->context = $context; + } + + /** + * Stores data from $field in its corresponding external storage + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field ) + { + return $this->storageRegistry->getStorage( $field->type )->storeFieldData( $versionInfo, $field, $this->context ); + } + + /** + * Fetches external data for $field from its corresponding external storage + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param Field $field + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field ) + { + $storage = $this->storageRegistry->getStorage( $field->type ); + if ( $storage->hasFieldData() ) + { + $storage->getFieldData( $versionInfo, $field, $this->context ); + } + } + + /** + * Deletes data for field $ids from external storage of $fieldType + * + * @param string $fieldType + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param mixed[] $ids + * + * @return void + */ + public function deleteFieldData( $fieldType, VersionInfo $versionInfo, array $ids ) + { + $this->storageRegistry->getStorage( $fieldType ) + ->deleteFieldData( $versionInfo, $ids, $this->context ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/StorageRegistry.php b/eZ/Publish/Core/Persistence/Legacy/Content/StorageRegistry.php new file mode 100644 index 0000000..4788025 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/StorageRegistry.php @@ -0,0 +1,87 @@ + $storage ) + { + $this->register( $typeName, $storage ); + } + } + + /** + * Register $storage for $typeName + * + * @param string $typeName + * @param mixed $storage Callable or FieldStorage + * + * @return void + */ + public function register( $typeName, $storage ) + { + $this->storageMap[$typeName] = $storage; + } + + /** + * Returns the storage for $typeName + * + * @param string $typeName + * + * @throws \RuntimeException When type is neither FieldStorage instance or callable factory + * + * @return \eZ\Publish\SPI\FieldType\FieldStorage + */ + public function getStorage( $typeName ) + { + if ( !isset( $this->storageMap[$typeName] ) ) + { + $this->storageMap[$typeName] = new NullStorage; + } + else if ( !$this->storageMap[$typeName] instanceof FieldStorage ) + { + if ( !is_callable( $this->storageMap[$typeName] ) ) + { + throw new \RuntimeException( "FieldStorage '$typeName' is neither callable or instance" ); + } + + $factory = $this->storageMap[$typeName]; + $this->storageMap[$typeName] = call_user_func( $factory ); + } + return $this->storageMap[$typeName]; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater.php new file mode 100644 index 0000000..6e21c4f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater.php @@ -0,0 +1,178 @@ +searchHandler = $searchHandler; + $this->contentGateway = $contentGateway; + $this->converterRegistry = $converterRegistry; + $this->storageHandler = $storageHandler; + } + + /** + * Determines the necessary update actions + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $fromType + * @param \eZ\Publish\SPI\Persistence\Content\Type $toType + * + * @return ContentUpdater\Action[] + */ + public function determineActions( Type $fromType, Type $toType ) + { + $actions = array(); + foreach ( $fromType->fieldDefinitions as $fieldDef ) + { + if ( !$this->hasFieldDefinition( $toType, $fieldDef ) ) + { + $actions[] = new ContentUpdater\Action\RemoveField( + $this->contentGateway, + $fieldDef, + $this->storageHandler + ); + } + } + foreach ( $toType->fieldDefinitions as $fieldDef ) + { + if ( !$this->hasFieldDefinition( $fromType, $fieldDef ) ) + { + $actions[] = new ContentUpdater\Action\AddField( + $this->contentGateway, + $fieldDef, + $this->converterRegistry->getConverter( + $fieldDef->fieldType + ), + $this->storageHandler + ); + } + } + return $actions; + } + + /** + * hasFieldDefinition + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $type + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * + * @return boolean + */ + protected function hasFieldDefinition( Type $type, FieldDefinition $fieldDef ) + { + foreach ( $type->fieldDefinitions as $existFieldDef ) + { + if ( $existFieldDef->id == $fieldDef->id ) + { + return true; + } + } + return false; + } + + /** + * Applies all given updates + * + * @param mixed $contentTypeId + * @param ContentUpdater\Action[] $actions + * + * @return void + */ + public function applyUpdates( $contentTypeId, array $actions ) + { + foreach ( $this->loadContentObjects( $contentTypeId ) as $content ) + { + foreach ( $actions as $action ) + { + $action->apply( $content ); + } + } + } + + /** + * Returns all content objects of $contentTypeId + * + * @param mixed $contentTypeId + * + * @return Content[] + */ + protected function loadContentObjects( $contentTypeId ) + { + $result = $this->searchHandler->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentTypeId( $contentTypeId ) + ) + ) + ); + + $content = array(); + foreach ( $result->searchHits as $hit ) + { + $content[] = $hit->valueObject; + } + + return $content; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action.php new file mode 100644 index 0000000..a5989c7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action.php @@ -0,0 +1,45 @@ +contentGateway = $contentGateway; + } + + /** + * Applies the action to the given $content + * + * @param Content $content + * + * @return void + */ + abstract public function apply( Content $content ); +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action/AddField.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action/AddField.php new file mode 100644 index 0000000..e85eff2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action/AddField.php @@ -0,0 +1,139 @@ +contentGateway = $contentGateway; + $this->fieldDefinition = $fieldDef; + $this->fieldValueConverter = $converter; + $this->storageHandler = $storageHandler; + } + + /** + * Applies the action to the given $content + * + * @param Content $content + * + * @todo Handle external field data + * + * @return void + */ + public function apply( Content $content ) + { + $field = $this->createField( $content ); + + $storageValue = new StorageFieldValue(); + $this->fieldValueConverter->toStorageValue( + $field->value, + $storageValue + ); + + $field->id = $this->contentGateway->insertNewField( + $content, + $field, + $storageValue + ); + + // If the storage handler returns true, it means that $field value has been modified + // So we need to update it in order to store those modifications + // Field converter is called once again via the Mapper + if ( $this->storageHandler->storeFieldData( $content->versionInfo, $field ) === true ) + { + $storageValue = new StorageFieldValue(); + $this->fieldValueConverter->toStorageValue( + $field->value, + $storageValue + ); + + if ( $this->fieldDefinition->isTranslatable ) + { + $this->contentGateway->updateField( + $field, + $storageValue + ); + } + else + { + $this->contentGateway->updateNonTranslatableField( + $field, + $storageValue, + $content->contentInfo->id + ); + } + } + + $content->fields[] = $field; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return \eZ\Publish\SPI\Persistence\Content\Field + * + * @todo Handle ->languageCode + */ + protected function createField( Content $content ) + { + $field = new Content\Field(); + $field->fieldDefinitionId = $this->fieldDefinition->id; + $field->type = $this->fieldDefinition->fieldType; + $field->value = clone $this->fieldDefinition->defaultValue; + $field->versionNo = $content->versionInfo->versionNo; + //$field->languageCode = $content->initialLanguageId; + return $field; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action/RemoveField.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action/RemoveField.php new file mode 100644 index 0000000..2715172 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/ContentUpdater/Action/RemoveField.php @@ -0,0 +1,81 @@ +contentGateway = $contentGateway; + $this->fieldDefinition = $fieldDef; + $this->storageHandler = $storageHandler; + } + + /** + * Applies the action to the given $content + * + * @param Content $content + * + * @return void + */ + public function apply( Content $content ) + { + $fieldIdsToRemoveMap = array(); + + foreach ( $content->fields as $field ) + { + if ( $field->fieldDefinitionId == $this->fieldDefinition->id ) + { + $this->contentGateway->deleteField( + $field->id, $field->versionNo + ); + $fieldIdsToRemoveMap[$field->type][] = $field->id; + } + } + + foreach ( $fieldIdsToRemoveMap as $fieldType => $ids ) + { + $this->storageHandler->deleteFieldData( $fieldType, $content->versionInfo, $ids ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway.php new file mode 100644 index 0000000..27d126e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway.php @@ -0,0 +1,293 @@ +array(string=>mixed)) Data rows. + */ + abstract public function loadTypeDataByIdentifier( $identifier, $status ); + + /** + * Loads an array with data about the type referred to by $remoteId in + * $status. + * + * @param mixed $remoteId + * @param int $status + * + * @return array(int=>array(string=>mixed)) Data rows. + */ + abstract public function loadTypeDataByRemoteId( $remoteId, $status ); + + /** + * Counts the number of instances that exists of the identified type. + * + * @param int $typeId + * + * @return int + */ + abstract public function countInstancesOfType( $typeId ); + + /** + * Deletes a Type completely. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + abstract public function delete( $typeId, $status ); + + /** + * Deletes all field definitions of a Type. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + abstract public function deleteFieldDefinitionsForType( $typeId, $status ); + + /** + * Deletes a the Type. + * + * Does no delete the field definitions! + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + abstract public function deleteType( $typeId, $status ); + + /** + * Deletes all group assignments for a Type. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + abstract public function deleteGroupAssignmentsForType( $typeId, $status ); + + /** + * Publishes the Type with $typeId from $sourceVersion to $targetVersion, + * including its fields + * + * @param int $typeId + * @param int $sourceStatus + * @param int $targetStatus + * + * @return void + */ + abstract public function publishTypeAndFields( $typeId, $sourceStatus, $targetStatus ); +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway/ExceptionConversion.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway/ExceptionConversion.php new file mode 100644 index 0000000..63a6b47 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway/ExceptionConversion.php @@ -0,0 +1,675 @@ +innerGateway = $innerGateway; + } + + /** + * Inserts the given $group. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group $group + * + * @return mixed Group ID + */ + public function insertGroup( Group $group ) + { + try + { + return $this->innerGateway->insertGroup( $group ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates a group with data in $group. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct $group + * + * @return void + */ + public function updateGroup( GroupUpdateStruct $group ) + { + try + { + return $this->innerGateway->updateGroup( $group ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns the number of types in a certain group. + * + * @param int $groupId + * + * @return int + */ + public function countTypesInGroup( $groupId ) + { + try + { + return $this->innerGateway->countTypesInGroup( $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns the number of Groups the type is assigned to. + * + * @param int $typeId + * @param int $status + * + * @return int + */ + public function countGroupsForType( $typeId, $status ) + { + try + { + return $this->innerGateway->countGroupsForType( $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the Group with the given $groupId. + * + * @param int $groupId + * + * @return void + */ + public function deleteGroup( $groupId ) + { + try + { + return $this->innerGateway->deleteGroup( $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns an array with data about the Group with $groupId. + * + * @param int $groupId + * + * @return array + */ + public function loadGroupData( $groupId ) + { + try + { + return $this->innerGateway->loadGroupData( $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns an array with data about the Group with $identifier. + * + * @param int $identifier + * + * @return array + */ + public function loadGroupDataByIdentifier( $identifier ) + { + try + { + return $this->innerGateway->loadGroupDataByIdentifier( $identifier ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns an array with data about all Group objects. + * + * @return array + */ + public function loadAllGroupsData() + { + try + { + return $this->innerGateway->loadAllGroupsData(); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads data for all Types in $status in $groupId. + * + * @param mixed $groupId + * @param int $status + * + * @return string[][] + */ + public function loadTypesDataForGroup( $groupId, $status ) + { + try + { + return $this->innerGateway->loadTypesDataForGroup( $groupId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a new content type. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $type + * @param mixed|null $typeId + * + * @return mixed Type ID + */ + public function insertType( Type $type, $typeId = null ) + { + try + { + return $this->innerGateway->insertType( $type, $typeId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Insert assignment of $typeId to $groupId. + * + * @param mixed $typeId + * @param int $status + * @param mixed $groupId + * + * @return void + */ + public function insertGroupAssignment( $typeId, $status, $groupId ) + { + try + { + return $this->innerGateway->insertGroupAssignment( $typeId, $status, $groupId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes a group assignments for a Type. + * + * @param mixed $groupId + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteGroupAssignment( $groupId, $typeId, $status ) + { + try + { + return $this->innerGateway->deleteGroupAssignment( $groupId, $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads an array with data about field definition referred $id and $status. + * + * @param mixed $id field definition id + * @param int $status field definition status + * + * @return array Data rows. + */ + public function loadFieldDefinition( $id, $status ) + { + try + { + return $this->innerGateway->loadFieldDefinition( $id, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts a $fieldDefinition for $typeId. + * + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * + * @return mixed Field definition ID + */ + public function insertFieldDefinition( + $typeId, $status, FieldDefinition $fieldDefinition, + StorageFieldDefinition $storageFieldDef + ) + { + try + { + return $this->innerGateway->insertFieldDefinition( $typeId, $status, $fieldDefinition, $storageFieldDef ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes a field definition. + * + * @param mixed $typeId + * @param int $status + * @param mixed $fieldDefinitionId + * + * @return void + */ + public function deleteFieldDefinition( $typeId, $status, $fieldDefinitionId ) + { + try + { + return $this->innerGateway->deleteFieldDefinition( $typeId, $status, $fieldDefinitionId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates a $fieldDefinition for $typeId. + * + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * + * @return void + */ + public function updateFieldDefinition( + $typeId, $status, FieldDefinition $fieldDefinition, + StorageFieldDefinition $storageFieldDef + ) + { + try + { + return $this->innerGateway->updateFieldDefinition( $typeId, $status, $fieldDefinition, $storageFieldDef ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Update a type with $updateStruct. + * + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct $updateStruct + * + * @return void + */ + public function updateType( $typeId, $status, UpdateStruct $updateStruct ) + { + try + { + return $this->innerGateway->updateType( $typeId, $status, $updateStruct ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads an array with data about $typeId in $status. + * + * @param mixed $typeId + * @param int $status + * + * @return array Data rows. + */ + public function loadTypeData( $typeId, $status ) + { + try + { + return $this->innerGateway->loadTypeData( $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads an array with data about the type referred to by $identifier in + * $status. + * + * @param string $identifier + * @param int $status + * + * @return array(int=>array(string=>mixed)) Data rows. + */ + public function loadTypeDataByIdentifier( $identifier, $status ) + { + try + { + return $this->innerGateway->loadTypeDataByIdentifier( $identifier, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads an array with data about the type referred to by $remoteId in + * $status. + * + * @param mixed $remoteId + * @param int $status + * + * @return array(int=>array(string=>mixed)) Data rows. + */ + public function loadTypeDataByRemoteId( $remoteId, $status ) + { + try + { + return $this->innerGateway->loadTypeDataByRemoteId( $remoteId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Counts the number of instances that exists of the identified type. + * + * @param int $typeId + * + * @return int + */ + public function countInstancesOfType( $typeId ) + { + try + { + return $this->innerGateway->countInstancesOfType( $typeId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes a Type completely. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function delete( $typeId, $status ) + { + try + { + return $this->innerGateway->delete( $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes all field definitions of a Type. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteFieldDefinitionsForType( $typeId, $status ) + { + try + { + return $this->innerGateway->deleteFieldDefinitionsForType( $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes a the Type. + * + * Does no delete the field definitions! + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteType( $typeId, $status ) + { + try + { + return $this->innerGateway->deleteType( $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes all group assignments for a Type. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteGroupAssignmentsForType( $typeId, $status ) + { + try + { + return $this->innerGateway->deleteGroupAssignmentsForType( $typeId, $status ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Publishes the Type with $typeId from $sourceVersion to $targetVersion, + * including its fields + * + * @param int $typeId + * @param int $sourceStatus + * @param int $targetStatus + * + * @return void + */ + public function publishTypeAndFields( $typeId, $sourceStatus, $targetStatus ) + { + try + { + return $this->innerGateway->publishTypeAndFields( $typeId, $sourceStatus, $targetStatus ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway/EzcDatabase.php new file mode 100644 index 0000000..8b5899f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Gateway/EzcDatabase.php @@ -0,0 +1,1319 @@ + array( + 'id', + 'always_available', + 'contentobject_name', + 'created', + 'creator_id', + 'modified', + 'modifier_id', + 'identifier', + 'initial_language_id', + 'is_container', + 'language_mask', + 'remote_id', + 'serialized_description_list', + 'serialized_name_list', + 'sort_field', + 'sort_order', + 'url_alias_name', + 'version', + ), + 'ezcontentclass_attribute' => array( + 'id', + 'can_translate', + 'category', + 'contentclass_id', + 'data_float1', + 'data_float2', + 'data_float3', + 'data_float4', + 'data_int1', + 'data_int2', + 'data_int3', + 'data_int4', + 'data_text1', + 'data_text2', + 'data_text3', + 'data_text4', + 'data_text5', + 'data_type_string', + 'identifier', + 'is_information_collector', + 'is_required', + 'is_searchable', + 'placement', + 'serialized_data_text', + 'serialized_description_list', + 'serialized_name_list', + ), + ); + + /** + * Zeta Components database handler. + * + * @var \ezcDbHandler + */ + protected $dbHandler; + + /** + * Language mask generator + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator + */ + protected $languageMaskGenerator; + + /** + * Creates a new gateway based on $db + * + * @param \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler $db + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator $languageMaskGenerator + */ + public function __construct( EzcDbHandler $db, MaskGenerator $languageMaskGenerator ) + { + $this->dbHandler = $db; + $this->languageMaskGenerator = $languageMaskGenerator; + } + + /** + * Inserts the given $group. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group $group + * + * @return mixed Group ID + */ + public function insertGroup( Group $group ) + { + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( + $this->dbHandler->quoteTable( 'ezcontentclassgroup' ) + )->set( + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->getAutoIncrementValue( 'ezcontentclassgroup', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'created' ), + $q->bindValue( $group->created, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'creator_id' ), + $q->bindValue( $group->creatorId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( $group->modified, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modifier_id' ), + $q->bindValue( $group->modifierId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $q->bindValue( $group->identifier ) + ); + $q->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentclassgroup', 'id' ) + ); + } + + /** + * Updates a group with data in $group. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct $group + * + * @return void + */ + public function updateGroup( GroupUpdateStruct $group ) + { + $q = $this->dbHandler->createUpdateQuery(); + $q->update( + $this->dbHandler->quoteColumn( 'ezcontentclassgroup' ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( $group->modified, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modifier_id' ), + $q->bindValue( $group->modifierId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'name' ), + $q->bindValue( $group->identifier ) + )->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $group->id, null, \PDO::PARAM_INT ) + ) + ); + + $q->prepare()->execute(); + } + + /** + * Returns the number of types in a certain group. + * + * @param int $groupId + * + * @return int + */ + public function countTypesInGroup( $groupId ) + { + $q = $this->dbHandler->createSelectQuery(); + $q->select( + $q->alias( + $q->expr->count( + $this->dbHandler->quoteColumn( 'contentclass_id' ) + ), + 'count' + ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'group_id' ), + $q->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + + $stmt = $q->prepare(); + $stmt->execute(); + + return (int)$stmt->fetchColumn(); + } + + /** + * Returns the number of Groups the type is assigned to. + * + * @param int $typeId + * @param int $status + * + * @return int + */ + public function countGroupsForType( $typeId, $status ) + { + $q = $this->dbHandler->createSelectQuery(); + $q->select( + $q->alias( + $q->expr->count( + $this->dbHandler->quoteColumn( 'group_id' ) + ), + 'count' + ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ) + ), + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + + $stmt = $q->prepare(); + $stmt->execute(); + + return (int)$stmt->fetchColumn(); + } + + /** + * Deletes the Group with the given $groupId. + * + * @param int $groupId + * + * @return void + */ + public function deleteGroup( $groupId ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( $this->dbHandler->quoteTable( 'ezcontentclassgroup' ) ) + ->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Inserts data into contentclass_name. + * + * @param int $typeId + * @param int $typeStatus + * @param string[] $languages + * + * @return void + */ + protected function insertTypeNameData( $typeId, $typeStatus, array $languages ) + { + $tmpLanguages = $languages; + if ( isset( $tmpLanguages['always-available'] ) ) + { + unset( $tmpLanguages['always-available'] ); + } + + foreach ( $tmpLanguages as $language => $name ) + { + $query = $this->dbHandler->createInsertQuery(); + $query + ->insertInto( $this->dbHandler->quoteTable( 'ezcontentclass_name' ) ) + ->set( 'contentclass_id', $query->bindValue( $typeId, null, \PDO::PARAM_INT ) ) + ->set( 'contentclass_version', $query->bindValue( $typeStatus, null, \PDO::PARAM_INT ) ) + ->set( + 'language_id', + $query->bindValue( + $this->languageMaskGenerator->generateLanguageIndicator( + $language, + $this->languageMaskGenerator->isLanguageAlwaysAvailable( + $language, + $languages + ) + ), null, \PDO::PARAM_INT + ) + ) + ->set( 'language_locale', $query->bindValue( $language ) ) + ->set( 'name', $query->bindValue( $name ) ); + $query->prepare()->execute(); + } + } + + /** + * Inserts a new content type. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $type + * @param mixed|null $typeId + * + * @return mixed Type ID + */ + public function insertType( Type $type, $typeId = null ) + { + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( $this->dbHandler->quoteTable( 'ezcontentclass' ) ); + $q->set( + $this->dbHandler->quoteColumn( 'id' ), + isset( $typeId ) ? + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) : + $this->dbHandler->getAutoIncrementValue( 'ezcontentclass', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $type->status, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'created' ), + $q->bindValue( $type->created, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'creator_id' ), + $q->bindValue( $type->creatorId, null, \PDO::PARAM_INT ) + ); + $this->setCommonTypeColumns( $q, $type ); + + $q->prepare()->execute(); + + if ( empty( $typeId ) ) + { + $typeId = $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentclass', 'id' ) + ); + } + + $this->insertTypeNameData( $typeId, $type->status, $type->name ); + + return $typeId; + } + + /** + * Set common columns for insert/update of a Type. + * + * @param \ezcQuery $q + * @param mixed $type + * + * @return void + */ + protected function setCommonTypeColumns( ezcQuery $q, $type ) + { + $q->set( + $this->dbHandler->quoteColumn( 'serialized_name_list' ), + $q->bindValue( serialize( $type->name ) ) + )->set( + $this->dbHandler->quoteColumn( 'serialized_description_list' ), + $q->bindValue( serialize( $type->description ) ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $q->bindValue( $type->identifier ) + )->set( + $this->dbHandler->quoteColumn( 'modified' ), + $q->bindValue( $type->modified, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'modifier_id' ), + $q->bindValue( $type->modifierId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'remote_id' ), + $q->bindValue( $type->remoteId ) + )->set( + $this->dbHandler->quoteColumn( 'url_alias_name' ), + $q->bindValue( $type->urlAliasSchema ) + )->set( + $this->dbHandler->quoteColumn( 'contentobject_name' ), + $q->bindValue( $type->nameSchema ) + )->set( + $this->dbHandler->quoteColumn( 'is_container' ), + $q->bindValue( $type->isContainer ? 1 : 0, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'language_mask' ), + $q->bindValue( + $this->languageMaskGenerator->generateLanguageMask( $type->name ), + null, + \PDO::PARAM_INT + ) + )->set( + $this->dbHandler->quoteColumn( 'initial_language_id' ), + $q->bindValue( $type->initialLanguageId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'sort_field' ), + $q->bindValue( $type->sortField, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'sort_order' ), + $q->bindValue( $type->sortOrder, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'always_available' ), + $q->bindValue( (int)$type->defaultAlwaysAvailable, null, \PDO::PARAM_INT ) + ); + } + + /** + * Insert assignment of $typeId to $groupId. + * + * @param mixed $groupId + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function insertGroupAssignment( $groupId, $typeId, $status ) + { + $groups = $this->loadGroupData( $groupId ); + $group = $groups[0]; + + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->set( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'group_id' ), + $q->bindValue( $groupId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'group_name' ), + $q->bindValue( $group['name'] ) + ); + + $q->prepare()->execute(); + } + + /** + * Deletes a group assignments for a Type. + * + * @param mixed $groupId + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteGroupAssignment( $groupId, $typeId, $status ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'group_id' ), + $q->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Loads data about Group with $groupId. + * + * @param mixed $groupId + * + * @return string[][] + */ + public function loadGroupData( $groupId ) + { + $q = $this->createGroupLoadQuery(); + $q->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads data about Group with $identifier. + * + * @param mixed $identifier + * + * @return string[][] + */ + public function loadGroupDataByIdentifier( $identifier ) + { + $q = $this->createGroupLoadQuery(); + $q->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'name' ), + $q->bindValue( $identifier, null, \PDO::PARAM_STR ) + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns an array with data about all Group objects. + * + * @return string[][] + */ + public function loadAllGroupsData() + { + $q = $this->createGroupLoadQuery(); + + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Creates the basic query to load Group data. + * + * @return ezcQuerySelect + */ + protected function createGroupLoadQuery() + { + $q = $this->dbHandler->createSelectQuery(); + $q->select( + $this->dbHandler->quoteColumn( 'created' ), + $this->dbHandler->quoteColumn( 'creator_id' ), + $this->dbHandler->quoteColumn( 'id' ), + $this->dbHandler->quoteColumn( 'modified' ), + $this->dbHandler->quoteColumn( 'modifier_id' ), + $this->dbHandler->quoteColumn( 'name' ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentclassgroup' ) + ); + return $q; + } + + /** + * Loads data for all Types in $status in $groupId. + * + * @param mixed $groupId + * @param int $status + * + * @return string[][] + */ + public function loadTypesDataForGroup( $groupId, $status ) + { + $q = $this->getLoadTypeQuery(); + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( + 'group_id', + 'ezcontentclass_classgroup' + ), + $q->bindValue( $groupId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( + 'version', + 'ezcontentclass' + ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Inserts a $fieldDefinition for $typeId. + * + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * + * @return mixed Field definition ID + */ + public function insertFieldDefinition( + $typeId, + $status, + FieldDefinition $fieldDefinition, + StorageFieldDefinition $storageFieldDef + ) + { + $q = $this->dbHandler->createInsertQuery(); + $q->insertInto( $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ) ); + $q->set( + $this->dbHandler->quoteColumn( 'id' ), + isset( $fieldDefinition->id ) ? + $q->bindValue( $fieldDefinition->id, null, \PDO::PARAM_INT ) : + $this->dbHandler->getAutoIncrementValue( 'ezcontentclass_attribute', 'id' ) + )->set( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ); + $this->setCommonFieldColumns( $q, $fieldDefinition, $storageFieldDef ); + + $q->prepare()->execute(); + + if ( !isset( $fieldDefinition->id ) ) + { + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( 'ezcontentclass_attribute', 'id' ) + ); + } + + return $fieldDefinition->id; + } + + /** + * Set common columns for insert/update of FieldDefinition. + * + * @param \ezcQuery $q + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * + * @return void + */ + protected function setCommonFieldColumns( + ezcQuery $q, FieldDefinition $fieldDefinition, + StorageFieldDefinition $storageFieldDef + ) + { + $q->set( + $this->dbHandler->quoteColumn( 'serialized_name_list' ), + $q->bindValue( serialize( $fieldDefinition->name ) ) + )->set( + $this->dbHandler->quoteColumn( 'serialized_description_list' ), + $q->bindValue( serialize( $fieldDefinition->description ) ) + )->set( + $this->dbHandler->quoteColumn( 'identifier' ), + $q->bindValue( $fieldDefinition->identifier ) + )->set( + $this->dbHandler->quoteColumn( 'category' ), + $q->bindValue( $fieldDefinition->fieldGroup, null, \PDO::PARAM_STR ) + )->set( + $this->dbHandler->quoteColumn( 'placement' ), + $q->bindValue( $fieldDefinition->position, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_type_string' ), + $q->bindValue( $fieldDefinition->fieldType ) + )->set( + $this->dbHandler->quoteColumn( 'can_translate' ), + $q->bindValue( ( $fieldDefinition->isTranslatable ? 1 : 0 ), null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'is_required' ), + $q->bindValue( ( $fieldDefinition->isRequired ? 1 : 0 ), null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'is_information_collector' ), + $q->bindValue( ( $fieldDefinition->isInfoCollector ? 1 : 0 ), null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_float1' ), + $q->bindValue( $storageFieldDef->dataFloat1 ) + )->set( + $this->dbHandler->quoteColumn( 'data_float2' ), + $q->bindValue( $storageFieldDef->dataFloat2 ) + )->set( + $this->dbHandler->quoteColumn( 'data_float3' ), + $q->bindValue( $storageFieldDef->dataFloat3 ) + )->set( + $this->dbHandler->quoteColumn( 'data_float4' ), + $q->bindValue( $storageFieldDef->dataFloat4 ) + )->set( + $this->dbHandler->quoteColumn( 'data_int1' ), + $q->bindValue( $storageFieldDef->dataInt1, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_int2' ), + $q->bindValue( $storageFieldDef->dataInt2, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_int3' ), + $q->bindValue( $storageFieldDef->dataInt3, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_int4' ), + $q->bindValue( $storageFieldDef->dataInt4, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( 'data_text1' ), + $q->bindValue( $storageFieldDef->dataText1 ) + )->set( + $this->dbHandler->quoteColumn( 'data_text2' ), + $q->bindValue( $storageFieldDef->dataText2 ) + )->set( + $this->dbHandler->quoteColumn( 'data_text3' ), + $q->bindValue( $storageFieldDef->dataText3 ) + )->set( + $this->dbHandler->quoteColumn( 'data_text4' ), + $q->bindValue( $storageFieldDef->dataText4 ) + )->set( + $this->dbHandler->quoteColumn( 'data_text5' ), + $q->bindValue( $storageFieldDef->dataText5 ) + )->set( + $this->dbHandler->quoteColumn( 'serialized_data_text' ), + $q->bindValue( serialize( $storageFieldDef->serializedDataText ) ) + )->set( + $this->dbHandler->quoteColumn( 'is_searchable' ), + $q->bindValue( ( $fieldDefinition->isSearchable ? 1 : 0 ), null, \PDO::PARAM_INT ) + ); + } + + /** + * Loads an array with data about field definition referred $id and $status. + * + * @param mixed $id field definition id + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return array Data rows. + */ + public function loadFieldDefinition( $id, $status ) + { + $q = $this->dbHandler->createSelectQuery(); + $this->selectColumns( $q, "ezcontentclass_attribute" ); + $q->from( + $this->dbHandler->quoteTable( "ezcontentclass_attribute" ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( "id", "ezcontentclass_attribute" ), + $q->bindValue( $id, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( "version", "ezcontentclass_attribute" ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetch( \PDO::FETCH_ASSOC ); + } + + /** + * Deletes a field definition. + * + * @param mixed $typeId + * @param int $status + * @param mixed $fieldDefinitionId + * + * @return void + */ + public function deleteFieldDefinition( $typeId, $status, $fieldDefinitionId ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $fieldDefinitionId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ), + // @todo FIXME: Actually not needed + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ) + ) + ); + + $q->prepare()->execute(); + } + + /** + * Updates a $fieldDefinition for $typeId. + * + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * + * @return void + */ + public function updateFieldDefinition( + $typeId, $status, FieldDefinition $fieldDefinition, + StorageFieldDefinition $storageFieldDef + ) + { + $q = $this->dbHandler->createUpdateQuery(); + $q + ->update( + $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ) + )->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $fieldDefinition->id, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ), + // @todo FIXME: Actually not needed + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ) + ); + $this->setCommonFieldColumns( $q, $fieldDefinition, $storageFieldDef ); + + $q->prepare()->execute(); + } + + /** + * Deletes all name data for $typeId in $typeStatus. + * + * @param int $typeId + * @param int $typeStatus + * + * @return void + */ + protected function deleteTypeNameData( $typeId, $typeStatus ) + { + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( 'ezcontentclass_name' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $query->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $query->bindValue( $typeStatus, null, \PDO::PARAM_INT ) + ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Update a type with $updateStruct. + * + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct $updateStruct + * + * @return void + */ + public function updateType( $typeId, $status, UpdateStruct $updateStruct ) + { + $q = $this->dbHandler->createUpdateQuery(); + $q->update( $this->dbHandler->quoteTable( 'ezcontentclass' ) ); + + $this->setCommonTypeColumns( $q, $updateStruct ); + + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + + $q->prepare()->execute(); + + $this->deleteTypeNameData( $typeId, $status ); + $this->insertTypeNameData( $typeId, $status, $updateStruct->name ); + } + + /** + * Loads an array with data about $typeId in $status. + * + * @param mixed $typeId + * @param int $status + * + * @return array Data rows. + */ + public function loadTypeData( $typeId, $status ) + { + $q = $this->getLoadTypeQuery(); + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id', 'ezcontentclass' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentclass' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads an array with data about the type referred to by $identifier in + * $status. + * + * @param string $identifier + * @param int $status + * + * @return array(int=>array(string=>mixed)) Data rows. + */ + public function loadTypeDataByIdentifier( $identifier, $status ) + { + $q = $this->getLoadTypeQuery(); + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'identifier', 'ezcontentclass' ), + $q->bindValue( $identifier ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentclass' ), + $q->bindValue( $status ) + ) + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads an array with data about the type referred to by $remoteId in + * $status. + * + * @param mixed $remoteId + * @param int $status + * + * @return array(int=>array(string=>mixed)) Data rows. + */ + public function loadTypeDataByRemoteId( $remoteId, $status ) + { + $q = $this->getLoadTypeQuery(); + $q->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'remote_id', 'ezcontentclass' ), + $q->bindValue( $remoteId ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version', 'ezcontentclass' ), + $q->bindValue( $status ) + ) + ) + ); + $stmt = $q->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns a basic query to retrieve Type data. + * + * @return ezcQuerySelect + */ + protected function getLoadTypeQuery() + { + $q = $this->dbHandler->createSelectQuery(); + + $this->selectColumns( $q, 'ezcontentclass' ); + $this->selectColumns( $q, 'ezcontentclass_attribute' ); + $q->select( + $this->dbHandler->aliasedColumn( + $q, + 'group_id', + 'ezcontentclass_classgroup' + ) + ); + $q->from( + $this->dbHandler->quoteTable( 'ezcontentclass' ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ), + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( + 'id', + 'ezcontentclass' + ), + $this->dbHandler->quoteColumn( + 'contentclass_id', + 'ezcontentclass_attribute' + ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( + 'version', + 'ezcontentclass' + ), + $this->dbHandler->quoteColumn( + 'version', + 'ezcontentclass_attribute' + ) + ) + ) + )->leftJoin( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ), + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( + 'id', + 'ezcontentclass' + ), + $this->dbHandler->quoteColumn( + 'contentclass_id', + 'ezcontentclass_classgroup' + ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( + 'version', + 'ezcontentclass' + ), + $this->dbHandler->quoteColumn( + 'contentclass_version', + 'ezcontentclass_classgroup' + ) + ) + ) + ); + + return $q; + } + + /** + * Counts the number of instances that exists of the identified type. + * + * @param int $typeId + * + * @return int + */ + public function countInstancesOfType( $typeId ) + { + $q = $this->dbHandler->createSelectQuery(); + $q->select( + $q->alias( + $q->expr->count( + $this->dbHandler->quoteColumn( 'id' ) + ), + 'count' + ) + )->from( + $this->dbHandler->quoteTable( 'ezcontentobject' ) + )->where( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ) + ); + + $stmt = $q->prepare(); + $stmt->execute(); + + return (int)$stmt->fetchColumn(); + } + + /** + * Deletes all field definitions of a Type. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteFieldDefinitionsForType( $typeId, $status ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Deletes a Type completely. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function delete( $typeId, $status ) + { + $this->deleteGroupAssignmentsForType( + $typeId, $status + ); + $this->deleteFieldDefinitionsForType( + $typeId, $status + ); + $this->deleteTypeNameData( + $typeId, $status + ); + $this->deleteType( + $typeId, $status + ); + } + + /** + * Deletes a the Type. + * + * Does no delete the field definitions! + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteType( $typeId, $status ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentclass' ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Deletes all group assignments for a Type. + * + * @param mixed $typeId + * @param int $status + * + * @return void + */ + public function deleteGroupAssignmentsForType( $typeId, $status ) + { + $q = $this->dbHandler->createDeleteQuery(); + $q->deleteFrom( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->where( + $q->expr->lAnd( + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $q->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $q->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $q->bindValue( $status, null, \PDO::PARAM_INT ) + ) + ) + ); + $q->prepare()->execute(); + } + + /** + * Publishes the Type with $typeId from $sourceVersion to $targetVersion, + * including its fields + * + * @param int $typeId + * @param int $sourceVersion + * @param int $targetVersion + * + * @return void + */ + public function publishTypeAndFields( $typeId, $sourceVersion, $targetVersion ) + { + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcontentclass' ) + )->set( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $targetVersion, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'id' ), + $query->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $sourceVersion, null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcontentclass_classgroup' ) + )->set( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $query->bindValue( $targetVersion, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $query->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $query->bindValue( $sourceVersion, null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcontentclass_attribute' ) + )->set( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $targetVersion, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $query->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'version' ), + $query->bindValue( $sourceVersion, null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteTable( 'ezcontentclass_name' ) + )->set( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $query->bindValue( $targetVersion, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_id' ), + $query->bindValue( $typeId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( 'contentclass_version' ), + $query->bindValue( $sourceVersion, null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Creates an array of select columns for $tableName. + * + * @param \ezcQuerySelect $q + * @param string $tableName + */ + protected function selectColumns( ezcQuerySelect $q, $tableName ) + { + foreach ( $this->columns[$tableName] as $col ) + { + $q->select( + $this->dbHandler->aliasedColumn( $q, $col, $tableName ) + ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Handler.php new file mode 100644 index 0000000..e60159a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Handler.php @@ -0,0 +1,600 @@ +contentTypeGateway = $contentTypeGateway; + $this->mapper = $mapper; + $this->updateHandler = $updateHandler; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct $createStruct + * + * @return Group + */ + public function createGroup( GroupCreateStruct $createStruct ) + { + $group = $this->mapper->createGroupFromCreateStruct( + $createStruct + ); + + $group->id = $this->contentTypeGateway->insertGroup( + $group + ); + + return $group; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function updateGroup( GroupUpdateStruct $struct ) + { + $this->contentTypeGateway->updateGroup( + $struct + ); + return $this->loadGroup( $struct->id ); + } + + /** + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type group contains types + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + */ + public function deleteGroup( $groupId ) + { + if ( $this->contentTypeGateway->countTypesInGroup( $groupId ) !== 0 ) + { + throw new Exception\GroupNotEmpty( $groupId ); + } + $this->contentTypeGateway->deleteGroup( $groupId ); + } + + /** + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with $groupId is not found + * + * @return Group + */ + public function loadGroup( $groupId ) + { + $groups = $this->mapper->extractGroupsFromRows( + $this->contentTypeGateway->loadGroupData( $groupId ) + ); + + if ( count( $groups ) !== 1 ) + { + throw new Exception\TypeGroupNotFound( $groupId ); + } + + return $groups[0]; + } + + /** + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with $identifier is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function loadGroupByIdentifier( $identifier ) + { + $groups = $this->mapper->extractGroupsFromRows( + $this->contentTypeGateway->loadGroupDataByIdentifier( $identifier ) + ); + + if ( count( $groups ) !== 1 ) + { + throw new Exception\TypeGroupNotFound( $identifier ); + } + + return $groups[0]; + } + + /** + * @return Group[] + */ + public function loadAllGroups() + { + return $this->mapper->extractGroupsFromRows( + $this->contentTypeGateway->loadAllGroupsData() + ); + } + + /** + * @param mixed $groupId + * @param int $status + * + * @return Type[] + */ + public function loadContentTypes( $groupId, $status = 0 ) + { + return $this->mapper->extractTypesFromRows( + $this->contentTypeGateway->loadTypesDataForGroup( $groupId, $status ) + ); + } + + /** + * @param int $contentTypeId + * @param int $status + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function load( $contentTypeId, $status = Type::STATUS_DEFINED ) + { + return $this->loadFromRows( + $this->contentTypeGateway->loadTypeData( + $contentTypeId, $status + ), + $contentTypeId, + $status + ); + } + + /** + * Loads a (defined) content type by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If defined type is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function loadByIdentifier( $identifier ) + { + $rows = $this->contentTypeGateway->loadTypeDataByIdentifier( + $identifier, Type::STATUS_DEFINED + ); + return $this->loadFromRows( $rows, $identifier, Type::STATUS_DEFINED ); + } + + /** + * Loads a (defined) content type by remote id + * + * @param mixed $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If defined type is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function loadByRemoteId( $remoteId ) + { + return $this->loadFromRows( + $this->contentTypeGateway->loadTypeDataByRemoteId( + $remoteId, Type::STATUS_DEFINED + ), + $remoteId, + Type::STATUS_DEFINED + ); + } + + /** + * Loads a single Type from $rows + * + * @param array $rows + * @param mixed $typeIdentifier + * @param int $status + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + protected function loadFromRows( array $rows, $typeIdentifier, $status ) + { + $types = $this->mapper->extractTypesFromRows( $rows ); + if ( count( $types ) !== 1 ) + { + throw new Exception\TypeNotFound( $typeIdentifier, $status ); + } + + return $types[0]; + } + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct $createStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function create( CreateStruct $createStruct ) + { + return $this->internalCreate( $createStruct ); + } + + /** + * Internal method for creating ContentType + * + * Used by self::create(), self::createDraft() and self::copy() + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct $createStruct + * @param mixed|null $contentTypeId Used by self::createDraft() to retain ContentType id in the draft + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + protected function internalCreate( CreateStruct $createStruct, $contentTypeId = null ) + { + foreach ( $createStruct->fieldDefinitions as $fieldDef ) + { + if ( !is_int( $fieldDef->position ) || $fieldDef->position <= 0 ) + throw new InvalidArgumentException( + "position", + "'" . var_export( $fieldDef->position, true ) . + "' is wrong value in class FieldDefinition, an integer strictly greater than 0 is required." + ); + } + + $createStruct = clone $createStruct; + $contentType = $this->mapper->createTypeFromCreateStruct( + $createStruct + ); + + $contentType->id = $this->contentTypeGateway->insertType( + $contentType, + $contentTypeId + ); + + foreach ( $contentType->groupIds as $groupId ) + { + $this->contentTypeGateway->insertGroupAssignment( + $groupId, + $contentType->id, + $contentType->status + ); + } + + foreach ( $contentType->fieldDefinitions as $fieldDef ) + { + $storageFieldDef = new StorageFieldDefinition(); + $this->mapper->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + $fieldDef->id = $this->contentTypeGateway->insertFieldDefinition( + $contentType->id, + $contentType->status, + $fieldDef, + $storageFieldDef + ); + } + + return $contentType; + } + + /** + * @param mixed $typeId + * @param int $status + * @param \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct $contentType + * + * @return Type + */ + public function update( $typeId, $status, UpdateStruct $contentType ) + { + $this->contentTypeGateway->updateType( + $typeId, $status, $contentType + ); + return $this->load( + $typeId, $status + ); + } + + /** + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type is defined and still has content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type is not found + * + * @param mixed $contentTypeId + * @param int $status + * + * @return boolean + */ + public function delete( $contentTypeId, $status ) + { + if ( !$this->contentTypeGateway->loadTypeData( $contentTypeId, $status ) ) + { + throw new NotFoundException( + "ContentType", + array( + "id" => $contentTypeId, + "status" => $status + ) + ); + } + + if ( Type::STATUS_DEFINED === $status && $this->contentTypeGateway->countInstancesOfType( $contentTypeId ) ) + { + throw new BadStateException( + "\$contentTypeId", + "ContentType with given id still has content instances and therefore can't be deleted" + ); + } + + $this->contentTypeGateway->delete( + $contentTypeId, $status + ); + + // @todo FIXME: Return true only if deletion happened + return true; + } + + /** + * Creates a draft of existing defined content type + * + * Updates modified date, sets $modifierId and status to Type::STATUS_DRAFT on the new returned draft. + * + * @param mixed $modifierId + * @param mixed $contentTypeId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with defined status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function createDraft( $modifierId, $contentTypeId ) + { + $createStruct = $this->mapper->createCreateStructFromType( + $this->load( $contentTypeId, Type::STATUS_DEFINED ) + ); + $createStruct->status = Type::STATUS_DRAFT; + $createStruct->modifierId = $modifierId; + $createStruct->modified = time(); + + return $this->internalCreate( $createStruct, $contentTypeId ); + } + + /** + * @param mixed $userId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return Type + */ + public function copy( $userId, $contentTypeId, $status ) + { + $createStruct = $this->mapper->createCreateStructFromType( + $this->load( $contentTypeId, $status ) + ); + $createStruct->modifierId = $userId; + $createStruct->created = $createStruct->modified = time(); + $createStruct->creatorId = $userId; + $createStruct->identifier .= '_' . ( $createStruct->remoteId = md5( uniqid( get_class( $createStruct ), true ) ) ); + // Set FieldDefinition ids to null to trigger creating new id + foreach ( $createStruct->fieldDefinitions as $fieldDefinition ) + { + $fieldDefinition->id = null; + } + + return $this->internalCreate( $createStruct ); + } + + /** + * Unlink a content type group from a content type + * + * @param mixed $groupId + * @param mixed $contentTypeId + * @param int $status + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or type with provided status is not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $groupId is last group on $contentTypeId or + * not a group assigned to type + * @todo Add throws for NotFound and BadState when group is not assigned to type + */ + public function unlink( $groupId, $contentTypeId, $status ) + { + $groupCount = $this->contentTypeGateway->countGroupsForType( + $contentTypeId, $status + ); + if ( $groupCount < 2 ) + { + throw new Exception\RemoveLastGroupFromType( + $contentTypeId, $status + ); + } + + $this->contentTypeGateway->deleteGroupAssignment( + $groupId, $contentTypeId, $status + ); + // @todo FIXME: What is to be returned? + return true; + } + + /** + * Link a content type group with a content type + * + * @param mixed $groupId + * @param mixed $contentTypeId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or type with provided status is not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type is already part of group + * @todo Above throws are not implemented + */ + public function link( $groupId, $contentTypeId, $status ) + { + $this->contentTypeGateway->insertGroupAssignment( + $groupId, $contentTypeId, $status + ); + // @todo FIXME: What is to be returned? + return true; + } + + /** + * Returns field definition for the given field definition id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field definition is not found + * + * @param mixed $id + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + public function getFieldDefinition( $id, $status ) + { + $row = $this->contentTypeGateway->loadFieldDefinition( $id, $status ); + + if ( $row === false ) + { + throw new NotFoundException( + "FieldDefinition", + array( + "id" => $id, + "status" => $status + ) + ); + } + + return $this->mapper->extractFieldFromRow( $row ); + } + + /** + * Adds a new field definition to an existing Type. + * + * This method creates a new status of the Type with the $fieldDefinition + * added. It does not update existing content objects depending on the + * field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * + * @return void + */ + public function addFieldDefinition( $contentTypeId, $status, FieldDefinition $fieldDefinition ) + { + $storageFieldDef = new StorageFieldDefinition(); + $this->mapper->toStorageFieldDefinition( + $fieldDefinition, $storageFieldDef + ); + $fieldDefinition->id = $this->contentTypeGateway->insertFieldDefinition( + $contentTypeId, $status, $fieldDefinition, $storageFieldDef + ); + } + + /** + * Removes a field definition from an existing Type. + * + * This method creates a new status of the Type with the field definition + * referred to by $fieldDefinitionId removed. It does not update existing + * content objects depending on the field (default) values. + * + * @param mixed $contentTypeId + * @param mixed $fieldDefinitionId + * + * @return boolean + */ + public function removeFieldDefinition( $contentTypeId, $status, $fieldDefinitionId ) + { + $this->contentTypeGateway->deleteFieldDefinition( + $contentTypeId, $status, $fieldDefinitionId + ); + // @todo FIXME: Return true only if deletion happened + return true; + } + + /** + * This method updates the given $fieldDefinition on a Type. + * + * This method creates a new status of the Type with the updated + * $fieldDefinition. It does not update existing content objects depending + * on the + * field (default) values. + * + * @param mixed $contentTypeId + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * + * @return void + */ + public function updateFieldDefinition( $contentTypeId, $status, FieldDefinition $fieldDefinition ) + { + $storageFieldDef = new StorageFieldDefinition(); + $this->mapper->toStorageFieldDefinition( + $fieldDefinition, $storageFieldDef + ); + $this->contentTypeGateway->updateFieldDefinition( + $contentTypeId, $status, $fieldDefinition, $storageFieldDef + ); + } + + /** + * Update content objects + * + * Updates content objects, depending on the changed field definitions. + * + * A content type has a state which tells if its content objects yet have + * been adapted. + * + * Flags the content type as updated. + * + * @param mixed $contentTypeId + * + * @return void + */ + public function publish( $contentTypeId ) + { + $toType = $this->load( $contentTypeId, Type::STATUS_DRAFT ); + + try + { + $fromType = $this->load( $contentTypeId, Type::STATUS_DEFINED ); + $this->updateHandler->updateContentObjects( $fromType, $toType ); + $this->updateHandler->deleteOldType( $fromType ); + } + // If no old type is found, no updates are necessary to it + catch ( Exception\TypeNotFound $e ) + { + } + + $this->updateHandler->publishNewType( $toType, Type::STATUS_DEFINED ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Mapper.php new file mode 100644 index 0000000..f3e944f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Mapper.php @@ -0,0 +1,365 @@ +converterRegistry = $converterRegistry; + } + + /** + * Creates a Group from its create struct. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct $struct + * + * @todo $description is not supported by database, yet + * + * @return Group + */ + public function createGroupFromCreateStruct( GroupCreateStruct $struct ) + { + $group = new Group(); + + $group->name = $struct->name; + + // Intentionally left out, since DB structure does not support it, yet + // $group->description = $struct->description; + + $group->identifier = $struct->identifier; + $group->created = $struct->created; + $group->modified = $struct->modified; + $group->creatorId = $struct->creatorId; + $group->modifierId = $struct->modifierId; + + return $group; + } + + /** + * Extracts Group objects from the given $rows. + * + * @param array $rows + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group[] + */ + public function extractGroupsFromRows( array $rows ) + { + $groups = array(); + + foreach ( $rows as $row ) + { + $group = new Group(); + $group->id = (int)$row['id']; + $group->created = (int)$row['created']; + $group->creatorId = (int)$row['creator_id']; + $group->modified = (int)$row['modified']; + $group->modifierId = (int)$row['modifier_id']; + $group->identifier = $row['name']; + + $groups[] = $group; + } + + return $groups; + } + + /** + * Extracts types and related data from the given $rows. + * + * @param array $rows + * + * @return array(Type) + */ + public function extractTypesFromRows( array $rows ) + { + $types = array(); + $fields = array(); + + foreach ( $rows as $row ) + { + $typeId = (int)$row['ezcontentclass_id']; + if ( !isset( $types[$typeId] ) ) + { + $types[$typeId] = $this->extractTypeFromRow( $row ); + } + + $fieldId = (int)$row['ezcontentclass_attribute_id']; + if ( !isset( $fields[$fieldId] ) ) + { + $types[$typeId]->fieldDefinitions[] = $fields[$fieldId] = $this->extractFieldFromRow( $row ); + } + + $groupId = (int)$row['ezcontentclass_classgroup_group_id']; + if ( !in_array( $groupId, $types[$typeId]->groupIds ) ) + { + $types[$typeId]->groupIds[] = $groupId; + } + } + + // Re-index $types to avoid people relying on ID keys + return array_values( $types ); + } + + /** + * Creates a Type from the data in $row. + * + * @param array $row + * + * @return Type + */ + protected function extractTypeFromRow( array $row ) + { + $type = new Type(); + + $type->id = (int)$row['ezcontentclass_id']; + $type->status = (int)$row['ezcontentclass_version']; + $type->name = unserialize( $row['ezcontentclass_serialized_name_list'] ); + $type->description = unserialize( $row['ezcontentclass_serialized_description_list'] ); + // Unset redundant data + unset( + $type->name["always-available"], + $type->name[0], + $type->description["always-available"], + $type->description[0] + ); + $type->identifier = $row['ezcontentclass_identifier']; + $type->created = (int)$row['ezcontentclass_created']; + $type->modified = (int)$row['ezcontentclass_modified']; + $type->modifierId = (int)$row['ezcontentclass_modifier_id']; + $type->creatorId = (int)$row['ezcontentclass_creator_id']; + $type->remoteId = $row['ezcontentclass_remote_id']; + $type->urlAliasSchema = $row['ezcontentclass_url_alias_name']; + $type->nameSchema = $row['ezcontentclass_contentobject_name']; + $type->isContainer = ( $row['ezcontentclass_is_container'] == 1 ); + $type->initialLanguageId = (int)$row['ezcontentclass_initial_language_id']; + $type->defaultAlwaysAvailable = ( $row['ezcontentclass_always_available'] == 1 ); + $type->sortField = (int)$row['ezcontentclass_sort_field']; + $type->sortOrder = (int)$row['ezcontentclass_sort_order']; + + $type->groupIds = array(); + $type->fieldDefinitions = array(); + + return $type; + } + + /** + * Creates a FieldDefinition from the data in $row. + * + * @param array $row + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + public function extractFieldFromRow( array $row ) + { + $storageFieldDef = $this->extractStorageFieldFromRow( $row ); + + $field = new FieldDefinition(); + + $field->id = (int)$row['ezcontentclass_attribute_id']; + $field->name = unserialize( $row['ezcontentclass_attribute_serialized_name_list'] ); + $field->description = unserialize( $row['ezcontentclass_attribute_serialized_description_list'] ); + // Unset redundant data + unset( + $field->name["always-available"], + $field->name[0], + $field->description["always-available"], + $field->description[0] + ); + $field->identifier = $row['ezcontentclass_attribute_identifier']; + $field->fieldGroup = $row['ezcontentclass_attribute_category']; + $field->fieldType = $row['ezcontentclass_attribute_data_type_string']; + $field->isTranslatable = ( $row['ezcontentclass_attribute_can_translate'] == 1 ); + $field->isRequired = $row['ezcontentclass_attribute_is_required'] == 1; + $field->isInfoCollector = $row['ezcontentclass_attribute_is_information_collector'] == 1; + + $field->isSearchable = (bool)$row['ezcontentclass_attribute_is_searchable']; + $field->position = (int)$row['ezcontentclass_attribute_placement']; + + $this->toFieldDefinition( $storageFieldDef, $field ); + + return $field; + } + + /** + * Extracts a StorageFieldDefinition from $row + * + * @param array $row + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition + */ + protected function extractStorageFieldFromRow( array $row ) + { + $storageFieldDef = new StorageFieldDefinition(); + + $storageFieldDef->dataFloat1 = isset( $row['ezcontentclass_attribute_data_float1'] ) + ? (float)$row['ezcontentclass_attribute_data_float1'] + : null; + $storageFieldDef->dataFloat2 = isset( $row['ezcontentclass_attribute_data_float2'] ) + ? (float)$row['ezcontentclass_attribute_data_float2'] + : null; + $storageFieldDef->dataFloat3 = isset( $row['ezcontentclass_attribute_data_float3'] ) + ? (float)$row['ezcontentclass_attribute_data_float3'] + : null; + $storageFieldDef->dataFloat4 = isset( $row['ezcontentclass_attribute_data_float4'] ) + ? (float)$row['ezcontentclass_attribute_data_float4'] + : null; + $storageFieldDef->dataInt1 = isset( $row['ezcontentclass_attribute_data_int1'] ) + ? (int)$row['ezcontentclass_attribute_data_int1'] + : null; + $storageFieldDef->dataInt2 = isset( $row['ezcontentclass_attribute_data_int2'] ) + ? (int)$row['ezcontentclass_attribute_data_int2'] + : null; + $storageFieldDef->dataInt3 = isset( $row['ezcontentclass_attribute_data_int3'] ) + ? (int)$row['ezcontentclass_attribute_data_int3'] + : null; + $storageFieldDef->dataInt4 = isset( $row['ezcontentclass_attribute_data_int4'] ) + ? (int)$row['ezcontentclass_attribute_data_int4'] + : null; + $storageFieldDef->dataText1 = $row['ezcontentclass_attribute_data_text1']; + $storageFieldDef->dataText2 = $row['ezcontentclass_attribute_data_text2']; + $storageFieldDef->dataText3 = $row['ezcontentclass_attribute_data_text3']; + $storageFieldDef->dataText4 = $row['ezcontentclass_attribute_data_text4']; + $storageFieldDef->dataText5 = $row['ezcontentclass_attribute_data_text5']; + $storageFieldDef->serializedDataText = $row['ezcontentclass_attribute_serialized_data_text']; + + return $storageFieldDef; + } + + /** + * Maps properties from $struct to $type. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct $createStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function createTypeFromCreateStruct( CreateStruct $createStruct ) + { + $type = new Type(); + + $type->name = $createStruct->name; + $type->status = $createStruct->status; + $type->description = $createStruct->description; + $type->identifier = $createStruct->identifier; + $type->created = $createStruct->created; + $type->modified = $createStruct->modified; + $type->creatorId = $createStruct->creatorId; + $type->modifierId = $createStruct->modifierId; + $type->remoteId = $createStruct->remoteId; + $type->urlAliasSchema = $createStruct->urlAliasSchema; + $type->nameSchema = $createStruct->nameSchema; + $type->isContainer = $createStruct->isContainer; + $type->initialLanguageId = $createStruct->initialLanguageId; + $type->groupIds = $createStruct->groupIds; + $type->fieldDefinitions = $createStruct->fieldDefinitions; + $type->defaultAlwaysAvailable = $createStruct->defaultAlwaysAvailable; + $type->sortField = $createStruct->sortField; + $type->sortOrder = $createStruct->sortOrder; + + return $type; + } + + /** + * Creates a create struct from an existing $type. + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $type + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct + */ + public function createCreateStructFromType( Type $type ) + { + $createStruct = new CreateStruct(); + + $createStruct->name = $type->name; + $createStruct->status = $type->status; + $createStruct->description = $type->description; + $createStruct->identifier = $type->identifier; + $createStruct->created = $type->created; + $createStruct->modified = $type->modified; + $createStruct->creatorId = $type->creatorId; + $createStruct->modifierId = $type->modifierId; + $createStruct->remoteId = $type->remoteId; + $createStruct->urlAliasSchema = $type->urlAliasSchema; + $createStruct->nameSchema = $type->nameSchema; + $createStruct->isContainer = $type->isContainer; + $createStruct->initialLanguageId = $type->initialLanguageId; + $createStruct->groupIds = $type->groupIds; + $createStruct->fieldDefinitions = $type->fieldDefinitions; + $createStruct->defaultAlwaysAvailable = $type->defaultAlwaysAvailable; + $createStruct->sortField = $type->sortField; + $createStruct->sortOrder = $type->sortOrder; + + return $createStruct; + } + + /** + * Maps $fieldDef to the legacy storage specific StorageFieldDefinition + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * + * @return void + */ + public function toStorageFieldDefinition( + FieldDefinition $fieldDef, StorageFieldDefinition $storageFieldDef ) + { + $converter = $this->converterRegistry->getConverter( + $fieldDef->fieldType + ); + $converter->toStorageFieldDefinition( + $fieldDef, + $storageFieldDef + ); + } + + /** + * Maps a FieldDefinition from the given $storageFieldDef + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition $storageFieldDef + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDef + * + * @return void + */ + public function toFieldDefinition( + StorageFieldDefinition $storageFieldDef, FieldDefinition $fieldDef ) + { + $converter = $this->converterRegistry->getConverter( + $fieldDef->fieldType + ); + $converter->toFieldDefinition( + $storageFieldDef, + $fieldDef + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Update/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Update/Handler.php new file mode 100644 index 0000000..d314674 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Update/Handler.php @@ -0,0 +1,45 @@ +contentTypeGateway = $contentTypeGateway; + } + + /** + * Updates existing content objects from $fromType to $toType + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $fromType + * @param \eZ\Publish\SPI\Persistence\Content\Type $toType + * + * @return void + */ + public function updateContentObjects( $fromType, $toType ) + { + } + + /** + * Deletes $fromType and all of its field definitions + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $fromType + * + * @return void + */ + public function deleteOldType( $fromType ) + { + } + + /** + * Publishes $toType to $newStatus + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $toType + * @param int $newStatus + * + * @return void + */ + public function publishNewType( $toType, $newStatus ) + { + $this->contentTypeGateway->publishTypeAndFields( + $toType->id, + $toType->status, + Type::STATUS_MODIFIED + ); + + $script = eZScheduledScript::create( + 'syncobjectattributes.php', + eZINI::instance( 'ezscriptmonitor.ini' )->variable( 'GeneralSettings', 'PhpCliCommand' ) . + ' extension/ezscriptmonitor/bin/' . eZScheduledScript::SCRIPT_NAME_STRING . + ' -s ' . eZScheduledScript::SITE_ACCESS_STRING . ' --classid=' . $toType->id + ); + $script->store(); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/Type/Update/Handler/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Update/Handler/EzcDatabase.php new file mode 100644 index 0000000..8c53cf5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/Type/Update/Handler/EzcDatabase.php @@ -0,0 +1,89 @@ +contentTypeGateway = $contentTypeGateway; + $this->contentUpdater = $contentUpdater; + } + + /** + * Updates existing content objects from $fromType to $toType + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $fromType + * @param \eZ\Publish\SPI\Persistence\Content\Type $toType + * + * @return void + */ + public function updateContentObjects( $fromType, $toType ) + { + $this->contentUpdater->applyUpdates( + $fromType->id, + $this->contentUpdater->determineActions( $fromType, $toType ) + ); + } + + /** + * Deletes $fromType and all of its field definitions + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $fromType + * + * @return void + */ + public function deleteOldType( $fromType ) + { + $this->contentTypeGateway->delete( $fromType->id, $fromType->status ); + } + + /** + * Publishes $toType to $newStatus + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $toType + * @param int $newStatus + * + * @return void + */ + public function publishNewType( $toType, $newStatus ) + { + $this->contentTypeGateway->publishTypeAndFields( + $toType->id, + $toType->status, + $newStatus + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Gateway.php new file mode 100644 index 0000000..f086b28 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Gateway.php @@ -0,0 +1,202 @@ +innerGateway = $innerGateway; + } + + /** + * Loads list of aliases by given $locationId. + * + * @param mixed $locationId + * @param boolean $custom + * + * @return array + */ + public function loadLocationEntries( $locationId, $custom = false ) + { + try + { + return $this->innerGateway->loadLocationEntries( $locationId, $custom ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns boolean indicating if the row with given $id is special root entry. + * + * Special root entry entry will have parentId=0 and text=''. + * In standard installation this entry will point to location with id=2. + * + * @param mixed $id + * + * @return boolean + */ + public function isRootEntry( $id ) + { + try + { + return $this->innerGateway->isRootEntry( $id ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Downgrades autogenerated entry matched by given $action and $languageId and negatively matched by + * composite primary key. + * + * If language mask of the found entry is composite (meaning it consists of multiple language ids) given + * $languageId will be removed from mask. Otherwise entry will be marked as history. + * + * @param string $action + * @param mixed $languageId + * @param mixed $newId + * @param mixed $parentId + * @param string $textMD5 + * + * @return void + */ + public function cleanupAfterPublish( $action, $languageId, $newId, $parentId, $textMD5 ) + { + try + { + $this->innerGateway->cleanupAfterPublish( $action, $languageId, $newId, $parentId, $textMD5 ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Marks all entries with given $id as history entries. + * + * This method is used by Handler::locationMoved(). For this reason rows are not updated with next id value as + * all entries with given id are being marked as history and there is no need for id separation. + * Thus only "link" and "is_original" columns are updated. + * + * @param mixed $id + * @param mixed $link + * + * @return void + */ + public function historizeId( $id, $link ) + { + try + { + $this->innerGateway->historizeId( $id, $link ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates parent id of autogenerated entries. + * + * Update includes history entries. + * + * @param mixed $oldParentId + * @param mixed $newParentId + * + * @return void + */ + public function reparent( $oldParentId, $newParentId ) + { + try + { + $this->innerGateway->reparent( $oldParentId, $newParentId ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Updates single row data matched by composite primary key + * + * Use optional parameter $languageMaskMatch to additionally limit the query match with languages + * + * @param mixed $parentId + * @param string $textMD5 + * @param array $values associative array with column names as keys and column values as values + * + * @return void + */ + public function updateRow( $parentId, $textMD5, array $values ) + { + try + { + $this->innerGateway->updateRow( $parentId, $textMD5, $values ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Inserts new row in urlalias_ml table. + * + * @param array $values + * + * @return mixed + */ + public function insertRow( array $values ) + { + try + { + return $this->innerGateway->insertRow( $values ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads single row data matched by composite primary key + * + * @param mixed $parentId + * @param string $textMD5 + * + * @return array + */ + public function loadRow( $parentId, $textMD5 ) + { + try + { + return $this->innerGateway->loadRow( $parentId, $textMD5 ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads autogenerated entry id by given $action and optionally $parentId. + * + * @param string $action + * @param mixed|null $parentId + * + * @return array + */ + public function loadAutogeneratedEntry( $action, $parentId = null ) + { + try + { + return $this->innerGateway->loadAutogeneratedEntry( $action, $parentId ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Converts all rows with given $action to NOP type rows. + * + * @param string $action + * + * @return void + */ + public function removeByAction( $action ) + { + try + { + $this->innerGateway->removeByAction( $action ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads paged list of global aliases. + * + * @param string|null $languageCode + * @param int $offset + * @param int $limit + * + * @return array + */ + public function listGlobalEntries( $languageCode = null, $offset = 0, $limit = -1 ) + { + try + { + return $this->innerGateway->listGlobalEntries( $languageCode, $offset, $limit ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Converts single row matched by composite primary key to NOP type row. + * + * @param mixed $parentId + * @param string $textMD5 + * + * @return boolean + */ + public function removeCustomAlias( $parentId, $textMD5 ) + { + try + { + return $this->innerGateway->removeCustomAlias( $parentId, $textMD5 ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads complete URL alias data by given array of path hashes. + * + * @param string[] $urlHashes URL string hashes + * + * @return array + */ + public function loadUrlAliasData( array $urlHashes ) + { + try + { + return $this->innerGateway->loadUrlAliasData( $urlHashes ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads all data for the path identified by given $id. + * + * @param mixed $id + * + * @return array + */ + public function loadPathData( $id ) + { + try + { + return $this->innerGateway->loadPathData( $id ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads path data identified by given ordered array of hierarchy data. + * + * The first entry in $hierarchyData corresponds to the top-most path element in the path, the second entry the + * child of the first path element and so on. + * This method is faster than self::getPath() since it can fetch all elements using only one query, but can be used + * only for autogenerated paths. + * + * @param array $hierarchyData + * + * @return array + */ + public function loadPathDataByHierarchy( array $hierarchyData ) + { + try + { + return $this->innerGateway->loadPathDataByHierarchy( $hierarchyData ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads all autogenerated entries with given $parentId with optionally included history entries. + * + * @param mixed $parentId + * @param boolean $includeHistory + * + * @return array + */ + public function loadAutogeneratedEntries( $parentId, $includeHistory = false ) + { + try + { + return $this->innerGateway->loadAutogeneratedEntries( $parentId, $includeHistory ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns next value for "id" column. + * + * @return mixed + */ + public function getNextId() + { + try + { + return $this->innerGateway->getNextId(); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Gateway/EzcDatabase.php new file mode 100644 index 0000000..2923f77 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Gateway/EzcDatabase.php @@ -0,0 +1,1034 @@ + array( + "action", + "action_type", + "alias_redirects", + "id", + "is_alias", + "is_original", + "lang_mask", + "link", + "parent", + "text", + "text_md5", + ), + ); + + /** + * Zeta Components database handler. + * + * @var \ezcDbHandler + */ + protected $dbHandler; + + /** + * Language mask generator + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator + */ + protected $languageMaskGenerator; + + /** + * Creates a new EzcDatabase UrlAlias Gateway + * + * @param \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler $dbHandler + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator $languageMaskGenerator + */ + public function __construct ( + EzcDbHandler $dbHandler, + LanguageMaskGenerator $languageMaskGenerator ) + { + $this->dbHandler = $dbHandler; + $this->languageMaskGenerator = $languageMaskGenerator; + } + + /** + * Loads list of aliases by given $locationId. + * + * @param mixed $locationId + * @param boolean $custom + * + * @return array + */ + public function loadLocationEntries( $locationId, $custom = false ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( "id" ), + $this->dbHandler->quoteColumn( "link" ), + $this->dbHandler->quoteColumn( "is_alias" ), + $this->dbHandler->quoteColumn( "alias_redirects" ), + $this->dbHandler->quoteColumn( "lang_mask" ), + $this->dbHandler->quoteColumn( "is_original" ), + $this->dbHandler->quoteColumn( "parent" ), + $this->dbHandler->quoteColumn( "text_md5" ), + $this->dbHandler->quoteColumn( "action" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "action" ), + $query->bindValue( "eznode:{$locationId}", null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( + $custom ? 1 : 0, + null, \PDO::PARAM_INT + ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads paged list of global aliases. + * + * @param string|null $languageCode + * @param int $offset + * @param int $limit + * + * @return array + */ + public function listGlobalEntries( $languageCode = null, $offset = 0, $limit = -1 ) + { + $limit = $limit === -1 ? self::MAX_LIMIT : $limit; + + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( "action" ), + $this->dbHandler->quoteColumn( "id" ), + $this->dbHandler->quoteColumn( "link" ), + $this->dbHandler->quoteColumn( "is_alias" ), + $this->dbHandler->quoteColumn( "alias_redirects" ), + $this->dbHandler->quoteColumn( "lang_mask" ), + $this->dbHandler->quoteColumn( "is_original" ), + $this->dbHandler->quoteColumn( "parent" ), + $this->dbHandler->quoteColumn( "text_md5" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "action_type" ), + $query->bindValue( "module", null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ) + ) + )->limit( + $limit, + $offset + ); + if ( isset( $languageCode ) ) + { + $query->where( + $query->expr->gt( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "lang_mask" ), + $query->bindValue( + $this->languageMaskGenerator->generateLanguageIndicator( $languageCode, false ), + null, + \PDO::PARAM_INT + ) + ), + 0 + ) + ); + } + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns boolean indicating if the row with given $id is special root entry. + * + * Special root entry entry will have parentId=0 and text=''. + * In standard installation this entry will point to location with id=2. + * + * @param mixed $id + * + * @return boolean + */ + public function isRootEntry( $id ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( "text" ), + $this->dbHandler->quoteColumn( "parent" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + $row = $statement->fetch( \PDO::FETCH_ASSOC ); + + return strlen( $row["text"] ) == 0 && $row["parent"] == 0; + } + + /** + * Downgrades autogenerated entry matched by given $action and $languageId and negatively matched by + * composite primary key. + * + * If language mask of the found entry is composite (meaning it consists of multiple language ids) given + * $languageId will be removed from mask. Otherwise entry will be marked as history. + * + * @param string $action + * @param mixed $languageId + * @param mixed $newId + * @param mixed $parentId + * @param string $textMD5 + * + * @return void + */ + public function cleanupAfterPublish( $action, $languageId, $newId, $parentId, $textMD5 ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( "parent" ), + $this->dbHandler->quoteColumn( "text_md5" ), + $this->dbHandler->quoteColumn( "lang_mask" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lAnd( + // 1) Autogenerated aliases that match action and language... + $query->expr->eq( + $this->dbHandler->quoteColumn( "action" ), + $query->bindValue( $action, null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + ), + $query->expr->gt( + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "lang_mask" ), + $query->bindValue( $languageId, null, \PDO::PARAM_INT ) + ), + 0 + ), + // 2) ...but not newly published entry + $query->expr->not( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5" ), + $query->bindValue( $textMD5, null, \PDO::PARAM_STR ) + ) + ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + $row = $statement->fetch( \PDO::FETCH_ASSOC ); + + if ( !empty( $row ) ) + { + // If language mask is composite (consists of multiple languages) then remove given language from entry + if ( $row["lang_mask"] & ~( $languageId | 1 ) ) + { + $this->removeTranslation( $row["parent"], $row["text_md5"], $languageId ); + } + // Otherwise mark entry as history + else + { + $this->historize( $row["parent"], $row["text_md5"], $newId ); + } + } + } + + /** + * Updates single row matched by composite primary key. + * + * Sets "is_original" to 0 thus marking entry as history. + * + * Re-links history entries. + * + * When location alias is published we need to check for new history entries created with self::downgrade() + * with the same action and language, update their "link" column with id of the published entry. + * History entry "id" column is moved to next id value so that all active (non-history) entries are kept + * under the same id. + * + * @param mixed $parentId + * @param string $textMD5 + * + * @return void + */ + protected function historize( $parentId, $textMD5, $newId ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteColumn( "ezurlalias_ml" ) + )->set( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( "link" ), + $query->bindValue( $newId, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( + $this->getNextId(), + null, + \PDO::PARAM_INT + ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5" ), + $query->bindValue( $textMD5, null, \PDO::PARAM_STR ) + ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Updates single row data matched by composite primary key. + * + * Removes given $languageId from entry's language mask + * + * @param mixed $parentId + * @param string $textMD5 + * @param mixed $languageId + * + * @return void + */ + protected function removeTranslation( $parentId, $textMD5, $languageId ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteColumn( "ezurlalias_ml" ) + )->set( + $this->dbHandler->quoteColumn( "lang_mask" ), + $query->expr->bitAnd( + $this->dbHandler->quoteColumn( "lang_mask" ), + $query->bindValue( ~$languageId, null, \PDO::PARAM_INT ) + ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5" ), + $query->bindValue( $textMD5, null, \PDO::PARAM_STR ) + ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Marks all entries with given $id as history entries. + * + * This method is used by Handler::locationMoved(). For this reason rows are not updated with next id value as + * all entries with given id are being marked as history and there is no need for id separation. + * Thus only "link" and "is_original" columns are updated. + * + * @param mixed $id + * @param mixed $link + * + * @return void + */ + public function historizeId( $id, $link ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteColumn( "ezurlalias_ml" ) + )->set( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + )->set( + $this->dbHandler->quoteColumn( "link" ), + $query->bindValue( $link, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "action_type" ), + $query->bindValue( "eznode", null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "link" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ) + ); + $query->prepare()->execute(); + + } + + /** + * Updates parent id of autogenerated entries. + * + * Update includes history entries. + * + * @param mixed $oldParentId + * @param mixed $newParentId + * + * @return void + */ + public function reparent( $oldParentId, $newParentId ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( + $this->dbHandler->quoteColumn( "ezurlalias_ml" ) + )->set( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $newParentId, null, \PDO::PARAM_INT ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $oldParentId, null, \PDO::PARAM_INT ) + ) + ) + ); + + $query->prepare()->execute(); + } + + /** + * Updates single row data matched by composite primary key. + * + * Use optional parameter $languageMaskMatch to additionally limit the query match with languages. + * + * @param mixed $parentId + * @param string $textMD5 + * @param array $values associative array with column names as keys and column values as values + * + * @return void + */ + public function updateRow( $parentId, $textMD5, array $values ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( $this->dbHandler->quoteColumn( "ezurlalias_ml" ) ); + $this->setQueryValues( $query, $values ); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5" ), + $query->bindValue( $textMD5, null, \PDO::PARAM_STR ) + ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Inserts new row in urlalias_ml table. + * + * @param array $values + * + * @return mixed + */ + public function insertRow( array $values ) + { + // @todo remove after testing + if ( + !isset( $values["text"] ) || + !isset( $values["text_md5"] ) || + !isset( $values["action"] ) || + !isset( $values["parent"] ) || + !isset( $values["lang_mask"] ) ) + { + throw new \Exception( "value set is incomplete: " . var_export( $values, true ) . ", can't execute insert" ); + } + if ( !isset( $values["id"] ) ) $values["id"] = $this->getNextId(); + if ( !isset( $values["link"] ) ) $values["link"] = $values["id"]; + if ( !isset( $values["is_original"] ) ) $values["is_original"] = ( $values["id"] == $values["link"] ? 1 : 0 ); + if ( !isset( $values["is_alias"] ) ) $values["is_alias"] = 0; + if ( !isset( $values["alias_redirects"] ) ) $values["alias_redirects"] = 0; + if ( !isset( $values["action_type"] ) ) + { + if ( preg_match( "#^(.+):.*#", $values["action"], $matches ) ) + $values["action_type"] = $matches[1]; + } + if ( $values["is_alias"] ) $values["is_original"] = 1; + if ( $values["action"] === "nop:" ) $values["is_original"] = 0; + + /** @var $query \ezcQueryInsert */ + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( $this->dbHandler->quoteTable( "ezurlalias_ml" ) ); + $this->setQueryValues( $query, $values ); + $query->prepare()->execute(); + + return $values["id"]; + } + + /** + * Sets value for insert or update query. + * + * @param \ezcQuery|\ezcQueryInsert|\ezcQueryUpdate $query + * @param array $values + * + * @throws \Exception + * + * @return void + */ + protected function setQueryValues( ezcQuery $query, $values ) + { + foreach ( $values as $column => $value ) + { + // @todo remove after testing + if ( !in_array( $column, $this->columns["ezurlalias_ml"] ) ) + { + throw new \Exception( "unknown column '$column' for table 'ezurlalias_ml'" ); + } + switch ( $column ) + { + case "text": + case "action": + case "text_md5": + case "action_type": + $pdoDataType = \PDO::PARAM_STR; + break; + default: + $pdoDataType = \PDO::PARAM_INT; + } + $query->set( + $this->dbHandler->quoteColumn( $column ), + $query->bindValue( $value, null, $pdoDataType ) + ); + } + } + + /** + * Returns next value for "id" column. + * + * @return mixed + */ + public function getNextId() + { + /** @var $query \ezcQueryInsert */ + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( "ezurlalias_ml_incr" ) + )->set( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( null, null, \PDO::PARAM_NULL ) + )->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( "ezurlalias_ml_incr", "id" ) + ); + } + + /** + * Loads single row data matched by composite primary key + * + * @param mixed $parentId + * @param string $textMD5 + * + * @return array + */ + public function loadRow( $parentId, $textMD5 ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( "*" )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5" ), + $query->bindValue( $textMD5, null, \PDO::PARAM_STR ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetch( \PDO::FETCH_ASSOC ); + } + + /** + * Loads complete URL alias data by given array of path hashes. + * + * @param string[] $urlHashes URL string hashes + * + * @return array + */ + public function loadUrlAliasData( array $urlHashes ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + + $count = count( $urlHashes ); + foreach ( $urlHashes as $level => $urlPartHash ) + { + $tableName = "ezurlalias_ml" . ( $level === $count - 1 ? "" : $level ); + + if ( $level === $count - 1 ) + { + $query->select( + $this->dbHandler->quoteColumn( "id", $tableName ), + $this->dbHandler->quoteColumn( "link", $tableName ), + $this->dbHandler->quoteColumn( "is_alias", $tableName ), + $this->dbHandler->quoteColumn( "alias_redirects", $tableName ), + $this->dbHandler->quoteColumn( "is_original", $tableName ), + $this->dbHandler->quoteColumn( "action", $tableName ), + $this->dbHandler->quoteColumn( "action_type", $tableName ), + $this->dbHandler->quoteColumn( "lang_mask", $tableName ), + $this->dbHandler->quoteColumn( "text", $tableName ), + $this->dbHandler->quoteColumn( "parent", $tableName ), + $this->dbHandler->quoteColumn( "text_md5", $tableName ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + ); + } + else + { + $query->select( + $this->dbHandler->aliasedColumn( $query, "id", $tableName ), + $this->dbHandler->aliasedColumn( $query, "link", $tableName ), + $this->dbHandler->aliasedColumn( $query, "is_alias", $tableName ), + $this->dbHandler->aliasedColumn( $query, "alias_redirects", $tableName ), + $this->dbHandler->aliasedColumn( $query, "is_original", $tableName ), + $this->dbHandler->aliasedColumn( $query, "action", $tableName ), + $this->dbHandler->aliasedColumn( $query, "action_type", $tableName ), + $this->dbHandler->aliasedColumn( $query, "lang_mask", $tableName ), + $this->dbHandler->aliasedColumn( $query, "text", $tableName ), + $this->dbHandler->aliasedColumn( $query, "parent", $tableName ), + $this->dbHandler->aliasedColumn( $query, "text_md5", $tableName ) + )->from( + $query->alias( "ezurlalias_ml", $tableName ) + ); + } + + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5", $tableName ), + $query->bindValue( $urlPartHash, null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent", $tableName ), + // root entry has parent column set to 0 + isset( $previousTableName ) ? + $this->dbHandler->quoteColumn( "link", $previousTableName ) : + $query->bindValue( 0, null, \PDO::PARAM_INT ) + ) + ) + ); + + $previousTableName = $tableName; + } + $query->limit( 1 ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetch( \PDO::FETCH_ASSOC ); + } + + /** + * Loads autogenerated entry id by given $action and optionally $parentId. + * + * @param string $action + * @param mixed|null $parentId + * + * @return array + */ + public function loadAutogeneratedEntry( $action, $parentId = null ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + "*" + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "action" ), + $query->bindValue( $action, null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + ) + ) + ); + + if ( isset( $parentId ) ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ) + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetch( \PDO::FETCH_ASSOC ); + } + + /** + * Loads all data for the path identified by given $id. + * + * @throws \RuntimeException + * + * @param mixed $id + * + * @return array + */ + public function loadPathData( $id ) + { + $pathData = array(); + + while ( $id != 0 ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $this->dbHandler->quoteColumn( "parent" ), + $this->dbHandler->quoteColumn( "lang_mask" ), + $this->dbHandler->quoteColumn( "text" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + if ( empty( $rows ) ) + { + // Normally this should never happen + // @todo remove throw when tested + $path = join( "/", $pathData ); + throw new \RuntimeException( "Path ({$path}...) is broken, last id is '{$id}': " . __METHOD__ ); + //break; + } + + $id = $rows[0]["parent"]; + array_unshift( $pathData, $rows ); + } + + return $pathData; + } + + /** + * Loads path data identified by given ordered array of hierarchy data. + * + * The first entry in $hierarchyData corresponds to the top-most path element in the path, the second entry the + * child of the first path element and so on. + * This method is faster than self::getPath() since it can fetch all elements using only one query, but can be used + * only for autogenerated paths. + * + * @param array $hierarchyData + * + * @return array + */ + public function loadPathDataByHierarchy( array $hierarchyData ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + + $hierarchyConditions = array(); + foreach ( $hierarchyData as $levelData ) + { + $hierarchyConditions[] = $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( + $levelData["parent"], + null, + \PDO::PARAM_INT + ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "action" ), + $query->bindValue( + $levelData["action"], + null, + \PDO::PARAM_STR + ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( + $levelData["id"], + null, + \PDO::PARAM_INT + ) + ) + ); + } + + $query->select( + $this->dbHandler->quoteColumn( "action" ), + $this->dbHandler->quoteColumn( "lang_mask" ), + $this->dbHandler->quoteColumn( "text" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lOr( $hierarchyConditions ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $rows = $statement->fetchAll( \PDO::FETCH_ASSOC ); + $rowsMap = array(); + foreach ( $rows as $row ) + { + $rowsMap[$row['action']][] = $row; + } + + if ( count( $rowsMap ) !== count( $hierarchyData ) ) + { + throw new \RuntimeException( "The path is corrupted." ); + } + + $data = array(); + foreach ( $hierarchyData as $levelData ) + { + $data[] = $rowsMap[$levelData["action"]]; + } + return $data; + } + + /** + * Converts single row matched by composite primary key to NOP type row. + * + * @param mixed $parentId + * @param string $textMD5 + * + * @return boolean + */ + public function removeCustomAlias( $parentId, $textMD5 ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( $this->dbHandler->quoteColumn( "ezurlalias_ml" ) ); + $this->setQueryValues( + $query, + array( + "lang_mask" => 1, + "action" => "nop:", + "action_type" => "nop", + "is_alias" => 0, + "is_original" => 0, + "alias_redirects" => 1 + ) + ); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "text_md5" ), + $query->bindValue( $textMD5, null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + + return $statement->rowCount() === 1 ?: false; + } + + /** + * Converts all rows with given $action to NOP type rows. + * + * @param mixed $action + * + * @return boolean + */ + public function removeByAction( $action ) + { + /** @var $query \ezcQueryUpdate */ + $query = $this->dbHandler->createUpdateQuery(); + $query->update( $this->dbHandler->quoteColumn( "ezurlalias_ml" ) ); + $this->setQueryValues( + $query, + array( + "lang_mask" => 1, + "action" => "nop:", + "action_type" => "nop", + "is_alias" => 0, + "is_original" => 0, + "alias_redirects" => 1 + ) + ); + $query->set( + $this->dbHandler->quoteColumn( "link" ), + $this->dbHandler->quoteColumn( "id" ) + ); + $query->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "action" ), + $query->bindValue( $action, null, \PDO::PARAM_STR ) + ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Loads all autogenerated entries with given $parentId with optionally included history entries. + * + * @param mixed $parentId + * @param boolean $includeHistory + * + * @return array + */ + public function loadAutogeneratedEntries( $parentId, $includeHistory = false ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + "*" + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + )->where( + $query->expr->lAnd( + $query->expr->eq( + $this->dbHandler->quoteColumn( "parent" ), + $query->bindValue( $parentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "action_type" ), + $query->bindValue( "eznode", null, \PDO::PARAM_STR ) + ), + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_alias" ), + $query->bindValue( 0, null, \PDO::PARAM_INT ) + ) + ) + ); + + if ( !$includeHistory ) + { + $query->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "is_original" ), + $query->bindValue( 1, null, \PDO::PARAM_INT ) + ) + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Handler.php new file mode 100644 index 0000000..297e717 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Handler.php @@ -0,0 +1,1035 @@ + "dash", + "urlAliasNameLimit" => 255, + "transformation" => "urlalias", + "transformationGroups" => array( + "urlalias" => array( + "commands" => array( + //normalize + "space_normalize", + "hyphen_normalize", + "apostrophe_normalize", + "doublequote_normalize", + "greek_normalize", + "endline_search_normalize", + "tab_search_normalize", + "specialwords_search_normalize", + "punctuation_normalize", + + //transform + "apostrophe_to_doublequote", + "math_to_ascii", + "inverted_to_normal", + + //decompose + "special_decompose", + "latin_search_decompose", + + //transliterate + "cyrillic_transliterate_ascii", + "greek_transliterate_ascii", + "hebrew_transliterate_ascii", + "latin1_transliterate_ascii", + "latin-exta_transliterate_ascii", + + //diacritical + "cyrillic_diacritical", + "greek_diacritical", + "latin1_diacritical", + "latin-exta_diacritical", + ), + "cleanupMethod" => "url_cleanup", + ), + "urlalias_iri" => array( + "commands" => array(), + "cleanupMethod" => "url_cleanup_iri", + ), + "urlalias_compat" => array( + "commands" => array( + //normalize + "space_normalize", + "hyphen_normalize", + "apostrophe_normalize", + "doublequote_normalize", + "greek_normalize", + "endline_search_normalize", + "tab_search_normalize", + "specialwords_search_normalize", + "punctuation_normalize", + + //transform + "apostrophe_to_doublequote", + "math_to_ascii", + "inverted_to_normal", + + //decompose + "special_decompose", + "latin_search_decompose", + + //transliterate + "cyrillic_transliterate_ascii", + "greek_transliterate_ascii", + "hebrew_transliterate_ascii", + "latin1_transliterate_ascii", + "latin-exta_transliterate_ascii", + + //diacritical + "cyrillic_diacritical", + "greek_diacritical", + "latin1_diacritical", + "latin-exta_diacritical", + + //lowercase + "ascii_lowercase", + "cyrillic_lowercase", + "greek_lowercase", + "latin1_lowercase", + "latin-exta_lowercase", + "latin_lowercase", + ), + "cleanupMethod" => "url_cleanup_compat", + ), + ), + "reservedNames" => array( + "class", + "collaboration", + "content", + "error", + "ezinfo", + "infocollector", + "layout", + "notification", + "oauth", + "oauthadmin", + "package", + "pdf", + "role", + "rss", + "search", + "section", + "settings", + "setup", + "shop", + "state", + "trigger", + "url", + "user", + "visual", + "workflow", + "switchlanguage", + ), + ); + + /** + * UrlAlias Gateway + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway + */ + protected $gateway; + + /** + * Gateway for handling location data + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway + */ + protected $locationGateway; + + /** + * UrlAlias Mapper + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper + */ + protected $mapper; + + /** + * Caching language handler + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler + */ + protected $languageHandler; + + /** + * Transformation processor to normalize URL strings + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor + */ + protected $transformationProcessor; + + /** + * Creates a new UrlAlias Handler + * + * @param \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway $gateway + * @param \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper $mapper + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway $locationGateway + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler $languageHandler + * @param \eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor $transformationProcessor + * @param array $configuration + */ + public function __construct( + Gateway $gateway, + Mapper $mapper, + LocationGateway $locationGateway, + LanguageHandler $languageHandler, + TransformationProcessor $transformationProcessor, + array $configuration = array() + ) + { + $this->gateway = $gateway; + $this->mapper = $mapper; + $this->locationGateway = $locationGateway; + $this->languageHandler = $languageHandler; + $this->transformationProcessor = $transformationProcessor; + $this->configuration = $configuration + $this->configuration; + } + + /** + * This method creates or updates an urlalias from a new or changed content name in a language + * (if published). It also can be used to create an alias for a new location of content. + * On update the old alias is linked to the new one (i.e. a history alias is generated). + * + * $alwaysAvailable controls whether the url alias is accessible in all + * languages. + * + * @param mixed $locationId + * @param mixed $parentLocationId + * @param string $name the new name computed by the name schema or url alias schema + * @param string $languageCode + * @param boolean $alwaysAvailable + * @param boolean $isLanguageMain used only for legacy storage for updating ezcontentobject_tree.path_identification_string + * + * @return void + */ + public function publishUrlAliasForLocation( + $locationId, + $parentLocationId, + $name, + $languageCode, + $alwaysAvailable = false, + $isLanguageMain = false + ) + { + $parentId = $this->getRealAliasId( $parentLocationId ); + $uniqueCounter = $this->getUniqueCounterValue( $name, $parentId ); + $name = $this->convertToAlias( $name, "location_" . $locationId ); + $languageId = $this->languageHandler->loadByLanguageCode( $languageCode )->id; + $languageMask = $languageId | (int)$alwaysAvailable; + $action = "eznode:" . $locationId; + $cleanup = false; + + // Exiting the loop with break; + while ( true ) + { + $newText = $name . ( $uniqueCounter > 1 ? $uniqueCounter : "" ); + $newTextMD5 = $this->getHash( $newText ); + // Try to load existing entry + $row = $this->gateway->loadRow( $parentId, $newTextMD5 ); + + // If nothing was returned insert new entry + if ( empty( $row ) ) + { + // Check for existing active location entry on this level and reuse it's id + $existingLocationEntry = $this->gateway->loadAutogeneratedEntry( $action, $parentId ); + if ( !empty( $existingLocationEntry ) ) + { + $cleanup = true; + $newId = $existingLocationEntry["id"]; + } + else + { + $newId = null; + } + + $newId = $this->gateway->insertRow( + array( + "id" => $newId, + "link" => $newId, + "parent" => $parentId, + "action" => $action, + "lang_mask" => $languageMask, + "text" => $newText, + "text_md5" => $newTextMD5, + ) + ); + + break; + } + + // Row exists, check if it is reusable. There are 3 cases when this is possible: + // 1. NOP entry + // 2. existing location or custom alias entry + // 3. history entry + if ( $row["action"] == "nop:" || $row["action"] == $action || $row["is_original"] == 0 ) + { + // Check for existing location entry on this level, if it exists and it's id differs from reusable + // entry id then reusable entry should be updated with the existing location entry id. + // Note: existing location entry may be downgraded and relinked later, depending on its language. + $existingLocationEntry = $this->gateway->loadAutogeneratedEntry( $action, $parentId ); + $newId = $row["id"]; + if ( !empty( $existingLocationEntry ) ) + { + if ( $existingLocationEntry["id"] != $row["id"] ) + { + $cleanup = true; + $newId = $existingLocationEntry["id"]; + } + else + { + // If we are reusing existing location entry merge existing language mask + $languageMask |= ( $row["lang_mask"] & ~1 ); + } + } + $this->gateway->updateRow( + $parentId, + $newTextMD5, + array( + "action" => $action, + // In case when NOP row was reused + "action_type" => "eznode", + "lang_mask" => $languageMask, + // Updating text ensures that letter case changes are stored + "text" => $newText, + // Set "id" and "link" for case when reusable entry is history + "id" => $newId, + "link" => $newId, + // Entry should be active location entry (original and not alias). + // Note: this takes care of taking over custom alias entry for the location on the same level + // and with same name and action. + "alias_redirects" => 1, + "is_original" => 1, + "is_alias" => 0, + ) + ); + + break; + } + + // If existing row is not reusable, increment $uniqueCounter and try again + $uniqueCounter += 1; + } + + if ( $isLanguageMain ) + { + $this->locationGateway->updatePathIdentificationString( + $locationId, + $parentLocationId, + $this->convertToAlias( $newText, "node_", "urlalias_compat" ) + ); + } + + /** @var $newId */ + /** @var $newTextMD5 */ + // Note: cleanup does not touch custom and global entries + if ( $cleanup ) + { + $this->gateway->cleanupAfterPublish( $action, $languageId, $newId, $parentId, $newTextMD5 ); + } + } + + /** + * Create a user chosen $alias pointing to $locationId in $languageCode. + * + * If $languageCode is null the $alias is created in the system's default + * language. $alwaysAvailable makes the alias available in all languages. + * + * @param mixed $locationId + * @param string $path + * @param boolean $forwarding + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function createCustomUrlAlias( $locationId, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ) + { + return $this->createUrlAlias( + "eznode:" . $locationId, + $path, + $forwarding, + $languageCode, + $alwaysAvailable + ); + } + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * + * If $languageCode is null the $alias is created in the system's default + * language. $alwaysAvailable makes the alias available in all languages. + * + * @throws \eZ\Publish\API\Repository\Exceptions\ForbiddenException if the path already exists for the given language + * + * @param string $resource + * @param string $path + * @param boolean $forwarding + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function createGlobalUrlAlias( $resource, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ) + { + return $this->createUrlAlias( + $resource, + $path, + $forwarding, + $languageCode, + $alwaysAvailable + ); + } + + /** + * Internal method for creating global or custom URL alias (these are handled in the same way) + * + * @throws \eZ\Publish\Core\Base\Exceptions\ForbiddenException if the path already exists for the given language + * + * @param string $action + * @param string $path + * @param boolean $forward + * @param string|null $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + protected function createUrlAlias( $action, $path, $forward, $languageCode, $alwaysAvailable ) + { + $pathElements = explode( "/", $path ); + $topElement = array_pop( $pathElements ); + $languageId = $this->languageHandler->loadByLanguageCode( $languageCode )->id; + $parentId = 0; + + // Handle all path elements except topmost one + $isPathNew = false; + foreach ( $pathElements as $level => $pathElement ) + { + $pathElement = $this->convertToAlias( $pathElement, "noname" . $level + 1 ); + $pathElementMD5 = $this->getHash( $pathElement ); + if ( !$isPathNew ) + { + $row = $this->gateway->loadRow( $parentId, $pathElementMD5 ); + if ( empty( $row ) ) + { + $isPathNew = true; + } + else + { + $parentId = $row["link"]; + } + } + + if ( $isPathNew ) + { + $parentId = $this->insertNopEntry( $parentId, $pathElement, $pathElementMD5 ); + } + } + + // Handle topmost path element + $topElement = $this->convertToAlias( $topElement, "noname" . count( $pathElements ) + 1 ); + + // If last (next to topmost) entry parent is special root entry we handle topmost entry as first level entry + // That is why we need to reset $parentId to 0 and empty $createdPath + if ( $parentId != 0 && $this->gateway->isRootEntry( $parentId ) ) + { + $parentId = 0; + } + + $topElementMD5 = $this->getHash( $topElement ); + // Set common values for two cases below + $data = array( + "action" => $action, + "is_alias" => 1, + "alias_redirects" => $forward ? 1 : 0, + "parent" => $parentId, + "text" => $topElement, + "text_md5" => $topElementMD5, + "is_original" => 1 + ); + // Try to load topmost element + if ( !$isPathNew ) + { + $row = $this->gateway->loadRow( $parentId, $topElementMD5 ); + } + + // If nothing was returned perform insert + if ( $isPathNew || empty( $row ) ) + { + $data["lang_mask"] = $languageId | (int)$alwaysAvailable; + $this->gateway->insertRow( $data ); + } + // Row exists, check if it is reusable. There are 2 cases when this is possible: + // 1. NOP entry + // 2. history entry + else if ( $row["action"] == "nop:" || $row["is_original"] == 0 ) + { + $data["lang_mask"] = $languageId | (int)$alwaysAvailable; + // If history is reused move link to id + $data["link"] = $row["id"]; + $this->gateway->updateRow( + $parentId, + $topElementMD5, + $data + ); + } + else + { + throw new ForbiddenException( "Path '$path' already exists for the given language" ); + } + + return $this->mapper->extractUrlAliasFromData( $data ); + } + + /** + * Convenience method for inserting nop type row. + * + * @param mixed $parentId + * @param string $text + * @param string $textMD5 + * + * @return mixed + */ + protected function insertNopEntry( $parentId, $text, $textMD5 ) + { + return $this->gateway->insertRow( + array( + "lang_mask" => 1, + "action" => "nop:", + "parent" => $parentId, + "text" => $text, + "text_md5" => $textMD5 + ) + ); + } + + /** + * List of user generated or autogenerated url entries, pointing to $locationId. + * + * @param mixed $locationId + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function listURLAliasesForLocation( $locationId, $custom = false ) + { + $data = $this->gateway->loadLocationEntries( $locationId, $custom ); + foreach ( $data as &$entry ) + { + $entry["raw_path_data"] = $this->gateway->loadPathData( $entry["id"] ); + } + + return $this->mapper->extractUrlAliasListFromData( $data ); + } + + /** + * List global aliases. + * + * @param string|null $languageCode + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function listGlobalURLAliases( $languageCode = null, $offset = 0, $limit = -1 ) + { + $data = $this->gateway->listGlobalEntries( $languageCode, $offset, $limit ); + foreach ( $data as &$entry ) + { + $entry["raw_path_data"] = $this->gateway->loadPathData( $entry["id"] ); + } + + return $this->mapper->extractUrlAliasListFromData( $data ); + } + + /** + * Removes url aliases. + * + * Autogenerated aliases are not removed by this method. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias[] $urlAliases + * + * @return boolean + */ + public function removeURLAliases( array $urlAliases ) + { + foreach ( $urlAliases as $urlAlias ) + { + if ( $urlAlias->isCustom ) + { + list( $parentId, $textMD5 ) = explode( "-", $urlAlias->id ); + if ( !$this->gateway->removeCustomAlias( $parentId, $textMD5 ) ) + { + return false; + } + } + } + + return true; + } + + /** + * Looks up a url alias for the given url + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @throws \RuntimeException + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException + * + * @param string $url + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function lookup( $url ) + { + $urlHashes = array(); + foreach ( explode( "/", $url ) as $level => $text ) + { + $urlHashes[$level] = $this->getHash( $text ); + } + + $data = $this->gateway->loadUrlAliasData( $urlHashes ); + if ( empty( $data ) ) + { + throw new NotFoundException( "URLAlias", $url ); + } + + $pathDepth = count( $urlHashes ); + $hierarchyData = array(); + $isPathHistory = false; + for ( $level = 0; $level < $pathDepth; ++$level ) + { + $prefix = $level === $pathDepth - 1 ? "" : "ezurlalias_ml" . $level . "_"; + $isPathHistory = $isPathHistory ?: ( $data[$prefix . "link"] != $data[$prefix . "id"] ); + $hierarchyData[$level] = array( + "id" => $data[$prefix . "id"], + "parent" => $data[$prefix . "parent"], + "action" => $data[$prefix . "action"] + ); + } + + $data["is_path_history"] = $isPathHistory; + $data["raw_path_data"] = ( $data["action_type"] == "eznode" && !$data["is_alias"] ) + ? $this->gateway->loadPathDataByHierarchy( $hierarchyData ) + : $this->gateway->loadPathData( $data["id"] ); + + return $this->mapper->extractUrlAliasFromData( $data ); + } + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function loadUrlAlias( $id ) + { + list( $parentId, $textMD5 ) = explode( "-", $id ); + $data = $this->gateway->loadRow( $parentId, $textMD5 ); + + if ( empty( $data ) ) + { + throw new NotFoundException( "URLAlias", $id ); + } + + $data["raw_path_data"] = $this->gateway->loadPathData( $data["id"] ); + + return $this->mapper->extractUrlAliasFromData( $data ); + } + + /** + * Notifies the underlying engine that a location has moved. + * + * This method triggers the change of the autogenerated aliases. + * + * @param mixed $locationId + * @param mixed $oldParentId + * @param mixed $newParentId + * + * @return void + */ + public function locationMoved( $locationId, $oldParentId, $newParentId ) + { + // @todo optimize: $newLocationAliasId is already available in self::publishUrlAliasForLocation() as $newId + $newParentLocationAliasId = $this->getRealAliasId( $newParentId ); + $newLocationAlias = $this->gateway->loadAutogeneratedEntry( + "eznode:" . $locationId, + $newParentLocationAliasId + ); + + $oldParentLocationAliasId = $this->getRealAliasId( $oldParentId ); + $oldLocationAlias = $this->gateway->loadAutogeneratedEntry( + "eznode:" . $locationId, + $oldParentLocationAliasId + ); + + // Historize alias for old location + $this->gateway->historizeId( $oldLocationAlias["id"], $newLocationAlias["id"] ); + // Reparent subtree of old location to new location + $this->gateway->reparent( $oldLocationAlias["id"], $newLocationAlias["id"] ); + } + + /** + * Notifies the underlying engine that a location has moved. + * + * This method triggers the creation of the autogenerated aliases for the copied locations + * + * @param mixed $locationId + * @param mixed $oldParentId + * @param mixed $newParentId + * + * @return void + */ + public function locationCopied( $locationId, $newLocationId, $newParentId ) + { + $newParentAliasId = $this->getRealAliasId( $newLocationId ); + $oldParentAliasId = $this->getRealAliasId( $locationId ); + + $actionMap = $this->getCopiedLocationsMap( $locationId, $newLocationId ); + + $this->copySubtree( + $actionMap, + $oldParentAliasId, + $newParentAliasId, + $locationId + ); + } + + /** + * Returns possibly corrected alias id for given $locationId. + * + * First level entries must have parent id set to 0 instead of their parent location alias id. + * There are two cases when alias id needs to be corrected: + * 1) location is special location without URL alias (location with id=1 in standard installation) + * 2) location is site root location, having special root entry in the ezurlalias_ml table (location with id=2 + * in standard installation) + * + * @param mixed $locationId + * + * @return int + */ + protected function getRealAliasId( $locationId ) + { + $data = $this->gateway->loadAutogeneratedEntry( "eznode:" . $locationId ); + + if ( empty( $data ) || $data["id"] != 0 && $this->gateway->isRootEntry( $data["id"] ) ) + { + $id = 0; + } + else + { + $id = $data["id"]; + } + + return $id; + } + + /** + * Recursively copies aliases from old parent under new parent. + * + * @param array $actionMap + * @param mixed $oldParentAliasId + * @param mixed $newParentAliasId + * + * @return void + */ + protected function copySubtree( $actionMap, $oldParentAliasId, $newParentAliasId ) + { + $rows = $this->gateway->loadAutogeneratedEntries( $oldParentAliasId ); + $newIdsMap = array(); + foreach ( $rows as $row ) + { + $oldParentAliasId = $row["id"]; + + // Ensure that same action entries remain grouped by the same id + if ( !isset( $newIdsMap[$oldParentAliasId] ) ) + { + $newIdsMap[$oldParentAliasId] = $this->gateway->getNextId(); + } + + $row["action"] = $actionMap[$row["action"]]; + $row["parent"] = $newParentAliasId; + $row["id"] = $row["link"] = $newIdsMap[$oldParentAliasId]; + $this->gateway->insertRow( $row ); + + $this->copySubtree( + $actionMap, + $oldParentAliasId, + $row["id"] + ); + } + } + + /** + * @param mixed $oldParentId + * @param mixed $newParentId + * + * @return array + */ + protected function getCopiedLocationsMap( $oldParentId, $newParentId ) + { + $originalLocations = $this->locationGateway->getSubtreeContent( $oldParentId ); + $copiedLocations = $this->locationGateway->getSubtreeContent( $newParentId ); + + $map = array(); + foreach ( $originalLocations as $index => $originalLocation ) + { + $map["eznode:" . $originalLocation["node_id"]] = "eznode:" . $copiedLocations[$index]["node_id"]; + } + + return $map; + } + + /** + * Notifies the underlying engine that a location was deleted or moved to trash + * + * @param mixed $locationId + */ + public function locationDeleted( $locationId ) + { + $action = "eznode:" . $locationId; + $entry = $this->gateway->loadAutogeneratedEntry( $action ); + + $this->removeSubtree( $entry["id"], $action ); + } + + /** + * Recursively removes aliases by given parent id and action + * + * @param mixed $parentId + * @param string $action + * + * @return void + */ + protected function removeSubtree( $parentId, $action ) + { + $entries = $this->gateway->loadAutogeneratedEntries( $parentId, true ); + + foreach ( $entries as $entry ) + { + $this->removeSubtree( $entry["id"], $entry["action"] ); + } + $this->gateway->removeByAction( $action ); + } + + /** + * Converts the path \a $urlElement into a new alias url which only consists of valid characters + * in the URL. + * For non-Unicode setups this means character in the range a-z, numbers and _, for Unicode + * setups it means all characters except space, &, ;, /, :, =, ?, [, ], (, ), - + * + * Invalid characters are converted to -. + * + * Example with a non-Unicode setup + * + * 'My car' => 'My-car' + * 'What is this?' => 'What-is-this' + * 'This & that' => 'This-that' + * 'myfile.tpl' => 'Myfile-tpl', + * 'øæå' => 'oeaeaa' + * + * @param string $text + * @param string $defaultValue + * @param string|null $transformation + * + * @return string + */ + protected function convertToAlias( $text, $defaultValue = "_1", $transformation = null ) + { + if ( !isset( $transformation ) ) + { + $transformation = $this->configuration["transformation"]; + } + + if ( strlen( $text ) === 0 ) + { + $text = $defaultValue; + } + + return $this->cleanupText( + $this->transformationProcessor->transform( + $text, + $this->configuration["transformationGroups"][$transformation]["commands"] + ), + $this->configuration["transformationGroups"][$transformation]["cleanupMethod"] + ); + } + + /** + * Returns unique counter number that is appended to the path element in order to make it unique + * against system reserved names and other entries on the same level. + * + * Comparison is done only if parent element id is 0 (meaning that entry is at first path element). + * In a case when reserved name is matched method will return 2. + * When parent element id is not 0 or when there is no match with reserved names this will return 1, + * which is default value not appended to name. + * Note: this is used only when publishing URL aliases, when creating global and custom aliases user + * is allowed to create first level entries that collide with reserved names. Also, in actual creation + * of the alias name will be further checked against existing elements under the same parent, using + * unique counter value determined here as starting unique counter value. + * + * @param string $text + * @param int $parentId + * + * @return int + */ + protected function getUniqueCounterValue( $text, $parentId ) + { + if ( $parentId === 0 ) + { + foreach ( $this->configuration["reservedNames"] as $reservedName ) + { + if ( strcasecmp( $text, $reservedName ) === 0 ) + { + return 2; + } + } + } + + return 1; + } + + /** + * @param string $text + * + * @return string + */ + protected function getHash( $text ) + { + return md5( strtolower( $text ) ); + } + + /** + * Cleans up + * + * @param string $text + * @param string $method + * + * @return string + */ + protected function cleanupText( $text, $method ) + { + switch ( $method ) + { + case "url_cleanup": + $sep = $this->getWordSeparator(); + $sepQ = preg_quote( $sep ); + $text = preg_replace( + array( + "#[^a-zA-Z0-9_!.-]+#", + "#^[.]+|[!.]+$#", # Remove dots at beginning/end + "#\.\.+#", # Remove double dots + "#[{$sepQ}]+#", # Turn multiple separators into one + "#^[{$sepQ}]+|[{$sepQ}]+$#" # Strip separator from beginning/end + ), + array( + $sep, + $sep, + $sep, + $sep, + "" + ), + $text + ); + break; + case "url_cleanup_iri": + // With IRI support we keep all characters except some reserved ones, + // they are space, ampersand, semi-colon, forward slash, colon, equal sign, question mark, + // square brackets, parenthesis, plus. + // + // Note: Space is turned into a dash to make it easier for people to + // paste urls from the system and have the whole url recognized + // instead of being broken off + $sep = $this->getWordSeparator(); + $sepQ = preg_quote( $sep ); + $prepost = " ." . $sepQ; + if ( $sep != "-" ) + $prepost .= "-"; + $text = preg_replace( + array( + "#[ \\\\%\#&;/:=?\[\]()+]+#", + "#^[.]+|[!.]+$#", # Remove dots at beginning/end + "#\.\.+#", # Remove double dots + "#[{$sepQ}]+#", # Turn multiple separators into one + "#^[{$prepost}]+|[{$prepost}]+$#" + ), + array( + $sep, + $sep, + $sep, + $sep, + "" + ), + $text + ); + break; + case "url_cleanup_compat": + // Old style of url alias with lowercase only and underscores for separators + $text = strtolower( $text ); + $text = preg_replace( + array( + "#[^a-z0-9]+#", + "#^_+|_+$#" + ), + array( + "_", + "" + ), + $text + ); + break; + default: + // Nothing + } + + return $text; + } + + /** + * Returns word separator value + * + * @return string + */ + protected function getWordSeparator() + { + switch ( $this->configuration["wordSeparatorName"] ) + { + case "dash": + return "-"; + case "underscore": + return "_"; + case "space": + return " "; + } + + return "-"; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Mapper.php new file mode 100644 index 0000000..76d38f6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlAlias/Mapper.php @@ -0,0 +1,172 @@ +languageMaskGenerator = $languageMaskGenerator; + } + + /** + * Creates a UrlAlias object from database row data + * + * @param mixed[] $data + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function extractUrlAliasFromData( $data ) + { + $urlAlias = new UrlAlias(); + + list( $type, $destination ) = $this->matchTypeAndDestination( $data["action"] ); + $urlAlias->id = $data["parent"] . "-" . $data["text_md5"]; + $urlAlias->pathData = isset( $data["raw_path_data"] ) + ? $this->normalizePathData( $data["raw_path_data"] ) + : null; + $urlAlias->languageCodes = $this->languageMaskGenerator->extractLanguageCodesFromMask( $data["lang_mask"] ); + $urlAlias->alwaysAvailable = $this->languageMaskGenerator->isAlwaysAvailable( $data["lang_mask"] ); + $urlAlias->isHistory = isset( $data["is_path_history"] ) ? $data["is_path_history"] : !$data["is_original"]; + $urlAlias->isCustom = (boolean)$data["is_alias"]; + $urlAlias->forward = $data["is_alias"] && $data["alias_redirects"]; + $urlAlias->destination = $destination; + $urlAlias->type = $type; + + return $urlAlias; + } + + /** + * Extracts UrlAlias objects from database $rows + * + * @param array $rows + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function extractUrlAliasListFromData( array $rows ) + { + $urlAliases = array(); + foreach ( $rows as $row ) + { + $urlAliases[] = $this->extractUrlAliasFromData( $row ); + } + + return $urlAliases; + } + + /** + * @throws \RuntimeException + * + * @param string $action + * + * @return array + */ + protected function matchTypeAndDestination( $action ) + { + if ( preg_match( "#^([a-zA-Z0-9_]+):(.+)?$#", $action, $matches ) ) + { + $actionType = $matches[1]; + $actionValue = isset( $matches[2] ) ? $matches[2] : false; + + switch ( $actionType ) + { + case "eznode": + $type = UrlAlias::LOCATION; + $destination = $actionValue; + break; + + case "module": + $type = UrlAlias::RESOURCE; + $destination = $actionValue; + break; + + case "nop": + $type = UrlAlias::VIRTUAL; + $destination = null; + break; + + default: + // @todo log message + throw new \RuntimeException( "Action type '{$actionType}' is unknown" ); + } + } + else + { + // @todo log message + throw new \RuntimeException( "Action '{$action}' is not valid" ); + } + + return array( $type, $destination ); + } + + /** + * @param array $pathData + * + * @return array + */ + protected function normalizePathData( $pathData ) + { + $normalizedPathData = array(); + foreach ( $pathData as $level => $rows ) + { + $pathElementData = array(); + foreach ( $rows as $row ) + { + $this->normalizePathDataRow( $pathElementData, $row ); + } + + $normalizedPathData[$level] = $pathElementData; + } + + return $normalizedPathData; + } + + /** + * @param array $pathElementData + * @param array $row + * + * @return void + */ + protected function normalizePathDataRow( array &$pathElementData, array $row ) + { + $languageCodes = $this->languageMaskGenerator->extractLanguageCodesFromMask( $row["lang_mask"] ); + $pathElementData["always-available"] = $this->languageMaskGenerator->isAlwaysAvailable( $row["lang_mask"] ); + if ( !empty( $languageCodes ) ) + { + foreach ( $languageCodes as $languageCode ) + { + $pathElementData["translations"][$languageCode] = $row["text"]; + } + } + else if ( $pathElementData["always-available"] ) + { + // NOP entry, lang_mask == 1 + $pathElementData["translations"]["always-available"] = $row["text"]; + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Gateway.php new file mode 100644 index 0000000..12ee19f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Gateway.php @@ -0,0 +1,55 @@ +innerGateway = $innerGateway; + } + + /** + * Inserts the given UrlWildcard + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlWildcard $urlWildcard + * + * @return mixed + */ + public function insertUrlWildcard( UrlWildcard $urlWildcard ) + { + try + { + return $this->innerGateway->insertUrlWildcard( $urlWildcard ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Deletes the UrlWildcard with given $id + * + * @param mixed $id + * + * @return void + */ + public function deleteUrlWildcard( $id ) + { + try + { + return $this->innerGateway->deleteUrlWildcard( $id ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * @param mixed $parentId + * + * @return array + */ + public function loadUrlWildcardData( $parentId ) + { + try + { + return $this->innerGateway->loadUrlWildcardData( $parentId ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads an array with data about UrlWildcards (paged) + * + * @param mixed $offset + * @param mixed $limit + * + * @return array + */ + public function loadUrlWildcardsData( $offset = 0, $limit = -1 ) + { + try + { + return $this->innerGateway->loadUrlWildcardsData( $offset, $limit ); + } + catch ( ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Gateway/EzcDatabase.php new file mode 100644 index 0000000..73eb094 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Gateway/EzcDatabase.php @@ -0,0 +1,169 @@ +dbHandler = $dbHandler; + } + + /** + * Inserts the given UrlWildcard + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlWildcard $urlWildcard + * + * @return mixed + */ + public function insertUrlWildcard( UrlWildcard $urlWildcard ) + { + /** @var $query \ezcQueryInsert */ + $query = $this->dbHandler->createInsertQuery(); + $query->insertInto( + $this->dbHandler->quoteTable( "ezurlwildcard" ) + )->set( + $this->dbHandler->quoteColumn( "destination_url" ), + $query->bindValue( + trim( $urlWildcard->destinationUrl, "/ " ), + null, + \PDO::PARAM_STR + ) + )->set( + $this->dbHandler->quoteColumn( "id" ), + $this->dbHandler->getAutoIncrementValue( "ezurlwildcard", "id" ) + )->set( + $this->dbHandler->quoteColumn( "source_url" ), + $query->bindValue( + trim( $urlWildcard->sourceUrl, "/ " ), + null, + \PDO::PARAM_STR + ) + )->set( + $this->dbHandler->quoteColumn( "type" ), + $query->bindValue( + $urlWildcard->forward ? 1 : 2, + null, + \PDO::PARAM_INT + ) + ); + + $query->prepare()->execute(); + + return $this->dbHandler->lastInsertId( + $this->dbHandler->getSequenceName( "ezurlwildcard", "id" ) + ); + } + + /** + * Deletes the UrlWildcard with given $id + * + * @param mixed $id + * + * @return void + */ + public function deleteUrlWildcard( $id ) + { + /** @var $query \ezcQueryDelete */ + $query = $this->dbHandler->createDeleteQuery(); + $query->deleteFrom( + $this->dbHandler->quoteTable( "ezurlwildcard" ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Loads an array with data about UrlWildcard with $id + * + * @param mixed $id + * + * @return array + */ + public function loadUrlWildcardData( $id ) + { + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + "*" + )->from( + $this->dbHandler->quoteTable( "ezurlwildcard" ) + )->where( + $query->expr->eq( + $this->dbHandler->quoteColumn( "id" ), + $query->bindValue( $id, null, \PDO::PARAM_INT ) + ) + ); + $stmt = $query->prepare(); + $stmt->execute(); + + return $stmt->fetch( \PDO::FETCH_ASSOC ); + } + + /** + * Loads an array with data about UrlWildcards (paged) + * + * @param mixed $offset + * @param mixed $limit + * + * @return array + */ + public function loadUrlWildcardsData( $offset = 0, $limit = -1 ) + { + $limit = $limit === -1 ? self::MAX_LIMIT : $limit; + + /** @var $query \ezcQuerySelect */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + "*" + )->from( + $this->dbHandler->quoteTable( "ezurlwildcard" ) + )->limit( + $limit > 0 ? + $limit : + self::MAX_LIMIT, + $offset + ); + + $stmt = $query->prepare(); + $stmt->execute(); + + return $stmt->fetchAll( \PDO::FETCH_ASSOC ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Handler.php new file mode 100644 index 0000000..50ae66a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Handler.php @@ -0,0 +1,118 @@ +gateway = $gateway; + $this->mapper = $mapper; + } + + /** + * Creates a new url wildcard + * + * @param string $sourceUrl + * @param string $destinationUrl + * @param boolean $forward + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function create( $sourceUrl, $destinationUrl, $forward = false ) + { + $urlWildcard = $this->mapper->createUrlWildcard( + $sourceUrl, + $destinationUrl, + $forward + ); + + $urlWildcard->id = $this->gateway->insertUrlWildcard( $urlWildcard ); + + return $urlWildcard; + } + + /** + * removes an url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + */ + public function remove( $id ) + { + $this->gateway->deleteUrlWildcard( $id ); + } + + /** + * Loads a url wild card + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function load( $id ) + { + $row = $this->gateway->loadUrlWildcardData( $id ); + + if ( empty( $row ) ) + { + throw new NotFoundException( "UrlWildcard", $id ); + } + + return $this->mapper->extractUrlWildcardFromRow( $row ); + } + + /** + * Loads all url wild card (paged) + * + * @param mixed $offset + * @param mixed $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard[] + */ + public function loadAll( $offset = 0, $limit = -1 ) + { + return $this->mapper->extractUrlWildcardsFromRows( + $this->gateway->loadUrlWildcardsData( $offset, $limit ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Mapper.php new file mode 100644 index 0000000..239afe2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Content/UrlWildcard/Mapper.php @@ -0,0 +1,86 @@ +destinationUrl = $this->cleanUrl( $destinationUrl ); + $urlWildcard->sourceUrl = $this->cleanUrl( $sourceUrl ); + $urlWildcard->forward = $forward; + + return $urlWildcard; + } + + /** + * Extracts UrlWildcard object from given database $row + * + * @param array $row + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function extractUrlWildcardFromRow( array $row ) + { + $urlWildcard = new UrlWildcard(); + + $urlWildcard->id = (int)$row["id"]; + $urlWildcard->destinationUrl = $this->cleanUrl( $row["destination_url"] ); + $urlWildcard->sourceUrl = $this->cleanUrl( $row["source_url"] ); + $urlWildcard->forward = (int)$row["type"] === 1 ? true : false; + + return $urlWildcard; + } + + /** + * @param string $url + * + * @return string + */ + protected function cleanUrl( $url ) + { + return "/" . trim( $url, "/ " ); + } + + /** + * Extracts UrlWildcard objects from database $rows + * + * @param array $rows + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard[] + */ + public function extractUrlWildcardsFromRows( array $rows ) + { + $urlWildcards = array(); + + foreach ( $rows as $row ) + { + $urlWildcards[] = $this->extractUrlWildcardFromRow( $row ); + } + + return $urlWildcards; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Exception/GroupNotEmpty.php b/eZ/Publish/Core/Persistence/Legacy/Exception/GroupNotEmpty.php new file mode 100644 index 0000000..44c348d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Exception/GroupNotEmpty.php @@ -0,0 +1,32 @@ +ezcDbHandler = $ezcDbHandler; + } + + /** + * Factory for getting EzcDbHandler handler object + * + * Will use postgres or sqlite specific wrappers if dsn indicates such databases. + * + * The DSN (data source name) defines which database to use. It's format is + * defined by the Apache Zeta Components Database component. Examples are: + * + * - mysql://root:secret@localhost/ezp + * For the MySQL database "ezp" on localhost, which will be accessed + * using user "root" with password "secret" + * - sqlite://:memory: + * for a SQLite in memory database (used e.g. for unit tests) + * + * For further information on the database setup, please refer to + * {@see http://incubator.apache.org/zetacomponents/documentation/trunk/Database/tutorial.html#handler-usage} + * + * @param string|mixed[]$dbParams + * + * @return EzcDbHandler + */ + public static function create( $dbParams ) + { + if ( !is_array( $dbParams ) ) + { + $databaseType = preg_replace( '(^([a-z]+).*)', '\\1', $dbParams ); + } + else + { + $databaseType = $dbParams['type']; + // PDOMySQL ignores the "charset" param until PHP 5.3.6. + // We then need to force it to use an init command. + // @link http://php.net/manual/en/ref.pdo-mysql.connection.php + if ( $databaseType === 'mysql' && $dbParams['charset'] === 'utf8' ) + { + $dbParams['driver-opts'] += array( + \PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', + ); + } + } + $connection = ezcDbFactory::create( $dbParams ); + + switch ( $databaseType ) + { + case 'pgsql': + $dbHandler = new Pgsql( $connection ); + break; + + case 'sqlite': + $dbHandler = new Sqlite( $connection ); + break; + + default: + $dbHandler = new self( $connection ); + } + return $dbHandler; + } + + /** + * Proxy methods to the aggregated DB handler + * + * @param string $method + * @param array $parameters + * + * @return mixed + */ + public function __call( $method, $parameters ) + { + return call_user_func_array( array( $this->ezcDbHandler, $method ), $parameters ); + } + + /** + * Creates an alias for $tableName, $columnName in $query. + * + * @param \ezcQuerySelect $query + * @param string $columnName + * @param string|null $tableName + * + * @return string + */ + public function aliasedColumn( ezcQuerySelect $query, $columnName, $tableName = null ) + { + return $query->alias( + $this->quoteColumn( $columnName, $tableName ), + $this->ezcDbHandler->quoteIdentifier( + ( $tableName ? $tableName . '_' : '' ) . + $columnName + ) + ); + } + + /** + * Returns a qualified identifier for $columnName in $tableName. + * + * @param string $columnName + * @param string $tableName + * + * @return string + */ + public function quoteColumn( $columnName, $tableName = null ) + { + // @todo: For oracle we need a mapping of table and column names to + // their shortened variants here. + return + ( $tableName ? $this->quoteTable( $tableName ) . '.' : '' ) . + $this->ezcDbHandler->quoteIdentifier( $columnName ); + } + + /** + * Returns a qualified identifier for $tableName. + * + * @param string $tableName + * + * @return string + */ + public function quoteTable( $tableName ) + { + // @todo: For oracle we need a mapping of table and column names to + // their shortened variants here. + return $this->ezcDbHandler->quoteIdentifier( $tableName ); + } + + /** + * Get auto increment value + * + * Returns the value used for autoincrement tables. Usually this will just + * be null. In case for sequence based RDBMS this method can return a + * proper value for the given column. + * + * @param string $table + * @param string $column + * + * @return mixed + */ + public function getAutoIncrementValue( $table, $column ) + { + return "null"; + } + + /** + * Returns the name of the affected sequence + * + * @param string $table + * @param string $column + * + * @return string + */ + public function getSequenceName( $table, $column ) + { + return null; + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/EzcDbHandler/Pgsql.php b/eZ/Publish/Core/Persistence/Legacy/EzcDbHandler/Pgsql.php new file mode 100644 index 0000000..b3ec2c7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/EzcDbHandler/Pgsql.php @@ -0,0 +1,52 @@ +getSequenceName( $table, $column ) . "')"; + } + + /** + * Returns the name of the affected sequence + * + * @param string $table + * @param string $column + * + * @return string + */ + public function getSequenceName( $table, $column ) + { + return $table . '_s'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/EzcDbHandler/Sqlite.php b/eZ/Publish/Core/Persistence/Legacy/EzcDbHandler/Sqlite.php new file mode 100644 index 0000000..9758b3a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/EzcDbHandler/Sqlite.php @@ -0,0 +1,117 @@ +ezcDbHandler->createSelectQuery(); + $q->select( $q->expr->max( "id" ) )->from( "ezcontentobject_attribute" ); + $statement = $q->prepare(); + $statement->execute(); + + $this->lastInsertedIds["ezcontentobject_attribute.id"] = (int)$statement->fetchColumn() + 1; + return $this->lastInsertedIds["ezcontentobject_attribute.id"]; + } + + if ( ( $table === "ezcontentclass" ) && ( $column === "id" ) ) + { + // This is a @HACK -- since this table has a multi-column key with + // auto-increment, which is not easy to simulate in SQLite. This + // solves it for now. + $q = $this->ezcDbHandler->createSelectQuery(); + $q->select( $q->expr->max( "id" ) )->from( "ezcontentclass" ); + $statement = $q->prepare(); + $statement->execute(); + + $this->lastInsertedIds["ezcontentclass.id"] = (int)$statement->fetchColumn() + 1; + return $this->lastInsertedIds["ezcontentclass.id"]; + } + + if ( ( $table === "ezcontentclass_attribute" ) && ( $column === "id" ) ) + { + // This is a @HACK -- since this table has a multi-column key with + // auto-increment, which is not easy to simulate in SQLite. This + // solves it for now. + $q = $this->ezcDbHandler->createSelectQuery(); + $q->select( $q->expr->max( "id" ) )->from( "ezcontentclass_attribute" ); + $statement = $q->prepare(); + $statement->execute(); + + $this->lastInsertedIds["ezcontentclass_attribute.id"] = (int)$statement->fetchColumn() + 1; + return $this->lastInsertedIds["ezcontentclass_attribute.id"]; + } + + return parent::getAutoIncrementValue( $table, $column ); + } + + public function lastInsertId( $sequenceName ) + { + if ( isset( $this->lastInsertedIds[$sequenceName] ) ) + { + $lastInsertId = $this->lastInsertedIds[$sequenceName]; + unset( $this->lastInsertedIds[$sequenceName] ); + return $lastInsertId; + } + else + { + return $this->ezcDbHandler->lastInsertId( $sequenceName ); + } + } + + public function getSequenceName( $table, $column ) + { + if ( ( $table === "ezcontentobject_attribute" ) && ( $column === "id" ) ) + { + return "{$table}.{$column}"; + } + + if ( ( $table === "ezcontentclass" ) && ( $column === "id" ) ) + { + return "{$table}.{$column}"; + } + + if ( ( $table === "ezcontentclass_attribute" ) && ( $column === "id" ) ) + { + return "{$table}.{$column}"; + } + + return parent::getSequenceName( $table, $column ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Handler.php b/eZ/Publish/Core/Persistence/Legacy/Handler.php new file mode 100644 index 0000000..d3394a5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Handler.php @@ -0,0 +1,903 @@ +dbHandler = $dbHandler; + $this->converterRegistry = $converterRegistry; + $this->storageRegistry = $storageRegistry; + $this->transformationProcessor = $transformationProcessor; + $this->config = $config; + } + + /** + * @internal LocationHandler is injected into property to avoid circular dependency + * + * @return \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function contentHandler() + { + if ( !isset( $this->contentHandler ) ) + { + $this->contentHandler = new ContentHandler( + $this->getContentGateway(), + $this->getLocationGateway(), + $this->getContentMapper(), + $this->getFieldHandler() + ); + $this->contentHandler->locationHandler = $this->locationHandler(); + } + return $this->contentHandler; + } + + /** + * Returns a content mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Mapper + */ + protected function getContentMapper() + { + if ( !isset( $this->contentMapper ) ) + { + $this->contentMapper = new ContentMapper( + $this->converterRegistry, + $this->contentLanguageHandler() + ); + } + return $this->contentMapper; + } + + /** + * Returns a content gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected function getContentGateway() + { + if ( !isset( $this->contentGateway ) ) + { + $this->contentGateway = new Content\Gateway\ExceptionConversion( + new Content\Gateway\EzcDatabase( + $this->dbHandler, + new Content\Gateway\EzcDatabase\QueryBuilder( $this->dbHandler ), + $this->contentLanguageHandler(), + $this->getLanguageMaskGenerator() + ) + ); + } + return $this->contentGateway; + } + + /** + * Returns a field handler + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler + */ + protected function getFieldHandler() + { + if ( !isset( $this->fieldHandler ) ) + { + $this->fieldHandler = new ContentFieldHandler( + $this->getContentGateway(), + $this->getContentTypeGateway(), + $this->getContentMapper(), + $this->getStorageHandler() + ); + } + return $this->fieldHandler; + } + + /** + * Returns a language mask generator + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator + */ + protected function getLanguageMaskGenerator() + { + if ( !isset( $this->languageMaskGenerator ) ) + { + $this->languageMaskGenerator = new Content\Language\MaskGenerator( + $this->contentLanguageHandler() + ); + } + return $this->languageMaskGenerator; + } + + /** + * Returns the field value converter registry + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + public function getFieldValueConverterRegistry() + { + return $this->converterRegistry; + } + /** + * Returns the storage registry + * + * @return Content\StorageRegistry + */ + public function getStorageRegistry() + { + return $this->storageRegistry; + } + + /** + * Returns a storage handler + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected function getStorageHandler() + { + if ( !isset( $this->storageHandler ) ) + { + $this->storageHandler = new StorageHandler( + $this->storageRegistry, + $this->getContentGateway()->getContext() + ); + } + return $this->storageHandler; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Search\Handler + */ + public function searchHandler() + { + if ( !isset( $this->searchHandler ) ) + { + $db = $this->dbHandler; + $this->searchHandler = new Content\Search\Handler( + new Content\Search\Gateway\ExceptionConversion( + new Content\Search\Gateway\EzcDatabase( + $db, + new Content\Search\Gateway\CriteriaConverter( + array( + new CriterionHandler\ContentId( $db ), + new CriterionHandler\LogicalNot( $db ), + new CriterionHandler\LogicalAnd( $db ), + new CriterionHandler\LogicalOr( $db ), + new CriterionHandler\Subtree( $db ), + new CriterionHandler\ContentTypeId( $db ), + new CriterionHandler\ContentTypeGroupId( $db ), + new CriterionHandler\DateMetadata( $db ), + new CriterionHandler\LocationId( $db ), + new CriterionHandler\ParentLocationId( $db ), + new CriterionHandler\RemoteId( $db ), + new CriterionHandler\LocationRemoteId( $db ), + new CriterionHandler\SectionId( $db ), + new CriterionHandler\Status( $db ), + new CriterionHandler\FullText( + $db, + $this->transformationProcessor + ), + new CriterionHandler\Field( + $db, + $this->converterRegistry + ), + new CriterionHandler\ObjectStateId( $db ), + new CriterionHandler\LanguageCode( + $db, + $this->getLanguageMaskGenerator() + ), + new CriterionHandler\Visibility( $db ), + ) + ), + new Content\Search\Gateway\SortClauseConverter( + array( + new SortClauseHandler\LocationPathString( $db ), + new SortClauseHandler\LocationDepth( $db ), + new SortClauseHandler\LocationPriority( $db ), + new SortClauseHandler\DateModified( $db ), + new SortClauseHandler\DatePublished( $db ), + new SortClauseHandler\SectionIdentifier( $db ), + new SortClauseHandler\SectionName( $db ), + new SortClauseHandler\ContentName( $db ), + new SortClauseHandler\ContentId( $db ), + new SortClauseHandler\Field( $db ), + ) + ), + new Content\Gateway\EzcDatabase\QueryBuilder( $this->dbHandler ), + $this->contentLanguageHandler(), + $this->getLanguageMaskGenerator() + ) + ), + $this->getContentMapper(), + $this->getFieldHandler() + ); + } + return $this->searchHandler; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + public function contentTypeHandler() + { + if ( !isset( $this->contentTypeHandler ) ) + { + $this->contentTypeHandler = new TypeHandler( + $this->getContentTypeGateway(), + new TypeMapper( $this->converterRegistry ), + $this->getTypeUpdateHandler() + ); + } + return $this->contentTypeHandler; + } + + /** + * Returns a Content Type update handler + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler + */ + protected function getTypeUpdateHandler() + { + if ( !isset( $this->typeUpdateHandler ) ) + { + if ( isset( $this->config['defer_type_update'] ) && $this->config['defer_type_update'] ) + { + $this->typeUpdateHandler = new Type\Update\Handler\DeferredLegacy( + $this->getContentGateway() + ); + } + else + { + $this->typeUpdateHandler = new Type\Update\Handler\EzcDatabase( + $this->getContentTypeGateway(), + new Type\ContentUpdater( + $this->searchHandler(), + $this->getContentGateway(), + $this->converterRegistry, + $this->getStorageHandler() + ) + ); + } + } + return $this->typeUpdateHandler; + } + + /** + * Returns the content type gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected function getContentTypeGateway() + { + if ( !isset( $this->contentTypeGateway ) ) + { + $this->contentTypeGateway = new Type\Gateway\ExceptionConversion( + new Type\Gateway\EzcDatabase( + $this->dbHandler, + $this->getLanguageMaskGenerator() + ) + ); + } + return $this->contentTypeGateway; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Language\Handler + */ + public function contentLanguageHandler() + { + if ( !isset( $this->languageHandler ) ) + { + /** + * Caching language handler, not suitable for testing + * + $this->languageHandler = new Content\Language\CachingHandler( + new Content\Language\Handler( + new Content\Language\Gateway\ExceptionConversion( + new Content\Language\Gateway\EzcDatabase( $this->dbHandler ) + ), + new LanguageMapper() + ), + $this->getLanguageCache() + ); + */ + + $this->languageHandler = new Content\Language\Handler( + new Content\Language\Gateway\ExceptionConversion( + new Content\Language\Gateway\EzcDatabase( $this->dbHandler ) + ), + new LanguageMapper() + ); + } + return $this->languageHandler; + } + + /** + * Returns a Language cache + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache + */ + protected function getLanguageCache() + { + if ( !isset( $this->languageCache ) ) + { + $this->languageCache = new Content\Language\Cache(); + } + return $this->languageCache; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function locationHandler() + { + if ( !isset( $this->locationHandler ) ) + { + $this->locationHandler = new LocationHandler( + $this->getLocationGateway(), + $this->getLocationMapper(), + $this->contentHandler(), + $this->getContentMapper() + ); + } + return $this->locationHandler; + } + + /** + * Returns a location gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase + */ + protected function getLocationGateway() + { + if ( !isset( $this->locationGateway ) ) + { + $this->locationGateway = new Content\Location\Gateway\ExceptionConversion( + new Content\Location\Gateway\EzcDatabase( $this->dbHandler ) + ); + } + return $this->locationGateway; + } + + /** + * Returns a location mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper + */ + protected function getLocationMapper() + { + if ( !isset( $this->locationMapper ) ) + { + $this->locationMapper = new LocationMapper(); + } + return $this->locationMapper; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler + */ + public function objectStateHandler() + { + if ( !isset( $this->objectStateHandler ) ) + { + $this->objectStateHandler = new ObjectStateHandler( + $this->getObjectStateGateway(), + $this->getObjectStateMapper() + ); + } + return $this->objectStateHandler; + } + + /** + * Returns an object state gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase + */ + protected function getObjectStateGateway() + { + if ( !isset( $this->objectStateGateway ) ) + { + $this->objectStateGateway = new Content\ObjectState\Gateway\ExceptionConversion( + new Content\ObjectState\Gateway\EzcDatabase( + $this->dbHandler, + $this->getLanguageMaskGenerator() + ) + ); + } + return $this->objectStateGateway; + } + + /** + * Returns an object state mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper + */ + protected function getObjectStateMapper() + { + if ( !isset( $this->objectStateMapper ) ) + { + $this->objectStateMapper = new ObjectStateMapper( + $this->contentLanguageHandler() + ); + } + return $this->objectStateMapper; + } + + /** + * @return \eZ\Publish\SPI\Persistence\User\Handler + */ + public function userHandler() + { + if ( !isset( $this->userHandler ) ) + { + $this->userHandler = new User\Handler( + new User\Gateway\ExceptionConversion( + new User\Gateway\EzcDatabase( $this->dbHandler ) + ), + new User\Role\Gateway\EzcDatabase( $this->dbHandler ), + new UserMapper() + ); + } + return $this->userHandler; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function sectionHandler() + { + if ( !isset( $this->sectionHandler ) ) + { + $this->sectionHandler = new Content\Section\Handler( + new Content\Section\Gateway\ExceptionConversion( + new Content\Section\Gateway\EzcDatabase( $this->dbHandler ) + ) + ); + } + return $this->sectionHandler; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function trashHandler() + { + if ( !isset( $this->trashHandler ) ) + { + $this->trashHandler = new TrashHandler( + $this->locationHandler(), + $this->getLocationGateway(), + $this->getLocationMapper(), + $this->contentHandler() + ); + } + + return $this->trashHandler; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler + */ + public function urlAliasHandler() + { + if ( !isset( $this->urlAliasHandler ) ) + { + $this->urlAliasHandler = new UrlAliasHandler( + $this->getUrlAliasGateway(), + $this->getUrlAliasMapper(), + $this->getLocationGateway(), + $this->contentLanguageHandler(), + $this->transformationProcessor + ); + } + + return $this->urlAliasHandler; + } + + /** + * Returns a UrlAlias gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase + */ + protected function getUrlAliasGateway() + { + if ( !isset( $this->urlAliasGateway ) ) + { + $this->urlAliasGateway = new UrlAliasExceptionConversionGateway( + new UrlAliasGateway( + $this->dbHandler, + $this->getLanguageMaskGenerator() + ) + ); + } + return $this->urlAliasGateway; + } + + /** + * Returns a UrlAlias mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper + */ + protected function getUrlAliasMapper() + { + if ( !isset( $this->urlAliasMapper ) ) + { + $this->urlAliasMapper = new UrlAliasMapper( + $this->getLanguageMaskGenerator() + ); + } + return $this->urlAliasMapper; + } + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler + */ + public function urlWildcardHandler() + { + if ( !isset( $this->urlWildcardHandler ) ) + { + $this->urlWildcardHandler = new UrlWildcardHandler( + $this->getUrlWildcardGateway(), + $this->getUrlWildcardMapper() + ); + } + + return $this->urlWildcardHandler; + } + + /** + * Returns a UrlWildcard gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase + */ + protected function getUrlWildcardGateway() + { + if ( !isset( $this->urlWildcardGateway ) ) + { + $this->urlWildcardGateway = new UrlWildcardGateway( $this->dbHandler ); + } + return $this->urlWildcardGateway; + } + + /** + * Returns a UrlWildcard mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper + */ + protected function getUrlWildcardMapper() + { + if ( !isset( $this->urlWildcardMapper ) ) + { + $this->urlWildcardMapper = new UrlWildcardMapper(); + } + return $this->urlWildcardMapper; + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + $this->dbHandler->beginTransaction(); + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit() + { + try + { + $this->dbHandler->commit(); + } + catch ( ezcDbTransactionException $e ) + { + throw new RuntimeException( $e->getMessage() ); + } + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback() + { + try + { + $this->dbHandler->rollback(); + } + catch ( ezcDbTransactionException $e ) + { + throw new RuntimeException( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ContentHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ContentHandlerTest.php new file mode 100644 index 0000000..4e4f630 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ContentHandlerTest.php @@ -0,0 +1,1379 @@ +getContentHandler(); + + $this->assertAttributeSame( + $this->getGatewayMock(), + 'contentGateway', + $handler + ); + $this->assertAttributeSame( + $this->getMapperMock(), + 'mapper', + $handler + ); + $this->assertAttributeSame( + $this->getFieldHandlerMock(), + 'fieldHandler', + $handler + ); + // @todo Assert missing properties + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::create + * @todo Current method way to complex to test, refactor! + */ + public function testCreate() + { + $handler = $this->getContentHandler(); + + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + $locationMock = $this->getLocationGatewayMock(); + + $mapperMock->expects( $this->once() ) + ->method( 'createVersionInfoFromCreateStruct' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\CreateStruct' + ) + )->will( + $this->returnValue( + new VersionInfo( + array( + "names" => array(), + "contentInfo" => new ContentInfo + ) + ) + ) + ); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertContentObject' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\CreateStruct' ) + )->will( $this->returnValue( 23 ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertVersion' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->isType( 'array' ) + )->will( $this->returnValue( 1 ) ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'createNewFields' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ) ); + + $locationMock->expects( $this->once() ) + ->method( 'createNodeAssignment' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\CreateStruct' + ), + $this->equalTo( 42 ), + $this->equalTo( 3 ) // Location\Gateway::NODE_ASSIGNMENT_OP_CODE_CREATE + ); + + $res = $handler->create( $this->getCreateStructFixture() ); + + // @todo Make subsequent tests + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content', + $res, + 'Content not created' + ); + $this->assertEquals( + 23, + $res->versionInfo->contentInfo->id, + 'Content ID not set correctly' + ); + $this->assertInstanceOf( + '\\eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo', + $res->versionInfo, + 'Version infos not created' + ); + $this->assertEquals( + 1, + $res->versionInfo->id, + 'Version ID not set correctly' + ); + $this->assertEquals( + 2, + count( $res->fields ), + 'Fields not set correctly in version' + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::publish + * + * @return void + */ + public function testPublishFirstVersion() + { + $handler = $this->getPartlyMockedHandler( array( 'loadVersionInfo', 'setStatus' ) ); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $locationMock = $this->getLocationGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + $metadataUpdateStruct = new MetadataUpdateStruct(); + + $handler->expects( $this->at( 0 ) ) + ->method( 'loadVersionInfo' ) + ->with( 23, 1 ) + ->will( + $this->returnValue( + new VersionInfo( array( "contentInfo" => new ContentInfo( array( "currentVersionNo" => 1 ) ) ) ) + ) + ); + + $gatewayMock->expects( $this->once() ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ), + $this->equalTo( null ) + )->will( + $this->returnValue( array( 42 ) ) + ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractContentFromRows' ) + ->with( $this->equalTo( array( 42 ) ) ) + ->will( $this->returnValue( array( $this->getContentFixtureForDraft() ) ) ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'loadExternalFieldData' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ) ); + + $gatewayMock + ->expects( $this->once() ) + ->method( 'updateContent' ) + ->with( 23, $metadataUpdateStruct ); + + $locationMock + ->expects( $this->once() ) + ->method( 'createLocationsFromNodeAssignments' ) + ->with( 23, 1 ); + + $locationMock + ->expects( $this->once() ) + ->method( 'updateLocationsContentVersionNo' ) + ->with( 23, 1 ); + + $handler + ->expects( $this->once() ) + ->method( 'setStatus' ) + ->with( 23, VersionInfo::STATUS_PUBLISHED, 1 ); + + $handler->publish( 23, 1, $metadataUpdateStruct ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::publish + * + * @return void + */ + public function testPublish() + { + $handler = $this->getPartlyMockedHandler( array( 'loadVersionInfo', 'setStatus' ) ); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $locationMock = $this->getLocationGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + $metadataUpdateStruct = new MetadataUpdateStruct(); + + $handler->expects( $this->at( 0 ) ) + ->method( 'loadVersionInfo' ) + ->with( 23, 2 ) + ->will( + $this->returnValue( + new VersionInfo( array( "contentInfo" => new ContentInfo( array( "currentVersionNo" => 1 ) ) ) ) + ) + ); + + $handler + ->expects( $this->at( 1 ) ) + ->method( 'setStatus' ) + ->with( 23, VersionInfo::STATUS_ARCHIVED, 1 ); + + $gatewayMock->expects( $this->once() ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 2 ), + $this->equalTo( null ) + ) + ->will( $this->returnValue( array( 42 ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractContentFromRows' ) + ->with( $this->equalTo( array( 42 ) ) ) + ->will( $this->returnValue( array( $this->getContentFixtureForDraft() ) ) ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'loadExternalFieldData' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ) ); + + $gatewayMock + ->expects( $this->once() ) + ->method( 'updateContent' ) + ->with( 23, $metadataUpdateStruct ); + + $locationMock + ->expects( $this->once() ) + ->method( 'createLocationsFromNodeAssignments' ) + ->with( 23, 2 ); + + $locationMock + ->expects( $this->once() ) + ->method( 'updateLocationsContentVersionNo' ) + ->with( 23, 2 ); + + $handler + ->expects( $this->at( 2 ) ) + ->method( 'setStatus' ) + ->with( 23, VersionInfo::STATUS_PUBLISHED, 2 ); + + $handler->publish( 23, 2, $metadataUpdateStruct ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::createDraftFromVersion + * + * @return void + */ + public function testCreateDraftFromVersion() + { + $handler = $this->getPartlyMockedHandler( array( 'load' ) ); + + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + + $handler->expects( $this->once() ) + ->method( 'load' ) + ->with( 23, 2 ) + ->will( $this->returnValue( $this->getContentFixtureForDraft() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createVersionInfoForContent' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ), + $this->equalTo( 3 ), + $this->equalTo( 14 ) + )->will( $this->returnValue( new VersionInfo( array( "names" => array() ) ) ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertVersion' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->getContentFixtureForDraft()->fields + )->will( $this->returnValue( 42 ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'getLastVersionNumber' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( 2 ) ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'createExistingFieldsInNewVersion' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ) ); + + $result = $handler->createDraftFromVersion( 23, 2, 14 ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content', + $result + ); + $this->assertEquals( + 42, + $result->versionInfo->id + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::load + * + * @return void + */ + public function testLoad() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 2 ), + $this->equalTo( array( 'eng-GB' ) ) + )->will( + $this->returnValue( array( 42 ) ) + ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractContentFromRows' ) + ->with( $this->equalTo( array( 42 ) ) ) + ->will( $this->returnValue( array( $this->getContentFixtureForDraft() ) ) ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'loadExternalFieldData' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ) ); + + $result = $handler->load( 23, 2, array( 'eng-GB' ) ); + + $this->assertEquals( + $result, + $this->getContentFixtureForDraft() + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::load + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testLoadErrorNotFound() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'load' ) + ->will( + $this->returnValue( array() ) + ); + + $result = $handler->load( 23, 2, array( 'eng-GB' ) ); + } + + /** + * Returns a Content for {@link testCreateDraftFromVersion()} + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + protected function getContentFixtureForDraft() + { + $content = new Content; + $content->versionInfo = new VersionInfo; + $content->versionInfo->versionNo = 2; + + $content->versionInfo->contentInfo = new ContentInfo; + + $field = new Field; + $field->versionNo = 2; + + $content->fields = array( $field ); + + return $content; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::updateContent + * + * @return void + */ + public function testUpdateContent() + { + $handler = $this->getPartlyMockedHandler( array( 'load', 'loadContentInfo' ) ); + + $gatewayMock = $this->getGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateContent' ) + ->with( 14, $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\MetadataUpdateStruct' ) ); + $gatewayMock->expects( $this->once() ) + ->method( 'updateVersion' ) + ->with( 14, 4, $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\UpdateStruct' ) ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'updateFields' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\UpdateStruct' ) + ); + + $handler->expects( $this->at( 0 ) ) + ->method( 'load' ) + ->with( 14, 4 ) + ->will( $this->returnValue( new Content() ) ); + + $handler->expects( $this->at( 1 ) ) + ->method( 'load' ) + ->with( 14, 4 ); + + $handler->expects( $this->at( 2 ) ) + ->method( 'loadContentInfo' ) + ->with( 14 ); + + $resultContent = $handler->updateContent( + 14, // ContentId + 4, // VersionNo + new UpdateStruct( + array( + 'creatorId' => 14, + 'modificationDate' => time(), + 'initialLanguageId' => 2, + 'fields' => array( + new Field( + array( + 'id' => 23, + 'fieldDefinitionId' => 42, + 'type' => 'some-type', + 'value' => new FieldValue(), + ) + ), + new Field( + array( + 'id' => 23, + 'fieldDefinitionId' => 43, + 'type' => 'some-type', + 'value' => new FieldValue(), + ) + ), + ) + ) + ) + ); + + $resultContentInfo = $handler->updateMetadata( + 14, // ContentId + new MetadataUpdateStruct( + array( + 'ownerId' => 14, + 'name' => 'Some name', + 'modificationDate' => time(), + 'alwaysAvailable' => true + ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::updateMetadata + */ + public function testUpdateMetadata() + { + $handler = $this->getPartlyMockedHandler( array( 'load', 'loadContentInfo' ) ); + + $gatewayMock = $this->getGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + $updateStruct = new MetadataUpdateStruct( + array( + 'ownerId' => 14, + 'name' => 'Some name', + 'modificationDate' => time(), + 'alwaysAvailable' => true + ) + ); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateContent' ) + ->with( 14, $updateStruct ); + + $handler->expects( $this->once() ) + ->method( 'loadContentInfo' ) + ->with( 14 ) + ->will( + $this->returnValue( + $this->getMock( 'eZ\\Publish\\SPI\\Persistence\\Content\\ContentInfo' ) + ) + ); + + $resultContentInfo = $handler->updateMetadata( + 14, // ContentId + $updateStruct + ); + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\ContentInfo', $resultContentInfo ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::loadRelations + */ + public function testLoadRelations() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadRelations' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( null ), + $this->equalTo( null ) + )->will( + $this->returnValue( array( 42 ) ) + ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractRelationsFromRows' ) + ->with( $this->equalTo( array( 42 ) ) ) + ->will( $this->returnValue( $this->getRelationFixture() ) ); + + $result = $handler->loadRelations( 23 ); + + $this->assertEquals( + $result, + $this->getRelationFixture() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::loadReverseRelations + */ + public function testLoadReverseRelations() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadReverseRelations' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( null ) + )->will( + $this->returnValue( array( 42 ) ) + ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractRelationsFromRows' ) + ->with( $this->equalTo( array( 42 ) ) ) + ->will( $this->returnValue( $this->getRelationFixture() ) ); + + $result = $handler->loadReverseRelations( 23 ); + + $this->assertEquals( + $result, + $this->getRelationFixture() + ); + } + + public function testAddRelation() + { + // expected relation object after creation + $expectedRelationObject = new Relation(); + $expectedRelationObject->id = 42; // mocked value, not a real one + $expectedRelationObject->sourceContentId = 23; + $expectedRelationObject->sourceContentVersionNo = 1; + $expectedRelationObject->destinationContentId = 66; + $expectedRelationObject->type = RelationValue::COMMON; + + // relation create struct + $relationCreateStruct = new Relation\CreateStruct(); + $relationCreateStruct->destinationContentId = 66; + $relationCreateStruct->sourceContentId = 23; + $relationCreateStruct->sourceContentVersionNo = 1; + $relationCreateStruct->type = RelationValue::COMMON; + + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + + $mapperMock->expects( $this->once() ) + ->method( 'createRelationFromCreateStruct' ) + // @todo Connected with the todo above + ->with( $this->equalTo( $relationCreateStruct ) ) + ->will( $this->returnValue( $expectedRelationObject ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertRelation' ) + ->with( $this->equalTo( $relationCreateStruct ) ) + ->will( + // @todo Should this return a row as if it was selected from the database, the id... ? Check with other, similar create methods + $this->returnValue( 42 ) + ); + + $result = $handler->addRelation( $relationCreateStruct ); + + $this->assertEquals( + $result, + $expectedRelationObject + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::removeRelation + */ + public function testRemoveRelation() + { + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'deleteRelation' ) + ->with( $this->equalTo( 1 ) ); + + $result = $this->getContentHandler()->removeRelation( 1 ); + } + + protected function getRelationFixture() + { + $relation = new Relation(); + $relation->sourceContentId = 23; + $relation->sourceContentVersionNo = 1; + $relation->destinationContentId = 69; + + return $relation; + } + + /** + * Returns a CreateStruct fixture. + * + * @return \eZ\Publish\SPI\Persistence\Content\CreateStruct + */ + public function getCreateStructFixture() + { + $struct = new CreateStruct(); + + $firstField = new Field(); + $firstField->type = 'some-type'; + $firstField->value = new FieldValue(); + + $secondField = clone $firstField; + + $struct->fields = array( + $firstField, $secondField + ); + + $struct->locations = array( + new LocationCreateStruct( + array( 'parentId' => 42 ) + ) + ); + + $struct->name = array( + 'eng-GB' => 'This is a test name' + ); + + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::loadDraftsForUser + */ + public function testLoadDraftsForUser() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'listVersionsForUser' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractVersionInfoListFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new VersionInfo() ) ) ); + + $res = $handler->loadDraftsForUser( 23 ); + + $this->assertEquals( + array( new VersionInfo() ), + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::listVersions + * + * @return void + */ + public function testListVersions() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'listVersions' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractVersionInfoListFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new VersionInfo() ) ) ); + + $res = $handler->listVersions( 23 ); + + $this->assertEquals( + array( new VersionInfo() ), + $res + ); + } + + /** + * Test for the removeRawContent() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Handler::removeRawContent + */ + public function testRemoveRawContent() + { + $handler = $this->getPartlyMockedHandler( array( "loadContentInfo" ) ); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + $locationGatewayMock = $this->getLocationGatewayMock(); + + // Method needs to list versions + $mapperMock->expects( $this->once() ) + ->method( 'extractVersionInfoListFromRows' ) + ->will( $this->returnValue( array( new VersionInfo(), new VersionInfo() ) ) ); + $gatewayMock->expects( $this->once() ) + ->method( 'listVersions' ) + ->will( $this->returnValue( array() ) ); + + // Normal delete process + $fieldHandlerMock->expects( $this->exactly( 2 ) ) + ->method( "deleteFields" ) + ->with( + $this->equalTo( 23 ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ) + ); + $gatewayMock->expects( $this->once() ) + ->method( "deleteRelations" ) + ->with( $this->equalTo( 23 ) ); + $gatewayMock->expects( $this->once() ) + ->method( "deleteVersions" ) + ->with( $this->equalTo( 23 ) ); + $gatewayMock->expects( $this->once() ) + ->method( "deleteNames" ) + ->with( $this->equalTo( 23 ) ); + $gatewayMock->expects( $this->once() ) + ->method( "deleteContent" ) + ->with( $this->equalTo( 23 ) ); + + $handler->expects( $this->once() ) + ->method( 'loadContentInfo' ) + ->with( 23 ) + ->will( $this->returnValue( new ContentInfo( array( "mainLocationId" => 42 ) ) ) ); + $locationGatewayMock->expects( $this->once() ) + ->method( "removeElementFromTrash" ) + ->with( $this->equalTo( 42 ) ); + + $handler->removeRawContent( 23 ); + } + + /** + * Test for the deleteContent() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::deleteContent + * + * @return void + */ + public function testDeleteContentWithLocations() + { + $handlerMock = $this->getPartlyMockedHandler( array( "getAllLocationIds" ) ); + $gatewayMock = $this->getGatewayMock(); + $locationHandlerMock = $this->getLocationHandlerMock(); + + $gatewayMock->expects( $this->once() ) + ->method( "getAllLocationIds" ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( array( 42, 24 ) ) ); + $locationHandlerMock->expects( $this->exactly( 2 ) ) + ->method( "removeSubtree" ) + ->with( + $this->logicalOr( + $this->equalTo( 42 ), + $this->equalTo( 24 ) + ) + ); + + $handlerMock->deleteContent( 23 ); + } + + /** + * Test for the deleteContent() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::deleteContent + * + * @return void + */ + public function testDeleteContentWithoutLocations() + { + $handlerMock = $this->getPartlyMockedHandler( array( "removeRawContent" ) ); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( "getAllLocationIds" ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( array() ) ); + $handlerMock->expects( $this->once() ) + ->method( "removeRawContent" ) + ->with( $this->equalTo( 23 ) ); + + $handlerMock->deleteContent( 23 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::deleteVersion + * + * @return void + */ + public function testDeleteVersion() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $locationHandlerMock = $this->getLocationGatewayMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + + // Load VersionInfo to delete fields + $mapperMock->expects( $this->once() ) + ->method( 'extractVersionInfoListFromRows' ) + ->will( $this->returnValue( array( new VersionInfo() ) ) ); + $gatewayMock->expects( $this->once() ) + ->method( 'loadVersionInfo' ) + ->will( $this->returnValue( array( 42 ) ) ); + + $locationHandlerMock->expects( $this->once() ) + ->method( 'deleteNodeAssignment' ) + ->with( + $this->equalTo( 225 ), + $this->equalTo( 2 ) + ); + + $fieldHandlerMock->expects( $this->once() ) + ->method( 'deleteFields' ) + ->with( + $this->equalTo( 225 ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ) + ); + $gatewayMock->expects( $this->once() ) + ->method( 'deleteRelations' ) + ->with( + $this->equalTo( 225 ), + $this->equalTo( 2 ) + ); + $gatewayMock->expects( $this->once() ) + ->method( 'deleteVersions' ) + ->with( + $this->equalTo( 225 ), + $this->equalTo( 2 ) + ); + $gatewayMock->expects( $this->once() ) + ->method( 'deleteNames' ) + ->with( + $this->equalTo( 225 ), + $this->equalTo( 2 ) + ); + + $handler->deleteVersion( 225, 2 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::copy + * + * @return void + */ + public function testCopySingleVersion() + { + $handler = $this->getPartlyMockedHandler( array( "load", "internalCreate" ) ); + $mapperMock = $this->getMapperMock(); + + $handler->expects( + $this->once() + )->method( + "load" + )->with( + $this->equalTo( 23 ), + $this->equalTo( 32 ) + )->will( + $this->returnValue( new Content() ) + ); + + $mapperMock->expects( + $this->once() + )->method( + "createCreateStructFromContent" + )->with( + $this->isInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content" ) + )->will( + $this->returnValue( new CreateStruct() ) + ); + + $handler->expects( + $this->once() + )->method( + "internalCreate" + )->with( + $this->isInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\CreateStruct" ), + $this->equalTo( 32 ) + )->will( + $this->returnValue( new Content() ) + ); + + $result = $handler->copy( 23, 32 ); + + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\Persistence\\Content", + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::copy + * + * @return void + */ + public function testCopyAllVersions() + { + $handler = $this->getPartlyMockedHandler( + array( + "loadContentInfo", + "load", + "internalCreate", + "listVersions" + ) + ); + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $fieldHandlerMock = $this->getFieldHandlerMock(); + + $handler->expects( $this->once() ) + ->method( "loadContentInfo" ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( new ContentInfo( array( "currentVersionNo" => 2 ) ) ) ); + + $handler->expects( $this->at( 1 ) ) + ->method( "load" ) + ->with( $this->equalTo( 23 ), $this->equalTo( 2 ) ) + ->will( $this->returnValue( new Content() ) ); + + $time = time(); + $mapperMock->expects( $this->once() ) + ->method( "createCreateStructFromContent" ) + ->with( $this->isInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content" ) ) + ->will( + $this->returnValue( + new CreateStruct( array( "modified" => $time ) ) + ) + ); + + $handler->expects( $this->once() ) + ->method( "internalCreate" ) + ->with( + $this->isInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\CreateStruct" ), + $this->equalTo( 2 ) + )->will( + $this->returnValue( + new Content( + array( + "versionInfo" => new VersionInfo( + array( + "contentInfo" => new ContentInfo( array( "id" => 24 ) ) + ) + ) + ) + ) + ) + ); + + $handler->expects( $this->once() ) + ->method( "listVersions" ) + ->with( $this->equalTo( 23 ) ) + ->will( + $this->returnValue( + array( + new VersionInfo( array( "versionNo" => 1 ) ), + new VersionInfo( array( "versionNo" => 2 ) ) + ) + ) + ); + + $versionInfo = new VersionInfo( + array( + "names" => array( "eng-US" => "Test" ), + "contentInfo" => new ContentInfo( + array( + "id" => 24, + "alwaysAvailable" => true + ) + ), + ) + ); + $handler->expects( $this->at( 4 ) ) + ->method( "load" ) + ->with( $this->equalTo( 23 ), $this->equalTo( 1 ) ) + ->will( + $this->returnValue( + new Content( + array( + "versionInfo" => $versionInfo, + "fields" => array() + ) + ) + ) + ); + + $versionInfo->creationDate = $time; + $versionInfo->modificationDate = $time; + $gatewayMock->expects( $this->once() ) + ->method( "insertVersion" ) + ->with( + $this->equalTo( $versionInfo ), + $this->isType( "array" ) + )->will( $this->returnValue( 42 ) ); + + $versionInfo = clone $versionInfo; + $versionInfo->id = 42; + $fieldHandlerMock->expects( $this->once() ) + ->method( "createNewFields" ) + ->with( + $this->equalTo( + new Content( + array( + "versionInfo" => $versionInfo, + "fields" => array() + ) + ) + ) + ); + + $gatewayMock->expects( $this->once() ) + ->method( "setName" ) + ->with( + $this->equalTo( 24 ), + $this->equalTo( 1 ), + $this->equalTo( "Test" ), + $this->equalTo( "eng-US" ) + ); + + $result = $handler->copy( 23 ); + + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\Persistence\\Content", + $result + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::copy + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testCopyThrowsNotFoundExceptionContentNotFound() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( "loadContentInfo" ) + ->with( $this->equalTo( 23 ) ) + ->will( + $this->throwException( new NotFoundException( "ContentInfo", 23 ) ) + ); + + $result = $handler->copy( 23 ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::copy + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testCopyThrowsNotFoundExceptionVersionNotFound() + { + $handler = $this->getContentHandler(); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( "load" ) + ->with( $this->equalTo( 23, 32 ) ) + ->will( $this->returnValue( array() ) ); + + $result = $handler->copy( 23, 32 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Handler::setStatus + * + * @return void + */ + public function testSetStatus() + { + $handler = $this->getContentHandler(); + + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'setStatus' ) + ->with( 23, 5, 2 ) + ->will( $this->returnValue( true ) ); + + $this->assertTrue( + $handler->setStatus( 23, 2, 5 ) + ); + } + + /** + * Returns the handler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Handler + */ + protected function getContentHandler() + { + if ( !isset( $this->contentHandler ) ) + { + $this->contentHandler = new Handler( + $this->getGatewayMock(), + $this->getLocationGatewayMock(), + $this->getMapperMock(), + $this->getFieldHandlerMock() + ); + $this->contentHandler->locationHandler = $this->getLocationHandlerMock(); + } + return $this->contentHandler; + } + + /** + * Returns the handler to test with $methods mocked + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Handler + */ + protected function getPartlyMockedHandler( array $methods ) + { + $mock = $this->getMock( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Handler', + $methods, + array( + $this->getGatewayMock(), + $this->getLocationGatewayMock(), + $this->getMapperMock(), + $this->getFieldHandlerMock() + ) + ); + $mock->locationHandler = $this->getLocationHandlerMock(); + return $mock; + } + + /** + * Returns a LocationHandler mock. + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Handler + */ + protected function getLocationHandlerMock() + { + if ( !isset( $this->locationHandlerMock ) ) + { + $this->locationHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Handler', + array(), + array(), + '', + false + ); + } + return $this->locationHandlerMock; + } + + /** + * Returns a FieldHandler mock. + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler + */ + protected function getFieldHandlerMock() + { + if ( !isset( $this->fieldHandlerMock ) ) + { + $this->fieldHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldHandler', + array(), + array(), + '', + false + ); + } + return $this->fieldHandlerMock; + } + + /** + * Returns a Mapper mock. + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Mapper + */ + protected function getMapperMock() + { + if ( !isset( $this->mapperMock ) ) + { + $this->mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper', + array(), + array(), + '', + false + ); + } + return $this->mapperMock; + } + + /** + * Returns a Location Gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway + */ + protected function getLocationGatewayMock() + { + if ( !isset( $this->locationGatewayMock ) ) + { + $this->locationGatewayMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Gateway' + ); + } + return $this->locationGatewayMock; + } + + /** + * Returns a Content Type gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected function getTypeGatewayMock() + { + if ( !isset( $this->typeGatewayMock ) ) + { + $this->typeGatewayMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Gateway' + ); + } + return $this->typeGatewayMock; + } + + /** + * Returns a mock object for the Content Gateway. + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected function getGatewayMock() + { + if ( !isset( $this->gatewayMock ) ) + { + $this->gatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Gateway' + ); + } + return $this->gatewayMock; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php new file mode 100644 index 0000000..7bbfc78 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldHandlerTest.php @@ -0,0 +1,403 @@ +getFieldHandler(); + + $mapperMock = $this->getMapperMock(); + $contentGatewayMock = $this->getContentGatewayMock(); + $storageHandlerMock = $this->getStorageHandlerMock(); + + $mapperMock->expects( $this->exactly( 2 ) ) + ->method( 'convertToStorageValue' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' + ) + )->will( + $this->returnValue( new StorageFieldValue() ) + ); + + $contentGatewayMock->expects( $this->exactly( 2 ) ) + ->method( 'insertNewField' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ), + $this->isInstanceOf( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldValue' ) + )->will( $this->returnValue( 42 ) ); + + $storageHandlerMock->expects( $this->exactly( 2 ) ) + ->method( 'storeFieldData' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ) + ); + + $fieldHandler->createNewFields( $this->getContentFixture() ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::createNewFields + * + * @return void + */ + public function testCreateNewFieldsUpdatingStorageHandler() + { + self::markTestIncomplete( "@todo Test createNewField() with updating storage handler and 1 untranslatable field" ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::loadExternalFieldData + * + * @return void + */ + public function testLoadExternalFieldData() + { + $fieldHandler = $this->getFieldHandler(); + + $storageHandlerMock = $this->getStorageHandlerMock(); + + $storageHandlerMock->expects( $this->exactly( 2 ) ) + ->method( 'getFieldData' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ) + ); + + $fieldHandler->loadExternalFieldData( $this->getContentFixture() ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::updateFields + * + * @return void + */ + public function testUpdateFieldsTranslatable() + { + $fieldHandler = $this->getFieldHandler(); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->exactly( 2 ) ) + ->method( 'convertToStorageValue' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ) ) + ->will( $this->returnValue( new StorageFieldValue() ) ); + + $contentGatewayMock = $this->getContentGatewayMock(); + $contentGatewayMock->expects( $this->exactly( 2 ) ) + ->method( 'updateField' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldValue' + ) + ); + + $storageHandlerMock = $this->getStorageHandlerMock(); + $storageHandlerMock->expects( $this->exactly( 2 ) ) + ->method( 'storeFieldData' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ) + ); + + $fieldHandler->updateFields( + $this->getContentFixture(), + $this->getUpdateStructFixture() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::updateFields + * + * @return void + */ + public function testUpdateFieldsUpdatingStorageHandlerNonTranslatable() + { + self::markTestIncomplete( "@todo Test updateFields() with updating storage handler and untranslatable fields" ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::updateFields + * + * @return void + */ + public function testUpdateFieldsUpdatingStorageHandlerTranslatable() + { + self::markTestIncomplete( "@todo Test updateFields() with updating storage handler and translatable fields" ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::updateFields + * + * @return void + */ + public function testUpdateFieldsCreatesNewFields() + { + $partlyMockedFieldHandler = $this->getPartlyMockedFieldHandler( array( "createNewField" ) ); + + $partlyMockedFieldHandler->expects( $this->exactly( 2 ) ) + ->method( 'createNewField' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ), + $this->equalTo( $this->getContentFixture() ) + ); + + $partlyMockedFieldHandler->updateFields( + $this->getContentFixture(), + $this->getUpdateStructFixture( false ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler::deleteFields + * + * @return void + */ + public function testDeleteFields() + { + $fieldHandler = $this->getFieldHandler(); + + $contentGatewayMock = $this->getContentGatewayMock(); + $contentGatewayMock->expects( $this->once() ) + ->method( 'getFieldIdsByType' ) + ->with( + $this->equalTo( 42 ), + $this->equalTo( 2 ) + )->will( $this->returnValue( array( 'some-type' => array( 2, 3 ) ) ) ); + + $storageHandlerMock = $this->getStorageHandlerMock(); + $storageHandlerMock->expects( $this->once() ) + ->method( 'deleteFieldData' ) + ->with( + $this->equalTo( 'some-type' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->equalTo( array( 2, 3 ) ) + ); + + $contentGatewayMock->expects( $this->once() ) + ->method( 'deleteFields' ) + ->with( + $this->equalTo( 42 ), + $this->equalTo( 2 ) + ); + + $fieldHandler->deleteFields( 42, new VersionInfo( array( 'versionNo' => 2 ) ) ); + } + + /** + * Returns a Content fixture + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + protected function getContentFixture() + { + $content = new Content; + $content->versionInfo = new VersionInfo; + $content->versionInfo->versionNo = 2; + $content->versionInfo->contentInfo = new ContentInfo; + $content->versionInfo->contentInfo->id = 42; + + $firstField = new Field(); + $firstField->type = 'some-type'; + $firstField->fieldDefinitionId = 23; + $firstField->value = new FieldValue; + + $secondField = clone $firstField; + + $content->fields = array( + $firstField, $secondField + ); + + return $content; + } + + /** + * Returns an UpdateStruct fixture + * + * @param boolean $setIds + * + * @return \eZ\Publish\SPI\Persistence\Content\UpdateStruct + */ + protected function getUpdateStructFixture( $setIds = true ) + { + $struct = new UpdateStruct(); + + $content = $this->getContentFixture(); + + $struct->fields = $content->fields; + if ( $setIds ) + { + foreach ( $struct->fields as $index => $field ) + { + $field->id = $index; + } + } + + return $struct; + } + + /** + * Returns a FieldHandler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler + */ + protected function getFieldHandler() + { + return new FieldHandler( + $this->getContentGatewayMock(), + $this->getTypeGatewayMock(), + $this->getMapperMock(), + $this->getStorageHandlerMock() + ); + } + + /** + * Returns the handler to test with $methods mocked + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler + */ + protected function getPartlyMockedFieldHandler( array $methods ) + { + return $this->getMock( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldHandler', + $methods, + array( + $this->getContentGatewayMock(), + $this->getTypeGatewayMock(), + $this->getMapperMock(), + $this->getStorageHandlerMock() + ) + ); + } + + /** + * Returns a StorageHandler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected function getStorageHandlerMock() + { + if ( !isset( $this->storageHandlerMock ) ) + { + $this->storageHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageHandler', + array(), + array(), + '', + false + ); + } + return $this->storageHandlerMock; + } + + /** + * Returns a Mapper mock. + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Mapper + */ + protected function getMapperMock() + { + if ( !isset( $this->mapperMock ) ) + { + $this->mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper', + array(), + array(), + '', + false + ); + } + return $this->mapperMock; + } + + /** + * Returns a Content Type gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected function getTypeGatewayMock() + { + if ( !isset( $this->typeGatewayMock ) ) + { + $this->typeGatewayMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Gateway' + ); + } + return $this->typeGatewayMock; + } + + /** + * Returns a mock object for the Content Gateway. + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected function getContentGatewayMock() + { + if ( !isset( $this->contentGatewayMock ) ) + { + $this->contentGatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Gateway' + ); + } + return $this->contentGatewayMock; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/AuthorTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/AuthorTest.php new file mode 100644 index 0000000..2e5b8db --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/AuthorTest.php @@ -0,0 +1,132 @@ +converter = new AuthorConverter; + $this->authors = array( + array( 'id' => 21, 'name' => 'Boba Fett', 'email' => 'boba.fett@bountyhunters.com' ), + array( 'id' => 42, 'name' => 'Darth Vader', 'email' => 'darth.vader@evilempire.biz' ), + array( 'id' => 63, 'name' => 'Luke Skywalker', 'email' => 'luke@imtheone.net' ) + ); + } + + protected function tearDown() + { + unset( $this->authors ); + parent::tearDown(); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Author::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = $this->authors; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + $doc = new DOMDocument( '1.0', 'utf-8' ); + self::assertTrue( $doc->loadXML( $storageFieldValue->dataText ) ); + + $authorsXml = $doc->getElementsByTagName( 'author' ); + self::assertSame( count( $this->authors ), $authorsXml->length ); + + // Loop against XML nodes and compare them to the real Author objects. + // Then remove Author from $this->authors + // This way, we can check if all authors have been converted in XML + foreach ( $authorsXml as $authorXml ) + { + foreach ( $this->authors as $i => $author ) + { + if ( $authorXml->getAttribute( 'id' ) == $author["id"] ) + { + self::assertSame( $author["name"], $authorXml->getAttribute( 'name' ) ); + self::assertSame( $author["email"], $authorXml->getAttribute( 'email' ) ); + unset( $this->authors[$i] ); + break; + } + } + } + + self::assertEmpty( $this->authors, 'All authors have not been converted as expected' ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Author::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataText = << + + + + + + + +EOT; + $doc = new DOMDocument( '1.0', 'utf-8' ); + self::assertTrue( $doc->loadXML( $storageFieldValue->dataText ) ); + $authorsXml = $doc->getElementsByTagName( 'author' ); + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertInternalType( 'array', $fieldValue->data ); + + $authorsXml = $doc->getElementsByTagName( 'author' ); + self::assertSame( $authorsXml->length, count( $fieldValue->data ) ); + + $aAuthors = $fieldValue->data; + foreach ( $fieldValue->data as $i => $author ) + { + foreach ( $authorsXml as $authorXml ) + { + if ( $authorXml->getAttribute( 'id' ) == $author["id"] ) + { + self::assertSame( $authorXml->getAttribute( 'name' ), $author["name"] ); + self::assertSame( $authorXml->getAttribute( 'email' ), $author["email"] ); + unset($aAuthors[$i]); + break; + } + } + } + self::assertEmpty( $aAuthors, 'All authors have not been converted as expected from storage' ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/CheckboxTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/CheckboxTest.php new file mode 100644 index 0000000..621d2fa --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/CheckboxTest.php @@ -0,0 +1,114 @@ +converter = new CheckboxConverter; + } + + /** + * @group fieldType + * @group ezboolean + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Checkbox::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = true; + $value->sortKey = 1; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( (int)$value->data, $storageFieldValue->dataInt ); + self::assertSame( $value->sortKey, $storageFieldValue->sortKeyInt ); + self::assertSame( '', $storageFieldValue->sortKeyString ); + } + + /** + * @group fieldType + * @group ezboolean + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Checkbox::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataInt = 1; + $storageFieldValue->sortKeyInt = 1; + $storageFieldValue->sortKeyString = ''; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( (bool)$storageFieldValue->dataInt, $fieldValue->data ); + self::assertSame( $storageFieldValue->sortKeyInt, $fieldValue->sortKey ); + } + + /** + * @group fieldType + * @group ezboolean + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Checkbox::toStorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $defaultBool = false; + $storageFieldDef = new StorageFieldDefinition; + $defaultValue = new FieldValue; + $defaultValue->data = $defaultBool; + $fieldDef = new PersistenceFieldDefinition( + array( + 'defaultValue' => $defaultValue + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + (int)$fieldDef->defaultValue->data, + $storageFieldDef->dataInt3 + ); + } + + /** + * @group fieldType + * @group ezboolean + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Checkbox::toFieldDefinition + */ + public function testToFieldDefinition() + { + $defaultBool = true; + $fieldDef = new PersistenceFieldDefinition; + $storageDef = new StorageFieldDefinition( + array( + 'dataInt3' => 1, + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertSame( $defaultBool, $fieldDef->defaultValue->data ); + self::assertNull( $fieldDef->fieldTypeConstraints->fieldSettings ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/CountryTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/CountryTest.php new file mode 100644 index 0000000..cbaba23 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/CountryTest.php @@ -0,0 +1,210 @@ +converter = new CountryConverter(); + } + + public function providerForTestToStorageValue() + { + return array( + array( array( "BE", "FR" ), "belgium,france", "BE,FR", "belgium,france" ), + array( null, "", "", "" ), + ); + } + + /** + * @group fieldType + * @group country + * @dataProvider providerForTestToStorageValue + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::toStorageValue + */ + public function testToStorageValue( $data, $sortKey, $dataText, $sortKeyString ) + { + $value = new FieldValue; + $value->data = $data; + $value->sortKey = $sortKey; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( $dataText, $storageFieldValue->dataText ); + self::assertSame( $sortKeyString, $storageFieldValue->sortKeyString ); + } + + public function providerForTestToFieldValue() + { + return array( + array( "BE,FR", "belgium,france", array( "BE", "FR" ) ), + array( "", "", null ), + ); + } + + /** + * @group fieldType + * @group country + * @dataProvider providerForTestToFieldValue + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::toFieldValue + */ + public function testToFieldValue( $dataText, $sortKeyString, $data ) + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataText = $dataText; + $storageFieldValue->sortKeyString = $sortKeyString; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( $data, $fieldValue->data ); + } + + /** + * @group fieldType + * @group country + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionMultiple() + { + $defaultValue = new FieldValue; + $defaultValue->data = array( "BE", "FR" ); + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + "isMultiple" => true + ) + ); + + $storageFieldDef = new StorageFieldDefinition; + $this->converter->toStorageFieldDefinition( + new PersistenceFieldDefinition( + array( + "fieldTypeConstraints" => $fieldTypeConstraints, + "defaultValue" => $defaultValue, + ) + ), + $storageFieldDef + ); + self::assertSame( + 1, + $storageFieldDef->dataInt1 + ); + self::assertSame( + "BE,FR", + $storageFieldDef->dataText5 + ); + } + + /** + * @group fieldType + * @group country + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionSingle() + { + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + "isMultiple" => false, + ) + ); + + $storageFieldDef = new StorageFieldDefinition; + $this->converter->toStorageFieldDefinition( + new PersistenceFieldDefinition( + array( + "fieldTypeConstraints" => $fieldTypeConstraints, + ) + ), + $storageFieldDef + ); + self::assertSame( + 0, + $storageFieldDef->dataInt1 + ); + self::assertEmpty( + $storageFieldDef->dataText5 + ); + } + + /** + * @group fieldType + * @group country + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::toFieldDefinition + */ + public function testToFieldDefinitionMultiple() + { + $fieldDef = new PersistenceFieldDefinition; + + $this->converter->toFieldDefinition( + new StorageFieldDefinition( + array( + "dataInt1" => 1, + "dataText5" => 'BE,FR', + ) + ), + $fieldDef + ); + self::assertInstanceOf( "eZ\\Publish\\Core\\FieldType\\FieldSettings", $fieldDef->fieldTypeConstraints->fieldSettings ); + self::assertTrue( + $fieldDef->fieldTypeConstraints->fieldSettings["isMultiple"] + ); + self::assertEquals( + array( "BE", "FR" ), + $fieldDef->defaultValue->data + ); + } + + /** + * @group fieldType + * @group country + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::toFieldDefinition + */ + public function testToFieldDefinitionSingle() + { + $fieldDef = new PersistenceFieldDefinition; + + $this->converter->toFieldDefinition( + new StorageFieldDefinition( + array( + "dataInt1" => 0, + "dataText5" => '' + ) + ), + $fieldDef + ); + self::assertInstanceOf( "eZ\\Publish\\Core\\FieldType\\FieldSettings", $fieldDef->fieldTypeConstraints->fieldSettings ); + self::assertFalse( + $fieldDef->fieldTypeConstraints->fieldSettings["isMultiple"] + ); + self::assertNull( + $fieldDef->defaultValue->data + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/DateAndTimeTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/DateAndTimeTest.php new file mode 100644 index 0000000..9f47107 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/DateAndTimeTest.php @@ -0,0 +1,389 @@ +converter = new DateAndTimeConverter; + $this->date = new DateTime( '@1048633200' ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = array( + 'timestamp' => $this->date->getTimestamp(), + 'rfc850' => $this->date->format( \DateTime::RFC850 ), + ); + $value->sortKey = $this->date->getTimestamp(); + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( $value->data['timestamp'], $storageFieldValue->dataInt ); + self::assertSame( $value->sortKey, $storageFieldValue->sortKeyInt ); + self::assertSame( '', $storageFieldValue->sortKeyString ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataInt = $this->date->getTimestamp(); + $storageFieldValue->sortKeyString = ''; + $storageFieldValue->sortKeyInt = $this->date->getTimestamp(); + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( + array( + 'rfc850' => null, + 'timestamp' => 1048633200, + ), + $fieldValue->data + ); + self::assertSame( $storageFieldValue->dataInt, $fieldValue->data['timestamp'] ); + self::assertSame( $storageFieldValue->sortKeyInt, $fieldValue->sortKey ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionWithAdjustment() + { + $storageFieldDef = new StorageFieldDefinition; + $dateInterval = DateInterval::createFromDateString( '+10 years, -1 month, +3 days, -13 hours' ); + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'useSeconds' => true, + 'defaultType' => DateAndTimeType::DEFAULT_CURRENT_DATE_ADJUSTED, + 'dateInterval' => $dateInterval + ) + ); + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + DateAndTimeType::DEFAULT_CURRENT_DATE_ADJUSTED, + $storageFieldDef->dataInt1 + ); + self::assertSame( + 1, + $storageFieldDef->dataInt2 + ); + + $xml = new SimpleXMLElement( $storageFieldDef->dataText5 ); + foreach ( $this->getXMLToDateIntervalMap() as $xmlNode => $property ) + { + self::assertSame( + $dateInterval->format( "%$property" ), + (string)$xml->{$xmlNode}['value'] + ); + } + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionNoDefault() + { + $storageFieldDef = new StorageFieldDefinition; + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'useSeconds' => true, + 'defaultType' => DateAndTimeType::DEFAULT_EMPTY, + 'dateInterval' => null + ) + ); + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + DateAndTimeType::DEFAULT_EMPTY, + $storageFieldDef->dataInt1 + ); + self::assertSame( + 1, + $storageFieldDef->dataInt2 + ); + self::assertNull( $storageFieldDef->dataText5 ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionCurrentDate() + { + $storageFieldDef = new StorageFieldDefinition; + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'useSeconds' => true, + 'defaultType' => DateAndTimeType::DEFAULT_CURRENT_DATE, + 'dateInterval' => null + ) + ); + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + DateAndTimeType::DEFAULT_CURRENT_DATE, + $storageFieldDef->dataInt1 + ); + self::assertSame( + 1, + $storageFieldDef->dataInt2 + ); + self::assertNull( $storageFieldDef->dataText5 ); + } + + /** + * Returns map from internal XML nodes to DateInterval properties for date adjustment + * + * @return array Key is the XML node name, value is the DateInterval property + */ + private function getXMLToDateIntervalMap() + { + return array( + 'year' => 'y', + 'month' => 'm', + 'day' => 'd', + 'hour' => 'h', + 'minute' => 'i', + 'second' => 's' + ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toFieldDefinition + */ + public function testToFieldDefinitionNoDefault() + { + $fieldDef = new PersistenceFieldDefinition; + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => DateAndTimeType::DEFAULT_EMPTY, + 'dataInt2' => 1 + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertNull( $fieldDef->defaultValue->data ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toFieldDefinition + */ + public function testToFieldDefinitionCurrentDate() + { + $time = time(); + $fieldDef = new PersistenceFieldDefinition; + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => DateAndTimeType::DEFAULT_CURRENT_DATE, + 'dataInt2' => 1 + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertInternalType( 'array', $fieldDef->defaultValue->data ); + self::assertCount( 2, $fieldDef->defaultValue->data ); + self::assertNull( $fieldDef->defaultValue->data["rfc850"] ); + self::assertGreaterThanOrEqual( $time, $fieldDef->defaultValue->data["timestamp"] ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toFieldDefinition + */ + public function testToFieldDefinitionWithAdjustmentAndSeconds() + { + $fieldDef = new PersistenceFieldDefinition; + $dateInterval = DateInterval::createFromDateString( '2 years, 1 month, -4 days, 2 hours, 0 minute, 34 seconds' ); + $date = new DateTime; + $date->add( $dateInterval ); + $timestamp = $date->getTimestamp(); + + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => DateAndTimeType::DEFAULT_CURRENT_DATE_ADJUSTED, + 'dataInt2' => 1, + 'dataText5' => $this->getXMLStringFromDateInterval( $dateInterval ) + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertInternalType( 'array', $fieldDef->defaultValue->data ); + self::assertCount( 2, $fieldDef->defaultValue->data ); + self::assertNull( $fieldDef->defaultValue->data["rfc850"] ); + self::assertGreaterThanOrEqual( $timestamp, $fieldDef->defaultValue->data["timestamp"] ); + // Giving a margin of 1 second for test execution + self::assertLessThanOrEqual( $timestamp + 1, $fieldDef->defaultValue->data["timestamp"] ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::toFieldDefinition + */ + public function testToFieldDefinitionWithAdjustmentNoSeconds() + { + $fieldDef = new PersistenceFieldDefinition; + $seconds = 34; + $dateInterval = DateInterval::createFromDateString( "2 years, 1 month, -4 days, 2 hours, 0 minute, $seconds seconds" ); + $date = new DateTime; + $date->add( $dateInterval ); + // Removing $seconds as they're not supposed to be taken into account + $timestamp = $date->getTimestamp() - $seconds; + + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => DateAndTimeType::DEFAULT_CURRENT_DATE_ADJUSTED, + 'dataInt2' => 0, + 'dataText5' => $this->getXMLStringFromDateInterval( $dateInterval ) + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertInternalType( 'array', $fieldDef->defaultValue->data ); + self::assertCount( 2, $fieldDef->defaultValue->data ); + self::assertNull( $fieldDef->defaultValue->data["rfc850"] ); + self::assertGreaterThanOrEqual( $timestamp, $fieldDef->defaultValue->data["timestamp"] ); + // Giving a margin of 1 second for test execution + self::assertLessThanOrEqual( $timestamp + 1, $fieldDef->defaultValue->data["timestamp"] ); + } + + /** + * Generates XML string from $dateInterval + * + * @param \DateInterval $dateInterval + * + * @return string + */ + private function getXMLStringFromDateInterval( DateInterval $dateInterval ) + { + $xmlString = << + + + + + + + + +EOT; + return $xmlString; + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::getDateIntervalFromXML + */ + public function testGetDateIntervalFromXML() + { + $dateIntervalReference = DateInterval::createFromDateString( '2 years, 1 month, -4 days, 2 hours, 0 minute, 34 seconds' ); + + $refConverter = new ReflectionObject( $this->converter ); + $refMethod = $refConverter->getMethod( 'getDateIntervalFromXML' ); + $refMethod->setAccessible( true ); + $generatedDateInterval = $refMethod->invoke( + $this->converter, + $this->getXMLStringFromDateInterval( $dateIntervalReference ) + ); + self::assertEquals( $dateIntervalReference, $generatedDateInterval ); + } + + /** + * @group fieldType + * @group dateTime + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::generateDateIntervalXML + */ + public function testGenerateDateIntervalXML() + { + $dateIntervalReference = DateInterval::createFromDateString( '2 years, 1 month, -4 days, 2 hours, 0 minute, 34 seconds' ); + $dom = new DOMDocument; + $dom->preserveWhiteSpace = false; + $dom->loadXML( $this->getXMLStringFromDateInterval( $dateIntervalReference ) ); + + $refConverter = new ReflectionObject( $this->converter ); + $refMethod = $refConverter->getMethod( 'generateDateIntervalXML' ); + $refMethod->setAccessible( true ); + self::assertEquals( + $dom->saveXML(), + $refMethod->invoke( $this->converter, $dateIntervalReference ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/KeywordTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/KeywordTest.php new file mode 100644 index 0000000..0634707 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/KeywordTest.php @@ -0,0 +1,89 @@ +converter = new KeywordConverter; + } + + /** + * @group fieldType + * @group keyword + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Keyword::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = array( "key1", "key2" ); + $value->sortKey = false; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + $this->assertNull( $storageFieldValue->dataText ); + $this->assertNull( $storageFieldValue->dataInt ); + $this->assertNull( $storageFieldValue->dataFloat ); + $this->assertEquals( 0, $storageFieldValue->sortKeyInt ); + $this->assertEquals( "", $storageFieldValue->sortKeyString ); + } + + /** + * @group fieldType + * @group keyword + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Keyword::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + $this->assertSame( array(), $fieldValue->data ); + $this->assertNull( $fieldValue->sortKey ); + } + + /** + * @group fieldType + * @group keyword + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Keyword::toStorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $this->converter->toStorageFieldDefinition( new PersistenceFieldDefinition, new StorageFieldDefinition ); + } + + /** + * @group fieldType + * @group keyword + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Keyword::toFieldDefinition + */ + public function testToFieldDefinition() + { + $this->converter->toFieldDefinition( new StorageFieldDefinition, new PersistenceFieldDefinition ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/MediaTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/MediaTest.php new file mode 100644 index 0000000..549986b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/MediaTest.php @@ -0,0 +1,104 @@ +converter = MediaTypeConverter::create(); + } + + /** + * @group fieldType + * @group ezmedia + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Media::toStorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $storageFieldDef = new StorageFieldDefinition; + + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->validators = array( + // Setting max file size to 1MB (1.048.576 bytes) + 'FileSizeValidator' => array( 'maxFileSize' => 1048576 ) + ); + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'mediaType' => MediaType::TYPE_HTML5_VIDEO + ) + ); + + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + 'defaultValue' => null + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + + self::assertSame( + $fieldDef->fieldTypeConstraints->validators['FileSizeValidator'], + array( 'maxFileSize' => $storageFieldDef->dataInt1 ) + ); + self::assertSame( + $fieldDef->fieldTypeConstraints->fieldSettings['mediaType'], + $storageFieldDef->dataText1 + ); + } + + /** + * @group fieldType + * @group ezmedia + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Media::toFieldDefinition + */ + public function testToFieldDefinition() + { + $fieldDef = new PersistenceFieldDefinition; + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => 1048576, + 'dataText1' => MediaType::TYPE_HTML5_VIDEO + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertSame( + array( + 'FileSizeValidator' => array( 'maxFileSize' => $storageDef->dataInt1 ) + ), + $fieldDef->fieldTypeConstraints->validators + ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\FieldType\\FieldSettings', $fieldDef->fieldTypeConstraints->fieldSettings ); + self::assertSame( + array( 'mediaType' => MediaType::TYPE_HTML5_VIDEO ), + $fieldDef->fieldTypeConstraints->fieldSettings->getArrayCopy() + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/RatingTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/RatingTest.php new file mode 100644 index 0000000..b8ef10f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/RatingTest.php @@ -0,0 +1,116 @@ +converter = new RatingConverter; + } + + /** + * @group fieldType + * @group rating + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = false; + $value->sortKey = false; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( null, $storageFieldValue->dataInt ); + } + + /** + * @group fieldType + * @group rating + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::toStorageValue + */ + public function testToStorageValueDisabled() + { + $value = new FieldValue; + $value->data = true; + $value->sortKey = false; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( 1, $storageFieldValue->dataInt ); + } + + /** + * @group fieldType + * @group rating + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataInt = null; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( false, $fieldValue->data ); + } + + /** + * @group fieldType + * @group rating + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::toFieldValue + */ + public function testToFieldValueDisabled() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataInt = 1; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( true, $fieldValue->data ); + } + + /** + * @group fieldType + * @group rating + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::toStorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $this->converter->toStorageFieldDefinition( new PersistenceFieldDefinition, new StorageFieldDefinition ); + } + + /** + * @group fieldType + * @group rating + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::toFieldDefinition + */ + public function testToFieldDefinition() + { + $this->converter->toFieldDefinition( new StorageFieldDefinition, new PersistenceFieldDefinition ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/SelectionTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/SelectionTest.php new file mode 100644 index 0000000..0145362 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/SelectionTest.php @@ -0,0 +1,272 @@ +converter = new SelectionConverter; + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toStorageValue + */ + public function testToStorageValue() + { + $fieldValue = new FieldValue(); + $fieldValue->data = array( 1, 3 ); + $fieldValue->sortKey = '1-3'; + + $expectedStorageFieldValue = new StorageFieldValue(); + $expectedStorageFieldValue->dataText = '1-3'; + $expectedStorageFieldValue->sortKeyString = '1-3'; + + $actualStorageFieldValue = new StorageFieldValue(); + + $this->converter->toStorageValue( $fieldValue, $actualStorageFieldValue ); + + $this->assertEquals( + $expectedStorageFieldValue, + $actualStorageFieldValue + ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toStorageValue + */ + public function testToStorageValueEmpty() + { + $fieldValue = new FieldValue(); + $fieldValue->data = array(); + $fieldValue->sortKey = ''; + + $expectedStorageFieldValue = new StorageFieldValue(); + $expectedStorageFieldValue->dataText = ''; + $expectedStorageFieldValue->sortKeyString = ''; + + $actualStorageFieldValue = new StorageFieldValue(); + + $this->converter->toStorageValue( $fieldValue, $actualStorageFieldValue ); + + $this->assertEquals( + $expectedStorageFieldValue, + $actualStorageFieldValue + ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue(); + $storageFieldValue->dataText = '1-3'; + $storageFieldValue->sortKeyString = '1-3'; + + $expectedFieldValue = new FieldValue(); + $expectedFieldValue->data = array( 1, 3 ); + $expectedFieldValue->sortKey = '1-3'; + + $actualFieldValue = new FieldValue(); + + $this->converter->toFieldValue( $storageFieldValue, $actualFieldValue ); + + $this->assertEquals( + $expectedFieldValue, + $actualFieldValue + ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toFieldValue + */ + public function testToFieldValueEmpty() + { + $storageFieldValue = new StorageFieldValue(); + $storageFieldValue->dataText = ''; + $storageFieldValue->sortKeyString = ''; + + $expectedFieldValue = new FieldValue(); + $expectedFieldValue->data = array(); + $expectedFieldValue->sortKey = ''; + + $actualFieldValue = new FieldValue(); + + $this->converter->toFieldValue( $storageFieldValue, $actualFieldValue ); + + $this->assertEquals( + $expectedFieldValue, + $actualFieldValue + ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionMultiple() + { + $fieldDefinition = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => new FieldTypeConstraints( + array( + 'fieldSettings' => new FieldSettings( + array( + 'isMultiple' => true, + 'options' => array( + 0 => 'First', + 1 => 'Second', + 2 => 'Third' + ) + ) + ) + ) + ) + ) + ); + + $expectedStorageFieldDefinition = new StorageFieldDefinition(); + $expectedStorageFieldDefinition->dataInt1 = 1; + $expectedStorageFieldDefinition->dataText5 = << + + +EOT; + + $actualStorageFieldDefinition = new StorageFieldDefinition(); + + $this->converter->toStorageFieldDefinition( $fieldDefinition, $actualStorageFieldDefinition ); + + $this->assertEquals( $expectedStorageFieldDefinition, $actualStorageFieldDefinition ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionSingle() + { + $fieldDefinition = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => new FieldTypeConstraints( + array( + 'fieldSettings' => new FieldSettings( + array( + 'isMultiple' => false, + 'options' => array( + 0 => 'First', + ) + ) + ) + ) + ) + ) + ); + + $expectedStorageFieldDefinition = new StorageFieldDefinition(); + $expectedStorageFieldDefinition->dataInt1 = 0; + $expectedStorageFieldDefinition->dataText5 = << + + +EOT; + + $actualStorageFieldDefinition = new StorageFieldDefinition(); + + $this->converter->toStorageFieldDefinition( $fieldDefinition, $actualStorageFieldDefinition ); + + $this->assertEquals( $expectedStorageFieldDefinition, $actualStorageFieldDefinition ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toFieldDefinition + */ + public function testToFieldDefinitionMultiple() + { + $storageFieldDefinition = new StorageFieldDefinition(); + $storageFieldDefinition->dataInt1 = 1; + $storageFieldDefinition->dataText5 = << + + + + +EOT; + + $expectedFieldDefinition = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => new FieldTypeConstraints( + array( + 'fieldSettings' => new FieldSettings( + array( + 'isMultiple' => true, + 'options' => array( + 0 => 'First', + 1 => 'Second', + 2 => 'Third' + ) + ) + ) + ) + ), + 'defaultValue' => new FieldValue( array( 'data' => array() ) ) + ) + ); + + $actualFieldDefinition = new PersistenceFieldDefinition(); + + $this->converter->toFieldDefinition( $storageFieldDefinition, $actualFieldDefinition ); + + $this->assertEquals( $expectedFieldDefinition, $actualFieldDefinition ); + } + + /** + * @group fieldType + * @group selection + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::toFieldDefinition + */ + public function testToFieldDefinitionSingle() + { + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/TextBlockTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/TextBlockTest.php new file mode 100644 index 0000000..beeb087 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/TextBlockTest.php @@ -0,0 +1,133 @@ +converter = new TextBlockConverter; + $this->longText = <<data = $this->longText; + $value->sortKey = 'Now that we know who you are'; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( $value->data, $storageFieldValue->dataText ); + self::assertSame( $value->sortKey, $storageFieldValue->sortKeyString ); + self::assertSame( 0, $storageFieldValue->sortKeyInt ); + } + + /** + * @group fieldType + * @group textBlock + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlock::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataText = $this->longText; + $storageFieldValue->sortKeyString = 'Now that we know who you are'; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( $storageFieldValue->dataText, $fieldValue->data ); + self::assertSame( $storageFieldValue->sortKeyString, $fieldValue->sortKey ); + } + + /** + * @group fieldType + * @group textBlock + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlock::toStorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $storageFieldDef = new StorageFieldDefinition; + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + "textRows" => 15 + ) + ); + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + 'defaultValue' => new TextBlockValue + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + 15, + $storageFieldDef->dataInt1 + ); + } + + /** + * @group fieldType + * @group textBlock + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlock::toFieldDefinition + */ + public function testToFieldDefinition() + { + $fieldDef = new PersistenceFieldDefinition; + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => 20 + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertNull( $fieldDef->fieldTypeConstraints->validators ); + self::assertInstanceOf( 'eZ\\Publish\\Core\\FieldType\\FieldSettings', $fieldDef->fieldTypeConstraints->fieldSettings ); + self::assertSame( + array( "textRows" => 20 ), + $fieldDef->fieldTypeConstraints->fieldSettings->getArrayCopy() + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/TextLineTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/TextLineTest.php new file mode 100644 index 0000000..53bb460 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/TextLineTest.php @@ -0,0 +1,166 @@ +converter = new TextLineConverter; + } + + /** + * @group fieldType + * @group textLine + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = "He's holding a thermal detonator!"; + $value->sortKey = "He's holding"; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( $value->data, $storageFieldValue->dataText ); + self::assertSame( $value->sortKey, $storageFieldValue->sortKeyString ); + self::assertSame( 0, $storageFieldValue->sortKeyInt ); + } + + /** + * @group fieldType + * @group textLine + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataText = 'When 900 years old, you reach... Look as good, you will not.'; + $storageFieldValue->sortKeyString = 'When 900 years old, you reach...'; + $storageFieldValue->sortKeyInt = 0; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( $storageFieldValue->dataText, $fieldValue->data ); + self::assertSame( $storageFieldValue->sortKeyString, $fieldValue->sortKey ); + } + + /** + * @group fieldType + * @group textLine + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionWithValidator() + { + $defaultText = 'This is a default text'; + $storageFieldDef = new StorageFieldDefinition; + $defaultValue = new FieldValue; + $defaultValue->data = $defaultText; + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldTypeConstraints->validators = array( + TextLineConverter::STRING_LENGTH_VALIDATOR_IDENTIFIER => array( 'maxStringLength' => 100 ) + ); + $fieldTypeConstraints->fieldSettings = new FieldSettings( + array( + 'defaultText' => $defaultText + ) + ); + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + 'defaultValue' => $defaultValue + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + $fieldDef->fieldTypeConstraints->validators[TextLineConverter::STRING_LENGTH_VALIDATOR_IDENTIFIER], + array( 'maxStringLength' => $storageFieldDef->dataInt1 ) + ); + self::assertSame( + $fieldDef->fieldTypeConstraints->fieldSettings['defaultText'], + $storageFieldDef->dataText1 + ); + } + + /** + * @group fieldType + * @group textLine + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine::toStorageFieldDefinition + */ + public function testToStorageFieldDefinitionNoValidator() + { + $defaultText = 'This is a default text'; + $storageFieldDef = new StorageFieldDefinition; + $defaultValue = new FieldValue; + $defaultValue->data = $defaultText; + $fieldTypeConstraints = new FieldTypeConstraints; + $fieldDef = new PersistenceFieldDefinition( + array( + 'fieldTypeConstraints' => $fieldTypeConstraints, + 'defaultValue' => $defaultValue + ) + ); + + $this->converter->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + self::assertSame( + 0, + $storageFieldDef->dataInt1 + ); + self::assertSame( + $fieldDef->defaultValue->data, + $storageFieldDef->dataText1 + ); + } + + /** + * @group fieldType + * @group textLine + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine::toFieldDefinition + */ + public function testToFieldDefinition() + { + $defaultText = 'This is a default value'; + $fieldDef = new PersistenceFieldDefinition; + $storageDef = new StorageFieldDefinition( + array( + 'dataInt1' => 100, + 'dataText1' => $defaultText + ) + ); + + $this->converter->toFieldDefinition( $storageDef, $fieldDef ); + self::assertSame( + array( + TextLineConverter::STRING_LENGTH_VALIDATOR_IDENTIFIER => array( 'maxStringLength' => 100 ) + ), + $fieldDef->fieldTypeConstraints->validators + ); + self::assertSame( $defaultText, $fieldDef->defaultValue->data ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/UrlTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/UrlTest.php new file mode 100644 index 0000000..f1d96f8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/UrlTest.php @@ -0,0 +1,95 @@ +converter = new UrlConverter; + } + + /** + * @group fieldType + * @group url + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Url::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $text = "eZ Systems"; + $value->data = array( "text" => $text ); + $value->externalData = "http://ez.no/"; + $value->sortKey = false; + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( $text, $storageFieldValue->dataText ); + } + + /** + * @group fieldType + * @group url + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Url::toFieldValue + */ + public function testToFieldValue() + { + $text = "A link's text"; + $urlId = 842; + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataText = $text; + $storageFieldValue->dataInt = $urlId; + $storageFieldValue->sortKeyString = false; + $storageFieldValue->sortKeyInt = false; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertInternalType( "array", $fieldValue->data ); + self::assertFalse( $fieldValue->sortKey ); + self::assertSame( $text, $fieldValue->data["text"] ); + self::assertEquals( $urlId, $fieldValue->data["urlId"] ); + } + + /** + * @group fieldType + * @group url + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Url::toStorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $this->converter->toStorageFieldDefinition( new PersistenceFieldDefinition, new StorageFieldDefinition ); + } + + /** + * @group fieldType + * @group url + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Url::toFieldDefinition + */ + public function testToFieldDefinition() + { + $this->converter->toFieldDefinition( new StorageFieldDefinition, new PersistenceFieldDefinition ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/XmlTextTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/XmlTextTest.php new file mode 100644 index 0000000..86e0eeb --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValue/Converter/XmlTextTest.php @@ -0,0 +1,79 @@ +converter = new XmlTextConverter; + $this->xmlText = << +
      Some paragraph content
      + +EOT; + } + + protected function tearDown() + { + unset( $this->xmlText ); + parent::tearDown(); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\XmlText::toStorageValue + */ + public function testToStorageValue() + { + $value = new FieldValue; + $value->data = new DOMDocument; + $value->data->loadXML( $this->xmlText ); + $storageFieldValue = new StorageFieldValue; + + $this->converter->toStorageValue( $value, $storageFieldValue ); + self::assertSame( $value->data->saveXML(), $storageFieldValue->dataText ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\XmlText::toFieldValue + */ + public function testToFieldValue() + { + $storageFieldValue = new StorageFieldValue; + $storageFieldValue->dataText = $this->xmlText; + $fieldValue = new FieldValue; + + $this->converter->toFieldValue( $storageFieldValue, $fieldValue ); + self::assertSame( $storageFieldValue->dataText, $fieldValue->data->saveXML() ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValueConverterRegistryTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValueConverterRegistryTest.php new file mode 100644 index 0000000..2ba4ae8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/FieldValueConverterRegistryTest.php @@ -0,0 +1,91 @@ +getFieldValueConverterMock(); + $registry = new Registry( array( 'some-type' => $converter ) ); + + $this->assertAttributeSame( + array( + 'some-type' => $converter, + ), + 'converterMap', + $registry + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry::getConverter + * + * @return void + */ + public function testGetStorage() + { + $converter = $this->getFieldValueConverterMock(); + $registry = new Registry( array( 'some-type' => $converter ) ); + + $res = $registry->getConverter( 'some-type' ); + + $this->assertSame( + $converter, + $res + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry::getConverter + * @covers eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Exception\NotFound + * @expectedException eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Exception\NotFound + */ + public function testGetNotFound() + { + $registry = new Registry( array() ); + + $registry->getConverter( 'not-found' ); + } + + /** + * Returns a mock for Storage + * + * @return Storage + */ + protected function getFieldValueConverterMock() + { + return $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..d789d57 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Gateway/EzcDatabaseTest.php @@ -0,0 +1,1845 @@ +getDatabaseHandler(); + $gateway = $this->getDatabaseGateway(); + + $this->assertAttributeSame( + $handlerMock, + 'dbHandler', + $gateway + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::insertContentObject + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::generateLanguageMask + * @todo Fix not available fields + */ + public function testInsertContentObject() + { + $struct = $this->getCreateStructFixture(); + + $gateway = $this->getDatabaseGateway(); + $gateway->insertContentObject( $struct ); + + $this->assertQueryResult( + array( + array( + 'name' => 'Content name', + 'contentclass_id' => '23', + 'section_id' => '42', + 'owner_id' => '13', + 'current_version' => '1', + 'initial_language_id' => '2', + 'remote_id' => 'some_remote_id', + 'language_mask' => '3', + 'modified' => '0', + 'published' => '0', + 'status' => ContentInfo::STATUS_DRAFT, + ), + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + array( + 'name', + 'contentclass_id', + 'section_id', + 'owner_id', + 'current_version', + 'initial_language_id', + 'remote_id', + 'language_mask', + 'modified', + 'published', + 'status', + ) + )->from( 'ezcontentobject' ) + ); + } + + /** + * Returns a Content fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\CreateStruct + */ + protected function getCreateStructFixture() + { + $struct = new CreateStruct(); + + $struct->typeId = 23; + $struct->sectionId = 42; + $struct->ownerId = 13; + $struct->initialLanguageId = 2; + $struct->remoteId = 'some_remote_id'; + $struct->alwaysAvailable = true; + $struct->modified = 456; + $struct->name = array( + 'eng-US' => 'Content name', + ); + $struct->fields = array( + new Field( array( "languageCode" => "eng-US" ) ) + ); + $struct->locations = array(); + + return $struct; + } + + /** + * Returns a Content fixture + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + protected function getContentFixture() + { + $content = new Content; + + $content->versionInfo = new VersionInfo; + $content->versionInfo->names = array( + 'eng-US' => 'Content name', + ); + $content->versionInfo->status = VersionInfo::STATUS_PENDING; + + $content->versionInfo->contentInfo = new ContentInfo; + $content->versionInfo->contentInfo->contentTypeId = 23; + $content->versionInfo->contentInfo->sectionId = 42; + $content->versionInfo->contentInfo->ownerId = 13; + $content->versionInfo->contentInfo->currentVersionNo = 2; + $content->versionInfo->contentInfo->mainLanguageCode = 'eng-US'; + $content->versionInfo->contentInfo->remoteId = 'some_remote_id'; + $content->versionInfo->contentInfo->alwaysAvailable = true; + $content->versionInfo->contentInfo->publicationDate = 123; + $content->versionInfo->contentInfo->modificationDate = 456; + $content->versionInfo->contentInfo->isPublished = false; + $content->versionInfo->contentInfo->name = 'Content name'; + + return $content; + } + + /** + * Returns a Version fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + protected function getVersionFixture() + { + $version = new VersionInfo; + + $version->id = null; + $version->versionNo = 1; + $version->creatorId = 13; + $version->status = 0; + $version->creationDate = 1312278322; + $version->modificationDate = 1312278323; + $version->initialLanguageCode = 'eng-GB'; + $version->contentInfo = new ContentInfo( + array( + "id" => 2342, + "alwaysAvailable" => true + ) + ); + + return $version; + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::insertVersion + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::generateLanguageMask + */ + public function testInsertVersion() + { + $version = $this->getVersionFixture(); + + $gateway = $this->getDatabaseGateway(); + $gateway->insertVersion( $version, array() ); + + $this->assertQueryResult( + array( + array( + 'contentobject_id' => '2342', + 'created' => '1312278322', + 'creator_id' => '13', + 'modified' => '1312278323', + 'status' => '0', + 'workflow_event_pos' => '0', + 'version' => '1', + 'language_mask' => '1', + 'initial_language_id' => '4', + // Not needed, according to field mapping document + // 'user_id', + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + array( + 'contentobject_id', + 'created', + 'creator_id', + 'modified', + 'status', + 'workflow_event_pos', + 'version', + 'language_mask', + 'initial_language_id', + ) + )->from( 'ezcontentobject_version' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::setStatus + * + * @return void + */ + public function testSetStatus() + { + $gateway = $this->getDatabaseGateway(); + + // insert content + $struct = $this->getCreateStructFixture(); + $contentId = $gateway->insertContentObject( $struct ); + + // insert version + $version = $this->getVersionFixture(); + $version->contentInfo->id = $contentId; + $gateway->insertVersion( $version, array() ); + + $this->assertTrue( + $gateway->setStatus( $version->contentInfo->id, $version->versionNo, VersionInfo::STATUS_PENDING ) + ); + + $this->assertQueryResult( + array( array( VersionInfo::STATUS_PENDING ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'status' ) + ->from( 'ezcontentobject_version' ) + ); + + // check that content status has not been set to published + $this->assertQueryResult( + array( array( VersionInfo::STATUS_DRAFT ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'status' ) + ->from( 'ezcontentobject' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::setStatus + * + * @return void + */ + public function testSetStatusPublished() + { + $gateway = $this->getDatabaseGateway(); + + // insert content + $struct = $this->getCreateStructFixture(); + $contentId = $gateway->insertContentObject( $struct ); + + // insert version + $version = $this->getVersionFixture(); + $version->contentInfo->id = $contentId; + $gateway->insertVersion( $version, array() ); + + $this->assertTrue( + $gateway->setStatus( $version->contentInfo->id, $version->versionNo, VersionInfo::STATUS_PUBLISHED ) + ); + + $this->assertQueryResult( + array( array( VersionInfo::STATUS_PUBLISHED ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'status' ) + ->from( 'ezcontentobject_version' ) + ); + + // check that content status has been set to published + $this->assertQueryResult( + array( array( ContentInfo::STATUS_PUBLISHED ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'status' ) + ->from( 'ezcontentobject' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::setStatus + * + * @return void + */ + public function testSetStatusUnknownVersion() + { + $gateway = $this->getDatabaseGateway(); + + $this->assertFalse( + $gateway->setStatus( 23, 42, 2 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::updateContent + * + * @return void + */ + public function testUpdateContent() + { + $gateway = $this->getDatabaseGateway(); + + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $metadataStruct = $this->getMetadataUpdateStructFixture(); + + $gateway->updateContent( 10, $metadataStruct ); + + $this->assertQueryResult( + array( + array( + 'initial_language_id' => '3', + 'modified' => '234567', + 'owner_id' => '42', + 'published' => '123456', + 'remote_id' => 'ghjk1234567890ghjk1234567890', + 'name' => 'Thoth' + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( + 'initial_language_id', + 'modified', + 'owner_id', + 'published', + 'remote_id', + 'name' + )->from( 'ezcontentobject' ) + ->where( 'id = 10' ) + ); + } + + /** + * Returns an UpdateStruct fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\UpdateStruct + */ + protected function getUpdateStructFixture() + { + $struct = new UpdateStruct(); + $struct->creatorId = 23; + $struct->fields = array(); + $struct->modificationDate = 234567; + $struct->initialLanguageId = 3; + return $struct; + } + + /** + * Returns a MetadataUpdateStruct fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct + */ + protected function getMetadataUpdateStructFixture() + { + $struct = new MetadataUpdateStruct(); + $struct->ownerId = 42; + $struct->publicationDate = 123456; + $struct->mainLanguageId = 3; + $struct->modificationDate = 234567; + $struct->remoteId = "ghjk1234567890ghjk1234567890"; + $struct->name = "Thoth"; + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::updateVersion + * + * @return void + */ + public function testUpdateVersion() + { + $gateway = $this->getDatabaseGateway(); + + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway->updateVersion( 10, 2, $this->getUpdateStructFixture() ); + + $query = $this->getDatabaseHandler()->createSelectQuery(); + $this->assertQueryResult( + array( + array( + 'creator_id' => '23', + 'initial_language_id' => '3', + 'modified' => '234567', + ) + ), + $query + ->select( + array( + 'creator_id', + 'initial_language_id', + 'modified', + ) + )->from( 'ezcontentobject_version' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 10 ), + $query->expr->eq( 'version', 2 ) + ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::insertNewField + * + * @return void + */ + public function testInsertNewField() + { + $content = $this->getContentFixture(); + $content->versionInfo->contentInfo->id = 2342; + // $content->versionInfo->versionNo = 3; + + $field = $this->getFieldFixture(); + $value = $this->getStorageValueFixture(); + + $gateway = $this->getDatabaseGateway(); + $gateway->insertNewField( $content, $field, $value ); + + $this->assertQueryResult( + array( + array( + 'contentclassattribute_id' => '231', + 'contentobject_id' => '2342', + 'data_float' => '24.42', + 'data_int' => '42', + 'data_text' => 'Test text', + 'data_type_string' => 'ezstring', + 'language_code' => 'eng-GB', + 'language_id' => '4', + 'sort_key_int' => '23', + 'sort_key_string' => 'Test', + 'version' => '1', + 'language_id' => '5', + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + array( + 'contentclassattribute_id', + 'contentobject_id', + 'data_float', + 'data_int', + 'data_text', + 'data_type_string', + 'language_code', + 'language_id', + 'sort_key_int', + 'sort_key_string', + 'version', + 'language_id', + ) + )->from( 'ezcontentobject_attribute' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::updateField + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::setFieldUpdateValues + * + * @return void + */ + public function testUpdateField() + { + $content = $this->getContentFixture(); + $content->versionInfo->contentInfo->id = 2342; + + $field = $this->getFieldFixture(); + $value = $this->getStorageValueFixture(); + + $gateway = $this->getDatabaseGateway(); + $field->id = $gateway->insertNewField( $content, $field, $value ); + + $newValue = new StorageFieldValue( + array( + 'dataFloat' => 124.42, + 'dataInt' => 142, + 'dataText' => 'New text', + 'sortKeyInt' => 123, + 'sortKeyString' => 'new_text', + ) + ); + + $gateway->updateField( $field, $newValue ); + + $this->assertQueryResult( + array( + array( + 'data_float' => '124.42', + 'data_int' => '142', + 'data_text' => 'New text', + 'sort_key_int' => '123', + 'sort_key_string' => 'new_text', + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + array( + 'data_float', + 'data_int', + 'data_text', + 'sort_key_int', + 'sort_key_string', + ) + )->from( 'ezcontentobject_attribute' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::updateNonTranslatableField + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::setFieldUpdateValues + * + * @return void + */ + public function testUpdateNonTranslatableField() + { + $content = $this->getContentFixture(); + $content->versionInfo->contentInfo->id = 2342; + + $fieldGb = $this->getFieldFixture(); + $fieldUs = $this->getOtherLanguageFieldFixture(); + $value = $this->getStorageValueFixture(); + + $gateway = $this->getDatabaseGateway(); + $fieldGb->id = $gateway->insertNewField( $content, $fieldGb, $value ); + $fieldUs->id = $gateway->insertNewField( $content, $fieldUs, $value ); + + $updateStruct = new Content\UpdateStruct(); + + $newValue = new StorageFieldValue( + array( + 'dataFloat' => 124.42, + 'dataInt' => 142, + 'dataText' => 'New text', + 'sortKeyInt' => 123, + 'sortKeyString' => 'new_text', + ) + ); + + $gateway->updateNonTranslatableField( $fieldGb, $newValue, $content->versionInfo->contentInfo->id ); + + $this->assertQueryResult( + array( + // Both fields updated + array( + 'data_float' => '124.42', + 'data_int' => '142', + 'data_text' => 'New text', + 'sort_key_int' => '123', + 'sort_key_string' => 'new_text', + ), + array( + 'data_float' => '124.42', + 'data_int' => '142', + 'data_text' => 'New text', + 'sort_key_int' => '123', + 'sort_key_string' => 'new_text', + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + array( + 'data_float', + 'data_int', + 'data_text', + 'sort_key_int', + 'sort_key_string', + ) + )->from( 'ezcontentobject_attribute' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::listVersions + * + * @return void + */ + public function testListVersions() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + $res = $gateway->listVersions( 226 ); + + $this->assertEquals( + 2, + count( $res ) + ); + + foreach ( $res as $row ) + { + $this->assertEquals( + 24, + count( $row ) + ); + } + + $this->assertEquals( + 675, + $res[0]['ezcontentobject_version_id'] + ); + $this->assertEquals( + 676, + $res[1]['ezcontentobject_version_id'] + ); + + //$orig = include __DIR__ . '/../_fixtures/restricted_version_rows.php'; + + /*$this->storeFixture( + __DIR__ . '/../_fixtures/restricted_version_rows.php', + $res + );*/ + + //$this->assertEquals( $orig, $res, "Fixtures differ between what was previously stored(expected) and what it now generates(actual), this hints either some mistake in impl or that the fixture (../_fixtures/restricted_version_rows.php) and tests needs to be adapted." ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::listVersionsForUser + * + * @return void + */ + public function testListVersionsForUser() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + $res = $gateway->listVersionsForUser( 14 ); + + $this->assertEquals( + 2, + count( $res ) + ); + + foreach ( $res as $row ) + { + $this->assertEquals( + 24, + count( $row ) + ); + } + + $this->assertEquals( + 677, + $res[0]['ezcontentobject_version_id'] + ); + $this->assertEquals( + 0, + $res[0]['ezcontentobject_version_status'] + ); + $this->assertEquals( + 678, + $res[1]['ezcontentobject_version_id'] + ); + $this->assertEquals( + 0, + $res[1]['ezcontentobject_version_status'] + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder + */ + public function testLoadWithAllTranslations() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + $res = $gateway->load( 226, 2 ); + + $this->assertValuesInRows( + 'ezcontentobject_attribute_language_code', + array( 'eng-US', 'eng-GB' ), + $res + ); + + $this->assertValuesInRows( + 'ezcontentobject_attribute_language_id', + array( '2' ), + $res + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder + */ + public function testCreateFixtureForMapperExtractContentFromRowsMultipleVersions() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $resFirst = $gateway->load( 11, 1 ); + $resSecond = $gateway->load( 11, 2 ); + + $res = array_merge( $resFirst, $resSecond ); + + $orig = include __DIR__ . '/../_fixtures/extract_content_from_rows_multiple_versions.php'; + + /*$this->storeFixture( + __DIR__ . '/../_fixtures/extract_content_from_rows_multiple_versions.php', + $res + );*/ + + $this->assertEquals( $orig, $res, "Fixtures differ between what was previously stored(expected) and what it now generates(actual), this hints either some mistake in impl or that the fixture (../_fixtures/extract_content_from_rows_multiple_versions.php) and tests needs to be adapted." ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder + */ + public function testCreateFixtureForMapperExtractContentFromRows() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $res = $gateway->load( 226, 2 ); + + $res = array_merge( $res ); + + $orig = include __DIR__ . '/../_fixtures/extract_content_from_rows.php'; + + /*$this->storeFixture( + __DIR__ . '/../_fixtures/extract_content_from_rows.php', + $res + );*/ + + $this->assertEquals( $orig, $res, "Fixtures differ between what was previously stored(expected) and what it now generates(actual), this hints either some mistake in impl or that the fixture (../_fixtures/extract_content_from_rows.php) and tests needs to be adapted." ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder + */ + public function testLoadWithSingleTranslation() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + $res = $gateway->load( 226, 2, array( 'eng-GB' ) ); + + $this->assertValuesInRows( + 'ezcontentobject_attribute_language_code', + array( 'eng-GB' ), + $res + ); + $this->assertValuesInRows( + 'ezcontentobject_attribute_language_id', + array( '2' ), + $res + ); + $this->assertEquals( + 1, + count( $res ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder + */ + public function testLoadNonExistentTranslation() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + $res = $gateway->load( 226, 2, array( 'de-DE' ) ); + + $this->assertEquals( + 0, + count( $res ) + ); + } + + /** + * Asserts that $columnKey in $actualRows exactly contains $expectedValues + * + * @param string $columnKey + * @param string[] $expectedValues + * @param string[][] $actualRows + * + * @return void + */ + protected function assertValuesInRows( $columnKey, array $expectedValues, array $actualRows ) + { + $expectedValues = array_fill_keys( + array_values( $expectedValues ), + true + ); + + $containedValues = array(); + + foreach ( $actualRows as $row ) + { + if ( isset( $row[$columnKey] ) ) + { + $containedValues[$row[$columnKey]] = true; + } + } + + $this->assertEquals( + $expectedValues, + $containedValues + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::getAllLocationIds + * + * @return void + */ + public function testGetAllLocationIds() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $this->assertEquals( + array( 228 ), + $gateway->getAllLocationIds( 226 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::getFieldIdsByType + * + * @return void + */ + public function testGetFieldIdsByType() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $this->assertEquals( + array( + 'ezstring' => array( 841, ), + 'ezxmltext' => array( 842, ), + 'ezimage' => array( 843, ), + 'ezkeyword' => array( 844, ) + ), + $gateway->getFieldIdsByType( 149 ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::getFieldIdsByType + * + * @return void + */ + public function testGetFieldIdsByTypeWithSecondArgument() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $this->assertEquals( + array( + 'ezstring' => array( 4001, 4002 ) + ), + $gateway->getFieldIdsByType( 225, 2 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteRelations + * + * @return void + */ + public function testDeleteRelationsTo() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentRelations(), + 'from' => $this->countContentRelations( 149 ), + 'to' => $this->countContentRelations( null, 149 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteRelations( 149 ); + + $this->assertEquals( + // yes, relates to itself! + array( + 'all' => $beforeCount['all'] - 2, + 'from' => $beforeCount['from'] - 1, + 'to' => $beforeCount['to'] - 2, + ), + array( + 'all' => $this->countContentRelations(), + 'from' => $this->countContentRelations( 149 ), + 'to' => $this->countContentRelations( null, 149 ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteRelations + * + * @return void + */ + public function testDeleteRelationsFrom() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentRelations(), + 'from' => $this->countContentRelations( 75 ), + 'to' => $this->countContentRelations( null, 75 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteRelations( 75 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 6, + 'from' => $beforeCount['from'] - 6, + 'to' => $beforeCount['to'], + ), + array( + 'all' => $this->countContentRelations(), + 'from' => $this->countContentRelations( 75 ), + 'to' => $this->countContentRelations( null, 75 ) + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteRelations + * + * @return void + */ + public function testDeleteRelationsWithSecondArgument() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentRelations(), + 'from' => $this->countContentRelations( 225 ), + 'to' => $this->countContentRelations( null, 225 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteRelations( 225, 2 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 1, + 'from' => $beforeCount['from'] - 1, + 'to' => $beforeCount['to'], + ), + array( + 'all' => $this->countContentRelations(), + 'from' => $this->countContentRelations( 225 ), + 'to' => $this->countContentRelations( null, 225 ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteField + * + * @return void + */ + public function testDeleteField() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = $this->countContentFields(); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteField( 8, 1 ); + + $this->assertEquals( + $beforeCount - 1, + $this->countContentFields() + ); + + $this->assertQueryResult( + array(), + $this->getDatabaseHandler()->createSelectQuery() + ->select( '*' ) + ->from( 'ezcontentobject_attribute' ) + ->where( 'id=8 AND version=1' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteFields + * + * @return void + */ + public function testDeleteFields() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentFields(), + 'this' => $this->countContentFields( 4 ), + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteFields( 4 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 2, + 'this' => 0 + ), + array( + 'all' => $this->countContentFields(), + 'this' => $this->countContentFields( 4 ), + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteFields + * + * @return void + */ + public function testDeleteFieldsWithSecondArgument() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentFields(), + 'this' => $this->countContentFields( 225 ), + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteFields( 225, 2 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 2, + 'this' => $beforeCount['this'] - 2 + ), + array( + 'all' => $this->countContentFields(), + 'this' => $this->countContentFields( 225 ), + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteVersions + * + * @return void + */ + public function testDeleteVersions() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentVersions(), + 'this' => $this->countContentVersions( 14 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteVersions( 14 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 2, + 'this' => 0 + ), + array( + 'all' => $this->countContentVersions(), + 'this' => $this->countContentVersions( 14 ), + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteVersions + * + * @return void + */ + public function testDeleteVersionsWithSecondArgument() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentVersions(), + 'this' => $this->countContentVersions( 225 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteVersions( 225, 2 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 1, + 'this' => $beforeCount['this'] - 1, + ), + array( + 'all' => $this->countContentVersions(), + 'this' => $this->countContentVersions( 225 ), + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::setName + * + * @return void + */ + public function testSetName() + { + $beforeCount = array( + 'all' => $this->countContentNames(), + 'this' => $this->countContentNames( 14 ) + ); + + $gateway = $this->getDatabaseGateway(); + + $gateway->setName( 14, 2, "Hello world!", 'eng-GB' ); + + $this->assertQueryResult( + array( array( 'eng-GB', 2, 14, 4, 'Hello world!', 'eng-GB' ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( '*' ) + ->from( 'ezcontentobject_name' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteNames + * + * @return void + */ + public function testDeleteNames() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentNames(), + 'this' => $this->countContentNames( 14 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteNames( 14 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 2, + 'this' => 0 + ), + array( + 'all' => $this->countContentNames(), + 'this' => $this->countContentNames( 14 ), + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteNames + * + * @return void + */ + public function testDeleteNamesWithSecondArgument() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = array( + 'all' => $this->countContentNames(), + 'this' => $this->countContentNames( 225 ) + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteNames( 225, 2 ); + + $this->assertEquals( + array( + 'all' => $beforeCount['all'] - 1, + 'this' => $beforeCount['this'] - 1 + ), + array( + 'all' => $this->countContentNames(), + 'this' => $this->countContentNames( 225 ), + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteContent + * + * @return void + */ + public function testDeleteContent() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $beforeCount = $this->countContent(); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteContent( 14 ); + + $this->assertEquals( + array( + 'all' => $beforeCount - 1, + 'this' => 0 + ), + array( + 'all' => $this->countContent(), + 'this' => $this->countContent( 14 ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadLatestPublishedData + * + * @return void + */ + public function testLoadLatestPublishedData() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $this->assertEquals( + $gateway->loadLatestPublishedData( 10 ), + $gateway->load( 10, 2 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadRelations + */ + public function testLoadRelations() + { + $this->insertRelationFixture(); + + $gateway = $this->getDatabaseGateway(); + + $relations = $gateway->loadRelations( 57 ); + + $this->assertEquals( 3, count( $relations ) ); + + $this->assertValuesInRows( + 'ezcontentobject_link_to_contentobject_id', + array( 58, 59, 60 ), + $relations + ); + + $this->assertValuesInRows( + 'ezcontentobject_link_from_contentobject_id', + array( 57 ), + $relations + ); + $this->assertValuesInRows( + 'ezcontentobject_link_from_contentobject_version', + array( 2 ), + $relations + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadRelations + */ + public function testLoadRelationsByType() + { + $this->insertRelationFixture(); + + $gateway = $this->getDatabaseGateway(); + + $relations = $gateway->loadRelations( 57, null, \eZ\Publish\API\Repository\Values\Content\Relation::COMMON ); + + $this->assertEquals( 1, count( $relations ), "Expecting one relation to be loaded" ); + + $this->assertValuesInRows( + 'ezcontentobject_link_relation_type', + array( \eZ\Publish\API\Repository\Values\Content\Relation::COMMON ), + $relations + ); + + $this->assertValuesInRows( + 'ezcontentobject_link_to_contentobject_id', + array( 58 ), + $relations + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadRelations + */ + public function testLoadRelationsByVersion() + { + $this->insertRelationFixture(); + + $gateway = $this->getDatabaseGateway(); + + $relations = $gateway->loadRelations( 57, 1 ); + + $this->assertEquals( 1, count( $relations ), "Expecting one relation to be loaded" ); + + $this->assertValuesInRows( + 'ezcontentobject_link_to_contentobject_id', + array( 58 ), + $relations + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadRelations + */ + public function testLoadRelationsNoResult() + { + $this->insertRelationFixture(); + + $gateway = $this->getDatabaseGateway(); + + $relations = $gateway->loadRelations( 57, 1, \eZ\Publish\API\Repository\Values\Content\Relation::EMBED ); + + $this->assertEquals( 0, count( $relations ), "Expecting no relation to be loaded" ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadReverseRelations + */ + public function testLoadReverseRelations() + { + $this->insertRelationFixture(); + + $gateway = $this->getDatabaseGateway(); + + $relations = $gateway->loadReverseRelations( 58 ); + + self::assertEquals( 2, count( $relations ) ); + + $this->assertValuesInRows( + 'ezcontentobject_link_from_contentobject_id', + array( 57, 61 ), + $relations + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::loadReverseRelations + */ + public function testLoadReverseRelationsWithType() + { + $this->insertRelationFixture(); + + $gateway = $this->getDatabaseGateway(); + + $relations = $gateway->loadReverseRelations( 58, \eZ\Publish\API\Repository\Values\Content\Relation::COMMON ); + + self::assertEquals( 1, count( $relations ) ); + + $this->assertValuesInRows( + 'ezcontentobject_link_from_contentobject_id', + array( 57 ), + $relations + ); + + $this->assertValuesInRows( + 'ezcontentobject_link_relation_type', + array( \eZ\Publish\API\Repository\Values\Content\Relation::COMMON ), + $relations + ); + } + + /** + * Inserts the relation database fixture from relation_data.php + */ + protected function insertRelationFixture() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/relations_data.php' + ); + } + + /* + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::getLastVersionNumber + * + * @return void + */ + public function testGetLastVersionNumber() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $this->assertEquals( + 1, + $gateway->getLastVersionNumber( 4 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::insertRelation + */ + public function testInsertRelation() + { + $struct = $this->getRelationCreateStructFixture(); + $gateway = $this->getDatabaseGateway(); + $gateway->insertRelation( $struct ); + + $this->assertQueryResult( + array( + array( + 'id' => 1, + 'from_contentobject_id' => $struct->sourceContentId, + 'from_contentobject_version' => $struct->sourceContentVersionNo, + 'contentclassattribute_id' => $struct->sourceFieldDefinitionId, + 'to_contentobject_id' => $struct->destinationContentId, + 'relation_type' => $struct->type, + ), + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + array( + 'id', + 'from_contentobject_id', + 'from_contentobject_version', + 'contentclassattribute_id', + 'to_contentobject_id', + 'relation_type', + ) + )->from( 'ezcontentobject_link' ) + ->where( 'id = 1' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::deleteRelation + */ + public function testDeleteRelation() + { + $this->insertRelationFixture(); + + self::assertEquals( 4, $this->countContentRelations( 57 ) ); + + $gateway = $this->getDatabaseGateway(); + $gateway->deleteRelation( 2 ); + + self::assertEquals( 3, $this->countContentRelations( 57 ) ); + } + + /** + * Test for the updateAlwaysAvailableFlag() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase::updateAlwaysAvailableFlag + */ + public function testUpdateAlwaysAvailableFlag() + { + $this->insertDatabaseFixture( + __DIR__ . '/../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + $gateway->updateAlwaysAvailableFlag( 103, false ); + + $this->assertQueryResult( + array( array( 'id' => 2, ), ), + $this->getDatabaseHandler()->createSelectQuery()->select( + array( 'language_mask', ) + )->from( + 'ezcontentobject' + )->where( + 'id = 103' + ) + ); + + $query = $this->getDatabaseHandler()->createSelectQuery(); + $this->assertQueryResult( + array( array( 'language_id' => 2, ), ), + $query->select( + array( 'language_id', ) + )->from( + 'ezcontentobject_name' + )->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 103 ), + $query->expr->eq( 'content_version', 1 ) + ) + ) + ); + + $query = $this->getDatabaseHandler()->createSelectQuery(); + $this->assertQueryResult( + array( + array( 'language_id' => 2, ), + ), + $query->selectDistinct( + array( 'language_id', ) + )->from( + 'ezcontentobject_attribute' + )->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 103 ), + $query->expr->eq( 'version', 1 ) + ) + ) + ); + } + + /** + * Counts the number of relations in the database. + * + * @param int $fromId + * @param int $toId + * + * @return int + */ + protected function countContentRelations( $fromId = null, $toId = null ) + { + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query->select( 'count(*)' ) + ->from( 'ezcontentobject_link' ); + + if ( $fromId !== null ) + { + $query->where( + 'from_contentobject_id=' . $fromId + ); + } + if ( $toId !== null ) + { + $query->where( + 'to_contentobject_id=' . $toId + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Counts the number of fields + * + * @param int $contentId + * + * @return int + */ + protected function countContentFields( $contentId = null ) + { + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query->select( 'count(*)' ) + ->from( 'ezcontentobject_attribute' ); + + if ( $contentId !== null ) + { + $query->where( + 'contentobject_id=' . $contentId + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Counts the number of versions + * + * @param int $contentId + * + * @return int + */ + protected function countContentVersions( $contentId = null ) + { + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query->select( 'count(*)' ) + ->from( 'ezcontentobject_version' ); + + if ( $contentId !== null ) + { + $query->where( + 'contentobject_id=' . $contentId + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Counts the number of content names + * + * @param int $contentId + * + * @return int + */ + protected function countContentNames( $contentId = null ) + { + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query->select( 'count(*)' ) + ->from( 'ezcontentobject_name' ); + + if ( $contentId !== null ) + { + $query->where( + 'contentobject_id=' . $contentId + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Counts the number of content objects + * + * @param int $contentId + * + * @return int + */ + protected function countContent( $contentId = null ) + { + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query->select( 'count(*)' ) + ->from( 'ezcontentobject' ); + + if ( $contentId !== null ) + { + $query->where( + 'id=' . $contentId + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * Stores $fixture in $file to be required as a fixture + * + * @param string $file + * @param mixed $fixture + * + * @return void + */ + protected function storeFixture( $file, $fixture ) + { + file_put_contents( + $file, + "fieldDefinitionId = 231; + $field->type = 'ezstring'; + $field->languageCode = 'eng-GB'; + $field->versionNo = 1; + + return $field; + } + + /** + * Returns a Field fixture in a different language + * + * @return Field + */ + protected function getOtherLanguageFieldFixture() + { + $field = $this->getFieldFixture(); + $field->languageCode = 'eng-US'; + return $field; + } + + /** + * Returns a StorageFieldValue fixture + * + * @return StorageFieldValue + */ + protected function getStorageValueFixture() + { + $value = new StorageFieldValue(); + + $value->dataFloat = 24.42; + $value->dataInt = 42; + $value->dataText = 'Test text'; + $value->sortKeyInt = 23; + $value->sortKeyString = 'Test'; + + return $value; + } + + /** + * Returns a ready to test EzcDatabase gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase + */ + protected function getDatabaseGateway() + { + if ( !isset( $this->databaseGateway ) ) + { + $this->databaseGateway = new EzcDatabase( + ( $dbHandler = $this->getDatabaseHandler() ), + new EzcDatabase\QueryBuilder( $dbHandler ), + $this->getLanguageHandler(), + $this->getLanguageMaskGenerator() + ); + } + return $this->databaseGateway; + } + + /** + * EzcDatabaseTest::getRelationCreateStructFixture() + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct + */ + protected function getRelationCreateStructFixture() + { + $struct = new RelationCreateStruct; + + $struct->destinationContentId = 1; + $struct->sourceContentId = 1; + $struct->sourceContentVersionNo = 1; + $struct->sourceFieldDefinitionId = 0; + $struct->type = RelationValue::COMMON; + + return $struct; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/CacheTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/CacheTest.php new file mode 100644 index 0000000..e68cd5c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/CacheTest.php @@ -0,0 +1,210 @@ +getCache(); + + $languageFixture = $this->getLanguageFixture(); + + $cache->store( $languageFixture ); + + $this->assertAttributeEquals( + array( + $languageFixture->id => $languageFixture, + ), + 'mapById', + $cache + ); + $this->assertAttributeEquals( + array( + $languageFixture->languageCode => $languageFixture, + ), + 'mapByLocale', + $cache + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache::remove + * + * @return void + */ + public function testRemove() + { + $cache = $this->getCache(); + + $languageFixture = $this->getLanguageFixture(); + + $cache->store( $languageFixture ); + $cache->remove( $languageFixture->id ); + + $this->assertAttributeEquals( + array(), + 'mapById', + $cache + ); + $this->assertAttributeEquals( + array(), + 'mapByLocale', + $cache + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache::getById + * + * @return void + */ + public function testGetById() + { + $cache = $this->getCache(); + + $languageFixture = $this->getLanguageFixture(); + + $cache->store( $languageFixture ); + + $this->assertSame( + $languageFixture, + $cache->getById( $languageFixture->id ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache::getById + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testGetByIdFailure() + { + $cache = $this->getCache(); + + $languageFixture = $this->getLanguageFixture(); + + // $cache->store( $languageFixture ); + $cache->getById( $languageFixture->id ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache::getByLocale + * + * @return void + */ + public function testGetByLocale() + { + $cache = $this->getCache(); + + $languageFixture = $this->getLanguageFixture(); + + $cache->store( $languageFixture ); + + $this->assertSame( + $languageFixture, + $cache->getByLocale( $languageFixture->languageCode ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache::getByLocale + * @expectedException eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testGetByLocaleFailure() + { + $cache = $this->getCache(); + + $languageFixture = $this->getLanguageFixture(); + + // $cache->store( $languageFixture ); + $cache->getByLocale( $languageFixture->languageCode ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache::getAll + * + * @return void + */ + public function testGetAll() + { + $cache = $this->getCache(); + + $languageFixture = $this->getLanguageFixture(); + + $cache->store( $languageFixture ); + + $this->assertSame( + array( $languageFixture->languageCode => $languageFixture ), + $cache->getAll() + ); + } + + /** + * Returns the language cache to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache + */ + protected function getCache() + { + if ( !isset( $this->cache ) ) + { + $this->cache = new Cache(); + } + return $this->cache; + } + + /** + * Returns language fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + protected function getLanguageFixture() + { + $langUs = new Language(); + + $langUs->id = 2; + $langUs->languageCode = 'eng-US'; + $langUs->name = 'English (American)'; + $langUs->isEnabled = true; + + return $langUs; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/CachingLanguageHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/CachingLanguageHandlerTest.php new file mode 100644 index 0000000..da861e6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/CachingLanguageHandlerTest.php @@ -0,0 +1,401 @@ +getLanguageHandler(); + + $this->assertAttributeSame( + $this->getInnerLanguageHandlerMock(), + 'innerHandler', + $handler + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::__construct + * + * @return void + */ + public function testCtorPropertyLanguageCache() + { + $handler = $this->getLanguageHandler(); + + $this->assertAttributeSame( + $this->getLanguageCacheMock(), + 'languageCache', + $handler + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::create + * + * @return void + */ + public function testCreate() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $innerHandlerMock = $this->getInnerLanguageHandlerMock(); + $cacheMock = $this->getLanguageCacheMock(); + + $languageFixture = $this->getLanguageFixture(); + + $innerHandlerMock->expects( $this->once() ) + ->method( 'create' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\CreateStruct' + ) + )->will( $this->returnValue( $languageFixture ) ); + + // Cache has been initialized before + $cacheMock->expects( $this->at( 2 ) ) + ->method( 'store' ) + ->with( $this->equalTo( $languageFixture ) ); + + $createStruct = $this->getCreateStructFixture(); + + $result = $handler->create( $createStruct ); + + $this->assertEquals( + $languageFixture, + $result + ); + } + + /** + * Returns a Language CreateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct + */ + protected function getCreateStructFixture() + { + return new Language\CreateStruct(); + } + + /** + * Returns a Language + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + protected function getLanguageFixture() + { + $language = new Language(); + $language->id = 8; + $language->languageCode = 'de-DE'; + return $language; + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::update + * + * @return void + */ + public function testUpdate() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + + $innerHandlerMock = $this->getInnerLanguageHandlerMock(); + $cacheMock = $this->getLanguageCacheMock(); + + $innerHandlerMock->expects( $this->once() ) + ->method( 'update' ) + ->with( $this->getLanguageFixture() ); + + // Cache has been initialized before + $cacheMock->expects( $this->at( 2 ) ) + ->method( 'store' ) + ->with( $this->getLanguageFixture() ); + + $handler->update( $this->getLanguageFixture() ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::load + * + * @return void + */ + public function testLoad() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $cacheMock = $this->getLanguageCacheMock(); + + $cacheMock->expects( $this->once() ) + ->method( 'getById' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( $this->getLanguageFixture() ) ); + + $result = $handler->load( 2 ); + + $this->assertEquals( + $this->getLanguageFixture(), + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadFailure() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $cacheMock = $this->getLanguageCacheMock(); + + $cacheMock->expects( $this->once() ) + ->method( 'getById' ) + ->with( $this->equalTo( 2 ) ) + ->will( + $this->throwException( + new NotFoundException( 'Language', 2 ) + ) + ); + + $result = $handler->load( 2 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::loadByLanguageCode + * + * @return void + */ + public function testLoadByLanguageCode() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $cacheMock = $this->getLanguageCacheMock(); + + $cacheMock->expects( $this->once() ) + ->method( 'getByLocale' ) + ->with( $this->equalTo( 'eng-US' ) ) + ->will( $this->returnValue( $this->getLanguageFixture() ) ); + + $result = $handler->loadByLanguageCode( 'eng-US' ); + + $this->assertEquals( + $this->getLanguageFixture(), + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::loadByLanguageCode + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadByLanguageCodeFailure() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $cacheMock = $this->getLanguageCacheMock(); + + $cacheMock->expects( $this->once() ) + ->method( 'getByLocale' ) + ->with( $this->equalTo( 'eng-US' ) ) + ->will( + $this->throwException( + new NotFoundException( 'Language', 'eng-US' ) + ) + ); + + $result = $handler->loadByLanguageCode( 'eng-US' ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::loadAll + * + * @return void + */ + public function testLoadAll() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $cacheMock = $this->getLanguageCacheMock(); + + $cacheMock->expects( $this->once() ) + ->method( 'getAll' ) + ->will( $this->returnValue( array() ) ); + + $result = $handler->loadAll(); + + $this->assertInternalType( + 'array', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler::delete + * + * @return void + */ + public function testDelete() + { + $this->expectCacheInitialize(); + + $handler = $this->getLanguageHandler(); + $cacheMock = $this->getLanguageCacheMock(); + $innerHandlerMock = $this->getInnerLanguageHandlerMock(); + + $innerHandlerMock->expects( $this->once() ) + ->method( 'delete' ) + ->with( $this->equalTo( 2 ) ); + + $cacheMock->expects( $this->once() ) + ->method( 'remove' ) + ->with( $this->equalTo( 2 ) ); + + $result = $handler->delete( 2 ); + } + + /** + * Returns the language handler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\CachingHandler + */ + protected function getLanguageHandler() + { + if ( !isset( $this->languageHandler ) ) + { + $this->languageHandler = new CachingHandler( + $this->getInnerLanguageHandlerMock(), + $this->getLanguageCacheMock() + ); + } + return $this->languageHandler; + } + + /** + * Returns a mock for the inner language handler + * + * @return \eZ\Publish\SPI\Persistence\Content\Language\Handler + */ + protected function getInnerLanguageHandlerMock() + { + if ( !isset( $this->innerHandlerMock ) ) + { + $this->innerHandlerMock = $this->getMock( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\Handler' + ); + } + return $this->innerHandlerMock; + } + + /** + * Returns a mock for the language cache + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Cache + */ + protected function getLanguageCacheMock() + { + if ( !isset( $this->languageCacheMock ) ) + { + $this->languageCacheMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Language\\Cache' + ); + } + return $this->languageCacheMock; + } + + /** + * Adds expectation for cache initialize to mocks + * + * @return void + */ + protected function expectCacheInitialize() + { + $innerHandlerMock = $this->getInnerLanguageHandlerMock(); + $innerHandlerMock->expects( $this->once() ) + ->method( 'loadAll' ) + ->will( $this->returnValue( $this->getLanguagesFixture() ) ); + } + + /** + * Returns an array with 2 languages + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + protected function getLanguagesFixture() + { + $langUs = new Language(); + $langUs->id = 2; + $langUs->languageCode = 'eng-US'; + $langUs->name = 'English (American)'; + $langUs->isEnabled = true; + + $langGb = new Language(); + $langGb->id = 4; + $langGb->languageCode = 'eng-GB'; + $langGb->name = 'English (United Kingdom)'; + $langGb->isEnabled = true; + + return array( $langUs, $langGb ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..988a019 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/Gateway/EzcDatabaseTest.php @@ -0,0 +1,246 @@ +insertDatabaseFixture( + __DIR__ . '/../../_fixtures/languages.php' + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::__construct + * + * @return void + */ + public function testCtor() + { + $handler = $this->getDatabaseHandler(); + $gateway = $this->getDatabaseGateway(); + + $this->assertAttributeSame( + $handler, + 'dbHandler', + $gateway + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::insertLanguage + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::setCommonLanguageColumns + */ + public function testInsertLanguage() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->insertLanguage( $this->getLanguageFixture() ); + + $this->assertQueryResult( + array( + array( + 'id' => '8', + 'locale' => 'de-DE', + 'name' => 'Deutsch (Deutschland)', + 'disabled' => '0', + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'id', 'locale', 'name', 'disabled' ) + ->from( 'ezcontent_language' ) + ->where( 'id=8' ) + ); + } + + /** + * Returns a Language fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + protected function getLanguageFixture() + { + $language = new Language(); + + $language->languageCode = 'de-DE'; + $language->name = 'Deutsch (Deutschland)'; + $language->isEnabled = true; + + return $language; + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::updateLanguage + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::setCommonLanguageColumns + */ + public function testUpdateLanguage() + { + $gateway = $this->getDatabaseGateway(); + + $language = $this->getLanguageFixture(); + $language->id = 2; + + $gateway->updateLanguage( $language ); + + $this->assertQueryResult( + array( + array( + 'id' => '2', + 'locale' => 'de-DE', + 'name' => 'Deutsch (Deutschland)', + 'disabled' => '0', + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'id', 'locale', 'name', 'disabled' ) + ->from( 'ezcontent_language' ) + ->where( 'id=2' ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::loadLanguageData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::createFindQuery + */ + public function testLoadLanguageData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadLanguageData( 2 ); + + $this->assertEquals( + array( + array( + 'id' => '2', + 'locale' => 'eng-US', + 'name' => 'English (American)', + 'disabled' => '0', + ) + ), + $result + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::loadAllLanguagesData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::createFindQuery + */ + public function testLoadAllLanguagesData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadAllLanguagesData(); + + $this->assertEquals( + array( + array( + 'id' => '2', + 'locale' => 'eng-US', + 'name' => 'English (American)', + 'disabled' => '0', + ), + array( + 'id' => '4', + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)', + 'disabled' => '0', + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase::deleteLanguage + * + * @return void + */ + public function testDeleteLanguage() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->deleteLanguage( 2 ); + + $this->assertQueryResult( + array( + array( + 'count' => '1' + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * ) AS count' ) + ->from( 'ezcontent_language' ) + ); + + $this->assertQueryResult( + array( + array( + 'count' => '0' + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * ) AS count' ) + ->from( 'ezcontent_language' ) + ->where( 'id=2' ) + ); + } + + /** + * Returns a ready to test EzcDatabase gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase + */ + protected function getDatabaseGateway() + { + if ( !isset( $this->databaseGateway ) ) + { + $this->databaseGateway = new EzcDatabase( + $this->getDatabaseHandler() + ); + } + return $this->databaseGateway; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/LanguageHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/LanguageHandlerTest.php new file mode 100644 index 0000000..663692b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/LanguageHandlerTest.php @@ -0,0 +1,354 @@ +getLanguageHandler(); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'createLanguageFromCreateStruct' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\CreateStruct' + ) + )->will( $this->returnValue( new Language() ) ); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'insertLanguage' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language' + ) + )->will( $this->returnValue( 2 ) ); + + $createStruct = $this->getCreateStructFixture(); + + $result = $handler->create( $createStruct ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', + $result + ); + $this->assertEquals( + 2, + $result->id + ); + } + + /** + * Returns a Language CreateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct + */ + protected function getCreateStructFixture() + { + return new Language\CreateStruct(); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::update + * + * @return void + */ + public function testUpdate() + { + $handler = $this->getLanguageHandler(); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'updateLanguage' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language' ) ); + + $handler->update( $this->getLanguageFixture() ); + } + + /** + * Returns a Language + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + protected function getLanguageFixture() + { + return new Language(); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::load + * + * @return void + */ + public function testLoad() + { + $handler = $this->getLanguageHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadLanguageData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractLanguagesFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Language() ) ) ); + + $result = $handler->load( 2 ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadFailure() + { + $handler = $this->getLanguageHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadLanguageData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractLanguagesFromRows' ) + ->with( $this->equalTo( array() ) ) + // No language extracted + ->will( $this->returnValue( array() ) ); + + $result = $handler->load( 2 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::loadByLanguageCode + * + * @return void + */ + public function testLoadByLanguageCode() + { + $handler = $this->getLanguageHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadLanguageDataByLanguageCode' ) + ->with( $this->equalTo( 'eng-US' ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractLanguagesFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Language() ) ) ); + + $result = $handler->loadByLanguageCode( 'eng-US' ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language', + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::loadByLanguageCode + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadByLanguageCodeFailure() + { + $handler = $this->getLanguageHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadLanguageDataByLanguageCode' ) + ->with( $this->equalTo( 'eng-US' ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractLanguagesFromRows' ) + ->with( $this->equalTo( array() ) ) + // No language extracted + ->will( $this->returnValue( array() ) ); + + $result = $handler->loadByLanguageCode( 'eng-US' ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::loadAll + * + * @return void + */ + public function testLoadAll() + { + $handler = $this->getLanguageHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadAllLanguagesData' ) + ->will( $this->returnValue( array() ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'extractLanguagesFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Language() ) ) ); + + $result = $handler->loadAll(); + + $this->assertInternalType( + 'array', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::delete + * + * @return void + */ + public function testDeleteSuccess() + { + $handler = $this->getLanguageHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'canDeleteLanguage' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( true ) ); + $gatewayMock->expects( $this->once() ) + ->method( 'deleteLanguage' ) + ->with( $this->equalTo( 2 ) ); + + $result = $handler->delete( 2 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler::delete + * @expectedException LogicException + */ + public function testDeleteFail() + { + $handler = $this->getLanguageHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'canDeleteLanguage' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( false ) ); + $gatewayMock->expects( $this->never() ) + ->method( 'deleteLanguage' ); + + $result = $handler->delete( 2 ); + } + + /** + * Returns the language handler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler + */ + protected function getLanguageHandler() + { + if ( !isset( $this->languageHandler ) ) + { + $this->languageHandler = new Handler( + $this->getGatewayMock(), + $this->getMapperMock() + ); + } + return $this->languageHandler; + } + + /** + * Returns a language mapper mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Mapper + */ + protected function getMapperMock() + { + if ( !isset( $this->mapperMock ) ) + { + $this->mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Language\\Mapper' + ); + } + return $this->mapperMock; + } + + /** + * Returns a mock for the language gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway + */ + protected function getGatewayMock() + { + if ( !isset( $this->gatewayMock ) ) + { + $this->gatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Language\\Gateway' + ); + } + return $this->gatewayMock; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/MapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/MapperTest.php new file mode 100644 index 0000000..9934e40 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/MapperTest.php @@ -0,0 +1,137 @@ +getCreateStructFixture(); + + $result = $mapper->createLanguageFromCreateStruct( $createStruct ); + + $this->assertStructsEqual( + $this->getLanguageFixture(), + $result, + array( 'languageCode', 'name', 'isEnabled' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\Mapper::extractLanguagesFromRows + * + * @return void + */ + public function testExtractLanguagesFromRows() + { + $mapper = new Mapper(); + + $rows = $this->getRowsFixture(); + + $result = $mapper->extractLanguagesFromRows( $rows ); + + $this->assertEquals( + $this->getExtractReference(), + $result + ); + } + + /** + * Returns a result rows fixture + * + * @return string[][] + */ + protected function getRowsFixture() + { + return array( + array( 'disabled' => '0', 'id' => '2', 'locale' => 'eng-US', 'name' => 'English (American)' ), + array( 'disabled' => '0', 'id' => '4', 'locale' => 'eng-GB', 'name' => 'English (United Kingdom)' ) + ); + } + + /** + * Returns reference for the extraction from rows + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + protected function getExtractReference() + { + $langUs = new Language(); + $langUs->id = 2; + $langUs->languageCode = 'eng-US'; + $langUs->name = 'English (American)'; + $langUs->isEnabled = true; + + $langGb = new Language(); + $langGb->id = 4; + $langGb->languageCode = 'eng-GB'; + $langGb->name = 'English (United Kingdom)'; + $langGb->isEnabled = true; + + return array( 'eng-US' => $langUs, 'eng-GB' => $langGb ); + } + + /** + * Returns a Language CreateStruct fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct + */ + protected function getCreateStructFixture() + { + $struct = new CreateStruct(); + + $struct->languageCode = 'de-DE'; + $struct->name = 'Deutsch (Deutschland)'; + $struct->isEnabled = true; + + return $struct; + } + + /** + * Returns a Language fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + protected function getLanguageFixture() + { + $struct = new Language(); + + $struct->languageCode = 'de-DE'; + $struct->name = 'Deutsch (Deutschland)'; + $struct->isEnabled = true; + + return $struct; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/MaskGeneratorTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/MaskGeneratorTest.php new file mode 100644 index 0000000..9006970 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Language/MaskGeneratorTest.php @@ -0,0 +1,322 @@ +getMaskGenerator(); + + $this->assertSame( + $expectedMask, + $generator->generateLanguageMask( $languages ) + ); + } + + /** + * Returns test data for {@link testGenerateLanguageMask()} + * + * @return array + */ + public static function getLanguageMaskData() + { + return array( + 'error' => array( + array(), + 0, + ), + 'single_lang' => array( + array( 'eng-GB' => true ), + 4, + ), + 'multi_lang' => array( + array( 'eng-US' => true, 'eng-GB' => true ), + 6, + ), + 'always_available' => array( + array( 'always-available' => 'eng-US', 'eng-US' => true ), + 3, + ), + 'full' => array( + array( 'always-available' => 'eng-US', 'eng-US' => true, 'eng-GB' => true ), + 7, + ), + ); + } + + /** + * @param string $languageCode + * @param boolean $alwaysAvailable + * @param int $expectedIndicator + * + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::generateLanguageIndicator + * @dataProvider getLanguageIndicatorData + */ + public function testGenerateLanguageIndicator( + $languageCode, $alwaysAvailable, $expectedIndicator ) + { + $generator = $this->getMaskGenerator(); + + $this->assertSame( + $expectedIndicator, + $generator->generateLanguageIndicator( $languageCode, $alwaysAvailable ) + ); + } + + /** + * Returns test data for {@link testGenerateLanguageIndicator()} + * + * @return array + */ + public static function getLanguageIndicatorData() + { + return array( + 'not_available' => array( + 'eng-GB', + false, + 4, + ), + 'always_available' => array( + 'eng-US', + true, + 3, + ), + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::isLanguageAlwaysAvailable + * + * @return void + */ + public function testIsLanguageAlwaysAvailable() + { + $generator = $this->getMaskGenerator(); + + $this->assertTrue( + $generator->isLanguageAlwaysAvailable( + 'eng-GB', + array( + 'always-available' => 'eng-GB', + 'eng-GB' => 'lala' + ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::isLanguageAlwaysAvailable + * + * @return void + */ + public function testIsLanguageAlwaysAvailableOtherLanguage() + { + $generator = $this->getMaskGenerator(); + + $this->assertFalse( + $generator->isLanguageAlwaysAvailable( + 'eng-GB', + array( + 'always-available' => 'eng-US', + 'eng-GB' => 'lala' + ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::isLanguageAlwaysAvailable + * + * @return void + */ + public function testIsLanguageAlwaysAvailableNoDefault() + { + $generator = $this->getMaskGenerator(); + + $this->assertFalse( + $generator->isLanguageAlwaysAvailable( + 'eng-GB', + array( + 'eng-GB' => 'lala' + ) + ) + ); + } + + /** + * @param int $languageMask + * @param boolean $expectedResult + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::isAlwaysAvailable + * @dataProvider isAlwaysAvailableProvider + */ + public function testIsAlwaysAvailable( $langMask, $expectedResult ) + { + $generator = $this->getMaskGenerator(); + self::assertSame( $expectedResult, $generator->isAlwaysAvailable( $langMask ) ); + } + + /** + * Returns test data for {@link testIsAlwaysAvailable()} + * + * @return array + */ + public function isAlwaysAvailableProvider() + { + return array( + array( 2, false ), + array( 3, true ), + array( 62, false ), + array( 14, false ), + array( 15, true ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::removeAlwaysAvailableFlag + * @dataProvider removeAlwaysAvailableFlagProvider + */ + public function testRemoveAlwaysAvailableFlag( $langMask, $expectedResult ) + { + $generator = $this->getMaskGenerator(); + self::assertSame( $expectedResult, $generator->removeAlwaysAvailableFlag( $langMask ) ); + } + + /** + * Returns test data for {@link testRemoveAlwaysAvailableFlag} + * + * @return array + */ + public function removeAlwaysAvailableFlagProvider() + { + return array( + array( 3, 2 ), + array( 7, 6 ), + array( 14, 14 ), + array( 62, 62 ) + ); + } + + /** + * @param int $langMask + * @param array $expectedResult + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator::extractLanguageIdsFromMask + * @dataProvider languageIdsFromMaskProvider + */ + public function testExtractLanguageIdsFromMask( $langMask, array $expectedResult ) + { + $generator = $this->getMaskGenerator(); + self::assertSame( $expectedResult, $generator->extractLanguageIdsFromMask( $langMask ) ); + } + + /** + * Returns test data for {@link testExtractLanguageIdsFromMask} + * + * @return array + */ + public function languageIdsFromMaskProvider() + { + return array( + array( + 2, + array( 2 ) + ), + array( + 15, + array( 2, 4, 8 ) + ), + array( + 62, + array( 2, 4, 8, 16, 32 ) + ), + ); + } + + /** + * Returns the mask generator to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator + */ + protected function getMaskGenerator() + { + return new MaskGenerator( $this->getLanguageHandler() ); + } + + /** + * Returns a language handler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler + */ + protected function getLanguageHandler() + { + if ( !isset( $this->languageHandler ) ) + { + $this->languageHandler = $this->getMock( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\Handler' ); + $this->languageHandler->expects( $this->any() ) + ->method( 'loadByLanguageCode' ) + ->will( + $this->returnCallback( + function ( $languageCode ) + { + switch ( $languageCode ) + { + case 'eng-US': + return new Language( + array( + 'id' => 2, + 'languageCode' => 'eng-US', + 'name' => 'US english' + ) + ); + case 'eng-GB': + return new Language( + array( + 'id' => 4, + 'languageCode' => 'eng-GB', + 'name' => 'British english' + ) + ); + } + } + ) + ); + } + return $this->languageHandler; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LanguageAwareTestCase.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LanguageAwareTestCase.php new file mode 100644 index 0000000..c86f5be --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LanguageAwareTestCase.php @@ -0,0 +1,63 @@ +languageHandler ) ) + { + $this->languageHandler = new LanguageHandlerMock(); + } + return $this->languageHandler; + } + + /** + * Returns a language mask generator + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator + */ + protected function getLanguageMaskGenerator() + { + if ( !isset( $this->languageMaskGenerator ) ) + { + $this->languageMaskGenerator = new LanguageMaskGenerator( + $this->getLanguageHandler() + ); + } + return $this->languageMaskGenerator; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LanguageHandlerMock.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LanguageHandlerMock.php new file mode 100644 index 0000000..9ce2df0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LanguageHandlerMock.php @@ -0,0 +1,121 @@ +languages[] = new Language( + array( + 'id' => 2, + 'languageCode' => 'eng-US', + 'name' => 'US english' + ) + ); + $this->languages[] = new Language( + array( + 'id' => 4, + 'languageCode' => 'eng-GB', + 'name' => 'British english' + ) + ); + } + + /** + * Create a new language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function create( CreateStruct $struct ) + { + throw new \RuntimeException( "Not implemented, yet." ); + } + + /** + * Update language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language $struct + */ + public function update( Language $struct ) + { + throw new \RuntimeException( "Not implemented, yet." ); + } + + /** + * Get language by id + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $id + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function load( $id ) + { + foreach ( $this->languages as $language ) + { + if ( $language->id == $id ) + { + return $language; + } + } + throw new \RuntimeException( "Language $id not found." ); + } + + /** + * Get language by Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $languageCode + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function loadByLanguageCode( $languageCode ) + { + foreach ( $this->languages as $language ) + { + if ( $language->languageCode == $languageCode ) + { + return $language; + } + } + throw new \RuntimeException( "Language $languageCode not found." ); + } + + /** + * Get all languages + * + * Return list of languages where key of hash is language code. + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function loadAll() + { + return $this->languages; + } + + /** + * Delete a language + * + * @todo Might throw an exception if the language is still associated with some content / types / (...) ? + * + * @param mixed $id + */ + public function delete( $id ) + { + throw new \RuntimeException( "Not implemented, yet." ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/EzpDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/EzpDatabaseTest.php new file mode 100644 index 0000000..97222ef --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/EzpDatabaseTest.php @@ -0,0 +1,1022 @@ +getDatabaseHandler(); + return new EzcDatabase( $dbHandler ); + } + + public static function getLoadLocationValues() + { + return array( + array( 'node_id', 77 ), + array( 'priority', 0 ), + array( 'is_hidden', 0 ), + array( 'is_invisible', 0 ), + array( 'remote_id', 'dbc2f3c8716c12f32c379dbf0b1cb133' ), + array( 'contentobject_id', 75 ), + array( 'parent_node_id', 2 ), + array( 'path_identification_string', 'solutions' ), + array( 'path_string', '/1/2/77/' ), + array( 'modified_subnode', 1311065017 ), + array( 'main_node_id', 77 ), + array( 'depth', 2 ), + array( 'sort_field', 2 ), + array( 'sort_order', 1 ), + ); + } + + /** + * @dataProvider getLoadLocationValues + */ + public function testLoadLocationByRemoteId( $field, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $data = $handler->getBasicNodeDataByRemoteId( 'dbc2f3c8716c12f32c379dbf0b1cb133' ); + + $this->assertEquals( + $value, + $data[$field], + "Value in property $field not as expected." + ); + } + + /** + * @dataProvider getLoadLocationValues + */ + public function testLoadLocation( $field, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $data = $handler->getBasicNodeData( 77 ); + + $this->assertEquals( + $value, + $data[$field], + "Value in property $field not as expected." + ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadInvalidLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $data = $handler->getBasicNodeData( 1337 ); + } + + /** + * @dataProvider getLoadLocationValues + */ + public function testLoadLocationDataByContent( $field, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + + $gateway = $this->getLocationGateway(); + + $locationsData = $gateway->loadLocationDataByContent( 75 ); + + $this->assertCount( 1, $locationsData ); + + $locationRow = reset( $locationsData ); + + $this->assertEquals( $value, $locationRow[$field] ); + } + + public function testLoadLocationDataByContentLimitSubtree() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + + $gateway = $this->getLocationGateway(); + + $locationsData = $gateway->loadLocationDataByContent( 75, 3 ); + + $this->assertCount( 0, $locationsData ); + } + + public function testMoveSubtreePathUpdate() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->moveSubtreeNodes( + array( + 'path_string' => '/1/2/69/', + 'path_identification_string' => 'products' + ), + array( + 'path_string' => '/1/2/77/', + 'path_identification_string' => 'solutions' + ) + ); + + /** @var $query \ezcQuerySelect */ + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 65, '/1/2/', '', 1, 1 ), + array( 67, '/1/2/77/69/', 'solutions/products', 77, 3 ), + array( 69, '/1/2/77/69/70/71/', 'solutions/products/software/os_type_i', 70, 5 ), + array( 73, '/1/2/77/69/72/75/', 'solutions/products/boxes/cd_dvd_box_iii', 72, 5 ), + array( 75, '/1/2/77/', 'solutions', 2, 2 ), + ), + $query + ->select( 'contentobject_id', 'path_string', 'path_identification_string', 'parent_node_id', 'depth' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 69, 71, 75, 77, 2 ) ) ) + ->orderBy( 'contentobject_id' ) + ); + } + + public function testMoveSubtreeAssignmentUpdate() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->updateNodeAssignment( 67, 2, 77, 5 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 67, 1, 0, 53, 1, 5, 77, '9cec85d730eec7578190ee95ce5a36f5', 0, 2, 1 ), + ), + $query + ->select( '*' ) + ->from( 'eznode_assignment' ) + ->where( $query->expr->eq( 'contentobject_id', 67 ) ) + ); + } + + public function testUpdateSubtreeModificationTime() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $time = time(); + $handler->updateSubtreeModificationTime( '/1/2/69/' ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( '/1/' ), + array( '/1/2/' ), + array( '/1/2/69/' ), + ), + $query + ->select( 'path_string' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->gte( 'modified_subnode', $time ) ) + ->orderBy( 'path_string' ) + ); + } + + public function testHideUpdateHidden() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->hideSubtree( '/1/2/69/' ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 1, 0, 0 ), + array( 2, 0, 0 ), + array( 69, 1, 1 ), + array( 75, 0, 1 ), + ), + $query + ->select( 'node_id', 'is_hidden', 'is_invisible' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 1, 2, 69, 75 ) ) ) + ->orderBy( 'node_id' ) + ); + } + + /** + * @depends testHideUpdateHidden + */ + public function testHideUnhideUpdateHidden() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->hideSubtree( '/1/2/69/' ); + $handler->unhideSubtree( '/1/2/69/' ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 1, 0, 0 ), + array( 2, 0, 0 ), + array( 69, 0, 0 ), + array( 75, 0, 0 ), + ), + $query + ->select( 'node_id', 'is_hidden', 'is_invisible' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 1, 2, 69, 75 ) ) ) + ->orderBy( 'node_id' ) + ); + } + + /** + * @depends testHideUpdateHidden + */ + public function testHideUnhideParentTree() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->hideSubtree( '/1/2/69/' ); + $handler->hideSubtree( '/1/2/69/70/' ); + $handler->unhideSubtree( '/1/2/69/' ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 1, 0, 0 ), + array( 2, 0, 0 ), + array( 69, 0, 0 ), + array( 70, 1, 1 ), + array( 71, 0, 1 ), + array( 75, 0, 0 ), + ), + $query + ->select( 'node_id', 'is_hidden', 'is_invisible' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 1, 2, 69, 70, 71, 75 ) ) ) + ->orderBy( 'node_id' ) + ); + } + + /** + * @depends testHideUpdateHidden + */ + public function testHideUnhidePartialSubtree() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->hideSubtree( '/1/2/69/' ); + $handler->hideSubtree( '/1/2/69/70/' ); + $handler->unhideSubtree( '/1/2/69/70/' ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 1, 0, 0 ), + array( 2, 0, 0 ), + array( 69, 1, 1 ), + array( 70, 0, 1 ), + array( 71, 0, 1 ), + array( 75, 0, 1 ), + ), + $query + ->select( 'node_id', 'is_hidden', 'is_invisible' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 1, 2, 69, 70, 71, 75 ) ) ) + ->orderBy( 'node_id' ) + ); + } + + public function testSwapLocations() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->swap( 70, 78 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 70, 76 ), + array( 78, 68 ), + ), + $query + ->select( 'node_id', 'contentobject_id' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 70, 78 ) ) ) + ->orderBy( 'node_id' ) + ); + } + + public function testCreateLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->create( + new CreateStruct( + array( + 'contentId' => 68, + 'remoteId' => 'some_id', + ) + ), + array( + 'node_id' => '77', + 'depth' => '2', + 'path_string' => '/1/2/77/', + ) + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 70, '/1/2/69/70/' ), + array( 77, '/1/2/77/' ), + array( 228, '/1/2/77/228/' ), + ), + $query + ->select( 'node_id', 'path_string' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'contentobject_id', array( 68, 75 ) ) ) + ->orderBy( 'node_id' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::getMainNodeId + * @depends testCreateLocation + */ + public function testGetMainNodeId() + { + // $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + + $parentLocationData = array( + 'node_id' => '77', + 'depth' => '2', + 'path_string' => '/1/2/77/', + ); + + // main location + $mainLocation = $handler->create( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'remoteId' => 'some_id', + 'mainLocationId' => true, + ) + ), + $parentLocationData + ); + + // secondary location + $handler->create( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'remoteId' => 'some_id', + 'mainLocationId' => $mainLocation->id, + ) + ), + $parentLocationData + ); + + $handlerReflection = new \ReflectionObject( $handler ); + $methodReflection = $handlerReflection->getMethod( "getMainNodeId" ); + $methodReflection->setAccessible( true ); + self::assertEquals( $mainLocation->id, $res = $methodReflection->invoke( $handler, 68 ) ); + } + + public static function getCreateLocationValues() + { + return array( + array( 'contentobject_id', 68 ), + array( 'contentobject_is_published', 1 ), + array( 'contentobject_version', 1 ), + array( 'depth', 3 ), + array( 'is_hidden', 0 ), + array( 'is_invisible', 0 ), + array( 'main_node_id', 42 ), + array( 'parent_node_id', 77 ), + array( 'path_identification_string', '' ), + array( 'priority', 1 ), + array( 'remote_id', 'some_id' ), + array( 'sort_field', 1 ), + array( 'sort_order', 1 ), + ); + } + + /** + * @depends testCreateLocation + * @dataProvider getCreateLocationValues + */ + public function testCreateLocationValues( $field, $value ) + { + if ( $value === null ) + { + $this->markTestIncomplete( 'Proper value setting yet unknown.' ); + } + + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->create( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'mainLocationId' => 42, + 'priority' => 1, + 'remoteId' => 'some_id', + 'sortField' => 1, + 'sortOrder' => 1, + ) + ), + array( + 'node_id' => '77', + 'depth' => '2', + 'path_string' => '/1/2/77/', + ) + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( $value ) ), + $query + ->select( $field ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->eq( 'node_id', 228 ) ) + ); + } + + public static function getCreateLocationReturnValues() + { + return array( + array( 'id', 228 ), + array( 'priority', 1 ), + array( 'hidden', false ), + array( 'invisible', false ), + array( 'remoteId', 'some_id' ), + array( 'contentId', '68' ), + array( 'parentId', '77' ), + array( 'pathIdentificationString', '' ), + array( 'pathString', '/1/2/77/228/' ), + array( 'mainLocationId', 228 ), + array( 'depth', 3 ), + array( 'sortField', 1 ), + array( 'sortOrder', 1 ), + ); + } + + /** + * @depends testCreateLocation + * @dataProvider getCreateLocationReturnValues + */ + public function testCreateLocationReturnValues( $field, $value ) + { + if ( $value === null ) + { + $this->markTestIncomplete( 'Proper value setting yet unknown.' ); + } + + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $location = $handler->create( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'mainLocationId' => true, + 'priority' => 1, + 'remoteId' => 'some_id', + 'sortField' => 1, + 'sortOrder' => 1, + ) + ), + array( + 'node_id' => '77', + 'depth' => '2', + 'path_string' => '/1/2/77/', + ) + ); + + $this->assertTrue( $location instanceof Location ); + $this->assertEquals( $value, $location->$field ); + } + + public static function getUpdateLocationData() + { + return array( + array( 'priority', 23 ), + array( 'remote_id', 'someNewHash' ), + array( 'sort_field', 4 ), + array( 'sort_order', 4 ), + ); + } + + /** + * @dataProvider getUpdateLocationData + */ + public function testUpdateLocation( $field, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->update( + new Location\UpdateStruct( + array( + 'priority' => 23, + 'remoteId' => 'someNewHash', + 'sortField' => 4, + 'sortOrder' => 4, + ) + ), + 70 + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( $value ) ), + $query + ->select( $field ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 70 ) ) ) + ); + } + + public static function getNodeAssignmentValues() + { + return array( + array( 'contentobject_version', 1 ), + array( 'from_node_id', 0 ), + array( 'id', 214 ), + array( 'is_main', 0 ), + array( 'op_code', 3 ), + array( 'parent_node', 77 ), + array( 'parent_remote_id', '' ), + array( 'remote_id', 'some_id' ), + array( 'sort_field', 2 ), + array( 'sort_order', 0 ), + array( 'is_main', 0 ), + ); + } + + /** + * @depends testCreateLocation + * @dataProvider getNodeAssignmentValues + */ + public function testCreateLocationNodeAssignmentCreation( $field, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->createNodeAssignment( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'mainLocationId' => 1, + 'priority' => 1, + 'remoteId' => 'some_id', + 'sortField' => 1, + 'sortOrder' => 1, + ) + ), + '77', + EzcDatabase::NODE_ASSIGNMENT_OP_CODE_CREATE + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( $value ) ), + $query + ->select( $field ) + ->from( 'eznode_assignment' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 68 ), + $query->expr->eq( 'parent_node', 77 ) + ) + ) + ); + } + + /** + * @depends testCreateLocation + */ + public function testCreateLocationNodeAssignmentCreationMainLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->createNodeAssignment( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'mainLocationId' => true, + 'priority' => 1, + 'remoteId' => 'some_id', + 'sortField' => 1, + 'sortOrder' => 1, + ) + ), + '77', + EzcDatabase::NODE_ASSIGNMENT_OP_CODE_CREATE + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( 1 ) ), + $query + ->select( 'is_main' ) + ->from( 'eznode_assignment' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 68 ), + $query->expr->eq( 'parent_node', 77 ) + ) + ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::updateLocationsContentVersionNo + */ + public function testUpdateLocationsContentVersionNo() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $gateway = $this->getLocationGateway(); + + $gateway->create( + new CreateStruct( + array( + "contentId" => 4096, + "remoteId" => "some_id", + "contentVersion" => 1 + ) + ), + array( + "node_id" => "77", + "depth" => "2", + "path_string" => "/1/2/77/" + ) + ); + + $gateway->updateLocationsContentVersionNo( 4096, 2 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 2 ), + ), + $query->select( + "contentobject_version" + )->from( + "ezcontentobject_tree" + )->where( + $query->expr->eq( + "contentobject_id", + 4096 + ) + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::deleteNodeAssignment + * + * @return void + */ + public function testDeleteNodeAssignment() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + + $handler->deleteNodeAssignment( 11 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( 0 ) ), + $query + ->select( 'count(*)' ) + ->from( 'eznode_assignment' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 11 ) + ) + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::deleteNodeAssignment + * + * @return void + */ + public function testDeleteNodeAssignmentWithSecondArgument() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + + $query = $this->handler->createSelectQuery(); + $query + ->select( 'count(*)' ) + ->from( 'eznode_assignment' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 11 ) + ) + ); + $statement = $query->prepare(); + $statement->execute(); + $nodeAssignmentsCount = (int)$statement->fetchColumn(); + + $handler->deleteNodeAssignment( 11, 1 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( $nodeAssignmentsCount - 1 ) ), + $query + ->select( 'count(*)' ) + ->from( 'eznode_assignment' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 11 ) + ) + ) + ); + } + + /** + * @depends testCreateLocationNodeAssignmentCreation + */ + public function testConvertNodeAssignments() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + + $handler = $this->getLocationGateway(); + $handler->createNodeAssignment( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'mainLocationId' => 1, + 'priority' => 1, + 'remoteId' => 'some_id', + 'sortField' => 1, + 'sortOrder' => 1, + ) + ), + '77', + EzcDatabase::NODE_ASSIGNMENT_OP_CODE_CREATE + ); + + $handler->createLocationsFromNodeAssignments( 68, 1 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( '/1/2/77/228/' ) ), + $query + ->select( 'path_string' ) + ->from( 'ezcontentobject_tree' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 68 ), + $query->expr->eq( 'parent_node_id', 77 ) + ) + ) + ); + } + + /** + * @depends testCreateLocationNodeAssignmentCreation + */ + public function testConvertNodeAssignmentsUpdateAssignment() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + + $handler = $this->getLocationGateway(); + $handler->createNodeAssignment( + new CreateStruct( + array( + 'contentId' => 68, + 'contentVersion' => 1, + 'mainLocationId' => 1, + 'priority' => 1, + 'remoteId' => 'some_id', + 'sortField' => 1, + 'sortOrder' => 1, + ) + ), + '77', + EzcDatabase::NODE_ASSIGNMENT_OP_CODE_CREATE + ); + + $handler->createLocationsFromNodeAssignments( 68, 1 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( EzcDatabase::NODE_ASSIGNMENT_OP_CODE_CREATE_NOP ) ), + $query + ->select( 'op_code' ) + ->from( 'eznode_assignment' ) + ->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 68 ), + $query->expr->eq( 'parent_node', 77 ) + ) + ) + ); + } + + /** + * Test for the setSectionForSubtree() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::setSectionForSubtree + */ + public function testSetSectionForSubtree() + { + $this->insertDatabaseFixture( __DIR__ . '/../../_fixtures/contentobjects.php' ); + $handler = $this->getLocationGateway(); + $handler->setSectionForSubtree( '/1/2/69/70/', 23 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( 68 ), array( 69 ) ), + $query + ->select( 'id' ) + ->from( 'ezcontentobject' ) + ->where( $query->expr->eq( 'section_id', 23 ) ) + ); + } + + /** + * Test for the changeMainLocation() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::changeMainLocation + */ + public function testChangeMainLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + // Create additional location and assignment for test purpose + $query = $this->handler->createInsertQuery(); + $query->insertInto( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( $this->handler->quoteColumn( 'contentobject_id' ), $query->bindValue( 10, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'contentobject_version' ), $query->bindValue( 2, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'main_node_id' ), $query->bindValue( 15, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'node_id' ), $query->bindValue( 228, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'parent_node_id' ), $query->bindValue( 227, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'path_string' ), $query->bindValue( '/1/5/13/228/', null, \PDO::PARAM_STR ) ) + ->set( $this->handler->quoteColumn( 'remote_id' ), $query->bindValue( 'asdfg123437', null, \PDO::PARAM_STR ) ); + $query->prepare()->execute(); + $query = $this->handler->createInsertQuery(); + $query->insertInto( $this->handler->quoteTable( 'eznode_assignment' ) ) + ->set( $this->handler->quoteColumn( 'contentobject_id' ), $query->bindValue( 10, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'contentobject_version' ), $query->bindValue( 2, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'id' ), $query->bindValue( 0, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'is_main' ), $query->bindValue( 0, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'parent_node' ), $query->bindValue( 227, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'parent_remote_id' ), $query->bindValue( '5238a276bf8231fbcf8a986cdc82a6a5', null, \PDO::PARAM_STR ) ); + $query->prepare()->execute(); + + $gateway = $this->getLocationGateway(); + + $gateway->changeMainLocation( + 10, // content id + 228, // new main location id + 2, // content version number + 227 // new main location parent id + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( 228 ), array( 228 ) ), + $query->select( + 'main_node_id' + )->from( + 'ezcontentobject_tree' + )->where( + $query->expr->eq( 'contentobject_id', 10 ) + ) + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( 1 ) ), + $query->select( + 'is_main' + )->from( + 'eznode_assignment' + )->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 10 ), + $query->expr->eq( 'contentobject_version', 2 ), + $query->expr->eq( 'parent_node', 227 ) + ) + ) + ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( 0 ) ), + $query->select( + 'is_main' + )->from( + 'eznode_assignment' + )->where( + $query->expr->lAnd( + $query->expr->eq( 'contentobject_id', 10 ), + $query->expr->eq( 'contentobject_version', 2 ), + $query->expr->eq( 'parent_node', 44 ) + ) + ) + ); + } + + /** + * Test for the getChildren() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::getChildren + */ + public function testGetChildren() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + + $gateway = $this->getLocationGateway(); + $childrenRows = $gateway->getChildren( 213 ); + + $this->assertCount( 2, $childrenRows ); + $this->assertCount( 16, $childrenRows[0] ); + $this->assertEquals( 214, $childrenRows[0]["node_id"] ); + $this->assertCount( 16, $childrenRows[1] ); + $this->assertEquals( 215, $childrenRows[1]["node_id"] ); + } + + /** + * Test for the getFallbackMainNodeData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::getFallbackMainNodeData + */ + public function testGetFallbackMainNodeData() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + // Create additional location for test purpose + $query = $this->handler->createInsertQuery(); + $query->insertInto( $this->handler->quoteTable( 'ezcontentobject_tree' ) ) + ->set( $this->handler->quoteColumn( 'contentobject_id' ), $query->bindValue( 12, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'contentobject_version' ), $query->bindValue( 1, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'main_node_id' ), $query->bindValue( 13, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'node_id' ), $query->bindValue( 228, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'parent_node_id' ), $query->bindValue( 227, null, \PDO::PARAM_INT ) ) + ->set( $this->handler->quoteColumn( 'path_string' ), $query->bindValue( '/1/5/13/228/', null, \PDO::PARAM_STR ) ) + ->set( $this->handler->quoteColumn( 'remote_id' ), $query->bindValue( 'asdfg123437', null, \PDO::PARAM_STR ) ); + $query->prepare()->execute(); + + $gateway = $this->getLocationGateway(); + $data = $gateway->getFallbackMainNodeData( 12, 13 ); + + $this->assertEquals( 228, $data["node_id"] ); + $this->assertEquals( 1, $data["contentobject_version"] ); + $this->assertEquals( 227, $data["parent_node_id"] ); + } + + /** + * Test for the removeLocation() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::removeLocation + */ + public function testRemoveLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + + $gateway = $this->getLocationGateway(); + $gateway->removeLocation( 13 ); + + try + { + $gateway->getBasicNodeData( 13 ); + $this->fail( "Location was not deleted!" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/EzpDatabaseTrashTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/EzpDatabaseTrashTest.php new file mode 100644 index 0000000..55da106 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/EzpDatabaseTrashTest.php @@ -0,0 +1,450 @@ +getDatabaseHandler(); + return new EzcDatabase( $dbHandler ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::trashLocation + * @todo test updated content status + */ + public function testTrashLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 1, 0 ), + array( 2, 0 ), + array( 69, 0 ), + array( 70, 0 ), + ), + $query + ->select( 'node_id', 'priority' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'node_id', array( 1, 2, 69, 70, 71 ) ) ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::trashLocation + */ + public function testTrashLocationUpdateTrashTable() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( + array( 71, '/1/2/69/70/71/' ), + ), + $query + ->select( 'node_id', 'path_string' ) + ->from( 'ezcontentobject_trash' ) + ); + } + + public static function getUntrashedLocationValues() + { + return array( + array( 'contentobject_is_published', 1 ), + array( 'contentobject_version', 1 ), + array( 'depth', 4 ), + array( 'is_hidden', 0 ), + array( 'is_invisible', 0 ), + array( 'main_node_id', 228 ), + array( 'node_id', 228 ), + array( 'parent_node_id', 70 ), + array( 'path_identification_string', '' ), + array( 'path_string', '/1/2/69/70/228/' ), + array( 'priority', 0 ), + array( 'remote_id', '087adb763245e0cdcac593fb4a5996cf' ), + array( 'sort_field', 1 ), + array( 'sort_order', 1 ), + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::untrashLocation + * @dataProvider getUntrashedLocationValues + */ + public function testUntrashLocationDefault( $property, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + + $handler->untrashLocation( 71 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( $value ) ), + $query + ->select( $property ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'contentobject_id', array( 69 ) ) ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::untrashLocation + */ + public function testUntrashLocationNewParent() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + + $handler->untrashLocation( 71, 1 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array( array( '228', '1', '/1/228/' ) ), + $query + ->select( 'node_id', 'parent_node_id', 'path_string' ) + ->from( 'ezcontentobject_tree' ) + ->where( $query->expr->in( 'contentobject_id', array( 69 ) ) ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::untrashLocation + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testUntrashInvalidLocation() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + + $handler->untrashLocation( 23 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::untrashLocation + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testUntrashLocationInvalidParent() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + + $handler->untrashLocation( 71, 1337 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::untrashLocation + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testUntrashLocationInvalidOldParent() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + $handler->trashLocation( 70 ); + + $handler->untrashLocation( 70 ); + $handler->untrashLocation( 71 ); + } + + public static function getLoadTrashValues() + { + return array( + array( 'node_id', 71 ), + array( 'priority', 0 ), + array( 'is_hidden', 0 ), + array( 'is_invisible', 0 ), + array( 'remote_id', '087adb763245e0cdcac593fb4a5996cf' ), + array( 'contentobject_id', 69 ), + array( 'parent_node_id', 70 ), + array( 'path_identification_string', 'products/software/os_type_i' ), + array( 'path_string', '/1/2/69/70/71/' ), + array( 'modified_subnode', 1311065013 ), + array( 'main_node_id', 71 ), + array( 'depth', 4 ), + array( 'sort_field', 1 ), + array( 'sort_order', 1 ), + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::loadTrashByLocation + * @dataProvider getLoadTrashValues + */ + public function testLoadTrashByLocationId( $field, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $handler->trashLocation( 71 ); + + $data = $handler->loadTrashByLocation( 71 ); + + $this->assertEquals( + $value, + $data[$field], + "Value in property $field not as expected." + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::listTrashed + */ + public function testListEmptyTrash() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + + $this->assertEquals( + array(), + $handler->listTrashed( 0, null, array() ) + ); + } + + protected function trashSubtree() + { + $handler = $this->getLocationGateway(); + $handler->trashLocation( 69 ); + $handler->trashLocation( 70 ); + $handler->trashLocation( 71 ); + $handler->trashLocation( 72 ); + $handler->trashLocation( 73 ); + $handler->trashLocation( 74 ); + $handler->trashLocation( 75 ); + $handler->trashLocation( 76 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::listTrashed + */ + public function testListFullTrash() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + + $this->assertEquals( + 8, + count( $handler->listTrashed( 0, null, array() ) ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::listTrashed + */ + public function testListTrashLimited() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + + $this->assertEquals( + 5, + count( $handler->listTrashed( 0, 5, array() ) ) + ); + } + + public static function getTrashValues() + { + return array( + array( 'contentobject_id', 67 ), + array( 'contentobject_version', 1 ), + array( 'depth', 2 ), + array( 'is_hidden', 0 ), + array( 'is_invisible', 0 ), + array( 'main_node_id', 69 ), + array( 'modified_subnode', 1311065014 ), + array( 'node_id', 69 ), + array( 'parent_node_id', 2 ), + array( 'path_identification_string', 'products' ), + array( 'path_string', '/1/2/69/' ), + array( 'priority', 0 ), + array( 'remote_id', '9cec85d730eec7578190ee95ce5a36f5' ), + array( 'sort_field', 2 ), + array( 'sort_order', 1 ), + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::listTrashed + * @dataProvider getTrashValues + */ + public function testListTrashItem( $key, $value ) + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + + $trashList = $handler->listTrashed( 0, 1, array() ); + $this->assertEquals( $value, $trashList[0][$key] ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::listTrashed + */ + public function testListTrashSortedPathStringDesc() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + + $this->assertEquals( + array( + '/1/2/69/76/', + '/1/2/69/72/75/', + '/1/2/69/72/74/', + '/1/2/69/72/73/', + '/1/2/69/72/', + '/1/2/69/70/71/', + '/1/2/69/70/', + '/1/2/69/', + ), + array_map( + function ( $trashItem ) + { + return $trashItem['path_string']; + }, + $trashList = $handler->listTrashed( + 0, null, array( + new SortClause\LocationPathString( Query::SORT_DESC ), + ) + ) + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::listTrashed + */ + public function testListTrashSortedDepth() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + + $this->assertEquals( + array( + '/1/2/69/', + '/1/2/69/76/', + '/1/2/69/72/', + '/1/2/69/70/', + '/1/2/69/72/75/', + '/1/2/69/72/74/', + '/1/2/69/72/73/', + '/1/2/69/70/71/', + ), + array_map( + function ( $trashItem ) + { + return $trashItem['path_string']; + }, + $trashList = $handler->listTrashed( + 0, null, array( + new SortClause\LocationDepth(), + new SortClause\LocationPathString( Query::SORT_DESC ), + ) + ) + ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::cleanupTrash + */ + public function testCleanupTrash() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + $handler->cleanupTrash(); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array(), + $query + ->select( '*' ) + ->from( 'ezcontentobject_trash' ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::removeElementFromTrash + */ + public function testRemoveElementFromTrash() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + $this->trashSubtree(); + $handler->removeElementFromTrash( 71 ); + + $query = $this->handler->createSelectQuery(); + $this->assertQueryResult( + array(), + $query + ->select( '*' ) + ->from( 'ezcontentobject_trash' ) + ->where( $query->expr->eq( 'node_id', 71 ) ) + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase::countLocationsByContentId + */ + public function testCountLocationsByContentId() + { + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/full_example_tree.php' ); + $handler = $this->getLocationGateway(); + + self::assertSame( 0, $handler->countLocationsByContentId( 123456789 ) ); + self::assertSame( 1, $handler->countLocationsByContentId( 67 ) ); + + // Insert a new node and count again + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( 'ezcontentobject_tree' ) + ->set( 'contentobject_id', $query->bindValue( 67, null, \PDO::PARAM_INT ) ) + ->set( 'contentobject_version', $query->bindValue( 1, null, \PDO::PARAM_INT ) ) + ->set( 'path_string', $query->bindValue( '/1/2/96' ) ) + ->set( 'parent_node_id', $query->bindValue( 96, null, \PDO::PARAM_INT ) ) + ->set( 'remote_id', $query->bindValue( 'some_remote_id' ) ); + $query->prepare()->execute(); + self::assertSame( 2, $handler->countLocationsByContentId( 67 ) ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/_fixtures/full_example_tree.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/_fixtures/full_example_tree.php new file mode 100644 index 0000000..88dd4d6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/Gateway/_fixtures/full_example_tree.php @@ -0,0 +1,381 @@ + array( + array( 'contentobject_id' => 0, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 0, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 1, 'modified_subnode' => 1311065058, 'node_id' => 1, 'parent_node_id' => 1, 'path_identification_string' => '', 'path_string' => '/1/', 'priority' => 0, 'remote_id' => '629709ba256fe317c3ddcee35453a96a', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 65, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 1, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 2, 'modified_subnode' => 1311065058, 'node_id' => 2, 'parent_node_id' => 1, 'path_identification_string' => '', 'path_string' => '/1/2/', 'priority' => 0, 'remote_id' => 'f3e90596361e31d496d4026eb624c983', 'sort_field' => 8, 'sort_order' => 1 ), + array( 'contentobject_id' => 4, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 1, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 5, 'modified_subnode' => 1311065058, 'node_id' => 5, 'parent_node_id' => 1, 'path_identification_string' => 'users', 'path_string' => '/1/5/', 'priority' => 0, 'remote_id' => '3f6d92f8044aed134f32153517850f5a', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 11, 'contentobject_is_published' => 1, 'contentobject_version' => 2, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 12, 'modified_subnode' => 1311065058, 'node_id' => 12, 'parent_node_id' => 5, 'path_identification_string' => 'users/members', 'path_string' => '/1/5/12/', 'priority' => 0, 'remote_id' => '602dcf84765e56b7f999eaafd3821dd3', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 12, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 13, 'modified_subnode' => 1311065057, 'node_id' => 13, 'parent_node_id' => 5, 'path_identification_string' => 'users/administrator_users', 'path_string' => '/1/5/13/', 'priority' => 0, 'remote_id' => '769380b7aa94541679167eab817ca893', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 13, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 14, 'modified_subnode' => 1081860719, 'node_id' => 14, 'parent_node_id' => 5, 'path_identification_string' => 'users/editors', 'path_string' => '/1/5/14/', 'priority' => 0, 'remote_id' => 'f7dda2854fc68f7c8455d9cb14bd04a9', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 14, 'contentobject_is_published' => 1, 'contentobject_version' => 4, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 15, 'modified_subnode' => 1311065057, 'node_id' => 15, 'parent_node_id' => 13, 'path_identification_string' => 'users/administrator_users/administrator_user', 'path_string' => '/1/5/13/15/', 'priority' => 0, 'remote_id' => 'e5161a99f733200b9ed4e80f9c16187b', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 41, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 1, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 43, 'modified_subnode' => 1311065012, 'node_id' => 43, 'parent_node_id' => 1, 'path_identification_string' => 'media', 'path_string' => '/1/43/', 'priority' => 0, 'remote_id' => '75c715a51699d2d309a924eca6a95145', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 42, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 44, 'modified_subnode' => 1081860719, 'node_id' => 44, 'parent_node_id' => 5, 'path_identification_string' => 'users/anonymous_users', 'path_string' => '/1/5/44/', 'priority' => 0, 'remote_id' => '4fdf0072da953bb276c0c7e0141c5c9b', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 10, 'contentobject_is_published' => 1, 'contentobject_version' => 2, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 45, 'modified_subnode' => 1081860719, 'node_id' => 45, 'parent_node_id' => 44, 'path_identification_string' => 'users/anonymous_users/anonymous_user', 'path_string' => '/1/5/44/45/', 'priority' => 0, 'remote_id' => '2cf8343bee7b482bab82b269d8fecd76', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 45, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 1, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 48, 'modified_subnode' => 1184592117, 'node_id' => 48, 'parent_node_id' => 1, 'path_identification_string' => 'setup2', 'path_string' => '/1/48/', 'priority' => 0, 'remote_id' => '182ce1b5af0c09fa378557c462ba2617', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 49, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 51, 'modified_subnode' => 1311065012, 'node_id' => 51, 'parent_node_id' => 43, 'path_identification_string' => 'media/images', 'path_string' => '/1/43/51/', 'priority' => 0, 'remote_id' => '1b26c0454b09bb49dfb1b9190ffd67cb', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 50, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 52, 'modified_subnode' => 1081860720, 'node_id' => 52, 'parent_node_id' => 43, 'path_identification_string' => 'media/files', 'path_string' => '/1/43/52/', 'priority' => 0, 'remote_id' => '0b113a208f7890f9ad3c24444ff5988c', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 51, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 53, 'modified_subnode' => 1081860720, 'node_id' => 53, 'parent_node_id' => 43, 'path_identification_string' => 'media/multimedia', 'path_string' => '/1/43/53/', 'priority' => 0, 'remote_id' => '4f18b82c75f10aad476cae5adf98c11f', 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 52, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 54, 'modified_subnode' => 1184592117, 'node_id' => 54, 'parent_node_id' => 48, 'path_identification_string' => 'setup2/common_ini_settings', 'path_string' => '/1/48/54/', 'priority' => 0, 'remote_id' => 'fa9f3cff9cf90ecfae335718dcbddfe2', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 54, 'contentobject_is_published' => 1, 'contentobject_version' => 2, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 56, 'modified_subnode' => 1311065058, 'node_id' => 56, 'parent_node_id' => 58, 'path_identification_string' => 'design/plain_site', 'path_string' => '/1/58/56/', 'priority' => 0, 'remote_id' => '772da20ecf88b3035d73cbdfcea0f119', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 56, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 1, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 58, 'modified_subnode' => 1311065058, 'node_id' => 58, 'parent_node_id' => 1, 'path_identification_string' => 'design', 'path_string' => '/1/58/', 'priority' => 0, 'remote_id' => '79f2d67372ab56f59b5d65bb9e0ca3b9', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 57, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 59, 'modified_subnode' => 1311065011, 'node_id' => 59, 'parent_node_id' => 43, 'path_identification_string' => 'media/banners', 'path_string' => '/1/43/59/', 'priority' => 0, 'remote_id' => '437ef9d0a9b7ae326ec83fa3bb73956d', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 58, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 60, 'modified_subnode' => 1311065010, 'node_id' => 60, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/woman_communities', 'path_string' => '/1/43/59/60/', 'priority' => 0, 'remote_id' => 'eaa7f2f48c3f35801961abad12151db4', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 59, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 61, 'modified_subnode' => 1311065010, 'node_id' => 61, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/woman_frontpage', 'path_string' => '/1/43/59/61/', 'priority' => 0, 'remote_id' => 'b8c85fd926d61dab6e68fa1865cee987', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 60, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 62, 'modified_subnode' => 1311065011, 'node_id' => 62, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/woman_products', 'path_string' => '/1/43/59/62/', 'priority' => 0, 'remote_id' => 'c65aba2485585bdd09dfb66afccf645e', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 61, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 63, 'modified_subnode' => 1311065011, 'node_id' => 63, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/woman_partners', 'path_string' => '/1/43/59/63/', 'priority' => 0, 'remote_id' => '64bb803471e53898aa38a7c29e482370', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 62, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 64, 'modified_subnode' => 1311065011, 'node_id' => 64, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/pencils_support', 'path_string' => '/1/43/59/64/', 'priority' => 0, 'remote_id' => '95e29503817570c6458fa0f37d227306', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 63, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 65, 'modified_subnode' => 1311065011, 'node_id' => 65, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/woman_training', 'path_string' => '/1/43/59/65/', 'priority' => 0, 'remote_id' => 'aa4a1afd9c02d00f2f31186e8a271332', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 64, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 66, 'modified_subnode' => 1311065011, 'node_id' => 66, 'parent_node_id' => 59, 'path_identification_string' => 'media/banners/woman_solutions', 'path_string' => '/1/43/59/66/', 'priority' => 0, 'remote_id' => '93d5115082a23b266613868051b8d803', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 66, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 68, 'modified_subnode' => 1311065012, 'node_id' => 68, 'parent_node_id' => 51, 'path_identification_string' => 'media/images/rest_api', 'path_string' => '/1/43/51/68/', 'priority' => 0, 'remote_id' => '31fd28362c18a36cb56223f3609d5d90', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 67, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 69, 'modified_subnode' => 1311065014, 'node_id' => 69, 'parent_node_id' => 2, 'path_identification_string' => 'products', 'path_string' => '/1/2/69/', 'priority' => 0, 'remote_id' => '9cec85d730eec7578190ee95ce5a36f5', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 68, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 70, 'modified_subnode' => 1311065013, 'node_id' => 70, 'parent_node_id' => 69, 'path_identification_string' => 'products/software', 'path_string' => '/1/2/69/70/', 'priority' => 0, 'remote_id' => 'b0b85c15125ca1732e5e528de2717599', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 69, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 71, 'modified_subnode' => 1311065013, 'node_id' => 71, 'parent_node_id' => 70, 'path_identification_string' => 'products/software/os_type_i', 'path_string' => '/1/2/69/70/71/', 'priority' => 0, 'remote_id' => '087adb763245e0cdcac593fb4a5996cf', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 70, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 72, 'modified_subnode' => 1311065014, 'node_id' => 72, 'parent_node_id' => 69, 'path_identification_string' => 'products/boxes', 'path_string' => '/1/2/69/72/', 'priority' => 0, 'remote_id' => 'e607aab6e924091909f3def02415bc53', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 71, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 73, 'modified_subnode' => 1311065013, 'node_id' => 73, 'parent_node_id' => 72, 'path_identification_string' => 'products/boxes/cd_dvd_box_i', 'path_string' => '/1/2/69/72/73/', 'priority' => 0, 'remote_id' => '054d9f10c6fa97689c0fc3b2ac412ebd', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 72, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 74, 'modified_subnode' => 1311065014, 'node_id' => 74, 'parent_node_id' => 72, 'path_identification_string' => 'products/boxes/cd_dvd_box_ii', 'path_string' => '/1/2/69/72/74/', 'priority' => 0, 'remote_id' => '9801bda46e5f8b9d692e1120d50fc7b3', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 73, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 75, 'modified_subnode' => 1311065014, 'node_id' => 75, 'parent_node_id' => 72, 'path_identification_string' => 'products/boxes/cd_dvd_box_iii', 'path_string' => '/1/2/69/72/75/', 'priority' => 0, 'remote_id' => '005067a5eee6505aa0f601cca30681d0', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 74, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 76, 'modified_subnode' => 1311065014, 'node_id' => 76, 'parent_node_id' => 69, 'path_identification_string' => 'products/products_sheets', 'path_string' => '/1/2/69/76/', 'priority' => 0, 'remote_id' => '18f14551cc555c094b15a732ccd27fb2', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 75, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 77, 'modified_subnode' => 1311065017, 'node_id' => 77, 'parent_node_id' => 2, 'path_identification_string' => 'solutions', 'path_string' => '/1/2/77/', 'priority' => 0, 'remote_id' => 'dbc2f3c8716c12f32c379dbf0b1cb133', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 76, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 78, 'modified_subnode' => 1311065016, 'node_id' => 78, 'parent_node_id' => 77, 'path_identification_string' => 'solutions/web_publishing', 'path_string' => '/1/2/77/78/', 'priority' => 0, 'remote_id' => 'bc766fe955437def220a3fa2966a34ee', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 77, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 79, 'modified_subnode' => 1311065015, 'node_id' => 79, 'parent_node_id' => 78, 'path_identification_string' => 'solutions/web_publishing/fusce_sagittis_sagittis', 'path_string' => '/1/2/77/78/79/', 'priority' => 0, 'remote_id' => 'f0c2216ecb29600cd8ae93951a0c8f3a', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 78, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 80, 'modified_subnode' => 1311065015, 'node_id' => 80, 'parent_node_id' => 78, 'path_identification_string' => 'solutions/web_publishing/etiam_posuere_sodales_arcu', 'path_string' => '/1/2/77/78/80/', 'priority' => 0, 'remote_id' => 'eaf16bddfd36206dad265aadfbc98f17', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 79, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 81, 'modified_subnode' => 1311065016, 'node_id' => 81, 'parent_node_id' => 78, 'path_identification_string' => 'solutions/web_publishing/in_hac_habitasse_platea', 'path_string' => '/1/2/77/78/81/', 'priority' => 0, 'remote_id' => 'd2a11e56093b77eb7a347229361c3377', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 80, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 82, 'modified_subnode' => 1311065017, 'node_id' => 82, 'parent_node_id' => 77, 'path_identification_string' => 'solutions/content_management', 'path_string' => '/1/2/77/82/', 'priority' => 0, 'remote_id' => '17d65b568e3500cf1f8b42bc5de2d12b', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 81, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 83, 'modified_subnode' => 1311065016, 'node_id' => 83, 'parent_node_id' => 82, 'path_identification_string' => 'solutions/content_management/fusce_sagittis_sagittis_urna', 'path_string' => '/1/2/77/82/83/', 'priority' => 0, 'remote_id' => 'ecc4f0e94b05bf10f4f783d660ff0ad0', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 82, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 84, 'modified_subnode' => 1311065016, 'node_id' => 84, 'parent_node_id' => 82, 'path_identification_string' => 'solutions/content_management/class_aptent_taciti_sociosqu', 'path_string' => '/1/2/77/82/84/', 'priority' => 0, 'remote_id' => '74280af2cba9002ea9660749225562b6', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 83, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 85, 'modified_subnode' => 1311065017, 'node_id' => 85, 'parent_node_id' => 82, 'path_identification_string' => 'solutions/content_management/aenean_malesuada_ligula', 'path_string' => '/1/2/77/82/85/', 'priority' => 0, 'remote_id' => '4e526426523e47aeacf353541284cbf8', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 84, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 86, 'modified_subnode' => 1311065019, 'node_id' => 86, 'parent_node_id' => 2, 'path_identification_string' => 'training', 'path_string' => '/1/2/86/', 'priority' => 0, 'remote_id' => '95f3c4261719ea27ab67f980fbee0694', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 85, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 87, 'modified_subnode' => 1311065017, 'node_id' => 87, 'parent_node_id' => 86, 'path_identification_string' => 'training/certification', 'path_string' => '/1/2/86/87/', 'priority' => 0, 'remote_id' => '4a1391d3563d056c9d9ea2653093ae3e', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 86, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 88, 'modified_subnode' => 1311065018, 'node_id' => 88, 'parent_node_id' => 86, 'path_identification_string' => 'training/professional_workshops', 'path_string' => '/1/2/86/88/', 'priority' => 0, 'remote_id' => '8889727909b5f34b6aa23f7eee32606b', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 87, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 89, 'modified_subnode' => 1311065017, 'node_id' => 89, 'parent_node_id' => 88, 'path_identification_string' => 'training/professional_workshops/etiam_sodales_mauris', 'path_string' => '/1/2/86/88/89/', 'priority' => 0, 'remote_id' => '1721dbee55639fe280f6a54195f9577c', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 88, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 90, 'modified_subnode' => 1311065018, 'node_id' => 90, 'parent_node_id' => 88, 'path_identification_string' => 'training/professional_workshops/class_aptent_taciti', 'path_string' => '/1/2/86/88/90/', 'priority' => 0, 'remote_id' => '7fabb9ee5bcb6630a3947d1c5585d995', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 89, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 91, 'modified_subnode' => 1311065018, 'node_id' => 91, 'parent_node_id' => 88, 'path_identification_string' => 'training/professional_workshops/duis_auctor_vehicula_erat', 'path_string' => '/1/2/86/88/91/', 'priority' => 0, 'remote_id' => 'a95ae3e4a64f08eb2002b31680fe8989', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 90, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 92, 'modified_subnode' => 1311065018, 'node_id' => 92, 'parent_node_id' => 86, 'path_identification_string' => 'training/events_and_seminars', 'path_string' => '/1/2/86/92/', 'priority' => 0, 'remote_id' => '2acc8bb8f7eda4de2cf74f6dc277661f', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 91, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 93, 'modified_subnode' => 1311065019, 'node_id' => 93, 'parent_node_id' => 86, 'path_identification_string' => 'training/self_paced_courses', 'path_string' => '/1/2/86/93/', 'priority' => 0, 'remote_id' => '6d8cc9831b86d79b8c184507f8e0cbb6', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 92, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 94, 'modified_subnode' => 1311065019, 'node_id' => 94, 'parent_node_id' => 86, 'path_identification_string' => 'training/instructor_led_courses', 'path_string' => '/1/2/86/94/', 'priority' => 0, 'remote_id' => '30f12ecd29608eceb20bb903ddb780c7', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 93, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 95, 'modified_subnode' => 1311065019, 'node_id' => 95, 'parent_node_id' => 86, 'path_identification_string' => 'training/additional_learning_resources', 'path_string' => '/1/2/86/95/', 'priority' => 0, 'remote_id' => '341e63bdce0f1601519d1b8e82e62766', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 94, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 96, 'modified_subnode' => 1311065021, 'node_id' => 96, 'parent_node_id' => 2, 'path_identification_string' => 'support', 'path_string' => '/1/2/96/', 'priority' => 0, 'remote_id' => '0d55a3f510cc7cd9a7b8eb838f50ff5c', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 95, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 97, 'modified_subnode' => 1311065020, 'node_id' => 97, 'parent_node_id' => 96, 'path_identification_string' => 'support/knowledgebase', 'path_string' => '/1/2/96/97/', 'priority' => 0, 'remote_id' => '89ce8eed8fa06c4105fd612aa83d87d6', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 96, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 98, 'modified_subnode' => 1311065020, 'node_id' => 98, 'parent_node_id' => 97, 'path_identification_string' => 'support/knowledgebase/sed_suscipit', 'path_string' => '/1/2/96/97/98/', 'priority' => 0, 'remote_id' => '78f3b9a9268c7b0206bf1c4d39211495', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 97, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 99, 'modified_subnode' => 1311065020, 'node_id' => 99, 'parent_node_id' => 98, 'path_identification_string' => 'support/knowledgebase/sed_suscipit/ut_interdum', 'path_string' => '/1/2/96/97/98/99/', 'priority' => 0, 'remote_id' => 'a1f9b32547e58064e645388512c16a39', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 98, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 100, 'modified_subnode' => 1311065020, 'node_id' => 100, 'parent_node_id' => 96, 'path_identification_string' => 'support/documentation', 'path_string' => '/1/2/96/100/', 'priority' => 0, 'remote_id' => '0f9c7380f8af1f29f1017e412bdd4016', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 99, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 101, 'modified_subnode' => 1311065020, 'node_id' => 101, 'parent_node_id' => 100, 'path_identification_string' => 'support/documentation/mauris_pretium', 'path_string' => '/1/2/96/100/101/', 'priority' => 0, 'remote_id' => '036394ec8b160f0782bec2dda452d798', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 100, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 102, 'modified_subnode' => 1311065020, 'node_id' => 102, 'parent_node_id' => 101, 'path_identification_string' => 'support/documentation/mauris_pretium/aliquam_posuere', 'path_string' => '/1/2/96/100/101/102/', 'priority' => 0, 'remote_id' => '78da6a4fae1c2eaabe1dbe7af818d970', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 101, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 103, 'modified_subnode' => 1311065021, 'node_id' => 103, 'parent_node_id' => 96, 'path_identification_string' => 'support/books', 'path_string' => '/1/2/96/103/', 'priority' => 0, 'remote_id' => '06cdeb27be466ea8330de5df16144263', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 102, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 104, 'modified_subnode' => 1311065021, 'node_id' => 104, 'parent_node_id' => 103, 'path_identification_string' => 'support/books/aliquam_pulvinar_suscipit_tellus', 'path_string' => '/1/2/96/103/104/', 'priority' => 0, 'remote_id' => 'ab30399896b8e54442c3a619ba7eeecb', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 103, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 105, 'modified_subnode' => 1311065021, 'node_id' => 105, 'parent_node_id' => 96, 'path_identification_string' => 'support/customer_service', 'path_string' => '/1/2/96/105/', 'priority' => 0, 'remote_id' => 'ca2ae9d0f0322798f632e896325f22c3', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 104, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 106, 'modified_subnode' => 1311065021, 'node_id' => 106, 'parent_node_id' => 96, 'path_identification_string' => 'support/support_programs', 'path_string' => '/1/2/96/106/', 'priority' => 0, 'remote_id' => '7ba1d48c0151bae62366095ef6f64c28', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 105, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 107, 'modified_subnode' => 1311065034, 'node_id' => 107, 'parent_node_id' => 2, 'path_identification_string' => 'getting_started', 'path_string' => '/1/2/107/', 'priority' => 0, 'remote_id' => 'e81507d3446726ebd7361352fef5fad3', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 106, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 108, 'modified_subnode' => 1311065022, 'node_id' => 108, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/tutorials_for', 'path_string' => '/1/2/107/108/', 'priority' => 0, 'remote_id' => '51278360f39d5b8ce1d9249953f4de98', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 107, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 109, 'modified_subnode' => 1311065023, 'node_id' => 109, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/get_involved', 'path_string' => '/1/2/107/109/', 'priority' => 0, 'remote_id' => '33151e24acea9c837d2b9fc52e03b1de', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 108, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 110, 'modified_subnode' => 1311065024, 'node_id' => 110, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/how_to_use_ez_publish', 'path_string' => '/1/2/107/110/', 'priority' => 0, 'remote_id' => '6b3bcab0f149c5acc2e3728df7c66b73', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 109, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 111, 'modified_subnode' => 1311065023, 'node_id' => 111, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics1', 'path_string' => '/1/2/107/110/111/', 'priority' => 0, 'remote_id' => '28f9dfe5c0680955eec7a2dec4ebc642', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 110, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 112, 'modified_subnode' => 1311065023, 'node_id' => 112, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics12', 'path_string' => '/1/2/107/110/112/', 'priority' => 0, 'remote_id' => '191faba79dc108a19893944befa50d94', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 111, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 113, 'modified_subnode' => 1311065024, 'node_id' => 113, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics13', 'path_string' => '/1/2/107/110/113/', 'priority' => 0, 'remote_id' => '8679b5fa3ad0ec216293419ab9834e44', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 112, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 114, 'modified_subnode' => 1311065024, 'node_id' => 114, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics14', 'path_string' => '/1/2/107/110/114/', 'priority' => 0, 'remote_id' => '7f32cdefd0cf55b966a44aa52181e30d', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 113, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 115, 'modified_subnode' => 1311065024, 'node_id' => 115, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics15', 'path_string' => '/1/2/107/110/115/', 'priority' => 0, 'remote_id' => '29db3c1fcdb497e5cb2c74eb85c0906a', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 114, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 116, 'modified_subnode' => 1311065024, 'node_id' => 116, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics16', 'path_string' => '/1/2/107/110/116/', 'priority' => 0, 'remote_id' => '96e30009f712a0315217fed93eba6a18', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 115, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 117, 'modified_subnode' => 1311065024, 'node_id' => 117, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics17', 'path_string' => '/1/2/107/110/117/', 'priority' => 0, 'remote_id' => '3a6b87470a25b19a6ad15caa5e24e719', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 116, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 118, 'modified_subnode' => 1311065024, 'node_id' => 118, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics18', 'path_string' => '/1/2/107/110/118/', 'priority' => 0, 'remote_id' => 'd0bc77a21920b63543d7b0accab81b24', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 117, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 119, 'modified_subnode' => 1311065024, 'node_id' => 119, 'parent_node_id' => 110, 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics19', 'path_string' => '/1/2/107/110/119/', 'priority' => 0, 'remote_id' => 'c75b4b4b870e0e3611e19e1323103282', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 118, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 120, 'modified_subnode' => 1311065027, 'node_id' => 120, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish', 'path_string' => '/1/2/107/120/', 'priority' => 0, 'remote_id' => '262d8c936d3757ff81e7bb49392b703f', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 119, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 121, 'modified_subnode' => 1311065025, 'node_id' => 121, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics1', 'path_string' => '/1/2/107/120/121/', 'priority' => 0, 'remote_id' => '220d4e10bf4619525c3165823079482c', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 120, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 122, 'modified_subnode' => 1311065025, 'node_id' => 122, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics12', 'path_string' => '/1/2/107/120/122/', 'priority' => 0, 'remote_id' => 'f13a938ce2c79a9d438548299220d6dd', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 121, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 123, 'modified_subnode' => 1311065025, 'node_id' => 123, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics13', 'path_string' => '/1/2/107/120/123/', 'priority' => 0, 'remote_id' => '04f5e08293954b1851a4dd1cbd976cff', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 122, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 124, 'modified_subnode' => 1311065026, 'node_id' => 124, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics14', 'path_string' => '/1/2/107/120/124/', 'priority' => 0, 'remote_id' => 'dc80ae3d9de55855a16218b032062c62', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 123, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 125, 'modified_subnode' => 1311065026, 'node_id' => 125, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics15', 'path_string' => '/1/2/107/120/125/', 'priority' => 0, 'remote_id' => '4cb6d4015dd80474074043ab28f96e36', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 124, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 126, 'modified_subnode' => 1311065026, 'node_id' => 126, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics16', 'path_string' => '/1/2/107/120/126/', 'priority' => 0, 'remote_id' => '74ce7d6cbae81d90592b4a8a242a284a', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 125, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 127, 'modified_subnode' => 1311065027, 'node_id' => 127, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics17', 'path_string' => '/1/2/107/120/127/', 'priority' => 0, 'remote_id' => '6f76d2f7e5812acf4f7c5c70258f4f7e', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 126, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 128, 'modified_subnode' => 1311065027, 'node_id' => 128, 'parent_node_id' => 120, 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics18', 'path_string' => '/1/2/107/120/128/', 'priority' => 0, 'remote_id' => '5ba07103968a6bb3f05c275c212440f6', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 127, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 129, 'modified_subnode' => 1311065028, 'node_id' => 129, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish', 'path_string' => '/1/2/107/129/', 'priority' => 0, 'remote_id' => '3579b6c5cd166d5137eada55274892d3', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 128, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 130, 'modified_subnode' => 1311065028, 'node_id' => 130, 'parent_node_id' => 129, 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish/graphics1', 'path_string' => '/1/2/107/129/130/', 'priority' => 0, 'remote_id' => 'e38a43ce35832e5af2df4f1e9272b926', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 129, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 131, 'modified_subnode' => 1311065028, 'node_id' => 131, 'parent_node_id' => 129, 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish/graphics12', 'path_string' => '/1/2/107/129/131/', 'priority' => 0, 'remote_id' => '1ba7889f63e32acf70f66349ce1a8953', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 130, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 132, 'modified_subnode' => 1311065028, 'node_id' => 132, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/adding_siteaccesses_in_ez_publish', 'path_string' => '/1/2/107/132/', 'priority' => 0, 'remote_id' => '19ae9fcb7334a0e407b2781920247122', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 131, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 133, 'modified_subnode' => 1311065034, 'node_id' => 133, 'parent_node_id' => 107, 'path_identification_string' => 'getting_started/new_features', 'path_string' => '/1/2/107/133/', 'priority' => 0, 'remote_id' => '423b6d20325263abaa2012536cc736a4', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 132, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 134, 'modified_subnode' => 1311065030, 'node_id' => 134, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow', 'path_string' => '/1/2/107/133/134/', 'priority' => 0, 'remote_id' => '07f0de334c83d631a59defe61f1a7cbf', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 133, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 135, 'modified_subnode' => 1311065029, 'node_id' => 135, 'parent_node_id' => 134, 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics1', 'path_string' => '/1/2/107/133/134/135/', 'priority' => 0, 'remote_id' => 'a7ca1a8878210a9978df0b00e9184b20', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 134, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 136, 'modified_subnode' => 1311065029, 'node_id' => 136, 'parent_node_id' => 134, 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics12', 'path_string' => '/1/2/107/133/134/136/', 'priority' => 0, 'remote_id' => '12c86be2151c426b990d47efd023cc40', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 135, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 137, 'modified_subnode' => 1311065030, 'node_id' => 137, 'parent_node_id' => 134, 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics13', 'path_string' => '/1/2/107/133/134/137/', 'priority' => 0, 'remote_id' => 'ff4473534c7cef8212a11feab57a5f0e', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 136, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 138, 'modified_subnode' => 1311065030, 'node_id' => 138, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/improved_block_editing', 'path_string' => '/1/2/107/133/138/', 'priority' => 0, 'remote_id' => 'e0a1b1b2a3d248bf8d43a83581c22ae8', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 137, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 139, 'modified_subnode' => 1311065030, 'node_id' => 139, 'parent_node_id' => 138, 'path_identification_string' => 'getting_started/new_features/improved_block_editing/graphics1', 'path_string' => '/1/2/107/133/138/139/', 'priority' => 0, 'remote_id' => '8e6f0ba5195410b03a84ef3fdcc3ff0b', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 138, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 140, 'modified_subnode' => 1311065030, 'node_id' => 140, 'parent_node_id' => 138, 'path_identification_string' => 'getting_started/new_features/improved_block_editing/graphics12', 'path_string' => '/1/2/107/133/138/140/', 'priority' => 0, 'remote_id' => 'bc416b97e1592c7a396f6f5f85e131ac', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 139, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 141, 'modified_subnode' => 1311065032, 'node_id' => 141, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing', 'path_string' => '/1/2/107/133/141/', 'priority' => 0, 'remote_id' => 'facfd2587054ea863cbe53768da04a47', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 140, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 142, 'modified_subnode' => 1311065031, 'node_id' => 142, 'parent_node_id' => 141, 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics1', 'path_string' => '/1/2/107/133/141/142/', 'priority' => 0, 'remote_id' => 'd159e8d4d590e481b06ecb441c0f14dc', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 141, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 143, 'modified_subnode' => 1311065031, 'node_id' => 143, 'parent_node_id' => 141, 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics12', 'path_string' => '/1/2/107/133/141/143/', 'priority' => 0, 'remote_id' => '7457db5919dd349bd878b60592fc009b', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 142, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 144, 'modified_subnode' => 1311065032, 'node_id' => 144, 'parent_node_id' => 141, 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics13', 'path_string' => '/1/2/107/133/141/144/', 'priority' => 0, 'remote_id' => 'ebe1e9d1242a3aeedfda25da7cc25564', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 143, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 145, 'modified_subnode' => 1311065032, 'node_id' => 145, 'parent_node_id' => 141, 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics14', 'path_string' => '/1/2/107/133/141/145/', 'priority' => 0, 'remote_id' => 'b3acf4c0f2df8977f1c6932725339a1d', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 144, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 146, 'modified_subnode' => 1311065032, 'node_id' => 146, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/fastcgi', 'path_string' => '/1/2/107/133/146/', 'priority' => 0, 'remote_id' => 'a324a48fea49eb3e6826b3295dc5f413', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 145, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 147, 'modified_subnode' => 1311065033, 'node_id' => 147, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/support_for_red_hat_enterprise', 'path_string' => '/1/2/107/133/147/', 'priority' => 0, 'remote_id' => '8c0133434d7bea077a614e1a85fca5b7', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 146, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 148, 'modified_subnode' => 1311065033, 'node_id' => 148, 'parent_node_id' => 147, 'path_identification_string' => 'getting_started/new_features/support_for_red_hat_enterprise/graphics1', 'path_string' => '/1/2/107/133/147/148/', 'priority' => 0, 'remote_id' => '46653e0e5fa60ab86788cad8084a759d', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 147, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 149, 'modified_subnode' => 1311065033, 'node_id' => 149, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/canonical_links', 'path_string' => '/1/2/107/133/149/', 'priority' => 0, 'remote_id' => '9b17e8d0b2cee501b75f7b481155e64f', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 148, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 150, 'modified_subnode' => 1311065034, 'node_id' => 150, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/asynchronous_publishing', 'path_string' => '/1/2/107/133/150/', 'priority' => 0, 'remote_id' => '3983d3aa7604f45a8ecbb953a98d646f', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 149, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 151, 'modified_subnode' => 1311065034, 'node_id' => 151, 'parent_node_id' => 150, 'path_identification_string' => 'getting_started/new_features/asynchronous_publishing/graphics1', 'path_string' => '/1/2/107/133/150/151/', 'priority' => 0, 'remote_id' => '92756622f207c0b1902ca156947a77de', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 150, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 152, 'modified_subnode' => 1311065034, 'node_id' => 152, 'parent_node_id' => 133, 'path_identification_string' => 'getting_started/new_features/rest_api_interface', 'path_string' => '/1/2/107/133/152/', 'priority' => 0, 'remote_id' => '60adbb1e37a6524246d3af372366754f', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 151, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 153, 'modified_subnode' => 1311065035, 'node_id' => 153, 'parent_node_id' => 2, 'path_identification_string' => 'ez_publish_enterprise', 'path_string' => '/1/2/153/', 'priority' => 0, 'remote_id' => 'f4bf2e6c1cf75e15b15f0123a82778a1', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 152, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 154, 'modified_subnode' => 1311065035, 'node_id' => 154, 'parent_node_id' => 153, 'path_identification_string' => 'ez_publish_enterprise/graphics1', 'path_string' => '/1/2/153/154/', 'priority' => 0, 'remote_id' => '1b95356b68bd59ef32b0fd7bb2c29130', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 153, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 155, 'modified_subnode' => 1311065035, 'node_id' => 155, 'parent_node_id' => 153, 'path_identification_string' => 'ez_publish_enterprise/graphics12', 'path_string' => '/1/2/153/155/', 'priority' => 0, 'remote_id' => '94b7059eb5e0fe667f7c63eadd53a62b', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 154, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 156, 'modified_subnode' => 1311065039, 'node_id' => 156, 'parent_node_id' => 2, 'path_identification_string' => 'partners', 'path_string' => '/1/2/156/', 'priority' => 3, 'remote_id' => '0c523dfd6b1eccbfb0d1bfe632ee7411', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 155, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 157, 'modified_subnode' => 1311065036, 'node_id' => 157, 'parent_node_id' => 156, 'path_identification_string' => 'partners/partner_news', 'path_string' => '/1/2/156/157/', 'priority' => 0, 'remote_id' => 'f5db8acf1150afc15eb514d380e3855d', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 156, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 158, 'modified_subnode' => 1311065036, 'node_id' => 158, 'parent_node_id' => 157, 'path_identification_string' => 'partners/partner_news/pellentesque_quam_mauris', 'path_string' => '/1/2/156/157/158/', 'priority' => 0, 'remote_id' => '6366a99ac1cec2133e87fdd805d108c8', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 157, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 159, 'modified_subnode' => 1311065036, 'node_id' => 159, 'parent_node_id' => 157, 'path_identification_string' => 'partners/partner_news/penatibus_et_magnis_dis', 'path_string' => '/1/2/156/157/159/', 'priority' => 0, 'remote_id' => '7ee406cb6e5f0b2a29bc9f97f5a5b9db', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 158, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 160, 'modified_subnode' => 1311065038, 'node_id' => 160, 'parent_node_id' => 156, 'path_identification_string' => 'partners/news', 'path_string' => '/1/2/156/160/', 'priority' => 0, 'remote_id' => '007109e7f353c86dfd48d844cb18ce73', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 159, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 161, 'modified_subnode' => 1311065037, 'node_id' => 161, 'parent_node_id' => 160, 'path_identification_string' => 'partners/news/curabitur_hendrerit_dignissim', 'path_string' => '/1/2/156/160/161/', 'priority' => 0, 'remote_id' => '63769c39380a45a731aa44068c0f4e33', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 160, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 162, 'modified_subnode' => 1311065037, 'node_id' => 162, 'parent_node_id' => 160, 'path_identification_string' => 'partners/news/proin_condimentum_risus', 'path_string' => '/1/2/156/160/162/', 'priority' => 0, 'remote_id' => 'f761918d15e356e50ce94294cad79765', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 161, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 163, 'modified_subnode' => 1311065038, 'node_id' => 163, 'parent_node_id' => 160, 'path_identification_string' => 'partners/news/morbi_tristique_senectus', 'path_string' => '/1/2/156/160/163/', 'priority' => 0, 'remote_id' => '68187b44ef9051a4db10bd9bb7f228a4', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 162, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 164, 'modified_subnode' => 1311065038, 'node_id' => 164, 'parent_node_id' => 156, 'path_identification_string' => 'partners/partner_products', 'path_string' => '/1/2/156/164/', 'priority' => 0, 'remote_id' => '472e9bc321148baa71d2070063f24bb9', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 163, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 165, 'modified_subnode' => 1311065039, 'node_id' => 165, 'parent_node_id' => 156, 'path_identification_string' => 'partners/partners', 'path_string' => '/1/2/156/165/', 'priority' => 0, 'remote_id' => 'b1a68df10cdf379cf78999c8012db679', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 164, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 166, 'modified_subnode' => 1311065039, 'node_id' => 166, 'parent_node_id' => 165, 'path_identification_string' => 'partners/partners/neque_orci_malesuada_felis', 'path_string' => '/1/2/156/165/166/', 'priority' => 0, 'remote_id' => 'e9ee6724fffb012f918300de66af27e1', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 165, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 167, 'modified_subnode' => 1311065044, 'node_id' => 167, 'parent_node_id' => 2, 'path_identification_string' => 'community', 'path_string' => '/1/2/167/', 'priority' => 4, 'remote_id' => 'c4604fb2e100a6681a4f53fbe6e5eeae', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 166, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 168, 'modified_subnode' => 1311065040, 'node_id' => 168, 'parent_node_id' => 167, 'path_identification_string' => 'community/forum', 'path_string' => '/1/2/167/168/', 'priority' => 0, 'remote_id' => '5e6762a083ab4c0357bad163902ba8f7', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 167, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 169, 'modified_subnode' => 1311065039, 'node_id' => 169, 'parent_node_id' => 168, 'path_identification_string' => 'community/forum/nulla_vitae_tellus_sit_amet', 'path_string' => '/1/2/167/168/169/', 'priority' => 0, 'remote_id' => '2549eee03064d55ae7fc84fe41ae1ef6', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 168, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 170, 'modified_subnode' => 1311065040, 'node_id' => 170, 'parent_node_id' => 168, 'path_identification_string' => 'community/forum/ut_mollis_sodales_nibh', 'path_string' => '/1/2/167/168/170/', 'priority' => 0, 'remote_id' => '7bfca4bdde619ac9104e235629e2dbc7', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 169, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 171, 'modified_subnode' => 1311065040, 'node_id' => 171, 'parent_node_id' => 168, 'path_identification_string' => 'community/forum/nam_risus_leo', 'path_string' => '/1/2/167/168/171/', 'priority' => 0, 'remote_id' => '81fd930afe94962395074b762592a356', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 170, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 172, 'modified_subnode' => 1311065041, 'node_id' => 172, 'parent_node_id' => 167, 'path_identification_string' => 'community/wiki', 'path_string' => '/1/2/167/172/', 'priority' => 0, 'remote_id' => '8b570ac03318b7e29eb5fd1bae15efde', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 171, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 173, 'modified_subnode' => 1311065041, 'node_id' => 173, 'parent_node_id' => 172, 'path_identification_string' => 'community/wiki/sed_suscipit', 'path_string' => '/1/2/167/172/173/', 'priority' => 0, 'remote_id' => '4329dcc6a8d441aa7253660512dfd5b6', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 172, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 174, 'modified_subnode' => 1311065041, 'node_id' => 174, 'parent_node_id' => 173, 'path_identification_string' => 'community/wiki/sed_suscipit/ut_interdum', 'path_string' => '/1/2/167/172/173/174/', 'priority' => 0, 'remote_id' => '6cf7b9370a0d9800ed49ba3be13b6be5', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 173, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 175, 'modified_subnode' => 1311065041, 'node_id' => 175, 'parent_node_id' => 173, 'path_identification_string' => 'community/wiki/sed_suscipit/fusce_pulvinar', 'path_string' => '/1/2/167/172/173/175/', 'priority' => 0, 'remote_id' => 'f71191fcce35c83530cddde467a908b2', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 174, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 176, 'modified_subnode' => 1311065041, 'node_id' => 176, 'parent_node_id' => 172, 'path_identification_string' => 'community/wiki/duis_id_tortor', 'path_string' => '/1/2/167/172/176/', 'priority' => 0, 'remote_id' => '2d3cf4fe8d439e16e0ed75ef947b5e3d', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 175, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 177, 'modified_subnode' => 1311065041, 'node_id' => 177, 'parent_node_id' => 176, 'path_identification_string' => 'community/wiki/duis_id_tortor/curabitur_lacinia', 'path_string' => '/1/2/167/172/176/177/', 'priority' => 0, 'remote_id' => '49c9ad954328ab5f5a76d580873961a4', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 176, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 178, 'modified_subnode' => 1311065044, 'node_id' => 178, 'parent_node_id' => 167, 'path_identification_string' => 'community/pictures', 'path_string' => '/1/2/167/178/', 'priority' => 0, 'remote_id' => 'ae32173cedf3a5ec441e3afcadc4abcb', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 177, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 179, 'modified_subnode' => 1311065042, 'node_id' => 179, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/ivo_on_ez_tags', 'path_string' => '/1/2/167/178/179/', 'priority' => 0, 'remote_id' => 'c6c32c884db955ea09338c90eee84746', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 178, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 180, 'modified_subnode' => 1311065042, 'node_id' => 180, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/are_you_ready_for_the_community_day', 'path_string' => '/1/2/167/178/180/', 'priority' => 0, 'remote_id' => 'db191e87b9b6ac22a18742cd32d2b3d4', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 179, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 181, 'modified_subnode' => 1311065042, 'node_id' => 181, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/let_s_work_together', 'path_string' => '/1/2/167/178/181/', 'priority' => 0, 'remote_id' => '02a6d1506bf437eda1317d0c36a8545b', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 180, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 182, 'modified_subnode' => 1311065043, 'node_id' => 182, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/the_mediterranean_seen_from_nice', 'path_string' => '/1/2/167/178/182/', 'priority' => 0, 'remote_id' => '40d743025e4ec4d813bd864dad08e0cc', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 181, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 183, 'modified_subnode' => 1311065043, 'node_id' => 183, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/hotel_lobby_at_isola2000', 'path_string' => '/1/2/167/178/183/', 'priority' => 0, 'remote_id' => 'eb2a8ef7d4b1fb8ffb68f0764b615de1', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 182, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 184, 'modified_subnode' => 1311065043, 'node_id' => 184, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/alexander_on_the_past_gaby_on_today_and_tomorrow', 'path_string' => '/1/2/167/178/184/', 'priority' => 0, 'remote_id' => '9e45f3ee0f15995b670fb3a117b6ee49', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 183, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 185, 'modified_subnode' => 1311065043, 'node_id' => 185, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/isola2000_in_white_beautiful_skiing', 'path_string' => '/1/2/167/178/185/', 'priority' => 0, 'remote_id' => 'f368c4ae469c596344e15fca8c7370c2', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 184, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 186, 'modified_subnode' => 1311065044, 'node_id' => 186, 'parent_node_id' => 178, 'path_identification_string' => 'community/pictures/ceo_future_pitch_adaptable_open_reliable', 'path_string' => '/1/2/167/178/186/', 'priority' => 0, 'remote_id' => '7e153b75dd0ee0476ac7463d4a3daaef', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 185, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 187, 'modified_subnode' => 1311065044, 'node_id' => 187, 'parent_node_id' => 167, 'path_identification_string' => 'community/blog', 'path_string' => '/1/2/167/187/', 'priority' => 0, 'remote_id' => '09fb4147e4b124b9770a527bdd66799c', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 186, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 188, 'modified_subnode' => 1311065044, 'node_id' => 188, 'parent_node_id' => 187, 'path_identification_string' => 'community/blog/visit_paris', 'path_string' => '/1/2/167/187/188/', 'priority' => 0, 'remote_id' => '8f73d6d4ffca33c619d2f2645340ccc0', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 187, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 189, 'modified_subnode' => 1311065044, 'node_id' => 189, 'parent_node_id' => 187, 'path_identification_string' => 'community/blog/paris_in_france', 'path_string' => '/1/2/167/187/189/', 'priority' => 0, 'remote_id' => '5cdc175d45aeb3fa054a95f40df56e79', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 188, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 190, 'modified_subnode' => 1311065055, 'node_id' => 190, 'parent_node_id' => 2, 'path_identification_string' => 'company', 'path_string' => '/1/2/190/', 'priority' => 6, 'remote_id' => 'e060ff40aa17eb21dc1e4595c9a5eb9a', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 189, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 191, 'modified_subnode' => 1311065045, 'node_id' => 191, 'parent_node_id' => 190, 'path_identification_string' => 'company/about_company', 'path_string' => '/1/2/190/191/', 'priority' => 0, 'remote_id' => '7bf290af79b3b51e6ccc1f95f321618c', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 190, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 192, 'modified_subnode' => 1311065053, 'node_id' => 192, 'parent_node_id' => 190, 'path_identification_string' => 'company/new_features', 'path_string' => '/1/2/190/192/', 'priority' => 0, 'remote_id' => '9f804eee139dcee343dbe4175d14654c', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 191, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 193, 'modified_subnode' => 1311065046, 'node_id' => 193, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/separate_content_design_in_ez_publish', 'path_string' => '/1/2/190/192/193/', 'priority' => 0, 'remote_id' => '10d57795c986ca61689e6c2c11382eb3', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 192, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 194, 'modified_subnode' => 1311065046, 'node_id' => 194, 'parent_node_id' => 193, 'path_identification_string' => 'company/new_features/separate_content_design_in_ez_publish/separation_of_content_and_design', 'path_string' => '/1/2/190/192/193/194/', 'priority' => 0, 'remote_id' => '87417129b080d24d335eb2653dd1a40c', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 193, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 195, 'modified_subnode' => 1311065048, 'node_id' => 195, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish', 'path_string' => '/1/2/190/192/195/', 'priority' => 0, 'remote_id' => 'fd56d839df6e2b52055d4a62f4df7c3e', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 194, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 196, 'modified_subnode' => 1311065047, 'node_id' => 196, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/openoffice_import_large', 'path_string' => '/1/2/190/192/195/196/', 'priority' => 0, 'remote_id' => 'ab2f2093f16c56ac2e61f40f25d2dbe0', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 195, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 197, 'modified_subnode' => 1311065047, 'node_id' => 197, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/translation_large', 'path_string' => '/1/2/190/192/195/197/', 'priority' => 0, 'remote_id' => '185a1737e9012e7c3025df876bbb4f9b', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 196, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 198, 'modified_subnode' => 1311065047, 'node_id' => 198, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/multiupload_large', 'path_string' => '/1/2/190/192/195/198/', 'priority' => 0, 'remote_id' => 'efdca2f6ddd2c8befc283ae3465b9acd', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 197, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 199, 'modified_subnode' => 1311065047, 'node_id' => 199, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/gallery_large', 'path_string' => '/1/2/190/192/195/199/', 'priority' => 0, 'remote_id' => 'f81b0e4c31ea13d94b9838e9e7e7ad7e', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 198, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 200, 'modified_subnode' => 1311065048, 'node_id' => 200, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/search_result_large', 'path_string' => '/1/2/190/192/195/200/', 'priority' => 0, 'remote_id' => '666efc49c267cddf55ca707408f4ac42', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 199, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 201, 'modified_subnode' => 1311065048, 'node_id' => 201, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/ez_tool_bar_large', 'path_string' => '/1/2/190/192/195/201/', 'priority' => 0, 'remote_id' => 'afb51a5f898c549c9e1f35afc75d66f3', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 200, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 202, 'modified_subnode' => 1311065048, 'node_id' => 202, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/quicktime_large', 'path_string' => '/1/2/190/192/195/202/', 'priority' => 0, 'remote_id' => '94b71866ede0d2776c140e85a823d31d', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 201, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 203, 'modified_subnode' => 1311065048, 'node_id' => 203, 'parent_node_id' => 195, 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/web_2_0_large', 'path_string' => '/1/2/190/192/195/203/', 'priority' => 0, 'remote_id' => 'e74475a240fb7061b40c75f5e6fcd52c', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 202, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 204, 'modified_subnode' => 1311065051, 'node_id' => 204, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish', 'path_string' => '/1/2/190/192/204/', 'priority' => 0, 'remote_id' => '42a3b07037390457ad0f2c65494bfd97', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 203, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 205, 'modified_subnode' => 1311065049, 'node_id' => 205, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/usermanagement_large', 'path_string' => '/1/2/190/192/204/205/', 'priority' => 0, 'remote_id' => '6da1a82ba3d962d2ad953fff8ee26362', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 204, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 206, 'modified_subnode' => 1311065049, 'node_id' => 206, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/workflow_large', 'path_string' => '/1/2/190/192/204/206/', 'priority' => 0, 'remote_id' => 'b284abd88bdcb1887a86e40304ffc66f', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 205, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 207, 'modified_subnode' => 1311065050, 'node_id' => 207, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/versioning_large', 'path_string' => '/1/2/190/192/204/207/', 'priority' => 0, 'remote_id' => 'e3400bb44aae5fcb416156e7450f3f32', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 206, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 208, 'modified_subnode' => 1311065050, 'node_id' => 208, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/datatypes_attributes_content_class_and_objects_large', 'path_string' => '/1/2/190/192/204/208/', 'priority' => 0, 'remote_id' => '2b2b27bbaaec688aaec1a5d39b4b13ae', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 207, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 209, 'modified_subnode' => 1311065050, 'node_id' => 209, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/multiple_location_large', 'path_string' => '/1/2/190/192/204/209/', 'priority' => 0, 'remote_id' => '37e5feed6574d1d8da4b4531569a27a2', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 208, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 210, 'modified_subnode' => 1311065050, 'node_id' => 210, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/multisite_deployment_large', 'path_string' => '/1/2/190/192/204/210/', 'priority' => 0, 'remote_id' => '5625695a66034f53b9b6e14029e06e80', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 209, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 211, 'modified_subnode' => 1311065051, 'node_id' => 211, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/seo_large', 'path_string' => '/1/2/190/192/204/211/', 'priority' => 0, 'remote_id' => '824aba4122ee51d9638847e55642feec', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 210, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 212, 'modified_subnode' => 1311065051, 'node_id' => 212, 'parent_node_id' => 204, 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/admin_site_large', 'path_string' => '/1/2/190/192/204/212/', 'priority' => 0, 'remote_id' => '73e95051b800ce051c3851c60807787b', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 211, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 213, 'modified_subnode' => 1311065052, 'node_id' => 213, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish', 'path_string' => '/1/2/190/192/213/', 'priority' => 0, 'remote_id' => '3f921d3c490a6c17870b1f01fcfbceed', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 212, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 214, 'modified_subnode' => 1311065052, 'node_id' => 214, 'parent_node_id' => 213, 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish/datatypes_attributes_content_class_and_objects_large', 'path_string' => '/1/2/190/192/213/214/', 'priority' => 0, 'remote_id' => '97f7b391f1522bf404ff672ac338b91c', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 213, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 5, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 215, 'modified_subnode' => 1311065052, 'node_id' => 215, 'parent_node_id' => 213, 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish/site_style_large', 'path_string' => '/1/2/190/192/213/215/', 'priority' => 0, 'remote_id' => 'c5549bf68962a5384bd2225931cba302', 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 214, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 216, 'modified_subnode' => 1311065052, 'node_id' => 216, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/rest_api_interface', 'path_string' => '/1/2/190/192/216/', 'priority' => 0, 'remote_id' => '54adfd9f7c80638f5560eb3f0618c57b', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 215, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 217, 'modified_subnode' => 1311065052, 'node_id' => 217, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/asynchronous_publishing', 'path_string' => '/1/2/190/192/217/', 'priority' => 0, 'remote_id' => 'a7dbafbf963821b71e5522c21e09d9dd', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 216, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 218, 'modified_subnode' => 1311065053, 'node_id' => 218, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/canonical_links', 'path_string' => '/1/2/190/192/218/', 'priority' => 0, 'remote_id' => '61e3b15f020590df0759b779e5f1fb9d', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 217, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 219, 'modified_subnode' => 1311065053, 'node_id' => 219, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/support_for_red_hat_enterprise', 'path_string' => '/1/2/190/192/219/', 'priority' => 0, 'remote_id' => '42560fa30a55ac5ddf1f76a52d44a613', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 218, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 220, 'modified_subnode' => 1311065053, 'node_id' => 220, 'parent_node_id' => 192, 'path_identification_string' => 'company/new_features/fastcgi', 'path_string' => '/1/2/190/192/220/', 'priority' => 0, 'remote_id' => '416c28c9ba34a9114381a6ec3ae197e0', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 219, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 221, 'modified_subnode' => 1311065053, 'node_id' => 221, 'parent_node_id' => 190, 'path_identification_string' => 'company/events', 'path_string' => '/1/2/190/221/', 'priority' => 0, 'remote_id' => 'ae6afe955af19209125961b6c0d9a840', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 220, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 222, 'modified_subnode' => 1311065054, 'node_id' => 222, 'parent_node_id' => 190, 'path_identification_string' => 'company/career', 'path_string' => '/1/2/190/222/', 'priority' => 0, 'remote_id' => '28b7fd81eaf6b9702c9f8ff8268daac9', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 221, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 223, 'modified_subnode' => 1311065054, 'node_id' => 223, 'parent_node_id' => 190, 'path_identification_string' => 'company/investors_relation', 'path_string' => '/1/2/190/223/', 'priority' => 0, 'remote_id' => '627c1c5cdf124dc2f92489e686cd04bb', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 222, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 224, 'modified_subnode' => 1311065055, 'node_id' => 224, 'parent_node_id' => 190, 'path_identification_string' => 'company/contact', 'path_string' => '/1/2/190/224/', 'priority' => 0, 'remote_id' => 'daa3004ede25b0130ca5bef83c1922c3', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 223, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 4, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 225, 'modified_subnode' => 1311065055, 'node_id' => 225, 'parent_node_id' => 224, 'path_identification_string' => 'company/contact/morbi_neque', 'path_string' => '/1/2/190/224/225/', 'priority' => 0, 'remote_id' => '9d2bdcb8b35464ee03651c191ac4d1ff', 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 224, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 3, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 226, 'modified_subnode' => 1311065055, 'node_id' => 226, 'parent_node_id' => 190, 'path_identification_string' => 'company/company_banner', 'path_string' => '/1/2/190/226/', 'priority' => 0, 'remote_id' => '9ae96e2ecc3a5a79964405273cc8542a', 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 225, 'contentobject_is_published' => 1, 'contentobject_version' => 1, 'depth' => 2, 'is_hidden' => 0, 'is_invisible' => 0, 'main_node_id' => 227, 'modified_subnode' => 1311065058, 'node_id' => 227, 'parent_node_id' => 5, 'path_identification_string' => 'users/partners', 'path_string' => '/1/5/227/', 'priority' => 0, 'remote_id' => '5238a276bf8231fbcf8a986cdc82a6a5', 'sort_field' => 1, 'sort_order' => 1 ), + ), + 'eznode_assignment' => array( + array( 'contentobject_id' => 8, 'contentobject_version' => 2, 'from_node_id' => 0, 'id' => 4, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 42, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 5, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 10, 'contentobject_version' => 2, 'from_node_id' => -1, 'id' => 6, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 44, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 4, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 7, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 1, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 12, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 8, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 13, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 9, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 41, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 11, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 1, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 11, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 12, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 45, 'contentobject_version' => 1, 'from_node_id' => -1, 'id' => 16, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 1, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 49, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 27, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 43, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 50, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 28, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 43, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 51, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 29, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 43, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 9, 'sort_order' => 1 ), + array( 'contentobject_id' => 52, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 30, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 48, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 56, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 34, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 1, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 14, 'contentobject_version' => 3, 'from_node_id' => -1, 'id' => 38, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 13, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 54, 'contentobject_version' => 2, 'from_node_id' => -1, 'id' => 39, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 58, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 57, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 43, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 43, 'parent_remote_id' => '437ef9d0a9b7ae326ec83fa3bb73956d', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 58, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 44, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => 'eaa7f2f48c3f35801961abad12151db4', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 59, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 45, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => 'b8c85fd926d61dab6e68fa1865cee987', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 60, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 46, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => 'c65aba2485585bdd09dfb66afccf645e', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 61, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 47, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => '64bb803471e53898aa38a7c29e482370', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 62, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 48, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => '95e29503817570c6458fa0f37d227306', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 63, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 49, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => 'aa4a1afd9c02d00f2f31186e8a271332', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 64, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 50, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 59, 'parent_remote_id' => '93d5115082a23b266613868051b8d803', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 65, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 51, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => '1a8744c6d6be8675f7b27fa8b7b8437d', 'remote_id' => 0, 'sort_field' => 8, 'sort_order' => 1 ), + array( 'contentobject_id' => 66, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 52, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 51, 'parent_remote_id' => '31fd28362c18a36cb56223f3609d5d90', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 67, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 53, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => '9cec85d730eec7578190ee95ce5a36f5', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 68, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 54, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 69, 'parent_remote_id' => 'b0b85c15125ca1732e5e528de2717599', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 69, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 55, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 70, 'parent_remote_id' => '087adb763245e0cdcac593fb4a5996cf', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 70, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 56, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 69, 'parent_remote_id' => 'e607aab6e924091909f3def02415bc53', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 71, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 57, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 72, 'parent_remote_id' => '054d9f10c6fa97689c0fc3b2ac412ebd', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 72, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 58, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 72, 'parent_remote_id' => '9801bda46e5f8b9d692e1120d50fc7b3', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 73, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 59, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 72, 'parent_remote_id' => '005067a5eee6505aa0f601cca30681d0', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 74, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 60, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 69, 'parent_remote_id' => '18f14551cc555c094b15a732ccd27fb2', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 75, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 61, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => 'dbc2f3c8716c12f32c379dbf0b1cb133', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 76, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 62, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 77, 'parent_remote_id' => 'bc766fe955437def220a3fa2966a34ee', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 77, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 63, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 78, 'parent_remote_id' => 'f0c2216ecb29600cd8ae93951a0c8f3a', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 78, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 64, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 78, 'parent_remote_id' => 'eaf16bddfd36206dad265aadfbc98f17', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 79, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 65, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 78, 'parent_remote_id' => 'd2a11e56093b77eb7a347229361c3377', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 80, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 66, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 77, 'parent_remote_id' => '17d65b568e3500cf1f8b42bc5de2d12b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 81, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 67, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 82, 'parent_remote_id' => 'ecc4f0e94b05bf10f4f783d660ff0ad0', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 82, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 68, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 82, 'parent_remote_id' => '74280af2cba9002ea9660749225562b6', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 83, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 69, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 82, 'parent_remote_id' => '4e526426523e47aeacf353541284cbf8', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 84, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 70, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => '95f3c4261719ea27ab67f980fbee0694', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 85, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 71, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 86, 'parent_remote_id' => '4a1391d3563d056c9d9ea2653093ae3e', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 86, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 72, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 86, 'parent_remote_id' => '8889727909b5f34b6aa23f7eee32606b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 87, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 73, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 88, 'parent_remote_id' => '1721dbee55639fe280f6a54195f9577c', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 88, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 74, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 88, 'parent_remote_id' => '7fabb9ee5bcb6630a3947d1c5585d995', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 89, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 75, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 88, 'parent_remote_id' => 'a95ae3e4a64f08eb2002b31680fe8989', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 90, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 76, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 86, 'parent_remote_id' => '2acc8bb8f7eda4de2cf74f6dc277661f', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 91, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 77, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 86, 'parent_remote_id' => '6d8cc9831b86d79b8c184507f8e0cbb6', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 92, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 78, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 86, 'parent_remote_id' => '30f12ecd29608eceb20bb903ddb780c7', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 93, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 79, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 86, 'parent_remote_id' => '341e63bdce0f1601519d1b8e82e62766', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 94, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 80, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => '0d55a3f510cc7cd9a7b8eb838f50ff5c', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 95, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 81, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 96, 'parent_remote_id' => '89ce8eed8fa06c4105fd612aa83d87d6', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 96, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 82, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 97, 'parent_remote_id' => '78f3b9a9268c7b0206bf1c4d39211495', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 97, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 83, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 98, 'parent_remote_id' => 'a1f9b32547e58064e645388512c16a39', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 98, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 84, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 96, 'parent_remote_id' => '0f9c7380f8af1f29f1017e412bdd4016', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 99, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 85, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 100, 'parent_remote_id' => '036394ec8b160f0782bec2dda452d798', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 100, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 86, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 101, 'parent_remote_id' => '78da6a4fae1c2eaabe1dbe7af818d970', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 101, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 87, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 96, 'parent_remote_id' => '06cdeb27be466ea8330de5df16144263', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 102, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 88, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 103, 'parent_remote_id' => 'ab30399896b8e54442c3a619ba7eeecb', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 103, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 89, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 96, 'parent_remote_id' => 'ca2ae9d0f0322798f632e896325f22c3', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 104, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 90, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 96, 'parent_remote_id' => '7ba1d48c0151bae62366095ef6f64c28', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 105, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 91, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => 'e81507d3446726ebd7361352fef5fad3', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 106, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 92, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '51278360f39d5b8ce1d9249953f4de98', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 107, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 93, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '33151e24acea9c837d2b9fc52e03b1de', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 108, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 94, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '6b3bcab0f149c5acc2e3728df7c66b73', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 109, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 95, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '28f9dfe5c0680955eec7a2dec4ebc642', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 110, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 96, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '191faba79dc108a19893944befa50d94', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 111, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 97, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '8679b5fa3ad0ec216293419ab9834e44', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 112, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 98, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '7f32cdefd0cf55b966a44aa52181e30d', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 113, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 99, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '29db3c1fcdb497e5cb2c74eb85c0906a', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 114, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 100, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '96e30009f712a0315217fed93eba6a18', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 115, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 101, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => '3a6b87470a25b19a6ad15caa5e24e719', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 116, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 102, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => 'd0bc77a21920b63543d7b0accab81b24', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 117, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 103, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 110, 'parent_remote_id' => 'c75b4b4b870e0e3611e19e1323103282', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 118, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 104, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '262d8c936d3757ff81e7bb49392b703f', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 119, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 105, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => '220d4e10bf4619525c3165823079482c', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 120, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 106, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => 'f13a938ce2c79a9d438548299220d6dd', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 121, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 107, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => '04f5e08293954b1851a4dd1cbd976cff', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 122, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 108, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => 'dc80ae3d9de55855a16218b032062c62', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 123, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 109, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => '4cb6d4015dd80474074043ab28f96e36', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 124, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 110, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => '74ce7d6cbae81d90592b4a8a242a284a', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 125, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 111, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => '6f76d2f7e5812acf4f7c5c70258f4f7e', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 126, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 112, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 120, 'parent_remote_id' => '5ba07103968a6bb3f05c275c212440f6', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 127, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 113, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '3579b6c5cd166d5137eada55274892d3', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 128, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 114, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 129, 'parent_remote_id' => 'e38a43ce35832e5af2df4f1e9272b926', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 129, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 115, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 129, 'parent_remote_id' => '1ba7889f63e32acf70f66349ce1a8953', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 130, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 116, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '19ae9fcb7334a0e407b2781920247122', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 131, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 117, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 107, 'parent_remote_id' => '423b6d20325263abaa2012536cc736a4', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 132, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 118, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => '07f0de334c83d631a59defe61f1a7cbf', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 133, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 119, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 134, 'parent_remote_id' => 'a7ca1a8878210a9978df0b00e9184b20', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 134, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 120, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 134, 'parent_remote_id' => '12c86be2151c426b990d47efd023cc40', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 135, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 121, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 134, 'parent_remote_id' => 'ff4473534c7cef8212a11feab57a5f0e', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 136, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 122, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => 'e0a1b1b2a3d248bf8d43a83581c22ae8', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 137, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 123, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 138, 'parent_remote_id' => '8e6f0ba5195410b03a84ef3fdcc3ff0b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 138, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 124, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 138, 'parent_remote_id' => 'bc416b97e1592c7a396f6f5f85e131ac', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 139, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 125, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => 'facfd2587054ea863cbe53768da04a47', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 140, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 126, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 141, 'parent_remote_id' => 'd159e8d4d590e481b06ecb441c0f14dc', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 141, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 127, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 141, 'parent_remote_id' => '7457db5919dd349bd878b60592fc009b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 142, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 128, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 141, 'parent_remote_id' => 'ebe1e9d1242a3aeedfda25da7cc25564', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 143, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 129, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 141, 'parent_remote_id' => 'b3acf4c0f2df8977f1c6932725339a1d', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 144, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 130, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => 'a324a48fea49eb3e6826b3295dc5f413', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 145, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 131, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => '8c0133434d7bea077a614e1a85fca5b7', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 146, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 132, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 147, 'parent_remote_id' => '46653e0e5fa60ab86788cad8084a759d', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 147, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 133, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => '9b17e8d0b2cee501b75f7b481155e64f', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 148, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 134, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => '3983d3aa7604f45a8ecbb953a98d646f', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 149, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 135, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 150, 'parent_remote_id' => '92756622f207c0b1902ca156947a77de', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 150, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 136, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 133, 'parent_remote_id' => '60adbb1e37a6524246d3af372366754f', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 151, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 137, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => 'f4bf2e6c1cf75e15b15f0123a82778a1', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 152, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 138, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 153, 'parent_remote_id' => '1b95356b68bd59ef32b0fd7bb2c29130', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 153, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 139, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 153, 'parent_remote_id' => '94b7059eb5e0fe667f7c63eadd53a62b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 154, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 140, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => '0c523dfd6b1eccbfb0d1bfe632ee7411', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 155, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 141, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 156, 'parent_remote_id' => 'f5db8acf1150afc15eb514d380e3855d', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 156, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 142, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 157, 'parent_remote_id' => '6366a99ac1cec2133e87fdd805d108c8', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 157, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 143, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 157, 'parent_remote_id' => '7ee406cb6e5f0b2a29bc9f97f5a5b9db', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 158, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 144, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 156, 'parent_remote_id' => '007109e7f353c86dfd48d844cb18ce73', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 159, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 145, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 160, 'parent_remote_id' => '63769c39380a45a731aa44068c0f4e33', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 160, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 146, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 160, 'parent_remote_id' => 'f761918d15e356e50ce94294cad79765', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 161, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 147, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 160, 'parent_remote_id' => '68187b44ef9051a4db10bd9bb7f228a4', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 162, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 148, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 156, 'parent_remote_id' => '472e9bc321148baa71d2070063f24bb9', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 163, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 149, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 156, 'parent_remote_id' => 'b1a68df10cdf379cf78999c8012db679', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 164, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 150, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 165, 'parent_remote_id' => 'e9ee6724fffb012f918300de66af27e1', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 165, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 151, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => 'c4604fb2e100a6681a4f53fbe6e5eeae', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 166, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 152, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 167, 'parent_remote_id' => '5e6762a083ab4c0357bad163902ba8f7', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 167, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 153, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 168, 'parent_remote_id' => '2549eee03064d55ae7fc84fe41ae1ef6', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 168, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 154, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 168, 'parent_remote_id' => '7bfca4bdde619ac9104e235629e2dbc7', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 169, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 155, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 168, 'parent_remote_id' => '81fd930afe94962395074b762592a356', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 170, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 156, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 167, 'parent_remote_id' => '8b570ac03318b7e29eb5fd1bae15efde', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 171, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 157, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 172, 'parent_remote_id' => '4329dcc6a8d441aa7253660512dfd5b6', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 172, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 158, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 173, 'parent_remote_id' => '6cf7b9370a0d9800ed49ba3be13b6be5', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 173, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 159, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 173, 'parent_remote_id' => 'f71191fcce35c83530cddde467a908b2', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 174, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 160, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 172, 'parent_remote_id' => '2d3cf4fe8d439e16e0ed75ef947b5e3d', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 175, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 161, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 176, 'parent_remote_id' => '49c9ad954328ab5f5a76d580873961a4', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 176, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 162, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 167, 'parent_remote_id' => 'ae32173cedf3a5ec441e3afcadc4abcb', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 177, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 163, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => 'c6c32c884db955ea09338c90eee84746', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 178, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 164, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => 'db191e87b9b6ac22a18742cd32d2b3d4', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 179, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 165, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => '02a6d1506bf437eda1317d0c36a8545b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 180, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 166, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => '40d743025e4ec4d813bd864dad08e0cc', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 181, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 167, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => 'eb2a8ef7d4b1fb8ffb68f0764b615de1', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 182, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 168, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => '9e45f3ee0f15995b670fb3a117b6ee49', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 183, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 169, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => 'f368c4ae469c596344e15fca8c7370c2', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 184, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 170, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 178, 'parent_remote_id' => '7e153b75dd0ee0476ac7463d4a3daaef', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 185, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 171, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 167, 'parent_remote_id' => '09fb4147e4b124b9770a527bdd66799c', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 186, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 172, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 187, 'parent_remote_id' => '8f73d6d4ffca33c619d2f2645340ccc0', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 187, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 173, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 187, 'parent_remote_id' => '5cdc175d45aeb3fa054a95f40df56e79', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 188, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 174, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 2, 'parent_remote_id' => 'e060ff40aa17eb21dc1e4595c9a5eb9a', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 189, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 175, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => '7bf290af79b3b51e6ccc1f95f321618c', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 190, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 176, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => '9f804eee139dcee343dbe4175d14654c', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 191, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 177, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '10d57795c986ca61689e6c2c11382eb3', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 192, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 178, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 193, 'parent_remote_id' => '87417129b080d24d335eb2653dd1a40c', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 193, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 179, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => 'fd56d839df6e2b52055d4a62f4df7c3e', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 194, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 180, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => 'ab2f2093f16c56ac2e61f40f25d2dbe0', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 195, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 181, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => '185a1737e9012e7c3025df876bbb4f9b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 196, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 182, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => 'efdca2f6ddd2c8befc283ae3465b9acd', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 197, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 183, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => 'f81b0e4c31ea13d94b9838e9e7e7ad7e', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 198, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 184, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => '666efc49c267cddf55ca707408f4ac42', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 199, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 185, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => 'afb51a5f898c549c9e1f35afc75d66f3', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 200, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 186, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => '94b71866ede0d2776c140e85a823d31d', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 201, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 187, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 195, 'parent_remote_id' => 'e74475a240fb7061b40c75f5e6fcd52c', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 202, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 188, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '42a3b07037390457ad0f2c65494bfd97', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 203, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 189, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => '6da1a82ba3d962d2ad953fff8ee26362', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 204, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 190, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => 'b284abd88bdcb1887a86e40304ffc66f', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 205, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 191, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => 'e3400bb44aae5fcb416156e7450f3f32', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 206, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 192, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => '2b2b27bbaaec688aaec1a5d39b4b13ae', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 207, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 193, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => '37e5feed6574d1d8da4b4531569a27a2', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 208, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 194, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => '5625695a66034f53b9b6e14029e06e80', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 209, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 195, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => '824aba4122ee51d9638847e55642feec', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 210, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 196, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 204, 'parent_remote_id' => '73e95051b800ce051c3851c60807787b', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 211, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 197, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '3f921d3c490a6c17870b1f01fcfbceed', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 212, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 198, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 213, 'parent_remote_id' => '97f7b391f1522bf404ff672ac338b91c', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 213, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 199, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 213, 'parent_remote_id' => 'c5549bf68962a5384bd2225931cba302', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 0 ), + array( 'contentobject_id' => 214, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 200, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '54adfd9f7c80638f5560eb3f0618c57b', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 215, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 201, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => 'a7dbafbf963821b71e5522c21e09d9dd', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 216, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 202, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '61e3b15f020590df0759b779e5f1fb9d', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 217, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 203, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '42560fa30a55ac5ddf1f76a52d44a613', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 218, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 204, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 192, 'parent_remote_id' => '416c28c9ba34a9114381a6ec3ae197e0', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 219, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 205, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => 'ae6afe955af19209125961b6c0d9a840', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 220, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 206, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => '28b7fd81eaf6b9702c9f8ff8268daac9', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 221, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 207, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => '627c1c5cdf124dc2f92489e686cd04bb', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 222, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 208, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => 'daa3004ede25b0130ca5bef83c1922c3', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 223, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 209, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 224, 'parent_remote_id' => '9d2bdcb8b35464ee03651c191ac4d1ff', 'remote_id' => 0, 'sort_field' => 2, 'sort_order' => 1 ), + array( 'contentobject_id' => 224, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 210, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 190, 'parent_remote_id' => '9ae96e2ecc3a5a79964405273cc8542a', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 14, 'contentobject_version' => 4, 'from_node_id' => -1, 'id' => 211, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 13, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 225, 'contentobject_version' => 1, 'from_node_id' => 0, 'id' => 212, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + array( 'contentobject_id' => 11, 'contentobject_version' => 2, 'from_node_id' => -1, 'id' => 213, 'is_main' => 1, 'op_code' => 2, 'parent_node' => 5, 'parent_remote_id' => '', 'remote_id' => 0, 'sort_field' => 1, 'sort_order' => 1 ), + ) +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/MapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/MapperTest.php new file mode 100644 index 0000000..4f35b6d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/MapperTest.php @@ -0,0 +1,199 @@ + 77, + 'priority' => 0, + 'is_hidden' => 0, + 'is_invisible' => 0, + 'remote_id' => 'dbc2f3c8716c12f32c379dbf0b1cb133', + 'contentobject_id' => 75, + 'contentobject_version' => 1, + 'parent_node_id' => 2, + 'path_identification_string' => 'solutions', + 'path_string' => '/1/2/77/', + 'modified_subnode' => 1311065017, + 'main_node_id' => 77, + 'depth' => 2, + 'sort_field' => 2, + 'sort_order' => 1, + ); + + /** + * Expected Location object properties values + * + * @var array + */ + protected $locationValues = array( + 'id' => 77, + 'priority' => 0, + 'hidden' => 0, + 'invisible' => 0, + 'remoteId' => 'dbc2f3c8716c12f32c379dbf0b1cb133', + 'contentId' => 75, + 'parentId' => 2, + 'pathIdentificationString' => 'solutions', + 'pathString' => '/1/2/77/', + 'mainLocationId' => 77, + 'depth' => 2, + 'sortField' => 2, + 'sortOrder' => 1, + ); + + /** + * Expected Location CreateStruct object properties values + * + * @var array + */ + protected $locationCreateStructValues = array( + 'contentId' => 75, + 'contentVersion' => 1, + 'hidden' => 0, + 'invisible' => 0, + 'mainLocationId' => 77, + 'parentId' => 2, + 'pathIdentificationString' => 'solutions', + 'priority' => 0, + 'sortField' => 2, + 'sortOrder' => 1, + ); + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper::createLocationFromRow + */ + public function testCreateLocationFromRow() + { + $mapper = new Mapper(); + + $location = $mapper->createLocationFromRow( + $this->locationRow + ); + + $this->assertPropertiesCorrect( + $this->locationValues, + $location + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper::createLocationsFromRows + */ + public function testCreateLocationsFromRows() + { + $inputRows = array(); + for ( $i = 0; $i < 3; $i++ ) + { + $row = $this->locationRow; + $row['node_id'] += $i; + $inputRows[] = $row; + } + + $mapper = new Mapper(); + + $locations = $mapper->createLocationsFromRows( $inputRows ); + + $this->assertCount( 3, $locations ); + foreach ( $locations as $location ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Location', + $location + ); + } + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper::createLocationFromRow + */ + public function testCreateTrashedFromRow() + { + $mapper = new Mapper(); + + $location = $mapper->createLocationFromRow( + $this->locationRow, + null, + new Trashed() + ); + + $this->assertTrue( $location instanceof Trashed ); + $this->assertPropertiesCorrect( + $this->locationValues, + $location + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper::createLocationFromRow + */ + public function testCreateLocationFromRowWithPrefix() + { + $prefix = 'some_prefix_'; + + $data = array(); + foreach ( $this->locationRow as $key => $val ) + { + $data[$prefix . $key] = $val; + } + + $mapper = new Mapper(); + + $location = $mapper->createLocationFromRow( + $data, $prefix + ); + + $this->assertPropertiesCorrect( + $this->locationValues, + $location + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Mapper::getLocationCreateStruct + */ + public function testGetLocationCreateStruct() + { + $mapper = new Mapper(); + + $createStruct = $mapper->getLocationCreateStruct( + $this->locationRow + ); + + $this->assertNotEquals( $this->locationRow["remote_id"], $createStruct->remoteId ); + $this->assertPropertiesCorrect( + $this->locationCreateStructValues, + $createStruct + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/TrashHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/TrashHandlerTest.php new file mode 100644 index 0000000..0574ba9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Location/TrashHandlerTest.php @@ -0,0 +1,520 @@ +getDatabaseHandler(); + return new Handler( + $this->locationHandler = $this->getMockBuilder( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Handler' ) + ->disableOriginalConstructor() + ->getMock(), + $this->locationGateway = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Gateway' ), + $this->locationMapper = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Mapper' ), + $this->contentHandler = $this->getMockBuilder( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Handler' ) + ->disableOriginalConstructor() + ->getMock() + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::trashSubtree + */ + public function testTrashSubtree() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getSubtreeContent' ) + ->with( 20 ) + ->will( + $this->returnValue( + array( + array( + "contentobject_id" => 10, + "node_id" => 20, + "main_node_id" => 30, + "parent_node_id" => 40 + ), + array( + "contentobject_id" => 11, + "node_id" => 21, + "main_node_id" => 31, + "parent_node_id" => 41 + ) + ) + ) + ); + + $this->locationGateway + ->expects( $this->at( 1 ) ) + ->method( 'countLocationsByContentId' ) + ->with( 10 ) + ->will( $this->returnValue( 1 ) ); + + $this->locationGateway + ->expects( $this->at( 2 ) ) + ->method( 'trashLocation' ) + ->with( 20 ); + + $this->locationGateway + ->expects( $this->at( 3 ) ) + ->method( 'countLocationsByContentId' ) + ->with( 11 ) + ->will( $this->returnValue( 2 ) ); + + $this->locationGateway + ->expects( $this->at( 4 ) ) + ->method( 'removeLocation' ) + ->with( 21 ); + + $this->locationHandler + ->expects( $this->once() ) + ->method( 'markSubtreeModified' ) + ->with( 40 ); + + $this->locationGateway + ->expects( $this->at( 5 ) ) + ->method( 'loadTrashByLocation' ) + ->with( 20 ) + ->will( $this->returnValue( $array = array( 'data…' ) ) ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationFromRow' ) + ->with( $array, null, new Trashed() ) + ->will( $this->returnValue( new Trashed( array( 'id' => 20 ) ) ) ); + + $trashedObject = $handler->trashSubtree( 20 ); + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\Trashed', $trashedObject ); + self::assertSame( 20, $trashedObject->id ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::trashSubtree + */ + public function testTrashSubtreeReturnsNull() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getSubtreeContent' ) + ->with( 20 ) + ->will( + $this->returnValue( + array( + array( + "contentobject_id" => 10, + "node_id" => 20, + "main_node_id" => 30, + "parent_node_id" => 40 + ), + array( + "contentobject_id" => 11, + "node_id" => 21, + "main_node_id" => 31, + "parent_node_id" => 41 + ) + ) + ) + ); + + $this->locationGateway + ->expects( $this->at( 1 ) ) + ->method( 'countLocationsByContentId' ) + ->with( 10 ) + ->will( $this->returnValue( 2 ) ); + + $this->locationGateway + ->expects( $this->at( 2 ) ) + ->method( 'removeLocation' ) + ->with( 20 ); + + $this->locationGateway + ->expects( $this->at( 3 ) ) + ->method( 'countLocationsByContentId' ) + ->with( 11 ) + ->will( $this->returnValue( 1 ) ); + + $this->locationGateway + ->expects( $this->at( 4 ) ) + ->method( 'trashLocation' ) + ->with( 21 ); + + $this->locationHandler + ->expects( $this->once() ) + ->method( 'markSubtreeModified' ) + ->with( 40 ); + + $returnValue = $handler->trashSubtree( 20 ); + self::assertNull( $returnValue ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::trashSubtree + */ + public function testTrashSubtreeUpdatesMainLocation() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getSubtreeContent' ) + ->with( 20 ) + ->will( + $this->returnValue( + array( + array( + "contentobject_id" => 10, + "node_id" => 20, + "main_node_id" => 30, + "parent_node_id" => 40 + ), + array( + "contentobject_id" => 11, + "node_id" => 21, + "main_node_id" => 21, + "parent_node_id" => 41 + ) + ) + ) + ); + + $this->locationGateway + ->expects( $this->at( 1 ) ) + ->method( 'countLocationsByContentId' ) + ->with( 10 ) + ->will( $this->returnValue( 1 ) ); + + $this->locationGateway + ->expects( $this->at( 2 ) ) + ->method( 'trashLocation' ) + ->with( 20 ); + + $this->locationGateway + ->expects( $this->at( 3 ) ) + ->method( 'countLocationsByContentId' ) + ->with( 11 ) + ->will( $this->returnValue( 2 ) ); + + $this->locationGateway + ->expects( $this->at( 4 ) ) + ->method( 'removeLocation' ) + ->with( 21 ); + + $this->locationGateway + ->expects( $this->at( 5 ) ) + ->method( 'getFallbackMainNodeData' ) + ->with( 11, 21 ) + ->will( + $this->returnValue( + array( + "node_id" => 100, + "contentobject_version" => 101, + "parent_node_id" => 102, + ) + ) + ); + + $this->locationHandler + ->expects( $this->once() ) + ->method( 'changeMainLocation' ) + ->with( 11, 100, 101, 102 ); + + $this->locationHandler + ->expects( $this->once() ) + ->method( 'markSubtreeModified' ) + ->with( 40 ); + + $this->locationGateway + ->expects( $this->at( 6 ) ) + ->method( 'loadTrashByLocation' ) + ->with( 20 ) + ->will( $this->returnValue( $array = array( 'data…' ) ) ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationFromRow' ) + ->with( $array, null, new Trashed() ) + ->will( $this->returnValue( new Trashed( array( 'id' => 20 ) ) ) ); + + $trashedObject = $handler->trashSubtree( 20 ); + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\Trashed', $trashedObject ); + self::assertSame( 20, $trashedObject->id ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::recover + */ + public function testRecover() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'untrashLocation' ) + ->with( 69, 23 ) + ->will( + $this->returnValue( + new Trashed( array( 'id' => 70 ) ) + ) + ); + + self::assertSame( 70, $handler->recover( 69, 23 ) ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::loadTrashItem + */ + public function testLoadTrashItem() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'loadTrashByLocation' ) + ->with( 69 ) + ->will( $this->returnValue( $array = array( 'data…' ) ) ); + + $this->locationMapper + ->expects( $this->at( 0 ) ) + ->method( 'createLocationFromRow' ) + ->with( $array, null, new Trashed() ); + + $handler->loadTrashItem( 69 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::emptyTrash + */ + public function testEmptyTrash() + { + $handler = $this->getTrashHandler(); + + $expectedTrashed = array( + array( + 'node_id' => 69, + 'path_string' => '/1/2/69/', + 'contentobject_id' => 67, + ), + array( + 'node_id' => 70, + 'path_string' => '/1/2/70/', + 'contentobject_id' => 68, + ) + ); + + // Index for locationGateway calls + $i = 0; + // Index for contentHandler calls + $iContent = 0; + // Index for locationMapper calls + $iLocation = 0; + $this->locationGateway + ->expects( $this->at( $i++ ) ) + ->method( 'listTrashed' ) + ->will( + $this->returnValue( $expectedTrashed ) + ); + + foreach ( $expectedTrashed as $trashedElement ) + { + $this->locationMapper + ->expects( $this->at( $iLocation++ ) ) + ->method( 'createLocationFromRow' ) + ->will( + $this->returnValue( + new Trashed( + array( + 'id' => $trashedElement['node_id'], + 'contentId' => $trashedElement['contentobject_id'], + 'pathString' => $trashedElement['path_string'] + ) + ) + ) + ); + $this->locationGateway + ->expects( $this->at( $i++ ) ) + ->method( 'removeElementFromTrash' ) + ->with( $trashedElement['node_id'] ); + + $this->locationGateway + ->expects( $this->at( $i++ ) ) + ->method( 'countLocationsByContentId' ) + ->with( $trashedElement['contentobject_id'] ) + ->will( $this->returnValue( 0 ) ); + + $this->contentHandler + ->expects( $this->at( $iContent++ ) ) + ->method( 'deleteContent' ) + ->with( $trashedElement['contentobject_id'] ); + } + + $handler->emptyTrash(); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::deleteTrashItem + */ + public function testDeleteTrashItemNoMoreLocations() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'loadTrashByLocation' ) + ->with( 69 ) + ->will( + $this->returnValue( + array( + 'node_id' => 69, + 'contentobject_id' => 67, + 'path_string' => '/1/2/69' + ) + ) + ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationFromRow' ) + ->will( + $this->returnValue( + new Trashed( + array( + 'id' => 69, + 'contentId' => 67, + 'pathString' => '/1/2/69' + ) + ) + ) + ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'removeElementFromTrash' ) + ->with( 69 ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'countLocationsByContentId' ) + ->with( 67 ) + ->will( $this->returnValue( 0 ) ); + + $this->contentHandler + ->expects( $this->once() ) + ->method( 'deleteContent' ) + ->with( 67 ); + + $handler->deleteTrashItem( 69 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Location\Trash\Handler::deleteTrashItem + */ + public function testDeleteTrashItemStillHaveLocations() + { + $handler = $this->getTrashHandler(); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'loadTrashByLocation' ) + ->with( 69 ) + ->will( + $this->returnValue( + array( + 'node_id' => 69, + 'contentobject_id' => 67, + 'path_string' => '/1/2/69' + ) + ) + ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationFromRow' ) + ->will( + $this->returnValue( + new Trashed( + array( + 'id' => 69, + 'contentId' => 67, + 'pathString' => '/1/2/69' + ) + ) + ) + ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'removeElementFromTrash' ) + ->with( 69 ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'countLocationsByContentId' ) + ->with( 67 ) + ->will( $this->returnValue( 1 ) ); + + $this->contentHandler + ->expects( $this->never() ) + ->method( 'deleteContent' ); + + $handler->deleteTrashItem( 69 ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LocationHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LocationHandlerTest.php new file mode 100644 index 0000000..e391bf0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/LocationHandlerTest.php @@ -0,0 +1,741 @@ +getDatabaseHandler(); + return new Handler( + $this->locationGateway = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Gateway' ), + $this->locationMapper = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Mapper' ), + $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Handler', array(), array(), '', false ), + $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper', array(), array(), '', false ) + ); + } + + public function testLoadLocation() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'getBasicNodeData' ) + ->with( 77 ) + ->will( + $this->returnValue( + array( + 'node_id' => 77, + ) + ) + ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationFromRow' ) + ->with( array( 'node_id' => 77 ) ) + ->will( $this->returnValue( new \eZ\Publish\SPI\Persistence\Content\Location() ) ); + + $location = $handler->load( 77 ); + + $this->assertTrue( $location instanceof \eZ\Publish\SPI\Persistence\Content\Location ); + } + + public function testLoadLocationByRemoteId() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'getBasicNodeDataByRemoteId' ) + ->with( 'abc123' ) + ->will( + $this->returnValue( + array( + 'node_id' => 77, + ) + ) + ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationFromRow' ) + ->with( array( 'node_id' => 77 ) ) + ->will( $this->returnValue( new \eZ\Publish\SPI\Persistence\Content\Location() ) ); + + $location = $handler->loadByRemoteId( 'abc123' ); + + $this->assertTrue( $location instanceof \eZ\Publish\SPI\Persistence\Content\Location ); + } + + public function testLoadLocationsByContent() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'loadLocationDataByContent' ) + ->with( 23, 42 ) + ->will( + $this->returnValue( + array() + ) + ); + + $this->locationMapper + ->expects( $this->once() ) + ->method( 'createLocationsFromRows' ) + ->with( array() ) + ->will( $this->returnValue( array( 'a', 'b' ) ) ); + + $locations = $handler->loadLocationsByContent( 23, 42 ); + + $this->assertInternalType( 'array', $locations ); + } + + public function testMoveSubtree() + { + $handler = $this->getLocationHandler(); + + $sourceData = array( + 'node_id' => 69, + 'path_string' => '/1/2/69/', + 'parent_node_id' => 2, + 'contentobject_id' => 67, + ); + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getBasicNodeData' ) + ->with( 69 ) + ->will( $this->returnValue( $sourceData ) ); + + $destinationData = array( + 'node_id' => 77, + 'path_string' => '/1/2/77/', + ); + $this->locationGateway + ->expects( $this->at( 1 ) ) + ->method( 'getBasicNodeData' ) + ->with( 77 ) + ->will( $this->returnValue( $destinationData ) ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'moveSubtreeNodes' ) + ->with( $sourceData, $destinationData ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'updateNodeAssignment' ) + ->with( 67, 2, 77, 5 ); + + $handler->move( 69, 77 ); + } + + public function testHideUpdateHidden() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getBasicNodeData' ) + ->with( 69 ) + ->will( + $this->returnValue( + array( + 'node_id' => 69, + 'path_string' => '/1/2/69/', + 'contentobject_id' => 67, + ) + ) + ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'hideSubtree' ) + ->with( '/1/2/69/' ); + + $handler->hide( 69 ); + } + + /** + * @depends testHideUpdateHidden + */ + public function testHideUnhideUpdateHidden() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getBasicNodeData' ) + ->with( 69 ) + ->will( + $this->returnValue( + array( + 'node_id' => 69, + 'path_string' => '/1/2/69/', + 'contentobject_id' => 67, + ) + ) + ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'unhideSubtree' ) + ->with( '/1/2/69/' ); + + $handler->unhide( 69 ); + } + + public function testSwapLocations() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'swap' ) + ->with( 70, 78 ); + + $handler->swap( 70, 78 ); + } + + public function testCreateLocation() + { + $handler = $this->getLocationHandler(); + + $createStruct = new CreateStruct(); + $createStruct->parentId = 77; + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'getBasicNodeData' ) + ->with( 77 ) + ->will( + $this->returnValue( + $parentInfo = array( + 'node_id' => 77, + 'path_string' => '/1/2/77/', + ) + ) + ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'create' ) + ->with( $createStruct, $parentInfo ) + ->will( $this->returnValue( $createStruct ) ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'createNodeAssignment' ) + ->with( $createStruct, 77, 2 ); + + $handler->create( $createStruct ); + } + + public function testUpdateLocation() + { + $handler = $this->getLocationHandler(); + + $updateStruct = new UpdateStruct(); + $updateStruct->priority = 77; + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'update' ) + ->with( $updateStruct, 23 ); + + $handler->update( $updateStruct, 23 ); + } + + public function testSetSectionForSubtree() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getBasicNodeData' ) + ->with( 69 ) + ->will( + $this->returnValue( + array( + 'node_id' => 69, + 'path_string' => '/1/2/69/', + 'contentobject_id' => 67, + ) + ) + ); + + $this->locationGateway + ->expects( $this->once() ) + ->method( 'setSectionForSubtree' ) + ->with( '/1/2/69/', 3 ); + + $handler->setSectionForSubtree( 69, 3 ); + } + + public function testMarkSubtreeModified() + { + $handler = $this->getLocationHandler(); + + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( 'getBasicNodeData' ) + ->with( 69 ) + ->will( + $this->returnValue( + array( + 'node_id' => 69, + 'path_string' => '/1/2/69/', + 'contentobject_id' => 67, + ) + ) + ); + + $this->locationGateway + ->expects( $this->at( 1 ) ) + ->method( 'updateSubtreeModificationTime' ) + ->with( '/1/2/69/' ); + + $handler->markSubtreeModified( 69 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Handler::changeMainLocation + */ + public function testChangeMainLocation() + { + $contentHandlerMock = $this->getMock( "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Handler", array(), array(), "", false ); + $locationGatewayMock = $this->getMock( "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Gateway" ); + $handler = $this->getMock( + "\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Handler", + array( "load", "setSectionForSubtree" ), + array( + $locationGatewayMock, + $this->getMock( "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Mapper" ), + $contentHandlerMock, + $this->getMock( "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper", array(), array(), "", false ) + ) + ); + + $handler + ->expects( $this->at( 0 ) ) + ->method( "load" ) + ->with( 34 ) + ->will( $this->returnValue( new Location( array( "parentId" => 42 ) ) ) ); + + $handler + ->expects( $this->at( 1 ) ) + ->method( "load" ) + ->with( 42 ) + ->will( $this->returnValue( new Location( array( "contentId" => 84 ) ) ) ); + + $contentHandlerMock + ->expects( $this->at( 0 ) ) + ->method( "loadContentInfo" ) + ->with( "12" ) + ->will( $this->returnValue( new ContentInfo( array( "currentVersionNo" => 1 ) ) ) ); + + $contentHandlerMock + ->expects( $this->at( 1 ) ) + ->method( "loadContentInfo" ) + ->with( "84" ) + ->will( $this->returnValue( new ContentInfo( array( "sectionId" => 4 ) ) ) ); + + $locationGatewayMock + ->expects( $this->once() ) + ->method( "changeMainLocation" ) + ->with( 12, 34, 1, 42 ); + + $handler + ->expects( $this->once() ) + ->method( "setSectionForSubtree" ) + ->with( 34, 4 ); + + $handler->changeMainLocation( 12, 34 ); + } + + /** + * Test for the removeSubtree() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Handler::removeSubtree + * + * @return void + */ + public function testRemoveSubtree() + { + $handler = $this->getPartlyMockedHandler( array( "changeMainLocation" ) ); + + // Original call + $this->locationGateway + ->expects( $this->at( 0 ) ) + ->method( "getBasicNodeData" ) + ->with( 42 ) + ->will( + $this->returnValue( + array( + "contentobject_id" => 100, + "main_node_id" => 200 + ) + ) + ); + $this->locationGateway + ->expects( $this->at( 1 ) ) + ->method( "getChildren" ) + ->with( 42 ) + ->will( + $this->returnValue( + array( + array( "node_id" => 201 ), + array( "node_id" => 202 ) + ) + ) + ); + + // First recursive call + $this->locationGateway + ->expects( $this->at( 2 ) ) + ->method( "getBasicNodeData" ) + ->with( 201 ) + ->will( + $this->returnValue( + array( + "contentobject_id" => 101, + "main_node_id" => 201 + ) + ) + ); + $this->locationGateway + ->expects( $this->at( 3 ) ) + ->method( "getChildren" ) + ->with( 201 ) + ->will( $this->returnValue( array() ) ); + $this->locationGateway + ->expects( $this->at( 4 ) ) + ->method( "countLocationsByContentId" ) + ->with( 101 ) + ->will( $this->returnValue( 1 ) ); + $this->contentHandler + ->expects( $this->once() ) + ->method( "removeRawContent" ) + ->with( 101 ); + $this->locationGateway + ->expects( $this->at( 5 ) ) + ->method( "removeLocation" ) + ->with( 201 ); + $this->locationGateway + ->expects( $this->at( 6 ) ) + ->method( "deleteNodeAssignment" ) + ->with( 101 ); + + // Second recursive call + $this->locationGateway + ->expects( $this->at( 7 ) ) + ->method( "getBasicNodeData" ) + ->with( 202 ) + ->will( + $this->returnValue( + array( + "contentobject_id" => 102, + "main_node_id" => 202 + ) + ) + ); + $this->locationGateway + ->expects( $this->at( 8 ) ) + ->method( "getChildren" ) + ->with( 202 ) + ->will( $this->returnValue( array() ) ); + $this->locationGateway + ->expects( $this->at( 9 ) ) + ->method( "countLocationsByContentId" ) + ->with( 102 ) + ->will( $this->returnValue( 2 ) ); + $this->locationGateway + ->expects( $this->at( 10 ) ) + ->method( "getFallbackMainNodeData" ) + ->with( 102, 202 ) + ->will( + $this->returnValue( + array( + "node_id" => 203, + "contentobject_version" => 1, + "parent_node_id" => 204 + ) + ) + ); + $handler + ->expects( $this->once() ) + ->method( "changeMainLocation" ) + ->with( 102, 203, 1, 204 ); + $this->locationGateway + ->expects( $this->at( 11 ) ) + ->method( "removeLocation" ) + ->with( 202 ); + $this->locationGateway + ->expects( $this->at( 12 ) ) + ->method( "deleteNodeAssignment" ) + ->with( 102 ); + + // Continuation of the original call + $this->locationGateway + ->expects( $this->at( 13 ) ) + ->method( "removeLocation" ) + ->with( 42 ); + $this->locationGateway + ->expects( $this->at( 14 ) ) + ->method( "deleteNodeAssignment" ) + ->with( 100 ); + + // Start + $handler->removeSubtree( 42 ); + } + + /** + * Test for the copySubtree() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Location\Handler::copySubtree + * + * @return void + */ + public function testCopySubtree() + { + $handler = $this->getPartlyMockedHandler( + array( + "load", + "changeMainLocation", + "setSectionForSubtree", + "create" + ) + ); + $subtreeContentRows = array( + array( "node_id" => 10, "main_node_id" => 1, "parent_node_id" => 3, "contentobject_id" => 21, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_10", "sort_field" => 2, "sort_order" => 1 ), + array( "node_id" => 11, "main_node_id" => 11, "parent_node_id" => 10, "contentobject_id" => 211, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_11", "sort_field" => 2, "sort_order" => 1 ), + array( "node_id" => 12, "main_node_id" => 15, "parent_node_id" => 10, "contentobject_id" => 215, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_12", "sort_field" => 2, "sort_order" => 1 ), + array( "node_id" => 13, "main_node_id" => 2, "parent_node_id" => 10, "contentobject_id" => 22, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_13", "sort_field" => 2, "sort_order" => 1 ), + array( "node_id" => 14, "main_node_id" => 11, "parent_node_id" => 13, "contentobject_id" => 211, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_14", "sort_field" => 2, "sort_order" => 1 ), + array( "node_id" => 15, "main_node_id" => 15, "parent_node_id" => 13, "contentobject_id" => 215, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_15", "sort_field" => 2, "sort_order" => 1 ), + array( "node_id" => 16, "main_node_id" => 16, "parent_node_id" => 15, "contentobject_id" => 216, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 0, "priority" => 0, "path_identification_string" => "test_16", "sort_field" => 2, "sort_order" => 1 ), + ); + $destinationData = array( "node_id" => 5, "main_node_id" => 5, "parent_node_id" => 4, "contentobject_id" => 200, "contentobject_version" => 1, "is_hidden" => 0, "is_invisible" => 1, "path_identification_string" => "test_destination" ); + $mainLocationsMap = array( true, true, true, true, 1011, 1012, true ); + $updateMainLocationsMap = array( 1215 => 1015 ); + $offset = 1000; + + $this->locationGateway + ->expects( $this->once() ) + ->method( "getSubtreeContent" ) + ->with( $subtreeContentRows[0]["node_id"] ) + ->will( $this->returnValue( $subtreeContentRows ) ); + $this->locationGateway + ->expects( $this->once() ) + ->method( "getBasicNodeData" ) + ->with( $destinationData["node_id"] ) + ->will( $this->returnValue( $destinationData ) ); + + $contentIds = array_values( + array_unique( + array_map( + function ( $row ) + { + return $row["contentobject_id"]; + }, + $subtreeContentRows + ) + ) + ); + foreach ( $contentIds as $index => $contentId ) + { + $this->contentHandler + ->expects( $this->at( $index * 2 ) ) + ->method( "copy" ) + ->with( $contentId, 1 ) + ->will( + $this->returnValue( + new Content( + array( + "versionInfo" => new VersionInfo( + array( + "contentInfo" => new ContentInfo( + array( + "id" => $contentId + $offset, + "currentVersionNo" => 1 + ) + ) + ) + ) + ) + ) + ) + ); + + $this->contentHandler + ->expects( $this->at( $index * 2 + 1 ) ) + ->method( "publish" ) + ->with( + $contentId + $offset, + 1, + $this->isInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\MetadataUpdateStruct" ) + ) + ->will( + $this->returnValue( + new Content( + array( + "versionInfo" => new VersionInfo( + array( + "contentInfo" => new ContentInfo( + array( + "id" => $contentId + $offset + ) + ) + ) + ) + ) + ) + ) + ); + } + + $pathStrings = array( $destinationData["node_id"] => $destinationData["path_identification_string"] ); + foreach ( $subtreeContentRows as $index => $row ) + { + $mapper = new Mapper(); + $createStruct = $mapper->getLocationCreateStruct( $row ); + $this->locationMapper + ->expects( $this->at( $index ) ) + ->method( "getLocationCreateStruct" ) + ->with( $row ) + ->will( $this->returnValue( $createStruct ) ); + + $createStruct = clone $createStruct; + $createStruct->contentId = $createStruct->contentId + $offset; + $createStruct->parentId = $index === 0 ? $destinationData["node_id"] : $createStruct->parentId + $offset; + $createStruct->invisible = true; + $createStruct->mainLocationId = $mainLocationsMap[$index]; + $createStruct->pathIdentificationString = $pathStrings[$createStruct->parentId] . "/" . $row["path_identification_string"]; + $pathStrings[$row["node_id"] + $offset] = $createStruct->pathIdentificationString; + $handler + ->expects( $this->at( $index ) ) + ->method( 'create' ) + ->with( $createStruct ) + ->will( + $this->returnValue( + new Location( + array( + "id" => $row["node_id"] + $offset, + "hidden" => false, + "invisible" => true, + "pathIdentificationString" => $createStruct->pathIdentificationString, + "mainLocationId" => $mainLocationsMap[$index] === true ? + $row["node_id"] + $offset : + $mainLocationsMap[$index] + ) + ) + ) + ); + } + + foreach ( $updateMainLocationsMap as $contentId => $locationId ) + { + $handler + ->expects( $this->any() ) + ->method( "changeMainLocation" ) + ->with( $contentId, $locationId ); + } + + $handler + ->expects( $this->once() ) + ->method( "load" ) + ->with( $destinationData["node_id"] ) + ->will( $this->returnValue( new Location( array( "contentId" => $destinationData["contentobject_id"] ) ) ) ); + + $this->contentHandler + ->expects( $this->once() ) + ->method( "loadContentInfo" ) + ->with( $destinationData["contentobject_id"] ) + ->will( $this->returnValue( new ContentInfo( array( "sectionId" => 12345 ) ) ) ); + + $handler + ->expects( $this->once() ) + ->method( "setSectionForSubtree" ) + ->with( $subtreeContentRows[0]["node_id"] + $offset, 12345 ); + + $handler->copySubtree( + $subtreeContentRows[0]["node_id"], + $destinationData["node_id"] + ); + } + + /** + * Returns the handler to test with $methods mocked + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Handler + */ + protected function getPartlyMockedHandler( array $methods ) + { + return $this->getMock( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Handler', + $methods, + array( + $this->locationGateway = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Gateway', array(), array(), '', false ), + $this->locationMapper = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Mapper', array(), array(), '', false ), + $this->contentHandler = $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Handler', array(), array(), '', false ), + $this->getMock( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper', array(), array(), '', false ) + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php new file mode 100644 index 0000000..a9e812f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/MapperTest.php @@ -0,0 +1,647 @@ +getValueConverterRegistryMock(); + + $mapper = $this->getMapper(); + + $this->assertAttributeSame( + $regMock, + 'converterRegistry', + $mapper + ); + } + + /** + * Returns a eZ\Publish\SPI\Persistence\Content\CreateStruct fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\CreateStruct + */ + protected function getCreateStructFixture() + { + $struct = new CreateStruct(); + + $struct->name = 'Content name'; + $struct->typeId = 23; + $struct->sectionId = 42; + $struct->ownerId = 13; + $struct->initialLanguageId = 2; + $struct->locations = array( + new LocationCreateStruct( + array( 'parentId' => 2 ) + ), + new LocationCreateStruct( + array( 'parentId' => 3 ) + ), + new LocationCreateStruct( + array( 'parentId' => 4 ) + ) + ); + $struct->fields = array( new Field(), ); + + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createVersionInfoForContent + * + * @return void + */ + public function testCreateVersionInfoForContent() + { + $content = $this->getFullContentFixture(); + $time = time(); + + $mapper = $this->getMapper(); + + $versionInfo = $mapper->createVersionInfoForContent( + $content, + 1, + 14 + ); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'versionNo' => 1, + 'creatorId' => 14, + 'status' => 0, + 'initialLanguageCode' => 'eng-GB', + 'languageIds' => array( 4 ), + ), + $versionInfo + ); + $this->assertGreaterThanOrEqual( $time, $versionInfo->creationDate ); + $this->assertGreaterThanOrEqual( $time, $versionInfo->modificationDate ); + } + + /** + * Returns a Content fixture + * + * @return Content + */ + protected function getFullContentFixture() + { + $content = new Content; + + $content->fields = array( + new Field( array( "languageCode" => "eng-GB" ) ), + ); + $content->versionInfo = new VersionInfo( + array( + 'versionNo' => 1, + 'initialLanguageCode' => 'eng-GB', + 'languageIds' => array( 4 ), + ) + ); + + $content->versionInfo->contentInfo = new ContentInfo; + $content->versionInfo->contentInfo->id = 2342; + $content->versionInfo->contentInfo->contentTypeId = 23; + $content->versionInfo->contentInfo->sectionId = 42; + $content->versionInfo->contentInfo->ownerId = 13; + + return $content; + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::convertToStorageValue + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue + */ + public function testConvertToStorageValue() + { + $convMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + $convMock->expects( $this->once() ) + ->method( 'toStorageValue' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\FieldValue' + ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldValue' + ) + )->will( $this->returnValue( new StorageFieldValue() ) ); + + $reg = new Registry( array( 'some-type' => $convMock ) ); + + $field = new Field(); + $field->type = 'some-type'; + $field->value = new FieldValue(); + + $mapper = new Mapper( $reg, $this->getLanguageHandler() ); + $res = $mapper->convertToStorageValue( $field ); + + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldValue', + $res + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::extractContentFromRows + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::extractFieldFromRow + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::extractFieldValueFromRow + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue + */ + public function testExtractContentFromRows() + { + $convMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + $convMock->expects( $this->exactly( 13 ) ) + ->method( 'toFieldValue' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldValue' + ) + )->will( + $this->returnValue( + new FieldValue() + ) + ); + + $reg = new Registry( + array( + 'ezauthor' => $convMock, + 'ezstring' => $convMock, + 'ezxmltext' => $convMock, + 'ezboolean' => $convMock, + 'ezimage' => $convMock, + 'ezdatetime' => $convMock, + 'ezkeyword' => $convMock, + 'ezsrrating' => $convMock + ) + ); + + $rowsFixture = $this->getContentExtractFixture(); + + $mapper = new Mapper( $reg, $this->getLanguageHandler() ); + $result = $mapper->extractContentFromRows( $rowsFixture ); + + $this->assertEquals( + array( + $this->getContentExtractReference(), + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::extractContentFromRows + * + * @return void + */ + public function testExtractContentFromRowsMultipleVersions() + { + $convMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + $convMock->expects( $this->any() ) + ->method( 'toFieldValue' ) + ->will( $this->returnValue( new FieldValue() ) ); + + $reg = new Registry( + array( + 'ezstring' => $convMock, + 'ezxmltext' => $convMock, + 'ezdatetime' => $convMock, + ) + ); + + $rowsFixture = $this->getMultipleVersionsExtractFixture(); + + $mapper = new Mapper( $reg, $this->getLanguageHandler() ); + $result = $mapper->extractContentFromRows( $rowsFixture ); + + $this->assertEquals( + 2, + count( $result ) + ); + + $this->assertEquals( + 11, + $result[0]->versionInfo->contentInfo->id + ); + $this->assertEquals( + 11, + $result[1]->versionInfo->contentInfo->id + ); + + $this->assertEquals( + 1, + $result[0]->versionInfo->versionNo + ); + $this->assertEquals( + 2, + $result[1]->versionInfo->versionNo + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createCreateStructFromContent + */ + public function testCreateCreateStructFromContent() + { + $time = time(); + $mapper = $this->getMapper(); + + $content = $this->getContentExtractReference(); + + $struct = $mapper->createCreateStructFromContent( $content ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\CreateStruct', + $struct + ); + return array( + 'original' => $content, + 'result' => $struct, + 'time' => $time + ); + + // parentLocations + // fields + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createCreateStructFromContent + * @depends testCreateCreateStructFromContent + */ + public function testCreateCreateStructFromContentBasicProperties( $data ) + { + $content = $data['original']; + $struct = $data['result']; + $time = $data['time']; + $this->assertStructsEqual( + $content->versionInfo->contentInfo, + $struct, + array( 'sectionId', 'ownerId' ) + ); + self::assertNotEquals( $content->versionInfo->contentInfo->remoteId, $struct->remoteId ); + self::assertSame( $content->versionInfo->contentInfo->contentTypeId, $struct->typeId ); + self::assertSame( 2, $struct->initialLanguageId ); + self::assertSame( $content->versionInfo->contentInfo->alwaysAvailable, $struct->alwaysAvailable ); + self::assertGreaterThanOrEqual( $time, $struct->modified ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createCreateStructFromContent + * @depends testCreateCreateStructFromContent + */ + public function testCreateCreateStructFromContentParentLocationsEmpty( $data ) + { + $this->assertEquals( + array(), + $data['result']->locations + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createCreateStructFromContent + * @depends testCreateCreateStructFromContent + */ + public function testCreateCreateStructFromContentFieldCount( $data ) + { + $this->assertEquals( + count( $data['original']->fields ), + count( $data['result']->fields ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createCreateStructFromContent + * @depends testCreateCreateStructFromContent + */ + public function testCreateCreateStructFromContentFieldsNoId( $data ) + { + foreach ( $data['result']->fields as $field ) + { + $this->assertNull( $field->id ); + } + } + + public function testExtractRelationsFromRows() + { + $mapper = $this->getMapper(); + + $rows = $this->getRelationExtractFixture(); + + $res = $mapper->extractRelationsFromRows( $rows ); + + $this->assertEquals( + $this->getRelationExtractReference(), + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::extractContentInfoFromRow + * @dataProvider extractContentInfoFromRowProvider + * @param array $fixtures + * @param string $prefix + */ + public function testExtractContentInfoFromRow( array $fixtures, $prefix ) + { + $contentInfoReference = $this->getContentExtractReference()->versionInfo->contentInfo; + $mapper = new Mapper( + $this->getValueConverterRegistryMock(), + $this->getLanguageHandler() + ); + self::assertEquals( $contentInfoReference, $mapper->extractContentInfoFromRow( $fixtures, $prefix ) ); + } + + /** + * Returns test data for {@link testExtractContentInfoFromRow()} + * + * @return array + */ + public function extractContentInfoFromRowProvider() + { + $fixtures = $this->getContentExtractFixture(); + $fixturesNoPrefix = array(); + foreach ( $fixtures[0] as $key => $value ) + { + $keyNoPrefix = $key === "ezcontentobject_tree_main_node_id" + ? $key + : str_replace( 'ezcontentobject_', '', $key ); + $fixturesNoPrefix[$keyNoPrefix] = $value; + } + + return array( + array( $fixtures[0], 'ezcontentobject_' ), + array( $fixturesNoPrefix, '' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Mapper::createRelationFromCreateStruct + * + * @return void + */ + public function testCreateRelationFromCreateStruct() + { + $struct = $this->getRelationCreateStructFixture(); + + $mapper = $this->getMapper(); + $relation = $mapper->createRelationFromCreateStruct( $struct ); + + self::assertInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Relation', $relation ); + foreach ( $struct as $property => $value ) + { + self::assertSame( $value, $relation->$property ); + } + } + + /** + * Returns test data for {@link testExtractVersionInfoFromRow()} + * + * @return array + */ + public function extractVersionInfoFromRowProvider() + { + $fixturesAll = $this->getContentExtractFixture(); + $fixtures = $fixturesAll[0]; + $fixtures['ezcontentobject_version_names'] = array( + array( 'content_translation' => 'eng-US', 'name' => 'Something' ) + ); + $fixtures['ezcontentobject_version_languages'] = array( 2 ); + $fixtures['ezcontentobject_version_initial_language_code'] = 'eng-US'; + $fixturesNoPrefix = array(); + foreach ( $fixtures as $key => $value ) + { + $keyNoPrefix = str_replace( 'ezcontentobject_version_', '', $key ); + $fixturesNoPrefix[$keyNoPrefix] = $value; + } + + return array( + array( $fixtures, 'ezcontentobject_version_' ), + array( $fixturesNoPrefix, '' ) + ); + } + + /** + * Returns a fixture of database rows for content extraction + * + * Fixture is stored in _fixtures/extract_content_from_rows.php + * + * @return array + */ + protected function getContentExtractFixture() + { + return require __DIR__ . '/_fixtures/extract_content_from_rows.php'; + } + + /** + * Returns a reference result for content extraction + * + * Fixture is stored in _fixtures/extract_content_from_rows_result.php + * + * @return Content + */ + protected function getContentExtractReference() + { + return require __DIR__ . '/_fixtures/extract_content_from_rows_result.php'; + } + + /** + * Returns a fixture for mapping multiple versions of a content object + * + * @return string[][] + */ + protected function getMultipleVersionsExtractFixture() + { + return require __DIR__ . '/_fixtures/extract_content_from_rows_multiple_versions.php'; + } + + /** + * Returns a fixture of database rows for relations extraction + * + * Fixture is stored in _fixtures/relations.php + * + * @return array + */ + protected function getRelationExtractFixture() + { + return require __DIR__ . '/_fixtures/relations_rows.php'; + } + + /** + * Returns a reference result for content extraction + * + * Fixture is stored in _fixtures/relations_results.php + * + * @return Content + */ + protected function getRelationExtractReference() + { + return require __DIR__ . '/_fixtures/relations_results.php'; + } + + /** + * Returns a Mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Mapper + */ + protected function getMapper( $valueConverter = null ) + { + return new Mapper( + $this->getValueConverterRegistryMock(), + $this->getLanguageHandler() + ); + } + + /** + * Returns a FieldValue converter registry mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + protected function getValueConverterRegistryMock() + { + if ( !isset( $this->valueConverterRegistryMock ) ) + { + $this->valueConverterRegistryMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\ConverterRegistry', + array(), + array( array() ) + ); + } + return $this->valueConverterRegistryMock; + } + + /** + * Returns a eZ\Publish\SPI\Persistence\Content\CreateStruct fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct + */ + protected function getRelationCreateStructFixture() + { + $struct = new RelationCreateStruct(); + + $struct->destinationContentId = 0; + $struct->sourceContentId = 0; + $struct->sourceContentVersionNo = 1; + $struct->sourceFieldDefinitionId = 1; + $struct->type = RelationValue::COMMON; + + return $struct; + } + + /** + * Returns a language handler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler + */ + protected function getLanguageHandler() + { + $languages = array( + new Language( + array( + 'id' => 2, + 'languageCode' => 'eng-US', + 'name' => 'US english' + ) + ), + new Language( + array( + 'id' => 4, + 'languageCode' => 'eng-GB', + 'name' => 'British english' + ) + ) + ); + + if ( !isset( $this->languageHandler ) ) + { + $this->languageHandler = $this->getMock( 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\Handler' ); + $this->languageHandler->expects( $this->any() ) + ->method( 'load' ) + ->will( + $this->returnCallback( + function ( $id ) use ( $languages ) + { + foreach ( $languages as $language ) + { + if ( $language->id == $id ) + { + return $language; + } + } + } + ) + ); + $this->languageHandler->expects( $this->any() ) + ->method( 'loadByLanguageCode' ) + ->will( + $this->returnCallback( + function ( $languageCode ) use ( $languages ) + { + foreach ( $languages as $language ) + { + if ( $language->languageCode == $languageCode ) + { + return $language; + } + } + } + ) + ); + } + return $this->languageHandler; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..4a1c11c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/Gateway/EzcDatabaseTest.php @@ -0,0 +1,685 @@ +insertDatabaseFixture( + __DIR__ . '/../../_fixtures/contentobjects.php' + ); + + $this->insertDatabaseFixture( + __DIR__ . '/../../_fixtures/objectstates.php' + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::__construct + * + * @return void + */ + public function testCtor() + { + $handler = $this->getDatabaseHandler(); + $gateway = $this->getDatabaseGateway(); + + $this->assertAttributeSame( + $handler, + 'dbHandler', + $gateway + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateData + * + * @return void + */ + public function testLoadObjectStateData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateData( 1 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'not_locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Not locked' + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateDataByIdentifier + * + * @return void + */ + public function testLoadObjectStateDataByIdentifier() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateDataByIdentifier( 'not_locked', 2 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'not_locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Not locked' + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateListData + * + * @return void + */ + public function testLoadObjectStateListData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateListData( 2 ); + + $this->assertEquals( + array( + array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'not_locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Not locked' + ) + ), + array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 2, + 'ezcobj_state_identifier' => 'locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 1, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Locked' + ) + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateGroupData + * + * @return void + */ + public function testLoadObjectStateGroupData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateGroupData( 2 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_group_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_group_identifier' => 'ez_lock', + 'ezcobj_state_group_language_mask' => 3, + 'ezcobj_state_group_language_description' => '', + 'ezcobj_state_group_language_language_id' => 3, + 'ezcobj_state_group_language_real_language_id' => 2, + 'ezcobj_state_group_language_name' => 'Lock' + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateGroupDataByIdentifier + * + * @return void + */ + public function testLoadObjectStateGroupDataByIdentifier() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateGroupDataByIdentifier( 'ez_lock' ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_group_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_group_identifier' => 'ez_lock', + 'ezcobj_state_group_language_mask' => 3, + 'ezcobj_state_group_language_description' => '', + 'ezcobj_state_group_language_language_id' => 3, + 'ezcobj_state_group_language_real_language_id' => 2, + 'ezcobj_state_group_language_name' => 'Lock' + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateGroupListData + * + * @return void + */ + public function testLoadObjectStateGroupListData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateGroupListData( 0, -1 ); + + $this->assertEquals( + array( + array( + array( + 'ezcobj_state_group_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_group_identifier' => 'ez_lock', + 'ezcobj_state_group_language_mask' => 3, + 'ezcobj_state_group_language_description' => '', + 'ezcobj_state_group_language_language_id' => 3, + 'ezcobj_state_group_language_real_language_id' => 2, + 'ezcobj_state_group_language_name' => 'Lock' + ) + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::insertObjectState + * + * @return void + */ + public function testInsertObjectState() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->insertObjectState( $this->getObjectStateFixture(), 2 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 4, + 'ezcobj_state_group_id' => 2, + // The new state should be added with state ID = 3 + 'ezcobj_state_id' => 3, + 'ezcobj_state_identifier' => 'test_state', + 'ezcobj_state_language_mask' => 5, + // The new state should have priority = 2 + 'ezcobj_state_priority' => 2, + 'ezcobj_state_language_description' => 'Test state description', + 'ezcobj_state_language_language_id' => 5, + 'ezcobj_state_language_name' => 'Test state' + ) + ), + // The new state should be added with state ID = 3 + $this->getDatabaseGateway()->loadObjectStateData( 3 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::insertObjectState + * + * @return void + */ + public function testInsertObjectStateInEmptyGroup() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->insertObjectStateGroup( $this->getObjectStateGroupFixture() ); + $gateway->insertObjectState( $this->getObjectStateFixture(), 3 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 4, + // New group should be added with group ID = 3 + 'ezcobj_state_group_id' => 3, + // The new state should be added with state ID = 3 + 'ezcobj_state_id' => 3, + 'ezcobj_state_identifier' => 'test_state', + 'ezcobj_state_language_mask' => 5, + // The new state should have priority = 0 + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => 'Test state description', + 'ezcobj_state_language_language_id' => 5, + 'ezcobj_state_language_name' => 'Test state' + ) + ), + // The new state should be added with state ID = 3 + $this->getDatabaseGateway()->loadObjectStateData( 3 ) + ); + + $this->assertEquals( + // 185 is the number of objects in the fixture + 185, + $gateway->getContentCount( 3 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::updateObjectState + * + * @return void + */ + public function testUpdateObjectState() + { + $gateway = $this->getDatabaseGateway(); + + $objectStateFixture = $this->getObjectStateFixture(); + $objectStateFixture->id = 1; + + $gateway->updateObjectState( $objectStateFixture ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 4, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'test_state', + 'ezcobj_state_language_mask' => 5, + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => 'Test state description', + 'ezcobj_state_language_language_id' => 5, + 'ezcobj_state_language_name' => 'Test state' + ) + ), + $this->getDatabaseGateway()->loadObjectStateData( 1 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::deleteObjectState + * + * @return void + */ + public function testDeleteObjectState() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->deleteObjectState( 1 ); + + $this->assertEquals( + array(), + $this->getDatabaseGateway()->loadObjectStateData( 1 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::updateObjectStateLinks + * + * @return void + */ + public function testUpdateObjectStateLinks() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->updateObjectStateLinks( 1, 2 ); + + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query + ->select( $query->expr->count( '*' ) ) + ->from( 'ezcobj_state_link' ) + ->where( 'contentobject_state_id = 1' ); + + $statement = $query->prepare(); + $statement->execute(); + + $this->assertEquals( + 0, + $statement->fetchColumn() + ); + + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query + ->select( $query->expr->count( '*' ) ) + ->from( 'ezcobj_state_link' ) + ->where( 'contentobject_state_id = 2' ); + + $statement = $query->prepare(); + $statement->execute(); + + $this->assertEquals( + // The number of objects in the fixtures + 185, + $statement->fetchColumn() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::deleteObjectStateLinks + * + * @return void + */ + public function testDeleteObjectStateLinks() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->deleteObjectStateLinks( 1 ); + + $query = $this->getDatabaseHandler()->createSelectQuery(); + $query + ->select( $query->expr->count( '*' ) ) + ->from( 'ezcobj_state_link' ) + ->where( 'contentobject_state_id = 1' ); + + $statement = $query->prepare(); + $statement->execute(); + + $this->assertEquals( + 0, + $statement->fetchColumn() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::insertObjectStateGroup + * + * @return void + */ + public function testInsertObjectStateGroup() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->insertObjectStateGroup( $this->getObjectStateGroupFixture() ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_group_default_language_id' => 4, + // The new state group should be added with state group ID = 3 + 'ezcobj_state_group_id' => 3, + 'ezcobj_state_group_identifier' => 'test_group', + 'ezcobj_state_group_language_mask' => 5, + 'ezcobj_state_group_language_description' => 'Test group description', + 'ezcobj_state_group_language_language_id' => 5, + 'ezcobj_state_group_language_real_language_id' => 4, + 'ezcobj_state_group_language_name' => 'Test group' + ) + ), + // The new state group should be added with state group ID = 3 + $this->getDatabaseGateway()->loadObjectStateGroupData( 3 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::updateObjectStateGroup + * + * @return void + */ + public function testUpdateObjectStateGroup() + { + $gateway = $this->getDatabaseGateway(); + + $groupFixture = $this->getObjectStateGroupFixture(); + $groupFixture->id = 2; + + $gateway->updateObjectStateGroup( $groupFixture ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_group_default_language_id' => 4, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_group_identifier' => 'test_group', + 'ezcobj_state_group_language_mask' => 5, + 'ezcobj_state_group_language_description' => 'Test group description', + 'ezcobj_state_group_language_language_id' => 5, + 'ezcobj_state_group_language_real_language_id' => 4, + 'ezcobj_state_group_language_name' => 'Test group' + ) + ), + $this->getDatabaseGateway()->loadObjectStateGroupData( 2 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::deleteObjectStateGroup + * + * @return void + */ + public function testDeleteObjectStateGroup() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->deleteObjectStateGroup( 2 ); + + $this->assertEquals( + array(), + $this->getDatabaseGateway()->loadObjectStateGroupData( 2 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::setContentState + * + * @return void + */ + public function testSetContentState() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->setContentState( 42, 2, 2 ); + + $this->assertQueryResult( + array( + array( + 'contentobject_id' => 42, + 'contentobject_state_id' => 2 + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'contentobject_id', 'contentobject_state_id' ) + ->from( 'ezcobj_state_link' ) + ->where( 'contentobject_id = 42' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::loadObjectStateDataForContent + * + * @return void + */ + public function testLoadObjectStateDataForContent() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadObjectStateDataForContent( 42, 2 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'not_locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Not locked' + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::getContentCount + * + * @return void + */ + public function testGetContentCount() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->getContentCount( 1 ); + + // 185 is the number of objects in the fixture + $this->assertEquals( 185, $result ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase::updateObjectStatePriority + * + * @return void + */ + public function testUpdateObjectStatePriority() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->updateObjectStatePriority( 1, 10 ); + + $objectStateData = $gateway->loadObjectStateData( 1 ); + + $this->assertEquals( + array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'not_locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 10, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Not locked' + ) + ), + $objectStateData + ); + } + + /** + * Returns an object state fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + protected function getObjectStateFixture() + { + $objectState = new ObjectState(); + $objectState->identifier = 'test_state'; + $objectState->defaultLanguage = 'eng-GB'; + $objectState->languageCodes = array( 'eng-GB' ); + $objectState->name = array( 'eng-GB' => 'Test state' ); + $objectState->description = array( 'eng-GB' => 'Test state description' ); + + return $objectState; + } + + /** + * Returns an object state group fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + protected function getObjectStateGroupFixture() + { + $group = new Group(); + $group->identifier = 'test_group'; + $group->defaultLanguage = 'eng-GB'; + $group->languageCodes = array( 'eng-GB' ); + $group->name = array( 'eng-GB' => 'Test group' ); + $group->description = array( 'eng-GB' => 'Test group description' ); + + return $group; + } + + /** + * Returns a ready to test EzcDatabase gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway\EzcDatabase + */ + protected function getDatabaseGateway() + { + if ( !isset( $this->databaseGateway ) ) + { + $this->databaseGateway = new EzcDatabase( + $this->getDatabaseHandler(), + $this->getLanguageMaskGenerator() + ); + } + return $this->databaseGateway; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/MapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/MapperTest.php new file mode 100644 index 0000000..fa5c9f0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/MapperTest.php @@ -0,0 +1,275 @@ +getMapper(); + + $rows = $this->getObjectStateRowsFixture(); + + $result = $mapper->createObjectStateFromData( $rows ); + + $this->assertStructsEqual( + $this->getObjectStateFixture(), + $result, + array( 'identifier', 'defaultLanguage', 'languageCodes', 'name', 'description' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper::createObjectStateListFromData + * + * @return void + */ + public function testCreateObjectStateListFromData() + { + $mapper = $this->getMapper(); + + $rows = array( $this->getObjectStateRowsFixture() ); + + $result = $mapper->createObjectStateListFromData( $rows ); + + $this->assertStructsEqual( + $this->getObjectStateFixture(), + $result[0], + array( 'identifier', 'defaultLanguage', 'languageCodes', 'name', 'description' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper::createObjectStateGroupFromData + * + * @return void + */ + public function testCreateObjectStateGroupFromData() + { + $mapper = $this->getMapper(); + + $rows = $this->getObjectStateGroupRowsFixture(); + + $result = $mapper->createObjectStateGroupFromData( $rows ); + + $this->assertStructsEqual( + $this->getObjectStateGroupFixture(), + $result, + array( 'identifier', 'defaultLanguage', 'languageCodes', 'name', 'description' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper::createObjectStateGroupListFromData + * + * @return void + */ + public function testCreateObjectStateGroupListFromData() + { + $mapper = $this->getMapper(); + + $rows = array( $this->getObjectStateGroupRowsFixture() ); + + $result = $mapper->createObjectStateGroupListFromData( $rows ); + + $this->assertStructsEqual( + $this->getObjectStateGroupFixture(), + $result[0], + array( 'identifier', 'defaultLanguage', 'languageCodes', 'name', 'description' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper::createObjectStateFromInputStruct + * + * @return void + */ + public function testCreateObjectStateFromInputStruct() + { + $mapper = $this->getMapper(); + + $inputStruct = $this->getObjectStateInputStructFixture(); + + $result = $mapper->createObjectStateFromInputStruct( $inputStruct ); + + $this->assertStructsEqual( + $this->getObjectStateFixture(), + $result, + array( 'identifier', 'defaultLanguage', 'languageCodes', 'name', 'description' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper::createObjectStateGroupFromInputStruct + * + * @return void + */ + public function testCreateObjectStateGroupFromInputStruct() + { + $mapper = $this->getMapper(); + + $inputStruct = $this->getObjectStateGroupInputStructFixture(); + + $result = $mapper->createObjectStateGroupFromInputStruct( $inputStruct ); + + $this->assertStructsEqual( + $this->getObjectStateGroupFixture(), + $result, + array( 'identifier', 'defaultLanguage', 'languageCodes', 'name', 'description' ) + ); + } + + /** + * Returns a Mapper + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper + */ + protected function getMapper() + { + return new Mapper( + $this->getLanguageHandler() + ); + } + + /** + * Returns an object state result rows fixture + * + * @return array[][] + */ + protected function getObjectStateRowsFixture() + { + return array( + array( + 'ezcobj_state_default_language_id' => 2, + 'ezcobj_state_group_id' => 2, + 'ezcobj_state_id' => 1, + 'ezcobj_state_identifier' => 'not_locked', + 'ezcobj_state_language_mask' => 3, + 'ezcobj_state_priority' => 0, + 'ezcobj_state_language_description' => '', + 'ezcobj_state_language_language_id' => 3, + 'ezcobj_state_language_name' => 'Not locked' + ) + ); + } + + /** + * Returns an object state group result rows fixture + * + * @return array[][] + */ + protected function getObjectStateGroupRowsFixture() + { + return array( + array( + 'ezcobj_state_group_default_language_id' => 2, + 'ezcobj_state_group_id' => 1, + 'ezcobj_state_group_identifier' => 'ez_lock', + 'ezcobj_state_group_language_mask' => 3, + 'ezcobj_state_group_language_description' => '', + 'ezcobj_state_group_language_language_id' => 3, + 'ezcobj_state_group_language_real_language_id' => 2, + 'ezcobj_state_group_language_name' => 'Lock' + ) + ); + } + + /** + * Returns an object state fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + protected function getObjectStateFixture() + { + $objectState = new ObjectState(); + $objectState->identifier = 'not_locked'; + $objectState->defaultLanguage = 'eng-US'; + $objectState->languageCodes = array( 'eng-US' ); + $objectState->name = array( 'eng-US' => 'Not locked' ); + $objectState->description = array( 'eng-US' => '' ); + + return $objectState; + } + + /** + * Returns an object state group fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + protected function getObjectStateGroupFixture() + { + $group = new Group(); + $group->identifier = 'ez_lock'; + $group->defaultLanguage = 'eng-US'; + $group->languageCodes = array( 'eng-US' ); + $group->name = array( 'eng-US' => 'Lock' ); + $group->description = array( 'eng-US' => '' ); + + return $group; + } + + /** + * Returns the InputStruct fixture for creating object states + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function getObjectStateInputStructFixture() + { + $inputStruct = new InputStruct(); + + $inputStruct->defaultLanguage = 'eng-US'; + $inputStruct->identifier = 'not_locked'; + $inputStruct->name = array( 'eng-US' => 'Not locked' ); + $inputStruct->description = array( 'eng-US' => '' ); + + return $inputStruct; + } + + /** + * Returns the InputStruct fixture for creating object state groups + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function getObjectStateGroupInputStructFixture() + { + $inputStruct = new InputStruct(); + + $inputStruct->defaultLanguage = 'eng-US'; + $inputStruct->identifier = 'ez_lock'; + $inputStruct->name = array( 'eng-US' => 'Lock' ); + $inputStruct->description = array( 'eng-US' => '' ); + + return $inputStruct; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/ObjectStateHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/ObjectStateHandlerTest.php new file mode 100644 index 0000000..53b653b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/ObjectState/ObjectStateHandlerTest.php @@ -0,0 +1,761 @@ +getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateGroupFromInputStruct' ) + ->with( $this->equalTo( $this->getInputStructFixture() ) ) + ->will( $this->returnValue( $this->getObjectStateGroupFixture() ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertObjectStateGroup' ) + ->with( $this->equalTo( $this->getObjectStateGroupFixture() ) ) + ->will( $this->returnValue( $this->getObjectStateGroupFixture() ) ); + + $result = $handler->createGroup( $this->getInputStructFixture() ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadGroup + * + * @return void + */ + public function testLoadGroup() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateGroupData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateGroupFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateGroupFixture() ) ); + + $result = $handler->loadGroup( 2 ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadGroupThrowsNotFoundException() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateGroupData' ) + ->with( $this->equalTo( PHP_INT_MAX ) ) + ->will( $this->returnValue( array() ) ); + + $handler->loadGroup( PHP_INT_MAX ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadGroupByIdentifier + * + * @return void + */ + public function testLoadGroupByIdentifier() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateGroupDataByIdentifier' ) + ->with( $this->equalTo( 'ez_lock' ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateGroupFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateGroupFixture() ) ); + + $result = $handler->loadGroupByIdentifier( 'ez_lock' ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadGroupByIdentifier + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadGroupByIdentifierThrowsNotFoundException() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateGroupDataByIdentifier' ) + ->with( $this->equalTo( 'unknown' ) ) + ->will( $this->returnValue( array() ) ); + + $handler->loadGroupByIdentifier( 'unknown' ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadAllGroups + * + * @return void + */ + public function testLoadAllGroups() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateGroupListData' ) + ->with( $this->equalTo( 0 ), $this->equalTo( -1 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateGroupListFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( array( $this->getObjectStateGroupFixture() ) ) ); + + $result = $handler->loadAllGroups(); + + foreach ( $result as $resultItem ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', + $resultItem + ); + } + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadObjectStates + * + * @return void + */ + public function testLoadObjectStates() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateListData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateListFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( array( $this->getObjectStateFixture(), $this->getObjectStateFixture() ) ) ); + + $result = $handler->loadObjectStates( 2 ); + + foreach ( $result as $resultItem ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', + $resultItem + ); + } + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::updateGroup + * + * @return void + */ + public function testUpdateGroup() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateGroupFromInputStruct' ) + ->with( $this->equalTo( $this->getInputStructFixture() ) ) + ->will( $this->returnValue( $this->getObjectStateGroupFixture() ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateObjectStateGroup' ) + ->with( $this->equalTo( new Group( array( 'id' => 2 ) ) ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateGroupData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateGroupFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateGroupFixture() ) ); + + $result = $handler->updateGroup( 2, $this->getInputStructFixture() ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState\\Group', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::deleteGroup + * + * @return void + */ + public function testDeleteGroup() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateListData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateListFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( + $this->returnValue( + array( + new ObjectState( array( 'id' => 1 ) ), + new ObjectState( array( 'id' => 2 ) ) + ) + ) + ); + + $gatewayMock->expects( $this->exactly( 2 ) ) + ->method( 'deleteObjectStateLinks' ); + + $gatewayMock->expects( $this->exactly( 2 ) ) + ->method( 'deleteObjectState' ); + + $gatewayMock->expects( $this->at( 1 ) ) + ->method( 'deleteObjectStateLinks' ) + ->with( $this->equalTo( 1 ) ); + + $gatewayMock->expects( $this->at( 2 ) ) + ->method( 'deleteObjectState' ) + ->with( $this->equalTo( 1 ) ); + + $gatewayMock->expects( $this->at( 3 ) ) + ->method( 'deleteObjectStateLinks' ) + ->with( $this->equalTo( 2 ) ); + + $gatewayMock->expects( $this->at( 4 ) ) + ->method( 'deleteObjectState' ) + ->with( $this->equalTo( 2 ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'deleteObjectStateGroup' ) + ->with( $this->equalTo( 2 ) ); + + $handler->deleteGroup( 2 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::create + * + * @return void + */ + public function testCreate() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromInputStruct' ) + ->with( $this->equalTo( $this->getInputStructFixture() ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertObjectState' ) + ->with( $this->equalTo( $this->getObjectStateFixture() ), $this->equalTo( 2 ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $result = $handler->create( 2, $this->getInputStructFixture() ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::load + * + * @return void + */ + public function testLoad() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateData' ) + ->with( $this->equalTo( 1 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $result = $handler->load( 1 ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadThrowsNotFoundException() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateData' ) + ->with( $this->equalTo( PHP_INT_MAX ) ) + ->will( $this->returnValue( array() ) ); + + $handler->load( PHP_INT_MAX ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadByIdentifier + * + * @return void + */ + public function testLoadByIdentifier() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateDataByIdentifier' ) + ->with( $this->equalTo( 'not_locked' ), $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $result = $handler->loadByIdentifier( 'not_locked', 2 ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', + $result + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::loadByIdentifier + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadByIdentifierThrowsNotFoundException() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateDataByIdentifier' ) + ->with( $this->equalTo( 'unknown' ), $this->equalTo( 2 ) ) + ->will( $this->returnValue( array() ) ); + + $handler->loadByIdentifier( 'unknown', 2 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::update + * + * @return void + */ + public function testUpdate() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromInputStruct' ) + ->with( $this->equalTo( $this->getInputStructFixture() ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateObjectState' ) + ->with( $this->equalTo( new ObjectState( array( 'id' => 1 ) ) ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateData' ) + ->with( $this->equalTo( 1 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $result = $handler->update( 1, $this->getInputStructFixture() ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::setPriority + * + * @return void + */ + public function testSetPriority() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( new ObjectState( array( 'id' => 2, 'groupId' => 2 ) ) ) ); + + $gatewayMock->expects( $this->any() ) + ->method( 'loadObjectStateListData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->any() ) + ->method( 'createObjectStateListFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( + $this->returnValue( + array( + new ObjectState( array( 'id' => 1, 'groupId' => 2 ) ), + new ObjectState( array( 'id' => 2, 'groupId' => 2 ) ) + ) + ) + ); + + $gatewayMock->expects( $this->exactly( 2 ) ) + ->method( 'updateObjectStatePriority' ); + + $gatewayMock->expects( $this->at( 2 ) ) + ->method( 'updateObjectStatePriority' ) + ->with( $this->equalTo( 2 ), $this->equalTo( 0 ) ); + + $gatewayMock->expects( $this->at( 3 ) ) + ->method( 'updateObjectStatePriority' ) + ->with( $this->equalTo( 1 ), $this->equalTo( 1 ) ); + + $handler->setPriority( 2, 0 ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::delete + * + * @return void + */ + public function testDelete() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateData' ) + ->with( $this->equalTo( 1 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( new ObjectState( array( 'id' => 1, 'groupId' => 2 ) ) ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'deleteObjectState' ) + ->with( $this->equalTo( 1 ) ); + + $gatewayMock->expects( $this->any() ) + ->method( 'loadObjectStateListData' ) + ->with( $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->any() ) + ->method( 'createObjectStateListFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( array( new ObjectState( array( 'id' => 2, 'groupId' => 2 ) ) ) ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateObjectStatePriority' ) + ->with( $this->equalTo( 2 ), $this->equalTo( 0 ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateObjectStateLinks' ) + ->with( $this->equalTo( 1 ), $this->equalTo( 2 ) ); + + $handler->delete( 1 ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::delete + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteThrowsNotFoundException() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateData' ) + ->with( $this->equalTo( PHP_INT_MAX ) ) + ->will( $this->returnValue( array() ) ); + + $handler->delete( PHP_INT_MAX ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::setContentState + * + * @return void + */ + public function testSetContentState() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'setContentState' ) + ->with( $this->equalTo( 42 ), $this->equalTo( 2 ), $this->equalTo( 2 ) ); + + $result = $handler->setContentState( 42, 2, 2 ); + + $this->assertEquals( true, $result ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::getContentState + * + * @return void + */ + public function testGetContentState() + { + $handler = $this->getObjectStateHandler(); + $mapperMock = $this->getMapperMock(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadObjectStateDataForContent' ) + ->with( $this->equalTo( 42 ), $this->equalTo( 2 ) ) + ->will( $this->returnValue( array( array() ) ) ); + + $mapperMock->expects( $this->once() ) + ->method( 'createObjectStateFromData' ) + ->with( $this->equalTo( array( array() ) ) ) + ->will( $this->returnValue( $this->getObjectStateFixture() ) ); + + $result = $handler->getContentState( 42, 2 ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\ObjectState', + $result + ); + } + + /** + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler::getContentCount + * + * @return void + */ + public function testGetContentCount() + { + $handler = $this->getObjectStateHandler(); + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'getContentCount' ) + ->with( $this->equalTo( 1 ) ) + ->will( $this->returnValue( 185 ) ); + + $result = $handler->getContentCount( 1 ); + + $this->assertEquals( 185, $result ); + } + + /** + * Returns an object state + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + protected function getObjectStateFixture() + { + return new ObjectState(); + } + + /** + * Returns an object state group + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + protected function getObjectStateGroupFixture() + { + return new Group(); + } + + /** + * Returns the InputStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function getInputStructFixture() + { + return new InputStruct(); + } + + /** + * Returns the object state handler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Handler + */ + protected function getObjectStateHandler() + { + if ( !isset( $this->objectStateHandler ) ) + { + $this->objectStateHandler = new Handler( + $this->getGatewayMock(), + $this->getMapperMock() + ); + } + return $this->objectStateHandler; + } + + /** + * Returns an object state mapper mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Mapper + */ + protected function getMapperMock() + { + if ( !isset( $this->mapperMock ) ) + { + $this->mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\ObjectState\\Mapper', + array(), + array( $this->getLanguageHandler() ) + ); + } + return $this->mapperMock; + } + + /** + * Returns a mock for the object state gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\ObjectState\Gateway + */ + protected function getGatewayMock() + { + if ( !isset( $this->gatewayMock ) ) + { + $this->gatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\ObjectState\\Gateway' + ); + } + return $this->gatewayMock; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorDefinitionBasedParserTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorDefinitionBasedParserTest.php new file mode 100644 index 0000000..1b7d002 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorDefinitionBasedParserTest.php @@ -0,0 +1,45 @@ +assertEquals( + $fixture, + $parser->parse( str_replace( self::getInstallationDir(), '', $file ) ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorDefinitionBasedTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorDefinitionBasedTest.php new file mode 100644 index 0000000..58a1407 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorDefinitionBasedTest.php @@ -0,0 +1,71 @@ +getProcessor(); + + $this->assertSame( + 'hello world!', + $processor->transform( 'Hello World!', array( 'ascii_lowercase' ) ) + ); + } + + public function testSimpleNormalizationUppercase() + { + $processor = $this->getProcessor(); + + $this->assertSame( + 'HELLO WORLD!', + $processor->transform( 'Hello World!', array( 'ascii_uppercase' ) ) + ); + } + + /** + * The main point of this test is, that it shows that all normalizations + * available can be compiled without errors. The actual expectation is not + * important. + */ + public function testAllNormalizations() + { + $processor = $this->getProcessor(); + + $this->assertSame( + 'HELLO WORLD.', + $processor->transform( 'Hello World!' ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorPcreCompilerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorPcreCompilerTest.php new file mode 100644 index 0000000..31b0919 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorPcreCompilerTest.php @@ -0,0 +1,221 @@ +compile( + $parser->parseString( + "map_test:\n" . + "U+00e4 = \"ae\"" + ) + ); + + $this->assertSame( + 'aeöü', + $this->applyTransformations( $rules, 'äöü' ) + ); + } + + public function testCompileMapRemove() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "map_test:\n" . + "U+00e4 = remove" + ) + ); + + $this->assertSame( + 'öü', + $this->applyTransformations( $rules, 'äöü' ) + ); + } + + public function testCompileMapKeep() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "map_test:\n" . + "U+00e4 = keep" + ) + ); + + $this->assertSame( + 'äöü', + $this->applyTransformations( $rules, 'äöü' ) + ); + } + + public function testCompileMapAscii() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "map_test:\n" . + "U+00e4 = 41" + ) + ); + + $this->assertSame( + 'Aöü', + $this->applyTransformations( $rules, 'äöü' ) + ); + } + + public function testCompileMapUnicode() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "map_test:\n" . + "U+00e4 = U+00e5" + ) + ); + + $this->assertSame( + 'åöü', + $this->applyTransformations( $rules, 'äöü' ) + ); + } + + public function testCompileReplace() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "replace_test:\n" . + "U+00e0 - U+00e6 = \"a\"" + ) + ); + + $this->assertSame( + 'aaaaaaaçè', + $this->applyTransformations( $rules, 'àáâãäåæçè' ) + ); + } + + public function testCompileTranspose() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "transpose_test:\n" . + "U+00e0 - U+00e6 - 02" + ) + ); + + $this->assertSame( + 'Þßàáâãäçè', + $this->applyTransformations( $rules, 'àáâãäåæçè' ) + ); + } + + public function testCompileTransposeAsciiLowercase() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "ascii_lowercase:\n" . + "U+0041 - U+005A + 20" + ) + ); + + $this->assertSame( + 'hello world', + $this->applyTransformations( $rules, 'Hello World' ) + ); + } + + public function testCompileTransposePlus() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "transpose_test:\n" . + "U+00e0 - U+00e6 + 02" + ) + ); + + $this->assertSame( + 'âãäåæçèçè', + $this->applyTransformations( $rules, 'àáâãäåæçè' ) + ); + } + + public function testCompileModuloTranspose() + { + $parser = new Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ); + $compiler = new Search\TransformationProcessor\PcreCompiler( new Search\Utf8Converter() ); + + $rules = $compiler->compile( + $parser->parseString( + "transpose_modulo_test:\n" . + "U+00e0 - U+00e6 % 02 - 01" + ) + ); + + $this->assertSame( + 'ßááããååçè', + $this->applyTransformations( $rules, 'àáâãäåæçè' ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorPreprocessedBasedTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorPreprocessedBasedTest.php new file mode 100644 index 0000000..5905f91 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/TransformationProcessorPreprocessedBasedTest.php @@ -0,0 +1,72 @@ +getProcessor(); + + $this->assertSame( + 'hello world!', + $processor->transform( 'Hello World!', array( 'ascii_lowercase' ) ) + ); + } + + public function testSimpleNormalizationUppercase() + { + $processor = $this->getProcessor(); + + $this->assertSame( + 'HELLO WORLD!', + $processor->transform( 'Hello World!', array( 'ascii_uppercase' ) ) + ); + } + + /** + * The main point of this test is, that it shows that all normalizations + * available can be compiled without errors. The actual expectation is not + * important. + */ + public function testAllNormalizations() + { + $processor = $this->getProcessor(); + + $this->assertSame( + 'HELLO WORLD.', + $processor->transform( 'Hello World!' ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/full_dump.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/full_dump.php new file mode 100644 index 0000000..83459f5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/full_dump.php @@ -0,0 +1,261608 @@ + + array ( + 0 => + array ( + 'disabled' => '0', + 'id' => '2', + 'locale' => 'eng-US', + 'name' => 'English (American)', + ), + 1 => + array ( + 'disabled' => '0', + 'id' => '4', + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)', + ), + ), + 'ezcontentclass' => + array ( + 0 => + array ( + 'always_available' => '1', + 'contentobject_name' => '', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '1', + 'identifier' => 'folder', + 'initial_language_id' => '2', + 'is_container' => '1', + 'language_mask' => '3', + 'modified' => '1082454875', + 'modifier_id' => '14', + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 1 => + array ( + 'always_available' => '1', + 'contentobject_name' => '', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '3', + 'identifier' => 'user_group', + 'initial_language_id' => '2', + 'is_container' => '1', + 'language_mask' => '3', + 'modified' => '1048494743', + 'modifier_id' => '14', + 'remote_id' => '25b4268cdcd01921b808a0d854b877ef', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"User group";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 2 => + array ( + 'always_available' => '1', + 'contentobject_name' => ' ', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '4', + 'identifier' => 'user', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1082018364', + 'modifier_id' => '14', + 'remote_id' => '40faa822edc579b02c25f6bb7beec3ad', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"User";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 3 => + array ( + 'always_available' => '0', + 'contentobject_name' => '', + 'created' => '1052385685', + 'creator_id' => '14', + 'id' => '13', + 'identifier' => 'comment', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1082455144', + 'modifier_id' => '14', + 'remote_id' => '000c14f4f475e9f2955dedab72799941', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Comment";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 4 => + array ( + 'always_available' => '1', + 'contentobject_name' => '', + 'created' => '1081858024', + 'creator_id' => '14', + 'id' => '14', + 'identifier' => 'common_ini_settings', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1081858024', + 'modifier_id' => '14', + 'remote_id' => 'ffedf2e73b1ea0c3e630e42e2db9c900', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:19:"Common ini settings";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 5 => + array ( + 'always_available' => '1', + 'contentobject_name' => '', + 'created' => '1081858045', + 'creator_id' => '14', + 'id' => '15', + 'identifier' => 'template_look', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1081858045', + 'modifier_id' => '14', + 'remote_id' => '59b43cd9feaaf0e45ac974fb4bbd3f92', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Template look";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 6 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1311154170', + 'creator_id' => '14', + 'id' => '16', + 'identifier' => 'article', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154170', + 'modifier_id' => '14', + 'remote_id' => 'c15b600eb9198b1924063b5a68758232', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Article";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 7 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1311154170', + 'creator_id' => '14', + 'id' => '17', + 'identifier' => 'article_mainpage', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154170', + 'modifier_id' => '14', + 'remote_id' => 'feaf24c0edae665e7ddaae1bc2b3fe5b', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:19:"Article (main-page)";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 8 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title|index_title>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '18', + 'identifier' => 'article_subpage', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '68f305a18c76d9d03df36b810f290732', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Article (sub-page)";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 9 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '19', + 'identifier' => 'blog', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '3a6f9c1f075b3bf49d7345576b196fe8', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Blog";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 10 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '20', + 'identifier' => 'blog_post', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '7ecb961056b7cbb30f22a91357e0a007', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Blog post";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 11 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '21', + 'identifier' => 'product', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '77f3ede996a3a39c7159cc69189c5307', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Product";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 12 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '22', + 'identifier' => 'feedback_form', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => 'df0257b8fc55f6b8ab179d6fb915455e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Feedback form";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 13 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '23', + 'identifier' => 'frontpage', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => 'e36c458e3e4a81298a0945f53a2c81f4', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Frontpage";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 14 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '24', + 'identifier' => 'documentation_page', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => 'd4a05eed0402e4d70fedfda2023f1aa2', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Documentation page";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 15 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<header>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '25', + 'identifier' => 'infobox', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '0b4e8accad5bec5ba2d430acb25c1ff6', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Infobox";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 16 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '26', + 'identifier' => 'multicalendar', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '99aec4e5682414517ed929ecd969439f', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Multicalendar";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 17 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '27', + 'identifier' => 'poll', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '232937a3a2eacbbf24e2601aebe16522', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Poll";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 18 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '28', + 'identifier' => 'file', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '637d58bfddf164627bdfd265733280a0', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 19 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '29', + 'identifier' => 'flash', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '6cd17b98a41ee9355371a376e8868ee0', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Flash";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 20 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '30', + 'identifier' => 'image', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => 'f6df12aa74e36230eb675f364fccd25a', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 21 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '31', + 'identifier' => 'link', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '74ec6507063150bc813549b22534ad48', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Link";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 22 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '32', + 'identifier' => 'quicktime', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '16d7b371979d6ba37894cc8dc306f38f', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Quicktime";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 23 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '33', + 'identifier' => 'windows_media', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '223dd2551e85b63b55a72d02363faab6', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Windows media";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 24 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '34', + 'identifier' => 'real_video', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => 'dba67bc20a4301aa04cc74e411310dfc', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Real video";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 25 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154171', + 'creator_id' => '14', + 'id' => '35', + 'identifier' => 'gallery', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154171', + 'modifier_id' => '14', + 'remote_id' => '6a320cdc3e274841b82fcd63a86f80d1', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Gallery";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 26 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '36', + 'identifier' => 'geo_article', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => 'a98ae5ac95365b958b01fb88dfab3330', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Geo Article";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 27 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '37', + 'identifier' => 'forum', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => 'b241f924b96b267153f5f55904e0675a', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Forum";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 28 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '38', + 'identifier' => 'forum_topic', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '71f99c516743a33562c3893ef98c9b60', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Forum topic";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 29 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '39', + 'identifier' => 'forum_reply', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '80ee42a66b2b8b6ee15f5c5f4b361562', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Forum reply";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 30 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '40', + 'identifier' => 'event', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '563cb5edc2adfd2b240efa456c81525f', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Event";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 31 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '41', + 'identifier' => 'event_calendar', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '020cbeb6382c8c89dcec2cd406fb47a8', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Event calendar";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 32 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '42', + 'identifier' => 'banner', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '9cb558e25fd946246bbb32950c00228e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Banner";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 33 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '43', + 'identifier' => 'forums', + 'initial_language_id' => '4', + 'is_container' => '1', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '60a921e54c1efbb9456bd2283d9e66cb', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Forums";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 34 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1311154172', + 'creator_id' => '14', + 'id' => '44', + 'identifier' => 'silverlight', + 'initial_language_id' => '4', + 'is_container' => '0', + 'language_mask' => '5', + 'modified' => '1311154172', + 'modifier_id' => '14', + 'remote_id' => '8ab17aae77dd4f24b5a8e835784e96e7', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Silverlight";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + ), + 'ezcontentclass_attribute' => + array ( + 0 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'Folder', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '4', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 1 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '3', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '6', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 2 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '3', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => '0', + ), + 3 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'identifier' => 'first_name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"First name";}', + 'version' => '0', + ), + 4 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '9', + 'identifier' => 'last_name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Last name";}', + 'version' => '0', + ), + 5 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezuser', + 'id' => '12', + 'identifier' => 'user_account', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"User account";}', + 'version' => '0', + ), + 6 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '119', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Summary";}', + 'version' => '0', + ), + 7 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '100', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '149', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Subject";}', + 'version' => '0', + ), + 8 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '150', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Author";}', + 'version' => '0', + ), + 9 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '151', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Message";}', + 'version' => '0', + ), + 10 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '100', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '155', + 'identifier' => 'short_name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Short name";}', + 'version' => '0', + ), + 11 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '156', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => '0', + ), + 12 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '1', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '158', + 'identifier' => 'show_children', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Display sub items";}', + 'version' => '0', + ), + 13 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '159', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 14 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'IndexPage', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'identifier' => 'indexpage', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Index Page";}', + 'version' => '0', + ), + 15 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'DefaultPage', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'identifier' => 'defaultpage', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Default Page";}', + 'version' => '0', + ), + 16 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugOutput', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'identifier' => 'debugoutput', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Debug Output";}', + 'version' => '0', + ), + 17 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugByIP', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'identifier' => 'debugbyip', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Debug By IP";}', + 'version' => '0', + ), + 18 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugIPList', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'identifier' => 'debugiplist', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Debug IP List";}', + 'version' => '0', + ), + 19 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugRedirection', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'identifier' => 'debugredirection', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Debug Redirection";}', + 'version' => '0', + ), + 20 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'ContentSettings', + 'data_text3' => 'ViewCaching', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'identifier' => 'viewcaching', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '8', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"View Caching";}', + 'version' => '0', + ), + 21 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'TemplateSettings', + 'data_text3' => 'TemplateCache', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'identifier' => 'templatecache', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:14:"Template Cache";}', + 'version' => '0', + ), + 22 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'TemplateSettings', + 'data_text3' => 'TemplateCompile', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'identifier' => 'templatecompile', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '10', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Template Compile";}', + 'version' => '0', + ), + 23 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'small', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'identifier' => 'imagesmall', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '11', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Image Small Size";}', + 'version' => '0', + ), + 24 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'medium', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'identifier' => 'imagemedium', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Image Medium Size";}', + 'version' => '0', + ), + 25 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'large', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'identifier' => 'imagelarge', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '13', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Image Large Size";}', + 'version' => '0', + ), + 26 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'SiteName', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '172', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Title";}', + 'version' => '0', + ), + 27 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'MetaDataArray', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '173', + 'identifier' => 'meta_data', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Meta data";}', + 'version' => '0', + ), + 28 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '174', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Image";}', + 'version' => '0', + ), + 29 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'sitestyle', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpackage', + 'id' => '175', + 'identifier' => 'sitestyle', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Sitestyle";}', + 'version' => '0', + ), + 30 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'MailSettings', + 'data_text3' => 'AdminEmail', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '177', + 'identifier' => 'email', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Email";}', + 'version' => '0', + ), + 31 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'SiteURL', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '178', + 'identifier' => 'siteurl', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:8:"Site URL";}', + 'version' => '0', + ), + 32 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '179', + 'identifier' => 'signature', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Signature";}', + 'version' => '0', + ), + 33 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Image";}', + 'version' => '0', + ), + 34 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '181', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Tags";}', + 'version' => '0', + ), + 35 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '182', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Publish date";}', + 'version' => '0', + ), + 36 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New article', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '183', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 37 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '184', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 38 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '185', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 39 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '186', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 40 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '187', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 41 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '188', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 42 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '189', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 43 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '190', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 44 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '191', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 45 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '192', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 46 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '193', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 47 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '194', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 48 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '195', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 49 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '196', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 50 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '197', + 'identifier' => 'index_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Index title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 51 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '198', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 52 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '199', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 53 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '15', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '200', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 54 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '201', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 55 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '202', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 56 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '203', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 57 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '204', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 58 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '205', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 59 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '206', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 60 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '207', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 61 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '208', + 'identifier' => 'index_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Index title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 62 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '15', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '209', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 63 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '210', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 64 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '211', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 65 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '212', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 66 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '213', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 67 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '214', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 68 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '25', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '215', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 69 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '216', + 'identifier' => 'publication_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:16:"Publication date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 70 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '217', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 71 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '218', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 72 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '219', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 73 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '220', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 74 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '221', + 'identifier' => 'product_number', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Product number";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 75 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '222', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Short description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 76 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '223', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 77 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '1', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezprice', + 'id' => '224', + 'identifier' => 'price', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Price";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 78 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '225', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 79 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '226', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 80 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmultioption', + 'id' => '227', + 'identifier' => 'additional_options', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Additional options";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 81 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '228', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 82 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '229', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 83 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '230', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 84 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '231', + 'identifier' => 'sender_name', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Sender name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 85 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '232', + 'identifier' => 'subject', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 86 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '233', + 'identifier' => 'message', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 87 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezemail', + 'id' => '234', + 'identifier' => 'email', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Email";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 88 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezemail', + 'id' => '235', + 'identifier' => 'recipient', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Recipient";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 89 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '236', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 90 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '237', + 'identifier' => 'billboard', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Billboard";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 91 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '238', + 'identifier' => 'left_column', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Left column";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 92 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '239', + 'identifier' => 'center_column', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Center column";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 93 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '240', + 'identifier' => 'right_column', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Right column";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 94 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '241', + 'identifier' => 'bottom_column', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Bottom column";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 95 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '242', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 96 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '243', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 97 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '244', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 98 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '245', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 99 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '246', + 'identifier' => 'show_children', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Display sub items";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 100 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '247', + 'identifier' => 'header', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Header";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 101 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '248', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 102 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '249', + 'identifier' => 'image_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"URL (image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 103 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '250', + 'identifier' => 'content', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Content";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 104 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '251', + 'identifier' => 'url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:3:"URL";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 105 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '252', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 106 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '253', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 107 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '<?xml version="1.0" encoding="utf-8"?> +<related-objects><constraints><allowed-class contentclass-identifier="event_calendar"/></constraints><type value="2"/><selection_type value="0"/><object_class value=""/><contentobject-placement/></related-objects> +', + 'data_type_string' => 'ezobjectrelationlist', + 'id' => '254', + 'identifier' => 'calendars', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Calendars";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 108 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '255', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 109 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '256', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 110 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezoption', + 'id' => '257', + 'identifier' => 'question', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Question";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 111 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New file', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '258', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 112 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '259', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 113 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezbinaryfile', + 'id' => '260', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 114 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '261', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 115 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '262', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 116 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '263', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 117 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'flash', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '264', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 118 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '265', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 119 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '150', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '266', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 120 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '267', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Caption";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 121 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '268', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 122 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '269', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 123 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '270', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 124 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '271', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 125 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '272', + 'identifier' => 'location', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Location";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 126 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '1', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '273', + 'identifier' => 'open_in_new_window', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Open in new window";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 127 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '274', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 128 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '275', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 129 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'quick_time', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '276', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 130 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '277', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 131 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '278', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 132 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '279', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 133 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'windows_media_player', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '280', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 134 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '281', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 135 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '282', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 136 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '283', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 137 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'real_player', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '284', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 138 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '285', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 139 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '286', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 140 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '287', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Short description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 141 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '288', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 142 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '289', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 143 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New article', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '290', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 144 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '291', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 145 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '292', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 146 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '293', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 147 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '294', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 148 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '295', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 149 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '296', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 150 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '297', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 151 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '298', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 152 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '299', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 153 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '300', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 154 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezgmaplocation', + 'id' => '301', + 'identifier' => 'location', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Location";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 155 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '37', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '302', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 156 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '37', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '303', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 157 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '304', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 158 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '305', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 159 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '306', + 'identifier' => 'sticky', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Sticky";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 160 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '307', + 'identifier' => 'notify_me', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:23:"Notify me about updates";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 161 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '308', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 162 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '309', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 163 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '55', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '310', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Full title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 164 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '19', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '311', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 165 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '312', + 'identifier' => 'text', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Text";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 166 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '313', + 'identifier' => 'category', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Category";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 167 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '314', + 'identifier' => 'from_time', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"From Time";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 168 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '315', + 'identifier' => 'to_time', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"To Time";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 169 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '65', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '316', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Full Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 170 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '25', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '317', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 171 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '<?xml version="1.0" encoding="utf-8"?> +<ezselection><options><option id="0" name="Calendar"/><option id="1" name="Program"/></options></ezselection> +', + 'data_type_string' => 'ezselection', + 'id' => '318', + 'identifier' => 'view', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"View";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 172 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '319', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 173 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '320', + 'identifier' => 'url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:3:"URL";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 174 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '321', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 175 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '322', + 'identifier' => 'image_map', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Image map";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 176 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '323', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 177 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '324', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 178 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '325', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 179 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '44', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '326', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 180 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '44', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '327', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 181 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '44', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'silverlight', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '328', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 182 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '329', + 'identifier' => 'site_map_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '8', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:12:"Site map URL";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 183 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '330', + 'identifier' => 'tag_cloud_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:13:"Tag Cloud URL";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 184 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '331', + 'identifier' => 'login_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '10', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:13:"Login (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 185 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '332', + 'identifier' => 'logout_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '11', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:14:"Logout (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 186 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '333', + 'identifier' => 'my_profile_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:18:"My profile (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 187 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '334', + 'identifier' => 'register_user_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '13', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:25:"Register new user (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 188 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '335', + 'identifier' => 'rss_feed', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '14', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:8:"RSS feed";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 189 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '336', + 'identifier' => 'shopping_basket_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '15', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:23:"Shopping basket (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 190 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '337', + 'identifier' => 'site_settings_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '16', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:21:"Site settings (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 191 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '338', + 'identifier' => 'footer_text', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '17', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:11:"Footer text";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 192 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '339', + 'identifier' => 'hide_powered_by', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '18', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:17:"Hide "Powered by"";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 193 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '340', + 'identifier' => 'footer_script', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '19', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:17:"Footer Javascript";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + ), + 'ezcontentclass_classgroup' => + array ( + 0 => + array ( + 'contentclass_id' => '1', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 1 => + array ( + 'contentclass_id' => '3', + 'contentclass_version' => '0', + 'group_id' => '2', + 'group_name' => 'Users', + ), + 2 => + array ( + 'contentclass_id' => '4', + 'contentclass_version' => '0', + 'group_id' => '2', + 'group_name' => 'Users', + ), + 3 => + array ( + 'contentclass_id' => '13', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 4 => + array ( + 'contentclass_id' => '14', + 'contentclass_version' => '0', + 'group_id' => '4', + 'group_name' => 'Setup', + ), + 5 => + array ( + 'contentclass_id' => '15', + 'contentclass_version' => '0', + 'group_id' => '4', + 'group_name' => 'Setup', + ), + 6 => + array ( + 'contentclass_id' => '16', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 7 => + array ( + 'contentclass_id' => '17', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 8 => + array ( + 'contentclass_id' => '18', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 9 => + array ( + 'contentclass_id' => '19', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 10 => + array ( + 'contentclass_id' => '20', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 11 => + array ( + 'contentclass_id' => '21', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 12 => + array ( + 'contentclass_id' => '22', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 13 => + array ( + 'contentclass_id' => '23', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 14 => + array ( + 'contentclass_id' => '24', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 15 => + array ( + 'contentclass_id' => '25', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 16 => + array ( + 'contentclass_id' => '26', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 17 => + array ( + 'contentclass_id' => '27', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 18 => + array ( + 'contentclass_id' => '28', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 19 => + array ( + 'contentclass_id' => '29', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 20 => + array ( + 'contentclass_id' => '30', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 21 => + array ( + 'contentclass_id' => '31', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 22 => + array ( + 'contentclass_id' => '32', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 23 => + array ( + 'contentclass_id' => '33', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 24 => + array ( + 'contentclass_id' => '34', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 25 => + array ( + 'contentclass_id' => '35', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 26 => + array ( + 'contentclass_id' => '36', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 27 => + array ( + 'contentclass_id' => '37', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 28 => + array ( + 'contentclass_id' => '38', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 29 => + array ( + 'contentclass_id' => '39', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 30 => + array ( + 'contentclass_id' => '40', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 31 => + array ( + 'contentclass_id' => '41', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 32 => + array ( + 'contentclass_id' => '42', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 33 => + array ( + 'contentclass_id' => '43', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 34 => + array ( + 'contentclass_id' => '44', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + ), + 'ezcontentclass_name' => + array ( + 0 => + array ( + 'contentclass_id' => '1', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Folder', + ), + 1 => + array ( + 'contentclass_id' => '3', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'User group', + ), + 2 => + array ( + 'contentclass_id' => '4', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'User', + ), + 3 => + array ( + 'contentclass_id' => '13', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Comment', + ), + 4 => + array ( + 'contentclass_id' => '14', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Common ini settings', + ), + 5 => + array ( + 'contentclass_id' => '15', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Template look', + ), + 6 => + array ( + 'contentclass_id' => '16', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Article', + ), + 7 => + array ( + 'contentclass_id' => '17', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Article (main-page)', + ), + 8 => + array ( + 'contentclass_id' => '18', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Article (sub-page)', + ), + 9 => + array ( + 'contentclass_id' => '19', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Blog', + ), + 10 => + array ( + 'contentclass_id' => '20', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Blog post', + ), + 11 => + array ( + 'contentclass_id' => '21', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Product', + ), + 12 => + array ( + 'contentclass_id' => '22', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Feedback form', + ), + 13 => + array ( + 'contentclass_id' => '23', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Frontpage', + ), + 14 => + array ( + 'contentclass_id' => '24', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Documentation page', + ), + 15 => + array ( + 'contentclass_id' => '25', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Infobox', + ), + 16 => + array ( + 'contentclass_id' => '26', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Multicalendar', + ), + 17 => + array ( + 'contentclass_id' => '27', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Poll', + ), + 18 => + array ( + 'contentclass_id' => '28', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'File', + ), + 19 => + array ( + 'contentclass_id' => '29', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Flash', + ), + 20 => + array ( + 'contentclass_id' => '30', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Image', + ), + 21 => + array ( + 'contentclass_id' => '31', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Link', + ), + 22 => + array ( + 'contentclass_id' => '32', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Quicktime', + ), + 23 => + array ( + 'contentclass_id' => '33', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Windows media', + ), + 24 => + array ( + 'contentclass_id' => '34', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Real video', + ), + 25 => + array ( + 'contentclass_id' => '35', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Gallery', + ), + 26 => + array ( + 'contentclass_id' => '36', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Geo Article', + ), + 27 => + array ( + 'contentclass_id' => '37', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Forum', + ), + 28 => + array ( + 'contentclass_id' => '38', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Forum topic', + ), + 29 => + array ( + 'contentclass_id' => '39', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Forum reply', + ), + 30 => + array ( + 'contentclass_id' => '40', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Event', + ), + 31 => + array ( + 'contentclass_id' => '41', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Event calendar', + ), + 32 => + array ( + 'contentclass_id' => '42', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Banner', + ), + 33 => + array ( + 'contentclass_id' => '43', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Forums', + ), + 34 => + array ( + 'contentclass_id' => '44', + 'contentclass_version' => '0', + 'language_id' => '5', + 'language_locale' => 'eng-GB', + 'name' => 'Silverlight', + ), + ), + 'ezcontentclassgroup' => + array ( + 0 => + array ( + 'created' => '1031216928', + 'creator_id' => '14', + 'id' => '1', + 'modified' => '1033922106', + 'modifier_id' => '14', + 'name' => 'Content', + ), + 1 => + array ( + 'created' => '1031216941', + 'creator_id' => '14', + 'id' => '2', + 'modified' => '1033922113', + 'modifier_id' => '14', + 'name' => 'Users', + ), + 2 => + array ( + 'created' => '1032009743', + 'creator_id' => '14', + 'id' => '3', + 'modified' => '1033922120', + 'modifier_id' => '14', + 'name' => 'Media', + ), + 3 => + array ( + 'created' => '1081858024', + 'creator_id' => '14', + 'id' => '4', + 'modified' => '1081858024', + 'modifier_id' => '14', + 'name' => 'Setup', + ), + ), + 'ezcontentobject' => + array ( + 0 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033917596', + 'name' => 'Users', + 'owner_id' => '14', + 'published' => '1033917596', + 'remote_id' => 'f5c88a2209584891056f987fd965b0ba', + 'section_id' => '2', + 'status' => '1', + ), + 1 => + array ( + 'contentclass_id' => '4', + 'current_version' => '2', + 'id' => '10', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'name' => 'Anonymous User', + 'owner_id' => '14', + 'published' => '1033920665', + 'remote_id' => 'faaeb9be3bd98ed09f606fc16d144eca', + 'section_id' => '2', + 'status' => '1', + ), + 2 => + array ( + 'contentclass_id' => '3', + 'current_version' => '2', + 'id' => '11', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'name' => 'Members', + 'owner_id' => '14', + 'published' => '1033920746', + 'remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'section_id' => '2', + 'status' => '1', + ), + 3 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '12', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'name' => 'Administrator users', + 'owner_id' => '14', + 'published' => '1033920775', + 'remote_id' => '9b47a45624b023b1a76c73b74d704acf', + 'section_id' => '2', + 'status' => '1', + ), + 4 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '13', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'name' => 'Editors', + 'owner_id' => '14', + 'published' => '1033920794', + 'remote_id' => '3c160cca19fb135f83bd02d911f04db2', + 'section_id' => '2', + 'status' => '1', + ), + 5 => + array ( + 'contentclass_id' => '4', + 'current_version' => '4', + 'id' => '14', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154214', + 'name' => 'Administrator User', + 'owner_id' => '14', + 'published' => '1033920830', + 'remote_id' => '1bb4fe25487f05527efa8bfd394cecc7', + 'section_id' => '2', + 'status' => '1', + ), + 6 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '41', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'name' => 'Media', + 'owner_id' => '14', + 'published' => '1060695457', + 'remote_id' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + 'section_id' => '3', + 'status' => '1', + ), + 7 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '42', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'name' => 'Anonymous Users', + 'owner_id' => '14', + 'published' => '1072180330', + 'remote_id' => '15b256dbea2ae72418ff5facc999e8f9', + 'section_id' => '2', + 'status' => '1', + ), + 8 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '45', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'name' => 'Setup', + 'owner_id' => '14', + 'published' => '1079684190', + 'remote_id' => '241d538ce310074e602f29f49e44e938', + 'section_id' => '4', + 'status' => '1', + ), + 9 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '49', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'name' => 'Images', + 'owner_id' => '14', + 'published' => '1080220197', + 'remote_id' => 'e7ff633c6b8e0fd3531e74c6e712bead', + 'section_id' => '3', + 'status' => '1', + ), + 10 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '50', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'name' => 'Files', + 'owner_id' => '14', + 'published' => '1080220220', + 'remote_id' => '732a5acd01b51a6fe6eab448ad4138a9', + 'section_id' => '3', + 'status' => '1', + ), + 11 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '51', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'name' => 'Multimedia', + 'owner_id' => '14', + 'published' => '1080220233', + 'remote_id' => '09082deb98662a104f325aaa8c4933d3', + 'section_id' => '3', + 'status' => '1', + ), + 12 => + array ( + 'contentclass_id' => '14', + 'current_version' => '1', + 'id' => '52', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'name' => 'Common INI settings', + 'owner_id' => '14', + 'published' => '1082016591', + 'remote_id' => '27437f3547db19cf81a33c92578b2c89', + 'section_id' => '4', + 'status' => '1', + ), + 13 => + array ( + 'contentclass_id' => '15', + 'current_version' => '2', + 'id' => '54', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062376', + 'name' => 'Website Interface', + 'owner_id' => '14', + 'published' => '1082016652', + 'remote_id' => '8b8b22fe3c6061ed500fbd2b377b885f', + 'section_id' => '5', + 'status' => '1', + ), + 14 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '56', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023132', + 'name' => 'Design', + 'owner_id' => '14', + 'published' => '1103023132', + 'remote_id' => '08799e609893f7aba22f10cb466d9cc8', + 'section_id' => '5', + 'status' => '1', + ), + 15 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '57', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1168428358', + 'name' => 'Banners', + 'owner_id' => '14', + 'published' => '1168428358', + 'remote_id' => 'f1826ada5e88c8f79e7048b2145040b2', + 'section_id' => '3', + 'status' => '1', + ), + 16 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '58', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499903', + 'name' => 'Woman (Communities)', + 'owner_id' => '14', + 'published' => '1174469194', + 'remote_id' => '99730850bd806030c4ae9ea92571bdd0', + 'section_id' => '3', + 'status' => '1', + ), + 17 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '59', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499933', + 'name' => 'Woman (Frontpage)', + 'owner_id' => '14', + 'published' => '1174474836', + 'remote_id' => '52f728d4880ca5def392e4f2e782ee6d', + 'section_id' => '3', + 'status' => '1', + ), + 18 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '60', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499960', + 'name' => 'Woman (Products)', + 'owner_id' => '14', + 'published' => '1174552827', + 'remote_id' => 'ec19f2662ebb0f930ce024a48f17f7ee', + 'section_id' => '3', + 'status' => '1', + ), + 19 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '61', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500074', + 'name' => 'Woman (Partners)', + 'owner_id' => '14', + 'published' => '1174655952', + 'remote_id' => '55e6c9acf534ff2f3564290cb38ffddc', + 'section_id' => '3', + 'status' => '1', + ), + 20 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '62', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500183', + 'name' => 'Pencils (Support)', + 'owner_id' => '14', + 'published' => '1174984631', + 'remote_id' => '768a04778081c6e08db5d77dd01f98a9', + 'section_id' => '3', + 'status' => '1', + ), + 21 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '63', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500542', + 'name' => 'Woman (Training)', + 'owner_id' => '14', + 'published' => '1174987052', + 'remote_id' => 'a7c0be8039efe452ca7d1e7ec1d28dcf', + 'section_id' => '3', + 'status' => '1', + ), + 22 => + array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '64', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500602', + 'name' => 'Woman (Solutions)', + 'owner_id' => '14', + 'published' => '1175243716', + 'remote_id' => '1000aa14a05b968a2faa3def83aa1994', + 'section_id' => '3', + 'status' => '1', + ), + 23 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '65', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780998', + 'name' => 'Home', + 'owner_id' => '14', + 'published' => '1193906012', + 'remote_id' => '8a9c9c761004866fb458d89910f52bee', + 'section_id' => '1', + 'status' => '1', + ), + 24 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '66', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781436', + 'name' => 'rest_api', + 'owner_id' => '14', + 'published' => '1299781436', + 'remote_id' => '800a632abc6258f5e0a6229c2ff55b46', + 'section_id' => '3', + 'status' => '1', + ), + 25 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '67', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174567474', + 'name' => 'Products', + 'owner_id' => '14', + 'published' => '1174302316', + 'remote_id' => '5dba9f5125423db2eda9ba8858a38775', + 'section_id' => '1', + 'status' => '1', + ), + 26 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '68', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302361', + 'name' => 'Software', + 'owner_id' => '14', + 'published' => '1174302361', + 'remote_id' => '02d35489c12bcbff3239c3b739823678', + 'section_id' => '1', + 'status' => '1', + ), + 27 => + array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '69', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174303791', + 'name' => 'OS Type I', + 'owner_id' => '14', + 'published' => '1174303791', + 'remote_id' => '2995f126f24a5ef2b937c63ecae2ffc0', + 'section_id' => '1', + 'status' => '1', + ), + 28 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '70', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302388', + 'name' => 'Boxes', + 'owner_id' => '14', + 'published' => '1174302388', + 'remote_id' => '7e60420c152b5b1821ff8dda1d5002aa', + 'section_id' => '1', + 'status' => '1', + ), + 29 => + array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '71', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174303350', + 'name' => 'CD/DVD Box I', + 'owner_id' => '14', + 'published' => '1174302627', + 'remote_id' => 'c0e62f667c7edf5b69f3131c98292387', + 'section_id' => '1', + 'status' => '1', + ), + 30 => + array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '72', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174303441', + 'name' => 'CD/DVD Box II', + 'owner_id' => '14', + 'published' => '1174303394', + 'remote_id' => '71692736085cf6f8a36cdbb082249764', + 'section_id' => '1', + 'status' => '1', + ), + 31 => + array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '73', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174304934', + 'name' => 'CD/DVD Box III', + 'owner_id' => '14', + 'published' => '1174304181', + 'remote_id' => '14f969f0d7f75f507394372c22919d00', + 'section_id' => '1', + 'status' => '1', + ), + 32 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '74', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302417', + 'name' => 'Products sheets', + 'owner_id' => '14', + 'published' => '1174302417', + 'remote_id' => '3524ea164ee11e7e102c9aaa56d02488', + 'section_id' => '1', + 'status' => '1', + ), + 33 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '75', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500673', + 'name' => 'Solutions', + 'owner_id' => '14', + 'published' => '1174389373', + 'remote_id' => '3388409c96f37a7974f35befa5a14650', + 'section_id' => '1', + 'status' => '1', + ), + 34 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '76', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069345', + 'name' => 'Web publishing', + 'owner_id' => '14', + 'published' => '1174389439', + 'remote_id' => 'f21f7c41fd73c70814c46cb26b0851ed', + 'section_id' => '1', + 'status' => '1', + ), + 35 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '77', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174643990', + 'name' => 'Fusce sagittis sagittis', + 'owner_id' => '14', + 'published' => '1174643990', + 'remote_id' => '91ac81d846554a305a4029b19ba52d31', + 'section_id' => '1', + 'status' => '1', + ), + 36 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '78', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174644140', + 'name' => 'Etiam posuere sodales arcu', + 'owner_id' => '14', + 'published' => '1174644140', + 'remote_id' => 'f20f40a2f49aeec1ec40e9fb5d7cb86c', + 'section_id' => '1', + 'status' => '1', + ), + 37 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '79', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174644714', + 'name' => 'In hac habitasse platea', + 'owner_id' => '14', + 'published' => '1174644661', + 'remote_id' => 'b703033b4165a4e5b13a5b8d36b02cd1', + 'section_id' => '1', + 'status' => '1', + ), + 38 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '80', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069362', + 'name' => 'Content management', + 'owner_id' => '14', + 'published' => '1174389466', + 'remote_id' => '7dfe6d524e63a6759fd31db11a3e1490', + 'section_id' => '1', + 'status' => '1', + ), + 39 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '81', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174645184', + 'name' => 'Fusce sagittis sagittis urna', + 'owner_id' => '14', + 'published' => '1174645184', + 'remote_id' => '4179733ef0b35e2608ce72158ffe3893', + 'section_id' => '1', + 'status' => '1', + ), + 40 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '82', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174645301', + 'name' => 'Class aptent taciti sociosqu', + 'owner_id' => '14', + 'published' => '1174645301', + 'remote_id' => '5e182ad2a35120c9579c3f6d61e143cc', + 'section_id' => '1', + 'status' => '1', + ), + 41 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '83', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174645360', + 'name' => 'Aenean malesuada ligula', + 'owner_id' => '14', + 'published' => '1174645332', + 'remote_id' => 'a771e29e5157372b4798dd69a3f3eaaf', + 'section_id' => '1', + 'status' => '1', + ), + 42 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '84', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175513915', + 'name' => 'Training', + 'owner_id' => '14', + 'published' => '1174389534', + 'remote_id' => '79c3b8005e960653895177d765421342', + 'section_id' => '1', + 'status' => '1', + ), + 43 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '85', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238156', + 'name' => 'Certification', + 'owner_id' => '14', + 'published' => '1174389566', + 'remote_id' => '6a18ed16e2ea7618cc57b45791287408', + 'section_id' => '1', + 'status' => '1', + ), + 44 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '86', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069183', + 'name' => 'Professional workshops', + 'owner_id' => '14', + 'published' => '1174389594', + 'remote_id' => '895d89a8052f65834296b66318586044', + 'section_id' => '1', + 'status' => '1', + ), + 45 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '87', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175236156', + 'name' => 'Etiam sodales mauris', + 'owner_id' => '14', + 'published' => '1175235860', + 'remote_id' => '926e4fa2734f1fb6c73865417d374fea', + 'section_id' => '1', + 'status' => '1', + ), + 46 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '88', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175236182', + 'name' => 'Class aptent taciti', + 'owner_id' => '14', + 'published' => '1175236124', + 'remote_id' => '4014d37e72cee9e4dd45ab83b8b487ad', + 'section_id' => '1', + 'status' => '1', + ), + 47 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '89', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175238553', + 'name' => 'Duis auctor vehicula erat', + 'owner_id' => '14', + 'published' => '1175236994', + 'remote_id' => '93d52b9e156bd0fcd8b04cc3848e6399', + 'section_id' => '1', + 'status' => '1', + ), + 48 => + array ( + 'contentclass_id' => '41', + 'current_version' => '1', + 'id' => '90', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174389633', + 'name' => 'Events and seminars', + 'owner_id' => '14', + 'published' => '1174389633', + 'remote_id' => '8ce63c01bab6005a389b7bde97f67dae', + 'section_id' => '1', + 'status' => '1', + ), + 49 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '91', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238194', + 'name' => 'Self-paced courses', + 'owner_id' => '14', + 'published' => '1174389656', + 'remote_id' => 'bafe7b5d33ea8ff41c0b8eab1bf8fc04', + 'section_id' => '1', + 'status' => '1', + ), + 50 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '92', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238223', + 'name' => 'Instructor-led courses', + 'owner_id' => '14', + 'published' => '1174389673', + 'remote_id' => 'b2b0a9addbbe01a7cb0160e70e42645c', + 'section_id' => '1', + 'status' => '1', + ), + 51 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '93', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069321', + 'name' => 'Additional learning resources', + 'owner_id' => '14', + 'published' => '1174389699', + 'remote_id' => '34ceeed46f3ff3a5b29b8f96eb5d0d81', + 'section_id' => '1', + 'status' => '1', + ), + 52 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '94', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175496902', + 'name' => 'Support', + 'owner_id' => '14', + 'published' => '1174458644', + 'remote_id' => 'affc99e41128c1475fa4f23dafb7159b', + 'section_id' => '1', + 'status' => '1', + ), + 53 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '95', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175258818', + 'name' => 'Knowledgebase', + 'owner_id' => '14', + 'published' => '1174459837', + 'remote_id' => 'c4d3b3ee85f36777a744015c7f234387', + 'section_id' => '1', + 'status' => '1', + ), + 54 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '96', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175253354', + 'name' => 'Sed suscipit', + 'owner_id' => '14', + 'published' => '1175253354', + 'remote_id' => 'c8294dd0b321e556905fa73df3d7ca8e', + 'section_id' => '1', + 'status' => '1', + ), + 55 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '97', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175253355', + 'name' => 'Ut interdum', + 'owner_id' => '14', + 'published' => '1175253355', + 'remote_id' => '9ca41b0930e91ae61b2d67bab735ea76', + 'section_id' => '1', + 'status' => '1', + ), + 56 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '98', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175082041', + 'name' => 'Documentation', + 'owner_id' => '14', + 'published' => '1175081995', + 'remote_id' => '8366aa92a2a1b25e6f3ffc09e6fb6ce4', + 'section_id' => '1', + 'status' => '1', + ), + 57 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '99', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175082006', + 'name' => 'Mauris pretium', + 'owner_id' => '14', + 'published' => '1175082005', + 'remote_id' => '89a584d09ab2f7dbc3374aad02839f21', + 'section_id' => '1', + 'status' => '1', + ), + 58 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '100', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175082007', + 'name' => 'Aliquam posuere', + 'owner_id' => '14', + 'published' => '1175082007', + 'remote_id' => 'f6e9707b5c57b6559f71d1c208452586', + 'section_id' => '1', + 'status' => '1', + ), + 59 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '101', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253508', + 'name' => 'Books', + 'owner_id' => '14', + 'published' => '1174459757', + 'remote_id' => 'e9aacd027d83d0c7f938521743cd7c98', + 'section_id' => '1', + 'status' => '1', + ), + 60 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '102', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175496958', + 'name' => 'Aliquam pulvinar suscipit tellus', + 'owner_id' => '14', + 'published' => '1175496424', + 'remote_id' => 'ec2989a9d3928f616fc3f9a8230928a2', + 'section_id' => '1', + 'status' => '1', + ), + 61 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '103', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253665', + 'name' => 'Customer Service', + 'owner_id' => '14', + 'published' => '1174459783', + 'remote_id' => '6a972b9a9541a2cb8a1947f222c8a629', + 'section_id' => '1', + 'status' => '1', + ), + 62 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '104', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253697', + 'name' => 'Support Programs', + 'owner_id' => '14', + 'published' => '1174459806', + 'remote_id' => 'be5e492565ceefe997010cec6518103e', + 'section_id' => '1', + 'status' => '1', + ), + 63 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '105', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299158749', + 'name' => 'Getting started', + 'owner_id' => '14', + 'published' => '1177409070', + 'remote_id' => '5eeb942341753fc43a2c03c64e86f849', + 'section_id' => '1', + 'status' => '1', + ), + 64 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '106', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299826201', + 'name' => 'Tutorials for', + 'owner_id' => '14', + 'published' => '1299158700', + 'remote_id' => 'fe77fde45a90fa16043f39d3e3e87e4b', + 'section_id' => '1', + 'status' => '1', + ), + 65 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '107', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782490', + 'name' => 'Get involved', + 'owner_id' => '14', + 'published' => '1299159072', + 'remote_id' => '5bae6a310785e4f43fcc592e28eb7fd0', + 'section_id' => '1', + 'status' => '1', + ), + 66 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '108', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782140', + 'name' => 'How to use eZ Publish', + 'owner_id' => '14', + 'published' => '1299772464', + 'remote_id' => '2ded978c269bba85013b86c2964009be', + 'section_id' => '1', + 'status' => '1', + ), + 67 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '109', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-500ab8787316f4299c770900bf0b0361', + 'section_id' => '1', + 'status' => '1', + ), + 68 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '110', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-ad2898c2625326a0d31d18153febbd23', + 'section_id' => '1', + 'status' => '1', + ), + 69 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '111', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-56d3f1d0fc6fc6833653e95d50ac37fe', + 'section_id' => '1', + 'status' => '1', + ), + 70 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '112', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-108ac92f1474159b11e596f43a621a50', + 'section_id' => '1', + 'status' => '1', + ), + 71 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '113', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-ceba80e058bbe31bd6c34bb0e4b70bb7', + 'section_id' => '1', + 'status' => '1', + ), + 72 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '114', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-9c4764dca2a879664b1d6d78275e3bf5', + 'section_id' => '1', + 'status' => '1', + ), + 73 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '115', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772466', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772466', + 'remote_id' => 'ezoo-1ade41acf96c3c4b1a12860e1b273f34', + 'section_id' => '1', + 'status' => '1', + ), + 74 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '116', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772466', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772466', + 'remote_id' => 'ezoo-7ba827c696f3e1a2f1346541ce006bc9', + 'section_id' => '1', + 'status' => '1', + ), + 75 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '117', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772466', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772466', + 'remote_id' => 'ezoo-807f36478d500837a867f092f16d2edb', + 'section_id' => '1', + 'status' => '1', + ), + 76 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '118', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772545', + 'name' => 'How to manage eZ Publish', + 'owner_id' => '14', + 'published' => '1299772545', + 'remote_id' => '90ee91c224c69f28aa775cf9edc34ef3', + 'section_id' => '1', + 'status' => '1', + ), + 77 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '119', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-6dd0f99f173ac80b7a02278b7a16d591', + 'section_id' => '1', + 'status' => '1', + ), + 78 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '120', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-9a1aaccfcceb5f0c6deed712dc3e8ad2', + 'section_id' => '1', + 'status' => '1', + ), + 79 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '121', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-833ab68985a7f8c1684b267b30a559c6', + 'section_id' => '1', + 'status' => '1', + ), + 80 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '122', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-93e2315c451c7126eae706b473b1c52a', + 'section_id' => '1', + 'status' => '1', + ), + 81 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '123', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-23e06358318331a1c2106d7c33a58418', + 'section_id' => '1', + 'status' => '1', + ), + 82 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '124', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-04a89e84e1f234c3c994d9d4c0e97427', + 'section_id' => '1', + 'status' => '1', + ), + 83 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '125', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-074e119f8e73af31122dbb65c5e2e051', + 'section_id' => '1', + 'status' => '1', + ), + 84 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '126', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772547', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772547', + 'remote_id' => 'ezoo-523ece70d73d5d9181766024536432ac', + 'section_id' => '1', + 'status' => '1', + ), + 85 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '127', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782177', + 'name' => 'How to develop with eZ Publish', + 'owner_id' => '14', + 'published' => '1299772637', + 'remote_id' => '564f94afa87f70227199e951450b19a4', + 'section_id' => '1', + 'status' => '1', + ), + 86 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '128', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772637', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772637', + 'remote_id' => 'ezoo-0766000124cbc5f97cbc2ab2a866d211', + 'section_id' => '1', + 'status' => '1', + ), + 87 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '129', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772637', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772637', + 'remote_id' => 'ezoo-e6d52e4230c6537bb443681a3e2227f1', + 'section_id' => '1', + 'status' => '1', + ), + 88 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '130', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1284398357', + 'name' => 'Adding Siteaccesses in eZ Publish', + 'owner_id' => '14', + 'published' => '1284398357', + 'remote_id' => 'e02b80d7cd9059cf469aafbe7d2d1969', + 'section_id' => '1', + 'status' => '1', + ), + 89 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '131', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780749', + 'name' => 'New features', + 'owner_id' => '14', + 'published' => '1299780749', + 'remote_id' => '5602aa2e97cc42199dbdf09d39602fa1', + 'section_id' => '1', + 'status' => '1', + ), + 90 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '132', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782001', + 'name' => 'Improved user registration workflow', + 'owner_id' => '14', + 'published' => '1299773631', + 'remote_id' => 'b3a55b313b9dcc062b0a72d353a061f0', + 'section_id' => '1', + 'status' => '1', + ), + 91 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '133', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773632', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773632', + 'remote_id' => 'ezoo-824ecec8d77eacebe80a14de50be1407', + 'section_id' => '1', + 'status' => '1', + ), + 92 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '134', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773632', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773632', + 'remote_id' => 'ezoo-be5800de6f1768c0246c98fb8ab82ae8', + 'section_id' => '1', + 'status' => '1', + ), + 93 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '135', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773632', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773632', + 'remote_id' => 'ezoo-898e714f495796d827e14fabcad39004', + 'section_id' => '1', + 'status' => '1', + ), + 94 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '136', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773644', + 'name' => 'Improved block editing', + 'owner_id' => '14', + 'published' => '1299773644', + 'remote_id' => '600871786c620b262ed880d0712cf9e0', + 'section_id' => '1', + 'status' => '1', + ), + 95 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '137', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773644', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773644', + 'remote_id' => 'ezoo-786d2237126858b0ae103bba831194c5', + 'section_id' => '1', + 'status' => '1', + ), + 96 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '138', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773645', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773645', + 'remote_id' => 'ezoo-30636a746c10b209d065b6236322cae9', + 'section_id' => '1', + 'status' => '1', + ), + 97 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '139', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781914', + 'name' => 'Improved front-end editing', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'c04fb6e7abdfcf2c032389cfb246df10', + 'section_id' => '1', + 'status' => '1', + ), + 98 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '140', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773656', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'ezoo-25c6a6c4283f817e868846e4e4e047bc', + 'section_id' => '1', + 'status' => '1', + ), + 99 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '141', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773656', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'ezoo-e8c8e5be0ab861883249f1f140645d1b', + 'section_id' => '1', + 'status' => '1', + ), + 100 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '142', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773656', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'ezoo-d91c6b1b2436f599b0c235f1d49bffe6', + 'section_id' => '1', + 'status' => '1', + ), + 101 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '143', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773657', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773657', + 'remote_id' => 'ezoo-834c4dc12c2470e235dfca5a9b56a751', + 'section_id' => '1', + 'status' => '1', + ), + 102 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '144', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781605', + 'name' => 'FastCGI', + 'owner_id' => '14', + 'published' => '1299773667', + 'remote_id' => '726413c0a78a8b4d75e6681d7f9883f6', + 'section_id' => '1', + 'status' => '1', + ), + 103 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '145', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299826224', + 'name' => 'Support for Red Hat Enterprise', + 'owner_id' => '14', + 'published' => '1299773676', + 'remote_id' => '8377bca8d648a3cab863ef09de4a33ba', + 'section_id' => '1', + 'status' => '1', + ), + 104 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '146', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773677', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773677', + 'remote_id' => 'ezoo-312c7da896e31f74afa5bdfcf2ec3c4b', + 'section_id' => '1', + 'status' => '1', + ), + 105 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '147', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773691', + 'name' => 'Canonical links', + 'owner_id' => '14', + 'published' => '1299773691', + 'remote_id' => '56d03ef66308781ea1bda4adbd10fed5', + 'section_id' => '1', + 'status' => '1', + ), + 106 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '148', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773704', + 'name' => 'Asynchronous publishing', + 'owner_id' => '14', + 'published' => '1299773704', + 'remote_id' => '15450851f4f20dbd0f7e612f3355c4a4', + 'section_id' => '1', + 'status' => '1', + ), + 107 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '149', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773705', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773705', + 'remote_id' => 'ezoo-341682c9084fad2fd8ec02129a427721', + 'section_id' => '1', + 'status' => '1', + ), + 108 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '150', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781476', + 'name' => 'REST API interface', + 'owner_id' => '14', + 'published' => '1299773717', + 'remote_id' => 'a7bf7875d4f020de21f7fd6281eb7922', + 'section_id' => '1', + 'status' => '1', + ), + 109 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '151', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299780653', + 'name' => 'eZ Publish Enterprise', + 'owner_id' => '14', + 'published' => '1299780355', + 'remote_id' => 'bea2aa5ed17c617531344b6c71aff596', + 'section_id' => '1', + 'status' => '1', + ), + 110 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '152', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299780356', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299780356', + 'remote_id' => 'ezoo-0b8f65be2b80b4a7138990b335736563', + 'section_id' => '1', + 'status' => '1', + ), + 111 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '153', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299780356', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299780356', + 'remote_id' => 'ezoo-db3fcade578f2fc9da52a81f503394c2', + 'section_id' => '1', + 'status' => '1', + ), + 112 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '154', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499365', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1168428420', + 'remote_id' => '4ce71da8102ee02db016158cd06895ed', + 'section_id' => '6', + 'status' => '1', + ), + 113 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '155', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498179', + 'name' => 'Partner News', + 'owner_id' => '14', + 'published' => '1174463557', + 'remote_id' => '96525aef27696fa39e69d43481ffc2b1', + 'section_id' => '6', + 'status' => '1', + ), + 114 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '156', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175497937', + 'name' => 'Pellentesque quam mauris', + 'owner_id' => '14', + 'published' => '1175497937', + 'remote_id' => '2803bc1a519d7a60567721200db49d27', + 'section_id' => '6', + 'status' => '1', + ), + 115 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '157', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499136', + 'name' => 'Penatibus et magnis dis', + 'owner_id' => '14', + 'published' => '1175499050', + 'remote_id' => 'b76742278b7144f55c8c8dddc496d762', + 'section_id' => '6', + 'status' => '1', + ), + 116 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '158', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497280', + 'name' => 'News', + 'owner_id' => '14', + 'published' => '1174463579', + 'remote_id' => '9e60cb050cfd8faf02af8fed62e37d94', + 'section_id' => '6', + 'status' => '1', + ), + 117 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '159', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175498242', + 'name' => 'Curabitur hendrerit dignissim', + 'owner_id' => '14', + 'published' => '1175498136', + 'remote_id' => '95edc648f6300157ecd3749b2adf8ab0', + 'section_id' => '6', + 'status' => '1', + ), + 118 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '160', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175498747', + 'name' => 'Proin condimentum risus', + 'owner_id' => '14', + 'published' => '1175498377', + 'remote_id' => '3bcff60495f6c4b165d15f47628f7245', + 'section_id' => '6', + 'status' => '1', + ), + 119 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '161', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175498941', + 'name' => 'Morbi tristique senectus', + 'owner_id' => '14', + 'published' => '1175498941', + 'remote_id' => '54965750523a6caf827bd255ab4833bb', + 'section_id' => '6', + 'status' => '1', + ), + 120 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '162', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497237', + 'name' => 'Partner Products', + 'owner_id' => '14', + 'published' => '1174463692', + 'remote_id' => '3f1c8e4d7736f54032138ea330ee461a', + 'section_id' => '6', + 'status' => '1', + ), + 121 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '163', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497203', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1174463828', + 'remote_id' => '18ed8ae5378a8a1431fc5c8f88f0a86a', + 'section_id' => '6', + 'status' => '1', + ), + 122 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '164', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499564', + 'name' => 'Neque orci malesuada felis', + 'owner_id' => '14', + 'published' => '1175499308', + 'remote_id' => 'cc72df346e00e35cc78d5c6b466a2c11', + 'section_id' => '6', + 'status' => '1', + ), + 123 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '165', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915732', + 'name' => 'Community', + 'owner_id' => '14', + 'published' => '1193906037', + 'remote_id' => '378acc2bc7a52400701956047a2f7d45', + 'section_id' => '1', + 'status' => '1', + ), + 124 => + array ( + 'contentclass_id' => '37', + 'current_version' => '1', + 'id' => '166', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915707', + 'name' => 'Forum', + 'owner_id' => '14', + 'published' => '1193904899', + 'remote_id' => '219ca29549fe687005593716f9fe5d68', + 'section_id' => '1', + 'status' => '1', + ), + 125 => + array ( + 'contentclass_id' => '38', + 'current_version' => '1', + 'id' => '167', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906039', + 'name' => 'Nulla vitae tellus sit amet', + 'owner_id' => '14', + 'published' => '1193906039', + 'remote_id' => 'c5976544daefad2cf0855dbe54a4e748', + 'section_id' => '1', + 'status' => '1', + ), + 126 => + array ( + 'contentclass_id' => '38', + 'current_version' => '1', + 'id' => '168', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906579', + 'name' => 'Ut mollis sodales nibh', + 'owner_id' => '14', + 'published' => '1193906579', + 'remote_id' => 'e6ce013587fd32057017c4459c03b681', + 'section_id' => '1', + 'status' => '1', + ), + 127 => + array ( + 'contentclass_id' => '38', + 'current_version' => '1', + 'id' => '169', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906040', + 'name' => 'Nam risus leo', + 'owner_id' => '14', + 'published' => '1193906040', + 'remote_id' => 'bd4ff900964c8b09694478f5432afc41', + 'section_id' => '1', + 'status' => '1', + ), + 128 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '170', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906045', + 'name' => 'Wiki', + 'owner_id' => '14', + 'published' => '1193906045', + 'remote_id' => '27c68e844e2663ddd20dfb59961d5268', + 'section_id' => '1', + 'status' => '1', + ), + 129 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '171', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299779689', + 'name' => 'Sed suscipit', + 'owner_id' => '14', + 'published' => '1193906045', + 'remote_id' => 'ee8e3c6f437198adaa073a9e2b4dc338', + 'section_id' => '1', + 'status' => '1', + ), + 130 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '172', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906046', + 'name' => 'Ut interdum', + 'owner_id' => '14', + 'published' => '1193906046', + 'remote_id' => '4ce7df1966ec83aadb0901ed6162bf9b', + 'section_id' => '1', + 'status' => '1', + ), + 131 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '173', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906046', + 'name' => 'Fusce pulvinar', + 'owner_id' => '14', + 'published' => '1193906046', + 'remote_id' => 'fa54ccddf28481b513b60c68911baef8', + 'section_id' => '1', + 'status' => '1', + ), + 132 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '174', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906047', + 'name' => 'Duis id tortor', + 'owner_id' => '14', + 'published' => '1193906047', + 'remote_id' => 'e20a6ec858de6a28a7ba14c26164753a', + 'section_id' => '1', + 'status' => '1', + ), + 133 => + array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '175', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906047', + 'name' => 'Curabitur lacinia', + 'owner_id' => '14', + 'published' => '1193906047', + 'remote_id' => '5a3d6806ccd2f6edd86f6219ddc51525', + 'section_id' => '1', + 'status' => '1', + ), + 134 => + array ( + 'contentclass_id' => '35', + 'current_version' => '1', + 'id' => '176', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773449', + 'name' => 'Pictures', + 'owner_id' => '14', + 'published' => '1193910178', + 'remote_id' => 'c0180d604d5f5d273702b7d675d6c0cd', + 'section_id' => '1', + 'status' => '1', + ), + 135 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '177', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773210', + 'name' => 'Ivo on eZ Tags', + 'owner_id' => '14', + 'published' => '1299772902', + 'remote_id' => '32709d6df489b5debc03caddec908363', + 'section_id' => '1', + 'status' => '1', + ), + 136 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '178', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773237', + 'name' => 'Are you ready for the Community day?', + 'owner_id' => '14', + 'published' => '1299772906', + 'remote_id' => '36e3a053ea7c2eb0270f7e814db08437', + 'section_id' => '1', + 'status' => '1', + ), + 137 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '179', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773259', + 'name' => 'Let\'s work together!', + 'owner_id' => '14', + 'published' => '1299772907', + 'remote_id' => '94b6dac5fe7da860b3d1517c50fe778c', + 'section_id' => '1', + 'status' => '1', + ), + 138 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '180', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773275', + 'name' => 'The Mediterranean seen from Nice!', + 'owner_id' => '14', + 'published' => '1299772908', + 'remote_id' => '3563d8cdc914573dcff797de2e6e19e1', + 'section_id' => '1', + 'status' => '1', + ), + 139 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '181', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773344', + 'name' => 'Hotel lobby at Isola2000', + 'owner_id' => '14', + 'published' => '1299773320', + 'remote_id' => 'd1d0d736feaffd107778d8a7f980f262', + 'section_id' => '1', + 'status' => '1', + ), + 140 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '182', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773383', + 'name' => 'Alexander on the past, Gaby on today and tomorrow', + 'owner_id' => '14', + 'published' => '1299773321', + 'remote_id' => '18be5e657fce9d909d0e5662d4ce2455', + 'section_id' => '1', + 'status' => '1', + ), + 141 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '183', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773410', + 'name' => 'Isola2000 in white - beautiful skiing!', + 'owner_id' => '14', + 'published' => '1299773322', + 'remote_id' => 'a1375875fc7657d934d402e20b76bce2', + 'section_id' => '1', + 'status' => '1', + ), + 142 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '184', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773429', + 'name' => 'CEO future pitch - Adaptable, open, reliable!', + 'owner_id' => '14', + 'published' => '1299773323', + 'remote_id' => '0caf4e0ea84c4919570def36f782ef6d', + 'section_id' => '1', + 'status' => '1', + ), + 143 => + array ( + 'contentclass_id' => '19', + 'current_version' => '1', + 'id' => '185', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915424', + 'name' => 'Blog', + 'owner_id' => '14', + 'published' => '1193915424', + 'remote_id' => '6a715c29ec67ed5e13ded872e1615690', + 'section_id' => '1', + 'status' => '1', + ), + 144 => + array ( + 'contentclass_id' => '20', + 'current_version' => '1', + 'id' => '186', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915590', + 'name' => 'Visit Paris', + 'owner_id' => '14', + 'published' => '1193915590', + 'remote_id' => 'bfe5bf501b832f165089c8d1c0ee959f', + 'section_id' => '1', + 'status' => '1', + ), + 145 => + array ( + 'contentclass_id' => '20', + 'current_version' => '1', + 'id' => '187', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915640', + 'name' => 'Paris in France', + 'owner_id' => '14', + 'published' => '1193915640', + 'remote_id' => 'e88c60fabc96a9dc0a5d429b1a9872ed', + 'section_id' => '1', + 'status' => '1', + ), + 146 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '188', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242707', + 'name' => 'Company', + 'owner_id' => '14', + 'published' => '1168428469', + 'remote_id' => 'b4668ac60d726ddfb655c3895cb0cae5', + 'section_id' => '1', + 'status' => '1', + ), + 147 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '189', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174305524', + 'name' => 'About company', + 'owner_id' => '14', + 'published' => '1174305524', + 'remote_id' => '10705bd08a74c34556ffee6a70d0be0b', + 'section_id' => '1', + 'status' => '1', + ), + 148 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '190', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159424', + 'name' => 'New features', + 'owner_id' => '14', + 'published' => '1193906508', + 'remote_id' => 'dc3e2c928288ee4773493fe16db9ec08', + 'section_id' => '1', + 'status' => '1', + ), + 149 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '191', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193935923', + 'name' => 'Separate content & design in eZ Publish', + 'owner_id' => '14', + 'published' => '1193907125', + 'remote_id' => '932072228b62943d3d3521e7712b54e9', + 'section_id' => '1', + 'status' => '1', + ), + 150 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '192', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010589', + 'name' => 'separation_of_content_and_design', + 'owner_id' => '14', + 'published' => '1253010589', + 'remote_id' => '5e5d7350606f50f5b2e9c85080ef83a3', + 'section_id' => '1', + 'status' => '1', + ), + 151 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '193', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193914552', + 'name' => 'How to use eZ Publish', + 'owner_id' => '14', + 'published' => '1193908304', + 'remote_id' => 'afad8dfca54311e15bfd241ef09da280', + 'section_id' => '1', + 'status' => '1', + ), + 152 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '194', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009641', + 'name' => 'openoffice_import_large', + 'owner_id' => '14', + 'published' => '1253009641', + 'remote_id' => '0df4432f360b63cc55331524bea095bc', + 'section_id' => '1', + 'status' => '1', + ), + 153 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '195', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009692', + 'name' => 'translation_large', + 'owner_id' => '14', + 'published' => '1253009692', + 'remote_id' => '632542f33d621670300a843c2c3d7790', + 'section_id' => '1', + 'status' => '1', + ), + 154 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '196', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009744', + 'name' => 'multiupload_large', + 'owner_id' => '14', + 'published' => '1253009744', + 'remote_id' => 'be4b68a49195b504f7854e38ee97c9e6', + 'section_id' => '1', + 'status' => '1', + ), + 155 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '197', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009784', + 'name' => 'gallery_large', + 'owner_id' => '14', + 'published' => '1253009784', + 'remote_id' => '9737ed22471ac3baf2dbbb45fcb3af5c', + 'section_id' => '1', + 'status' => '1', + ), + 156 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '198', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009879', + 'name' => 'search_result_large', + 'owner_id' => '14', + 'published' => '1253009879', + 'remote_id' => '2ff25f3949e9c4d49442170ca0726fea', + 'section_id' => '1', + 'status' => '1', + ), + 157 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '199', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010806', + 'name' => 'ez_tool_bar_large', + 'owner_id' => '14', + 'published' => '1253010806', + 'remote_id' => 'ab7ed2ea1e71e7ec0479195fc0dc5440', + 'section_id' => '1', + 'status' => '1', + ), + 158 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '200', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009816', + 'name' => 'quicktime_large', + 'owner_id' => '14', + 'published' => '1253009816', + 'remote_id' => '4cf0621be70d809727b8a3581343dee1', + 'section_id' => '3', + 'status' => '1', + ), + 159 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '201', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009848', + 'name' => 'web_2_0_large', + 'owner_id' => '14', + 'published' => '1253009848', + 'remote_id' => 'fad6a8133332373683847f76158e8719', + 'section_id' => '3', + 'status' => '1', + ), + 160 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '202', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782207', + 'name' => 'How to manage eZ Publish', + 'owner_id' => '14', + 'published' => '1193908398', + 'remote_id' => '81d949fde405dbe3e5bc6d83452bd927', + 'section_id' => '1', + 'status' => '1', + ), + 161 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '203', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010224', + 'name' => 'usermanagement_large', + 'owner_id' => '14', + 'published' => '1253010224', + 'remote_id' => '344e4197cdaf6ad6f06e0c99ad81dbed', + 'section_id' => '1', + 'status' => '1', + ), + 162 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '204', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010249', + 'name' => 'workflow_large', + 'owner_id' => '14', + 'published' => '1253010249', + 'remote_id' => 'ffc4840fd5b1f8c7ec21d569787252ed', + 'section_id' => '1', + 'status' => '1', + ), + 163 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '205', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010272', + 'name' => 'versioning_large', + 'owner_id' => '14', + 'published' => '1253010272', + 'remote_id' => '3e192eaaaaaceea57be51f2fec5b4abd', + 'section_id' => '1', + 'status' => '1', + ), + 164 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '206', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010315', + 'name' => 'datatypes_attributes_content_class_and_objects_large', + 'owner_id' => '14', + 'published' => '1253010315', + 'remote_id' => 'ee5ad7e637d4da303960cc8800ced740', + 'section_id' => '1', + 'status' => '1', + ), + 165 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '207', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010343', + 'name' => 'multiple_location_large', + 'owner_id' => '14', + 'published' => '1253010343', + 'remote_id' => '59a7ab331d043dddcf9011a8ef32a32b', + 'section_id' => '1', + 'status' => '1', + ), + 166 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '208', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010367', + 'name' => 'multisite_deployment_large', + 'owner_id' => '14', + 'published' => '1253010367', + 'remote_id' => 'e9ba83a65cdaf91039bbffbbfdc5d77b', + 'section_id' => '1', + 'status' => '1', + ), + 167 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '209', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010401', + 'name' => 'seo_large', + 'owner_id' => '14', + 'published' => '1253010401', + 'remote_id' => '46683944a42aefbbb42cf615489f3627', + 'section_id' => '1', + 'status' => '1', + ), + 168 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '210', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010921', + 'name' => 'admin_site_large', + 'owner_id' => '14', + 'published' => '1253010921', + 'remote_id' => '58f0b7745496ec9ba4e3238dbd481a4b', + 'section_id' => '1', + 'status' => '1', + ), + 169 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '211', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193914399', + 'name' => 'How to develop with eZ Publish', + 'owner_id' => '14', + 'published' => '1193908946', + 'remote_id' => '96a6b67d897f8dda1053f2a56a734941', + 'section_id' => '1', + 'status' => '1', + ), + 170 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '212', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253011179', + 'name' => 'datatypes_attributes_content_class_and_objects_large', + 'owner_id' => '14', + 'published' => '1253011179', + 'remote_id' => '9bf3262d95b411ed99b6efb704aba830', + 'section_id' => '1', + 'status' => '1', + ), + 171 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '213', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253011241', + 'name' => 'site_style_large', + 'owner_id' => '14', + 'published' => '1253011241', + 'remote_id' => 'a1dc5eaa5bb06066e033df54ecd76180', + 'section_id' => '1', + 'status' => '1', + ), + 172 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '214', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159460', + 'name' => 'REST API interface', + 'owner_id' => '14', + 'published' => '1299159460', + 'remote_id' => 'e14eb9cc916fd2f8e0e5660cdda0f25d', + 'section_id' => '1', + 'status' => '1', + ), + 173 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '215', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159490', + 'name' => 'Asynchronous Publishing', + 'owner_id' => '14', + 'published' => '1299159490', + 'remote_id' => 'e56b267f79afc37b624d3348a0e85f6e', + 'section_id' => '1', + 'status' => '1', + ), + 174 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '216', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159523', + 'name' => 'Canonical links', + 'owner_id' => '14', + 'published' => '1299159523', + 'remote_id' => 'df9492099e7fc03de8823726eb7c5b56', + 'section_id' => '1', + 'status' => '1', + ), + 175 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '217', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159553', + 'name' => 'Support for Red Hat Enterprise', + 'owner_id' => '14', + 'published' => '1299159553', + 'remote_id' => 'ce7a6712771252619b2a32e277ea7aac', + 'section_id' => '1', + 'status' => '1', + ), + 176 => + array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '218', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299216558', + 'name' => 'FastCGI', + 'owner_id' => '14', + 'published' => '1299159579', + 'remote_id' => '83d9df9fbe02ae449c2208625b6803e0', + 'section_id' => '1', + 'status' => '1', + ), + 177 => + array ( + 'contentclass_id' => '26', + 'current_version' => '1', + 'id' => '219', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174305643', + 'name' => 'Events', + 'owner_id' => '14', + 'published' => '1174305643', + 'remote_id' => '36a66a1bf73a17b098642b52c7b62c35', + 'section_id' => '1', + 'status' => '1', + ), + 178 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '220', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069794', + 'name' => 'Career', + 'owner_id' => '14', + 'published' => '1174305674', + 'remote_id' => '493a855d8565518e07369352e295facc', + 'section_id' => '1', + 'status' => '1', + ), + 179 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '221', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069741', + 'name' => 'Investors Relation', + 'owner_id' => '14', + 'published' => '1174305734', + 'remote_id' => 'c9822f47546396138c1318d3e0dcbdfe', + 'section_id' => '1', + 'status' => '1', + ), + 180 => + array ( + 'contentclass_id' => '22', + 'current_version' => '1', + 'id' => '222', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174308757', + 'name' => 'Contact', + 'owner_id' => '14', + 'published' => '1174308757', + 'remote_id' => 'c8e19a5426d741de3d587579de89c91e', + 'section_id' => '1', + 'status' => '1', + ), + 181 => + array ( + 'contentclass_id' => '25', + 'current_version' => '1', + 'id' => '223', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174654830', + 'name' => 'Morbi neque', + 'owner_id' => '14', + 'published' => '1174654751', + 'remote_id' => '73ab8d14922e13d67ef3c295d0663fa9', + 'section_id' => '1', + 'status' => '1', + ), + 182 => + array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '224', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242960', + 'name' => 'Company banner', + 'owner_id' => '14', + 'published' => '1175242413', + 'remote_id' => 'a457bec5fb0afe243c16fe254e2fbcdf', + 'section_id' => '1', + 'status' => '1', + ), + 183 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '225', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1311154215', + 'remote_id' => '713e1709ba03bf1fde1396d2a0451e28', + 'section_id' => '1', + 'status' => '1', + ), + ), + 'ezcontentobject_attribute' => + array ( + 0 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Main group', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Users', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 2 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous', + 'data_type_string' => 'ezstring', + 'id' => '19', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous', + 'version' => '2', + ), + 3 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '20', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '2', + ), + 4 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '21', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 5 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Guest accounts', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 6 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Members', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'members', + 'version' => '2', + ), + 7 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 8 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 9 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator users', + 'data_type_string' => 'ezstring', + 'id' => '24', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 10 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '25', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 11 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Editors', + 'data_type_string' => 'ezstring', + 'id' => '26', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 12 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '27', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 13 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '3', + ), + 14 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '4', + ), + 15 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '3', + ), + 16 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '4', + ), + 17 => + array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 18 => + array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 19 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Media', + 'data_type_string' => 'ezstring', + 'id' => '98', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 20 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '99', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 21 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous Users', + 'data_type_string' => 'ezstring', + 'id' => '100', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous users', + 'version' => '1', + ), + 22 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User group for the anonymous user', + 'data_type_string' => 'ezstring', + 'id' => '101', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user group for the anonymous user', + 'version' => '1', + ), + 23 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '103', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 24 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '105', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 25 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '109', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 26 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Setup', + 'data_type_string' => 'ezstring', + 'id' => '123', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'setup', + 'version' => '1', + ), + 27 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '124', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 28 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '125', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 29 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '126', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 30 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '128', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 31 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Images', + 'data_type_string' => 'ezstring', + 'id' => '142', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'images', + 'version' => '1', + ), + 32 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '143', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 33 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '144', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 34 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '145', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 35 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '146', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 36 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Files', + 'data_type_string' => 'ezstring', + 'id' => '147', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'files', + 'version' => '1', + ), + 37 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '148', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 38 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '149', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 39 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '150', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 40 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '151', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 41 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Multimedia', + 'data_type_string' => 'ezstring', + 'id' => '152', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'multimedia', + 'version' => '1', + ), + 42 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '153', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 43 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '154', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 44 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '155', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 45 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '156', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 46 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '159', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Common INI settings', + 'data_type_string' => 'ezstring', + 'id' => '157', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'common ini settings', + 'version' => '1', + ), + 47 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '160', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2/', + 'data_type_string' => 'ezinisetting', + 'id' => '158', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 48 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '161', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2', + 'data_type_string' => 'ezinisetting', + 'id' => '159', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 49 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '162', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 50 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '163', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 51 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '164', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 52 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '165', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 53 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '166', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 54 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '167', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 55 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '168', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 56 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '169', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=100;100', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 57 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '170', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=200;200', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 58 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '171', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=300;300', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 59 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '172', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Website Interface', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 60 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '173', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'author=eZ Systems +copyright=eZ Systems +description=Content Management System +keywords=cms, publish, e-commerce, content management, development framework', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 61 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '174', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Website-Interface1.png" suffix="png" basename="Website-Interface1" dirpath="var/ezwebin_site/storage/images/design/plain-site/172-2-eng-US" url="var/ezwebin_site/storage/images/design/plain-site/172-2-eng-US/Website-Interface1.png" original_filename="logo.png" mime_type="image/png" width="176" height="42" alternative_text="" alias_key="1293033771" timestamp="1311154215"><original attribute_id="172" attribute_version="2" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '172', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 62 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '175', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '0', + 'data_type_string' => 'ezpackage', + 'id' => '173', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '0', + 'version' => '2', + ), + 63 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '177', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'kn@ez.no', + 'data_type_string' => 'ezinisetting', + 'id' => '175', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 64 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '178', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'ezpublish/index.php', + 'data_type_string' => 'ezinisetting', + 'id' => '176', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 65 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '177', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 66 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 67 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 68 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezimage', + 'id' => '179', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 69 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 70 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 71 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Design', + 'data_type_string' => 'ezstring', + 'id' => '181', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'design', + 'version' => '1', + ), + 72 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '182', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 73 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '183', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 74 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '184', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 75 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '185', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 76 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '187', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 77 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '188', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 78 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '189', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 79 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '190', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 80 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '191', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 81 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '192', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 82 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '194', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 83 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '195', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 84 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '196', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 85 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '197', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 86 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '198', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 87 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '199', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 88 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Banners', + 'data_type_string' => 'ezstring', + 'id' => '200', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'banners', + 'version' => '1', + ), + 89 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '201', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 90 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'data_type_string' => 'ezxmltext', + 'id' => '202', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 91 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'data_type_string' => 'ezxmltext', + 'id' => '203', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 92 => + array ( + 'attribute_original_id' => '204', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '204', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 93 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '205', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 94 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '206', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 95 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Communities)', + 'data_type_string' => 'ezstring', + 'id' => '207', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (communities)', + 'version' => '1', + ), + 96 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '208', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 97 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Communities.jpg" suffix="jpg" basename="Woman-Communities" dirpath="var/ezwebin_site/storage/images/media/banners/woman-communities/209-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-communities/209-1-eng-US/Woman-Communities.jpg" original_filename="84f1da4c.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Communities)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="209" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '209', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 98 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '210', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 99 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '211', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 100 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Frontpage)', + 'data_type_string' => 'ezstring', + 'id' => '212', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (frontpage)', + 'version' => '1', + ), + 101 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '213', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 102 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Frontpage.jpg" suffix="jpg" basename="Woman-Frontpage" dirpath="var/ezwebin_site/storage/images/media/banners/woman-frontpage/214-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-frontpage/214-1-eng-US/Woman-Frontpage.jpg" original_filename="83ea7f16.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Frontpage)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="214" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '214', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 103 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '215', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 104 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '216', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 105 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Products)', + 'data_type_string' => 'ezstring', + 'id' => '217', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (products)', + 'version' => '1', + ), + 106 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '218', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 107 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Products.jpg" suffix="jpg" basename="Woman-Products" dirpath="var/ezwebin_site/storage/images/media/banners/woman-products/219-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-products/219-1-eng-US/Woman-Products.jpg" original_filename="99bedbaa.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Products)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="219" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '219', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 108 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '220', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 109 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '221', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 110 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Partners)', + 'data_type_string' => 'ezstring', + 'id' => '222', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (partners)', + 'version' => '1', + ), + 111 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '223', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 112 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Partners.jpg" suffix="jpg" basename="Woman-Partners" dirpath="var/ezwebin_site/storage/images/media/banners/woman-partners/224-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-partners/224-1-eng-US/Woman-Partners.jpg" original_filename="24ec46f7.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Partners)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="224" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '224', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 113 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '225', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 114 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '226', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 115 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Pencils (Support)', + 'data_type_string' => 'ezstring', + 'id' => '227', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'pencils (support)', + 'version' => '1', + ), + 116 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '228', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 117 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Pencils-Support.jpg" suffix="jpg" basename="Pencils-Support" dirpath="var/ezwebin_site/storage/images/media/banners/pencils-support/229-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/pencils-support/229-1-eng-US/Pencils-Support.jpg" original_filename="50dbb211.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Pencils (Support)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="229" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '229', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 118 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '230', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 119 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '231', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 120 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Training)', + 'data_type_string' => 'ezstring', + 'id' => '232', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (training)', + 'version' => '1', + ), + 121 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '233', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 122 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Training.jpg" suffix="jpg" basename="Woman-Training" dirpath="var/ezwebin_site/storage/images/media/banners/woman-training/234-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-training/234-1-eng-US/Woman-Training.jpg" original_filename="47966db1.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Training)" alias_key="1293033771" timestamp="1311154174"><original attribute_id="234" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '234', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 123 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '235', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 124 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '236', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 125 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Solutions)', + 'data_type_string' => 'ezstring', + 'id' => '237', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (solutions)', + 'version' => '1', + ), + 126 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '238', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 127 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Solutions.jpg" suffix="jpg" basename="Woman-Solutions" dirpath="var/ezwebin_site/storage/images/media/banners/woman-solutions/239-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-solutions/239-1-eng-US/Woman-Solutions.jpg" original_filename="944390f8.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Solutions)" alias_key="1293033771" timestamp="1311154174"><original attribute_id="239" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '239', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 128 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '240', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 129 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '241', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 130 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Home', + 'data_type_string' => 'ezstring', + 'id' => '242', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'home', + 'version' => '1', + ), + 131 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '243', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 132 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '244', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 133 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><line><embed class="highlighted_object" align="center" view="embed" size="medium" custom:offset="0" custom:limit="5" object_id="106"/><embed class="highlighted_object" align="center" view="embed" size="medium" custom:offset="0" custom:limit="5" object_id="107"/><embed class="horizontally_listed_sub_items" align="center" view="embed" size="medium" custom:offset="0" custom:limit="5" object_id="176"/></line><table class="default" width="100%" border="0"><tr><td/><td/></tr><tr><td xhtml:width="50%"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><custom name="factbox" custom:title="Documentation" custom:align="left"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_blank" url_id="23">Technical manual</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_blank" url_id="24">User manual</link></paragraph></li></ul></paragraph></custom></paragraph></td><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><custom name="quote" custom:align="right"><paragraph>If you want to create your own custom site on a solid framework, <link object_id="151">this CMS could be for you</link>".</paragraph></custom></paragraph></td></tr></table></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '245', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 134 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="vertically_listed_sub_items" view="embed" size="medium" custom:offset="0" custom:limit="9" object_id="131"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '246', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 135 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '247', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 136 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '248', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 137 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'rest_api', + 'data_type_string' => 'ezstring', + 'id' => '249', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'rest_api', + 'version' => '1', + ), + 138 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '250', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 139 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="rest_api.png" suffix="png" basename="rest_api" dirpath="var/ezwebin_site/storage/images/media/images/rest_api/251-1-eng-US" url="var/ezwebin_site/storage/images/media/images/rest_api/251-1-eng-US/rest_api.png" original_filename="4d710d81.png" mime_type="image/png" width="442" height="356" alternative_text="" alias_key="1293033771" timestamp="1311154174"><original attribute_id="251" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '251', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 140 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '252', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 141 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Products', + 'data_type_string' => 'ezstring', + 'id' => '253', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'products', + 'version' => '1', + ), + 142 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '60', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '254', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '60', + 'sort_key_string' => '', + 'version' => '1', + ), + 143 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><custom name="factbox" custom:title="Next steps"><paragraph>Vivamus suscipit. Praesent tincidunt adipiscing urna. Etiam ligula velit, tincidunt accumsan, feugiat sit amet, malesuada vel, tellus.</paragraph><paragraph><ol><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Mauris sed lectus vel + </paragraph></li><li><paragraph>Praesent pharetra + </paragraph></li></ol></paragraph></custom></paragraph><section><header>Products sheets</header><paragraph><ul><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Maecenas quam nisi + </paragraph></li></ul></paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '255', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 144 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><section><header>Products by Category</header><paragraph><table class="default" width="100%" border="0"><tr><td><paragraph><ul><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Mauris sed lectus vel + </paragraph></li><li><paragraph>Praesent pharetra + </paragraph></li><li><paragraph>Maecenas quam nisi + </paragraph></li><li><paragraph>Phasellus ut ante eu nunc + </paragraph></li></ul></paragraph></td><td><paragraph><ul><li><paragraph>Donec hendrerit + </paragraph></li><li><paragraph>Vivamus turpis + </paragraph></li><li><paragraph>Vestibulum laoreet erat id tellus + </paragraph></li><li><paragraph>Maecenas quam nisi + </paragraph></li></ul></paragraph></td></tr></table></paragraph><paragraph><custom name="separator"/></paragraph></section><section><header>Featured Products</header><paragraph><table class="default" border="0"><tr><td><paragraph><embed size="medium" align="center" object_id="71"/></paragraph></td><td><paragraph><embed size="medium" align="center" object_id="72"/></paragraph></td><td><paragraph><embed size="medium" align="center" object_id="73"/></paragraph></td></tr></table></paragraph></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '256', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 145 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '257', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 146 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '258', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 147 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '259', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 148 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Software', + 'data_type_string' => 'ezstring', + 'id' => '260', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'software', + 'version' => '1', + ), + 149 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '261', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 150 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '262', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 151 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '263', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 152 => + array ( + 'attribute_original_id' => '264', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '264', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 153 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '265', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 154 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '266', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 155 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'OS Type I', + 'data_type_string' => 'ezstring', + 'id' => '267', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'os type i', + 'version' => '1', + ), + 156 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '268', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 157 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '269', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 158 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '270', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 159 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '69', + 'data_float' => '499', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '271', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '49900', + 'sort_key_string' => '', + 'version' => '1', + ), + 160 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="OS-Type-I.jpg" suffix="jpg" basename="OS-Type-I" dirpath="var/ezwebin_site/storage/images/products/software/os-type-i/272-1-eng-US" url="var/ezwebin_site/storage/images/products/software/os-type-i/272-1-eng-US/OS-Type-I.jpg" original_filename="5a7ae69c.jpg" mime_type="image/jpeg" width="148" height="116" alternative_text="OS Type I" alias_key="1293033771" timestamp="1311154175"><original attribute_id="272" attribute_version="1" attribute_language="eng-US"/><information Height="116" Width="148" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '272', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 161 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>OS Type I</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '273', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 162 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Type" priority="1" default_option_id=""><option id="1" option_id="1" value="Silver" additional_price="10.00"/><option id="2" option_id="2" value="Gold" additional_price="20.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '274', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 163 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '275', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 164 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Boxes', + 'data_type_string' => 'ezstring', + 'id' => '276', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'boxes', + 'version' => '1', + ), + 165 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '277', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 166 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '278', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 167 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '279', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 168 => + array ( + 'attribute_original_id' => '280', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '280', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 169 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '281', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 170 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '282', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 171 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CD/DVD Box I', + 'data_type_string' => 'ezstring', + 'id' => '283', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'cd/dvd box i', + 'version' => '1', + ), + 172 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '284', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 173 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '285', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 174 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius. </paragraph><paragraph>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus venenatis elementum dolor. Praesent velit. Aliquam erat volutpat. Donec auctor. Etiam accumsan libero vel ipsum. Sed ligula turpis, lobortis in, aliquet a, dapibus non, eros. Nunc nulla arcu, pharetra nec, pellentesque at, malesuada quis, diam. Nulla pellentesque volutpat arcu. Vestibulum eros nulla, dignissim id, pulvinar sed, rutrum non, nisl. Quisque id nisi quis dolor suscipit ultrices. Vivamus dapibus tincidunt nunc. Curabitur nec massa nec ipsum tristique accumsan. Praesent tempus. Nunc posuere pretium lectus. Ut magna. </paragraph><paragraph><ol><li><paragraph>Quisque id nisi quis</paragraph></li><li><paragraph>Vivamus dapibus tincidunt</paragraph></li><li><paragraph>Curabitur nec</paragraph></li></ol></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '286', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 175 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '71', + 'data_float' => '199', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '287', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '19900', + 'sort_key_string' => '', + 'version' => '1', + ), + 176 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CD-DVD-Box-I.jpg" suffix="jpg" basename="CD-DVD-Box-I" dirpath="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-i/288-1-eng-US" url="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-i/288-1-eng-US/CD-DVD-Box-I.jpg" original_filename="835c5e5d.jpg" mime_type="image/jpeg" width="150" height="114" alternative_text="CD/DVD Box I" alias_key="1293033771" timestamp="1311154176"><original attribute_id="288" attribute_version="1" attribute_language="eng-US"/><information Height="114" Width="150" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '288', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 177 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>CD/DVD Box I</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '289', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 178 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Cover type" priority="1" default_option_id=""><option id="1" option_id="1" value="Soft" additional_price="10.00"/><option id="2" option_id="2" value="Hard" additional_price="15.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '290', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 179 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '291', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 180 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CD/DVD Box II', + 'data_type_string' => 'ezstring', + 'id' => '292', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'cd/dvd box ii', + 'version' => '1', + ), + 181 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '293', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 182 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '294', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 183 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius. </paragraph><paragraph>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus venenatis elementum dolor. Praesent velit. Aliquam erat volutpat. Donec auctor. Etiam accumsan libero vel ipsum. Sed ligula turpis, lobortis in, aliquet a, dapibus non, eros. Nunc nulla arcu, pharetra nec, pellentesque at, malesuada quis, diam. Nulla pellentesque volutpat arcu. Vestibulum eros nulla, dignissim id, pulvinar sed, rutrum non, nisl. Quisque id nisi quis dolor suscipit ultrices. Vivamus dapibus tincidunt nunc. Curabitur nec massa nec ipsum tristique accumsan. Praesent tempus. Nunc posuere pretium lectus. Ut magna. </paragraph><paragraph><ol><li><paragraph>Quisque id nisi quis</paragraph></li><li><paragraph>Vivamus dapibus tincidunt</paragraph></li><li><paragraph>Curabitur nec</paragraph></li></ol></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '295', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 184 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '72', + 'data_float' => '299', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '296', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '29900', + 'sort_key_string' => '', + 'version' => '1', + ), + 185 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CD-DVD-Box-II.jpg" suffix="jpg" basename="CD-DVD-Box-II" dirpath="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-ii/297-1-eng-US" url="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-ii/297-1-eng-US/CD-DVD-Box-II.jpg" original_filename="f2444e89.jpg" mime_type="image/jpeg" width="152" height="124" alternative_text="CD/DVD Box II" alias_key="1293033771" timestamp="1311154176"><original attribute_id="297" attribute_version="1" attribute_language="eng-US"/><information Height="124" Width="152" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '297', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 186 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>CD/DVD Box II</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '298', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 187 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Cover type" priority="1" default_option_id=""><option id="1" option_id="1" value="Soft" additional_price="10.00"/><option id="2" option_id="2" value="Hard" additional_price="15.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '299', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 188 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '300', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 189 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CD/DVD Box III', + 'data_type_string' => 'ezstring', + 'id' => '301', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'cd/dvd box iii', + 'version' => '1', + ), + 190 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '302', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 191 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '303', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 192 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius. </paragraph><paragraph>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus venenatis elementum dolor. Praesent velit. Aliquam erat volutpat. Donec auctor. Etiam accumsan libero vel ipsum. Sed ligula turpis, lobortis in, aliquet a, dapibus non, eros. Nunc nulla arcu, pharetra nec, pellentesque at, malesuada quis, diam. Nulla pellentesque volutpat arcu. Vestibulum eros nulla, dignissim id, pulvinar sed, rutrum non, nisl. Quisque id nisi quis dolor suscipit ultrices. Vivamus dapibus tincidunt nunc. Curabitur nec massa nec ipsum tristique accumsan. Praesent tempus. Nunc posuere pretium lectus. Ut magna. </paragraph><paragraph><ol><li><paragraph>Quisque id nisi quis</paragraph></li><li><paragraph>Vivamus dapibus tincidunt</paragraph></li><li><paragraph>Curabitur nec</paragraph></li></ol></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '304', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 193 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '73', + 'data_float' => '99', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '305', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '9900', + 'sort_key_string' => '', + 'version' => '1', + ), + 194 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CD-DVD-Box-III.jpg" suffix="jpg" basename="CD-DVD-Box-III" dirpath="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-iii/306-1-eng-US" url="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-iii/306-1-eng-US/CD-DVD-Box-III.jpg" original_filename="eff90c13.jpg" mime_type="image/jpeg" width="150" height="108" alternative_text="CD/DVD Box III" alias_key="1293033771" timestamp="1311154176"><original attribute_id="306" attribute_version="1" attribute_language="eng-US"/><information Height="108" Width="150" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '306', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 195 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>CD/DVD Box III</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '307', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 196 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Cover type" priority="1" default_option_id=""><option id="1" option_id="1" value="Soft" additional_price="10.00"/><option id="2" option_id="2" value="Hard" additional_price="15.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '308', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 197 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '309', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 198 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Products sheets', + 'data_type_string' => 'ezstring', + 'id' => '310', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'products sheets', + 'version' => '1', + ), + 199 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '311', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 200 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '312', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 201 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '313', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 202 => + array ( + 'attribute_original_id' => '314', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '314', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 203 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '315', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 204 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '316', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 205 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Solutions', + 'data_type_string' => 'ezstring', + 'id' => '317', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'solutions', + 'version' => '1', + ), + 206 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '64', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '318', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '64', + 'sort_key_string' => '', + 'version' => '1', + ), + 207 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '319', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 208 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="highlighted_object" size="medium" align="center" object_id="77"/></paragraph><paragraph><table class="default" width="100%" border="0"><tr><td xhtml:width="50%"><paragraph>Solutions by industry:</paragraph><paragraph><ul><li><paragraph>Banking + </paragraph></li><li><paragraph>Automotive + </paragraph></li><li><paragraph>Education + </paragraph></li><li><paragraph>Electronics + </paragraph></li></ul></paragraph></td><td><paragraph>Solutions by business topics:</paragraph><paragraph><ul><li><paragraph><link object_id="76">Web publishing</link></paragraph></li><li><paragraph><link object_id="80">Content management</link></paragraph></li><li><paragraph>Information integration + </paragraph></li><li><paragraph>Enterprise resource + </paragraph></li></ul></paragraph></td></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" object_id="79"/></paragraph><paragraph><embed size="medium" align="center" object_id="78"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '320', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 209 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="itemized_sub_items" size="medium" align="center" object_id="76"/></paragraph><paragraph><embed class="itemized_sub_items" size="medium" align="center" object_id="80"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '321', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 210 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '322', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 211 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '323', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 212 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Web publishing', + 'data_type_string' => 'ezstring', + 'id' => '324', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'web publishing', + 'version' => '1', + ), + 213 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '325', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 214 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '326', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 215 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '327', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 216 => + array ( + 'attribute_original_id' => '328', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '328', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 217 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '329', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 218 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '330', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 219 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Fusce sagittis sagittis', + 'data_type_string' => 'ezstring', + 'id' => '331', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fusce sagittis sagittis', + 'version' => '1', + ), + 220 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '332', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 221 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '333', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 222 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nulla tortor. Suspendisse ut diam in mauris faucibus rutrum. Fusce sagittis sagittis urna. Pellentesque nec quam. Sed pretium, nisi sit amet ornare gravida, neque orci malesuada lacus, et interdum arcu felis ut tellus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '334', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 223 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras molestie. Nulla congue convallis justo. Nulla facilisi. Suspendisse potenti. In hac habitasse platea dictumst. Donec commodo orci sit amet ligula. Nunc purus. Suspendisse quis nibh vel felis consectetuer aliquet. Integer dictum risus id mi. Phasellus eu libero eu tortor adipiscing sagittis. Vivamus tincidunt ligula sed sem. Nullam est. </paragraph><paragraph>Pellentesque consequat orci sit amet erat. Nulla rutrum, elit ut ultricies mollis, sapien est cursus est, vitae malesuada metus lorem eget urna. Mauris viverra. Donec tristique. Proin lectus. Mauris ullamcorper est facilisis libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Praesent et elit eget dolor pretium tempus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus varius. In hac habitasse platea dictumst. Nulla pede purus, fringilla nec, ultrices nec, dignissim sit amet, eros. Cras id est eget mauris dapibus euismod. Nulla ornare. Aenean eu mi. Sed ac purus quis mi sagittis condimentum.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '335', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 224 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '336', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 225 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Fusce-sagittis-sagittis.jpg" suffix="jpg" basename="Fusce-sagittis-sagittis" dirpath="var/ezwebin_site/storage/images/solutions/web-publishing/fusce-sagittis-sagittis/337-1-eng-US" url="var/ezwebin_site/storage/images/solutions/web-publishing/fusce-sagittis-sagittis/337-1-eng-US/Fusce-sagittis-sagittis.jpg" original_filename="cf8327d1.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Fusce sagittis" alias_key="1293033771" timestamp="1311154177"><original attribute_id="337" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '337', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 226 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce sagittis</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '338', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 227 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1174643880', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '339', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174643880', + 'sort_key_string' => '', + 'version' => '1', + ), + 228 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '340', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 229 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '341', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 230 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '342', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 231 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Etiam posuere sodales arcu', + 'data_type_string' => 'ezstring', + 'id' => '343', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'etiam posuere sodales arcu', + 'version' => '1', + ), + 232 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '344', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 233 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '345', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 234 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus sed quam. In hac habitasse platea dictumst. Nam quis magna. Curabitur elit enim, egestas quis, tristique sit amet, pharetra vel, sem. Nullam quam. Quisque in leo. Pellentesque odio nibh, vehicula ut, tristique vel, adipiscing a, sapien.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '346', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 235 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur pretium, lacus ut tincidunt cursus, mauris lorem suscipit ante, in molestie nisl est eget ante. Suspendisse laoreet nunc ac enim. Nullam hendrerit, enim id convallis hendrerit, sapien est tristique nisl, sed varius lorem ante sed est. In hac habitasse platea dictumst. Nunc enim orci, venenatis ac, ornare sit amet, nonummy a, nulla. Nullam quam massa, imperdiet ultrices, tristique et, suscipit ac, lectus. Sed convallis vulputate justo. Praesent nulla pede, vestibulum condimentum, facilisis eu, blandit eu, massa. Etiam posuere sodales arcu. Vivamus sed quam. In hac habitasse platea dictumst. Nam quis magna. Curabitur elit enim, egestas quis, tristique sit amet, pharetra vel, sem. Nullam quam. Quisque in leo. Pellentesque odio nibh, vehicula ut, tristique vel, adipiscing a, sapien. Fusce commodo dolor.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '347', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 236 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '348', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 237 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Etiam-posuere-sodales-arcu.jpg" suffix="jpg" basename="Etiam-posuere-sodales-arcu" dirpath="var/ezwebin_site/storage/images/solutions/web-publishing/etiam-posuere-sodales-arcu/349-1-eng-US" url="var/ezwebin_site/storage/images/solutions/web-publishing/etiam-posuere-sodales-arcu/349-1-eng-US/Etiam-posuere-sodales-arcu.jpg" original_filename="6e62eb23.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Vivamus sed" alias_key="1293033771" timestamp="1311154178"><original attribute_id="349" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '349', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 238 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus sed</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '350', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 239 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1174644060', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '351', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174644060', + 'sort_key_string' => '', + 'version' => '1', + ), + 240 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '352', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 241 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '353', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 242 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '354', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 243 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'In hac habitasse platea', + 'data_type_string' => 'ezstring', + 'id' => '355', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'in hac habitasse platea', + 'version' => '1', + ), + 244 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '356', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 245 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '357', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 246 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras molestie. Nulla congue convallis justo. Nulla facilisi. Suspendisse potenti. In hac habitasse platea dictumst. Donec commodo orci sit amet ligula. Nunc purus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '358', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 247 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur pretium, lacus ut tincidunt cursus, mauris lorem suscipit ante, in molestie nisl est eget ante. Suspendisse laoreet nunc ac enim. Nullam hendrerit, enim id convallis hendrerit, sapien est tristique nisl, sed varius lorem ante sed est. In hac habitasse platea dictumst. Nunc enim orci, venenatis ac, ornare sit amet, nonummy a, nulla. Nullam quam massa, imperdiet ultrices, tristique et, suscipit ac, lectus. Sed convallis vulputate justo. Praesent nulla pede, vestibulum condimentum, facilisis eu, blandit eu, massa. Etiam posuere sodales arcu. Vivamus sed quam. In hac habitasse platea dictumst. Nam quis magna. Curabitur elit enim, egestas quis, tristique sit amet, pharetra vel, sem. Nullam quam. Quisque in leo. Pellentesque odio nibh, vehicula ut, tristique vel, adipiscing a, sapien. Fusce commodo dolor.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '359', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 248 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '360', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 249 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="In-hac-habitasse-platea.jpg" suffix="jpg" basename="In-hac-habitasse-platea" dirpath="var/ezwebin_site/storage/images/solutions/web-publishing/in-hac-habitasse-platea/361-1-eng-US" url="var/ezwebin_site/storage/images/solutions/web-publishing/in-hac-habitasse-platea/361-1-eng-US/In-hac-habitasse-platea.jpg" original_filename="f36b1c32.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="In hac habitasse" alias_key="1293033771" timestamp="1311154178"><original attribute_id="361" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '361', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 250 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>In hac habitasse</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '362', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 251 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1174643640', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '363', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174643640', + 'sort_key_string' => '', + 'version' => '1', + ), + 252 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '364', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 253 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '365', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 254 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '366', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 255 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Content management', + 'data_type_string' => 'ezstring', + 'id' => '367', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'content management', + 'version' => '1', + ), + 256 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '368', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 257 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '369', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 258 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '370', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 259 => + array ( + 'attribute_original_id' => '371', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '371', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 260 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '372', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 261 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '373', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 262 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Fusce sagittis sagittis urna', + 'data_type_string' => 'ezstring', + 'id' => '374', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fusce sagittis sagittis urna', + 'version' => '1', + ), + 263 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '375', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 264 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '376', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 265 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nulla tortor. Suspendisse ut diam in mauris faucibus rutrum. Fusce sagittis sagittis urna. Pellentesque nec quam. Sed pretium, nisi sit amet ornare gravida, neque orci malesuada lacus, et interdum arcu felis ut tellus. Proin ac felis. Duis faucibus, arcu a pretium placerat, ante orci ullamcorper ante, at pharetra tellus justo tincidunt arcu. Sed urna odio, porta sit amet, aliquam a, consectetuer facilisis, leo. Aliquam tempor arcu.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '377', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 266 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '378', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 267 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '379', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 268 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154179"><original attribute_id="380" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '380', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 269 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '381', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 270 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1174645140', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '382', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174645140', + 'sort_key_string' => '', + 'version' => '1', + ), + 271 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '383', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 272 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '384', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 273 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '385', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 274 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Class aptent taciti sociosqu', + 'data_type_string' => 'ezstring', + 'id' => '386', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'class aptent taciti sociosqu', + 'version' => '1', + ), + 275 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '387', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 276 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '388', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 277 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Donec tristique. Proin lectus. Mauris ullamcorper est facilisis libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Praesent et elit eget dolor pretium tempus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus varius. In hac habitasse platea dictumst.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '389', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 278 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '390', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 279 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '391', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 280 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154179"><original attribute_id="392" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '392', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 281 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '393', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 282 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1174645260', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '394', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174645260', + 'sort_key_string' => '', + 'version' => '1', + ), + 283 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '395', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 284 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '396', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 285 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '397', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 286 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Aenean malesuada ligula', + 'data_type_string' => 'ezstring', + 'id' => '398', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'aenean malesuada ligula', + 'version' => '1', + ), + 287 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '399', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 288 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '400', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 289 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aenean malesuada ligula in magna. Donec pellentesque. Ut vulputate nisl. Praesent et ligula eleifend nibh tempus fermentum. Integer metus. Proin et erat id sem feugiat viverra. Nulla facilisi. Sed accumsan augue sed orci. Phasellus porttitor, ipsum at blandit molestie, libero quam ullamcorper justo, a placerat mi tortor vel arcu.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '401', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 290 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '402', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 291 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '403', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 292 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154179"><original attribute_id="404" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '404', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 293 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '405', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 294 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1174645260', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '406', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174645260', + 'sort_key_string' => '', + 'version' => '1', + ), + 295 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '407', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 296 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '408', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 297 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '409', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 298 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Training', + 'data_type_string' => 'ezstring', + 'id' => '410', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'training', + 'version' => '1', + ), + 299 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '63', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '411', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '63', + 'sort_key_string' => '', + 'version' => '1', + ), + 300 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '412', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 301 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><table class="default" width="100%" border="0"><tr><td xhtml:width="49%"><paragraph><embed size="medium" align="center" object_id="85"/></paragraph></td><td/><td xhtml:width="49%"><paragraph><embed size="medium" align="center" object_id="93"/></paragraph></td></tr><tr><td><paragraph><embed size="medium" align="center" object_id="91"/></paragraph></td><td/><td><paragraph><embed size="medium" align="center" object_id="92"/></paragraph></td></tr><tr><td/><td/><td/></tr><tr><td><paragraph><strong>Training by Type:</strong></paragraph><paragraph><ul><li><paragraph>Technical training + </paragraph></li><li><paragraph>Standard exam + </paragraph></li></ul></paragraph><paragraph><strong>Training by Delivery Method:</strong></paragraph><paragraph><ul><li><paragraph>Classroom + </paragraph></li><li><paragraph>Online + </paragraph></li></ul></paragraph></td><td/><td><paragraph><embed class="itemized_sub_items" size="medium" align="center" custom:offset="0" custom:limit="5" object_id="86"/></paragraph></td></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="87"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '413', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 302 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><custom name="factbox" custom:title="Next steps"><paragraph>Vivamus suscipit. Praesent tincidunt adipiscing urna. Etiam ligula velit, tincidunt accumsan, feugiat sit amet, malesuada vel, tellus.</paragraph><paragraph><ol><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Mauris sed lectus vel + </paragraph></li><li><paragraph>Praesent pharetra + </paragraph></li></ol></paragraph></custom></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '414', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 303 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '415', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 304 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '416', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 305 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Certification', + 'data_type_string' => 'ezstring', + 'id' => '417', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'certification', + 'version' => '1', + ), + 306 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '418', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 307 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque iaculis ultrices orci. Ut interdum felis et lacus. Pellentesque eu mi. Vestibulum quis sapien. Donec ut pede.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '419', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 308 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '420', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 309 => + array ( + 'attribute_original_id' => '421', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '421', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 310 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '422', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 311 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '423', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 312 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Professional workshops', + 'data_type_string' => 'ezstring', + 'id' => '424', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'professional workshops', + 'version' => '1', + ), + 313 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '425', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 314 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce quam erat, pulvinar non, semper sit amet, accumsan ut, magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '426', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 315 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '427', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 316 => + array ( + 'attribute_original_id' => '428', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '428', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 317 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '429', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 318 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '430', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 319 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Etiam sodales mauris', + 'data_type_string' => 'ezstring', + 'id' => '431', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'etiam sodales mauris', + 'version' => '1', + ), + 320 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '432', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 321 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '433', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 322 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sed ultrices. Integer tincidunt purus ac leo. Vestibulum nulla lectus, congue vitae, pellentesque sed, adipiscing id, felis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '434', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 323 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vestibulum fermentum turpis sollicitudin turpis. Proin fringilla malesuada odio. Donec quis dui et nibh ultricies nonummy. Nunc in quam. Integer turpis dui, molestie quis, vestibulum id, tincidunt at, metus. Quisque at ipsum. Fusce lectus massa, suscipit id, volutpat eget, sodales ut, massa. Etiam sodales mauris non nulla gravida gravida</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '435', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 324 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '436', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 325 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Etiam-sodales-mauris.jpg" suffix="jpg" basename="Etiam-sodales-mauris" dirpath="var/ezwebin_site/storage/images/training/professional-workshops/etiam-sodales-mauris/437-1-eng-US" url="var/ezwebin_site/storage/images/training/professional-workshops/etiam-sodales-mauris/437-1-eng-US/Etiam-sodales-mauris.jpg" original_filename="7fa13e41.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Etiam sodales" alias_key="1293033771" timestamp="1311154180"><original attribute_id="437" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '437', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 326 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Etiam sodales</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '438', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 327 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1175235780', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '439', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175235780', + 'sort_key_string' => '', + 'version' => '1', + ), + 328 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '440', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 329 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '441', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 330 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '442', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 331 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Class aptent taciti', + 'data_type_string' => 'ezstring', + 'id' => '443', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'class aptent taciti', + 'version' => '1', + ), + 332 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '444', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 333 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '445', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 334 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus venenatis, turpis sed nonummy posuere, lacus diam laoreet magna, vitae fringilla tortor libero at nisi. Cras sodales dolor sed diam. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '446', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 335 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Quisque massa sapien, bibendum vitae, imperdiet in, tempor at, lacus. Morbi eu augue. Nunc sagittis sem vitae risus. Nullam eu dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Sed quis est non massa rhoncus lacinia. Fusce lacus tellus, facilisis condimentum, porttitor pulvinar, laoreet at, nulla. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '447', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 336 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '448', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 337 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Class-aptent-taciti.jpg" suffix="jpg" basename="Class-aptent-taciti" dirpath="var/ezwebin_site/storage/images/training/professional-workshops/class-aptent-taciti/449-1-eng-US" url="var/ezwebin_site/storage/images/training/professional-workshops/class-aptent-taciti/449-1-eng-US/Class-aptent-taciti.jpg" original_filename="579f544b.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Class aptent" alias_key="1293033771" timestamp="1311154180"><original attribute_id="449" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '449', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 338 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Class aptent</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '450', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 339 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1175236020', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '451', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175236020', + 'sort_key_string' => '', + 'version' => '1', + ), + 340 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '452', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 341 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '453', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 342 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '454', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 343 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Duis auctor vehicula erat', + 'data_type_string' => 'ezstring', + 'id' => '455', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'duis auctor vehicula erat', + 'version' => '1', + ), + 344 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '456', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 345 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '457', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 346 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis tincidunt, massa non rhoncus luctus, nunc metus pellentesque ante, sed tincidunt nisi lorem nec ligula. </paragraph><paragraph>Proin congue rutrum odio. Pellentesque cursus, nisl nec eleifend fermentum, lectus tortor aliquam tortor, nec semper ante nisi at risus. Duis mi lorem, porta quis, congue eget, varius sit amet, mi. Quisque augue. Duis auctor vehicula erat. Vivamus laoreet dictum velit. Cras vitae odio a quam bibendum lobortis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '458', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 347 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '459', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 348 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '460', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 349 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Duis-auctor-vehicula-erat.jpg" suffix="jpg" basename="Duis-auctor-vehicula-erat" dirpath="var/ezwebin_site/storage/images/training/professional-workshops/duis-auctor-vehicula-erat/461-1-eng-US" url="var/ezwebin_site/storage/images/training/professional-workshops/duis-auctor-vehicula-erat/461-1-eng-US/Duis-auctor-vehicula-erat.jpg" original_filename="15509f33.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Duis auctor" alias_key="1293033771" timestamp="1311154181"><original attribute_id="461" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '461', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 350 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis auctor</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '462', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 351 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1175236920', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '463', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175236920', + 'sort_key_string' => '', + 'version' => '1', + ), + 352 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '464', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 353 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '465', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 354 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '466', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 355 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '316', + 'contentobject_id' => '90', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Events and seminars', + 'data_type_string' => 'ezstring', + 'id' => '467', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'events and seminars', + 'version' => '1', + ), + 356 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '317', + 'contentobject_id' => '90', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '468', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 357 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '318', + 'contentobject_id' => '90', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '0', + 'data_type_string' => 'ezselection', + 'id' => '469', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '0', + 'version' => '1', + ), + 358 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Self-paced courses', + 'data_type_string' => 'ezstring', + 'id' => '470', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'self-paced courses', + 'version' => '1', + ), + 359 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '471', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 360 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis sollicitudin neque.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '472', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 361 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '473', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 362 => + array ( + 'attribute_original_id' => '474', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '474', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 363 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '475', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 364 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '476', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 365 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Instructor-led courses', + 'data_type_string' => 'ezstring', + 'id' => '477', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'instructor-led courses', + 'version' => '1', + ), + 366 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '478', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 367 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nunc a purus. Nunc quis urna at diam sodales fermentum. Sed mauris tortor, gravida ac, consequat sed.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '479', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 368 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '480', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 369 => + array ( + 'attribute_original_id' => '481', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '481', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 370 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '482', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 371 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '483', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 372 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Additional learning resources', + 'data_type_string' => 'ezstring', + 'id' => '484', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'additional learning resources', + 'version' => '1', + ), + 373 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '485', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 374 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce bibendum nisi sed mauris. Morbi mi tellus, porta ac, vulputate ac, interdum et, dolor.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '486', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 375 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '487', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 376 => + array ( + 'attribute_original_id' => '488', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '488', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 377 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '489', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 378 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '490', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 379 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support', + 'data_type_string' => 'ezstring', + 'id' => '491', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'support', + 'version' => '1', + ), + 380 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '62', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '492', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '62', + 'sort_key_string' => '', + 'version' => '1', + ), + 381 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><custom name="factbox" custom:title="Self Support"><paragraph>Vivamus suscipit. Praesent tincidunt adipiscing urna. Etiam ligula velit, tincidunt accumsan, feugiat sit amet, malesuada vel, tellus.</paragraph><paragraph><ul><li><paragraph><link object_id="98">Documentation</link></paragraph></li><li><paragraph><link object_id="95">Knowledgebase</link></paragraph></li></ul></paragraph></custom></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '493', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 382 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><table class="default" width="100%" border="0"><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="101"/></paragraph></td><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="103"/></paragraph></td></tr><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="104"/></paragraph></td><td/></tr><tr><td/><td/></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="102"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '494', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 383 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '495', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 384 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '496', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 385 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '497', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 386 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Knowledgebase', + 'data_type_string' => 'ezstring', + 'id' => '498', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'knowledgebase', + 'version' => '1', + ), + 387 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Mauris in est. Mauris fringilla egestas nisl. Vestibulum commodo tristique mi. Morbi congue. Aliquam erat volutpat. Donec pharetra. Maecenas at nibh. Proin adipiscing vehicula nisi. Aliquam interdum erat et urna. Integer quis felis gravida est bibendum iaculis. Etiam nec quam quis nisi euismod dictum. Proin ut diam ut metus condimentum posuere. Praesent id ligula vitae felis lacinia feugiat. Ut dictum hendrerit nunc. Cras magna nisl, auctor non, varius non, laoreet ac, orci. In pellentesque aliquam pede. Nam metus magna, porta ut, feugiat eget, consectetuer sit amet, elit. Vivamus ac orci vitae nunc facilisis consequat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '499', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 388 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '500', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 389 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '501', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 390 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Sed suscipit', + 'data_type_string' => 'ezstring', + 'id' => '502', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'sed suscipit', + 'version' => '1', + ), + 391 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '503', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 392 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '504', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 393 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '505', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 394 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ut interdum', + 'data_type_string' => 'ezstring', + 'id' => '506', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ut interdum', + 'version' => '1', + ), + 395 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Etiam nec metus. Proin mauris lorem, lobortis dapibus, semper id, nonummy eu, lacus. Aliquam erat volutpat. Vivamus hendrerit aliquam ipsum. Maecenas suscipit ante sit amet risus. Nullam lacus. Praesent varius imperdiet sapien. Nulla sit amet massa nonummy felis aliquam varius. Vivamus sed arcu. Mauris sodales tristique risus. Cras sed sem. Quisque est eros, lacinia id, placerat sit amet, varius ac, odio. Aenean placerat, justo eu laoreet laoreet, purus quam faucibus risus, vel accumsan mauris ligula in magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '507', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 396 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '508', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 397 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '509', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 398 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Documentation', + 'data_type_string' => 'ezstring', + 'id' => '510', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'documentation', + 'version' => '1', + ), + 399 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vestibulum ultricies lorem sed pede. Donec massa. Cras imperdiet, lectus mollis rhoncus gravida, enim lacus iaculis libero, consectetuer lobortis sapien purus nec purus. Donec nulla dui, commodo et, porttitor eu, malesuada id, nisi. Cras in mi in dolor ultricies pretium. Curabitur pellentesque auctor ligula. Suspendisse malesuada, nunc a tempor lacinia, lectus turpis commodo urna, eu porta risus nisl nec dui. Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '511', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 400 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '512', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 401 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '513', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 402 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Mauris pretium', + 'data_type_string' => 'ezstring', + 'id' => '514', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'mauris pretium', + 'version' => '1', + ), + 403 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Praesent pretium mi eget odio. Nunc sed lectus eget purus eleifend mattis. Vivamus aliquam, metus quis rutrum venenatis, mi felis tempus ipsum, sed varius metus erat eget leo. Ut fringilla, urna vel consectetuer dignissim, tellus ante mattis quam, semper scelerisque nulla tortor eu enim. Vivamus tortor. Donec eleifend fringilla dui. Nullam semper interdum ipsum. Proin quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea dictumst. Mauris pretium posuere justo. Proin vestibulum cursus odio. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '515', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 404 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '516', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 405 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '517', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 406 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Aliquam posuere', + 'data_type_string' => 'ezstring', + 'id' => '518', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'aliquam posuere', + 'version' => '1', + ), + 407 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nam at nulla id lectus vehicula sollicitudin. Nullam lobortis facilisis mi. In hac habitasse platea dictumst. Aliquam dignissim iaculis est. Mauris egestas. Phasellus at mi. Mauris pede libero, accumsan vel, tristique eget, tempus sit amet, sapien. Fusce sed arcu. Pellentesque pharetra mattis velit. In nec eros. Praesent viverra metus ut tellus. In tellus elit, imperdiet at, tincidunt egestas, malesuada sed, nisl. Aliquam posuere mattis pede. Curabitur lacinia condimentum nunc. Phasellus mattis. Fusce ac pede. Ut in neque. Fusce adipiscing mi sit amet velit. Cras varius. Vivamus elementum dui id lectus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '519', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 408 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '520', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 409 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '521', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 410 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Books', + 'data_type_string' => 'ezstring', + 'id' => '522', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'books', + 'version' => '1', + ), + 411 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '523', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 412 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Quisque fringilla hendrerit turpis. Curabitur suscipit blandit nulla. Sed mauris justo, iaculis vel, dictum ut, molestie et, purus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '524', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 413 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce ut risus. Nulla mauris magna, vulputate quis, dignissim vel, lobortis ut, neque. Etiam sed ante. Curabitur in dolor nec tellus consequat gravida. Proin faucibus viverra eros. Suspendisse fringilla. Etiam eget elit eu augue euismod lobortis. Sed urna elit, volutpat vel, ultricies id, molestie a, ligula. In cursus nonummy quam. Sed malesuada iaculis magna. Curabitur mollis vehicula nibh. Curabitur at orci at leo vulputate vestibulum. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '525', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 414 => + array ( + 'attribute_original_id' => '526', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '526', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 415 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '527', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 416 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '528', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 417 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Aliquam pulvinar suscipit tellus', + 'data_type_string' => 'ezstring', + 'id' => '529', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'aliquam pulvinar suscipit tellus', + 'version' => '1', + ), + 418 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '530', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 419 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '531', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 420 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras sollicitudin dolor eget sapien. Etiam sit amet tortor sit amet tortor adipiscing ultricies. Aliquam pulvinar suscipit tellus. Suspendisse sed magna. In vulputate erat. Nulla vel augue. Aenean magna. Phasellus vestibulum auctor nisi. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '532', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 421 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nam laoreet, orci vitae tempor porttitor, mauris tellus blandit sapien, ac dignissim massa ipsum dignissim eros. Ut a urna. Aliquam consequat mollis eros.</paragraph><paragraph>In in ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque sodales tortor. Phasellus adipiscing pretium nibh. Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Praesent eu quam. Nam sollicitudin congue augue. Nulla facilisi. Nunc in turpis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '533', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 422 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '534', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 423 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Aliquam-pulvinar-suscipit-tellus.jpg" suffix="jpg" basename="Aliquam-pulvinar-suscipit-tellus" dirpath="var/ezwebin_site/storage/images/support/books/aliquam-pulvinar-suscipit-tellus/535-1-eng-US" url="var/ezwebin_site/storage/images/support/books/aliquam-pulvinar-suscipit-tellus/535-1-eng-US/Aliquam-pulvinar-suscipit-tellus.jpg" original_filename="7bf18646.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Aliquam pulvinar" alias_key="1293033771" timestamp="1311154184"><original attribute_id="535" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '535', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 424 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam pulvinar</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '536', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 425 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1175496180', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '537', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175496180', + 'sort_key_string' => '', + 'version' => '1', + ), + 426 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '538', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 427 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '539', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 428 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '540', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 429 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Customer Service', + 'data_type_string' => 'ezstring', + 'id' => '541', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'customer service', + 'version' => '1', + ), + 430 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '542', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 431 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis non nulla non enim tempus tempor. Donec diam diam, consectetuer sit amet, imperdiet ac, consectetuer at, massa. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '543', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 432 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Phasellus vitae est. Proin tellus leo, accumsan ut, ullamcorper non, sagittis vitae, elit. Suspendisse placerat luctus ligula. Nunc turpis elit, vulputate nec, vehicula ac, tempor et, ipsum. Maecenas dignissim rutrum ante. Sed ultrices, quam et nonummy vulputate, massa dolor mattis risus, at tempus nibh est eu ipsum. Sed lacus dui, luctus at, iaculis vel, scelerisque vel, sem. Vivamus tellus justo, fermentum et, lobortis et, lobortis euismod, augue. Etiam cursus varius ligula. Quisque pharetra. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '544', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 433 => + array ( + 'attribute_original_id' => '545', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '545', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 434 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '546', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 435 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '547', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 436 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support Programs', + 'data_type_string' => 'ezstring', + 'id' => '548', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'support programs', + 'version' => '1', + ), + 437 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '549', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 438 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Mauris in est. Mauris fringilla egestas nisl. Vestibulum commodo tristique mi. Morbi congue. Aliquam erat volutpat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '550', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 439 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Donec pharetra. Maecenas at nibh. Proin adipiscing vehicula nisi. Aliquam interdum erat et urna. Integer quis felis gravida est bibendum iaculis. Etiam nec quam quis nisi euismod dictum. Proin ut diam ut metus condimentum posuere. Praesent id ligula vitae felis lacinia feugiat. Ut dictum hendrerit nunc. Cras magna nisl, auctor non, varius non, laoreet ac, orci. In pellentesque aliquam pede. Nam metus magna, porta ut, feugiat eget, consectetuer sit amet, elit. Vivamus ac orci vitae nunc facilisis consequat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '551', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 440 => + array ( + 'attribute_original_id' => '552', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '552', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 441 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '553', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 442 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '554', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 443 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Getting started', + 'data_type_string' => 'ezstring', + 'id' => '555', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'getting started', + 'version' => '1', + ), + 444 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '556', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 445 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '557', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 446 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '558', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 447 => + array ( + 'attribute_original_id' => '559', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '559', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 448 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '560', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 449 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '561', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 450 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Tutorials for', + 'data_type_string' => 'ezstring', + 'id' => '562', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'tutorials for', + 'version' => '1', + ), + 451 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '563', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 452 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '564', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 453 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><table class="default" width="100%" border="0" custom:summary="tutorials"><tr><td><paragraph align="left"><strong><strong>new to eZ Publish users</strong></strong></paragraph></td><td><paragraph align="left"><strong>experienced users</strong></paragraph></td></tr><tr><td align="center"/><td align="center"/></tr><tr><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="108"/></paragraph></td><td><paragraph><link target="_blank" url_id="16">How to develop eZ Publish Extensions</link></paragraph></td></tr><tr><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="202"/></paragraph></td><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="17">How to create custom workflow</link></paragraph></td></tr><tr><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="127"/></paragraph></td><td><paragraph><link target="_blank" url_id="18">How to use REST API interface</link></paragraph></td></tr><tr><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="13">eZ Publish Administration Interface</link></paragraph></td><td><paragraph><link target="_blank" url_id="19">Asynchronous publishing</link></paragraph></td></tr><tr><td><paragraph><link target="_blank" url_id="14">eZ Publish Online Editor Video</link></paragraph></td><td><paragraph><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="130"/></paragraph></td></tr><tr><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="15">eZ Flow Video Tutorial</link></paragraph></td><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="20">Upgrading to 4.5</link></paragraph></td></tr><tr><td xhtml:colspan="2"/></tr><tr><td xhtml:colspan="2" align="right"><paragraph align="right"><strong>more <link target="_blank" url_id="21">tutorials</link> and <link target="_blank" url_id="22">videos</link></strong></paragraph></td></tr></table></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '565', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 454 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '566', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 455 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '567', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 456 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154185"><original attribute_id="568" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '568', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 457 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '569', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 458 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '570', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 459 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '571', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 460 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '572', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 461 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '573', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 462 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Get involved', + 'data_type_string' => 'ezstring', + 'id' => '574', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'get involved', + 'version' => '1', + ), + 463 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '575', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 464 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '576', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 465 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="25">Forums</link>,&nbsp;<link target="_blank" url_id="26">Blogs</link>,&nbsp;<link target="_blank" url_id="27">Twitter</link>,&nbsp;<link target="_blank" url_id="28">LinkedIn</link></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '577', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 466 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>[<link target="_self" anchor_name="contact" url_id="29">contact</link>] [<link target="_self" anchor_name="share" url_id="29">share</link>] [<link target="_self" anchor_name="develop" url_id="29">develop</link>]</paragraph><paragraph>If you want to get involved in the eZ Community\'s life, help, be helped, share and participate, this page is for you. It gives you a list of hints and tricks on how to actually get involved.</paragraph><paragraph>Make sure you also read the&nbsp;<link target="_self" url_id="30">Etiquette, blogging and usage guidelines</link></paragraph><paragraph><anchor name="contact"/></paragraph><paragraph><anchor name="eztoc772_1"/></paragraph><paragraph><anchor name="eztoc1010_1_1"/></paragraph><paragraph><anchor name="eztoc1031_0_1_1"/></paragraph><section><section><section><section><header>Contact</header><paragraph>Should anything be unclear ( after having read through the following :) ), or if you would like to ask a question, feel free to send an email to community@ez.no.</paragraph><paragraph><anchor name="share"/></paragraph><paragraph><anchor name="eztoc772_2"/></paragraph><paragraph><anchor name="eztoc1010_1_2"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2"/></paragraph></section></section></section></section><section><section><section><section><header>Sharing</header><paragraph><anchor name="eztoc772_2_1"/></paragraph><paragraph><anchor name="eztoc1010_1_2_1"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_1"/></paragraph><section><header>Forums</header><paragraph>From&nbsp;<link target="_self" xhtml:title="eZ Community forums" url_id="25">http://share.ez.no/forums</link>, you can pick one of the existing forums and ask a question, make a remark, answers others\' questions, or simply read through, looking for a bit of information. The following forums are available:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="31">Install & configuration</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="32">Setup & design</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="33">General</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="34">Developer</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="35">Suggestions</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="36">Extensions</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>The "Extensions" forum is broken down into extension-specific subforums:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="37">eZ Newsletter</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="38">Website Interface</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="39">eZ Flow</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="40">eZ Find</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>One forum is dedicated to translators and linguists translating eZ Publish :</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" xhtml:title="Forum dedicated to translators" url_id="41">Translations</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>One forum is dedicated to local eZ Publish communities who do not have a dedicated platform and would like to share in their native language :</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" xhtml:title="Localized forums" url_id="42">Localized forums</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>A last forum welcomes suggestions for this portal:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="43">Feedback and ideas for this portal</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>It is often used in conjunction with the&nbsp;<link target="_blank" xhtml:title="Issue tracker for the Community Portal" url_id="44">share.ez.no-dedicated issue tracker</link>&nbsp;(not to be confused with the&nbsp;<link target="_blank" xhtml:title="General eZ Publish issue tracker" url_id="45">general eZ Publish issue tracker</link>).</paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_2"/></paragraph><paragraph><anchor name="eztoc1010_1_2_2"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_2"/></paragraph></section><section><header>Your experience through an article or tutorial</header><paragraph>The&nbsp;<link target="_self" xhtml:title="eZ Community Articles" url_id="46">Articles</link>&nbsp;and&nbsp;<link target="_self" xhtml:title="eZ Community Tutorials" url_id="47">Tutorials</link>&nbsp;sections are gold mines of useful, practical information on eZ Publish and eZ Software usage. You may be willing to contribute to growing the amount of common gold by sharing one of your experiences, right here. Read more on this here :<link target="_self" url_id="48">Share your experience, write a tutorial for the Community</link>.</paragraph><paragraph><anchor name="IRC"/></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_3"/></paragraph><paragraph><anchor name="eztoc1010_1_2_3"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_3"/></paragraph></section><section><header>Live chat on IRC</header><paragraph>Two channels are dedicated to live chat (mostly around eZ Publish and eZ Components), here they are :</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">eZ Publish room:&nbsp;<link target="_self" anchor_name="ezpublish" url_id="49">irc://irc.freenode.net/#ezpublish</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">eZ Components room:&nbsp;<link target="_self" anchor_name="zetacomponents" url_id="49">irc://irc.freenode.net/#zetacomponents</link></paragraph></li></ul></paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Feel free and join the chat. Usually there is a number of people willing to help you out with your problem or discuss features.&nbsp;</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">You need an&nbsp;<link target="_self" anchor_name="Clients" url_id="50">IRC Client</link>&nbsp;for joining the channel. Here is an indicative list of popular IRC clients :</line></paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="51">XChat</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="52">mIRC</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="53">Pidgin</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="54">Colloquy</link></paragraph></li></ul></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_4"/></paragraph><paragraph><anchor name="eztoc1010_1_2_4"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_4"/></paragraph></section><section><header>Blogging</header><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">A central blog planet is aggregating many community members\' blogs:<link target="_blank" xhtml:title="Planet eZ Publish" url_id="55">http://planetezpublish.org/</link>&nbsp;(available through&nbsp;<link target="_blank" xhtml:title="planetezpublish RSS feed" url_id="56">RSS</link>&nbsp;).</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Local initiatives exists, among them the french-speaking blog-planet :&nbsp;<link target="_blank" xhtml:title="French eZ Publish blog planet" url_id="57">http://www.planet-ezpublish.fr/</link>.</line></paragraph><paragraph>Atop, this platform will soon open to public blogging, stay tuned.</paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_5"/></paragraph><paragraph><anchor name="eztoc1010_1_2_5"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_5"/></paragraph></section><section><header>Mailing-lists</header><paragraph>Feel free to register on the eZ Community mailing-list. You can do so here :<link target="_blank" xhtml:title="eZ Community mailing-list" url_id="58">http://lists.ez.no/mailman/listinfo/sdk-public</link>. It serves as a community support channel, obviously less responsive than IRC or twitter, but more persistent, which can be preferred in some cases.</paragraph><paragraph>Another mailing-list helps you see pass by every commit messages on eZ Publish\'s development trunk. If you are eager to see one specific feature implemented, or simply like to be updated with the bleeding-edge, vip status of eZ Publish, you should subscribe to that one :&nbsp;<link target="_blank" url_id="59">http://lists.ez.no/mailman/listinfo/sdk-svn</link></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_6"/></paragraph><paragraph><anchor name="eztoc1010_1_2_6"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_6"/></paragraph></section><section><header>RSS</header><paragraph><anchor name="RSS"/></paragraph><paragraph>Follow the eZ Community activity through RSS. Here are the feeds at your disposal:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">All forums (topics & replies):&nbsp;<link target="_self" url_id="60">http://share.ez.no/rss/feed/all_forums</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forum topics ONLY :&nbsp;<link target="_self" xhtml:title="RSS feed for forum topics ONLY" url_id="61">http://share.ez.no/rss/feed/forum_topics_only</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Articles and Tutorials :&nbsp;<link target="_self" url_id="62">http://share.ez.no/rss/feed/articles</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Blogs :&nbsp;<link target="_self" url_id="63">http://share.ez.no/rss/feed/blogs</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Developer :&nbsp;<link target="_self" url_id="64">http://share.ez.no/rss/feed/forums_developer</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Discussions :&nbsp;<link target="_self" url_id="65">http://share.ez.no/rss/feed/forums_discussions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Extensions :&nbsp;<link target="_self" url_id="66">http://share.ez.no/rss/feed/forums_extensions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Feedback :&nbsp;<link target="_self" url_id="67">http://share.ez.no/rss/feed/forums_feedback</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > General :&nbsp;<link target="_self" url_id="68">http://share.ez.no/rss/feed/forums_general</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Install and Configuration :<link target="_self" url_id="69">http://share.ez.no/rss/feed/forums_install_and_configuration</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Setup and Design :&nbsp;<link target="_self" url_id="70">http://share.ez.no/rss/feed/forums_setup_and_design</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Suggestions :&nbsp;<link target="_self" url_id="71">http://share.ez.no/rss/feed/forums_suggestions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Translation :&nbsp;<link target="_self" xhtml:title="Translation related forum" url_id="72">http://share.ez.no/rss/feed/forums_translation</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Projects :&nbsp;<link target="_self" url_id="73">http://share.ez.no/rss/feed/projects</link></paragraph></li></ul></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_7"/></paragraph><paragraph><anchor name="eztoc1010_1_2_7"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_7"/></paragraph></section><section><header>Social networks</header><paragraph>Stay tuned on the portal\'s activity by following&nbsp;<link target="_blank" xhtml:title="eZ Publish Community on twitter" url_id="27">@ezcommunity</link>. Also, cool instant pings happen on Twitter, where many community members are active. Feel free to join this sphere, and the first step could be to follow this Twitter list :&nbsp;<link target="_blank" xhtml:title="eZ Community members on Twitter" url_id="74">http://twitter.com/i_robin/cms-ezpublish/members</link>.</paragraph><paragraph>The eZ Publish Community is also gathered on LinkedIn, swing by&nbsp;<link target="_blank" xhtml:title="eZ Ecosystem on LinkedIn" url_id="28">there</link>!</paragraph><paragraph>Some&nbsp;<link target="_blank" xhtml:title="Google Wave" url_id="75">Waves</link>&nbsp;also got attention from the community members. One way to see them is to search, from Google Wave, the following: "with:public ezpublish". So come by and wave on with us. In case you need an invitation, drop a word here :<link target="_self" url_id="76">http://share.ez.no/forums/general/ez-publish-on-google-wave</link>.</paragraph><paragraph><anchor name="develop"/>[<link target="_self" xhtml:title="Back to top" anchor_name="top" url_id="29">back to top</link>]</paragraph><paragraph><anchor name="eztoc772_3"/></paragraph><paragraph><anchor name="eztoc1010_1_3"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3"/></paragraph></section></section></section></section></section><section><section><section><section><header>Developing</header><paragraph><anchor name="eztoc772_3_8"/></paragraph><paragraph><anchor name="eztoc1010_1_3_8"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_8"/></paragraph><section><header>Collaborative development</header><paragraph>You have developed a cool extension for eZ Publish ? You would like to share it, and get other community members to help you push it ahead ? Then you should visit<link target="_blank" xhtml:title="eZ Community projects" url_id="77">http://projects.ez.no</link>&nbsp;and open-source it there. You can log in with your ez.no account (the same as your share.ez.no account), and create a new project there. You may want to first check that no similar extension already exists, in which case you would probably prefer joining the existing team and tell about your ideas, suggestions and already crafted code.</paragraph><paragraph>This platform gives every project a simple collaborative development sandbox:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">forums</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a subversion repository</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a news wall</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a home page</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a rating system for people to praise or blame</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">galleries for screenshots</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a download section</paragraph></li></ul></paragraph><paragraph><anchor name="doc"/></paragraph><paragraph><anchor name="eztoc772_3_9"/></paragraph><paragraph><anchor name="eztoc1010_1_3_9"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_9"/></paragraph></section><section><header>Documentation</header><paragraph>Online documentation helps you in your daily development and administration tasks. The official documentation for eZ Publish is available at&nbsp;<link target="_blank" xhtml:title="eZ Publish documentation" url_id="9">http://doc.ez.no</link>. A community initiative,<link target="_blank" xhtml:title="ez Publish community documentation" url_id="78">http://ezpedia.org</link>, comes as a relevant and handy knowledge base, very complimentary to the online documentation. The eZ Publish API documentation is&nbsp;<link target="_blank" xhtml:title="eZ Publish API documentation" url_id="79">here</link>, and the official documentation for the Apache Zeta Components (formerly known as eZ Components) lies<link target="_blank" xhtml:title="Apache Zeta Components" url_id="80">here</link>. The Apache Zeta Components serve nowadays, in many places, as base libraries for eZ Publish, and are a generally high-quality set of libraries for web application development.</paragraph><paragraph>&nbsp;<anchor name="eztoc772_3_10"/></paragraph><paragraph><anchor name="eztoc1010_1_3_10"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_10"/></paragraph></section><section><header>Trunk, testing and sending feedback</header><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">For every eZ Publish release, the usual alpha-beta-rc countdown should happen, and the eZ Community will be in first line to check these pre-release versions of eZ Publish Community Project and push feedback on them.</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">On top of these regular fevers, on a daily basis you may want to report issues found on eZ Publish, as well as propose enhancements. And this happens here :<link target="_blank" xhtml:title="eZ Publish general issue tracker" url_id="81">http://issues.ez.no/ezpublish</link>.</line></paragraph><paragraph>You can as well follow every step of eZ Publish\'s development by checking out the trunk version of it. It is hosted on a Github server. All you need is to visit&nbsp;<link target="_blank" xhtml:title="eZ Publish Community Project\'s github repository" url_id="82">eZ Publish Community Project\'s github repository</link>, and enjoy :)</paragraph><paragraph>&nbsp;<anchor name="eztoc772_3_11"/></paragraph><paragraph><anchor name="eztoc1010_1_3_11"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_11"/></paragraph></section><section><header>Translation and localisation</header><paragraph>A central community translation initiative is hosted here<link target="_blank" xhtml:title="Community Translation Initiative" url_id="83">http://projects.ez.no/ezpublish_translation</link>. The homepage of the project gives you all necessary details to get involved in translating eZ Publish into your preferred language. If you feel you have a linguist soul, or simply are fed up with not being able to use eZ Publish in your native language, this initiative is for you!</paragraph></section></section></section></section></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '578', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 467 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '579', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 468 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154185"><original attribute_id="580" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '580', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 469 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '581', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 470 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '582', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 471 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '583', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 472 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '584', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 473 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '585', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 474 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to use eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '586', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to use ez publish', + 'version' => '1', + ), + 475 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '587', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 476 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '588', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 477 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish comes with a multitude of features out of the box, ensuring that you can quickly put your content online.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '589', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 478 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Publish content from your web browser</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Publish content from word processors</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Translate your content</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Upload multiple files at once</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Picture galleries</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Video publishing</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Web 2.0 features</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Search</paragraph></li></ul></paragraph><section><section><header>Publish content from your web browser</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="109"/></paragraph><paragraph>With eZ Publish, you can publish content like articles, pictures and files directly from your web browser, using the Website Toolbar.</paragraph><paragraph>This toolbar appears when you log in and enables you to publish, move, replace or translate any kind of content.</paragraph><paragraph>The Online Editor is a WYSIWYG editor integrated into the website (no HTML coding required), providing formatting functions similar to word processing applications.</paragraph></section></section><section><section><header>Publish content from your favourite word processor</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="110"/></paragraph><paragraph>Many content managers prefer working directly in Microsoft Word or Open Office. The import / export feature enables you to create or edit site content in your favorite word processor, even when you might not have Internet access.</paragraph><paragraph>Afterwards, you can upload the document through either a WebDAV client or the front-end of your site to generate or update articles, documentation pages and so on.</paragraph></section></section><section><section><header>Translate your content</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="111"/></paragraph><paragraph>All content in eZ Publish can be translated to multiple languages. Having only one website to administer is efficient and makes it easier to maintain a consistent brand across languages and countries.</paragraph><paragraph>An international corporation or organization can have one website with content in several languages. When a visitor selects a language, the menus and content are displayed accordingly. If you have not yet translated specific content, it will be shown in the source language or not at all (depending on your configuration).</paragraph><paragraph>When you are editing content, you can choose to switch the language you are currently editing or to translate from one language to another. Content in the source language is shown when you are translating, to aid in the process. When creating or updating content translations, you can also use the built-in content “diff” functionality to see the added or removed text in the source language.</paragraph><paragraph>Multiple, multilingual URLs can be created for each page. By default, you can have an object called "Easy" with a URL "/easy" but also create a French translation with a URL "/facile".</paragraph></section></section><section><section><header>&nbsp;Upload multiple files at once</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="112"/></paragraph><paragraph>If you want to upload more than one document, picture or video at a time, eZ Publish has multi-upload functionality.</paragraph><paragraph>You simply select the content you want from your computer or from the server where your content is stored. eZ Publish can detect the type of content uploaded and creates the appropriate web pages.</paragraph></section></section><section><section><header>Picture galleries</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="113"/></paragraph><paragraph>eZ Publish makes it easy to create picture galleries. With the multi-upload functionality, you can add many pictures at once, then eZ Publish will scale, format and resize the pictures automatically.</paragraph><paragraph>You can then browse through the galleries and re-use images elsewhere in your website.</paragraph></section></section><section><section><header>Video publishing</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="114"/></paragraph><paragraph>Basically, a video is another type of content you or users of your website can publish. You can use eZ Publish to store and display any video format for web TV functionality or video publishing similar to Youtube.</paragraph></section></section><section><section><header>Web 2.0 features</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="115"/></paragraph><paragraph>Tag clouds, blogs, forums and polls are all built-in eZ Publish features. Make your users contribute and build communities.</paragraph></section></section><section><section><header>Search</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="116"/></paragraph><paragraph>To find any content on your eZ Publish site, you can use the integrated search engine in eZ Publish. To add more functionality and scale high-loaded websites, <link url_id="84">eZ Find</link> is an enterprise search extension for eZ Publish.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '590', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 479 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '591', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 480 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-use-eZ-Publish.jpg" suffix="jpg" basename="How-to-use-eZ-Publish" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/592-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/592-1-eng-US/How-to-use-eZ-Publish.jpg" original_filename="affa2705.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154185"><original attribute_id="592" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '592', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 481 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '593', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 482 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '594', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 483 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '595', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 484 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '596', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 485 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '597', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 486 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '598', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 487 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '599', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 488 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics1/600-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics1/600-1-eng-US/graphics1.jpg" original_filename="c6a49b95.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="600" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '600', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 489 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '601', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 490 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '602', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 491 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '603', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 492 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics12/604-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics12/604-1-eng-US/graphics1.jpg" original_filename="afc64b77.jpg" mime_type="image/jpeg" width="540" height="357" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="604" attribute_version="1" attribute_language="eng-US"/><information Height="357" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '604', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 493 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '605', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 494 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '606', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 495 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '607', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 496 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics13/608-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics13/608-1-eng-US/graphics1.jpg" original_filename="ccb0f9f7.jpg" mime_type="image/jpeg" width="540" height="419" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="608" attribute_version="1" attribute_language="eng-US"/><information Height="419" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '608', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 497 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '609', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 498 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '610', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 499 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '611', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 500 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics14/612-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics14/612-1-eng-US/graphics1.jpg" original_filename="be2fb4a2.jpg" mime_type="image/jpeg" width="540" height="404" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="612" attribute_version="1" attribute_language="eng-US"/><information Height="404" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '612', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 501 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '613', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 502 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '614', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 503 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '615', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 504 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics15/616-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics15/616-1-eng-US/graphics1.jpg" original_filename="2db91653.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="616" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '616', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 505 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '617', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 506 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '618', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 507 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '619', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 508 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics16/620-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics16/620-1-eng-US/graphics1.jpg" original_filename="b14081cb.jpg" mime_type="image/jpeg" width="540" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="620" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '620', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 509 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '621', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 510 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '622', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 511 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '623', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 512 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics17/624-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics17/624-1-eng-US/graphics1.jpg" original_filename="dd1815c4.jpg" mime_type="image/jpeg" width="540" height="425" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="624" attribute_version="1" attribute_language="eng-US"/><information Height="425" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '624', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 513 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '625', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 514 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '626', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 515 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '627', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 516 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics18/628-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics18/628-1-eng-US/graphics1.jpg" original_filename="485af257.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="628" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '628', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 517 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '629', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 518 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '630', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 519 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '631', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 520 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics19/632-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics19/632-1-eng-US/graphics1.jpg" original_filename="1a13bc86.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="632" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '632', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 521 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '633', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 522 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to manage eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '634', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to manage ez publish', + 'version' => '1', + ), + 523 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '635', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 524 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '636', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 525 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>To provide you with full control over your website, eZ Publish has many features that make it easy to manage both content and users.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '637', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 526 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph><ul><li><paragraph>Administration Interface</paragraph></li><li><paragraph>Permission and access control</paragraph></li><li><paragraph>Workflows</paragraph></li><li><paragraph>Versioning and modification tracking</paragraph></li><li><paragraph>A unique content model</paragraph></li><li><paragraph>Content cross publishing</paragraph></li><li><paragraph>Multi-site deployment</paragraph></li><li><paragraph>Search engine optimization</paragraph></li></ul></paragraph><section><header>A rich and powerful Administration Interface</header><paragraph><embed align="center" size="original" object_id="119"/></paragraph><paragraph>The content of a site can be displayed (and modified) in various ways. The Administration Interface is the advanced back-end interface, providing powerful tools for content management and editing as well as site management, configuration, customization and development.</paragraph><paragraph>In other words, you can change almost everything about a site in the Administration Interface.</paragraph><header>Permission, rights management and access control</header><paragraph><embed align="center" size="original" object_id="120"/></paragraph><paragraph>The eZ Publish access system is multi-level and role-based. This means that you can give a user or a group of users access to a combination of functions across the whole site or within a specific area of the site. For example, you restrict a certain part of a site to community or partner members.</paragraph><header>Workflows</header><paragraph><embed align="center" size="original" object_id="121"/></paragraph><paragraph>eZ Publish comes with an integrated workflow mechanism. An example of this is the built-in collaboration system, which defines an ordered sequence of actions to be executed after a content editor has published an object.</paragraph><paragraph>Suppose that your site has a restriction that all content has to go through an editor-in-chief before being published. It can be set as “pending” before being approved to be published. On the other hand, if a pending version is rejected by the editor, it can be set as “rejected”.</paragraph><paragraph>&nbsp;Another example is the e-commerce engine, which can be used to manage subscriptions on a media site, automating access for paid subscribers to read premium news content, watch videos, and so on.</paragraph><header>Versioning and modification tracking</header><paragraph><embed align="center" size="original" object_id="122"/></paragraph><paragraph>Having access to older versions of content enables supervisors or editors-in-chief to check for inconsistency or errors in the content. eZ Publish automatically keeps track of which content changes were made by which users at what time, and provides the option to revert content to a previous version.</paragraph><header>A unique content model</header><paragraph><embed align="center" size="original" object_id="123"/></paragraph><paragraph>Publishing content is no longer only about publishing articles. Depending on your needs you must define specific content structures for cars, recipes, specific products for your webshop and more. eZ Publish has a flexible content engine that enables administrators to create these content definitions directly through graphical user interfaces.</paragraph><header>Content cross publishing</header><paragraph><embed align="center" size="original" object_id="124"/></paragraph><paragraph>Using the cross publishing feature, you can re-use content throughout the site while avoiding inconsistent duplicates of content that are hard to maintain. If content appears at multiple locations, you only have to edit the object once – the changes will be reflected at all locations.</paragraph><header>Multi-site deployment</header><paragraph><embed align="center" size="original" object_id="125"/></paragraph><paragraph>One installation of eZ Publish can host many different websites with the possibility to re-use content, functionality and design across the different sites. You can have a continuous overview of all your sites and can even industrialize this deployment via the Site Factory management service in <link url_id="85">eZ Publish Premium</link> subscription services.</paragraph><header>URL management and search engine optimization</header><paragraph><embed align="center" size="original" object_id="126"/></paragraph><paragraph>eZ Publish makes it easy for you to create content that will be effectively indexed by search engines. Sitemaps, friendly URLs, and easy management of key XHTML tags are all built-in features.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '638', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 527 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '639', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 528 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-manage-eZ-Publish.jpg" suffix="jpg" basename="How-to-manage-eZ-Publish" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/640-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/640-1-eng-US/How-to-manage-eZ-Publish.jpg" original_filename="c6fabb5a.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="640" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '640', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 529 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '641', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 530 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '642', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 531 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '643', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 532 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '644', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 533 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '645', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 534 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '646', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 535 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '647', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 536 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics1/648-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics1/648-1-eng-US/graphics1.jpg" original_filename="3268defa.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="648" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '648', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 537 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '649', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 538 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '650', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 539 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '651', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 540 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics12/652-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics12/652-1-eng-US/graphics1.jpg" original_filename="06b28423.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="652" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '652', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 541 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '653', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 542 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '654', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 543 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '655', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 544 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics13/656-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics13/656-1-eng-US/graphics1.jpg" original_filename="fb93c150.jpg" mime_type="image/jpeg" width="540" height="414" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="656" attribute_version="1" attribute_language="eng-US"/><information Height="414" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '656', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 545 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '657', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 546 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '658', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 547 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '659', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 548 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics14/660-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics14/660-1-eng-US/graphics1.jpg" original_filename="e472d575.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="660" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '660', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 549 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '661', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 550 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '662', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 551 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '663', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 552 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics15/664-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics15/664-1-eng-US/graphics1.png" original_filename="724f9667.png" mime_type="image/png" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="664" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '664', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 553 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '665', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 554 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '666', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 555 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '667', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 556 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics16/668-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics16/668-1-eng-US/graphics1.jpg" original_filename="13338db0.jpg" mime_type="image/jpeg" width="540" height="405" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="668" attribute_version="1" attribute_language="eng-US"/><information Height="405" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '668', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 557 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '669', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 558 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '670', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 559 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '671', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 560 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics17/672-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics17/672-1-eng-US/graphics1.jpg" original_filename="00bc8122.jpg" mime_type="image/jpeg" width="500" height="423" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="672" attribute_version="1" attribute_language="eng-US"/><information Height="423" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '672', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 561 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '673', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 562 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '674', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 563 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '675', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 564 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics18/676-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics18/676-1-eng-US/graphics1.jpg" original_filename="d265bd27.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="676" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '676', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 565 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '677', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 566 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to develop with eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '678', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to develop with ez publish', + 'version' => '1', + ), + 567 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '679', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 568 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '680', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 569 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish is more than a basic CMS, but a content management platform based on a clear API that allows developers to customize and extend eZ Publish.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '681', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 570 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The content class concept</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Custom design: CSS and templates</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">High-quality library of PHP components</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Build eZ Publish extensions</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Which development environment?</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">eZ Publish community and resources</paragraph></li></ul></paragraph><section><section><header>The content class concept</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="128"/></paragraph><paragraph>Any piece of content in eZ Publish is a content object, which is an instance of a specific content class. A content class is a definition of an arbitrary data structure. It does not store any actual data.</paragraph><paragraph>A content class is made up of attributes. The characteristics of an attribute are determined by the datatype that is chosen for that specific attribute. By combining different datatypes, it is possible to represent complex data structures.</paragraph><paragraph>The illustration above shows the anatomy of a content class called "Article", which defines a data structure for storing news articles. It consists of attributes dedicated for storing the title, an introduction text and the actual body of an article.</paragraph></section></section><section><section><header>Custom design: CSS and templates</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="129"/></paragraph><paragraph>The first thing you may be willing to do is to change the look of your eZ Publish site. This can be done by modifying the CSS of eZ Publish and <link url_id="86">overriding templates</link>. You can even create reusable <link url_id="87">site packages</link> that include these CSS and template changes.</paragraph></section></section><section><section><header>High-quality library of PHP components</header><paragraph>eZ Publish 4.X as well as the next generations of eZ Publish are based on <link url_id="88">eZ Components</link> which are a high quality library of independent components aiming to help developers creating web centric applications like for example customising and extending eZ Publish.</paragraph><paragraph>In the eZ Components you will find components that focus their attention on solving important parts of Web application development. They are written for solving the re-occurring issues that Web application developers have to deal with when building their applications - without any superfluous ballast.</paragraph><paragraph>In order to cater for this goal, quality is also an important factor. The eZ Components development team uses a test-driven development methodology where a large effort is put into making the APIs easily testable. This also results in a better API for developers to use.</paragraph></section></section><section><section><header>Build eZ Publish extensions</header><paragraph>There is a clear API to develop your own PHP extensions in order to extend the functionality of eZ Publish. By using extensions it is possible to create new modules, datatypes, template operators, workflow events , or any integration with third party applications. You will find many contributed extensions available at <link url_id="89">Contribution page</link>.</paragraph></section></section><section><section><header>Which development environment?</header><paragraph>&nbsp;In an eZ Publish project, a <link url_id="90">Subversion (SVN)</link> repository is usually set up to track all changes during development projects. When it comes to IDE, both <link url_id="91">Eclipse</link> and <link url_id="92">PHPEdit</link> have been optimised for eZ Publish.</paragraph></section></section><section><section><header>eZ Publish community and resources</header><paragraph>When you start developing with eZ Publish, the community is definitely an environment to get in touch with. You will find your answers or get help in the forums as well as many contributions that will make save you time in your development projects.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '682', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 571 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '683', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 572 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-develop-with-eZ-Publish.png" suffix="png" basename="How-to-develop-with-eZ-Publish" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/684-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/684-1-eng-US/How-to-develop-with-eZ-Publish.png" original_filename="db3eaa06.png" mime_type="image/png" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="684" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '684', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 573 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '685', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 574 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '686', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 575 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '687', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 576 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '688', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 577 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '689', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 578 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '690', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 579 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '691', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 580 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics1/692-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics1/692-1-eng-US/graphics1.jpg" original_filename="c9dbc90f.jpg" mime_type="image/jpeg" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="692" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '692', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 581 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '693', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 582 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '694', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 583 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '695', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 584 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics12/696-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics12/696-1-eng-US/graphics1.png" original_filename="7e906b13.png" mime_type="image/png" width="540" height="411" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="696" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '696', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 585 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '697', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 586 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Lots of Websites, One eZ Publish Installation', + 'data_type_string' => 'ezstring', + 'id' => '698', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'lots of websites, one ez publish installation', + 'version' => '1', + ), + 587 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Adding Siteaccesses in eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '699', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'adding siteaccesses in ez publish', + 'version' => '1', + ), + 588 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Greg McAvoy-Jensen" email="admin@myportal.com"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '700', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 589 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>This tutorial gives developers the power to extend the features and flexibility of eZ Publish beyond a single website, to having an unlimited number in one installation. At the end of this tutorial you will have learned how to best leverage eZ Publish\'s siteaccess concept to create multiple websites. It will let you apply this concept through the concrete case of building two different, multilingual websites on one single eZ Publish instance.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '701', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 590 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><section><header>Introduction</header><paragraph>Users of eZ Publish sometimes wonder if it is possible to make use of a single installation of eZ Publish for multiple websites. The answer is yes through the power of the siteaccess. In fact, an understanding of siteaccesses gives one the ability to do much more than just host multiple sites in one installation. With this technique you can:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">make it easier to share content between databases</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">copy and add locations to objects</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">use a single Premium agreement and one eZ Network extension for multiple sites with the same or different content</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">simplify eZ Publish upgrades by consolidating several sites on one installation</paragraph></li></ul></paragraph><paragraph>This is demo content, to continue real reading, please visit&nbsp;<link target="_blank" url_id="93">share.ez.no</link></paragraph></section><section><header>About the author : Greg McAvoy-Jensen</header><paragraph>Greg is the executive director of&nbsp;<link target="_blank" xhtml:title="Granite Horizon" url_id="94">Granite Horizon</link>, one of the largest eZ Publish development firms in the United States of America. A certified eZ Publish developer, he has served clients and trained developers on four continents since he started working with eZ Publish in 2003. His wife Heather and he are proud parents of three wonderful children.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '702', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 591 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '703', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 592 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="704" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '704', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 593 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '705', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 594 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '706', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 595 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '707', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 596 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '708', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 597 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '709', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 598 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'New features', + 'data_type_string' => 'ezstring', + 'id' => '710', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'new features', + 'version' => '1', + ), + 599 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '711', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 600 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '712', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 601 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '713', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 602 => + array ( + 'attribute_original_id' => '714', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '714', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 603 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '715', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 604 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '716', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 605 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Improved user registration workflow', + 'data_type_string' => 'ezstring', + 'id' => '717', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'improved user registration workflow', + 'version' => '1', + ), + 606 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '718', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 607 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '719', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 608 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Approval workflow for the front-end user self-registration</paragraph><paragraph>Useful when you wish to control who logs on to your system</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '720', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 609 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Enable and configure the workflow:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Create workflow</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Connect workflow to new triggers</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Register user with approval workflow enabled</paragraph></li></ul></paragraph><paragraph>Enable the approval workflow functionality:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Go to the Administration Interface - “Setup” - “Workflows”</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><line>Create a user registration workflow, e.g “UserRegistration1”</line><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The FinishUserRegistration workflow is used to end the registration and trigger a confirmation notification that the user is successfully registered&nbsp;</paragraph></li></ul></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Create a workflow to finish the user registration, e.g “FinishUserRegistration”</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="133"/></paragraph><paragraph>Connect the two workflows to triggers:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">“UserRegistration1” to “content-publish-before”</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">“FinishUserRegistration” to “content-publish-after”</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="imagelarge" custom:offset="0" custom:limit="5" object_id="134"/></paragraph><paragraph>Now you have set up a workflow approval process. When a user logs in to register himself as a user he is presented with an approval workflow</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">At first time login the user clicks "Sign up" to register an account</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;When finished a mail is sent to to confirm the user email</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="imagelarge" custom:offset="0" custom:limit="5" object_id="135"/></paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">In the administration interface an event is created in the Dashboard’s&nbsp; “Collaboration” screen of an administrator or another role with the right policies</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The administrator can now either comment, approve or deny the request for user registration</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The user gets a confirmation mail and can log in to eZ Publish.</paragraph></li></ul></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '721', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 610 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '722', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 611 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="723" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '723', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 612 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '724', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 613 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '725', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 614 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '726', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 615 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '727', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 616 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '728', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 617 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '729', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 618 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '730', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 619 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics1/731-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics1/731-1-eng-US/graphics1.png" original_filename="2f51f75c.png" mime_type="image/png" width="509" height="238" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="731" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '731', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 620 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '732', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 621 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '733', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 622 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '734', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 623 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics12/735-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics12/735-1-eng-US/graphics1.jpg" original_filename="ec2680c6.jpg" mime_type="image/jpeg" width="1159" height="503" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="735" attribute_version="1" attribute_language="eng-US"/><information Height="503" Width="1159" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTE1OQ==</item><item key="ExifImageLength" base64="1">NTAz</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '735', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 624 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '736', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 625 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '737', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 626 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '738', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 627 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics13/739-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics13/739-1-eng-US/graphics1.jpg" original_filename="884d3f23.jpg" mime_type="image/jpeg" width="1338" height="217" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="739" attribute_version="1" attribute_language="eng-US"/><information Height="217" Width="1338" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTMzOA==</item><item key="ExifImageLength" base64="1">MjE3</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '739', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 628 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '740', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 629 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Improved block editing', + 'data_type_string' => 'ezstring', + 'id' => '741', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'improved block editing', + 'version' => '1', + ), + 630 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '742', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 631 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '743', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 632 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>Visual and usability changes:</paragraph><paragraph><ul><li><paragraph>The new screen for adding blocks</paragraph></li><li><paragraph>Saves space</paragraph></li></ul></paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '744', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 633 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph><embed align="center" size="large" object_id="137"/></paragraph><paragraph>The new screen for setting attributes for blocks</paragraph><paragraph><embed align="center" size="large" object_id="138"/></paragraph></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '745', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 634 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '746', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 635 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="747" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '747', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 636 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '748', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 637 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '749', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 638 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '750', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 639 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '751', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 640 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '752', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 641 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '753', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 642 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '754', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 643 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics1/755-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics1/755-1-eng-US/graphics1.jpg" original_filename="afc16bee.jpg" mime_type="image/jpeg" width="832" height="599" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="755" attribute_version="1" attribute_language="eng-US"/><information Height="599" Width="832" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">ODMy</item><item key="ExifImageLength" base64="1">NTk5</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '755', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 644 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '756', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 645 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '757', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 646 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '758', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 647 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics12/759-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics12/759-1-eng-US/graphics1.jpg" original_filename="e9bde168.jpg" mime_type="image/jpeg" width="911" height="626" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="759" attribute_version="1" attribute_language="eng-US"/><information Height="626" Width="911" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">OTEx</item><item key="ExifImageLength" base64="1">NjI2</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '759', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 648 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '760', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 649 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Improved front-end editing', + 'data_type_string' => 'ezstring', + 'id' => '761', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'improved front-end editing', + 'version' => '1', + ), + 650 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '762', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 651 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '763', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 652 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed align="center" view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="141"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '764', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 653 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Front-end editing toolbar always in top of browser window</paragraph><paragraph>Aligned with the Admin2 look and feel</paragraph><paragraph>New button to open the administration interface in a new window (12)</paragraph><paragraph>New and higher contrast icons</paragraph><paragraph>Toolbar changes according to use, and also which extensions and program you run</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">In opening window</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">In editing mode</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">When editing folders</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="140"/></paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Front-end toolbar: </line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;Timeline is marked.</line></paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="141"/></paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Editing folder toolbar: </line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;9-RSS feed, 10-Add to block, 11-Multiupload, 12-Administration interface</line></paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="142"/></paragraph><paragraph>Editing mode toolbar:&nbsp;</paragraph><paragraph>6-Preview, 7-Translate + translation button with flags</paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="143"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '765', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 654 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '766', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 655 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="767" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '767', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 656 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '768', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 657 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '769', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 658 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '770', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 659 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '771', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 660 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '772', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 661 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '773', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 662 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '774', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 663 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics1/775-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics1/775-1-eng-US/graphics1.jpg" original_filename="ff6bcfd1.jpg" mime_type="image/jpeg" width="1030" height="151" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="775" attribute_version="1" attribute_language="eng-US"/><information Height="151" Width="1030" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">OTA=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTAzMA==</item><item key="ExifImageLength" base64="1">MTUx</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '775', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 664 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '776', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 665 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '777', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 666 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '778', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 667 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US/graphics1.jpg" original_filename="f30d1e92.jpg" mime_type="image/jpeg" width="805" height="84" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="779" attribute_version="1" attribute_language="eng-US"/><information Height="84" Width="805" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">ODA1</item><item key="ExifImageLength" base64="1">ODQ=</item></array></information><alias name="medium" filename="graphics1_medium.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US/graphics1_medium.jpg" mime_type="image/jpeg" width="200" height="21" alias_key="3736024005" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '779', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 668 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '780', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 669 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '781', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 670 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '782', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 671 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics13/783-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics13/783-1-eng-US/graphics1.jpg" original_filename="17d497d3.jpg" mime_type="image/jpeg" width="1278" height="136" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="783" attribute_version="1" attribute_language="eng-US"/><information Height="136" Width="1278" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTI3OA==</item><item key="ExifImageLength" base64="1">MTM2</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '783', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 672 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '784', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 673 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '785', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 674 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '786', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 675 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics14/787-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics14/787-1-eng-US/graphics1.jpg" original_filename="c3833d09.jpg" mime_type="image/jpeg" width="1365" height="140" alternative_text="" alias_key="1293033771" timestamp="1311154193"><original attribute_id="787" attribute_version="1" attribute_language="eng-US"/><information Height="140" Width="1365" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTM2NQ==</item><item key="ExifImageLength" base64="1">MTQw</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '787', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 676 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '788', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 677 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'FastCGI', + 'data_type_string' => 'ezstring', + 'id' => '789', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fastcgi', + 'version' => '1', + ), + 678 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '790', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 679 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '791', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 680 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish supports FastCGI</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '792', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 681 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>What is FastCGI?</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI is also language-independent. For instance, FastCGI provides a way to improve the performance of the thousands of Perl applications that have been written for the Web.</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI runs applications in processes isolated from the core Web server, which provides greater security than APIs. (APIs link application code into the core Web server, which means that a bug in one API-based application can corrupt another application or the core server; a malicious API-based application can, for example, steal key security secrets from another application or the core server.)</paragraph></li></ul></paragraph><paragraph>Read more&nbsp;http://www.fastcgi.com/</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '793', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 682 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '794', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 683 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154193"><original attribute_id="795" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '795', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 684 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '796', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 685 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '797', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 686 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '798', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 687 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '799', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 688 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '800', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 689 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support for Red Hat Enterprise', + 'data_type_string' => 'ezstring', + 'id' => '801', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'support for red hat enterprise', + 'version' => '1', + ), + 690 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '802', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 691 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '803', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 692 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>combined with eZ Publish Enterprise, you can now enjoy a system supported all through the stack!</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '804', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 693 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed align="center" view="embed" size="original" object_id="146"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '805', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 694 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '806', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 695 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154193"><original attribute_id="807" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '807', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 696 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '808', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 697 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '809', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 698 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '810', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 699 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '811', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 700 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '812', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 701 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '813', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 702 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '814', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 703 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/support-for-red-hat-enterprise/graphics1/815-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/support-for-red-hat-enterprise/graphics1/815-1-eng-US/graphics1.png" original_filename="733e4b0a.png" mime_type="image/png" width="476" height="128" alternative_text="" alias_key="1293033771" timestamp="1311154194"><original attribute_id="815" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '815', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 704 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '816', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 705 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Canonical links', + 'data_type_string' => 'ezstring', + 'id' => '817', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'canonical links', + 'version' => '1', + ), + 706 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '818', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 707 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '819', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 708 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>eZ Publish 4.5 supports a canonical link feature that helps search engines to figure out duplicate content issues and allow them to index relevant content.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '820', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 709 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>For simple siteaccesses, like nor, fre, ger, eng the feature works out of the box &nbsp;</paragraph><paragraph><ul><li><paragraph>More complex mappings require a manual configuration in the file</paragraph></li><li><paragraph>You use the canonical link to tell the search engines which url is the preferred one when you have several duplicate urls.</paragraph></li></ul></paragraph><paragraph>Example of duplicate urls:</paragraph><paragraph>- <link url_id="95">www.example.com</link></paragraph><paragraph>- example.com</paragraph><paragraph>- <link url_id="96">www.example.com/index.html</link></paragraph><paragraph>- example.com/home.asp</paragraph><paragraph>Example of canonical link:</paragraph><paragraph><link rel="canonical" href="<link url_id="95">http://www.example.com</link>/" /></paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '821', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 710 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '822', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 711 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154194"><original attribute_id="823" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '823', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 712 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '824', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 713 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '825', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 714 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '826', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 715 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '827', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 716 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '828', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 717 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Asynchronous publishing', + 'data_type_string' => 'ezstring', + 'id' => '829', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'asynchronous publishing', + 'version' => '1', + ), + 718 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '830', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 719 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '831', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 720 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>The ability to use defer publishing, for improved scalability in high load, multi-editor environments.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '832', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 721 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>eZ Publish 4.5 supports a new publishing method used in an environment with a large simultaneous load on the database</paragraph><paragraph><ul><li><paragraph>offers a robust multi-editor environment with parallel publishing</paragraph></li><li><paragraph>controls the number of objects that can be published concurrently</paragraph></li><li><paragraph>sends publishing requests to a queue for asynchronous publishing </paragraph></li><li><paragraph>a daemon handles the publishing requests and the queue in the background </paragraph></li><li><paragraph>for multiple databases</paragraph></li><li><paragraph>better database error handling</paragraph></li><li><paragraph>filtering hooks</paragraph></li></ul></paragraph><paragraph><table width="100%"><tr><td><paragraph>The process:</paragraph><paragraph><ul><li><paragraph>Press "Send for publishing"</paragraph></li><li><paragraph>The request to publish is queued</paragraph></li><li><paragraph>This queue is monitored by the daemon&nbsp;</paragraph></li><li><paragraph>Follow the status of the publishing</paragraph></li></ul></paragraph><paragraph>Queue statuses:</paragraph><paragraph><strong>Pending:</strong> The publishing request is now in a queue of publishing requests</paragraph><paragraph><strong>Working:</strong> The request is processed to find a queue and a place in the queue</paragraph><paragraph><strong>Published:</strong> The request has been processed and the object published</paragraph><paragraph>Irregularities prompts error messages</paragraph></td><td/></tr></table></paragraph><paragraph><embed align="center" size="large" object_id="149"/></paragraph><paragraph>Enable the service in “content.ini”:</paragraph><paragraph><literal>[PublishingSettings] + # Enable/Disable the asynchronous publishing feature + AsynchronousPublishing=enabled + </literal></paragraph><paragraph>Customize the queue size in “content.ini”:</paragraph><paragraph><literal>[PublishingSettings] + # how many parallel publishing operations should be allowed + # default: 10 + PublishingProcessSlots=10 + </literal></paragraph><paragraph>Setting up the service with an init script (recommended in a production setting):</paragraph><paragraph>- For Red Hat Enterprise Linux, CentOS, Fedora, SUSE:</paragraph><paragraph><literal>bin/startup/rhel/ezasynchronouspublisher + </literal></paragraph><paragraph>- For Debian and Ubuntu:</paragraph><paragraph><literal>bin/startup/debian/ezasynchronouspublisher + </literal></paragraph><paragraph>Example of script for Debian:</paragraph><paragraph><literal>cd /etc/init.d + ln -s /path/to/ezpublish/bin/startup/debian/ezasynchronouspublisher + chmod +x ezasynchronouspublisher + </literal></paragraph><paragraph>Start daemon:</paragraph><paragraph><literal>/etc/init.d/ezasynchronouspublisher start + </literal></paragraph><paragraph>Daemon options:</paragraph><paragraph><literal>/etc/init.d/ezasynchronouspublisher help + </literal></paragraph><paragraph>Configure daemon to start up on boot:</paragraph><paragraph><literal>chkconfig ezasynchronouspublisher on + </literal></paragraph></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '833', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 722 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '834', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 723 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154194"><original attribute_id="835" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '835', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 724 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '836', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 725 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '837', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 726 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '838', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 727 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '839', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 728 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '840', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 729 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '841', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 730 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '842', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 731 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/asynchronous-publishing/graphics1/843-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/asynchronous-publishing/graphics1/843-1-eng-US/graphics1.jpg" original_filename="a2a28ec0.jpg" mime_type="image/jpeg" width="1413" height="1060" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="843" attribute_version="1" attribute_language="eng-US"/><information Height="1060" Width="1413" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTQxMw==</item><item key="ExifImageLength" base64="1">MTA2MA==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '843', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 732 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '844', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 733 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'REST API interface', + 'data_type_string' => 'ezstring', + 'id' => '845', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'rest api interface', + 'version' => '1', + ), + 734 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '846', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 735 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '847', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 736 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>New RESTful interface, which will allow external client implementations, to access and query content resources inside an eZ Publish installation.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '848', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 737 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Version 1.0 of eZ Publish REST API contains:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;OAUTH authentication</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;Basic content retrieval</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;REST API Extension mechanism</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;REST API versioning</paragraph></li></ul></paragraph><paragraph><strong>Presentation</strong></paragraph><paragraph><link target="_blank" url_id="18"><embed align="left" view="embed" size="original" custom:offset="0" custom:limit="5" object_id="66"/></link></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '849', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 738 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '850', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 739 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="851" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '851', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 740 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '852', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 741 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '853', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 742 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '854', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 743 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '855', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 744 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '856', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 745 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'eZ Publish Enterprise', + 'data_type_string' => 'ezstring', + 'id' => '857', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ez publish enterprise', + 'version' => '1', + ), + 746 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '858', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 747 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '859', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 748 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Enterprise Web Content Management</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '860', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 749 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><table class="default" width="100%" border="0" custom:summary="paragraph" custom:caption=""><tr><td><paragraph>A global web content management system leader, eZ Systems was founded in 1999 and has 10 offices worldwide. eZ Systems’ flagship product, eZ Publish, is the leading enterprise Web Content Management (WCM) platform specializing in multichannel content distribution for web, mobile, tablets, print and more.</paragraph><paragraph>Because eZ Publish is a commercial open source product, eZ Systems engineers can leverage the innovation from a global community of over 38 000 developers and certified implementation partners. This innovation drives over 200 000 worldwide installations, proving that eZ Publish is one of the most adaptable, open and reliable WCM platforms in the market.</paragraph></td><td><paragraph><embed align="center" view="embed-inline" size="listitem" custom:offset="0" custom:limit="5" object_id="152"/></paragraph></td></tr></table></paragraph><paragraph>The eZ Publish Enterprise Edition is the perfect blend of reliable vendor support and quality</paragraph><paragraph>assured innovation: enterprise customers pay a cost effective yearly subscription fee for support, maintenance, update training and other services, and eZ Systems releases major software updates every 6 months. All of this comes with no license fee.</paragraph><paragraph>With offices in Europe, the Nordics, the Americas and Asia, eZ Systems is a recognized global WCM leader in the media and publishing industry. This industry demands the most flexible, secure, maintainable and complex solutions to power large web properties and generate revenue from an array of content sources. With a track record spanning more than 10 years in this space, eZ Publish has now become the software of choice for customers in banking and finance, retail, government and non- government organizations. If you have advanced publishing needs, eZ Publish is right for you.</paragraph><section><section><header>Multichannel Content Distribution</header><paragraph>eZ Publish delivers unsurpassed multichannel capabilities that enable customers to reach out and engage your audience. eZ’s out-of-the-box functionality, intrinsic scalability and robust API help you to do this quickly, accelerating your time to market while reducing your implementation costs.&nbsp;</paragraph><paragraph><strong>&nbsp;</strong></paragraph></section></section><section><section><header>Enabling Editors</header><paragraph>eZ Publish provides a rich tool set that makes authoring and editing content simple and engaging. eZ Publish frees your editorial and creative staff to do what they do best: publish content with enthusiasm and minimal effort.</paragraph><section><header>Plan, Review, Automate</header><paragraph>Publishing is one thing, but managing portals and front pages is a different story. eZ Publish Enterprise has a unique portal management solution that enables editors to build complex page layouts and plan, review and automate the publication schedule to ensure a constant flow of rich content through portal pages.</paragraph><paragraph>For example, editors can define multiple “zones” within a single page layout. Within each zone, editors create “blocks” that promote content in a certain way. Next, editors explicitly or implicitly add content objects to these blocks and then schedule</paragraph><paragraph>the promotion, flow and rotation of content. To “look into the future,” editors simply drag a slider across a timeline to preview content before it goes live. This entire process can be managed without the support of a web developer.</paragraph></section><section><header>Collaborate</header><paragraph>We know that editors do not work alone. eZ Publish provides flexible workflow and collaboration tools and dashboards to keep your team in sync. And you can configure the system to adapt to your own workflows, however intricate they may be.</paragraph></section></section></section><section><section><header>Adaptable Content Engine and User Interfaces</header><paragraph>eZ’s unique, flexible content model completely separates content from presentation, so that the delivery of your content can adapt to any current or future distribution channel. Furthermore, you can design the system to fit your needs—your do not have to force your content into a “one size fits all” construct. This structure sets your content free for re-use and re-purposing. This powerful flexibility is the source of eZ’s strength as multichannel content management platform.</paragraph><paragraph>The system also adapts to your editors’ style of work. They can choose to import content from multiple sources, utilize a simple editing toolbar while browsing your site, or use the powerful back office editing suite. The efficient user interfaces and flexibility flattens the learning curve and accelerates internal adoption of eZ Publish.</paragraph></section></section><section><section><header>Open Enterprise Technology</header><paragraph>eZ Publish’s open architecture supports Interoperability Open Standards like XML, ODF, SOAP, REST, JSON. When you utilize the powerful API, it’s simple to integrate the eZ Enterprise platform with all of your information management systems. In fact, there are over 1000 extensions available to accelerate your project and reduce development costs.</paragraph></section></section><section><section><header>Reliable Vendor Support</header><paragraph>eZ Systems is dedicated to your success. We succeed only if you do. Our customers benefit from our commercial support packages that are customized to meet the nature of your project and service level agreements. Our highly qualified product support engineers thrive on your complete satisfaction, and enjoy enabling our partners and customers with accurate and thorough responses to support requests.</paragraph><paragraph>In addition to this unlimited product support, we provide a variety of expert training and consulting services to certify and assist developers and implementation partners around the globe. We host self-service tools like user and technical documentation, forums, books, tutorials, articles and community sites to distribute and share best practices. Our dedication to supporting our clients and partners is the core service of eZ’s Enterprise Open Source Business model.</paragraph></section></section><section><section><header>They trust in eZ</header><paragraph><embed view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="153"/></paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '861', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 750 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '862', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 751 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="863" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '863', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 752 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '864', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 753 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '865', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 754 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '866', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 755 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '867', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 756 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '868', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 757 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '869', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 758 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '870', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 759 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics1/871-1-eng-US" url="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics1/871-1-eng-US/graphics1.png" original_filename="068699a4.png" mime_type="image/png" width="332" height="293" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="871" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '871', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 760 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '872', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 761 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '873', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 762 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '874', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 763 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics12/875-1-eng-US" url="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics12/875-1-eng-US/graphics1.png" original_filename="d1120108.png" mime_type="image/png" width="448" height="151" alternative_text="" alias_key="1293033771" timestamp="1311154196"><original attribute_id="875" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '875', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 764 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '876', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 765 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '877', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 766 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '61', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '878', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '61', + 'sort_key_string' => '', + 'version' => '1', + ), + 767 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '879', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 768 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><table class="default" width="100%" border="0"><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="163"/></paragraph></td><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="162"/></paragraph></td></tr><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="158"/></paragraph></td><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="155"/></paragraph></td></tr><tr><td/><td/></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="164"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '880', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 769 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="vertically_listed_sub_items" size="medium" align="center" custom:offset="0" custom:limit="5" object_id="155"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '881', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 770 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="horizontally_listed_sub_items" size="medium" align="center" custom:offset="0" custom:limit="5" object_id="158"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '882', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 771 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '883', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 772 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partner News', + 'data_type_string' => 'ezstring', + 'id' => '884', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partner news', + 'version' => '1', + ), + 773 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '885', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 774 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Maecenas vulputate facilisis velit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '886', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 775 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin felis neque, auctor in, tempor non, ultrices vel, odio. Proin condimentum risus vitae felis. Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec, condimentum bibendum, quam. Ut congue quam ac lorem. Duis risus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '887', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 776 => + array ( + 'attribute_original_id' => '888', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '888', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 777 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '889', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 778 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '890', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 779 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Pellentesque quam mauris', + 'data_type_string' => 'ezstring', + 'id' => '891', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'pellentesque quam mauris', + 'version' => '1', + ), + 780 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '892', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 781 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '893', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 782 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Maecenas vulputate facilisis velit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '894', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 783 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras facilisis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus aliquet, pede vitae facilisis bibendum, neque orci malesuada felis, at bibendum est mi nec ipsum. Sed egestas blandit neque. Curabitur hendrerit dignissim justo. Aliquam erat volutpat. Phasellus sollicitudin, magna dictum placerat consequat, sem enim porttitor odio, vel tempor enim felis et justo.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '895', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 784 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '896', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 785 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Pellentesque-quam-mauris.jpg" suffix="jpg" basename="Pellentesque-quam-mauris" dirpath="var/ezwebin_site/storage/images/partners/partner-news/pellentesque-quam-mauris/897-1-eng-US" url="var/ezwebin_site/storage/images/partners/partner-news/pellentesque-quam-mauris/897-1-eng-US/Pellentesque-quam-mauris.jpg" original_filename="61bfee3f.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Pellentesque quam mauris" alias_key="1293033771" timestamp="1311154196"><original attribute_id="897" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '897', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 786 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque quam mauris</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '898', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 787 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1175497860', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '899', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175497860', + 'sort_key_string' => '', + 'version' => '1', + ), + 788 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '900', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 789 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '901', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 790 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '902', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 791 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Penatibus et magnis dis', + 'data_type_string' => 'ezstring', + 'id' => '903', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'penatibus et magnis dis', + 'version' => '1', + ), + 792 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '904', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 793 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '905', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 794 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '906', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 795 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '907', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 796 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '908', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 797 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Penatibus-et-magnis-dis.jpg" suffix="jpg" basename="Penatibus-et-magnis-dis" dirpath="var/ezwebin_site/storage/images/partners/partner-news/penatibus-et-magnis-dis/909-1-eng-US" url="var/ezwebin_site/storage/images/partners/partner-news/penatibus-et-magnis-dis/909-1-eng-US/Penatibus-et-magnis-dis.jpg" original_filename="e86ae2c7.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Penatibus et magnis dis" alias_key="1293033771" timestamp="1311154197"><original attribute_id="909" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '909', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 798 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '910', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 799 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1175498940', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '911', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175498940', + 'sort_key_string' => '', + 'version' => '1', + ), + 800 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '912', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 801 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '913', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 802 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '914', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 803 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'News', + 'data_type_string' => 'ezstring', + 'id' => '915', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'news', + 'version' => '1', + ), + 804 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '916', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 805 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce lacus. Mauris eu enim. Integer tincidunt sapien quis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '917', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 806 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis semper sodales purus. Aenean ullamcorper. Sed tempor est sollicitudin leo. Sed odio orci, commodo placerat, consectetuer eget, tincidunt ac, lorem. Quisque dapibus. Duis turpis odio, mattis eget, tristique at, consequat id, quam. Nullam volutpat, eros quis bibendum sollicitudin, lectus neque accumsan lorem, et faucibus nulla ipsum quis leo. Vestibulum a diam a urna adipiscing ornare. Maecenas consequat ligula id nisi. Etiam euismod sodales purus. Praesent dignissim lobortis dui. Sed nonummy felis in lorem. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '918', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 807 => + array ( + 'attribute_original_id' => '919', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '919', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 808 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '920', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 809 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '921', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 810 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Curabitur hendrerit dignissim', + 'data_type_string' => 'ezstring', + 'id' => '922', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'curabitur hendrerit dignissim', + 'version' => '1', + ), + 811 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '923', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 812 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '924', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 813 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur hendrerit dignissim justo. Aliquam erat volutpat. Phasellus sollicitudin, magna dictum placerat consequat. Praesent eu quam. Nam sollicitudin congue augue.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '925', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 814 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sem enim porttitor odio, vel tempor enim felis et justo. Duis sollicitudin eros id eros. Nunc convallis tristique est. Nam vel ligula. Sed augue. Aliquam erat volutpat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '926', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 815 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '927', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 816 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Curabitur-hendrerit-dignissim.jpg" suffix="jpg" basename="Curabitur-hendrerit-dignissim" dirpath="var/ezwebin_site/storage/images/partners/news/curabitur-hendrerit-dignissim/928-1-eng-US" url="var/ezwebin_site/storage/images/partners/news/curabitur-hendrerit-dignissim/928-1-eng-US/Curabitur-hendrerit-dignissim.jpg" original_filename="806a2270.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Curabitur hendrerit dignissim" alias_key="1293033771" timestamp="1311154197"><original attribute_id="928" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '928', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 817 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur hendrerit</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '929', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 818 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1175497920', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '930', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175497920', + 'sort_key_string' => '', + 'version' => '1', + ), + 819 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '931', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 820 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '932', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 821 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '933', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 822 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Proin condimentum risus', + 'data_type_string' => 'ezstring', + 'id' => '934', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'proin condimentum risus', + 'version' => '1', + ), + 823 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '935', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 824 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '936', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 825 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Proin condimentum risus vitae felis. Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '937', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 826 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Ut congue quam ac lorem. Duis risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque sodales tortor. Phasellus adipiscing pretium nibh. Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Praesent eu quam. Nam sollicitudin congue augue. Nulla facilisi. Nunc in turpis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '938', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 827 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '939', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 828 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Proin-condimentum-risus.jpg" suffix="jpg" basename="Proin-condimentum-risus" dirpath="var/ezwebin_site/storage/images/partners/news/proin-condimentum-risus/940-1-eng-US" url="var/ezwebin_site/storage/images/partners/news/proin-condimentum-risus/940-1-eng-US/Proin-condimentum-risus.jpg" original_filename="815e11b9.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Proin condimentum risus" alias_key="1293033771" timestamp="1311154198"><original attribute_id="940" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '940', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 829 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Proin condimentum</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '941', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 830 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1175498280', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '942', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175498280', + 'sort_key_string' => '', + 'version' => '1', + ), + 831 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '943', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 832 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '944', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 833 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '945', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 834 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Morbi tristique senectus', + 'data_type_string' => 'ezstring', + 'id' => '946', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'morbi tristique senectus', + 'version' => '1', + ), + 835 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '947', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 836 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '948', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 837 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin felis neque, auctor in, tempor non, ultrices vel, odio. Proin condimentum risus vitae felis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '949', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 838 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec, condimentum bibendum, quam. Ut congue quam ac lorem. Duis risus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '950', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 839 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '951', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 840 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Morbi-tristique-senectus.jpg" suffix="jpg" basename="Morbi-tristique-senectus" dirpath="var/ezwebin_site/storage/images/partners/news/morbi-tristique-senectus/952-1-eng-US" url="var/ezwebin_site/storage/images/partners/news/morbi-tristique-senectus/952-1-eng-US/Morbi-tristique-senectus.jpg" original_filename="d992fbc6.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Morbi tristique senectus" alias_key="1293033771" timestamp="1311154198"><original attribute_id="952" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '952', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 841 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Morbi tristique senectus</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '953', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 842 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1175498880', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '954', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175498880', + 'sort_key_string' => '', + 'version' => '1', + ), + 843 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '955', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 844 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '956', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 845 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '957', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 846 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partner Products', + 'data_type_string' => 'ezstring', + 'id' => '958', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partner products', + 'version' => '1', + ), + 847 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '959', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 848 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Maecenas ac dolor. Nam varius risus nec pede consequat porttitor. Lorem ipsum dolor sit amet, consectetuer adipiscing.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '960', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 849 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin felis neque, auctor in, tempor non, ultrices vel, odio. Proin condimentum risus vitae felis. Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec, condimentum bibendum, quam. Ut congue quam ac lorem. Duis risus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '961', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 850 => + array ( + 'attribute_original_id' => '962', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '962', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 851 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '963', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 852 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '964', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 853 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '965', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 854 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '966', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 855 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>In in ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque sodales tortor. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '967', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 856 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Phasellus adipiscing pretium nibh. Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Praesent eu quam. Nam sollicitudin congue augue. Nulla facilisi. Nunc in turpis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '968', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 857 => + array ( + 'attribute_original_id' => '969', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '969', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 858 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '970', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 859 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '971', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 860 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Neque orci malesuada felis', + 'data_type_string' => 'ezstring', + 'id' => '972', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'neque orci malesuada felis', + 'version' => '1', + ), + 861 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '973', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 862 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '974', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 863 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras facilisis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis sollicitudin eros id eros. Nunc convallis tristique est. Nam vel ligula. Sed augue. Aliquam erat volutpat. Maecenas vulputate facilisis velit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras facilisis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '975', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 864 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus aliquet, pede vitae facilisis bibendum, neque orci malesuada felis, at bibendum est mi nec ipsum. Sed egestas blandit neque. Curabitur hendrerit dignissim justo. Aliquam erat volutpat. Phasellus sollicitudin, magna dictum placerat consequat, sem enim porttitor odio, vel tempor enim felis et justo. Duis sollicitudin eros id eros. Nunc convallis tristique est. Nam vel ligula. Sed augue. Aliquam erat volutpat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '976', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 865 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '977', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 866 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Neque-orci-malesuada-felis.jpg" suffix="jpg" basename="Neque-orci-malesuada-felis" dirpath="var/ezwebin_site/storage/images/partners/partners/neque-orci-malesuada-felis/978-1-eng-US" url="var/ezwebin_site/storage/images/partners/partners/neque-orci-malesuada-felis/978-1-eng-US/Neque-orci-malesuada-felis.jpg" original_filename="4aa68ccb.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Neque orci malesuada felis" alias_key="1293033771" timestamp="1311154199"><original attribute_id="978" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '978', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 867 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Neque orci malesuada</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '979', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 868 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1175499180', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '980', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175499180', + 'sort_key_string' => '', + 'version' => '1', + ), + 869 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '981', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 870 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '982', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 871 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '983', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 872 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Community', + 'data_type_string' => 'ezstring', + 'id' => '984', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'community', + 'version' => '1', + ), + 873 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '58', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '985', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '58', + 'sort_key_string' => '', + 'version' => '1', + ), + 874 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="itemized_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="170"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '986', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 875 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="itemized_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="185"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '987', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 876 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="itemized_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="166"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '988', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 877 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="horizontally_listed_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="176"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '989', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 878 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '990', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 879 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '302', + 'contentobject_id' => '166', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Forum', + 'data_type_string' => 'ezstring', + 'id' => '991', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'forum', + 'version' => '1', + ), + 880 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '303', + 'contentobject_id' => '166', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '992', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 881 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '304', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nulla vitae tellus sit amet', + 'data_type_string' => 'ezstring', + 'id' => '993', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'nulla vitae tellus sit amet', + 'version' => '1', + ), + 882 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '305', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nulla vitae tellus sit amet velit tincidunt gravida. Vivamus cursus, pede et lacinia porttitor, urna ante sagittis velit, id vulputate dui metus a erat.', + 'data_type_string' => 'eztext', + 'id' => '994', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 883 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '306', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '995', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 884 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '307', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '996', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 885 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '304', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ut mollis sodales nibh', + 'data_type_string' => 'ezstring', + 'id' => '997', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ut mollis sodales nibh', + 'version' => '1', + ), + 886 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '305', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Donec vulputate lectus. Suspendisse tempus molestie metus. Nullam non velit eget elit iaculis fringilla. Ut interdum auctor orci. Ut mollis sodales nibh.', + 'data_type_string' => 'eztext', + 'id' => '998', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 887 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '306', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '999', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 888 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '307', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '1000', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 889 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '304', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nam risus leo', + 'data_type_string' => 'ezstring', + 'id' => '1001', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'nam risus leo', + 'version' => '1', + ), + 890 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '305', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nulla facilisi. Nam risus leo, accumsan et, accumsan ut, aliquam sed, dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', + 'data_type_string' => 'eztext', + 'id' => '1002', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 891 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '306', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1003', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 892 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '307', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '1004', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 893 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Wiki', + 'data_type_string' => 'ezstring', + 'id' => '1005', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'wiki', + 'version' => '1', + ), + 894 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vestibulum ultricies lorem sed pede. Donec massa. Cras imperdiet, lectus mollis rhoncus gravida, enim lacus iaculis libero, consectetuer lobortis sapien purus nec purus. Donec nulla dui, commodo et, porttitor eu, malesuada id, nisi. Cras in mi in dolor ultricies pretium. Curabitur pellentesque auctor ligula. Suspendisse malesuada, nunc a tempor lacinia, lectus turpis commodo urna, eu porta risus nisl nec dui. Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1006', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 895 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1007', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 896 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1008', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 897 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Sed suscipit', + 'data_type_string' => 'ezstring', + 'id' => '1009', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'sed suscipit', + 'version' => '1', + ), + 898 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1010', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 899 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1011', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 900 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1012', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 901 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ut interdum', + 'data_type_string' => 'ezstring', + 'id' => '1013', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ut interdum', + 'version' => '1', + ), + 902 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Etiam nec metus. Proin mauris lorem, lobortis dapibus, semper id, nonummy eu, lacus. Aliquam erat volutpat. Vivamus hendrerit aliquam ipsum. Maecenas suscipit ante sit amet risus. Nullam lacus. Praesent varius imperdiet sapien. Nulla sit amet massa nonummy felis aliquam varius. Vivamus sed arcu. Mauris sodales tristique risus. Cras sed sem. Quisque est eros, lacinia id, placerat sit amet, varius ac, odio. Aenean placerat, justo eu laoreet laoreet, purus quam faucibus risus, vel accumsan mauris ligula in magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1014', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 903 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1015', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 904 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1016', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 905 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Fusce pulvinar', + 'data_type_string' => 'ezstring', + 'id' => '1017', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fusce pulvinar', + 'version' => '1', + ), + 906 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Donec consectetuer sodales urna. Nam iaculis. Duis cursus nisl ut lorem. Vivamus pharetra pretium nulla. Mauris pharetra augue a dolor. Duis neque lorem, rhoncus nec, mattis id, dapibus vel, nisl. Quisque aliquam pellentesque leo. Ut in ante. Aliquam mollis, dolor eget malesuada euismod, tellus mi hendrerit dui, sit amet vestibulum neque massa ut mauris. Phasellus sed nisi. In eget odio nec tellus semper placerat. Fusce pulvinar malesuada nibh. Aliquam feugiat ligula ut nulla. Phasellus vitae felis in nulla gravida commodo. Cras magna justo, ultricies ut, euismod vitae, congue quis, quam. Mauris est purus, lobortis vitae, rutrum eu, dictum sed, mauris. In vehicula viverra dui. Curabitur id neque. Praesent facilisis. Mauris est. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1018', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 907 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1019', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 908 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1020', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 909 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Duis id tortor', + 'data_type_string' => 'ezstring', + 'id' => '1021', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'duis id tortor', + 'version' => '1', + ), + 910 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce iaculis. Duis id tortor sit amet quam interdum accumsan. Vestibulum imperdiet odio non nisl. Nulla in odio. Sed sed libero sed risus eleifend bibendum. Cras arcu tellus, congue ac, ornare eget, vulputate non, pede. Vivamus molestie purus ut orci. Integer congue aliquam purus. Fusce eu metus eu mauris imperdiet porta. Nam urna mi, consequat in, iaculis eget, tempor eu, elit. Fusce lorem. Sed nec velit sed augue malesuada blandit. Nullam quis elit id lorem adipiscing condimentum. Nullam aliquam justo nec urna. Integer eget libero. Sed in tellus non lorem iaculis consequat. Aenean at lorem dictum mi imperdiet consequat. Sed euismod sodales magna. Cras consectetuer pede ac massa porta lacinia.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1022', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 911 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1023', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 912 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1024', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 913 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Curabitur lacinia', + 'data_type_string' => 'ezstring', + 'id' => '1025', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'curabitur lacinia', + 'version' => '1', + ), + 914 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Mauris pede libero, accumsan vel, tristique eget, tempus sit amet, sapien. Fusce sed arcu. Pellentesque pharetra mattis velit. In nec eros. Praesent viverra metus ut tellus. In tellus elit, imperdiet at, tincidunt egestas, malesuada sed, nisl. Aliquam posuere mattis pede. Curabitur lacinia condimentum nunc. Phasellus mattis. Fusce ac pede. Ut in neque. Fusce adipiscing mi sit amet velit. Cras varius. Vivamus elementum dui id lectus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1026', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 915 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1027', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 916 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1028', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 917 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '286', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Pictures', + 'data_type_string' => 'ezstring', + 'id' => '1029', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'pictures', + 'version' => '1', + ), + 918 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '287', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>images&nbsp;by Quoc Huy and Paal Berg</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1030', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 919 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '288', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1031', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 920 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '289', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '1032', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 921 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ivo on eZ Tags', + 'data_type_string' => 'ezstring', + 'id' => '1033', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ivo on ez tags', + 'version' => '1', + ), + 922 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1034', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 923 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Ivo-on-eZ-Tags.jpg" suffix="jpg" basename="Ivo-on-eZ-Tags" dirpath="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US/Ivo-on-eZ-Tags.jpg" original_filename="9c0a818b.jpg" mime_type="image/jpeg" width="640" height="480" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1035" attribute_version="1" attribute_language="eng-US"/><information Height="480" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/4.9" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxMTozNjo1MQ==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvMzAw</item><item key="FNumber" base64="1">NDkvMTA=</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">ODAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxMTozNjo1MQ==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxMTozNjo1MQ==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">NDcwLzEw</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAAAAQAAAaAAMAAQAAAAIAAAAcAAMAAQAAAAIAAAAfAAMAAQAAAAEAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAANAlAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAAAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAIAAAAyAAMAAQAAAAAAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAEAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAAAAAAAACgAMAAQAAAAIAAAADgAMAAQAAAAEAAAAEgAMAAQAAAKQGAAAFgAMAAQAAAB4EAAAGgAMAAQAAAIYHAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCAoq8AAqSvADCmrwAAyq9EALKvAQC0rwAAuq8IALyv7/++rw0A+K8AAPqvAACor1QEqq9sD8ivTUDYr3wDtq8gAbivAADOr9MA0q8hANCvKACsr5UBsK9EAK6vRADUr2UA9K8oAPKvKADirwAA5K8CAOCvXw/mrwAA6K8BAOqvAADsrwAA9q9xNNqvAADWrwAE8K8kAAQGwxkKBmwPyAYBAZqvAACcryAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFXQIiBWIC7gddAiQFcgQQBWgD3gaeAyYFCwDABgAAKAU6ARgFWQI6BQEAxRkAAFAFVwJSBYACygaoAAAFAwA2BQAAQgUAAAgFAAACBQAACgUAAAQFAABABQAABAcAAAwHAAAGBwAACAcAAAoHAADyBgAA9gb///QGAAD4Bv//DgVnAyoFTgAsBQEDMgUBA/oGWQL8BqgAAAcAAjsFAQA+BQEAxhlXAsgZkAIwBQABHAXfAOgG+AoaBWoT7wYBAPAGAAD+BoAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgczABAHAAASByMAFAcBABYHXgAXBwAAGAcAAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFKgFYBRIDWgXUAPD/V0LqAAAEpAYCBIYHXAQeBAQE/QAGBA0BYASeAxoEGQBeBA4AXwQGABIE1wAUBPsAFgR1ARgERgHMBGcEzgTnCdAE7wbSBDkHCAQDAQoEKgG0BNIAtgQAAUAE9QAwBF4AOAR4ADIEgAA6BIQANATg/zwEBAA2BBAAPgQpAEwE/gBOBAsBwAT9AMIEDQHqBAAAgAUOAIIFfwCDBYUAjAUAAI4FhgCPBYwAUgTXAFQE+wBWBNcAWAT7ANQE1wDWBPsA2ATXANoE+wDwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qFABQqhQAUqoUAFSqFABEqv//RqrMiEiqdwNKqgAATKoAADiqUAA6qlAAPKpQAD6qUAAuqoiIMKrMiDKqd1U0qiIRNqoAAIIEIACABAkAhAQAAISqcABgqikzYqopM2SqYHxmqmB8aKo6SWqqAQBsqgAAbqoAAIaqAACIqgAAiqoUAIyqFACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgAAXKoAAF6qIACaqgAAnKoAAMCq0ADCqtAAxKrQAMaq0ADIqggI8P9DTQ4A/AUAMASsAADw/0RTLgAArwABAq+nhQqv5wAEr4UBBq8QAQivCQAMr0gBDq8QARCvhQESr6sA8P9JU8oAiK4AALSuawC2rmIAuK4UC7quFAuArq8Dgq7+A4Su5wOGrucDAK64AwKusAMErqwDBq6mAwiupgMKrqIDDK6mAw6upAMQrqYDEq6oAxSurAMWrq4DGK62AxquugMcrsADHq7IAyCuGAQirg4EJK4QBCauEAQorhYEKq4UBCyuFAQurgwEMK4MBDKuCgQ0rgQENq72Aziu9AM6rvgDPK74Az6uAARArgYCQq4HAkSuAABGrgAAYK4RAmKuEAJkrgAAZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAUAAGQFAADw/0lBOgCgqf//oqn//6Sp//+mqf//qKn//6qp//+sqf//rqn//4CpAACCqQAAhKkAAIipAACGqTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk0OB3QHnQeZB3YHNQd8AjQBogAdAEEAHwAfACAAIAAgAOcGagfWB6wHkgerB6ECUgGnAB8ARgAiACIAIwAjACMADQiaCIYISgizBwEIlgJZAaUAIQBJACMAIwAlACUAJACjCOcI5gjYCKUIYQh0Ak4BmAAXACMAOAA5ADcANQAzAHYI3gjXCMMImAhgCGMCTAHMAHEALACXAOUA5wDqAOwAvwjTCKwH2waXB10IPgJNAcgAcAB/AOUA8gD3APIA/wDnCAkHKQbIB1wIXAgPAjoBfgBYAKYAmgBSAI8ACgE8AecIVQfMBdMFGAdbCOUBFAEgABwALgAkAAwADgCfAEEB3AjKBnAFkgSHBl4FWQF4ABUAEgAdABUADAAMAFAAbQHGCF8HFwW5A4ABswBKAA4AFAAPACIAIgALABIAFQARAf0CWwKNAV4APABHADMAPAAaAA4AGwAaAAoAEwAPANEArAMGBO4ExAKrA1UFIgHzACkADAAdADIAEgAPABkAdwASCIAIbwg2CA4Inwc4AfsAJgAMAEMAUAAbABMALwDqACkHRQfwB6sH5gdsBzcBAQEgAAwAHwAeAA0AGgCiAHgB1AXQBWQGHgZIBtQFJgHyABEACQAWABcAEAAkAGwAlgHLAOIA/QAIAQgBDwERAeAADAAGAAgACgAHABAANwCiAVBSU1RXGBsDvgJAA7oDxwOWA/EDCgUdBSYD/gzFC+sLNw1IEJ0Z3wNhA9oDDAQaBBAEkgXJBx8H/wM3C4oINwjLDnoLDRyjBDoERgRWBI8ECQX/B5AKdwoQCX8DYwKOAbMFOwcpIDkHuAdSBx0HJwc5CB8N+A9uDoAI8gEXAboAAQIqBH4fhgUuBTQFNwVcBcYG0QyXEjURAgXYAe4ApQAZAgQEwB1VBnAFlBTxLRMsvCLjIaQzvjHyBbICCwNhAq4CAgTUGgAGJQUIFLYcawOoAqYCSQKKDLcLHgPmBmMLlwEbBBgYHAWlBHwPVBRGAggCkAIrAfkA5wAyAXYC3Ag5AmkDQRbBBCAETAbUC7ID6QM8BKQB8QClAvMBtgIGB/wBpAdiFSUE6QN6Dk8NGQIrArECpAGiAukB1wCiBCYQtwPwACIUUgbWBj8JDhKtA00JwQgSCmsRbAzCB8kGNgdfAskAkg3LA4EEywQsBQkEfwOSBc4GoAWzBH4EHQOmAcsA3gAFHbQfTyTEIRIi8BtVDW0eRyGKCBYEhgLNALsAiADJAH8iA2qxdRt5nX2ceMxJzYWnO9AH+APNAYsAaAB5AI4AoyoLyvTIgtBwxlO182UbyjFOWAdiAsQAoQAhAo8AgQCYLd3Npsy10hO1pJ6FrT/I81BTB90B/QEsAisDQAGTAPoWzALMAm0D0AO+A6MDMQSWBREFxQOODHgLqguXDrQOUxhKA4ID7AMcBCQEMgQNBmgIowe4BesJ9QYrB9ANjArLG88DUgRRBG0EiwRTBasIGAuhClUIfQLhASoBKwU9BsceqwaxB3YHHgc6B4sIxw0+EHgOaQfNAQUBrQBOAgsEER6qBDUFpgU3CGoNSRLyGLkdKhZaBOwB3ACqALoCFQSdHN4EYAUFGmAzVCzAH8IfzjPTMlIIMQPbA9oDVQJGBKEZmQQEBZkVrxn7A8oCpAJrAnYOVwuDA7UHmwqBAVEE6BYvBIwEnxHXDxMC1wGCAiYB7gDbAHYBHQKjCA4C5wMmFbYD8APyB0gNAAT7AxcEfwHoAHcCuAGYAsUGBAJ3Bw4UjwPNA9MO4QoUAh4CuAJ9AZsC4wHXAOgGTxEzA/MAixISBsIGmwdnDDgCNQdqBloGrAidCZ0IlAaXBJcB1gDTDcsHEAnJCPUImgVqBeIIUAvOBdwDtgP2AXoBoAD5AHQeJSKeJi8k2CRoG60QlCAFIqAGSwQEAqAAjgCCAM8AXCuViauTNZeQmoSED19Bo145zwVYA3MBcgBYAHAAhQCHN1nMq8np0DK7O6bzaVrJxkFzBSECsADtAMsCjQBzABQ8086EzZTSU65joCOtxsejRLkF2gEzAj0C9QQCAoMAAAAAAAAAgAHgDzwMLAoACAAOBAgIAMAPwA0AAAAAAAAmAAAAAAAAAAAAwB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwBGQ0NWBQABAGwPXw8AAAAAAAAAAAAAAAAAAAAAAAAAAFIlCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBgDcsBoQH6APgB+QDfACQBkwHpAKoDGAT5AkwBfASWATYB/QF7A9QAjAfyAAAAAACiADMBAAAAAIAO3gG6AQUBIgI3Ad8ARQGAAfkA5AM5BBgDagGRBBQCNgEjAo0D5gDNB/cAAAAAAKYARAEAAAAAoA/gAboBHwEkAjgB2gBbAZQBBAHdA1QEMgN5AZ8EHgIuAT8CtAPwAAgI/wAAAAAArQBWAQAAAADAEMsBwAEhAf4BNQHZAGUBhwEFAdEDQwQ1A4EBmAQQAiwBRgKWA/EAAwgAAQAAAAChAFcBAAAAAOARhQGkAQ0B3gENAdgAKQFDAfEAUgMLBAgDYAF5BP4BNQEBAsIC6QCIB9YAAAAAAIQA8AAAAAAAlTjTAOYG5QHGAcABbwLyAbUBAAAMBAwCvA2jA60BBgMfAxkDogEAAOMF6wAAAAAAHAAOAAAAAAA1NyQBRAEKASEBhAI9ATgBBAFZAQYDBwFwAvgAJwIKBscB/QFsAu8C0QW/AQAAAABsAvgCAAAAABU2RgGeATMBUgGWA1ABZAGBAR4C/gNIAfYCHgGFAisHDgI+AgoDlQP7BjUCAAAAAJ8C8wIAAAAA9TRhAbsBNwFnAQ4EVAFmAZoBLAJqBHMBVQM0AacCeAcgAkwCLgO3A3wHjwIAAAAA/QILAwAAAADVM50BOwJbAdgBwwShAbkBMALCAmsFngGdA10BvgLcB0QCZwJIA/4DEQiFAgAAAADjAv0CAAAAALUyaQG3AUoBgAGkA2MBcgFwAf0BSASUAVcDUgFkAkAHAwInAr0CjQNlB00CAAAAAK4CnQIAAAAAlTEuAUgBGAE3AR8CQQEoAeoAOgECA18B1AIiAQ8CCgbAAd8BUQLYAjIGRQIAAAAApQKYAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWg8PDw8PDw8MDA4KDg4ODg4PDw8PDw8PAwoOCg4ODg4ODw8PDw8PDwMKDg4ODg4ODg8PDw8PDw8DCgoOCgoKCgoPDw8PDw8PAwoKCgoKCgoKDw8PDw8PDwMKCgoKCgoKCg8PDw8PDw8DCg4KCQ4OCgoPDw8PDw8PDAoODg4ODgoKDw8PDwUPAQEODg4ODg4KCg8PDw8PAQ8ODg4ODg4OCQoPDw8BDw8PCQoODg4ODg4KDwIBDw8PDwEKDgoKDg4OCg8PDw8PDw8DCg4KCg4ODgoPDw8PDw8PAwoODg4ODgoKDw8PDw8PDwMKDg4ODg4KCgUFBQICAgEDCg4ODg4OCgpCTUhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAH8AAAAAAQAAfwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">NDgw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">Mjgw</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">Mg==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">MA==</item><item key="ImageUniqueID" base64="1">ZjMzYWVmMjUxZTZhNWRhYjYwMDdhYzAyOGJjZDU3NjI=</item></array></information><alias name="listitem" filename="Ivo-on-eZ-Tags_listitem.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US/Ivo-on-eZ-Tags_listitem.jpg" mime_type="image/jpeg" width="130" height="98" alias_key="379714049" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1035', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 924 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1036', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 925 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Are you ready for the Community day?', + 'data_type_string' => 'ezstring', + 'id' => '1037', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'are you ready for the community day?', + 'version' => '1', + ), + 926 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1038', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 927 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Are-you-ready-for-the-Community-day.jpg" suffix="jpg" basename="Are-you-ready-for-the-Community-day" dirpath="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US/Are-you-ready-for-the-Community-day.jpg" original_filename="65d29873.jpg" mime_type="image/jpeg" width="640" height="480" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1039" attribute_version="1" attribute_language="eng-US"/><information Height="480" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/4.5" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxMTozODozNg==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvNDAw</item><item key="FNumber" base64="1">NDUvMTA=</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">MTYw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxMTozODozNg==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxMTozODozNg==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MTEzLzEw</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAAAAQAAAaAAMAAQAAAAIAAAAcAAMAAQAAAAIAAAAfAAMAAQAAAAEAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAAEkHAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAAAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAIAAAAyAAMAAQAAAAAAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAEAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAAAAAAAACgAMAAQAAAAEAAAADgAMAAQAAAAEAAAAEgAMAAQAAACoHAAAFgAMAAQAAAB4EAAAGgAMAAQAAAAUIAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCBoq8AAqSvADCmrwAAyq8sALKvAQC0rwAAuq8iALyv6f++rxcA+K8AAPqvAACor2YCqq8MLciv8gPYr0ACtq/AALivAADOr5cA0q8WANCvKACsrx0BsK9HAK6vRwDUrz8A9K8iAPKvKADirwAA5K8BAOCv9SzmrwcA6K8HAOqvAwDsrwAA9q8AANqvAADWrwAE8K8OAAQGvREKBgwtyAYBAZqvAACcrwAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFmQIiBWIC7geZAiQFdgUQBWsE3gaPBCYFegDABgAAKAW2ABgFgAE6BQEAxRkAAFAFLQJSBUkDygY5AAAFAwA2BQAAQgUAAAgFAAACBQAACgUAAAQFAABABQAABAcAAAwHAAAGBwAACAcAAAoHAADyBgAA9gb///QGAAD4Bv//DgV6BCoFaAAsBYABMgWAAfoGgAH8BgAAAAcAATsFAQA+BQEAxhktAsgZpwIwBQABHAXFAOgG7QoaBWoT7wYBAPAGAQD+BgAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgcAABAHAAASBwEAFAcBABYHAAAXBwAAGAcAAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFKgFYBRIDWgVAAPD/V0LqAAAEKgcCBAUIXAQeBAQEEQEGBPsAYASPBBoEAAFeBHIAXwQKABIE3AAUBPsAFgR1ARgERgHMBGcEzgTnCdAE7wbSBDkHCAQXAQoE9gC0BNIQtgSAAEAE9QAwBF8AOAR3ADIEfwA6BI8ANATs/zwEDgA2BBIAPgQnAEwEEgFOBPYAwAQRAcIE+QDqBAAAgAVoAIIFiQCDBXsAjAUKAI4FhgCPBYwAUgTcAFQE+wBWBNwAWAT7ANQE3ADWBPsA2ATcANoE+wDwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qBgBQqgYAUqoGAFSqBgBEqoiIRqrdqkiqiGZKqhEATKoAADiqMAA6qjAAPKowAD6qMAAuqoiIMKrMiDKqd2Y0qiIRNqoAAIIEAACABAkAhAQAAISqcABgqkVFYqpFRWSqWHJmqlhyaKpDQ2qqAgBsqgAAbqoAAIaqAACIqgAAiqoIAIyqCACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgkAXKoJAF6qIACaqgAAnKoAAMCq///Cqv//xKr//8aq///Iqv//8P9DTQ4A/AUAMASsAADw/0RTLgAAr4AAAq/xhwqvVAAEr1YBBq83AAivAAAMr3UADq8AABCvVgESrzcA8P9JU8oAiK4AALSurgC2rpoAuK6jALquTAGArkwDgq76A4Su5wOGrucDAK4mAwKuLAMEri4DBq4uAwiuNAMKrjgDDK5AAw6uSgMQrkwDEq5SAxSuVAMWrloDGK5iAxquaAMcrmoDHq5sAyCu8AMirvgDJK74Ayau8AMorugDKq7kAyyu3AMurt4DMK7YAzKu4AM0ruYDNq7iAziu5AM6ruwDPK7uAz6u7gNArukBQq7qAUSuAABGrgAAYK7wAWKu7gFkrgAAZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAUAAGQFAADw/0lBOgCgqf//oqn//6Sp//+mqf//qKn//6qp//+sqf//rqn//4CpAACCqQAAhKkAAIipAACGqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk38AuICzAK4AqoCngKdApoCkQKMAoYCfwJ+AoECfgJkAoQCRgKHAnUCOQK0AoECTQJCAg0CygHEAb8BzQEcAjcCTwJ+AfgB8AGDAscCpwKXApICUAJEAsMBmwGyAdABGwL7Aq8C5ALeAt0C3wLjAugC3QLTAsgCuAKsAqUClAJ3AgoDAQP1AvIC8gL0AvwC+ALrAt0C0AK9ArACogKNAnECDgMJAwEDBAMIAwoDDQMJA/gC6ALZAsICtQKeAosCcwITAxAD/wLwAiIDJQMrAyIDAQPuAuEClwK8AqgCkwJ7AhMDEgNqAiUC9AGwAdgBCwKxAagBMQKfAXEBKwKYAoYCCgMPA/4CzgKfAtMC7QKWArwCagKuAoQCQQJzApgCgwL9AgQDCgMWA4ICTQJrAq8CJQIQAggCLgK7AqgClQJ7AuMC7wLzAgMDCQMIAwsDBQP6Au8C4gLMArMCmQKHAmMC0QLVAt0C5wLrAugC6ALkAt4C2ALNAroCqQKRAnYCXgLMAssCzALPAtACywLHAscCxgLCArkCrAKiAo4CcwJSAoICdQJyAnICcgJwAmsCbgJxAnECawJsAmcCYAJJAiwCdgEgARcBGQFQAVMBNwErAUoBEQE8AUMB/gD5APEAEQFYAkICPAI5AjcCMQIzAjQCLwInAhsCFAIOAg0C/QHjAVBSU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGQ0NWBgABAAwt9SwTLTwtAAAAAAAAAAAAAAAAAAAAAEk0uCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDJKqQBfQFvAcwA0wAAAAAAAAAAAAAAOAPzAmEDjQBYAQAAAAAAAAAAAACGAwAAAACGA4YDAAAAAIkr3gGrAbsBywDnAAAAAAAAAAAAAACGAz4DvgObAIEBAAAAAAAAAAAAAMsDAAAAAMsDywMAAAAASSwzAvIBHALXAA8BAAAAAAAAAAAAAM8DfgMYBKgAogEAAAAAAAAAAAAADgQAAAAADgQOBAAAAAAJLWYCKwJ0AuEAPAEAAAAAAAAAAAAA7AOnA1sEsAC4AQAAAAAAAAAAAAAsBAAAAAAsBCwEAAAAAMktPQIPAm4C4gBGAQAAAAAAAAAAAADZA48DTAS6AMoBAAAAAAAAAAAAAA4EAAAAAA4EDgQAAAAAiS7wAcgBJgLdADYBAAAAAAAAAAAAAI8DUwMgBLEAvgEAAAAAAAAAAAAA1QMAAAAA1QPVAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWgYGBgYGBgYGBgYGBgYGAwMGBgMGBgYGAwMDBgYGAwMDBgMDAwYGBgYGBgYGBgYDAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMGAwYGBgYGBgYGBgYDBgYGAwMGBgYGBgYGBgMGBgMDAwMDBgYGBgYGBgYGBgYGAwMDBgYGBgYGBgYGBgYDAwMDAwYGBgYGBgYGBgYGAwMDAwMGBgYGBgYGBgMGBgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBAQEBAQEBAQEBAQEBANCTUhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAH8AAAAAAQAAfwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">NDgw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">Njc=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">MQ==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">MA==</item><item key="ImageUniqueID" base64="1">MzZlNTczMTBhYjA5ZTQ1ZGIzYWRiOTA2ZWY1YTAzZWU=</item></array></information><alias name="listitem" filename="Are-you-ready-for-the-Community-day_listitem.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US/Are-you-ready-for-the-Community-day_listitem.jpg" mime_type="image/jpeg" width="130" height="98" alias_key="379714049" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1039', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 928 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1040', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 929 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Let\'s work together!', + 'data_type_string' => 'ezstring', + 'id' => '1041', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'let\'s work together!', + 'version' => '1', + ), + 930 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1042', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 931 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Let-s-work-together.jpg" suffix="jpg" basename="Let-s-work-together" dirpath="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US/Let-s-work-together.jpg" original_filename="3ef0e6bc.jpg" mime_type="image/jpeg" width="640" height="360" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1043" attribute_version="1" attribute_language="eng-US"/><information Height="360" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/3.3" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxNjo0NTowOA==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvMTUw</item><item key="FNumber" base64="1">MzMvMTA=</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">ODAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxNjo0NTowOA==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxNjo0NTowOA==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">NDcvMTA=</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAACAAAAAaAAMAAQAAAAQAAAAcAAMAAQAAAAIAAAAfAAMAAQAAABUAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAAIUQAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAIAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAEAAAAyAAMAAQAAAAEAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAUAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAABUAAAACgAMAAQAAAAIAAAADgAMAAQAAAAIAAAAEgAMAAQAAABQFAAAFgAMAAQAAAB4EAAAGgAMAAQAAAIsIAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCIoq8CgqSvEDCmrwAAyq9QALKvAwC0rwEAuq8IALyv7/++rwAA+K8AAPqvMACor+ADqq/IDMivQJzYr5T+tq8gAbivAADOr0sB0q8oANCvKACsr4QCsK9TAK6vUwDUrycA9K8pAPKvKQDirwAA5K8BAOCvmAzmrwEA6K8AAOqvAADsrwAA9q8WU9qvAADWrwAA8K8AAAQGtgoKBsgMyAYBAZqvAACcrwAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFFQIiBWIC7gcdBSQFsAIQBaUB3ga0ASYFBgDABgAAKAWyARgFWQI6BQEAxRkCAFAFxQFSBasBygYTAgAFAwA2BQAAQgUAAAgFAAACBQAACgUAAAQFAABABQAABAfT/gwHsP8GBwAACAcZAAoHAADyBgAA9gb///QGAAD4Bk0ADgUxAioFFQAsBQEDMgUBA/oGWQL8BqgAAAcAAjsFAQA+BQIAxhnFAcgZ7QEwBYABHAUbAugGvwoaBWoT7wYCAPAGAQD+BgAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgckABAHEQASBzgAFAdCDRYHQgAXBzYAGAcjAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFKAFYBTIBWgXUAPD/V0LqAAAEFAUCBIsIXAQeBAQEwQAGBOgAYAS0ARoEBABeBAAAXwQGABIE//8UBP//FgT//xgE///MBGcEzgTnCdAE7wbSBDkHCASEAAoECgG0BAAAtgQBAUAE9QAwBEoAOARZADIEZAA6BHsANAT7/zwEGwA2BBMAPgQlAEwEDAFOBBgBwATBAMIE6ADqBAAAgAUAAIIFhgCDBYwAjAUAAI4FhgCPBYwAUgS4AFQE3gBWBLgAWATeANQEygDWBPEA2AS4ANoE3gDwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qFABQqhQAUqoUAFSqFABEqv//RqrMiEiqdwNKqgAATKoAADiqUAA6qlAAPKpQAD6qUAAuqoiIMKrMiDKqd1U0qiIRNqoAAIIEKgCABAQAhAQAAISqcABgqjI+YqoyPmSqOktmqjpLaKoxPmqqAQBsqgAAbqoAAIaqAACIqgAAiqoMAIyqDACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgAAXKoAAF6qIACaqgAAnKoAAMCq0ADCqtAAxKrQAMaq0ADIqggI8P9DTQ4A/AUAMASsAADw/0RTLgAArwAAAq8AAAqvAAAErwAABq8AAAivAAAMrwAADq8AABCvAAASrwAA8P9JU8oAiK4AALSuMQC2rjcAuK7SArquBwKArncDgq7sBoSu5wOGrucDAK50AwKuXAMErlIDBq5IAwiuRAMKrkIDDK5IAw6uTAMQrlIDEq5SAxSuUgMWrk4DGK4AABquAAAcrgAAHq4AACCu9gMiruYDJK7YAyauyAMorsoDKq7YAyyu7AMurvYDMK72AzKu0gM0rrQDNq6kAziuAAA6rgAAPK4AAD6uAABArvABQq7oAUSu6AFGrgAAYK7wAWKu8QFkrvABZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAViAGQFAATw/0lBOgCgqfECoqnwD6Sp//+mqf//qKkRQqqpQA+sqf//rqn//4CpPwKCqQAAhKkAAIipjwCGqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk3YA+ACEQSTA7MA8AB6AY4B0wLiCxwM6gqSAusA6AACASUFtAIbAvsAvwBgAMQAGgHVAsYOZg+lDjkDcgQuAiMBFgXJAyID+wDmAFoAywAsARkD5g5kD4cOmQSaCdYDMgHuBSYElAP+Av4A2gB6AT0BGgMHD2EPsg7IBdQLHwObAc4GCwQDAS8BCAEAATAC8QFlAkQH3wVnCtgG0Q0ABIADmQY6BW4BYgFqAbMBcQLnA30CRAE7ArMBDQUnChoCkgPTAdYBAAK7AS0BHgJ1BCEEQwNGAloBWQLhAKAHGQMUAeoB8ADJAWgAegDXAIkCXQJlAxIDugCxAWgAIwTtBVAA3gBOADYBQgCZAFkAqQF1AOoBVQE/AfkAKAAvACoAUwA3ABsASQBQAOQAtgXAAFEA8gAbA/wBeQAoAH8AFgA1ACIAHAA4AC0ADwFPAZAATABoAMwAUAFrAFkAbwAcAB4AFgAYAC0AKwASAa8AOAA0ACsAWAApABcAGAAnAB4AHAAUAB0AIwAYAOQACAExACIAHABiACkAEAAdABoAFwAaADAAMAA7ABcAYwCYANsAJAAcAH8AMQAsADIAIAAPABMAwgAsAEIAGQAlACgALQAnAC8AswA4AC8AIQAiABEADwA0AGQAPgAlACEALwAeACEAIwBXAB8AKAAjABQAEAAMAFBSU1QbFMMMYRLwDysCnwS3BocHkhE8SB5PXkVoCd8E+wQuBbUZXQyGC8QFVwLEASgE3AUSEorpK+DMmvgMgBSzB8kFiBrmEQwQbgYpArQBNgRVBqITpfEH2BSF5BaMMZENCwZKHsMSDRUKDyUCCQVRB9gGfxUK9371Wb4HH4k+YAiDB+IieBBRBfMHdQJKBh0KbAtmDdVf3kgDeLoo7FEmED0QOh6EFrYIhQjQBUQJXA7rExIKswY0CxkH3Cc9RhwMLRMbB5sHqgl7CGwFVAu0Fv4Ulg5wC0IHvwygBkcoYQvAFC0I8QOKCJ0BgQKWBDQNjwoXEtEN6QPcCOAB2yNaJ6ELJwNEAkkETgG2AuwBKQg6AqUJTgYEBY0ErwDZAP0ARgLRAOQANAFNAWgEUC15A3oBgwcZE5IJsAH/ANsBcwAWAY4AAwH1ANkAEgVIBa4CZwHtAekDqwaTAScCxAF3AJoAbQAZAdEAKwHcBNYC5QDlAMoAogGPAF4AggCtAIYAhwBYABQBlgCbAG0E4gSXAJgAhAAGArMAWwCbAHYAeAB8AIEADwH9AGcAeAFgAo4BsQC9ABEDBAHQAP8AdwBcAG4AwwH6ADIBaQDkAMUAvAC7APoArQP6AOwAtACLAFYAXADxAAsCHgGrAJgA1wCDAKYAlQC9AcIAzACjAFsAVQBVAEMUfAubEIgOAgJmBEkGSgfUEvVK8E41QrMH5wQUBUMFdxlxCyoLigU9Ar8BRQRHBqkUqfHw3zCYdQvxE8UGugWnGgQRBQ9PBgYCtwFFBIMGiBpg9d3Wd4O7FukywgnzBSce3RCfFL4N+wGaBUAHBAdcIEL3KvXIsrsgPD3fBkcH2iL9DlcFNQjYAbYG0QkwDO8P/F53SXZwCix4TskPfg8YHPYUIwlqCR0FlwkaDwEUYQmqBkgLeQaRKzlDdwwNE2wGugbRCacI/wSpC5cWexUGDnILYgcJDfgH1SZeCXkblQfJA7IIugGWAh8F2AxVCrASHA3WAywJ5gFkKfojnhWZAqsCbgNlAZECdwKlB3wCNwlMBn0EjwS4AOsALgEsBM8AAQExAVIBWgQpLYwDzwFvC4UPsgmJATcBrwF5ACIBhQBQAe8A4QAfBaMEtwJyARMCFATHBmgBSwKxAXIAoABhAEcCzAAvAaoEqwLqAOkAxgC1AawAjgCQALoAjACEAFYA3gGWAKgAOgTlBI0AmACGAP4BfgBeAJsAfAB+AH4AawASAfYAYgBXAYQC4gGrAN0AxwLQAMcAAwFkAFMAaABOAfsAJQFfAM0AwQC5ALUACQFVA80A2wC0AIMAWQBcAOwAFgIWAaAAlQDMAHQAmwCOAJkBugC+AKAAWABTAHkAAAAAAAAARALUAgQLjAJIAgACwAAAAAAAAAAAAAAAAAAWAAAAAAAAAAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAABgBGQ0NWBQABAMgMmAwAAAAAAAAAAAAAAAAAAAAAAAAAAD8ZdwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQB3C+sChAffAaoBSgEHAakBjwIAAMcEsQQyDMsC6wKrAbcAdQIkBQAAoQdDAQAAAAACAAEAAAAAAJcM4APFCYUCDAJqAUwBAwIgAwAAagY5BVoNMANJA84B4QD0AqAFAABhCHcBAAAAAAIAAgAAAAAAtw23A9gJwQJOApoBbAE7AsMDAABzBjoFZQ1GA1gD3gECAQADBgYAAGoIfgEAAAAAAgAAAAAAAADXDjAD9AikAoQCegEhATECFwQAAKwFFQXfDEwDeQPZAecAEQNRBgAADAiBAQAAAAADAAIAAAAAAPcPXwJiBuIByAEqAfcApwH7AgAA/gNKBCMLzQIlA4MB0wCPApMFAAC1BmIBAAAAAAMAAgAAAAAAoxBCAkkG+wH/AbABggGIAVQBAAAGBNsBgAeqAc0BGQFjASgBxwAAAGkEwgAAAAAACAAFAAAAAACDD0YCqwYGAnECsgGpAZMBTwEAAC0EKwKbCdQBQAI/AaMBWAHYAAAAnwXhAAAAAAAJAAQAAAAAAGMORAJxCCkCKwPLAb0BngFJAQAABgWDApILFwKbAl0ByQF8AdwAAAC4BvQAAAAAAAoABQAAAAAAQw2bAmEKdgIGA+IBpwG9AVwBAADyBd0CnwxKApoCcQHFAZEB5gAAAHUH6QAAAAAACQAFAAAAAAAjDIkCyQlTAmICswGIAZIBWwEAACAG2gJODC0CQQJLAZgBcwHVAAAAbwfgAAAAAAAIAAIAAAAAAAMLSQI9B/sBAwKkAXkBjgFWAQAAugSIAk4K8gHHATABVwE7AcMAAABvBtEAAAAAAAkABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWgQKCgoKCgoKCg4ODgoKCgoKCgEJCg4OCg4ODg4KCgoKCgoCCgoOCgoODg4OCgoKCgoKDgoKCgoKDg4ODgoKCgoKCgoKCgoACg4ODg4KCgAKCgoKCgoKCgoKCgoKBAoKCgoKCgoKCgoOCgoKCgoKCgoKDgoKCg4KDgoKCgoKCgoKDg4OCg4KCgoKCgoKDg4OCg4OCgoOCgoOCgoKDgoODgoOCgoOCgoKDgkKCg4KDg4ODgoODgoKDg4ODg4ODg4ODgoKDg4KCg4ODgoODg4ODg4KCg4ODgoKDg4KDg4KDg4OCg4ODg4ODg4OCg4ODg4ODg4KDg4ODg4ODg4ODg4ODg5CTUhMAAAAAAAAAAAAERoWAAAAAAAAAAAAAAAAAFdhTwAAAAAAAAAAAAAAAABZYEwAAAUAAAAEAAAAAAAAW2JTAAEGAAAAAAAAAAAAACIYMAo6AQABAAAAAAAAAQAAAAARKAAAAAAAAAAAAAAAAAAAAAYGAgAAAAAAAAAAAQAAAAAKGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAFcAAAAAAQAAXwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">MzYw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">Mjg=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">Mg==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MQ==</item><item key="Sharpness" base64="1">MQ==</item><item key="ImageUniqueID" base64="1">Yjc5N2I4MDg4NTA1NDM4OGY2NTYwYzI1ZWY3MTkwM2E=</item></array></information><alias name="listitem" filename="Let-s-work-together_listitem.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US/Let-s-work-together_listitem.jpg" mime_type="image/jpeg" width="130" height="73" alias_key="379714049" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1043', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 932 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1044', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 933 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'The Mediterranean seen from Nice!', + 'data_type_string' => 'ezstring', + 'id' => '1045', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'the mediterranean seen from nice!', + 'version' => '1', + ), + 934 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1046', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 935 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="The-Mediterranean-seen-from-Nice.jpg" suffix="jpg" basename="The-Mediterranean-seen-from-Nice" dirpath="var/ezwebin_site/storage/images/community/pictures/the-mediterranean-seen-from-nice/1047-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/the-mediterranean-seen-from-nice/1047-1-eng-US/The-Mediterranean-seen-from-Nice.jpg" original_filename="56b81989.jpg" mime_type="image/jpeg" width="640" height="360" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1047" attribute_version="1" attribute_language="eng-US"/><information Height="360" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/9.0" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxMTozOTo1Mg==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvNjQwMA==</item><item key="FNumber" base64="1">OTAvMTA=</item><item key="ExposureProgram" base64="1">OA==</item><item key="ISOSpeedRatings" base64="1">MTYw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxMTozOTo1Mg==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxMTozOTo1Mg==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MjQ=</item><item key="FocalLength" base64="1">NjcvMTA=</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAACAAAAAaAAMAAQAAAAQAAAAcAAMAAQAAAAIAAAAfAAMAAQAAAAMAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAAOskAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAAAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAIAAAAyAAMAAQAAAAEAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAUAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAAAMAAAACgAMAAQAAAAEAAAADgAMAAQAAAAEAAAAEgAMAAQAAABYHAAAFgAMAAQAAAB4EAAAGgAMAAQAAACoHAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCAoq8AAqSvADCmrwAAyq9UALKvAQC0rwAAuq+OALyv7/++rwAA+K8AAPqvFwCor7wBqq9ZGsivQJzYr63/tq8gAbivAADOr4cA0q8UANCvKACsr/8AsK8oAK6vKADUr0oA9K8mAPKvKADirwAA5K8BAOCvQhrmr98B6K//AeqvGQDsrwAA9q8AANqvAADWrwAE8K8GAAQGbg4KBlkayAYCApqvAACcrwAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFZgIiBWIC7gdmAiQF9ggQBesH3gYJCCYFsQDABp0BKAW2ABgFCgE6BQIAxRkAAFAFPANSBboFygYCAAAFAwA2BQAAQgUAAAgFAAACBcr/CgUAAAQFAABABQAABAfK/wwHAAAGBwAACAcAAAoHAADyBgAA9gb///QGAAD4Bv//DgXsByoFHgAsBQoBMgUKAfoGCgH8BgAAAAcAATsFAgA+BQAAxhk8A8gZsAQwBQAAHAUMAOgGvQoaBaoT7wYBAPAGAQD+BgAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgcJABAHAAASBz0AFAcBABYHEAAXBwAAGAcAAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFLQFYBRIYWgVCAPD/V0LqAAAEFgcCBCoHXAQeBAQEDgEGBBoBYAQJCBoE0gBeBP8AXwQKABIE+QAUBAoBFgQOARgEGgHMBGcEzgTnCdAE7wbSBDkHCAQhAQoEFwG0BAQitgQAAUAE9QAwBFIAOARpADIEcAA6BHMANATg/zwEBAA2BBAAPgQpAEwEGAFOBBYBwAQTAcIEHQHqBAAAgAUFAYIFjACDBYsAjAUJAI4FhwCPBY0AUgT6AFQEFQFWBPoAWAQVAdQE+gDWBBUB2AT6ANoEFQHwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qBgBQqgYAUqoGAFSqBgBEqoiIRqrdqkiqiGZKqhEATKoAADiqMAA6qjAAPKowAD6qMAAuqoiIMKrMiDKqd2Y0qiIRNqoAAIIEAACABAkAhAQAAISqcABgqpubYqqbm2SqY39mqmN/aKpoaGqqAgBsqgAAbqoAAIaqAACIqgAAiqoIAIyqCACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgkAXKoJAF6qIACaqgAAnKoAAMCq///Cqv//xKr//8aq///Iqv//8P9DTQ4A/AUAMASsAADw/0RTLgAArwAAAq8AAAqvAAAErwAABq8AAAivAAAMrwAADq8AABCvAAASrwAA8P9JU8oAiK4AALSuQQG2rlcBuK5uA7qutQmArmcEgq7mA4Su5wOGrucDAK5uBAKucgQErnYEBq58BAiuggQKroQEDK6GBA6uggQQrooEEq6EBBSuiAQWroIEGK6IBBquhAQcroYEHq6ABCCu8AMiruwDJK7oAyau5gMort4DKq7gAyyu2AMurtgDMK7cAzKu3AM0ruADNq7kAziu4gM6rt4DPK7iAz6u3gNArvEBQq4AAESuAABGrgAAYK7wAWKuAABkrgAAZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAViAGQFAAjw/0lBOgCgqfIioqnwD6Sp8iKmqfAPqKkCIqqpAA+sqf//rqn//4CpFACCqQAAhKkAAIipGwCGqQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk0cAo8DwwTuBcYF/QIPAnwCvQLcBEEEUwPwAgcC5gHzAbsBTALIBH0DbQP0A+oCIAPLAhwE7gPSAuIC7wLnAeIBqQP6A/kCpAIxA5QDFQRgBG4EpgN/A0gDYwS2A8ICKgKMAxEFKQZKBnUD3AMIBMsBdgUQBowF0wTFBF8CCAOjA6AEVwXpBcIFcQVvBMUCZQIxANUAsgMuBKoEJgNzA4wDMQRqBScGsgbBBaEF/gQOApQAFgNKAqAD4ALEAwgEjgPLAwQFQAUyBf4E1QMyBH4BUgAQAt4DsAM+A8IDjwPDAj8ERgNVA1gDjAPRA8EDygIvAHYAFwFXApsCpgJeAlACxgPyAykEvwNkA4oDUwOHASkAigE5AicByAGQAooCbwLwAnMDsAOHAx4DtgIsATMAJAAhAeICKwIxApICxQJ6AkgB+wAQAbgBxAF/AFwAHwGhAEsBrAEaAVABPQHvALoA8gAtAUMBSQE4ANkANQEXAXIACQH4AHkBAwEeAcoA6gC1AAkBLAEtAVYBHQEZAeQAYAC3AAwBCAEcAesA1ADEAIwA5gDbAPcAKgEDAeAAzQBHAKUA5gDcAAMBxQCtALsAeQDCAKgAoQD5AOEAjADyAJwAEwF/ALwAAQG5AKIAogDaAMQB4AGuAIUAdgBdAKcAZACdAGwAkgB2AHwAigB5AFBSU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGQ0NWCAABAFkaQhomGigaBRoNGpoZChrdGSYaAAAAAB4nmBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBzFu0AogDXABsBEgGWALAAAgHtACMCmQLgALkBswN3AvIAiQGHAkYC6wXhAgAAAABmBZkCAAAAAJMXJwGqAOcAjwFlAZ8AygBYAUYBwgL6AgUBDAJSBNYCEwHFAe4CmQLhBiUDAAAAAOQF0AIAAAAAsxhyAbcAJAFpAvwBtAAHAdEBvQHlA1EDIwFsAuIEJAMsARACPQPtArkHTwMAAAAANAb4AgAAAADTGbwB2QB7AeMCVAK8ADYBLAIMAq4EewM8Aa4CKgVPAy8BQwJeAxMDHwhiAwAAAABjBhIDAAAAAPMaowHHAE4BhgIWArUAFAHOAeIBKARdAyEBjAL5BCoDKQEjAiwD/ALGB08DAAAAAD8G8AIAAAAAExxHAagAAwGgAX8BngDVAE0BZAH9AgYD+QAhAmcE2wIDAdcB1wK6Av8GGAMAAAAA4gXHAgAAAAAzHfQAngDZABEBAgGOAL8ABAEJAR8CmgLQAMgBsgNuAtkAkQFvAlMC9AXLAgAAAABRBYgCAAAAAFMezAChAMYA4wDiAI0AsgDhAN0AwQE1ArYAiQEWAwYCvABRAfwB8wH7BH4CAAAAAMYEPQIAAAAAzyuwAKwAsgDHAKwAwwDLAJYAqgB6AZQAlwB/AKsAVAC5AJwAXQBcADcBfAAAAAAAoAAdAAAAAACvKq8AqACsAMUArQDBAMUAmACqAHQBkgCUAH4AtwBTAMEAnQBcAF4ARQF1AAAAAACoAB4AAAAAAI8prgCsALMAxwCgAMQAxwCZAKgAegGcAJYAhwDFAFQA0ACkAFwAYgBbAYIAAAAAALcAHQAAAAAAbyivAKoAsADJAKMAxQDFAJ0AqgB5AaYAnwCMAM0AUwDdAKgAWgBgAG8BkgAAAAAAxwAcAAAAAABPJ6wArACuAMkApgDEAMMAnwCoAHcBrgCvAJIA3ABTAPIArgBdAGAAggGQAAAAAADVABwAAAAAAC8mqwCvAK0AwwCsAMgAxQChAKcAfAGoAK0AlADqAFUACAGuAFwAXwCHAX0AAAAAAOsAHwAAAAAADyWrAKwAsADDAKMAwgDDAJ0AqQBzAbEAuwCbAPoAUAATAboAYABhAJYBjwAAAAAABQEfAAAAAADvI64AqwC0AMAApQDGAMYAoQCmAHsBwwCgAKkACgFTACcBxQBiAGUAsQGrAAAAAAAYAR4AAAAAAM8irgCqALIAywChAMEAwwCdAKgAfQHNAKAAtwAeAVUAQgHYAGQAYwDDAbIAAAAAADEBHgAAAAAAryGtAKoAswDKAK0AyQDEAKMArAB/AeEArADCADkBVQBlAekAYwBhAO8BwQAAAAAAVgEeAAAAAACPIK4AqQCxAMwApQDRAMMAoACuAH4B+QDgANgAVAFWAJUB/wBiAGcAHwLlAAAAAAB6AR0AAAAAAG8fswCqALkAywCfAM8AyACpAKoAgwERAcoA7AB6AVMAwAEdAWgAaABJAu0AAAAAAKEBIAAAAAAATx61AK0AtgDVAKcA0wDJAKMArACNASUBygACAbIBVgAEAjwBaABoAHoCBAEAAAAA4AEhAAAAAAAvHbgAqQDBANIAqADgAMoAogCrAJEBVwEPAS8B6gFVAFICbwF0AG0A3QIwAQAAAAAoAiQAAAAAAA8cvwCvAMsA3gCmAPUAzwCpAKwAogGQARsBWwExAlYAxwKzAXcAbQAyA1wBAAAAAHsCJAAAAAAA7xrIALUA6wADAagAJQHfAKgArgDFAcUBSAGXAZ4CWABjAwECewBuAKUDdwEAAAAAzgIkAAAAAADPGe4AygAfATgBpQCSASABpwCsABECTALwAeEBIwNYADEEkQKQAHUAegT4AQAAAABBAyUAAAAAAK8YOQHjAGEB1wGjAEICeAGmAK0AtAKlAicCDwLBA1kAvwTaApoAgQAlBSgCAAAAAJoDJAAAAAAAjxezARkBogGXAqUAOQPkAbIArQCHA/ACMAIuAkgEWwAuBRYDoACNAKQFMAIAAAAAxQMpAAAAAABvFgMCRwGmASYDpQB5A/EBwQCyABsEFwNoAkYCfgRhAD4FFwOzAKUA6gVLAgAAAADjAzgAAAAAAE8VIwIvAVIBKAOnAP8CswG9ALYAJgQtA6UCJQJ2BG4AAAUDA9kAzAASBoQCAAAAAM0DRwAAAAAALxSuAd0AFAGFAqoA+AE/Ab8AxwBaA+YCKAIBAhoEgABtBJgC4gDxAKoFOwIAAAAAjwNVAAAAAAAPEzYB3AD9ALoBrQBqAe0A2wD1AKACjwLYAdQBiQOUAM8DPgIQARwBLAXsAQAAAAA/A20AAAAAAO8R8AAUASsBNAG9ADUB5gAXATcBagI+ArsBsgH9AqkAOAPoAToBUAHABMIBAAAAAO4CggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWgIFAQEBAQICAgEBAgIFBQUFBQIBAgEBAgICAQICAgUFAgEBAgIBAQEBAQECAQICAgUFAQMBAQEBAQEBAQECAgIBAQEDAQEBAQECAgIBBQECAgEDAwMBAQEBAwECBQEBAQIBAQEDAQEBAwEBAQEBAQIBAQUFBQICDwoBDw8PDw8PAQEBAQIFBQUKBQUCDw8PDwEDAQMDAwMDAwMDAQEBAQICAgEBAQMDAQMBAQIBAQIBAgIBAQEBAQEDAQECAgICBQ8FBQEBAQICAwUFBQUFBQUGDwUFAQUFBQMPDw8FDw8PBg8GBgUPBgYGBQYPBQ8PDw8PBgYDBgYFAwUGBgYGBgZCTUhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAH8AAAAAAQAAfwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">MzYw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">NDA=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">MQ==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MQ==</item><item key="Sharpness" base64="1">MQ==</item><item key="ImageUniqueID" base64="1">MzNkZmVjZDk3NDk5NmE2MDBiYTA0ZGE0Y2I0NjUwNTc=</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1047', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 936 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1048', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 937 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Hotel lobby at Isola2000', + 'data_type_string' => 'ezstring', + 'id' => '1049', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'hotel lobby at isola2000', + 'version' => '1', + ), + 938 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1050', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 939 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Hotel-lobby-at-Isola2000.jpg" suffix="jpg" basename="Hotel-lobby-at-Isola2000" dirpath="var/ezwebin_site/storage/images/community/pictures/hotel-lobby-at-isola2000/1051-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/hotel-lobby-at-isola2000/1051-1-eng-US/Hotel-lobby-at-Isola2000.jpg" original_filename="7485826a.jpg" mime_type="image/jpeg" width="388" height="584" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1051" attribute_version="1" attribute_language="eng-US"/><information Height="584" Width="388" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/3.5"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOSAxMDoyNToxNg==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8xNQ==</item><item key="FNumber" base64="1">Ny8y</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">NDAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOSAxMDoyNToxNg==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOSAxMDoyNToxNg==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MTgvMQ==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">Mzg4</item><item key="ExifImageLength" base64="1">NTg0</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">Mjc=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1051', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 940 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1052', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 941 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Alexander on the past, Gaby on today and tomorrow', + 'data_type_string' => 'ezstring', + 'id' => '1053', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'alexander on the past, gaby on today and tomorrow', + 'version' => '1', + ), + 942 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1054', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 943 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Alexander-on-the-past-Gaby-on-today-and-tomorrow.jpg" suffix="jpg" basename="Alexander-on-the-past-Gaby-on-today-and-tomorrow" dirpath="var/ezwebin_site/storage/images/community/pictures/alexander-on-the-past-gaby-on-today-and-tomorrow/1055-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/alexander-on-the-past-gaby-on-today-and-tomorrow/1055-1-eng-US/Alexander-on-the-past-Gaby-on-today-and-tomorrow.jpg" original_filename="9243daf4.jpg" mime_type="image/jpeg" width="584" height="388" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1055" attribute_version="1" attribute_language="eng-US"/><information Height="388" Width="584" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/8.0"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOCAwOToxMTozNw==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8xODA=</item><item key="FNumber" base64="1">OC8x</item><item key="ExposureProgram" base64="1">MQ==</item><item key="ISOSpeedRatings" base64="1">NDAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOCAwOToxMTozNw==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOCAwOToxMTozNw==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">ODAvMQ==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NTg0</item><item key="ExifImageLength" base64="1">Mzg4</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MQ==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">MTIw</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1055', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 944 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1056', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 945 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Isola2000 in white - beautiful skiing!', + 'data_type_string' => 'ezstring', + 'id' => '1057', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'isola2000 in white - beautiful skiing!', + 'version' => '1', + ), + 946 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1058', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 947 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Isola2000-in-white-beautiful-skiing.jpg" suffix="jpg" basename="Isola2000-in-white-beautiful-skiing" dirpath="var/ezwebin_site/storage/images/community/pictures/isola2000-in-white-beautiful-skiing/1059-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/isola2000-in-white-beautiful-skiing/1059-1-eng-US/Isola2000-in-white-beautiful-skiing.jpg" original_filename="a2e4cb83.jpg" mime_type="image/jpeg" width="584" height="388" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1059" attribute_version="1" attribute_language="eng-US"/><information Height="388" Width="584" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/8.0"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOSAxMzozNDowMA==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8zNTA=</item><item key="FNumber" base64="1">OC8x</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">MTAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOSAxMzozNDowMA==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOSAxMzozNDowMA==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MjAvMQ==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NTg0</item><item key="ExifImageLength" base64="1">Mzg4</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">MzA=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1059', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 948 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1060', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 949 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CEO future pitch - Adaptable, open, reliable!', + 'data_type_string' => 'ezstring', + 'id' => '1061', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ceo future pitch - adaptable, open, reliable!', + 'version' => '1', + ), + 950 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1062', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 951 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CEO-future-pitch-Adaptable-open-reliable.jpg" suffix="jpg" basename="CEO-future-pitch-Adaptable-open-reliable" dirpath="var/ezwebin_site/storage/images/community/pictures/ceo-future-pitch-adaptable-open-reliable/1063-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/ceo-future-pitch-adaptable-open-reliable/1063-1-eng-US/CEO-future-pitch-Adaptable-open-reliable.jpg" original_filename="90d2d17c.jpg" mime_type="image/jpeg" width="584" height="388" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1063" attribute_version="1" attribute_language="eng-US"/><information Height="388" Width="584" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/8.0"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOCAwOToxNzozNw==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8xODA=</item><item key="FNumber" base64="1">OC8x</item><item key="ExposureProgram" base64="1">MQ==</item><item key="ISOSpeedRatings" base64="1">NDAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOCAwOToxNzozNw==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOCAwOToxNzozNw==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MTA1LzE=</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NTg0</item><item key="ExifImageLength" base64="1">Mzg4</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MQ==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">MTU3</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1063', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 952 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1064', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 953 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '211', + 'contentobject_id' => '185', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Blog', + 'data_type_string' => 'ezstring', + 'id' => '1065', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'blog', + 'version' => '1', + ), + 954 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '212', + 'contentobject_id' => '185', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1066', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 955 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '213', + 'contentobject_id' => '185', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1067', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 956 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '214', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Visit Paris', + 'data_type_string' => 'ezstring', + 'id' => '1068', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'visit paris', + 'version' => '1', + ), + 957 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '215', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Lorem ipsum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph><ul><li><paragraph>Lorem ispum dolor sit amet. </paragraph></li><li><paragraph>Lorem ispum dolor sit amet. </paragraph></li><li><paragraph>Lorem ispum dolor sit amet. </paragraph></li><li><paragraph>Lorem ispum dolor sit amet.</paragraph></li></ul></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1069', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 958 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '216', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '1193915460', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1070', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1193915460', + 'sort_key_string' => '', + 'version' => '1', + ), + 959 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '217', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1071', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 960 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '218', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1072', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 961 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '219', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1073', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 962 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '214', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Paris in France', + 'data_type_string' => 'ezstring', + 'id' => '1074', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'paris in france', + 'version' => '1', + ), + 963 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '215', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1075', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 964 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '216', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '1193915580', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1076', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1193915580', + 'sort_key_string' => '', + 'version' => '1', + ), + 965 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '217', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1077', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 966 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '218', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1078', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 967 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '219', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1079', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 968 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Company', + 'data_type_string' => 'ezstring', + 'id' => '1080', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'company', + 'version' => '1', + ), + 969 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1081', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 970 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="original" align="center" custom:offset="0" custom:limit="5" object_id="224"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1082', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 971 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus non neque. Proin id augue. Aliquam a tellus. + <strong>Donec cursus rutrum purus.</strong> Aliquam tincidunt. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. In suscipit dictum augue. Donec arcu ante, consequat a, feugiat in, posuere hendrerit, dolor. Morbi tempus, sem ac interdum scelerisque, justo nisi egestas nisl, et mattis dui est at velit. Aliquam in libero ac urna molestie eleifend.</paragraph><paragraph><table class="list" width="100%" border="0"><tr><th xhtml:width="50%"><paragraph>Aliquam a tellus</paragraph></th><th><paragraph>Class aptent</paragraph></th></tr><tr><td><paragraph>Donec cursus rutrum purus.</paragraph></td><td><paragraph>Proin id augue.</paragraph></td></tr><tr><td><paragraph>Aliquam in libero ac urna molestie eleifend.</paragraph></td><td><paragraph>Morbi tempus, sem ac interdum.</paragraph></td></tr></table></paragraph><paragraph>Quisque fringilla hendrerit turpis. Curabitur suscipit blandit nulla. Sed mauris justo, iaculis vel, dictum ut, molestie et, purus. Fusce ut risus. Nulla mauris magna, vulputate quis, dignissim vel, lobortis ut, neque. Etiam sed ante. </paragraph><paragraph>Curabitur in dolor nec tellus consequat gravida. Proin faucibus viverra eros. Suspendisse fringilla. Etiam eget elit eu augue euismod lobortis. Sed urna elit, volutpat vel, ultricies id, molestie a, ligula. In cursus nonummy quam. Sed malesuada iaculis magna. Curabitur mollis vehicula nibh. Curabitur at orci at leo vulputate vestibulum. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1083', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 972 => + array ( + 'attribute_original_id' => '1084', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1084', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 973 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1085', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 974 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1086', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 975 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'About company', + 'data_type_string' => 'ezstring', + 'id' => '1087', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'about company', + 'version' => '1', + ), + 976 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1088', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 977 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1089', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 978 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1090', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 979 => + array ( + 'attribute_original_id' => '1091', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1091', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 980 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1092', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 981 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1093', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 982 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'New features', + 'data_type_string' => 'ezstring', + 'id' => '1094', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'new features', + 'version' => '1', + ), + 983 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1095', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 984 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1096', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 985 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1097', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 986 => + array ( + 'attribute_original_id' => '1098', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1098', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 987 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1099', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 988 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1100', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 989 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Separate content & design in eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1101', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'separate content & design in ez publish', + 'version' => '1', + ), + 990 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1102', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 991 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1103', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 992 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>While there are many Content Management Systems (CMS) in the market, very few do exactly what a CMS is supposed to do: achieve a clean separation between content and design.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1104', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 993 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><section><section><header>What is content and design?</header><paragraph>Content is information that is organized and stored in a structured manner by <link url_id="97">eZ Publish</link>. For example, content may be the components of a news article (such as the title, introduction, body, and images) or the properties of a car (such as the model, year, and color). </paragraph><paragraph>All information that is stored for the purpose of later retrieval is referred to as content. The presentation of content is determined by the design of a site. </paragraph><paragraph>While content refers to structured data, design refers to the way the data is visually presented. Design includes the things that make up a web interface: HTML, stylesheets (CSS), images that are not part of the content, typography, fonts, and so on. </paragraph><paragraph>So, while content deals with storing and structuring data, design dictates how the content should be presented. </paragraph><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="192"/></paragraph></section></section><section><section><header>Benefits of a Content Management System</header><paragraph>The ability to handle the distinction between structuring and displaying content is one of the <link url_id="98">key features of eZ Publish</link>. The separation of content and design provides the following benefits: </paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content editors and designers can work separately without conflicts</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content can be published easily in multiple formats</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content can easily be transferred and re-purposed</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Global redesigns and changes can be applied with simple modifications</paragraph></li></ul></paragraph></section></section><section><section><header>Presenting the content: templates</header><paragraph>Templates represent the fundamental unit of site design in eZ Publish. For example, a template might dictate that a page should appear with the site\'s title at the top and with the main content in the middle. When the page is accessed, the Content Management System places the content (the actual title and body text) into the appropriate locations in the template. </paragraph><paragraph>An eZ Publish template is a custom, extended HTML file that describes how particular types of content should be presented. For example, there is a template for viewing a folder and its contents, a news article, the contents of a <link anchor_name="picturegallery" url_id="99">gallery</link> as thumbnails, <link anchor_name="videoplayer" url_id="100">media files</link> as list items, <link anchor_name="visitorinteraction" url_id="101">forum posts</link> and so on. </paragraph><paragraph>In some cases, you can even have different article templates based on different kinds of articles or where they are located in the content hierarchy. In short, templates are the transforming unit that produces the site layout, either for an entire webpage or some part of that page. The following screenshots illustrate how different templates work together to produce a page. </paragraph><paragraph> Learn more in <link url_id="102">Developers section</link>. </paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1105', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 994 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1106', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 995 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Separate-content-design-in-eZ-Publish.jpg" suffix="jpg" basename="Separate-content-design-in-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/1107-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/1107-1-eng-US/Separate-content-design-in-eZ-Publish.jpg" original_filename="844e123d.jpg" mime_type="image/jpeg" width="530" height="420" alternative_text="" alias_key="1293033771" timestamp="1311154205"><original attribute_id="1107" attribute_version="1" attribute_language="eng-US"/><information Height="420" Width="530" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1107', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 996 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1108', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 997 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1109', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 998 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1110', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 999 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1111', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1000 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1112', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1001 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'separation_of_content_and_design', + 'data_type_string' => 'ezstring', + 'id' => '1113', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'separation_of_content_and_design', + 'version' => '1', + ), + 1002 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1114', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1003 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="separation_of_content_and_design.jpg" suffix="jpg" basename="separation_of_content_and_design" dirpath="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/separation_of_content_and_design/1115-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/separation_of_content_and_design/1115-1-eng-US/separation_of_content_and_design.jpg" original_filename="1cb1af18.jpg" mime_type="image/jpeg" width="500" height="195" alternative_text="" alias_key="1293033771" timestamp="1311154205"><original attribute_id="1115" attribute_version="1" attribute_language="eng-US"/><information Height="195" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1115', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1004 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1116', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1005 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to use eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1117', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to use ez publish', + 'version' => '1', + ), + 1006 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1118', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1007 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1119', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1008 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish comes with a multitude of features out of the box, ensuring that you can quickly put your content online.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1120', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1009 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="eztoolbar" url_id="98">Publish content from your web browser</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="openofficeimport" url_id="98">Publish content from word processors</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="contenttranslation" url_id="98">Translate your content</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="multiupload" url_id="98">Upload multiple files at once</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="picturegalleries" url_id="98">Picture galleries</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="videopublishing" url_id="98">Video publishing</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="web2.0" url_id="98">Web 2.0 features</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="defaultsearch" url_id="98">Search</link></paragraph></li></ul></paragraph><section><section><header>Publish content from your web browser</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="199"/></paragraph><paragraph>With eZ Publish, you can publish content like articles, pictures and files directly from your web browser, using the Website Toolbar. </paragraph><paragraph>This toolbar appears when you log in and enables you to publish, move, replace or translate any kind of content. </paragraph><paragraph>The Online Editor is a WYSIWYG editor integrated into the website (no HTML coding required), providing formatting functions similar to word processing applications. </paragraph></section></section><section><section><header>Publish content from your favourite word processor</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="194"/></paragraph><paragraph>Many content managers prefer working directly in Microsoft Word or Open Office. The import / export feature enables you to create or edit site content in your favorite word processor, even when you might not have Internet access. </paragraph><paragraph>Afterwards, you can upload the document through either a WebDAV client or the front-end of your site to generate or update articles, documentation pages and so on. </paragraph></section></section><section><section><header>Translate your content</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="195"/></paragraph><paragraph>All content in eZ Publish can be translated to multiple languages. Having only one website to administer is efficient and makes it easier to maintain a consistent brand across languages and countries. </paragraph><paragraph>An international corporation or organization can have one website with content in several languages. When a visitor selects a language, the menus and content are displayed accordingly. If you have not yet translated specific content, it will be shown in the source language or not at all (depending on your configuration). </paragraph><paragraph>When you are editing content, you can choose to switch the language you are currently editing or to translate from one language to another. Content in the source language is shown when you are translating, to aid in the process. When creating or updating content translations, you can also use the built-in content “diff” functionality to see the added or removed text in the source language. </paragraph><paragraph>Multiple, multilingual URLs can be created for each page. By default, you can have an object called "Easy" with a URL "/easy" but also create a French translation with a URL "/facile". </paragraph></section></section><section><section><header> Upload multiple files at once</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="196"/></paragraph><paragraph>If you want to upload more than one document, picture or video at a time, eZ Publish has multi-upload functionality. </paragraph><paragraph>You simply select the content you want from your computer or from the server where your content is stored. eZ Publish can detect the type of content uploaded and creates the appropriate web pages. </paragraph></section></section><section><section><header>Picture galleries</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="197"/></paragraph><paragraph>eZ Publish makes it easy to create picture galleries. With the multi-upload functionality, you can add many pictures at once, then eZ Publish will scale, format and resize the pictures automatically. </paragraph><paragraph>You can then browse through the galleries and re-use images elsewhere in your website. </paragraph></section></section><section><section><header>Video publishing</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="200"/></paragraph><paragraph>Basically, a video is another type of content you or users of your website can publish. You can use eZ Publish to store and display any video format for web TV functionality or video publishing similar to Youtube. </paragraph></section></section><section><section><header>Web 2.0 features</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="201"/></paragraph><paragraph>Tag clouds, blogs, forums and polls are all built-in eZ Publish features. Make your users contribute and build communities. </paragraph></section></section><section><section><header>Search</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="198"/></paragraph><paragraph>To find any content on your eZ Publish site, you can use the integrated search engine in eZ Publish. To add more functionality and scale high-loaded websites, <link url_id="84">eZ Find</link> is an enterprise search extension for eZ Publish. </paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1121', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1010 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1122', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1011 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-use-eZ-Publish.jpg" suffix="jpg" basename="How-to-use-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/1123-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/1123-1-eng-US/How-to-use-eZ-Publish.jpg" original_filename="0aab879e.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154205"><original attribute_id="1123" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1123', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1012 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1124', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1013 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1125', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1014 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1126', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1015 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1127', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1016 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1128', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1017 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'openoffice_import_large', + 'data_type_string' => 'ezstring', + 'id' => '1129', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'openoffice_import_large', + 'version' => '1', + ), + 1018 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1130', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1019 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="openoffice_import_large.jpg" suffix="jpg" basename="openoffice_import_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/openoffice_import_large/1131-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/openoffice_import_large/1131-1-eng-US/openoffice_import_large.jpg" original_filename="36b1357b.jpg" mime_type="image/jpeg" width="540" height="357" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1131" attribute_version="1" attribute_language="eng-US"/><information Height="357" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1131', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1020 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1132', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1021 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'translation_large', + 'data_type_string' => 'ezstring', + 'id' => '1133', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'translation_large', + 'version' => '1', + ), + 1022 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1134', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1023 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="translation_large.jpg" suffix="jpg" basename="translation_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/translation_large/1135-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/translation_large/1135-1-eng-US/translation_large.jpg" original_filename="503004df.jpg" mime_type="image/jpeg" width="540" height="419" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1135" attribute_version="1" attribute_language="eng-US"/><information Height="419" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1135', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1024 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1136', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1025 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'multiupload_large', + 'data_type_string' => 'ezstring', + 'id' => '1137', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'multiupload_large', + 'version' => '1', + ), + 1026 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1138', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1027 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="multiupload_large.jpg" suffix="jpg" basename="multiupload_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/multiupload_large/1139-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/multiupload_large/1139-1-eng-US/multiupload_large.jpg" original_filename="9652f5a1.jpg" mime_type="image/jpeg" width="540" height="404" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1139" attribute_version="1" attribute_language="eng-US"/><information Height="404" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1139', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1028 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1140', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1029 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'gallery_large', + 'data_type_string' => 'ezstring', + 'id' => '1141', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'gallery_large', + 'version' => '1', + ), + 1030 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1142', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1031 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="gallery_large.jpg" suffix="jpg" basename="gallery_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/gallery_large/1143-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/gallery_large/1143-1-eng-US/gallery_large.jpg" original_filename="b1b5ed39.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1143" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1143', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1032 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1144', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1033 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'search_result_large', + 'data_type_string' => 'ezstring', + 'id' => '1145', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'search_result_large', + 'version' => '1', + ), + 1034 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1146', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1035 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="search_result_large.jpg" suffix="jpg" basename="search_result_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/search_result_large/1147-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/search_result_large/1147-1-eng-US/search_result_large.jpg" original_filename="fb6cf7d3.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1147" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1147', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1036 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1148', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1037 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'ez_tool_bar_large', + 'data_type_string' => 'ezstring', + 'id' => '1149', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ez_tool_bar_large', + 'version' => '1', + ), + 1038 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1150', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1039 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="ez_tool_bar_large.jpg" suffix="jpg" basename="ez_tool_bar_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/ez_tool_bar_large/1151-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/ez_tool_bar_large/1151-1-eng-US/ez_tool_bar_large.jpg" original_filename="9c1fd673.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1151" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1151', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1040 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1152', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1041 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'quicktime_large', + 'data_type_string' => 'ezstring', + 'id' => '1153', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'quicktime_large', + 'version' => '1', + ), + 1042 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1154', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1043 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="quicktime_large.jpg" suffix="jpg" basename="quicktime_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/quicktime_large/1155-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/quicktime_large/1155-1-eng-US/quicktime_large.jpg" original_filename="af4e1807.jpg" mime_type="image/jpeg" width="540" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1155" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1155', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1044 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1156', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1045 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'web_2_0_large', + 'data_type_string' => 'ezstring', + 'id' => '1157', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'web_2_0_large', + 'version' => '1', + ), + 1046 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1158', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1047 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="web_2_0_large.jpg" suffix="jpg" basename="web_2_0_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/web_2_0_large/1159-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/web_2_0_large/1159-1-eng-US/web_2_0_large.jpg" original_filename="cd03d9fc.jpg" mime_type="image/jpeg" width="540" height="425" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1159" attribute_version="1" attribute_language="eng-US"/><information Height="425" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1159', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1048 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1160', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1049 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to manage eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1161', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to manage ez publish', + 'version' => '1', + ), + 1050 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1162', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1051 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1163', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1052 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>To provide you with full control over your website, eZ Publish has many features that make it easy to manage both content and users.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1164', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1053 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Administration Interface</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Permission and access control</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Workflows</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Versioning and modification tracking</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">A unique content model</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content cross publishing</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Multi-site deployment</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Search engine optimization</paragraph></li></ul></paragraph><section><section><header>A rich and powerful Administration Interface</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="210"/></paragraph><paragraph>The content of a site can be displayed (and modified) in various ways. The Administration Interface is the advanced back-end interface, providing powerful tools for content management and editing as well as site management, configuration, customization and development.</paragraph><paragraph>In other words, you can change almost everything about a site in the Administration Interface.</paragraph></section></section><section><section><header>Permission, rights management and access control</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="203"/></paragraph><paragraph>The eZ Publish access system is multi-level and role-based. This means that you can give a user or a group of users access to a combination of functions across the whole site or within a specific area of the site. For example, you restrict a certain part of a site to community or partner members.</paragraph></section></section><section><section><header>Workflows</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="204"/></paragraph><paragraph>eZ Publish comes with an integrated workflow mechanism. An example of this is the built-in collaboration system, which defines an ordered sequence of actions to be executed after a content editor has published an object.</paragraph><paragraph>Suppose that your site has a restriction that all content has to go through an editor-in-chief before being published. It can be set as “pending” before being approved to be published. On the other hand, if a pending version is rejected by the editor, it can be set as “rejected”.</paragraph><paragraph>&nbsp;Another example is the e-commerce engine, which can be used to manage subscriptions on a media site, automating access for paid subscribers to read premium news content, watch videos, and so on.</paragraph></section></section><section><section><header>Versioning and modification tracking</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="205"/></paragraph><paragraph>Having access to older versions of content enables supervisors or editors-in-chief to check for inconsistency or errors in the content. eZ Publish automatically keeps track of which content changes were made by which users at what time, and provides the option to revert content to a previous version.</paragraph></section></section><section><section><header>A unique content model</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="206"/></paragraph><paragraph>Publishing content is no longer only about publishing articles. Depending on your needs you must define specific content structures for cars, recipes, specific products for your webshop and more. eZ Publish has a flexible content engine that enables administrators to create these content definitions directly through graphical user interfaces.</paragraph></section></section><section><section><header>Content cross publishing</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="207"/></paragraph><paragraph>Using the cross publishing feature, you can re-use content throughout the site while avoiding inconsistent duplicates of content that are hard to maintain. If content appears at multiple locations, you only have to edit the object once – the changes will be reflected at all locations.</paragraph></section></section><section><section><header>Multi-site deployment</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="208"/></paragraph><paragraph>One installation of eZ Publish can host many different websites with the possibility to re-use content, functionality and design across the different sites. You can have a continuous overview of all your sites and can even industrialize this deployment via the Site Factory management service in <link url_id="85">eZ Publish Premium</link> subscription services.</paragraph></section></section><section><section><header>URL management and search engine optimization</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="209"/></paragraph><paragraph>eZ Publish makes it easy for you to create content that will be effectively indexed by search engines. Sitemaps, friendly URLs, and easy management of key XHTML tags are all built-in features.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1165', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1054 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1166', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1055 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-manage-eZ-Publish.jpg" suffix="jpg" basename="How-to-manage-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/1167-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/1167-1-eng-US/How-to-manage-eZ-Publish.jpg" original_filename="4da87751.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1167" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1167', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1056 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1168', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1057 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1169', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1058 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1170', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1059 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1171', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1060 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1172', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1061 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'usermanagement_large', + 'data_type_string' => 'ezstring', + 'id' => '1173', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'usermanagement_large', + 'version' => '1', + ), + 1062 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1174', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1063 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="usermanagement_large.jpg" suffix="jpg" basename="usermanagement_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/usermanagement_large/1175-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/usermanagement_large/1175-1-eng-US/usermanagement_large.jpg" original_filename="c7fdf3e4.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154208"><original attribute_id="1175" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1175', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1064 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1176', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1065 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'workflow_large', + 'data_type_string' => 'ezstring', + 'id' => '1177', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'workflow_large', + 'version' => '1', + ), + 1066 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1178', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1067 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="workflow_large.jpg" suffix="jpg" basename="workflow_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/workflow_large/1179-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/workflow_large/1179-1-eng-US/workflow_large.jpg" original_filename="d4a5a15d.jpg" mime_type="image/jpeg" width="540" height="414" alternative_text="" alias_key="1293033771" timestamp="1311154208"><original attribute_id="1179" attribute_version="1" attribute_language="eng-US"/><information Height="414" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1179', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1068 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1180', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1069 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'versioning_large', + 'data_type_string' => 'ezstring', + 'id' => '1181', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'versioning_large', + 'version' => '1', + ), + 1070 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1182', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1071 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="versioning_large.jpg" suffix="jpg" basename="versioning_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/versioning_large/1183-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/versioning_large/1183-1-eng-US/versioning_large.jpg" original_filename="5041e7aa.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154208"><original attribute_id="1183" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1183', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1072 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1184', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1073 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'datatypes_attributes_content_class_and_objects_large', + 'data_type_string' => 'ezstring', + 'id' => '1185', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'datatypes_attributes_content_class_and_objects_large', + 'version' => '1', + ), + 1074 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1186', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1075 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="datatypes_attributes_content_class_and_objects_large.png" suffix="png" basename="datatypes_attributes_content_class_and_objects_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/datatypes_attributes_content_class_and_objects_large/1187-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/datatypes_attributes_content_class_and_objects_large/1187-1-eng-US/datatypes_attributes_content_class_and_objects_large.png" original_filename="3ac3d302.png" mime_type="image/png" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1187" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1187', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1076 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1188', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1077 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'multiple_location_large', + 'data_type_string' => 'ezstring', + 'id' => '1189', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'multiple_location_large', + 'version' => '1', + ), + 1078 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1190', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1079 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="multiple_location_large.jpg" suffix="jpg" basename="multiple_location_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multiple_location_large/1191-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multiple_location_large/1191-1-eng-US/multiple_location_large.jpg" original_filename="d2bd9a18.jpg" mime_type="image/jpeg" width="540" height="405" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1191" attribute_version="1" attribute_language="eng-US"/><information Height="405" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1191', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1080 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1192', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1081 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'multisite_deployment_large', + 'data_type_string' => 'ezstring', + 'id' => '1193', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'multisite_deployment_large', + 'version' => '1', + ), + 1082 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1194', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1083 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="multisite_deployment_large.jpg" suffix="jpg" basename="multisite_deployment_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multisite_deployment_large/1195-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multisite_deployment_large/1195-1-eng-US/multisite_deployment_large.jpg" original_filename="fa5f0924.jpg" mime_type="image/jpeg" width="500" height="423" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1195" attribute_version="1" attribute_language="eng-US"/><information Height="423" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1195', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1084 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1196', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1085 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'seo_large', + 'data_type_string' => 'ezstring', + 'id' => '1197', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'seo_large', + 'version' => '1', + ), + 1086 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1198', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1087 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="seo_large.jpg" suffix="jpg" basename="seo_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/seo_large/1199-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/seo_large/1199-1-eng-US/seo_large.jpg" original_filename="25149bcc.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1199" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1199', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1088 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1200', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1089 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'admin_site_large', + 'data_type_string' => 'ezstring', + 'id' => '1201', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'admin_site_large', + 'version' => '1', + ), + 1090 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1202', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1091 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="admin_site_large.jpg" suffix="jpg" basename="admin_site_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/admin_site_large/1203-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/admin_site_large/1203-1-eng-US/admin_site_large.jpg" original_filename="57b1a75c.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154210"><original attribute_id="1203" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1203', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1092 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1204', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1093 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to develop with eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1205', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to develop with ez publish', + 'version' => '1', + ), + 1094 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1206', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1095 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1207', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1096 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish is more than a basic CMS, but a content management platform based on a clear API that allows developers to customize and extend eZ Publish.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1208', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1097 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="contentclass" url_id="103">The content class concept</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="customdesign" url_id="103">Custom design: CSS and templates</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="phpcomponents" url_id="103">High-quality library of PHP components</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="buildextensions" url_id="103">Build eZ Publish extensions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="developmentenvironment" url_id="103">Which development environment?</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="ezcommunity" url_id="103">eZ Publish community and resources</link></paragraph></li></ul></paragraph><section><section><header>The content class concept</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="212"/></paragraph><paragraph>Any piece of content in eZ Publish is a content object, which is an instance of a specific content class. A content class is a definition of an arbitrary data structure. It does not store any actual data. </paragraph><paragraph>A content class is made up of attributes. The characteristics of an attribute are determined by the datatype that is chosen for that specific attribute. By combining different datatypes, it is possible to represent complex data structures. </paragraph><paragraph>The illustration above shows the anatomy of a content class called "Article", which defines a data structure for storing news articles. It consists of attributes dedicated for storing the title, an introduction text and the actual body of an article.</paragraph></section></section><section><section><header>Custom design: CSS and templates</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="213"/></paragraph><paragraph>The first thing you may be willing to do is to change the look of your eZ Publish site. This can be done by modifying the CSS of eZ Publish and <link url_id="86">overriding templates</link>. You can even create reusable <link url_id="87">site packages</link> that include these CSS and template changes. </paragraph></section></section><section><section><header>High-quality library of PHP components</header><paragraph>eZ Publish 4.X as well as the next generations of eZ Publish are based on <link url_id="88">eZ Components</link> which are a high quality library of independent components aiming to help developers creating web centric applications like for example customising and extending eZ Publish. </paragraph><paragraph>In the eZ Components you will find components that focus their attention on solving important parts of Web application development. They are written for solving the re-occurring issues that Web application developers have to deal with when building their applications - without any superfluous ballast. </paragraph><paragraph>In order to cater for this goal, quality is also an important factor. The eZ Components development team uses a test-driven development methodology where a large effort is put into making the APIs easily testable. This also results in a better API for developers to use. </paragraph></section></section><section><section><header>Build eZ Publish extensions</header><paragraph>There is a clear API to develop your own PHP extensions in order to extend the functionality of eZ Publish. By using extensions it is possible to create new modules, datatypes, template operators, workflow events , or any integration with third party applications. You will find many contributed extensions available at <link url_id="89">Contribution page</link>. </paragraph></section></section><section><section><header>Which development environment?</header><paragraph> In an eZ Publish project, a <link target="_blank" url_id="90">Subversion (SVN)</link> repository is usually set up to track all changes during development projects. When it comes to IDE, both <link target="_blank" url_id="91">Eclipse</link> and <link target="_blank" url_id="92">PHPEdit</link> have been optimised for eZ Publish. </paragraph></section></section><section><section><header>eZ Publish community and resources</header><paragraph>When you start developing with eZ Publish, the community is definitely an environment to get in touch with. You will find your answers or get help in the forums as well as many contributions that will make save you time in your development projects. </paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1209', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1098 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1210', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1099 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-develop-with-eZ-Publish.png" suffix="png" basename="How-to-develop-with-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/1211-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/1211-1-eng-US/How-to-develop-with-eZ-Publish.png" original_filename="33e36be8.png" mime_type="image/png" width="500" height="409" alternative_text="Content class" alias_key="1293033771" timestamp="1311154210"><original attribute_id="1211" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1211', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1100 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1212', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1101 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1213', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1102 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1214', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1103 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1215', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1104 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1216', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1105 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'datatypes_attributes_content_class_and_objects_large', + 'data_type_string' => 'ezstring', + 'id' => '1217', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'datatypes_attributes_content_class_and_objects_large', + 'version' => '1', + ), + 1106 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1218', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1107 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="datatypes_attributes_content_class_and_objects_large.jpg" suffix="jpg" basename="datatypes_attributes_content_class_and_objects_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/datatypes_attributes_content_class_and_objects_large/1219-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/datatypes_attributes_content_class_and_objects_large/1219-1-eng-US/datatypes_attributes_content_class_and_objects_large.jpg" original_filename="e252a562.jpg" mime_type="image/jpeg" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154210"><original attribute_id="1219" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1219', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1108 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1220', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1109 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'site_style_large', + 'data_type_string' => 'ezstring', + 'id' => '1221', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'site_style_large', + 'version' => '1', + ), + 1110 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1222', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1111 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="site_style_large.png" suffix="png" basename="site_style_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/site_style_large/1223-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/site_style_large/1223-1-eng-US/site_style_large.png" original_filename="b3b89834.png" mime_type="image/png" width="540" height="411" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1223" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1223', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1112 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1224', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1113 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'REST API interface', + 'data_type_string' => 'ezstring', + 'id' => '1225', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'rest api interface', + 'version' => '1', + ), + 1114 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1226', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1115 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1227', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1116 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>New RESTful interface, which will allow external client implementations, to access and query content resources inside an eZ Publish installation</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1228', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1117 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Different aspects of the content objects can be queried at will, such as metadata or actual values. The REST interface is protected either by OAuth 2.0 or HTTP Basic authentication</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1229', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1118 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1230', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1119 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1231" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1231', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1120 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1232', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1121 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1233', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1122 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1234', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1123 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1235', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1124 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1236', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1125 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Asynchronous Publishing', + 'data_type_string' => 'ezstring', + 'id' => '1237', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'asynchronous publishing', + 'version' => '1', + ), + 1126 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1238', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1127 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1239', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1128 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>The ability to use defer publishing, for improved scalability in high load, multi-editor environments.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1240', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1129 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1241', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1130 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1242', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1131 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1243" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1243', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1132 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1244', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1133 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1245', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1134 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1246', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1135 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1247', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1136 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1248', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1137 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Canonical links', + 'data_type_string' => 'ezstring', + 'id' => '1249', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'canonical links', + 'version' => '1', + ), + 1138 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1250', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1139 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1251', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1140 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish 4.5 supports a canonical link feature that helps search engines to figure out duplicate content issues and allow them to index relevant content.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1252', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1141 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>- For simple siteaccesses, like nor, fre,, ger, eng the feature works out of the box &nbsp;</paragraph><paragraph>- More complex mappings require a manual configuration in the file</paragraph><paragraph>- You use the canonical link to tell the search engines which url is the preferred one when you have several duplicate urls.</paragraph><paragraph>Example of duplicate urls:</paragraph><paragraph>-&nbsp;<link target="_self" url_id="104">www.example.com</link></paragraph><paragraph>- example.com</paragraph><paragraph>-&nbsp;<link target="_self" url_id="96">www.example.com/index.html</link></paragraph><paragraph>- example.com/home.asp</paragraph><paragraph>Example of canonical link:</paragraph><paragraph><link rel="canonical" href="<link target="_self" url_id="104">http://www.example.com</link>/" /></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1253', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1142 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1254', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1143 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1255" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1255', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1144 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1256', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1145 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1257', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1146 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1258', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1147 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1259', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1148 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1260', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1149 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support for Red Hat Enterprise', + 'data_type_string' => 'ezstring', + 'id' => '1261', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'support for red hat enterprise', + 'version' => '1', + ), + 1150 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1262', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1151 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1263', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1152 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>combined with eZ Publish Enterprise, you can now a system supported all through the stack!</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1264', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1153 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1265', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1154 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1266', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1155 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1267" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1267', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1156 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1268', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1157 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1269', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1158 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1270', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1159 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1271', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1160 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1272', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1161 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'FastCGI', + 'data_type_string' => 'ezstring', + 'id' => '1273', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fastcgi', + 'version' => '1', + ), + 1162 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1274', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1163 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1275', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1164 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>support</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1276', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1165 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>What is FastCGI?</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI is also language-independent. For instance, FastCGI provides a way to improve the performance of the thousands of Perl applications that have been written for the Web.</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI runs applications in processes isolated from the core Web server, which provides greater security than APIs. (APIs link application code into the core Web server, which means that a bug in one API-based application can corrupt another application or the core server; a malicious API-based application can, for example, steal key security secrets from another application or the core server.)</paragraph></li></ul></paragraph><paragraph>Read more&nbsp;http://www.fastcgi.com/</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1277', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1166 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1278', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1167 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154212"><original attribute_id="1279" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1279', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1168 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1280', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1169 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1281', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1170 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1282', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1171 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1283', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1172 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1284', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1173 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '252', + 'contentobject_id' => '219', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Events', + 'data_type_string' => 'ezstring', + 'id' => '1285', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'events', + 'version' => '1', + ), + 1174 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '253', + 'contentobject_id' => '219', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1286', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1175 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '254', + 'contentobject_id' => '219', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<related-objects><relation-list/></related-objects> +', + 'data_type_string' => 'ezobjectrelationlist', + 'id' => '1287', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1176 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Career', + 'data_type_string' => 'ezstring', + 'id' => '1288', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'career', + 'version' => '1', + ), + 1177 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1289', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1178 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1290', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1179 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1291', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1180 => + array ( + 'attribute_original_id' => '1292', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1292', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 1181 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1293', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1182 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1294', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 1183 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Investors Relation', + 'data_type_string' => 'ezstring', + 'id' => '1295', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'investors relation', + 'version' => '1', + ), + 1184 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1296', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1185 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1297', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1186 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1298', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1187 => + array ( + 'attribute_original_id' => '1299', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1299', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 1188 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1300', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1189 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1301', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 1190 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '229', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Contact', + 'data_type_string' => 'ezstring', + 'id' => '1302', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'contact', + 'version' => '1', + ), + 1191 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '230', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1303', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1192 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '231', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1304', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1193 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '232', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1305', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1194 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '233', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '1306', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1195 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '234', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezemail', + 'id' => '1307', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1196 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '235', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezemail', + 'id' => '1308', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1197 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '247', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Morbi neque', + 'data_type_string' => 'ezstring', + 'id' => '1309', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'morbi neque', + 'version' => '1', + ), + 1198 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '248', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Morbi-neque.jpg" suffix="jpg" basename="Morbi-neque" dirpath="var/ezwebin_site/storage/images/company/contact/morbi-neque/1310-1-eng-US" url="var/ezwebin_site/storage/images/company/contact/morbi-neque/1310-1-eng-US/Morbi-neque.jpg" original_filename="c74270b3.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Morbi neque" alias_key="1293033771" timestamp="1311154212"><original attribute_id="1310" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1310', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1199 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '249', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1311', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1200 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '250', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><strong>Morbi neque. Proin porta dapibus turpis.</strong></paragraph><paragraph>Vivamus placerat fringilla purus. Pellentesque at libero. In hac habitasse platea dictumst. Pellentesque ante.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1312', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1201 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '251', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezurl', + 'id' => '1313', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1202 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Company banner', + 'data_type_string' => 'ezstring', + 'id' => '1314', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'company banner', + 'version' => '1', + ), + 1203 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1315', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1204 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Company-banner.jpg" suffix="jpg" basename="Company-banner" dirpath="var/ezwebin_site/storage/images/company/company-banner/1316-1-eng-US" url="var/ezwebin_site/storage/images/company/company-banner/1316-1-eng-US/Company-banner.jpg" original_filename="0e055a7f.jpg" mime_type="image/jpeg" width="566" height="197" alternative_text="Company banner" alias_key="1293033771" timestamp="1311154212"><original attribute_id="1316" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="566" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1316', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1205 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1317', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1206 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '329', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '105', + 'data_text' => 'Site map', + 'data_type_string' => 'ezurl', + 'id' => '1318', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1207 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '330', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '106', + 'data_text' => 'Tag cloud', + 'data_type_string' => 'ezurl', + 'id' => '1319', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1208 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '331', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Login', + 'data_type_string' => 'ezstring', + 'id' => '1320', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'login', + 'version' => '2', + ), + 1209 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '332', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Logout', + 'data_type_string' => 'ezstring', + 'id' => '1321', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'logout', + 'version' => '2', + ), + 1210 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '333', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'My profile', + 'data_type_string' => 'ezstring', + 'id' => '1322', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'my profile', + 'version' => '2', + ), + 1211 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '334', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Register', + 'data_type_string' => 'ezstring', + 'id' => '1323', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'register', + 'version' => '2', + ), + 1212 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '335', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '/rss/feed/my_feed', + 'data_type_string' => 'ezstring', + 'id' => '1324', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '/rss/feed/my_feed', + 'version' => '2', + ), + 1213 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '336', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Shopping basket', + 'data_type_string' => 'ezstring', + 'id' => '1325', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'shopping basket', + 'version' => '2', + ), + 1214 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '337', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Site settings', + 'data_type_string' => 'ezstring', + 'id' => '1326', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'site settings', + 'version' => '2', + ), + 1215 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '338', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Copyright © 2011 <a href="http://ez.no" title="eZ Systems">eZ Systems AS</a> (except where otherwise noted). All rights reserved.', + 'data_type_string' => 'eztext', + 'id' => '1327', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1216 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '339', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1328', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1217 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '340', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '1329', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1218 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '225', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '1330', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 1219 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '225', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1331', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + ), + 'ezcontentobject_link' => + array ( + 0 => + array ( + 'contentclassattribute_id' => '237', + 'from_contentobject_id' => '67', + 'from_contentobject_version' => '1', + 'id' => '1', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '60', + ), + 1 => + array ( + 'contentclassattribute_id' => '237', + 'from_contentobject_id' => '75', + 'from_contentobject_version' => '1', + 'id' => '2', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '64', + ), + 2 => + array ( + 'contentclassattribute_id' => '237', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '3', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '63', + ), + 3 => + array ( + 'contentclassattribute_id' => '237', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '4', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '62', + ), + 4 => + array ( + 'contentclassattribute_id' => '237', + 'from_contentobject_id' => '154', + 'from_contentobject_version' => '1', + 'id' => '5', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '61', + ), + 5 => + array ( + 'contentclassattribute_id' => '237', + 'from_contentobject_id' => '165', + 'from_contentobject_version' => '1', + 'id' => '6', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '58', + ), + 6 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '109', + 'from_contentobject_version' => '1', + 'id' => '7', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '109', + ), + 7 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '110', + 'from_contentobject_version' => '1', + 'id' => '8', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '110', + ), + 8 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '111', + 'from_contentobject_version' => '1', + 'id' => '9', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '111', + ), + 9 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '112', + 'from_contentobject_version' => '1', + 'id' => '10', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '112', + ), + 10 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '113', + 'from_contentobject_version' => '1', + 'id' => '11', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '113', + ), + 11 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '114', + 'from_contentobject_version' => '1', + 'id' => '12', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '114', + ), + 12 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '115', + 'from_contentobject_version' => '1', + 'id' => '13', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '115', + ), + 13 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '116', + 'from_contentobject_version' => '1', + 'id' => '14', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '116', + ), + 14 => + array ( + 'contentclassattribute_id' => '108', + 'from_contentobject_id' => '117', + 'from_contentobject_version' => '1', + 'id' => '15', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '117', + ), + 15 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '119', + 'from_contentobject_version' => '1', + 'id' => '16', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '119', + ), + 16 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '120', + 'from_contentobject_version' => '1', + 'id' => '17', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '120', + ), + 17 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '121', + 'from_contentobject_version' => '1', + 'id' => '18', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '121', + ), + 18 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '122', + 'from_contentobject_version' => '1', + 'id' => '19', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '122', + ), + 19 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '123', + 'from_contentobject_version' => '1', + 'id' => '20', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '123', + ), + 20 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '124', + 'from_contentobject_version' => '1', + 'id' => '21', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '124', + ), + 21 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '125', + 'from_contentobject_version' => '1', + 'id' => '22', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '125', + ), + 22 => + array ( + 'contentclassattribute_id' => '118', + 'from_contentobject_id' => '126', + 'from_contentobject_version' => '1', + 'id' => '23', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '126', + ), + 23 => + array ( + 'contentclassattribute_id' => '127', + 'from_contentobject_id' => '128', + 'from_contentobject_version' => '1', + 'id' => '24', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '128', + ), + 24 => + array ( + 'contentclassattribute_id' => '127', + 'from_contentobject_id' => '129', + 'from_contentobject_version' => '1', + 'id' => '25', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '129', + ), + 25 => + array ( + 'contentclassattribute_id' => '132', + 'from_contentobject_id' => '133', + 'from_contentobject_version' => '1', + 'id' => '26', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '133', + ), + 26 => + array ( + 'contentclassattribute_id' => '132', + 'from_contentobject_id' => '134', + 'from_contentobject_version' => '1', + 'id' => '27', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '134', + ), + 27 => + array ( + 'contentclassattribute_id' => '132', + 'from_contentobject_id' => '135', + 'from_contentobject_version' => '1', + 'id' => '28', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '135', + ), + 28 => + array ( + 'contentclassattribute_id' => '136', + 'from_contentobject_id' => '137', + 'from_contentobject_version' => '1', + 'id' => '29', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '137', + ), + 29 => + array ( + 'contentclassattribute_id' => '136', + 'from_contentobject_id' => '138', + 'from_contentobject_version' => '1', + 'id' => '30', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '138', + ), + 30 => + array ( + 'contentclassattribute_id' => '139', + 'from_contentobject_id' => '140', + 'from_contentobject_version' => '1', + 'id' => '31', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '140', + ), + 31 => + array ( + 'contentclassattribute_id' => '139', + 'from_contentobject_id' => '141', + 'from_contentobject_version' => '1', + 'id' => '32', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '141', + ), + 32 => + array ( + 'contentclassattribute_id' => '139', + 'from_contentobject_id' => '142', + 'from_contentobject_version' => '1', + 'id' => '33', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '142', + ), + 33 => + array ( + 'contentclassattribute_id' => '139', + 'from_contentobject_id' => '143', + 'from_contentobject_version' => '1', + 'id' => '34', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '143', + ), + 34 => + array ( + 'contentclassattribute_id' => '145', + 'from_contentobject_id' => '146', + 'from_contentobject_version' => '1', + 'id' => '35', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '146', + ), + 35 => + array ( + 'contentclassattribute_id' => '148', + 'from_contentobject_id' => '149', + 'from_contentobject_version' => '1', + 'id' => '36', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '149', + ), + 36 => + array ( + 'contentclassattribute_id' => '151', + 'from_contentobject_id' => '152', + 'from_contentobject_version' => '1', + 'id' => '37', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '152', + ), + 37 => + array ( + 'contentclassattribute_id' => '151', + 'from_contentobject_id' => '153', + 'from_contentobject_version' => '1', + 'id' => '38', + 'op_code' => '0', + 'relation_type' => '8', + 'to_contentobject_id' => '153', + ), + 38 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '65', + 'from_contentobject_version' => '1', + 'id' => '39', + 'op_code' => '0', + 'relation_type' => '4', + 'to_contentobject_id' => '151', + ), + 39 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '65', + 'from_contentobject_version' => '1', + 'id' => '40', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '106', + ), + 40 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '65', + 'from_contentobject_version' => '1', + 'id' => '41', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '107', + ), + 41 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '65', + 'from_contentobject_version' => '1', + 'id' => '42', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '176', + ), + 42 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '65', + 'from_contentobject_version' => '1', + 'id' => '43', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '131', + ), + 43 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '67', + 'from_contentobject_version' => '1', + 'id' => '44', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '71', + ), + 44 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '67', + 'from_contentobject_version' => '1', + 'id' => '45', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '72', + ), + 45 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '67', + 'from_contentobject_version' => '1', + 'id' => '46', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '73', + ), + 46 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '75', + 'from_contentobject_version' => '1', + 'id' => '47', + 'op_code' => '0', + 'relation_type' => '6', + 'to_contentobject_id' => '76', + ), + 47 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '75', + 'from_contentobject_version' => '1', + 'id' => '48', + 'op_code' => '0', + 'relation_type' => '6', + 'to_contentobject_id' => '80', + ), + 48 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '75', + 'from_contentobject_version' => '1', + 'id' => '49', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '77', + ), + 49 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '75', + 'from_contentobject_version' => '1', + 'id' => '50', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '79', + ), + 50 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '75', + 'from_contentobject_version' => '1', + 'id' => '51', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '78', + ), + 51 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '52', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '85', + ), + 52 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '53', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '93', + ), + 53 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '54', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '91', + ), + 54 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '55', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '92', + ), + 55 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '56', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '86', + ), + 56 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '84', + 'from_contentobject_version' => '1', + 'id' => '57', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '87', + ), + 57 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '58', + 'op_code' => '0', + 'relation_type' => '4', + 'to_contentobject_id' => '98', + ), + 58 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '59', + 'op_code' => '0', + 'relation_type' => '4', + 'to_contentobject_id' => '95', + ), + 59 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '60', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '101', + ), + 60 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '61', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '103', + ), + 61 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '62', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '104', + ), + 62 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '94', + 'from_contentobject_version' => '1', + 'id' => '63', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '102', + ), + 63 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '106', + 'from_contentobject_version' => '1', + 'id' => '64', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '108', + ), + 64 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '106', + 'from_contentobject_version' => '1', + 'id' => '65', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '202', + ), + 65 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '106', + 'from_contentobject_version' => '1', + 'id' => '66', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '127', + ), + 66 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '106', + 'from_contentobject_version' => '1', + 'id' => '67', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '130', + ), + 67 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '68', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '109', + ), + 68 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '69', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '110', + ), + 69 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '70', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '111', + ), + 70 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '71', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '112', + ), + 71 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '72', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '113', + ), + 72 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '73', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '114', + ), + 73 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '74', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '115', + ), + 74 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '108', + 'from_contentobject_version' => '1', + 'id' => '75', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '116', + ), + 75 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '76', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '119', + ), + 76 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '77', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '120', + ), + 77 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '78', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '121', + ), + 78 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '79', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '122', + ), + 79 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '80', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '123', + ), + 80 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '81', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '124', + ), + 81 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '82', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '125', + ), + 82 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '118', + 'from_contentobject_version' => '1', + 'id' => '83', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '126', + ), + 83 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '127', + 'from_contentobject_version' => '1', + 'id' => '84', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '128', + ), + 84 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '127', + 'from_contentobject_version' => '1', + 'id' => '85', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '129', + ), + 85 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '132', + 'from_contentobject_version' => '1', + 'id' => '86', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '133', + ), + 86 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '132', + 'from_contentobject_version' => '1', + 'id' => '87', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '134', + ), + 87 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '132', + 'from_contentobject_version' => '1', + 'id' => '88', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '135', + ), + 88 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '136', + 'from_contentobject_version' => '1', + 'id' => '89', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '137', + ), + 89 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '136', + 'from_contentobject_version' => '1', + 'id' => '90', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '138', + ), + 90 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '139', + 'from_contentobject_version' => '1', + 'id' => '91', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '141', + ), + 91 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '139', + 'from_contentobject_version' => '1', + 'id' => '92', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '140', + ), + 92 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '139', + 'from_contentobject_version' => '1', + 'id' => '93', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '142', + ), + 93 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '139', + 'from_contentobject_version' => '1', + 'id' => '94', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '143', + ), + 94 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '145', + 'from_contentobject_version' => '1', + 'id' => '95', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '146', + ), + 95 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '148', + 'from_contentobject_version' => '1', + 'id' => '96', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '149', + ), + 96 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '150', + 'from_contentobject_version' => '1', + 'id' => '97', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '66', + ), + 97 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '151', + 'from_contentobject_version' => '1', + 'id' => '98', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '152', + ), + 98 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '151', + 'from_contentobject_version' => '1', + 'id' => '99', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '153', + ), + 99 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '154', + 'from_contentobject_version' => '1', + 'id' => '100', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '163', + ), + 100 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '154', + 'from_contentobject_version' => '1', + 'id' => '101', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '162', + ), + 101 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '154', + 'from_contentobject_version' => '1', + 'id' => '102', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '158', + ), + 102 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '154', + 'from_contentobject_version' => '1', + 'id' => '103', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '155', + ), + 103 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '154', + 'from_contentobject_version' => '1', + 'id' => '104', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '164', + ), + 104 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '165', + 'from_contentobject_version' => '1', + 'id' => '105', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '170', + ), + 105 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '165', + 'from_contentobject_version' => '1', + 'id' => '106', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '185', + ), + 106 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '165', + 'from_contentobject_version' => '1', + 'id' => '107', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '166', + ), + 107 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '165', + 'from_contentobject_version' => '1', + 'id' => '108', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '176', + ), + 108 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '188', + 'from_contentobject_version' => '1', + 'id' => '109', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '224', + ), + 109 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '191', + 'from_contentobject_version' => '1', + 'id' => '110', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '192', + ), + 110 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '111', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '199', + ), + 111 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '112', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '194', + ), + 112 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '113', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '195', + ), + 113 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '114', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '196', + ), + 114 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '115', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '197', + ), + 115 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '116', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '200', + ), + 116 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '117', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '201', + ), + 117 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '193', + 'from_contentobject_version' => '1', + 'id' => '118', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '198', + ), + 118 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '119', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '210', + ), + 119 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '120', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '203', + ), + 120 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '121', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '204', + ), + 121 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '122', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '205', + ), + 122 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '123', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '206', + ), + 123 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '124', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '207', + ), + 124 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '125', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '208', + ), + 125 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '202', + 'from_contentobject_version' => '1', + 'id' => '126', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '209', + ), + 126 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '211', + 'from_contentobject_version' => '1', + 'id' => '127', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '212', + ), + 127 => + array ( + 'contentclassattribute_id' => '0', + 'from_contentobject_id' => '211', + 'from_contentobject_version' => '1', + 'id' => '128', + 'op_code' => '0', + 'relation_type' => '2', + 'to_contentobject_id' => '213', + ), + ), + 'ezcontentobject_name' => + array ( + 0 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '4', + 'language_id' => '3', + 'name' => 'Users', + 'real_translation' => 'eng-US', + ), + 1 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '10', + 'language_id' => '3', + 'name' => 'Anonymous User', + 'real_translation' => 'eng-US', + ), + 2 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '11', + 'language_id' => '3', + 'name' => 'Guest accounts', + 'real_translation' => 'eng-US', + ), + 3 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '11', + 'language_id' => '3', + 'name' => 'Members', + 'real_translation' => 'eng-US', + ), + 4 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '12', + 'language_id' => '3', + 'name' => 'Administrator users', + 'real_translation' => 'eng-US', + ), + 5 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '13', + 'language_id' => '3', + 'name' => 'Editors', + 'real_translation' => 'eng-US', + ), + 6 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '3', + 'contentobject_id' => '14', + 'language_id' => '3', + 'name' => 'Administrator User', + 'real_translation' => 'eng-US', + ), + 7 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '4', + 'contentobject_id' => '14', + 'language_id' => '3', + 'name' => 'Administrator User', + 'real_translation' => 'eng-US', + ), + 8 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '41', + 'language_id' => '3', + 'name' => 'Media', + 'real_translation' => 'eng-US', + ), + 9 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '42', + 'language_id' => '3', + 'name' => 'Anonymous Users', + 'real_translation' => 'eng-US', + ), + 10 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '45', + 'language_id' => '3', + 'name' => 'Setup', + 'real_translation' => 'eng-US', + ), + 11 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '49', + 'language_id' => '3', + 'name' => 'Images', + 'real_translation' => 'eng-US', + ), + 12 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '50', + 'language_id' => '3', + 'name' => 'Files', + 'real_translation' => 'eng-US', + ), + 13 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '51', + 'language_id' => '3', + 'name' => 'Multimedia', + 'real_translation' => 'eng-US', + ), + 14 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '52', + 'language_id' => '2', + 'name' => 'Common INI settings', + 'real_translation' => 'eng-US', + ), + 15 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '54', + 'language_id' => '2', + 'name' => 'Website Interface', + 'real_translation' => 'eng-US', + ), + 16 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '56', + 'language_id' => '3', + 'name' => 'Design', + 'real_translation' => 'eng-US', + ), + 17 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '57', + 'language_id' => '3', + 'name' => 'Banners', + 'real_translation' => 'eng-US', + ), + 18 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '58', + 'language_id' => '2', + 'name' => 'Woman (Communities)', + 'real_translation' => 'eng-US', + ), + 19 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '59', + 'language_id' => '2', + 'name' => 'Woman (Frontpage)', + 'real_translation' => 'eng-US', + ), + 20 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '60', + 'language_id' => '2', + 'name' => 'Woman (Products)', + 'real_translation' => 'eng-US', + ), + 21 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '61', + 'language_id' => '2', + 'name' => 'Woman (Partners)', + 'real_translation' => 'eng-US', + ), + 22 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '62', + 'language_id' => '2', + 'name' => 'Pencils (Support)', + 'real_translation' => 'eng-US', + ), + 23 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '63', + 'language_id' => '2', + 'name' => 'Woman (Training)', + 'real_translation' => 'eng-US', + ), + 24 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '64', + 'language_id' => '2', + 'name' => 'Woman (Solutions)', + 'real_translation' => 'eng-US', + ), + 25 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '65', + 'language_id' => '3', + 'name' => 'Home', + 'real_translation' => 'eng-US', + ), + 26 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '66', + 'language_id' => '2', + 'name' => 'rest_api', + 'real_translation' => 'eng-US', + ), + 27 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '67', + 'language_id' => '2', + 'name' => 'Products', + 'real_translation' => 'eng-US', + ), + 28 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '68', + 'language_id' => '3', + 'name' => 'Software', + 'real_translation' => 'eng-US', + ), + 29 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '69', + 'language_id' => '2', + 'name' => 'OS Type I', + 'real_translation' => 'eng-US', + ), + 30 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '70', + 'language_id' => '3', + 'name' => 'Boxes', + 'real_translation' => 'eng-US', + ), + 31 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '71', + 'language_id' => '2', + 'name' => 'CD/DVD Box I', + 'real_translation' => 'eng-US', + ), + 32 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '72', + 'language_id' => '2', + 'name' => 'CD/DVD Box II', + 'real_translation' => 'eng-US', + ), + 33 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '73', + 'language_id' => '2', + 'name' => 'CD/DVD Box III', + 'real_translation' => 'eng-US', + ), + 34 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '74', + 'language_id' => '3', + 'name' => 'Products sheets', + 'real_translation' => 'eng-US', + ), + 35 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '75', + 'language_id' => '2', + 'name' => 'Solutions', + 'real_translation' => 'eng-US', + ), + 36 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '76', + 'language_id' => '3', + 'name' => 'Web publishing', + 'real_translation' => 'eng-US', + ), + 37 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '77', + 'language_id' => '2', + 'name' => 'Fusce sagittis sagittis', + 'real_translation' => 'eng-US', + ), + 38 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '78', + 'language_id' => '2', + 'name' => 'Etiam posuere sodales arcu', + 'real_translation' => 'eng-US', + ), + 39 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '79', + 'language_id' => '2', + 'name' => 'In hac habitasse platea', + 'real_translation' => 'eng-US', + ), + 40 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '80', + 'language_id' => '3', + 'name' => 'Content management', + 'real_translation' => 'eng-US', + ), + 41 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '81', + 'language_id' => '2', + 'name' => 'Fusce sagittis sagittis urna', + 'real_translation' => 'eng-US', + ), + 42 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '82', + 'language_id' => '2', + 'name' => 'Class aptent taciti sociosqu', + 'real_translation' => 'eng-US', + ), + 43 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '83', + 'language_id' => '2', + 'name' => 'Aenean malesuada ligula', + 'real_translation' => 'eng-US', + ), + 44 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '84', + 'language_id' => '2', + 'name' => 'Training', + 'real_translation' => 'eng-US', + ), + 45 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '85', + 'language_id' => '3', + 'name' => 'Certification', + 'real_translation' => 'eng-US', + ), + 46 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '86', + 'language_id' => '3', + 'name' => 'Professional workshops', + 'real_translation' => 'eng-US', + ), + 47 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '87', + 'language_id' => '2', + 'name' => 'Etiam sodales mauris', + 'real_translation' => 'eng-US', + ), + 48 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '88', + 'language_id' => '2', + 'name' => 'Class aptent taciti', + 'real_translation' => 'eng-US', + ), + 49 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '89', + 'language_id' => '2', + 'name' => 'Duis auctor vehicula erat', + 'real_translation' => 'eng-US', + ), + 50 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '90', + 'language_id' => '2', + 'name' => 'Events and seminars', + 'real_translation' => 'eng-US', + ), + 51 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '91', + 'language_id' => '3', + 'name' => 'Self-paced courses', + 'real_translation' => 'eng-US', + ), + 52 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '92', + 'language_id' => '3', + 'name' => 'Instructor-led courses', + 'real_translation' => 'eng-US', + ), + 53 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '93', + 'language_id' => '3', + 'name' => 'Additional learning resources', + 'real_translation' => 'eng-US', + ), + 54 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '94', + 'language_id' => '2', + 'name' => 'Support', + 'real_translation' => 'eng-US', + ), + 55 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '95', + 'language_id' => '2', + 'name' => 'Knowledgebase', + 'real_translation' => 'eng-US', + ), + 56 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '96', + 'language_id' => '2', + 'name' => 'Sed suscipit', + 'real_translation' => 'eng-US', + ), + 57 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '97', + 'language_id' => '2', + 'name' => 'Ut interdum', + 'real_translation' => 'eng-US', + ), + 58 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '98', + 'language_id' => '2', + 'name' => 'Documentation', + 'real_translation' => 'eng-US', + ), + 59 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '99', + 'language_id' => '2', + 'name' => 'Mauris pretium', + 'real_translation' => 'eng-US', + ), + 60 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '100', + 'language_id' => '2', + 'name' => 'Aliquam posuere', + 'real_translation' => 'eng-US', + ), + 61 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '101', + 'language_id' => '3', + 'name' => 'Books', + 'real_translation' => 'eng-US', + ), + 62 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '102', + 'language_id' => '2', + 'name' => 'Aliquam pulvinar suscipit tellus', + 'real_translation' => 'eng-US', + ), + 63 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '103', + 'language_id' => '3', + 'name' => 'Customer Service', + 'real_translation' => 'eng-US', + ), + 64 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '104', + 'language_id' => '3', + 'name' => 'Support Programs', + 'real_translation' => 'eng-US', + ), + 65 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '105', + 'language_id' => '3', + 'name' => 'Getting started', + 'real_translation' => 'eng-US', + ), + 66 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '106', + 'language_id' => '2', + 'name' => 'Tutorials for', + 'real_translation' => 'eng-US', + ), + 67 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '107', + 'language_id' => '2', + 'name' => 'Get involved', + 'real_translation' => 'eng-US', + ), + 68 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '108', + 'language_id' => '2', + 'name' => 'How to use eZ Publish', + 'real_translation' => 'eng-US', + ), + 69 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '109', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 70 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '110', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 71 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '111', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 72 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '112', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 73 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '113', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 74 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '114', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 75 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '115', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 76 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '116', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 77 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '117', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 78 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '118', + 'language_id' => '2', + 'name' => 'How to manage eZ Publish', + 'real_translation' => 'eng-US', + ), + 79 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '119', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 80 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '120', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 81 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '121', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 82 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '122', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 83 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '123', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 84 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '124', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 85 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '125', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 86 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '126', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 87 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '127', + 'language_id' => '2', + 'name' => 'How to develop with eZ Publish', + 'real_translation' => 'eng-US', + ), + 88 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '128', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 89 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '129', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 90 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '130', + 'language_id' => '2', + 'name' => 'Adding Siteaccesses in eZ Publish', + 'real_translation' => 'eng-US', + ), + 91 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '131', + 'language_id' => '3', + 'name' => 'New features', + 'real_translation' => 'eng-US', + ), + 92 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '132', + 'language_id' => '2', + 'name' => 'Improved user registration workflow', + 'real_translation' => 'eng-US', + ), + 93 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '133', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 94 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '134', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 95 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '135', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 96 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '136', + 'language_id' => '2', + 'name' => 'Improved block editing', + 'real_translation' => 'eng-US', + ), + 97 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '137', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 98 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '138', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 99 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '139', + 'language_id' => '2', + 'name' => 'Improved front-end editing', + 'real_translation' => 'eng-US', + ), + 100 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '140', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 101 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '141', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 102 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '142', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 103 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '143', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 104 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '144', + 'language_id' => '2', + 'name' => 'FastCGI', + 'real_translation' => 'eng-US', + ), + 105 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '145', + 'language_id' => '2', + 'name' => 'Support for Red Hat Enterprise', + 'real_translation' => 'eng-US', + ), + 106 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '146', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 107 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '147', + 'language_id' => '2', + 'name' => 'Canonical links', + 'real_translation' => 'eng-US', + ), + 108 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '148', + 'language_id' => '2', + 'name' => 'Asynchronous publishing', + 'real_translation' => 'eng-US', + ), + 109 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '149', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 110 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '150', + 'language_id' => '2', + 'name' => 'REST API interface', + 'real_translation' => 'eng-US', + ), + 111 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '151', + 'language_id' => '2', + 'name' => 'eZ Publish Enterprise', + 'real_translation' => 'eng-US', + ), + 112 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '152', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 113 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '153', + 'language_id' => '2', + 'name' => 'graphics1', + 'real_translation' => 'eng-US', + ), + 114 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '154', + 'language_id' => '3', + 'name' => 'Partners', + 'real_translation' => 'eng-US', + ), + 115 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '155', + 'language_id' => '3', + 'name' => 'Partner News', + 'real_translation' => 'eng-US', + ), + 116 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '156', + 'language_id' => '2', + 'name' => 'Pellentesque quam mauris', + 'real_translation' => 'eng-US', + ), + 117 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '157', + 'language_id' => '2', + 'name' => 'Penatibus et magnis dis', + 'real_translation' => 'eng-US', + ), + 118 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '158', + 'language_id' => '3', + 'name' => 'News', + 'real_translation' => 'eng-US', + ), + 119 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '159', + 'language_id' => '2', + 'name' => 'Curabitur hendrerit dignissim', + 'real_translation' => 'eng-US', + ), + 120 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '160', + 'language_id' => '2', + 'name' => 'Proin condimentum risus', + 'real_translation' => 'eng-US', + ), + 121 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '161', + 'language_id' => '2', + 'name' => 'Morbi tristique senectus', + 'real_translation' => 'eng-US', + ), + 122 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '162', + 'language_id' => '3', + 'name' => 'Partner Products', + 'real_translation' => 'eng-US', + ), + 123 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '163', + 'language_id' => '3', + 'name' => 'Partners', + 'real_translation' => 'eng-US', + ), + 124 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '164', + 'language_id' => '2', + 'name' => 'Neque orci malesuada felis', + 'real_translation' => 'eng-US', + ), + 125 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '165', + 'language_id' => '3', + 'name' => 'Community', + 'real_translation' => 'eng-US', + ), + 126 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '166', + 'language_id' => '2', + 'name' => 'Forum', + 'real_translation' => 'eng-US', + ), + 127 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '167', + 'language_id' => '2', + 'name' => 'Nulla vitae tellus sit amet', + 'real_translation' => 'eng-US', + ), + 128 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '168', + 'language_id' => '2', + 'name' => 'Ut mollis sodales nibh', + 'real_translation' => 'eng-US', + ), + 129 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '169', + 'language_id' => '2', + 'name' => 'Nam risus leo', + 'real_translation' => 'eng-US', + ), + 130 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '170', + 'language_id' => '2', + 'name' => 'Wiki', + 'real_translation' => 'eng-US', + ), + 131 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '171', + 'language_id' => '2', + 'name' => 'Sed suscipit', + 'real_translation' => 'eng-US', + ), + 132 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '172', + 'language_id' => '2', + 'name' => 'Ut interdum', + 'real_translation' => 'eng-US', + ), + 133 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '173', + 'language_id' => '2', + 'name' => 'Fusce pulvinar', + 'real_translation' => 'eng-US', + ), + 134 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '174', + 'language_id' => '2', + 'name' => 'Duis id tortor', + 'real_translation' => 'eng-US', + ), + 135 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '175', + 'language_id' => '2', + 'name' => 'Curabitur lacinia', + 'real_translation' => 'eng-US', + ), + 136 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '176', + 'language_id' => '2', + 'name' => 'Pictures', + 'real_translation' => 'eng-US', + ), + 137 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '177', + 'language_id' => '2', + 'name' => 'Ivo on eZ Tags', + 'real_translation' => 'eng-US', + ), + 138 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '178', + 'language_id' => '2', + 'name' => 'Are you ready for the Community day?', + 'real_translation' => 'eng-US', + ), + 139 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '179', + 'language_id' => '2', + 'name' => 'Let\'s work together!', + 'real_translation' => 'eng-US', + ), + 140 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '180', + 'language_id' => '2', + 'name' => 'The Mediterranean seen from Nice!', + 'real_translation' => 'eng-US', + ), + 141 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '181', + 'language_id' => '2', + 'name' => 'Hotel lobby at Isola2000', + 'real_translation' => 'eng-US', + ), + 142 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '182', + 'language_id' => '2', + 'name' => 'Alexander on the past, Gaby on today and tomorrow', + 'real_translation' => 'eng-US', + ), + 143 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '183', + 'language_id' => '2', + 'name' => 'Isola2000 in white - beautiful skiing!', + 'real_translation' => 'eng-US', + ), + 144 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '184', + 'language_id' => '2', + 'name' => 'CEO future pitch - Adaptable, open, reliable!', + 'real_translation' => 'eng-US', + ), + 145 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '185', + 'language_id' => '2', + 'name' => 'Blog', + 'real_translation' => 'eng-US', + ), + 146 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '186', + 'language_id' => '2', + 'name' => 'Visit Paris', + 'real_translation' => 'eng-US', + ), + 147 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '187', + 'language_id' => '2', + 'name' => 'Paris in France', + 'real_translation' => 'eng-US', + ), + 148 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '188', + 'language_id' => '3', + 'name' => 'Company', + 'real_translation' => 'eng-US', + ), + 149 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '189', + 'language_id' => '3', + 'name' => 'About company', + 'real_translation' => 'eng-US', + ), + 150 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '190', + 'language_id' => '3', + 'name' => 'New features', + 'real_translation' => 'eng-US', + ), + 151 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '191', + 'language_id' => '2', + 'name' => 'Separate content & design in eZ Publish', + 'real_translation' => 'eng-US', + ), + 152 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '192', + 'language_id' => '2', + 'name' => 'separation_of_content_and_design', + 'real_translation' => 'eng-US', + ), + 153 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '193', + 'language_id' => '2', + 'name' => 'How to use eZ Publish', + 'real_translation' => 'eng-US', + ), + 154 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '194', + 'language_id' => '2', + 'name' => 'openoffice_import_large', + 'real_translation' => 'eng-US', + ), + 155 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '195', + 'language_id' => '2', + 'name' => 'translation_large', + 'real_translation' => 'eng-US', + ), + 156 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '196', + 'language_id' => '2', + 'name' => 'multiupload_large', + 'real_translation' => 'eng-US', + ), + 157 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '197', + 'language_id' => '2', + 'name' => 'gallery_large', + 'real_translation' => 'eng-US', + ), + 158 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '198', + 'language_id' => '2', + 'name' => 'search_result_large', + 'real_translation' => 'eng-US', + ), + 159 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '199', + 'language_id' => '2', + 'name' => 'ez_tool_bar_large', + 'real_translation' => 'eng-US', + ), + 160 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '200', + 'language_id' => '2', + 'name' => 'quicktime_large', + 'real_translation' => 'eng-US', + ), + 161 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '201', + 'language_id' => '2', + 'name' => 'web_2_0_large', + 'real_translation' => 'eng-US', + ), + 162 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '202', + 'language_id' => '2', + 'name' => 'How to manage eZ Publish', + 'real_translation' => 'eng-US', + ), + 163 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '203', + 'language_id' => '2', + 'name' => 'usermanagement_large', + 'real_translation' => 'eng-US', + ), + 164 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '204', + 'language_id' => '2', + 'name' => 'workflow_large', + 'real_translation' => 'eng-US', + ), + 165 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '205', + 'language_id' => '2', + 'name' => 'versioning_large', + 'real_translation' => 'eng-US', + ), + 166 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '206', + 'language_id' => '2', + 'name' => 'datatypes_attributes_content_class_and_objects_large', + 'real_translation' => 'eng-US', + ), + 167 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '207', + 'language_id' => '2', + 'name' => 'multiple_location_large', + 'real_translation' => 'eng-US', + ), + 168 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '208', + 'language_id' => '2', + 'name' => 'multisite_deployment_large', + 'real_translation' => 'eng-US', + ), + 169 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '209', + 'language_id' => '2', + 'name' => 'seo_large', + 'real_translation' => 'eng-US', + ), + 170 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '210', + 'language_id' => '2', + 'name' => 'admin_site_large', + 'real_translation' => 'eng-US', + ), + 171 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '211', + 'language_id' => '2', + 'name' => 'How to develop with eZ Publish', + 'real_translation' => 'eng-US', + ), + 172 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '212', + 'language_id' => '2', + 'name' => 'datatypes_attributes_content_class_and_objects_large', + 'real_translation' => 'eng-US', + ), + 173 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '213', + 'language_id' => '2', + 'name' => 'site_style_large', + 'real_translation' => 'eng-US', + ), + 174 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '214', + 'language_id' => '2', + 'name' => 'REST API interface', + 'real_translation' => 'eng-US', + ), + 175 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '215', + 'language_id' => '2', + 'name' => 'Asynchronous Publishing', + 'real_translation' => 'eng-US', + ), + 176 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '216', + 'language_id' => '2', + 'name' => 'Canonical links', + 'real_translation' => 'eng-US', + ), + 177 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '217', + 'language_id' => '2', + 'name' => 'Support for Red Hat Enterprise', + 'real_translation' => 'eng-US', + ), + 178 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '218', + 'language_id' => '2', + 'name' => 'FastCGI', + 'real_translation' => 'eng-US', + ), + 179 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '219', + 'language_id' => '2', + 'name' => 'Events', + 'real_translation' => 'eng-US', + ), + 180 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '220', + 'language_id' => '3', + 'name' => 'Career', + 'real_translation' => 'eng-US', + ), + 181 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '221', + 'language_id' => '3', + 'name' => 'Investors Relation', + 'real_translation' => 'eng-US', + ), + 182 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '222', + 'language_id' => '2', + 'name' => 'Contact', + 'real_translation' => 'eng-US', + ), + 183 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '223', + 'language_id' => '2', + 'name' => 'Morbi neque', + 'real_translation' => 'eng-US', + ), + 184 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '224', + 'language_id' => '3', + 'name' => 'Company banner', + 'real_translation' => 'eng-US', + ), + 185 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '225', + 'language_id' => '3', + 'name' => 'Partners', + 'real_translation' => 'eng-US', + ), + ), + 'ezcontentobject_tree' => + array ( + 0 => + array ( + 'contentobject_id' => '0', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '0', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '1', + 'modified_subnode' => '1311154216', + 'node_id' => '1', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/', + 'priority' => '0', + 'remote_id' => '629709ba256fe317c3ddcee35453a96a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => + array ( + 'contentobject_id' => '65', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '2', + 'modified_subnode' => '1311154215', + 'node_id' => '2', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/2/', + 'priority' => '0', + 'remote_id' => 'f3e90596361e31d496d4026eb624c983', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 2 => + array ( + 'contentobject_id' => '4', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '5', + 'modified_subnode' => '1311154216', + 'node_id' => '5', + 'parent_node_id' => '1', + 'path_identification_string' => 'users', + 'path_string' => '/1/5/', + 'priority' => '0', + 'remote_id' => '3f6d92f8044aed134f32153517850f5a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 3 => + array ( + 'contentobject_id' => '11', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '12', + 'modified_subnode' => '1311154216', + 'node_id' => '12', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/members', + 'path_string' => '/1/5/12/', + 'priority' => '0', + 'remote_id' => '602dcf84765e56b7f999eaafd3821dd3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => + array ( + 'contentobject_id' => '12', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '13', + 'modified_subnode' => '1311154214', + 'node_id' => '13', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/administrator_users', + 'path_string' => '/1/5/13/', + 'priority' => '0', + 'remote_id' => '769380b7aa94541679167eab817ca893', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => + array ( + 'contentobject_id' => '13', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '14', + 'modified_subnode' => '1081860719', + 'node_id' => '14', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/editors', + 'path_string' => '/1/5/14/', + 'priority' => '0', + 'remote_id' => 'f7dda2854fc68f7c8455d9cb14bd04a9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => + array ( + 'contentobject_id' => '14', + 'contentobject_is_published' => '1', + 'contentobject_version' => '4', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '15', + 'modified_subnode' => '1311154214', + 'node_id' => '15', + 'parent_node_id' => '13', + 'path_identification_string' => 'users/administrator_users/administrator_user', + 'path_string' => '/1/5/13/15/', + 'priority' => '0', + 'remote_id' => 'e5161a99f733200b9ed4e80f9c16187b', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => + array ( + 'contentobject_id' => '41', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '43', + 'modified_subnode' => '1311154174', + 'node_id' => '43', + 'parent_node_id' => '1', + 'path_identification_string' => 'media', + 'path_string' => '/1/43/', + 'priority' => '0', + 'remote_id' => '75c715a51699d2d309a924eca6a95145', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 8 => + array ( + 'contentobject_id' => '42', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '44', + 'modified_subnode' => '1081860719', + 'node_id' => '44', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/anonymous_users', + 'path_string' => '/1/5/44/', + 'priority' => '0', + 'remote_id' => '4fdf0072da953bb276c0c7e0141c5c9b', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => + array ( + 'contentobject_id' => '10', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '45', + 'modified_subnode' => '1081860719', + 'node_id' => '45', + 'parent_node_id' => '44', + 'path_identification_string' => 'users/anonymous_users/anonymous_user', + 'path_string' => '/1/5/44/45/', + 'priority' => '0', + 'remote_id' => '2cf8343bee7b482bab82b269d8fecd76', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => + array ( + 'contentobject_id' => '45', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '48', + 'modified_subnode' => '1184592117', + 'node_id' => '48', + 'parent_node_id' => '1', + 'path_identification_string' => 'setup2', + 'path_string' => '/1/48/', + 'priority' => '0', + 'remote_id' => '182ce1b5af0c09fa378557c462ba2617', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => + array ( + 'contentobject_id' => '49', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '51', + 'modified_subnode' => '1311154174', + 'node_id' => '51', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/images', + 'path_string' => '/1/43/51/', + 'priority' => '0', + 'remote_id' => '1b26c0454b09bb49dfb1b9190ffd67cb', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => + array ( + 'contentobject_id' => '50', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '52', + 'modified_subnode' => '1081860720', + 'node_id' => '52', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/files', + 'path_string' => '/1/43/52/', + 'priority' => '0', + 'remote_id' => '0b113a208f7890f9ad3c24444ff5988c', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 13 => + array ( + 'contentobject_id' => '51', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '53', + 'modified_subnode' => '1081860720', + 'node_id' => '53', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/multimedia', + 'path_string' => '/1/43/53/', + 'priority' => '0', + 'remote_id' => '4f18b82c75f10aad476cae5adf98c11f', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 14 => + array ( + 'contentobject_id' => '52', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '54', + 'modified_subnode' => '1184592117', + 'node_id' => '54', + 'parent_node_id' => '48', + 'path_identification_string' => 'setup2/common_ini_settings', + 'path_string' => '/1/48/54/', + 'priority' => '0', + 'remote_id' => 'fa9f3cff9cf90ecfae335718dcbddfe2', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => + array ( + 'contentobject_id' => '54', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '56', + 'modified_subnode' => '1311154215', + 'node_id' => '56', + 'parent_node_id' => '58', + 'path_identification_string' => 'design/plain_site', + 'path_string' => '/1/58/56/', + 'priority' => '0', + 'remote_id' => '772da20ecf88b3035d73cbdfcea0f119', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => + array ( + 'contentobject_id' => '56', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '58', + 'modified_subnode' => '1311154215', + 'node_id' => '58', + 'parent_node_id' => '1', + 'path_identification_string' => 'design', + 'path_string' => '/1/58/', + 'priority' => '0', + 'remote_id' => '79f2d67372ab56f59b5d65bb9e0ca3b9', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 17 => + array ( + 'contentobject_id' => '57', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '59', + 'modified_subnode' => '1311154174', + 'node_id' => '59', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/banners', + 'path_string' => '/1/43/59/', + 'priority' => '0', + 'remote_id' => '437ef9d0a9b7ae326ec83fa3bb73956d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 18 => + array ( + 'contentobject_id' => '58', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '60', + 'modified_subnode' => '1311154173', + 'node_id' => '60', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_communities', + 'path_string' => '/1/43/59/60/', + 'priority' => '0', + 'remote_id' => 'eaa7f2f48c3f35801961abad12151db4', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 19 => + array ( + 'contentobject_id' => '59', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '61', + 'modified_subnode' => '1311154173', + 'node_id' => '61', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_frontpage', + 'path_string' => '/1/43/59/61/', + 'priority' => '0', + 'remote_id' => 'b8c85fd926d61dab6e68fa1865cee987', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 20 => + array ( + 'contentobject_id' => '60', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '62', + 'modified_subnode' => '1311154173', + 'node_id' => '62', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_products', + 'path_string' => '/1/43/59/62/', + 'priority' => '0', + 'remote_id' => 'c65aba2485585bdd09dfb66afccf645e', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 21 => + array ( + 'contentobject_id' => '61', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '63', + 'modified_subnode' => '1311154173', + 'node_id' => '63', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_partners', + 'path_string' => '/1/43/59/63/', + 'priority' => '0', + 'remote_id' => '64bb803471e53898aa38a7c29e482370', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 22 => + array ( + 'contentobject_id' => '62', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '64', + 'modified_subnode' => '1311154174', + 'node_id' => '64', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/pencils_support', + 'path_string' => '/1/43/59/64/', + 'priority' => '0', + 'remote_id' => '95e29503817570c6458fa0f37d227306', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 23 => + array ( + 'contentobject_id' => '63', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '65', + 'modified_subnode' => '1311154174', + 'node_id' => '65', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_training', + 'path_string' => '/1/43/59/65/', + 'priority' => '0', + 'remote_id' => 'aa4a1afd9c02d00f2f31186e8a271332', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 24 => + array ( + 'contentobject_id' => '64', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '66', + 'modified_subnode' => '1311154174', + 'node_id' => '66', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_solutions', + 'path_string' => '/1/43/59/66/', + 'priority' => '0', + 'remote_id' => '93d5115082a23b266613868051b8d803', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 25 => + array ( + 'contentobject_id' => '66', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '68', + 'modified_subnode' => '1311154174', + 'node_id' => '68', + 'parent_node_id' => '51', + 'path_identification_string' => 'media/images/rest_api', + 'path_string' => '/1/43/51/68/', + 'priority' => '0', + 'remote_id' => '31fd28362c18a36cb56223f3609d5d90', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 26 => + array ( + 'contentobject_id' => '67', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '69', + 'modified_subnode' => '1311154177', + 'node_id' => '69', + 'parent_node_id' => '2', + 'path_identification_string' => 'products', + 'path_string' => '/1/2/69/', + 'priority' => '0', + 'remote_id' => '9cec85d730eec7578190ee95ce5a36f5', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 27 => + array ( + 'contentobject_id' => '68', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '70', + 'modified_subnode' => '1311154175', + 'node_id' => '70', + 'parent_node_id' => '69', + 'path_identification_string' => 'products/software', + 'path_string' => '/1/2/69/70/', + 'priority' => '0', + 'remote_id' => 'b0b85c15125ca1732e5e528de2717599', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 28 => + array ( + 'contentobject_id' => '69', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '71', + 'modified_subnode' => '1311154175', + 'node_id' => '71', + 'parent_node_id' => '70', + 'path_identification_string' => 'products/software/os_type_i', + 'path_string' => '/1/2/69/70/71/', + 'priority' => '0', + 'remote_id' => '087adb763245e0cdcac593fb4a5996cf', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 29 => + array ( + 'contentobject_id' => '70', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '72', + 'modified_subnode' => '1311154176', + 'node_id' => '72', + 'parent_node_id' => '69', + 'path_identification_string' => 'products/boxes', + 'path_string' => '/1/2/69/72/', + 'priority' => '0', + 'remote_id' => 'e607aab6e924091909f3def02415bc53', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 30 => + array ( + 'contentobject_id' => '71', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '73', + 'modified_subnode' => '1311154176', + 'node_id' => '73', + 'parent_node_id' => '72', + 'path_identification_string' => 'products/boxes/cd_dvd_box_i', + 'path_string' => '/1/2/69/72/73/', + 'priority' => '0', + 'remote_id' => '054d9f10c6fa97689c0fc3b2ac412ebd', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 31 => + array ( + 'contentobject_id' => '72', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '74', + 'modified_subnode' => '1311154176', + 'node_id' => '74', + 'parent_node_id' => '72', + 'path_identification_string' => 'products/boxes/cd_dvd_box_ii', + 'path_string' => '/1/2/69/72/74/', + 'priority' => '0', + 'remote_id' => '9801bda46e5f8b9d692e1120d50fc7b3', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 32 => + array ( + 'contentobject_id' => '73', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '75', + 'modified_subnode' => '1311154176', + 'node_id' => '75', + 'parent_node_id' => '72', + 'path_identification_string' => 'products/boxes/cd_dvd_box_iii', + 'path_string' => '/1/2/69/72/75/', + 'priority' => '0', + 'remote_id' => '005067a5eee6505aa0f601cca30681d0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 33 => + array ( + 'contentobject_id' => '74', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '76', + 'modified_subnode' => '1311154177', + 'node_id' => '76', + 'parent_node_id' => '69', + 'path_identification_string' => 'products/products_sheets', + 'path_string' => '/1/2/69/76/', + 'priority' => '0', + 'remote_id' => '18f14551cc555c094b15a732ccd27fb2', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 34 => + array ( + 'contentobject_id' => '75', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '77', + 'modified_subnode' => '1311154179', + 'node_id' => '77', + 'parent_node_id' => '2', + 'path_identification_string' => 'solutions', + 'path_string' => '/1/2/77/', + 'priority' => '0', + 'remote_id' => 'dbc2f3c8716c12f32c379dbf0b1cb133', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 35 => + array ( + 'contentobject_id' => '76', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '78', + 'modified_subnode' => '1311154178', + 'node_id' => '78', + 'parent_node_id' => '77', + 'path_identification_string' => 'solutions/web_publishing', + 'path_string' => '/1/2/77/78/', + 'priority' => '0', + 'remote_id' => 'bc766fe955437def220a3fa2966a34ee', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 36 => + array ( + 'contentobject_id' => '77', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '79', + 'modified_subnode' => '1311154178', + 'node_id' => '79', + 'parent_node_id' => '78', + 'path_identification_string' => 'solutions/web_publishing/fusce_sagittis_sagittis', + 'path_string' => '/1/2/77/78/79/', + 'priority' => '0', + 'remote_id' => 'f0c2216ecb29600cd8ae93951a0c8f3a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 37 => + array ( + 'contentobject_id' => '78', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '80', + 'modified_subnode' => '1311154178', + 'node_id' => '80', + 'parent_node_id' => '78', + 'path_identification_string' => 'solutions/web_publishing/etiam_posuere_sodales_arcu', + 'path_string' => '/1/2/77/78/80/', + 'priority' => '0', + 'remote_id' => 'eaf16bddfd36206dad265aadfbc98f17', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 38 => + array ( + 'contentobject_id' => '79', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '81', + 'modified_subnode' => '1311154178', + 'node_id' => '81', + 'parent_node_id' => '78', + 'path_identification_string' => 'solutions/web_publishing/in_hac_habitasse_platea', + 'path_string' => '/1/2/77/78/81/', + 'priority' => '0', + 'remote_id' => 'd2a11e56093b77eb7a347229361c3377', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 39 => + array ( + 'contentobject_id' => '80', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '82', + 'modified_subnode' => '1311154179', + 'node_id' => '82', + 'parent_node_id' => '77', + 'path_identification_string' => 'solutions/content_management', + 'path_string' => '/1/2/77/82/', + 'priority' => '0', + 'remote_id' => '17d65b568e3500cf1f8b42bc5de2d12b', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 40 => + array ( + 'contentobject_id' => '81', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '83', + 'modified_subnode' => '1311154179', + 'node_id' => '83', + 'parent_node_id' => '82', + 'path_identification_string' => 'solutions/content_management/fusce_sagittis_sagittis_urna', + 'path_string' => '/1/2/77/82/83/', + 'priority' => '0', + 'remote_id' => 'ecc4f0e94b05bf10f4f783d660ff0ad0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 41 => + array ( + 'contentobject_id' => '82', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '84', + 'modified_subnode' => '1311154179', + 'node_id' => '84', + 'parent_node_id' => '82', + 'path_identification_string' => 'solutions/content_management/class_aptent_taciti_sociosqu', + 'path_string' => '/1/2/77/82/84/', + 'priority' => '0', + 'remote_id' => '74280af2cba9002ea9660749225562b6', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 42 => + array ( + 'contentobject_id' => '83', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '85', + 'modified_subnode' => '1311154179', + 'node_id' => '85', + 'parent_node_id' => '82', + 'path_identification_string' => 'solutions/content_management/aenean_malesuada_ligula', + 'path_string' => '/1/2/77/82/85/', + 'priority' => '0', + 'remote_id' => '4e526426523e47aeacf353541284cbf8', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 43 => + array ( + 'contentobject_id' => '84', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '86', + 'modified_subnode' => '1311154182', + 'node_id' => '86', + 'parent_node_id' => '2', + 'path_identification_string' => 'training', + 'path_string' => '/1/2/86/', + 'priority' => '0', + 'remote_id' => '95f3c4261719ea27ab67f980fbee0694', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 44 => + array ( + 'contentobject_id' => '85', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '87', + 'modified_subnode' => '1311154180', + 'node_id' => '87', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/certification', + 'path_string' => '/1/2/86/87/', + 'priority' => '0', + 'remote_id' => '4a1391d3563d056c9d9ea2653093ae3e', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 45 => + array ( + 'contentobject_id' => '86', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '88', + 'modified_subnode' => '1311154181', + 'node_id' => '88', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/professional_workshops', + 'path_string' => '/1/2/86/88/', + 'priority' => '0', + 'remote_id' => '8889727909b5f34b6aa23f7eee32606b', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 46 => + array ( + 'contentobject_id' => '87', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '89', + 'modified_subnode' => '1311154180', + 'node_id' => '89', + 'parent_node_id' => '88', + 'path_identification_string' => 'training/professional_workshops/etiam_sodales_mauris', + 'path_string' => '/1/2/86/88/89/', + 'priority' => '0', + 'remote_id' => '1721dbee55639fe280f6a54195f9577c', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 47 => + array ( + 'contentobject_id' => '88', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '90', + 'modified_subnode' => '1311154181', + 'node_id' => '90', + 'parent_node_id' => '88', + 'path_identification_string' => 'training/professional_workshops/class_aptent_taciti', + 'path_string' => '/1/2/86/88/90/', + 'priority' => '0', + 'remote_id' => '7fabb9ee5bcb6630a3947d1c5585d995', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 48 => + array ( + 'contentobject_id' => '89', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '91', + 'modified_subnode' => '1311154181', + 'node_id' => '91', + 'parent_node_id' => '88', + 'path_identification_string' => 'training/professional_workshops/duis_auctor_vehicula_erat', + 'path_string' => '/1/2/86/88/91/', + 'priority' => '0', + 'remote_id' => 'a95ae3e4a64f08eb2002b31680fe8989', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 49 => + array ( + 'contentobject_id' => '90', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '92', + 'modified_subnode' => '1311154181', + 'node_id' => '92', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/events_and_seminars', + 'path_string' => '/1/2/86/92/', + 'priority' => '0', + 'remote_id' => '2acc8bb8f7eda4de2cf74f6dc277661f', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 50 => + array ( + 'contentobject_id' => '91', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '93', + 'modified_subnode' => '1311154181', + 'node_id' => '93', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/self_paced_courses', + 'path_string' => '/1/2/86/93/', + 'priority' => '0', + 'remote_id' => '6d8cc9831b86d79b8c184507f8e0cbb6', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 51 => + array ( + 'contentobject_id' => '92', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '94', + 'modified_subnode' => '1311154182', + 'node_id' => '94', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/instructor_led_courses', + 'path_string' => '/1/2/86/94/', + 'priority' => '0', + 'remote_id' => '30f12ecd29608eceb20bb903ddb780c7', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 52 => + array ( + 'contentobject_id' => '93', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '95', + 'modified_subnode' => '1311154182', + 'node_id' => '95', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/additional_learning_resources', + 'path_string' => '/1/2/86/95/', + 'priority' => '0', + 'remote_id' => '341e63bdce0f1601519d1b8e82e62766', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 53 => + array ( + 'contentobject_id' => '94', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '96', + 'modified_subnode' => '1311154185', + 'node_id' => '96', + 'parent_node_id' => '2', + 'path_identification_string' => 'support', + 'path_string' => '/1/2/96/', + 'priority' => '0', + 'remote_id' => '0d55a3f510cc7cd9a7b8eb838f50ff5c', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 54 => + array ( + 'contentobject_id' => '95', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '97', + 'modified_subnode' => '1311154183', + 'node_id' => '97', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/knowledgebase', + 'path_string' => '/1/2/96/97/', + 'priority' => '0', + 'remote_id' => '89ce8eed8fa06c4105fd612aa83d87d6', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 55 => + array ( + 'contentobject_id' => '96', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '98', + 'modified_subnode' => '1311154183', + 'node_id' => '98', + 'parent_node_id' => '97', + 'path_identification_string' => 'support/knowledgebase/sed_suscipit', + 'path_string' => '/1/2/96/97/98/', + 'priority' => '0', + 'remote_id' => '78f3b9a9268c7b0206bf1c4d39211495', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 56 => + array ( + 'contentobject_id' => '97', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '99', + 'modified_subnode' => '1311154183', + 'node_id' => '99', + 'parent_node_id' => '98', + 'path_identification_string' => 'support/knowledgebase/sed_suscipit/ut_interdum', + 'path_string' => '/1/2/96/97/98/99/', + 'priority' => '0', + 'remote_id' => 'a1f9b32547e58064e645388512c16a39', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 57 => + array ( + 'contentobject_id' => '98', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '100', + 'modified_subnode' => '1311154184', + 'node_id' => '100', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/documentation', + 'path_string' => '/1/2/96/100/', + 'priority' => '0', + 'remote_id' => '0f9c7380f8af1f29f1017e412bdd4016', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 58 => + array ( + 'contentobject_id' => '99', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '101', + 'modified_subnode' => '1311154184', + 'node_id' => '101', + 'parent_node_id' => '100', + 'path_identification_string' => 'support/documentation/mauris_pretium', + 'path_string' => '/1/2/96/100/101/', + 'priority' => '0', + 'remote_id' => '036394ec8b160f0782bec2dda452d798', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 59 => + array ( + 'contentobject_id' => '100', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '102', + 'modified_subnode' => '1311154184', + 'node_id' => '102', + 'parent_node_id' => '101', + 'path_identification_string' => 'support/documentation/mauris_pretium/aliquam_posuere', + 'path_string' => '/1/2/96/100/101/102/', + 'priority' => '0', + 'remote_id' => '78da6a4fae1c2eaabe1dbe7af818d970', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 60 => + array ( + 'contentobject_id' => '101', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '103', + 'modified_subnode' => '1311154184', + 'node_id' => '103', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/books', + 'path_string' => '/1/2/96/103/', + 'priority' => '0', + 'remote_id' => '06cdeb27be466ea8330de5df16144263', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 61 => + array ( + 'contentobject_id' => '102', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '104', + 'modified_subnode' => '1311154184', + 'node_id' => '104', + 'parent_node_id' => '103', + 'path_identification_string' => 'support/books/aliquam_pulvinar_suscipit_tellus', + 'path_string' => '/1/2/96/103/104/', + 'priority' => '0', + 'remote_id' => 'ab30399896b8e54442c3a619ba7eeecb', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 62 => + array ( + 'contentobject_id' => '103', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '105', + 'modified_subnode' => '1311154184', + 'node_id' => '105', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/customer_service', + 'path_string' => '/1/2/96/105/', + 'priority' => '0', + 'remote_id' => 'ca2ae9d0f0322798f632e896325f22c3', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 63 => + array ( + 'contentobject_id' => '104', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '106', + 'modified_subnode' => '1311154185', + 'node_id' => '106', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/support_programs', + 'path_string' => '/1/2/96/106/', + 'priority' => '0', + 'remote_id' => '7ba1d48c0151bae62366095ef6f64c28', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 64 => + array ( + 'contentobject_id' => '105', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '107', + 'modified_subnode' => '1311154195', + 'node_id' => '107', + 'parent_node_id' => '2', + 'path_identification_string' => 'getting_started', + 'path_string' => '/1/2/107/', + 'priority' => '0', + 'remote_id' => 'e81507d3446726ebd7361352fef5fad3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 65 => + array ( + 'contentobject_id' => '106', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '108', + 'modified_subnode' => '1311154185', + 'node_id' => '108', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/tutorials_for', + 'path_string' => '/1/2/107/108/', + 'priority' => '0', + 'remote_id' => '51278360f39d5b8ce1d9249953f4de98', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 66 => + array ( + 'contentobject_id' => '107', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '109', + 'modified_subnode' => '1311154185', + 'node_id' => '109', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/get_involved', + 'path_string' => '/1/2/107/109/', + 'priority' => '0', + 'remote_id' => '33151e24acea9c837d2b9fc52e03b1de', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 67 => + array ( + 'contentobject_id' => '108', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '110', + 'modified_subnode' => '1311154187', + 'node_id' => '110', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish', + 'path_string' => '/1/2/107/110/', + 'priority' => '0', + 'remote_id' => '6b3bcab0f149c5acc2e3728df7c66b73', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 68 => + array ( + 'contentobject_id' => '109', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '111', + 'modified_subnode' => '1311154186', + 'node_id' => '111', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics1', + 'path_string' => '/1/2/107/110/111/', + 'priority' => '0', + 'remote_id' => '28f9dfe5c0680955eec7a2dec4ebc642', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 69 => + array ( + 'contentobject_id' => '110', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '112', + 'modified_subnode' => '1311154186', + 'node_id' => '112', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics12', + 'path_string' => '/1/2/107/110/112/', + 'priority' => '0', + 'remote_id' => '191faba79dc108a19893944befa50d94', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 70 => + array ( + 'contentobject_id' => '111', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '113', + 'modified_subnode' => '1311154186', + 'node_id' => '113', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics13', + 'path_string' => '/1/2/107/110/113/', + 'priority' => '0', + 'remote_id' => '8679b5fa3ad0ec216293419ab9834e44', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 71 => + array ( + 'contentobject_id' => '112', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '114', + 'modified_subnode' => '1311154187', + 'node_id' => '114', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics14', + 'path_string' => '/1/2/107/110/114/', + 'priority' => '0', + 'remote_id' => '7f32cdefd0cf55b966a44aa52181e30d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 72 => + array ( + 'contentobject_id' => '113', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '115', + 'modified_subnode' => '1311154187', + 'node_id' => '115', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics15', + 'path_string' => '/1/2/107/110/115/', + 'priority' => '0', + 'remote_id' => '29db3c1fcdb497e5cb2c74eb85c0906a', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 73 => + array ( + 'contentobject_id' => '114', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '116', + 'modified_subnode' => '1311154187', + 'node_id' => '116', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics16', + 'path_string' => '/1/2/107/110/116/', + 'priority' => '0', + 'remote_id' => '96e30009f712a0315217fed93eba6a18', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 74 => + array ( + 'contentobject_id' => '115', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '117', + 'modified_subnode' => '1311154187', + 'node_id' => '117', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics17', + 'path_string' => '/1/2/107/110/117/', + 'priority' => '0', + 'remote_id' => '3a6b87470a25b19a6ad15caa5e24e719', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 75 => + array ( + 'contentobject_id' => '116', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '118', + 'modified_subnode' => '1311154187', + 'node_id' => '118', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics18', + 'path_string' => '/1/2/107/110/118/', + 'priority' => '0', + 'remote_id' => 'd0bc77a21920b63543d7b0accab81b24', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 76 => + array ( + 'contentobject_id' => '117', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '119', + 'modified_subnode' => '1311154187', + 'node_id' => '119', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics19', + 'path_string' => '/1/2/107/110/119/', + 'priority' => '0', + 'remote_id' => 'c75b4b4b870e0e3611e19e1323103282', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 77 => + array ( + 'contentobject_id' => '118', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '120', + 'modified_subnode' => '1311154189', + 'node_id' => '120', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish', + 'path_string' => '/1/2/107/120/', + 'priority' => '0', + 'remote_id' => '262d8c936d3757ff81e7bb49392b703f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 78 => + array ( + 'contentobject_id' => '119', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '121', + 'modified_subnode' => '1311154188', + 'node_id' => '121', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics1', + 'path_string' => '/1/2/107/120/121/', + 'priority' => '0', + 'remote_id' => '220d4e10bf4619525c3165823079482c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 79 => + array ( + 'contentobject_id' => '120', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '122', + 'modified_subnode' => '1311154188', + 'node_id' => '122', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics12', + 'path_string' => '/1/2/107/120/122/', + 'priority' => '0', + 'remote_id' => 'f13a938ce2c79a9d438548299220d6dd', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 80 => + array ( + 'contentobject_id' => '121', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '123', + 'modified_subnode' => '1311154188', + 'node_id' => '123', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics13', + 'path_string' => '/1/2/107/120/123/', + 'priority' => '0', + 'remote_id' => '04f5e08293954b1851a4dd1cbd976cff', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 81 => + array ( + 'contentobject_id' => '122', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '124', + 'modified_subnode' => '1311154188', + 'node_id' => '124', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics14', + 'path_string' => '/1/2/107/120/124/', + 'priority' => '0', + 'remote_id' => 'dc80ae3d9de55855a16218b032062c62', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 82 => + array ( + 'contentobject_id' => '123', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '125', + 'modified_subnode' => '1311154189', + 'node_id' => '125', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics15', + 'path_string' => '/1/2/107/120/125/', + 'priority' => '0', + 'remote_id' => '4cb6d4015dd80474074043ab28f96e36', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 83 => + array ( + 'contentobject_id' => '124', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '126', + 'modified_subnode' => '1311154189', + 'node_id' => '126', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics16', + 'path_string' => '/1/2/107/120/126/', + 'priority' => '0', + 'remote_id' => '74ce7d6cbae81d90592b4a8a242a284a', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 84 => + array ( + 'contentobject_id' => '125', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '127', + 'modified_subnode' => '1311154189', + 'node_id' => '127', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics17', + 'path_string' => '/1/2/107/120/127/', + 'priority' => '0', + 'remote_id' => '6f76d2f7e5812acf4f7c5c70258f4f7e', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 85 => + array ( + 'contentobject_id' => '126', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '128', + 'modified_subnode' => '1311154189', + 'node_id' => '128', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics18', + 'path_string' => '/1/2/107/120/128/', + 'priority' => '0', + 'remote_id' => '5ba07103968a6bb3f05c275c212440f6', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 86 => + array ( + 'contentobject_id' => '127', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '129', + 'modified_subnode' => '1311154190', + 'node_id' => '129', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish', + 'path_string' => '/1/2/107/129/', + 'priority' => '0', + 'remote_id' => '3579b6c5cd166d5137eada55274892d3', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 87 => + array ( + 'contentobject_id' => '128', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '130', + 'modified_subnode' => '1311154190', + 'node_id' => '130', + 'parent_node_id' => '129', + 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish/graphics1', + 'path_string' => '/1/2/107/129/130/', + 'priority' => '0', + 'remote_id' => 'e38a43ce35832e5af2df4f1e9272b926', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 88 => + array ( + 'contentobject_id' => '129', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '131', + 'modified_subnode' => '1311154190', + 'node_id' => '131', + 'parent_node_id' => '129', + 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish/graphics12', + 'path_string' => '/1/2/107/129/131/', + 'priority' => '0', + 'remote_id' => '1ba7889f63e32acf70f66349ce1a8953', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 89 => + array ( + 'contentobject_id' => '130', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '132', + 'modified_subnode' => '1311154190', + 'node_id' => '132', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/adding_siteaccesses_in_ez_publish', + 'path_string' => '/1/2/107/132/', + 'priority' => '0', + 'remote_id' => '19ae9fcb7334a0e407b2781920247122', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 90 => + array ( + 'contentobject_id' => '131', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '133', + 'modified_subnode' => '1311154195', + 'node_id' => '133', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/new_features', + 'path_string' => '/1/2/107/133/', + 'priority' => '0', + 'remote_id' => '423b6d20325263abaa2012536cc736a4', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 91 => + array ( + 'contentobject_id' => '132', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '134', + 'modified_subnode' => '1311154191', + 'node_id' => '134', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow', + 'path_string' => '/1/2/107/133/134/', + 'priority' => '0', + 'remote_id' => '07f0de334c83d631a59defe61f1a7cbf', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 92 => + array ( + 'contentobject_id' => '133', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '135', + 'modified_subnode' => '1311154191', + 'node_id' => '135', + 'parent_node_id' => '134', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics1', + 'path_string' => '/1/2/107/133/134/135/', + 'priority' => '0', + 'remote_id' => 'a7ca1a8878210a9978df0b00e9184b20', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 93 => + array ( + 'contentobject_id' => '134', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '136', + 'modified_subnode' => '1311154191', + 'node_id' => '136', + 'parent_node_id' => '134', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics12', + 'path_string' => '/1/2/107/133/134/136/', + 'priority' => '0', + 'remote_id' => '12c86be2151c426b990d47efd023cc40', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 94 => + array ( + 'contentobject_id' => '135', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '137', + 'modified_subnode' => '1311154191', + 'node_id' => '137', + 'parent_node_id' => '134', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics13', + 'path_string' => '/1/2/107/133/134/137/', + 'priority' => '0', + 'remote_id' => 'ff4473534c7cef8212a11feab57a5f0e', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 95 => + array ( + 'contentobject_id' => '136', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '138', + 'modified_subnode' => '1311154192', + 'node_id' => '138', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/improved_block_editing', + 'path_string' => '/1/2/107/133/138/', + 'priority' => '0', + 'remote_id' => 'e0a1b1b2a3d248bf8d43a83581c22ae8', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 96 => + array ( + 'contentobject_id' => '137', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '139', + 'modified_subnode' => '1311154192', + 'node_id' => '139', + 'parent_node_id' => '138', + 'path_identification_string' => 'getting_started/new_features/improved_block_editing/graphics1', + 'path_string' => '/1/2/107/133/138/139/', + 'priority' => '0', + 'remote_id' => '8e6f0ba5195410b03a84ef3fdcc3ff0b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 97 => + array ( + 'contentobject_id' => '138', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '140', + 'modified_subnode' => '1311154192', + 'node_id' => '140', + 'parent_node_id' => '138', + 'path_identification_string' => 'getting_started/new_features/improved_block_editing/graphics12', + 'path_string' => '/1/2/107/133/138/140/', + 'priority' => '0', + 'remote_id' => 'bc416b97e1592c7a396f6f5f85e131ac', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 98 => + array ( + 'contentobject_id' => '139', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '141', + 'modified_subnode' => '1311154193', + 'node_id' => '141', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing', + 'path_string' => '/1/2/107/133/141/', + 'priority' => '0', + 'remote_id' => 'facfd2587054ea863cbe53768da04a47', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 99 => + array ( + 'contentobject_id' => '140', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '142', + 'modified_subnode' => '1311154192', + 'node_id' => '142', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics1', + 'path_string' => '/1/2/107/133/141/142/', + 'priority' => '0', + 'remote_id' => 'd159e8d4d590e481b06ecb441c0f14dc', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 100 => + array ( + 'contentobject_id' => '141', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '143', + 'modified_subnode' => '1311154192', + 'node_id' => '143', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics12', + 'path_string' => '/1/2/107/133/141/143/', + 'priority' => '0', + 'remote_id' => '7457db5919dd349bd878b60592fc009b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 101 => + array ( + 'contentobject_id' => '142', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '144', + 'modified_subnode' => '1311154193', + 'node_id' => '144', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics13', + 'path_string' => '/1/2/107/133/141/144/', + 'priority' => '0', + 'remote_id' => 'ebe1e9d1242a3aeedfda25da7cc25564', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 102 => + array ( + 'contentobject_id' => '143', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '145', + 'modified_subnode' => '1311154193', + 'node_id' => '145', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics14', + 'path_string' => '/1/2/107/133/141/145/', + 'priority' => '0', + 'remote_id' => 'b3acf4c0f2df8977f1c6932725339a1d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 103 => + array ( + 'contentobject_id' => '144', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '146', + 'modified_subnode' => '1311154193', + 'node_id' => '146', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/fastcgi', + 'path_string' => '/1/2/107/133/146/', + 'priority' => '0', + 'remote_id' => 'a324a48fea49eb3e6826b3295dc5f413', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 104 => + array ( + 'contentobject_id' => '145', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '147', + 'modified_subnode' => '1311154194', + 'node_id' => '147', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/support_for_red_hat_enterprise', + 'path_string' => '/1/2/107/133/147/', + 'priority' => '0', + 'remote_id' => '8c0133434d7bea077a614e1a85fca5b7', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 105 => + array ( + 'contentobject_id' => '146', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '148', + 'modified_subnode' => '1311154194', + 'node_id' => '148', + 'parent_node_id' => '147', + 'path_identification_string' => 'getting_started/new_features/support_for_red_hat_enterprise/graphics1', + 'path_string' => '/1/2/107/133/147/148/', + 'priority' => '0', + 'remote_id' => '46653e0e5fa60ab86788cad8084a759d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 106 => + array ( + 'contentobject_id' => '147', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '149', + 'modified_subnode' => '1311154194', + 'node_id' => '149', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/canonical_links', + 'path_string' => '/1/2/107/133/149/', + 'priority' => '0', + 'remote_id' => '9b17e8d0b2cee501b75f7b481155e64f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 107 => + array ( + 'contentobject_id' => '148', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '150', + 'modified_subnode' => '1311154195', + 'node_id' => '150', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/asynchronous_publishing', + 'path_string' => '/1/2/107/133/150/', + 'priority' => '0', + 'remote_id' => '3983d3aa7604f45a8ecbb953a98d646f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 108 => + array ( + 'contentobject_id' => '149', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '151', + 'modified_subnode' => '1311154195', + 'node_id' => '151', + 'parent_node_id' => '150', + 'path_identification_string' => 'getting_started/new_features/asynchronous_publishing/graphics1', + 'path_string' => '/1/2/107/133/150/151/', + 'priority' => '0', + 'remote_id' => '92756622f207c0b1902ca156947a77de', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 109 => + array ( + 'contentobject_id' => '150', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '152', + 'modified_subnode' => '1311154195', + 'node_id' => '152', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/rest_api_interface', + 'path_string' => '/1/2/107/133/152/', + 'priority' => '0', + 'remote_id' => '60adbb1e37a6524246d3af372366754f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 110 => + array ( + 'contentobject_id' => '151', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '153', + 'modified_subnode' => '1311154196', + 'node_id' => '153', + 'parent_node_id' => '2', + 'path_identification_string' => 'ez_publish_enterprise', + 'path_string' => '/1/2/153/', + 'priority' => '0', + 'remote_id' => 'f4bf2e6c1cf75e15b15f0123a82778a1', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 111 => + array ( + 'contentobject_id' => '152', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '154', + 'modified_subnode' => '1311154196', + 'node_id' => '154', + 'parent_node_id' => '153', + 'path_identification_string' => 'ez_publish_enterprise/graphics1', + 'path_string' => '/1/2/153/154/', + 'priority' => '0', + 'remote_id' => '1b95356b68bd59ef32b0fd7bb2c29130', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 112 => + array ( + 'contentobject_id' => '153', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '155', + 'modified_subnode' => '1311154196', + 'node_id' => '155', + 'parent_node_id' => '153', + 'path_identification_string' => 'ez_publish_enterprise/graphics12', + 'path_string' => '/1/2/153/155/', + 'priority' => '0', + 'remote_id' => '94b7059eb5e0fe667f7c63eadd53a62b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 113 => + array ( + 'contentobject_id' => '154', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '156', + 'modified_subnode' => '1311154199', + 'node_id' => '156', + 'parent_node_id' => '2', + 'path_identification_string' => 'partners', + 'path_string' => '/1/2/156/', + 'priority' => '3', + 'remote_id' => '0c523dfd6b1eccbfb0d1bfe632ee7411', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 114 => + array ( + 'contentobject_id' => '155', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '157', + 'modified_subnode' => '1311154197', + 'node_id' => '157', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/partner_news', + 'path_string' => '/1/2/156/157/', + 'priority' => '0', + 'remote_id' => 'f5db8acf1150afc15eb514d380e3855d', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 115 => + array ( + 'contentobject_id' => '156', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '158', + 'modified_subnode' => '1311154197', + 'node_id' => '158', + 'parent_node_id' => '157', + 'path_identification_string' => 'partners/partner_news/pellentesque_quam_mauris', + 'path_string' => '/1/2/156/157/158/', + 'priority' => '0', + 'remote_id' => '6366a99ac1cec2133e87fdd805d108c8', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 116 => + array ( + 'contentobject_id' => '157', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '159', + 'modified_subnode' => '1311154197', + 'node_id' => '159', + 'parent_node_id' => '157', + 'path_identification_string' => 'partners/partner_news/penatibus_et_magnis_dis', + 'path_string' => '/1/2/156/157/159/', + 'priority' => '0', + 'remote_id' => '7ee406cb6e5f0b2a29bc9f97f5a5b9db', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 117 => + array ( + 'contentobject_id' => '158', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '160', + 'modified_subnode' => '1311154198', + 'node_id' => '160', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/news', + 'path_string' => '/1/2/156/160/', + 'priority' => '0', + 'remote_id' => '007109e7f353c86dfd48d844cb18ce73', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 118 => + array ( + 'contentobject_id' => '159', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '161', + 'modified_subnode' => '1311154198', + 'node_id' => '161', + 'parent_node_id' => '160', + 'path_identification_string' => 'partners/news/curabitur_hendrerit_dignissim', + 'path_string' => '/1/2/156/160/161/', + 'priority' => '0', + 'remote_id' => '63769c39380a45a731aa44068c0f4e33', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 119 => + array ( + 'contentobject_id' => '160', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '162', + 'modified_subnode' => '1311154198', + 'node_id' => '162', + 'parent_node_id' => '160', + 'path_identification_string' => 'partners/news/proin_condimentum_risus', + 'path_string' => '/1/2/156/160/162/', + 'priority' => '0', + 'remote_id' => 'f761918d15e356e50ce94294cad79765', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 120 => + array ( + 'contentobject_id' => '161', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '163', + 'modified_subnode' => '1311154198', + 'node_id' => '163', + 'parent_node_id' => '160', + 'path_identification_string' => 'partners/news/morbi_tristique_senectus', + 'path_string' => '/1/2/156/160/163/', + 'priority' => '0', + 'remote_id' => '68187b44ef9051a4db10bd9bb7f228a4', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 121 => + array ( + 'contentobject_id' => '162', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '164', + 'modified_subnode' => '1311154198', + 'node_id' => '164', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/partner_products', + 'path_string' => '/1/2/156/164/', + 'priority' => '0', + 'remote_id' => '472e9bc321148baa71d2070063f24bb9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 122 => + array ( + 'contentobject_id' => '163', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '165', + 'modified_subnode' => '1311154199', + 'node_id' => '165', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/partners', + 'path_string' => '/1/2/156/165/', + 'priority' => '0', + 'remote_id' => 'b1a68df10cdf379cf78999c8012db679', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 123 => + array ( + 'contentobject_id' => '164', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '166', + 'modified_subnode' => '1311154199', + 'node_id' => '166', + 'parent_node_id' => '165', + 'path_identification_string' => 'partners/partners/neque_orci_malesuada_felis', + 'path_string' => '/1/2/156/165/166/', + 'priority' => '0', + 'remote_id' => 'e9ee6724fffb012f918300de66af27e1', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 124 => + array ( + 'contentobject_id' => '165', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '167', + 'modified_subnode' => '1311154204', + 'node_id' => '167', + 'parent_node_id' => '2', + 'path_identification_string' => 'community', + 'path_string' => '/1/2/167/', + 'priority' => '4', + 'remote_id' => 'c4604fb2e100a6681a4f53fbe6e5eeae', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 125 => + array ( + 'contentobject_id' => '166', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '168', + 'modified_subnode' => '1311154200', + 'node_id' => '168', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/forum', + 'path_string' => '/1/2/167/168/', + 'priority' => '0', + 'remote_id' => '5e6762a083ab4c0357bad163902ba8f7', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 126 => + array ( + 'contentobject_id' => '167', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '169', + 'modified_subnode' => '1311154200', + 'node_id' => '169', + 'parent_node_id' => '168', + 'path_identification_string' => 'community/forum/nulla_vitae_tellus_sit_amet', + 'path_string' => '/1/2/167/168/169/', + 'priority' => '0', + 'remote_id' => '2549eee03064d55ae7fc84fe41ae1ef6', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 127 => + array ( + 'contentobject_id' => '168', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '170', + 'modified_subnode' => '1311154200', + 'node_id' => '170', + 'parent_node_id' => '168', + 'path_identification_string' => 'community/forum/ut_mollis_sodales_nibh', + 'path_string' => '/1/2/167/168/170/', + 'priority' => '0', + 'remote_id' => '7bfca4bdde619ac9104e235629e2dbc7', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 128 => + array ( + 'contentobject_id' => '169', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '171', + 'modified_subnode' => '1311154200', + 'node_id' => '171', + 'parent_node_id' => '168', + 'path_identification_string' => 'community/forum/nam_risus_leo', + 'path_string' => '/1/2/167/168/171/', + 'priority' => '0', + 'remote_id' => '81fd930afe94962395074b762592a356', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 129 => + array ( + 'contentobject_id' => '170', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '172', + 'modified_subnode' => '1311154201', + 'node_id' => '172', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/wiki', + 'path_string' => '/1/2/167/172/', + 'priority' => '0', + 'remote_id' => '8b570ac03318b7e29eb5fd1bae15efde', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 130 => + array ( + 'contentobject_id' => '171', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '173', + 'modified_subnode' => '1311154201', + 'node_id' => '173', + 'parent_node_id' => '172', + 'path_identification_string' => 'community/wiki/sed_suscipit', + 'path_string' => '/1/2/167/172/173/', + 'priority' => '0', + 'remote_id' => '4329dcc6a8d441aa7253660512dfd5b6', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 131 => + array ( + 'contentobject_id' => '172', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '174', + 'modified_subnode' => '1311154201', + 'node_id' => '174', + 'parent_node_id' => '173', + 'path_identification_string' => 'community/wiki/sed_suscipit/ut_interdum', + 'path_string' => '/1/2/167/172/173/174/', + 'priority' => '0', + 'remote_id' => '6cf7b9370a0d9800ed49ba3be13b6be5', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 132 => + array ( + 'contentobject_id' => '173', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '175', + 'modified_subnode' => '1311154201', + 'node_id' => '175', + 'parent_node_id' => '173', + 'path_identification_string' => 'community/wiki/sed_suscipit/fusce_pulvinar', + 'path_string' => '/1/2/167/172/173/175/', + 'priority' => '0', + 'remote_id' => 'f71191fcce35c83530cddde467a908b2', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 133 => + array ( + 'contentobject_id' => '174', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '176', + 'modified_subnode' => '1311154201', + 'node_id' => '176', + 'parent_node_id' => '172', + 'path_identification_string' => 'community/wiki/duis_id_tortor', + 'path_string' => '/1/2/167/172/176/', + 'priority' => '0', + 'remote_id' => '2d3cf4fe8d439e16e0ed75ef947b5e3d', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 134 => + array ( + 'contentobject_id' => '175', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '177', + 'modified_subnode' => '1311154201', + 'node_id' => '177', + 'parent_node_id' => '176', + 'path_identification_string' => 'community/wiki/duis_id_tortor/curabitur_lacinia', + 'path_string' => '/1/2/167/172/176/177/', + 'priority' => '0', + 'remote_id' => '49c9ad954328ab5f5a76d580873961a4', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 135 => + array ( + 'contentobject_id' => '176', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '178', + 'modified_subnode' => '1311154203', + 'node_id' => '178', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/pictures', + 'path_string' => '/1/2/167/178/', + 'priority' => '0', + 'remote_id' => 'ae32173cedf3a5ec441e3afcadc4abcb', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 136 => + array ( + 'contentobject_id' => '177', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '179', + 'modified_subnode' => '1311154202', + 'node_id' => '179', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/ivo_on_ez_tags', + 'path_string' => '/1/2/167/178/179/', + 'priority' => '0', + 'remote_id' => 'c6c32c884db955ea09338c90eee84746', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 137 => + array ( + 'contentobject_id' => '178', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '180', + 'modified_subnode' => '1311154202', + 'node_id' => '180', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/are_you_ready_for_the_community_day', + 'path_string' => '/1/2/167/178/180/', + 'priority' => '0', + 'remote_id' => 'db191e87b9b6ac22a18742cd32d2b3d4', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 138 => + array ( + 'contentobject_id' => '179', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '181', + 'modified_subnode' => '1311154202', + 'node_id' => '181', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/let_s_work_together', + 'path_string' => '/1/2/167/178/181/', + 'priority' => '0', + 'remote_id' => '02a6d1506bf437eda1317d0c36a8545b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 139 => + array ( + 'contentobject_id' => '180', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '182', + 'modified_subnode' => '1311154203', + 'node_id' => '182', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/the_mediterranean_seen_from_nice', + 'path_string' => '/1/2/167/178/182/', + 'priority' => '0', + 'remote_id' => '40d743025e4ec4d813bd864dad08e0cc', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 140 => + array ( + 'contentobject_id' => '181', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '183', + 'modified_subnode' => '1311154203', + 'node_id' => '183', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/hotel_lobby_at_isola2000', + 'path_string' => '/1/2/167/178/183/', + 'priority' => '0', + 'remote_id' => 'eb2a8ef7d4b1fb8ffb68f0764b615de1', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 141 => + array ( + 'contentobject_id' => '182', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '184', + 'modified_subnode' => '1311154203', + 'node_id' => '184', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/alexander_on_the_past_gaby_on_today_and_tomorrow', + 'path_string' => '/1/2/167/178/184/', + 'priority' => '0', + 'remote_id' => '9e45f3ee0f15995b670fb3a117b6ee49', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 142 => + array ( + 'contentobject_id' => '183', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '185', + 'modified_subnode' => '1311154203', + 'node_id' => '185', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/isola2000_in_white_beautiful_skiing', + 'path_string' => '/1/2/167/178/185/', + 'priority' => '0', + 'remote_id' => 'f368c4ae469c596344e15fca8c7370c2', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 143 => + array ( + 'contentobject_id' => '184', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '186', + 'modified_subnode' => '1311154203', + 'node_id' => '186', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/ceo_future_pitch_adaptable_open_reliable', + 'path_string' => '/1/2/167/178/186/', + 'priority' => '0', + 'remote_id' => '7e153b75dd0ee0476ac7463d4a3daaef', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 144 => + array ( + 'contentobject_id' => '185', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '187', + 'modified_subnode' => '1311154204', + 'node_id' => '187', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/blog', + 'path_string' => '/1/2/167/187/', + 'priority' => '0', + 'remote_id' => '09fb4147e4b124b9770a527bdd66799c', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 145 => + array ( + 'contentobject_id' => '186', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '188', + 'modified_subnode' => '1311154204', + 'node_id' => '188', + 'parent_node_id' => '187', + 'path_identification_string' => 'community/blog/visit_paris', + 'path_string' => '/1/2/167/187/188/', + 'priority' => '0', + 'remote_id' => '8f73d6d4ffca33c619d2f2645340ccc0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 146 => + array ( + 'contentobject_id' => '187', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '189', + 'modified_subnode' => '1311154204', + 'node_id' => '189', + 'parent_node_id' => '187', + 'path_identification_string' => 'community/blog/paris_in_france', + 'path_string' => '/1/2/167/187/189/', + 'priority' => '0', + 'remote_id' => '5cdc175d45aeb3fa054a95f40df56e79', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 147 => + array ( + 'contentobject_id' => '188', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '190', + 'modified_subnode' => '1311154212', + 'node_id' => '190', + 'parent_node_id' => '2', + 'path_identification_string' => 'company', + 'path_string' => '/1/2/190/', + 'priority' => '6', + 'remote_id' => 'e060ff40aa17eb21dc1e4595c9a5eb9a', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 148 => + array ( + 'contentobject_id' => '189', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '191', + 'modified_subnode' => '1311154204', + 'node_id' => '191', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/about_company', + 'path_string' => '/1/2/190/191/', + 'priority' => '0', + 'remote_id' => '7bf290af79b3b51e6ccc1f95f321618c', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 149 => + array ( + 'contentobject_id' => '190', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '192', + 'modified_subnode' => '1311154212', + 'node_id' => '192', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/new_features', + 'path_string' => '/1/2/190/192/', + 'priority' => '0', + 'remote_id' => '9f804eee139dcee343dbe4175d14654c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 150 => + array ( + 'contentobject_id' => '191', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '193', + 'modified_subnode' => '1311154205', + 'node_id' => '193', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/separate_content_design_in_ez_publish', + 'path_string' => '/1/2/190/192/193/', + 'priority' => '0', + 'remote_id' => '10d57795c986ca61689e6c2c11382eb3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 151 => + array ( + 'contentobject_id' => '192', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '194', + 'modified_subnode' => '1311154205', + 'node_id' => '194', + 'parent_node_id' => '193', + 'path_identification_string' => 'company/new_features/separate_content_design_in_ez_publish/separation_of_content_and_design', + 'path_string' => '/1/2/190/192/193/194/', + 'priority' => '0', + 'remote_id' => '87417129b080d24d335eb2653dd1a40c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 152 => + array ( + 'contentobject_id' => '193', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '195', + 'modified_subnode' => '1311154207', + 'node_id' => '195', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish', + 'path_string' => '/1/2/190/192/195/', + 'priority' => '0', + 'remote_id' => 'fd56d839df6e2b52055d4a62f4df7c3e', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 153 => + array ( + 'contentobject_id' => '194', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '196', + 'modified_subnode' => '1311154206', + 'node_id' => '196', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/openoffice_import_large', + 'path_string' => '/1/2/190/192/195/196/', + 'priority' => '0', + 'remote_id' => 'ab2f2093f16c56ac2e61f40f25d2dbe0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 154 => + array ( + 'contentobject_id' => '195', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '197', + 'modified_subnode' => '1311154206', + 'node_id' => '197', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/translation_large', + 'path_string' => '/1/2/190/192/195/197/', + 'priority' => '0', + 'remote_id' => '185a1737e9012e7c3025df876bbb4f9b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 155 => + array ( + 'contentobject_id' => '196', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '198', + 'modified_subnode' => '1311154206', + 'node_id' => '198', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/multiupload_large', + 'path_string' => '/1/2/190/192/195/198/', + 'priority' => '0', + 'remote_id' => 'efdca2f6ddd2c8befc283ae3465b9acd', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 156 => + array ( + 'contentobject_id' => '197', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '199', + 'modified_subnode' => '1311154207', + 'node_id' => '199', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/gallery_large', + 'path_string' => '/1/2/190/192/195/199/', + 'priority' => '0', + 'remote_id' => 'f81b0e4c31ea13d94b9838e9e7e7ad7e', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 157 => + array ( + 'contentobject_id' => '198', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '200', + 'modified_subnode' => '1311154207', + 'node_id' => '200', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/search_result_large', + 'path_string' => '/1/2/190/192/195/200/', + 'priority' => '0', + 'remote_id' => '666efc49c267cddf55ca707408f4ac42', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 158 => + array ( + 'contentobject_id' => '199', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '201', + 'modified_subnode' => '1311154207', + 'node_id' => '201', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/ez_tool_bar_large', + 'path_string' => '/1/2/190/192/195/201/', + 'priority' => '0', + 'remote_id' => 'afb51a5f898c549c9e1f35afc75d66f3', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 159 => + array ( + 'contentobject_id' => '200', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '202', + 'modified_subnode' => '1311154207', + 'node_id' => '202', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/quicktime_large', + 'path_string' => '/1/2/190/192/195/202/', + 'priority' => '0', + 'remote_id' => '94b71866ede0d2776c140e85a823d31d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 160 => + array ( + 'contentobject_id' => '201', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '203', + 'modified_subnode' => '1311154207', + 'node_id' => '203', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/web_2_0_large', + 'path_string' => '/1/2/190/192/195/203/', + 'priority' => '0', + 'remote_id' => 'e74475a240fb7061b40c75f5e6fcd52c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 161 => + array ( + 'contentobject_id' => '202', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '204', + 'modified_subnode' => '1311154210', + 'node_id' => '204', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish', + 'path_string' => '/1/2/190/192/204/', + 'priority' => '0', + 'remote_id' => '42a3b07037390457ad0f2c65494bfd97', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 162 => + array ( + 'contentobject_id' => '203', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '205', + 'modified_subnode' => '1311154208', + 'node_id' => '205', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/usermanagement_large', + 'path_string' => '/1/2/190/192/204/205/', + 'priority' => '0', + 'remote_id' => '6da1a82ba3d962d2ad953fff8ee26362', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 163 => + array ( + 'contentobject_id' => '204', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '206', + 'modified_subnode' => '1311154208', + 'node_id' => '206', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/workflow_large', + 'path_string' => '/1/2/190/192/204/206/', + 'priority' => '0', + 'remote_id' => 'b284abd88bdcb1887a86e40304ffc66f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 164 => + array ( + 'contentobject_id' => '205', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '207', + 'modified_subnode' => '1311154209', + 'node_id' => '207', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/versioning_large', + 'path_string' => '/1/2/190/192/204/207/', + 'priority' => '0', + 'remote_id' => 'e3400bb44aae5fcb416156e7450f3f32', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 165 => + array ( + 'contentobject_id' => '206', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '208', + 'modified_subnode' => '1311154209', + 'node_id' => '208', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/datatypes_attributes_content_class_and_objects_large', + 'path_string' => '/1/2/190/192/204/208/', + 'priority' => '0', + 'remote_id' => '2b2b27bbaaec688aaec1a5d39b4b13ae', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 166 => + array ( + 'contentobject_id' => '207', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '209', + 'modified_subnode' => '1311154209', + 'node_id' => '209', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/multiple_location_large', + 'path_string' => '/1/2/190/192/204/209/', + 'priority' => '0', + 'remote_id' => '37e5feed6574d1d8da4b4531569a27a2', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 167 => + array ( + 'contentobject_id' => '208', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '210', + 'modified_subnode' => '1311154209', + 'node_id' => '210', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/multisite_deployment_large', + 'path_string' => '/1/2/190/192/204/210/', + 'priority' => '0', + 'remote_id' => '5625695a66034f53b9b6e14029e06e80', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 168 => + array ( + 'contentobject_id' => '209', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '211', + 'modified_subnode' => '1311154210', + 'node_id' => '211', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/seo_large', + 'path_string' => '/1/2/190/192/204/211/', + 'priority' => '0', + 'remote_id' => '824aba4122ee51d9638847e55642feec', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 169 => + array ( + 'contentobject_id' => '210', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '212', + 'modified_subnode' => '1311154210', + 'node_id' => '212', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/admin_site_large', + 'path_string' => '/1/2/190/192/204/212/', + 'priority' => '0', + 'remote_id' => '73e95051b800ce051c3851c60807787b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 170 => + array ( + 'contentobject_id' => '211', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '213', + 'modified_subnode' => '1311154211', + 'node_id' => '213', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish', + 'path_string' => '/1/2/190/192/213/', + 'priority' => '0', + 'remote_id' => '3f921d3c490a6c17870b1f01fcfbceed', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 171 => + array ( + 'contentobject_id' => '212', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '214', + 'modified_subnode' => '1311154211', + 'node_id' => '214', + 'parent_node_id' => '213', + 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish/datatypes_attributes_content_class_and_objects_large', + 'path_string' => '/1/2/190/192/213/214/', + 'priority' => '0', + 'remote_id' => '97f7b391f1522bf404ff672ac338b91c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 172 => + array ( + 'contentobject_id' => '213', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '215', + 'modified_subnode' => '1311154211', + 'node_id' => '215', + 'parent_node_id' => '213', + 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish/site_style_large', + 'path_string' => '/1/2/190/192/213/215/', + 'priority' => '0', + 'remote_id' => 'c5549bf68962a5384bd2225931cba302', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 173 => + array ( + 'contentobject_id' => '214', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '216', + 'modified_subnode' => '1311154211', + 'node_id' => '216', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/rest_api_interface', + 'path_string' => '/1/2/190/192/216/', + 'priority' => '0', + 'remote_id' => '54adfd9f7c80638f5560eb3f0618c57b', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 174 => + array ( + 'contentobject_id' => '215', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '217', + 'modified_subnode' => '1311154211', + 'node_id' => '217', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/asynchronous_publishing', + 'path_string' => '/1/2/190/192/217/', + 'priority' => '0', + 'remote_id' => 'a7dbafbf963821b71e5522c21e09d9dd', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 175 => + array ( + 'contentobject_id' => '216', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '218', + 'modified_subnode' => '1311154211', + 'node_id' => '218', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/canonical_links', + 'path_string' => '/1/2/190/192/218/', + 'priority' => '0', + 'remote_id' => '61e3b15f020590df0759b779e5f1fb9d', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 176 => + array ( + 'contentobject_id' => '217', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '219', + 'modified_subnode' => '1311154212', + 'node_id' => '219', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/support_for_red_hat_enterprise', + 'path_string' => '/1/2/190/192/219/', + 'priority' => '0', + 'remote_id' => '42560fa30a55ac5ddf1f76a52d44a613', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 177 => + array ( + 'contentobject_id' => '218', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '220', + 'modified_subnode' => '1311154212', + 'node_id' => '220', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/fastcgi', + 'path_string' => '/1/2/190/192/220/', + 'priority' => '0', + 'remote_id' => '416c28c9ba34a9114381a6ec3ae197e0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 178 => + array ( + 'contentobject_id' => '219', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '221', + 'modified_subnode' => '1311154212', + 'node_id' => '221', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/events', + 'path_string' => '/1/2/190/221/', + 'priority' => '0', + 'remote_id' => 'ae6afe955af19209125961b6c0d9a840', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 179 => + array ( + 'contentobject_id' => '220', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '222', + 'modified_subnode' => '1311154212', + 'node_id' => '222', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/career', + 'path_string' => '/1/2/190/222/', + 'priority' => '0', + 'remote_id' => '28b7fd81eaf6b9702c9f8ff8268daac9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 180 => + array ( + 'contentobject_id' => '221', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '223', + 'modified_subnode' => '1311154212', + 'node_id' => '223', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/investors_relation', + 'path_string' => '/1/2/190/223/', + 'priority' => '0', + 'remote_id' => '627c1c5cdf124dc2f92489e686cd04bb', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 181 => + array ( + 'contentobject_id' => '222', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '224', + 'modified_subnode' => '1311154212', + 'node_id' => '224', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/contact', + 'path_string' => '/1/2/190/224/', + 'priority' => '0', + 'remote_id' => 'daa3004ede25b0130ca5bef83c1922c3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 182 => + array ( + 'contentobject_id' => '223', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '225', + 'modified_subnode' => '1311154212', + 'node_id' => '225', + 'parent_node_id' => '224', + 'path_identification_string' => 'company/contact/morbi_neque', + 'path_string' => '/1/2/190/224/225/', + 'priority' => '0', + 'remote_id' => '9d2bdcb8b35464ee03651c191ac4d1ff', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 183 => + array ( + 'contentobject_id' => '224', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '226', + 'modified_subnode' => '1311154212', + 'node_id' => '226', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/company_banner', + 'path_string' => '/1/2/190/226/', + 'priority' => '0', + 'remote_id' => '9ae96e2ecc3a5a79964405273cc8542a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 184 => + array ( + 'contentobject_id' => '225', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '227', + 'modified_subnode' => '1311154215', + 'node_id' => '227', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/partners', + 'path_string' => '/1/5/227/', + 'priority' => '0', + 'remote_id' => '1ee27657f5f41fe6458fcb90e81d5d82', + 'sort_field' => '1', + 'sort_order' => '1', + ), + ), + 'ezcontentobject_version' => + array ( + 0 => + array ( + 'contentobject_id' => '4', + 'created' => '0', + 'creator_id' => '14', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '0', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '1', + ), + 1 => + array ( + 'contentobject_id' => '11', + 'created' => '1033920737', + 'creator_id' => '14', + 'id' => '439', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920746', + 'status' => '3', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 2 => + array ( + 'contentobject_id' => '12', + 'created' => '1033920760', + 'creator_id' => '14', + 'id' => '440', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 3 => + array ( + 'contentobject_id' => '13', + 'created' => '1033920786', + 'creator_id' => '14', + 'id' => '441', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 4 => + array ( + 'contentobject_id' => '41', + 'created' => '1060695450', + 'creator_id' => '14', + 'id' => '472', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 5 => + array ( + 'contentobject_id' => '42', + 'created' => '1072180278', + 'creator_id' => '14', + 'id' => '473', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 6 => + array ( + 'contentobject_id' => '10', + 'created' => '1072180337', + 'creator_id' => '14', + 'id' => '474', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 7 => + array ( + 'contentobject_id' => '45', + 'created' => '1079684084', + 'creator_id' => '14', + 'id' => '477', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 8 => + array ( + 'contentobject_id' => '49', + 'created' => '1080220181', + 'creator_id' => '14', + 'id' => '488', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 9 => + array ( + 'contentobject_id' => '50', + 'created' => '1080220211', + 'creator_id' => '14', + 'id' => '489', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 10 => + array ( + 'contentobject_id' => '51', + 'created' => '1080220225', + 'creator_id' => '14', + 'id' => '490', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 11 => + array ( + 'contentobject_id' => '52', + 'created' => '1082016497', + 'creator_id' => '14', + 'id' => '491', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 12 => + array ( + 'contentobject_id' => '56', + 'created' => '1103023120', + 'creator_id' => '14', + 'id' => '495', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023120', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 13 => + array ( + 'contentobject_id' => '14', + 'created' => '1301061783', + 'creator_id' => '14', + 'id' => '499', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1301062024', + 'status' => '3', + 'user_id' => '0', + 'version' => '3', + 'workflow_event_pos' => '0', + ), + 14 => + array ( + 'contentobject_id' => '54', + 'created' => '1301062300', + 'creator_id' => '14', + 'id' => '500', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062375', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 15 => + array ( + 'contentobject_id' => '57', + 'created' => '1168428357', + 'creator_id' => '14', + 'id' => '504', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1168428357', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 16 => + array ( + 'contentobject_id' => '58', + 'created' => '1175499884', + 'creator_id' => '14', + 'id' => '505', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499903', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 17 => + array ( + 'contentobject_id' => '59', + 'created' => '1175499919', + 'creator_id' => '14', + 'id' => '506', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499932', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 18 => + array ( + 'contentobject_id' => '60', + 'created' => '1175499947', + 'creator_id' => '14', + 'id' => '507', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499959', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 19 => + array ( + 'contentobject_id' => '61', + 'created' => '1175500068', + 'creator_id' => '14', + 'id' => '508', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500074', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 20 => + array ( + 'contentobject_id' => '62', + 'created' => '1175500086', + 'creator_id' => '14', + 'id' => '509', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500182', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 21 => + array ( + 'contentobject_id' => '63', + 'created' => '1175500520', + 'creator_id' => '14', + 'id' => '510', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500542', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 22 => + array ( + 'contentobject_id' => '64', + 'created' => '1175500561', + 'creator_id' => '14', + 'id' => '511', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500602', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 23 => + array ( + 'contentobject_id' => '65', + 'created' => '1299780934', + 'creator_id' => '14', + 'id' => '512', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780998', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 24 => + array ( + 'contentobject_id' => '66', + 'created' => '1299781436', + 'creator_id' => '14', + 'id' => '513', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781436', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 25 => + array ( + 'contentobject_id' => '67', + 'created' => '1174567458', + 'creator_id' => '14', + 'id' => '514', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174567474', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 26 => + array ( + 'contentobject_id' => '68', + 'created' => '1174302333', + 'creator_id' => '14', + 'id' => '515', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302360', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 27 => + array ( + 'contentobject_id' => '69', + 'created' => '1174303659', + 'creator_id' => '14', + 'id' => '516', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174303791', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 28 => + array ( + 'contentobject_id' => '70', + 'created' => '1174302380', + 'creator_id' => '14', + 'id' => '517', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302388', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 29 => + array ( + 'contentobject_id' => '71', + 'created' => '1174303300', + 'creator_id' => '14', + 'id' => '518', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174303350', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 30 => + array ( + 'contentobject_id' => '72', + 'created' => '1174303407', + 'creator_id' => '14', + 'id' => '519', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174303441', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 31 => + array ( + 'contentobject_id' => '73', + 'created' => '1174304926', + 'creator_id' => '14', + 'id' => '520', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174304934', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 32 => + array ( + 'contentobject_id' => '74', + 'created' => '1174302401', + 'creator_id' => '14', + 'id' => '521', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302417', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 33 => + array ( + 'contentobject_id' => '75', + 'created' => '1175500667', + 'creator_id' => '14', + 'id' => '522', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500673', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 34 => + array ( + 'contentobject_id' => '76', + 'created' => '1175069333', + 'creator_id' => '14', + 'id' => '523', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069345', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 35 => + array ( + 'contentobject_id' => '77', + 'created' => '1174643924', + 'creator_id' => '14', + 'id' => '524', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174643989', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 36 => + array ( + 'contentobject_id' => '78', + 'created' => '1174644062', + 'creator_id' => '14', + 'id' => '525', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174644139', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 37 => + array ( + 'contentobject_id' => '79', + 'created' => '1174644699', + 'creator_id' => '14', + 'id' => '526', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174644713', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 38 => + array ( + 'contentobject_id' => '80', + 'created' => '1175069353', + 'creator_id' => '14', + 'id' => '527', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069361', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 39 => + array ( + 'contentobject_id' => '81', + 'created' => '1174645164', + 'creator_id' => '14', + 'id' => '528', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174645183', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 40 => + array ( + 'contentobject_id' => '82', + 'created' => '1174645280', + 'creator_id' => '14', + 'id' => '529', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174645301', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 41 => + array ( + 'contentobject_id' => '83', + 'created' => '1174645353', + 'creator_id' => '14', + 'id' => '530', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174645360', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 42 => + array ( + 'contentobject_id' => '84', + 'created' => '1175513890', + 'creator_id' => '14', + 'id' => '531', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175513914', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 43 => + array ( + 'contentobject_id' => '85', + 'created' => '1175238144', + 'creator_id' => '14', + 'id' => '532', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238155', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 44 => + array ( + 'contentobject_id' => '86', + 'created' => '1175069166', + 'creator_id' => '14', + 'id' => '533', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069183', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 45 => + array ( + 'contentobject_id' => '87', + 'created' => '1175236143', + 'creator_id' => '14', + 'id' => '534', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175236156', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 46 => + array ( + 'contentobject_id' => '88', + 'created' => '1175236170', + 'creator_id' => '14', + 'id' => '535', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175236181', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 47 => + array ( + 'contentobject_id' => '89', + 'created' => '1175238540', + 'creator_id' => '14', + 'id' => '536', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238552', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 48 => + array ( + 'contentobject_id' => '90', + 'created' => '1174389626', + 'creator_id' => '14', + 'id' => '537', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174389633', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 49 => + array ( + 'contentobject_id' => '91', + 'created' => '1175238182', + 'creator_id' => '14', + 'id' => '538', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238194', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 50 => + array ( + 'contentobject_id' => '92', + 'created' => '1175238211', + 'creator_id' => '14', + 'id' => '539', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238222', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 51 => + array ( + 'contentobject_id' => '93', + 'created' => '1175069305', + 'creator_id' => '14', + 'id' => '540', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069321', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 52 => + array ( + 'contentobject_id' => '94', + 'created' => '1175496885', + 'creator_id' => '14', + 'id' => '541', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175496901', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 53 => + array ( + 'contentobject_id' => '95', + 'created' => '1175258807', + 'creator_id' => '14', + 'id' => '542', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175258817', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 54 => + array ( + 'contentobject_id' => '96', + 'created' => '1175253354', + 'creator_id' => '14', + 'id' => '543', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253354', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 55 => + array ( + 'contentobject_id' => '97', + 'created' => '1175253355', + 'creator_id' => '14', + 'id' => '544', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253355', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 56 => + array ( + 'contentobject_id' => '98', + 'created' => '1175082027', + 'creator_id' => '14', + 'id' => '545', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175082041', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 57 => + array ( + 'contentobject_id' => '99', + 'created' => '1175082005', + 'creator_id' => '14', + 'id' => '546', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175082005', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 58 => + array ( + 'contentobject_id' => '100', + 'created' => '1175082007', + 'creator_id' => '14', + 'id' => '547', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175082007', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 59 => + array ( + 'contentobject_id' => '101', + 'created' => '1175253486', + 'creator_id' => '14', + 'id' => '548', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253508', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 60 => + array ( + 'contentobject_id' => '102', + 'created' => '1175496936', + 'creator_id' => '14', + 'id' => '549', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175496958', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 61 => + array ( + 'contentobject_id' => '103', + 'created' => '1175253638', + 'creator_id' => '14', + 'id' => '550', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253665', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 62 => + array ( + 'contentobject_id' => '104', + 'created' => '1175253680', + 'creator_id' => '14', + 'id' => '551', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253697', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 63 => + array ( + 'contentobject_id' => '105', + 'created' => '1299158726', + 'creator_id' => '14', + 'id' => '552', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299158749', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 64 => + array ( + 'contentobject_id' => '106', + 'created' => '1299826193', + 'creator_id' => '14', + 'id' => '553', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299826201', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 65 => + array ( + 'contentobject_id' => '107', + 'created' => '1299782457', + 'creator_id' => '14', + 'id' => '554', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782490', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 66 => + array ( + 'contentobject_id' => '108', + 'created' => '1299782077', + 'creator_id' => '14', + 'id' => '555', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782140', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 67 => + array ( + 'contentobject_id' => '109', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '556', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 68 => + array ( + 'contentobject_id' => '110', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '557', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 69 => + array ( + 'contentobject_id' => '111', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '558', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 70 => + array ( + 'contentobject_id' => '112', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '559', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 71 => + array ( + 'contentobject_id' => '113', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '560', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 72 => + array ( + 'contentobject_id' => '114', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '561', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 73 => + array ( + 'contentobject_id' => '115', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '562', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 74 => + array ( + 'contentobject_id' => '116', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '563', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 75 => + array ( + 'contentobject_id' => '117', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '564', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 76 => + array ( + 'contentobject_id' => '118', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '565', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 77 => + array ( + 'contentobject_id' => '119', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '566', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 78 => + array ( + 'contentobject_id' => '120', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '567', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 79 => + array ( + 'contentobject_id' => '121', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '568', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 80 => + array ( + 'contentobject_id' => '122', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '569', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 81 => + array ( + 'contentobject_id' => '123', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '570', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 82 => + array ( + 'contentobject_id' => '124', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '571', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 83 => + array ( + 'contentobject_id' => '125', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '572', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 84 => + array ( + 'contentobject_id' => '126', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '573', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 85 => + array ( + 'contentobject_id' => '127', + 'created' => '1299782157', + 'creator_id' => '14', + 'id' => '574', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782177', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 86 => + array ( + 'contentobject_id' => '128', + 'created' => '1299772637', + 'creator_id' => '14', + 'id' => '575', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772637', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 87 => + array ( + 'contentobject_id' => '129', + 'created' => '1299772637', + 'creator_id' => '14', + 'id' => '576', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772637', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 88 => + array ( + 'contentobject_id' => '130', + 'created' => '1284398171', + 'creator_id' => '14', + 'id' => '577', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1284398357', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 89 => + array ( + 'contentobject_id' => '131', + 'created' => '1299780740', + 'creator_id' => '14', + 'id' => '578', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780749', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 90 => + array ( + 'contentobject_id' => '132', + 'created' => '1299781985', + 'creator_id' => '14', + 'id' => '579', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782001', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 91 => + array ( + 'contentobject_id' => '133', + 'created' => '1299773631', + 'creator_id' => '14', + 'id' => '580', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773631', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 92 => + array ( + 'contentobject_id' => '134', + 'created' => '1299773631', + 'creator_id' => '14', + 'id' => '581', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773631', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 93 => + array ( + 'contentobject_id' => '135', + 'created' => '1299773631', + 'creator_id' => '14', + 'id' => '582', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773631', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 94 => + array ( + 'contentobject_id' => '136', + 'created' => '1299773644', + 'creator_id' => '14', + 'id' => '583', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773644', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 95 => + array ( + 'contentobject_id' => '137', + 'created' => '1299773644', + 'creator_id' => '14', + 'id' => '584', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773644', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 96 => + array ( + 'contentobject_id' => '138', + 'created' => '1299773644', + 'creator_id' => '14', + 'id' => '585', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773644', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 97 => + array ( + 'contentobject_id' => '139', + 'created' => '1299781873', + 'creator_id' => '14', + 'id' => '586', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781914', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 98 => + array ( + 'contentobject_id' => '140', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '587', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 99 => + array ( + 'contentobject_id' => '141', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '588', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 100 => + array ( + 'contentobject_id' => '142', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '589', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 101 => + array ( + 'contentobject_id' => '143', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '590', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 102 => + array ( + 'contentobject_id' => '144', + 'created' => '1299781559', + 'creator_id' => '14', + 'id' => '591', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781605', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 103 => + array ( + 'contentobject_id' => '145', + 'created' => '1299826213', + 'creator_id' => '14', + 'id' => '592', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299826223', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 104 => + array ( + 'contentobject_id' => '146', + 'created' => '1299773676', + 'creator_id' => '14', + 'id' => '593', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773676', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 105 => + array ( + 'contentobject_id' => '147', + 'created' => '1299773690', + 'creator_id' => '14', + 'id' => '594', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773690', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 106 => + array ( + 'contentobject_id' => '148', + 'created' => '1299773704', + 'creator_id' => '14', + 'id' => '595', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773704', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 107 => + array ( + 'contentobject_id' => '149', + 'created' => '1299773703', + 'creator_id' => '14', + 'id' => '596', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773703', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 108 => + array ( + 'contentobject_id' => '150', + 'created' => '1299781471', + 'creator_id' => '14', + 'id' => '597', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781476', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 109 => + array ( + 'contentobject_id' => '151', + 'created' => '1299780633', + 'creator_id' => '14', + 'id' => '598', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780653', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 110 => + array ( + 'contentobject_id' => '152', + 'created' => '1299780355', + 'creator_id' => '14', + 'id' => '599', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780355', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 111 => + array ( + 'contentobject_id' => '153', + 'created' => '1299780355', + 'creator_id' => '14', + 'id' => '600', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780355', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 112 => + array ( + 'contentobject_id' => '154', + 'created' => '1175499320', + 'creator_id' => '14', + 'id' => '601', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499365', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 113 => + array ( + 'contentobject_id' => '155', + 'created' => '1175498170', + 'creator_id' => '14', + 'id' => '602', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498179', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 114 => + array ( + 'contentobject_id' => '156', + 'created' => '1175497864', + 'creator_id' => '14', + 'id' => '603', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497937', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 115 => + array ( + 'contentobject_id' => '157', + 'created' => '1175499122', + 'creator_id' => '14', + 'id' => '604', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499136', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 116 => + array ( + 'contentobject_id' => '158', + 'created' => '1175497254', + 'creator_id' => '14', + 'id' => '605', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497280', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 117 => + array ( + 'contentobject_id' => '159', + 'created' => '1175498224', + 'creator_id' => '14', + 'id' => '606', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498242', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 118 => + array ( + 'contentobject_id' => '160', + 'created' => '1175498737', + 'creator_id' => '14', + 'id' => '607', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498746', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 119 => + array ( + 'contentobject_id' => '161', + 'created' => '1175498890', + 'creator_id' => '14', + 'id' => '608', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498940', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 120 => + array ( + 'contentobject_id' => '162', + 'created' => '1175497211', + 'creator_id' => '14', + 'id' => '609', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497237', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 121 => + array ( + 'contentobject_id' => '163', + 'created' => '1175497171', + 'creator_id' => '14', + 'id' => '610', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497203', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 122 => + array ( + 'contentobject_id' => '164', + 'created' => '1175499551', + 'creator_id' => '14', + 'id' => '611', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499563', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 123 => + array ( + 'contentobject_id' => '165', + 'created' => '1193915715', + 'creator_id' => '14', + 'id' => '612', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915732', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 124 => + array ( + 'contentobject_id' => '166', + 'created' => '1193915699', + 'creator_id' => '14', + 'id' => '613', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915707', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 125 => + array ( + 'contentobject_id' => '167', + 'created' => '1193906039', + 'creator_id' => '14', + 'id' => '614', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906039', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 126 => + array ( + 'contentobject_id' => '168', + 'created' => '1193906579', + 'creator_id' => '14', + 'id' => '615', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906579', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 127 => + array ( + 'contentobject_id' => '169', + 'created' => '1193906040', + 'creator_id' => '14', + 'id' => '616', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906040', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 128 => + array ( + 'contentobject_id' => '170', + 'created' => '1193906045', + 'creator_id' => '14', + 'id' => '617', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906045', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 129 => + array ( + 'contentobject_id' => '171', + 'created' => '1299779680', + 'creator_id' => '14', + 'id' => '618', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299779688', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 130 => + array ( + 'contentobject_id' => '172', + 'created' => '1193906046', + 'creator_id' => '14', + 'id' => '619', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906046', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 131 => + array ( + 'contentobject_id' => '173', + 'created' => '1193906046', + 'creator_id' => '14', + 'id' => '620', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906046', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 132 => + array ( + 'contentobject_id' => '174', + 'created' => '1193906047', + 'creator_id' => '14', + 'id' => '621', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906047', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 133 => + array ( + 'contentobject_id' => '175', + 'created' => '1193906047', + 'creator_id' => '14', + 'id' => '622', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906047', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 134 => + array ( + 'contentobject_id' => '176', + 'created' => '1299773437', + 'creator_id' => '14', + 'id' => '623', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773449', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 135 => + array ( + 'contentobject_id' => '177', + 'created' => '1299773204', + 'creator_id' => '14', + 'id' => '624', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773210', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 136 => + array ( + 'contentobject_id' => '178', + 'created' => '1299773232', + 'creator_id' => '14', + 'id' => '625', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773237', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 137 => + array ( + 'contentobject_id' => '179', + 'created' => '1299773245', + 'creator_id' => '14', + 'id' => '626', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773259', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 138 => + array ( + 'contentobject_id' => '180', + 'created' => '1299773266', + 'creator_id' => '14', + 'id' => '627', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773275', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 139 => + array ( + 'contentobject_id' => '181', + 'created' => '1299773330', + 'creator_id' => '14', + 'id' => '628', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773344', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 140 => + array ( + 'contentobject_id' => '182', + 'created' => '1299773379', + 'creator_id' => '14', + 'id' => '629', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773383', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 141 => + array ( + 'contentobject_id' => '183', + 'created' => '1299773397', + 'creator_id' => '14', + 'id' => '630', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773410', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 142 => + array ( + 'contentobject_id' => '184', + 'created' => '1299773419', + 'creator_id' => '14', + 'id' => '631', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773429', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 143 => + array ( + 'contentobject_id' => '185', + 'created' => '1193915419', + 'creator_id' => '14', + 'id' => '632', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915424', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 144 => + array ( + 'contentobject_id' => '186', + 'created' => '1193915476', + 'creator_id' => '14', + 'id' => '633', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915590', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 145 => + array ( + 'contentobject_id' => '187', + 'created' => '1193915617', + 'creator_id' => '14', + 'id' => '634', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915639', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 146 => + array ( + 'contentobject_id' => '188', + 'created' => '1175242696', + 'creator_id' => '14', + 'id' => '635', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242706', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 147 => + array ( + 'contentobject_id' => '189', + 'created' => '1174305514', + 'creator_id' => '14', + 'id' => '636', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174305524', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 148 => + array ( + 'contentobject_id' => '190', + 'created' => '1299159416', + 'creator_id' => '14', + 'id' => '637', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159424', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 149 => + array ( + 'contentobject_id' => '191', + 'created' => '1193907125', + 'creator_id' => '14', + 'id' => '638', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193935923', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 150 => + array ( + 'contentobject_id' => '192', + 'created' => '1253010589', + 'creator_id' => '14', + 'id' => '639', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010589', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 151 => + array ( + 'contentobject_id' => '193', + 'created' => '1193914499', + 'creator_id' => '14', + 'id' => '640', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193914551', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 152 => + array ( + 'contentobject_id' => '194', + 'created' => '1253009641', + 'creator_id' => '14', + 'id' => '641', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009641', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 153 => + array ( + 'contentobject_id' => '195', + 'created' => '1253009692', + 'creator_id' => '14', + 'id' => '642', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009692', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 154 => + array ( + 'contentobject_id' => '196', + 'created' => '1253009743', + 'creator_id' => '14', + 'id' => '643', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009743', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 155 => + array ( + 'contentobject_id' => '197', + 'created' => '1253009784', + 'creator_id' => '14', + 'id' => '644', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009784', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 156 => + array ( + 'contentobject_id' => '198', + 'created' => '1253009879', + 'creator_id' => '14', + 'id' => '645', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009879', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 157 => + array ( + 'contentobject_id' => '199', + 'created' => '1253010805', + 'creator_id' => '14', + 'id' => '646', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010805', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 158 => + array ( + 'contentobject_id' => '200', + 'created' => '1253009816', + 'creator_id' => '14', + 'id' => '647', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009816', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 159 => + array ( + 'contentobject_id' => '201', + 'created' => '1253009848', + 'creator_id' => '14', + 'id' => '648', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009848', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 160 => + array ( + 'contentobject_id' => '202', + 'created' => '1299782198', + 'creator_id' => '14', + 'id' => '649', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782207', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 161 => + array ( + 'contentobject_id' => '203', + 'created' => '1253010223', + 'creator_id' => '14', + 'id' => '650', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010223', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 162 => + array ( + 'contentobject_id' => '204', + 'created' => '1253010249', + 'creator_id' => '14', + 'id' => '651', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010249', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 163 => + array ( + 'contentobject_id' => '205', + 'created' => '1253010272', + 'creator_id' => '14', + 'id' => '652', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010272', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 164 => + array ( + 'contentobject_id' => '206', + 'created' => '1253010315', + 'creator_id' => '14', + 'id' => '653', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010315', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 165 => + array ( + 'contentobject_id' => '207', + 'created' => '1253010343', + 'creator_id' => '14', + 'id' => '654', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010343', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 166 => + array ( + 'contentobject_id' => '208', + 'created' => '1253010367', + 'creator_id' => '14', + 'id' => '655', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010367', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 167 => + array ( + 'contentobject_id' => '209', + 'created' => '1253010401', + 'creator_id' => '14', + 'id' => '656', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010401', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 168 => + array ( + 'contentobject_id' => '210', + 'created' => '1253010921', + 'creator_id' => '14', + 'id' => '657', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010921', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 169 => + array ( + 'contentobject_id' => '211', + 'created' => '1193914345', + 'creator_id' => '14', + 'id' => '658', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193914399', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 170 => + array ( + 'contentobject_id' => '212', + 'created' => '1253011179', + 'creator_id' => '14', + 'id' => '659', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253011179', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 171 => + array ( + 'contentobject_id' => '213', + 'created' => '1253011241', + 'creator_id' => '14', + 'id' => '660', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253011241', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 172 => + array ( + 'contentobject_id' => '214', + 'created' => '1299159430', + 'creator_id' => '14', + 'id' => '661', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159460', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 173 => + array ( + 'contentobject_id' => '215', + 'created' => '1299159470', + 'creator_id' => '14', + 'id' => '662', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159490', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 174 => + array ( + 'contentobject_id' => '216', + 'created' => '1299159503', + 'creator_id' => '14', + 'id' => '663', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159523', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 175 => + array ( + 'contentobject_id' => '217', + 'created' => '1299159538', + 'creator_id' => '14', + 'id' => '664', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159553', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 176 => + array ( + 'contentobject_id' => '218', + 'created' => '1299216456', + 'creator_id' => '14', + 'id' => '665', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299216558', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 177 => + array ( + 'contentobject_id' => '219', + 'created' => '1174305636', + 'creator_id' => '14', + 'id' => '666', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174305643', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 178 => + array ( + 'contentobject_id' => '220', + 'created' => '1175069781', + 'creator_id' => '14', + 'id' => '667', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069794', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 179 => + array ( + 'contentobject_id' => '221', + 'created' => '1175069727', + 'creator_id' => '14', + 'id' => '668', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069741', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 180 => + array ( + 'contentobject_id' => '222', + 'created' => '1174308738', + 'creator_id' => '14', + 'id' => '669', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174308756', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 181 => + array ( + 'contentobject_id' => '223', + 'created' => '1174654820', + 'creator_id' => '14', + 'id' => '670', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174654830', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 182 => + array ( + 'contentobject_id' => '224', + 'created' => '1175242951', + 'creator_id' => '14', + 'id' => '671', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242960', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 183 => + array ( + 'contentobject_id' => '14', + 'created' => '1311154214', + 'creator_id' => '14', + 'id' => '672', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154214', + 'status' => '1', + 'user_id' => '0', + 'version' => '4', + 'workflow_event_pos' => '0', + ), + 184 => + array ( + 'contentobject_id' => '225', + 'created' => '1311154215', + 'creator_id' => '14', + 'id' => '673', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 185 => + array ( + 'contentobject_id' => '11', + 'created' => '1311154215', + 'creator_id' => '14', + 'id' => '674', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + ), + 'eznode_assignment' => + array ( + 0 => + array ( + 'contentobject_id' => '8', + 'contentobject_version' => '2', + 'from_node_id' => '0', + 'id' => '4', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => + array ( + 'contentobject_id' => '42', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '5', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 2 => + array ( + 'contentobject_id' => '10', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '6', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '44', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 3 => + array ( + 'contentobject_id' => '4', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '7', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => + array ( + 'contentobject_id' => '12', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '8', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => + array ( + 'contentobject_id' => '13', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '9', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => + array ( + 'contentobject_id' => '41', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '11', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => + array ( + 'contentobject_id' => '11', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '12', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 8 => + array ( + 'contentobject_id' => '45', + 'contentobject_version' => '1', + 'from_node_id' => '-1', + 'id' => '16', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => + array ( + 'contentobject_id' => '49', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '27', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => + array ( + 'contentobject_id' => '50', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '28', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => + array ( + 'contentobject_id' => '51', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '29', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => + array ( + 'contentobject_id' => '52', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '30', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '48', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 13 => + array ( + 'contentobject_id' => '56', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '34', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 14 => + array ( + 'contentobject_id' => '14', + 'contentobject_version' => '3', + 'from_node_id' => '-1', + 'id' => '38', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '13', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => + array ( + 'contentobject_id' => '54', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '39', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '58', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => + array ( + 'contentobject_id' => '57', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '43', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '437ef9d0a9b7ae326ec83fa3bb73956d', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 17 => + array ( + 'contentobject_id' => '58', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '44', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => 'eaa7f2f48c3f35801961abad12151db4', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 18 => + array ( + 'contentobject_id' => '59', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '45', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => 'b8c85fd926d61dab6e68fa1865cee987', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 19 => + array ( + 'contentobject_id' => '60', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '46', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => 'c65aba2485585bdd09dfb66afccf645e', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 20 => + array ( + 'contentobject_id' => '61', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '47', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => '64bb803471e53898aa38a7c29e482370', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 21 => + array ( + 'contentobject_id' => '62', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '48', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => '95e29503817570c6458fa0f37d227306', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 22 => + array ( + 'contentobject_id' => '63', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '49', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => 'aa4a1afd9c02d00f2f31186e8a271332', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 23 => + array ( + 'contentobject_id' => '64', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '50', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '59', + 'parent_remote_id' => '93d5115082a23b266613868051b8d803', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 24 => + array ( + 'contentobject_id' => '65', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '51', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '1a8744c6d6be8675f7b27fa8b7b8437d', + 'remote_id' => '0', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 25 => + array ( + 'contentobject_id' => '66', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '52', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '51', + 'parent_remote_id' => '31fd28362c18a36cb56223f3609d5d90', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 26 => + array ( + 'contentobject_id' => '67', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '53', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '9cec85d730eec7578190ee95ce5a36f5', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 27 => + array ( + 'contentobject_id' => '68', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '54', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '69', + 'parent_remote_id' => 'b0b85c15125ca1732e5e528de2717599', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 28 => + array ( + 'contentobject_id' => '69', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '55', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '70', + 'parent_remote_id' => '087adb763245e0cdcac593fb4a5996cf', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 29 => + array ( + 'contentobject_id' => '70', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '56', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '69', + 'parent_remote_id' => 'e607aab6e924091909f3def02415bc53', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 30 => + array ( + 'contentobject_id' => '71', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '57', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '72', + 'parent_remote_id' => '054d9f10c6fa97689c0fc3b2ac412ebd', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 31 => + array ( + 'contentobject_id' => '72', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '58', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '72', + 'parent_remote_id' => '9801bda46e5f8b9d692e1120d50fc7b3', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 32 => + array ( + 'contentobject_id' => '73', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '59', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '72', + 'parent_remote_id' => '005067a5eee6505aa0f601cca30681d0', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 33 => + array ( + 'contentobject_id' => '74', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '60', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '69', + 'parent_remote_id' => '18f14551cc555c094b15a732ccd27fb2', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 34 => + array ( + 'contentobject_id' => '75', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '61', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => 'dbc2f3c8716c12f32c379dbf0b1cb133', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 35 => + array ( + 'contentobject_id' => '76', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '62', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '77', + 'parent_remote_id' => 'bc766fe955437def220a3fa2966a34ee', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 36 => + array ( + 'contentobject_id' => '77', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '63', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '78', + 'parent_remote_id' => 'f0c2216ecb29600cd8ae93951a0c8f3a', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 37 => + array ( + 'contentobject_id' => '78', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '64', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '78', + 'parent_remote_id' => 'eaf16bddfd36206dad265aadfbc98f17', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 38 => + array ( + 'contentobject_id' => '79', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '65', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '78', + 'parent_remote_id' => 'd2a11e56093b77eb7a347229361c3377', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 39 => + array ( + 'contentobject_id' => '80', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '66', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '77', + 'parent_remote_id' => '17d65b568e3500cf1f8b42bc5de2d12b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 40 => + array ( + 'contentobject_id' => '81', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '67', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '82', + 'parent_remote_id' => 'ecc4f0e94b05bf10f4f783d660ff0ad0', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 41 => + array ( + 'contentobject_id' => '82', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '68', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '82', + 'parent_remote_id' => '74280af2cba9002ea9660749225562b6', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 42 => + array ( + 'contentobject_id' => '83', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '69', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '82', + 'parent_remote_id' => '4e526426523e47aeacf353541284cbf8', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 43 => + array ( + 'contentobject_id' => '84', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '70', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '95f3c4261719ea27ab67f980fbee0694', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 44 => + array ( + 'contentobject_id' => '85', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '71', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '86', + 'parent_remote_id' => '4a1391d3563d056c9d9ea2653093ae3e', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 45 => + array ( + 'contentobject_id' => '86', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '72', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '86', + 'parent_remote_id' => '8889727909b5f34b6aa23f7eee32606b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 46 => + array ( + 'contentobject_id' => '87', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '73', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '88', + 'parent_remote_id' => '1721dbee55639fe280f6a54195f9577c', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 47 => + array ( + 'contentobject_id' => '88', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '74', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '88', + 'parent_remote_id' => '7fabb9ee5bcb6630a3947d1c5585d995', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 48 => + array ( + 'contentobject_id' => '89', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '75', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '88', + 'parent_remote_id' => 'a95ae3e4a64f08eb2002b31680fe8989', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 49 => + array ( + 'contentobject_id' => '90', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '76', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '86', + 'parent_remote_id' => '2acc8bb8f7eda4de2cf74f6dc277661f', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 50 => + array ( + 'contentobject_id' => '91', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '77', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '86', + 'parent_remote_id' => '6d8cc9831b86d79b8c184507f8e0cbb6', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 51 => + array ( + 'contentobject_id' => '92', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '78', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '86', + 'parent_remote_id' => '30f12ecd29608eceb20bb903ddb780c7', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 52 => + array ( + 'contentobject_id' => '93', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '79', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '86', + 'parent_remote_id' => '341e63bdce0f1601519d1b8e82e62766', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 53 => + array ( + 'contentobject_id' => '94', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '80', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '0d55a3f510cc7cd9a7b8eb838f50ff5c', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 54 => + array ( + 'contentobject_id' => '95', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '81', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '96', + 'parent_remote_id' => '89ce8eed8fa06c4105fd612aa83d87d6', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 55 => + array ( + 'contentobject_id' => '96', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '82', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '97', + 'parent_remote_id' => '78f3b9a9268c7b0206bf1c4d39211495', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 56 => + array ( + 'contentobject_id' => '97', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '83', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '98', + 'parent_remote_id' => 'a1f9b32547e58064e645388512c16a39', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 57 => + array ( + 'contentobject_id' => '98', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '84', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '96', + 'parent_remote_id' => '0f9c7380f8af1f29f1017e412bdd4016', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 58 => + array ( + 'contentobject_id' => '99', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '85', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '100', + 'parent_remote_id' => '036394ec8b160f0782bec2dda452d798', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 59 => + array ( + 'contentobject_id' => '100', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '86', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '101', + 'parent_remote_id' => '78da6a4fae1c2eaabe1dbe7af818d970', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 60 => + array ( + 'contentobject_id' => '101', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '87', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '96', + 'parent_remote_id' => '06cdeb27be466ea8330de5df16144263', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 61 => + array ( + 'contentobject_id' => '102', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '88', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '103', + 'parent_remote_id' => 'ab30399896b8e54442c3a619ba7eeecb', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 62 => + array ( + 'contentobject_id' => '103', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '89', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '96', + 'parent_remote_id' => 'ca2ae9d0f0322798f632e896325f22c3', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 63 => + array ( + 'contentobject_id' => '104', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '90', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '96', + 'parent_remote_id' => '7ba1d48c0151bae62366095ef6f64c28', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 64 => + array ( + 'contentobject_id' => '105', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '91', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => 'e81507d3446726ebd7361352fef5fad3', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 65 => + array ( + 'contentobject_id' => '106', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '92', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '51278360f39d5b8ce1d9249953f4de98', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 66 => + array ( + 'contentobject_id' => '107', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '93', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '33151e24acea9c837d2b9fc52e03b1de', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 67 => + array ( + 'contentobject_id' => '108', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '94', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '6b3bcab0f149c5acc2e3728df7c66b73', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 68 => + array ( + 'contentobject_id' => '109', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '95', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '28f9dfe5c0680955eec7a2dec4ebc642', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 69 => + array ( + 'contentobject_id' => '110', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '96', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '191faba79dc108a19893944befa50d94', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 70 => + array ( + 'contentobject_id' => '111', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '97', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '8679b5fa3ad0ec216293419ab9834e44', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 71 => + array ( + 'contentobject_id' => '112', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '98', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '7f32cdefd0cf55b966a44aa52181e30d', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 72 => + array ( + 'contentobject_id' => '113', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '99', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '29db3c1fcdb497e5cb2c74eb85c0906a', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 73 => + array ( + 'contentobject_id' => '114', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '100', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '96e30009f712a0315217fed93eba6a18', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 74 => + array ( + 'contentobject_id' => '115', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '101', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => '3a6b87470a25b19a6ad15caa5e24e719', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 75 => + array ( + 'contentobject_id' => '116', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '102', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => 'd0bc77a21920b63543d7b0accab81b24', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 76 => + array ( + 'contentobject_id' => '117', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '103', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '110', + 'parent_remote_id' => 'c75b4b4b870e0e3611e19e1323103282', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 77 => + array ( + 'contentobject_id' => '118', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '104', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '262d8c936d3757ff81e7bb49392b703f', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 78 => + array ( + 'contentobject_id' => '119', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '105', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => '220d4e10bf4619525c3165823079482c', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 79 => + array ( + 'contentobject_id' => '120', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '106', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => 'f13a938ce2c79a9d438548299220d6dd', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 80 => + array ( + 'contentobject_id' => '121', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '107', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => '04f5e08293954b1851a4dd1cbd976cff', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 81 => + array ( + 'contentobject_id' => '122', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '108', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => 'dc80ae3d9de55855a16218b032062c62', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 82 => + array ( + 'contentobject_id' => '123', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '109', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => '4cb6d4015dd80474074043ab28f96e36', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 83 => + array ( + 'contentobject_id' => '124', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '110', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => '74ce7d6cbae81d90592b4a8a242a284a', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 84 => + array ( + 'contentobject_id' => '125', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '111', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => '6f76d2f7e5812acf4f7c5c70258f4f7e', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 85 => + array ( + 'contentobject_id' => '126', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '112', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '120', + 'parent_remote_id' => '5ba07103968a6bb3f05c275c212440f6', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 86 => + array ( + 'contentobject_id' => '127', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '113', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '3579b6c5cd166d5137eada55274892d3', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 87 => + array ( + 'contentobject_id' => '128', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '114', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '129', + 'parent_remote_id' => 'e38a43ce35832e5af2df4f1e9272b926', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 88 => + array ( + 'contentobject_id' => '129', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '115', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '129', + 'parent_remote_id' => '1ba7889f63e32acf70f66349ce1a8953', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 89 => + array ( + 'contentobject_id' => '130', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '116', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '19ae9fcb7334a0e407b2781920247122', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 90 => + array ( + 'contentobject_id' => '131', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '117', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '107', + 'parent_remote_id' => '423b6d20325263abaa2012536cc736a4', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 91 => + array ( + 'contentobject_id' => '132', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '118', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => '07f0de334c83d631a59defe61f1a7cbf', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 92 => + array ( + 'contentobject_id' => '133', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '119', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '134', + 'parent_remote_id' => 'a7ca1a8878210a9978df0b00e9184b20', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 93 => + array ( + 'contentobject_id' => '134', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '120', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '134', + 'parent_remote_id' => '12c86be2151c426b990d47efd023cc40', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 94 => + array ( + 'contentobject_id' => '135', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '121', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '134', + 'parent_remote_id' => 'ff4473534c7cef8212a11feab57a5f0e', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 95 => + array ( + 'contentobject_id' => '136', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '122', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => 'e0a1b1b2a3d248bf8d43a83581c22ae8', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 96 => + array ( + 'contentobject_id' => '137', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '123', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '138', + 'parent_remote_id' => '8e6f0ba5195410b03a84ef3fdcc3ff0b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 97 => + array ( + 'contentobject_id' => '138', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '124', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '138', + 'parent_remote_id' => 'bc416b97e1592c7a396f6f5f85e131ac', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 98 => + array ( + 'contentobject_id' => '139', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '125', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => 'facfd2587054ea863cbe53768da04a47', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 99 => + array ( + 'contentobject_id' => '140', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '126', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '141', + 'parent_remote_id' => 'd159e8d4d590e481b06ecb441c0f14dc', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 100 => + array ( + 'contentobject_id' => '141', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '127', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '141', + 'parent_remote_id' => '7457db5919dd349bd878b60592fc009b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 101 => + array ( + 'contentobject_id' => '142', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '128', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '141', + 'parent_remote_id' => 'ebe1e9d1242a3aeedfda25da7cc25564', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 102 => + array ( + 'contentobject_id' => '143', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '129', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '141', + 'parent_remote_id' => 'b3acf4c0f2df8977f1c6932725339a1d', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 103 => + array ( + 'contentobject_id' => '144', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '130', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => 'a324a48fea49eb3e6826b3295dc5f413', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 104 => + array ( + 'contentobject_id' => '145', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '131', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => '8c0133434d7bea077a614e1a85fca5b7', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 105 => + array ( + 'contentobject_id' => '146', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '132', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '147', + 'parent_remote_id' => '46653e0e5fa60ab86788cad8084a759d', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 106 => + array ( + 'contentobject_id' => '147', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '133', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => '9b17e8d0b2cee501b75f7b481155e64f', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 107 => + array ( + 'contentobject_id' => '148', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '134', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => '3983d3aa7604f45a8ecbb953a98d646f', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 108 => + array ( + 'contentobject_id' => '149', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '135', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '150', + 'parent_remote_id' => '92756622f207c0b1902ca156947a77de', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 109 => + array ( + 'contentobject_id' => '150', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '136', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '133', + 'parent_remote_id' => '60adbb1e37a6524246d3af372366754f', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 110 => + array ( + 'contentobject_id' => '151', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '137', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => 'f4bf2e6c1cf75e15b15f0123a82778a1', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 111 => + array ( + 'contentobject_id' => '152', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '138', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '153', + 'parent_remote_id' => '1b95356b68bd59ef32b0fd7bb2c29130', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 112 => + array ( + 'contentobject_id' => '153', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '139', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '153', + 'parent_remote_id' => '94b7059eb5e0fe667f7c63eadd53a62b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 113 => + array ( + 'contentobject_id' => '154', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '140', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '0c523dfd6b1eccbfb0d1bfe632ee7411', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 114 => + array ( + 'contentobject_id' => '155', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '141', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '156', + 'parent_remote_id' => 'f5db8acf1150afc15eb514d380e3855d', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 115 => + array ( + 'contentobject_id' => '156', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '142', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '157', + 'parent_remote_id' => '6366a99ac1cec2133e87fdd805d108c8', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 116 => + array ( + 'contentobject_id' => '157', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '143', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '157', + 'parent_remote_id' => '7ee406cb6e5f0b2a29bc9f97f5a5b9db', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 117 => + array ( + 'contentobject_id' => '158', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '144', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '156', + 'parent_remote_id' => '007109e7f353c86dfd48d844cb18ce73', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 118 => + array ( + 'contentobject_id' => '159', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '145', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '160', + 'parent_remote_id' => '63769c39380a45a731aa44068c0f4e33', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 119 => + array ( + 'contentobject_id' => '160', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '146', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '160', + 'parent_remote_id' => 'f761918d15e356e50ce94294cad79765', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 120 => + array ( + 'contentobject_id' => '161', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '147', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '160', + 'parent_remote_id' => '68187b44ef9051a4db10bd9bb7f228a4', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 121 => + array ( + 'contentobject_id' => '162', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '148', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '156', + 'parent_remote_id' => '472e9bc321148baa71d2070063f24bb9', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 122 => + array ( + 'contentobject_id' => '163', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '149', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '156', + 'parent_remote_id' => 'b1a68df10cdf379cf78999c8012db679', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 123 => + array ( + 'contentobject_id' => '164', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '150', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '165', + 'parent_remote_id' => 'e9ee6724fffb012f918300de66af27e1', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 124 => + array ( + 'contentobject_id' => '165', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '151', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => 'c4604fb2e100a6681a4f53fbe6e5eeae', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 125 => + array ( + 'contentobject_id' => '166', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '152', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '167', + 'parent_remote_id' => '5e6762a083ab4c0357bad163902ba8f7', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 126 => + array ( + 'contentobject_id' => '167', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '153', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '168', + 'parent_remote_id' => '2549eee03064d55ae7fc84fe41ae1ef6', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 127 => + array ( + 'contentobject_id' => '168', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '154', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '168', + 'parent_remote_id' => '7bfca4bdde619ac9104e235629e2dbc7', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 128 => + array ( + 'contentobject_id' => '169', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '155', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '168', + 'parent_remote_id' => '81fd930afe94962395074b762592a356', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 129 => + array ( + 'contentobject_id' => '170', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '156', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '167', + 'parent_remote_id' => '8b570ac03318b7e29eb5fd1bae15efde', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 130 => + array ( + 'contentobject_id' => '171', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '157', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '172', + 'parent_remote_id' => '4329dcc6a8d441aa7253660512dfd5b6', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 131 => + array ( + 'contentobject_id' => '172', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '158', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '173', + 'parent_remote_id' => '6cf7b9370a0d9800ed49ba3be13b6be5', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 132 => + array ( + 'contentobject_id' => '173', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '159', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '173', + 'parent_remote_id' => 'f71191fcce35c83530cddde467a908b2', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 133 => + array ( + 'contentobject_id' => '174', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '160', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '172', + 'parent_remote_id' => '2d3cf4fe8d439e16e0ed75ef947b5e3d', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 134 => + array ( + 'contentobject_id' => '175', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '161', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '176', + 'parent_remote_id' => '49c9ad954328ab5f5a76d580873961a4', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 135 => + array ( + 'contentobject_id' => '176', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '162', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '167', + 'parent_remote_id' => 'ae32173cedf3a5ec441e3afcadc4abcb', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 136 => + array ( + 'contentobject_id' => '177', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '163', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => 'c6c32c884db955ea09338c90eee84746', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 137 => + array ( + 'contentobject_id' => '178', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '164', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => 'db191e87b9b6ac22a18742cd32d2b3d4', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 138 => + array ( + 'contentobject_id' => '179', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '165', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => '02a6d1506bf437eda1317d0c36a8545b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 139 => + array ( + 'contentobject_id' => '180', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '166', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => '40d743025e4ec4d813bd864dad08e0cc', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 140 => + array ( + 'contentobject_id' => '181', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '167', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => 'eb2a8ef7d4b1fb8ffb68f0764b615de1', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 141 => + array ( + 'contentobject_id' => '182', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '168', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => '9e45f3ee0f15995b670fb3a117b6ee49', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 142 => + array ( + 'contentobject_id' => '183', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '169', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => 'f368c4ae469c596344e15fca8c7370c2', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 143 => + array ( + 'contentobject_id' => '184', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '170', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '178', + 'parent_remote_id' => '7e153b75dd0ee0476ac7463d4a3daaef', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 144 => + array ( + 'contentobject_id' => '185', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '171', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '167', + 'parent_remote_id' => '09fb4147e4b124b9770a527bdd66799c', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 145 => + array ( + 'contentobject_id' => '186', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '172', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '187', + 'parent_remote_id' => '8f73d6d4ffca33c619d2f2645340ccc0', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 146 => + array ( + 'contentobject_id' => '187', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '173', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '187', + 'parent_remote_id' => '5cdc175d45aeb3fa054a95f40df56e79', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 147 => + array ( + 'contentobject_id' => '188', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '174', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => 'e060ff40aa17eb21dc1e4595c9a5eb9a', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 148 => + array ( + 'contentobject_id' => '189', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '175', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => '7bf290af79b3b51e6ccc1f95f321618c', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 149 => + array ( + 'contentobject_id' => '190', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '176', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => '9f804eee139dcee343dbe4175d14654c', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 150 => + array ( + 'contentobject_id' => '191', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '177', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '10d57795c986ca61689e6c2c11382eb3', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 151 => + array ( + 'contentobject_id' => '192', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '178', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '193', + 'parent_remote_id' => '87417129b080d24d335eb2653dd1a40c', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 152 => + array ( + 'contentobject_id' => '193', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '179', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => 'fd56d839df6e2b52055d4a62f4df7c3e', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 153 => + array ( + 'contentobject_id' => '194', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '180', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => 'ab2f2093f16c56ac2e61f40f25d2dbe0', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 154 => + array ( + 'contentobject_id' => '195', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '181', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => '185a1737e9012e7c3025df876bbb4f9b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 155 => + array ( + 'contentobject_id' => '196', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '182', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => 'efdca2f6ddd2c8befc283ae3465b9acd', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 156 => + array ( + 'contentobject_id' => '197', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '183', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => 'f81b0e4c31ea13d94b9838e9e7e7ad7e', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 157 => + array ( + 'contentobject_id' => '198', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '184', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => '666efc49c267cddf55ca707408f4ac42', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 158 => + array ( + 'contentobject_id' => '199', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '185', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => 'afb51a5f898c549c9e1f35afc75d66f3', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 159 => + array ( + 'contentobject_id' => '200', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '186', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => '94b71866ede0d2776c140e85a823d31d', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 160 => + array ( + 'contentobject_id' => '201', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '187', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '195', + 'parent_remote_id' => 'e74475a240fb7061b40c75f5e6fcd52c', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 161 => + array ( + 'contentobject_id' => '202', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '188', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '42a3b07037390457ad0f2c65494bfd97', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 162 => + array ( + 'contentobject_id' => '203', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '189', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => '6da1a82ba3d962d2ad953fff8ee26362', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 163 => + array ( + 'contentobject_id' => '204', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '190', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => 'b284abd88bdcb1887a86e40304ffc66f', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 164 => + array ( + 'contentobject_id' => '205', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '191', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => 'e3400bb44aae5fcb416156e7450f3f32', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 165 => + array ( + 'contentobject_id' => '206', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '192', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => '2b2b27bbaaec688aaec1a5d39b4b13ae', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 166 => + array ( + 'contentobject_id' => '207', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '193', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => '37e5feed6574d1d8da4b4531569a27a2', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 167 => + array ( + 'contentobject_id' => '208', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '194', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => '5625695a66034f53b9b6e14029e06e80', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 168 => + array ( + 'contentobject_id' => '209', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '195', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => '824aba4122ee51d9638847e55642feec', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 169 => + array ( + 'contentobject_id' => '210', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '196', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '204', + 'parent_remote_id' => '73e95051b800ce051c3851c60807787b', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 170 => + array ( + 'contentobject_id' => '211', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '197', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '3f921d3c490a6c17870b1f01fcfbceed', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 171 => + array ( + 'contentobject_id' => '212', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '198', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '213', + 'parent_remote_id' => '97f7b391f1522bf404ff672ac338b91c', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 172 => + array ( + 'contentobject_id' => '213', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '199', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '213', + 'parent_remote_id' => 'c5549bf68962a5384bd2225931cba302', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 173 => + array ( + 'contentobject_id' => '214', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '200', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '54adfd9f7c80638f5560eb3f0618c57b', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 174 => + array ( + 'contentobject_id' => '215', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '201', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => 'a7dbafbf963821b71e5522c21e09d9dd', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 175 => + array ( + 'contentobject_id' => '216', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '202', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '61e3b15f020590df0759b779e5f1fb9d', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 176 => + array ( + 'contentobject_id' => '217', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '203', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '42560fa30a55ac5ddf1f76a52d44a613', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 177 => + array ( + 'contentobject_id' => '218', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '204', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '192', + 'parent_remote_id' => '416c28c9ba34a9114381a6ec3ae197e0', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 178 => + array ( + 'contentobject_id' => '219', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '205', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => 'ae6afe955af19209125961b6c0d9a840', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 179 => + array ( + 'contentobject_id' => '220', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '206', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => '28b7fd81eaf6b9702c9f8ff8268daac9', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 180 => + array ( + 'contentobject_id' => '221', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '207', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => '627c1c5cdf124dc2f92489e686cd04bb', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 181 => + array ( + 'contentobject_id' => '222', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '208', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => 'daa3004ede25b0130ca5bef83c1922c3', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 182 => + array ( + 'contentobject_id' => '223', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '209', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '224', + 'parent_remote_id' => '9d2bdcb8b35464ee03651c191ac4d1ff', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 183 => + array ( + 'contentobject_id' => '224', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '210', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '190', + 'parent_remote_id' => '9ae96e2ecc3a5a79964405273cc8542a', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 184 => + array ( + 'contentobject_id' => '14', + 'contentobject_version' => '4', + 'from_node_id' => '-1', + 'id' => '211', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '13', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 185 => + array ( + 'contentobject_id' => '225', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '212', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 186 => + array ( + 'contentobject_id' => '11', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '213', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + ), + 'ezurl' => + array ( + 0 => + array ( + 'created' => '1301057834', + 'id' => '9', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057834', + 'original_url_md5' => 'bb9c47d334fd775f1c54c45d460e6b2a', + 'url' => 'http://doc.ez.no/', + ), + 1 => + array ( + 'created' => '1301057836', + 'id' => '13', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => 'b13f5ff5cdcad2a4efb461e4edf6f718', + 'url' => 'http://ez.no/Demos-videos/eZ-Publish-Administration-Interface-Video-Tutorial', + ), + 2 => + array ( + 'created' => '1301057836', + 'id' => '14', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => '7b133bbdf1d039979a973e5a697e3743', + 'url' => 'http://ez.no/Demos-videos/eZ-Publish-Online-Editor-Video-Tutorial', + ), + 3 => + array ( + 'created' => '1301057836', + 'id' => '15', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => '4e75c83ab35d461f109ec959aa1c5e1d', + 'url' => 'http://ez.no/Demos-videos/eZ-Flow-Video-Tutorial', + ), + 4 => + array ( + 'created' => '1301057836', + 'id' => '16', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => '215310c57a3d54ef1356c20855510357', + 'url' => 'http://share.ez.no/learn/ez-publish/an-introduction-to-developing-ez-publish-extensions', + ), + 5 => + array ( + 'created' => '1301057836', + 'id' => '17', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => '9ba078c54f33985da5bd1348a8f39741', + 'url' => 'http://share.ez.no/learn/ez-publish/creating-a-simple-custom-workflow-event', + ), + 6 => + array ( + 'created' => '1301057836', + 'id' => '18', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => 'eb3d19c36acbd41176094024d8fccfd5', + 'url' => 'http://www.slideshare.net/ezcommunity/ole-marius-smestad-rest-api-how-to-turn-ez-publish-into-a-multichannel-machine', + ), + 7 => + array ( + 'created' => '1301057836', + 'id' => '19', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => '1fea0fead02dfc550fbefa5c17acc94f', + 'url' => 'http://www.slideshare.net/BertrandDunogier/presentation-winter-conference-2011-e-z-asynchronous-publishing', + ), + 8 => + array ( + 'created' => '1301057836', + 'id' => '20', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => 'af8f8bdc5fac2f3ada6ad337adab04cb', + 'url' => 'http://doc.ez.no/eZ-Publish/Upgrading/Upgrading-to-4.5', + ), + 9 => + array ( + 'created' => '1301057836', + 'id' => '21', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => '3c6d6cfc2642951e9a946b697f84a306', + 'url' => 'http://share.ez.no/learn', + ), + 10 => + array ( + 'created' => '1301057836', + 'id' => '22', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1301057836', + 'original_url_md5' => 'ac3ba54b44950b2d77fa42cc57dab914', + 'url' => 'http://ez.no/Demos-videos', + ), + 11 => + array ( + 'created' => '1311154174', + 'id' => '23', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154174', + 'original_url_md5' => '590afa1809904842796205d4d571c976', + 'url' => 'http://doc.ez.no/eZ-Publish/Technical-manual/4.5', + ), + 12 => + array ( + 'created' => '1311154174', + 'id' => '24', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154174', + 'original_url_md5' => '45cd300bca7761588e0ace23640eff3f', + 'url' => 'http://doc.ez.no/eZ-Publish/User-manual/4.5', + ), + 13 => + array ( + 'created' => '1311154185', + 'id' => '25', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '72707907a848a14f33f1352ae0308e5b', + 'url' => 'http://share.ez.no/forums', + ), + 14 => + array ( + 'created' => '1311154185', + 'id' => '26', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'da16d9c486d95e264169293a39b67ad6', + 'url' => 'http://share.ez.no/blogs', + ), + 15 => + array ( + 'created' => '1311154185', + 'id' => '27', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '848a3810b8506bb4ebcfb61dd540985d', + 'url' => 'http://twitter.com/ezcommunity', + ), + 16 => + array ( + 'created' => '1311154185', + 'id' => '28', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '03e5192a9025067262c816a027e1d7b6', + 'url' => 'http://www.linkedin.com/groups?gid=2759', + ), + 17 => + array ( + 'created' => '1311154185', + 'id' => '29', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'fd86f64652e4408d72ac42e78de462f5', + 'url' => 'http://share.ez.no/about/get-involved', + ), + 18 => + array ( + 'created' => '1311154185', + 'id' => '30', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'abcf623ca9bfdedaae617b280473bda7', + 'url' => 'http://share.ez.no/about/etiquette-blogging-and-usage-guidelines', + ), + 19 => + array ( + 'created' => '1311154185', + 'id' => '31', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '25f38d8b1ca7e64c6a82d7e126f80022', + 'url' => 'http://share.ez.no/forums/install-configuration', + ), + 20 => + array ( + 'created' => '1311154185', + 'id' => '32', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '6a643a86a729aded29612aac280063b2', + 'url' => 'http://share.ez.no/forums/setup-design', + ), + 21 => + array ( + 'created' => '1311154185', + 'id' => '33', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '8736641c6fc3520c5f3adbb9c5f6de74', + 'url' => 'http://share.ez.no/forums/general', + ), + 22 => + array ( + 'created' => '1311154185', + 'id' => '34', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '81ea35ab0b578ddbecf391f7c7a509ac', + 'url' => 'http://share.ez.no/forums/developer', + ), + 23 => + array ( + 'created' => '1311154185', + 'id' => '35', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '76de2bf179fe746173daf48499a81f23', + 'url' => 'http://share.ez.no/forums/suggestions', + ), + 24 => + array ( + 'created' => '1311154185', + 'id' => '36', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'a29b9ce655377694e606ee70a6636361', + 'url' => 'http://share.ez.no/forums/extensions', + ), + 25 => + array ( + 'created' => '1311154185', + 'id' => '37', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '7b907a0c58bcc0665b3638e97c2597b6', + 'url' => 'http://share.ez.no/forums/extensions/ez-newsletter', + ), + 26 => + array ( + 'created' => '1311154185', + 'id' => '38', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '12021495bfa320016e304ef52f72ad2c', + 'url' => 'http://share.ez.no/forums/extensions/website-interface', + ), + 27 => + array ( + 'created' => '1311154185', + 'id' => '39', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '958912ed4a05e34e44ff28acb5a7df3b', + 'url' => 'http://share.ez.no/forums/extensions/ez-flow', + ), + 28 => + array ( + 'created' => '1311154185', + 'id' => '40', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'f36ed50995d7898feb21fea71a2e93c0', + 'url' => 'http://share.ez.no/forums/extensions/ez-find', + ), + 29 => + array ( + 'created' => '1311154185', + 'id' => '41', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '76538a2a362d14e50e52f2204c5f7fc0', + 'url' => 'http://share.ez.no/forums/translation', + ), + 30 => + array ( + 'created' => '1311154185', + 'id' => '42', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '10c21ad9cb1aaea53ae13922b8462078', + 'url' => 'http://share.ez.no/forums/localized-forums', + ), + 31 => + array ( + 'created' => '1311154185', + 'id' => '43', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'f5b54a2571a6a92a1b714662461df808', + 'url' => 'http://share.ez.no/forums/feedback-and-ideas-for-this-portal', + ), + 32 => + array ( + 'created' => '1311154185', + 'id' => '44', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '53137591ef856777bddbd7843ed55945', + 'url' => 'http://issues.ez.no/ProjectSelect.php?Id=6', + ), + 33 => + array ( + 'created' => '1311154185', + 'id' => '45', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '9fed8384518daf741b21073051b2bc82', + 'url' => 'http://issues.ez.no/ProjectSelect.php?Id=3', + ), + 34 => + array ( + 'created' => '1311154185', + 'id' => '46', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '009202f0b8516c86a1ae2e713b236a0d', + 'url' => 'http://share.ez.no/articles', + ), + 35 => + array ( + 'created' => '1311154185', + 'id' => '47', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'af97ad168859364ba6be544a10227dce', + 'url' => 'http://share.ez.no/tutorials', + ), + 36 => + array ( + 'created' => '1311154185', + 'id' => '48', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '42e449f547a866fc91cd9cc0276bb856', + 'url' => 'http://share.ez.no/blogs/share.ez.no-team/share-your-experience-write-a-tutorial-for-the-community', + ), + 37 => + array ( + 'created' => '1311154185', + 'id' => '49', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '29b5ff661060d4e56b4f71560db63bf9', + 'url' => 'irc://irc.freenode.net/', + ), + 38 => + array ( + 'created' => '1311154185', + 'id' => '50', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'c7b1db7c78837ad56e490a2f9e106513', + 'url' => 'http://en.wikipedia.org/wiki/Internet_Relay_Chat', + ), + 39 => + array ( + 'created' => '1311154185', + 'id' => '51', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '73771757edcd554a7de09d709d1998a0', + 'url' => 'http://www.xchat.org/', + ), + 40 => + array ( + 'created' => '1311154185', + 'id' => '52', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '34a73db75b328b9e33a6f8be10839d6a', + 'url' => 'http://www.mirc.com/', + ), + 41 => + array ( + 'created' => '1311154185', + 'id' => '53', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '43ea73ab9bda87c1404c2b3df76102be', + 'url' => 'http://www.pidgin.im/', + ), + 42 => + array ( + 'created' => '1311154185', + 'id' => '54', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'e0e4b9109422d6ae74f0cf15622f47f8', + 'url' => 'http://colloquy.info/', + ), + 43 => + array ( + 'created' => '1311154185', + 'id' => '55', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'b0a2baa65437ca44a03a72942a1def34', + 'url' => 'http://planetezpublish.org/', + ), + 44 => + array ( + 'created' => '1311154185', + 'id' => '56', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '2fc202b5ab8b0e61a1975f85e71da31b', + 'url' => 'http://planetezpublish.org/rss/feed/rss20.xml', + ), + 45 => + array ( + 'created' => '1311154185', + 'id' => '57', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '250539f8ead8841ed0f91f39c0744732', + 'url' => 'http://www.planet-ezpublish.fr/', + ), + 46 => + array ( + 'created' => '1311154185', + 'id' => '58', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '48e508939abb04100c31feb3db7bca99', + 'url' => 'http://lists.ez.no/mailman/listinfo/sdk-public', + ), + 47 => + array ( + 'created' => '1311154185', + 'id' => '59', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'eb2c7ae92b6523fce7f380712dcdc3ee', + 'url' => 'http://lists.ez.no/mailman/listinfo/sdk-svn', + ), + 48 => + array ( + 'created' => '1311154185', + 'id' => '60', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '2d823657cbdd8d41e63875e97497fa4a', + 'url' => 'http://share.ez.no/rss/feed/all_forums', + ), + 49 => + array ( + 'created' => '1311154185', + 'id' => '61', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'a1c839f19e544f45f1b24e4081a859b8', + 'url' => 'http://share.ez.no/rss/feed/forum_topics_only', + ), + 50 => + array ( + 'created' => '1311154185', + 'id' => '62', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '3f2fff22712f47e136a46a9e7190418a', + 'url' => 'http://share.ez.no/rss/feed/articles', + ), + 51 => + array ( + 'created' => '1311154185', + 'id' => '63', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'a3589cf032c79d5afbb5e0231f9bde63', + 'url' => 'http://share.ez.no/rss/feed/blogs', + ), + 52 => + array ( + 'created' => '1311154185', + 'id' => '64', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '7c1f530d6ad202571f22cc8c606bb83c', + 'url' => 'http://share.ez.no/rss/feed/forums_developer', + ), + 53 => + array ( + 'created' => '1311154185', + 'id' => '65', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'aedc6546cbc245956ca72a0f210bd685', + 'url' => 'http://share.ez.no/rss/feed/forums_discussions', + ), + 54 => + array ( + 'created' => '1311154185', + 'id' => '66', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '06b3b46ac8297015c7cc1b4059ffd296', + 'url' => 'http://share.ez.no/rss/feed/forums_extensions', + ), + 55 => + array ( + 'created' => '1311154185', + 'id' => '67', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'bdbaed15beb6ef757854ee3cd8fef0c2', + 'url' => 'http://share.ez.no/rss/feed/forums_feedback', + ), + 56 => + array ( + 'created' => '1311154185', + 'id' => '68', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '41c2346efe6f237fc71a71a5c5be7157', + 'url' => 'http://share.ez.no/rss/feed/forums_general', + ), + 57 => + array ( + 'created' => '1311154185', + 'id' => '69', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '075ff7cbbd7d64d25ba70ba8dbcc2247', + 'url' => 'http://share.ez.no/rss/feed/forums_install_and_configuration', + ), + 58 => + array ( + 'created' => '1311154185', + 'id' => '70', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '60eb4cded3c2b0f8034179ea8cc78433', + 'url' => 'http://share.ez.no/rss/feed/forums_setup_and_design', + ), + 59 => + array ( + 'created' => '1311154185', + 'id' => '71', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '3ac4e53a5c5c4c40cdc7730f004fd1fc', + 'url' => 'http://share.ez.no/rss/feed/forums_suggestions', + ), + 60 => + array ( + 'created' => '1311154185', + 'id' => '72', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'f36ea06615ae2bda0c494c730a17d4c5', + 'url' => 'http://share.ez.no/rss/feed/forums_translation', + ), + 61 => + array ( + 'created' => '1311154185', + 'id' => '73', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'b8d97968cb3fea3a251ff6643d78b8c9', + 'url' => 'http://share.ez.no/rss/feed/projects', + ), + 62 => + array ( + 'created' => '1311154185', + 'id' => '74', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'acf1e2178ee6e59b2f8c031d65dcce90', + 'url' => 'http://twitter.com/i_robin/cms-ezpublish/members', + ), + 63 => + array ( + 'created' => '1311154185', + 'id' => '75', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '0b9ae77a639ec82e4df27faa42105d13', + 'url' => 'https://wave.google.com/', + ), + 64 => + array ( + 'created' => '1311154185', + 'id' => '76', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'ec662565f30cac29d1c5e8b92fcf36db', + 'url' => 'http://share.ez.no/forums/general/ez-publish-on-google-wave', + ), + 65 => + array ( + 'created' => '1311154185', + 'id' => '77', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '9fd5c2ca7e61e4e632fc5087ab478c48', + 'url' => 'http://projects.ez.no/', + ), + 66 => + array ( + 'created' => '1311154185', + 'id' => '78', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '09db4900415016354a0c46afa142f5bb', + 'url' => 'http://ezpedia.org/', + ), + 67 => + array ( + 'created' => '1311154185', + 'id' => '79', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '887dd7ce7eca08e453cd6e1809e2050c', + 'url' => 'http://pubsvn.ez.no/doxygen/trunk/html/index.html', + ), + 68 => + array ( + 'created' => '1311154185', + 'id' => '80', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'df591da8b03b6a34c7b65db9444d7404', + 'url' => 'http://incubator.apache.org/zetacomponents/documentation/overview.html', + ), + 69 => + array ( + 'created' => '1311154185', + 'id' => '81', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '52b043bcd64a2d3e5ceca70ac3f94834', + 'url' => 'http://issues.ez.no/ezpublish', + ), + 70 => + array ( + 'created' => '1311154185', + 'id' => '82', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '88c4142410b68a1216890e1e9f375521', + 'url' => 'http://share.ez.no/github.com/ezsystems/ezpublish', + ), + 71 => + array ( + 'created' => '1311154185', + 'id' => '83', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => '34822fe97d42d592f378247b5058e48d', + 'url' => 'http://projects.ez.no/ezpublish_translation', + ), + 72 => + array ( + 'created' => '1311154185', + 'id' => '84', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154185', + 'original_url_md5' => 'd2a07a3cf059b5ebe90629b817558a2c', + 'url' => 'http://ez.no/ezfind', + ), + 73 => + array ( + 'created' => '1311154187', + 'id' => '85', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154187', + 'original_url_md5' => '73bbbe9943f1196c0282d5ed8467e003', + 'url' => 'http://ez.no/support_and_services/ez_publish_premium', + ), + 74 => + array ( + 'created' => '1311154189', + 'id' => '86', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => '443aa8489b0f6bedb1240fa4011694c9', + 'url' => 'http://ez.no/doc/ez_publish/technical_manual/4_0/templates/the_template_override_system', + ), + 75 => + array ( + 'created' => '1311154189', + 'id' => '87', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => '903fb32b3f6da9ad8248504573e3720c', + 'url' => 'http://ez.no/developer/contribs/site_styles', + ), + 76 => + array ( + 'created' => '1311154189', + 'id' => '88', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => '7df50136b3e6e49601ec8f532a88f5fe', + 'url' => 'http://ez.no/ezcomponents', + ), + 77 => + array ( + 'created' => '1311154189', + 'id' => '89', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => 'f7f365668e85a3db20b7e06c08274b2a', + 'url' => 'http://ez.no/developer/contribs', + ), + 78 => + array ( + 'created' => '1311154189', + 'id' => '90', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => 'dcb82187a67e73527dc5d329a08047c2', + 'url' => 'http://subversion.tigris.org/', + ), + 79 => + array ( + 'created' => '1311154189', + 'id' => '91', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => 'ece220e6b2e68a2e29c48ebfdd0b0219', + 'url' => 'http://www.eclipse.org/', + ), + 80 => + array ( + 'created' => '1311154189', + 'id' => '92', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154189', + 'original_url_md5' => 'fb671b9761b2f65a0f7593c04353106b', + 'url' => 'http://www.phpedit.com/', + ), + 81 => + array ( + 'created' => '1311154190', + 'id' => '93', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154190', + 'original_url_md5' => '712f33e020d970504ca0d2920d073f02', + 'url' => 'http://share.ez.no/tutorials/ez-publish/lots-of-websites-one-ez-publish-installation-adding-siteaccesses-in-ez-publish', + ), + 82 => + array ( + 'created' => '1311154190', + 'id' => '94', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154190', + 'original_url_md5' => '310e82187fcbd4541666b13bf4067f34', + 'url' => 'http://granitehorizon.com/', + ), + 83 => + array ( + 'created' => '1311154194', + 'id' => '95', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154194', + 'original_url_md5' => '847310eb455f9ae37cb56962213c491d', + 'url' => 'http://www.example.com', + ), + 84 => + array ( + 'created' => '1311154194', + 'id' => '96', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154194', + 'original_url_md5' => '14dd0f15e926472fc3a98c8b9210fe37', + 'url' => 'http://www.example.com/index.html', + ), + 85 => + array ( + 'created' => '1311154205', + 'id' => '97', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154205', + 'original_url_md5' => 'd2be3bb903b0b7de8303dfea1cada332', + 'url' => 'http://ez.no/ezpublish', + ), + 86 => + array ( + 'created' => '1311154205', + 'id' => '98', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154205', + 'original_url_md5' => '81a3c8f41320d5b9bf4a8a006551918f', + 'url' => 'http://ez.no/ezpublish/use_ez_publish', + ), + 87 => + array ( + 'created' => '1311154205', + 'id' => '99', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154205', + 'original_url_md5' => '00de4d3b098fa1640787b233185d1129', + 'url' => 'http://ez.no/solutions/digital_media/online_magazines', + ), + 88 => + array ( + 'created' => '1311154205', + 'id' => '100', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154205', + 'original_url_md5' => '0e4becdbf18714aaa1d7c63ccf2118ac', + 'url' => 'http://ez.no/solutions/digital_media/online_newspapers', + ), + 89 => + array ( + 'created' => '1311154205', + 'id' => '101', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154205', + 'original_url_md5' => 'c6d6e36c5db2942e6a6cca1bfcfc17c8', + 'url' => 'http://ez.no/solutions/community_portal', + ), + 90 => + array ( + 'created' => '1311154205', + 'id' => '102', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154205', + 'original_url_md5' => 'fc218c4dd363b2845f79379fecb92f08', + 'url' => 'http://ez.no/developer', + ), + 91 => + array ( + 'created' => '1311154210', + 'id' => '103', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154210', + 'original_url_md5' => 'b906332d411e5325f9b7fd14c3845f54', + 'url' => 'http://ez.no/ezpublish/develop_with_ez_publish', + ), + 92 => + array ( + 'created' => '1311154211', + 'id' => '104', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154211', + 'original_url_md5' => 'f1777111f5d0f1c81ffa04de751128fa', + 'url' => 'http://www.example.com/', + ), + 93 => + array ( + 'created' => '1311154215', + 'id' => '105', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154215', + 'original_url_md5' => '9b492048041e95b32de08bafc86d759b', + 'url' => '/content/view/sitemap/2', + ), + 94 => + array ( + 'created' => '1311154215', + 'id' => '106', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1311154215', + 'original_url_md5' => 'c86bcb109d8e70f9db65c803baafd550', + 'url' => '/content/view/tagcloud/2', + ), + ), + 'ezurl_object_link' => + array ( + 0 => + array ( + 'contentobject_attribute_id' => '245', + 'contentobject_attribute_version' => '1', + 'url_id' => '23', + ), + 1 => + array ( + 'contentobject_attribute_id' => '245', + 'contentobject_attribute_version' => '1', + 'url_id' => '24', + ), + 2 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '16', + ), + 3 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '17', + ), + 4 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '18', + ), + 5 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '13', + ), + 6 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '19', + ), + 7 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '14', + ), + 8 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '15', + ), + 9 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '20', + ), + 10 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '21', + ), + 11 => + array ( + 'contentobject_attribute_id' => '565', + 'contentobject_attribute_version' => '1', + 'url_id' => '22', + ), + 12 => + array ( + 'contentobject_attribute_id' => '577', + 'contentobject_attribute_version' => '1', + 'url_id' => '25', + ), + 13 => + array ( + 'contentobject_attribute_id' => '577', + 'contentobject_attribute_version' => '1', + 'url_id' => '26', + ), + 14 => + array ( + 'contentobject_attribute_id' => '577', + 'contentobject_attribute_version' => '1', + 'url_id' => '27', + ), + 15 => + array ( + 'contentobject_attribute_id' => '577', + 'contentobject_attribute_version' => '1', + 'url_id' => '28', + ), + 16 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '29', + ), + 17 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '30', + ), + 18 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '25', + ), + 19 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '31', + ), + 20 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '32', + ), + 21 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '33', + ), + 22 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '34', + ), + 23 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '35', + ), + 24 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '36', + ), + 25 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '37', + ), + 26 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '38', + ), + 27 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '39', + ), + 28 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '40', + ), + 29 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '41', + ), + 30 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '42', + ), + 31 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '43', + ), + 32 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '44', + ), + 33 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '45', + ), + 34 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '46', + ), + 35 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '47', + ), + 36 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '48', + ), + 37 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '49', + ), + 38 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '50', + ), + 39 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '51', + ), + 40 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '52', + ), + 41 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '53', + ), + 42 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '54', + ), + 43 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '55', + ), + 44 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '56', + ), + 45 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '57', + ), + 46 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '58', + ), + 47 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '59', + ), + 48 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '60', + ), + 49 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '61', + ), + 50 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '62', + ), + 51 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '63', + ), + 52 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '64', + ), + 53 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '65', + ), + 54 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '66', + ), + 55 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '67', + ), + 56 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '68', + ), + 57 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '69', + ), + 58 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '70', + ), + 59 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '71', + ), + 60 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '72', + ), + 61 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '73', + ), + 62 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '27', + ), + 63 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '74', + ), + 64 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '28', + ), + 65 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '75', + ), + 66 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '76', + ), + 67 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '77', + ), + 68 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '9', + ), + 69 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '78', + ), + 70 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '79', + ), + 71 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '80', + ), + 72 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '81', + ), + 73 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '82', + ), + 74 => + array ( + 'contentobject_attribute_id' => '578', + 'contentobject_attribute_version' => '1', + 'url_id' => '83', + ), + 75 => + array ( + 'contentobject_attribute_id' => '590', + 'contentobject_attribute_version' => '1', + 'url_id' => '84', + ), + 76 => + array ( + 'contentobject_attribute_id' => '638', + 'contentobject_attribute_version' => '1', + 'url_id' => '85', + ), + 77 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '86', + ), + 78 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '87', + ), + 79 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '88', + ), + 80 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '89', + ), + 81 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '90', + ), + 82 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '91', + ), + 83 => + array ( + 'contentobject_attribute_id' => '682', + 'contentobject_attribute_version' => '1', + 'url_id' => '92', + ), + 84 => + array ( + 'contentobject_attribute_id' => '702', + 'contentobject_attribute_version' => '1', + 'url_id' => '93', + ), + 85 => + array ( + 'contentobject_attribute_id' => '702', + 'contentobject_attribute_version' => '1', + 'url_id' => '94', + ), + 86 => + array ( + 'contentobject_attribute_id' => '821', + 'contentobject_attribute_version' => '1', + 'url_id' => '95', + ), + 87 => + array ( + 'contentobject_attribute_id' => '821', + 'contentobject_attribute_version' => '1', + 'url_id' => '96', + ), + 88 => + array ( + 'contentobject_attribute_id' => '849', + 'contentobject_attribute_version' => '1', + 'url_id' => '18', + ), + 89 => + array ( + 'contentobject_attribute_id' => '1105', + 'contentobject_attribute_version' => '1', + 'url_id' => '97', + ), + 90 => + array ( + 'contentobject_attribute_id' => '1105', + 'contentobject_attribute_version' => '1', + 'url_id' => '98', + ), + 91 => + array ( + 'contentobject_attribute_id' => '1105', + 'contentobject_attribute_version' => '1', + 'url_id' => '99', + ), + 92 => + array ( + 'contentobject_attribute_id' => '1105', + 'contentobject_attribute_version' => '1', + 'url_id' => '100', + ), + 93 => + array ( + 'contentobject_attribute_id' => '1105', + 'contentobject_attribute_version' => '1', + 'url_id' => '101', + ), + 94 => + array ( + 'contentobject_attribute_id' => '1105', + 'contentobject_attribute_version' => '1', + 'url_id' => '102', + ), + 95 => + array ( + 'contentobject_attribute_id' => '1121', + 'contentobject_attribute_version' => '1', + 'url_id' => '98', + ), + 96 => + array ( + 'contentobject_attribute_id' => '1121', + 'contentobject_attribute_version' => '1', + 'url_id' => '84', + ), + 97 => + array ( + 'contentobject_attribute_id' => '1165', + 'contentobject_attribute_version' => '1', + 'url_id' => '85', + ), + 98 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '103', + ), + 99 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '86', + ), + 100 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '87', + ), + 101 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '88', + ), + 102 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '89', + ), + 103 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '90', + ), + 104 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '91', + ), + 105 => + array ( + 'contentobject_attribute_id' => '1209', + 'contentobject_attribute_version' => '1', + 'url_id' => '92', + ), + 106 => + array ( + 'contentobject_attribute_id' => '1253', + 'contentobject_attribute_version' => '1', + 'url_id' => '104', + ), + 107 => + array ( + 'contentobject_attribute_id' => '1253', + 'contentobject_attribute_version' => '1', + 'url_id' => '96', + ), + 108 => + array ( + 'contentobject_attribute_id' => '1318', + 'contentobject_attribute_version' => '2', + 'url_id' => '105', + ), + 109 => + array ( + 'contentobject_attribute_id' => '1319', + 'contentobject_attribute_version' => '2', + 'url_id' => '106', + ), + ), + 'ezurlalias' => + array ( + 0 => + array ( + 'destination_url' => 'content/view/full/2', + 'forward_to_id' => '0', + 'id' => '12', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + 'source_url' => '', + ), + 1 => + array ( + 'destination_url' => 'content/view/full/5', + 'forward_to_id' => '0', + 'id' => '13', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '9bc65c2abec141778ffaa729489f3e87', + 'source_url' => 'users', + ), + 2 => + array ( + 'destination_url' => 'content/view/full/12', + 'forward_to_id' => '0', + 'id' => '15', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '02d4e844e3a660857a3f81585995ffe1', + 'source_url' => 'users/guest_accounts', + ), + 3 => + array ( + 'destination_url' => 'content/view/full/13', + 'forward_to_id' => '0', + 'id' => '16', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '1b1d79c16700fd6003ea7be233e754ba', + 'source_url' => 'users/administrator_users', + ), + 4 => + array ( + 'destination_url' => 'content/view/full/14', + 'forward_to_id' => '0', + 'id' => '17', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '0bb9dd665c96bbc1cf36b79180786dea', + 'source_url' => 'users/editors', + ), + 5 => + array ( + 'destination_url' => 'content/view/full/15', + 'forward_to_id' => '0', + 'id' => '18', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'f1305ac5f327a19b451d82719e0c3f5d', + 'source_url' => 'users/administrator_users/administrator_user', + ), + 6 => + array ( + 'destination_url' => 'content/view/full/43', + 'forward_to_id' => '0', + 'id' => '20', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '62933a2951ef01f4eafd9bdf4d3cd2f0', + 'source_url' => 'media', + ), + 7 => + array ( + 'destination_url' => 'content/view/full/44', + 'forward_to_id' => '0', + 'id' => '21', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '3ae1aac958e1c82013689d917d34967a', + 'source_url' => 'users/anonymous_users', + ), + 8 => + array ( + 'destination_url' => 'content/view/full/45', + 'forward_to_id' => '0', + 'id' => '22', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'aad93975f09371695ba08292fd9698db', + 'source_url' => 'users/anonymous_users/anonymous_user', + ), + 9 => + array ( + 'destination_url' => 'content/view/full/48', + 'forward_to_id' => '0', + 'id' => '25', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'a0f848942ce863cf53c0fa6cc684007d', + 'source_url' => 'setup', + ), + 10 => + array ( + 'destination_url' => 'content/view/full/50', + 'forward_to_id' => '0', + 'id' => '27', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'c60212835de76414f9bfd21eecb8f221', + 'source_url' => 'foo_bar_folder/images/vbanner', + ), + 11 => + array ( + 'destination_url' => 'content/view/full/51', + 'forward_to_id' => '0', + 'id' => '28', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '38985339d4a5aadfc41ab292b4527046', + 'source_url' => 'media/images', + ), + 12 => + array ( + 'destination_url' => 'content/view/full/52', + 'forward_to_id' => '0', + 'id' => '29', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'ad5a8c6f6aac3b1b9df267fe22e7aef6', + 'source_url' => 'media/files', + ), + 13 => + array ( + 'destination_url' => 'content/view/full/53', + 'forward_to_id' => '0', + 'id' => '30', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '562a0ac498571c6c3529173184a2657c', + 'source_url' => 'media/multimedia', + ), + 14 => + array ( + 'destination_url' => 'content/view/full/54', + 'forward_to_id' => '0', + 'id' => '31', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'e501fe6c81ed14a5af2b322d248102d8', + 'source_url' => 'setup/common_ini_settings', + ), + 15 => + array ( + 'destination_url' => 'content/view/full/56', + 'forward_to_id' => '0', + 'id' => '32', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '2dd3db5dc7122ea5f3ee539bb18fe97d', + 'source_url' => 'design/ez_publish', + ), + 16 => + array ( + 'destination_url' => 'content/view/full/58', + 'forward_to_id' => '0', + 'id' => '33', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '31c13f47ad87dd7baa2d558a91e0fbb9', + 'source_url' => 'design', + ), + ), + 'ezurlalias_ml' => + array ( + 0 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '14', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '14', + 'parent' => '0', + 'text' => 'foo_bar_folder', + 'text_md5' => '0288b6883046492fa92e4a84eb67acc9', + ), + 1 => + array ( + 'action' => 'eznode:67', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '206', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '3', + 'link' => '46', + 'parent' => '0', + 'text' => 'Home', + 'text_md5' => '106a6c241b8797f52e1e77317b96a201', + ), + 2 => + array ( + 'action' => 'eznode:67', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '46', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '46', + 'parent' => '0', + 'text' => 'eZ-Publish', + 'text_md5' => '10e4c3cb527fb9963258469986c16240', + ), + 3 => + array ( + 'action' => 'eznode:58', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '25', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '25', + 'parent' => '0', + 'text' => 'Design', + 'text_md5' => '31c13f47ad87dd7baa2d558a91e0fbb9', + ), + 4 => + array ( + 'action' => 'eznode:96', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '75', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '75', + 'parent' => '0', + 'text' => 'Support', + 'text_md5' => '434990c8a25d2be94863561ae98bd682', + ), + 5 => + array ( + 'action' => 'eznode:48', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '13', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '13', + 'parent' => '0', + 'text' => 'Setup2', + 'text_md5' => '475e97c0146bfb1c490339546d9e72ee', + ), + 6 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '17', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '17', + 'parent' => '0', + 'text' => 'media2', + 'text_md5' => '50e2736330de124f6edea9b008556fe6', + ), + 7 => + array ( + 'action' => 'eznode:43', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '9', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '9', + 'parent' => '0', + 'text' => 'Media', + 'text_md5' => '62933a2951ef01f4eafd9bdf4d3cd2f0', + ), + 8 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '21', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '21', + 'parent' => '0', + 'text' => 'setup3', + 'text_md5' => '732cefcf28bf4547540609fb1a786a30', + ), + 9 => + array ( + 'action' => 'eznode:156', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '135', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '135', + 'parent' => '0', + 'text' => 'Partners', + 'text_md5' => '7896f8fa69398c56d86a65357615c41f', + ), + 10 => + array ( + 'action' => 'eznode:153', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '132', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '132', + 'parent' => '0', + 'text' => 'eZ-Publish-Enterprise', + 'text_md5' => '78e494fbf5158218fd054fcd2cf9d849', + ), + 11 => + array ( + 'action' => 'eznode:167', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '146', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '146', + 'parent' => '0', + 'text' => 'Community', + 'text_md5' => '82df41632da476065ce2997900554442', + ), + 12 => + array ( + 'action' => 'eznode:69', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '48', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '48', + 'parent' => '0', + 'text' => 'Products', + 'text_md5' => '86024cad1e83101d97359d7351051156', + ), + 13 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '3', + 'parent' => '0', + 'text' => 'users2', + 'text_md5' => '86425c35a33507d479f71ade53a669aa', + ), + 14 => + array ( + 'action' => 'eznode:77', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '56', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '56', + 'parent' => '0', + 'text' => 'Solutions', + 'text_md5' => '8692fc447f13b2256b0b4e381de7f382', + ), + 15 => + array ( + 'action' => 'eznode:107', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '86', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '86', + 'parent' => '0', + 'text' => 'Getting-started', + 'text_md5' => '8e0aab8c77d7ef1b836d9c16e5c062b3', + ), + 16 => + array ( + 'action' => 'eznode:190', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '169', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '169', + 'parent' => '0', + 'text' => 'Company', + 'text_md5' => '93c731f1c3a84ef05cd54d044c379eaa', + ), + 17 => + array ( + 'action' => 'eznode:5', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'Users', + 'text_md5' => '9bc65c2abec141778ffaa729489f3e87', + ), + 18 => + array ( + 'action' => 'eznode:86', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '65', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '65', + 'parent' => '0', + 'text' => 'Training', + 'text_md5' => 'c185ddac8b5a8f5aa23c5b80bc12d214', + ), + 19 => + array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 20 => + array ( + 'action' => 'eznode:227', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '207', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '207', + 'parent' => '2', + 'text' => 'Partners', + 'text_md5' => '7896f8fa69398c56d86a65357615c41f', + ), + 21 => + array ( + 'action' => 'eznode:14', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '6', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '6', + 'parent' => '2', + 'text' => 'Editors', + 'text_md5' => 'a147e136bfa717592f2bd70bd4b53b17', + ), + 22 => + array ( + 'action' => 'eznode:44', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '10', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '10', + 'parent' => '2', + 'text' => 'Anonymous-Users', + 'text_md5' => 'c2803c3fa1b0b5423237b4e018cae755', + ), + 23 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '2', + 'text' => 'Members', + 'text_md5' => 'd2e3083420929d8bfae81f58fa4594cb', + ), + 24 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '208', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '2', + 'text' => 'Guest-accounts', + 'text_md5' => 'e57843d836e3af8ab611fde9e2139b3a', + ), + 25 => + array ( + 'action' => 'eznode:13', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '5', + 'parent' => '2', + 'text' => 'Administrator-users', + 'text_md5' => 'f89fad7f8a3abc8c09e1deb46a420007', + ), + 26 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '11', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '11', + 'parent' => '3', + 'text' => 'anonymous_users2', + 'text_md5' => '505e93077a6dde9034ad97a14ab022b1', + ), + 27 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '26', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '0', + 'link' => '4', + 'parent' => '3', + 'text' => 'guest_accounts', + 'text_md5' => '70bb992820e73638731aa8de79b3329e', + ), + 28 => + array ( + 'action' => 'eznode:14', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '29', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '6', + 'parent' => '3', + 'text' => 'editors', + 'text_md5' => 'a147e136bfa717592f2bd70bd4b53b17', + ), + 29 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '7', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '7', + 'parent' => '3', + 'text' => 'administrator_users2', + 'text_md5' => 'a7da338c20bf65f9f789c87296379c2a', + ), + 30 => + array ( + 'action' => 'eznode:13', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '27', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '5', + 'parent' => '3', + 'text' => 'administrator_users', + 'text_md5' => 'aeb8609aa933b0899aa012c71139c58c', + ), + 31 => + array ( + 'action' => 'eznode:44', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '30', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '10', + 'parent' => '3', + 'text' => 'anonymous_users', + 'text_md5' => 'e9e5ad0c05ee1a43715572e5cc545926', + ), + 32 => + array ( + 'action' => 'eznode:15', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '8', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '8', + 'parent' => '5', + 'text' => 'Administrator-User', + 'text_md5' => '5a9d7b0ec93173ef4fedee023209cb61', + ), + 33 => + array ( + 'action' => 'eznode:15', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '28', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '0', + 'link' => '8', + 'parent' => '7', + 'text' => 'administrator_user', + 'text_md5' => 'a3cca2de936df1e2f805710399989971', + ), + 34 => + array ( + 'action' => 'eznode:59', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '38', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '38', + 'parent' => '9', + 'text' => 'Banners', + 'text_md5' => '009a93317a248d0fbcd664b6fa5e79e8', + ), + 35 => + array ( + 'action' => 'eznode:53', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '20', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '20', + 'parent' => '9', + 'text' => 'Multimedia', + 'text_md5' => '2e5bc8831f7ae6a29530e7f1bbf2de9c', + ), + 36 => + array ( + 'action' => 'eznode:52', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '19', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '19', + 'parent' => '9', + 'text' => 'Files', + 'text_md5' => '45b963397aa40d4a0063e0d85e4fe7a1', + ), + 37 => + array ( + 'action' => 'eznode:51', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '18', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '18', + 'parent' => '9', + 'text' => 'Images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 38 => + array ( + 'action' => 'eznode:45', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '12', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '12', + 'parent' => '10', + 'text' => 'Anonymous-User', + 'text_md5' => 'ccb62ebca03a31272430bc414bd5cd5b', + ), + 39 => + array ( + 'action' => 'eznode:45', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '31', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '12', + 'parent' => '11', + 'text' => 'anonymous_user', + 'text_md5' => 'c593ec85293ecb0e02d50d4c5c6c20eb', + ), + 40 => + array ( + 'action' => 'eznode:54', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '22', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '22', + 'parent' => '13', + 'text' => 'Common-INI-settings', + 'text_md5' => '4434993ac013ae4d54bb1f51034d6401', + ), + 41 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '15', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '15', + 'parent' => '14', + 'text' => 'images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 42 => + array ( + 'action' => 'eznode:50', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '16', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '16', + 'parent' => '15', + 'text' => 'vbanner', + 'text_md5' => 'c54e2d1b93642e280bdc5d99eab2827d', + ), + 43 => + array ( + 'action' => 'eznode:53', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '34', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '20', + 'parent' => '17', + 'text' => 'multimedia', + 'text_md5' => '2e5bc8831f7ae6a29530e7f1bbf2de9c', + ), + 44 => + array ( + 'action' => 'eznode:52', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '33', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '19', + 'parent' => '17', + 'text' => 'files', + 'text_md5' => '45b963397aa40d4a0063e0d85e4fe7a1', + ), + 45 => + array ( + 'action' => 'eznode:51', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '32', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '18', + 'parent' => '17', + 'text' => 'images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 46 => + array ( + 'action' => 'eznode:68', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '47', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '47', + 'parent' => '18', + 'text' => 'rest_api', + 'text_md5' => '8c89749bf64fee88444aa8175453348e', + ), + 47 => + array ( + 'action' => 'eznode:54', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '35', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '22', + 'parent' => '21', + 'text' => 'common_ini_settings', + 'text_md5' => 'e59d6834e86cee752ed841f9cd8d5baf', + ), + 48 => + array ( + 'action' => 'eznode:56', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '37', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '24', + 'parent' => '25', + 'text' => 'eZ-publish', + 'text_md5' => '10e4c3cb527fb9963258469986c16240', + ), + 49 => + array ( + 'action' => 'eznode:56', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '24', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '24', + 'parent' => '25', + 'text' => 'Plain-site', + 'text_md5' => '49a39d99a955d95aa5d636275656a07a', + ), + 50 => + array ( + 'action' => 'eznode:64', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '43', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '43', + 'parent' => '38', + 'text' => 'Pencils-Support', + 'text_md5' => '02b09f8b411c005ccc3110b0b414ec15', + ), + 51 => + array ( + 'action' => 'eznode:60', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '39', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '39', + 'parent' => '38', + 'text' => 'Woman-Communities', + 'text_md5' => '4d3c019d9d41ad5272a503a5ce448126', + ), + 52 => + array ( + 'action' => 'eznode:63', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '42', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '42', + 'parent' => '38', + 'text' => 'Woman-Partners', + 'text_md5' => '7274b801dd70280c859e2dda6d4eae72', + ), + 53 => + array ( + 'action' => 'eznode:65', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '44', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '44', + 'parent' => '38', + 'text' => 'Woman-Training', + 'text_md5' => 'b7693d4e390abf68394e4b612fd322ec', + ), + 54 => + array ( + 'action' => 'eznode:61', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '40', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '40', + 'parent' => '38', + 'text' => 'Woman-Frontpage', + 'text_md5' => 'd4827a8bdeea0af607292053c9771d3a', + ), + 55 => + array ( + 'action' => 'eznode:62', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '41', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '41', + 'parent' => '38', + 'text' => 'Woman-Products', + 'text_md5' => 'e93019e7e0839625b0b6627ad50147e9', + ), + 56 => + array ( + 'action' => 'eznode:66', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '45', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '45', + 'parent' => '38', + 'text' => 'Woman-Solutions', + 'text_md5' => 'f12b59c52ee7cd2e125cb5f66d15c0a3', + ), + 57 => + array ( + 'action' => 'eznode:72', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '51', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '51', + 'parent' => '48', + 'text' => 'Boxes', + 'text_md5' => '549857591ffc4a3191221204b0cbafce', + ), + 58 => + array ( + 'action' => 'eznode:70', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '49', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '49', + 'parent' => '48', + 'text' => 'Software', + 'text_md5' => 'f9fa10ba956cacf91d7878861139efb9', + ), + 59 => + array ( + 'action' => 'eznode:76', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '55', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '55', + 'parent' => '48', + 'text' => 'Products-sheets', + 'text_md5' => 'fbbb083b13c90341e576defbe20f54f3', + ), + 60 => + array ( + 'action' => 'eznode:71', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '50', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '50', + 'parent' => '49', + 'text' => 'OS-Type-I', + 'text_md5' => '250d574820b3ecfbeb307f3e073179db', + ), + 61 => + array ( + 'action' => 'eznode:74', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '53', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '53', + 'parent' => '51', + 'text' => 'CD-DVD-Box-II', + 'text_md5' => '85af1d9ca89a0ca29c4addf04c54f053', + ), + 62 => + array ( + 'action' => 'eznode:75', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '54', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '54', + 'parent' => '51', + 'text' => 'CD-DVD-Box-III', + 'text_md5' => '97e029e0e72b6e55799230d12de7d86a', + ), + 63 => + array ( + 'action' => 'eznode:73', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '52', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '52', + 'parent' => '51', + 'text' => 'CD-DVD-Box-I', + 'text_md5' => 'd8fd499f98da09f6b5850612e7cac98f', + ), + 64 => + array ( + 'action' => 'eznode:82', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '61', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '61', + 'parent' => '56', + 'text' => 'Content-management', + 'text_md5' => '38421df494f94c7a781768ad80d47e08', + ), + 65 => + array ( + 'action' => 'eznode:78', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '57', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '57', + 'parent' => '56', + 'text' => 'Web-publishing', + 'text_md5' => 'd25e148042d89f2d71b039604e6289e1', + ), + 66 => + array ( + 'action' => 'eznode:79', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '58', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '58', + 'parent' => '57', + 'text' => 'Fusce-sagittis-sagittis', + 'text_md5' => '00e7bd4225fade21c827a48fb479638b', + ), + 67 => + array ( + 'action' => 'eznode:80', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '59', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '59', + 'parent' => '57', + 'text' => 'Etiam-posuere-sodales-arcu', + 'text_md5' => '79a438615b1efc3666bfcadee4964ea6', + ), + 68 => + array ( + 'action' => 'eznode:81', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '60', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '60', + 'parent' => '57', + 'text' => 'In-hac-habitasse-platea', + 'text_md5' => '7b22cf1832d59030f79c9bc9ed8757ec', + ), + 69 => + array ( + 'action' => 'eznode:85', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '64', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '64', + 'parent' => '61', + 'text' => 'Aenean-malesuada-ligula', + 'text_md5' => '3ad0d7d4ec39e62d206d130d5a38fb3c', + ), + 70 => + array ( + 'action' => 'eznode:83', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '62', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '62', + 'parent' => '61', + 'text' => 'Fusce-sagittis-sagittis-urna', + 'text_md5' => 'cf04c01a0db46371c0ec58f83913a75a', + ), + 71 => + array ( + 'action' => 'eznode:84', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '63', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '63', + 'parent' => '61', + 'text' => 'Class-aptent-taciti-sociosqu', + 'text_md5' => 'f5923fce9089f79bb188a270c3c1e35e', + ), + 72 => + array ( + 'action' => 'eznode:88', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '67', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '67', + 'parent' => '65', + 'text' => 'Professional-workshops', + 'text_md5' => '17ca6c4dd8673f95a10b8f8702b4cd7a', + ), + 73 => + array ( + 'action' => 'eznode:94', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '73', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '73', + 'parent' => '65', + 'text' => 'Instructor-led-courses', + 'text_md5' => 'a3304e4e6f7be353856f3369f091c65f', + ), + 74 => + array ( + 'action' => 'eznode:93', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '72', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '72', + 'parent' => '65', + 'text' => 'Self-paced-courses', + 'text_md5' => 'e7d1abade2d88e9c20cfe335e518b431', + ), + 75 => + array ( + 'action' => 'eznode:87', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '66', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '66', + 'parent' => '65', + 'text' => 'Certification', + 'text_md5' => 'f1fd1913c968a1c383c88631e335a7ca', + ), + 76 => + array ( + 'action' => 'eznode:95', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '74', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '74', + 'parent' => '65', + 'text' => 'Additional-learning-resources', + 'text_md5' => 'f9f0c2468a9258ef91aab2048d203f73', + ), + 77 => + array ( + 'action' => 'eznode:92', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '71', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '71', + 'parent' => '65', + 'text' => 'Events-and-seminars', + 'text_md5' => 'ff3fa85ac5928a98619f528d3eedce90', + ), + 78 => + array ( + 'action' => 'eznode:91', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '70', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '70', + 'parent' => '67', + 'text' => 'Duis-auctor-vehicula-erat', + 'text_md5' => '3ef0334d886546d91b9852ecd91222d5', + ), + 79 => + array ( + 'action' => 'eznode:89', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '68', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '68', + 'parent' => '67', + 'text' => 'Etiam-sodales-mauris', + 'text_md5' => '70bdebdab8ae2d9f9015d92e3fde5047', + ), + 80 => + array ( + 'action' => 'eznode:90', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '69', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '69', + 'parent' => '67', + 'text' => 'Class-aptent-taciti', + 'text_md5' => 'd981acdcf5470d59409fe56d063e664e', + ), + 81 => + array ( + 'action' => 'eznode:100', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '79', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '79', + 'parent' => '75', + 'text' => 'Documentation', + 'text_md5' => '55876228853abf632dec9346a4f372ec', + ), + 82 => + array ( + 'action' => 'eznode:103', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '82', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '82', + 'parent' => '75', + 'text' => 'Books', + 'text_md5' => '7d8949bcbf85067fceda9f84a6affb6b', + ), + 83 => + array ( + 'action' => 'eznode:105', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '84', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '84', + 'parent' => '75', + 'text' => 'Customer-Service', + 'text_md5' => 'a0a888983c63ac9314760c19ec388e98', + ), + 84 => + array ( + 'action' => 'eznode:97', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '76', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '76', + 'parent' => '75', + 'text' => 'Knowledgebase', + 'text_md5' => 'c08500cb9b12178780fd9d10e43e8c2c', + ), + 85 => + array ( + 'action' => 'eznode:106', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '85', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '85', + 'parent' => '75', + 'text' => 'Support-Programs', + 'text_md5' => 'db36d48a3ab46217ec8e04e45cd2d602', + ), + 86 => + array ( + 'action' => 'eznode:98', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '77', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '77', + 'parent' => '76', + 'text' => 'Sed-suscipit', + 'text_md5' => 'c575fcd3c4f52e291be31001f0be746d', + ), + 87 => + array ( + 'action' => 'eznode:99', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '78', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '78', + 'parent' => '77', + 'text' => 'Ut-interdum', + 'text_md5' => 'd660c96c943a7b209026a5299017e30e', + ), + 88 => + array ( + 'action' => 'eznode:101', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '80', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '80', + 'parent' => '79', + 'text' => 'Mauris-pretium', + 'text_md5' => '2cb1f21692386d6320508524cc9e17d0', + ), + 89 => + array ( + 'action' => 'eznode:102', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '81', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '81', + 'parent' => '80', + 'text' => 'Aliquam-posuere', + 'text_md5' => 'e33a924443b843bd58dbf2fd68970eb9', + ), + 90 => + array ( + 'action' => 'eznode:104', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '83', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '83', + 'parent' => '82', + 'text' => 'Aliquam-pulvinar-suscipit-tellus', + 'text_md5' => '87e89d85bb2cfc953010b82b1cb87e29', + ), + 91 => + array ( + 'action' => 'eznode:132', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '111', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '111', + 'parent' => '86', + 'text' => 'Adding-Siteaccesses-in-eZ-Publish', + 'text_md5' => '0ca9baa4f34c27e2b5bb8a6e01bc61f4', + ), + 92 => + array ( + 'action' => 'eznode:109', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '88', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '88', + 'parent' => '86', + 'text' => 'Get-involved', + 'text_md5' => '347be5828acf2a97e192382ee6af3dba', + ), + 93 => + array ( + 'action' => 'eznode:120', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '99', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '99', + 'parent' => '86', + 'text' => 'How-to-manage-eZ-Publish', + 'text_md5' => '38f227f027d9b66fa32a1b7fd09102b0', + ), + 94 => + array ( + 'action' => 'eznode:108', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '87', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '87', + 'parent' => '86', + 'text' => 'Tutorials-for', + 'text_md5' => '72dbc9d48afde53c38ed5cf16a349120', + ), + 95 => + array ( + 'action' => 'eznode:110', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '89', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '89', + 'parent' => '86', + 'text' => 'How-to-use-eZ-Publish', + 'text_md5' => '7bf161f3ad9b79be40262c807b42c901', + ), + 96 => + array ( + 'action' => 'eznode:129', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '108', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '108', + 'parent' => '86', + 'text' => 'How-to-develop-with-eZ-Publish', + 'text_md5' => 'bca34b10b4bf19a49be18802a0cb873a', + ), + 97 => + array ( + 'action' => 'eznode:133', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '112', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '112', + 'parent' => '86', + 'text' => 'New-features', + 'text_md5' => 'cc9126674839b9487fb129b5d0b0ad1e', + ), + 98 => + array ( + 'action' => 'eznode:112', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '91', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '91', + 'parent' => '89', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 99 => + array ( + 'action' => 'eznode:119', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '98', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '98', + 'parent' => '89', + 'text' => 'graphics19', + 'text_md5' => '4e6a663c72ced62de03f2a1a96bc2ecd', + ), + 100 => + array ( + 'action' => 'eznode:115', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '94', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '94', + 'parent' => '89', + 'text' => 'graphics15', + 'text_md5' => '61e79c2eccea43ec347f4eee56414c33', + ), + 101 => + array ( + 'action' => 'eznode:114', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '93', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '93', + 'parent' => '89', + 'text' => 'graphics14', + 'text_md5' => '7d34fc6fcdf4f232bc665372e1ff1344', + ), + 102 => + array ( + 'action' => 'eznode:113', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '92', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '92', + 'parent' => '89', + 'text' => 'graphics13', + 'text_md5' => '8d654d2defb9d757fbb877b1193acdf3', + ), + 103 => + array ( + 'action' => 'eznode:111', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '90', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '90', + 'parent' => '89', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 104 => + array ( + 'action' => 'eznode:118', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '97', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '97', + 'parent' => '89', + 'text' => 'graphics18', + 'text_md5' => 'adde965cffe4369cc9ff607df18e0882', + ), + 105 => + array ( + 'action' => 'eznode:117', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '96', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '96', + 'parent' => '89', + 'text' => 'graphics17', + 'text_md5' => 'cb1d79b99e01b5ff38f5f4b59677c07b', + ), + 106 => + array ( + 'action' => 'eznode:116', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '95', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '95', + 'parent' => '89', + 'text' => 'graphics16', + 'text_md5' => 'e170fb75d04e8fa4dfe0c60d428a2b91', + ), + 107 => + array ( + 'action' => 'eznode:122', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '101', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '101', + 'parent' => '99', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 108 => + array ( + 'action' => 'eznode:125', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '104', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '104', + 'parent' => '99', + 'text' => 'graphics15', + 'text_md5' => '61e79c2eccea43ec347f4eee56414c33', + ), + 109 => + array ( + 'action' => 'eznode:124', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '103', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '103', + 'parent' => '99', + 'text' => 'graphics14', + 'text_md5' => '7d34fc6fcdf4f232bc665372e1ff1344', + ), + 110 => + array ( + 'action' => 'eznode:123', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '102', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '102', + 'parent' => '99', + 'text' => 'graphics13', + 'text_md5' => '8d654d2defb9d757fbb877b1193acdf3', + ), + 111 => + array ( + 'action' => 'eznode:121', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '100', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '100', + 'parent' => '99', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 112 => + array ( + 'action' => 'eznode:128', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '107', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '107', + 'parent' => '99', + 'text' => 'graphics18', + 'text_md5' => 'adde965cffe4369cc9ff607df18e0882', + ), + 113 => + array ( + 'action' => 'eznode:127', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '106', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '106', + 'parent' => '99', + 'text' => 'graphics17', + 'text_md5' => 'cb1d79b99e01b5ff38f5f4b59677c07b', + ), + 114 => + array ( + 'action' => 'eznode:126', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '105', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '105', + 'parent' => '99', + 'text' => 'graphics16', + 'text_md5' => 'e170fb75d04e8fa4dfe0c60d428a2b91', + ), + 115 => + array ( + 'action' => 'eznode:131', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '110', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '110', + 'parent' => '108', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 116 => + array ( + 'action' => 'eznode:130', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '109', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '109', + 'parent' => '108', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 117 => + array ( + 'action' => 'eznode:152', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '131', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '131', + 'parent' => '112', + 'text' => 'REST-API-interface', + 'text_md5' => '05406f782c81391b933b556551976751', + ), + 118 => + array ( + 'action' => 'eznode:141', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '120', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '120', + 'parent' => '112', + 'text' => 'Improved-front-end-editing', + 'text_md5' => '162d8a910c0bdab0dbdfa91db4c60ef1', + ), + 119 => + array ( + 'action' => 'eznode:147', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '126', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '126', + 'parent' => '112', + 'text' => 'Support-for-Red-Hat-Enterprise', + 'text_md5' => '5c6ef10ee72f5301f06ab5a0cbdfc076', + ), + 120 => + array ( + 'action' => 'eznode:134', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '113', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '113', + 'parent' => '112', + 'text' => 'Improved-user-registration-workflow', + 'text_md5' => '66d9f205b0114cb1887a9ec14261dde6', + ), + 121 => + array ( + 'action' => 'eznode:149', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '128', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '128', + 'parent' => '112', + 'text' => 'Canonical-links', + 'text_md5' => '702edfb315f8f40156a9e087caa3d70b', + ), + 122 => + array ( + 'action' => 'eznode:138', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '117', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '117', + 'parent' => '112', + 'text' => 'Improved-block-editing', + 'text_md5' => '7fa95991cf6654ba284c90dca4b3dc4f', + ), + 123 => + array ( + 'action' => 'eznode:150', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '129', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '129', + 'parent' => '112', + 'text' => 'Asynchronous-publishing', + 'text_md5' => 'a955fb2c57811983c70245c0a3d9a4d0', + ), + 124 => + array ( + 'action' => 'eznode:146', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '125', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '125', + 'parent' => '112', + 'text' => 'FastCGI', + 'text_md5' => 'c72255eccae15a9b03d2d53760de2fa7', + ), + 125 => + array ( + 'action' => 'eznode:136', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '115', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '115', + 'parent' => '113', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 126 => + array ( + 'action' => 'eznode:137', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '116', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '116', + 'parent' => '113', + 'text' => 'graphics13', + 'text_md5' => '8d654d2defb9d757fbb877b1193acdf3', + ), + 127 => + array ( + 'action' => 'eznode:135', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '114', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '114', + 'parent' => '113', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 128 => + array ( + 'action' => 'eznode:140', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '119', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '119', + 'parent' => '117', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 129 => + array ( + 'action' => 'eznode:139', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '118', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '118', + 'parent' => '117', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 130 => + array ( + 'action' => 'eznode:143', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '122', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '122', + 'parent' => '120', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 131 => + array ( + 'action' => 'eznode:145', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '124', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '124', + 'parent' => '120', + 'text' => 'graphics14', + 'text_md5' => '7d34fc6fcdf4f232bc665372e1ff1344', + ), + 132 => + array ( + 'action' => 'eznode:144', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '123', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '123', + 'parent' => '120', + 'text' => 'graphics13', + 'text_md5' => '8d654d2defb9d757fbb877b1193acdf3', + ), + 133 => + array ( + 'action' => 'eznode:142', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '121', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '121', + 'parent' => '120', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 134 => + array ( + 'action' => 'eznode:148', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '127', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '127', + 'parent' => '126', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 135 => + array ( + 'action' => 'eznode:151', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '130', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '130', + 'parent' => '129', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 136 => + array ( + 'action' => 'eznode:155', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '134', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '134', + 'parent' => '132', + 'text' => 'graphics12', + 'text_md5' => '12c91c552ca35a26e9b61118590d9e84', + ), + 137 => + array ( + 'action' => 'eznode:154', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '133', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '133', + 'parent' => '132', + 'text' => 'graphics1', + 'text_md5' => 'a2292a949e7f55352593c4c851d8ffc4', + ), + 138 => + array ( + 'action' => 'eznode:157', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '136', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '136', + 'parent' => '135', + 'text' => 'Partner-News', + 'text_md5' => '0215a5e6b42e71125fcfebca75c18d21', + ), + 139 => + array ( + 'action' => 'eznode:160', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '139', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '139', + 'parent' => '135', + 'text' => 'News', + 'text_md5' => '508c75c8507a2ae5223dfd2faeb98122', + ), + 140 => + array ( + 'action' => 'eznode:165', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '144', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '144', + 'parent' => '135', + 'text' => 'Partners', + 'text_md5' => '7896f8fa69398c56d86a65357615c41f', + ), + 141 => + array ( + 'action' => 'eznode:164', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '143', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '143', + 'parent' => '135', + 'text' => 'Partner-Products', + 'text_md5' => '9ccc278a27cc7fcd2b886cd89d330043', + ), + 142 => + array ( + 'action' => 'eznode:159', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '138', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '138', + 'parent' => '136', + 'text' => 'Penatibus-et-magnis-dis', + 'text_md5' => '4cecdf63e520236c70c7b823358153b3', + ), + 143 => + array ( + 'action' => 'eznode:158', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '137', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '137', + 'parent' => '136', + 'text' => 'Pellentesque-quam-mauris', + 'text_md5' => '691dd3560dfaae80b438379c36cd7062', + ), + 144 => + array ( + 'action' => 'eznode:161', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '140', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '140', + 'parent' => '139', + 'text' => 'Curabitur-hendrerit-dignissim', + 'text_md5' => '4a2c7ab79e28480f69b8316de5c858f7', + ), + 145 => + array ( + 'action' => 'eznode:163', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '142', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '142', + 'parent' => '139', + 'text' => 'Morbi-tristique-senectus', + 'text_md5' => 'cb7d4934a3bedc4ea1ee57a5003aad63', + ), + 146 => + array ( + 'action' => 'eznode:162', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '141', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '141', + 'parent' => '139', + 'text' => 'Proin-condimentum-risus', + 'text_md5' => 'd5236f4e435d2b2b0221ffcf4dd8af5d', + ), + 147 => + array ( + 'action' => 'eznode:166', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '145', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '145', + 'parent' => '144', + 'text' => 'Neque-orci-malesuada-felis', + 'text_md5' => 'f4275ba0934180a90e10837171a9684d', + ), + 148 => + array ( + 'action' => 'eznode:187', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '166', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '166', + 'parent' => '146', + 'text' => 'Blog', + 'text_md5' => '126ac9f6149081eb0e97c2e939eaad52', + ), + 149 => + array ( + 'action' => 'eznode:178', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '157', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '157', + 'parent' => '146', + 'text' => 'Pictures', + 'text_md5' => '9ed98e5c3e9685aa3de82c99009a2ed3', + ), + 150 => + array ( + 'action' => 'eznode:168', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '147', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '147', + 'parent' => '146', + 'text' => 'Forum', + 'text_md5' => 'bbdbe444288550204c968fe7002a97a9', + ), + 151 => + array ( + 'action' => 'eznode:172', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '151', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '151', + 'parent' => '146', + 'text' => 'Wiki', + 'text_md5' => 'd54b7ba27571a2f00b38ed9273b974f2', + ), + 152 => + array ( + 'action' => 'eznode:171', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '150', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '150', + 'parent' => '147', + 'text' => 'Nam-risus-leo', + 'text_md5' => '3ca6b1875c6b2d93cd1b6e291d2b4c8d', + ), + 153 => + array ( + 'action' => 'eznode:170', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '149', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '149', + 'parent' => '147', + 'text' => 'Ut-mollis-sodales-nibh', + 'text_md5' => '424e4418a2b90043b082cafd82ae671b', + ), + 154 => + array ( + 'action' => 'eznode:169', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '148', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '148', + 'parent' => '147', + 'text' => 'Nulla-vitae-tellus-sit-amet', + 'text_md5' => 'daa20bb9bf1f17980b6c883005a49d1b', + ), + 155 => + array ( + 'action' => 'eznode:173', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '152', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '152', + 'parent' => '151', + 'text' => 'Sed-suscipit', + 'text_md5' => 'c575fcd3c4f52e291be31001f0be746d', + ), + 156 => + array ( + 'action' => 'eznode:176', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '155', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '155', + 'parent' => '151', + 'text' => 'Duis-id-tortor', + 'text_md5' => 'cc08568a90b3a92dd0116e4ee25105ef', + ), + 157 => + array ( + 'action' => 'eznode:175', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '154', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '154', + 'parent' => '152', + 'text' => 'Fusce-pulvinar', + 'text_md5' => '22aa8bb4215ebcd0c451dab21790413c', + ), + 158 => + array ( + 'action' => 'eznode:174', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '153', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '153', + 'parent' => '152', + 'text' => 'Ut-interdum', + 'text_md5' => 'd660c96c943a7b209026a5299017e30e', + ), + 159 => + array ( + 'action' => 'eznode:177', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '156', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '156', + 'parent' => '155', + 'text' => 'Curabitur-lacinia', + 'text_md5' => '7499a1ef6e121c0d7d52bdda43cd9e45', + ), + 160 => + array ( + 'action' => 'eznode:181', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '160', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '160', + 'parent' => '157', + 'text' => 'Let-s-work-together', + 'text_md5' => '53deb339450445d345224a392280e085', + ), + 161 => + array ( + 'action' => 'eznode:180', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '159', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '159', + 'parent' => '157', + 'text' => 'Are-you-ready-for-the-Community-day', + 'text_md5' => '832a7b830654200a0b836662482c270a', + ), + 162 => + array ( + 'action' => 'eznode:179', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '158', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '158', + 'parent' => '157', + 'text' => 'Ivo-on-eZ-Tags', + 'text_md5' => '95906379fb2066053d63420a897a1892', + ), + 163 => + array ( + 'action' => 'eznode:184', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '163', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '163', + 'parent' => '157', + 'text' => 'Alexander-on-the-past-Gaby-on-today-and-tomorrow', + 'text_md5' => '9cf7d6bab251734151135ff0214fe99c', + ), + 164 => + array ( + 'action' => 'eznode:185', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '164', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '164', + 'parent' => '157', + 'text' => 'Isola2000-in-white-beautiful-skiing', + 'text_md5' => 'b6c0d784abca6dc4e4b4cc6e35dc60dc', + ), + 165 => + array ( + 'action' => 'eznode:183', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '162', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '162', + 'parent' => '157', + 'text' => 'Hotel-lobby-at-Isola2000', + 'text_md5' => 'bde59217cba54ee3baa00ebc52092825', + ), + 166 => + array ( + 'action' => 'eznode:186', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '165', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '165', + 'parent' => '157', + 'text' => 'CEO-future-pitch-Adaptable-open-reliable', + 'text_md5' => 'd8649e0099a57dbed42638f5a2b7c5b4', + ), + 167 => + array ( + 'action' => 'eznode:182', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '161', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '161', + 'parent' => '157', + 'text' => 'The-Mediterranean-seen-from-Nice', + 'text_md5' => 'ed8cc1fd98bdc458670fed7428d3c468', + ), + 168 => + array ( + 'action' => 'eznode:189', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '168', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '168', + 'parent' => '166', + 'text' => 'Paris-in-France', + 'text_md5' => '3a61a16628315f376d7c9bb297795165', + ), + 169 => + array ( + 'action' => 'eznode:188', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '167', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '167', + 'parent' => '166', + 'text' => 'Visit-Paris', + 'text_md5' => '86623f07ace1b667566e57179e710cb9', + ), + 170 => + array ( + 'action' => 'eznode:221', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '200', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '200', + 'parent' => '169', + 'text' => 'Events', + 'text_md5' => '16908b0605f2645dfcb4c3a8d248cef3', + ), + 171 => + array ( + 'action' => 'eznode:224', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '203', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '203', + 'parent' => '169', + 'text' => 'Contact', + 'text_md5' => '2f8a6bf31f3bd67bd2d9720c58b19c9a', + ), + 172 => + array ( + 'action' => 'eznode:191', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '170', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '170', + 'parent' => '169', + 'text' => 'About-company', + 'text_md5' => '3522da53efaed0dd76fd7b305f576cfb', + ), + 173 => + array ( + 'action' => 'eznode:222', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '201', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '201', + 'parent' => '169', + 'text' => 'Career', + 'text_md5' => '8ae1016c4044ea668c4db3f57e3cc7f1', + ), + 174 => + array ( + 'action' => 'eznode:223', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '202', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '202', + 'parent' => '169', + 'text' => 'Investors-Relation', + 'text_md5' => 'b59e7bae6b2d684aaf36a5eea42b96bc', + ), + 175 => + array ( + 'action' => 'eznode:226', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '205', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '205', + 'parent' => '169', + 'text' => 'Company-banner', + 'text_md5' => 'c814b0caf057217eabbebf0257254d74', + ), + 176 => + array ( + 'action' => 'eznode:192', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '171', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '171', + 'parent' => '169', + 'text' => 'New-features', + 'text_md5' => 'cc9126674839b9487fb129b5d0b0ad1e', + ), + 177 => + array ( + 'action' => 'eznode:216', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '195', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '195', + 'parent' => '171', + 'text' => 'REST-API-interface', + 'text_md5' => '05406f782c81391b933b556551976751', + ), + 178 => + array ( + 'action' => 'eznode:204', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '183', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '183', + 'parent' => '171', + 'text' => 'How-to-manage-eZ-Publish', + 'text_md5' => '38f227f027d9b66fa32a1b7fd09102b0', + ), + 179 => + array ( + 'action' => 'eznode:219', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '198', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '198', + 'parent' => '171', + 'text' => 'Support-for-Red-Hat-Enterprise', + 'text_md5' => '5c6ef10ee72f5301f06ab5a0cbdfc076', + ), + 180 => + array ( + 'action' => 'eznode:218', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '197', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '197', + 'parent' => '171', + 'text' => 'Canonical-links', + 'text_md5' => '702edfb315f8f40156a9e087caa3d70b', + ), + 181 => + array ( + 'action' => 'eznode:195', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '174', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '174', + 'parent' => '171', + 'text' => 'How-to-use-eZ-Publish', + 'text_md5' => '7bf161f3ad9b79be40262c807b42c901', + ), + 182 => + array ( + 'action' => 'eznode:193', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '172', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '172', + 'parent' => '171', + 'text' => 'Separate-content-design-in-eZ-Publish', + 'text_md5' => '8c4722f2f329953dd24c29b2263feb48', + ), + 183 => + array ( + 'action' => 'eznode:217', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '196', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '196', + 'parent' => '171', + 'text' => 'Asynchronous-Publishing', + 'text_md5' => 'a955fb2c57811983c70245c0a3d9a4d0', + ), + 184 => + array ( + 'action' => 'eznode:213', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '192', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '192', + 'parent' => '171', + 'text' => 'How-to-develop-with-eZ-Publish', + 'text_md5' => 'bca34b10b4bf19a49be18802a0cb873a', + ), + 185 => + array ( + 'action' => 'eznode:220', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '199', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '199', + 'parent' => '171', + 'text' => 'FastCGI', + 'text_md5' => 'c72255eccae15a9b03d2d53760de2fa7', + ), + 186 => + array ( + 'action' => 'eznode:194', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '173', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '173', + 'parent' => '172', + 'text' => 'separation_of_content_and_design', + 'text_md5' => '101d014887668de58fc149a3ad7c82c9', + ), + 187 => + array ( + 'action' => 'eznode:199', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '178', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '178', + 'parent' => '174', + 'text' => 'gallery_large', + 'text_md5' => '197af20370075364b622a710bb791288', + ), + 188 => + array ( + 'action' => 'eznode:198', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '177', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '177', + 'parent' => '174', + 'text' => 'multiupload_large', + 'text_md5' => '283883ad311e57ec0386781c96bb352e', + ), + 189 => + array ( + 'action' => 'eznode:196', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '175', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '175', + 'parent' => '174', + 'text' => 'openoffice_import_large', + 'text_md5' => '296cfc381c706263c6ad79ce895ab567', + ), + 190 => + array ( + 'action' => 'eznode:197', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '176', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '176', + 'parent' => '174', + 'text' => 'translation_large', + 'text_md5' => '2f99f321c70be620d161b20386d6772a', + ), + 191 => + array ( + 'action' => 'eznode:202', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '181', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '181', + 'parent' => '174', + 'text' => 'quicktime_large', + 'text_md5' => '937254370052868ceb452d03e8e83d84', + ), + 192 => + array ( + 'action' => 'eznode:201', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '180', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '180', + 'parent' => '174', + 'text' => 'ez_tool_bar_large', + 'text_md5' => 'bccc631aeedeba9c57537ea4a05b1911', + ), + 193 => + array ( + 'action' => 'eznode:200', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '179', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '179', + 'parent' => '174', + 'text' => 'search_result_large', + 'text_md5' => 'dd52082cc512a6346790ff6992e38003', + ), + 194 => + array ( + 'action' => 'eznode:203', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '182', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '182', + 'parent' => '174', + 'text' => 'web_2_0_large', + 'text_md5' => 'f632ebc4d67e6e35395cc7cad03d4e82', + ), + 195 => + array ( + 'action' => 'eznode:210', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '189', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '189', + 'parent' => '183', + 'text' => 'multisite_deployment_large', + 'text_md5' => '0e23a727a9bbdecf461a84dd4f89a2dc', + ), + 196 => + array ( + 'action' => 'eznode:208', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '187', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '187', + 'parent' => '183', + 'text' => 'datatypes_attributes_content_class_and_objects_large', + 'text_md5' => '218b46a5ceacdb38579282106118d53c', + ), + 197 => + array ( + 'action' => 'eznode:212', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '191', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '191', + 'parent' => '183', + 'text' => 'admin_site_large', + 'text_md5' => '348b0807e56dcbaa2f08ff55d58b323c', + ), + 198 => + array ( + 'action' => 'eznode:206', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '185', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '185', + 'parent' => '183', + 'text' => 'workflow_large', + 'text_md5' => '692f646043099af3df744ee744cb7881', + ), + 199 => + array ( + 'action' => 'eznode:209', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '188', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '188', + 'parent' => '183', + 'text' => 'multiple_location_large', + 'text_md5' => '823595d6b3415b9fda5d0043add57bb9', + ), + 200 => + array ( + 'action' => 'eznode:205', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '184', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '184', + 'parent' => '183', + 'text' => 'usermanagement_large', + 'text_md5' => 'a18dbeb8c0610d087f29b0903b4209b2', + ), + 201 => + array ( + 'action' => 'eznode:211', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '190', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '190', + 'parent' => '183', + 'text' => 'seo_large', + 'text_md5' => 'c2283065a63216b2f4519f3c8da68b9d', + ), + 202 => + array ( + 'action' => 'eznode:207', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '186', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '186', + 'parent' => '183', + 'text' => 'versioning_large', + 'text_md5' => 'fee4e75df49e4e5defbb98d782c81f38', + ), + 203 => + array ( + 'action' => 'eznode:214', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '193', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '193', + 'parent' => '192', + 'text' => 'datatypes_attributes_content_class_and_objects_large', + 'text_md5' => '218b46a5ceacdb38579282106118d53c', + ), + 204 => + array ( + 'action' => 'eznode:215', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '194', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '194', + 'parent' => '192', + 'text' => 'site_style_large', + 'text_md5' => 'e0a5c2e69103df51518b6c3406477c2e', + ), + 205 => + array ( + 'action' => 'eznode:225', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '204', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '204', + 'parent' => '203', + 'text' => 'Morbi-neque', + 'text_md5' => '5d2299d3dcaa5fd008cd77651e25d0cf', + ), + ), + 'ezurlalias_ml_incr' => + array ( + 0 => + array ( + 'id' => '1', + ), + 1 => + array ( + 'id' => '2', + ), + 2 => + array ( + 'id' => '3', + ), + 3 => + array ( + 'id' => '4', + ), + 4 => + array ( + 'id' => '5', + ), + 5 => + array ( + 'id' => '6', + ), + 6 => + array ( + 'id' => '7', + ), + 7 => + array ( + 'id' => '8', + ), + 8 => + array ( + 'id' => '9', + ), + 9 => + array ( + 'id' => '10', + ), + 10 => + array ( + 'id' => '11', + ), + 11 => + array ( + 'id' => '12', + ), + 12 => + array ( + 'id' => '13', + ), + 13 => + array ( + 'id' => '14', + ), + 14 => + array ( + 'id' => '15', + ), + 15 => + array ( + 'id' => '16', + ), + 16 => + array ( + 'id' => '17', + ), + 17 => + array ( + 'id' => '18', + ), + 18 => + array ( + 'id' => '19', + ), + 19 => + array ( + 'id' => '20', + ), + 20 => + array ( + 'id' => '21', + ), + 21 => + array ( + 'id' => '22', + ), + 22 => + array ( + 'id' => '24', + ), + 23 => + array ( + 'id' => '25', + ), + 24 => + array ( + 'id' => '26', + ), + 25 => + array ( + 'id' => '27', + ), + 26 => + array ( + 'id' => '28', + ), + 27 => + array ( + 'id' => '29', + ), + 28 => + array ( + 'id' => '30', + ), + 29 => + array ( + 'id' => '31', + ), + 30 => + array ( + 'id' => '32', + ), + 31 => + array ( + 'id' => '33', + ), + 32 => + array ( + 'id' => '34', + ), + 33 => + array ( + 'id' => '35', + ), + 34 => + array ( + 'id' => '36', + ), + 35 => + array ( + 'id' => '37', + ), + 36 => + array ( + 'id' => '38', + ), + 37 => + array ( + 'id' => '39', + ), + 38 => + array ( + 'id' => '40', + ), + 39 => + array ( + 'id' => '41', + ), + 40 => + array ( + 'id' => '42', + ), + 41 => + array ( + 'id' => '43', + ), + 42 => + array ( + 'id' => '44', + ), + 43 => + array ( + 'id' => '45', + ), + 44 => + array ( + 'id' => '46', + ), + 45 => + array ( + 'id' => '47', + ), + 46 => + array ( + 'id' => '48', + ), + 47 => + array ( + 'id' => '49', + ), + 48 => + array ( + 'id' => '50', + ), + 49 => + array ( + 'id' => '51', + ), + 50 => + array ( + 'id' => '52', + ), + 51 => + array ( + 'id' => '53', + ), + 52 => + array ( + 'id' => '54', + ), + 53 => + array ( + 'id' => '55', + ), + 54 => + array ( + 'id' => '56', + ), + 55 => + array ( + 'id' => '57', + ), + 56 => + array ( + 'id' => '58', + ), + 57 => + array ( + 'id' => '59', + ), + 58 => + array ( + 'id' => '60', + ), + 59 => + array ( + 'id' => '61', + ), + 60 => + array ( + 'id' => '62', + ), + 61 => + array ( + 'id' => '63', + ), + 62 => + array ( + 'id' => '64', + ), + 63 => + array ( + 'id' => '65', + ), + 64 => + array ( + 'id' => '66', + ), + 65 => + array ( + 'id' => '67', + ), + 66 => + array ( + 'id' => '68', + ), + 67 => + array ( + 'id' => '69', + ), + 68 => + array ( + 'id' => '70', + ), + 69 => + array ( + 'id' => '71', + ), + 70 => + array ( + 'id' => '72', + ), + 71 => + array ( + 'id' => '73', + ), + 72 => + array ( + 'id' => '74', + ), + 73 => + array ( + 'id' => '75', + ), + 74 => + array ( + 'id' => '76', + ), + 75 => + array ( + 'id' => '77', + ), + 76 => + array ( + 'id' => '78', + ), + 77 => + array ( + 'id' => '79', + ), + 78 => + array ( + 'id' => '80', + ), + 79 => + array ( + 'id' => '81', + ), + 80 => + array ( + 'id' => '82', + ), + 81 => + array ( + 'id' => '83', + ), + 82 => + array ( + 'id' => '84', + ), + 83 => + array ( + 'id' => '85', + ), + 84 => + array ( + 'id' => '86', + ), + 85 => + array ( + 'id' => '87', + ), + 86 => + array ( + 'id' => '88', + ), + 87 => + array ( + 'id' => '89', + ), + 88 => + array ( + 'id' => '90', + ), + 89 => + array ( + 'id' => '91', + ), + 90 => + array ( + 'id' => '92', + ), + 91 => + array ( + 'id' => '93', + ), + 92 => + array ( + 'id' => '94', + ), + 93 => + array ( + 'id' => '95', + ), + 94 => + array ( + 'id' => '96', + ), + 95 => + array ( + 'id' => '97', + ), + 96 => + array ( + 'id' => '98', + ), + 97 => + array ( + 'id' => '99', + ), + 98 => + array ( + 'id' => '100', + ), + 99 => + array ( + 'id' => '101', + ), + 100 => + array ( + 'id' => '102', + ), + 101 => + array ( + 'id' => '103', + ), + 102 => + array ( + 'id' => '104', + ), + 103 => + array ( + 'id' => '105', + ), + 104 => + array ( + 'id' => '106', + ), + 105 => + array ( + 'id' => '107', + ), + 106 => + array ( + 'id' => '108', + ), + 107 => + array ( + 'id' => '109', + ), + 108 => + array ( + 'id' => '110', + ), + 109 => + array ( + 'id' => '111', + ), + 110 => + array ( + 'id' => '112', + ), + 111 => + array ( + 'id' => '113', + ), + 112 => + array ( + 'id' => '114', + ), + 113 => + array ( + 'id' => '115', + ), + 114 => + array ( + 'id' => '116', + ), + 115 => + array ( + 'id' => '117', + ), + 116 => + array ( + 'id' => '118', + ), + 117 => + array ( + 'id' => '119', + ), + 118 => + array ( + 'id' => '120', + ), + 119 => + array ( + 'id' => '121', + ), + 120 => + array ( + 'id' => '122', + ), + 121 => + array ( + 'id' => '123', + ), + 122 => + array ( + 'id' => '124', + ), + 123 => + array ( + 'id' => '125', + ), + 124 => + array ( + 'id' => '126', + ), + 125 => + array ( + 'id' => '127', + ), + 126 => + array ( + 'id' => '128', + ), + 127 => + array ( + 'id' => '129', + ), + 128 => + array ( + 'id' => '130', + ), + 129 => + array ( + 'id' => '131', + ), + 130 => + array ( + 'id' => '132', + ), + 131 => + array ( + 'id' => '133', + ), + 132 => + array ( + 'id' => '134', + ), + 133 => + array ( + 'id' => '135', + ), + 134 => + array ( + 'id' => '136', + ), + 135 => + array ( + 'id' => '137', + ), + 136 => + array ( + 'id' => '138', + ), + 137 => + array ( + 'id' => '139', + ), + 138 => + array ( + 'id' => '140', + ), + 139 => + array ( + 'id' => '141', + ), + 140 => + array ( + 'id' => '142', + ), + 141 => + array ( + 'id' => '143', + ), + 142 => + array ( + 'id' => '144', + ), + 143 => + array ( + 'id' => '145', + ), + 144 => + array ( + 'id' => '146', + ), + 145 => + array ( + 'id' => '147', + ), + 146 => + array ( + 'id' => '148', + ), + 147 => + array ( + 'id' => '149', + ), + 148 => + array ( + 'id' => '150', + ), + 149 => + array ( + 'id' => '151', + ), + 150 => + array ( + 'id' => '152', + ), + 151 => + array ( + 'id' => '153', + ), + 152 => + array ( + 'id' => '154', + ), + 153 => + array ( + 'id' => '155', + ), + 154 => + array ( + 'id' => '156', + ), + 155 => + array ( + 'id' => '157', + ), + 156 => + array ( + 'id' => '158', + ), + 157 => + array ( + 'id' => '159', + ), + 158 => + array ( + 'id' => '160', + ), + 159 => + array ( + 'id' => '161', + ), + 160 => + array ( + 'id' => '162', + ), + 161 => + array ( + 'id' => '163', + ), + 162 => + array ( + 'id' => '164', + ), + 163 => + array ( + 'id' => '165', + ), + 164 => + array ( + 'id' => '166', + ), + 165 => + array ( + 'id' => '167', + ), + 166 => + array ( + 'id' => '168', + ), + 167 => + array ( + 'id' => '169', + ), + 168 => + array ( + 'id' => '170', + ), + 169 => + array ( + 'id' => '171', + ), + 170 => + array ( + 'id' => '172', + ), + 171 => + array ( + 'id' => '173', + ), + 172 => + array ( + 'id' => '174', + ), + 173 => + array ( + 'id' => '175', + ), + 174 => + array ( + 'id' => '176', + ), + 175 => + array ( + 'id' => '177', + ), + 176 => + array ( + 'id' => '178', + ), + 177 => + array ( + 'id' => '179', + ), + 178 => + array ( + 'id' => '180', + ), + 179 => + array ( + 'id' => '181', + ), + 180 => + array ( + 'id' => '182', + ), + 181 => + array ( + 'id' => '183', + ), + 182 => + array ( + 'id' => '184', + ), + 183 => + array ( + 'id' => '185', + ), + 184 => + array ( + 'id' => '186', + ), + 185 => + array ( + 'id' => '187', + ), + 186 => + array ( + 'id' => '188', + ), + 187 => + array ( + 'id' => '189', + ), + 188 => + array ( + 'id' => '190', + ), + 189 => + array ( + 'id' => '191', + ), + 190 => + array ( + 'id' => '192', + ), + 191 => + array ( + 'id' => '193', + ), + 192 => + array ( + 'id' => '194', + ), + 193 => + array ( + 'id' => '195', + ), + 194 => + array ( + 'id' => '196', + ), + 195 => + array ( + 'id' => '197', + ), + 196 => + array ( + 'id' => '198', + ), + 197 => + array ( + 'id' => '199', + ), + 198 => + array ( + 'id' => '200', + ), + 199 => + array ( + 'id' => '201', + ), + 200 => + array ( + 'id' => '202', + ), + 201 => + array ( + 'id' => '203', + ), + 202 => + array ( + 'id' => '204', + ), + 203 => + array ( + 'id' => '205', + ), + 204 => + array ( + 'id' => '206', + ), + 205 => + array ( + 'id' => '207', + ), + 206 => + array ( + 'id' => '208', + ), + ), + 'ezuser' => + array ( + 0 => + array ( + 'contentobject_id' => '10', + 'email' => 'nospam@ez.no', + 'login' => 'anonymous', + 'password_hash' => '4e6f6184135228ccd45f8233d72a0363', + 'password_hash_type' => '2', + ), + 1 => + array ( + 'contentobject_id' => '14', + 'email' => 'kn@ez.no', + 'login' => 'admin', + 'password_hash' => 'c78e3b0f3d9244ed8c6d1c29464bdff9', + 'password_hash_type' => '2', + ), + ), + 'ezuser_role' => + array ( + 0 => + array ( + 'contentobject_id' => '12', + 'id' => '25', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '2', + ), + 1 => + array ( + 'contentobject_id' => '11', + 'id' => '28', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 2 => + array ( + 'contentobject_id' => '42', + 'id' => '31', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 3 => + array ( + 'contentobject_id' => '13', + 'id' => '32', + 'limit_identifier' => 'Subtree', + 'limit_value' => '/1/2/', + 'role_id' => '3', + ), + 4 => + array ( + 'contentobject_id' => '13', + 'id' => '33', + 'limit_identifier' => 'Subtree', + 'limit_value' => '/1/43/', + 'role_id' => '3', + ), + 5 => + array ( + 'contentobject_id' => '11', + 'id' => '34', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + 6 => + array ( + 'contentobject_id' => '225', + 'id' => '35', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '4', + ), + 7 => + array ( + 'contentobject_id' => '225', + 'id' => '36', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + 8 => + array ( + 'contentobject_id' => '225', + 'id' => '37', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 9 => + array ( + 'contentobject_id' => '13', + 'id' => '38', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + ), + 'ezrole' => + array ( + 0 => + array ( + 'id' => '1', + 'is_new' => '0', + 'name' => 'Anonymous', + 'value' => '', + 'version' => '0', + ), + 1 => + array ( + 'id' => '2', + 'is_new' => '0', + 'name' => 'Administrator', + 'value' => '*', + 'version' => '0', + ), + 2 => + array ( + 'id' => '3', + 'is_new' => '0', + 'name' => 'Editor', + 'value' => '', + 'version' => '0', + ), + 3 => + array ( + 'id' => '4', + 'is_new' => '0', + 'name' => 'Partner', + 'value' => NULL, + 'version' => '0', + ), + 4 => + array ( + 'id' => '5', + 'is_new' => '0', + 'name' => 'Member', + 'value' => NULL, + 'version' => '0', + ), + ), + 'ezpolicy' => + array ( + 0 => + array ( + 'function_name' => '*', + 'id' => '308', + 'module_name' => '*', + 'original_id' => '0', + 'role_id' => '2', + ), + 1 => + array ( + 'function_name' => 'login', + 'id' => '319', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '3', + ), + 2 => + array ( + 'function_name' => 'read', + 'id' => '328', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 3 => + array ( + 'function_name' => 'pdf', + 'id' => '329', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 4 => + array ( + 'function_name' => '*', + 'id' => '330', + 'module_name' => 'ezoe', + 'original_id' => '0', + 'role_id' => '3', + ), + 5 => + array ( + 'function_name' => '*', + 'id' => '332', + 'module_name' => 'ezoe', + 'original_id' => '0', + 'role_id' => '3', + ), + 6 => + array ( + 'function_name' => 'feed', + 'id' => '333', + 'module_name' => 'rss', + 'original_id' => '0', + 'role_id' => '1', + ), + 7 => + array ( + 'function_name' => 'login', + 'id' => '334', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 8 => + array ( + 'function_name' => 'login', + 'id' => '335', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 9 => + array ( + 'function_name' => 'read', + 'id' => '336', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 10 => + array ( + 'function_name' => 'create', + 'id' => '337', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 11 => + array ( + 'function_name' => 'create', + 'id' => '338', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 12 => + array ( + 'function_name' => 'create', + 'id' => '339', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 13 => + array ( + 'function_name' => 'create', + 'id' => '340', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 14 => + array ( + 'function_name' => 'create', + 'id' => '341', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 15 => + array ( + 'function_name' => 'create', + 'id' => '342', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 16 => + array ( + 'function_name' => 'use', + 'id' => '343', + 'module_name' => 'websitetoolbar', + 'original_id' => '0', + 'role_id' => '3', + ), + 17 => + array ( + 'function_name' => 'edit', + 'id' => '344', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 18 => + array ( + 'function_name' => 'read', + 'id' => '345', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 19 => + array ( + 'function_name' => 'use', + 'id' => '346', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '3', + ), + 20 => + array ( + 'function_name' => 'manage_locations', + 'id' => '347', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 21 => + array ( + 'function_name' => '*', + 'id' => '348', + 'module_name' => 'ezodf', + 'original_id' => '0', + 'role_id' => '3', + ), + 22 => + array ( + 'function_name' => 'diff', + 'id' => '349', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 23 => + array ( + 'function_name' => 'versionread', + 'id' => '350', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 24 => + array ( + 'function_name' => 'versionremove', + 'id' => '351', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 25 => + array ( + 'function_name' => 'remove', + 'id' => '352', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 26 => + array ( + 'function_name' => 'translate', + 'id' => '353', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 27 => + array ( + 'function_name' => 'feed', + 'id' => '354', + 'module_name' => 'rss', + 'original_id' => '0', + 'role_id' => '3', + ), + 28 => + array ( + 'function_name' => 'bookmark', + 'id' => '355', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 29 => + array ( + 'function_name' => 'pendinglist', + 'id' => '356', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 30 => + array ( + 'function_name' => 'dashboard', + 'id' => '357', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 31 => + array ( + 'function_name' => 'view_embed', + 'id' => '358', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 32 => + array ( + 'function_name' => 'read', + 'id' => '359', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 33 => + array ( + 'function_name' => 'create', + 'id' => '360', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 34 => + array ( + 'function_name' => 'create', + 'id' => '361', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 35 => + array ( + 'function_name' => 'create', + 'id' => '362', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 36 => + array ( + 'function_name' => 'edit', + 'id' => '363', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 37 => + array ( + 'function_name' => 'selfedit', + 'id' => '364', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '4', + ), + 38 => + array ( + 'function_name' => 'use', + 'id' => '365', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '4', + ), + 39 => + array ( + 'function_name' => 'create', + 'id' => '366', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 40 => + array ( + 'function_name' => 'create', + 'id' => '367', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 41 => + array ( + 'function_name' => 'create', + 'id' => '368', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 42 => + array ( + 'function_name' => 'edit', + 'id' => '369', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 43 => + array ( + 'function_name' => 'selfedit', + 'id' => '370', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '5', + ), + 44 => + array ( + 'function_name' => 'use', + 'id' => '371', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '5', + ), + 45 => + array ( + 'function_name' => 'password', + 'id' => '372', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '5', + ), + 46 => + array ( + 'function_name' => 'call', + 'id' => '373', + 'module_name' => 'ezjscore', + 'original_id' => '0', + 'role_id' => '5', + ), + ), + 'ezpolicy_limitation' => + array ( + 0 => + array ( + 'id' => '251', + 'identifier' => 'Section', + 'policy_id' => '328', + ), + 1 => + array ( + 'id' => '252', + 'identifier' => 'Section', + 'policy_id' => '329', + ), + 2 => + array ( + 'id' => '254', + 'identifier' => 'SiteAccess', + 'policy_id' => '334', + ), + 3 => + array ( + 'id' => '255', + 'identifier' => 'SiteAccess', + 'policy_id' => '335', + ), + 4 => + array ( + 'id' => '256', + 'identifier' => 'Class', + 'policy_id' => '336', + ), + 5 => + array ( + 'id' => '257', + 'identifier' => 'Section', + 'policy_id' => '336', + ), + 6 => + array ( + 'id' => '258', + 'identifier' => 'Class', + 'policy_id' => '337', + ), + 7 => + array ( + 'id' => '259', + 'identifier' => 'ParentClass', + 'policy_id' => '337', + ), + 8 => + array ( + 'id' => '260', + 'identifier' => 'Class', + 'policy_id' => '338', + ), + 9 => + array ( + 'id' => '261', + 'identifier' => 'ParentClass', + 'policy_id' => '338', + ), + 10 => + array ( + 'id' => '262', + 'identifier' => 'Class', + 'policy_id' => '339', + ), + 11 => + array ( + 'id' => '263', + 'identifier' => 'ParentClass', + 'policy_id' => '339', + ), + 12 => + array ( + 'id' => '264', + 'identifier' => 'Class', + 'policy_id' => '340', + ), + 13 => + array ( + 'id' => '265', + 'identifier' => 'ParentClass', + 'policy_id' => '340', + ), + 14 => + array ( + 'id' => '266', + 'identifier' => 'Class', + 'policy_id' => '341', + ), + 15 => + array ( + 'id' => '267', + 'identifier' => 'ParentClass', + 'policy_id' => '341', + ), + 16 => + array ( + 'id' => '268', + 'identifier' => 'Class', + 'policy_id' => '342', + ), + 17 => + array ( + 'id' => '269', + 'identifier' => 'ParentClass', + 'policy_id' => '342', + ), + 18 => + array ( + 'id' => '270', + 'identifier' => 'Class', + 'policy_id' => '343', + ), + 19 => + array ( + 'id' => '271', + 'identifier' => 'Section', + 'policy_id' => '345', + ), + 20 => + array ( + 'id' => '272', + 'identifier' => 'Section', + 'policy_id' => '359', + ), + 21 => + array ( + 'id' => '273', + 'identifier' => 'Class', + 'policy_id' => '360', + ), + 22 => + array ( + 'id' => '274', + 'identifier' => 'Section', + 'policy_id' => '360', + ), + 23 => + array ( + 'id' => '275', + 'identifier' => 'ParentClass', + 'policy_id' => '360', + ), + 24 => + array ( + 'id' => '276', + 'identifier' => 'Class', + 'policy_id' => '361', + ), + 25 => + array ( + 'id' => '277', + 'identifier' => 'Section', + 'policy_id' => '361', + ), + 26 => + array ( + 'id' => '278', + 'identifier' => 'ParentClass', + 'policy_id' => '361', + ), + 27 => + array ( + 'id' => '279', + 'identifier' => 'Class', + 'policy_id' => '362', + ), + 28 => + array ( + 'id' => '280', + 'identifier' => 'Section', + 'policy_id' => '362', + ), + 29 => + array ( + 'id' => '281', + 'identifier' => 'ParentClass', + 'policy_id' => '362', + ), + 30 => + array ( + 'id' => '282', + 'identifier' => 'Class', + 'policy_id' => '363', + ), + 31 => + array ( + 'id' => '283', + 'identifier' => 'Section', + 'policy_id' => '363', + ), + 32 => + array ( + 'id' => '284', + 'identifier' => 'Owner', + 'policy_id' => '363', + ), + 33 => + array ( + 'id' => '285', + 'identifier' => 'Class', + 'policy_id' => '366', + ), + 34 => + array ( + 'id' => '286', + 'identifier' => 'Section', + 'policy_id' => '366', + ), + 35 => + array ( + 'id' => '287', + 'identifier' => 'ParentClass', + 'policy_id' => '366', + ), + 36 => + array ( + 'id' => '288', + 'identifier' => 'Class', + 'policy_id' => '367', + ), + 37 => + array ( + 'id' => '289', + 'identifier' => 'Section', + 'policy_id' => '367', + ), + 38 => + array ( + 'id' => '290', + 'identifier' => 'ParentClass', + 'policy_id' => '367', + ), + 39 => + array ( + 'id' => '291', + 'identifier' => 'Class', + 'policy_id' => '368', + ), + 40 => + array ( + 'id' => '292', + 'identifier' => 'Section', + 'policy_id' => '368', + ), + 41 => + array ( + 'id' => '293', + 'identifier' => 'ParentClass', + 'policy_id' => '368', + ), + 42 => + array ( + 'id' => '294', + 'identifier' => 'Class', + 'policy_id' => '369', + ), + 43 => + array ( + 'id' => '295', + 'identifier' => 'Section', + 'policy_id' => '369', + ), + 44 => + array ( + 'id' => '296', + 'identifier' => 'Owner', + 'policy_id' => '369', + ), + ), + 'ezpolicy_limitation_value' => + array ( + 0 => + array ( + 'id' => '477', + 'limitation_id' => '251', + 'value' => '1', + ), + 1 => + array ( + 'id' => '478', + 'limitation_id' => '252', + 'value' => '1', + ), + 2 => + array ( + 'id' => '480', + 'limitation_id' => '254', + 'value' => '834359697', + ), + 3 => + array ( + 'id' => '481', + 'limitation_id' => '255', + 'value' => '2582995467', + ), + 4 => + array ( + 'id' => '482', + 'limitation_id' => '256', + 'value' => '30', + ), + 5 => + array ( + 'id' => '483', + 'limitation_id' => '256', + 'value' => '42', + ), + 6 => + array ( + 'id' => '484', + 'limitation_id' => '256', + 'value' => '29', + ), + 7 => + array ( + 'id' => '485', + 'limitation_id' => '256', + 'value' => '34', + ), + 8 => + array ( + 'id' => '486', + 'limitation_id' => '256', + 'value' => '33', + ), + 9 => + array ( + 'id' => '487', + 'limitation_id' => '256', + 'value' => '32', + ), + 10 => + array ( + 'id' => '488', + 'limitation_id' => '257', + 'value' => '3', + ), + 11 => + array ( + 'id' => '489', + 'limitation_id' => '258', + 'value' => '1', + ), + 12 => + array ( + 'id' => '490', + 'limitation_id' => '258', + 'value' => '31', + ), + 13 => + array ( + 'id' => '491', + 'limitation_id' => '258', + 'value' => '28', + ), + 14 => + array ( + 'id' => '492', + 'limitation_id' => '258', + 'value' => '21', + ), + 15 => + array ( + 'id' => '493', + 'limitation_id' => '258', + 'value' => '22', + ), + 16 => + array ( + 'id' => '494', + 'limitation_id' => '258', + 'value' => '23', + ), + 17 => + array ( + 'id' => '495', + 'limitation_id' => '258', + 'value' => '16', + ), + 18 => + array ( + 'id' => '496', + 'limitation_id' => '258', + 'value' => '17', + ), + 19 => + array ( + 'id' => '497', + 'limitation_id' => '258', + 'value' => '18', + ), + 20 => + array ( + 'id' => '498', + 'limitation_id' => '258', + 'value' => '19', + ), + 21 => + array ( + 'id' => '499', + 'limitation_id' => '258', + 'value' => '27', + ), + 22 => + array ( + 'id' => '500', + 'limitation_id' => '258', + 'value' => '26', + ), + 23 => + array ( + 'id' => '501', + 'limitation_id' => '258', + 'value' => '24', + ), + 24 => + array ( + 'id' => '502', + 'limitation_id' => '258', + 'value' => '25', + ), + 25 => + array ( + 'id' => '503', + 'limitation_id' => '258', + 'value' => '29', + ), + 26 => + array ( + 'id' => '504', + 'limitation_id' => '258', + 'value' => '32', + ), + 27 => + array ( + 'id' => '505', + 'limitation_id' => '258', + 'value' => '33', + ), + 28 => + array ( + 'id' => '506', + 'limitation_id' => '258', + 'value' => '34', + ), + 29 => + array ( + 'id' => '507', + 'limitation_id' => '258', + 'value' => '35', + ), + 30 => + array ( + 'id' => '508', + 'limitation_id' => '258', + 'value' => '37', + ), + 31 => + array ( + 'id' => '509', + 'limitation_id' => '258', + 'value' => '43', + ), + 32 => + array ( + 'id' => '510', + 'limitation_id' => '258', + 'value' => '41', + ), + 33 => + array ( + 'id' => '511', + 'limitation_id' => '258', + 'value' => '42', + ), + 34 => + array ( + 'id' => '512', + 'limitation_id' => '258', + 'value' => '30', + ), + 35 => + array ( + 'id' => '513', + 'limitation_id' => '259', + 'value' => '1', + ), + 36 => + array ( + 'id' => '514', + 'limitation_id' => '260', + 'value' => '20', + ), + 37 => + array ( + 'id' => '515', + 'limitation_id' => '261', + 'value' => '19', + ), + 38 => + array ( + 'id' => '516', + 'limitation_id' => '262', + 'value' => '38', + ), + 39 => + array ( + 'id' => '517', + 'limitation_id' => '263', + 'value' => '37', + ), + 40 => + array ( + 'id' => '518', + 'limitation_id' => '264', + 'value' => '40', + ), + 41 => + array ( + 'id' => '519', + 'limitation_id' => '265', + 'value' => '41', + ), + 42 => + array ( + 'id' => '520', + 'limitation_id' => '266', + 'value' => '30', + ), + 43 => + array ( + 'id' => '521', + 'limitation_id' => '267', + 'value' => '35', + ), + 44 => + array ( + 'id' => '522', + 'limitation_id' => '268', + 'value' => '1', + ), + 45 => + array ( + 'id' => '523', + 'limitation_id' => '268', + 'value' => '31', + ), + 46 => + array ( + 'id' => '524', + 'limitation_id' => '268', + 'value' => '22', + ), + 47 => + array ( + 'id' => '525', + 'limitation_id' => '268', + 'value' => '23', + ), + 48 => + array ( + 'id' => '526', + 'limitation_id' => '268', + 'value' => '24', + ), + 49 => + array ( + 'id' => '527', + 'limitation_id' => '268', + 'value' => '35', + ), + 50 => + array ( + 'id' => '528', + 'limitation_id' => '268', + 'value' => '41', + ), + 51 => + array ( + 'id' => '529', + 'limitation_id' => '268', + 'value' => '26', + ), + 52 => + array ( + 'id' => '530', + 'limitation_id' => '268', + 'value' => '43', + ), + 53 => + array ( + 'id' => '531', + 'limitation_id' => '269', + 'value' => '23', + ), + 54 => + array ( + 'id' => '532', + 'limitation_id' => '270', + 'value' => '1', + ), + 55 => + array ( + 'id' => '533', + 'limitation_id' => '270', + 'value' => '31', + ), + 56 => + array ( + 'id' => '534', + 'limitation_id' => '270', + 'value' => '16', + ), + 57 => + array ( + 'id' => '535', + 'limitation_id' => '270', + 'value' => '17', + ), + 58 => + array ( + 'id' => '536', + 'limitation_id' => '270', + 'value' => '18', + ), + 59 => + array ( + 'id' => '537', + 'limitation_id' => '270', + 'value' => '19', + ), + 60 => + array ( + 'id' => '538', + 'limitation_id' => '270', + 'value' => '20', + ), + 61 => + array ( + 'id' => '539', + 'limitation_id' => '270', + 'value' => '21', + ), + 62 => + array ( + 'id' => '540', + 'limitation_id' => '270', + 'value' => '22', + ), + 63 => + array ( + 'id' => '541', + 'limitation_id' => '270', + 'value' => '23', + ), + 64 => + array ( + 'id' => '542', + 'limitation_id' => '270', + 'value' => '24', + ), + 65 => + array ( + 'id' => '543', + 'limitation_id' => '270', + 'value' => '26', + ), + 66 => + array ( + 'id' => '544', + 'limitation_id' => '270', + 'value' => '27', + ), + 67 => + array ( + 'id' => '545', + 'limitation_id' => '270', + 'value' => '28', + ), + 68 => + array ( + 'id' => '546', + 'limitation_id' => '270', + 'value' => '29', + ), + 69 => + array ( + 'id' => '547', + 'limitation_id' => '270', + 'value' => '30', + ), + 70 => + array ( + 'id' => '548', + 'limitation_id' => '270', + 'value' => '32', + ), + 71 => + array ( + 'id' => '549', + 'limitation_id' => '270', + 'value' => '33', + ), + 72 => + array ( + 'id' => '550', + 'limitation_id' => '270', + 'value' => '34', + ), + 73 => + array ( + 'id' => '551', + 'limitation_id' => '270', + 'value' => '35', + ), + 74 => + array ( + 'id' => '552', + 'limitation_id' => '270', + 'value' => '37', + ), + 75 => + array ( + 'id' => '553', + 'limitation_id' => '270', + 'value' => '40', + ), + 76 => + array ( + 'id' => '554', + 'limitation_id' => '270', + 'value' => '41', + ), + 77 => + array ( + 'id' => '555', + 'limitation_id' => '270', + 'value' => '43', + ), + 78 => + array ( + 'id' => '556', + 'limitation_id' => '271', + 'value' => '1', + ), + 79 => + array ( + 'id' => '557', + 'limitation_id' => '271', + 'value' => '6', + ), + 80 => + array ( + 'id' => '558', + 'limitation_id' => '271', + 'value' => '3', + ), + 81 => + array ( + 'id' => '559', + 'limitation_id' => '272', + 'value' => '6', + ), + 82 => + array ( + 'id' => '560', + 'limitation_id' => '273', + 'value' => '38', + ), + 83 => + array ( + 'id' => '561', + 'limitation_id' => '274', + 'value' => '6', + ), + 84 => + array ( + 'id' => '562', + 'limitation_id' => '275', + 'value' => '37', + ), + 85 => + array ( + 'id' => '563', + 'limitation_id' => '276', + 'value' => '39', + ), + 86 => + array ( + 'id' => '564', + 'limitation_id' => '277', + 'value' => '6', + ), + 87 => + array ( + 'id' => '565', + 'limitation_id' => '278', + 'value' => '38', + ), + 88 => + array ( + 'id' => '566', + 'limitation_id' => '279', + 'value' => '13', + ), + 89 => + array ( + 'id' => '567', + 'limitation_id' => '280', + 'value' => '6', + ), + 90 => + array ( + 'id' => '568', + 'limitation_id' => '281', + 'value' => '16', + ), + 91 => + array ( + 'id' => '569', + 'limitation_id' => '282', + 'value' => '13', + ), + 92 => + array ( + 'id' => '570', + 'limitation_id' => '282', + 'value' => '38', + ), + 93 => + array ( + 'id' => '571', + 'limitation_id' => '282', + 'value' => '39', + ), + 94 => + array ( + 'id' => '572', + 'limitation_id' => '283', + 'value' => '6', + ), + 95 => + array ( + 'id' => '573', + 'limitation_id' => '284', + 'value' => '1', + ), + 96 => + array ( + 'id' => '574', + 'limitation_id' => '285', + 'value' => '38', + ), + 97 => + array ( + 'id' => '575', + 'limitation_id' => '286', + 'value' => '1', + ), + 98 => + array ( + 'id' => '576', + 'limitation_id' => '287', + 'value' => '37', + ), + 99 => + array ( + 'id' => '577', + 'limitation_id' => '288', + 'value' => '39', + ), + 100 => + array ( + 'id' => '578', + 'limitation_id' => '289', + 'value' => '1', + ), + 101 => + array ( + 'id' => '579', + 'limitation_id' => '290', + 'value' => '38', + ), + 102 => + array ( + 'id' => '580', + 'limitation_id' => '291', + 'value' => '13', + ), + 103 => + array ( + 'id' => '581', + 'limitation_id' => '292', + 'value' => '1', + ), + 104 => + array ( + 'id' => '582', + 'limitation_id' => '293', + 'value' => '16', + ), + 105 => + array ( + 'id' => '583', + 'limitation_id' => '293', + 'value' => '20', + ), + 106 => + array ( + 'id' => '584', + 'limitation_id' => '293', + 'value' => '17', + ), + 107 => + array ( + 'id' => '585', + 'limitation_id' => '294', + 'value' => '13', + ), + 108 => + array ( + 'id' => '586', + 'limitation_id' => '294', + 'value' => '38', + ), + 109 => + array ( + 'id' => '587', + 'limitation_id' => '294', + 'value' => '39', + ), + 110 => + array ( + 'id' => '588', + 'limitation_id' => '295', + 'value' => '1', + ), + 111 => + array ( + 'id' => '589', + 'limitation_id' => '296', + 'value' => '1', + ), + ), + 'ezsection' => + array ( + 0 => + array ( + 'id' => '1', + 'identifier' => 'standard', + 'locale' => '', + 'name' => 'Standard', + 'navigation_part_identifier' => 'ezcontentnavigationpart', + ), + 1 => + array ( + 'id' => '2', + 'identifier' => 'users', + 'locale' => '', + 'name' => 'Users', + 'navigation_part_identifier' => 'ezusernavigationpart', + ), + 2 => + array ( + 'id' => '3', + 'identifier' => 'media', + 'locale' => '', + 'name' => 'Media', + 'navigation_part_identifier' => 'ezmedianavigationpart', + ), + 3 => + array ( + 'id' => '4', + 'identifier' => 'setup', + 'locale' => '', + 'name' => 'Setup', + 'navigation_part_identifier' => 'ezsetupnavigationpart', + ), + 4 => + array ( + 'id' => '5', + 'identifier' => 'design', + 'locale' => '', + 'name' => 'Design', + 'navigation_part_identifier' => 'ezvisualnavigationpart', + ), + 5 => + array ( + 'id' => '6', + 'identifier' => 'protected', + 'locale' => '', + 'name' => 'Protected', + 'navigation_part_identifier' => 'ezcontentnavigationpart', + ), + ), + 'ezuser_setting' => + array ( + 0 => + array ( + 'is_enabled' => '1', + 'max_login' => '1000', + 'user_id' => '10', + ), + 1 => + array ( + 'is_enabled' => '1', + 'max_login' => '10', + 'user_id' => '14', + ), + ), + 'ezsearch_word' => + array ( + 0 => + array ( + 'id' => '801', + 'object_count' => '22', + 'word' => 'to', + ), + 1 => + array ( + 'id' => '802', + 'object_count' => '21', + 'word' => 'ez', + ), + 2 => + array ( + 'id' => '803', + 'object_count' => '20', + 'word' => 'publish', + ), + 3 => + array ( + 'id' => '804', + 'object_count' => '11', + 'word' => 'this', + ), + 4 => + array ( + 'id' => '805', + 'object_count' => '18', + 'word' => 'is', + ), + 5 => + array ( + 'id' => '807', + 'object_count' => '9', + 'word' => 'site', + ), + 6 => + array ( + 'id' => '809', + 'object_count' => '15', + 'word' => 'with', + ), + 7 => + array ( + 'id' => '810', + 'object_count' => '40', + 'word' => 'a', + ), + 8 => + array ( + 'id' => '812', + 'object_count' => '2', + 'word' => 'setup', + ), + 9 => + array ( + 'id' => '813', + 'object_count' => '19', + 'word' => 'of', + ), + 10 => + array ( + 'id' => '814', + 'object_count' => '26', + 'word' => 'the', + ), + 11 => + array ( + 'id' => '815', + 'object_count' => '8', + 'word' => 'functionality', + ), + 12 => + array ( + 'id' => '816', + 'object_count' => '24', + 'word' => 'for', + ), + 13 => + array ( + 'id' => '817', + 'object_count' => '2', + 'word' => 'full', + ), + 14 => + array ( + 'id' => '819', + 'object_count' => '1', + 'word' => 'please', + ), + 15 => + array ( + 'id' => '821', + 'object_count' => '6', + 'word' => 'website', + ), + 16 => + array ( + 'id' => '822', + 'object_count' => '9', + 'word' => 'interface', + ), + 17 => + array ( + 'id' => '823', + 'object_count' => '14', + 'word' => 'or', + ), + 18 => + array ( + 'id' => '824', + 'object_count' => '3', + 'word' => 'flow', + ), + 19 => + array ( + 'id' => '825', + 'object_count' => '44', + 'word' => 'at', + ), + 20 => + array ( + 'id' => '826', + 'object_count' => '5', + 'word' => 'installation', + ), + 21 => + array ( + 'id' => '827', + 'object_count' => '1', + 'word' => 'popular', + ), + 22 => + array ( + 'id' => '828', + 'object_count' => '6', + 'word' => 'open', + ), + 23 => + array ( + 'id' => '829', + 'object_count' => '4', + 'word' => 'source', + ), + 24 => + array ( + 'id' => '830', + 'object_count' => '15', + 'word' => 'content', + ), + 25 => + array ( + 'id' => '831', + 'object_count' => '8', + 'word' => 'management', + ), + 26 => + array ( + 'id' => '832', + 'object_count' => '8', + 'word' => 'system', + ), + 27 => + array ( + 'id' => '833', + 'object_count' => '22', + 'word' => 'and', + ), + 28 => + array ( + 'id' => '834', + 'object_count' => '7', + 'word' => 'development', + ), + 29 => + array ( + 'id' => '835', + 'object_count' => '1', + 'word' => 'framework', + ), + 30 => + array ( + 'id' => '836', + 'object_count' => '9', + 'word' => 'it', + ), + 31 => + array ( + 'id' => '837', + 'object_count' => '2', + 'word' => 'allows', + ), + 32 => + array ( + 'id' => '838', + 'object_count' => '1', + 'word' => 'professional', + ), + 33 => + array ( + 'id' => '839', + 'object_count' => '1', + 'word' => 'customized', + ), + 34 => + array ( + 'id' => '841', + 'object_count' => '11', + 'word' => 'web', + ), + 35 => + array ( + 'id' => '842', + 'object_count' => '2', + 'word' => 'solutions', + ), + 36 => + array ( + 'id' => '843', + 'object_count' => '17', + 'word' => 'can', + ), + 37 => + array ( + 'id' => '844', + 'object_count' => '12', + 'word' => 'be', + ), + 38 => + array ( + 'id' => '845', + 'object_count' => '5', + 'word' => 'used', + ), + 39 => + array ( + 'id' => '846', + 'object_count' => '5', + 'word' => 'build', + ), + 40 => + array ( + 'id' => '847', + 'object_count' => '1', + 'word' => 'anything', + ), + 41 => + array ( + 'id' => '848', + 'object_count' => '7', + 'word' => 'from', + ), + 42 => + array ( + 'id' => '850', + 'object_count' => '1', + 'word' => 'homepage', + ), + 43 => + array ( + 'id' => '853', + 'object_count' => '3', + 'word' => 'role', + ), + 44 => + array ( + 'id' => '854', + 'object_count' => '7', + 'word' => 'based', + ), + 45 => + array ( + 'id' => '856', + 'object_count' => '6', + 'word' => 'access', + ), + 46 => + array ( + 'id' => '857', + 'object_count' => '5', + 'word' => 'online', + ), + 47 => + array ( + 'id' => '858', + 'object_count' => '1', + 'word' => 'shopping', + ), + 48 => + array ( + 'id' => '860', + 'object_count' => '6', + 'word' => 'forums', + ), + 49 => + array ( + 'id' => '861', + 'object_count' => '4', + 'word' => 'other', + ), + 50 => + array ( + 'id' => '862', + 'object_count' => '3', + 'word' => 'advanced', + ), + 51 => + array ( + 'id' => '863', + 'object_count' => '53', + 'word' => 'in', + ), + 52 => + array ( + 'id' => '864', + 'object_count' => '1', + 'word' => 'addition', + ), + 53 => + array ( + 'id' => '865', + 'object_count' => '1', + 'word' => 'because', + ), + 54 => + array ( + 'id' => '866', + 'object_count' => '1', + 'word' => 'its', + ), + 55 => + array ( + 'id' => '867', + 'object_count' => '1', + 'word' => 'nature', + ), + 56 => + array ( + 'id' => '868', + 'object_count' => '3', + 'word' => 'easily', + ), + 57 => + array ( + 'id' => '870', + 'object_count' => '9', + 'word' => 'into', + ), + 58 => + array ( + 'id' => '873', + 'object_count' => '1', + 'word' => 'existing', + ), + 59 => + array ( + 'id' => '874', + 'object_count' => '6', + 'word' => 'documentation', + ), + 60 => + array ( + 'id' => '877', + 'object_count' => '2', + 'word' => 'common', + ), + 61 => + array ( + 'id' => '878', + 'object_count' => '2', + 'word' => 'topics', + ), + 62 => + array ( + 'id' => '880', + 'object_count' => '1', + 'word' => 'daily', + ), + 63 => + array ( + 'id' => '881', + 'object_count' => '15', + 'word' => 'use', + ), + 64 => + array ( + 'id' => '882', + 'object_count' => '9', + 'word' => 'also', + ), + 65 => + array ( + 'id' => '883', + 'object_count' => '2', + 'word' => 'some', + ), + 66 => + array ( + 'id' => '884', + 'object_count' => '1', + 'word' => 'people', + ), + 67 => + array ( + 'id' => '885', + 'object_count' => '2', + 'word' => 'who', + ), + 68 => + array ( + 'id' => '886', + 'object_count' => '11', + 'word' => 'are', + ), + 69 => + array ( + 'id' => '888', + 'object_count' => '3', + 'word' => 'should', + ), + 70 => + array ( + 'id' => '890', + 'object_count' => '5', + 'word' => 'read', + ), + 71 => + array ( + 'id' => '893', + 'object_count' => '8', + 'word' => 'if', + ), + 72 => + array ( + 'id' => '894', + 'object_count' => '18', + 'word' => 'you', + ), + 73 => + array ( + 'id' => '895', + 'object_count' => '8', + 'word' => 're', + ), + 74 => + array ( + 'id' => '897', + 'object_count' => '6', + 'word' => 'find', + ), + 75 => + array ( + 'id' => '898', + 'object_count' => '14', + 'word' => 'an', + ), + 76 => + array ( + 'id' => '899', + 'object_count' => '1', + 'word' => 'answer', + ), + 77 => + array ( + 'id' => '900', + 'object_count' => '1', + 'word' => 'solution', + ), + 78 => + array ( + 'id' => '901', + 'object_count' => '7', + 'word' => 'specific', + ), + 79 => + array ( + 'id' => '902', + 'object_count' => '1', + 'word' => 'question', + ), + 80 => + array ( + 'id' => '903', + 'object_count' => '1', + 'word' => 'problem', + ), + 81 => + array ( + 'id' => '904', + 'object_count' => '3', + 'word' => 'within', + ), + 82 => + array ( + 'id' => '905', + 'object_count' => '3', + 'word' => 'pages', + ), + 83 => + array ( + 'id' => '906', + 'object_count' => '9', + 'word' => 'make', + ), + 84 => + array ( + 'id' => '907', + 'object_count' => '1', + 'word' => 'official', + ), + 85 => + array ( + 'id' => '908', + 'object_count' => '3', + 'word' => 'forum', + ), + 86 => + array ( + 'id' => '909', + 'object_count' => '1', + 'word' => 'need', + ), + 87 => + array ( + 'id' => '910', + 'object_count' => '5', + 'word' => 'help', + ), + 88 => + array ( + 'id' => '912', + 'object_count' => '7', + 'word' => 'support', + ), + 89 => + array ( + 'id' => '913', + 'object_count' => '1', + 'word' => 'consulting', + ), + 90 => + array ( + 'id' => '914', + 'object_count' => '3', + 'word' => 'services', + ), + 91 => + array ( + 'id' => '915', + 'object_count' => '3', + 'word' => 'possible', + ), + 92 => + array ( + 'id' => '916', + 'object_count' => '1', + 'word' => 'sign', + ), + 93 => + array ( + 'id' => '917', + 'object_count' => '6', + 'word' => 'up', + ), + 94 => + array ( + 'id' => '918', + 'object_count' => '2', + 'word' => 'various', + ), + 95 => + array ( + 'id' => '919', + 'object_count' => '2', + 'word' => 'training', + ), + 96 => + array ( + 'id' => '921', + 'object_count' => '15', + 'word' => 'more', + ), + 97 => + array ( + 'id' => '922', + 'object_count' => '4', + 'word' => 'information', + ), + 98 => + array ( + 'id' => '923', + 'object_count' => '5', + 'word' => 'about', + ), + 99 => + array ( + 'id' => '924', + 'object_count' => '5', + 'word' => 'products', + ), + 100 => + array ( + 'id' => '925', + 'object_count' => '2', + 'word' => 'systems', + ), + 101 => + array ( + 'id' => '926', + 'object_count' => '3', + 'word' => 'visit', + ), + 102 => + array ( + 'id' => '927', + 'object_count' => '3', + 'word' => 'ez.no', + ), + 103 => + array ( + 'id' => '928', + 'object_count' => '3', + 'word' => 'tutorials', + ), + 104 => + array ( + 'id' => '929', + 'object_count' => '12', + 'word' => 'new', + ), + 105 => + array ( + 'id' => '930', + 'object_count' => '9', + 'word' => 'users', + ), + 106 => + array ( + 'id' => '931', + 'object_count' => '6', + 'word' => 'administration', + ), + 107 => + array ( + 'id' => '932', + 'object_count' => '7', + 'word' => 'editor', + ), + 108 => + array ( + 'id' => '933', + 'object_count' => '3', + 'word' => 'video', + ), + 109 => + array ( + 'id' => '934', + 'object_count' => '3', + 'word' => 'tutorial', + ), + 110 => + array ( + 'id' => '935', + 'object_count' => '1', + 'word' => 'experienced', + ), + 111 => + array ( + 'id' => '936', + 'object_count' => '11', + 'word' => 'how', + ), + 112 => + array ( + 'id' => '937', + 'object_count' => '4', + 'word' => 'develop', + ), + 113 => + array ( + 'id' => '938', + 'object_count' => '6', + 'word' => 'extensions', + ), + 114 => + array ( + 'id' => '939', + 'object_count' => '12', + 'word' => 'create', + ), + 115 => + array ( + 'id' => '940', + 'object_count' => '5', + 'word' => 'custom', + ), + 116 => + array ( + 'id' => '941', + 'object_count' => '7', + 'word' => 'workflow', + ), + 117 => + array ( + 'id' => '942', + 'object_count' => '4', + 'word' => 'rest', + ), + 118 => + array ( + 'id' => '943', + 'object_count' => '9', + 'word' => 'api', + ), + 119 => + array ( + 'id' => '944', + 'object_count' => '3', + 'word' => 'asynchronous', + ), + 120 => + array ( + 'id' => '945', + 'object_count' => '10', + 'word' => 'publishing', + ), + 121 => + array ( + 'id' => '946', + 'object_count' => '1', + 'word' => 'upgrading', + ), + 122 => + array ( + 'id' => '947', + 'object_count' => '4', + 'word' => '4.5', + ), + 123 => + array ( + 'id' => '948', + 'object_count' => '17', + 'word' => 'amp', + ), + 124 => + array ( + 'id' => '949', + 'object_count' => '16', + 'word' => 'nbsp', + ), + 125 => + array ( + 'id' => '950', + 'object_count' => '3', + 'word' => 'videos', + ), + 126 => + array ( + 'id' => '951', + 'object_count' => '2', + 'word' => 'main', + ), + 127 => + array ( + 'id' => '952', + 'object_count' => '4', + 'word' => 'group', + ), + 128 => + array ( + 'id' => '953', + 'object_count' => '2', + 'word' => 'anonymous', + ), + 129 => + array ( + 'id' => '954', + 'object_count' => '8', + 'word' => 'user', + ), + 130 => + array ( + 'id' => '955', + 'object_count' => '1', + 'word' => 'nospam', + ), + 131 => + array ( + 'id' => '958', + 'object_count' => '3', + 'word' => 'administrator', + ), + 132 => + array ( + 'id' => '959', + 'object_count' => '5', + 'word' => 'editors', + ), + 133 => + array ( + 'id' => '961', + 'object_count' => '5', + 'word' => 'media', + ), + 134 => + array ( + 'id' => '962', + 'object_count' => '5', + 'word' => 'images', + ), + 135 => + array ( + 'id' => '963', + 'object_count' => '4', + 'word' => 'files', + ), + 136 => + array ( + 'id' => '964', + 'object_count' => '1', + 'word' => 'multimedia', + ), + 137 => + array ( + 'id' => '965', + 'object_count' => '1', + 'word' => 'ini', + ), + 138 => + array ( + 'id' => '966', + 'object_count' => '1', + 'word' => 'settings', + ), + 139 => + array ( + 'id' => '967', + 'object_count' => '1', + 'word' => 'sitestyle_identifier', + ), + 140 => + array ( + 'id' => '968', + 'object_count' => '8', + 'word' => 'design', + ), + 141 => + array ( + 'id' => '969', + 'object_count' => '1', + 'word' => 'banners', + ), + 142 => + array ( + 'id' => '970', + 'object_count' => '2', + 'word' => 'home', + ), + 143 => + array ( + 'id' => '971', + 'object_count' => '3', + 'word' => 'technical', + ), + 144 => + array ( + 'id' => '972', + 'object_count' => '3', + 'word' => 'manual', + ), + 145 => + array ( + 'id' => '973', + 'object_count' => '4', + 'word' => 'want', + ), + 146 => + array ( + 'id' => '974', + 'object_count' => '10', + 'word' => 'your', + ), + 147 => + array ( + 'id' => '975', + 'object_count' => '4', + 'word' => 'own', + ), + 148 => + array ( + 'id' => '976', + 'object_count' => '15', + 'word' => 'on', + ), + 149 => + array ( + 'id' => '977', + 'object_count' => '1', + 'word' => 'solid', + ), + 150 => + array ( + 'id' => '978', + 'object_count' => '5', + 'word' => 'cms', + ), + 151 => + array ( + 'id' => '979', + 'object_count' => '2', + 'word' => 'could', + ), + 152 => + array ( + 'id' => '980', + 'object_count' => '1', + 'word' => 'rest_api', + ), + 153 => + array ( + 'id' => '981', + 'object_count' => '25', + 'word' => 'vivamus', + ), + 154 => + array ( + 'id' => '982', + 'object_count' => '22', + 'word' => 'suscipit', + ), + 155 => + array ( + 'id' => '983', + 'object_count' => '25', + 'word' => 'praesent', + ), + 156 => + array ( + 'id' => '984', + 'object_count' => '17', + 'word' => 'tincidunt', + ), + 157 => + array ( + 'id' => '985', + 'object_count' => '22', + 'word' => 'adipiscing', + ), + 158 => + array ( + 'id' => '986', + 'object_count' => '20', + 'word' => 'urna', + ), + 159 => + array ( + 'id' => '987', + 'object_count' => '18', + 'word' => 'etiam', + ), + 160 => + array ( + 'id' => '988', + 'object_count' => '24', + 'word' => 'ligula', + ), + 161 => + array ( + 'id' => '989', + 'object_count' => '20', + 'word' => 'velit', + ), + 162 => + array ( + 'id' => '990', + 'object_count' => '17', + 'word' => 'accumsan', + ), + 163 => + array ( + 'id' => '991', + 'object_count' => '16', + 'word' => 'feugiat', + ), + 164 => + array ( + 'id' => '992', + 'object_count' => '29', + 'word' => 'sit', + ), + 165 => + array ( + 'id' => '993', + 'object_count' => '29', + 'word' => 'amet', + ), + 166 => + array ( + 'id' => '994', + 'object_count' => '25', + 'word' => 'malesuada', + ), + 167 => + array ( + 'id' => '995', + 'object_count' => '27', + 'word' => 'vel', + ), + 168 => + array ( + 'id' => '996', + 'object_count' => '21', + 'word' => 'tellus', + ), + 169 => + array ( + 'id' => '997', + 'object_count' => '20', + 'word' => 'donec', + ), + 170 => + array ( + 'id' => '998', + 'object_count' => '23', + 'word' => 'magna', + ), + 171 => + array ( + 'id' => '999', + 'object_count' => '24', + 'word' => 'felis', + ), + 172 => + array ( + 'id' => '1000', + 'object_count' => '27', + 'word' => 'mauris', + ), + 173 => + array ( + 'id' => '1001', + 'object_count' => '36', + 'word' => 'sed', + ), + 174 => + array ( + 'id' => '1002', + 'object_count' => '19', + 'word' => 'lectus', + ), + 175 => + array ( + 'id' => '1003', + 'object_count' => '14', + 'word' => 'pharetra', + ), + 176 => + array ( + 'id' => '1004', + 'object_count' => '2', + 'word' => 'sheets', + ), + 177 => + array ( + 'id' => '1005', + 'object_count' => '11', + 'word' => 'maecenas', + ), + 178 => + array ( + 'id' => '1006', + 'object_count' => '29', + 'word' => 'quam', + ), + 179 => + array ( + 'id' => '1007', + 'object_count' => '17', + 'word' => 'nisi', + ), + 180 => + array ( + 'id' => '1008', + 'object_count' => '15', + 'word' => 'by', + ), + 181 => + array ( + 'id' => '1009', + 'object_count' => '1', + 'word' => 'category', + ), + 182 => + array ( + 'id' => '1010', + 'object_count' => '17', + 'word' => 'phasellus', + ), + 183 => + array ( + 'id' => '1011', + 'object_count' => '37', + 'word' => 'ut', + ), + 184 => + array ( + 'id' => '1012', + 'object_count' => '20', + 'word' => 'ante', + ), + 185 => + array ( + 'id' => '1013', + 'object_count' => '22', + 'word' => 'eu', + ), + 186 => + array ( + 'id' => '1014', + 'object_count' => '30', + 'word' => 'nunc', + ), + 187 => + array ( + 'id' => '1015', + 'object_count' => '13', + 'word' => 'hendrerit', + ), + 188 => + array ( + 'id' => '1016', + 'object_count' => '23', + 'word' => 'turpis', + ), + 189 => + array ( + 'id' => '1017', + 'object_count' => '24', + 'word' => 'vestibulum', + ), + 190 => + array ( + 'id' => '1018', + 'object_count' => '10', + 'word' => 'laoreet', + ), + 191 => + array ( + 'id' => '1019', + 'object_count' => '23', + 'word' => 'erat', + ), + 192 => + array ( + 'id' => '1020', + 'object_count' => '28', + 'word' => 'id', + ), + 193 => + array ( + 'id' => '1021', + 'object_count' => '1', + 'word' => 'featured', + ), + 194 => + array ( + 'id' => '1022', + 'object_count' => '3', + 'word' => 'software', + ), + 195 => + array ( + 'id' => '1023', + 'object_count' => '1', + 'word' => 'os', + ), + 196 => + array ( + 'id' => '1024', + 'object_count' => '7', + 'word' => 'type', + ), + 197 => + array ( + 'id' => '1025', + 'object_count' => '2', + 'word' => 'i', + ), + 198 => + array ( + 'id' => '1026', + 'object_count' => '27', + 'word' => 'aliquam', + ), + 199 => + array ( + 'id' => '1027', + 'object_count' => '16', + 'word' => 'sem', + ), + 200 => + array ( + 'id' => '1028', + 'object_count' => '15', + 'word' => 'lobortis', + ), + 201 => + array ( + 'id' => '1029', + 'object_count' => '16', + 'word' => 'bibendum', + ), + 202 => + array ( + 'id' => '1030', + 'object_count' => '20', + 'word' => 'quis', + ), + 203 => + array ( + 'id' => '1031', + 'object_count' => '15', + 'word' => 'viverra', + ), + 204 => + array ( + 'id' => '1032', + 'object_count' => '18', + 'word' => 'elit', + ), + 205 => + array ( + 'id' => '1033', + 'object_count' => '14', + 'word' => 'placerat', + ), + 206 => + array ( + 'id' => '1034', + 'object_count' => '21', + 'word' => 'odio', + ), + 207 => + array ( + 'id' => '1035', + 'object_count' => '18', + 'word' => 'nam', + ), + 208 => + array ( + 'id' => '1036', + 'object_count' => '17', + 'word' => 'massa', + ), + 209 => + array ( + 'id' => '1037', + 'object_count' => '12', + 'word' => 'porta', + ), + 210 => + array ( + 'id' => '1038', + 'object_count' => '22', + 'word' => 'metus', + ), + 211 => + array ( + 'id' => '1039', + 'object_count' => '19', + 'word' => 'arcu', + ), + 212 => + array ( + 'id' => '1040', + 'object_count' => '30', + 'word' => 'nulla', + ), + 213 => + array ( + 'id' => '1041', + 'object_count' => '15', + 'word' => 'tortor', + ), + 214 => + array ( + 'id' => '1042', + 'object_count' => '19', + 'word' => 'non', + ), + 215 => + array ( + 'id' => '1043', + 'object_count' => '19', + 'word' => 'egestas', + ), + 216 => + array ( + 'id' => '1044', + 'object_count' => '11', + 'word' => 'aenean', + ), + 217 => + array ( + 'id' => '1045', + 'object_count' => '16', + 'word' => 'iaculis', + ), + 218 => + array ( + 'id' => '1046', + 'object_count' => '17', + 'word' => 'facilisis', + ), + 219 => + array ( + 'id' => '1047', + 'object_count' => '16', + 'word' => 'curabitur', + ), + 220 => + array ( + 'id' => '1048', + 'object_count' => '14', + 'word' => 'sollicitudin', + ), + 221 => + array ( + 'id' => '1049', + 'object_count' => '19', + 'word' => 'pede', + ), + 222 => + array ( + 'id' => '1050', + 'object_count' => '9', + 'word' => 'rhoncus', + ), + 223 => + array ( + 'id' => '1051', + 'object_count' => '22', + 'word' => 'lorem', + ), + 224 => + array ( + 'id' => '1052', + 'object_count' => '17', + 'word' => 'consectetuer', + ), + 225 => + array ( + 'id' => '1053', + 'object_count' => '18', + 'word' => 'varius', + ), + 226 => + array ( + 'id' => '1054', + 'object_count' => '6', + 'word' => 'lt', + ), + 227 => + array ( + 'id' => '1055', + 'object_count' => '5', + 'word' => 'xml', + ), + 228 => + array ( + 'id' => '1056', + 'object_count' => '8', + 'word' => 'version', + ), + 229 => + array ( + 'id' => '1057', + 'object_count' => '5', + 'word' => '1.0', + ), + 230 => + array ( + 'id' => '1058', + 'object_count' => '4', + 'word' => 'encoding', + ), + 231 => + array ( + 'id' => '1059', + 'object_count' => '4', + 'word' => 'utf', + ), + 232 => + array ( + 'id' => '1060', + 'object_count' => '4', + 'word' => '8', + ), + 233 => + array ( + 'id' => '1061', + 'object_count' => '7', + 'word' => 'gt', + ), + 234 => + array ( + 'id' => '1062', + 'object_count' => '4', + 'word' => 'ezmultioption', + ), + 235 => + array ( + 'id' => '1063', + 'object_count' => '4', + 'word' => 'option_counter', + ), + 236 => + array ( + 'id' => '1064', + 'object_count' => '4', + 'word' => '2', + ), + 237 => + array ( + 'id' => '1065', + 'object_count' => '4', + 'word' => 'name', + ), + 238 => + array ( + 'id' => '1066', + 'object_count' => '5', + 'word' => 'additional', + ), + 239 => + array ( + 'id' => '1067', + 'object_count' => '5', + 'word' => 'options', + ), + 240 => + array ( + 'id' => '1068', + 'object_count' => '4', + 'word' => 'multioptions', + ), + 241 => + array ( + 'id' => '1069', + 'object_count' => '4', + 'word' => 'multioption', + ), + 242 => + array ( + 'id' => '1070', + 'object_count' => '6', + 'word' => '1', + ), + 243 => + array ( + 'id' => '1071', + 'object_count' => '4', + 'word' => 'priority', + ), + 244 => + array ( + 'id' => '1072', + 'object_count' => '4', + 'word' => 'default_option_id', + ), + 245 => + array ( + 'id' => '1073', + 'object_count' => '6', + 'word' => 'option', + ), + 246 => + array ( + 'id' => '1074', + 'object_count' => '4', + 'word' => 'option_id', + ), + 247 => + array ( + 'id' => '1075', + 'object_count' => '4', + 'word' => 'value', + ), + 248 => + array ( + 'id' => '1076', + 'object_count' => '1', + 'word' => 'silver', + ), + 249 => + array ( + 'id' => '1077', + 'object_count' => '4', + 'word' => 'additional_price', + ), + 250 => + array ( + 'id' => '1078', + 'object_count' => '4', + 'word' => '10.00', + ), + 251 => + array ( + 'id' => '1079', + 'object_count' => '2', + 'word' => 'gold', + ), + 252 => + array ( + 'id' => '1080', + 'object_count' => '1', + 'word' => '20.00', + ), + 253 => + array ( + 'id' => '1081', + 'object_count' => '1', + 'word' => 'boxes', + ), + 254 => + array ( + 'id' => '1082', + 'object_count' => '4', + 'word' => 'cd', + ), + 255 => + array ( + 'id' => '1083', + 'object_count' => '3', + 'word' => 'dvd', + ), + 256 => + array ( + 'id' => '1084', + 'object_count' => '8', + 'word' => 'box', + ), + 257 => + array ( + 'id' => '1085', + 'object_count' => '10', + 'word' => 'cum', + ), + 258 => + array ( + 'id' => '1086', + 'object_count' => '10', + 'word' => 'sociis', + ), + 259 => + array ( + 'id' => '1087', + 'object_count' => '10', + 'word' => 'natoque', + ), + 260 => + array ( + 'id' => '1088', + 'object_count' => '11', + 'word' => 'penatibus', + ), + 261 => + array ( + 'id' => '1089', + 'object_count' => '34', + 'word' => 'et', + ), + 262 => + array ( + 'id' => '1090', + 'object_count' => '11', + 'word' => 'magnis', + ), + 263 => + array ( + 'id' => '1091', + 'object_count' => '11', + 'word' => 'dis', + ), + 264 => + array ( + 'id' => '1092', + 'object_count' => '10', + 'word' => 'parturient', + ), + 265 => + array ( + 'id' => '1093', + 'object_count' => '10', + 'word' => 'montes', + ), + 266 => + array ( + 'id' => '1094', + 'object_count' => '10', + 'word' => 'nascetur', + ), + 267 => + array ( + 'id' => '1095', + 'object_count' => '10', + 'word' => 'ridiculus', + ), + 268 => + array ( + 'id' => '1096', + 'object_count' => '10', + 'word' => 'mus', + ), + 269 => + array ( + 'id' => '1097', + 'object_count' => '7', + 'word' => 'venenatis', + ), + 270 => + array ( + 'id' => '1098', + 'object_count' => '5', + 'word' => 'elementum', + ), + 271 => + array ( + 'id' => '1099', + 'object_count' => '23', + 'word' => 'dolor', + ), + 272 => + array ( + 'id' => '1100', + 'object_count' => '14', + 'word' => 'volutpat', + ), + 273 => + array ( + 'id' => '1101', + 'object_count' => '15', + 'word' => 'auctor', + ), + 274 => + array ( + 'id' => '1102', + 'object_count' => '13', + 'word' => 'libero', + ), + 275 => + array ( + 'id' => '1103', + 'object_count' => '23', + 'word' => 'ipsum', + ), + 276 => + array ( + 'id' => '1104', + 'object_count' => '6', + 'word' => 'aliquet', + ), + 277 => + array ( + 'id' => '1105', + 'object_count' => '8', + 'word' => 'dapibus', + ), + 278 => + array ( + 'id' => '1106', + 'object_count' => '18', + 'word' => 'eros', + ), + 279 => + array ( + 'id' => '1107', + 'object_count' => '25', + 'word' => 'nec', + ), + 280 => + array ( + 'id' => '1108', + 'object_count' => '28', + 'word' => 'pellentesque', + ), + 281 => + array ( + 'id' => '1109', + 'object_count' => '15', + 'word' => 'diam', + ), + 282 => + array ( + 'id' => '1110', + 'object_count' => '17', + 'word' => 'dignissim', + ), + 283 => + array ( + 'id' => '1111', + 'object_count' => '10', + 'word' => 'pulvinar', + ), + 284 => + array ( + 'id' => '1112', + 'object_count' => '14', + 'word' => 'rutrum', + ), + 285 => + array ( + 'id' => '1113', + 'object_count' => '22', + 'word' => 'nisl', + ), + 286 => + array ( + 'id' => '1114', + 'object_count' => '18', + 'word' => 'quisque', + ), + 287 => + array ( + 'id' => '1115', + 'object_count' => '15', + 'word' => 'ultrices', + ), + 288 => + array ( + 'id' => '1116', + 'object_count' => '22', + 'word' => 'tristique', + ), + 289 => + array ( + 'id' => '1117', + 'object_count' => '16', + 'word' => 'tempus', + ), + 290 => + array ( + 'id' => '1118', + 'object_count' => '15', + 'word' => 'posuere', + ), + 291 => + array ( + 'id' => '1119', + 'object_count' => '15', + 'word' => 'pretium', + ), + 292 => + array ( + 'id' => '1120', + 'object_count' => '3', + 'word' => 'cover', + ), + 293 => + array ( + 'id' => '1121', + 'object_count' => '3', + 'word' => 'soft', + ), + 294 => + array ( + 'id' => '1122', + 'object_count' => '5', + 'word' => 'hard', + ), + 295 => + array ( + 'id' => '1123', + 'object_count' => '3', + 'word' => '15.00', + ), + 296 => + array ( + 'id' => '1124', + 'object_count' => '1', + 'word' => 'ii', + ), + 297 => + array ( + 'id' => '1125', + 'object_count' => '1', + 'word' => 'iii', + ), + 298 => + array ( + 'id' => '1126', + 'object_count' => '2', + 'word' => 'industry', + ), + 299 => + array ( + 'id' => '1127', + 'object_count' => '2', + 'word' => 'banking', + ), + 300 => + array ( + 'id' => '1128', + 'object_count' => '1', + 'word' => 'automotive', + ), + 301 => + array ( + 'id' => '1129', + 'object_count' => '1', + 'word' => 'education', + ), + 302 => + array ( + 'id' => '1130', + 'object_count' => '1', + 'word' => 'electronics', + ), + 303 => + array ( + 'id' => '1131', + 'object_count' => '2', + 'word' => 'business', + ), + 304 => + array ( + 'id' => '1132', + 'object_count' => '3', + 'word' => 'integration', + ), + 305 => + array ( + 'id' => '1133', + 'object_count' => '7', + 'word' => 'enterprise', + ), + 306 => + array ( + 'id' => '1134', + 'object_count' => '1', + 'word' => 'resource', + ), + 307 => + array ( + 'id' => '1135', + 'object_count' => '15', + 'word' => 'fusce', + ), + 308 => + array ( + 'id' => '1136', + 'object_count' => '5', + 'word' => 'sagittis', + ), + 309 => + array ( + 'id' => '1137', + 'object_count' => '13', + 'word' => 'suspendisse', + ), + 310 => + array ( + 'id' => '1138', + 'object_count' => '10', + 'word' => 'faucibus', + ), + 311 => + array ( + 'id' => '1139', + 'object_count' => '10', + 'word' => 'ornare', + ), + 312 => + array ( + 'id' => '1140', + 'object_count' => '12', + 'word' => 'gravida', + ), + 313 => + array ( + 'id' => '1141', + 'object_count' => '14', + 'word' => 'neque', + ), + 314 => + array ( + 'id' => '1142', + 'object_count' => '18', + 'word' => 'orci', + ), + 315 => + array ( + 'id' => '1143', + 'object_count' => '12', + 'word' => 'lacus', + ), + 316 => + array ( + 'id' => '1144', + 'object_count' => '16', + 'word' => 'interdum', + ), + 317 => + array ( + 'id' => '1145', + 'object_count' => '17', + 'word' => 'cras', + ), + 318 => + array ( + 'id' => '1146', + 'object_count' => '9', + 'word' => 'molestie', + ), + 319 => + array ( + 'id' => '1147', + 'object_count' => '19', + 'word' => 'congue', + ), + 320 => + array ( + 'id' => '1148', + 'object_count' => '5', + 'word' => 'convallis', + ), + 321 => + array ( + 'id' => '1149', + 'object_count' => '20', + 'word' => 'justo', + ), + 322 => + array ( + 'id' => '1150', + 'object_count' => '7', + 'word' => 'facilisi', + ), + 323 => + array ( + 'id' => '1151', + 'object_count' => '5', + 'word' => 'potenti', + ), + 324 => + array ( + 'id' => '1152', + 'object_count' => '6', + 'word' => 'hac', + ), + 325 => + array ( + 'id' => '1153', + 'object_count' => '6', + 'word' => 'habitasse', + ), + 326 => + array ( + 'id' => '1154', + 'object_count' => '6', + 'word' => 'platea', + ), + 327 => + array ( + 'id' => '1155', + 'object_count' => '6', + 'word' => 'dictumst', + ), + 328 => + array ( + 'id' => '1156', + 'object_count' => '9', + 'word' => 'commodo', + ), + 329 => + array ( + 'id' => '1157', + 'object_count' => '14', + 'word' => 'purus', + ), + 330 => + array ( + 'id' => '1158', + 'object_count' => '19', + 'word' => 'nibh', + ), + 331 => + array ( + 'id' => '1159', + 'object_count' => '7', + 'word' => 'integer', + ), + 332 => + array ( + 'id' => '1160', + 'object_count' => '11', + 'word' => 'dictum', + ), + 333 => + array ( + 'id' => '1161', + 'object_count' => '16', + 'word' => 'risus', + ), + 334 => + array ( + 'id' => '1162', + 'object_count' => '16', + 'word' => 'mi', + ), + 335 => + array ( + 'id' => '1163', + 'object_count' => '15', + 'word' => 'nullam', + ), + 336 => + array ( + 'id' => '1164', + 'object_count' => '17', + 'word' => 'est', + ), + 337 => + array ( + 'id' => '1165', + 'object_count' => '20', + 'word' => 'consequat', + ), + 338 => + array ( + 'id' => '1166', + 'object_count' => '8', + 'word' => 'ultricies', + ), + 339 => + array ( + 'id' => '1167', + 'object_count' => '8', + 'word' => 'mollis', + ), + 340 => + array ( + 'id' => '1168', + 'object_count' => '15', + 'word' => 'sapien', + ), + 341 => + array ( + 'id' => '1169', + 'object_count' => '10', + 'word' => 'cursus', + ), + 342 => + array ( + 'id' => '1170', + 'object_count' => '16', + 'word' => 'vitae', + ), + 343 => + array ( + 'id' => '1171', + 'object_count' => '22', + 'word' => 'eget', + ), + 344 => + array ( + 'id' => '1172', + 'object_count' => '18', + 'word' => 'proin', + ), + 345 => + array ( + 'id' => '1173', + 'object_count' => '6', + 'word' => 'ullamcorper', + ), + 346 => + array ( + 'id' => '1174', + 'object_count' => '6', + 'word' => 'class', + ), + 347 => + array ( + 'id' => '1175', + 'object_count' => '4', + 'word' => 'aptent', + ), + 348 => + array ( + 'id' => '1176', + 'object_count' => '4', + 'word' => 'taciti', + ), + 349 => + array ( + 'id' => '1177', + 'object_count' => '4', + 'word' => 'sociosqu', + ), + 350 => + array ( + 'id' => '1178', + 'object_count' => '4', + 'word' => 'ad', + ), + 351 => + array ( + 'id' => '1179', + 'object_count' => '4', + 'word' => 'litora', + ), + 352 => + array ( + 'id' => '1180', + 'object_count' => '4', + 'word' => 'torquent', + ), + 353 => + array ( + 'id' => '1181', + 'object_count' => '4', + 'word' => 'per', + ), + 354 => + array ( + 'id' => '1182', + 'object_count' => '4', + 'word' => 'conubia', + ), + 355 => + array ( + 'id' => '1183', + 'object_count' => '4', + 'word' => 'nostra', + ), + 356 => + array ( + 'id' => '1184', + 'object_count' => '4', + 'word' => 'inceptos', + ), + 357 => + array ( + 'id' => '1185', + 'object_count' => '4', + 'word' => 'hymenaeos', + ), + 358 => + array ( + 'id' => '1186', + 'object_count' => '13', + 'word' => 'fringilla', + ), + 359 => + array ( + 'id' => '1187', + 'object_count' => '17', + 'word' => 'euismod', + ), + 360 => + array ( + 'id' => '1188', + 'object_count' => '30', + 'word' => 'ac', + ), + 361 => + array ( + 'id' => '1189', + 'object_count' => '13', + 'word' => 'condimentum', + ), + 362 => + array ( + 'id' => '1190', + 'object_count' => '1', + 'word' => '1174643880', + ), + 363 => + array ( + 'id' => '1191', + 'object_count' => '45', + 'word' => '0', + ), + 364 => + array ( + 'id' => '1192', + 'object_count' => '15', + 'word' => 'sodales', + ), + 365 => + array ( + 'id' => '1193', + 'object_count' => '10', + 'word' => 'enim', + ), + 366 => + array ( + 'id' => '1194', + 'object_count' => '11', + 'word' => 'leo', + ), + 367 => + array ( + 'id' => '1195', + 'object_count' => '10', + 'word' => 'vehicula', + ), + 368 => + array ( + 'id' => '1196', + 'object_count' => '14', + 'word' => 'nonummy', + ), + 369 => + array ( + 'id' => '1197', + 'object_count' => '15', + 'word' => 'imperdiet', + ), + 370 => + array ( + 'id' => '1198', + 'object_count' => '14', + 'word' => 'vulputate', + ), + 371 => + array ( + 'id' => '1199', + 'object_count' => '9', + 'word' => 'blandit', + ), + 372 => + array ( + 'id' => '1200', + 'object_count' => '1', + 'word' => '1174644060', + ), + 373 => + array ( + 'id' => '1201', + 'object_count' => '1', + 'word' => '1174643640', + ), + 374 => + array ( + 'id' => '1202', + 'object_count' => '13', + 'word' => 'duis', + ), + 375 => + array ( + 'id' => '1203', + 'object_count' => '14', + 'word' => 'tempor', + ), + 376 => + array ( + 'id' => '1204', + 'object_count' => '1', + 'word' => '1174645140', + ), + 377 => + array ( + 'id' => '1205', + 'object_count' => '2', + 'word' => '1174645260', + ), + 378 => + array ( + 'id' => '1206', + 'object_count' => '5', + 'word' => 'eleifend', + ), + 379 => + array ( + 'id' => '1207', + 'object_count' => '5', + 'word' => 'fermentum', + ), + 380 => + array ( + 'id' => '1208', + 'object_count' => '13', + 'word' => 'augue', + ), + 381 => + array ( + 'id' => '1209', + 'object_count' => '10', + 'word' => 'porttitor', + ), + 382 => + array ( + 'id' => '1210', + 'object_count' => '1', + 'word' => 'standard', + ), + 383 => + array ( + 'id' => '1211', + 'object_count' => '1', + 'word' => 'exam', + ), + 384 => + array ( + 'id' => '1212', + 'object_count' => '2', + 'word' => 'delivery', + ), + 385 => + array ( + 'id' => '1213', + 'object_count' => '2', + 'word' => 'method', + ), + 386 => + array ( + 'id' => '1214', + 'object_count' => '1', + 'word' => 'classroom', + ), + 387 => + array ( + 'id' => '1215', + 'object_count' => '1', + 'word' => 'certification', + ), + 388 => + array ( + 'id' => '1216', + 'object_count' => '1', + 'word' => 'workshops', + ), + 389 => + array ( + 'id' => '1217', + 'object_count' => '7', + 'word' => 'semper', + ), + 390 => + array ( + 'id' => '1218', + 'object_count' => '12', + 'word' => 'dui', + ), + 391 => + array ( + 'id' => '1219', + 'object_count' => '1', + 'word' => '1175235780', + ), + 392 => + array ( + 'id' => '1220', + 'object_count' => '12', + 'word' => 'morbi', + ), + 393 => + array ( + 'id' => '1221', + 'object_count' => '11', + 'word' => 'lacinia', + ), + 394 => + array ( + 'id' => '1222', + 'object_count' => '1', + 'word' => '1175236020', + ), + 395 => + array ( + 'id' => '1223', + 'object_count' => '5', + 'word' => 'luctus', + ), + 396 => + array ( + 'id' => '1224', + 'object_count' => '1', + 'word' => '1175236920', + ), + 397 => + array ( + 'id' => '1225', + 'object_count' => '4', + 'word' => 'events', + ), + 398 => + array ( + 'id' => '1226', + 'object_count' => '1', + 'word' => 'seminars', + ), + 399 => + array ( + 'id' => '1227', + 'object_count' => '3', + 'word' => 'self', + ), + 400 => + array ( + 'id' => '1228', + 'object_count' => '1', + 'word' => 'paced', + ), + 401 => + array ( + 'id' => '1229', + 'object_count' => '2', + 'word' => 'courses', + ), + 402 => + array ( + 'id' => '1230', + 'object_count' => '6', + 'word' => 'habitant', + ), + 403 => + array ( + 'id' => '1231', + 'object_count' => '7', + 'word' => 'senectus', + ), + 404 => + array ( + 'id' => '1232', + 'object_count' => '7', + 'word' => 'netus', + ), + 405 => + array ( + 'id' => '1233', + 'object_count' => '7', + 'word' => 'fames', + ), + 406 => + array ( + 'id' => '1234', + 'object_count' => '1', + 'word' => 'instructor', + ), + 407 => + array ( + 'id' => '1235', + 'object_count' => '1', + 'word' => 'led', + ), + 408 => + array ( + 'id' => '1236', + 'object_count' => '2', + 'word' => 'learning', + ), + 409 => + array ( + 'id' => '1237', + 'object_count' => '5', + 'word' => 'resources', + ), + 410 => + array ( + 'id' => '1238', + 'object_count' => '2', + 'word' => 'knowledgebase', + ), + 411 => + array ( + 'id' => '1239', + 'object_count' => '11', + 'word' => 'mattis', + ), + 412 => + array ( + 'id' => '1240', + 'object_count' => '3', + 'word' => 'scelerisque', + ), + 413 => + array ( + 'id' => '1241', + 'object_count' => '2', + 'word' => 'books', + ), + 414 => + array ( + 'id' => '1242', + 'object_count' => '3', + 'word' => 'primis', + ), + 415 => + array ( + 'id' => '1243', + 'object_count' => '3', + 'word' => 'cubilia', + ), + 416 => + array ( + 'id' => '1244', + 'object_count' => '3', + 'word' => 'curae', + ), + 417 => + array ( + 'id' => '1245', + 'object_count' => '1', + 'word' => '1175496180', + ), + 418 => + array ( + 'id' => '1246', + 'object_count' => '1', + 'word' => 'customer', + ), + 419 => + array ( + 'id' => '1247', + 'object_count' => '5', + 'word' => 'service', + ), + 420 => + array ( + 'id' => '1248', + 'object_count' => '1', + 'word' => 'programs', + ), + 421 => + array ( + 'id' => '1249', + 'object_count' => '1', + 'word' => 'getting', + ), + 422 => + array ( + 'id' => '1250', + 'object_count' => '2', + 'word' => 'started', + ), + 423 => + array ( + 'id' => '1251', + 'object_count' => '3', + 'word' => 'get', + ), + 424 => + array ( + 'id' => '1252', + 'object_count' => '1', + 'word' => 'involved', + ), + 425 => + array ( + 'id' => '1253', + 'object_count' => '3', + 'word' => 'blogs', + ), + 426 => + array ( + 'id' => '1254', + 'object_count' => '1', + 'word' => 'twitter', + ), + 427 => + array ( + 'id' => '1255', + 'object_count' => '1', + 'word' => 'linkedin', + ), + 428 => + array ( + 'id' => '1256', + 'object_count' => '2', + 'word' => 'contact', + ), + 429 => + array ( + 'id' => '1257', + 'object_count' => '3', + 'word' => 'share', + ), + 430 => + array ( + 'id' => '1258', + 'object_count' => '8', + 'word' => 'community', + ), + 431 => + array ( + 'id' => '1259', + 'object_count' => '5', + 'word' => 's', + ), + 432 => + array ( + 'id' => '1260', + 'object_count' => '1', + 'word' => 'life', + ), + 433 => + array ( + 'id' => '1261', + 'object_count' => '1', + 'word' => 'helped', + ), + 434 => + array ( + 'id' => '1262', + 'object_count' => '1', + 'word' => 'participate', + ), + 435 => + array ( + 'id' => '1263', + 'object_count' => '7', + 'word' => 'page', + ), + 436 => + array ( + 'id' => '1264', + 'object_count' => '2', + 'word' => 'gives', + ), + 437 => + array ( + 'id' => '1265', + 'object_count' => '2', + 'word' => 'list', + ), + 438 => + array ( + 'id' => '1266', + 'object_count' => '1', + 'word' => 'hints', + ), + 439 => + array ( + 'id' => '1267', + 'object_count' => '1', + 'word' => 'tricks', + ), + 440 => + array ( + 'id' => '1268', + 'object_count' => '1', + 'word' => 'actually', + ), + 441 => + array ( + 'id' => '1269', + 'object_count' => '1', + 'word' => 'sure', + ), + 442 => + array ( + 'id' => '1270', + 'object_count' => '1', + 'word' => 'etiquette', + ), + 443 => + array ( + 'id' => '1271', + 'object_count' => '1', + 'word' => 'blogging', + ), + 444 => + array ( + 'id' => '1272', + 'object_count' => '1', + 'word' => 'usage', + ), + 445 => + array ( + 'id' => '1273', + 'object_count' => '1', + 'word' => 'guidelines', + ), + 446 => + array ( + 'id' => '1274', + 'object_count' => '1', + 'word' => 'unclear', + ), + 447 => + array ( + 'id' => '1275', + 'object_count' => '3', + 'word' => 'after', + ), + 448 => + array ( + 'id' => '1276', + 'object_count' => '6', + 'word' => 'having', + ), + 449 => + array ( + 'id' => '1277', + 'object_count' => '9', + 'word' => 'through', + ), + 450 => + array ( + 'id' => '1278', + 'object_count' => '2', + 'word' => 'following', + ), + 451 => + array ( + 'id' => '1279', + 'object_count' => '1', + 'word' => 'would', + ), + 452 => + array ( + 'id' => '1280', + 'object_count' => '10', + 'word' => 'like', + ), + 453 => + array ( + 'id' => '1281', + 'object_count' => '1', + 'word' => 'ask', + ), + 454 => + array ( + 'id' => '1282', + 'object_count' => '2', + 'word' => 'feel', + ), + 455 => + array ( + 'id' => '1283', + 'object_count' => '2', + 'word' => 'free', + ), + 456 => + array ( + 'id' => '1284', + 'object_count' => '2', + 'word' => 'send', + ), + 457 => + array ( + 'id' => '1285', + 'object_count' => '2', + 'word' => 'email', + ), + 458 => + array ( + 'id' => '1286', + 'object_count' => '1', + 'word' => 'sharing', + ), + 459 => + array ( + 'id' => '1287', + 'object_count' => '6', + 'word' => 'http', + ), + 460 => + array ( + 'id' => '1288', + 'object_count' => '2', + 'word' => 'share.ez.no', + ), + 461 => + array ( + 'id' => '1289', + 'object_count' => '1', + 'word' => 'pick', + ), + 462 => + array ( + 'id' => '1290', + 'object_count' => '12', + 'word' => 'one', + ), + 463 => + array ( + 'id' => '1291', + 'object_count' => '1', + 'word' => 'remark', + ), + 464 => + array ( + 'id' => '1292', + 'object_count' => '3', + 'word' => 'answers', + ), + 465 => + array ( + 'id' => '1293', + 'object_count' => '1', + 'word' => 'others', + ), + 466 => + array ( + 'id' => '1294', + 'object_count' => '1', + 'word' => 'questions', + ), + 467 => + array ( + 'id' => '1295', + 'object_count' => '4', + 'word' => 'simply', + ), + 468 => + array ( + 'id' => '1296', + 'object_count' => '1', + 'word' => 'looking', + ), + 469 => + array ( + 'id' => '1297', + 'object_count' => '1', + 'word' => 'bit', + ), + 470 => + array ( + 'id' => '1298', + 'object_count' => '4', + 'word' => 'available', + ), + 471 => + array ( + 'id' => '1299', + 'object_count' => '1', + 'word' => 'install', + ), + 472 => + array ( + 'id' => '1300', + 'object_count' => '7', + 'word' => 'configuration', + ), + 473 => + array ( + 'id' => '1301', + 'object_count' => '2', + 'word' => 'rss', + ), + 474 => + array ( + 'id' => '1302', + 'object_count' => '1', + 'word' => 'general', + ), + 475 => + array ( + 'id' => '1303', + 'object_count' => '3', + 'word' => 'developer', + ), + 476 => + array ( + 'id' => '1304', + 'object_count' => '1', + 'word' => 'suggestions', + ), + 477 => + array ( + 'id' => '1305', + 'object_count' => '1', + 'word' => 'broken', + ), + 478 => + array ( + 'id' => '1306', + 'object_count' => '1', + 'word' => 'down', + ), + 479 => + array ( + 'id' => '1307', + 'object_count' => '5', + 'word' => 'extension', + ), + 480 => + array ( + 'id' => '1308', + 'object_count' => '1', + 'word' => 'subforums', + ), + 481 => + array ( + 'id' => '1309', + 'object_count' => '1', + 'word' => 'newsletter', + ), + 482 => + array ( + 'id' => '1310', + 'object_count' => '4', + 'word' => 'dedicated', + ), + 483 => + array ( + 'id' => '1311', + 'object_count' => '1', + 'word' => 'translators', + ), + 484 => + array ( + 'id' => '1312', + 'object_count' => '1', + 'word' => 'linguists', + ), + 485 => + array ( + 'id' => '1313', + 'object_count' => '3', + 'word' => 'translating', + ), + 486 => + array ( + 'id' => '1314', + 'object_count' => '3', + 'word' => 'translations', + ), + 487 => + array ( + 'id' => '1315', + 'object_count' => '1', + 'word' => 'local', + ), + 488 => + array ( + 'id' => '1316', + 'object_count' => '3', + 'word' => 'communities', + ), + 489 => + array ( + 'id' => '1317', + 'object_count' => '6', + 'word' => 'do', + ), + 490 => + array ( + 'id' => '1318', + 'object_count' => '7', + 'word' => 'not', + ), + 491 => + array ( + 'id' => '1319', + 'object_count' => '15', + 'word' => 'have', + ), + 492 => + array ( + 'id' => '1320', + 'object_count' => '4', + 'word' => 'platform', + ), + 493 => + array ( + 'id' => '1321', + 'object_count' => '3', + 'word' => 'their', + ), + 494 => + array ( + 'id' => '1322', + 'object_count' => '1', + 'word' => 'native', + ), + 495 => + array ( + 'id' => '1323', + 'object_count' => '5', + 'word' => 'language', + ), + 496 => + array ( + 'id' => '1324', + 'object_count' => '1', + 'word' => 'localized', + ), + 497 => + array ( + 'id' => '1325', + 'object_count' => '1', + 'word' => 'last', + ), + 498 => + array ( + 'id' => '1326', + 'object_count' => '1', + 'word' => 'welcomes', + ), + 499 => + array ( + 'id' => '1327', + 'object_count' => '2', + 'word' => 'portal', + ), + 500 => + array ( + 'id' => '1328', + 'object_count' => '1', + 'word' => 'feedback', + ), + 501 => + array ( + 'id' => '1329', + 'object_count' => '1', + 'word' => 'ideas', + ), + 502 => + array ( + 'id' => '1330', + 'object_count' => '1', + 'word' => 'often', + ), + 503 => + array ( + 'id' => '1331', + 'object_count' => '1', + 'word' => 'conjunction', + ), + 504 => + array ( + 'id' => '1332', + 'object_count' => '1', + 'word' => 'issue', + ), + 505 => + array ( + 'id' => '1333', + 'object_count' => '1', + 'word' => 'tracker', + ), + 506 => + array ( + 'id' => '1334', + 'object_count' => '1', + 'word' => 'confused', + ), + 507 => + array ( + 'id' => '1335', + 'object_count' => '1', + 'word' => 'experience', + ), + 508 => + array ( + 'id' => '1336', + 'object_count' => '4', + 'word' => 'article', + ), + 509 => + array ( + 'id' => '1337', + 'object_count' => '9', + 'word' => 'articles', + ), + 510 => + array ( + 'id' => '1338', + 'object_count' => '1', + 'word' => 'sections', + ), + 511 => + array ( + 'id' => '1339', + 'object_count' => '1', + 'word' => 'mines', + ), + 512 => + array ( + 'id' => '1340', + 'object_count' => '2', + 'word' => 'useful', + ), + 513 => + array ( + 'id' => '1341', + 'object_count' => '1', + 'word' => 'practical', + ), + 514 => + array ( + 'id' => '1342', + 'object_count' => '5', + 'word' => 'may', + ), + 515 => + array ( + 'id' => '1343', + 'object_count' => '3', + 'word' => 'willing', + ), + 516 => + array ( + 'id' => '1344', + 'object_count' => '3', + 'word' => 'contribute', + ), + 517 => + array ( + 'id' => '1345', + 'object_count' => '1', + 'word' => 'growing', + ), + 518 => + array ( + 'id' => '1346', + 'object_count' => '1', + 'word' => 'amount', + ), + 519 => + array ( + 'id' => '1347', + 'object_count' => '1', + 'word' => 'experiences', + ), + 520 => + array ( + 'id' => '1348', + 'object_count' => '3', + 'word' => 'right', + ), + 521 => + array ( + 'id' => '1349', + 'object_count' => '1', + 'word' => 'here', + ), + 522 => + array ( + 'id' => '1350', + 'object_count' => '1', + 'word' => 'write', + ), + 523 => + array ( + 'id' => '1351', + 'object_count' => '2', + 'word' => 'live', + ), + 524 => + array ( + 'id' => '1352', + 'object_count' => '1', + 'word' => 'chat', + ), + 525 => + array ( + 'id' => '1353', + 'object_count' => '1', + 'word' => 'irc', + ), + 526 => + array ( + 'id' => '1354', + 'object_count' => '3', + 'word' => 'two', + ), + 527 => + array ( + 'id' => '1355', + 'object_count' => '1', + 'word' => 'channels', + ), + 528 => + array ( + 'id' => '1356', + 'object_count' => '1', + 'word' => 'mostly', + ), + 529 => + array ( + 'id' => '1357', + 'object_count' => '2', + 'word' => 'around', + ), + 530 => + array ( + 'id' => '1358', + 'object_count' => '4', + 'word' => 'components', + ), + 531 => + array ( + 'id' => '1359', + 'object_count' => '5', + 'word' => 'they', + ), + 532 => + array ( + 'id' => '1360', + 'object_count' => '1', + 'word' => 'room', + ), + 533 => + array ( + 'id' => '1361', + 'object_count' => '1', + 'word' => 'irc.freenode.net', + ), + 534 => + array ( + 'id' => '1362', + 'object_count' => '2', + 'word' => 'ezpublish', + ), + 535 => + array ( + 'id' => '1363', + 'object_count' => '1', + 'word' => 'zetacomponents', + ), + 536 => + array ( + 'id' => '1364', + 'object_count' => '1', + 'word' => 'join', + ), + 537 => + array ( + 'id' => '1365', + 'object_count' => '3', + 'word' => 'usually', + ), + 538 => + array ( + 'id' => '1366', + 'object_count' => '5', + 'word' => 'there', + ), + 539 => + array ( + 'id' => '1367', + 'object_count' => '3', + 'word' => 'number', + ), + 540 => + array ( + 'id' => '1368', + 'object_count' => '6', + 'word' => 'out', + ), + 541 => + array ( + 'id' => '1369', + 'object_count' => '1', + 'word' => 'discuss', + ), + 542 => + array ( + 'id' => '1370', + 'object_count' => '9', + 'word' => 'features', + ), + 543 => + array ( + 'id' => '1371', + 'object_count' => '5', + 'word' => 'client', + ), + 544 => + array ( + 'id' => '1372', + 'object_count' => '1', + 'word' => 'joining', + ), + 545 => + array ( + 'id' => '1373', + 'object_count' => '2', + 'word' => 'channel', + ), + 546 => + array ( + 'id' => '1374', + 'object_count' => '1', + 'word' => 'indicative', + ), + 547 => + array ( + 'id' => '1375', + 'object_count' => '3', + 'word' => 'clients', + ), + 548 => + array ( + 'id' => '1376', + 'object_count' => '1', + 'word' => 'xchat', + ), + 549 => + array ( + 'id' => '1377', + 'object_count' => '1', + 'word' => 'mirc', + ), + 550 => + array ( + 'id' => '1378', + 'object_count' => '1', + 'word' => 'pidgin', + ), + 551 => + array ( + 'id' => '1379', + 'object_count' => '1', + 'word' => 'colloquy', + ), + 552 => + array ( + 'id' => '1380', + 'object_count' => '1', + 'word' => 'central', + ), + 553 => + array ( + 'id' => '1381', + 'object_count' => '2', + 'word' => 'blog', + ), + 554 => + array ( + 'id' => '1382', + 'object_count' => '1', + 'word' => 'planet', + ), + 555 => + array ( + 'id' => '1383', + 'object_count' => '1', + 'word' => 'aggregating', + ), + 556 => + array ( + 'id' => '1384', + 'object_count' => '9', + 'word' => 'many', + ), + 557 => + array ( + 'id' => '1385', + 'object_count' => '4', + 'word' => 'members', + ), + 558 => + array ( + 'id' => '1386', + 'object_count' => '1', + 'word' => 'planetezpublish.org', + ), + 559 => + array ( + 'id' => '1387', + 'object_count' => '1', + 'word' => 'initiatives', + ), + 560 => + array ( + 'id' => '1388', + 'object_count' => '1', + 'word' => 'exists', + ), + 561 => + array ( + 'id' => '1389', + 'object_count' => '1', + 'word' => 'among', + ), + 562 => + array ( + 'id' => '1390', + 'object_count' => '3', + 'word' => 'them', + ), + 563 => + array ( + 'id' => '1391', + 'object_count' => '3', + 'word' => 'french', + ), + 564 => + array ( + 'id' => '1392', + 'object_count' => '1', + 'word' => 'speaking', + ), + 565 => + array ( + 'id' => '1393', + 'object_count' => '1', + 'word' => 'www.planet', + ), + 566 => + array ( + 'id' => '1394', + 'object_count' => '1', + 'word' => 'ezpublish.fr', + ), + 567 => + array ( + 'id' => '1395', + 'object_count' => '1', + 'word' => 'atop', + ), + 568 => + array ( + 'id' => '1396', + 'object_count' => '10', + 'word' => 'will', + ), + 569 => + array ( + 'id' => '1397', + 'object_count' => '1', + 'word' => 'soon', + ), + 570 => + array ( + 'id' => '1398', + 'object_count' => '1', + 'word' => 'public', + ), + 571 => + array ( + 'id' => '1399', + 'object_count' => '1', + 'word' => 'stay', + ), + 572 => + array ( + 'id' => '1400', + 'object_count' => '1', + 'word' => 'tuned', + ), + 573 => + array ( + 'id' => '1401', + 'object_count' => '1', + 'word' => 'mailing', + ), + 574 => + array ( + 'id' => '1402', + 'object_count' => '1', + 'word' => 'lists', + ), + 575 => + array ( + 'id' => '1403', + 'object_count' => '2', + 'word' => 'register', + ), + 576 => + array ( + 'id' => '1404', + 'object_count' => '7', + 'word' => 'so', + ), + 577 => + array ( + 'id' => '1405', + 'object_count' => '1', + 'word' => 'lists.ez.no', + ), + 578 => + array ( + 'id' => '1406', + 'object_count' => '1', + 'word' => 'mailman', + ), + 579 => + array ( + 'id' => '1407', + 'object_count' => '1', + 'word' => 'listinfo', + ), + 580 => + array ( + 'id' => '1408', + 'object_count' => '1', + 'word' => 'sdk', + ), + 581 => + array ( + 'id' => '1409', + 'object_count' => '1', + 'word' => 'serves', + ), + 582 => + array ( + 'id' => '1410', + 'object_count' => '9', + 'word' => 'as', + ), + 583 => + array ( + 'id' => '1411', + 'object_count' => '1', + 'word' => 'obviously', + ), + 584 => + array ( + 'id' => '1412', + 'object_count' => '1', + 'word' => 'less', + ), + 585 => + array ( + 'id' => '1413', + 'object_count' => '1', + 'word' => 'responsive', + ), + 586 => + array ( + 'id' => '1414', + 'object_count' => '9', + 'word' => 'than', + ), + 587 => + array ( + 'id' => '1415', + 'object_count' => '6', + 'word' => 'but', + ), + 588 => + array ( + 'id' => '1416', + 'object_count' => '1', + 'word' => 'persistent', + ), + 589 => + array ( + 'id' => '1417', + 'object_count' => '12', + 'word' => 'which', + ), + 590 => + array ( + 'id' => '1418', + 'object_count' => '3', + 'word' => 'preferred', + ), + 591 => + array ( + 'id' => '1419', + 'object_count' => '2', + 'word' => 'cases', + ), + 592 => + array ( + 'id' => '1420', + 'object_count' => '8', + 'word' => 'another', + ), + 593 => + array ( + 'id' => '1421', + 'object_count' => '3', + 'word' => 'helps', + ), + 594 => + array ( + 'id' => '1422', + 'object_count' => '3', + 'word' => 'see', + ), + 595 => + array ( + 'id' => '1423', + 'object_count' => '1', + 'word' => 'pass', + ), + 596 => + array ( + 'id' => '1424', + 'object_count' => '2', + 'word' => 'every', + ), + 597 => + array ( + 'id' => '1425', + 'object_count' => '1', + 'word' => 'commit', + ), + 598 => + array ( + 'id' => '1426', + 'object_count' => '2', + 'word' => 'messages', + ), + 599 => + array ( + 'id' => '1427', + 'object_count' => '1', + 'word' => 'trunk', + ), + 600 => + array ( + 'id' => '1428', + 'object_count' => '1', + 'word' => 'eager', + ), + 601 => + array ( + 'id' => '1429', + 'object_count' => '8', + 'word' => 'feature', + ), + 602 => + array ( + 'id' => '1430', + 'object_count' => '1', + 'word' => 'implemented', + ), + 603 => + array ( + 'id' => '1431', + 'object_count' => '1', + 'word' => 'updated', + ), + 604 => + array ( + 'id' => '1432', + 'object_count' => '1', + 'word' => 'bleeding', + ), + 605 => + array ( + 'id' => '1433', + 'object_count' => '1', + 'word' => 'edge', + ), + 606 => + array ( + 'id' => '1434', + 'object_count' => '1', + 'word' => 'vip', + ), + 607 => + array ( + 'id' => '1435', + 'object_count' => '2', + 'word' => 'status', + ), + 608 => + array ( + 'id' => '1436', + 'object_count' => '1', + 'word' => 'subscribe', + ), + 609 => + array ( + 'id' => '1437', + 'object_count' => '15', + 'word' => 'that', + ), + 610 => + array ( + 'id' => '1438', + 'object_count' => '3', + 'word' => 'svn', + ), + 611 => + array ( + 'id' => '1439', + 'object_count' => '2', + 'word' => 'follow', + ), + 612 => + array ( + 'id' => '1440', + 'object_count' => '1', + 'word' => 'activity', + ), + 613 => + array ( + 'id' => '1441', + 'object_count' => '1', + 'word' => 'feeds', + ), + 614 => + array ( + 'id' => '1442', + 'object_count' => '1', + 'word' => 'disposal', + ), + 615 => + array ( + 'id' => '1443', + 'object_count' => '11', + 'word' => 'all', + ), + 616 => + array ( + 'id' => '1444', + 'object_count' => '1', + 'word' => 'replies', + ), + 617 => + array ( + 'id' => '1445', + 'object_count' => '2', + 'word' => 'feed', + ), + 618 => + array ( + 'id' => '1446', + 'object_count' => '1', + 'word' => 'all_forums', + ), + 619 => + array ( + 'id' => '1447', + 'object_count' => '6', + 'word' => 'only', + ), + 620 => + array ( + 'id' => '1448', + 'object_count' => '1', + 'word' => 'forum_topics_only', + ), + 621 => + array ( + 'id' => '1449', + 'object_count' => '1', + 'word' => 'forums_developer', + ), + 622 => + array ( + 'id' => '1450', + 'object_count' => '1', + 'word' => 'discussions', + ), + 623 => + array ( + 'id' => '1451', + 'object_count' => '1', + 'word' => 'forums_discussions', + ), + 624 => + array ( + 'id' => '1452', + 'object_count' => '1', + 'word' => 'forums_extensions', + ), + 625 => + array ( + 'id' => '1453', + 'object_count' => '1', + 'word' => 'forums_feedback', + ), + 626 => + array ( + 'id' => '1454', + 'object_count' => '1', + 'word' => 'forums_general', + ), + 627 => + array ( + 'id' => '1455', + 'object_count' => '1', + 'word' => 'forums_install_and_configuration', + ), + 628 => + array ( + 'id' => '1456', + 'object_count' => '1', + 'word' => 'forums_setup_and_design', + ), + 629 => + array ( + 'id' => '1457', + 'object_count' => '1', + 'word' => 'forums_suggestions', + ), + 630 => + array ( + 'id' => '1458', + 'object_count' => '4', + 'word' => 'translation', + ), + 631 => + array ( + 'id' => '1459', + 'object_count' => '1', + 'word' => 'forums_translation', + ), + 632 => + array ( + 'id' => '1460', + 'object_count' => '3', + 'word' => 'projects', + ), + 633 => + array ( + 'id' => '1461', + 'object_count' => '1', + 'word' => 'social', + ), + 634 => + array ( + 'id' => '1462', + 'object_count' => '1', + 'word' => 'networks', + ), + 635 => + array ( + 'id' => '1463', + 'object_count' => '1', + 'word' => 'ezcommunity', + ), + 636 => + array ( + 'id' => '1464', + 'object_count' => '1', + 'word' => 'cool', + ), + 637 => + array ( + 'id' => '1465', + 'object_count' => '1', + 'word' => 'instant', + ), + 638 => + array ( + 'id' => '1466', + 'object_count' => '1', + 'word' => 'pings', + ), + 639 => + array ( + 'id' => '1467', + 'object_count' => '1', + 'word' => 'happen', + ), + 640 => + array ( + 'id' => '1468', + 'object_count' => '6', + 'word' => 'where', + ), + 641 => + array ( + 'id' => '1469', + 'object_count' => '1', + 'word' => 'active', + ), + 642 => + array ( + 'id' => '1470', + 'object_count' => '1', + 'word' => 'sphere', + ), + 643 => + array ( + 'id' => '1471', + 'object_count' => '4', + 'word' => 'first', + ), + 644 => + array ( + 'id' => '1472', + 'object_count' => '1', + 'word' => 'step', + ), + 645 => + array ( + 'id' => '1473', + 'object_count' => '1', + 'word' => 'twitter.com', + ), + 646 => + array ( + 'id' => '1474', + 'object_count' => '1', + 'word' => 'i_robin', + ), + 647 => + array ( + 'id' => '1475', + 'object_count' => '1', + 'word' => 'gathered', + ), + 648 => + array ( + 'id' => '1476', + 'object_count' => '1', + 'word' => 'swing', + ), + 649 => + array ( + 'id' => '1477', + 'object_count' => '1', + 'word' => 'waves', + ), + 650 => + array ( + 'id' => '1478', + 'object_count' => '1', + 'word' => 'got', + ), + 651 => + array ( + 'id' => '1479', + 'object_count' => '3', + 'word' => 'attention', + ), + 652 => + array ( + 'id' => '1480', + 'object_count' => '5', + 'word' => 'way', + ), + 653 => + array ( + 'id' => '1481', + 'object_count' => '7', + 'word' => 'search', + ), + 654 => + array ( + 'id' => '1482', + 'object_count' => '1', + 'word' => 'google', + ), + 655 => + array ( + 'id' => '1483', + 'object_count' => '1', + 'word' => 'wave', + ), + 656 => + array ( + 'id' => '1484', + 'object_count' => '1', + 'word' => 'come', + ), + 657 => + array ( + 'id' => '1485', + 'object_count' => '1', + 'word' => 'us', + ), + 658 => + array ( + 'id' => '1486', + 'object_count' => '2', + 'word' => 'case', + ), + 659 => + array ( + 'id' => '1487', + 'object_count' => '1', + 'word' => 'invitation', + ), + 660 => + array ( + 'id' => '1488', + 'object_count' => '1', + 'word' => 'drop', + ), + 661 => + array ( + 'id' => '1489', + 'object_count' => '3', + 'word' => 'word', + ), + 662 => + array ( + 'id' => '1490', + 'object_count' => '4', + 'word' => 'back', + ), + 663 => + array ( + 'id' => '1491', + 'object_count' => '3', + 'word' => 'top', + ), + 664 => + array ( + 'id' => '1492', + 'object_count' => '3', + 'word' => 'developing', + ), + 665 => + array ( + 'id' => '1493', + 'object_count' => '1', + 'word' => 'collaborative', + ), + 666 => + array ( + 'id' => '1494', + 'object_count' => '1', + 'word' => 'developed', + ), + 667 => + array ( + 'id' => '1495', + 'object_count' => '1', + 'word' => 'push', + ), + 668 => + array ( + 'id' => '1496', + 'object_count' => '1', + 'word' => 'ahead', + ), + 669 => + array ( + 'id' => '1497', + 'object_count' => '4', + 'word' => 'then', + ), + 670 => + array ( + 'id' => '1498', + 'object_count' => '1', + 'word' => 'projects.ez.no', + ), + 671 => + array ( + 'id' => '1499', + 'object_count' => '4', + 'word' => 'log', + ), + 672 => + array ( + 'id' => '1500', + 'object_count' => '2', + 'word' => 'account', + ), + 673 => + array ( + 'id' => '1501', + 'object_count' => '2', + 'word' => 'same', + ), + 674 => + array ( + 'id' => '1502', + 'object_count' => '4', + 'word' => 'project', + ), + 675 => + array ( + 'id' => '1503', + 'object_count' => '3', + 'word' => 'check', + ), + 676 => + array ( + 'id' => '1504', + 'object_count' => '6', + 'word' => 'no', + ), + 677 => + array ( + 'id' => '1505', + 'object_count' => '3', + 'word' => 'similar', + ), + 678 => + array ( + 'id' => '1506', + 'object_count' => '1', + 'word' => 'already', + ), + 679 => + array ( + 'id' => '1507', + 'object_count' => '1', + 'word' => 'probably', + ), + 680 => + array ( + 'id' => '1508', + 'object_count' => '3', + 'word' => 'prefer', + ), + 681 => + array ( + 'id' => '1509', + 'object_count' => '4', + 'word' => 'team', + ), + 682 => + array ( + 'id' => '1510', + 'object_count' => '3', + 'word' => 'tell', + ), + 683 => + array ( + 'id' => '1511', + 'object_count' => '1', + 'word' => 'crafted', + ), + 684 => + array ( + 'id' => '1512', + 'object_count' => '3', + 'word' => 'code', + ), + 685 => + array ( + 'id' => '1513', + 'object_count' => '5', + 'word' => 'simple', + ), + 686 => + array ( + 'id' => '1514', + 'object_count' => '1', + 'word' => 'sandbox', + ), + 687 => + array ( + 'id' => '1515', + 'object_count' => '3', + 'word' => 'subversion', + ), + 688 => + array ( + 'id' => '1516', + 'object_count' => '3', + 'word' => 'repository', + ), + 689 => + array ( + 'id' => '1517', + 'object_count' => '8', + 'word' => 'news', + ), + 690 => + array ( + 'id' => '1518', + 'object_count' => '1', + 'word' => 'wall', + ), + 691 => + array ( + 'id' => '1519', + 'object_count' => '1', + 'word' => 'rating', + ), + 692 => + array ( + 'id' => '1520', + 'object_count' => '1', + 'word' => 'praise', + ), + 693 => + array ( + 'id' => '1521', + 'object_count' => '1', + 'word' => 'blame', + ), + 694 => + array ( + 'id' => '1522', + 'object_count' => '3', + 'word' => 'galleries', + ), + 695 => + array ( + 'id' => '1523', + 'object_count' => '2', + 'word' => 'screenshots', + ), + 696 => + array ( + 'id' => '1524', + 'object_count' => '1', + 'word' => 'download', + ), + 697 => + array ( + 'id' => '1525', + 'object_count' => '2', + 'word' => 'section', + ), + 698 => + array ( + 'id' => '1526', + 'object_count' => '1', + 'word' => 'tasks', + ), + 699 => + array ( + 'id' => '1527', + 'object_count' => '1', + 'word' => 'doc.ez.no', + ), + 700 => + array ( + 'id' => '1528', + 'object_count' => '1', + 'word' => 'initiative', + ), + 701 => + array ( + 'id' => '1529', + 'object_count' => '1', + 'word' => 'ezpedia.org', + ), + 702 => + array ( + 'id' => '1530', + 'object_count' => '8', + 'word' => 'comes', + ), + 703 => + array ( + 'id' => '1531', + 'object_count' => '3', + 'word' => 'relevant', + ), + 704 => + array ( + 'id' => '1532', + 'object_count' => '1', + 'word' => 'handy', + ), + 705 => + array ( + 'id' => '1533', + 'object_count' => '1', + 'word' => 'knowledge', + ), + 706 => + array ( + 'id' => '1534', + 'object_count' => '1', + 'word' => 'base', + ), + 707 => + array ( + 'id' => '1535', + 'object_count' => '2', + 'word' => 'very', + ), + 708 => + array ( + 'id' => '1536', + 'object_count' => '1', + 'word' => 'complimentary', + ), + 709 => + array ( + 'id' => '1537', + 'object_count' => '1', + 'word' => 'apache', + ), + 710 => + array ( + 'id' => '1538', + 'object_count' => '1', + 'word' => 'zeta', + ), + 711 => + array ( + 'id' => '1539', + 'object_count' => '1', + 'word' => 'formerly', + ), + 712 => + array ( + 'id' => '1540', + 'object_count' => '1', + 'word' => 'known', + ), + 713 => + array ( + 'id' => '1541', + 'object_count' => '1', + 'word' => 'lies', + ), + 714 => + array ( + 'id' => '1542', + 'object_count' => '1', + 'word' => 'serve', + ), + 715 => + array ( + 'id' => '1543', + 'object_count' => '1', + 'word' => 'nowadays', + ), + 716 => + array ( + 'id' => '1544', + 'object_count' => '2', + 'word' => 'places', + ), + 717 => + array ( + 'id' => '1545', + 'object_count' => '1', + 'word' => 'libraries', + ), + 718 => + array ( + 'id' => '1546', + 'object_count' => '1', + 'word' => 'generally', + ), + 719 => + array ( + 'id' => '1547', + 'object_count' => '7', + 'word' => 'high', + ), + 720 => + array ( + 'id' => '1548', + 'object_count' => '4', + 'word' => 'quality', + ), + 721 => + array ( + 'id' => '1549', + 'object_count' => '7', + 'word' => 'set', + ), + 722 => + array ( + 'id' => '1550', + 'object_count' => '5', + 'word' => 'application', + ), + 723 => + array ( + 'id' => '1551', + 'object_count' => '1', + 'word' => 'testing', + ), + 724 => + array ( + 'id' => '1552', + 'object_count' => '1', + 'word' => 'sending', + ), + 725 => + array ( + 'id' => '1553', + 'object_count' => '1', + 'word' => 'release', + ), + 726 => + array ( + 'id' => '1554', + 'object_count' => '1', + 'word' => 'usual', + ), + 727 => + array ( + 'id' => '1555', + 'object_count' => '1', + 'word' => 'alpha', + ), + 728 => + array ( + 'id' => '1556', + 'object_count' => '1', + 'word' => 'beta', + ), + 729 => + array ( + 'id' => '1557', + 'object_count' => '1', + 'word' => 'rc', + ), + 730 => + array ( + 'id' => '1558', + 'object_count' => '1', + 'word' => 'countdown', + ), + 731 => + array ( + 'id' => '1559', + 'object_count' => '1', + 'word' => 'line', + ), + 732 => + array ( + 'id' => '1560', + 'object_count' => '6', + 'word' => 'these', + ), + 733 => + array ( + 'id' => '1561', + 'object_count' => '1', + 'word' => 'pre', + ), + 734 => + array ( + 'id' => '1562', + 'object_count' => '3', + 'word' => 'versions', + ), + 735 => + array ( + 'id' => '1563', + 'object_count' => '1', + 'word' => 'regular', + ), + 736 => + array ( + 'id' => '1564', + 'object_count' => '1', + 'word' => 'fevers', + ), + 737 => + array ( + 'id' => '1565', + 'object_count' => '1', + 'word' => 'basis', + ), + 738 => + array ( + 'id' => '1566', + 'object_count' => '1', + 'word' => 'report', + ), + 739 => + array ( + 'id' => '1567', + 'object_count' => '5', + 'word' => 'issues', + ), + 740 => + array ( + 'id' => '1568', + 'object_count' => '1', + 'word' => 'found', + ), + 741 => + array ( + 'id' => '1569', + 'object_count' => '5', + 'word' => 'well', + ), + 742 => + array ( + 'id' => '1570', + 'object_count' => '1', + 'word' => 'propose', + ), + 743 => + array ( + 'id' => '1571', + 'object_count' => '1', + 'word' => 'enhancements', + ), + 744 => + array ( + 'id' => '1572', + 'object_count' => '1', + 'word' => 'happens', + ), + 745 => + array ( + 'id' => '1573', + 'object_count' => '1', + 'word' => 'issues.ez.no', + ), + 746 => + array ( + 'id' => '1574', + 'object_count' => '1', + 'word' => 'checking', + ), + 747 => + array ( + 'id' => '1575', + 'object_count' => '1', + 'word' => 'hosted', + ), + 748 => + array ( + 'id' => '1576', + 'object_count' => '1', + 'word' => 'github', + ), + 749 => + array ( + 'id' => '1577', + 'object_count' => '5', + 'word' => 'server', + ), + 750 => + array ( + 'id' => '1578', + 'object_count' => '3', + 'word' => 'enjoy', + ), + 751 => + array ( + 'id' => '1579', + 'object_count' => '1', + 'word' => 'localisation', + ), + 752 => + array ( + 'id' => '1580', + 'object_count' => '1', + 'word' => 'ezpublish_translation', + ), + 753 => + array ( + 'id' => '1581', + 'object_count' => '1', + 'word' => 'necessary', + ), + 754 => + array ( + 'id' => '1582', + 'object_count' => '1', + 'word' => 'details', + ), + 755 => + array ( + 'id' => '1583', + 'object_count' => '1', + 'word' => 'linguist', + ), + 756 => + array ( + 'id' => '1584', + 'object_count' => '1', + 'word' => 'soul', + ), + 757 => + array ( + 'id' => '1585', + 'object_count' => '1', + 'word' => 'fed', + ), + 758 => + array ( + 'id' => '1586', + 'object_count' => '3', + 'word' => 'being', + ), + 759 => + array ( + 'id' => '1587', + 'object_count' => '1', + 'word' => 'able', + ), + 760 => + array ( + 'id' => '1588', + 'object_count' => '2', + 'word' => 'multitude', + ), + 761 => + array ( + 'id' => '1589', + 'object_count' => '2', + 'word' => 'ensuring', + ), + 762 => + array ( + 'id' => '1590', + 'object_count' => '3', + 'word' => 'quickly', + ), + 763 => + array ( + 'id' => '1591', + 'object_count' => '4', + 'word' => 'put', + ), + 764 => + array ( + 'id' => '1592', + 'object_count' => '3', + 'word' => 'browser', + ), + 765 => + array ( + 'id' => '1593', + 'object_count' => '2', + 'word' => 'processors', + ), + 766 => + array ( + 'id' => '1594', + 'object_count' => '3', + 'word' => 'translate', + ), + 767 => + array ( + 'id' => '1595', + 'object_count' => '2', + 'word' => 'upload', + ), + 768 => + array ( + 'id' => '1596', + 'object_count' => '8', + 'word' => 'multiple', + ), + 769 => + array ( + 'id' => '1597', + 'object_count' => '4', + 'word' => 'once', + ), + 770 => + array ( + 'id' => '1598', + 'object_count' => '2', + 'word' => 'picture', + ), + 771 => + array ( + 'id' => '1599', + 'object_count' => '3', + 'word' => '2.0', + ), + 772 => + array ( + 'id' => '1600', + 'object_count' => '3', + 'word' => 'pictures', + ), + 773 => + array ( + 'id' => '1601', + 'object_count' => '4', + 'word' => 'directly', + ), + 774 => + array ( + 'id' => '1602', + 'object_count' => '6', + 'word' => 'using', + ), + 775 => + array ( + 'id' => '1603', + 'object_count' => '4', + 'word' => 'toolbar', + ), + 776 => + array ( + 'id' => '1604', + 'object_count' => '4', + 'word' => 'appears', + ), + 777 => + array ( + 'id' => '1605', + 'object_count' => '10', + 'word' => 'when', + ), + 778 => + array ( + 'id' => '1606', + 'object_count' => '5', + 'word' => 'enables', + ), + 779 => + array ( + 'id' => '1607', + 'object_count' => '2', + 'word' => 'move', + ), + 780 => + array ( + 'id' => '1608', + 'object_count' => '2', + 'word' => 'replace', + ), + 781 => + array ( + 'id' => '1609', + 'object_count' => '5', + 'word' => 'any', + ), + 782 => + array ( + 'id' => '1610', + 'object_count' => '2', + 'word' => 'kind', + ), + 783 => + array ( + 'id' => '1611', + 'object_count' => '2', + 'word' => 'wysiwyg', + ), + 784 => + array ( + 'id' => '1612', + 'object_count' => '4', + 'word' => 'integrated', + ), + 785 => + array ( + 'id' => '1613', + 'object_count' => '3', + 'word' => 'html', + ), + 786 => + array ( + 'id' => '1614', + 'object_count' => '2', + 'word' => 'coding', + ), + 787 => + array ( + 'id' => '1615', + 'object_count' => '2', + 'word' => 'required', + ), + 788 => + array ( + 'id' => '1616', + 'object_count' => '4', + 'word' => 'providing', + ), + 789 => + array ( + 'id' => '1617', + 'object_count' => '2', + 'word' => 'formatting', + ), + 790 => + array ( + 'id' => '1618', + 'object_count' => '4', + 'word' => 'functions', + ), + 791 => + array ( + 'id' => '1619', + 'object_count' => '2', + 'word' => 'processing', + ), + 792 => + array ( + 'id' => '1620', + 'object_count' => '6', + 'word' => 'applications', + ), + 793 => + array ( + 'id' => '1621', + 'object_count' => '2', + 'word' => 'favourite', + ), + 794 => + array ( + 'id' => '1622', + 'object_count' => '2', + 'word' => 'processor', + ), + 795 => + array ( + 'id' => '1623', + 'object_count' => '2', + 'word' => 'managers', + ), + 796 => + array ( + 'id' => '1624', + 'object_count' => '4', + 'word' => 'working', + ), + 797 => + array ( + 'id' => '1625', + 'object_count' => '2', + 'word' => 'microsoft', + ), + 798 => + array ( + 'id' => '1626', + 'object_count' => '3', + 'word' => 'office', + ), + 799 => + array ( + 'id' => '1627', + 'object_count' => '3', + 'word' => 'import', + ), + 800 => + array ( + 'id' => '1628', + 'object_count' => '2', + 'word' => 'export', + ), + 801 => + array ( + 'id' => '1629', + 'object_count' => '4', + 'word' => 'edit', + ), + 802 => + array ( + 'id' => '1630', + 'object_count' => '2', + 'word' => 'favorite', + ), + 803 => + array ( + 'id' => '1631', + 'object_count' => '7', + 'word' => 'even', + ), + 804 => + array ( + 'id' => '1632', + 'object_count' => '3', + 'word' => 'might', + ), + 805 => + array ( + 'id' => '1633', + 'object_count' => '2', + 'word' => 'internet', + ), + 806 => + array ( + 'id' => '1634', + 'object_count' => '2', + 'word' => 'afterwards', + ), + 807 => + array ( + 'id' => '1635', + 'object_count' => '2', + 'word' => 'document', + ), + 808 => + array ( + 'id' => '1636', + 'object_count' => '5', + 'word' => 'either', + ), + 809 => + array ( + 'id' => '1637', + 'object_count' => '2', + 'word' => 'webdav', + ), + 810 => + array ( + 'id' => '1638', + 'object_count' => '5', + 'word' => 'front', + ), + 811 => + array ( + 'id' => '1639', + 'object_count' => '7', + 'word' => 'end', + ), + 812 => + array ( + 'id' => '1640', + 'object_count' => '3', + 'word' => 'generate', + ), + 813 => + array ( + 'id' => '1641', + 'object_count' => '3', + 'word' => 'update', + ), + 814 => + array ( + 'id' => '1642', + 'object_count' => '2', + 'word' => 'translated', + ), + 815 => + array ( + 'id' => '1643', + 'object_count' => '2', + 'word' => 'languages', + ), + 816 => + array ( + 'id' => '1644', + 'object_count' => '2', + 'word' => 'administer', + ), + 817 => + array ( + 'id' => '1645', + 'object_count' => '3', + 'word' => 'efficient', + ), + 818 => + array ( + 'id' => '1646', + 'object_count' => '5', + 'word' => 'makes', + ), + 819 => + array ( + 'id' => '1647', + 'object_count' => '3', + 'word' => 'easier', + ), + 820 => + array ( + 'id' => '1648', + 'object_count' => '4', + 'word' => 'maintain', + ), + 821 => + array ( + 'id' => '1649', + 'object_count' => '2', + 'word' => 'consistent', + ), + 822 => + array ( + 'id' => '1650', + 'object_count' => '2', + 'word' => 'brand', + ), + 823 => + array ( + 'id' => '1651', + 'object_count' => '5', + 'word' => 'across', + ), + 824 => + array ( + 'id' => '1652', + 'object_count' => '2', + 'word' => 'countries', + ), + 825 => + array ( + 'id' => '1653', + 'object_count' => '2', + 'word' => 'international', + ), + 826 => + array ( + 'id' => '1654', + 'object_count' => '2', + 'word' => 'corporation', + ), + 827 => + array ( + 'id' => '1655', + 'object_count' => '2', + 'word' => 'organization', + ), + 828 => + array ( + 'id' => '1656', + 'object_count' => '5', + 'word' => 'several', + ), + 829 => + array ( + 'id' => '1657', + 'object_count' => '2', + 'word' => 'visitor', + ), + 830 => + array ( + 'id' => '1658', + 'object_count' => '2', + 'word' => 'selects', + ), + 831 => + array ( + 'id' => '1659', + 'object_count' => '2', + 'word' => 'menus', + ), + 832 => + array ( + 'id' => '1660', + 'object_count' => '4', + 'word' => 'displayed', + ), + 833 => + array ( + 'id' => '1661', + 'object_count' => '2', + 'word' => 'accordingly', + ), + 834 => + array ( + 'id' => '1662', + 'object_count' => '2', + 'word' => 'yet', + ), + 835 => + array ( + 'id' => '1663', + 'object_count' => '2', + 'word' => 'shown', + ), + 836 => + array ( + 'id' => '1664', + 'object_count' => '4', + 'word' => 'depending', + ), + 837 => + array ( + 'id' => '1665', + 'object_count' => '7', + 'word' => 'editing', + ), + 838 => + array ( + 'id' => '1666', + 'object_count' => '3', + 'word' => 'choose', + ), + 839 => + array ( + 'id' => '1667', + 'object_count' => '2', + 'word' => 'switch', + ), + 840 => + array ( + 'id' => '1668', + 'object_count' => '2', + 'word' => 'currently', + ), + 841 => + array ( + 'id' => '1669', + 'object_count' => '2', + 'word' => 'aid', + ), + 842 => + array ( + 'id' => '1670', + 'object_count' => '5', + 'word' => 'process', + ), + 843 => + array ( + 'id' => '1671', + 'object_count' => '4', + 'word' => 'creating', + ), + 844 => + array ( + 'id' => '1672', + 'object_count' => '2', + 'word' => 'updating', + ), + 845 => + array ( + 'id' => '1673', + 'object_count' => '4', + 'word' => 'built', + ), + 846 => + array ( + 'id' => '1674', + 'object_count' => '2', + 'word' => 'diff', + ), + 847 => + array ( + 'id' => '1675', + 'object_count' => '2', + 'word' => 'added', + ), + 848 => + array ( + 'id' => '1676', + 'object_count' => '2', + 'word' => 'removed', + ), + 849 => + array ( + 'id' => '1677', + 'object_count' => '5', + 'word' => 'text', + ), + 850 => + array ( + 'id' => '1678', + 'object_count' => '3', + 'word' => 'multilingual', + ), + 851 => + array ( + 'id' => '1679', + 'object_count' => '4', + 'word' => 'urls', + ), + 852 => + array ( + 'id' => '1680', + 'object_count' => '3', + 'word' => 'created', + ), + 853 => + array ( + 'id' => '1681', + 'object_count' => '3', + 'word' => 'each', + ), + 854 => + array ( + 'id' => '1682', + 'object_count' => '3', + 'word' => 'default', + ), + 855 => + array ( + 'id' => '1683', + 'object_count' => '7', + 'word' => 'object', + ), + 856 => + array ( + 'id' => '1684', + 'object_count' => '4', + 'word' => 'called', + ), + 857 => + array ( + 'id' => '1685', + 'object_count' => '4', + 'word' => 'easy', + ), + 858 => + array ( + 'id' => '1686', + 'object_count' => '6', + 'word' => 'url', + ), + 859 => + array ( + 'id' => '1687', + 'object_count' => '2', + 'word' => 'facile', + ), + 860 => + array ( + 'id' => '1688', + 'object_count' => '8', + 'word' => 'time', + ), + 861 => + array ( + 'id' => '1689', + 'object_count' => '7', + 'word' => 'has', + ), + 862 => + array ( + 'id' => '1690', + 'object_count' => '6', + 'word' => 'multi', + ), + 863 => + array ( + 'id' => '1691', + 'object_count' => '2', + 'word' => 'select', + ), + 864 => + array ( + 'id' => '1692', + 'object_count' => '2', + 'word' => 'computer', + ), + 865 => + array ( + 'id' => '1693', + 'object_count' => '3', + 'word' => 'stored', + ), + 866 => + array ( + 'id' => '1694', + 'object_count' => '2', + 'word' => 'detect', + ), + 867 => + array ( + 'id' => '1695', + 'object_count' => '2', + 'word' => 'uploaded', + ), + 868 => + array ( + 'id' => '1696', + 'object_count' => '2', + 'word' => 'creates', + ), + 869 => + array ( + 'id' => '1697', + 'object_count' => '3', + 'word' => 'appropriate', + ), + 870 => + array ( + 'id' => '1698', + 'object_count' => '5', + 'word' => 'add', + ), + 871 => + array ( + 'id' => '1699', + 'object_count' => '2', + 'word' => 'scale', + ), + 872 => + array ( + 'id' => '1700', + 'object_count' => '2', + 'word' => 'format', + ), + 873 => + array ( + 'id' => '1701', + 'object_count' => '2', + 'word' => 'resize', + ), + 874 => + array ( + 'id' => '1702', + 'object_count' => '4', + 'word' => 'automatically', + ), + 875 => + array ( + 'id' => '1703', + 'object_count' => '2', + 'word' => 'browse', + ), + 876 => + array ( + 'id' => '1704', + 'object_count' => '2', + 'word' => 'elsewhere', + ), + 877 => + array ( + 'id' => '1705', + 'object_count' => '2', + 'word' => 'basically', + ), + 878 => + array ( + 'id' => '1706', + 'object_count' => '4', + 'word' => 'store', + ), + 879 => + array ( + 'id' => '1707', + 'object_count' => '2', + 'word' => 'display', + ), + 880 => + array ( + 'id' => '1708', + 'object_count' => '2', + 'word' => 'tv', + ), + 881 => + array ( + 'id' => '1709', + 'object_count' => '2', + 'word' => 'youtube', + ), + 882 => + array ( + 'id' => '1710', + 'object_count' => '2', + 'word' => 'tag', + ), + 883 => + array ( + 'id' => '1711', + 'object_count' => '2', + 'word' => 'clouds', + ), + 884 => + array ( + 'id' => '1712', + 'object_count' => '2', + 'word' => 'polls', + ), + 885 => + array ( + 'id' => '1713', + 'object_count' => '5', + 'word' => 'engine', + ), + 886 => + array ( + 'id' => '1714', + 'object_count' => '2', + 'word' => 'loaded', + ), + 887 => + array ( + 'id' => '1715', + 'object_count' => '5', + 'word' => 'websites', + ), + 888 => + array ( + 'id' => '1716', + 'object_count' => '32', + 'word' => 'graphics1', + ), + 889 => + array ( + 'id' => '1717', + 'object_count' => '2', + 'word' => 'manage', + ), + 890 => + array ( + 'id' => '1718', + 'object_count' => '3', + 'word' => 'provide', + ), + 891 => + array ( + 'id' => '1719', + 'object_count' => '3', + 'word' => 'control', + ), + 892 => + array ( + 'id' => '1720', + 'object_count' => '3', + 'word' => 'over', + ), + 893 => + array ( + 'id' => '1721', + 'object_count' => '4', + 'word' => 'both', + ), + 894 => + array ( + 'id' => '1722', + 'object_count' => '2', + 'word' => 'permission', + ), + 895 => + array ( + 'id' => '1723', + 'object_count' => '4', + 'word' => 'workflows', + ), + 896 => + array ( + 'id' => '1724', + 'object_count' => '3', + 'word' => 'versioning', + ), + 897 => + array ( + 'id' => '1725', + 'object_count' => '2', + 'word' => 'modification', + ), + 898 => + array ( + 'id' => '1726', + 'object_count' => '2', + 'word' => 'tracking', + ), + 899 => + array ( + 'id' => '1727', + 'object_count' => '3', + 'word' => 'unique', + ), + 900 => + array ( + 'id' => '1728', + 'object_count' => '4', + 'word' => 'model', + ), + 901 => + array ( + 'id' => '1729', + 'object_count' => '2', + 'word' => 'cross', + ), + 902 => + array ( + 'id' => '1730', + 'object_count' => '2', + 'word' => 'deployment', + ), + 903 => + array ( + 'id' => '1731', + 'object_count' => '2', + 'word' => 'optimization', + ), + 904 => + array ( + 'id' => '1732', + 'object_count' => '3', + 'word' => 'rich', + ), + 905 => + array ( + 'id' => '1733', + 'object_count' => '3', + 'word' => 'powerful', + ), + 906 => + array ( + 'id' => '1734', + 'object_count' => '2', + 'word' => 'modified', + ), + 907 => + array ( + 'id' => '1735', + 'object_count' => '2', + 'word' => 'ways', + ), + 908 => + array ( + 'id' => '1736', + 'object_count' => '3', + 'word' => 'tools', + ), + 909 => + array ( + 'id' => '1737', + 'object_count' => '2', + 'word' => 'customization', + ), + 910 => + array ( + 'id' => '1738', + 'object_count' => '2', + 'word' => 'words', + ), + 911 => + array ( + 'id' => '1739', + 'object_count' => '4', + 'word' => 'change', + ), + 912 => + array ( + 'id' => '1740', + 'object_count' => '2', + 'word' => 'almost', + ), + 913 => + array ( + 'id' => '1741', + 'object_count' => '2', + 'word' => 'everything', + ), + 914 => + array ( + 'id' => '1742', + 'object_count' => '2', + 'word' => 'rights', + ), + 915 => + array ( + 'id' => '1743', + 'object_count' => '3', + 'word' => 'level', + ), + 916 => + array ( + 'id' => '1744', + 'object_count' => '4', + 'word' => 'means', + ), + 917 => + array ( + 'id' => '1745', + 'object_count' => '2', + 'word' => 'give', + ), + 918 => + array ( + 'id' => '1746', + 'object_count' => '2', + 'word' => 'combination', + ), + 919 => + array ( + 'id' => '1747', + 'object_count' => '2', + 'word' => 'whole', + ), + 920 => + array ( + 'id' => '1748', + 'object_count' => '2', + 'word' => 'area', + ), + 921 => + array ( + 'id' => '1749', + 'object_count' => '11', + 'word' => 'example', + ), + 922 => + array ( + 'id' => '1750', + 'object_count' => '2', + 'word' => 'restrict', + ), + 923 => + array ( + 'id' => '1751', + 'object_count' => '3', + 'word' => 'certain', + ), + 924 => + array ( + 'id' => '1752', + 'object_count' => '3', + 'word' => 'part', + ), + 925 => + array ( + 'id' => '1753', + 'object_count' => '4', + 'word' => 'partner', + ), + 926 => + array ( + 'id' => '1754', + 'object_count' => '3', + 'word' => 'mechanism', + ), + 927 => + array ( + 'id' => '1755', + 'object_count' => '3', + 'word' => 'collaboration', + ), + 928 => + array ( + 'id' => '1756', + 'object_count' => '4', + 'word' => 'defines', + ), + 929 => + array ( + 'id' => '1757', + 'object_count' => '2', + 'word' => 'ordered', + ), + 930 => + array ( + 'id' => '1758', + 'object_count' => '2', + 'word' => 'sequence', + ), + 931 => + array ( + 'id' => '1759', + 'object_count' => '2', + 'word' => 'actions', + ), + 932 => + array ( + 'id' => '1760', + 'object_count' => '2', + 'word' => 'executed', + ), + 933 => + array ( + 'id' => '1761', + 'object_count' => '4', + 'word' => 'published', + ), + 934 => + array ( + 'id' => '1762', + 'object_count' => '2', + 'word' => 'suppose', + ), + 935 => + array ( + 'id' => '1763', + 'object_count' => '2', + 'word' => 'restriction', + ), + 936 => + array ( + 'id' => '1764', + 'object_count' => '3', + 'word' => 'go', + ), + 937 => + array ( + 'id' => '1765', + 'object_count' => '2', + 'word' => 'chief', + ), + 938 => + array ( + 'id' => '1766', + 'object_count' => '3', + 'word' => 'before', + ), + 939 => + array ( + 'id' => '1767', + 'object_count' => '2', + 'word' => 'pending', + ), + 940 => + array ( + 'id' => '1768', + 'object_count' => '2', + 'word' => 'approved', + ), + 941 => + array ( + 'id' => '1769', + 'object_count' => '2', + 'word' => 'hand', + ), + 942 => + array ( + 'id' => '1770', + 'object_count' => '3', + 'word' => 'pending', + ), + 943 => + array ( + 'id' => '1771', + 'object_count' => '2', + 'word' => 'rejected', + ), + 944 => + array ( + 'id' => '1772', + 'object_count' => '2', + 'word' => 'rejected', + ), + 945 => + array ( + 'id' => '1773', + 'object_count' => '2', + 'word' => 'e', + ), + 946 => + array ( + 'id' => '1774', + 'object_count' => '2', + 'word' => 'commerce', + ), + 947 => + array ( + 'id' => '1775', + 'object_count' => '2', + 'word' => 'subscriptions', + ), + 948 => + array ( + 'id' => '1776', + 'object_count' => '2', + 'word' => 'automating', + ), + 949 => + array ( + 'id' => '1777', + 'object_count' => '2', + 'word' => 'paid', + ), + 950 => + array ( + 'id' => '1778', + 'object_count' => '2', + 'word' => 'subscribers', + ), + 951 => + array ( + 'id' => '1779', + 'object_count' => '3', + 'word' => 'premium', + ), + 952 => + array ( + 'id' => '1780', + 'object_count' => '2', + 'word' => 'watch', + ), + 953 => + array ( + 'id' => '1781', + 'object_count' => '2', + 'word' => 'older', + ), + 954 => + array ( + 'id' => '1782', + 'object_count' => '2', + 'word' => 'supervisors', + ), + 955 => + array ( + 'id' => '1783', + 'object_count' => '2', + 'word' => 'inconsistency', + ), + 956 => + array ( + 'id' => '1784', + 'object_count' => '2', + 'word' => 'errors', + ), + 957 => + array ( + 'id' => '1785', + 'object_count' => '2', + 'word' => 'keeps', + ), + 958 => + array ( + 'id' => '1786', + 'object_count' => '5', + 'word' => 'track', + ), + 959 => + array ( + 'id' => '1787', + 'object_count' => '7', + 'word' => 'changes', + ), + 960 => + array ( + 'id' => '1788', + 'object_count' => '2', + 'word' => 'were', + ), + 961 => + array ( + 'id' => '1789', + 'object_count' => '4', + 'word' => 'made', + ), + 962 => + array ( + 'id' => '1790', + 'object_count' => '6', + 'word' => 'what', + ), + 963 => + array ( + 'id' => '1791', + 'object_count' => '6', + 'word' => 'provides', + ), + 964 => + array ( + 'id' => '1792', + 'object_count' => '2', + 'word' => 'revert', + ), + 965 => + array ( + 'id' => '1793', + 'object_count' => '2', + 'word' => 'previous', + ), + 966 => + array ( + 'id' => '1794', + 'object_count' => '2', + 'word' => 'longer', + ), + 967 => + array ( + 'id' => '1795', + 'object_count' => '3', + 'word' => 'needs', + ), + 968 => + array ( + 'id' => '1796', + 'object_count' => '2', + 'word' => 'must', + ), + 969 => + array ( + 'id' => '1797', + 'object_count' => '3', + 'word' => 'define', + ), + 970 => + array ( + 'id' => '1798', + 'object_count' => '4', + 'word' => 'structures', + ), + 971 => + array ( + 'id' => '1799', + 'object_count' => '2', + 'word' => 'cars', + ), + 972 => + array ( + 'id' => '1800', + 'object_count' => '2', + 'word' => 'recipes', + ), + 973 => + array ( + 'id' => '1801', + 'object_count' => '2', + 'word' => 'webshop', + ), + 974 => + array ( + 'id' => '1802', + 'object_count' => '3', + 'word' => 'flexible', + ), + 975 => + array ( + 'id' => '1803', + 'object_count' => '2', + 'word' => 'administrators', + ), + 976 => + array ( + 'id' => '1804', + 'object_count' => '2', + 'word' => 'definitions', + ), + 977 => + array ( + 'id' => '1805', + 'object_count' => '2', + 'word' => 'graphical', + ), + 978 => + array ( + 'id' => '1806', + 'object_count' => '3', + 'word' => 'interfaces', + ), + 979 => + array ( + 'id' => '1807', + 'object_count' => '2', + 'word' => 'throughout', + ), + 980 => + array ( + 'id' => '1808', + 'object_count' => '4', + 'word' => 'while', + ), + 981 => + array ( + 'id' => '1809', + 'object_count' => '2', + 'word' => 'avoiding', + ), + 982 => + array ( + 'id' => '1810', + 'object_count' => '2', + 'word' => 'inconsistent', + ), + 983 => + array ( + 'id' => '1811', + 'object_count' => '2', + 'word' => 'duplicates', + ), + 984 => + array ( + 'id' => '1812', + 'object_count' => '4', + 'word' => 'locations', + ), + 985 => + array ( + 'id' => '1813', + 'object_count' => '2', + 'word' => '', + ), + 986 => + array ( + 'id' => '1814', + 'object_count' => '2', + 'word' => 'reflected', + ), + 987 => + array ( + 'id' => '1815', + 'object_count' => '4', + 'word' => 'host', + ), + 988 => + array ( + 'id' => '1816', + 'object_count' => '8', + 'word' => 'different', + ), + 989 => + array ( + 'id' => '1817', + 'object_count' => '2', + 'word' => 'possibility', + ), + 990 => + array ( + 'id' => '1818', + 'object_count' => '4', + 'word' => 'sites', + ), + 991 => + array ( + 'id' => '1819', + 'object_count' => '2', + 'word' => 'continuous', + ), + 992 => + array ( + 'id' => '1820', + 'object_count' => '2', + 'word' => 'overview', + ), + 993 => + array ( + 'id' => '1821', + 'object_count' => '2', + 'word' => 'industrialize', + ), + 994 => + array ( + 'id' => '1822', + 'object_count' => '2', + 'word' => 'via', + ), + 995 => + array ( + 'id' => '1823', + 'object_count' => '2', + 'word' => 'factory', + ), + 996 => + array ( + 'id' => '1824', + 'object_count' => '3', + 'word' => 'subscription', + ), + 997 => + array ( + 'id' => '1825', + 'object_count' => '2', + 'word' => 'effectively', + ), + 998 => + array ( + 'id' => '1826', + 'object_count' => '2', + 'word' => 'indexed', + ), + 999 => + array ( + 'id' => '1827', + 'object_count' => '4', + 'word' => 'engines', + ), + 1000 => + array ( + 'id' => '1828', + 'object_count' => '2', + 'word' => 'sitemaps', + ), + 1001 => + array ( + 'id' => '1829', + 'object_count' => '2', + 'word' => 'friendly', + ), + 1002 => + array ( + 'id' => '1830', + 'object_count' => '5', + 'word' => 'key', + ), + 1003 => + array ( + 'id' => '1831', + 'object_count' => '2', + 'word' => 'xhtml', + ), + 1004 => + array ( + 'id' => '1832', + 'object_count' => '3', + 'word' => 'tags', + ), + 1005 => + array ( + 'id' => '1833', + 'object_count' => '4', + 'word' => 'basic', + ), + 1006 => + array ( + 'id' => '1834', + 'object_count' => '2', + 'word' => 'clear', + ), + 1007 => + array ( + 'id' => '1835', + 'object_count' => '5', + 'word' => 'developers', + ), + 1008 => + array ( + 'id' => '1836', + 'object_count' => '3', + 'word' => 'customize', + ), + 1009 => + array ( + 'id' => '1837', + 'object_count' => '3', + 'word' => 'extend', + ), + 1010 => + array ( + 'id' => '1838', + 'object_count' => '3', + 'word' => 'concept', + ), + 1011 => + array ( + 'id' => '1839', + 'object_count' => '3', + 'word' => 'css', + ), + 1012 => + array ( + 'id' => '1840', + 'object_count' => '3', + 'word' => 'templates', + ), + 1013 => + array ( + 'id' => '1841', + 'object_count' => '2', + 'word' => 'library', + ), + 1014 => + array ( + 'id' => '1842', + 'object_count' => '2', + 'word' => 'php', + ), + 1015 => + array ( + 'id' => '1843', + 'object_count' => '3', + 'word' => 'environment', + ), + 1016 => + array ( + 'id' => '1844', + 'object_count' => '2', + 'word' => 'piece', + ), + 1017 => + array ( + 'id' => '1845', + 'object_count' => '5', + 'word' => 'instance', + ), + 1018 => + array ( + 'id' => '1846', + 'object_count' => '2', + 'word' => 'definition', + ), + 1019 => + array ( + 'id' => '1847', + 'object_count' => '2', + 'word' => 'arbitrary', + ), + 1020 => + array ( + 'id' => '1848', + 'object_count' => '3', + 'word' => 'data', + ), + 1021 => + array ( + 'id' => '1849', + 'object_count' => '3', + 'word' => 'structure', + ), + 1022 => + array ( + 'id' => '1850', + 'object_count' => '2', + 'word' => 'does', + ), + 1023 => + array ( + 'id' => '1851', + 'object_count' => '4', + 'word' => 'actual', + ), + 1024 => + array ( + 'id' => '1852', + 'object_count' => '3', + 'word' => 'attributes', + ), + 1025 => + array ( + 'id' => '1853', + 'object_count' => '2', + 'word' => 'characteristics', + ), + 1026 => + array ( + 'id' => '1854', + 'object_count' => '2', + 'word' => 'attribute', + ), + 1027 => + array ( + 'id' => '1855', + 'object_count' => '3', + 'word' => 'determined', + ), + 1028 => + array ( + 'id' => '1856', + 'object_count' => '2', + 'word' => 'datatype', + ), + 1029 => + array ( + 'id' => '1857', + 'object_count' => '2', + 'word' => 'chosen', + ), + 1030 => + array ( + 'id' => '1858', + 'object_count' => '2', + 'word' => 'combining', + ), + 1031 => + array ( + 'id' => '1859', + 'object_count' => '2', + 'word' => 'datatypes', + ), + 1032 => + array ( + 'id' => '1860', + 'object_count' => '3', + 'word' => 'represent', + ), + 1033 => + array ( + 'id' => '1861', + 'object_count' => '5', + 'word' => 'complex', + ), + 1034 => + array ( + 'id' => '1862', + 'object_count' => '2', + 'word' => 'illustration', + ), + 1035 => + array ( + 'id' => '1863', + 'object_count' => '2', + 'word' => 'above', + ), + 1036 => + array ( + 'id' => '1864', + 'object_count' => '2', + 'word' => 'shows', + ), + 1037 => + array ( + 'id' => '1865', + 'object_count' => '2', + 'word' => 'anatomy', + ), + 1038 => + array ( + 'id' => '1866', + 'object_count' => '3', + 'word' => 'storing', + ), + 1039 => + array ( + 'id' => '1867', + 'object_count' => '2', + 'word' => 'consists', + ), + 1040 => + array ( + 'id' => '1868', + 'object_count' => '3', + 'word' => 'title', + ), + 1041 => + array ( + 'id' => '1869', + 'object_count' => '4', + 'word' => 'introduction', + ), + 1042 => + array ( + 'id' => '1870', + 'object_count' => '3', + 'word' => 'body', + ), + 1043 => + array ( + 'id' => '1871', + 'object_count' => '3', + 'word' => 'thing', + ), + 1044 => + array ( + 'id' => '1872', + 'object_count' => '3', + 'word' => 'look', + ), + 1045 => + array ( + 'id' => '1873', + 'object_count' => '2', + 'word' => 'done', + ), + 1046 => + array ( + 'id' => '1874', + 'object_count' => '2', + 'word' => 'modifying', + ), + 1047 => + array ( + 'id' => '1875', + 'object_count' => '2', + 'word' => 'overriding', + ), + 1048 => + array ( + 'id' => '1876', + 'object_count' => '2', + 'word' => 'reusable', + ), + 1049 => + array ( + 'id' => '1877', + 'object_count' => '3', + 'word' => 'packages', + ), + 1050 => + array ( + 'id' => '1878', + 'object_count' => '2', + 'word' => 'include', + ), + 1051 => + array ( + 'id' => '1879', + 'object_count' => '3', + 'word' => 'template', + ), + 1052 => + array ( + 'id' => '1880', + 'object_count' => '2', + 'word' => '4.x', + ), + 1053 => + array ( + 'id' => '1881', + 'object_count' => '3', + 'word' => 'next', + ), + 1054 => + array ( + 'id' => '1882', + 'object_count' => '2', + 'word' => 'generations', + ), + 1055 => + array ( + 'id' => '1883', + 'object_count' => '4', + 'word' => 'independent', + ), + 1056 => + array ( + 'id' => '1884', + 'object_count' => '2', + 'word' => 'aiming', + ), + 1057 => + array ( + 'id' => '1885', + 'object_count' => '2', + 'word' => 'centric', + ), + 1058 => + array ( + 'id' => '1886', + 'object_count' => '2', + 'word' => 'customising', + ), + 1059 => + array ( + 'id' => '1887', + 'object_count' => '2', + 'word' => 'extending', + ), + 1060 => + array ( + 'id' => '1888', + 'object_count' => '2', + 'word' => 'focus', + ), + 1061 => + array ( + 'id' => '1889', + 'object_count' => '2', + 'word' => 'solving', + ), + 1062 => + array ( + 'id' => '1890', + 'object_count' => '2', + 'word' => 'important', + ), + 1063 => + array ( + 'id' => '1891', + 'object_count' => '2', + 'word' => 'parts', + ), + 1064 => + array ( + 'id' => '1892', + 'object_count' => '4', + 'word' => 'written', + ), + 1065 => + array ( + 'id' => '1893', + 'object_count' => '2', + 'word' => 'occurring', + ), + 1066 => + array ( + 'id' => '1894', + 'object_count' => '2', + 'word' => 'deal', + ), + 1067 => + array ( + 'id' => '1895', + 'object_count' => '3', + 'word' => 'building', + ), + 1068 => + array ( + 'id' => '1896', + 'object_count' => '4', + 'word' => 'without', + ), + 1069 => + array ( + 'id' => '1897', + 'object_count' => '2', + 'word' => 'superfluous', + ), + 1070 => + array ( + 'id' => '1898', + 'object_count' => '2', + 'word' => 'ballast', + ), + 1071 => + array ( + 'id' => '1899', + 'object_count' => '2', + 'word' => 'order', + ), + 1072 => + array ( + 'id' => '1900', + 'object_count' => '2', + 'word' => 'cater', + ), + 1073 => + array ( + 'id' => '1901', + 'object_count' => '2', + 'word' => 'goal', + ), + 1074 => + array ( + 'id' => '1902', + 'object_count' => '2', + 'word' => 'factor', + ), + 1075 => + array ( + 'id' => '1903', + 'object_count' => '2', + 'word' => 'uses', + ), + 1076 => + array ( + 'id' => '1904', + 'object_count' => '2', + 'word' => 'test', + ), + 1077 => + array ( + 'id' => '1905', + 'object_count' => '2', + 'word' => 'driven', + ), + 1078 => + array ( + 'id' => '1906', + 'object_count' => '2', + 'word' => 'methodology', + ), + 1079 => + array ( + 'id' => '1907', + 'object_count' => '4', + 'word' => 'large', + ), + 1080 => + array ( + 'id' => '1908', + 'object_count' => '3', + 'word' => 'effort', + ), + 1081 => + array ( + 'id' => '1909', + 'object_count' => '2', + 'word' => 'making', + ), + 1082 => + array ( + 'id' => '1910', + 'object_count' => '4', + 'word' => 'apis', + ), + 1083 => + array ( + 'id' => '1911', + 'object_count' => '2', + 'word' => 'testable', + ), + 1084 => + array ( + 'id' => '1912', + 'object_count' => '2', + 'word' => 'results', + ), + 1085 => + array ( + 'id' => '1913', + 'object_count' => '3', + 'word' => 'better', + ), + 1086 => + array ( + 'id' => '1914', + 'object_count' => '2', + 'word' => 'modules', + ), + 1087 => + array ( + 'id' => '1915', + 'object_count' => '2', + 'word' => 'operators', + ), + 1088 => + array ( + 'id' => '1916', + 'object_count' => '2', + 'word' => 'third', + ), + 1089 => + array ( + 'id' => '1917', + 'object_count' => '2', + 'word' => 'party', + ), + 1090 => + array ( + 'id' => '1918', + 'object_count' => '2', + 'word' => 'contributed', + ), + 1091 => + array ( + 'id' => '1919', + 'object_count' => '2', + 'word' => 'contribution', + ), + 1092 => + array ( + 'id' => '1920', + 'object_count' => '2', + 'word' => 'during', + ), + 1093 => + array ( + 'id' => '1921', + 'object_count' => '2', + 'word' => 'ide', + ), + 1094 => + array ( + 'id' => '1922', + 'object_count' => '2', + 'word' => 'eclipse', + ), + 1095 => + array ( + 'id' => '1923', + 'object_count' => '2', + 'word' => 'phpedit', + ), + 1096 => + array ( + 'id' => '1924', + 'object_count' => '5', + 'word' => 'been', + ), + 1097 => + array ( + 'id' => '1925', + 'object_count' => '2', + 'word' => 'optimised', + ), + 1098 => + array ( + 'id' => '1926', + 'object_count' => '3', + 'word' => 'start', + ), + 1099 => + array ( + 'id' => '1927', + 'object_count' => '2', + 'word' => 'definitely', + ), + 1100 => + array ( + 'id' => '1928', + 'object_count' => '2', + 'word' => 'touch', + ), + 1101 => + array ( + 'id' => '1929', + 'object_count' => '2', + 'word' => 'contributions', + ), + 1102 => + array ( + 'id' => '1930', + 'object_count' => '2', + 'word' => 'save', + ), + 1103 => + array ( + 'id' => '1931', + 'object_count' => '1', + 'word' => 'lots', + ), + 1104 => + array ( + 'id' => '1932', + 'object_count' => '2', + 'word' => 'adding', + ), + 1105 => + array ( + 'id' => '1933', + 'object_count' => '3', + 'word' => 'siteaccesses', + ), + 1106 => + array ( + 'id' => '1934', + 'object_count' => '2', + 'word' => 'power', + ), + 1107 => + array ( + 'id' => '1935', + 'object_count' => '2', + 'word' => 'flexibility', + ), + 1108 => + array ( + 'id' => '1936', + 'object_count' => '1', + 'word' => 'beyond', + ), + 1109 => + array ( + 'id' => '1937', + 'object_count' => '2', + 'word' => 'single', + ), + 1110 => + array ( + 'id' => '1938', + 'object_count' => '2', + 'word' => 'unlimited', + ), + 1111 => + array ( + 'id' => '1939', + 'object_count' => '1', + 'word' => 'learned', + ), + 1112 => + array ( + 'id' => '1940', + 'object_count' => '2', + 'word' => 'best', + ), + 1113 => + array ( + 'id' => '1941', + 'object_count' => '2', + 'word' => 'leverage', + ), + 1114 => + array ( + 'id' => '1942', + 'object_count' => '1', + 'word' => 'siteaccess', + ), + 1115 => + array ( + 'id' => '1943', + 'object_count' => '2', + 'word' => 'let', + ), + 1116 => + array ( + 'id' => '1944', + 'object_count' => '1', + 'word' => 'apply', + ), + 1117 => + array ( + 'id' => '1945', + 'object_count' => '1', + 'word' => 'concrete', + ), + 1118 => + array ( + 'id' => '1946', + 'object_count' => '1', + 'word' => 'sometimes', + ), + 1119 => + array ( + 'id' => '1947', + 'object_count' => '1', + 'word' => 'wonder', + ), + 1120 => + array ( + 'id' => '1948', + 'object_count' => '1', + 'word' => 'yes through', + ), + 1121 => + array ( + 'id' => '1949', + 'object_count' => '1', + 'word' => 'siteaccess', + ), + 1122 => + array ( + 'id' => '1950', + 'object_count' => '2', + 'word' => 'fact', + ), + 1123 => + array ( + 'id' => '1951', + 'object_count' => '1', + 'word' => 'understanding', + ), + 1124 => + array ( + 'id' => '1952', + 'object_count' => '4', + 'word' => 'ability', + ), + 1125 => + array ( + 'id' => '1953', + 'object_count' => '1', + 'word' => 'much', + ), + 1126 => + array ( + 'id' => '1954', + 'object_count' => '1', + 'word' => 'just', + ), + 1127 => + array ( + 'id' => '1955', + 'object_count' => '1', + 'word' => 'technique', + ), + 1128 => + array ( + 'id' => '1956', + 'object_count' => '2', + 'word' => 'between', + ), + 1129 => + array ( + 'id' => '1957', + 'object_count' => '2', + 'word' => 'databases', + ), + 1130 => + array ( + 'id' => '1958', + 'object_count' => '1', + 'word' => 'copy', + ), + 1131 => + array ( + 'id' => '1959', + 'object_count' => '4', + 'word' => 'objects', + ), + 1132 => + array ( + 'id' => '1960', + 'object_count' => '1', + 'word' => 'agreement', + ), + 1133 => + array ( + 'id' => '1961', + 'object_count' => '1', + 'word' => 'network', + ), + 1134 => + array ( + 'id' => '1962', + 'object_count' => '1', + 'word' => 'simplify', + ), + 1135 => + array ( + 'id' => '1963', + 'object_count' => '1', + 'word' => 'upgrades', + ), + 1136 => + array ( + 'id' => '1964', + 'object_count' => '1', + 'word' => 'consolidating', + ), + 1137 => + array ( + 'id' => '1965', + 'object_count' => '1', + 'word' => 'demo', + ), + 1138 => + array ( + 'id' => '1966', + 'object_count' => '1', + 'word' => 'continue', + ), + 1139 => + array ( + 'id' => '1967', + 'object_count' => '1', + 'word' => 'real', + ), + 1140 => + array ( + 'id' => '1968', + 'object_count' => '1', + 'word' => 'reading', + ), + 1141 => + array ( + 'id' => '1969', + 'object_count' => '1', + 'word' => 'author', + ), + 1142 => + array ( + 'id' => '1970', + 'object_count' => '1', + 'word' => 'greg', + ), + 1143 => + array ( + 'id' => '1971', + 'object_count' => '1', + 'word' => 'mcavoy', + ), + 1144 => + array ( + 'id' => '1972', + 'object_count' => '1', + 'word' => 'jensen', + ), + 1145 => + array ( + 'id' => '1973', + 'object_count' => '1', + 'word' => 'executive', + ), + 1146 => + array ( + 'id' => '1974', + 'object_count' => '1', + 'word' => 'director', + ), + 1147 => + array ( + 'id' => '1975', + 'object_count' => '1', + 'word' => 'granite', + ), + 1148 => + array ( + 'id' => '1976', + 'object_count' => '1', + 'word' => 'horizon', + ), + 1149 => + array ( + 'id' => '1977', + 'object_count' => '1', + 'word' => 'largest', + ), + 1150 => + array ( + 'id' => '1978', + 'object_count' => '1', + 'word' => 'firms', + ), + 1151 => + array ( + 'id' => '1979', + 'object_count' => '1', + 'word' => 'united', + ), + 1152 => + array ( + 'id' => '1980', + 'object_count' => '1', + 'word' => 'states', + ), + 1153 => + array ( + 'id' => '1981', + 'object_count' => '1', + 'word' => 'america', + ), + 1154 => + array ( + 'id' => '1982', + 'object_count' => '2', + 'word' => 'certified', + ), + 1155 => + array ( + 'id' => '1983', + 'object_count' => '2', + 'word' => 'he', + ), + 1156 => + array ( + 'id' => '1984', + 'object_count' => '1', + 'word' => 'served', + ), + 1157 => + array ( + 'id' => '1985', + 'object_count' => '1', + 'word' => 'trained', + ), + 1158 => + array ( + 'id' => '1986', + 'object_count' => '1', + 'word' => 'four', + ), + 1159 => + array ( + 'id' => '1987', + 'object_count' => '1', + 'word' => 'continents', + ), + 1160 => + array ( + 'id' => '1988', + 'object_count' => '1', + 'word' => 'since', + ), + 1161 => + array ( + 'id' => '1989', + 'object_count' => '1', + 'word' => '2003', + ), + 1162 => + array ( + 'id' => '1990', + 'object_count' => '1', + 'word' => 'his', + ), + 1163 => + array ( + 'id' => '1991', + 'object_count' => '1', + 'word' => 'wife', + ), + 1164 => + array ( + 'id' => '1992', + 'object_count' => '1', + 'word' => 'heather', + ), + 1165 => + array ( + 'id' => '1993', + 'object_count' => '1', + 'word' => 'proud', + ), + 1166 => + array ( + 'id' => '1994', + 'object_count' => '1', + 'word' => 'parents', + ), + 1167 => + array ( + 'id' => '1995', + 'object_count' => '1', + 'word' => 'three', + ), + 1168 => + array ( + 'id' => '1996', + 'object_count' => '1', + 'word' => 'wonderful', + ), + 1169 => + array ( + 'id' => '1997', + 'object_count' => '1', + 'word' => 'children', + ), + 1170 => + array ( + 'id' => '1998', + 'object_count' => '1', + 'word' => 'internationalization', + ), + 1171 => + array ( + 'id' => '1999', + 'object_count' => '5', + 'word' => 'improved', + ), + 1172 => + array ( + 'id' => '2000', + 'object_count' => '1', + 'word' => 'registration', + ), + 1173 => + array ( + 'id' => '2001', + 'object_count' => '1', + 'word' => 'approval', + ), + 1174 => + array ( + 'id' => '2002', + 'object_count' => '1', + 'word' => 'wish', + ), + 1175 => + array ( + 'id' => '2003', + 'object_count' => '1', + 'word' => 'logs', + ), + 1176 => + array ( + 'id' => '2004', + 'object_count' => '3', + 'word' => 'enable', + ), + 1177 => + array ( + 'id' => '2005', + 'object_count' => '3', + 'word' => 'configure', + ), + 1178 => + array ( + 'id' => '2006', + 'object_count' => '1', + 'word' => 'connect', + ), + 1179 => + array ( + 'id' => '2007', + 'object_count' => '1', + 'word' => 'triggers', + ), + 1180 => + array ( + 'id' => '2008', + 'object_count' => '2', + 'word' => 'enabled', + ), + 1181 => + array ( + 'id' => '2009', + 'object_count' => '1', + 'word' => 'setup', + ), + 1182 => + array ( + 'id' => '2010', + 'object_count' => '1', + 'word' => 'workflows', + ), + 1183 => + array ( + 'id' => '2011', + 'object_count' => '1', + 'word' => 'e.g', + ), + 1184 => + array ( + 'id' => '2012', + 'object_count' => '1', + 'word' => 'userregistration1', + ), + 1185 => + array ( + 'id' => '2013', + 'object_count' => '1', + 'word' => 'finishuserregistration', + ), + 1186 => + array ( + 'id' => '2014', + 'object_count' => '1', + 'word' => 'trigger', + ), + 1187 => + array ( + 'id' => '2015', + 'object_count' => '1', + 'word' => 'confirmation', + ), + 1188 => + array ( + 'id' => '2016', + 'object_count' => '1', + 'word' => 'notification', + ), + 1189 => + array ( + 'id' => '2017', + 'object_count' => '1', + 'word' => 'successfully', + ), + 1190 => + array ( + 'id' => '2018', + 'object_count' => '1', + 'word' => 'registered', + ), + 1191 => + array ( + 'id' => '2019', + 'object_count' => '1', + 'word' => 'finish', + ), + 1192 => + array ( + 'id' => '2020', + 'object_count' => '1', + 'word' => 'finishuserregistration', + ), + 1193 => + array ( + 'id' => '2021', + 'object_count' => '1', + 'word' => 'content', + ), + 1194 => + array ( + 'id' => '2022', + 'object_count' => '1', + 'word' => 'before', + ), + 1195 => + array ( + 'id' => '2023', + 'object_count' => '1', + 'word' => 'after', + ), + 1196 => + array ( + 'id' => '2024', + 'object_count' => '5', + 'word' => 'now', + ), + 1197 => + array ( + 'id' => '2025', + 'object_count' => '1', + 'word' => 'himself', + ), + 1198 => + array ( + 'id' => '2026', + 'object_count' => '2', + 'word' => 'presented', + ), + 1199 => + array ( + 'id' => '2027', + 'object_count' => '1', + 'word' => 'login', + ), + 1200 => + array ( + 'id' => '2028', + 'object_count' => '1', + 'word' => 'clicks', + ), + 1201 => + array ( + 'id' => '2029', + 'object_count' => '1', + 'word' => 'finished', + ), + 1202 => + array ( + 'id' => '2030', + 'object_count' => '1', + 'word' => 'mail', + ), + 1203 => + array ( + 'id' => '2031', + 'object_count' => '1', + 'word' => 'sent', + ), + 1204 => + array ( + 'id' => '2032', + 'object_count' => '1', + 'word' => 'confirm', + ), + 1205 => + array ( + 'id' => '2033', + 'object_count' => '1', + 'word' => 'event', + ), + 1206 => + array ( + 'id' => '2034', + 'object_count' => '1', + 'word' => 'dashboards', + ), + 1207 => + array ( + 'id' => '2035', + 'object_count' => '1', + 'word' => 'collaboration', + ), + 1208 => + array ( + 'id' => '2036', + 'object_count' => '2', + 'word' => 'screen', + ), + 1209 => + array ( + 'id' => '2037', + 'object_count' => '1', + 'word' => 'policies', + ), + 1210 => + array ( + 'id' => '2038', + 'object_count' => '1', + 'word' => 'comment', + ), + 1211 => + array ( + 'id' => '2039', + 'object_count' => '1', + 'word' => 'approve', + ), + 1212 => + array ( + 'id' => '2040', + 'object_count' => '1', + 'word' => 'deny', + ), + 1213 => + array ( + 'id' => '2041', + 'object_count' => '2', + 'word' => 'request', + ), + 1214 => + array ( + 'id' => '2042', + 'object_count' => '1', + 'word' => 'gets', + ), + 1215 => + array ( + 'id' => '2043', + 'object_count' => '2', + 'word' => 'block', + ), + 1216 => + array ( + 'id' => '2044', + 'object_count' => '1', + 'word' => 'visual', + ), + 1217 => + array ( + 'id' => '2045', + 'object_count' => '1', + 'word' => 'usability', + ), + 1218 => + array ( + 'id' => '2046', + 'object_count' => '2', + 'word' => 'blocks', + ), + 1219 => + array ( + 'id' => '2047', + 'object_count' => '1', + 'word' => 'saves', + ), + 1220 => + array ( + 'id' => '2048', + 'object_count' => '2', + 'word' => 'space', + ), + 1221 => + array ( + 'id' => '2049', + 'object_count' => '2', + 'word' => 'setting', + ), + 1222 => + array ( + 'id' => '2050', + 'object_count' => '1', + 'word' => 'always', + ), + 1223 => + array ( + 'id' => '2051', + 'object_count' => '1', + 'word' => 'window', + ), + 1224 => + array ( + 'id' => '2052', + 'object_count' => '1', + 'word' => 'aligned', + ), + 1225 => + array ( + 'id' => '2053', + 'object_count' => '1', + 'word' => 'admin2', + ), + 1226 => + array ( + 'id' => '2054', + 'object_count' => '1', + 'word' => 'button', + ), + 1227 => + array ( + 'id' => '2055', + 'object_count' => '1', + 'word' => '12', + ), + 1228 => + array ( + 'id' => '2056', + 'object_count' => '1', + 'word' => 'higher', + ), + 1229 => + array ( + 'id' => '2057', + 'object_count' => '1', + 'word' => 'contrast', + ), + 1230 => + array ( + 'id' => '2058', + 'object_count' => '1', + 'word' => 'icons', + ), + 1231 => + array ( + 'id' => '2059', + 'object_count' => '1', + 'word' => 'according', + ), + 1232 => + array ( + 'id' => '2060', + 'object_count' => '1', + 'word' => 'program', + ), + 1233 => + array ( + 'id' => '2061', + 'object_count' => '1', + 'word' => 'run', + ), + 1234 => + array ( + 'id' => '2062', + 'object_count' => '1', + 'word' => 'opening', + ), + 1235 => + array ( + 'id' => '2063', + 'object_count' => '1', + 'word' => 'mode', + ), + 1236 => + array ( + 'id' => '2064', + 'object_count' => '1', + 'word' => 'folders', + ), + 1237 => + array ( + 'id' => '2065', + 'object_count' => '2', + 'word' => 'timeline', + ), + 1238 => + array ( + 'id' => '2066', + 'object_count' => '1', + 'word' => 'marked', + ), + 1239 => + array ( + 'id' => '2067', + 'object_count' => '2', + 'word' => 'folder', + ), + 1240 => + array ( + 'id' => '2068', + 'object_count' => '1', + 'word' => '9', + ), + 1241 => + array ( + 'id' => '2069', + 'object_count' => '3', + 'word' => '10', + ), + 1242 => + array ( + 'id' => '2070', + 'object_count' => '1', + 'word' => '11', + ), + 1243 => + array ( + 'id' => '2071', + 'object_count' => '1', + 'word' => 'multiupload', + ), + 1244 => + array ( + 'id' => '2072', + 'object_count' => '2', + 'word' => '6', + ), + 1245 => + array ( + 'id' => '2073', + 'object_count' => '2', + 'word' => 'preview', + ), + 1246 => + array ( + 'id' => '2074', + 'object_count' => '1', + 'word' => '7', + ), + 1247 => + array ( + 'id' => '2075', + 'object_count' => '1', + 'word' => 'flags', + ), + 1248 => + array ( + 'id' => '2076', + 'object_count' => '2', + 'word' => 'fastcgi', + ), + 1249 => + array ( + 'id' => '2077', + 'object_count' => '5', + 'word' => 'supports', + ), + 1250 => + array ( + 'id' => '2078', + 'object_count' => '2', + 'word' => 'cgi', + ), + 1251 => + array ( + 'id' => '2079', + 'object_count' => '2', + 'word' => 'improve', + ), + 1252 => + array ( + 'id' => '2080', + 'object_count' => '2', + 'word' => 'performance', + ), + 1253 => + array ( + 'id' => '2081', + 'object_count' => '2', + 'word' => 'thousands', + ), + 1254 => + array ( + 'id' => '2082', + 'object_count' => '2', + 'word' => 'perl', + ), + 1255 => + array ( + 'id' => '2083', + 'object_count' => '2', + 'word' => 'runs', + ), + 1256 => + array ( + 'id' => '2084', + 'object_count' => '2', + 'word' => 'processes', + ), + 1257 => + array ( + 'id' => '2085', + 'object_count' => '2', + 'word' => 'isolated', + ), + 1258 => + array ( + 'id' => '2086', + 'object_count' => '3', + 'word' => 'core', + ), + 1259 => + array ( + 'id' => '2087', + 'object_count' => '2', + 'word' => 'greater', + ), + 1260 => + array ( + 'id' => '2088', + 'object_count' => '2', + 'word' => 'security', + ), + 1261 => + array ( + 'id' => '2089', + 'object_count' => '4', + 'word' => 'link', + ), + 1262 => + array ( + 'id' => '2090', + 'object_count' => '2', + 'word' => 'bug', + ), + 1263 => + array ( + 'id' => '2091', + 'object_count' => '2', + 'word' => 'corrupt', + ), + 1264 => + array ( + 'id' => '2092', + 'object_count' => '2', + 'word' => 'malicious', + ), + 1265 => + array ( + 'id' => '2093', + 'object_count' => '2', + 'word' => 'steal', + ), + 1266 => + array ( + 'id' => '2094', + 'object_count' => '2', + 'word' => 'secrets', + ), + 1267 => + array ( + 'id' => '2095', + 'object_count' => '2', + 'word' => 'www.fastcgi.com', + ), + 1268 => + array ( + 'id' => '2096', + 'object_count' => '2', + 'word' => 'fastcgi.com', + ), + 1269 => + array ( + 'id' => '2097', + 'object_count' => '3', + 'word' => 'red', + ), + 1270 => + array ( + 'id' => '2098', + 'object_count' => '3', + 'word' => 'hat', + ), + 1271 => + array ( + 'id' => '2099', + 'object_count' => '2', + 'word' => 'combined', + ), + 1272 => + array ( + 'id' => '2100', + 'object_count' => '2', + 'word' => 'supported', + ), + 1273 => + array ( + 'id' => '2101', + 'object_count' => '2', + 'word' => 'stack', + ), + 1274 => + array ( + 'id' => '2102', + 'object_count' => '2', + 'word' => 'canonical', + ), + 1275 => + array ( + 'id' => '2103', + 'object_count' => '2', + 'word' => 'links', + ), + 1276 => + array ( + 'id' => '2104', + 'object_count' => '2', + 'word' => 'figure', + ), + 1277 => + array ( + 'id' => '2105', + 'object_count' => '2', + 'word' => 'duplicate', + ), + 1278 => + array ( + 'id' => '2106', + 'object_count' => '4', + 'word' => 'allow', + ), + 1279 => + array ( + 'id' => '2107', + 'object_count' => '2', + 'word' => 'index', + ), + 1280 => + array ( + 'id' => '2108', + 'object_count' => '2', + 'word' => 'nor', + ), + 1281 => + array ( + 'id' => '2109', + 'object_count' => '2', + 'word' => 'fre', + ), + 1282 => + array ( + 'id' => '2110', + 'object_count' => '2', + 'word' => 'ger', + ), + 1283 => + array ( + 'id' => '2111', + 'object_count' => '2', + 'word' => 'eng', + ), + 1284 => + array ( + 'id' => '2112', + 'object_count' => '2', + 'word' => 'works', + ), + 1285 => + array ( + 'id' => '2113', + 'object_count' => '2', + 'word' => 'mappings', + ), + 1286 => + array ( + 'id' => '2114', + 'object_count' => '2', + 'word' => 'require', + ), + 1287 => + array ( + 'id' => '2115', + 'object_count' => '3', + 'word' => 'file', + ), + 1288 => + array ( + 'id' => '2116', + 'object_count' => '2', + 'word' => 'urls', + ), + 1289 => + array ( + 'id' => '2117', + 'object_count' => '2', + 'word' => 'www.example.com', + ), + 1290 => + array ( + 'id' => '2118', + 'object_count' => '2', + 'word' => 'example.com', + ), + 1291 => + array ( + 'id' => '2119', + 'object_count' => '2', + 'word' => 'index.html', + ), + 1292 => + array ( + 'id' => '2120', + 'object_count' => '2', + 'word' => 'home.asp', + ), + 1293 => + array ( + 'id' => '2121', + 'object_count' => '2', + 'word' => 'rel', + ), + 1294 => + array ( + 'id' => '2122', + 'object_count' => '2', + 'word' => 'href', + ), + 1295 => + array ( + 'id' => '2123', + 'object_count' => '2', + 'word' => 'defer', + ), + 1296 => + array ( + 'id' => '2124', + 'object_count' => '3', + 'word' => 'scalability', + ), + 1297 => + array ( + 'id' => '2125', + 'object_count' => '2', + 'word' => 'load', + ), + 1298 => + array ( + 'id' => '2126', + 'object_count' => '2', + 'word' => 'environments', + ), + 1299 => + array ( + 'id' => '2127', + 'object_count' => '1', + 'word' => 'simultaneous', + ), + 1300 => + array ( + 'id' => '2128', + 'object_count' => '1', + 'word' => 'database', + ), + 1301 => + array ( + 'id' => '2129', + 'object_count' => '1', + 'word' => 'offers', + ), + 1302 => + array ( + 'id' => '2130', + 'object_count' => '2', + 'word' => 'robust', + ), + 1303 => + array ( + 'id' => '2131', + 'object_count' => '1', + 'word' => 'parallel', + ), + 1304 => + array ( + 'id' => '2132', + 'object_count' => '1', + 'word' => 'controls', + ), + 1305 => + array ( + 'id' => '2133', + 'object_count' => '1', + 'word' => 'concurrently', + ), + 1306 => + array ( + 'id' => '2134', + 'object_count' => '1', + 'word' => 'sends', + ), + 1307 => + array ( + 'id' => '2135', + 'object_count' => '2', + 'word' => 'requests', + ), + 1308 => + array ( + 'id' => '2136', + 'object_count' => '1', + 'word' => 'queue', + ), + 1309 => + array ( + 'id' => '2137', + 'object_count' => '1', + 'word' => 'daemon', + ), + 1310 => + array ( + 'id' => '2138', + 'object_count' => '1', + 'word' => 'handles', + ), + 1311 => + array ( + 'id' => '2139', + 'object_count' => '1', + 'word' => 'background', + ), + 1312 => + array ( + 'id' => '2140', + 'object_count' => '1', + 'word' => 'error', + ), + 1313 => + array ( + 'id' => '2141', + 'object_count' => '1', + 'word' => 'handling', + ), + 1314 => + array ( + 'id' => '2142', + 'object_count' => '1', + 'word' => 'filtering', + ), + 1315 => + array ( + 'id' => '2143', + 'object_count' => '1', + 'word' => 'hooks', + ), + 1316 => + array ( + 'id' => '2144', + 'object_count' => '1', + 'word' => 'press', + ), + 1317 => + array ( + 'id' => '2145', + 'object_count' => '1', + 'word' => 'queued', + ), + 1318 => + array ( + 'id' => '2146', + 'object_count' => '1', + 'word' => 'monitored', + ), + 1319 => + array ( + 'id' => '2147', + 'object_count' => '1', + 'word' => 'statuses', + ), + 1320 => + array ( + 'id' => '2148', + 'object_count' => '1', + 'word' => 'processed', + ), + 1321 => + array ( + 'id' => '2149', + 'object_count' => '1', + 'word' => 'place', + ), + 1322 => + array ( + 'id' => '2150', + 'object_count' => '1', + 'word' => 'irregularities', + ), + 1323 => + array ( + 'id' => '2151', + 'object_count' => '1', + 'word' => 'prompts', + ), + 1324 => + array ( + 'id' => '2152', + 'object_count' => '1', + 'word' => 'content.ini', + ), + 1325 => + array ( + 'id' => '2153', + 'object_count' => '1', + 'word' => 'publishingsettings', + ), + 1326 => + array ( + 'id' => '2154', + 'object_count' => '1', + 'word' => 'disable', + ), + 1327 => + array ( + 'id' => '2155', + 'object_count' => '1', + 'word' => 'asynchronouspublishing', + ), + 1328 => + array ( + 'id' => '2156', + 'object_count' => '2', + 'word' => 'size', + ), + 1329 => + array ( + 'id' => '2157', + 'object_count' => '1', + 'word' => 'operations', + ), + 1330 => + array ( + 'id' => '2158', + 'object_count' => '1', + 'word' => 'allowed', + ), + 1331 => + array ( + 'id' => '2159', + 'object_count' => '1', + 'word' => 'publishingprocessslots', + ), + 1332 => + array ( + 'id' => '2160', + 'object_count' => '1', + 'word' => 'init', + ), + 1333 => + array ( + 'id' => '2161', + 'object_count' => '1', + 'word' => 'script', + ), + 1334 => + array ( + 'id' => '2162', + 'object_count' => '1', + 'word' => 'recommended', + ), + 1335 => + array ( + 'id' => '2163', + 'object_count' => '1', + 'word' => 'production', + ), + 1336 => + array ( + 'id' => '2164', + 'object_count' => '1', + 'word' => 'linux', + ), + 1337 => + array ( + 'id' => '2165', + 'object_count' => '1', + 'word' => 'centos', + ), + 1338 => + array ( + 'id' => '2166', + 'object_count' => '1', + 'word' => 'fedora', + ), + 1339 => + array ( + 'id' => '2167', + 'object_count' => '1', + 'word' => 'suse', + ), + 1340 => + array ( + 'id' => '2168', + 'object_count' => '1', + 'word' => 'bin', + ), + 1341 => + array ( + 'id' => '2169', + 'object_count' => '1', + 'word' => 'startup', + ), + 1342 => + array ( + 'id' => '2170', + 'object_count' => '1', + 'word' => 'rhel', + ), + 1343 => + array ( + 'id' => '2171', + 'object_count' => '1', + 'word' => 'ezasynchronouspublisher', + ), + 1344 => + array ( + 'id' => '2172', + 'object_count' => '1', + 'word' => 'debian', + ), + 1345 => + array ( + 'id' => '2173', + 'object_count' => '1', + 'word' => 'ubuntu', + ), + 1346 => + array ( + 'id' => '2174', + 'object_count' => '1', + 'word' => 'etc', + ), + 1347 => + array ( + 'id' => '2175', + 'object_count' => '1', + 'word' => 'init.d', + ), + 1348 => + array ( + 'id' => '2176', + 'object_count' => '1', + 'word' => 'ln', + ), + 1349 => + array ( + 'id' => '2177', + 'object_count' => '1', + 'word' => 'path', + ), + 1350 => + array ( + 'id' => '2178', + 'object_count' => '1', + 'word' => 'chmod', + ), + 1351 => + array ( + 'id' => '2179', + 'object_count' => '1', + 'word' => 'x', + ), + 1352 => + array ( + 'id' => '2180', + 'object_count' => '1', + 'word' => 'boot', + ), + 1353 => + array ( + 'id' => '2181', + 'object_count' => '1', + 'word' => 'chkconfig', + ), + 1354 => + array ( + 'id' => '2182', + 'object_count' => '2', + 'word' => 'restful', + ), + 1355 => + array ( + 'id' => '2183', + 'object_count' => '2', + 'word' => 'external', + ), + 1356 => + array ( + 'id' => '2184', + 'object_count' => '2', + 'word' => 'implementations', + ), + 1357 => + array ( + 'id' => '2185', + 'object_count' => '2', + 'word' => 'query', + ), + 1358 => + array ( + 'id' => '2186', + 'object_count' => '2', + 'word' => 'inside', + ), + 1359 => + array ( + 'id' => '2187', + 'object_count' => '1', + 'word' => 'contains', + ), + 1360 => + array ( + 'id' => '2188', + 'object_count' => '2', + 'word' => 'oauth', + ), + 1361 => + array ( + 'id' => '2189', + 'object_count' => '2', + 'word' => 'authentication', + ), + 1362 => + array ( + 'id' => '2190', + 'object_count' => '2', + 'word' => 'retrieval', + ), + 1363 => + array ( + 'id' => '2191', + 'object_count' => '3', + 'word' => 'presentation', + ), + 1364 => + array ( + 'id' => '2192', + 'object_count' => '2', + 'word' => 'global', + ), + 1365 => + array ( + 'id' => '2193', + 'object_count' => '1', + 'word' => 'leader', + ), + 1366 => + array ( + 'id' => '2194', + 'object_count' => '1', + 'word' => 'was', + ), + 1367 => + array ( + 'id' => '2195', + 'object_count' => '1', + 'word' => 'founded', + ), + 1368 => + array ( + 'id' => '2196', + 'object_count' => '1', + 'word' => '1999', + ), + 1369 => + array ( + 'id' => '2197', + 'object_count' => '1', + 'word' => 'offices', + ), + 1370 => + array ( + 'id' => '2198', + 'object_count' => '1', + 'word' => 'worldwide', + ), + 1371 => + array ( + 'id' => '2199', + 'object_count' => '1', + 'word' => 'systems', + ), + 1372 => + array ( + 'id' => '2200', + 'object_count' => '1', + 'word' => 'flagship', + ), + 1373 => + array ( + 'id' => '2201', + 'object_count' => '1', + 'word' => 'product', + ), + 1374 => + array ( + 'id' => '2202', + 'object_count' => '1', + 'word' => 'leading', + ), + 1375 => + array ( + 'id' => '2203', + 'object_count' => '1', + 'word' => 'wcm', + ), + 1376 => + array ( + 'id' => '2204', + 'object_count' => '1', + 'word' => 'specializing', + ), + 1377 => + array ( + 'id' => '2205', + 'object_count' => '1', + 'word' => 'multichannel', + ), + 1378 => + array ( + 'id' => '2206', + 'object_count' => '1', + 'word' => 'distribution', + ), + 1379 => + array ( + 'id' => '2207', + 'object_count' => '1', + 'word' => 'mobile', + ), + 1380 => + array ( + 'id' => '2208', + 'object_count' => '1', + 'word' => 'tablets', + ), + 1381 => + array ( + 'id' => '2209', + 'object_count' => '1', + 'word' => 'print', + ), + 1382 => + array ( + 'id' => '2210', + 'object_count' => '1', + 'word' => 'commercial', + ), + 1383 => + array ( + 'id' => '2211', + 'object_count' => '1', + 'word' => 'engineers', + ), + 1384 => + array ( + 'id' => '2212', + 'object_count' => '1', + 'word' => 'innovation', + ), + 1385 => + array ( + 'id' => '2213', + 'object_count' => '1', + 'word' => '38', + ), + 1386 => + array ( + 'id' => '2214', + 'object_count' => '1', + 'word' => '000', + ), + 1387 => + array ( + 'id' => '2215', + 'object_count' => '1', + 'word' => 'implementation', + ), + 1388 => + array ( + 'id' => '2216', + 'object_count' => '4', + 'word' => 'partners', + ), + 1389 => + array ( + 'id' => '2217', + 'object_count' => '1', + 'word' => 'drives', + ), + 1390 => + array ( + 'id' => '2218', + 'object_count' => '1', + 'word' => '200', + ), + 1391 => + array ( + 'id' => '2219', + 'object_count' => '1', + 'word' => 'installations', + ), + 1392 => + array ( + 'id' => '2220', + 'object_count' => '1', + 'word' => 'proving', + ), + 1393 => + array ( + 'id' => '2221', + 'object_count' => '1', + 'word' => 'most', + ), + 1394 => + array ( + 'id' => '2222', + 'object_count' => '2', + 'word' => 'adaptable', + ), + 1395 => + array ( + 'id' => '2223', + 'object_count' => '2', + 'word' => 'reliable', + ), + 1396 => + array ( + 'id' => '2224', + 'object_count' => '1', + 'word' => 'platforms', + ), + 1397 => + array ( + 'id' => '2225', + 'object_count' => '2', + 'word' => 'market', + ), + 1398 => + array ( + 'id' => '2226', + 'object_count' => '1', + 'word' => 'edition', + ), + 1399 => + array ( + 'id' => '2227', + 'object_count' => '1', + 'word' => 'perfect', + ), + 1400 => + array ( + 'id' => '2228', + 'object_count' => '1', + 'word' => 'blend', + ), + 1401 => + array ( + 'id' => '2229', + 'object_count' => '1', + 'word' => 'vendor', + ), + 1402 => + array ( + 'id' => '2230', + 'object_count' => '1', + 'word' => 'assured', + ), + 1403 => + array ( + 'id' => '2231', + 'object_count' => '1', + 'word' => 'customers', + ), + 1404 => + array ( + 'id' => '2232', + 'object_count' => '1', + 'word' => 'pay', + ), + 1405 => + array ( + 'id' => '2233', + 'object_count' => '1', + 'word' => 'cost', + ), + 1406 => + array ( + 'id' => '2234', + 'object_count' => '1', + 'word' => 'effective', + ), + 1407 => + array ( + 'id' => '2235', + 'object_count' => '1', + 'word' => 'yearly', + ), + 1408 => + array ( + 'id' => '2236', + 'object_count' => '1', + 'word' => 'fee', + ), + 1409 => + array ( + 'id' => '2237', + 'object_count' => '1', + 'word' => 'maintenance', + ), + 1410 => + array ( + 'id' => '2238', + 'object_count' => '1', + 'word' => 'releases', + ), + 1411 => + array ( + 'id' => '2239', + 'object_count' => '1', + 'word' => 'major', + ), + 1412 => + array ( + 'id' => '2240', + 'object_count' => '1', + 'word' => 'updates', + ), + 1413 => + array ( + 'id' => '2241', + 'object_count' => '1', + 'word' => 'months', + ), + 1414 => + array ( + 'id' => '2242', + 'object_count' => '1', + 'word' => 'license', + ), + 1415 => + array ( + 'id' => '2243', + 'object_count' => '1', + 'word' => 'europe', + ), + 1416 => + array ( + 'id' => '2244', + 'object_count' => '1', + 'word' => 'nordics', + ), + 1417 => + array ( + 'id' => '2245', + 'object_count' => '1', + 'word' => 'americas', + ), + 1418 => + array ( + 'id' => '2246', + 'object_count' => '1', + 'word' => 'asia', + ), + 1419 => + array ( + 'id' => '2247', + 'object_count' => '1', + 'word' => 'recognized', + ), + 1420 => + array ( + 'id' => '2248', + 'object_count' => '1', + 'word' => 'demands', + ), + 1421 => + array ( + 'id' => '2249', + 'object_count' => '1', + 'word' => 'secure', + ), + 1422 => + array ( + 'id' => '2250', + 'object_count' => '1', + 'word' => 'maintainable', + ), + 1423 => + array ( + 'id' => '2251', + 'object_count' => '2', + 'word' => 'properties', + ), + 1424 => + array ( + 'id' => '2252', + 'object_count' => '1', + 'word' => 'revenue', + ), + 1425 => + array ( + 'id' => '2253', + 'object_count' => '1', + 'word' => 'array', + ), + 1426 => + array ( + 'id' => '2254', + 'object_count' => '1', + 'word' => 'sources', + ), + 1427 => + array ( + 'id' => '2255', + 'object_count' => '1', + 'word' => 'record', + ), + 1428 => + array ( + 'id' => '2256', + 'object_count' => '1', + 'word' => 'spanning', + ), + 1429 => + array ( + 'id' => '2257', + 'object_count' => '1', + 'word' => 'years', + ), + 1430 => + array ( + 'id' => '2258', + 'object_count' => '1', + 'word' => 'become', + ), + 1431 => + array ( + 'id' => '2259', + 'object_count' => '1', + 'word' => 'choice', + ), + 1432 => + array ( + 'id' => '2260', + 'object_count' => '1', + 'word' => 'finance', + ), + 1433 => + array ( + 'id' => '2261', + 'object_count' => '1', + 'word' => 'retail', + ), + 1434 => + array ( + 'id' => '2262', + 'object_count' => '1', + 'word' => 'government', + ), + 1435 => + array ( + 'id' => '2263', + 'object_count' => '1', + 'word' => 'organizations', + ), + 1436 => + array ( + 'id' => '2264', + 'object_count' => '1', + 'word' => 'delivers', + ), + 1437 => + array ( + 'id' => '2265', + 'object_count' => '1', + 'word' => 'unsurpassed', + ), + 1438 => + array ( + 'id' => '2266', + 'object_count' => '1', + 'word' => 'capabilities', + ), + 1439 => + array ( + 'id' => '2267', + 'object_count' => '1', + 'word' => 'reach', + ), + 1440 => + array ( + 'id' => '2268', + 'object_count' => '1', + 'word' => 'engage', + ), + 1441 => + array ( + 'id' => '2269', + 'object_count' => '1', + 'word' => 'audience', + ), + 1442 => + array ( + 'id' => '2270', + 'object_count' => '1', + 'word' => 'ezs', + ), + 1443 => + array ( + 'id' => '2271', + 'object_count' => '1', + 'word' => 'intrinsic', + ), + 1444 => + array ( + 'id' => '2272', + 'object_count' => '1', + 'word' => 'accelerating', + ), + 1445 => + array ( + 'id' => '2273', + 'object_count' => '1', + 'word' => 'reducing', + ), + 1446 => + array ( + 'id' => '2274', + 'object_count' => '1', + 'word' => 'costs', + ), + 1447 => + array ( + 'id' => '2275', + 'object_count' => '1', + 'word' => 'enabling', + ), + 1448 => + array ( + 'id' => '2276', + 'object_count' => '1', + 'word' => 'tool', + ), + 1449 => + array ( + 'id' => '2277', + 'object_count' => '1', + 'word' => 'authoring', + ), + 1450 => + array ( + 'id' => '2278', + 'object_count' => '1', + 'word' => 'engaging', + ), + 1451 => + array ( + 'id' => '2279', + 'object_count' => '1', + 'word' => 'frees', + ), + 1452 => + array ( + 'id' => '2280', + 'object_count' => '1', + 'word' => 'editorial', + ), + 1453 => + array ( + 'id' => '2281', + 'object_count' => '1', + 'word' => 'creative', + ), + 1454 => + array ( + 'id' => '2282', + 'object_count' => '1', + 'word' => 'staff', + ), + 1455 => + array ( + 'id' => '2283', + 'object_count' => '1', + 'word' => 'enthusiasm', + ), + 1456 => + array ( + 'id' => '2284', + 'object_count' => '1', + 'word' => 'minimal', + ), + 1457 => + array ( + 'id' => '2285', + 'object_count' => '1', + 'word' => 'plan', + ), + 1458 => + array ( + 'id' => '2286', + 'object_count' => '1', + 'word' => 'review', + ), + 1459 => + array ( + 'id' => '2287', + 'object_count' => '1', + 'word' => 'automate', + ), + 1460 => + array ( + 'id' => '2288', + 'object_count' => '1', + 'word' => 'managing', + ), + 1461 => + array ( + 'id' => '2289', + 'object_count' => '1', + 'word' => 'portals', + ), + 1462 => + array ( + 'id' => '2290', + 'object_count' => '1', + 'word' => 'story', + ), + 1463 => + array ( + 'id' => '2291', + 'object_count' => '1', + 'word' => 'layouts', + ), + 1464 => + array ( + 'id' => '2292', + 'object_count' => '1', + 'word' => 'publication', + ), + 1465 => + array ( + 'id' => '2293', + 'object_count' => '1', + 'word' => 'schedule', + ), + 1466 => + array ( + 'id' => '2294', + 'object_count' => '1', + 'word' => 'ensure', + ), + 1467 => + array ( + 'id' => '2295', + 'object_count' => '1', + 'word' => 'constant', + ), + 1468 => + array ( + 'id' => '2296', + 'object_count' => '1', + 'word' => 'zones', + ), + 1469 => + array ( + 'id' => '2297', + 'object_count' => '2', + 'word' => 'layout', + ), + 1470 => + array ( + 'id' => '2298', + 'object_count' => '1', + 'word' => 'zone', + ), + 1471 => + array ( + 'id' => '2299', + 'object_count' => '1', + 'word' => 'blocks', + ), + 1472 => + array ( + 'id' => '2300', + 'object_count' => '1', + 'word' => 'promote', + ), + 1473 => + array ( + 'id' => '2301', + 'object_count' => '1', + 'word' => 'explicitly', + ), + 1474 => + array ( + 'id' => '2302', + 'object_count' => '1', + 'word' => 'implicitly', + ), + 1475 => + array ( + 'id' => '2303', + 'object_count' => '1', + 'word' => 'promotion', + ), + 1476 => + array ( + 'id' => '2304', + 'object_count' => '1', + 'word' => 'rotation', + ), + 1477 => + array ( + 'id' => '2305', + 'object_count' => '1', + 'word' => 'look', + ), + 1478 => + array ( + 'id' => '2306', + 'object_count' => '1', + 'word' => 'future.', + ), + 1479 => + array ( + 'id' => '2307', + 'object_count' => '1', + 'word' => 'drag', + ), + 1480 => + array ( + 'id' => '2308', + 'object_count' => '1', + 'word' => 'slider', + ), + 1481 => + array ( + 'id' => '2309', + 'object_count' => '1', + 'word' => 'goes', + ), + 1482 => + array ( + 'id' => '2310', + 'object_count' => '2', + 'word' => 'entire', + ), + 1483 => + array ( + 'id' => '2311', + 'object_count' => '1', + 'word' => 'managed', + ), + 1484 => + array ( + 'id' => '2312', + 'object_count' => '1', + 'word' => 'collaborate', + ), + 1485 => + array ( + 'id' => '2313', + 'object_count' => '1', + 'word' => 'we', + ), + 1486 => + array ( + 'id' => '2314', + 'object_count' => '1', + 'word' => 'know', + ), + 1487 => + array ( + 'id' => '2315', + 'object_count' => '3', + 'word' => 'work', + ), + 1488 => + array ( + 'id' => '2316', + 'object_count' => '1', + 'word' => 'alone', + ), + 1489 => + array ( + 'id' => '2317', + 'object_count' => '1', + 'word' => 'dashboards', + ), + 1490 => + array ( + 'id' => '2318', + 'object_count' => '1', + 'word' => 'keep', + ), + 1491 => + array ( + 'id' => '2319', + 'object_count' => '1', + 'word' => 'sync', + ), + 1492 => + array ( + 'id' => '2320', + 'object_count' => '1', + 'word' => 'adapt', + ), + 1493 => + array ( + 'id' => '2321', + 'object_count' => '1', + 'word' => 'however', + ), + 1494 => + array ( + 'id' => '2322', + 'object_count' => '1', + 'word' => 'intricate', + ), + 1495 => + array ( + 'id' => '2323', + 'object_count' => '1', + 'word' => 'completely', + ), + 1496 => + array ( + 'id' => '2324', + 'object_count' => '1', + 'word' => 'separates', + ), + 1497 => + array ( + 'id' => '2325', + 'object_count' => '1', + 'word' => 'current', + ), + 1498 => + array ( + 'id' => '2326', + 'object_count' => '2', + 'word' => 'future', + ), + 1499 => + array ( + 'id' => '2327', + 'object_count' => '1', + 'word' => 'furthermore', + ), + 1500 => + array ( + 'id' => '2328', + 'object_count' => '1', + 'word' => 'fit', + ), + 1501 => + array ( + 'id' => '2329', + 'object_count' => '1', + 'word' => 'needsyour', + ), + 1502 => + array ( + 'id' => '2330', + 'object_count' => '1', + 'word' => 'force', + ), + 1503 => + array ( + 'id' => '2331', + 'object_count' => '1', + 'word' => 'one', + ), + 1504 => + array ( + 'id' => '2332', + 'object_count' => '1', + 'word' => 'fits', + ), + 1505 => + array ( + 'id' => '2333', + 'object_count' => '1', + 'word' => 'all', + ), + 1506 => + array ( + 'id' => '2334', + 'object_count' => '1', + 'word' => 'construct', + ), + 1507 => + array ( + 'id' => '2335', + 'object_count' => '1', + 'word' => 'sets', + ), + 1508 => + array ( + 'id' => '2336', + 'object_count' => '1', + 'word' => 'purposing', + ), + 1509 => + array ( + 'id' => '2337', + 'object_count' => '1', + 'word' => 'strength', + ), + 1510 => + array ( + 'id' => '2338', + 'object_count' => '1', + 'word' => 'adapts', + ), + 1511 => + array ( + 'id' => '2339', + 'object_count' => '1', + 'word' => 'editors', + ), + 1512 => + array ( + 'id' => '2340', + 'object_count' => '1', + 'word' => 'style', + ), + 1513 => + array ( + 'id' => '2341', + 'object_count' => '1', + 'word' => 'utilize', + ), + 1514 => + array ( + 'id' => '2342', + 'object_count' => '1', + 'word' => 'browsing', + ), + 1515 => + array ( + 'id' => '2343', + 'object_count' => '1', + 'word' => 'suite', + ), + 1516 => + array ( + 'id' => '2344', + 'object_count' => '1', + 'word' => 'flattens', + ), + 1517 => + array ( + 'id' => '2345', + 'object_count' => '1', + 'word' => 'curve', + ), + 1518 => + array ( + 'id' => '2346', + 'object_count' => '1', + 'word' => 'accelerates', + ), + 1519 => + array ( + 'id' => '2347', + 'object_count' => '1', + 'word' => 'internal', + ), + 1520 => + array ( + 'id' => '2348', + 'object_count' => '1', + 'word' => 'adoption', + ), + 1521 => + array ( + 'id' => '2349', + 'object_count' => '1', + 'word' => 'technology', + ), + 1522 => + array ( + 'id' => '2350', + 'object_count' => '1', + 'word' => 'publishs', + ), + 1523 => + array ( + 'id' => '2351', + 'object_count' => '1', + 'word' => 'architecture', + ), + 1524 => + array ( + 'id' => '2352', + 'object_count' => '1', + 'word' => 'interoperability', + ), + 1525 => + array ( + 'id' => '2353', + 'object_count' => '1', + 'word' => 'standards', + ), + 1526 => + array ( + 'id' => '2354', + 'object_count' => '1', + 'word' => 'odf', + ), + 1527 => + array ( + 'id' => '2355', + 'object_count' => '1', + 'word' => 'soap', + ), + 1528 => + array ( + 'id' => '2356', + 'object_count' => '1', + 'word' => 'json', + ), + 1529 => + array ( + 'id' => '2357', + 'object_count' => '1', + 'word' => 'its', + ), + 1530 => + array ( + 'id' => '2358', + 'object_count' => '1', + 'word' => 'integrate', + ), + 1531 => + array ( + 'id' => '2359', + 'object_count' => '1', + 'word' => '1000', + ), + 1532 => + array ( + 'id' => '2360', + 'object_count' => '1', + 'word' => 'accelerate', + ), + 1533 => + array ( + 'id' => '2361', + 'object_count' => '1', + 'word' => 'reduce', + ), + 1534 => + array ( + 'id' => '2362', + 'object_count' => '1', + 'word' => 'success', + ), + 1535 => + array ( + 'id' => '2363', + 'object_count' => '1', + 'word' => 'succeed', + ), + 1536 => + array ( + 'id' => '2364', + 'object_count' => '1', + 'word' => 'our', + ), + 1537 => + array ( + 'id' => '2365', + 'object_count' => '1', + 'word' => 'benefit', + ), + 1538 => + array ( + 'id' => '2366', + 'object_count' => '1', + 'word' => 'meet', + ), + 1539 => + array ( + 'id' => '2367', + 'object_count' => '1', + 'word' => 'agreements', + ), + 1540 => + array ( + 'id' => '2368', + 'object_count' => '1', + 'word' => 'highly', + ), + 1541 => + array ( + 'id' => '2369', + 'object_count' => '1', + 'word' => 'qualified', + ), + 1542 => + array ( + 'id' => '2370', + 'object_count' => '1', + 'word' => 'thrive', + ), + 1543 => + array ( + 'id' => '2371', + 'object_count' => '1', + 'word' => 'complete', + ), + 1544 => + array ( + 'id' => '2372', + 'object_count' => '1', + 'word' => 'satisfaction', + ), + 1545 => + array ( + 'id' => '2373', + 'object_count' => '1', + 'word' => 'accurate', + ), + 1546 => + array ( + 'id' => '2374', + 'object_count' => '1', + 'word' => 'thorough', + ), + 1547 => + array ( + 'id' => '2375', + 'object_count' => '1', + 'word' => 'responses', + ), + 1548 => + array ( + 'id' => '2376', + 'object_count' => '1', + 'word' => 'variety', + ), + 1549 => + array ( + 'id' => '2377', + 'object_count' => '1', + 'word' => 'expert', + ), + 1550 => + array ( + 'id' => '2378', + 'object_count' => '1', + 'word' => 'certify', + ), + 1551 => + array ( + 'id' => '2379', + 'object_count' => '1', + 'word' => 'assist', + ), + 1552 => + array ( + 'id' => '2380', + 'object_count' => '1', + 'word' => 'globe', + ), + 1553 => + array ( + 'id' => '2381', + 'object_count' => '1', + 'word' => 'distribute', + ), + 1554 => + array ( + 'id' => '2382', + 'object_count' => '1', + 'word' => 'practices', + ), + 1555 => + array ( + 'id' => '2383', + 'object_count' => '1', + 'word' => 'dedication', + ), + 1556 => + array ( + 'id' => '2384', + 'object_count' => '1', + 'word' => 'supporting', + ), + 1557 => + array ( + 'id' => '2385', + 'object_count' => '1', + 'word' => 'trust', + ), + 1558 => + array ( + 'id' => '2386', + 'object_count' => '1', + 'word' => '1175497860', + ), + 1559 => + array ( + 'id' => '2387', + 'object_count' => '1', + 'word' => '1175498940', + ), + 1560 => + array ( + 'id' => '2388', + 'object_count' => '1', + 'word' => '1175497920', + ), + 1561 => + array ( + 'id' => '2389', + 'object_count' => '1', + 'word' => '1175498280', + ), + 1562 => + array ( + 'id' => '2390', + 'object_count' => '1', + 'word' => '1175498880', + ), + 1563 => + array ( + 'id' => '2391', + 'object_count' => '1', + 'word' => '1175499180', + ), + 1564 => + array ( + 'id' => '2392', + 'object_count' => '1', + 'word' => 'wiki', + ), + 1565 => + array ( + 'id' => '2393', + 'object_count' => '1', + 'word' => 'quoc', + ), + 1566 => + array ( + 'id' => '2394', + 'object_count' => '1', + 'word' => 'huy', + ), + 1567 => + array ( + 'id' => '2395', + 'object_count' => '1', + 'word' => 'paal', + ), + 1568 => + array ( + 'id' => '2396', + 'object_count' => '1', + 'word' => 'berg', + ), + 1569 => + array ( + 'id' => '2397', + 'object_count' => '1', + 'word' => 'ivo', + ), + 1570 => + array ( + 'id' => '2398', + 'object_count' => '1', + 'word' => 'ready', + ), + 1571 => + array ( + 'id' => '2399', + 'object_count' => '1', + 'word' => 'day', + ), + 1572 => + array ( + 'id' => '2400', + 'object_count' => '2', + 'word' => 'together', + ), + 1573 => + array ( + 'id' => '2401', + 'object_count' => '1', + 'word' => 'mediterranean', + ), + 1574 => + array ( + 'id' => '2402', + 'object_count' => '1', + 'word' => 'seen', + ), + 1575 => + array ( + 'id' => '2403', + 'object_count' => '1', + 'word' => 'nice', + ), + 1576 => + array ( + 'id' => '2404', + 'object_count' => '1', + 'word' => 'hotel', + ), + 1577 => + array ( + 'id' => '2405', + 'object_count' => '1', + 'word' => 'lobby', + ), + 1578 => + array ( + 'id' => '2406', + 'object_count' => '2', + 'word' => 'isola2000', + ), + 1579 => + array ( + 'id' => '2407', + 'object_count' => '1', + 'word' => 'alexander', + ), + 1580 => + array ( + 'id' => '2408', + 'object_count' => '1', + 'word' => 'past', + ), + 1581 => + array ( + 'id' => '2409', + 'object_count' => '1', + 'word' => 'gaby', + ), + 1582 => + array ( + 'id' => '2410', + 'object_count' => '1', + 'word' => 'today', + ), + 1583 => + array ( + 'id' => '2411', + 'object_count' => '1', + 'word' => 'tomorrow', + ), + 1584 => + array ( + 'id' => '2412', + 'object_count' => '1', + 'word' => 'white', + ), + 1585 => + array ( + 'id' => '2413', + 'object_count' => '1', + 'word' => 'beautiful', + ), + 1586 => + array ( + 'id' => '2414', + 'object_count' => '1', + 'word' => 'skiing', + ), + 1587 => + array ( + 'id' => '2415', + 'object_count' => '1', + 'word' => 'ceo', + ), + 1588 => + array ( + 'id' => '2416', + 'object_count' => '1', + 'word' => 'pitch', + ), + 1589 => + array ( + 'id' => '2417', + 'object_count' => '2', + 'word' => 'paris', + ), + 1590 => + array ( + 'id' => '2418', + 'object_count' => '2', + 'word' => 'ispum', + ), + 1591 => + array ( + 'id' => '2419', + 'object_count' => '1', + 'word' => '1193915460', + ), + 1592 => + array ( + 'id' => '2420', + 'object_count' => '2', + 'word' => 'fun', + ), + 1593 => + array ( + 'id' => '2421', + 'object_count' => '2', + 'word' => 'lyon', + ), + 1594 => + array ( + 'id' => '2422', + 'object_count' => '1', + 'word' => 'relax', + ), + 1595 => + array ( + 'id' => '2423', + 'object_count' => '1', + 'word' => 'travel', + ), + 1596 => + array ( + 'id' => '2424', + 'object_count' => '1', + 'word' => 'france', + ), + 1597 => + array ( + 'id' => '2425', + 'object_count' => '1', + 'word' => '1193915580', + ), + 1598 => + array ( + 'id' => '2426', + 'object_count' => '3', + 'word' => 'company', + ), + 1599 => + array ( + 'id' => '2427', + 'object_count' => '1', + 'word' => 'separate', + ), + 1600 => + array ( + 'id' => '2428', + 'object_count' => '1', + 'word' => 'few', + ), + 1601 => + array ( + 'id' => '2429', + 'object_count' => '1', + 'word' => 'exactly', + ), + 1602 => + array ( + 'id' => '2430', + 'object_count' => '1', + 'word' => 'supposed', + ), + 1603 => + array ( + 'id' => '2431', + 'object_count' => '1', + 'word' => 'achieve', + ), + 1604 => + array ( + 'id' => '2432', + 'object_count' => '1', + 'word' => 'clean', + ), + 1605 => + array ( + 'id' => '2433', + 'object_count' => '1', + 'word' => 'separation', + ), + 1606 => + array ( + 'id' => '2434', + 'object_count' => '1', + 'word' => 'organized', + ), + 1607 => + array ( + 'id' => '2435', + 'object_count' => '1', + 'word' => 'structured', + ), + 1608 => + array ( + 'id' => '2436', + 'object_count' => '1', + 'word' => 'manner', + ), + 1609 => + array ( + 'id' => '2437', + 'object_count' => '2', + 'word' => 'such', + ), + 1610 => + array ( + 'id' => '2438', + 'object_count' => '1', + 'word' => 'car', + ), + 1611 => + array ( + 'id' => '2439', + 'object_count' => '1', + 'word' => 'year', + ), + 1612 => + array ( + 'id' => '2440', + 'object_count' => '1', + 'word' => 'color', + ), + 1613 => + array ( + 'id' => '2441', + 'object_count' => '1', + 'word' => 'purpose', + ), + 1614 => + array ( + 'id' => '2442', + 'object_count' => '1', + 'word' => 'later', + ), + 1615 => + array ( + 'id' => '2443', + 'object_count' => '1', + 'word' => 'referred', + ), + 1616 => + array ( + 'id' => '2444', + 'object_count' => '1', + 'word' => 'refers', + ), + 1617 => + array ( + 'id' => '2445', + 'object_count' => '1', + 'word' => 'visually', + ), + 1618 => + array ( + 'id' => '2446', + 'object_count' => '1', + 'word' => 'includes', + ), + 1619 => + array ( + 'id' => '2447', + 'object_count' => '1', + 'word' => 'things', + ), + 1620 => + array ( + 'id' => '2448', + 'object_count' => '1', + 'word' => 'stylesheets', + ), + 1621 => + array ( + 'id' => '2449', + 'object_count' => '1', + 'word' => 'typography', + ), + 1622 => + array ( + 'id' => '2450', + 'object_count' => '1', + 'word' => 'fonts', + ), + 1623 => + array ( + 'id' => '2451', + 'object_count' => '1', + 'word' => 'deals', + ), + 1624 => + array ( + 'id' => '2452', + 'object_count' => '1', + 'word' => 'structuring', + ), + 1625 => + array ( + 'id' => '2453', + 'object_count' => '1', + 'word' => 'dictates', + ), + 1626 => + array ( + 'id' => '2454', + 'object_count' => '1', + 'word' => 'benefits', + ), + 1627 => + array ( + 'id' => '2455', + 'object_count' => '1', + 'word' => 'handle', + ), + 1628 => + array ( + 'id' => '2456', + 'object_count' => '1', + 'word' => 'distinction', + ), + 1629 => + array ( + 'id' => '2457', + 'object_count' => '1', + 'word' => 'displaying', + ), + 1630 => + array ( + 'id' => '2458', + 'object_count' => '1', + 'word' => 'designers', + ), + 1631 => + array ( + 'id' => '2459', + 'object_count' => '1', + 'word' => 'separately', + ), + 1632 => + array ( + 'id' => '2460', + 'object_count' => '1', + 'word' => 'conflicts', + ), + 1633 => + array ( + 'id' => '2461', + 'object_count' => '1', + 'word' => 'formats', + ), + 1634 => + array ( + 'id' => '2462', + 'object_count' => '1', + 'word' => 'transferred', + ), + 1635 => + array ( + 'id' => '2463', + 'object_count' => '1', + 'word' => 'purposed', + ), + 1636 => + array ( + 'id' => '2464', + 'object_count' => '1', + 'word' => 'redesigns', + ), + 1637 => + array ( + 'id' => '2465', + 'object_count' => '1', + 'word' => 'applied', + ), + 1638 => + array ( + 'id' => '2466', + 'object_count' => '1', + 'word' => 'modifications', + ), + 1639 => + array ( + 'id' => '2467', + 'object_count' => '1', + 'word' => 'presenting', + ), + 1640 => + array ( + 'id' => '2468', + 'object_count' => '1', + 'word' => 'fundamental', + ), + 1641 => + array ( + 'id' => '2469', + 'object_count' => '1', + 'word' => 'unit', + ), + 1642 => + array ( + 'id' => '2470', + 'object_count' => '1', + 'word' => 'dictate', + ), + 1643 => + array ( + 'id' => '2471', + 'object_count' => '1', + 'word' => 'appear', + ), + 1644 => + array ( + 'id' => '2472', + 'object_count' => '1', + 'word' => 'middle', + ), + 1645 => + array ( + 'id' => '2473', + 'object_count' => '1', + 'word' => 'accessed', + ), + 1646 => + array ( + 'id' => '2474', + 'object_count' => '1', + 'word' => 'extended', + ), + 1647 => + array ( + 'id' => '2475', + 'object_count' => '1', + 'word' => 'describes', + ), + 1648 => + array ( + 'id' => '2476', + 'object_count' => '1', + 'word' => 'particular', + ), + 1649 => + array ( + 'id' => '2477', + 'object_count' => '1', + 'word' => 'types', + ), + 1650 => + array ( + 'id' => '2478', + 'object_count' => '1', + 'word' => 'viewing', + ), + 1651 => + array ( + 'id' => '2479', + 'object_count' => '1', + 'word' => 'contents', + ), + 1652 => + array ( + 'id' => '2480', + 'object_count' => '1', + 'word' => 'gallery', + ), + 1653 => + array ( + 'id' => '2481', + 'object_count' => '1', + 'word' => 'thumbnails', + ), + 1654 => + array ( + 'id' => '2482', + 'object_count' => '1', + 'word' => 'items', + ), + 1655 => + array ( + 'id' => '2483', + 'object_count' => '1', + 'word' => 'posts', + ), + 1656 => + array ( + 'id' => '2484', + 'object_count' => '1', + 'word' => 'kinds', + ), + 1657 => + array ( + 'id' => '2485', + 'object_count' => '1', + 'word' => 'located', + ), + 1658 => + array ( + 'id' => '2486', + 'object_count' => '1', + 'word' => 'hierarchy', + ), + 1659 => + array ( + 'id' => '2487', + 'object_count' => '1', + 'word' => 'short', + ), + 1660 => + array ( + 'id' => '2488', + 'object_count' => '1', + 'word' => 'transforming', + ), + 1661 => + array ( + 'id' => '2489', + 'object_count' => '1', + 'word' => 'produces', + ), + 1662 => + array ( + 'id' => '2490', + 'object_count' => '1', + 'word' => 'webpage', + ), + 1663 => + array ( + 'id' => '2491', + 'object_count' => '1', + 'word' => 'illustrate', + ), + 1664 => + array ( + 'id' => '2492', + 'object_count' => '1', + 'word' => 'produce', + ), + 1665 => + array ( + 'id' => '2493', + 'object_count' => '1', + 'word' => 'learn', + ), + 1666 => + array ( + 'id' => '2494', + 'object_count' => '1', + 'word' => 'separation_of_content_and_design', + ), + 1667 => + array ( + 'id' => '2495', + 'object_count' => '1', + 'word' => 'openoffice_import_large', + ), + 1668 => + array ( + 'id' => '2496', + 'object_count' => '1', + 'word' => 'translation_large', + ), + 1669 => + array ( + 'id' => '2497', + 'object_count' => '1', + 'word' => 'multiupload_large', + ), + 1670 => + array ( + 'id' => '2498', + 'object_count' => '1', + 'word' => 'gallery_large', + ), + 1671 => + array ( + 'id' => '2499', + 'object_count' => '1', + 'word' => 'search_result_large', + ), + 1672 => + array ( + 'id' => '2500', + 'object_count' => '1', + 'word' => 'ez_tool_bar_large', + ), + 1673 => + array ( + 'id' => '2501', + 'object_count' => '1', + 'word' => 'quicktime_large', + ), + 1674 => + array ( + 'id' => '2502', + 'object_count' => '1', + 'word' => 'web_2_0_large', + ), + 1675 => + array ( + 'id' => '2503', + 'object_count' => '1', + 'word' => 'usermanagement_large', + ), + 1676 => + array ( + 'id' => '2504', + 'object_count' => '1', + 'word' => 'workflow_large', + ), + 1677 => + array ( + 'id' => '2505', + 'object_count' => '1', + 'word' => 'versioning_large', + ), + 1678 => + array ( + 'id' => '2506', + 'object_count' => '2', + 'word' => 'datatypes_attributes_content_class_and_objects_large', + ), + 1679 => + array ( + 'id' => '2507', + 'object_count' => '1', + 'word' => 'multiple_location_large', + ), + 1680 => + array ( + 'id' => '2508', + 'object_count' => '1', + 'word' => 'multisite_deployment_large', + ), + 1681 => + array ( + 'id' => '2509', + 'object_count' => '1', + 'word' => 'seo_large', + ), + 1682 => + array ( + 'id' => '2510', + 'object_count' => '1', + 'word' => 'admin_site_large', + ), + 1683 => + array ( + 'id' => '2511', + 'object_count' => '1', + 'word' => 'site_style_large', + ), + 1684 => + array ( + 'id' => '2512', + 'object_count' => '1', + 'word' => 'aspects', + ), + 1685 => + array ( + 'id' => '2513', + 'object_count' => '1', + 'word' => 'queried', + ), + 1686 => + array ( + 'id' => '2514', + 'object_count' => '1', + 'word' => 'metadata', + ), + 1687 => + array ( + 'id' => '2515', + 'object_count' => '1', + 'word' => 'values', + ), + 1688 => + array ( + 'id' => '2516', + 'object_count' => '1', + 'word' => 'protected', + ), + 1689 => + array ( + 'id' => '2517', + 'object_count' => '1', + 'word' => 'career', + ), + 1690 => + array ( + 'id' => '2518', + 'object_count' => '1', + 'word' => 'investors', + ), + 1691 => + array ( + 'id' => '2519', + 'object_count' => '1', + 'word' => 'relation', + ), + 1692 => + array ( + 'id' => '2520', + 'object_count' => '1', + 'word' => 'banner', + ), + 1693 => + array ( + 'id' => '2521', + 'object_count' => '1', + 'word' => 'admin', + ), + 1694 => + array ( + 'id' => '2522', + 'object_count' => '1', + 'word' => 'kn', + ), + ), + 'ezsearch_object_word_link' => + array ( + 0 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4663', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '951', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '930', + ), + 1 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4664', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '1', + 'prev_word_id' => '930', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '951', + ), + 2 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4665', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '951', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '952', + ), + 3 => + array ( + 'contentclass_attribute_id' => '8', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4666', + 'identifier' => 'first_name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '953', + ), + 4 => + array ( + 'contentclass_attribute_id' => '9', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4667', + 'identifier' => 'last_name', + 'integer_value' => '0', + 'next_word_id' => '953', + 'placement' => '1', + 'prev_word_id' => '953', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '954', + ), + 5 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4668', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '955', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '953', + ), + 6 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4669', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '3', + 'prev_word_id' => '953', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '955', + ), + 7 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4670', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '955', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '927', + ), + 8 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '12', + 'frequency' => '0', + 'id' => '4673', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920775', + 'section_id' => '2', + 'word_id' => '958', + ), + 9 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '12', + 'frequency' => '0', + 'id' => '4674', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '958', + 'published' => '1033920775', + 'section_id' => '2', + 'word_id' => '930', + ), + 10 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '13', + 'frequency' => '0', + 'id' => '4675', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920794', + 'section_id' => '2', + 'word_id' => '959', + ), + 11 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '41', + 'frequency' => '0', + 'id' => '4681', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1060695457', + 'section_id' => '3', + 'word_id' => '961', + ), + 12 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4682', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '953', + ), + 13 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4683', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '1', + 'prev_word_id' => '953', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '930', + ), + 14 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4684', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '2', + 'prev_word_id' => '930', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '954', + ), + 15 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4685', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '3', + 'prev_word_id' => '954', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '952', + ), + 16 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4686', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '4', + 'prev_word_id' => '952', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '816', + ), + 17 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4687', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '953', + 'placement' => '5', + 'prev_word_id' => '816', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '814', + ), + 18 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4688', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '6', + 'prev_word_id' => '814', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '953', + ), + 19 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4689', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '7', + 'prev_word_id' => '953', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '954', + ), + 20 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '45', + 'frequency' => '0', + 'id' => '4690', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1079684190', + 'section_id' => '4', + 'word_id' => '812', + ), + 21 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '49', + 'frequency' => '0', + 'id' => '4691', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220197', + 'section_id' => '3', + 'word_id' => '962', + ), + 22 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '50', + 'frequency' => '0', + 'id' => '4692', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220220', + 'section_id' => '3', + 'word_id' => '963', + ), + 23 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '51', + 'frequency' => '0', + 'id' => '4693', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220233', + 'section_id' => '3', + 'word_id' => '964', + ), + 24 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4694', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '965', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '877', + ), + 25 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4695', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '966', + 'placement' => '1', + 'prev_word_id' => '877', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '965', + ), + 26 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4696', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '965', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '966', + ), + 27 => + array ( + 'contentclass_attribute_id' => '176', + 'contentclass_id' => '15', + 'contentobject_id' => '54', + 'frequency' => '0', + 'id' => '4697', + 'identifier' => 'id', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1082016652', + 'section_id' => '5', + 'word_id' => '967', + ), + 28 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '56', + 'frequency' => '0', + 'id' => '4698', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1103023132', + 'section_id' => '5', + 'word_id' => '968', + ), + 29 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '57', + 'frequency' => '0', + 'id' => '4699', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154172', + 'section_id' => '3', + 'word_id' => '969', + ), + 30 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4700', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '970', + ), + 31 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4701', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '972', + 'placement' => '1', + 'prev_word_id' => '970', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '971', + ), + 32 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4702', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '2', + 'prev_word_id' => '971', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '972', + ), + 33 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4703', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '972', + 'placement' => '3', + 'prev_word_id' => '972', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '954', + ), + 34 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4704', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '4', + 'prev_word_id' => '954', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '972', + ), + 35 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4705', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '5', + 'prev_word_id' => '972', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '893', + ), + 36 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4706', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '6', + 'prev_word_id' => '893', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '894', + ), + 37 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4707', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '7', + 'prev_word_id' => '894', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '973', + ), + 38 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4708', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '8', + 'prev_word_id' => '973', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '801', + ), + 39 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4709', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '9', + 'prev_word_id' => '801', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '939', + ), + 40 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4710', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '975', + 'placement' => '10', + 'prev_word_id' => '939', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '974', + ), + 41 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4711', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '11', + 'prev_word_id' => '974', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '975', + ), + 42 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4712', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '12', + 'prev_word_id' => '975', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '940', + ), + 43 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4713', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '13', + 'prev_word_id' => '940', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '807', + ), + 44 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4714', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '14', + 'prev_word_id' => '807', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '976', + ), + 45 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4715', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '977', + 'placement' => '15', + 'prev_word_id' => '976', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '810', + ), + 46 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4716', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '835', + 'placement' => '16', + 'prev_word_id' => '810', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '977', + ), + 47 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4717', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '17', + 'prev_word_id' => '977', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '835', + ), + 48 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4718', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '18', + 'prev_word_id' => '835', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '804', + ), + 49 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4719', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '979', + 'placement' => '19', + 'prev_word_id' => '804', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '978', + ), + 50 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4720', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '20', + 'prev_word_id' => '978', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '979', + ), + 51 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4721', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '21', + 'prev_word_id' => '979', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '844', + ), + 52 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4722', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '22', + 'prev_word_id' => '844', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '816', + ), + 53 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '65', + 'frequency' => '0', + 'id' => '4723', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '23', + 'prev_word_id' => '816', + 'published' => '1311154174', + 'section_id' => '1', + 'word_id' => '894', + ), + 54 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '66', + 'frequency' => '0', + 'id' => '4724', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154174', + 'section_id' => '3', + 'word_id' => '980', + ), + 55 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4725', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '924', + ), + 56 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4726', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '1', + 'prev_word_id' => '924', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '981', + ), + 57 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4727', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '2', + 'prev_word_id' => '981', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '982', + ), + 58 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4728', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '3', + 'prev_word_id' => '982', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '983', + ), + 59 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4729', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '4', + 'prev_word_id' => '983', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '984', + ), + 60 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4730', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '5', + 'prev_word_id' => '984', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '985', + ), + 61 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4731', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '6', + 'prev_word_id' => '985', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '986', + ), + 62 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4732', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '7', + 'prev_word_id' => '986', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '987', + ), + 63 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4733', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '8', + 'prev_word_id' => '987', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '988', + ), + 64 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4734', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '9', + 'prev_word_id' => '988', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '989', + ), + 65 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4735', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '10', + 'prev_word_id' => '989', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '984', + ), + 66 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4736', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '11', + 'prev_word_id' => '984', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '990', + ), + 67 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4737', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '12', + 'prev_word_id' => '990', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '991', + ), + 68 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4738', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '13', + 'prev_word_id' => '991', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '992', + ), + 69 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4739', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '14', + 'prev_word_id' => '992', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '993', + ), + 70 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4740', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '15', + 'prev_word_id' => '993', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '994', + ), + 71 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4741', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '16', + 'prev_word_id' => '994', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '995', + ), + 72 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4742', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '17', + 'prev_word_id' => '995', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '996', + ), + 73 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4743', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '18', + 'prev_word_id' => '996', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '997', + ), + 74 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4744', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '19', + 'prev_word_id' => '997', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 75 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4745', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '20', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '999', + ), + 76 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4746', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '21', + 'prev_word_id' => '999', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1000', + ), + 77 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4747', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '22', + 'prev_word_id' => '1000', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1001', + ), + 78 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4748', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '23', + 'prev_word_id' => '1001', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1002', + ), + 79 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4749', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '24', + 'prev_word_id' => '1002', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '995', + ), + 80 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4750', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '25', + 'prev_word_id' => '995', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '983', + ), + 81 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4751', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '924', + 'placement' => '26', + 'prev_word_id' => '983', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1003', + ), + 82 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4752', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1004', + 'placement' => '27', + 'prev_word_id' => '1003', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '924', + ), + 83 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4753', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '28', + 'prev_word_id' => '924', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1004', + ), + 84 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4754', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '29', + 'prev_word_id' => '1004', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '997', + ), + 85 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4755', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '30', + 'prev_word_id' => '997', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 86 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4756', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '31', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '999', + ), + 87 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4757', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '32', + 'prev_word_id' => '999', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1005', + ), + 88 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4758', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '33', + 'prev_word_id' => '1005', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1006', + ), + 89 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4759', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '924', + 'placement' => '34', + 'prev_word_id' => '1006', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1007', + ), + 90 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4760', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '35', + 'prev_word_id' => '1007', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '924', + ), + 91 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4761', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1009', + 'placement' => '36', + 'prev_word_id' => '924', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1008', + ), + 92 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4762', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '37', + 'prev_word_id' => '1008', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1009', + ), + 93 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4763', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '38', + 'prev_word_id' => '1009', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '997', + ), + 94 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4764', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '39', + 'prev_word_id' => '997', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 95 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4765', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '40', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '999', + ), + 96 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4766', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '41', + 'prev_word_id' => '999', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1000', + ), + 97 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4767', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '42', + 'prev_word_id' => '1000', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1001', + ), + 98 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4768', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '43', + 'prev_word_id' => '1001', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1002', + ), + 99 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4769', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '44', + 'prev_word_id' => '1002', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '995', + ), + 100 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4770', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '45', + 'prev_word_id' => '995', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '983', + ), + 101 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4771', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '46', + 'prev_word_id' => '983', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1003', + ), + 102 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4772', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '47', + 'prev_word_id' => '1003', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1005', + ), + 103 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4773', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '48', + 'prev_word_id' => '1005', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1006', + ), + 104 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4774', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '49', + 'prev_word_id' => '1006', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1007', + ), + 105 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4775', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '50', + 'prev_word_id' => '1007', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1010', + ), + 106 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4776', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '51', + 'prev_word_id' => '1010', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1011', + ), + 107 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4777', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '52', + 'prev_word_id' => '1011', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1012', + ), + 108 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4778', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '53', + 'prev_word_id' => '1012', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1013', + ), + 109 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4779', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '54', + 'prev_word_id' => '1013', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1014', + ), + 110 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4780', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '55', + 'prev_word_id' => '1014', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '997', + ), + 111 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4781', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '56', + 'prev_word_id' => '997', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1015', + ), + 112 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4782', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '57', + 'prev_word_id' => '1015', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '981', + ), + 113 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4783', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '58', + 'prev_word_id' => '981', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1016', + ), + 114 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4784', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '59', + 'prev_word_id' => '1016', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 115 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4785', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '60', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1018', + ), + 116 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4786', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '61', + 'prev_word_id' => '1018', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1019', + ), + 117 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4787', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '62', + 'prev_word_id' => '1019', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1020', + ), + 118 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4788', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '63', + 'prev_word_id' => '1020', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '996', + ), + 119 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4789', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '64', + 'prev_word_id' => '996', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1005', + ), + 120 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4790', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '65', + 'prev_word_id' => '1005', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1006', + ), + 121 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4791', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1021', + 'placement' => '66', + 'prev_word_id' => '1006', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1007', + ), + 122 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4792', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '924', + 'placement' => '67', + 'prev_word_id' => '1007', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1021', + ), + 123 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '67', + 'frequency' => '0', + 'id' => '4793', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '68', + 'prev_word_id' => '1021', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '924', + ), + 124 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '68', + 'frequency' => '0', + 'id' => '4794', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1022', + ), + 125 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4795', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1023', + ), + 126 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4796', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1025', + 'placement' => '1', + 'prev_word_id' => '1023', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1024', + ), + 127 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4797', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '2', + 'prev_word_id' => '1024', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1025', + ), + 128 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4798', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '3', + 'prev_word_id' => '1025', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1026', + ), + 129 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4799', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '4', + 'prev_word_id' => '1026', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1027', + ), + 130 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4800', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '5', + 'prev_word_id' => '1027', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '999', + ), + 131 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4801', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '6', + 'prev_word_id' => '999', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1028', + ), + 132 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4802', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '7', + 'prev_word_id' => '1028', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1001', + ), + 133 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4803', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '8', + 'prev_word_id' => '1001', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1029', + ), + 134 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4804', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '9', + 'prev_word_id' => '1029', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 135 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4805', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '10', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1031', + ), + 136 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4806', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '11', + 'prev_word_id' => '1031', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 137 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4807', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '12', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1032', + ), + 138 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4808', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '13', + 'prev_word_id' => '1032', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1001', + ), + 139 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4809', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '14', + 'prev_word_id' => '1001', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1033', + ), + 140 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4810', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '15', + 'prev_word_id' => '1033', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1002', + ), + 141 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4811', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '16', + 'prev_word_id' => '1002', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '995', + ), + 142 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4812', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '17', + 'prev_word_id' => '995', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1034', + ), + 143 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4813', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '18', + 'prev_word_id' => '1034', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1014', + ), + 144 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4814', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '19', + 'prev_word_id' => '1014', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 145 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4815', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '20', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 146 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4816', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '21', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1035', + ), + 147 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4817', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '22', + 'prev_word_id' => '1035', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '825', + ), + 148 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4818', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '23', + 'prev_word_id' => '825', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1036', + ), + 149 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4819', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '24', + 'prev_word_id' => '1036', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 150 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4820', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '25', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1037', + ), + 151 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4821', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '26', + 'prev_word_id' => '1037', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 152 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4822', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '27', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1038', + ), + 153 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4823', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '28', + 'prev_word_id' => '1038', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1026', + ), + 154 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4824', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '29', + 'prev_word_id' => '1026', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '985', + ), + 155 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4825', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '30', + 'prev_word_id' => '985', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1039', + ), + 156 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4826', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '31', + 'prev_word_id' => '1039', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 157 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4827', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '32', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 158 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4828', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '33', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1026', + ), + 159 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4829', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '34', + 'prev_word_id' => '1026', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1027', + ), + 160 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4830', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '35', + 'prev_word_id' => '1027', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '999', + ), + 161 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4831', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '36', + 'prev_word_id' => '999', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1028', + ), + 162 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4832', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '37', + 'prev_word_id' => '1028', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1001', + ), + 163 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4833', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '38', + 'prev_word_id' => '1001', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1029', + ), + 164 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4834', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '39', + 'prev_word_id' => '1029', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 165 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4835', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '40', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1031', + ), + 166 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4836', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '41', + 'prev_word_id' => '1031', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 167 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4837', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '42', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1032', + ), + 168 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4838', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '43', + 'prev_word_id' => '1032', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1001', + ), + 169 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4839', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '44', + 'prev_word_id' => '1001', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1033', + ), + 170 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4840', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '45', + 'prev_word_id' => '1033', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1002', + ), + 171 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4841', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '46', + 'prev_word_id' => '1002', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '995', + ), + 172 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4842', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '47', + 'prev_word_id' => '995', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1034', + ), + 173 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4843', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '48', + 'prev_word_id' => '1034', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1014', + ), + 174 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4844', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '49', + 'prev_word_id' => '1014', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 175 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4845', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '50', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 176 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4846', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '51', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1035', + ), + 177 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4847', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '52', + 'prev_word_id' => '1035', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '825', + ), + 178 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4848', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '53', + 'prev_word_id' => '825', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1036', + ), + 179 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4849', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '54', + 'prev_word_id' => '1036', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 180 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4850', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '55', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1037', + ), + 181 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4851', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '56', + 'prev_word_id' => '1037', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1017', + ), + 182 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4852', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '57', + 'prev_word_id' => '1017', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1038', + ), + 183 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4853', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '58', + 'prev_word_id' => '1038', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1026', + ), + 184 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4854', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '59', + 'prev_word_id' => '1026', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '985', + ), + 185 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4855', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '60', + 'prev_word_id' => '985', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1039', + ), + 186 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4856', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '61', + 'prev_word_id' => '1039', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 187 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4857', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '62', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '998', + ), + 188 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4858', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '63', + 'prev_word_id' => '998', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1026', + ), + 189 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4859', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '64', + 'prev_word_id' => '1026', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1040', + ), + 190 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4860', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '65', + 'prev_word_id' => '1040', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1041', + ), + 191 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4861', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '66', + 'prev_word_id' => '1041', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '990', + ), + 192 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4862', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '67', + 'prev_word_id' => '990', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1042', + ), + 193 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4863', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '68', + 'prev_word_id' => '1042', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1043', + ), + 194 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4864', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '69', + 'prev_word_id' => '1043', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1042', + ), + 195 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4865', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '70', + 'prev_word_id' => '1042', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '991', + ), + 196 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4866', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '71', + 'prev_word_id' => '991', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '995', + ), + 197 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4867', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '72', + 'prev_word_id' => '995', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1012', + ), + 198 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4868', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '73', + 'prev_word_id' => '1012', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1044', + ), + 199 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4869', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '74', + 'prev_word_id' => '1044', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1045', + ), + 200 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4870', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '75', + 'prev_word_id' => '1045', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1046', + ), + 201 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4871', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '76', + 'prev_word_id' => '1046', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1039', + ), + 202 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4872', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '77', + 'prev_word_id' => '1039', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1047', + ), + 203 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4873', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '78', + 'prev_word_id' => '1047', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1037', + ), + 204 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4874', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '79', + 'prev_word_id' => '1037', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1048', + ), + 205 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4875', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '80', + 'prev_word_id' => '1048', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1016', + ), + 206 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4876', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '81', + 'prev_word_id' => '1016', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1047', + ), + 207 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4877', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '82', + 'prev_word_id' => '1047', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '992', + ), + 208 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4878', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '83', + 'prev_word_id' => '992', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '993', + ), + 209 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4879', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '84', + 'prev_word_id' => '993', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1019', + ), + 210 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4880', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '85', + 'prev_word_id' => '1019', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '983', + ), + 211 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4881', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '86', + 'prev_word_id' => '983', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 212 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4882', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '87', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1049', + ), + 213 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4883', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '88', + 'prev_word_id' => '1049', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1043', + ), + 214 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4884', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '89', + 'prev_word_id' => '1043', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '996', + ), + 215 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4885', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '90', + 'prev_word_id' => '996', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1037', + ), + 216 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4886', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '91', + 'prev_word_id' => '1037', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1050', + ), + 217 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4887', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '92', + 'prev_word_id' => '1050', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1047', + ), + 218 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4888', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '93', + 'prev_word_id' => '1047', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '810', + ), + 219 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4889', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '94', + 'prev_word_id' => '810', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '988', + ), + 220 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4890', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '95', + 'prev_word_id' => '988', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1030', + ), + 221 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4891', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '96', + 'prev_word_id' => '1030', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1051', + ), + 222 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4892', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '97', + 'prev_word_id' => '1051', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1052', + ), + 223 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4893', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1023', + 'placement' => '98', + 'prev_word_id' => '1052', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1053', + ), + 224 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4894', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '99', + 'prev_word_id' => '1053', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1023', + ), + 225 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4895', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1025', + 'placement' => '100', + 'prev_word_id' => '1023', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1024', + ), + 226 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4896', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '101', + 'prev_word_id' => '1024', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1025', + ), + 227 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4897', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1055', + 'placement' => '102', + 'prev_word_id' => '1025', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 228 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4898', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '103', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1055', + ), + 229 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4899', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1057', + 'placement' => '104', + 'prev_word_id' => '1055', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1056', + ), + 230 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4900', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1058', + 'placement' => '105', + 'prev_word_id' => '1056', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1057', + ), + 231 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4901', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1059', + 'placement' => '106', + 'prev_word_id' => '1057', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1058', + ), + 232 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4902', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1060', + 'placement' => '107', + 'prev_word_id' => '1058', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1059', + ), + 233 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4903', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '108', + 'prev_word_id' => '1059', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1060', + ), + 234 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4904', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '109', + 'prev_word_id' => '1060', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 235 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4905', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '110', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 236 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4906', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1063', + 'placement' => '111', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1062', + ), + 237 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4907', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '112', + 'prev_word_id' => '1062', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1063', + ), + 238 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4908', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '113', + 'prev_word_id' => '1063', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1064', + ), + 239 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4909', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '114', + 'prev_word_id' => '1064', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 240 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4910', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '115', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 241 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4911', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '116', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1065', + ), + 242 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4912', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1066', + 'placement' => '117', + 'prev_word_id' => '1065', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 243 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4913', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1067', + 'placement' => '118', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1066', + ), + 244 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4914', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '119', + 'prev_word_id' => '1066', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1067', + ), + 245 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4915', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '120', + 'prev_word_id' => '1067', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 246 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4916', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '121', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1065', + ), + 247 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4917', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '122', + 'prev_word_id' => '1065', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 248 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4918', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '123', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 249 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4919', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '124', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1068', + ), + 250 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4920', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '125', + 'prev_word_id' => '1068', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 251 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4921', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '126', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 252 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4922', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '127', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1069', + ), + 253 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4923', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '128', + 'prev_word_id' => '1069', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1020', + ), + 254 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4924', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '129', + 'prev_word_id' => '1020', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1070', + ), + 255 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4925', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '130', + 'prev_word_id' => '1070', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1065', + ), + 256 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4926', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1071', + 'placement' => '131', + 'prev_word_id' => '1065', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1024', + ), + 257 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4927', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '132', + 'prev_word_id' => '1024', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1071', + ), + 258 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4928', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1072', + 'placement' => '133', + 'prev_word_id' => '1071', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1070', + ), + 259 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4929', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '134', + 'prev_word_id' => '1070', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1072', + ), + 260 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4930', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '135', + 'prev_word_id' => '1072', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 261 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4931', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '136', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 262 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4932', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '137', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1073', + ), + 263 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4933', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '138', + 'prev_word_id' => '1073', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1020', + ), + 264 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4934', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '139', + 'prev_word_id' => '1020', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1070', + ), + 265 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4935', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '140', + 'prev_word_id' => '1070', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1074', + ), + 266 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4936', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '141', + 'prev_word_id' => '1074', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1070', + ), + 267 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4937', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1076', + 'placement' => '142', + 'prev_word_id' => '1070', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1075', + ), + 268 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4938', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '143', + 'prev_word_id' => '1075', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1076', + ), + 269 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4939', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1078', + 'placement' => '144', + 'prev_word_id' => '1076', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1077', + ), + 270 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4940', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '145', + 'prev_word_id' => '1077', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1078', + ), + 271 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4941', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '146', + 'prev_word_id' => '1078', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 272 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4942', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '147', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 273 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4943', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '148', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1073', + ), + 274 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4944', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '149', + 'prev_word_id' => '1073', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1020', + ), + 275 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4945', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '150', + 'prev_word_id' => '1020', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1064', + ), + 276 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4946', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '151', + 'prev_word_id' => '1064', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1074', + ), + 277 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4947', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '152', + 'prev_word_id' => '1074', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1064', + ), + 278 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4948', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1079', + 'placement' => '153', + 'prev_word_id' => '1064', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1075', + ), + 279 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4949', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '154', + 'prev_word_id' => '1075', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1079', + ), + 280 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4950', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1080', + 'placement' => '155', + 'prev_word_id' => '1079', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1077', + ), + 281 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4951', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '156', + 'prev_word_id' => '1077', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1080', + ), + 282 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4952', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '157', + 'prev_word_id' => '1080', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 283 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4953', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '158', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 284 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4954', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '159', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1069', + ), + 285 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4955', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '160', + 'prev_word_id' => '1069', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 286 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4956', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '161', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 287 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4957', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '162', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1068', + ), + 288 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4958', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '163', + 'prev_word_id' => '1068', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 289 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4959', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '164', + 'prev_word_id' => '1061', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1054', + ), + 290 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4960', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '165', + 'prev_word_id' => '1054', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1062', + ), + 291 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '69', + 'frequency' => '0', + 'id' => '4961', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '166', + 'prev_word_id' => '1062', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1061', + ), + 292 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '70', + 'frequency' => '0', + 'id' => '4962', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154175', + 'section_id' => '1', + 'word_id' => '1081', + ), + 293 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4963', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1083', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1082', + ), + 294 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4964', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '1', + 'prev_word_id' => '1082', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1083', + ), + 295 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4965', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1025', + 'placement' => '2', + 'prev_word_id' => '1083', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1084', + ), + 296 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4966', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '3', + 'prev_word_id' => '1084', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1025', + ), + 297 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4967', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '4', + 'prev_word_id' => '1025', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 298 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4968', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '5', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1027', + ), + 299 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4969', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '6', + 'prev_word_id' => '1027', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '999', + ), + 300 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4970', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '7', + 'prev_word_id' => '999', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 301 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4971', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '8', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 302 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4972', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '9', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1029', + ), + 303 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4973', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '10', + 'prev_word_id' => '1029', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 304 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4974', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '11', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1031', + ), + 305 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4975', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '12', + 'prev_word_id' => '1031', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 306 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4976', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '13', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1032', + ), + 307 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4977', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '14', + 'prev_word_id' => '1032', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 308 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4978', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '15', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1033', + ), + 309 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4979', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '16', + 'prev_word_id' => '1033', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 310 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4980', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '17', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 311 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4981', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '18', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1034', + ), + 312 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4982', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '19', + 'prev_word_id' => '1034', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 313 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4983', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '20', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 314 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4984', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '21', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 315 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4985', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '22', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1035', + ), + 316 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4986', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '23', + 'prev_word_id' => '1035', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 317 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4987', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '24', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 318 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4988', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '25', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 319 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4989', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '26', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 320 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4990', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '27', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 321 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4991', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '28', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1038', + ), + 322 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4992', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '29', + 'prev_word_id' => '1038', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 323 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4993', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '30', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '985', + ), + 324 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4994', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '31', + 'prev_word_id' => '985', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 325 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4995', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '32', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 326 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4996', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '33', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 327 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4997', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '34', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 328 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4998', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '35', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 329 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '4999', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '36', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1041', + ), + 330 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5000', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '37', + 'prev_word_id' => '1041', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 331 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5001', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '38', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 332 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5002', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '39', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 333 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5003', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '40', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 334 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5004', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '41', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '991', + ), + 335 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5005', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '42', + 'prev_word_id' => '991', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 336 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5006', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '43', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1012', + ), + 337 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5007', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '44', + 'prev_word_id' => '1012', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1044', + ), + 338 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5008', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '45', + 'prev_word_id' => '1044', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1045', + ), + 339 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5009', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '46', + 'prev_word_id' => '1045', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1046', + ), + 340 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5010', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '47', + 'prev_word_id' => '1046', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 341 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5011', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '48', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 342 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5012', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '49', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 343 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5013', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '50', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1048', + ), + 344 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5014', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '51', + 'prev_word_id' => '1048', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 345 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5015', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '52', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 346 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5016', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '53', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '992', + ), + 347 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5017', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '54', + 'prev_word_id' => '992', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '993', + ), + 348 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5018', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '55', + 'prev_word_id' => '993', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 349 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5019', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '56', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 350 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5020', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '57', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 351 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5021', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '58', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1049', + ), + 352 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5022', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '59', + 'prev_word_id' => '1049', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 353 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5023', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '60', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '996', + ), + 354 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5024', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '61', + 'prev_word_id' => '996', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 355 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5025', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '62', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1050', + ), + 356 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5026', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '63', + 'prev_word_id' => '1050', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 357 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5027', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '64', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 358 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5028', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '65', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 359 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5029', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '66', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 360 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5030', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '67', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1051', + ), + 361 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5031', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '68', + 'prev_word_id' => '1051', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1052', + ), + 362 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5032', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '69', + 'prev_word_id' => '1052', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1053', + ), + 363 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5033', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '70', + 'prev_word_id' => '1053', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 364 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5034', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '71', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1027', + ), + 365 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5035', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '72', + 'prev_word_id' => '1027', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '999', + ), + 366 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5036', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '73', + 'prev_word_id' => '999', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 367 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5037', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '74', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 368 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5038', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '75', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1029', + ), + 369 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5039', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '76', + 'prev_word_id' => '1029', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 370 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5040', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '77', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1031', + ), + 371 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5041', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '78', + 'prev_word_id' => '1031', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 372 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5042', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '79', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1032', + ), + 373 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5043', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '80', + 'prev_word_id' => '1032', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 374 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5044', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '81', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1033', + ), + 375 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5045', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '82', + 'prev_word_id' => '1033', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 376 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5046', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '83', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 377 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5047', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '84', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1034', + ), + 378 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5048', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '85', + 'prev_word_id' => '1034', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 379 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5049', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '86', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 380 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5050', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '87', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 381 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5051', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '88', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1035', + ), + 382 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5052', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '89', + 'prev_word_id' => '1035', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 383 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5053', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '90', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 384 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5054', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '91', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 385 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5055', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '92', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 386 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5056', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '93', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 387 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5057', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '94', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1038', + ), + 388 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5058', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '95', + 'prev_word_id' => '1038', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 389 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5059', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '96', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '985', + ), + 390 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5060', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '97', + 'prev_word_id' => '985', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 391 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5061', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '98', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 392 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5062', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '99', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 393 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5063', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '100', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 394 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5064', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '101', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 395 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5065', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '102', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1041', + ), + 396 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5066', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '103', + 'prev_word_id' => '1041', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 397 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5067', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '104', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 398 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5068', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '105', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 399 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5069', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '106', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 400 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5070', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '107', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '991', + ), + 401 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5071', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '108', + 'prev_word_id' => '991', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 402 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5072', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '109', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1012', + ), + 403 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5073', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '110', + 'prev_word_id' => '1012', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1044', + ), + 404 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5074', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '111', + 'prev_word_id' => '1044', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1045', + ), + 405 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5075', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '112', + 'prev_word_id' => '1045', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1046', + ), + 406 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5076', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '113', + 'prev_word_id' => '1046', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 407 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5077', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '114', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 408 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5078', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '115', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 409 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5079', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '116', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1048', + ), + 410 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5080', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '117', + 'prev_word_id' => '1048', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 411 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5081', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '118', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 412 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5082', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '119', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '992', + ), + 413 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5083', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '120', + 'prev_word_id' => '992', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '993', + ), + 414 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5084', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '121', + 'prev_word_id' => '993', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 415 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5085', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '122', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 416 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5086', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '123', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 417 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5087', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '124', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1049', + ), + 418 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5088', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '125', + 'prev_word_id' => '1049', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 419 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5089', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '126', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '996', + ), + 420 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5090', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '127', + 'prev_word_id' => '996', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 421 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5091', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '128', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1050', + ), + 422 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5092', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '129', + 'prev_word_id' => '1050', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 423 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5093', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '130', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 424 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5094', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '131', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 425 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5095', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '132', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 426 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5096', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '133', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1051', + ), + 427 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5097', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '134', + 'prev_word_id' => '1051', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1052', + ), + 428 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5098', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '135', + 'prev_word_id' => '1052', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1053', + ), + 429 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5099', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '136', + 'prev_word_id' => '1053', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1085', + ), + 430 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5100', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '137', + 'prev_word_id' => '1085', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1086', + ), + 431 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5101', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '138', + 'prev_word_id' => '1086', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1087', + ), + 432 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5102', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '139', + 'prev_word_id' => '1087', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1088', + ), + 433 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5103', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '140', + 'prev_word_id' => '1088', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1089', + ), + 434 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5104', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '141', + 'prev_word_id' => '1089', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1090', + ), + 435 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5105', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '142', + 'prev_word_id' => '1090', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1091', + ), + 436 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5106', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '143', + 'prev_word_id' => '1091', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1092', + ), + 437 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5107', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '144', + 'prev_word_id' => '1092', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1093', + ), + 438 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5108', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '145', + 'prev_word_id' => '1093', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1094', + ), + 439 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5109', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '146', + 'prev_word_id' => '1094', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1095', + ), + 440 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5110', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '147', + 'prev_word_id' => '1095', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1096', + ), + 441 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5111', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '148', + 'prev_word_id' => '1096', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1010', + ), + 442 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5112', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1098', + 'placement' => '149', + 'prev_word_id' => '1010', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1097', + ), + 443 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5113', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '150', + 'prev_word_id' => '1097', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1098', + ), + 444 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5114', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '151', + 'prev_word_id' => '1098', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1099', + ), + 445 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5115', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '152', + 'prev_word_id' => '1099', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 446 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5116', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '153', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '989', + ), + 447 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5117', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '154', + 'prev_word_id' => '989', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 448 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5118', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '155', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 449 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5119', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '156', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1100', + ), + 450 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5120', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '157', + 'prev_word_id' => '1100', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '997', + ), + 451 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5121', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '158', + 'prev_word_id' => '997', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1101', + ), + 452 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5122', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '159', + 'prev_word_id' => '1101', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '987', + ), + 453 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5123', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '160', + 'prev_word_id' => '987', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 454 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5124', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '161', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1102', + ), + 455 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5125', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '162', + 'prev_word_id' => '1102', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 456 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5126', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '163', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1103', + ), + 457 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5127', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '164', + 'prev_word_id' => '1103', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 458 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5128', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '165', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 459 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5129', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '166', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 460 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5130', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '167', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 461 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5131', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1104', + 'placement' => '168', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '863', + ), + 462 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5132', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '169', + 'prev_word_id' => '863', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1104', + ), + 463 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5133', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '170', + 'prev_word_id' => '1104', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 464 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5134', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '171', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 465 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5135', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '172', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 466 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5136', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '173', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1106', + ), + 467 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5137', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '174', + 'prev_word_id' => '1106', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 468 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5138', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '175', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 469 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5139', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '176', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 470 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5140', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '177', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1003', + ), + 471 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5141', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '178', + 'prev_word_id' => '1003', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 472 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5142', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '179', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1108', + ), + 473 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5143', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '180', + 'prev_word_id' => '1108', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 474 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5144', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '181', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '994', + ), + 475 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5145', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '182', + 'prev_word_id' => '994', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 476 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5146', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '183', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1109', + ), + 477 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5147', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '184', + 'prev_word_id' => '1109', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 478 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5148', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '185', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1108', + ), + 479 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5149', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '186', + 'prev_word_id' => '1108', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1100', + ), + 480 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5150', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '187', + 'prev_word_id' => '1100', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 481 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5151', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '188', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 482 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5152', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '189', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1106', + ), + 483 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5153', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '190', + 'prev_word_id' => '1106', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 484 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5154', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '191', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1110', + ), + 485 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5155', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '192', + 'prev_word_id' => '1110', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 486 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5156', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '193', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1111', + ), + 487 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5157', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '194', + 'prev_word_id' => '1111', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 488 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5158', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '195', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1112', + ), + 489 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5159', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '196', + 'prev_word_id' => '1112', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 490 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5160', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '197', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1113', + ), + 491 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5161', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '198', + 'prev_word_id' => '1113', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1114', + ), + 492 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5162', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '199', + 'prev_word_id' => '1114', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 493 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5163', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '200', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1007', + ), + 494 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5164', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '201', + 'prev_word_id' => '1007', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 495 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5165', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '202', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1099', + ), + 496 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5166', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '203', + 'prev_word_id' => '1099', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '982', + ), + 497 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5167', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '204', + 'prev_word_id' => '982', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1115', + ), + 498 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5168', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '205', + 'prev_word_id' => '1115', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '981', + ), + 499 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5169', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '206', + 'prev_word_id' => '981', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 500 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5170', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '207', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '984', + ), + 501 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5171', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '208', + 'prev_word_id' => '984', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 502 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5172', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '209', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 503 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5173', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '210', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 504 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5174', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '211', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 505 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5175', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '212', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 506 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5176', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '213', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1103', + ), + 507 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5177', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '214', + 'prev_word_id' => '1103', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1116', + ), + 508 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5178', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '215', + 'prev_word_id' => '1116', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 509 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5179', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '216', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 510 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5180', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '217', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1117', + ), + 511 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5181', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '218', + 'prev_word_id' => '1117', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 512 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5182', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '219', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1118', + ), + 513 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5183', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '220', + 'prev_word_id' => '1118', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1119', + ), + 514 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5184', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '221', + 'prev_word_id' => '1119', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 515 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5185', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '222', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1011', + ), + 516 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5186', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '223', + 'prev_word_id' => '1011', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 517 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5187', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '224', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1114', + ), + 518 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5188', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '225', + 'prev_word_id' => '1114', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 519 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5189', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '226', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1007', + ), + 520 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5190', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '227', + 'prev_word_id' => '1007', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 521 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5191', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '228', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '981', + ), + 522 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5192', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '229', + 'prev_word_id' => '981', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 523 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5193', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '230', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '984', + ), + 524 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5194', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '231', + 'prev_word_id' => '984', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 525 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5195', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1082', + 'placement' => '232', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 526 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5196', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1083', + 'placement' => '233', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1082', + ), + 527 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5197', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '234', + 'prev_word_id' => '1082', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1083', + ), + 528 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5198', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1025', + 'placement' => '235', + 'prev_word_id' => '1083', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1084', + ), + 529 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5199', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '236', + 'prev_word_id' => '1084', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1025', + ), + 530 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5200', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1055', + 'placement' => '237', + 'prev_word_id' => '1025', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 531 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5201', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '238', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1055', + ), + 532 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5202', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1057', + 'placement' => '239', + 'prev_word_id' => '1055', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1056', + ), + 533 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5203', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1058', + 'placement' => '240', + 'prev_word_id' => '1056', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1057', + ), + 534 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5204', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1059', + 'placement' => '241', + 'prev_word_id' => '1057', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1058', + ), + 535 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5205', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1060', + 'placement' => '242', + 'prev_word_id' => '1058', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1059', + ), + 536 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5206', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '243', + 'prev_word_id' => '1059', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1060', + ), + 537 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5207', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '244', + 'prev_word_id' => '1060', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 538 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5208', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '245', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 539 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5209', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1063', + 'placement' => '246', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1062', + ), + 540 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5210', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '247', + 'prev_word_id' => '1062', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1063', + ), + 541 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5211', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '248', + 'prev_word_id' => '1063', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 542 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5212', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '249', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 543 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5213', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '250', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 544 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5214', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '251', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 545 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5215', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1066', + 'placement' => '252', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 546 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5216', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1067', + 'placement' => '253', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1066', + ), + 547 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5217', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '254', + 'prev_word_id' => '1066', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1067', + ), + 548 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5218', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '255', + 'prev_word_id' => '1067', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 549 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5219', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '256', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 550 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5220', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '257', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 551 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5221', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '258', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 552 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5222', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '259', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1068', + ), + 553 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5223', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '260', + 'prev_word_id' => '1068', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 554 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5224', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '261', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 555 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5225', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '262', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1069', + ), + 556 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5226', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '263', + 'prev_word_id' => '1069', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 557 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5227', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '264', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 558 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5228', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1120', + 'placement' => '265', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 559 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5229', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '266', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1120', + ), + 560 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5230', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1071', + 'placement' => '267', + 'prev_word_id' => '1120', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1024', + ), + 561 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5231', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '268', + 'prev_word_id' => '1024', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1071', + ), + 562 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5232', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1072', + 'placement' => '269', + 'prev_word_id' => '1071', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 563 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5233', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '270', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1072', + ), + 564 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5234', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '271', + 'prev_word_id' => '1072', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 565 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5235', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '272', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 566 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5236', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '273', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1073', + ), + 567 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5237', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '274', + 'prev_word_id' => '1073', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 568 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5238', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '275', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 569 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5239', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '276', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1074', + ), + 570 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5240', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '277', + 'prev_word_id' => '1074', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 571 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5241', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1121', + 'placement' => '278', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1075', + ), + 572 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5242', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '279', + 'prev_word_id' => '1075', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1121', + ), + 573 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5243', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1078', + 'placement' => '280', + 'prev_word_id' => '1121', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1077', + ), + 574 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5244', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '281', + 'prev_word_id' => '1077', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1078', + ), + 575 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5245', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '282', + 'prev_word_id' => '1078', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 576 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5246', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '283', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 577 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5247', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '284', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1073', + ), + 578 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5248', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '285', + 'prev_word_id' => '1073', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 579 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5249', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '286', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 580 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5250', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '287', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1074', + ), + 581 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5251', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '288', + 'prev_word_id' => '1074', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 582 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5252', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1122', + 'placement' => '289', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1075', + ), + 583 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5253', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '290', + 'prev_word_id' => '1075', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1122', + ), + 584 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5254', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1123', + 'placement' => '291', + 'prev_word_id' => '1122', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1077', + ), + 585 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5255', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '292', + 'prev_word_id' => '1077', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1123', + ), + 586 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5256', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '293', + 'prev_word_id' => '1123', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 587 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5257', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '294', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 588 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5258', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '295', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1069', + ), + 589 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5259', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '296', + 'prev_word_id' => '1069', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 590 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5260', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '297', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 591 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5261', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '298', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1068', + ), + 592 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5262', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '299', + 'prev_word_id' => '1068', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 593 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5263', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '300', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 594 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5264', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '301', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1062', + ), + 595 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '71', + 'frequency' => '0', + 'id' => '5265', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '302', + 'prev_word_id' => '1062', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 596 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5266', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1083', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1082', + ), + 597 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5267', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '1', + 'prev_word_id' => '1082', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1083', + ), + 598 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5268', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1124', + 'placement' => '2', + 'prev_word_id' => '1083', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1084', + ), + 599 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5269', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '3', + 'prev_word_id' => '1084', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1124', + ), + 600 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5270', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '4', + 'prev_word_id' => '1124', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 601 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5271', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '5', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1027', + ), + 602 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5272', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '6', + 'prev_word_id' => '1027', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '999', + ), + 603 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5273', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '7', + 'prev_word_id' => '999', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 604 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5274', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '8', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 605 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5275', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '9', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1029', + ), + 606 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5276', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '10', + 'prev_word_id' => '1029', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 607 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5277', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '11', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1031', + ), + 608 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5278', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '12', + 'prev_word_id' => '1031', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 609 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5279', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '13', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1032', + ), + 610 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5280', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '14', + 'prev_word_id' => '1032', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 611 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5281', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '15', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1033', + ), + 612 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5282', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '16', + 'prev_word_id' => '1033', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 613 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5283', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '17', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 614 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5284', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '18', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1034', + ), + 615 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5285', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '19', + 'prev_word_id' => '1034', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 616 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5286', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '20', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 617 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5287', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '21', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 618 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5288', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '22', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1035', + ), + 619 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5289', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '23', + 'prev_word_id' => '1035', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 620 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5290', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '24', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 621 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5291', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '25', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 622 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5292', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '26', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 623 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5293', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '27', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 624 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5294', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '28', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1038', + ), + 625 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5295', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '29', + 'prev_word_id' => '1038', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 626 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5296', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '30', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '985', + ), + 627 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5297', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '31', + 'prev_word_id' => '985', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 628 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5298', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '32', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 629 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5299', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '33', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 630 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5300', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '34', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 631 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5301', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '35', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 632 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5302', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '36', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1041', + ), + 633 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5303', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '37', + 'prev_word_id' => '1041', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 634 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5304', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '38', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 635 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5305', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '39', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 636 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5306', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '40', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 637 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5307', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '41', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '991', + ), + 638 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5308', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '42', + 'prev_word_id' => '991', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 639 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5309', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '43', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1012', + ), + 640 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5310', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '44', + 'prev_word_id' => '1012', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1044', + ), + 641 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5311', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '45', + 'prev_word_id' => '1044', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1045', + ), + 642 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5312', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '46', + 'prev_word_id' => '1045', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1046', + ), + 643 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5313', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '47', + 'prev_word_id' => '1046', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 644 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5314', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '48', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 645 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5315', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '49', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 646 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5316', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '50', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1048', + ), + 647 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5317', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '51', + 'prev_word_id' => '1048', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 648 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5318', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '52', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 649 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5319', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '53', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '992', + ), + 650 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5320', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '54', + 'prev_word_id' => '992', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '993', + ), + 651 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5321', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '55', + 'prev_word_id' => '993', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 652 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5322', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '56', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 653 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5323', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '57', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 654 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5324', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '58', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1049', + ), + 655 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5325', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '59', + 'prev_word_id' => '1049', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 656 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5326', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '60', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '996', + ), + 657 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5327', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '61', + 'prev_word_id' => '996', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 658 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5328', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '62', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1050', + ), + 659 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5329', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '63', + 'prev_word_id' => '1050', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 660 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5330', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '64', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 661 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5331', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '65', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 662 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5332', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '66', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 663 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5333', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '67', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1051', + ), + 664 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5334', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '68', + 'prev_word_id' => '1051', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1052', + ), + 665 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5335', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '69', + 'prev_word_id' => '1052', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1053', + ), + 666 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5336', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '70', + 'prev_word_id' => '1053', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 667 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5337', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '71', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1027', + ), + 668 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5338', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '72', + 'prev_word_id' => '1027', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '999', + ), + 669 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5339', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '73', + 'prev_word_id' => '999', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 670 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5340', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '74', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 671 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5341', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '75', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1029', + ), + 672 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5342', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '76', + 'prev_word_id' => '1029', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 673 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5343', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '77', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1031', + ), + 674 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5344', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '78', + 'prev_word_id' => '1031', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 675 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5345', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '79', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1032', + ), + 676 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5346', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '80', + 'prev_word_id' => '1032', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 677 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5347', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '81', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1033', + ), + 678 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5348', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '82', + 'prev_word_id' => '1033', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 679 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5349', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '83', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 680 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5350', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '84', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1034', + ), + 681 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5351', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '85', + 'prev_word_id' => '1034', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 682 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5352', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '86', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 683 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5353', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '87', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 684 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5354', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '88', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1035', + ), + 685 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5355', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '89', + 'prev_word_id' => '1035', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 686 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5356', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '90', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 687 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5357', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '91', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 688 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5358', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '92', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 689 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5359', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '93', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 690 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5360', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '94', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1038', + ), + 691 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5361', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '95', + 'prev_word_id' => '1038', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 692 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5362', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '96', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '985', + ), + 693 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5363', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '97', + 'prev_word_id' => '985', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 694 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5364', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '98', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 695 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5365', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '99', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 696 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5366', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '100', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 697 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5367', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '101', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 698 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5368', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '102', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1041', + ), + 699 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5369', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '103', + 'prev_word_id' => '1041', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 700 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5370', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '104', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 701 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5371', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '105', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 702 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5372', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '106', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 703 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5373', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '107', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '991', + ), + 704 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5374', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '108', + 'prev_word_id' => '991', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 705 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5375', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '109', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1012', + ), + 706 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5376', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '110', + 'prev_word_id' => '1012', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1044', + ), + 707 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5377', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '111', + 'prev_word_id' => '1044', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1045', + ), + 708 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5378', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '112', + 'prev_word_id' => '1045', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1046', + ), + 709 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5379', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '113', + 'prev_word_id' => '1046', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 710 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5380', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '114', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 711 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5381', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '115', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 712 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5382', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '116', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1048', + ), + 713 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5383', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '117', + 'prev_word_id' => '1048', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 714 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5384', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '118', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 715 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5385', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '119', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '992', + ), + 716 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5386', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '120', + 'prev_word_id' => '992', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '993', + ), + 717 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5387', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '121', + 'prev_word_id' => '993', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 718 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5388', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '122', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 719 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5389', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '123', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 720 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5390', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '124', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1049', + ), + 721 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5391', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '125', + 'prev_word_id' => '1049', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 722 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5392', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '126', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '996', + ), + 723 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5393', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '127', + 'prev_word_id' => '996', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 724 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5394', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '128', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1050', + ), + 725 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5395', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '129', + 'prev_word_id' => '1050', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 726 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5396', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '130', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 727 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5397', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '131', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 728 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5398', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '132', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 729 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5399', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '133', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1051', + ), + 730 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5400', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '134', + 'prev_word_id' => '1051', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1052', + ), + 731 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5401', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '135', + 'prev_word_id' => '1052', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1053', + ), + 732 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5402', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '136', + 'prev_word_id' => '1053', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1085', + ), + 733 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5403', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '137', + 'prev_word_id' => '1085', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1086', + ), + 734 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5404', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '138', + 'prev_word_id' => '1086', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1087', + ), + 735 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5405', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '139', + 'prev_word_id' => '1087', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1088', + ), + 736 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5406', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '140', + 'prev_word_id' => '1088', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1089', + ), + 737 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5407', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '141', + 'prev_word_id' => '1089', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1090', + ), + 738 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5408', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '142', + 'prev_word_id' => '1090', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1091', + ), + 739 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5409', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '143', + 'prev_word_id' => '1091', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1092', + ), + 740 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5410', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '144', + 'prev_word_id' => '1092', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1093', + ), + 741 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5411', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '145', + 'prev_word_id' => '1093', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1094', + ), + 742 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5412', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '146', + 'prev_word_id' => '1094', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1095', + ), + 743 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5413', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '147', + 'prev_word_id' => '1095', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1096', + ), + 744 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5414', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '148', + 'prev_word_id' => '1096', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1010', + ), + 745 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5415', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1098', + 'placement' => '149', + 'prev_word_id' => '1010', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1097', + ), + 746 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5416', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '150', + 'prev_word_id' => '1097', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1098', + ), + 747 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5417', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '151', + 'prev_word_id' => '1098', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1099', + ), + 748 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5418', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '152', + 'prev_word_id' => '1099', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 749 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5419', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '153', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '989', + ), + 750 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5420', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '154', + 'prev_word_id' => '989', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 751 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5421', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '155', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 752 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5422', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '156', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1100', + ), + 753 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5423', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '157', + 'prev_word_id' => '1100', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '997', + ), + 754 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5424', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '158', + 'prev_word_id' => '997', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1101', + ), + 755 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5425', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '159', + 'prev_word_id' => '1101', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '987', + ), + 756 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5426', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '160', + 'prev_word_id' => '987', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 757 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5427', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '161', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1102', + ), + 758 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5428', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '162', + 'prev_word_id' => '1102', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 759 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5429', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '163', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1103', + ), + 760 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5430', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '164', + 'prev_word_id' => '1103', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 761 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5431', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '165', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 762 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5432', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '166', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 763 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5433', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '167', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 764 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5434', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1104', + 'placement' => '168', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '863', + ), + 765 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5435', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '169', + 'prev_word_id' => '863', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1104', + ), + 766 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5436', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '170', + 'prev_word_id' => '1104', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 767 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5437', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '171', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 768 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5438', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '172', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 769 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5439', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '173', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1106', + ), + 770 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5440', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '174', + 'prev_word_id' => '1106', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 771 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5441', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '175', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 772 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5442', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '176', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 773 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5443', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '177', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1003', + ), + 774 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5444', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '178', + 'prev_word_id' => '1003', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 775 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5445', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '179', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1108', + ), + 776 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5446', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '180', + 'prev_word_id' => '1108', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 777 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5447', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '181', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '994', + ), + 778 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5448', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '182', + 'prev_word_id' => '994', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 779 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5449', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '183', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1109', + ), + 780 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5450', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '184', + 'prev_word_id' => '1109', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 781 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5451', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '185', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1108', + ), + 782 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5452', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '186', + 'prev_word_id' => '1108', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1100', + ), + 783 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5453', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '187', + 'prev_word_id' => '1100', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 784 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5454', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '188', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 785 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5455', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '189', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1106', + ), + 786 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5456', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '190', + 'prev_word_id' => '1106', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 787 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5457', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '191', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1110', + ), + 788 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5458', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '192', + 'prev_word_id' => '1110', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 789 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5459', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '193', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1111', + ), + 790 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5460', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '194', + 'prev_word_id' => '1111', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 791 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5461', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '195', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1112', + ), + 792 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5462', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '196', + 'prev_word_id' => '1112', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 793 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5463', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '197', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1113', + ), + 794 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5464', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '198', + 'prev_word_id' => '1113', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1114', + ), + 795 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5465', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '199', + 'prev_word_id' => '1114', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 796 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5466', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '200', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1007', + ), + 797 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5467', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '201', + 'prev_word_id' => '1007', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 798 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5468', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '202', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1099', + ), + 799 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5469', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '203', + 'prev_word_id' => '1099', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '982', + ), + 800 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5470', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '204', + 'prev_word_id' => '982', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1115', + ), + 801 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5471', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '205', + 'prev_word_id' => '1115', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '981', + ), + 802 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5472', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '206', + 'prev_word_id' => '981', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 803 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5473', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '207', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '984', + ), + 804 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5474', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '208', + 'prev_word_id' => '984', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 805 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5475', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '209', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 806 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5476', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '210', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 807 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5477', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '211', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 808 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5478', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '212', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 809 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5479', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '213', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1103', + ), + 810 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5480', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '214', + 'prev_word_id' => '1103', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1116', + ), + 811 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5481', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '215', + 'prev_word_id' => '1116', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 812 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5482', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '216', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 813 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5483', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '217', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1117', + ), + 814 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5484', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '218', + 'prev_word_id' => '1117', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 815 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5485', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '219', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1118', + ), + 816 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5486', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '220', + 'prev_word_id' => '1118', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1119', + ), + 817 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5487', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '221', + 'prev_word_id' => '1119', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 818 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5488', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '222', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1011', + ), + 819 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5489', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '223', + 'prev_word_id' => '1011', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 820 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5490', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '224', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1114', + ), + 821 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5491', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '225', + 'prev_word_id' => '1114', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 822 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5492', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '226', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1007', + ), + 823 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5493', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '227', + 'prev_word_id' => '1007', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 824 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5494', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '228', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '981', + ), + 825 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5495', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '229', + 'prev_word_id' => '981', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 826 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5496', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '230', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '984', + ), + 827 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5497', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '231', + 'prev_word_id' => '984', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 828 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5498', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1082', + 'placement' => '232', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 829 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5499', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1083', + 'placement' => '233', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1082', + ), + 830 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5500', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '234', + 'prev_word_id' => '1082', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1083', + ), + 831 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5501', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1124', + 'placement' => '235', + 'prev_word_id' => '1083', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1084', + ), + 832 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5502', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '236', + 'prev_word_id' => '1084', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1124', + ), + 833 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5503', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1055', + 'placement' => '237', + 'prev_word_id' => '1124', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 834 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5504', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '238', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1055', + ), + 835 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5505', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1057', + 'placement' => '239', + 'prev_word_id' => '1055', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1056', + ), + 836 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5506', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1058', + 'placement' => '240', + 'prev_word_id' => '1056', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1057', + ), + 837 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5507', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1059', + 'placement' => '241', + 'prev_word_id' => '1057', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1058', + ), + 838 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5508', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1060', + 'placement' => '242', + 'prev_word_id' => '1058', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1059', + ), + 839 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5509', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '243', + 'prev_word_id' => '1059', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1060', + ), + 840 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5510', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '244', + 'prev_word_id' => '1060', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 841 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5511', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '245', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 842 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5512', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1063', + 'placement' => '246', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1062', + ), + 843 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5513', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '247', + 'prev_word_id' => '1062', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1063', + ), + 844 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5514', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '248', + 'prev_word_id' => '1063', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 845 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5515', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '249', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 846 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5516', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '250', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 847 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5517', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '251', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 848 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5518', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1066', + 'placement' => '252', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 849 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5519', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1067', + 'placement' => '253', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1066', + ), + 850 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5520', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '254', + 'prev_word_id' => '1066', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1067', + ), + 851 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5521', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '255', + 'prev_word_id' => '1067', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 852 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5522', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '256', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 853 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5523', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '257', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 854 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5524', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '258', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 855 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5525', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '259', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1068', + ), + 856 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5526', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '260', + 'prev_word_id' => '1068', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 857 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5527', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '261', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 858 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5528', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '262', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1069', + ), + 859 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5529', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '263', + 'prev_word_id' => '1069', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 860 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5530', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '264', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 861 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5531', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1120', + 'placement' => '265', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 862 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5532', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '266', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1120', + ), + 863 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5533', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1071', + 'placement' => '267', + 'prev_word_id' => '1120', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1024', + ), + 864 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5534', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '268', + 'prev_word_id' => '1024', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1071', + ), + 865 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5535', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1072', + 'placement' => '269', + 'prev_word_id' => '1071', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 866 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5536', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '270', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1072', + ), + 867 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5537', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '271', + 'prev_word_id' => '1072', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 868 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5538', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '272', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 869 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5539', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '273', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1073', + ), + 870 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5540', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '274', + 'prev_word_id' => '1073', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 871 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5541', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '275', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 872 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5542', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '276', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1074', + ), + 873 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5543', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '277', + 'prev_word_id' => '1074', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 874 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5544', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1121', + 'placement' => '278', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1075', + ), + 875 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5545', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '279', + 'prev_word_id' => '1075', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1121', + ), + 876 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5546', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1078', + 'placement' => '280', + 'prev_word_id' => '1121', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1077', + ), + 877 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5547', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '281', + 'prev_word_id' => '1077', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1078', + ), + 878 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5548', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '282', + 'prev_word_id' => '1078', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 879 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5549', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '283', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 880 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5550', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '284', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1073', + ), + 881 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5551', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '285', + 'prev_word_id' => '1073', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 882 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5552', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '286', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 883 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5553', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '287', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1074', + ), + 884 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5554', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '288', + 'prev_word_id' => '1074', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 885 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5555', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1122', + 'placement' => '289', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1075', + ), + 886 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5556', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '290', + 'prev_word_id' => '1075', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1122', + ), + 887 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5557', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1123', + 'placement' => '291', + 'prev_word_id' => '1122', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1077', + ), + 888 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5558', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '292', + 'prev_word_id' => '1077', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1123', + ), + 889 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5559', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '293', + 'prev_word_id' => '1123', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 890 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5560', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '294', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 891 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5561', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '295', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1069', + ), + 892 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5562', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '296', + 'prev_word_id' => '1069', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 893 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5563', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '297', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 894 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5564', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '298', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1068', + ), + 895 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5565', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '299', + 'prev_word_id' => '1068', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 896 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5566', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '300', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 897 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5567', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '301', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1062', + ), + 898 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '72', + 'frequency' => '0', + 'id' => '5568', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '302', + 'prev_word_id' => '1062', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 899 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5569', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1083', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1082', + ), + 900 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5570', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '1', + 'prev_word_id' => '1082', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1083', + ), + 901 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5571', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1125', + 'placement' => '2', + 'prev_word_id' => '1083', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1084', + ), + 902 => + array ( + 'contentclass_attribute_id' => '220', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5572', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '3', + 'prev_word_id' => '1084', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1125', + ), + 903 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5573', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '4', + 'prev_word_id' => '1125', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 904 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5574', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '5', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1027', + ), + 905 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5575', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '6', + 'prev_word_id' => '1027', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '999', + ), + 906 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5576', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '7', + 'prev_word_id' => '999', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 907 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5577', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '8', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 908 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5578', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '9', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1029', + ), + 909 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5579', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '10', + 'prev_word_id' => '1029', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 910 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5580', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '11', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1031', + ), + 911 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5581', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '12', + 'prev_word_id' => '1031', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 912 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5582', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '13', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1032', + ), + 913 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5583', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '14', + 'prev_word_id' => '1032', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 914 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5584', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '15', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1033', + ), + 915 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5585', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '16', + 'prev_word_id' => '1033', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 916 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5586', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '17', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 917 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5587', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '18', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1034', + ), + 918 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5588', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '19', + 'prev_word_id' => '1034', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 919 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5589', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '20', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 920 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5590', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '21', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 921 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5591', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '22', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1035', + ), + 922 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5592', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '23', + 'prev_word_id' => '1035', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 923 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5593', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '24', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 924 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5594', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '25', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 925 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5595', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '26', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 926 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5596', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '27', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 927 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5597', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '28', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1038', + ), + 928 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5598', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '29', + 'prev_word_id' => '1038', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 929 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5599', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '30', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '985', + ), + 930 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5600', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '31', + 'prev_word_id' => '985', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 931 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5601', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '32', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 932 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5602', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '33', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 933 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5603', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '34', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 934 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5604', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '35', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 935 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5605', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '36', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1041', + ), + 936 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5606', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '37', + 'prev_word_id' => '1041', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 937 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5607', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '38', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 938 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5608', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '39', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 939 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5609', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '40', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 940 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5610', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '41', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '991', + ), + 941 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5611', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '42', + 'prev_word_id' => '991', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 942 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5612', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '43', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1012', + ), + 943 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5613', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '44', + 'prev_word_id' => '1012', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1044', + ), + 944 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5614', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '45', + 'prev_word_id' => '1044', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1045', + ), + 945 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5615', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '46', + 'prev_word_id' => '1045', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1046', + ), + 946 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5616', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '47', + 'prev_word_id' => '1046', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 947 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5617', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '48', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 948 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5618', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '49', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 949 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5619', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '50', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1048', + ), + 950 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5620', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '51', + 'prev_word_id' => '1048', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 951 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5621', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '52', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 952 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5622', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '53', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '992', + ), + 953 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5623', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '54', + 'prev_word_id' => '992', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '993', + ), + 954 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5624', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '55', + 'prev_word_id' => '993', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 955 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5625', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '56', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 956 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5626', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '57', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 957 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5627', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '58', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1049', + ), + 958 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5628', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '59', + 'prev_word_id' => '1049', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 959 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5629', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '60', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '996', + ), + 960 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5630', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '61', + 'prev_word_id' => '996', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 961 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5631', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '62', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1050', + ), + 962 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5632', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '63', + 'prev_word_id' => '1050', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 963 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5633', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '64', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 964 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5634', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '65', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 965 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5635', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '66', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 966 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5636', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '67', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1051', + ), + 967 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5637', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '68', + 'prev_word_id' => '1051', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1052', + ), + 968 => + array ( + 'contentclass_attribute_id' => '222', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5638', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '69', + 'prev_word_id' => '1052', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1053', + ), + 969 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5639', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '70', + 'prev_word_id' => '1053', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 970 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5640', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '71', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1027', + ), + 971 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5641', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '72', + 'prev_word_id' => '1027', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '999', + ), + 972 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5642', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '73', + 'prev_word_id' => '999', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 973 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5643', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '74', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 974 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5644', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '75', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1029', + ), + 975 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5645', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '76', + 'prev_word_id' => '1029', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 976 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5646', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '77', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1031', + ), + 977 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5647', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '78', + 'prev_word_id' => '1031', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 978 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5648', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '79', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1032', + ), + 979 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5649', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '80', + 'prev_word_id' => '1032', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 980 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5650', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '81', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1033', + ), + 981 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5651', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '82', + 'prev_word_id' => '1033', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 982 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5652', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '83', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 983 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5653', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '84', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1034', + ), + 984 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5654', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '85', + 'prev_word_id' => '1034', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 985 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5655', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '86', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 986 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5656', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '87', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 987 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5657', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '88', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1035', + ), + 988 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5658', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '89', + 'prev_word_id' => '1035', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 989 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5659', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '90', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 990 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5660', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '91', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 991 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5661', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '92', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 992 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5662', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '93', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 993 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5663', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '94', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1038', + ), + 994 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5664', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '95', + 'prev_word_id' => '1038', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 995 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5665', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '96', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '985', + ), + 996 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5666', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '97', + 'prev_word_id' => '985', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 997 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5667', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '98', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 998 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5668', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '99', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 999 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5669', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '100', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 1000 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5670', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '101', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1001 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5671', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '102', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1041', + ), + 1002 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5672', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '103', + 'prev_word_id' => '1041', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 1003 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5673', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '104', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 1004 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5674', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '105', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 1005 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5675', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '106', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 1006 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5676', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '107', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '991', + ), + 1007 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5677', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '108', + 'prev_word_id' => '991', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 1008 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5678', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '109', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1009 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5679', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '110', + 'prev_word_id' => '1012', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1044', + ), + 1010 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5680', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '111', + 'prev_word_id' => '1044', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1045', + ), + 1011 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5681', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '112', + 'prev_word_id' => '1045', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1046', + ), + 1012 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5682', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '113', + 'prev_word_id' => '1046', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1013 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5683', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '114', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1014 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5684', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '115', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 1015 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5685', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '116', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1048', + ), + 1016 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5686', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '117', + 'prev_word_id' => '1048', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 1017 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5687', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '118', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1018 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5688', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '119', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '992', + ), + 1019 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5689', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '120', + 'prev_word_id' => '992', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '993', + ), + 1020 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5690', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '121', + 'prev_word_id' => '993', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 1021 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5691', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '122', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 1022 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5692', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '123', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1023 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5693', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '124', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1049', + ), + 1024 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5694', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '125', + 'prev_word_id' => '1049', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1043', + ), + 1025 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5695', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '126', + 'prev_word_id' => '1043', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '996', + ), + 1026 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5696', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '127', + 'prev_word_id' => '996', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1037', + ), + 1027 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5697', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '128', + 'prev_word_id' => '1037', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1050', + ), + 1028 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5698', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '129', + 'prev_word_id' => '1050', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1029 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5699', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '130', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 1030 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5700', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '131', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 1031 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5701', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '132', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1032 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5702', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '133', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1033 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5703', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '134', + 'prev_word_id' => '1051', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1052', + ), + 1034 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5704', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '135', + 'prev_word_id' => '1052', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1053', + ), + 1035 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5705', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '136', + 'prev_word_id' => '1053', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1085', + ), + 1036 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5706', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '137', + 'prev_word_id' => '1085', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1086', + ), + 1037 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5707', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '138', + 'prev_word_id' => '1086', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1087', + ), + 1038 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5708', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '139', + 'prev_word_id' => '1087', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1088', + ), + 1039 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5709', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '140', + 'prev_word_id' => '1088', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1040 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5710', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '141', + 'prev_word_id' => '1089', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1090', + ), + 1041 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5711', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '142', + 'prev_word_id' => '1090', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1091', + ), + 1042 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5712', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '143', + 'prev_word_id' => '1091', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1092', + ), + 1043 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5713', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '144', + 'prev_word_id' => '1092', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1093', + ), + 1044 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5714', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '145', + 'prev_word_id' => '1093', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1094', + ), + 1045 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5715', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '146', + 'prev_word_id' => '1094', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1095', + ), + 1046 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5716', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '147', + 'prev_word_id' => '1095', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1096', + ), + 1047 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5717', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '148', + 'prev_word_id' => '1096', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1010', + ), + 1048 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5718', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1098', + 'placement' => '149', + 'prev_word_id' => '1010', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1097', + ), + 1049 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5719', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '150', + 'prev_word_id' => '1097', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1098', + ), + 1050 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5720', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '151', + 'prev_word_id' => '1098', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1051 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5721', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '152', + 'prev_word_id' => '1099', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 1052 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5722', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '153', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '989', + ), + 1053 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5723', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '154', + 'prev_word_id' => '989', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1026', + ), + 1054 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5724', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '155', + 'prev_word_id' => '1026', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1019', + ), + 1055 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5725', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '156', + 'prev_word_id' => '1019', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1100', + ), + 1056 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5726', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '157', + 'prev_word_id' => '1100', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '997', + ), + 1057 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5727', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '158', + 'prev_word_id' => '997', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1101', + ), + 1058 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5728', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '159', + 'prev_word_id' => '1101', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '987', + ), + 1059 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5729', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '160', + 'prev_word_id' => '987', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 1060 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5730', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '161', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1102', + ), + 1061 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5731', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '162', + 'prev_word_id' => '1102', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '995', + ), + 1062 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5732', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '163', + 'prev_word_id' => '995', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1103', + ), + 1063 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5733', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '164', + 'prev_word_id' => '1103', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1064 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5734', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '165', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '988', + ), + 1065 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5735', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '166', + 'prev_word_id' => '988', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1016', + ), + 1066 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5736', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '167', + 'prev_word_id' => '1016', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1028', + ), + 1067 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5737', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1104', + 'placement' => '168', + 'prev_word_id' => '1028', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '863', + ), + 1068 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5738', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '169', + 'prev_word_id' => '863', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1104', + ), + 1069 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5739', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '170', + 'prev_word_id' => '1104', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '810', + ), + 1070 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5740', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '171', + 'prev_word_id' => '810', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 1071 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5741', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '172', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 1072 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5742', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '173', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1106', + ), + 1073 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5743', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '174', + 'prev_word_id' => '1106', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1074 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5744', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '175', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1075 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5745', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '176', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1076 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5746', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '177', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1003', + ), + 1077 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5747', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '178', + 'prev_word_id' => '1003', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1078 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5748', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '179', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1079 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5749', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '180', + 'prev_word_id' => '1108', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '825', + ), + 1080 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5750', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '181', + 'prev_word_id' => '825', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '994', + ), + 1081 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5751', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '182', + 'prev_word_id' => '994', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1082 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5752', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '183', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1109', + ), + 1083 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5753', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '184', + 'prev_word_id' => '1109', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1084 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5754', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '185', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1085 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5755', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '186', + 'prev_word_id' => '1108', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1100', + ), + 1086 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5756', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '187', + 'prev_word_id' => '1100', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1087 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5757', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '188', + 'prev_word_id' => '1039', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1017', + ), + 1088 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5758', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '189', + 'prev_word_id' => '1017', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1106', + ), + 1089 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5759', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '190', + 'prev_word_id' => '1106', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1090 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5760', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '191', + 'prev_word_id' => '1040', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1110', + ), + 1091 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5761', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '192', + 'prev_word_id' => '1110', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1092 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5762', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '193', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1111', + ), + 1093 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5763', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '194', + 'prev_word_id' => '1111', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1094 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5764', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '195', + 'prev_word_id' => '1001', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1112', + ), + 1095 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5765', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '196', + 'prev_word_id' => '1112', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1042', + ), + 1096 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5766', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '197', + 'prev_word_id' => '1042', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1113', + ), + 1097 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5767', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '198', + 'prev_word_id' => '1113', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1114', + ), + 1098 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5768', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '199', + 'prev_word_id' => '1114', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1099 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5769', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '200', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1007', + ), + 1100 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5770', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '201', + 'prev_word_id' => '1007', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1101 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5771', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '202', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1102 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5772', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '203', + 'prev_word_id' => '1099', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '982', + ), + 1103 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5773', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '204', + 'prev_word_id' => '982', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1115', + ), + 1104 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5774', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '205', + 'prev_word_id' => '1115', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '981', + ), + 1105 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5775', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '206', + 'prev_word_id' => '981', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 1106 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5776', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '207', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '984', + ), + 1107 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5777', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '208', + 'prev_word_id' => '984', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1108 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5778', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '209', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1109 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5779', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '210', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1110 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5780', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '211', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1036', + ), + 1111 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5781', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '212', + 'prev_word_id' => '1036', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1112 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5782', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '213', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1103', + ), + 1113 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5783', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '214', + 'prev_word_id' => '1103', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1114 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5784', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '215', + 'prev_word_id' => '1116', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '990', + ), + 1115 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5785', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '216', + 'prev_word_id' => '990', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '983', + ), + 1116 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5786', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '217', + 'prev_word_id' => '983', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1117', + ), + 1117 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5787', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '218', + 'prev_word_id' => '1117', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1118 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5788', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '219', + 'prev_word_id' => '1014', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1118', + ), + 1119 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5789', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '220', + 'prev_word_id' => '1118', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1120 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5790', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '221', + 'prev_word_id' => '1119', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1002', + ), + 1121 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5791', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '222', + 'prev_word_id' => '1002', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1122 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5792', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '223', + 'prev_word_id' => '1011', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '998', + ), + 1123 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5793', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '224', + 'prev_word_id' => '998', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1114', + ), + 1124 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5794', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '225', + 'prev_word_id' => '1114', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1125 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5795', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '226', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1007', + ), + 1126 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5796', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '227', + 'prev_word_id' => '1007', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1127 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5797', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '228', + 'prev_word_id' => '1030', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '981', + ), + 1128 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5798', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '229', + 'prev_word_id' => '981', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1105', + ), + 1129 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5799', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '230', + 'prev_word_id' => '1105', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '984', + ), + 1130 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5800', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '231', + 'prev_word_id' => '984', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1131 => + array ( + 'contentclass_attribute_id' => '223', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5801', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1082', + 'placement' => '232', + 'prev_word_id' => '1047', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1132 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5802', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1083', + 'placement' => '233', + 'prev_word_id' => '1107', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1082', + ), + 1133 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5803', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '234', + 'prev_word_id' => '1082', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1083', + ), + 1134 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5804', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1125', + 'placement' => '235', + 'prev_word_id' => '1083', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1084', + ), + 1135 => + array ( + 'contentclass_attribute_id' => '226', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5805', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '236', + 'prev_word_id' => '1084', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1125', + ), + 1136 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5806', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1055', + 'placement' => '237', + 'prev_word_id' => '1125', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1137 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5807', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '238', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1055', + ), + 1138 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5808', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1057', + 'placement' => '239', + 'prev_word_id' => '1055', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1056', + ), + 1139 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5809', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1058', + 'placement' => '240', + 'prev_word_id' => '1056', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1057', + ), + 1140 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5810', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1059', + 'placement' => '241', + 'prev_word_id' => '1057', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1058', + ), + 1141 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5811', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1060', + 'placement' => '242', + 'prev_word_id' => '1058', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1059', + ), + 1142 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5812', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '243', + 'prev_word_id' => '1059', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1060', + ), + 1143 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5813', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '244', + 'prev_word_id' => '1060', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1144 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5814', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '245', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1145 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5815', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1063', + 'placement' => '246', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1062', + ), + 1146 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5816', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '247', + 'prev_word_id' => '1062', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1063', + ), + 1147 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5817', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '248', + 'prev_word_id' => '1063', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 1148 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5818', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '249', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1149 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5819', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '250', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1150 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5820', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '251', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 1151 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5821', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1066', + 'placement' => '252', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1152 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5822', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1067', + 'placement' => '253', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1066', + ), + 1153 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5823', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '254', + 'prev_word_id' => '1066', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1067', + ), + 1154 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5824', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '255', + 'prev_word_id' => '1067', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1155 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5825', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '256', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 1156 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5826', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '257', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1157 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5827', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '258', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1158 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5828', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '259', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1068', + ), + 1159 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5829', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '260', + 'prev_word_id' => '1068', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1160 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5830', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '261', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1161 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5831', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '262', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1069', + ), + 1162 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5832', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '263', + 'prev_word_id' => '1069', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1163 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5833', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1065', + 'placement' => '264', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 1164 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5834', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1120', + 'placement' => '265', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1065', + ), + 1165 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5835', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '266', + 'prev_word_id' => '1065', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1120', + ), + 1166 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5836', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1071', + 'placement' => '267', + 'prev_word_id' => '1120', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1024', + ), + 1167 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5837', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '268', + 'prev_word_id' => '1024', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1071', + ), + 1168 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5838', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1072', + 'placement' => '269', + 'prev_word_id' => '1071', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 1169 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5839', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '270', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1072', + ), + 1170 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5840', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '271', + 'prev_word_id' => '1072', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1171 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5841', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '272', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1172 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5842', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '273', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1073', + ), + 1173 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5843', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '274', + 'prev_word_id' => '1073', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1174 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5844', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '275', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 1175 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5845', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '276', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1074', + ), + 1176 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5846', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '277', + 'prev_word_id' => '1074', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1070', + ), + 1177 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5847', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1121', + 'placement' => '278', + 'prev_word_id' => '1070', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1075', + ), + 1178 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5848', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '279', + 'prev_word_id' => '1075', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1121', + ), + 1179 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5849', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1078', + 'placement' => '280', + 'prev_word_id' => '1121', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1077', + ), + 1180 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5850', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '281', + 'prev_word_id' => '1077', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1078', + ), + 1181 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5851', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '282', + 'prev_word_id' => '1078', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1182 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5852', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '283', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1183 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5853', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '284', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1073', + ), + 1184 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5854', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '285', + 'prev_word_id' => '1073', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1185 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5855', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1074', + 'placement' => '286', + 'prev_word_id' => '1020', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 1186 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5856', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1064', + 'placement' => '287', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1074', + ), + 1187 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5857', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1075', + 'placement' => '288', + 'prev_word_id' => '1074', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1064', + ), + 1188 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5858', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1122', + 'placement' => '289', + 'prev_word_id' => '1064', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1075', + ), + 1189 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5859', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1077', + 'placement' => '290', + 'prev_word_id' => '1075', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1122', + ), + 1190 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5860', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1123', + 'placement' => '291', + 'prev_word_id' => '1122', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1077', + ), + 1191 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5861', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '292', + 'prev_word_id' => '1077', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1123', + ), + 1192 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5862', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '293', + 'prev_word_id' => '1123', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1193 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5863', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1069', + 'placement' => '294', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1194 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5864', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '295', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1069', + ), + 1195 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5865', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '296', + 'prev_word_id' => '1069', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1196 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5866', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1068', + 'placement' => '297', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1197 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5867', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '298', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1068', + ), + 1198 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5868', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '299', + 'prev_word_id' => '1068', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1199 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5869', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1062', + 'placement' => '300', + 'prev_word_id' => '1061', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1054', + ), + 1200 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5870', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '301', + 'prev_word_id' => '1054', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1062', + ), + 1201 => + array ( + 'contentclass_attribute_id' => '227', + 'contentclass_id' => '21', + 'contentobject_id' => '73', + 'frequency' => '0', + 'id' => '5871', + 'identifier' => 'additional_options', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '302', + 'prev_word_id' => '1062', + 'published' => '1311154176', + 'section_id' => '1', + 'word_id' => '1061', + ), + 1202 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '74', + 'frequency' => '0', + 'id' => '5872', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1004', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '924', + ), + 1203 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '74', + 'frequency' => '0', + 'id' => '5873', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '924', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1004', + ), + 1204 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5874', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '842', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '842', + ), + 1205 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5875', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '1', + 'prev_word_id' => '842', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '842', + ), + 1206 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5876', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1126', + 'placement' => '2', + 'prev_word_id' => '842', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1008', + ), + 1207 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5877', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1127', + 'placement' => '3', + 'prev_word_id' => '1008', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1126', + ), + 1208 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5878', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1128', + 'placement' => '4', + 'prev_word_id' => '1126', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1127', + ), + 1209 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5879', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1129', + 'placement' => '5', + 'prev_word_id' => '1127', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1128', + ), + 1210 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5880', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1130', + 'placement' => '6', + 'prev_word_id' => '1128', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1129', + ), + 1211 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5881', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '842', + 'placement' => '7', + 'prev_word_id' => '1129', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1130', + ), + 1212 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5882', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '8', + 'prev_word_id' => '1130', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '842', + ), + 1213 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5883', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1131', + 'placement' => '9', + 'prev_word_id' => '842', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1008', + ), + 1214 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5884', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '878', + 'placement' => '10', + 'prev_word_id' => '1008', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1131', + ), + 1215 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5885', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '11', + 'prev_word_id' => '1131', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '878', + ), + 1216 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5886', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '12', + 'prev_word_id' => '878', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '841', + ), + 1217 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5887', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '13', + 'prev_word_id' => '841', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '945', + ), + 1218 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5888', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '14', + 'prev_word_id' => '945', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '830', + ), + 1219 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5889', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '922', + 'placement' => '15', + 'prev_word_id' => '830', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '831', + ), + 1220 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5890', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1132', + 'placement' => '16', + 'prev_word_id' => '831', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '922', + ), + 1221 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5891', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '17', + 'prev_word_id' => '922', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1132', + ), + 1222 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5892', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1134', + 'placement' => '18', + 'prev_word_id' => '1132', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1133', + ), + 1223 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '75', + 'frequency' => '0', + 'id' => '5893', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '19', + 'prev_word_id' => '1133', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1134', + ), + 1224 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '76', + 'frequency' => '0', + 'id' => '5894', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '841', + ), + 1225 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '76', + 'frequency' => '0', + 'id' => '5895', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '841', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '945', + ), + 1226 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5896', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1227 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5897', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '1', + 'prev_word_id' => '1135', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1228 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5898', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '2', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1229 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5899', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '3', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1230 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5900', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '4', + 'prev_word_id' => '1040', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1041', + ), + 1231 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5901', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '5', + 'prev_word_id' => '1041', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1232 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5902', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '6', + 'prev_word_id' => '1137', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1233 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5903', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '7', + 'prev_word_id' => '1011', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1109', + ), + 1234 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5904', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '8', + 'prev_word_id' => '1109', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '863', + ), + 1235 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5905', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '9', + 'prev_word_id' => '863', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1236 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5906', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '10', + 'prev_word_id' => '1000', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1138', + ), + 1237 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5907', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '11', + 'prev_word_id' => '1138', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1112', + ), + 1238 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5908', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '12', + 'prev_word_id' => '1112', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1239 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5909', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '13', + 'prev_word_id' => '1135', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1240 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5910', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '14', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1241 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5911', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '15', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '986', + ), + 1242 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5912', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '16', + 'prev_word_id' => '986', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1243 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5913', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '17', + 'prev_word_id' => '1108', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1244 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5914', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '18', + 'prev_word_id' => '1107', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1245 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5915', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '19', + 'prev_word_id' => '1006', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1246 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5916', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '20', + 'prev_word_id' => '1001', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1247 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5917', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '21', + 'prev_word_id' => '1119', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1007', + ), + 1248 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5918', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '22', + 'prev_word_id' => '1007', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '992', + ), + 1249 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5919', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '23', + 'prev_word_id' => '992', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '993', + ), + 1250 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5920', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '24', + 'prev_word_id' => '993', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1139', + ), + 1251 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5921', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '25', + 'prev_word_id' => '1139', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1140', + ), + 1252 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5922', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '26', + 'prev_word_id' => '1140', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1141', + ), + 1253 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5923', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '27', + 'prev_word_id' => '1141', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1254 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5924', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '28', + 'prev_word_id' => '1142', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '994', + ), + 1255 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5925', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '29', + 'prev_word_id' => '994', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1143', + ), + 1256 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5926', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '30', + 'prev_word_id' => '1143', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1257 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5927', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '31', + 'prev_word_id' => '1089', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1144', + ), + 1258 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5928', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '32', + 'prev_word_id' => '1144', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1259 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5929', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '33', + 'prev_word_id' => '1039', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '999', + ), + 1260 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5930', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '34', + 'prev_word_id' => '999', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1261 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5931', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '35', + 'prev_word_id' => '1011', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '996', + ), + 1262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '36', + 'prev_word_id' => '996', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1145', + ), + 1263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '37', + 'prev_word_id' => '1145', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1146', + ), + 1264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '38', + 'prev_word_id' => '1146', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '39', + 'prev_word_id' => '1040', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1147', + ), + 1266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '40', + 'prev_word_id' => '1147', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1148', + ), + 1267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '41', + 'prev_word_id' => '1148', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1149', + ), + 1268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '42', + 'prev_word_id' => '1149', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '43', + 'prev_word_id' => '1040', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1150', + ), + 1270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1151', + 'placement' => '44', + 'prev_word_id' => '1150', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '45', + 'prev_word_id' => '1137', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1151', + ), + 1272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '46', + 'prev_word_id' => '1151', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '863', + ), + 1273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '47', + 'prev_word_id' => '863', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '48', + 'prev_word_id' => '1152', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '49', + 'prev_word_id' => '1153', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '50', + 'prev_word_id' => '1154', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '51', + 'prev_word_id' => '1155', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '997', + ), + 1278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '52', + 'prev_word_id' => '997', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1156', + ), + 1279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '53', + 'prev_word_id' => '1156', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '54', + 'prev_word_id' => '1142', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '992', + ), + 1281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '55', + 'prev_word_id' => '992', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '993', + ), + 1282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '56', + 'prev_word_id' => '993', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '988', + ), + 1283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '57', + 'prev_word_id' => '988', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '58', + 'prev_word_id' => '1014', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1157', + ), + 1285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '59', + 'prev_word_id' => '1157', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '60', + 'prev_word_id' => '1137', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '61', + 'prev_word_id' => '1030', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1158', + ), + 1288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '62', + 'prev_word_id' => '1158', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '995', + ), + 1289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '63', + 'prev_word_id' => '995', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '999', + ), + 1290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1104', + 'placement' => '64', + 'prev_word_id' => '999', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1052', + ), + 1291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '65', + 'prev_word_id' => '1052', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1104', + ), + 1292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '66', + 'prev_word_id' => '1104', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1159', + ), + 1293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '67', + 'prev_word_id' => '1159', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1160', + ), + 1294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '68', + 'prev_word_id' => '1160', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1161', + ), + 1295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '69', + 'prev_word_id' => '1161', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '70', + 'prev_word_id' => '1020', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1162', + ), + 1297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '71', + 'prev_word_id' => '1162', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1010', + ), + 1298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '72', + 'prev_word_id' => '1010', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '73', + 'prev_word_id' => '1013', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1102', + ), + 1300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '74', + 'prev_word_id' => '1102', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '75', + 'prev_word_id' => '1013', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1041', + ), + 1302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '76', + 'prev_word_id' => '1041', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '985', + ), + 1303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '77', + 'prev_word_id' => '985', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '78', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '981', + ), + 1305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '79', + 'prev_word_id' => '981', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '984', + ), + 1306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '80', + 'prev_word_id' => '984', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '988', + ), + 1307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '81', + 'prev_word_id' => '988', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '82', + 'prev_word_id' => '1001', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1027', + ), + 1309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '83', + 'prev_word_id' => '1027', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '84', + 'prev_word_id' => '1163', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '85', + 'prev_word_id' => '1164', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '86', + 'prev_word_id' => '1108', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1165', + ), + 1313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '87', + 'prev_word_id' => '1165', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '88', + 'prev_word_id' => '1142', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '992', + ), + 1315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '89', + 'prev_word_id' => '992', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '993', + ), + 1316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '90', + 'prev_word_id' => '993', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1019', + ), + 1317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '91', + 'prev_word_id' => '1019', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '92', + 'prev_word_id' => '1040', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1112', + ), + 1319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '93', + 'prev_word_id' => '1112', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '94', + 'prev_word_id' => '1032', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '95', + 'prev_word_id' => '1011', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1166', + ), + 1322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '96', + 'prev_word_id' => '1166', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1167', + ), + 1323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '97', + 'prev_word_id' => '1167', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '98', + 'prev_word_id' => '1168', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '99', + 'prev_word_id' => '1164', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1169', + ), + 1326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '100', + 'prev_word_id' => '1169', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '101', + 'prev_word_id' => '1164', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1170', + ), + 1328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '102', + 'prev_word_id' => '1170', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '994', + ), + 1329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '5999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '103', + 'prev_word_id' => '994', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1038', + ), + 1330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '104', + 'prev_word_id' => '1038', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '105', + 'prev_word_id' => '1051', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1171', + ), + 1332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '106', + 'prev_word_id' => '1171', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '986', + ), + 1333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '107', + 'prev_word_id' => '986', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '108', + 'prev_word_id' => '1000', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1031', + ), + 1335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '109', + 'prev_word_id' => '1031', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '997', + ), + 1336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '110', + 'prev_word_id' => '997', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '111', + 'prev_word_id' => '1116', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1172', + ), + 1338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '112', + 'prev_word_id' => '1172', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1002', + ), + 1339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1173', + 'placement' => '113', + 'prev_word_id' => '1002', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '114', + 'prev_word_id' => '1000', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1173', + ), + 1341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '115', + 'prev_word_id' => '1173', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '116', + 'prev_word_id' => '1164', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1046', + ), + 1343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '117', + 'prev_word_id' => '1046', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1102', + ), + 1344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '118', + 'prev_word_id' => '1102', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1174', + ), + 1345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1176', + 'placement' => '119', + 'prev_word_id' => '1174', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1175', + ), + 1346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1177', + 'placement' => '120', + 'prev_word_id' => '1175', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1176', + ), + 1347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1178', + 'placement' => '121', + 'prev_word_id' => '1176', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1177', + ), + 1348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1179', + 'placement' => '122', + 'prev_word_id' => '1177', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1178', + ), + 1349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1180', + 'placement' => '123', + 'prev_word_id' => '1178', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1179', + ), + 1350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '124', + 'prev_word_id' => '1179', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1180', + ), + 1351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1182', + 'placement' => '125', + 'prev_word_id' => '1180', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1181', + ), + 1352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1183', + 'placement' => '126', + 'prev_word_id' => '1181', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1182', + ), + 1353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '127', + 'prev_word_id' => '1182', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1183', + ), + 1354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1184', + 'placement' => '128', + 'prev_word_id' => '1183', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1181', + ), + 1355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1185', + 'placement' => '129', + 'prev_word_id' => '1181', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1184', + ), + 1356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '130', + 'prev_word_id' => '1184', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1185', + ), + 1357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '131', + 'prev_word_id' => '1185', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '983', + ), + 1358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '132', + 'prev_word_id' => '983', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '133', + 'prev_word_id' => '1089', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '134', + 'prev_word_id' => '1032', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1171', + ), + 1361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '135', + 'prev_word_id' => '1171', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '136', + 'prev_word_id' => '1099', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '137', + 'prev_word_id' => '1119', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1117', + ), + 1364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '138', + 'prev_word_id' => '1117', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '139', + 'prev_word_id' => '1051', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1103', + ), + 1366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '140', + 'prev_word_id' => '1103', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '141', + 'prev_word_id' => '1099', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '992', + ), + 1368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '142', + 'prev_word_id' => '992', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '993', + ), + 1369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '143', + 'prev_word_id' => '993', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1052', + ), + 1370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '144', + 'prev_word_id' => '1052', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '985', + ), + 1371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '145', + 'prev_word_id' => '985', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '146', + 'prev_word_id' => '1032', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1010', + ), + 1373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '147', + 'prev_word_id' => '1010', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1053', + ), + 1374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '148', + 'prev_word_id' => '1053', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '863', + ), + 1375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '149', + 'prev_word_id' => '863', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '150', + 'prev_word_id' => '1152', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '151', + 'prev_word_id' => '1153', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '152', + 'prev_word_id' => '1154', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '153', + 'prev_word_id' => '1155', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '154', + 'prev_word_id' => '1040', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1049', + ), + 1381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '155', + 'prev_word_id' => '1049', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1157', + ), + 1382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '156', + 'prev_word_id' => '1157', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1186', + ), + 1383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '157', + 'prev_word_id' => '1186', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '158', + 'prev_word_id' => '1107', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1115', + ), + 1385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '159', + 'prev_word_id' => '1115', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '160', + 'prev_word_id' => '1107', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1110', + ), + 1387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '161', + 'prev_word_id' => '1110', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '992', + ), + 1388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '162', + 'prev_word_id' => '992', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '993', + ), + 1389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '163', + 'prev_word_id' => '993', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1106', + ), + 1390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '164', + 'prev_word_id' => '1106', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1145', + ), + 1391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '165', + 'prev_word_id' => '1145', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '166', + 'prev_word_id' => '1020', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '167', + 'prev_word_id' => '1164', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1171', + ), + 1394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '168', + 'prev_word_id' => '1171', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '169', + 'prev_word_id' => '1000', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1105', + ), + 1396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '170', + 'prev_word_id' => '1105', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1187', + ), + 1397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '171', + 'prev_word_id' => '1187', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '172', + 'prev_word_id' => '1040', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1139', + ), + 1399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '173', + 'prev_word_id' => '1139', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1044', + ), + 1400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '174', + 'prev_word_id' => '1044', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '175', + 'prev_word_id' => '1013', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1162', + ), + 1402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '176', + 'prev_word_id' => '1162', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '177', + 'prev_word_id' => '1001', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '178', + 'prev_word_id' => '1188', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1157', + ), + 1405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '179', + 'prev_word_id' => '1157', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '180', + 'prev_word_id' => '1030', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1162', + ), + 1407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '181', + 'prev_word_id' => '1162', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '182', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1189', + ), + 1409 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6079', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '183', + 'prev_word_id' => '1189', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1410 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6080', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '184', + 'prev_word_id' => '1135', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1411 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6081', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '185', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1412 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6082', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1190', + 'placement' => '186', + 'prev_word_id' => '1135', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1413 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6083', + 'identifier' => 'publish_date', + 'integer_value' => '1174643880', + 'next_word_id' => '1191', + 'placement' => '187', + 'prev_word_id' => '1136', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1190', + ), + 1414 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '77', + 'frequency' => '0', + 'id' => '6084', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '188', + 'prev_word_id' => '1190', + 'published' => '1311154177', + 'section_id' => '1', + 'word_id' => '1191', + ), + 1415 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6085', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '987', + ), + 1416 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6086', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '1', + 'prev_word_id' => '987', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1118', + ), + 1417 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6087', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '2', + 'prev_word_id' => '1118', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1192', + ), + 1418 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6088', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '3', + 'prev_word_id' => '1192', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1419 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6089', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '4', + 'prev_word_id' => '1039', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '981', + ), + 1420 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6090', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '5', + 'prev_word_id' => '981', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1421 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6091', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '6', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1422 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6092', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '7', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1423 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6093', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '8', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1424 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6094', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '9', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1425 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6095', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '10', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1426 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6096', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '11', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1427 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6097', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '12', + 'prev_word_id' => '1155', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1035', + ), + 1428 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6098', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '13', + 'prev_word_id' => '1035', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1429 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6099', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '14', + 'prev_word_id' => '1030', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '998', + ), + 1430 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6100', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '15', + 'prev_word_id' => '998', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1431 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6101', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '16', + 'prev_word_id' => '1047', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1432 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6102', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '17', + 'prev_word_id' => '1032', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1433 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6103', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '18', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1043', + ), + 1434 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6104', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '19', + 'prev_word_id' => '1043', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1435 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6105', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '20', + 'prev_word_id' => '1030', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1436 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6106', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '21', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '992', + ), + 1437 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6107', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '22', + 'prev_word_id' => '992', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '993', + ), + 1438 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6108', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '23', + 'prev_word_id' => '993', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1003', + ), + 1439 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6109', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '24', + 'prev_word_id' => '1003', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '995', + ), + 1440 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6110', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '25', + 'prev_word_id' => '995', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1027', + ), + 1441 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6111', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '26', + 'prev_word_id' => '1027', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1442 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6112', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '27', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1443 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6113', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '28', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1114', + ), + 1444 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6114', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '29', + 'prev_word_id' => '1114', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1445 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6115', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '30', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1194', + ), + 1446 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6116', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '31', + 'prev_word_id' => '1194', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1447 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6117', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '32', + 'prev_word_id' => '1108', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1034', + ), + 1448 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6118', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '33', + 'prev_word_id' => '1034', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1158', + ), + 1449 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6119', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '34', + 'prev_word_id' => '1158', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1195', + ), + 1450 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6120', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '35', + 'prev_word_id' => '1195', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1451 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6121', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '36', + 'prev_word_id' => '1011', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1452 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6122', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '37', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '995', + ), + 1453 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6123', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '38', + 'prev_word_id' => '995', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '985', + ), + 1454 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6124', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '39', + 'prev_word_id' => '985', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '810', + ), + 1455 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6125', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '40', + 'prev_word_id' => '810', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '41', + 'prev_word_id' => '1168', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '42', + 'prev_word_id' => '1047', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '43', + 'prev_word_id' => '1119', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1143', + ), + 1459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '44', + 'prev_word_id' => '1143', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '45', + 'prev_word_id' => '1011', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '984', + ), + 1461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '46', + 'prev_word_id' => '984', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1169', + ), + 1462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '47', + 'prev_word_id' => '1169', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '48', + 'prev_word_id' => '1000', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '49', + 'prev_word_id' => '1051', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '982', + ), + 1465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '50', + 'prev_word_id' => '982', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '51', + 'prev_word_id' => '1012', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '52', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1146', + ), + 1468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '53', + 'prev_word_id' => '1146', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1113', + ), + 1469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '54', + 'prev_word_id' => '1113', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '55', + 'prev_word_id' => '1164', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1171', + ), + 1471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '56', + 'prev_word_id' => '1171', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '57', + 'prev_word_id' => '1012', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '58', + 'prev_word_id' => '1137', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1018', + ), + 1474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '59', + 'prev_word_id' => '1018', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '60', + 'prev_word_id' => '1014', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '61', + 'prev_word_id' => '1188', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '62', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '63', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1015', + ), + 1479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '64', + 'prev_word_id' => '1015', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '65', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '66', + 'prev_word_id' => '1020', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1148', + ), + 1482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '67', + 'prev_word_id' => '1148', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1015', + ), + 1483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '68', + 'prev_word_id' => '1015', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '69', + 'prev_word_id' => '1168', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '70', + 'prev_word_id' => '1164', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '71', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1113', + ), + 1487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '72', + 'prev_word_id' => '1113', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '73', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1053', + ), + 1489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '74', + 'prev_word_id' => '1053', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '75', + 'prev_word_id' => '1051', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '76', + 'prev_word_id' => '1012', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '77', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '78', + 'prev_word_id' => '1164', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '79', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '80', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '81', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '82', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '83', + 'prev_word_id' => '1155', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '84', + 'prev_word_id' => '1014', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '85', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '86', + 'prev_word_id' => '1142', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1097', + ), + 1502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '87', + 'prev_word_id' => '1097', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '88', + 'prev_word_id' => '1188', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1139', + ), + 1504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '89', + 'prev_word_id' => '1139', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '992', + ), + 1505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '90', + 'prev_word_id' => '992', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '993', + ), + 1506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '91', + 'prev_word_id' => '993', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1196', + ), + 1507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '92', + 'prev_word_id' => '1196', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '810', + ), + 1508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '93', + 'prev_word_id' => '810', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '94', + 'prev_word_id' => '1040', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '95', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '96', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1036', + ), + 1512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '97', + 'prev_word_id' => '1036', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1197', + ), + 1513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '98', + 'prev_word_id' => '1197', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1115', + ), + 1514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '99', + 'prev_word_id' => '1115', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '100', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '101', + 'prev_word_id' => '1089', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '982', + ), + 1517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '102', + 'prev_word_id' => '982', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '103', + 'prev_word_id' => '1188', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1002', + ), + 1519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '104', + 'prev_word_id' => '1002', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '105', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1148', + ), + 1521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '106', + 'prev_word_id' => '1148', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1198', + ), + 1522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '107', + 'prev_word_id' => '1198', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1149', + ), + 1523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '108', + 'prev_word_id' => '1149', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '983', + ), + 1524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '109', + 'prev_word_id' => '983', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '110', + 'prev_word_id' => '1040', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1049', + ), + 1526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '111', + 'prev_word_id' => '1049', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1017', + ), + 1527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '112', + 'prev_word_id' => '1017', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1189', + ), + 1528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '113', + 'prev_word_id' => '1189', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1046', + ), + 1529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '114', + 'prev_word_id' => '1046', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '115', + 'prev_word_id' => '1013', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1199', + ), + 1531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '116', + 'prev_word_id' => '1199', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '117', + 'prev_word_id' => '1013', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1036', + ), + 1533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '118', + 'prev_word_id' => '1036', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '987', + ), + 1534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '119', + 'prev_word_id' => '987', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1118', + ), + 1535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '120', + 'prev_word_id' => '1118', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1192', + ), + 1536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '121', + 'prev_word_id' => '1192', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '122', + 'prev_word_id' => '1039', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '981', + ), + 1538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '123', + 'prev_word_id' => '981', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '124', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '125', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '126', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '127', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '128', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '129', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '130', + 'prev_word_id' => '1155', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1035', + ), + 1546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '131', + 'prev_word_id' => '1035', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '132', + 'prev_word_id' => '1030', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '998', + ), + 1548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '133', + 'prev_word_id' => '998', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '134', + 'prev_word_id' => '1047', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '135', + 'prev_word_id' => '1032', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '136', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1043', + ), + 1552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '137', + 'prev_word_id' => '1043', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '138', + 'prev_word_id' => '1030', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '139', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '992', + ), + 1555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '140', + 'prev_word_id' => '992', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '993', + ), + 1556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '141', + 'prev_word_id' => '993', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1003', + ), + 1557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '142', + 'prev_word_id' => '1003', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '995', + ), + 1558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '143', + 'prev_word_id' => '995', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1027', + ), + 1559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '144', + 'prev_word_id' => '1027', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '145', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '146', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1114', + ), + 1562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '147', + 'prev_word_id' => '1114', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '148', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1194', + ), + 1564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '149', + 'prev_word_id' => '1194', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '150', + 'prev_word_id' => '1108', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1034', + ), + 1566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '151', + 'prev_word_id' => '1034', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1158', + ), + 1567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '152', + 'prev_word_id' => '1158', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1195', + ), + 1568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '153', + 'prev_word_id' => '1195', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '154', + 'prev_word_id' => '1011', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '155', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '995', + ), + 1571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '156', + 'prev_word_id' => '995', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '985', + ), + 1572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '157', + 'prev_word_id' => '985', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '810', + ), + 1573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '158', + 'prev_word_id' => '810', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '159', + 'prev_word_id' => '1168', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '160', + 'prev_word_id' => '1135', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1156', + ), + 1576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '161', + 'prev_word_id' => '1156', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1577 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6247', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '162', + 'prev_word_id' => '1099', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '981', + ), + 1578 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6248', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '163', + 'prev_word_id' => '981', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1579 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6249', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '164', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '981', + ), + 1580 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6250', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1200', + 'placement' => '165', + 'prev_word_id' => '981', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1581 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6251', + 'identifier' => 'publish_date', + 'integer_value' => '1174644060', + 'next_word_id' => '1191', + 'placement' => '166', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1200', + ), + 1582 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '78', + 'frequency' => '0', + 'id' => '6252', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '167', + 'prev_word_id' => '1200', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1191', + ), + 1583 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6253', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1584 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6254', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '1', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1585 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6255', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '2', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1586 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6256', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '3', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1587 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6257', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '4', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1145', + ), + 1588 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6258', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '5', + 'prev_word_id' => '1145', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1146', + ), + 1589 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6259', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '6', + 'prev_word_id' => '1146', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1590 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6260', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '7', + 'prev_word_id' => '1040', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1147', + ), + 1591 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6261', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '8', + 'prev_word_id' => '1147', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1148', + ), + 1592 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6262', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '9', + 'prev_word_id' => '1148', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1149', + ), + 1593 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6263', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '10', + 'prev_word_id' => '1149', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1594 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6264', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '11', + 'prev_word_id' => '1040', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1150', + ), + 1595 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6265', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1151', + 'placement' => '12', + 'prev_word_id' => '1150', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1596 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6266', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '13', + 'prev_word_id' => '1137', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1151', + ), + 1597 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6267', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '14', + 'prev_word_id' => '1151', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1598 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6268', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '15', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1599 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6269', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '16', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1600 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6270', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '17', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1601 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6271', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '18', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1602 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6272', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '19', + 'prev_word_id' => '1155', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '997', + ), + 1603 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6273', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '20', + 'prev_word_id' => '997', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1156', + ), + 1604 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6274', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '21', + 'prev_word_id' => '1156', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1605 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6275', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '22', + 'prev_word_id' => '1142', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '992', + ), + 1606 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6276', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '23', + 'prev_word_id' => '992', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '993', + ), + 1607 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6277', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '24', + 'prev_word_id' => '993', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '988', + ), + 1608 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6278', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '25', + 'prev_word_id' => '988', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1609 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6279', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '26', + 'prev_word_id' => '1014', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1157', + ), + 1610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '27', + 'prev_word_id' => '1157', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '28', + 'prev_word_id' => '1047', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '29', + 'prev_word_id' => '1119', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1143', + ), + 1613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '30', + 'prev_word_id' => '1143', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '31', + 'prev_word_id' => '1011', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '984', + ), + 1615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '32', + 'prev_word_id' => '984', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1169', + ), + 1616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '33', + 'prev_word_id' => '1169', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '34', + 'prev_word_id' => '1000', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '35', + 'prev_word_id' => '1051', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '982', + ), + 1619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '36', + 'prev_word_id' => '982', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '37', + 'prev_word_id' => '1012', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '38', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1146', + ), + 1622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '39', + 'prev_word_id' => '1146', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1113', + ), + 1623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '40', + 'prev_word_id' => '1113', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '41', + 'prev_word_id' => '1164', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1171', + ), + 1625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '42', + 'prev_word_id' => '1171', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '43', + 'prev_word_id' => '1012', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '44', + 'prev_word_id' => '1137', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1018', + ), + 1628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '45', + 'prev_word_id' => '1018', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '46', + 'prev_word_id' => '1014', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '47', + 'prev_word_id' => '1188', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '48', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '49', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1015', + ), + 1633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '50', + 'prev_word_id' => '1015', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '51', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '52', + 'prev_word_id' => '1020', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1148', + ), + 1636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '53', + 'prev_word_id' => '1148', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1015', + ), + 1637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '54', + 'prev_word_id' => '1015', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '55', + 'prev_word_id' => '1168', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '56', + 'prev_word_id' => '1164', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '57', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1113', + ), + 1641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '58', + 'prev_word_id' => '1113', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '59', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1053', + ), + 1643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '60', + 'prev_word_id' => '1053', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '61', + 'prev_word_id' => '1051', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '62', + 'prev_word_id' => '1012', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '63', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '64', + 'prev_word_id' => '1164', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '65', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '66', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '67', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '68', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '69', + 'prev_word_id' => '1155', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1014', + ), + 1653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '70', + 'prev_word_id' => '1014', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '71', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '72', + 'prev_word_id' => '1142', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1097', + ), + 1656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '73', + 'prev_word_id' => '1097', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '74', + 'prev_word_id' => '1188', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1139', + ), + 1658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '75', + 'prev_word_id' => '1139', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '992', + ), + 1659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '76', + 'prev_word_id' => '992', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '993', + ), + 1660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '77', + 'prev_word_id' => '993', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1196', + ), + 1661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '78', + 'prev_word_id' => '1196', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '810', + ), + 1662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '79', + 'prev_word_id' => '810', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '80', + 'prev_word_id' => '1040', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '81', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '82', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1036', + ), + 1666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '83', + 'prev_word_id' => '1036', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1197', + ), + 1667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '84', + 'prev_word_id' => '1197', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1115', + ), + 1668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '85', + 'prev_word_id' => '1115', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '86', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '87', + 'prev_word_id' => '1089', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '982', + ), + 1671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '88', + 'prev_word_id' => '982', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '89', + 'prev_word_id' => '1188', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1002', + ), + 1673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '90', + 'prev_word_id' => '1002', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '91', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1148', + ), + 1675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '92', + 'prev_word_id' => '1148', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1198', + ), + 1676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '93', + 'prev_word_id' => '1198', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1149', + ), + 1677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '94', + 'prev_word_id' => '1149', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '983', + ), + 1678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '95', + 'prev_word_id' => '983', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '96', + 'prev_word_id' => '1040', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1049', + ), + 1680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '97', + 'prev_word_id' => '1049', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1017', + ), + 1681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '98', + 'prev_word_id' => '1017', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1189', + ), + 1682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '99', + 'prev_word_id' => '1189', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1046', + ), + 1683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '100', + 'prev_word_id' => '1046', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '101', + 'prev_word_id' => '1013', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1199', + ), + 1685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '102', + 'prev_word_id' => '1199', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '103', + 'prev_word_id' => '1013', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1036', + ), + 1687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '104', + 'prev_word_id' => '1036', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '987', + ), + 1688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '105', + 'prev_word_id' => '987', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1118', + ), + 1689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '106', + 'prev_word_id' => '1118', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1192', + ), + 1690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '107', + 'prev_word_id' => '1192', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '108', + 'prev_word_id' => '1039', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '981', + ), + 1692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '109', + 'prev_word_id' => '981', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '110', + 'prev_word_id' => '1001', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '111', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '112', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '113', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '114', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '115', + 'prev_word_id' => '1154', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '116', + 'prev_word_id' => '1155', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1035', + ), + 1700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '117', + 'prev_word_id' => '1035', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '118', + 'prev_word_id' => '1030', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '998', + ), + 1702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '119', + 'prev_word_id' => '998', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1047', + ), + 1703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '120', + 'prev_word_id' => '1047', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '121', + 'prev_word_id' => '1032', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1193', + ), + 1705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '122', + 'prev_word_id' => '1193', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1043', + ), + 1706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '123', + 'prev_word_id' => '1043', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '124', + 'prev_word_id' => '1030', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '125', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '992', + ), + 1709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '126', + 'prev_word_id' => '992', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '993', + ), + 1710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '127', + 'prev_word_id' => '993', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1003', + ), + 1711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '128', + 'prev_word_id' => '1003', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '995', + ), + 1712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '129', + 'prev_word_id' => '995', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1027', + ), + 1713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '130', + 'prev_word_id' => '1027', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1163', + ), + 1714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '131', + 'prev_word_id' => '1163', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '132', + 'prev_word_id' => '1006', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1114', + ), + 1716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '133', + 'prev_word_id' => '1114', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '134', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1194', + ), + 1718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '135', + 'prev_word_id' => '1194', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '136', + 'prev_word_id' => '1108', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1034', + ), + 1720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '137', + 'prev_word_id' => '1034', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1158', + ), + 1721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '138', + 'prev_word_id' => '1158', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1195', + ), + 1722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '139', + 'prev_word_id' => '1195', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '140', + 'prev_word_id' => '1011', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '141', + 'prev_word_id' => '1116', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '995', + ), + 1725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '142', + 'prev_word_id' => '995', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '985', + ), + 1726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '143', + 'prev_word_id' => '985', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '810', + ), + 1727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '144', + 'prev_word_id' => '810', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '145', + 'prev_word_id' => '1168', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '146', + 'prev_word_id' => '1135', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1156', + ), + 1730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '147', + 'prev_word_id' => '1156', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1731 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6401', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '148', + 'prev_word_id' => '1099', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1732 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6402', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '149', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1733 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6403', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '150', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1734 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6404', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '151', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '863', + ), + 1735 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6405', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '152', + 'prev_word_id' => '863', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1736 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6406', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1201', + 'placement' => '153', + 'prev_word_id' => '1152', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1737 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6407', + 'identifier' => 'publish_date', + 'integer_value' => '1174643640', + 'next_word_id' => '1191', + 'placement' => '154', + 'prev_word_id' => '1153', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1201', + ), + 1738 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '79', + 'frequency' => '0', + 'id' => '6408', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '155', + 'prev_word_id' => '1201', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '1191', + ), + 1739 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '80', + 'frequency' => '0', + 'id' => '6409', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '830', + ), + 1740 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '80', + 'frequency' => '0', + 'id' => '6410', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '830', + 'published' => '1311154178', + 'section_id' => '1', + 'word_id' => '831', + ), + 1741 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6411', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1742 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6412', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '1', + 'prev_word_id' => '1135', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1743 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6413', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '2', + 'prev_word_id' => '1136', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1744 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6414', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '3', + 'prev_word_id' => '1136', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '986', + ), + 1745 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6415', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '4', + 'prev_word_id' => '986', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1746 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6416', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '5', + 'prev_word_id' => '1040', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1041', + ), + 1747 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6417', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '6', + 'prev_word_id' => '1041', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1137', + ), + 1748 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6418', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '7', + 'prev_word_id' => '1137', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1749 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6419', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '8', + 'prev_word_id' => '1011', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1109', + ), + 1750 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6420', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '9', + 'prev_word_id' => '1109', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '863', + ), + 1751 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6421', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '10', + 'prev_word_id' => '863', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1752 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6422', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '11', + 'prev_word_id' => '1000', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1138', + ), + 1753 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6423', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '12', + 'prev_word_id' => '1138', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1112', + ), + 1754 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6424', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '13', + 'prev_word_id' => '1112', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1755 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6425', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '14', + 'prev_word_id' => '1135', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1756 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6426', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '15', + 'prev_word_id' => '1136', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1136', + ), + 1757 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6427', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '16', + 'prev_word_id' => '1136', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '986', + ), + 1758 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6428', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '17', + 'prev_word_id' => '986', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1759 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6429', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '18', + 'prev_word_id' => '1108', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1107', + ), + 1760 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6430', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '19', + 'prev_word_id' => '1107', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1761 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6431', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '20', + 'prev_word_id' => '1006', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1762 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6432', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '21', + 'prev_word_id' => '1001', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1763 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6433', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '22', + 'prev_word_id' => '1119', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1007', + ), + 1764 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6434', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '23', + 'prev_word_id' => '1007', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '992', + ), + 1765 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6435', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '24', + 'prev_word_id' => '992', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '993', + ), + 1766 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6436', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '25', + 'prev_word_id' => '993', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1139', + ), + 1767 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6437', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '26', + 'prev_word_id' => '1139', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1140', + ), + 1768 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6438', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '27', + 'prev_word_id' => '1140', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1141', + ), + 1769 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6439', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '28', + 'prev_word_id' => '1141', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1770 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6440', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '29', + 'prev_word_id' => '1142', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '994', + ), + 1771 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6441', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '30', + 'prev_word_id' => '994', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1143', + ), + 1772 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6442', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '31', + 'prev_word_id' => '1143', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1773 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6443', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '32', + 'prev_word_id' => '1089', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1144', + ), + 1774 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6444', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '33', + 'prev_word_id' => '1144', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1775 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6445', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '34', + 'prev_word_id' => '1039', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '999', + ), + 1776 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6446', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '35', + 'prev_word_id' => '999', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1777 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6447', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '36', + 'prev_word_id' => '1011', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '996', + ), + 1778 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6448', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '37', + 'prev_word_id' => '996', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1172', + ), + 1779 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6449', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '38', + 'prev_word_id' => '1172', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1780 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6450', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '39', + 'prev_word_id' => '1188', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '999', + ), + 1781 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6451', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '40', + 'prev_word_id' => '999', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1202', + ), + 1782 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6452', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '41', + 'prev_word_id' => '1202', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1138', + ), + 1783 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6453', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '42', + 'prev_word_id' => '1138', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1784 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6454', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '43', + 'prev_word_id' => '1039', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '810', + ), + 1785 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6455', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '44', + 'prev_word_id' => '810', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1786 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6456', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '45', + 'prev_word_id' => '1119', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1033', + ), + 1787 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6457', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '46', + 'prev_word_id' => '1033', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1788 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6458', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1173', + 'placement' => '47', + 'prev_word_id' => '1012', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1789 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6459', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '48', + 'prev_word_id' => '1142', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1173', + ), + 1790 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6460', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '49', + 'prev_word_id' => '1173', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1012', + ), + 1791 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6461', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '50', + 'prev_word_id' => '1012', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '825', + ), + 1792 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6462', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '51', + 'prev_word_id' => '825', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1003', + ), + 1793 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6463', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '52', + 'prev_word_id' => '1003', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '996', + ), + 1794 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6464', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '53', + 'prev_word_id' => '996', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1149', + ), + 1795 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6465', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '54', + 'prev_word_id' => '1149', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '984', + ), + 1796 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6466', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '55', + 'prev_word_id' => '984', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1797 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6467', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '56', + 'prev_word_id' => '1039', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1798 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6468', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '57', + 'prev_word_id' => '1001', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '986', + ), + 1799 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6469', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '58', + 'prev_word_id' => '986', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1034', + ), + 1800 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6470', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '59', + 'prev_word_id' => '1034', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1037', + ), + 1801 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6471', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '60', + 'prev_word_id' => '1037', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '992', + ), + 1802 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6472', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '61', + 'prev_word_id' => '992', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '993', + ), + 1803 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6473', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '62', + 'prev_word_id' => '993', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1026', + ), + 1804 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6474', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '63', + 'prev_word_id' => '1026', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '810', + ), + 1805 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6475', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '64', + 'prev_word_id' => '810', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1052', + ), + 1806 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6476', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '65', + 'prev_word_id' => '1052', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1046', + ), + 1807 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6477', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '66', + 'prev_word_id' => '1046', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1194', + ), + 1808 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6478', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '67', + 'prev_word_id' => '1194', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1026', + ), + 1809 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6479', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '68', + 'prev_word_id' => '1026', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1203', + ), + 1810 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6480', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1204', + 'placement' => '69', + 'prev_word_id' => '1203', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1811 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6481', + 'identifier' => 'publish_date', + 'integer_value' => '1174645140', + 'next_word_id' => '1191', + 'placement' => '70', + 'prev_word_id' => '1039', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1204', + ), + 1812 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '81', + 'frequency' => '0', + 'id' => '6482', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '71', + 'prev_word_id' => '1204', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1191', + ), + 1813 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6483', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1174', + ), + 1814 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6484', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1176', + 'placement' => '1', + 'prev_word_id' => '1174', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1175', + ), + 1815 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6485', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1177', + 'placement' => '2', + 'prev_word_id' => '1175', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1176', + ), + 1816 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6486', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '3', + 'prev_word_id' => '1176', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1177', + ), + 1817 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6487', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '4', + 'prev_word_id' => '1177', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '997', + ), + 1818 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6488', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '5', + 'prev_word_id' => '997', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1116', + ), + 1819 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6489', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '6', + 'prev_word_id' => '1116', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1172', + ), + 1820 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6490', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '7', + 'prev_word_id' => '1172', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1002', + ), + 1821 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6491', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1173', + 'placement' => '8', + 'prev_word_id' => '1002', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1822 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6492', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '9', + 'prev_word_id' => '1000', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1173', + ), + 1823 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6493', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '10', + 'prev_word_id' => '1173', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1164', + ), + 1824 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6494', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '11', + 'prev_word_id' => '1164', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1046', + ), + 1825 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6495', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '12', + 'prev_word_id' => '1046', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1102', + ), + 1826 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6496', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '13', + 'prev_word_id' => '1102', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1174', + ), + 1827 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6497', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1176', + 'placement' => '14', + 'prev_word_id' => '1174', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1175', + ), + 1828 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6498', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1177', + 'placement' => '15', + 'prev_word_id' => '1175', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1176', + ), + 1829 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6499', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1178', + 'placement' => '16', + 'prev_word_id' => '1176', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1177', + ), + 1830 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6500', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1179', + 'placement' => '17', + 'prev_word_id' => '1177', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1178', + ), + 1831 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6501', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1180', + 'placement' => '18', + 'prev_word_id' => '1178', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1179', + ), + 1832 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6502', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '19', + 'prev_word_id' => '1179', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1180', + ), + 1833 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6503', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1182', + 'placement' => '20', + 'prev_word_id' => '1180', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1181', + ), + 1834 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6504', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1183', + 'placement' => '21', + 'prev_word_id' => '1181', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1182', + ), + 1835 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6505', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '22', + 'prev_word_id' => '1182', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1183', + ), + 1836 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6506', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1184', + 'placement' => '23', + 'prev_word_id' => '1183', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1181', + ), + 1837 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6507', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1185', + 'placement' => '24', + 'prev_word_id' => '1181', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1184', + ), + 1838 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6508', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '25', + 'prev_word_id' => '1184', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1185', + ), + 1839 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6509', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '26', + 'prev_word_id' => '1185', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '983', + ), + 1840 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6510', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '27', + 'prev_word_id' => '983', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1841 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6511', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '28', + 'prev_word_id' => '1089', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1842 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6512', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '29', + 'prev_word_id' => '1032', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1171', + ), + 1843 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6513', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '30', + 'prev_word_id' => '1171', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1844 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6514', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '31', + 'prev_word_id' => '1099', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1119', + ), + 1845 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6515', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '32', + 'prev_word_id' => '1119', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1117', + ), + 1846 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6516', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '33', + 'prev_word_id' => '1117', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1051', + ), + 1847 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6517', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '34', + 'prev_word_id' => '1051', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1103', + ), + 1848 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6518', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '35', + 'prev_word_id' => '1103', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1099', + ), + 1849 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6519', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '36', + 'prev_word_id' => '1099', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '992', + ), + 1850 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6520', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '37', + 'prev_word_id' => '992', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '993', + ), + 1851 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6521', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '38', + 'prev_word_id' => '993', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1052', + ), + 1852 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6522', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '39', + 'prev_word_id' => '1052', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '985', + ), + 1853 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6523', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '40', + 'prev_word_id' => '985', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1032', + ), + 1854 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6524', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '41', + 'prev_word_id' => '1032', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1010', + ), + 1855 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6525', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '42', + 'prev_word_id' => '1010', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1053', + ), + 1856 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6526', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '43', + 'prev_word_id' => '1053', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '863', + ), + 1857 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6527', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '44', + 'prev_word_id' => '863', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1152', + ), + 1858 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6528', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '45', + 'prev_word_id' => '1152', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1153', + ), + 1859 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6529', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '46', + 'prev_word_id' => '1153', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1154', + ), + 1860 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6530', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1205', + 'placement' => '47', + 'prev_word_id' => '1154', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1155', + ), + 1861 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6531', + 'identifier' => 'publish_date', + 'integer_value' => '1174645260', + 'next_word_id' => '1191', + 'placement' => '48', + 'prev_word_id' => '1155', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1205', + ), + 1862 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '82', + 'frequency' => '0', + 'id' => '6532', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '49', + 'prev_word_id' => '1205', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1191', + ), + 1863 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6533', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1044', + ), + 1864 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6534', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '1', + 'prev_word_id' => '1044', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '994', + ), + 1865 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6535', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '2', + 'prev_word_id' => '994', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '988', + ), + 1866 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6536', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '3', + 'prev_word_id' => '988', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1044', + ), + 1867 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6537', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '4', + 'prev_word_id' => '1044', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '994', + ), + 1868 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6538', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '5', + 'prev_word_id' => '994', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '988', + ), + 1869 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6539', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '6', + 'prev_word_id' => '988', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '863', + ), + 1870 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6540', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '7', + 'prev_word_id' => '863', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '998', + ), + 1871 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6541', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '8', + 'prev_word_id' => '998', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '997', + ), + 1872 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6542', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '9', + 'prev_word_id' => '997', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1873 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6543', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '10', + 'prev_word_id' => '1108', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1874 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6544', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '11', + 'prev_word_id' => '1011', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1198', + ), + 1875 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6545', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '12', + 'prev_word_id' => '1198', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1113', + ), + 1876 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6546', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '13', + 'prev_word_id' => '1113', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '983', + ), + 1877 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6547', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '14', + 'prev_word_id' => '983', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1878 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6548', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '15', + 'prev_word_id' => '1089', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '988', + ), + 1879 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6549', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '16', + 'prev_word_id' => '988', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1206', + ), + 1880 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6550', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '17', + 'prev_word_id' => '1206', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1158', + ), + 1881 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6551', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1207', + 'placement' => '18', + 'prev_word_id' => '1158', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1117', + ), + 1882 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6552', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '19', + 'prev_word_id' => '1117', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1207', + ), + 1883 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6553', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '20', + 'prev_word_id' => '1207', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1159', + ), + 1884 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6554', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '21', + 'prev_word_id' => '1159', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1038', + ), + 1885 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6555', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '22', + 'prev_word_id' => '1038', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1172', + ), + 1886 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6556', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '23', + 'prev_word_id' => '1172', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1887 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6557', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '24', + 'prev_word_id' => '1089', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1019', + ), + 1888 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6558', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '25', + 'prev_word_id' => '1019', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1020', + ), + 1889 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6559', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '26', + 'prev_word_id' => '1020', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1027', + ), + 1890 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6560', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '27', + 'prev_word_id' => '1027', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '991', + ), + 1891 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6561', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '28', + 'prev_word_id' => '991', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1031', + ), + 1892 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6562', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '29', + 'prev_word_id' => '1031', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1040', + ), + 1893 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6563', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '30', + 'prev_word_id' => '1040', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1150', + ), + 1894 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6564', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '31', + 'prev_word_id' => '1150', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1895 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6565', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '32', + 'prev_word_id' => '1001', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '990', + ), + 1896 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6566', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '33', + 'prev_word_id' => '990', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1208', + ), + 1897 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6567', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '34', + 'prev_word_id' => '1208', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1898 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6568', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '35', + 'prev_word_id' => '1001', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1899 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6569', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '36', + 'prev_word_id' => '1142', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1010', + ), + 1900 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6570', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '37', + 'prev_word_id' => '1010', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1209', + ), + 1901 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6571', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '38', + 'prev_word_id' => '1209', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1103', + ), + 1902 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6572', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '39', + 'prev_word_id' => '1103', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '825', + ), + 1903 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6573', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '40', + 'prev_word_id' => '825', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1199', + ), + 1904 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6574', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '41', + 'prev_word_id' => '1199', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1146', + ), + 1905 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6575', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '42', + 'prev_word_id' => '1146', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1102', + ), + 1906 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6576', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1173', + 'placement' => '43', + 'prev_word_id' => '1102', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1907 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6577', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '44', + 'prev_word_id' => '1006', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1173', + ), + 1908 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6578', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '45', + 'prev_word_id' => '1173', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1149', + ), + 1909 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6579', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '46', + 'prev_word_id' => '1149', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '810', + ), + 1910 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6580', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '47', + 'prev_word_id' => '810', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1033', + ), + 1911 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6581', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '48', + 'prev_word_id' => '1033', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1162', + ), + 1912 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6582', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '49', + 'prev_word_id' => '1162', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1041', + ), + 1913 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6583', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '50', + 'prev_word_id' => '1041', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '995', + ), + 1914 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6584', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1205', + 'placement' => '51', + 'prev_word_id' => '995', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1039', + ), + 1915 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6585', + 'identifier' => 'publish_date', + 'integer_value' => '1174645260', + 'next_word_id' => '1191', + 'placement' => '52', + 'prev_word_id' => '1039', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1205', + ), + 1916 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '83', + 'frequency' => '0', + 'id' => '6586', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '53', + 'prev_word_id' => '1205', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1191', + ), + 1917 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6587', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '919', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '919', + ), + 1918 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6588', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '1', + 'prev_word_id' => '919', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '919', + ), + 1919 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6589', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '2', + 'prev_word_id' => '919', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1008', + ), + 1920 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6590', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '3', + 'prev_word_id' => '1008', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1024', + ), + 1921 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6591', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '919', + 'placement' => '4', + 'prev_word_id' => '1024', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '971', + ), + 1922 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6592', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1210', + 'placement' => '5', + 'prev_word_id' => '971', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '919', + ), + 1923 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6593', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1211', + 'placement' => '6', + 'prev_word_id' => '919', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1210', + ), + 1924 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6594', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '919', + 'placement' => '7', + 'prev_word_id' => '1210', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1211', + ), + 1925 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6595', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '8', + 'prev_word_id' => '1211', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '919', + ), + 1926 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6596', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1212', + 'placement' => '9', + 'prev_word_id' => '919', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1008', + ), + 1927 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6597', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1213', + 'placement' => '10', + 'prev_word_id' => '1008', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1212', + ), + 1928 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6598', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '1214', + 'placement' => '11', + 'prev_word_id' => '1212', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1213', + ), + 1929 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6599', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '12', + 'prev_word_id' => '1213', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1214', + ), + 1930 => + array ( + 'contentclass_attribute_id' => '239', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6600', + 'identifier' => 'center_column', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '13', + 'prev_word_id' => '1214', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '857', + ), + 1931 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6601', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '14', + 'prev_word_id' => '857', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '981', + ), + 1932 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6602', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '15', + 'prev_word_id' => '981', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '982', + ), + 1933 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6603', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '16', + 'prev_word_id' => '982', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '983', + ), + 1934 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6604', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '17', + 'prev_word_id' => '983', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '984', + ), + 1935 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6605', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '18', + 'prev_word_id' => '984', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '985', + ), + 1936 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6606', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '19', + 'prev_word_id' => '985', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '986', + ), + 1937 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6607', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '20', + 'prev_word_id' => '986', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '987', + ), + 1938 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6608', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '21', + 'prev_word_id' => '987', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '988', + ), + 1939 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6609', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '22', + 'prev_word_id' => '988', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '989', + ), + 1940 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6610', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '23', + 'prev_word_id' => '989', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '984', + ), + 1941 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6611', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '24', + 'prev_word_id' => '984', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '990', + ), + 1942 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6612', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '25', + 'prev_word_id' => '990', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '991', + ), + 1943 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6613', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '26', + 'prev_word_id' => '991', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '992', + ), + 1944 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6614', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '27', + 'prev_word_id' => '992', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '993', + ), + 1945 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6615', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '28', + 'prev_word_id' => '993', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '994', + ), + 1946 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6616', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '29', + 'prev_word_id' => '994', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '995', + ), + 1947 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6617', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '30', + 'prev_word_id' => '995', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '996', + ), + 1948 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6618', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '31', + 'prev_word_id' => '996', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '997', + ), + 1949 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6619', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '32', + 'prev_word_id' => '997', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '998', + ), + 1950 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6620', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '33', + 'prev_word_id' => '998', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '999', + ), + 1951 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6621', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '34', + 'prev_word_id' => '999', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1952 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6622', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '35', + 'prev_word_id' => '1000', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1953 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6623', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '36', + 'prev_word_id' => '1001', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1002', + ), + 1954 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6624', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '37', + 'prev_word_id' => '1002', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '995', + ), + 1955 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6625', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '38', + 'prev_word_id' => '995', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '983', + ), + 1956 => + array ( + 'contentclass_attribute_id' => '240', + 'contentclass_id' => '23', + 'contentobject_id' => '84', + 'frequency' => '0', + 'id' => '6626', + 'identifier' => 'right_column', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '39', + 'prev_word_id' => '983', + 'published' => '1311154179', + 'section_id' => '1', + 'word_id' => '1003', + ), + 1957 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6627', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1215', + ), + 1958 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6628', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '1', + 'prev_word_id' => '1215', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1959 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6629', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '2', + 'prev_word_id' => '1108', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1045', + ), + 1960 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6630', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '3', + 'prev_word_id' => '1045', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1115', + ), + 1961 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6631', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '4', + 'prev_word_id' => '1115', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1142', + ), + 1962 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6632', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '5', + 'prev_word_id' => '1142', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1963 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6633', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '6', + 'prev_word_id' => '1011', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1144', + ), + 1964 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6634', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '7', + 'prev_word_id' => '1144', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '999', + ), + 1965 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6635', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '8', + 'prev_word_id' => '999', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1089', + ), + 1966 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6636', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '9', + 'prev_word_id' => '1089', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1143', + ), + 1967 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6637', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '10', + 'prev_word_id' => '1143', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1108', + ), + 1968 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6638', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '11', + 'prev_word_id' => '1108', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1013', + ), + 1969 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6639', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '12', + 'prev_word_id' => '1013', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1162', + ), + 1970 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6640', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '13', + 'prev_word_id' => '1162', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1017', + ), + 1971 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6641', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '14', + 'prev_word_id' => '1017', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1030', + ), + 1972 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6642', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '15', + 'prev_word_id' => '1030', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1168', + ), + 1973 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6643', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '16', + 'prev_word_id' => '1168', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '997', + ), + 1974 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6644', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '17', + 'prev_word_id' => '997', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1975 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '85', + 'frequency' => '0', + 'id' => '6645', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '18', + 'prev_word_id' => '1011', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1049', + ), + 1976 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6646', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1216', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '838', + ), + 1977 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6647', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '1', + 'prev_word_id' => '838', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1216', + ), + 1978 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6648', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '2', + 'prev_word_id' => '1216', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1135', + ), + 1979 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6649', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '3', + 'prev_word_id' => '1135', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1006', + ), + 1980 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6650', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '4', + 'prev_word_id' => '1006', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1019', + ), + 1981 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6651', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '5', + 'prev_word_id' => '1019', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1111', + ), + 1982 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6652', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '6', + 'prev_word_id' => '1111', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1042', + ), + 1983 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6653', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '7', + 'prev_word_id' => '1042', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1217', + ), + 1984 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6654', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '8', + 'prev_word_id' => '1217', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '992', + ), + 1985 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6655', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '9', + 'prev_word_id' => '992', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '993', + ), + 1986 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6656', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '10', + 'prev_word_id' => '993', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '990', + ), + 1987 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6657', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '11', + 'prev_word_id' => '990', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1011', + ), + 1988 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '86', + 'frequency' => '0', + 'id' => '6658', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '12', + 'prev_word_id' => '1011', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '998', + ), + 1989 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6659', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '987', + ), + 1990 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6660', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '1', + 'prev_word_id' => '987', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1192', + ), + 1991 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6661', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '2', + 'prev_word_id' => '1192', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1000', + ), + 1992 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6662', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '3', + 'prev_word_id' => '1000', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1001', + ), + 1993 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6663', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '4', + 'prev_word_id' => '1001', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1115', + ), + 1994 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6664', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '5', + 'prev_word_id' => '1115', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1159', + ), + 1995 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6665', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '6', + 'prev_word_id' => '1159', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '984', + ), + 1996 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6666', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '7', + 'prev_word_id' => '984', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1157', + ), + 1997 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6667', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '8', + 'prev_word_id' => '1157', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1188', + ), + 1998 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6668', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '9', + 'prev_word_id' => '1188', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1194', + ), + 1999 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6669', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '10', + 'prev_word_id' => '1194', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2000 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6670', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '11', + 'prev_word_id' => '1017', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2001 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6671', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '12', + 'prev_word_id' => '1040', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2002 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6672', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '13', + 'prev_word_id' => '1002', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2003 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6673', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '14', + 'prev_word_id' => '1147', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2004 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6674', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '15', + 'prev_word_id' => '1170', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2005 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6675', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '16', + 'prev_word_id' => '1108', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2006 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6676', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '17', + 'prev_word_id' => '1001', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '985', + ), + 2007 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6677', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '18', + 'prev_word_id' => '985', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2008 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6678', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '19', + 'prev_word_id' => '1020', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '999', + ), + 2009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1207', + 'placement' => '20', + 'prev_word_id' => '999', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '21', + 'prev_word_id' => '1017', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1207', + ), + 2011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '22', + 'prev_word_id' => '1207', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '23', + 'prev_word_id' => '1016', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1048', + ), + 2013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '24', + 'prev_word_id' => '1048', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '25', + 'prev_word_id' => '1016', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '26', + 'prev_word_id' => '1172', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '27', + 'prev_word_id' => '1186', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '994', + ), + 2017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '28', + 'prev_word_id' => '994', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1034', + ), + 2018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '29', + 'prev_word_id' => '1034', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '997', + ), + 2019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '30', + 'prev_word_id' => '997', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '31', + 'prev_word_id' => '1030', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1218', + ), + 2021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '32', + 'prev_word_id' => '1218', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '33', + 'prev_word_id' => '1089', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '34', + 'prev_word_id' => '1158', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1166', + ), + 2024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '35', + 'prev_word_id' => '1166', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '36', + 'prev_word_id' => '1196', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '37', + 'prev_word_id' => '1014', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '863', + ), + 2027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '38', + 'prev_word_id' => '863', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '39', + 'prev_word_id' => '1006', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1159', + ), + 2029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '40', + 'prev_word_id' => '1159', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '41', + 'prev_word_id' => '1016', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1218', + ), + 2031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '42', + 'prev_word_id' => '1218', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1146', + ), + 2032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '43', + 'prev_word_id' => '1146', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '44', + 'prev_word_id' => '1030', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '45', + 'prev_word_id' => '1017', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '46', + 'prev_word_id' => '1020', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '984', + ), + 2036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '47', + 'prev_word_id' => '984', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '825', + ), + 2037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '48', + 'prev_word_id' => '825', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '49', + 'prev_word_id' => '1038', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1114', + ), + 2039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '50', + 'prev_word_id' => '1114', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '825', + ), + 2040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '51', + 'prev_word_id' => '825', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '52', + 'prev_word_id' => '1103', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '53', + 'prev_word_id' => '1135', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '54', + 'prev_word_id' => '1002', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '55', + 'prev_word_id' => '1036', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '982', + ), + 2045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '56', + 'prev_word_id' => '982', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '57', + 'prev_word_id' => '1020', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1100', + ), + 2047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '58', + 'prev_word_id' => '1100', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '59', + 'prev_word_id' => '1171', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '60', + 'prev_word_id' => '1192', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '61', + 'prev_word_id' => '1011', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '62', + 'prev_word_id' => '1036', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '987', + ), + 2052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '63', + 'prev_word_id' => '987', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '64', + 'prev_word_id' => '1192', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '65', + 'prev_word_id' => '1000', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1042', + ), + 2055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '66', + 'prev_word_id' => '1042', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '67', + 'prev_word_id' => '1040', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1140', + ), + 2057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '68', + 'prev_word_id' => '1140', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1140', + ), + 2058 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6728', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '69', + 'prev_word_id' => '1140', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '987', + ), + 2059 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6729', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '70', + 'prev_word_id' => '987', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2060 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6730', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '71', + 'prev_word_id' => '1192', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '987', + ), + 2061 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6731', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1219', + 'placement' => '72', + 'prev_word_id' => '987', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2062 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6732', + 'identifier' => 'publish_date', + 'integer_value' => '1175235780', + 'next_word_id' => '1191', + 'placement' => '73', + 'prev_word_id' => '1192', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1219', + ), + 2063 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '87', + 'frequency' => '0', + 'id' => '6733', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '74', + 'prev_word_id' => '1219', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1191', + ), + 2064 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6734', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1174', + ), + 2065 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6735', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1176', + 'placement' => '1', + 'prev_word_id' => '1174', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1175', + ), + 2066 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6736', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '2', + 'prev_word_id' => '1175', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1176', + ), + 2067 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6737', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '3', + 'prev_word_id' => '1176', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '981', + ), + 2068 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6738', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '4', + 'prev_word_id' => '981', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1097', + ), + 2069 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6739', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '5', + 'prev_word_id' => '1097', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2070 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6740', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '6', + 'prev_word_id' => '1016', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2071 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6741', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '7', + 'prev_word_id' => '1001', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2072 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6742', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '8', + 'prev_word_id' => '1196', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1118', + ), + 2073 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6743', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '9', + 'prev_word_id' => '1118', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1143', + ), + 2074 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6744', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '10', + 'prev_word_id' => '1143', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1109', + ), + 2075 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6745', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '11', + 'prev_word_id' => '1109', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2076 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6746', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '12', + 'prev_word_id' => '1018', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '998', + ), + 2077 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6747', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '13', + 'prev_word_id' => '998', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2078 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6748', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '14', + 'prev_word_id' => '1170', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2079 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6749', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '15', + 'prev_word_id' => '1186', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2080 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6750', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '16', + 'prev_word_id' => '1041', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1102', + ), + 2081 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6751', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '17', + 'prev_word_id' => '1102', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '825', + ), + 2082 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6752', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '18', + 'prev_word_id' => '825', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2083 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6753', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '19', + 'prev_word_id' => '1007', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2084 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6754', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '20', + 'prev_word_id' => '1145', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2085 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6755', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '21', + 'prev_word_id' => '1192', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2086 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6756', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '22', + 'prev_word_id' => '1099', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2087 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6757', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '23', + 'prev_word_id' => '1001', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1109', + ), + 2088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '24', + 'prev_word_id' => '1109', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1114', + ), + 2089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '25', + 'prev_word_id' => '1114', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '26', + 'prev_word_id' => '1036', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '27', + 'prev_word_id' => '1168', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1029', + ), + 2092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '28', + 'prev_word_id' => '1029', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '29', + 'prev_word_id' => '1170', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1197', + ), + 2094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '30', + 'prev_word_id' => '1197', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '863', + ), + 2095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '31', + 'prev_word_id' => '863', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1203', + ), + 2096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '32', + 'prev_word_id' => '1203', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '825', + ), + 2097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '33', + 'prev_word_id' => '825', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1143', + ), + 2098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '34', + 'prev_word_id' => '1143', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1220', + ), + 2099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '35', + 'prev_word_id' => '1220', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '36', + 'prev_word_id' => '1013', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1208', + ), + 2101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '37', + 'prev_word_id' => '1208', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '38', + 'prev_word_id' => '1014', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1136', + ), + 2103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '39', + 'prev_word_id' => '1136', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1027', + ), + 2104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '40', + 'prev_word_id' => '1027', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '41', + 'prev_word_id' => '1170', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '42', + 'prev_word_id' => '1161', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1163', + ), + 2107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '43', + 'prev_word_id' => '1163', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '44', + 'prev_word_id' => '1013', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '45', + 'prev_word_id' => '1099', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1174', + ), + 2110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1176', + 'placement' => '46', + 'prev_word_id' => '1174', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1175', + ), + 2111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1177', + 'placement' => '47', + 'prev_word_id' => '1175', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1176', + ), + 2112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1178', + 'placement' => '48', + 'prev_word_id' => '1176', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1177', + ), + 2113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1179', + 'placement' => '49', + 'prev_word_id' => '1177', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1178', + ), + 2114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1180', + 'placement' => '50', + 'prev_word_id' => '1178', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1179', + ), + 2115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '51', + 'prev_word_id' => '1179', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1180', + ), + 2116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1182', + 'placement' => '52', + 'prev_word_id' => '1180', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1181', + ), + 2117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1183', + 'placement' => '53', + 'prev_word_id' => '1181', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1182', + ), + 2118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '54', + 'prev_word_id' => '1182', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1183', + ), + 2119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1184', + 'placement' => '55', + 'prev_word_id' => '1183', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1181', + ), + 2120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1185', + 'placement' => '56', + 'prev_word_id' => '1181', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1184', + ), + 2121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '57', + 'prev_word_id' => '1184', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1185', + ), + 2122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '58', + 'prev_word_id' => '1185', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '59', + 'prev_word_id' => '1001', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '60', + 'prev_word_id' => '1030', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1164', + ), + 2125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '61', + 'prev_word_id' => '1164', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1042', + ), + 2126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '62', + 'prev_word_id' => '1042', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '63', + 'prev_word_id' => '1036', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1050', + ), + 2128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '64', + 'prev_word_id' => '1050', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1221', + ), + 2129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '65', + 'prev_word_id' => '1221', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '66', + 'prev_word_id' => '1135', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1143', + ), + 2131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '67', + 'prev_word_id' => '1143', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '996', + ), + 2132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '68', + 'prev_word_id' => '996', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1046', + ), + 2133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '69', + 'prev_word_id' => '1046', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1189', + ), + 2134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '70', + 'prev_word_id' => '1189', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1209', + ), + 2135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '71', + 'prev_word_id' => '1209', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1111', + ), + 2136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '72', + 'prev_word_id' => '1111', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '73', + 'prev_word_id' => '1018', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '825', + ), + 2138 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6808', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '74', + 'prev_word_id' => '825', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2139 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6809', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '75', + 'prev_word_id' => '1040', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1174', + ), + 2140 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6810', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '76', + 'prev_word_id' => '1174', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1175', + ), + 2141 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6811', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '77', + 'prev_word_id' => '1175', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1174', + ), + 2142 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6812', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1222', + 'placement' => '78', + 'prev_word_id' => '1174', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1175', + ), + 2143 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6813', + 'identifier' => 'publish_date', + 'integer_value' => '1175236020', + 'next_word_id' => '1191', + 'placement' => '79', + 'prev_word_id' => '1175', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1222', + ), + 2144 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '88', + 'frequency' => '0', + 'id' => '6814', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '80', + 'prev_word_id' => '1222', + 'published' => '1311154180', + 'section_id' => '1', + 'word_id' => '1191', + ), + 2145 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6815', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2146 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6816', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '1', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2147 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6817', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '2', + 'prev_word_id' => '1101', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1195', + ), + 2148 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6818', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '3', + 'prev_word_id' => '1195', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2149 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6819', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '4', + 'prev_word_id' => '1019', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2150 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6820', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '5', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '984', + ), + 2151 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6821', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '6', + 'prev_word_id' => '984', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2152 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6822', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '7', + 'prev_word_id' => '1036', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1042', + ), + 2153 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6823', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1223', + 'placement' => '8', + 'prev_word_id' => '1042', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1050', + ), + 2154 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6824', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '9', + 'prev_word_id' => '1050', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1223', + ), + 2155 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6825', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '10', + 'prev_word_id' => '1223', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2156 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6826', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '11', + 'prev_word_id' => '1014', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2157 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6827', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '12', + 'prev_word_id' => '1038', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2158 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6828', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '13', + 'prev_word_id' => '1108', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2159 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6829', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '14', + 'prev_word_id' => '1012', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2160 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6830', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '15', + 'prev_word_id' => '1001', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '984', + ), + 2161 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6831', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '16', + 'prev_word_id' => '984', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2162 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6832', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '17', + 'prev_word_id' => '1007', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1051', + ), + 2163 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6833', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '18', + 'prev_word_id' => '1051', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2164 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6834', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '19', + 'prev_word_id' => '1107', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '988', + ), + 2165 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6835', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '20', + 'prev_word_id' => '988', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2166 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6836', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '21', + 'prev_word_id' => '1172', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2167 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6837', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '22', + 'prev_word_id' => '1147', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1112', + ), + 2168 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6838', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '23', + 'prev_word_id' => '1112', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1034', + ), + 2169 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6839', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '24', + 'prev_word_id' => '1034', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2170 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6840', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '25', + 'prev_word_id' => '1108', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1169', + ), + 2171 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6841', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '26', + 'prev_word_id' => '1169', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2172 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6842', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '27', + 'prev_word_id' => '1113', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2173 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6843', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1207', + 'placement' => '28', + 'prev_word_id' => '1107', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1206', + ), + 2174 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6844', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '29', + 'prev_word_id' => '1206', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1207', + ), + 2175 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6845', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '30', + 'prev_word_id' => '1207', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2176 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6846', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '31', + 'prev_word_id' => '1002', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2177 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6847', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '32', + 'prev_word_id' => '1041', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2178 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6848', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '33', + 'prev_word_id' => '1026', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2179 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6849', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '34', + 'prev_word_id' => '1041', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2180 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6850', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '35', + 'prev_word_id' => '1107', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1217', + ), + 2181 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6851', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '36', + 'prev_word_id' => '1217', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2182 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6852', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '37', + 'prev_word_id' => '1012', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2183 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6853', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '38', + 'prev_word_id' => '1007', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '825', + ), + 2184 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6854', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '39', + 'prev_word_id' => '825', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2185 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6855', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '40', + 'prev_word_id' => '1161', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2186 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6856', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '41', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2187 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6857', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '42', + 'prev_word_id' => '1162', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1051', + ), + 2188 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6858', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '43', + 'prev_word_id' => '1051', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1037', + ), + 2189 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6859', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '44', + 'prev_word_id' => '1037', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2190 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6860', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '45', + 'prev_word_id' => '1030', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2191 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6861', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '46', + 'prev_word_id' => '1147', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2192 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6862', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '47', + 'prev_word_id' => '1171', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2193 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6863', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '48', + 'prev_word_id' => '1053', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '992', + ), + 2194 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6864', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '49', + 'prev_word_id' => '992', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '993', + ), + 2195 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6865', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '50', + 'prev_word_id' => '993', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2196 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6866', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '51', + 'prev_word_id' => '1162', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1114', + ), + 2197 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6867', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '52', + 'prev_word_id' => '1114', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1208', + ), + 2198 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6868', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '53', + 'prev_word_id' => '1208', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2199 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6869', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '54', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2200 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6870', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '55', + 'prev_word_id' => '1101', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1195', + ), + 2201 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6871', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '56', + 'prev_word_id' => '1195', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2202 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6872', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '57', + 'prev_word_id' => '1019', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '981', + ), + 2203 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6873', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '58', + 'prev_word_id' => '981', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2204 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6874', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '59', + 'prev_word_id' => '1018', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1160', + ), + 2205 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6875', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '60', + 'prev_word_id' => '1160', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '989', + ), + 2206 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6876', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '61', + 'prev_word_id' => '989', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2207 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6877', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '62', + 'prev_word_id' => '1145', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2208 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6878', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '63', + 'prev_word_id' => '1170', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1034', + ), + 2209 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6879', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '64', + 'prev_word_id' => '1034', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '810', + ), + 2210 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6880', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '65', + 'prev_word_id' => '810', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2211 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6881', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '66', + 'prev_word_id' => '1006', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1029', + ), + 2212 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6882', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '67', + 'prev_word_id' => '1029', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1028', + ), + 2213 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6883', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '68', + 'prev_word_id' => '1028', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2214 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6884', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '69', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2215 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6885', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '70', + 'prev_word_id' => '1101', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2216 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6886', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1224', + 'placement' => '71', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2217 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6887', + 'identifier' => 'publish_date', + 'integer_value' => '1175236920', + 'next_word_id' => '1191', + 'placement' => '72', + 'prev_word_id' => '1101', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1224', + ), + 2218 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '89', + 'frequency' => '0', + 'id' => '6888', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '73', + 'prev_word_id' => '1224', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1191', + ), + 2219 => + array ( + 'contentclass_attribute_id' => '316', + 'contentclass_id' => '41', + 'contentobject_id' => '90', + 'frequency' => '0', + 'id' => '6889', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1225', + ), + 2220 => + array ( + 'contentclass_attribute_id' => '316', + 'contentclass_id' => '41', + 'contentobject_id' => '90', + 'frequency' => '0', + 'id' => '6890', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1226', + 'placement' => '1', + 'prev_word_id' => '1225', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '833', + ), + 2221 => + array ( + 'contentclass_attribute_id' => '316', + 'contentclass_id' => '41', + 'contentobject_id' => '90', + 'frequency' => '0', + 'id' => '6891', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '833', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1226', + ), + 2222 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6892', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1228', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1227', + ), + 2223 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6893', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1229', + 'placement' => '1', + 'prev_word_id' => '1227', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1228', + ), + 2224 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6894', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '2', + 'prev_word_id' => '1228', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1229', + ), + 2225 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6895', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1230', + 'placement' => '3', + 'prev_word_id' => '1229', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2226 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6896', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '4', + 'prev_word_id' => '1108', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1230', + ), + 2227 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6897', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '5', + 'prev_word_id' => '1230', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1220', + ), + 2228 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6898', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '6', + 'prev_word_id' => '1220', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1116', + ), + 2229 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6899', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '7', + 'prev_word_id' => '1116', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1231', + ), + 2230 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6900', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '8', + 'prev_word_id' => '1231', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2231 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6901', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '9', + 'prev_word_id' => '1089', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1232', + ), + 2232 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6902', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '10', + 'prev_word_id' => '1232', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2233 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6903', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '11', + 'prev_word_id' => '1089', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '994', + ), + 2234 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6904', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '12', + 'prev_word_id' => '994', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1233', + ), + 2235 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6905', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '13', + 'prev_word_id' => '1233', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2236 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6906', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '14', + 'prev_word_id' => '1188', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2237 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6907', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '15', + 'prev_word_id' => '1016', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1043', + ), + 2238 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6908', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '16', + 'prev_word_id' => '1043', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1202', + ), + 2239 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6909', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '17', + 'prev_word_id' => '1202', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1048', + ), + 2240 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '91', + 'frequency' => '0', + 'id' => '6910', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '18', + 'prev_word_id' => '1048', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1141', + ), + 2241 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6911', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1235', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1234', + ), + 2242 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6912', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1229', + 'placement' => '1', + 'prev_word_id' => '1234', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1235', + ), + 2243 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6913', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '2', + 'prev_word_id' => '1235', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1229', + ), + 2244 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6914', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '3', + 'prev_word_id' => '1229', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2245 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6915', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '4', + 'prev_word_id' => '1014', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '810', + ), + 2246 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6916', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '5', + 'prev_word_id' => '810', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1157', + ), + 2247 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6917', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '6', + 'prev_word_id' => '1157', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2248 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6918', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '7', + 'prev_word_id' => '1014', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2249 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6919', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '8', + 'prev_word_id' => '1030', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '986', + ), + 2250 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6920', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '9', + 'prev_word_id' => '986', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '825', + ), + 2251 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6921', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '10', + 'prev_word_id' => '825', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1109', + ), + 2252 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6922', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1207', + 'placement' => '11', + 'prev_word_id' => '1109', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2253 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6923', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '12', + 'prev_word_id' => '1192', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1207', + ), + 2254 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6924', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '13', + 'prev_word_id' => '1207', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2255 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6925', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '14', + 'prev_word_id' => '1001', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2256 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6926', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '15', + 'prev_word_id' => '1000', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2257 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6927', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '16', + 'prev_word_id' => '1041', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1140', + ), + 2258 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6928', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '17', + 'prev_word_id' => '1140', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2259 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6929', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '18', + 'prev_word_id' => '1188', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2260 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '92', + 'frequency' => '0', + 'id' => '6930', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '19', + 'prev_word_id' => '1165', + 'published' => '1311154181', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2261 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6931', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1236', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1066', + ), + 2262 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6932', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '1', + 'prev_word_id' => '1066', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1236', + ), + 2263 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6933', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '2', + 'prev_word_id' => '1236', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1237', + ), + 2264 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6934', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '3', + 'prev_word_id' => '1237', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2265 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6935', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '4', + 'prev_word_id' => '1135', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1029', + ), + 2266 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6936', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '5', + 'prev_word_id' => '1029', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2267 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6937', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '6', + 'prev_word_id' => '1007', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2268 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6938', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '7', + 'prev_word_id' => '1001', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2269 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6939', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '8', + 'prev_word_id' => '1000', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1220', + ), + 2270 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6940', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '9', + 'prev_word_id' => '1220', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2271 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6941', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '10', + 'prev_word_id' => '1162', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '996', + ), + 2272 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6942', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '11', + 'prev_word_id' => '996', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1037', + ), + 2273 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6943', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '12', + 'prev_word_id' => '1037', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2274 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6944', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '13', + 'prev_word_id' => '1188', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1198', + ), + 2275 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6945', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '14', + 'prev_word_id' => '1198', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2276 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6946', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '15', + 'prev_word_id' => '1188', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2277 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6947', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '16', + 'prev_word_id' => '1144', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2278 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '93', + 'frequency' => '0', + 'id' => '6948', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '17', + 'prev_word_id' => '1089', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2279 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6949', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '912', + ), + 2280 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6950', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '1', + 'prev_word_id' => '912', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '981', + ), + 2281 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6951', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '2', + 'prev_word_id' => '981', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '982', + ), + 2282 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6952', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '3', + 'prev_word_id' => '982', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '983', + ), + 2283 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6953', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '4', + 'prev_word_id' => '983', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '984', + ), + 2284 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6954', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '5', + 'prev_word_id' => '984', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '985', + ), + 2285 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6955', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '6', + 'prev_word_id' => '985', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '986', + ), + 2286 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6956', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '7', + 'prev_word_id' => '986', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '987', + ), + 2287 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6957', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '8', + 'prev_word_id' => '987', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '988', + ), + 2288 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6958', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '9', + 'prev_word_id' => '988', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '989', + ), + 2289 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6959', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '10', + 'prev_word_id' => '989', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '984', + ), + 2290 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6960', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '11', + 'prev_word_id' => '984', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '990', + ), + 2291 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6961', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '12', + 'prev_word_id' => '990', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '991', + ), + 2292 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6962', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '13', + 'prev_word_id' => '991', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '992', + ), + 2293 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6963', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '14', + 'prev_word_id' => '992', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '993', + ), + 2294 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6964', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '15', + 'prev_word_id' => '993', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '994', + ), + 2295 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6965', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '16', + 'prev_word_id' => '994', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '995', + ), + 2296 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6966', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '17', + 'prev_word_id' => '995', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '996', + ), + 2297 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6967', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '1238', + 'placement' => '18', + 'prev_word_id' => '996', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '874', + ), + 2298 => + array ( + 'contentclass_attribute_id' => '238', + 'contentclass_id' => '23', + 'contentobject_id' => '94', + 'frequency' => '0', + 'id' => '6968', + 'identifier' => 'left_column', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '19', + 'prev_word_id' => '874', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1238', + ), + 2299 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6969', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1238', + ), + 2300 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1', + 'prev_word_id' => '1238', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2301 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '2', + 'prev_word_id' => '1000', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '863', + ), + 2302 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '3', + 'prev_word_id' => '863', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1164', + ), + 2303 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '4', + 'prev_word_id' => '1164', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2304 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '5', + 'prev_word_id' => '1000', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2305 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '6', + 'prev_word_id' => '1186', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1043', + ), + 2306 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '7', + 'prev_word_id' => '1043', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2307 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '8', + 'prev_word_id' => '1113', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2308 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '9', + 'prev_word_id' => '1017', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1156', + ), + 2309 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '10', + 'prev_word_id' => '1156', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1116', + ), + 2310 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '11', + 'prev_word_id' => '1116', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2311 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '12', + 'prev_word_id' => '1162', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1220', + ), + 2312 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '13', + 'prev_word_id' => '1220', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2313 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '14', + 'prev_word_id' => '1147', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2314 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '15', + 'prev_word_id' => '1026', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2315 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '16', + 'prev_word_id' => '1019', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1100', + ), + 2316 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '17', + 'prev_word_id' => '1100', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '997', + ), + 2317 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '18', + 'prev_word_id' => '997', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1003', + ), + 2318 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '19', + 'prev_word_id' => '1003', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1005', + ), + 2319 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '20', + 'prev_word_id' => '1005', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '825', + ), + 2320 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '21', + 'prev_word_id' => '825', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2321 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '22', + 'prev_word_id' => '1158', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2322 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '23', + 'prev_word_id' => '1172', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '985', + ), + 2323 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '24', + 'prev_word_id' => '985', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1195', + ), + 2324 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '25', + 'prev_word_id' => '1195', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2325 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '26', + 'prev_word_id' => '1007', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2326 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '27', + 'prev_word_id' => '1026', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2327 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '28', + 'prev_word_id' => '1144', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2328 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '29', + 'prev_word_id' => '1019', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2329 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '6999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '30', + 'prev_word_id' => '1089', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '986', + ), + 2330 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '31', + 'prev_word_id' => '986', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1159', + ), + 2331 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '32', + 'prev_word_id' => '1159', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2332 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '33', + 'prev_word_id' => '1030', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '999', + ), + 2333 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '34', + 'prev_word_id' => '999', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1140', + ), + 2334 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '35', + 'prev_word_id' => '1140', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1164', + ), + 2335 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '36', + 'prev_word_id' => '1164', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1029', + ), + 2336 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '37', + 'prev_word_id' => '1029', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1045', + ), + 2337 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '38', + 'prev_word_id' => '1045', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '987', + ), + 2338 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '39', + 'prev_word_id' => '987', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2339 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '40', + 'prev_word_id' => '1107', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2340 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '41', + 'prev_word_id' => '1006', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2341 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '42', + 'prev_word_id' => '1030', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2342 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '43', + 'prev_word_id' => '1007', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1187', + ), + 2343 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '44', + 'prev_word_id' => '1187', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1160', + ), + 2344 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '45', + 'prev_word_id' => '1160', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2345 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '46', + 'prev_word_id' => '1172', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2346 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '47', + 'prev_word_id' => '1011', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1109', + ), + 2347 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '48', + 'prev_word_id' => '1109', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2348 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '49', + 'prev_word_id' => '1011', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2349 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '50', + 'prev_word_id' => '1038', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1189', + ), + 2350 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '51', + 'prev_word_id' => '1189', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1118', + ), + 2351 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '52', + 'prev_word_id' => '1118', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '983', + ), + 2352 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '53', + 'prev_word_id' => '983', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2353 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '54', + 'prev_word_id' => '1020', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '988', + ), + 2354 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '55', + 'prev_word_id' => '988', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2355 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '56', + 'prev_word_id' => '1170', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '999', + ), + 2356 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '57', + 'prev_word_id' => '999', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1221', + ), + 2357 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '58', + 'prev_word_id' => '1221', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '991', + ), + 2358 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '59', + 'prev_word_id' => '991', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2359 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '60', + 'prev_word_id' => '1011', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1160', + ), + 2360 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '61', + 'prev_word_id' => '1160', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1015', + ), + 2361 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '62', + 'prev_word_id' => '1015', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2362 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '63', + 'prev_word_id' => '1014', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2363 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '64', + 'prev_word_id' => '1145', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '998', + ), + 2364 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '65', + 'prev_word_id' => '998', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2365 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '66', + 'prev_word_id' => '1113', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2366 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '67', + 'prev_word_id' => '1101', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1042', + ), + 2367 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '68', + 'prev_word_id' => '1042', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2368 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '69', + 'prev_word_id' => '1053', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1042', + ), + 2369 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '70', + 'prev_word_id' => '1042', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2370 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '71', + 'prev_word_id' => '1018', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2371 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '72', + 'prev_word_id' => '1188', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1142', + ), + 2372 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '73', + 'prev_word_id' => '1142', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '863', + ), + 2373 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '74', + 'prev_word_id' => '863', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2374 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '75', + 'prev_word_id' => '1108', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2375 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '76', + 'prev_word_id' => '1026', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1049', + ), + 2376 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '77', + 'prev_word_id' => '1049', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1035', + ), + 2377 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '78', + 'prev_word_id' => '1035', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2378 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '79', + 'prev_word_id' => '1038', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '998', + ), + 2379 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '80', + 'prev_word_id' => '998', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1037', + ), + 2380 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '81', + 'prev_word_id' => '1037', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2381 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '82', + 'prev_word_id' => '1011', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '991', + ), + 2382 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '83', + 'prev_word_id' => '991', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2383 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '84', + 'prev_word_id' => '1171', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1052', + ), + 2384 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '85', + 'prev_word_id' => '1052', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '992', + ), + 2385 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '86', + 'prev_word_id' => '992', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '993', + ), + 2386 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '87', + 'prev_word_id' => '993', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1032', + ), + 2387 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '88', + 'prev_word_id' => '1032', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '981', + ), + 2388 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '89', + 'prev_word_id' => '981', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2389 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '90', + 'prev_word_id' => '1188', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1142', + ), + 2390 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '91', + 'prev_word_id' => '1142', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2391 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '92', + 'prev_word_id' => '1170', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2392 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '93', + 'prev_word_id' => '1014', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1046', + ), + 2393 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '95', + 'frequency' => '0', + 'id' => '7063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '94', + 'prev_word_id' => '1046', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2394 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7064', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2395 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7065', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '1', + 'prev_word_id' => '1001', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '982', + ), + 2396 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '2', + 'prev_word_id' => '982', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2397 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '3', + 'prev_word_id' => '1001', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '982', + ), + 2398 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '4', + 'prev_word_id' => '982', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '991', + ), + 2399 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '5', + 'prev_word_id' => '991', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2400 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '6', + 'prev_word_id' => '1019', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2401 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '7', + 'prev_word_id' => '1017', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2402 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '8', + 'prev_word_id' => '1144', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2403 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '9', + 'prev_word_id' => '1147', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2404 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '10', + 'prev_word_id' => '1039', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2405 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '11', + 'prev_word_id' => '1011', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1187', + ), + 2406 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '12', + 'prev_word_id' => '1187', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2407 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '13', + 'prev_word_id' => '1039', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '810', + ), + 2408 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '14', + 'prev_word_id' => '810', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1139', + ), + 2409 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '15', + 'prev_word_id' => '1139', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2410 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '16', + 'prev_word_id' => '1101', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2411 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '17', + 'prev_word_id' => '1168', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2412 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '18', + 'prev_word_id' => '1113', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1031', + ), + 2413 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '19', + 'prev_word_id' => '1031', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2414 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '20', + 'prev_word_id' => '1039', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '863', + ), + 2415 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '21', + 'prev_word_id' => '863', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2416 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '22', + 'prev_word_id' => '1239', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2417 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '23', + 'prev_word_id' => '1158', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1149', + ), + 2418 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '24', + 'prev_word_id' => '1149', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2419 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '25', + 'prev_word_id' => '1188', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2420 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '26', + 'prev_word_id' => '1103', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2421 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '27', + 'prev_word_id' => '1014', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2422 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '28', + 'prev_word_id' => '1158', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '986', + ), + 2423 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '29', + 'prev_word_id' => '986', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2424 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '30', + 'prev_word_id' => '1196', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2425 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '31', + 'prev_word_id' => '1020', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2426 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '32', + 'prev_word_id' => '1017', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2427 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '33', + 'prev_word_id' => '1171', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2428 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '34', + 'prev_word_id' => '1144', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '825', + ), + 2429 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '35', + 'prev_word_id' => '825', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2430 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '36', + 'prev_word_id' => '1019', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2431 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '96', + 'frequency' => '0', + 'id' => '7101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '37', + 'prev_word_id' => '1040', + 'published' => '1311154182', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2432 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7102', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2433 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7103', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '1', + 'prev_word_id' => '1011', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2434 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '2', + 'prev_word_id' => '1144', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '987', + ), + 2435 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '3', + 'prev_word_id' => '987', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2436 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '4', + 'prev_word_id' => '1107', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2437 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '5', + 'prev_word_id' => '1038', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2438 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '6', + 'prev_word_id' => '1172', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2439 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '7', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1051', + ), + 2440 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '8', + 'prev_word_id' => '1051', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1028', + ), + 2441 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '9', + 'prev_word_id' => '1028', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1105', + ), + 2442 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '10', + 'prev_word_id' => '1105', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1217', + ), + 2443 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '11', + 'prev_word_id' => '1217', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2444 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '12', + 'prev_word_id' => '1020', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2445 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '13', + 'prev_word_id' => '1196', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2446 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '14', + 'prev_word_id' => '1013', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1143', + ), + 2447 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '15', + 'prev_word_id' => '1143', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2448 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '16', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2449 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '17', + 'prev_word_id' => '1019', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1100', + ), + 2450 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '18', + 'prev_word_id' => '1100', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '981', + ), + 2451 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '19', + 'prev_word_id' => '981', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1015', + ), + 2452 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '20', + 'prev_word_id' => '1015', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2453 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '21', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2454 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '22', + 'prev_word_id' => '1103', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1005', + ), + 2455 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '23', + 'prev_word_id' => '1005', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '982', + ), + 2456 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '24', + 'prev_word_id' => '982', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2457 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '25', + 'prev_word_id' => '1012', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '992', + ), + 2458 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '26', + 'prev_word_id' => '992', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '993', + ), + 2459 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '27', + 'prev_word_id' => '993', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2460 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '28', + 'prev_word_id' => '1161', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1163', + ), + 2461 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '29', + 'prev_word_id' => '1163', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1143', + ), + 2462 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '30', + 'prev_word_id' => '1143', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '983', + ), + 2463 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '31', + 'prev_word_id' => '983', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2464 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '32', + 'prev_word_id' => '1053', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1197', + ), + 2465 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '33', + 'prev_word_id' => '1197', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2466 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '34', + 'prev_word_id' => '1168', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2467 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '35', + 'prev_word_id' => '1040', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '992', + ), + 2468 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '36', + 'prev_word_id' => '992', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '993', + ), + 2469 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '37', + 'prev_word_id' => '993', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2470 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '38', + 'prev_word_id' => '1036', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2471 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '39', + 'prev_word_id' => '1196', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '999', + ), + 2472 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '40', + 'prev_word_id' => '999', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2473 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '41', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2474 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '42', + 'prev_word_id' => '1053', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '981', + ), + 2475 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '43', + 'prev_word_id' => '981', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2476 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '44', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2477 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '45', + 'prev_word_id' => '1039', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2478 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '46', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2479 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '47', + 'prev_word_id' => '1192', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1116', + ), + 2480 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '48', + 'prev_word_id' => '1116', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2481 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '49', + 'prev_word_id' => '1161', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2482 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '50', + 'prev_word_id' => '1145', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2483 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '51', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1027', + ), + 2484 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '52', + 'prev_word_id' => '1027', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1114', + ), + 2485 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '53', + 'prev_word_id' => '1114', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1164', + ), + 2486 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '54', + 'prev_word_id' => '1164', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1106', + ), + 2487 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '55', + 'prev_word_id' => '1106', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1221', + ), + 2488 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '56', + 'prev_word_id' => '1221', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2489 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '57', + 'prev_word_id' => '1020', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1033', + ), + 2490 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '58', + 'prev_word_id' => '1033', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '992', + ), + 2491 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '59', + 'prev_word_id' => '992', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '993', + ), + 2492 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '60', + 'prev_word_id' => '993', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2493 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '61', + 'prev_word_id' => '1053', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2494 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '62', + 'prev_word_id' => '1188', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1034', + ), + 2495 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '63', + 'prev_word_id' => '1034', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1044', + ), + 2496 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '64', + 'prev_word_id' => '1044', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1033', + ), + 2497 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '65', + 'prev_word_id' => '1033', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1149', + ), + 2498 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '66', + 'prev_word_id' => '1149', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2499 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '67', + 'prev_word_id' => '1013', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2500 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '68', + 'prev_word_id' => '1018', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2501 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '69', + 'prev_word_id' => '1018', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1157', + ), + 2502 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '70', + 'prev_word_id' => '1157', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2503 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '71', + 'prev_word_id' => '1006', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1138', + ), + 2504 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '72', + 'prev_word_id' => '1138', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2505 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '73', + 'prev_word_id' => '1161', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '995', + ), + 2506 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '74', + 'prev_word_id' => '995', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '990', + ), + 2507 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '75', + 'prev_word_id' => '990', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2508 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '76', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '988', + ), + 2509 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '77', + 'prev_word_id' => '988', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2510 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '97', + 'frequency' => '0', + 'id' => '7180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '78', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '998', + ), + 2511 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7181', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '874', + ), + 2512 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '1', + 'prev_word_id' => '874', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2513 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '2', + 'prev_word_id' => '1017', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1166', + ), + 2514 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '3', + 'prev_word_id' => '1166', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1051', + ), + 2515 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '4', + 'prev_word_id' => '1051', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2516 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '5', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1049', + ), + 2517 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '6', + 'prev_word_id' => '1049', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '997', + ), + 2518 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '7', + 'prev_word_id' => '997', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2519 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '8', + 'prev_word_id' => '1036', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2520 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '9', + 'prev_word_id' => '1145', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1197', + ), + 2521 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '10', + 'prev_word_id' => '1197', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2522 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '11', + 'prev_word_id' => '1002', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1167', + ), + 2523 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '12', + 'prev_word_id' => '1167', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1050', + ), + 2524 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '13', + 'prev_word_id' => '1050', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1140', + ), + 2525 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '14', + 'prev_word_id' => '1140', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1193', + ), + 2526 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '15', + 'prev_word_id' => '1193', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1143', + ), + 2527 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '16', + 'prev_word_id' => '1143', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1045', + ), + 2528 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '17', + 'prev_word_id' => '1045', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1102', + ), + 2529 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '18', + 'prev_word_id' => '1102', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1052', + ), + 2530 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '19', + 'prev_word_id' => '1052', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1028', + ), + 2531 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '20', + 'prev_word_id' => '1028', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2532 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '21', + 'prev_word_id' => '1168', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1157', + ), + 2533 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '22', + 'prev_word_id' => '1157', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2534 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '23', + 'prev_word_id' => '1107', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1157', + ), + 2535 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '24', + 'prev_word_id' => '1157', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '997', + ), + 2536 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '25', + 'prev_word_id' => '997', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2537 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '26', + 'prev_word_id' => '1040', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1218', + ), + 2538 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '27', + 'prev_word_id' => '1218', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1156', + ), + 2539 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '28', + 'prev_word_id' => '1156', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2540 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '29', + 'prev_word_id' => '1089', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1209', + ), + 2541 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '30', + 'prev_word_id' => '1209', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2542 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '31', + 'prev_word_id' => '1013', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '994', + ), + 2543 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '32', + 'prev_word_id' => '994', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2544 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '33', + 'prev_word_id' => '1020', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2545 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '34', + 'prev_word_id' => '1007', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2546 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '35', + 'prev_word_id' => '1145', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2547 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '36', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2548 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '37', + 'prev_word_id' => '1162', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2549 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '38', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2550 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '39', + 'prev_word_id' => '1099', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1166', + ), + 2551 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '40', + 'prev_word_id' => '1166', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1119', + ), + 2552 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '41', + 'prev_word_id' => '1119', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1047', + ), + 2553 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '42', + 'prev_word_id' => '1047', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2554 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '43', + 'prev_word_id' => '1108', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2555 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '44', + 'prev_word_id' => '1101', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '988', + ), + 2556 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '45', + 'prev_word_id' => '988', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1137', + ), + 2557 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '46', + 'prev_word_id' => '1137', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '994', + ), + 2558 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '47', + 'prev_word_id' => '994', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2559 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '48', + 'prev_word_id' => '1014', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '810', + ), + 2560 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '49', + 'prev_word_id' => '810', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1203', + ), + 2561 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '50', + 'prev_word_id' => '1203', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1221', + ), + 2562 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '51', + 'prev_word_id' => '1221', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2563 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '52', + 'prev_word_id' => '1002', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2564 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '53', + 'prev_word_id' => '1016', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1156', + ), + 2565 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '54', + 'prev_word_id' => '1156', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '986', + ), + 2566 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '55', + 'prev_word_id' => '986', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2567 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '56', + 'prev_word_id' => '1013', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1037', + ), + 2568 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '57', + 'prev_word_id' => '1037', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2569 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '58', + 'prev_word_id' => '1161', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2570 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '59', + 'prev_word_id' => '1113', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2571 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '60', + 'prev_word_id' => '1107', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1218', + ), + 2572 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '61', + 'prev_word_id' => '1218', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2573 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '62', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '982', + ), + 2574 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '63', + 'prev_word_id' => '982', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '991', + ), + 2575 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '64', + 'prev_word_id' => '991', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2576 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '65', + 'prev_word_id' => '1019', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2577 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '66', + 'prev_word_id' => '1017', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2578 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '67', + 'prev_word_id' => '1144', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2579 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '68', + 'prev_word_id' => '1147', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2580 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '69', + 'prev_word_id' => '1039', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2581 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '70', + 'prev_word_id' => '1011', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1187', + ), + 2582 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '71', + 'prev_word_id' => '1187', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2583 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '72', + 'prev_word_id' => '1039', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '810', + ), + 2584 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '73', + 'prev_word_id' => '810', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1139', + ), + 2585 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '74', + 'prev_word_id' => '1139', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2586 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '75', + 'prev_word_id' => '1101', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2587 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '76', + 'prev_word_id' => '1168', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2588 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '77', + 'prev_word_id' => '1113', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1031', + ), + 2589 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '78', + 'prev_word_id' => '1031', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2590 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '79', + 'prev_word_id' => '1039', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2591 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '80', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2592 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '81', + 'prev_word_id' => '1239', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2593 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '82', + 'prev_word_id' => '1158', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1149', + ), + 2594 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '83', + 'prev_word_id' => '1149', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2595 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '84', + 'prev_word_id' => '1188', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2596 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '85', + 'prev_word_id' => '1103', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2597 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '86', + 'prev_word_id' => '1014', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2598 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '87', + 'prev_word_id' => '1158', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '986', + ), + 2599 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '88', + 'prev_word_id' => '986', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2600 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '89', + 'prev_word_id' => '1196', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2601 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '90', + 'prev_word_id' => '1020', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2602 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '91', + 'prev_word_id' => '1017', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2603 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '92', + 'prev_word_id' => '1171', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2604 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '93', + 'prev_word_id' => '1144', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '825', + ), + 2605 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '94', + 'prev_word_id' => '825', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2606 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '95', + 'prev_word_id' => '1019', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2607 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '98', + 'frequency' => '0', + 'id' => '7277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '96', + 'prev_word_id' => '1040', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2608 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7278', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2609 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7279', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '1', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1119', + ), + 2610 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '2', + 'prev_word_id' => '1119', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '983', + ), + 2611 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '3', + 'prev_word_id' => '983', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1119', + ), + 2612 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '4', + 'prev_word_id' => '1119', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2613 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '5', + 'prev_word_id' => '1162', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2614 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '6', + 'prev_word_id' => '1171', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1034', + ), + 2615 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '7', + 'prev_word_id' => '1034', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2616 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '8', + 'prev_word_id' => '1014', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2617 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '9', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2618 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '10', + 'prev_word_id' => '1002', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2619 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '11', + 'prev_word_id' => '1171', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1157', + ), + 2620 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '12', + 'prev_word_id' => '1157', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1206', + ), + 2621 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '13', + 'prev_word_id' => '1206', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2622 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '14', + 'prev_word_id' => '1239', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '981', + ), + 2623 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '15', + 'prev_word_id' => '981', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2624 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '16', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2625 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '17', + 'prev_word_id' => '1038', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2626 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1097', + 'placement' => '18', + 'prev_word_id' => '1030', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1112', + ), + 2627 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '19', + 'prev_word_id' => '1112', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1097', + ), + 2628 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '20', + 'prev_word_id' => '1097', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2629 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '21', + 'prev_word_id' => '1162', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '999', + ), + 2630 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '22', + 'prev_word_id' => '999', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1117', + ), + 2631 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '23', + 'prev_word_id' => '1117', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2632 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '24', + 'prev_word_id' => '1103', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2633 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '25', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2634 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '26', + 'prev_word_id' => '1053', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2635 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '27', + 'prev_word_id' => '1038', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2636 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '28', + 'prev_word_id' => '1019', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2637 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '29', + 'prev_word_id' => '1171', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1194', + ), + 2638 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '30', + 'prev_word_id' => '1194', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2639 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '31', + 'prev_word_id' => '1011', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2640 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '32', + 'prev_word_id' => '1186', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '986', + ), + 2641 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '33', + 'prev_word_id' => '986', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '995', + ), + 2642 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '34', + 'prev_word_id' => '995', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1052', + ), + 2643 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '35', + 'prev_word_id' => '1052', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1110', + ), + 2644 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '36', + 'prev_word_id' => '1110', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '996', + ), + 2645 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '37', + 'prev_word_id' => '996', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2646 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '38', + 'prev_word_id' => '1012', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2647 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '39', + 'prev_word_id' => '1239', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2648 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1240', + 'placement' => '40', + 'prev_word_id' => '1006', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1217', + ), + 2649 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '41', + 'prev_word_id' => '1217', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1240', + ), + 2650 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '42', + 'prev_word_id' => '1240', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2651 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '43', + 'prev_word_id' => '1040', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2652 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '44', + 'prev_word_id' => '1041', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2653 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '45', + 'prev_word_id' => '1013', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1193', + ), + 2654 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '46', + 'prev_word_id' => '1193', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '981', + ), + 2655 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '47', + 'prev_word_id' => '981', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2656 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '48', + 'prev_word_id' => '1041', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '997', + ), + 2657 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '49', + 'prev_word_id' => '997', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1206', + ), + 2658 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '50', + 'prev_word_id' => '1206', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2659 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '51', + 'prev_word_id' => '1186', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1218', + ), + 2660 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '52', + 'prev_word_id' => '1218', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1163', + ), + 2661 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '53', + 'prev_word_id' => '1163', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1217', + ), + 2662 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '54', + 'prev_word_id' => '1217', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1144', + ), + 2663 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '55', + 'prev_word_id' => '1144', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2664 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '56', + 'prev_word_id' => '1103', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2665 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '57', + 'prev_word_id' => '1172', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2666 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1230', + 'placement' => '58', + 'prev_word_id' => '1006', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2667 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '59', + 'prev_word_id' => '1108', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1230', + ), + 2668 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '60', + 'prev_word_id' => '1230', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1220', + ), + 2669 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '61', + 'prev_word_id' => '1220', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1116', + ), + 2670 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '62', + 'prev_word_id' => '1116', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1231', + ), + 2671 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '63', + 'prev_word_id' => '1231', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2672 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '64', + 'prev_word_id' => '1089', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1232', + ), + 2673 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '65', + 'prev_word_id' => '1232', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2674 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '66', + 'prev_word_id' => '1089', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '994', + ), + 2675 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '67', + 'prev_word_id' => '994', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1233', + ), + 2676 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '68', + 'prev_word_id' => '1233', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2677 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '69', + 'prev_word_id' => '1188', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2678 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '70', + 'prev_word_id' => '1016', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1043', + ), + 2679 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '71', + 'prev_word_id' => '1043', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2680 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '72', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1152', + ), + 2681 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '73', + 'prev_word_id' => '1152', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1153', + ), + 2682 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '74', + 'prev_word_id' => '1153', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1154', + ), + 2683 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '75', + 'prev_word_id' => '1154', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1155', + ), + 2684 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '76', + 'prev_word_id' => '1155', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2685 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '77', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1119', + ), + 2686 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '78', + 'prev_word_id' => '1119', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1118', + ), + 2687 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '79', + 'prev_word_id' => '1118', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1149', + ), + 2688 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '80', + 'prev_word_id' => '1149', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2689 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '81', + 'prev_word_id' => '1172', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2690 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '82', + 'prev_word_id' => '1017', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1169', + ), + 2691 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '99', + 'frequency' => '0', + 'id' => '7361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '83', + 'prev_word_id' => '1169', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1034', + ), + 2692 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7362', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2693 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7363', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '1', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1118', + ), + 2694 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '2', + 'prev_word_id' => '1118', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1035', + ), + 2695 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '3', + 'prev_word_id' => '1035', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '825', + ), + 2696 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '4', + 'prev_word_id' => '825', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2697 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '5', + 'prev_word_id' => '1040', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2698 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '6', + 'prev_word_id' => '1020', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2699 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '7', + 'prev_word_id' => '1002', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1195', + ), + 2700 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '8', + 'prev_word_id' => '1195', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1048', + ), + 2701 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '9', + 'prev_word_id' => '1048', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1163', + ), + 2702 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '10', + 'prev_word_id' => '1163', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1028', + ), + 2703 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '11', + 'prev_word_id' => '1028', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1046', + ), + 2704 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '12', + 'prev_word_id' => '1046', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2705 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1152', + 'placement' => '13', + 'prev_word_id' => '1162', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2706 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1153', + 'placement' => '14', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1152', + ), + 2707 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1154', + 'placement' => '15', + 'prev_word_id' => '1152', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1153', + ), + 2708 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1155', + 'placement' => '16', + 'prev_word_id' => '1153', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1154', + ), + 2709 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '17', + 'prev_word_id' => '1154', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1155', + ), + 2710 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '18', + 'prev_word_id' => '1155', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2711 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '19', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1110', + ), + 2712 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '20', + 'prev_word_id' => '1110', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1045', + ), + 2713 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '21', + 'prev_word_id' => '1045', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1164', + ), + 2714 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '22', + 'prev_word_id' => '1164', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2715 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '23', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1043', + ), + 2716 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '24', + 'prev_word_id' => '1043', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1010', + ), + 2717 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '25', + 'prev_word_id' => '1010', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '825', + ), + 2718 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '26', + 'prev_word_id' => '825', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2719 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '27', + 'prev_word_id' => '1162', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2720 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '28', + 'prev_word_id' => '1000', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1049', + ), + 2721 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '29', + 'prev_word_id' => '1049', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1102', + ), + 2722 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '30', + 'prev_word_id' => '1102', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '990', + ), + 2723 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '31', + 'prev_word_id' => '990', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '995', + ), + 2724 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '32', + 'prev_word_id' => '995', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1116', + ), + 2725 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '33', + 'prev_word_id' => '1116', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2726 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '34', + 'prev_word_id' => '1171', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1117', + ), + 2727 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '35', + 'prev_word_id' => '1117', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '992', + ), + 2728 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '36', + 'prev_word_id' => '992', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '993', + ), + 2729 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '37', + 'prev_word_id' => '993', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2730 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '38', + 'prev_word_id' => '1168', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2731 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '39', + 'prev_word_id' => '1135', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2732 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '40', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1039', + ), + 2733 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '41', + 'prev_word_id' => '1039', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2734 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '42', + 'prev_word_id' => '1108', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1003', + ), + 2735 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '43', + 'prev_word_id' => '1003', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2736 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '44', + 'prev_word_id' => '1239', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '989', + ), + 2737 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '45', + 'prev_word_id' => '989', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2738 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '46', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2739 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '47', + 'prev_word_id' => '1107', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1106', + ), + 2740 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '48', + 'prev_word_id' => '1106', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '983', + ), + 2741 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '49', + 'prev_word_id' => '983', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1031', + ), + 2742 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '50', + 'prev_word_id' => '1031', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1038', + ), + 2743 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '51', + 'prev_word_id' => '1038', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2744 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '52', + 'prev_word_id' => '1011', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '996', + ), + 2745 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '53', + 'prev_word_id' => '996', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2746 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '54', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '996', + ), + 2747 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '55', + 'prev_word_id' => '996', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1032', + ), + 2748 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '56', + 'prev_word_id' => '1032', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1197', + ), + 2749 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '57', + 'prev_word_id' => '1197', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '825', + ), + 2750 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '58', + 'prev_word_id' => '825', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '984', + ), + 2751 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '59', + 'prev_word_id' => '984', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1043', + ), + 2752 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '60', + 'prev_word_id' => '1043', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '994', + ), + 2753 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7423', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '61', + 'prev_word_id' => '994', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2754 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7424', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '62', + 'prev_word_id' => '1001', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1113', + ), + 2755 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7425', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '63', + 'prev_word_id' => '1113', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2756 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7426', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '64', + 'prev_word_id' => '1026', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1118', + ), + 2757 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7427', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '65', + 'prev_word_id' => '1118', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2758 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7428', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '66', + 'prev_word_id' => '1239', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1049', + ), + 2759 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7429', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '67', + 'prev_word_id' => '1049', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1047', + ), + 2760 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '68', + 'prev_word_id' => '1047', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1221', + ), + 2761 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '69', + 'prev_word_id' => '1221', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1189', + ), + 2762 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '70', + 'prev_word_id' => '1189', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2763 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '71', + 'prev_word_id' => '1014', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1010', + ), + 2764 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '72', + 'prev_word_id' => '1010', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1239', + ), + 2765 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '73', + 'prev_word_id' => '1239', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2766 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '74', + 'prev_word_id' => '1135', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2767 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '75', + 'prev_word_id' => '1188', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1049', + ), + 2768 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '76', + 'prev_word_id' => '1049', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2769 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '77', + 'prev_word_id' => '1011', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '863', + ), + 2770 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '78', + 'prev_word_id' => '863', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1141', + ), + 2771 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '79', + 'prev_word_id' => '1141', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2772 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '80', + 'prev_word_id' => '1135', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '985', + ), + 2773 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '81', + 'prev_word_id' => '985', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1162', + ), + 2774 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '82', + 'prev_word_id' => '1162', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '992', + ), + 2775 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '83', + 'prev_word_id' => '992', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '993', + ), + 2776 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '84', + 'prev_word_id' => '993', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '989', + ), + 2777 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '85', + 'prev_word_id' => '989', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2778 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '86', + 'prev_word_id' => '1145', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1053', + ), + 2779 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1098', + 'placement' => '87', + 'prev_word_id' => '1053', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '981', + ), + 2780 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '88', + 'prev_word_id' => '981', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1098', + ), + 2781 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '89', + 'prev_word_id' => '1098', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1218', + ), + 2782 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '90', + 'prev_word_id' => '1218', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2783 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '100', + 'frequency' => '0', + 'id' => '7453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '91', + 'prev_word_id' => '1020', + 'published' => '1311154183', + 'section_id' => '1', + 'word_id' => '1002', + ), + 2784 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7454', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1241', + ), + 2785 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7455', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '1', + 'prev_word_id' => '1241', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1114', + ), + 2786 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7456', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '2', + 'prev_word_id' => '1114', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2787 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7457', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '3', + 'prev_word_id' => '1186', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1015', + ), + 2788 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7458', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '4', + 'prev_word_id' => '1015', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2789 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7459', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '5', + 'prev_word_id' => '1016', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1047', + ), + 2790 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7460', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '6', + 'prev_word_id' => '1047', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '982', + ), + 2791 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7461', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '7', + 'prev_word_id' => '982', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1199', + ), + 2792 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7462', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '8', + 'prev_word_id' => '1199', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2793 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7463', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '9', + 'prev_word_id' => '1040', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2794 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7464', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '10', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2795 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7465', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '11', + 'prev_word_id' => '1000', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1149', + ), + 2796 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7466', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '12', + 'prev_word_id' => '1149', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1045', + ), + 2797 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7467', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '13', + 'prev_word_id' => '1045', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '995', + ), + 2798 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7468', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '14', + 'prev_word_id' => '995', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1160', + ), + 2799 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7469', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '15', + 'prev_word_id' => '1160', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2800 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7470', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '16', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1146', + ), + 2801 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7471', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '17', + 'prev_word_id' => '1146', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2802 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7472', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '18', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1157', + ), + 2803 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7473', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '19', + 'prev_word_id' => '1157', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1135', + ), + 2804 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7474', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '20', + 'prev_word_id' => '1135', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2805 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7475', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '21', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1161', + ), + 2806 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7476', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '22', + 'prev_word_id' => '1161', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2807 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7477', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '23', + 'prev_word_id' => '1040', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2808 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7478', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '24', + 'prev_word_id' => '1000', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '998', + ), + 2809 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7479', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '25', + 'prev_word_id' => '998', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1198', + ), + 2810 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7480', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '26', + 'prev_word_id' => '1198', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1030', + ), + 2811 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7481', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '27', + 'prev_word_id' => '1030', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1110', + ), + 2812 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7482', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '28', + 'prev_word_id' => '1110', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '995', + ), + 2813 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7483', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '29', + 'prev_word_id' => '995', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1028', + ), + 2814 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7484', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '30', + 'prev_word_id' => '1028', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2815 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7485', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '31', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1141', + ), + 2816 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7486', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '32', + 'prev_word_id' => '1141', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '987', + ), + 2817 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7487', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '33', + 'prev_word_id' => '987', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2818 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7488', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '34', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2819 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7489', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '35', + 'prev_word_id' => '1012', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1047', + ), + 2820 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7490', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '36', + 'prev_word_id' => '1047', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2821 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7491', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '37', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2822 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7492', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '38', + 'prev_word_id' => '1099', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1107', + ), + 2823 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7493', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '39', + 'prev_word_id' => '1107', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '996', + ), + 2824 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7494', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '40', + 'prev_word_id' => '996', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2825 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7495', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '41', + 'prev_word_id' => '1165', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1140', + ), + 2826 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7496', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '42', + 'prev_word_id' => '1140', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1172', + ), + 2827 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7497', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '43', + 'prev_word_id' => '1172', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1138', + ), + 2828 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7498', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '44', + 'prev_word_id' => '1138', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1031', + ), + 2829 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7499', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '45', + 'prev_word_id' => '1031', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1106', + ), + 2830 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7500', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '46', + 'prev_word_id' => '1106', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1137', + ), + 2831 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7501', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '47', + 'prev_word_id' => '1137', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1186', + ), + 2832 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7502', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '48', + 'prev_word_id' => '1186', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '987', + ), + 2833 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7503', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '49', + 'prev_word_id' => '987', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2834 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7504', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '50', + 'prev_word_id' => '1171', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1032', + ), + 2835 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7505', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '51', + 'prev_word_id' => '1032', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2836 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7506', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '52', + 'prev_word_id' => '1013', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1208', + ), + 2837 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7507', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '53', + 'prev_word_id' => '1208', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1187', + ), + 2838 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7508', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '54', + 'prev_word_id' => '1187', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1028', + ), + 2839 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7509', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '55', + 'prev_word_id' => '1028', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2840 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7510', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '56', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '986', + ), + 2841 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7511', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '57', + 'prev_word_id' => '986', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1032', + ), + 2842 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7512', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '58', + 'prev_word_id' => '1032', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1100', + ), + 2843 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7513', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '59', + 'prev_word_id' => '1100', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '995', + ), + 2844 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7514', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '60', + 'prev_word_id' => '995', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1166', + ), + 2845 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7515', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '61', + 'prev_word_id' => '1166', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1020', + ), + 2846 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7516', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '62', + 'prev_word_id' => '1020', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1146', + ), + 2847 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7517', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '63', + 'prev_word_id' => '1146', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '810', + ), + 2848 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7518', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '64', + 'prev_word_id' => '810', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '988', + ), + 2849 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7519', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '65', + 'prev_word_id' => '988', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2850 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7520', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '66', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1169', + ), + 2851 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7521', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '67', + 'prev_word_id' => '1169', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1196', + ), + 2852 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7522', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '68', + 'prev_word_id' => '1196', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2853 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7523', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '69', + 'prev_word_id' => '1006', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2854 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7524', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '70', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '994', + ), + 2855 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7525', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '71', + 'prev_word_id' => '994', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1045', + ), + 2856 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7526', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '72', + 'prev_word_id' => '1045', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '998', + ), + 2857 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7527', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '73', + 'prev_word_id' => '998', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1047', + ), + 2858 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7528', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '74', + 'prev_word_id' => '1047', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1167', + ), + 2859 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7529', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '75', + 'prev_word_id' => '1167', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1195', + ), + 2860 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7530', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '76', + 'prev_word_id' => '1195', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2861 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7531', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '77', + 'prev_word_id' => '1158', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1047', + ), + 2862 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7532', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '78', + 'prev_word_id' => '1047', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 2863 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7533', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '79', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1142', + ), + 2864 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7534', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '80', + 'prev_word_id' => '1142', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 2865 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7535', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '81', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1194', + ), + 2866 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7536', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '82', + 'prev_word_id' => '1194', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1198', + ), + 2867 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '101', + 'frequency' => '0', + 'id' => '7537', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '83', + 'prev_word_id' => '1198', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2868 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7538', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2869 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7539', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '1', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1111', + ), + 2870 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7540', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '2', + 'prev_word_id' => '1111', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '982', + ), + 2871 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7541', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '3', + 'prev_word_id' => '982', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '996', + ), + 2872 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7542', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '4', + 'prev_word_id' => '996', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1145', + ), + 2873 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7543', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '5', + 'prev_word_id' => '1145', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1048', + ), + 2874 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7544', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '6', + 'prev_word_id' => '1048', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2875 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7545', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '7', + 'prev_word_id' => '1099', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1171', + ), + 2876 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7546', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '8', + 'prev_word_id' => '1171', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2877 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7547', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '9', + 'prev_word_id' => '1168', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '987', + ), + 2878 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7548', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '10', + 'prev_word_id' => '987', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '992', + ), + 2879 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7549', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '11', + 'prev_word_id' => '992', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '993', + ), + 2880 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7550', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '12', + 'prev_word_id' => '993', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2881 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7551', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '13', + 'prev_word_id' => '1041', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '992', + ), + 2882 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7552', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '14', + 'prev_word_id' => '992', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '993', + ), + 2883 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7553', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '15', + 'prev_word_id' => '993', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2884 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7554', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '16', + 'prev_word_id' => '1041', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '985', + ), + 2885 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7555', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '17', + 'prev_word_id' => '985', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1166', + ), + 2886 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7556', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '18', + 'prev_word_id' => '1166', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2887 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7557', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '19', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1111', + ), + 2888 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7558', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '20', + 'prev_word_id' => '1111', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '982', + ), + 2889 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7559', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '21', + 'prev_word_id' => '982', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '996', + ), + 2890 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7560', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '22', + 'prev_word_id' => '996', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1137', + ), + 2891 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7561', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '23', + 'prev_word_id' => '1137', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 2892 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7562', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '24', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '998', + ), + 2893 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7563', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '25', + 'prev_word_id' => '998', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2894 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7564', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '26', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1198', + ), + 2895 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7565', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '27', + 'prev_word_id' => '1198', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1019', + ), + 2896 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7566', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '28', + 'prev_word_id' => '1019', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2897 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7567', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '29', + 'prev_word_id' => '1040', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '995', + ), + 2898 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7568', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '30', + 'prev_word_id' => '995', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1208', + ), + 2899 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7569', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '31', + 'prev_word_id' => '1208', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1044', + ), + 2900 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7570', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '32', + 'prev_word_id' => '1044', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '998', + ), + 2901 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7571', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '33', + 'prev_word_id' => '998', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1010', + ), + 2902 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7572', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '34', + 'prev_word_id' => '1010', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2903 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7573', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '35', + 'prev_word_id' => '1017', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1101', + ), + 2904 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7574', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '36', + 'prev_word_id' => '1101', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1007', + ), + 2905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '37', + 'prev_word_id' => '1007', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1035', + ), + 2906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '38', + 'prev_word_id' => '1035', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1018', + ), + 2907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '39', + 'prev_word_id' => '1018', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1142', + ), + 2908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '40', + 'prev_word_id' => '1142', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1170', + ), + 2909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '41', + 'prev_word_id' => '1170', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1203', + ), + 2910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '42', + 'prev_word_id' => '1203', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1209', + ), + 2911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '43', + 'prev_word_id' => '1209', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '44', + 'prev_word_id' => '1000', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '996', + ), + 2913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '45', + 'prev_word_id' => '996', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1199', + ), + 2914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '46', + 'prev_word_id' => '1199', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1168', + ), + 2915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '47', + 'prev_word_id' => '1168', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1188', + ), + 2916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '48', + 'prev_word_id' => '1188', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1110', + ), + 2917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '49', + 'prev_word_id' => '1110', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1036', + ), + 2918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '50', + 'prev_word_id' => '1036', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '51', + 'prev_word_id' => '1103', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1110', + ), + 2920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '52', + 'prev_word_id' => '1110', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1106', + ), + 2921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '53', + 'prev_word_id' => '1106', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '54', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '810', + ), + 2923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '55', + 'prev_word_id' => '810', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '986', + ), + 2924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '56', + 'prev_word_id' => '986', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '57', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '58', + 'prev_word_id' => '1165', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1167', + ), + 2927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '59', + 'prev_word_id' => '1167', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1106', + ), + 2928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '60', + 'prev_word_id' => '1106', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '61', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '62', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '63', + 'prev_word_id' => '1012', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1017', + ), + 2932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '64', + 'prev_word_id' => '1017', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1012', + ), + 2933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1242', + 'placement' => '65', + 'prev_word_id' => '1012', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1103', + ), + 2934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '66', + 'prev_word_id' => '1103', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1242', + ), + 2935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '67', + 'prev_word_id' => '1242', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '68', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1138', + ), + 2937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1223', + 'placement' => '69', + 'prev_word_id' => '1138', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1142', + ), + 2938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '70', + 'prev_word_id' => '1142', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1223', + ), + 2939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '71', + 'prev_word_id' => '1223', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '72', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1115', + ), + 2941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1243', + 'placement' => '73', + 'prev_word_id' => '1115', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1118', + ), + 2942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1244', + 'placement' => '74', + 'prev_word_id' => '1118', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1243', + ), + 2943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '75', + 'prev_word_id' => '1243', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1244', + ), + 2944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '76', + 'prev_word_id' => '1244', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1114', + ), + 2945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '77', + 'prev_word_id' => '1114', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '78', + 'prev_word_id' => '1192', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1041', + ), + 2947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '79', + 'prev_word_id' => '1041', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1010', + ), + 2948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '80', + 'prev_word_id' => '1010', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '985', + ), + 2949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '81', + 'prev_word_id' => '985', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1119', + ), + 2950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '82', + 'prev_word_id' => '1119', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1158', + ), + 2951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '83', + 'prev_word_id' => '1158', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '84', + 'prev_word_id' => '1108', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '85', + 'prev_word_id' => '1006', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1000', + ), + 2954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '86', + 'prev_word_id' => '1000', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1192', + ), + 2955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '87', + 'prev_word_id' => '1192', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 2956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '88', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1112', + ), + 2957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '89', + 'prev_word_id' => '1112', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '90', + 'prev_word_id' => '1013', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1111', + ), + 2959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '91', + 'prev_word_id' => '1111', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 2960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '92', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '989', + ), + 2961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '93', + 'prev_word_id' => '989', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '94', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1165', + ), + 2963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '95', + 'prev_word_id' => '1165', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1117', + ), + 2964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '96', + 'prev_word_id' => '1117', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1099', + ), + 2965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '97', + 'prev_word_id' => '1099', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1108', + ), + 2966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '98', + 'prev_word_id' => '1108', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1110', + ), + 2967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '99', + 'prev_word_id' => '1110', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1142', + ), + 2968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '100', + 'prev_word_id' => '1142', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1085', + ), + 2969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '101', + 'prev_word_id' => '1085', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1086', + ), + 2970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '102', + 'prev_word_id' => '1086', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1087', + ), + 2971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '103', + 'prev_word_id' => '1087', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1088', + ), + 2972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '104', + 'prev_word_id' => '1088', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 2973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '105', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1090', + ), + 2974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '106', + 'prev_word_id' => '1090', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1091', + ), + 2975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '107', + 'prev_word_id' => '1091', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1092', + ), + 2976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '108', + 'prev_word_id' => '1092', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1093', + ), + 2977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '109', + 'prev_word_id' => '1093', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1094', + ), + 2978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '110', + 'prev_word_id' => '1094', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1095', + ), + 2979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '111', + 'prev_word_id' => '1095', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1096', + ), + 2980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1151', + 'placement' => '112', + 'prev_word_id' => '1096', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1137', + ), + 2981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '113', + 'prev_word_id' => '1137', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1151', + ), + 2982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '114', + 'prev_word_id' => '1151', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '983', + ), + 2983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '115', + 'prev_word_id' => '983', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1013', + ), + 2984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '116', + 'prev_word_id' => '1013', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1006', + ), + 2985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '117', + 'prev_word_id' => '1006', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1035', + ), + 2986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '118', + 'prev_word_id' => '1035', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1048', + ), + 2987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '119', + 'prev_word_id' => '1048', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1147', + ), + 2988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '120', + 'prev_word_id' => '1147', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1208', + ), + 2989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '121', + 'prev_word_id' => '1208', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1040', + ), + 2990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '122', + 'prev_word_id' => '1040', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1150', + ), + 2991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '123', + 'prev_word_id' => '1150', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1014', + ), + 2992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '124', + 'prev_word_id' => '1014', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 2993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '125', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1016', + ), + 2994 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7664', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '126', + 'prev_word_id' => '1016', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2995 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7665', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '127', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1111', + ), + 2996 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7666', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '128', + 'prev_word_id' => '1111', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 2997 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7667', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1245', + 'placement' => '129', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1111', + ), + 2998 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7668', + 'identifier' => 'publish_date', + 'integer_value' => '1175496180', + 'next_word_id' => '1191', + 'placement' => '130', + 'prev_word_id' => '1111', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1245', + ), + 2999 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '102', + 'frequency' => '0', + 'id' => '7669', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '131', + 'prev_word_id' => '1245', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1191', + ), + 3000 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7670', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1246', + ), + 3001 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7671', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '1', + 'prev_word_id' => '1246', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1247', + ), + 3002 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7672', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '2', + 'prev_word_id' => '1247', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1202', + ), + 3003 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7673', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '3', + 'prev_word_id' => '1202', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1042', + ), + 3004 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7674', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '4', + 'prev_word_id' => '1042', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1040', + ), + 3005 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7675', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '5', + 'prev_word_id' => '1040', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1042', + ), + 3006 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7676', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '6', + 'prev_word_id' => '1042', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1193', + ), + 3007 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7677', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '7', + 'prev_word_id' => '1193', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1117', + ), + 3008 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7678', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '8', + 'prev_word_id' => '1117', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1203', + ), + 3009 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7679', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '9', + 'prev_word_id' => '1203', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '997', + ), + 3010 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7680', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '10', + 'prev_word_id' => '997', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1109', + ), + 3011 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7681', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '11', + 'prev_word_id' => '1109', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1109', + ), + 3012 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7682', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '12', + 'prev_word_id' => '1109', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1052', + ), + 3013 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7683', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '13', + 'prev_word_id' => '1052', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '992', + ), + 3014 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7684', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '14', + 'prev_word_id' => '992', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '993', + ), + 3015 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7685', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '15', + 'prev_word_id' => '993', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1197', + ), + 3016 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7686', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '16', + 'prev_word_id' => '1197', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1188', + ), + 3017 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7687', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '17', + 'prev_word_id' => '1188', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1052', + ), + 3018 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7688', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '18', + 'prev_word_id' => '1052', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 3019 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7689', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '19', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1036', + ), + 3020 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7690', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '20', + 'prev_word_id' => '1036', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1010', + ), + 3021 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7691', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '21', + 'prev_word_id' => '1010', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1170', + ), + 3022 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7692', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '22', + 'prev_word_id' => '1170', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1164', + ), + 3023 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7693', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '23', + 'prev_word_id' => '1164', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1172', + ), + 3024 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7694', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '24', + 'prev_word_id' => '1172', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '996', + ), + 3025 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7695', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '25', + 'prev_word_id' => '996', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1194', + ), + 3026 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7696', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '26', + 'prev_word_id' => '1194', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '990', + ), + 3027 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7697', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1173', + 'placement' => '27', + 'prev_word_id' => '990', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 3028 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7698', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '28', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1173', + ), + 3029 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7699', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '29', + 'prev_word_id' => '1173', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1042', + ), + 3030 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7700', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '30', + 'prev_word_id' => '1042', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1136', + ), + 3031 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7701', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '31', + 'prev_word_id' => '1136', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1170', + ), + 3032 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7702', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '32', + 'prev_word_id' => '1170', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1032', + ), + 3033 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7703', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '33', + 'prev_word_id' => '1032', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1137', + ), + 3034 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7704', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1223', + 'placement' => '34', + 'prev_word_id' => '1137', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1033', + ), + 3035 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7705', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '35', + 'prev_word_id' => '1033', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1223', + ), + 3036 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7706', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '36', + 'prev_word_id' => '1223', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '988', + ), + 3037 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7707', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '37', + 'prev_word_id' => '988', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1014', + ), + 3038 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7708', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '38', + 'prev_word_id' => '1014', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1016', + ), + 3039 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7709', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '39', + 'prev_word_id' => '1016', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1032', + ), + 3040 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7710', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '40', + 'prev_word_id' => '1032', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1198', + ), + 3041 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7711', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '41', + 'prev_word_id' => '1198', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1107', + ), + 3042 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7712', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '42', + 'prev_word_id' => '1107', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1195', + ), + 3043 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7713', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '43', + 'prev_word_id' => '1195', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1188', + ), + 3044 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7714', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '44', + 'prev_word_id' => '1188', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1203', + ), + 3045 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7715', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '45', + 'prev_word_id' => '1203', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 3046 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7716', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '46', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1103', + ), + 3047 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7717', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '47', + 'prev_word_id' => '1103', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1005', + ), + 3048 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7718', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '48', + 'prev_word_id' => '1005', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1110', + ), + 3049 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7719', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '49', + 'prev_word_id' => '1110', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1112', + ), + 3050 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7720', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '50', + 'prev_word_id' => '1112', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1012', + ), + 3051 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7721', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '51', + 'prev_word_id' => '1012', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 3052 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7722', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '52', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1115', + ), + 3053 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7723', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '53', + 'prev_word_id' => '1115', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1006', + ), + 3054 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7724', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '54', + 'prev_word_id' => '1006', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 3055 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7725', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '55', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1196', + ), + 3056 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7726', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '56', + 'prev_word_id' => '1196', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1198', + ), + 3057 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7727', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '57', + 'prev_word_id' => '1198', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1036', + ), + 3058 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7728', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '58', + 'prev_word_id' => '1036', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1099', + ), + 3059 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7729', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '59', + 'prev_word_id' => '1099', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1239', + ), + 3060 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7730', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '60', + 'prev_word_id' => '1239', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1161', + ), + 3061 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7731', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '61', + 'prev_word_id' => '1161', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 3062 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7732', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '62', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1117', + ), + 3063 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7733', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '63', + 'prev_word_id' => '1117', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1158', + ), + 3064 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7734', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '64', + 'prev_word_id' => '1158', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1164', + ), + 3065 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7735', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '65', + 'prev_word_id' => '1164', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1013', + ), + 3066 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7736', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '66', + 'prev_word_id' => '1013', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1103', + ), + 3067 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7737', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '67', + 'prev_word_id' => '1103', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1001', + ), + 3068 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7738', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '68', + 'prev_word_id' => '1001', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1143', + ), + 3069 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7739', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1223', + 'placement' => '69', + 'prev_word_id' => '1143', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1218', + ), + 3070 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7740', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '70', + 'prev_word_id' => '1218', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1223', + ), + 3071 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7741', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '71', + 'prev_word_id' => '1223', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 3072 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7742', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '72', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1045', + ), + 3073 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7743', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1240', + 'placement' => '73', + 'prev_word_id' => '1045', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '995', + ), + 3074 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7744', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '74', + 'prev_word_id' => '995', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1240', + ), + 3075 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7745', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '75', + 'prev_word_id' => '1240', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '995', + ), + 3076 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7746', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '76', + 'prev_word_id' => '995', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1027', + ), + 3077 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7747', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '77', + 'prev_word_id' => '1027', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '981', + ), + 3078 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7748', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '78', + 'prev_word_id' => '981', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '996', + ), + 3079 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7749', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1207', + 'placement' => '79', + 'prev_word_id' => '996', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1149', + ), + 3080 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7750', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '80', + 'prev_word_id' => '1149', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1207', + ), + 3081 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7751', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '81', + 'prev_word_id' => '1207', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 3082 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7752', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '82', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1028', + ), + 3083 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7753', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '83', + 'prev_word_id' => '1028', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 3084 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7754', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '84', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1028', + ), + 3085 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7755', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '85', + 'prev_word_id' => '1028', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1187', + ), + 3086 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7756', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '86', + 'prev_word_id' => '1187', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1208', + ), + 3087 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7757', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '87', + 'prev_word_id' => '1208', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '987', + ), + 3088 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7758', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '88', + 'prev_word_id' => '987', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1169', + ), + 3089 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7759', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '89', + 'prev_word_id' => '1169', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1053', + ), + 3090 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7760', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '90', + 'prev_word_id' => '1053', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '988', + ), + 3091 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7761', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '91', + 'prev_word_id' => '988', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1114', + ), + 3092 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '103', + 'frequency' => '0', + 'id' => '7762', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '92', + 'prev_word_id' => '1114', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1003', + ), + 3093 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7763', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1248', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '912', + ), + 3094 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7764', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '1', + 'prev_word_id' => '912', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1248', + ), + 3095 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7765', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '2', + 'prev_word_id' => '1248', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1000', + ), + 3096 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7766', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '3', + 'prev_word_id' => '1000', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 3097 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7767', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '4', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1164', + ), + 3098 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7768', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '5', + 'prev_word_id' => '1164', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1000', + ), + 3099 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7769', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '6', + 'prev_word_id' => '1000', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1186', + ), + 3100 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7770', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '7', + 'prev_word_id' => '1186', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1043', + ), + 3101 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7771', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '8', + 'prev_word_id' => '1043', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1113', + ), + 3102 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7772', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '9', + 'prev_word_id' => '1113', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1017', + ), + 3103 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7773', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '10', + 'prev_word_id' => '1017', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1156', + ), + 3104 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7774', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '11', + 'prev_word_id' => '1156', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1116', + ), + 3105 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7775', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '12', + 'prev_word_id' => '1116', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1162', + ), + 3106 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7776', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '13', + 'prev_word_id' => '1162', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1220', + ), + 3107 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7777', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '14', + 'prev_word_id' => '1220', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1147', + ), + 3108 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7778', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '15', + 'prev_word_id' => '1147', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 3109 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7779', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '16', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1019', + ), + 3110 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7780', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '17', + 'prev_word_id' => '1019', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1100', + ), + 3111 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7781', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '18', + 'prev_word_id' => '1100', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '997', + ), + 3112 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7782', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '19', + 'prev_word_id' => '997', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1003', + ), + 3113 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7783', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '20', + 'prev_word_id' => '1003', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1005', + ), + 3114 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7784', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '21', + 'prev_word_id' => '1005', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '825', + ), + 3115 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7785', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '22', + 'prev_word_id' => '825', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1158', + ), + 3116 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7786', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '23', + 'prev_word_id' => '1158', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1172', + ), + 3117 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7787', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '24', + 'prev_word_id' => '1172', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '985', + ), + 3118 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7788', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '25', + 'prev_word_id' => '985', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1195', + ), + 3119 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7789', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '26', + 'prev_word_id' => '1195', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1007', + ), + 3120 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7790', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '27', + 'prev_word_id' => '1007', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 3121 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7791', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '28', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1144', + ), + 3122 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7792', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '29', + 'prev_word_id' => '1144', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1019', + ), + 3123 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7793', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '30', + 'prev_word_id' => '1019', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1089', + ), + 3124 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7794', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '31', + 'prev_word_id' => '1089', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '986', + ), + 3125 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7795', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '32', + 'prev_word_id' => '986', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1159', + ), + 3126 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7796', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '33', + 'prev_word_id' => '1159', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1030', + ), + 3127 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7797', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '34', + 'prev_word_id' => '1030', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '999', + ), + 3128 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7798', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '35', + 'prev_word_id' => '999', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1140', + ), + 3129 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7799', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '36', + 'prev_word_id' => '1140', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1164', + ), + 3130 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7800', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '37', + 'prev_word_id' => '1164', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1029', + ), + 3131 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7801', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '38', + 'prev_word_id' => '1029', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1045', + ), + 3132 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7802', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '39', + 'prev_word_id' => '1045', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '987', + ), + 3133 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7803', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '40', + 'prev_word_id' => '987', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1107', + ), + 3134 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7804', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '41', + 'prev_word_id' => '1107', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1006', + ), + 3135 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7805', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '42', + 'prev_word_id' => '1006', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1030', + ), + 3136 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7806', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '43', + 'prev_word_id' => '1030', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1007', + ), + 3137 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7807', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '44', + 'prev_word_id' => '1007', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1187', + ), + 3138 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7808', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '45', + 'prev_word_id' => '1187', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1160', + ), + 3139 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7809', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '46', + 'prev_word_id' => '1160', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1172', + ), + 3140 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7810', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '47', + 'prev_word_id' => '1172', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 3141 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7811', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '48', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1109', + ), + 3142 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7812', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '49', + 'prev_word_id' => '1109', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 3143 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7813', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '50', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1038', + ), + 3144 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7814', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '51', + 'prev_word_id' => '1038', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1189', + ), + 3145 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7815', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '52', + 'prev_word_id' => '1189', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1118', + ), + 3146 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7816', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '53', + 'prev_word_id' => '1118', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '983', + ), + 3147 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7817', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '54', + 'prev_word_id' => '983', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1020', + ), + 3148 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7818', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '55', + 'prev_word_id' => '1020', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '988', + ), + 3149 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7819', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '56', + 'prev_word_id' => '988', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1170', + ), + 3150 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7820', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '57', + 'prev_word_id' => '1170', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '999', + ), + 3151 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7821', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '58', + 'prev_word_id' => '999', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1221', + ), + 3152 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7822', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '59', + 'prev_word_id' => '1221', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '991', + ), + 3153 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7823', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '60', + 'prev_word_id' => '991', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 3154 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7824', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '61', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1160', + ), + 3155 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7825', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '62', + 'prev_word_id' => '1160', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1015', + ), + 3156 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7826', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '63', + 'prev_word_id' => '1015', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1014', + ), + 3157 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7827', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '64', + 'prev_word_id' => '1014', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1145', + ), + 3158 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7828', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '65', + 'prev_word_id' => '1145', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '998', + ), + 3159 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7829', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '66', + 'prev_word_id' => '998', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1113', + ), + 3160 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7830', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '67', + 'prev_word_id' => '1113', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1101', + ), + 3161 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7831', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '68', + 'prev_word_id' => '1101', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1042', + ), + 3162 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7832', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '69', + 'prev_word_id' => '1042', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1053', + ), + 3163 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7833', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '70', + 'prev_word_id' => '1053', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1042', + ), + 3164 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7834', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '71', + 'prev_word_id' => '1042', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1018', + ), + 3165 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7835', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '72', + 'prev_word_id' => '1018', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1188', + ), + 3166 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7836', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '73', + 'prev_word_id' => '1188', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1142', + ), + 3167 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7837', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '74', + 'prev_word_id' => '1142', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '863', + ), + 3168 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7838', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '75', + 'prev_word_id' => '863', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1108', + ), + 3169 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7839', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '76', + 'prev_word_id' => '1108', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1026', + ), + 3170 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7840', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '77', + 'prev_word_id' => '1026', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1049', + ), + 3171 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7841', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '78', + 'prev_word_id' => '1049', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1035', + ), + 3172 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7842', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '79', + 'prev_word_id' => '1035', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1038', + ), + 3173 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7843', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '80', + 'prev_word_id' => '1038', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '998', + ), + 3174 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7844', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '81', + 'prev_word_id' => '998', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1037', + ), + 3175 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7845', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '82', + 'prev_word_id' => '1037', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1011', + ), + 3176 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7846', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '83', + 'prev_word_id' => '1011', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '991', + ), + 3177 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7847', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '84', + 'prev_word_id' => '991', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1171', + ), + 3178 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7848', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '85', + 'prev_word_id' => '1171', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1052', + ), + 3179 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7849', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '86', + 'prev_word_id' => '1052', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '992', + ), + 3180 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7850', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '87', + 'prev_word_id' => '992', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '993', + ), + 3181 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7851', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '88', + 'prev_word_id' => '993', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1032', + ), + 3182 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7852', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '89', + 'prev_word_id' => '1032', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '981', + ), + 3183 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7853', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '90', + 'prev_word_id' => '981', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1188', + ), + 3184 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7854', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '91', + 'prev_word_id' => '1188', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1142', + ), + 3185 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7855', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '92', + 'prev_word_id' => '1142', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1170', + ), + 3186 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7856', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '93', + 'prev_word_id' => '1170', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1014', + ), + 3187 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7857', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '94', + 'prev_word_id' => '1014', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1046', + ), + 3188 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '104', + 'frequency' => '0', + 'id' => '7858', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '95', + 'prev_word_id' => '1046', + 'published' => '1311154184', + 'section_id' => '1', + 'word_id' => '1165', + ), + 3189 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '105', + 'frequency' => '0', + 'id' => '7859', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1250', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1249', + ), + 3190 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '105', + 'frequency' => '0', + 'id' => '7860', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1249', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1250', + ), + 3191 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7861', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '928', + ), + 3192 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7862', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '1', + 'prev_word_id' => '928', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3193 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7863', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '2', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '929', + ), + 3194 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7864', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '3', + 'prev_word_id' => '929', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3195 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7865', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '4', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3196 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7866', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '5', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3197 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7867', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '935', + 'placement' => '6', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '930', + ), + 3198 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7868', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '7', + 'prev_word_id' => '930', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '935', + ), + 3199 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7869', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '8', + 'prev_word_id' => '935', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '930', + ), + 3200 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7870', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '9', + 'prev_word_id' => '930', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '936', + ), + 3201 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7871', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '937', + 'placement' => '10', + 'prev_word_id' => '936', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3202 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7872', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '11', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '937', + ), + 3203 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7873', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '12', + 'prev_word_id' => '937', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3204 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7874', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '13', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3205 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7875', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '14', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '938', + ), + 3206 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7876', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '15', + 'prev_word_id' => '938', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '936', + ), + 3207 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7877', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '16', + 'prev_word_id' => '936', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3208 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7878', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '17', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '939', + ), + 3209 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7879', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '18', + 'prev_word_id' => '939', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '940', + ), + 3210 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7880', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '19', + 'prev_word_id' => '940', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '941', + ), + 3211 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7881', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '20', + 'prev_word_id' => '941', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '936', + ), + 3212 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7882', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '21', + 'prev_word_id' => '936', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3213 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7883', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '942', + 'placement' => '22', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '881', + ), + 3214 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7884', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '23', + 'prev_word_id' => '881', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '942', + ), + 3215 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7885', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '24', + 'prev_word_id' => '942', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '943', + ), + 3216 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7886', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '25', + 'prev_word_id' => '943', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '822', + ), + 3217 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7887', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '26', + 'prev_word_id' => '822', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3218 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7888', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '27', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3219 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7889', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '28', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '931', + ), + 3220 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7890', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '944', + 'placement' => '29', + 'prev_word_id' => '931', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '822', + ), + 3221 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7891', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '30', + 'prev_word_id' => '822', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '944', + ), + 3222 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7892', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '31', + 'prev_word_id' => '944', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '945', + ), + 3223 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7893', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '32', + 'prev_word_id' => '945', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3224 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7894', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '33', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3225 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7895', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '34', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '857', + ), + 3226 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7896', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '35', + 'prev_word_id' => '857', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '932', + ), + 3227 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7897', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '36', + 'prev_word_id' => '932', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '933', + ), + 3228 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7898', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '824', + 'placement' => '37', + 'prev_word_id' => '933', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3229 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7899', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '38', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '824', + ), + 3230 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7900', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '934', + 'placement' => '39', + 'prev_word_id' => '824', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '933', + ), + 3231 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7901', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '946', + 'placement' => '40', + 'prev_word_id' => '933', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '934', + ), + 3232 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7902', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '41', + 'prev_word_id' => '934', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '946', + ), + 3233 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7903', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '947', + 'placement' => '42', + 'prev_word_id' => '946', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3234 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7904', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '43', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '947', + ), + 3235 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7905', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '928', + 'placement' => '44', + 'prev_word_id' => '947', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '921', + ), + 3236 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7906', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '45', + 'prev_word_id' => '921', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '928', + ), + 3237 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7907', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '950', + 'placement' => '46', + 'prev_word_id' => '928', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3238 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7908', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '47', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '950', + ), + 3239 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7909', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '48', + 'prev_word_id' => '950', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1191', + ), + 3240 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '106', + 'frequency' => '0', + 'id' => '7910', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '49', + 'prev_word_id' => '1191', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1191', + ), + 3241 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7911', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1252', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1251', + ), + 3242 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7912', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '1', + 'prev_word_id' => '1251', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1252', + ), + 3243 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7913', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '2', + 'prev_word_id' => '1252', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3244 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7914', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '3', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3245 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7915', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1253', + 'placement' => '4', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3246 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7916', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '5', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1253', + ), + 3247 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7917', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '6', + 'prev_word_id' => '1253', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3248 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7918', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1254', + 'placement' => '7', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3249 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7919', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '8', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1254', + ), + 3250 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7920', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '9', + 'prev_word_id' => '1254', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3251 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7921', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1255', + 'placement' => '10', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3252 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7922', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1256', + 'placement' => '11', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1255', + ), + 3253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '12', + 'prev_word_id' => '1255', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1256', + ), + 3254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '937', + 'placement' => '13', + 'prev_word_id' => '1256', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1257', + ), + 3255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '14', + 'prev_word_id' => '1257', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '937', + ), + 3256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '15', + 'prev_word_id' => '937', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '893', + ), + 3257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '16', + 'prev_word_id' => '893', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '17', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '973', + ), + 3259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '18', + 'prev_word_id' => '973', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1252', + 'placement' => '19', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1251', + ), + 3261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '20', + 'prev_word_id' => '1251', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1252', + ), + 3262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '21', + 'prev_word_id' => '1252', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 3263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '22', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '23', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '24', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1260', + 'placement' => '25', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1259', + ), + 3267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '26', + 'prev_word_id' => '1259', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1260', + ), + 3268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '27', + 'prev_word_id' => '1260', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '910', + ), + 3269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1261', + 'placement' => '28', + 'prev_word_id' => '910', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 3270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '29', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1261', + ), + 3271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '30', + 'prev_word_id' => '1261', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1257', + ), + 3272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1262', + 'placement' => '31', + 'prev_word_id' => '1257', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '32', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1262', + ), + 3274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '33', + 'prev_word_id' => '1262', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 3275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '34', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1263', + ), + 3276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '35', + 'prev_word_id' => '1263', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '36', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '37', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1264', + 'placement' => '38', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 3280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '39', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1264', + ), + 3281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '40', + 'prev_word_id' => '1264', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1265', + 'placement' => '41', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '42', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1265', + ), + 3284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1266', + 'placement' => '43', + 'prev_word_id' => '1265', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '44', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1266', + ), + 3286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1267', + 'placement' => '45', + 'prev_word_id' => '1266', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '46', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1267', + ), + 3288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '47', + 'prev_word_id' => '1267', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 3289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '48', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '936', + ), + 3290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1268', + 'placement' => '49', + 'prev_word_id' => '936', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '50', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1268', + ), + 3292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1252', + 'placement' => '51', + 'prev_word_id' => '1268', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1251', + ), + 3293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '52', + 'prev_word_id' => '1251', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1252', + ), + 3294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1269', + 'placement' => '53', + 'prev_word_id' => '1252', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '906', + ), + 3295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '54', + 'prev_word_id' => '906', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1269', + ), + 3296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '55', + 'prev_word_id' => '1269', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '56', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '882', + ), + 3298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '57', + 'prev_word_id' => '882', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '890', + ), + 3299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '58', + 'prev_word_id' => '890', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '59', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1270', + 'placement' => '60', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1271', + 'placement' => '61', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1270', + ), + 3303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '62', + 'prev_word_id' => '1270', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1271', + ), + 3304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1272', + 'placement' => '63', + 'prev_word_id' => '1271', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1273', + 'placement' => '64', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1272', + ), + 3306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1256', + 'placement' => '65', + 'prev_word_id' => '1272', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1273', + ), + 3307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '66', + 'prev_word_id' => '1273', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1256', + ), + 3308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '847', + 'placement' => '67', + 'prev_word_id' => '1256', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '888', + ), + 3309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '68', + 'prev_word_id' => '888', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '847', + ), + 3310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1274', + 'placement' => '69', + 'prev_word_id' => '847', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 3311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1275', + 'placement' => '70', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1274', + ), + 3312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1276', + 'placement' => '71', + 'prev_word_id' => '1274', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1275', + ), + 3313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '72', + 'prev_word_id' => '1275', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1276', + ), + 3314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '73', + 'prev_word_id' => '1276', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '890', + ), + 3315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '74', + 'prev_word_id' => '890', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1277', + ), + 3316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1278', + 'placement' => '75', + 'prev_word_id' => '1277', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '76', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1278', + ), + 3318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '77', + 'prev_word_id' => '1278', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 3319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '78', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '893', + ), + 3320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1279', + 'placement' => '79', + 'prev_word_id' => '893', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '80', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1279', + ), + 3322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '81', + 'prev_word_id' => '1279', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1280', + ), + 3323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1281', + 'placement' => '82', + 'prev_word_id' => '1280', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '83', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1281', + ), + 3325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '902', + 'placement' => '84', + 'prev_word_id' => '1281', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1282', + 'placement' => '85', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '902', + ), + 3327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1283', + 'placement' => '86', + 'prev_word_id' => '902', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1282', + ), + 3328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '87', + 'prev_word_id' => '1282', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1283', + ), + 3329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '7999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1284', + 'placement' => '88', + 'prev_word_id' => '1283', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '89', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1284', + ), + 3331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1285', + 'placement' => '90', + 'prev_word_id' => '1284', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '898', + ), + 3332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '91', + 'prev_word_id' => '898', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1285', + ), + 3333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '92', + 'prev_word_id' => '1285', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '93', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1286', + 'placement' => '94', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '927', + ), + 3336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '95', + 'prev_word_id' => '927', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1286', + ), + 3337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '96', + 'prev_word_id' => '1286', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '97', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '848', + ), + 3339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '98', + 'prev_word_id' => '848', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '99', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '100', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '101', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '102', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '103', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1289', + 'placement' => '104', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '843', + ), + 3346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '105', + 'prev_word_id' => '843', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1289', + ), + 3347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '106', + 'prev_word_id' => '1289', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 3348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '107', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '873', + 'placement' => '108', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '109', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '873', + ), + 3351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '110', + 'prev_word_id' => '873', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1281', + 'placement' => '111', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '112', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1281', + ), + 3354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '902', + 'placement' => '113', + 'prev_word_id' => '1281', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '114', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '902', + ), + 3356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '115', + 'prev_word_id' => '902', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '906', + ), + 3357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1291', + 'placement' => '116', + 'prev_word_id' => '906', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1292', + 'placement' => '117', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1291', + ), + 3359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1293', + 'placement' => '118', + 'prev_word_id' => '1291', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1292', + ), + 3360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1294', + 'placement' => '119', + 'prev_word_id' => '1292', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1293', + ), + 3361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '120', + 'prev_word_id' => '1293', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1294', + ), + 3362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1295', + 'placement' => '121', + 'prev_word_id' => '1294', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 3363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '122', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1295', + ), + 3364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '123', + 'prev_word_id' => '1295', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '890', + ), + 3365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1296', + 'placement' => '124', + 'prev_word_id' => '890', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1277', + ), + 3366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '125', + 'prev_word_id' => '1277', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1296', + ), + 3367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '126', + 'prev_word_id' => '1296', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1297', + 'placement' => '127', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '128', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1297', + ), + 3370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '922', + 'placement' => '129', + 'prev_word_id' => '1297', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '130', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '922', + ), + 3372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1278', + 'placement' => '131', + 'prev_word_id' => '922', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '132', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1278', + ), + 3374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '133', + 'prev_word_id' => '1278', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1298', + 'placement' => '134', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 3376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1299', + 'placement' => '135', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1298', + ), + 3377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '136', + 'prev_word_id' => '1298', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1299', + ), + 3378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '137', + 'prev_word_id' => '1299', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '138', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1300', + ), + 3380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '139', + 'prev_word_id' => '1300', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '140', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '812', + 'placement' => '141', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '142', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '812', + ), + 3384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '143', + 'prev_word_id' => '812', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '144', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '968', + ), + 3386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '145', + 'prev_word_id' => '968', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '146', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1302', + 'placement' => '147', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '148', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1302', + ), + 3390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '149', + 'prev_word_id' => '1302', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '150', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1303', + 'placement' => '151', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '152', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1303', + ), + 3394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '153', + 'prev_word_id' => '1303', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '154', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1304', + 'placement' => '155', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '156', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1304', + ), + 3398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '157', + 'prev_word_id' => '1304', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '158', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '159', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '160', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '938', + ), + 3402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '161', + 'prev_word_id' => '938', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '162', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '163', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '164', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '908', + 'placement' => '165', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '938', + ), + 3407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '166', + 'prev_word_id' => '938', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '908', + ), + 3408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1305', + 'placement' => '167', + 'prev_word_id' => '908', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1306', + 'placement' => '168', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1305', + ), + 3410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '169', + 'prev_word_id' => '1305', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1306', + ), + 3411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '170', + 'prev_word_id' => '1306', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '870', + ), + 3412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '171', + 'prev_word_id' => '870', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1307', + ), + 3413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1308', + 'placement' => '172', + 'prev_word_id' => '1307', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '901', + ), + 3414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '173', + 'prev_word_id' => '901', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1308', + ), + 3415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1309', + 'placement' => '174', + 'prev_word_id' => '1308', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '175', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1309', + ), + 3417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '176', + 'prev_word_id' => '1309', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '177', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '178', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '179', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '821', + ), + 3421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '180', + 'prev_word_id' => '821', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '822', + ), + 3422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '181', + 'prev_word_id' => '822', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '182', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '183', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '824', + 'placement' => '184', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '185', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '824', + ), + 3427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '186', + 'prev_word_id' => '824', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '187', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '188', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '189', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '190', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '897', + ), + 3432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '191', + 'prev_word_id' => '897', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '192', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '193', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '908', + 'placement' => '194', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 3436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '195', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '908', + ), + 3437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '196', + 'prev_word_id' => '908', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '197', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1310', + ), + 3439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1311', + 'placement' => '198', + 'prev_word_id' => '1310', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '199', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1311', + ), + 3441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1312', + 'placement' => '200', + 'prev_word_id' => '1311', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1313', + 'placement' => '201', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1312', + ), + 3443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '202', + 'prev_word_id' => '1312', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1313', + ), + 3444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '203', + 'prev_word_id' => '1313', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1314', + 'placement' => '204', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '205', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1314', + ), + 3447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '206', + 'prev_word_id' => '1314', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '207', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '208', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '908', + 'placement' => '209', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 3451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '210', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '908', + ), + 3452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '211', + 'prev_word_id' => '908', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '212', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1310', + ), + 3454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1315', + 'placement' => '213', + 'prev_word_id' => '1310', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '214', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1315', + ), + 3456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '215', + 'prev_word_id' => '1315', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1316', + 'placement' => '216', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '885', + 'placement' => '217', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1316', + ), + 3459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '218', + 'prev_word_id' => '1316', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '885', + ), + 3460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '219', + 'prev_word_id' => '885', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1317', + ), + 3461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '220', + 'prev_word_id' => '1317', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1318', + ), + 3462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '221', + 'prev_word_id' => '1318', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1319', + ), + 3463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '222', + 'prev_word_id' => '1319', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '223', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1310', + ), + 3465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '224', + 'prev_word_id' => '1310', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1320', + ), + 3466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1279', + 'placement' => '225', + 'prev_word_id' => '1320', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '226', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1279', + ), + 3468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '227', + 'prev_word_id' => '1279', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1280', + ), + 3469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '228', + 'prev_word_id' => '1280', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '229', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1257', + ), + 3471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1321', + 'placement' => '230', + 'prev_word_id' => '1257', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 3472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1322', + 'placement' => '231', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1321', + ), + 3473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '232', + 'prev_word_id' => '1321', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1322', + ), + 3474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1324', + 'placement' => '233', + 'prev_word_id' => '1322', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1323', + ), + 3475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '234', + 'prev_word_id' => '1323', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1324', + ), + 3476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '235', + 'prev_word_id' => '1324', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '236', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '237', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '238', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1325', + 'placement' => '239', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '908', + 'placement' => '240', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1325', + ), + 3482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1326', + 'placement' => '241', + 'prev_word_id' => '1325', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '908', + ), + 3483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1304', + 'placement' => '242', + 'prev_word_id' => '908', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1326', + ), + 3484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '243', + 'prev_word_id' => '1326', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1304', + ), + 3485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '244', + 'prev_word_id' => '1304', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1327', + 'placement' => '245', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 3487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1328', + 'placement' => '246', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1327', + ), + 3488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '247', + 'prev_word_id' => '1327', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1328', + ), + 3489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1329', + 'placement' => '248', + 'prev_word_id' => '1328', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '249', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1329', + ), + 3491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '250', + 'prev_word_id' => '1329', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1327', + 'placement' => '251', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 3493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '252', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1327', + ), + 3494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '253', + 'prev_word_id' => '1327', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '254', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '255', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '256', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 3498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1330', + 'placement' => '257', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '845', + 'placement' => '258', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1330', + ), + 3500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '259', + 'prev_word_id' => '1330', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '845', + ), + 3501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1331', + 'placement' => '260', + 'prev_word_id' => '845', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 3502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '261', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1331', + ), + 3503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '262', + 'prev_word_id' => '1331', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 3504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '263', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '264', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '265', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '266', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1332', + 'placement' => '267', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1310', + ), + 3509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1333', + 'placement' => '268', + 'prev_word_id' => '1310', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1332', + ), + 3510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '269', + 'prev_word_id' => '1332', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1333', + ), + 3511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '270', + 'prev_word_id' => '1333', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '271', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '272', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1318', + ), + 3514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '273', + 'prev_word_id' => '1318', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1334', + 'placement' => '274', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 3516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '275', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1334', + ), + 3517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '276', + 'prev_word_id' => '1334', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 3518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '277', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '278', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1302', + 'placement' => '279', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '280', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1302', + ), + 3522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '281', + 'prev_word_id' => '1302', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1332', + 'placement' => '282', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1333', + 'placement' => '283', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1332', + ), + 3525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '284', + 'prev_word_id' => '1332', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1333', + ), + 3526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '285', + 'prev_word_id' => '1333', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '286', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1335', + 'placement' => '287', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 3529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '288', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1335', + ), + 3530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '289', + 'prev_word_id' => '1335', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1277', + ), + 3531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '290', + 'prev_word_id' => '1277', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '898', + ), + 3532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '291', + 'prev_word_id' => '898', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1336', + ), + 3533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '934', + 'placement' => '292', + 'prev_word_id' => '1336', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 3534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '293', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '934', + ), + 3535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '294', + 'prev_word_id' => '934', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '295', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '296', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '297', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1337', + ), + 3539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '298', + 'prev_word_id' => '1337', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '299', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '300', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '301', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '928', + 'placement' => '302', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '303', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '928', + ), + 3545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '304', + 'prev_word_id' => '928', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1338', + 'placement' => '305', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '306', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1338', + ), + 3548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1079', + 'placement' => '307', + 'prev_word_id' => '1338', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 3549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1339', + 'placement' => '308', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1079', + ), + 3550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '309', + 'prev_word_id' => '1079', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1339', + ), + 3551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1340', + 'placement' => '310', + 'prev_word_id' => '1339', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1341', + 'placement' => '311', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1340', + ), + 3553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '922', + 'placement' => '312', + 'prev_word_id' => '1340', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1341', + ), + 3554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '313', + 'prev_word_id' => '1341', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '922', + ), + 3555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '314', + 'prev_word_id' => '922', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 3556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '315', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '316', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '317', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1022', + 'placement' => '318', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1272', + 'placement' => '319', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1022', + ), + 3561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '320', + 'prev_word_id' => '1022', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1272', + ), + 3562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '321', + 'prev_word_id' => '1272', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '322', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1342', + ), + 3564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1343', + 'placement' => '323', + 'prev_word_id' => '1342', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 3565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '324', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1343', + ), + 3566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1344', + 'placement' => '325', + 'prev_word_id' => '1343', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '326', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1344', + ), + 3568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1345', + 'placement' => '327', + 'prev_word_id' => '1344', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '328', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1345', + ), + 3570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1346', + 'placement' => '329', + 'prev_word_id' => '1345', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '330', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1346', + ), + 3572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '877', + 'placement' => '331', + 'prev_word_id' => '1346', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1079', + 'placement' => '332', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '877', + ), + 3574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '333', + 'prev_word_id' => '877', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1079', + ), + 3575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1286', + 'placement' => '334', + 'prev_word_id' => '1079', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1008', + ), + 3576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '335', + 'prev_word_id' => '1008', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1286', + ), + 3577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '336', + 'prev_word_id' => '1286', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 3578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '337', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1347', + 'placement' => '338', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 3580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1348', + 'placement' => '339', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1347', + ), + 3581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '340', + 'prev_word_id' => '1347', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1348', + ), + 3582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '341', + 'prev_word_id' => '1348', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 3583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '342', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '890', + ), + 3584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '343', + 'prev_word_id' => '890', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '921', + ), + 3585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '344', + 'prev_word_id' => '921', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 3586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '345', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 3587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '346', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 3588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '347', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1257', + ), + 3589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1335', + 'placement' => '348', + 'prev_word_id' => '1257', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 3590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1350', + 'placement' => '349', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1335', + ), + 3591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '350', + 'prev_word_id' => '1335', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1350', + ), + 3592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '934', + 'placement' => '351', + 'prev_word_id' => '1350', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '352', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '934', + ), + 3594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '353', + 'prev_word_id' => '934', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '354', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '355', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '356', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1351', + 'placement' => '357', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1352', + 'placement' => '358', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1351', + ), + 3600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '359', + 'prev_word_id' => '1351', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1352', + ), + 3601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1353', + 'placement' => '360', + 'prev_word_id' => '1352', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 3602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1354', + 'placement' => '361', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1353', + ), + 3603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1355', + 'placement' => '362', + 'prev_word_id' => '1353', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1354', + ), + 3604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '363', + 'prev_word_id' => '1354', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1355', + ), + 3605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '364', + 'prev_word_id' => '1355', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 3606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '365', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1310', + ), + 3607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1351', + 'placement' => '366', + 'prev_word_id' => '1310', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1352', + 'placement' => '367', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1351', + ), + 3609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1356', + 'placement' => '368', + 'prev_word_id' => '1351', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1352', + ), + 3610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1357', + 'placement' => '369', + 'prev_word_id' => '1352', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1356', + ), + 3611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '370', + 'prev_word_id' => '1356', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1357', + ), + 3612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '371', + 'prev_word_id' => '1357', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '372', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '373', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '374', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '375', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1358', + ), + 3617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '376', + 'prev_word_id' => '1358', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 3618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '377', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1359', + ), + 3619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '378', + 'prev_word_id' => '1359', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 3620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '379', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1360', + 'placement' => '380', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '381', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1360', + ), + 3623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '382', + 'prev_word_id' => '1360', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1353', + 'placement' => '383', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1361', + 'placement' => '384', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1353', + ), + 3626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1362', + 'placement' => '385', + 'prev_word_id' => '1353', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1361', + ), + 3627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '386', + 'prev_word_id' => '1361', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1362', + ), + 3628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '387', + 'prev_word_id' => '1362', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1360', + 'placement' => '388', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1358', + ), + 3630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '389', + 'prev_word_id' => '1358', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1360', + ), + 3631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '390', + 'prev_word_id' => '1360', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1353', + 'placement' => '391', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1361', + 'placement' => '392', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1353', + ), + 3634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1363', + 'placement' => '393', + 'prev_word_id' => '1353', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1361', + ), + 3635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1282', + 'placement' => '394', + 'prev_word_id' => '1361', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1363', + ), + 3636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1283', + 'placement' => '395', + 'prev_word_id' => '1363', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1282', + ), + 3637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '396', + 'prev_word_id' => '1282', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1283', + ), + 3638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1364', + 'placement' => '397', + 'prev_word_id' => '1283', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '398', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1364', + ), + 3640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1352', + 'placement' => '399', + 'prev_word_id' => '1364', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1365', + 'placement' => '400', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1352', + ), + 3642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '401', + 'prev_word_id' => '1352', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1365', + ), + 3643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '402', + 'prev_word_id' => '1365', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1366', + ), + 3644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '403', + 'prev_word_id' => '1366', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1367', + 'placement' => '404', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '405', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1367', + ), + 3647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '884', + 'placement' => '406', + 'prev_word_id' => '1367', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1343', + 'placement' => '407', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '884', + ), + 3649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '408', + 'prev_word_id' => '884', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1343', + ), + 3650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '409', + 'prev_word_id' => '1343', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '410', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '910', + ), + 3652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '411', + 'prev_word_id' => '910', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '412', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1368', + ), + 3654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '413', + 'prev_word_id' => '1368', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 3655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '903', + 'placement' => '414', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 3656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '415', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '903', + ), + 3657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1369', + 'placement' => '416', + 'prev_word_id' => '903', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 3658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '417', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1369', + ), + 3659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '418', + 'prev_word_id' => '1369', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1370', + ), + 3660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '419', + 'prev_word_id' => '1370', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '420', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '909', + 'placement' => '421', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '422', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '909', + ), + 3664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '423', + 'prev_word_id' => '909', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '898', + ), + 3665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '424', + 'prev_word_id' => '898', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1353', + 'placement' => '425', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1371', + 'placement' => '426', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1353', + ), + 3668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '427', + 'prev_word_id' => '1353', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1371', + ), + 3669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '428', + 'prev_word_id' => '1371', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '429', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1372', + 'placement' => '430', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 3672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '431', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1372', + ), + 3673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1373', + 'placement' => '432', + 'prev_word_id' => '1372', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '433', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1373', + ), + 3675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '434', + 'prev_word_id' => '1373', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 3676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '435', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1374', + 'placement' => '436', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '898', + ), + 3678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1265', + 'placement' => '437', + 'prev_word_id' => '898', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1374', + ), + 3679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '438', + 'prev_word_id' => '1374', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1265', + ), + 3680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '827', + 'placement' => '439', + 'prev_word_id' => '1265', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1353', + 'placement' => '440', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '827', + ), + 3682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1375', + 'placement' => '441', + 'prev_word_id' => '827', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1353', + ), + 3683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1376', + 'placement' => '442', + 'prev_word_id' => '1353', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1375', + ), + 3684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1377', + 'placement' => '443', + 'prev_word_id' => '1375', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1376', + ), + 3685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1378', + 'placement' => '444', + 'prev_word_id' => '1376', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1377', + ), + 3686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1379', + 'placement' => '445', + 'prev_word_id' => '1377', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1378', + ), + 3687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '446', + 'prev_word_id' => '1378', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1379', + ), + 3688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '447', + 'prev_word_id' => '1379', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1271', + 'placement' => '448', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '449', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1271', + ), + 3691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1380', + 'placement' => '450', + 'prev_word_id' => '1271', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1381', + 'placement' => '451', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1380', + ), + 3693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1382', + 'placement' => '452', + 'prev_word_id' => '1380', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1381', + ), + 3694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '453', + 'prev_word_id' => '1381', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1382', + ), + 3695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1383', + 'placement' => '454', + 'prev_word_id' => '1382', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 3696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '455', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1383', + ), + 3697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '456', + 'prev_word_id' => '1383', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1384', + ), + 3698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '457', + 'prev_word_id' => '1384', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1253', + 'placement' => '458', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1385', + ), + 3700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '459', + 'prev_word_id' => '1385', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1253', + ), + 3701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1386', + 'placement' => '460', + 'prev_word_id' => '1253', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '461', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1386', + ), + 3703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '462', + 'prev_word_id' => '1386', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1298', + 'placement' => '463', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '464', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1298', + ), + 3706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '465', + 'prev_word_id' => '1298', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1277', + ), + 3707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '466', + 'prev_word_id' => '1277', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '467', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '468', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '469', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1315', + 'placement' => '470', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1387', + 'placement' => '471', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1315', + ), + 3713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1388', + 'placement' => '472', + 'prev_word_id' => '1315', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1387', + ), + 3714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1389', + 'placement' => '473', + 'prev_word_id' => '1387', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1388', + ), + 3715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1390', + 'placement' => '474', + 'prev_word_id' => '1388', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1389', + ), + 3716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '475', + 'prev_word_id' => '1389', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1390', + ), + 3717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1391', + 'placement' => '476', + 'prev_word_id' => '1390', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1392', + 'placement' => '477', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1391', + ), + 3719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1381', + 'placement' => '478', + 'prev_word_id' => '1391', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1392', + ), + 3720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1382', + 'placement' => '479', + 'prev_word_id' => '1392', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1381', + ), + 3721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '480', + 'prev_word_id' => '1381', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1382', + ), + 3722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '481', + 'prev_word_id' => '1382', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '482', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1393', + 'placement' => '483', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1382', + 'placement' => '484', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1393', + ), + 3726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1394', + 'placement' => '485', + 'prev_word_id' => '1393', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1382', + ), + 3727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1395', + 'placement' => '486', + 'prev_word_id' => '1382', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1394', + ), + 3728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '487', + 'prev_word_id' => '1394', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1395', + ), + 3729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '488', + 'prev_word_id' => '1395', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 3730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '489', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1320', + ), + 3731 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1397', + 'placement' => '490', + 'prev_word_id' => '1320', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1396', + ), + 3732 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '491', + 'prev_word_id' => '1396', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1397', + ), + 3733 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '492', + 'prev_word_id' => '1397', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '828', + ), + 3734 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1398', + 'placement' => '493', + 'prev_word_id' => '828', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3735 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1271', + 'placement' => '494', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1398', + ), + 3736 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1399', + 'placement' => '495', + 'prev_word_id' => '1398', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1271', + ), + 3737 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1400', + 'placement' => '496', + 'prev_word_id' => '1271', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1399', + ), + 3738 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '497', + 'prev_word_id' => '1399', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1400', + ), + 3739 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '498', + 'prev_word_id' => '1400', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3740 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1401', + 'placement' => '499', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3741 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1402', + 'placement' => '500', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1401', + ), + 3742 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1282', + 'placement' => '501', + 'prev_word_id' => '1401', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1402', + ), + 3743 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1283', + 'placement' => '502', + 'prev_word_id' => '1402', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1282', + ), + 3744 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '503', + 'prev_word_id' => '1282', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1283', + ), + 3745 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1403', + 'placement' => '504', + 'prev_word_id' => '1283', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3746 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '505', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1403', + ), + 3747 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '506', + 'prev_word_id' => '1403', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 3748 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '507', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3749 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '508', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3750 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1401', + 'placement' => '509', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3751 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1265', + 'placement' => '510', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1401', + ), + 3752 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '511', + 'prev_word_id' => '1401', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1265', + ), + 3753 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8423', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '512', + 'prev_word_id' => '1265', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3754 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8424', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '513', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '843', + ), + 3755 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8425', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '514', + 'prev_word_id' => '843', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1317', + ), + 3756 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8426', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '515', + 'prev_word_id' => '1317', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1404', + ), + 3757 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8427', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '516', + 'prev_word_id' => '1404', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 3758 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8428', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1405', + 'placement' => '517', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3759 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8429', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1406', + 'placement' => '518', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1405', + ), + 3760 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1407', + 'placement' => '519', + 'prev_word_id' => '1405', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1406', + ), + 3761 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1408', + 'placement' => '520', + 'prev_word_id' => '1406', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1407', + ), + 3762 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1398', + 'placement' => '521', + 'prev_word_id' => '1407', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1408', + ), + 3763 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '522', + 'prev_word_id' => '1408', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1398', + ), + 3764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1409', + 'placement' => '523', + 'prev_word_id' => '1398', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 3765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '524', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1409', + ), + 3766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '525', + 'prev_word_id' => '1409', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 3767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '526', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 3768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '527', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1373', + 'placement' => '528', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '912', + ), + 3770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1411', + 'placement' => '529', + 'prev_word_id' => '912', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1373', + ), + 3771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1412', + 'placement' => '530', + 'prev_word_id' => '1373', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1411', + ), + 3772 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1413', + 'placement' => '531', + 'prev_word_id' => '1411', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1412', + ), + 3773 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '532', + 'prev_word_id' => '1412', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1413', + ), + 3774 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1353', + 'placement' => '533', + 'prev_word_id' => '1413', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1414', + ), + 3775 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '534', + 'prev_word_id' => '1414', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1353', + ), + 3776 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1254', + 'placement' => '535', + 'prev_word_id' => '1353', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 3777 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1415', + 'placement' => '536', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1254', + ), + 3778 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '537', + 'prev_word_id' => '1254', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1415', + ), + 3779 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1416', + 'placement' => '538', + 'prev_word_id' => '1415', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '921', + ), + 3780 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '539', + 'prev_word_id' => '921', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1416', + ), + 3781 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '540', + 'prev_word_id' => '1416', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1417', + ), + 3782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '541', + 'prev_word_id' => '1417', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '843', + ), + 3783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1418', + 'placement' => '542', + 'prev_word_id' => '843', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 3784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '543', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1418', + ), + 3785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '883', + 'placement' => '544', + 'prev_word_id' => '1418', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 3786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1419', + 'placement' => '545', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '883', + ), + 3787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '546', + 'prev_word_id' => '883', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1419', + ), + 3788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1401', + 'placement' => '547', + 'prev_word_id' => '1419', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1420', + ), + 3789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1265', + 'placement' => '548', + 'prev_word_id' => '1420', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1401', + ), + 3790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1421', + 'placement' => '549', + 'prev_word_id' => '1401', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1265', + ), + 3791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '550', + 'prev_word_id' => '1265', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1421', + ), + 3792 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1422', + 'placement' => '551', + 'prev_word_id' => '1421', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3793 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1423', + 'placement' => '552', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1422', + ), + 3794 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '553', + 'prev_word_id' => '1422', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1423', + ), + 3795 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1424', + 'placement' => '554', + 'prev_word_id' => '1423', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1008', + ), + 3796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1425', + 'placement' => '555', + 'prev_word_id' => '1008', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1424', + ), + 3797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1426', + 'placement' => '556', + 'prev_word_id' => '1424', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1425', + ), + 3798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '557', + 'prev_word_id' => '1425', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1426', + ), + 3799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '558', + 'prev_word_id' => '1426', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 3800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '559', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '560', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '561', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1259', + ), + 3803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1427', + 'placement' => '562', + 'prev_word_id' => '1259', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '834', + ), + 3804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '563', + 'prev_word_id' => '834', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1427', + ), + 3805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '564', + 'prev_word_id' => '1427', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '893', + ), + 3806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '565', + 'prev_word_id' => '893', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1428', + 'placement' => '566', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 3808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '567', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1428', + ), + 3809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1422', + 'placement' => '568', + 'prev_word_id' => '1428', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '569', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1422', + ), + 3811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '570', + 'prev_word_id' => '1422', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 3812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '571', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '901', + ), + 3813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1430', + 'placement' => '572', + 'prev_word_id' => '901', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1429', + ), + 3814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '573', + 'prev_word_id' => '1429', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1430', + ), + 3815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1295', + 'placement' => '574', + 'prev_word_id' => '1430', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 3816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '575', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1295', + ), + 3817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '576', + 'prev_word_id' => '1295', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1280', + ), + 3818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '577', + 'prev_word_id' => '1280', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1431', + 'placement' => '578', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 3820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '579', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1431', + ), + 3821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '580', + 'prev_word_id' => '1431', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 3822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1432', + 'placement' => '581', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1433', + 'placement' => '582', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1432', + ), + 3824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1434', + 'placement' => '583', + 'prev_word_id' => '1432', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1433', + ), + 3825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1435', + 'placement' => '584', + 'prev_word_id' => '1433', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1434', + ), + 3826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '585', + 'prev_word_id' => '1434', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1435', + ), + 3827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '586', + 'prev_word_id' => '1435', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 3828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '587', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '588', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 3830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '589', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 3831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1436', + 'placement' => '590', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '888', + ), + 3832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '591', + 'prev_word_id' => '888', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1436', + ), + 3833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '592', + 'prev_word_id' => '1436', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 3834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '593', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1437', + ), + 3835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '594', + 'prev_word_id' => '1437', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 3836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '595', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '596', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1405', + 'placement' => '597', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1406', + 'placement' => '598', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1405', + ), + 3840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1407', + 'placement' => '599', + 'prev_word_id' => '1405', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1406', + ), + 3841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1408', + 'placement' => '600', + 'prev_word_id' => '1406', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1407', + ), + 3842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1438', + 'placement' => '601', + 'prev_word_id' => '1407', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1408', + ), + 3843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '602', + 'prev_word_id' => '1408', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1438', + ), + 3844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '603', + 'prev_word_id' => '1438', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '604', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1439', + 'placement' => '605', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '606', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1439', + ), + 3848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '607', + 'prev_word_id' => '1439', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '608', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 3850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1440', + 'placement' => '609', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 3851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '610', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1440', + ), + 3852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '611', + 'prev_word_id' => '1440', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1277', + ), + 3853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '612', + 'prev_word_id' => '1277', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '613', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 3855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '614', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 3856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1441', + 'placement' => '615', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 3857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '616', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1441', + ), + 3858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '617', + 'prev_word_id' => '1441', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '825', + ), + 3859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1442', + 'placement' => '618', + 'prev_word_id' => '825', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 3860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '619', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1442', + ), + 3861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '620', + 'prev_word_id' => '1442', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1443', + ), + 3862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '878', + 'placement' => '621', + 'prev_word_id' => '1443', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '622', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '878', + ), + 3864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1444', + 'placement' => '623', + 'prev_word_id' => '878', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '624', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1444', + ), + 3866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '625', + 'prev_word_id' => '1444', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '626', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '627', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '628', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '629', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1446', + 'placement' => '630', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '908', + 'placement' => '631', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1446', + ), + 3873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '878', + 'placement' => '632', + 'prev_word_id' => '1446', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '908', + ), + 3874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '633', + 'prev_word_id' => '908', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '878', + ), + 3875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '634', + 'prev_word_id' => '878', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1447', + ), + 3876 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '635', + 'prev_word_id' => '1447', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3877 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '636', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3878 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '637', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3879 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '638', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3880 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '639', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3881 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1448', + 'placement' => '640', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3882 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '641', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1448', + ), + 3883 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '642', + 'prev_word_id' => '1448', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1337', + ), + 3884 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '928', + 'placement' => '643', + 'prev_word_id' => '1337', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3885 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '644', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '928', + ), + 3886 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '645', + 'prev_word_id' => '928', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3887 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '646', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3888 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '647', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3889 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '648', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3890 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '649', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '650', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1253', + 'placement' => '651', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1337', + ), + 3893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '652', + 'prev_word_id' => '1337', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1253', + ), + 3894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '653', + 'prev_word_id' => '1253', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '654', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '655', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '656', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '657', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1253', + 'placement' => '658', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '659', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1253', + ), + 3901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '660', + 'prev_word_id' => '1253', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1303', + 'placement' => '661', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '662', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1303', + ), + 3904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '663', + 'prev_word_id' => '1303', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '664', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '665', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '666', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '667', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1449', + 'placement' => '668', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '669', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1449', + ), + 3911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '670', + 'prev_word_id' => '1449', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1450', + 'placement' => '671', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '672', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1450', + ), + 3914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '673', + 'prev_word_id' => '1450', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '674', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '675', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '676', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '677', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1451', + 'placement' => '678', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '679', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1451', + ), + 3921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '680', + 'prev_word_id' => '1451', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '681', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '682', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '938', + ), + 3924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '683', + 'prev_word_id' => '938', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '684', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '685', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '686', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '687', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1452', + 'placement' => '688', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '689', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1452', + ), + 3931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '690', + 'prev_word_id' => '1452', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1328', + 'placement' => '691', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '692', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1328', + ), + 3934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '693', + 'prev_word_id' => '1328', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '694', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '695', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '696', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '697', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1453', + 'placement' => '698', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '699', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1453', + ), + 3941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '700', + 'prev_word_id' => '1453', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1302', + 'placement' => '701', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '702', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1302', + ), + 3944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '703', + 'prev_word_id' => '1302', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '704', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '705', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '706', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '707', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1454', + 'placement' => '708', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '709', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1454', + ), + 3951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '710', + 'prev_word_id' => '1454', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1299', + 'placement' => '711', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '712', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1299', + ), + 3954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '713', + 'prev_word_id' => '1299', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '714', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1300', + ), + 3956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '715', + 'prev_word_id' => '1300', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '716', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '717', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1455', + 'placement' => '718', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '719', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1455', + ), + 3961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '720', + 'prev_word_id' => '1455', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '812', + 'placement' => '721', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '722', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '812', + ), + 3964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '723', + 'prev_word_id' => '812', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 3965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '724', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '968', + ), + 3966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '725', + 'prev_word_id' => '968', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '726', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '727', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '728', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '729', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1456', + 'placement' => '730', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '731', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1456', + ), + 3973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '732', + 'prev_word_id' => '1456', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1304', + 'placement' => '733', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '734', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1304', + ), + 3976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '735', + 'prev_word_id' => '1304', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '736', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '737', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '738', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '739', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1457', + 'placement' => '740', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '741', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1457', + ), + 3983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '742', + 'prev_word_id' => '1457', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 3984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1458', + 'placement' => '743', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1061', + ), + 3985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '744', + 'prev_word_id' => '1061', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1458', + ), + 3986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '745', + 'prev_word_id' => '1458', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '746', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '747', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '748', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '749', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1459', + 'placement' => '750', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 3992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1460', + 'placement' => '751', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1459', + ), + 3993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '752', + 'prev_word_id' => '1459', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1460', + ), + 3994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '753', + 'prev_word_id' => '1460', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 3995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '754', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 3996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '755', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 3997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '756', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 3998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '757', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1301', + ), + 3999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1460', + 'placement' => '758', + 'prev_word_id' => '1301', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1445', + ), + 4000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '759', + 'prev_word_id' => '1445', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1460', + ), + 4001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '760', + 'prev_word_id' => '1460', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1461', + 'placement' => '761', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1462', + 'placement' => '762', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1461', + ), + 4004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1399', + 'placement' => '763', + 'prev_word_id' => '1461', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1462', + ), + 4005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1400', + 'placement' => '764', + 'prev_word_id' => '1462', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1399', + ), + 4006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '765', + 'prev_word_id' => '1399', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1400', + ), + 4007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '766', + 'prev_word_id' => '1400', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1327', + 'placement' => '767', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '768', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1327', + ), + 4010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1440', + 'placement' => '769', + 'prev_word_id' => '1327', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1259', + ), + 4011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '770', + 'prev_word_id' => '1259', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1440', + ), + 4012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1278', + 'placement' => '771', + 'prev_word_id' => '1440', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1008', + ), + 4013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '772', + 'prev_word_id' => '1008', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1278', + ), + 4014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '773', + 'prev_word_id' => '1278', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1463', + 'placement' => '774', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '775', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1463', + ), + 4017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1464', + 'placement' => '776', + 'prev_word_id' => '1463', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '882', + ), + 4018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1465', + 'placement' => '777', + 'prev_word_id' => '882', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1464', + ), + 4019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1466', + 'placement' => '778', + 'prev_word_id' => '1464', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1465', + ), + 4020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1467', + 'placement' => '779', + 'prev_word_id' => '1465', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1466', + ), + 4021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '780', + 'prev_word_id' => '1466', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1467', + ), + 4022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1254', + 'placement' => '781', + 'prev_word_id' => '1467', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1468', + 'placement' => '782', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1254', + ), + 4024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '783', + 'prev_word_id' => '1254', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1468', + ), + 4025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '784', + 'prev_word_id' => '1468', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1384', + ), + 4026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '785', + 'prev_word_id' => '1384', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '786', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1385', + ), + 4028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1469', + 'placement' => '787', + 'prev_word_id' => '1385', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 4029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1282', + 'placement' => '788', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1469', + ), + 4030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1283', + 'placement' => '789', + 'prev_word_id' => '1469', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1282', + ), + 4031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '790', + 'prev_word_id' => '1282', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1283', + ), + 4032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1364', + 'placement' => '791', + 'prev_word_id' => '1283', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '792', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1364', + ), + 4034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1470', + 'placement' => '793', + 'prev_word_id' => '1364', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 4035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '794', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1470', + ), + 4036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '795', + 'prev_word_id' => '1470', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1471', + 'placement' => '796', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1472', + 'placement' => '797', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1471', + ), + 4039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '979', + 'placement' => '798', + 'prev_word_id' => '1471', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1472', + ), + 4040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '799', + 'prev_word_id' => '1472', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '979', + ), + 4041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '800', + 'prev_word_id' => '979', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 4042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1439', + 'placement' => '801', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '802', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1439', + ), + 4044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1254', + 'placement' => '803', + 'prev_word_id' => '1439', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 4045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1265', + 'placement' => '804', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1254', + ), + 4046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '805', + 'prev_word_id' => '1254', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1265', + ), + 4047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '806', + 'prev_word_id' => '1265', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '807', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1473', + 'placement' => '808', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1474', + 'placement' => '809', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1473', + ), + 4051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '810', + 'prev_word_id' => '1473', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1474', + ), + 4052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1362', + 'placement' => '811', + 'prev_word_id' => '1474', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '978', + ), + 4053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '812', + 'prev_word_id' => '978', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1362', + ), + 4054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '813', + 'prev_word_id' => '1362', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1385', + ), + 4055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '814', + 'prev_word_id' => '1385', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '815', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '816', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '817', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '818', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1475', + 'placement' => '819', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '882', + ), + 4061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '820', + 'prev_word_id' => '882', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1475', + ), + 4062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1255', + 'placement' => '821', + 'prev_word_id' => '1475', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1476', + 'placement' => '822', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1255', + ), + 4064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '823', + 'prev_word_id' => '1255', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1476', + ), + 4065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '824', + 'prev_word_id' => '1476', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1008', + ), + 4066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '825', + 'prev_word_id' => '1008', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '826', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '883', + 'placement' => '827', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1366', + ), + 4069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '828', + 'prev_word_id' => '1366', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '883', + ), + 4070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '829', + 'prev_word_id' => '883', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1477', + 'placement' => '830', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '831', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1477', + ), + 4073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '832', + 'prev_word_id' => '1477', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '833', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1478', + 'placement' => '834', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '882', + ), + 4076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1479', + 'placement' => '835', + 'prev_word_id' => '882', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1478', + ), + 4077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '836', + 'prev_word_id' => '1478', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1479', + ), + 4078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '837', + 'prev_word_id' => '1479', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '848', + ), + 4079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '838', + 'prev_word_id' => '848', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '839', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '840', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1385', + ), + 4082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1480', + 'placement' => '841', + 'prev_word_id' => '1385', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1290', + ), + 4083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '842', + 'prev_word_id' => '1290', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1480', + ), + 4084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1422', + 'placement' => '843', + 'prev_word_id' => '1480', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1390', + 'placement' => '844', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1422', + ), + 4086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '845', + 'prev_word_id' => '1422', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1390', + ), + 4087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '846', + 'prev_word_id' => '1390', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '847', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '848', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1481', + ), + 4090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1482', + 'placement' => '849', + 'prev_word_id' => '1481', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '848', + ), + 4091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1483', + 'placement' => '850', + 'prev_word_id' => '848', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1482', + ), + 4092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '851', + 'prev_word_id' => '1482', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1483', + ), + 4093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1278', + 'placement' => '852', + 'prev_word_id' => '1483', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '853', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1278', + ), + 4095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1398', + 'placement' => '854', + 'prev_word_id' => '1278', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 4096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1362', + 'placement' => '855', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1398', + ), + 4097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '856', + 'prev_word_id' => '1398', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1362', + ), + 4098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1484', + 'placement' => '857', + 'prev_word_id' => '1362', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1404', + ), + 4099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '858', + 'prev_word_id' => '1404', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1484', + ), + 4100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '859', + 'prev_word_id' => '1484', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1008', + ), + 4101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1483', + 'placement' => '860', + 'prev_word_id' => '1008', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '861', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1483', + ), + 4103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '862', + 'prev_word_id' => '1483', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1485', + 'placement' => '863', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 4105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '864', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1485', + ), + 4106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1486', + 'placement' => '865', + 'prev_word_id' => '1485', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '866', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1486', + ), + 4108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '909', + 'placement' => '867', + 'prev_word_id' => '1486', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '868', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '909', + ), + 4110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1487', + 'placement' => '869', + 'prev_word_id' => '909', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '898', + ), + 4111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1488', + 'placement' => '870', + 'prev_word_id' => '898', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1487', + ), + 4112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '871', + 'prev_word_id' => '1487', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1488', + ), + 4113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '872', + 'prev_word_id' => '1488', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '873', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1489', + ), + 4115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '874', + 'prev_word_id' => '1489', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 4116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '875', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '876', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 4118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1302', + 'placement' => '877', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 4119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '878', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1302', + ), + 4120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '879', + 'prev_word_id' => '1302', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '880', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1482', + 'placement' => '881', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1483', + 'placement' => '882', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1482', + ), + 4124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1490', + 'placement' => '883', + 'prev_word_id' => '1482', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1483', + ), + 4125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '884', + 'prev_word_id' => '1483', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1490', + ), + 4126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1491', + 'placement' => '885', + 'prev_word_id' => '1490', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1492', + 'placement' => '886', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1491', + ), + 4128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1493', + 'placement' => '887', + 'prev_word_id' => '1491', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1492', + ), + 4129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '888', + 'prev_word_id' => '1492', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1493', + ), + 4130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '889', + 'prev_word_id' => '1493', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '834', + ), + 4131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '890', + 'prev_word_id' => '834', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1494', + 'placement' => '891', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1319', + ), + 4133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '892', + 'prev_word_id' => '1319', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1494', + ), + 4134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1464', + 'placement' => '893', + 'prev_word_id' => '1494', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '894', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1464', + ), + 4136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '895', + 'prev_word_id' => '1464', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1307', + ), + 4137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '896', + 'prev_word_id' => '1307', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4138 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8808', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '897', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4139 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8809', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '898', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4140 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8810', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1279', + 'placement' => '899', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4141 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8811', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '900', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1279', + ), + 4142 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8812', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '901', + 'prev_word_id' => '1279', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1280', + ), + 4143 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8813', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '902', + 'prev_word_id' => '1280', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4144 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8814', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '903', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1257', + ), + 4145 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8815', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '904', + 'prev_word_id' => '1257', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 4146 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8816', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '905', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4147 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8817', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '861', + 'placement' => '906', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1251', + ), + 4148 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8818', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '907', + 'prev_word_id' => '1251', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '861', + ), + 4149 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8819', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '908', + 'prev_word_id' => '861', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4150 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8820', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '909', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1385', + ), + 4151 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8821', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '910', + 'prev_word_id' => '1385', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4152 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8822', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '911', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '910', + ), + 4153 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1495', + 'placement' => '912', + 'prev_word_id' => '910', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4154 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '913', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1495', + ), + 4155 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1496', + 'placement' => '914', + 'prev_word_id' => '1495', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 4156 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1497', + 'placement' => '915', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1496', + ), + 4157 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '916', + 'prev_word_id' => '1496', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1497', + ), + 4158 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '917', + 'prev_word_id' => '1497', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4159 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '926', + 'placement' => '918', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '888', + ), + 4160 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '919', + 'prev_word_id' => '888', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '926', + ), + 4161 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1498', + 'placement' => '920', + 'prev_word_id' => '926', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4162 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '921', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1498', + ), + 4163 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '922', + 'prev_word_id' => '1498', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4164 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '923', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4165 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '924', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4166 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '925', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '828', + ), + 4167 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '926', + 'prev_word_id' => '828', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '829', + ), + 4168 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '927', + 'prev_word_id' => '829', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 4169 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '928', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1366', + ), + 4170 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '929', + 'prev_word_id' => '1366', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4171 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1499', + 'placement' => '930', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '843', + ), + 4172 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '931', + 'prev_word_id' => '843', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1499', + ), + 4173 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '932', + 'prev_word_id' => '1499', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4174 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '933', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 4175 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '934', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 4176 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1500', + 'placement' => '935', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '927', + ), + 4177 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '936', + 'prev_word_id' => '927', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1500', + ), + 4178 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1501', + 'placement' => '937', + 'prev_word_id' => '1500', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4179 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '938', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1501', + ), + 4180 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '939', + 'prev_word_id' => '1501', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4181 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '940', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 4182 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1500', + 'placement' => '941', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1288', + ), + 4183 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '942', + 'prev_word_id' => '1288', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1500', + ), + 4184 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '943', + 'prev_word_id' => '1500', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4185 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '944', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '939', + ), + 4186 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '945', + 'prev_word_id' => '939', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '946', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '929', + ), + 4188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '947', + 'prev_word_id' => '929', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1502', + ), + 4189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '948', + 'prev_word_id' => '1502', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1366', + ), + 4190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '949', + 'prev_word_id' => '1366', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '950', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1342', + ), + 4192 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '951', + 'prev_word_id' => '1342', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '973', + ), + 4193 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1471', + 'placement' => '952', + 'prev_word_id' => '973', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4194 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1503', + 'placement' => '953', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1471', + ), + 4195 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '954', + 'prev_word_id' => '1471', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1503', + ), + 4196 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1504', + 'placement' => '955', + 'prev_word_id' => '1503', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1437', + ), + 4197 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1505', + 'placement' => '956', + 'prev_word_id' => '1437', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1504', + ), + 4198 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '957', + 'prev_word_id' => '1504', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1505', + ), + 4199 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1506', + 'placement' => '958', + 'prev_word_id' => '1505', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1307', + ), + 4200 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1388', + 'placement' => '959', + 'prev_word_id' => '1307', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1506', + ), + 4201 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '960', + 'prev_word_id' => '1506', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1388', + ), + 4202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '961', + 'prev_word_id' => '1388', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1486', + 'placement' => '962', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1417', + ), + 4204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '963', + 'prev_word_id' => '1417', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1486', + ), + 4205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1279', + 'placement' => '964', + 'prev_word_id' => '1486', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1507', + 'placement' => '965', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1279', + ), + 4207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1508', + 'placement' => '966', + 'prev_word_id' => '1279', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1507', + ), + 4208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1372', + 'placement' => '967', + 'prev_word_id' => '1507', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1508', + ), + 4209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '968', + 'prev_word_id' => '1508', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1372', + ), + 4210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '873', + 'placement' => '969', + 'prev_word_id' => '1372', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1509', + 'placement' => '970', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '873', + ), + 4212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '971', + 'prev_word_id' => '873', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1509', + ), + 4213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1510', + 'placement' => '972', + 'prev_word_id' => '1509', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '923', + 'placement' => '973', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1510', + ), + 4215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '974', + 'prev_word_id' => '1510', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '923', + ), + 4216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1329', + 'placement' => '975', + 'prev_word_id' => '923', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 4217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1304', + 'placement' => '976', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1329', + ), + 4218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '977', + 'prev_word_id' => '1329', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1304', + ), + 4219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1506', + 'placement' => '978', + 'prev_word_id' => '1304', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1511', + 'placement' => '979', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1506', + ), + 4221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1512', + 'placement' => '980', + 'prev_word_id' => '1506', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1511', + ), + 4222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '981', + 'prev_word_id' => '1511', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1512', + ), + 4223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '982', + 'prev_word_id' => '1512', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 4224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1264', + 'placement' => '983', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1320', + ), + 4225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1424', + 'placement' => '984', + 'prev_word_id' => '1320', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1264', + ), + 4226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '985', + 'prev_word_id' => '1264', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1424', + ), + 4227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '986', + 'prev_word_id' => '1424', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1502', + ), + 4228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '987', + 'prev_word_id' => '1502', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1493', + 'placement' => '988', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1513', + ), + 4230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '989', + 'prev_word_id' => '1513', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1493', + ), + 4231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1514', + 'placement' => '990', + 'prev_word_id' => '1493', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '834', + ), + 4232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '991', + 'prev_word_id' => '834', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1514', + ), + 4233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '992', + 'prev_word_id' => '1514', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '860', + ), + 4234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1515', + 'placement' => '993', + 'prev_word_id' => '860', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1516', + 'placement' => '994', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1515', + ), + 4236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '995', + 'prev_word_id' => '1515', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1516', + ), + 4237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '996', + 'prev_word_id' => '1516', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1518', + 'placement' => '997', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1517', + ), + 4239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '998', + 'prev_word_id' => '1517', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1518', + ), + 4240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '999', + 'prev_word_id' => '1518', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '1000', + 'prev_word_id' => '0', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '970', + ), + 4242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1001', + 'prev_word_id' => '970', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1263', + ), + 4243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1519', + 'placement' => '1002', + 'prev_word_id' => '1263', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '1003', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1519', + ), + 4245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1004', + 'prev_word_id' => '1519', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '832', + ), + 4246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '884', + 'placement' => '1005', + 'prev_word_id' => '832', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1006', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '884', + ), + 4248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1520', + 'placement' => '1007', + 'prev_word_id' => '884', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '1008', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1520', + ), + 4250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1521', + 'placement' => '1009', + 'prev_word_id' => '1520', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 4251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '1010', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1521', + ), + 4252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1011', + 'prev_word_id' => '1521', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1522', + ), + 4253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1523', + 'placement' => '1012', + 'prev_word_id' => '1522', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1013', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1523', + ), + 4255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1524', + 'placement' => '1014', + 'prev_word_id' => '1523', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1525', + 'placement' => '1015', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1524', + ), + 4257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '1016', + 'prev_word_id' => '1524', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1525', + ), + 4258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '1017', + 'prev_word_id' => '1525', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '874', + ), + 4259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '1018', + 'prev_word_id' => '874', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '857', + ), + 4260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1421', + 'placement' => '1019', + 'prev_word_id' => '857', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '874', + ), + 4261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1020', + 'prev_word_id' => '874', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1421', + ), + 4262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1021', + 'prev_word_id' => '1421', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '1022', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '880', + 'placement' => '1023', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 4265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '1024', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '880', + ), + 4266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1025', + 'prev_word_id' => '880', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '834', + ), + 4267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '1026', + 'prev_word_id' => '834', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1526', + 'placement' => '1027', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '931', + ), + 4269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1028', + 'prev_word_id' => '931', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1526', + ), + 4270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '907', + 'placement' => '1029', + 'prev_word_id' => '1526', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '1030', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '907', + ), + 4272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1031', + 'prev_word_id' => '907', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '874', + ), + 4273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1032', + 'prev_word_id' => '874', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1033', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '1034', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1298', + 'placement' => '1035', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '1036', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1298', + ), + 4278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1037', + 'prev_word_id' => '1298', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '825', + ), + 4279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '1038', + 'prev_word_id' => '825', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '1039', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1527', + 'placement' => '1040', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1041', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1527', + ), + 4283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '1042', + 'prev_word_id' => '1527', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1528', + 'placement' => '1043', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '1044', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1528', + ), + 4286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1529', + 'placement' => '1045', + 'prev_word_id' => '1528', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '1046', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1529', + ), + 4288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '1047', + 'prev_word_id' => '1529', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1530', + ), + 4289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1048', + 'prev_word_id' => '1530', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1531', + 'placement' => '1049', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1050', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1531', + ), + 4292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1532', + 'placement' => '1051', + 'prev_word_id' => '1531', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1533', + 'placement' => '1052', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1532', + ), + 4294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1534', + 'placement' => '1053', + 'prev_word_id' => '1532', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1533', + ), + 4295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1535', + 'placement' => '1054', + 'prev_word_id' => '1533', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1534', + ), + 4296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1536', + 'placement' => '1055', + 'prev_word_id' => '1534', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1535', + ), + 4297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1056', + 'prev_word_id' => '1535', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1536', + ), + 4298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1057', + 'prev_word_id' => '1536', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '1058', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '1059', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '857', + ), + 4301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1060', + 'prev_word_id' => '857', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '874', + ), + 4302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1061', + 'prev_word_id' => '874', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1062', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '1063', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '1064', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '943', + ), + 4306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '1065', + 'prev_word_id' => '943', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '874', + ), + 4307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1066', + 'prev_word_id' => '874', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '1067', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '1068', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1069', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 4311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1070', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '907', + 'placement' => '1071', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '1072', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '907', + ), + 4314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1073', + 'prev_word_id' => '907', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '874', + ), + 4315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1074', + 'prev_word_id' => '874', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1537', + 'placement' => '1075', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1538', + 'placement' => '1076', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1537', + ), + 4318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '1077', + 'prev_word_id' => '1537', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1538', + ), + 4319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1539', + 'placement' => '1078', + 'prev_word_id' => '1538', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1358', + ), + 4320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1540', + 'placement' => '1079', + 'prev_word_id' => '1358', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1539', + ), + 4321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '1080', + 'prev_word_id' => '1539', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1540', + ), + 4322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1081', + 'prev_word_id' => '1540', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '1082', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1541', + 'placement' => '1083', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1358', + ), + 4325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '1084', + 'prev_word_id' => '1358', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1541', + ), + 4326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1085', + 'prev_word_id' => '1541', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 4327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1537', + 'placement' => '1086', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1538', + 'placement' => '1087', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1537', + ), + 4329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '8999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '1088', + 'prev_word_id' => '1537', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1538', + ), + 4330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1542', + 'placement' => '1089', + 'prev_word_id' => '1538', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1358', + ), + 4331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1543', + 'placement' => '1090', + 'prev_word_id' => '1358', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1542', + ), + 4332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1091', + 'prev_word_id' => '1542', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1543', + ), + 4333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '1092', + 'prev_word_id' => '1543', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1544', + 'placement' => '1093', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1384', + ), + 4335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '1094', + 'prev_word_id' => '1384', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1544', + ), + 4336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1534', + 'placement' => '1095', + 'prev_word_id' => '1544', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1545', + 'placement' => '1096', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1534', + ), + 4338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1097', + 'prev_word_id' => '1534', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1545', + ), + 4339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1098', + 'prev_word_id' => '1545', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1099', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1100', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '1101', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1102', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 4344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1546', + 'placement' => '1103', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '1104', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1546', + ), + 4346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '1105', + 'prev_word_id' => '1546', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1547', + ), + 4347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '1106', + 'prev_word_id' => '1547', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1548', + ), + 4348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '1107', + 'prev_word_id' => '1548', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1549', + ), + 4349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1545', + 'placement' => '1108', + 'prev_word_id' => '1549', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 4350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1109', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1545', + ), + 4351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '1110', + 'prev_word_id' => '1545', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '1111', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '841', + ), + 4353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '1112', + 'prev_word_id' => '841', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1550', + ), + 4354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1113', + 'prev_word_id' => '1550', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '834', + ), + 4355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '1114', + 'prev_word_id' => '834', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1427', + 'placement' => '1115', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1551', + 'placement' => '1116', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1427', + ), + 4358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1117', + 'prev_word_id' => '1427', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1551', + ), + 4359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1552', + 'placement' => '1118', + 'prev_word_id' => '1551', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1328', + 'placement' => '1119', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1552', + ), + 4361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1120', + 'prev_word_id' => '1552', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1328', + ), + 4362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1424', + 'placement' => '1121', + 'prev_word_id' => '1328', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1122', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1424', + ), + 4364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1123', + 'prev_word_id' => '1424', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1553', + 'placement' => '1124', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1125', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1553', + ), + 4367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1554', + 'placement' => '1126', + 'prev_word_id' => '1553', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1555', + 'placement' => '1127', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1554', + ), + 4369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1556', + 'placement' => '1128', + 'prev_word_id' => '1554', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1555', + ), + 4370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1557', + 'placement' => '1129', + 'prev_word_id' => '1555', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1556', + ), + 4371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1558', + 'placement' => '1130', + 'prev_word_id' => '1556', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1557', + ), + 4372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '1131', + 'prev_word_id' => '1557', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1558', + ), + 4373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1467', + 'placement' => '1132', + 'prev_word_id' => '1558', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '888', + ), + 4374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1133', + 'prev_word_id' => '888', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1467', + ), + 4375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1134', + 'prev_word_id' => '1467', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1135', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '1136', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '1137', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '1138', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1396', + ), + 4380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1139', + 'prev_word_id' => '1396', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '844', + ), + 4381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1471', + 'placement' => '1140', + 'prev_word_id' => '844', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1559', + 'placement' => '1141', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1471', + ), + 4383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1142', + 'prev_word_id' => '1471', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1559', + ), + 4384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1503', + 'placement' => '1143', + 'prev_word_id' => '1559', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '1144', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1503', + ), + 4386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1561', + 'placement' => '1145', + 'prev_word_id' => '1503', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1560', + ), + 4387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1553', + 'placement' => '1146', + 'prev_word_id' => '1560', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1561', + ), + 4388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1562', + 'placement' => '1147', + 'prev_word_id' => '1561', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1553', + ), + 4389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '1148', + 'prev_word_id' => '1553', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1562', + ), + 4390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1149', + 'prev_word_id' => '1562', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 4391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1150', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '1151', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '1152', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1153', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1502', + ), + 4395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1495', + 'placement' => '1154', + 'prev_word_id' => '1502', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1328', + 'placement' => '1155', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1495', + ), + 4397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '1156', + 'prev_word_id' => '1495', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1328', + ), + 4398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1390', + 'placement' => '1157', + 'prev_word_id' => '1328', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '1158', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1390', + ), + 4400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1491', + 'placement' => '1159', + 'prev_word_id' => '1390', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '1160', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1491', + ), + 4402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '1161', + 'prev_word_id' => '1491', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 4403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1563', + 'placement' => '1162', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1560', + ), + 4404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1564', + 'placement' => '1163', + 'prev_word_id' => '1560', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1563', + ), + 4405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '1164', + 'prev_word_id' => '1563', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1564', + ), + 4406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1165', + 'prev_word_id' => '1564', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '880', + 'placement' => '1166', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1565', + 'placement' => '1167', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '880', + ), + 4409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1168', + 'prev_word_id' => '880', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1565', + ), + 4410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '1169', + 'prev_word_id' => '1565', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '1170', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1342', + ), + 4412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1171', + 'prev_word_id' => '1342', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '973', + ), + 4413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1566', + 'placement' => '1172', + 'prev_word_id' => '973', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1567', + 'placement' => '1173', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1566', + ), + 4415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1568', + 'placement' => '1174', + 'prev_word_id' => '1566', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1567', + ), + 4416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '1175', + 'prev_word_id' => '1567', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1568', + ), + 4417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1176', + 'prev_word_id' => '1568', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1177', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '1178', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '1179', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '1180', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1569', + ), + 4422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1570', + 'placement' => '1181', + 'prev_word_id' => '1569', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1571', + 'placement' => '1182', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1570', + ), + 4424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1183', + 'prev_word_id' => '1570', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1571', + ), + 4425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '1184', + 'prev_word_id' => '1571', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1572', + 'placement' => '1185', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 4427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '1186', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1572', + ), + 4428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '1187', + 'prev_word_id' => '1572', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 4429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1573', + 'placement' => '1188', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1362', + 'placement' => '1189', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1573', + ), + 4431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1190', + 'prev_word_id' => '1573', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1362', + ), + 4432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '1191', + 'prev_word_id' => '1362', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '1192', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '843', + ), + 4434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '1193', + 'prev_word_id' => '843', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1410', + ), + 4435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1439', + 'placement' => '1194', + 'prev_word_id' => '1410', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1569', + ), + 4436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1424', + 'placement' => '1195', + 'prev_word_id' => '1569', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1439', + ), + 4437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1472', + 'placement' => '1196', + 'prev_word_id' => '1439', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1424', + ), + 4438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '1197', + 'prev_word_id' => '1424', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1472', + ), + 4439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1198', + 'prev_word_id' => '1472', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 4440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1199', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '1200', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '1201', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1259', + ), + 4443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '1202', + 'prev_word_id' => '1259', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '834', + ), + 4444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1574', + 'placement' => '1203', + 'prev_word_id' => '834', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1008', + ), + 4445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '1204', + 'prev_word_id' => '1008', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1574', + ), + 4446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1205', + 'prev_word_id' => '1574', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1368', + ), + 4447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1427', + 'placement' => '1206', + 'prev_word_id' => '1368', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '1207', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1427', + ), + 4449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '1208', + 'prev_word_id' => '1427', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1056', + ), + 4450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '1209', + 'prev_word_id' => '1056', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 4451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '1210', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 4452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '1211', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '836', + ), + 4453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1575', + 'placement' => '1212', + 'prev_word_id' => '836', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '1213', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1575', + ), + 4455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1214', + 'prev_word_id' => '1575', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '976', + ), + 4456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1576', + 'placement' => '1215', + 'prev_word_id' => '976', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '1216', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1576', + ), + 4458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '1217', + 'prev_word_id' => '1576', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1577', + ), + 4459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1218', + 'prev_word_id' => '1577', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1443', + ), + 4460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '909', + 'placement' => '1219', + 'prev_word_id' => '1443', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '1220', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '909', + ), + 4462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1221', + 'prev_word_id' => '909', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '926', + 'placement' => '1222', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1223', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '926', + ), + 4465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '1224', + 'prev_word_id' => '926', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1225', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1226', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '1227', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '1228', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '1229', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1502', + ), + 4471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1576', + 'placement' => '1230', + 'prev_word_id' => '1502', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1259', + ), + 4472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1516', + 'placement' => '1231', + 'prev_word_id' => '1259', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1576', + ), + 4473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1232', + 'prev_word_id' => '1576', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1516', + ), + 4474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1578', + 'placement' => '1233', + 'prev_word_id' => '1516', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1234', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1578', + ), + 4476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '1235', + 'prev_word_id' => '1578', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '948', + ), + 4477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1458', + 'placement' => '1236', + 'prev_word_id' => '948', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '949', + ), + 4478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '1237', + 'prev_word_id' => '949', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1458', + ), + 4479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1579', + 'placement' => '1238', + 'prev_word_id' => '1458', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '833', + ), + 4480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1239', + 'prev_word_id' => '833', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1579', + ), + 4481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1380', + 'placement' => '1240', + 'prev_word_id' => '1579', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '1241', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1380', + ), + 4483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1458', + 'placement' => '1242', + 'prev_word_id' => '1380', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1258', + ), + 4484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1528', + 'placement' => '1243', + 'prev_word_id' => '1258', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1458', + ), + 4485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '1244', + 'prev_word_id' => '1458', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1528', + ), + 4486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1575', + 'placement' => '1245', + 'prev_word_id' => '1528', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1349', + 'placement' => '1246', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1575', + ), + 4488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '1247', + 'prev_word_id' => '1575', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1349', + ), + 4489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1498', + 'placement' => '1248', + 'prev_word_id' => '1349', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1287', + ), + 4490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1580', + 'placement' => '1249', + 'prev_word_id' => '1287', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1498', + ), + 4491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1250', + 'prev_word_id' => '1498', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1580', + ), + 4492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '850', + 'placement' => '1251', + 'prev_word_id' => '1580', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '1252', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '850', + ), + 4494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1253', + 'prev_word_id' => '850', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '813', + ), + 4495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '1254', + 'prev_word_id' => '813', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '814', + ), + 4496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1264', + 'placement' => '1255', + 'prev_word_id' => '814', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1502', + ), + 4497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1256', + 'prev_word_id' => '1502', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1264', + ), + 4498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '1257', + 'prev_word_id' => '1264', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1581', + 'placement' => '1258', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1443', + ), + 4500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1582', + 'placement' => '1259', + 'prev_word_id' => '1443', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1581', + ), + 4501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1260', + 'prev_word_id' => '1581', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1582', + ), + 4502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '1261', + 'prev_word_id' => '1582', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1252', + 'placement' => '1262', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1251', + ), + 4504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1263', + 'prev_word_id' => '1251', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1252', + ), + 4505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1313', + 'placement' => '1264', + 'prev_word_id' => '1252', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1265', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1313', + ), + 4507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1266', + 'prev_word_id' => '1313', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '1267', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '1268', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '870', + ), + 4510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1418', + 'placement' => '1269', + 'prev_word_id' => '870', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 4511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '1270', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1418', + ), + 4512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '1271', + 'prev_word_id' => '1418', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1272', + 'prev_word_id' => '1323', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '893', + ), + 4514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1282', + 'placement' => '1273', + 'prev_word_id' => '893', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1274', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1282', + ), + 4516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '1275', + 'prev_word_id' => '1282', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '1276', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1319', + ), + 4518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1583', + 'placement' => '1277', + 'prev_word_id' => '1319', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '810', + ), + 4519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1584', + 'placement' => '1278', + 'prev_word_id' => '810', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1583', + ), + 4520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '1279', + 'prev_word_id' => '1583', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1584', + ), + 4521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1295', + 'placement' => '1280', + 'prev_word_id' => '1584', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '823', + ), + 4522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '1281', + 'prev_word_id' => '823', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1295', + ), + 4523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1585', + 'placement' => '1282', + 'prev_word_id' => '1295', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '886', + ), + 4524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '1283', + 'prev_word_id' => '886', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1585', + ), + 4525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '1284', + 'prev_word_id' => '1585', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '917', + ), + 4526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '1285', + 'prev_word_id' => '917', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '809', + ), + 4527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1586', + 'placement' => '1286', + 'prev_word_id' => '809', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1318', + ), + 4528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1587', + 'placement' => '1287', + 'prev_word_id' => '1318', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1586', + ), + 4529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '1288', + 'prev_word_id' => '1586', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1587', + ), + 4530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '1289', + 'prev_word_id' => '1587', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '801', + ), + 4531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1290', + 'prev_word_id' => '801', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '881', + ), + 4532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1291', + 'prev_word_id' => '881', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '802', + ), + 4533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1292', + 'prev_word_id' => '802', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '803', + ), + 4534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '1293', + 'prev_word_id' => '803', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '863', + ), + 4535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1322', + 'placement' => '1294', + 'prev_word_id' => '863', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '974', + ), + 4536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '1295', + 'prev_word_id' => '974', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1322', + ), + 4537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '1296', + 'prev_word_id' => '1322', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1528', + 'placement' => '1297', + 'prev_word_id' => '1323', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '804', + ), + 4539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '1298', + 'prev_word_id' => '804', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1528', + ), + 4540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '1299', + 'prev_word_id' => '1528', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '805', + ), + 4541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '1300', + 'prev_word_id' => '805', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '816', + ), + 4542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '1301', + 'prev_word_id' => '816', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '894', + ), + 4543 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9213', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '1302', + 'prev_word_id' => '894', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1191', + ), + 4544 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '107', + 'frequency' => '0', + 'id' => '9214', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1303', + 'prev_word_id' => '1191', + 'published' => '1311154185', + 'section_id' => '1', + 'word_id' => '1191', + ), + 4545 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9215', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '936', + ), + 4546 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9216', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '1', + 'prev_word_id' => '936', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4547 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9217', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '2', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '881', + ), + 4548 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9218', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '3', + 'prev_word_id' => '881', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4549 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9219', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '4', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4550 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9220', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '5', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4551 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9221', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '6', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4552 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9222', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '7', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1530', + ), + 4553 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9223', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '8', + 'prev_word_id' => '1530', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '809', + ), + 4554 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9224', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1588', + 'placement' => '9', + 'prev_word_id' => '809', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4555 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9225', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '10', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1588', + ), + 4556 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9226', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '11', + 'prev_word_id' => '1588', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 4557 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9227', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '12', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1370', + ), + 4558 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9228', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '13', + 'prev_word_id' => '1370', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1368', + ), + 4559 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9229', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '14', + 'prev_word_id' => '1368', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 4560 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9230', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '15', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4561 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9231', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1589', + 'placement' => '16', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1084', + ), + 4562 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9232', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '17', + 'prev_word_id' => '1084', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1589', + ), + 4563 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9233', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '18', + 'prev_word_id' => '1589', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1437', + ), + 4564 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9234', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '19', + 'prev_word_id' => '1437', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4565 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9235', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1590', + 'placement' => '20', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4566 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9236', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1591', + 'placement' => '21', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1590', + ), + 4567 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9237', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '22', + 'prev_word_id' => '1590', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1591', + ), + 4568 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9238', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '23', + 'prev_word_id' => '1591', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4569 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9239', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '24', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4570 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9240', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '25', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '857', + ), + 4571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '26', + 'prev_word_id' => '857', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '27', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '28', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '29', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '30', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 4576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '31', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1592', + ), + 4577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '32', + 'prev_word_id' => '1592', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '33', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '34', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1593', + 'placement' => '35', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1489', + ), + 4581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '36', + 'prev_word_id' => '1489', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1593', + ), + 4582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '37', + 'prev_word_id' => '1593', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1594', + ), + 4583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '38', + 'prev_word_id' => '1594', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '39', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '40', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1595', + ), + 4586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '41', + 'prev_word_id' => '1595', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1596', + ), + 4587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '42', + 'prev_word_id' => '1596', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '963', + ), + 4588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '43', + 'prev_word_id' => '963', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '825', + ), + 4589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '44', + 'prev_word_id' => '825', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1597', + ), + 4590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '45', + 'prev_word_id' => '1597', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1598', + ), + 4591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '46', + 'prev_word_id' => '1598', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1522', + ), + 4592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '47', + 'prev_word_id' => '1522', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '933', + ), + 4593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '48', + 'prev_word_id' => '933', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '945', + ), + 4594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1599', + 'placement' => '49', + 'prev_word_id' => '945', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 4595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '50', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1599', + ), + 4596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '51', + 'prev_word_id' => '1599', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1370', + ), + 4597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '52', + 'prev_word_id' => '1370', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1481', + ), + 4598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '53', + 'prev_word_id' => '1481', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '54', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '55', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '56', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '57', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 4603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '58', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1592', + ), + 4604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '59', + 'prev_word_id' => '1592', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '809', + ), + 4605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '60', + 'prev_word_id' => '809', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '61', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '62', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '63', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '64', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '65', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '66', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1280', + ), + 4612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1600', + 'placement' => '67', + 'prev_word_id' => '1280', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1337', + ), + 4613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '68', + 'prev_word_id' => '1337', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1600', + ), + 4614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '69', + 'prev_word_id' => '1600', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1601', + 'placement' => '70', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '963', + ), + 4616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '71', + 'prev_word_id' => '963', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1601', + ), + 4617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '72', + 'prev_word_id' => '1601', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '73', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '74', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 4620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1602', + 'placement' => '75', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1592', + ), + 4621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '76', + 'prev_word_id' => '1592', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1602', + ), + 4622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '77', + 'prev_word_id' => '1602', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '78', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '821', + ), + 4624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '79', + 'prev_word_id' => '821', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1603', + ), + 4625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '80', + 'prev_word_id' => '1603', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '804', + ), + 4626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1604', + 'placement' => '81', + 'prev_word_id' => '804', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1603', + ), + 4627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '82', + 'prev_word_id' => '1603', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1604', + ), + 4628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '83', + 'prev_word_id' => '1604', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1605', + ), + 4629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1499', + 'placement' => '84', + 'prev_word_id' => '1605', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '85', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1499', + ), + 4631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '86', + 'prev_word_id' => '1499', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '87', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '88', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1606', + ), + 4634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '89', + 'prev_word_id' => '1606', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '90', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1607', + 'placement' => '91', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1608', + 'placement' => '92', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1607', + ), + 4638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '93', + 'prev_word_id' => '1607', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1608', + ), + 4639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '94', + 'prev_word_id' => '1608', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '95', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1594', + ), + 4641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1610', + 'placement' => '96', + 'prev_word_id' => '1594', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1609', + ), + 4642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '97', + 'prev_word_id' => '1609', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1610', + ), + 4643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '98', + 'prev_word_id' => '1610', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 4644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '99', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '100', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '101', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '857', + ), + 4647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '102', + 'prev_word_id' => '857', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '932', + ), + 4648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '103', + 'prev_word_id' => '932', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '805', + ), + 4649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1611', + 'placement' => '104', + 'prev_word_id' => '805', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '105', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1611', + ), + 4651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1612', + 'placement' => '106', + 'prev_word_id' => '1611', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '932', + ), + 4652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '107', + 'prev_word_id' => '932', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1612', + ), + 4653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '108', + 'prev_word_id' => '1612', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '870', + ), + 4654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '109', + 'prev_word_id' => '870', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1504', + 'placement' => '110', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '821', + ), + 4656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1613', + 'placement' => '111', + 'prev_word_id' => '821', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1504', + ), + 4657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1614', + 'placement' => '112', + 'prev_word_id' => '1504', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1613', + ), + 4658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1615', + 'placement' => '113', + 'prev_word_id' => '1613', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1614', + ), + 4659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1616', + 'placement' => '114', + 'prev_word_id' => '1614', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1615', + ), + 4660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1617', + 'placement' => '115', + 'prev_word_id' => '1615', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1616', + ), + 4661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1618', + 'placement' => '116', + 'prev_word_id' => '1616', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1617', + ), + 4662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1505', + 'placement' => '117', + 'prev_word_id' => '1617', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1618', + ), + 4663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '118', + 'prev_word_id' => '1618', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1505', + ), + 4664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '119', + 'prev_word_id' => '1505', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1619', + 'placement' => '120', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1489', + ), + 4666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '121', + 'prev_word_id' => '1489', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1619', + ), + 4667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '122', + 'prev_word_id' => '1619', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1620', + ), + 4668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '123', + 'prev_word_id' => '1620', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '124', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '125', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1621', + 'placement' => '126', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '127', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1621', + ), + 4673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1622', + 'placement' => '128', + 'prev_word_id' => '1621', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1489', + ), + 4674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '129', + 'prev_word_id' => '1489', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1622', + ), + 4675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '130', + 'prev_word_id' => '1622', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1384', + ), + 4676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1623', + 'placement' => '131', + 'prev_word_id' => '1384', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1508', + 'placement' => '132', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1623', + ), + 4678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1624', + 'placement' => '133', + 'prev_word_id' => '1623', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1508', + ), + 4679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1601', + 'placement' => '134', + 'prev_word_id' => '1508', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1624', + ), + 4680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '135', + 'prev_word_id' => '1624', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1601', + ), + 4681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1625', + 'placement' => '136', + 'prev_word_id' => '1601', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '137', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1625', + ), + 4683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '138', + 'prev_word_id' => '1625', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1489', + ), + 4684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '139', + 'prev_word_id' => '1489', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1626', + 'placement' => '140', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '828', + ), + 4686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '141', + 'prev_word_id' => '828', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1626', + ), + 4687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1627', + 'placement' => '142', + 'prev_word_id' => '1626', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1628', + 'placement' => '143', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1627', + ), + 4689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '144', + 'prev_word_id' => '1627', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1628', + ), + 4690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '145', + 'prev_word_id' => '1628', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1429', + ), + 4691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '146', + 'prev_word_id' => '1429', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1606', + ), + 4692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '147', + 'prev_word_id' => '1606', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '148', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '149', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '939', + ), + 4695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1629', + 'placement' => '150', + 'prev_word_id' => '939', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '151', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1629', + ), + 4697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '152', + 'prev_word_id' => '1629', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '807', + ), + 4698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '153', + 'prev_word_id' => '807', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '154', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1630', + 'placement' => '155', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '156', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1630', + ), + 4702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1622', + 'placement' => '157', + 'prev_word_id' => '1630', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1489', + ), + 4703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '158', + 'prev_word_id' => '1489', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1622', + ), + 4704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '159', + 'prev_word_id' => '1622', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1631', + ), + 4705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '160', + 'prev_word_id' => '1631', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1605', + ), + 4706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1632', + 'placement' => '161', + 'prev_word_id' => '1605', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '162', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1632', + ), + 4708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '163', + 'prev_word_id' => '1632', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1318', + ), + 4709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1633', + 'placement' => '164', + 'prev_word_id' => '1318', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1319', + ), + 4710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '165', + 'prev_word_id' => '1319', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1633', + ), + 4711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1634', + 'placement' => '166', + 'prev_word_id' => '1633', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '856', + ), + 4712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '167', + 'prev_word_id' => '856', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1634', + ), + 4713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '168', + 'prev_word_id' => '1634', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '169', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '170', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1595', + ), + 4716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1635', + 'placement' => '171', + 'prev_word_id' => '1595', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '172', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1635', + ), + 4718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1636', + 'placement' => '173', + 'prev_word_id' => '1635', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1277', + ), + 4719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '174', + 'prev_word_id' => '1277', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1636', + ), + 4720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1637', + 'placement' => '175', + 'prev_word_id' => '1636', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1371', + 'placement' => '176', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1637', + ), + 4722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '177', + 'prev_word_id' => '1637', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1371', + ), + 4723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '178', + 'prev_word_id' => '1371', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '179', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '180', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1638', + ), + 4726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '181', + 'prev_word_id' => '1638', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1639', + ), + 4727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '182', + 'prev_word_id' => '1639', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 4728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '183', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '184', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '807', + ), + 4730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1640', + 'placement' => '185', + 'prev_word_id' => '807', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4731 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '186', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1640', + ), + 4732 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1641', + 'placement' => '187', + 'prev_word_id' => '1640', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4733 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '188', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1641', + ), + 4734 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '189', + 'prev_word_id' => '1641', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1337', + ), + 4735 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '905', + 'placement' => '190', + 'prev_word_id' => '1337', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '874', + ), + 4736 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '191', + 'prev_word_id' => '874', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '905', + ), + 4737 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '192', + 'prev_word_id' => '905', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4738 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '193', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1404', + ), + 4739 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '194', + 'prev_word_id' => '1404', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '976', + ), + 4740 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '195', + 'prev_word_id' => '976', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1594', + ), + 4741 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '196', + 'prev_word_id' => '1594', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4742 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '197', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4743 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '198', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1443', + ), + 4744 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '199', + 'prev_word_id' => '1443', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4745 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '200', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4746 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '201', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4747 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '202', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4748 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '203', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4749 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1642', + 'placement' => '204', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '844', + ), + 4750 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '205', + 'prev_word_id' => '844', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1642', + ), + 4751 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '206', + 'prev_word_id' => '1642', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4752 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1643', + 'placement' => '207', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1596', + ), + 4753 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9423', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1276', + 'placement' => '208', + 'prev_word_id' => '1596', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1643', + ), + 4754 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9424', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '209', + 'prev_word_id' => '1643', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1276', + ), + 4755 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9425', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '210', + 'prev_word_id' => '1276', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1447', + ), + 4756 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9426', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '211', + 'prev_word_id' => '1447', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1290', + ), + 4757 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9427', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '212', + 'prev_word_id' => '1290', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '821', + ), + 4758 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9428', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1644', + 'placement' => '213', + 'prev_word_id' => '821', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4759 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9429', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '214', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1644', + ), + 4760 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1645', + 'placement' => '215', + 'prev_word_id' => '1644', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '805', + ), + 4761 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '216', + 'prev_word_id' => '805', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1645', + ), + 4762 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '217', + 'prev_word_id' => '1645', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4763 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '218', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1646', + ), + 4764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1647', + 'placement' => '219', + 'prev_word_id' => '1646', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '836', + ), + 4765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '220', + 'prev_word_id' => '836', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1647', + ), + 4766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1648', + 'placement' => '221', + 'prev_word_id' => '1647', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '222', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1648', + ), + 4768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1649', + 'placement' => '223', + 'prev_word_id' => '1648', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1650', + 'placement' => '224', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1649', + ), + 4770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '225', + 'prev_word_id' => '1649', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1650', + ), + 4771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1643', + 'placement' => '226', + 'prev_word_id' => '1650', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1651', + ), + 4772 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '227', + 'prev_word_id' => '1651', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1643', + ), + 4773 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1652', + 'placement' => '228', + 'prev_word_id' => '1643', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4774 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '229', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1652', + ), + 4775 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1653', + 'placement' => '230', + 'prev_word_id' => '1652', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '898', + ), + 4776 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1654', + 'placement' => '231', + 'prev_word_id' => '898', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1653', + ), + 4777 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '232', + 'prev_word_id' => '1653', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1654', + ), + 4778 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1655', + 'placement' => '233', + 'prev_word_id' => '1654', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4779 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '234', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1655', + ), + 4780 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '235', + 'prev_word_id' => '1655', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4781 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '236', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1319', + ), + 4782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '237', + 'prev_word_id' => '1319', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1290', + ), + 4783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '238', + 'prev_word_id' => '1290', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '821', + ), + 4784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '239', + 'prev_word_id' => '821', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '809', + ), + 4785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '240', + 'prev_word_id' => '809', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1656', + 'placement' => '241', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1643', + 'placement' => '242', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1656', + ), + 4788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '243', + 'prev_word_id' => '1656', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1643', + ), + 4789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '244', + 'prev_word_id' => '1643', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1605', + ), + 4790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1657', + 'placement' => '245', + 'prev_word_id' => '1605', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1658', + 'placement' => '246', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1657', + ), + 4792 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '247', + 'prev_word_id' => '1657', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1658', + ), + 4793 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '248', + 'prev_word_id' => '1658', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4794 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '249', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4795 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1659', + 'placement' => '250', + 'prev_word_id' => '1323', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '251', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1659', + ), + 4797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '252', + 'prev_word_id' => '1659', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '253', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1660', + 'placement' => '254', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '886', + ), + 4800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1661', + 'placement' => '255', + 'prev_word_id' => '886', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1660', + ), + 4801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '256', + 'prev_word_id' => '1660', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1661', + ), + 4802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '257', + 'prev_word_id' => '1661', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '893', + ), + 4803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '258', + 'prev_word_id' => '893', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '259', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1319', + ), + 4805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1662', + 'placement' => '260', + 'prev_word_id' => '1319', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1318', + ), + 4806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1642', + 'placement' => '261', + 'prev_word_id' => '1318', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1662', + ), + 4807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '262', + 'prev_word_id' => '1662', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1642', + ), + 4808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '263', + 'prev_word_id' => '1642', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '901', + ), + 4809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '264', + 'prev_word_id' => '901', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '265', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '836', + ), + 4811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '266', + 'prev_word_id' => '836', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1396', + ), + 4812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1663', + 'placement' => '267', + 'prev_word_id' => '1396', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '844', + ), + 4813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '268', + 'prev_word_id' => '844', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1663', + ), + 4814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '269', + 'prev_word_id' => '1663', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '270', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '271', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '829', + ), + 4817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '272', + 'prev_word_id' => '829', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '273', + 'prev_word_id' => '1323', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '274', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1318', + ), + 4820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '275', + 'prev_word_id' => '1318', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '825', + ), + 4821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1664', + 'placement' => '276', + 'prev_word_id' => '825', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1443', + ), + 4822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '277', + 'prev_word_id' => '1443', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1664', + ), + 4823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '278', + 'prev_word_id' => '1664', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '976', + ), + 4824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '279', + 'prev_word_id' => '976', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '280', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1300', + ), + 4826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '281', + 'prev_word_id' => '1300', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1605', + ), + 4827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '282', + 'prev_word_id' => '1605', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '283', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '886', + ), + 4829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '284', + 'prev_word_id' => '886', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1665', + ), + 4830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '285', + 'prev_word_id' => '1665', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '286', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1666', + 'placement' => '287', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '288', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1666', + ), + 4834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1667', + 'placement' => '289', + 'prev_word_id' => '1666', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '290', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1667', + ), + 4836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '291', + 'prev_word_id' => '1667', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '292', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '293', + 'prev_word_id' => '1323', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1668', + 'placement' => '294', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '886', + ), + 4840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '295', + 'prev_word_id' => '886', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1668', + ), + 4841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '296', + 'prev_word_id' => '1668', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1665', + ), + 4842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '297', + 'prev_word_id' => '1665', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '298', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '299', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1594', + ), + 4845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '300', + 'prev_word_id' => '1594', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '301', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1290', + ), + 4847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '302', + 'prev_word_id' => '1290', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '303', + 'prev_word_id' => '1323', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '304', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1420', + ), + 4850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '305', + 'prev_word_id' => '1420', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '306', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '307', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '308', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '829', + ), + 4854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '309', + 'prev_word_id' => '829', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1663', + 'placement' => '310', + 'prev_word_id' => '1323', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '805', + ), + 4856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '311', + 'prev_word_id' => '805', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1663', + ), + 4857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '312', + 'prev_word_id' => '1663', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1605', + ), + 4858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '313', + 'prev_word_id' => '1605', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1313', + 'placement' => '314', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '886', + ), + 4860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '315', + 'prev_word_id' => '886', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1313', + ), + 4861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1669', + 'placement' => '316', + 'prev_word_id' => '1313', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '317', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1669', + ), + 4863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '318', + 'prev_word_id' => '1669', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1670', + 'placement' => '319', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '320', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1670', + ), + 4866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1671', + 'placement' => '321', + 'prev_word_id' => '1670', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1605', + ), + 4867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '322', + 'prev_word_id' => '1605', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1671', + ), + 4868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1672', + 'placement' => '323', + 'prev_word_id' => '1671', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '324', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1672', + ), + 4870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1314', + 'placement' => '325', + 'prev_word_id' => '1672', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '326', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1314', + ), + 4872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '327', + 'prev_word_id' => '1314', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '328', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '329', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '882', + ), + 4875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '330', + 'prev_word_id' => '882', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '881', + ), + 4876 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '331', + 'prev_word_id' => '881', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4877 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '332', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1673', + ), + 4878 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '333', + 'prev_word_id' => '1673', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4879 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1674', + 'placement' => '334', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4880 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '335', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1674', + ), + 4881 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '336', + 'prev_word_id' => '1674', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '815', + ), + 4882 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1422', + 'placement' => '337', + 'prev_word_id' => '815', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4883 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '338', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1422', + ), + 4884 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1675', + 'placement' => '339', + 'prev_word_id' => '1422', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4885 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '340', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1675', + ), + 4886 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1676', + 'placement' => '341', + 'prev_word_id' => '1675', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4887 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1677', + 'placement' => '342', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1676', + ), + 4888 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '343', + 'prev_word_id' => '1676', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1677', + ), + 4889 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '344', + 'prev_word_id' => '1677', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 4890 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '345', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '346', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '829', + ), + 4892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '347', + 'prev_word_id' => '829', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1323', + ), + 4893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1678', + 'placement' => '348', + 'prev_word_id' => '1323', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1596', + ), + 4894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1679', + 'placement' => '349', + 'prev_word_id' => '1596', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1678', + ), + 4895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '350', + 'prev_word_id' => '1678', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1679', + ), + 4896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '351', + 'prev_word_id' => '1679', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1680', + 'placement' => '352', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '844', + ), + 4898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '353', + 'prev_word_id' => '844', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1680', + ), + 4899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1681', + 'placement' => '354', + 'prev_word_id' => '1680', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '816', + ), + 4900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '355', + 'prev_word_id' => '816', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1681', + ), + 4901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '356', + 'prev_word_id' => '1681', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1263', + ), + 4902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1682', + 'placement' => '357', + 'prev_word_id' => '1263', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1008', + ), + 4903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '358', + 'prev_word_id' => '1008', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1682', + ), + 4904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '359', + 'prev_word_id' => '1682', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '360', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '361', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1319', + ), + 4907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '362', + 'prev_word_id' => '1319', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '898', + ), + 4908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1684', + 'placement' => '363', + 'prev_word_id' => '898', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1683', + ), + 4909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '364', + 'prev_word_id' => '1683', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1684', + ), + 4910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '365', + 'prev_word_id' => '1684', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1685', + ), + 4911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '366', + 'prev_word_id' => '1685', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '809', + ), + 4912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '367', + 'prev_word_id' => '809', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '368', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1686', + ), + 4914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1415', + 'placement' => '369', + 'prev_word_id' => '1686', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1685', + ), + 4915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '370', + 'prev_word_id' => '1685', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1415', + ), + 4916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '371', + 'prev_word_id' => '1415', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '882', + ), + 4917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '372', + 'prev_word_id' => '882', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '939', + ), + 4918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1391', + 'placement' => '373', + 'prev_word_id' => '939', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1458', + 'placement' => '374', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1391', + ), + 4920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '375', + 'prev_word_id' => '1391', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1458', + ), + 4921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '376', + 'prev_word_id' => '1458', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '809', + ), + 4922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '377', + 'prev_word_id' => '809', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1687', + 'placement' => '378', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1686', + ), + 4924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '379', + 'prev_word_id' => '1686', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1687', + ), + 4925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '380', + 'prev_word_id' => '1687', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '948', + ), + 4926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '381', + 'prev_word_id' => '948', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '949', + ), + 4927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '382', + 'prev_word_id' => '949', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1595', + ), + 4928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '383', + 'prev_word_id' => '1595', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1596', + ), + 4929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '384', + 'prev_word_id' => '1596', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '963', + ), + 4930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '385', + 'prev_word_id' => '963', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '825', + ), + 4931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '386', + 'prev_word_id' => '825', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1597', + ), + 4932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '387', + 'prev_word_id' => '1597', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '893', + ), + 4933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '388', + 'prev_word_id' => '893', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '389', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '973', + ), + 4935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '390', + 'prev_word_id' => '973', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '391', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1595', + ), + 4937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '392', + 'prev_word_id' => '1595', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '921', + ), + 4938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '393', + 'prev_word_id' => '921', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1414', + ), + 4939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1635', + 'placement' => '394', + 'prev_word_id' => '1414', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1290', + ), + 4940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '395', + 'prev_word_id' => '1290', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1635', + ), + 4941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '396', + 'prev_word_id' => '1635', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1598', + ), + 4942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '397', + 'prev_word_id' => '1598', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '398', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '933', + ), + 4944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '399', + 'prev_word_id' => '933', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '825', + ), + 4945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '400', + 'prev_word_id' => '825', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 4946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '401', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1688', + ), + 4947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '402', + 'prev_word_id' => '1688', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '403', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '404', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1689', + ), + 4950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '405', + 'prev_word_id' => '1689', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1690', + ), + 4951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '406', + 'prev_word_id' => '1690', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1595', + ), + 4952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '407', + 'prev_word_id' => '1595', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '815', + ), + 4953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1295', + 'placement' => '408', + 'prev_word_id' => '815', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1691', + 'placement' => '409', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1295', + ), + 4955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '410', + 'prev_word_id' => '1295', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1691', + ), + 4956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '411', + 'prev_word_id' => '1691', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '412', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '413', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 4959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '414', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '973', + ), + 4960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '415', + 'prev_word_id' => '973', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1692', + 'placement' => '416', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '417', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1692', + ), + 4963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '418', + 'prev_word_id' => '1692', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 4964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '419', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '848', + ), + 4965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '420', + 'prev_word_id' => '848', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1468', + 'placement' => '421', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1577', + ), + 4967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '422', + 'prev_word_id' => '1577', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1468', + ), + 4968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '423', + 'prev_word_id' => '1468', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 4969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '424', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1693', + 'placement' => '425', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '805', + ), + 4971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '426', + 'prev_word_id' => '805', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1693', + ), + 4972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '427', + 'prev_word_id' => '1693', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '428', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1694', + 'placement' => '429', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 4975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '430', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1694', + ), + 4976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '431', + 'prev_word_id' => '1694', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '432', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1024', + ), + 4978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '433', + 'prev_word_id' => '1024', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 4979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1695', + 'placement' => '434', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 4980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '435', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1695', + ), + 4981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1696', + 'placement' => '436', + 'prev_word_id' => '1695', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 4982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '437', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1696', + ), + 4983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1697', + 'placement' => '438', + 'prev_word_id' => '1696', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 4984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '439', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1697', + ), + 4985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '905', + 'placement' => '440', + 'prev_word_id' => '1697', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 4986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '441', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '905', + ), + 4987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '442', + 'prev_word_id' => '905', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1598', + ), + 4988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '443', + 'prev_word_id' => '1598', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1522', + ), + 4989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '444', + 'prev_word_id' => '1522', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 4990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '445', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 4991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '446', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1646', + ), + 4992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '447', + 'prev_word_id' => '1646', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '836', + ), + 4993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '448', + 'prev_word_id' => '836', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1685', + ), + 4994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '449', + 'prev_word_id' => '1685', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 4995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '450', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '939', + ), + 4996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '451', + 'prev_word_id' => '939', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1598', + ), + 4997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '452', + 'prev_word_id' => '1598', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1522', + ), + 4998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '453', + 'prev_word_id' => '1522', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '809', + ), + 4999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '454', + 'prev_word_id' => '809', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 5000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '455', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1690', + ), + 5001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '456', + 'prev_word_id' => '1690', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1595', + ), + 5002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '457', + 'prev_word_id' => '1595', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '815', + ), + 5003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '458', + 'prev_word_id' => '815', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 5004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '459', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 5005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '460', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1698', + ), + 5006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1600', + 'placement' => '461', + 'prev_word_id' => '1698', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1384', + ), + 5007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '462', + 'prev_word_id' => '1384', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1600', + ), + 5008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '463', + 'prev_word_id' => '1600', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '825', + ), + 5009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1497', + 'placement' => '464', + 'prev_word_id' => '825', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1597', + ), + 5010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '465', + 'prev_word_id' => '1597', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1497', + ), + 5011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '466', + 'prev_word_id' => '1497', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '467', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1699', + 'placement' => '468', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1396', + ), + 5014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1700', + 'placement' => '469', + 'prev_word_id' => '1396', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1699', + ), + 5015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '470', + 'prev_word_id' => '1699', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1700', + ), + 5016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1701', + 'placement' => '471', + 'prev_word_id' => '1700', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 5017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '472', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1701', + ), + 5018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1600', + 'placement' => '473', + 'prev_word_id' => '1701', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 5019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1702', + 'placement' => '474', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1600', + ), + 5020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '475', + 'prev_word_id' => '1600', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1702', + ), + 5021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '476', + 'prev_word_id' => '1702', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 5022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1497', + 'placement' => '477', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 5023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1703', + 'placement' => '478', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1497', + ), + 5024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '479', + 'prev_word_id' => '1497', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1703', + ), + 5025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '480', + 'prev_word_id' => '1703', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1277', + ), + 5026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '481', + 'prev_word_id' => '1277', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 5027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '482', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1522', + ), + 5028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '483', + 'prev_word_id' => '1522', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 5029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '484', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '895', + ), + 5030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '962', + 'placement' => '485', + 'prev_word_id' => '895', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '881', + ), + 5031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1704', + 'placement' => '486', + 'prev_word_id' => '881', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '962', + ), + 5032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '487', + 'prev_word_id' => '962', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1704', + ), + 5033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '488', + 'prev_word_id' => '1704', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 5034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '489', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 5035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '490', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '821', + ), + 5036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '491', + 'prev_word_id' => '821', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '933', + ), + 5037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1705', + 'placement' => '492', + 'prev_word_id' => '933', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '945', + ), + 5038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '493', + 'prev_word_id' => '945', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1705', + ), + 5039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '494', + 'prev_word_id' => '1705', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '810', + ), + 5040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '495', + 'prev_word_id' => '810', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '933', + ), + 5041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '496', + 'prev_word_id' => '933', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '805', + ), + 5042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '497', + 'prev_word_id' => '805', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1420', + ), + 5043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '498', + 'prev_word_id' => '1420', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1024', + ), + 5044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '499', + 'prev_word_id' => '1024', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 5045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '500', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 5046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '501', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 5047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '502', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 5048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '503', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '930', + ), + 5049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '504', + 'prev_word_id' => '930', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '813', + ), + 5050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '505', + 'prev_word_id' => '813', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 5051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '506', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '821', + ), + 5052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '507', + 'prev_word_id' => '821', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 5053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '508', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '509', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 5055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '510', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 5056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '511', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '881', + ), + 5057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '512', + 'prev_word_id' => '881', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '513', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1706', + 'placement' => '514', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 5060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '515', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1706', + ), + 5061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1707', + 'placement' => '516', + 'prev_word_id' => '1706', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 5062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '517', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1707', + ), + 5063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '518', + 'prev_word_id' => '1707', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1609', + ), + 5064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1700', + 'placement' => '519', + 'prev_word_id' => '1609', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '933', + ), + 5065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '520', + 'prev_word_id' => '933', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1700', + ), + 5066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '521', + 'prev_word_id' => '1700', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '816', + ), + 5067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1708', + 'placement' => '522', + 'prev_word_id' => '816', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 5068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '523', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1708', + ), + 5069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '524', + 'prev_word_id' => '1708', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '815', + ), + 5070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '525', + 'prev_word_id' => '815', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '823', + ), + 5071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '526', + 'prev_word_id' => '823', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '933', + ), + 5072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1505', + 'placement' => '527', + 'prev_word_id' => '933', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '945', + ), + 5073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '528', + 'prev_word_id' => '945', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1505', + ), + 5074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1709', + 'placement' => '529', + 'prev_word_id' => '1505', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 5075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '530', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1709', + ), + 5076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1599', + 'placement' => '531', + 'prev_word_id' => '1709', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '841', + ), + 5077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '532', + 'prev_word_id' => '841', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1599', + ), + 5078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1710', + 'placement' => '533', + 'prev_word_id' => '1599', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1370', + ), + 5079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1711', + 'placement' => '534', + 'prev_word_id' => '1370', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1710', + ), + 5080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1253', + 'placement' => '535', + 'prev_word_id' => '1710', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1711', + ), + 5081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '536', + 'prev_word_id' => '1711', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1253', + ), + 5082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '537', + 'prev_word_id' => '1253', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '860', + ), + 5083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1712', + 'placement' => '538', + 'prev_word_id' => '860', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 5084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '539', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1712', + ), + 5085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '540', + 'prev_word_id' => '1712', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '886', + ), + 5086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '541', + 'prev_word_id' => '886', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1443', + ), + 5087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '542', + 'prev_word_id' => '1443', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1673', + ), + 5088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '543', + 'prev_word_id' => '1673', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 5089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '544', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '545', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '546', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1370', + ), + 5092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '547', + 'prev_word_id' => '1370', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '906', + ), + 5093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '548', + 'prev_word_id' => '906', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 5094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1344', + 'placement' => '549', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '930', + ), + 5095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '550', + 'prev_word_id' => '930', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1344', + ), + 5096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '551', + 'prev_word_id' => '1344', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 5097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1316', + 'placement' => '552', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '846', + ), + 5098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '553', + 'prev_word_id' => '846', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1316', + ), + 5099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '554', + 'prev_word_id' => '1316', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1481', + ), + 5100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '555', + 'prev_word_id' => '1481', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 5101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '556', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '897', + ), + 5102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '557', + 'prev_word_id' => '897', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1609', + ), + 5103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '558', + 'prev_word_id' => '1609', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '830', + ), + 5104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '559', + 'prev_word_id' => '830', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '976', + ), + 5105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '560', + 'prev_word_id' => '976', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '974', + ), + 5106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '561', + 'prev_word_id' => '974', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '562', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '563', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '807', + ), + 5109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '564', + 'prev_word_id' => '807', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '894', + ), + 5110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '565', + 'prev_word_id' => '894', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '843', + ), + 5111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '566', + 'prev_word_id' => '843', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '881', + ), + 5112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1612', + 'placement' => '567', + 'prev_word_id' => '881', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '814', + ), + 5113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '568', + 'prev_word_id' => '814', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1612', + ), + 5114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '569', + 'prev_word_id' => '1612', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1481', + ), + 5115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '570', + 'prev_word_id' => '1481', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1713', + ), + 5116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '571', + 'prev_word_id' => '1713', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '863', + ), + 5117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '572', + 'prev_word_id' => '863', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '573', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '574', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '801', + ), + 5120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '575', + 'prev_word_id' => '801', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1698', + ), + 5121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '576', + 'prev_word_id' => '1698', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '921', + ), + 5122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '577', + 'prev_word_id' => '921', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '815', + ), + 5123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1699', + 'placement' => '578', + 'prev_word_id' => '815', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '833', + ), + 5124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '579', + 'prev_word_id' => '833', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1699', + ), + 5125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1714', + 'placement' => '580', + 'prev_word_id' => '1699', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1547', + ), + 5126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '581', + 'prev_word_id' => '1547', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1714', + ), + 5127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '582', + 'prev_word_id' => '1714', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1715', + ), + 5128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '583', + 'prev_word_id' => '1715', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '584', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '897', + ), + 5130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '585', + 'prev_word_id' => '897', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '805', + ), + 5131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '586', + 'prev_word_id' => '805', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '898', + ), + 5132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '587', + 'prev_word_id' => '898', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1133', + ), + 5133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '588', + 'prev_word_id' => '1133', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1481', + ), + 5134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '589', + 'prev_word_id' => '1481', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1307', + ), + 5135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '590', + 'prev_word_id' => '1307', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '816', + ), + 5136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '591', + 'prev_word_id' => '816', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '802', + ), + 5137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '592', + 'prev_word_id' => '802', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '803', + ), + 5138 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9808', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '593', + 'prev_word_id' => '803', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1191', + ), + 5139 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '108', + 'frequency' => '0', + 'id' => '9809', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '594', + 'prev_word_id' => '1191', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1191', + ), + 5140 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '109', + 'frequency' => '0', + 'id' => '9810', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5141 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '109', + 'frequency' => '0', + 'id' => '9811', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5142 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '110', + 'frequency' => '0', + 'id' => '9812', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5143 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '110', + 'frequency' => '0', + 'id' => '9813', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5144 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '111', + 'frequency' => '0', + 'id' => '9814', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5145 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '111', + 'frequency' => '0', + 'id' => '9815', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154186', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5146 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '112', + 'frequency' => '0', + 'id' => '9816', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5147 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '112', + 'frequency' => '0', + 'id' => '9817', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5148 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '113', + 'frequency' => '0', + 'id' => '9818', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5149 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '113', + 'frequency' => '0', + 'id' => '9819', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5150 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '114', + 'frequency' => '0', + 'id' => '9820', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5151 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '114', + 'frequency' => '0', + 'id' => '9821', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5152 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '115', + 'frequency' => '0', + 'id' => '9822', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5153 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '115', + 'frequency' => '0', + 'id' => '9823', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5154 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '116', + 'frequency' => '0', + 'id' => '9824', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5155 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '116', + 'frequency' => '0', + 'id' => '9825', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5156 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '117', + 'frequency' => '0', + 'id' => '9826', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5157 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '117', + 'frequency' => '0', + 'id' => '9827', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5158 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9828', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '936', + ), + 5159 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9829', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1717', + 'placement' => '1', + 'prev_word_id' => '936', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5160 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9830', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '2', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1717', + ), + 5161 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9831', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '3', + 'prev_word_id' => '1717', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5162 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9832', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '4', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5163 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9833', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1718', + 'placement' => '5', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5164 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9834', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '6', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1718', + ), + 5165 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9835', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '7', + 'prev_word_id' => '1718', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5166 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9836', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '817', + 'placement' => '8', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '809', + ), + 5167 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9837', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '9', + 'prev_word_id' => '809', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '817', + ), + 5168 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9838', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1720', + 'placement' => '10', + 'prev_word_id' => '817', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1719', + ), + 5169 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9839', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '11', + 'prev_word_id' => '1719', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1720', + ), + 5170 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9840', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '12', + 'prev_word_id' => '1720', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '974', + ), + 5171 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9841', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '13', + 'prev_word_id' => '974', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '821', + ), + 5172 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9842', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '14', + 'prev_word_id' => '821', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5173 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9843', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '15', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5174 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9844', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '16', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1689', + ), + 5175 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9845', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '17', + 'prev_word_id' => '1689', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1384', + ), + 5176 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9846', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '18', + 'prev_word_id' => '1384', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1370', + ), + 5177 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9847', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '19', + 'prev_word_id' => '1370', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5178 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9848', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '20', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '906', + ), + 5179 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9849', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '21', + 'prev_word_id' => '906', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '836', + ), + 5180 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9850', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '22', + 'prev_word_id' => '836', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1685', + ), + 5181 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9851', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1717', + 'placement' => '23', + 'prev_word_id' => '1685', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5182 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9852', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1721', + 'placement' => '24', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1717', + ), + 5183 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9853', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '25', + 'prev_word_id' => '1717', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1721', + ), + 5184 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9854', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '26', + 'prev_word_id' => '1721', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5185 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9855', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '27', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5186 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9856', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '28', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '930', + ), + 5187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '29', + 'prev_word_id' => '930', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '931', + ), + 5188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1722', + 'placement' => '30', + 'prev_word_id' => '931', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '822', + ), + 5189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '31', + 'prev_word_id' => '822', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1722', + ), + 5190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '32', + 'prev_word_id' => '1722', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '33', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '856', + ), + 5192 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1723', + 'placement' => '34', + 'prev_word_id' => '856', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1719', + ), + 5193 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1724', + 'placement' => '35', + 'prev_word_id' => '1719', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1723', + ), + 5194 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '36', + 'prev_word_id' => '1723', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1724', + ), + 5195 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1725', + 'placement' => '37', + 'prev_word_id' => '1724', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5196 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1726', + 'placement' => '38', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1725', + ), + 5197 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '39', + 'prev_word_id' => '1725', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1726', + ), + 5198 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1727', + 'placement' => '40', + 'prev_word_id' => '1726', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5199 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '41', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1727', + ), + 5200 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '42', + 'prev_word_id' => '1727', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5201 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '43', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1728', + ), + 5202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1729', + 'placement' => '44', + 'prev_word_id' => '1728', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '45', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1729', + ), + 5204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '46', + 'prev_word_id' => '1729', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '945', + ), + 5205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '47', + 'prev_word_id' => '945', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1690', + ), + 5206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1730', + 'placement' => '48', + 'prev_word_id' => '1690', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '49', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1730', + ), + 5208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '50', + 'prev_word_id' => '1730', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1481', + ), + 5209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1731', + 'placement' => '51', + 'prev_word_id' => '1481', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1713', + ), + 5210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '52', + 'prev_word_id' => '1713', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1731', + ), + 5211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1732', + 'placement' => '53', + 'prev_word_id' => '1731', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '54', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1732', + ), + 5213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '55', + 'prev_word_id' => '1732', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '56', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1733', + ), + 5215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '57', + 'prev_word_id' => '1733', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '931', + ), + 5216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '58', + 'prev_word_id' => '931', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '822', + ), + 5217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '59', + 'prev_word_id' => '822', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '60', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '61', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '62', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '63', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '64', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1660', + 'placement' => '65', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '66', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1660', + ), + 5225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1734', + 'placement' => '67', + 'prev_word_id' => '1660', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '68', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1734', + ), + 5227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '918', + 'placement' => '69', + 'prev_word_id' => '1734', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1735', + 'placement' => '70', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '918', + ), + 5229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '71', + 'prev_word_id' => '918', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1735', + ), + 5230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '72', + 'prev_word_id' => '1735', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '73', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '931', + ), + 5232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '74', + 'prev_word_id' => '931', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '822', + ), + 5233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '75', + 'prev_word_id' => '822', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '805', + ), + 5234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '862', + 'placement' => '76', + 'prev_word_id' => '805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1490', + 'placement' => '77', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '862', + ), + 5236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '78', + 'prev_word_id' => '862', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1490', + ), + 5237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '79', + 'prev_word_id' => '1490', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1639', + ), + 5238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1616', + 'placement' => '80', + 'prev_word_id' => '1639', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '822', + ), + 5239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '81', + 'prev_word_id' => '822', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1616', + ), + 5240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1736', + 'placement' => '82', + 'prev_word_id' => '1616', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1733', + ), + 5241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '83', + 'prev_word_id' => '1733', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1736', + ), + 5242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '84', + 'prev_word_id' => '1736', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '85', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '86', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '831', + ), + 5245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '87', + 'prev_word_id' => '831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '88', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1665', + ), + 5247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '89', + 'prev_word_id' => '1665', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1410', + ), + 5248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '90', + 'prev_word_id' => '1410', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1569', + ), + 5249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '91', + 'prev_word_id' => '1569', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1410', + ), + 5250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '92', + 'prev_word_id' => '1410', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '93', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '831', + ), + 5252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1737', + 'placement' => '94', + 'prev_word_id' => '831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1300', + ), + 5253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '95', + 'prev_word_id' => '1300', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1737', + ), + 5254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '96', + 'prev_word_id' => '1737', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '97', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '834', + ), + 5256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '861', + 'placement' => '98', + 'prev_word_id' => '834', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1738', + 'placement' => '99', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '861', + ), + 5258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '100', + 'prev_word_id' => '861', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1738', + ), + 5259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '101', + 'prev_word_id' => '1738', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1739', + 'placement' => '102', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1740', + 'placement' => '103', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1739', + ), + 5262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1741', + 'placement' => '104', + 'prev_word_id' => '1739', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1740', + ), + 5263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '923', + 'placement' => '105', + 'prev_word_id' => '1740', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1741', + ), + 5264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '106', + 'prev_word_id' => '1741', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '923', + ), + 5265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '107', + 'prev_word_id' => '923', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '108', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '109', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '110', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '111', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '931', + ), + 5270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1722', + 'placement' => '112', + 'prev_word_id' => '931', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '822', + ), + 5271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1742', + 'placement' => '113', + 'prev_word_id' => '822', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1722', + ), + 5272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '114', + 'prev_word_id' => '1722', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1742', + ), + 5273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '115', + 'prev_word_id' => '1742', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '831', + ), + 5274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '116', + 'prev_word_id' => '831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '117', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '856', + ), + 5276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '118', + 'prev_word_id' => '856', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1719', + ), + 5277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '119', + 'prev_word_id' => '1719', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '120', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '121', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '122', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '856', + ), + 5281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '123', + 'prev_word_id' => '856', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '832', + ), + 5282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '124', + 'prev_word_id' => '832', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '805', + ), + 5283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1743', + 'placement' => '125', + 'prev_word_id' => '805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1690', + ), + 5284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '126', + 'prev_word_id' => '1690', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1743', + ), + 5285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '853', + 'placement' => '127', + 'prev_word_id' => '1743', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '128', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '853', + ), + 5287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '129', + 'prev_word_id' => '853', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '854', + ), + 5288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1744', + 'placement' => '130', + 'prev_word_id' => '854', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '804', + ), + 5289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '131', + 'prev_word_id' => '804', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1744', + ), + 5290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '132', + 'prev_word_id' => '1744', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '133', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1745', + 'placement' => '134', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '135', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1745', + ), + 5294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '136', + 'prev_word_id' => '1745', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '137', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '954', + ), + 5296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '138', + 'prev_word_id' => '954', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '823', + ), + 5297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '139', + 'prev_word_id' => '823', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '140', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '952', + ), + 5299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '141', + 'prev_word_id' => '952', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '142', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '930', + ), + 5301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '143', + 'prev_word_id' => '930', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '856', + ), + 5302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '144', + 'prev_word_id' => '856', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1746', + 'placement' => '145', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '146', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1746', + ), + 5305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1618', + 'placement' => '147', + 'prev_word_id' => '1746', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '148', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1618', + ), + 5307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '149', + 'prev_word_id' => '1618', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1651', + ), + 5308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1747', + 'placement' => '150', + 'prev_word_id' => '1651', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '151', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1747', + ), + 5310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '152', + 'prev_word_id' => '1747', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '904', + 'placement' => '153', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '823', + ), + 5312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '154', + 'prev_word_id' => '823', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '904', + ), + 5313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '155', + 'prev_word_id' => '904', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1748', + 'placement' => '156', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '901', + ), + 5315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '157', + 'prev_word_id' => '901', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1748', + ), + 5316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '158', + 'prev_word_id' => '1748', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '159', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '160', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '161', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '162', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1749', + ), + 5321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1750', + 'placement' => '163', + 'prev_word_id' => '1749', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '164', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1750', + ), + 5323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1751', + 'placement' => '165', + 'prev_word_id' => '1750', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1752', + 'placement' => '166', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1751', + ), + 5325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '167', + 'prev_word_id' => '1751', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1752', + ), + 5326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '168', + 'prev_word_id' => '1752', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '169', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '170', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '9999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '171', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '172', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1258', + ), + 5331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1753', + 'placement' => '173', + 'prev_word_id' => '1258', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '823', + ), + 5332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '174', + 'prev_word_id' => '823', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1753', + ), + 5333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1723', + 'placement' => '175', + 'prev_word_id' => '1753', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1385', + ), + 5334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '176', + 'prev_word_id' => '1385', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1723', + ), + 5335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '177', + 'prev_word_id' => '1723', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '178', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '179', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1530', + ), + 5338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '180', + 'prev_word_id' => '1530', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '809', + ), + 5339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1612', + 'placement' => '181', + 'prev_word_id' => '809', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '898', + ), + 5340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '182', + 'prev_word_id' => '898', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1612', + ), + 5341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1754', + 'placement' => '183', + 'prev_word_id' => '1612', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '941', + ), + 5342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '184', + 'prev_word_id' => '941', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1754', + ), + 5343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '185', + 'prev_word_id' => '1754', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '898', + ), + 5344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '186', + 'prev_word_id' => '898', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1749', + ), + 5345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '187', + 'prev_word_id' => '1749', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '188', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '804', + ), + 5347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '189', + 'prev_word_id' => '804', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '805', + ), + 5348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '190', + 'prev_word_id' => '805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '191', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1673', + ), + 5350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1755', + 'placement' => '192', + 'prev_word_id' => '1673', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '193', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1755', + ), + 5352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '194', + 'prev_word_id' => '1755', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '832', + ), + 5353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1756', + 'placement' => '195', + 'prev_word_id' => '832', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '196', + 'prev_word_id' => '1417', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1756', + ), + 5355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1757', + 'placement' => '197', + 'prev_word_id' => '1756', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '898', + ), + 5356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1758', + 'placement' => '198', + 'prev_word_id' => '898', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1757', + ), + 5357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '199', + 'prev_word_id' => '1757', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1758', + ), + 5358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1759', + 'placement' => '200', + 'prev_word_id' => '1758', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '201', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1759', + ), + 5360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '202', + 'prev_word_id' => '1759', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1760', + 'placement' => '203', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1275', + 'placement' => '204', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1760', + ), + 5363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '205', + 'prev_word_id' => '1760', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1275', + ), + 5364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '206', + 'prev_word_id' => '1275', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '207', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '208', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '932', + ), + 5367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '209', + 'prev_word_id' => '932', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1689', + ), + 5368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '210', + 'prev_word_id' => '1689', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1761', + ), + 5369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '211', + 'prev_word_id' => '1761', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '898', + ), + 5370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1762', + 'placement' => '212', + 'prev_word_id' => '898', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1683', + ), + 5371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '213', + 'prev_word_id' => '1683', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1762', + ), + 5372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '214', + 'prev_word_id' => '1762', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '215', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '974', + ), + 5374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '216', + 'prev_word_id' => '974', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '217', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1689', + ), + 5376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1763', + 'placement' => '218', + 'prev_word_id' => '1689', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '219', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1763', + ), + 5378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '220', + 'prev_word_id' => '1763', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '221', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1443', + ), + 5380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '222', + 'prev_word_id' => '1443', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '223', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1689', + ), + 5382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1764', + 'placement' => '224', + 'prev_word_id' => '1689', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '225', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1764', + ), + 5384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '226', + 'prev_word_id' => '1764', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1277', + ), + 5385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '227', + 'prev_word_id' => '1277', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '898', + ), + 5386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '228', + 'prev_word_id' => '898', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '932', + ), + 5387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1765', + 'placement' => '229', + 'prev_word_id' => '932', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1766', + 'placement' => '230', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1765', + ), + 5389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1586', + 'placement' => '231', + 'prev_word_id' => '1765', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1766', + ), + 5390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '232', + 'prev_word_id' => '1766', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1586', + ), + 5391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '233', + 'prev_word_id' => '1586', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1761', + ), + 5392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '234', + 'prev_word_id' => '1761', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '836', + ), + 5393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '235', + 'prev_word_id' => '836', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '236', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '237', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1549', + ), + 5396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1767', + 'placement' => '238', + 'prev_word_id' => '1549', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1410', + ), + 5397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1766', + 'placement' => '239', + 'prev_word_id' => '1410', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1767', + ), + 5398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1586', + 'placement' => '240', + 'prev_word_id' => '1767', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1766', + ), + 5399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1768', + 'placement' => '241', + 'prev_word_id' => '1766', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1586', + ), + 5400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '242', + 'prev_word_id' => '1586', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1768', + ), + 5401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '243', + 'prev_word_id' => '1768', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '244', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '245', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1761', + ), + 5404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '246', + 'prev_word_id' => '1761', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '976', + ), + 5405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '861', + 'placement' => '247', + 'prev_word_id' => '976', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1769', + 'placement' => '248', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '861', + ), + 5407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '249', + 'prev_word_id' => '861', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1769', + ), + 5408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '250', + 'prev_word_id' => '1769', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '893', + ), + 5409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1770', + 'placement' => '251', + 'prev_word_id' => '893', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '252', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1770', + ), + 5411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '253', + 'prev_word_id' => '1770', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1056', + ), + 5412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1771', + 'placement' => '254', + 'prev_word_id' => '1056', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '805', + ), + 5413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '255', + 'prev_word_id' => '805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1771', + ), + 5414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '256', + 'prev_word_id' => '1771', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1008', + ), + 5415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '257', + 'prev_word_id' => '1008', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '258', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '932', + ), + 5417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '259', + 'prev_word_id' => '932', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '836', + ), + 5418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '260', + 'prev_word_id' => '836', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '261', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '262', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1549', + ), + 5421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1772', + 'placement' => '263', + 'prev_word_id' => '1549', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1410', + ), + 5422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '264', + 'prev_word_id' => '1410', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1772', + ), + 5423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '265', + 'prev_word_id' => '1772', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '948', + ), + 5424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '266', + 'prev_word_id' => '948', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '949', + ), + 5425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '267', + 'prev_word_id' => '949', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1420', + ), + 5426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '268', + 'prev_word_id' => '1420', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1749', + ), + 5427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '269', + 'prev_word_id' => '1749', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '805', + ), + 5428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1773', + 'placement' => '270', + 'prev_word_id' => '805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1774', + 'placement' => '271', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1773', + ), + 5430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '272', + 'prev_word_id' => '1773', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1774', + ), + 5431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '273', + 'prev_word_id' => '1774', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1713', + ), + 5432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '274', + 'prev_word_id' => '1713', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '275', + 'prev_word_id' => '1417', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '845', + 'placement' => '276', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '277', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '845', + ), + 5436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1717', + 'placement' => '278', + 'prev_word_id' => '845', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1775', + 'placement' => '279', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1717', + ), + 5438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '280', + 'prev_word_id' => '1717', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1775', + ), + 5439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '281', + 'prev_word_id' => '1775', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '976', + ), + 5440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '961', + 'placement' => '282', + 'prev_word_id' => '976', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '283', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '961', + ), + 5442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1776', + 'placement' => '284', + 'prev_word_id' => '961', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '285', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1776', + ), + 5444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '286', + 'prev_word_id' => '1776', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '856', + ), + 5445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1777', + 'placement' => '287', + 'prev_word_id' => '856', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1778', + 'placement' => '288', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1777', + ), + 5447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '289', + 'prev_word_id' => '1777', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1778', + ), + 5448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '290', + 'prev_word_id' => '1778', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1779', + 'placement' => '291', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '890', + ), + 5450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '292', + 'prev_word_id' => '890', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1779', + ), + 5451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '293', + 'prev_word_id' => '1779', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1517', + ), + 5452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1780', + 'placement' => '294', + 'prev_word_id' => '1517', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '950', + 'placement' => '295', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1780', + ), + 5454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '296', + 'prev_word_id' => '1780', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '950', + ), + 5455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '297', + 'prev_word_id' => '950', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '298', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1404', + ), + 5457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1724', + 'placement' => '299', + 'prev_word_id' => '1404', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '976', + ), + 5458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '300', + 'prev_word_id' => '976', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1724', + ), + 5459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1725', + 'placement' => '301', + 'prev_word_id' => '1724', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1726', + 'placement' => '302', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1725', + ), + 5461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1276', + 'placement' => '303', + 'prev_word_id' => '1725', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1726', + ), + 5462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '304', + 'prev_word_id' => '1726', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1276', + ), + 5463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '305', + 'prev_word_id' => '1276', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '856', + ), + 5464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1781', + 'placement' => '306', + 'prev_word_id' => '856', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1562', + 'placement' => '307', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1781', + ), + 5466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '308', + 'prev_word_id' => '1781', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1562', + ), + 5467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '309', + 'prev_word_id' => '1562', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '310', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1782', + 'placement' => '311', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1606', + ), + 5470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '312', + 'prev_word_id' => '1606', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1782', + ), + 5471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '313', + 'prev_word_id' => '1782', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '823', + ), + 5472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '314', + 'prev_word_id' => '823', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '959', + ), + 5473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1765', + 'placement' => '315', + 'prev_word_id' => '959', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '316', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1765', + ), + 5475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1503', + 'placement' => '317', + 'prev_word_id' => '1765', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '318', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1503', + ), + 5477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1783', + 'placement' => '319', + 'prev_word_id' => '1503', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '320', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1783', + ), + 5479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1784', + 'placement' => '321', + 'prev_word_id' => '1783', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '823', + ), + 5480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '322', + 'prev_word_id' => '823', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1784', + ), + 5481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '323', + 'prev_word_id' => '1784', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '324', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '325', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '326', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1702', + 'placement' => '327', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1785', + 'placement' => '328', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1702', + ), + 5487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1786', + 'placement' => '329', + 'prev_word_id' => '1702', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1785', + ), + 5488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '330', + 'prev_word_id' => '1785', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1786', + ), + 5489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '331', + 'prev_word_id' => '1786', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '332', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '333', + 'prev_word_id' => '1417', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1788', + 'placement' => '334', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1787', + ), + 5493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1789', + 'placement' => '335', + 'prev_word_id' => '1787', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1788', + ), + 5494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '336', + 'prev_word_id' => '1788', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1789', + ), + 5495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '337', + 'prev_word_id' => '1789', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1008', + ), + 5496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '338', + 'prev_word_id' => '1008', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '339', + 'prev_word_id' => '1417', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '930', + ), + 5498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '340', + 'prev_word_id' => '930', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '825', + ), + 5499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '341', + 'prev_word_id' => '825', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1790', + ), + 5500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '342', + 'prev_word_id' => '1790', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1688', + ), + 5501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '343', + 'prev_word_id' => '1688', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '344', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1791', + ), + 5503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '345', + 'prev_word_id' => '1791', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '346', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1073', + ), + 5505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1792', + 'placement' => '347', + 'prev_word_id' => '1073', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '348', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1792', + ), + 5507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '349', + 'prev_word_id' => '1792', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '350', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1793', + 'placement' => '351', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '352', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1793', + ), + 5511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '353', + 'prev_word_id' => '1793', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1056', + ), + 5512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1727', + 'placement' => '354', + 'prev_word_id' => '1056', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '355', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1727', + ), + 5514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '356', + 'prev_word_id' => '1727', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '357', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1728', + ), + 5516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '358', + 'prev_word_id' => '1728', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '945', + ), + 5517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '359', + 'prev_word_id' => '945', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1504', + 'placement' => '360', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '805', + ), + 5519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1794', + 'placement' => '361', + 'prev_word_id' => '805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1504', + ), + 5520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '362', + 'prev_word_id' => '1504', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1794', + ), + 5521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '923', + 'placement' => '363', + 'prev_word_id' => '1794', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1447', + ), + 5522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '364', + 'prev_word_id' => '1447', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '923', + ), + 5523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '365', + 'prev_word_id' => '923', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '945', + ), + 5524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1664', + 'placement' => '366', + 'prev_word_id' => '945', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1337', + ), + 5525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '367', + 'prev_word_id' => '1337', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1664', + ), + 5526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '368', + 'prev_word_id' => '1664', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '976', + ), + 5527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1795', + 'placement' => '369', + 'prev_word_id' => '976', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '974', + ), + 5528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '370', + 'prev_word_id' => '974', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1795', + ), + 5529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1796', + 'placement' => '371', + 'prev_word_id' => '1795', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1797', + 'placement' => '372', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1796', + ), + 5531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '373', + 'prev_word_id' => '1796', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1797', + ), + 5532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '374', + 'prev_word_id' => '1797', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '901', + ), + 5533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1798', + 'placement' => '375', + 'prev_word_id' => '901', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '376', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1798', + ), + 5535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1799', + 'placement' => '377', + 'prev_word_id' => '1798', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1800', + 'placement' => '378', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1799', + ), + 5537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '379', + 'prev_word_id' => '1799', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1800', + ), + 5538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '924', + 'placement' => '380', + 'prev_word_id' => '1800', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '901', + ), + 5539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '381', + 'prev_word_id' => '901', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '924', + ), + 5540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '382', + 'prev_word_id' => '924', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1801', + 'placement' => '383', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '974', + ), + 5542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '384', + 'prev_word_id' => '974', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1801', + ), + 5543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '385', + 'prev_word_id' => '1801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '386', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '921', + ), + 5545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '387', + 'prev_word_id' => '921', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '388', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '389', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1689', + ), + 5548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1802', + 'placement' => '390', + 'prev_word_id' => '1689', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '391', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1802', + ), + 5550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '392', + 'prev_word_id' => '1802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '393', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1713', + ), + 5552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '394', + 'prev_word_id' => '1713', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1803', + 'placement' => '395', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1606', + ), + 5554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '396', + 'prev_word_id' => '1606', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1803', + ), + 5555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '397', + 'prev_word_id' => '1803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '398', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '939', + ), + 5557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '399', + 'prev_word_id' => '939', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1560', + ), + 5558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1804', + 'placement' => '400', + 'prev_word_id' => '1560', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1601', + 'placement' => '401', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1804', + ), + 5560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '402', + 'prev_word_id' => '1804', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1601', + ), + 5561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1805', + 'placement' => '403', + 'prev_word_id' => '1601', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1277', + ), + 5562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '404', + 'prev_word_id' => '1277', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1805', + ), + 5563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1806', + 'placement' => '405', + 'prev_word_id' => '1805', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '954', + ), + 5564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '406', + 'prev_word_id' => '954', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1806', + ), + 5565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1729', + 'placement' => '407', + 'prev_word_id' => '1806', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '408', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1729', + ), + 5567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1602', + 'placement' => '409', + 'prev_word_id' => '1729', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '945', + ), + 5568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '410', + 'prev_word_id' => '945', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1602', + ), + 5569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1729', + 'placement' => '411', + 'prev_word_id' => '1602', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '412', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1729', + ), + 5571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '413', + 'prev_word_id' => '1729', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '945', + ), + 5572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '414', + 'prev_word_id' => '945', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1429', + ), + 5573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '415', + 'prev_word_id' => '1429', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '416', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '417', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '895', + ), + 5576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '418', + 'prev_word_id' => '895', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '881', + ), + 5577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1807', + 'placement' => '419', + 'prev_word_id' => '881', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '420', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1807', + ), + 5579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '421', + 'prev_word_id' => '1807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '422', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1809', + 'placement' => '423', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1808', + ), + 5582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1810', + 'placement' => '424', + 'prev_word_id' => '1808', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1809', + ), + 5583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1811', + 'placement' => '425', + 'prev_word_id' => '1809', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1810', + ), + 5584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '426', + 'prev_word_id' => '1810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1811', + ), + 5585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '427', + 'prev_word_id' => '1811', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '428', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '429', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1122', + 'placement' => '430', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '886', + ), + 5589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '431', + 'prev_word_id' => '886', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1122', + ), + 5590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1648', + 'placement' => '432', + 'prev_word_id' => '1122', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '433', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1648', + ), + 5592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '434', + 'prev_word_id' => '1648', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '893', + ), + 5593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1604', + 'placement' => '435', + 'prev_word_id' => '893', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '436', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1604', + ), + 5595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '437', + 'prev_word_id' => '1604', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '825', + ), + 5596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1812', + 'placement' => '438', + 'prev_word_id' => '825', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1596', + ), + 5597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '439', + 'prev_word_id' => '1596', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1812', + ), + 5598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '440', + 'prev_word_id' => '1812', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '441', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1447', + ), + 5600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '442', + 'prev_word_id' => '1447', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1319', + ), + 5601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1629', + 'placement' => '443', + 'prev_word_id' => '1319', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '444', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1629', + ), + 5603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '445', + 'prev_word_id' => '1629', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '446', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1683', + ), + 5605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1813', + 'placement' => '447', + 'prev_word_id' => '1683', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1597', + ), + 5606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '448', + 'prev_word_id' => '1597', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1813', + ), + 5607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '449', + 'prev_word_id' => '1813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '450', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1787', + ), + 5609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '451', + 'prev_word_id' => '1787', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1396', + ), + 5610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1814', + 'placement' => '452', + 'prev_word_id' => '1396', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '453', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1814', + ), + 5612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '454', + 'prev_word_id' => '1814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '825', + ), + 5613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1812', + 'placement' => '455', + 'prev_word_id' => '825', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1443', + ), + 5614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '456', + 'prev_word_id' => '1443', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1812', + ), + 5615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '457', + 'prev_word_id' => '1812', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1690', + ), + 5616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1730', + 'placement' => '458', + 'prev_word_id' => '1690', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '459', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1730', + ), + 5618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '460', + 'prev_word_id' => '1730', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1290', + ), + 5619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '461', + 'prev_word_id' => '1290', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '826', + ), + 5620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '462', + 'prev_word_id' => '826', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '463', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '464', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1815', + 'placement' => '465', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '466', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1815', + ), + 5625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '467', + 'prev_word_id' => '1815', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1384', + ), + 5626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '468', + 'prev_word_id' => '1384', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1816', + ), + 5627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '469', + 'prev_word_id' => '1816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1715', + ), + 5628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '470', + 'prev_word_id' => '1715', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '809', + ), + 5629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1817', + 'placement' => '471', + 'prev_word_id' => '809', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '472', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1817', + ), + 5631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '473', + 'prev_word_id' => '1817', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '474', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '895', + ), + 5633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '475', + 'prev_word_id' => '895', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '881', + ), + 5634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '476', + 'prev_word_id' => '881', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '477', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '815', + ), + 5636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '478', + 'prev_word_id' => '815', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '479', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '968', + ), + 5638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '480', + 'prev_word_id' => '968', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1651', + ), + 5639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '481', + 'prev_word_id' => '1651', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '482', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1816', + ), + 5641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '483', + 'prev_word_id' => '1816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1818', + ), + 5642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '484', + 'prev_word_id' => '1818', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '485', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '486', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1319', + ), + 5645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1819', + 'placement' => '487', + 'prev_word_id' => '1319', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '810', + ), + 5646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1820', + 'placement' => '488', + 'prev_word_id' => '810', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1819', + ), + 5647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '489', + 'prev_word_id' => '1819', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1820', + ), + 5648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '490', + 'prev_word_id' => '1820', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '491', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1443', + ), + 5650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '492', + 'prev_word_id' => '1443', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '974', + ), + 5651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '493', + 'prev_word_id' => '974', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1818', + ), + 5652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '494', + 'prev_word_id' => '1818', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '495', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '843', + ), + 5654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1821', + 'placement' => '496', + 'prev_word_id' => '843', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1631', + ), + 5655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '497', + 'prev_word_id' => '1631', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1821', + ), + 5656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1730', + 'placement' => '498', + 'prev_word_id' => '1821', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '804', + ), + 5657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1822', + 'placement' => '499', + 'prev_word_id' => '804', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1730', + ), + 5658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '500', + 'prev_word_id' => '1730', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1822', + ), + 5659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '501', + 'prev_word_id' => '1822', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '814', + ), + 5660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1823', + 'placement' => '502', + 'prev_word_id' => '814', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '807', + ), + 5661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '503', + 'prev_word_id' => '807', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1823', + ), + 5662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '504', + 'prev_word_id' => '1823', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '831', + ), + 5663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '505', + 'prev_word_id' => '831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1247', + ), + 5664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '506', + 'prev_word_id' => '1247', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '507', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1779', + 'placement' => '508', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1824', + 'placement' => '509', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1779', + ), + 5668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '914', + 'placement' => '510', + 'prev_word_id' => '1779', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1824', + ), + 5669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '511', + 'prev_word_id' => '1824', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '914', + ), + 5670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '512', + 'prev_word_id' => '914', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1686', + ), + 5671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '513', + 'prev_word_id' => '1686', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '831', + ), + 5672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '514', + 'prev_word_id' => '831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '515', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1481', + ), + 5674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1731', + 'placement' => '516', + 'prev_word_id' => '1481', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1713', + ), + 5675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '517', + 'prev_word_id' => '1713', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1731', + ), + 5676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '518', + 'prev_word_id' => '1731', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '802', + ), + 5677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '519', + 'prev_word_id' => '802', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '803', + ), + 5678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '520', + 'prev_word_id' => '803', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1646', + ), + 5679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '521', + 'prev_word_id' => '1646', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '836', + ), + 5680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '522', + 'prev_word_id' => '836', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1685', + ), + 5681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '523', + 'prev_word_id' => '1685', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '816', + ), + 5682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '524', + 'prev_word_id' => '816', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '894', + ), + 5683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '525', + 'prev_word_id' => '894', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '801', + ), + 5684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '526', + 'prev_word_id' => '801', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '939', + ), + 5685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '527', + 'prev_word_id' => '939', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '830', + ), + 5686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '528', + 'prev_word_id' => '830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '529', + 'prev_word_id' => '1437', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1396', + ), + 5688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1825', + 'placement' => '530', + 'prev_word_id' => '1396', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '844', + ), + 5689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1826', + 'placement' => '531', + 'prev_word_id' => '844', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1825', + ), + 5690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '532', + 'prev_word_id' => '1825', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1826', + ), + 5691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '533', + 'prev_word_id' => '1826', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1008', + ), + 5692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1827', + 'placement' => '534', + 'prev_word_id' => '1008', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1481', + ), + 5693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1828', + 'placement' => '535', + 'prev_word_id' => '1481', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1827', + ), + 5694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1829', + 'placement' => '536', + 'prev_word_id' => '1827', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1828', + ), + 5695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1679', + 'placement' => '537', + 'prev_word_id' => '1828', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1829', + ), + 5696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '538', + 'prev_word_id' => '1829', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1679', + ), + 5697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '539', + 'prev_word_id' => '1679', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '833', + ), + 5698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '540', + 'prev_word_id' => '833', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1685', + ), + 5699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '541', + 'prev_word_id' => '1685', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '831', + ), + 5700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1830', + 'placement' => '542', + 'prev_word_id' => '831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '813', + ), + 5701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1831', + 'placement' => '543', + 'prev_word_id' => '813', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1830', + ), + 5702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1832', + 'placement' => '544', + 'prev_word_id' => '1830', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1831', + ), + 5703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '545', + 'prev_word_id' => '1831', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1832', + ), + 5704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '546', + 'prev_word_id' => '1832', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '886', + ), + 5705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '547', + 'prev_word_id' => '886', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1443', + ), + 5706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '548', + 'prev_word_id' => '1443', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1673', + ), + 5707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '549', + 'prev_word_id' => '1673', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '863', + ), + 5708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '550', + 'prev_word_id' => '863', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1370', + ), + 5709 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10379', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '551', + 'prev_word_id' => '1370', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1191', + ), + 5710 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '118', + 'frequency' => '0', + 'id' => '10380', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '552', + 'prev_word_id' => '1191', + 'published' => '1311154187', + 'section_id' => '1', + 'word_id' => '1191', + ), + 5711 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '119', + 'frequency' => '0', + 'id' => '10381', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5712 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '119', + 'frequency' => '0', + 'id' => '10382', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5713 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '120', + 'frequency' => '0', + 'id' => '10383', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5714 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '120', + 'frequency' => '0', + 'id' => '10384', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5715 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '121', + 'frequency' => '0', + 'id' => '10385', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5716 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '121', + 'frequency' => '0', + 'id' => '10386', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5717 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '122', + 'frequency' => '0', + 'id' => '10387', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5718 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '122', + 'frequency' => '0', + 'id' => '10388', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154188', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5719 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '123', + 'frequency' => '0', + 'id' => '10389', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5720 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '123', + 'frequency' => '0', + 'id' => '10390', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5721 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '124', + 'frequency' => '0', + 'id' => '10391', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5722 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '124', + 'frequency' => '0', + 'id' => '10392', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5723 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '125', + 'frequency' => '0', + 'id' => '10393', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5724 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '125', + 'frequency' => '0', + 'id' => '10394', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5725 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '126', + 'frequency' => '0', + 'id' => '10395', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5726 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '126', + 'frequency' => '0', + 'id' => '10396', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1716', + ), + 5727 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10397', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '936', + ), + 5728 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10398', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '937', + 'placement' => '1', + 'prev_word_id' => '936', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 5729 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10399', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '2', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '937', + ), + 5730 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10400', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '3', + 'prev_word_id' => '937', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '809', + ), + 5731 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10401', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '4', + 'prev_word_id' => '809', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5732 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10402', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '5', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5733 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10403', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '6', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5734 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10404', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '7', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5735 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10405', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '8', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5736 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10406', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '9', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '921', + ), + 5737 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10407', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '10', + 'prev_word_id' => '921', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1414', + ), + 5738 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10408', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1833', + 'placement' => '11', + 'prev_word_id' => '1414', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5739 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10409', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '12', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1833', + ), + 5740 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10410', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1415', + 'placement' => '13', + 'prev_word_id' => '1833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '978', + ), + 5741 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10411', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '14', + 'prev_word_id' => '978', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1415', + ), + 5742 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10412', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '15', + 'prev_word_id' => '1415', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5743 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10413', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '16', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5744 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10414', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '17', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '831', + ), + 5745 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10415', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '18', + 'prev_word_id' => '831', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1320', + ), + 5746 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10416', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '19', + 'prev_word_id' => '1320', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '854', + ), + 5747 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10417', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '20', + 'prev_word_id' => '854', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '976', + ), + 5748 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10418', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1834', + 'placement' => '21', + 'prev_word_id' => '976', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5749 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10419', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '22', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1834', + ), + 5750 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10420', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '23', + 'prev_word_id' => '1834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '943', + ), + 5751 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10421', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '837', + 'placement' => '24', + 'prev_word_id' => '943', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5752 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10422', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '25', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '837', + ), + 5753 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10423', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '26', + 'prev_word_id' => '837', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1835', + ), + 5754 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10424', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1836', + 'placement' => '27', + 'prev_word_id' => '1835', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 5755 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10425', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '28', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1836', + ), + 5756 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10426', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1837', + 'placement' => '29', + 'prev_word_id' => '1836', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5757 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10427', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '30', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1837', + ), + 5758 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10428', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '31', + 'prev_word_id' => '1837', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5759 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10429', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '32', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5760 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '33', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5761 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '34', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5762 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1838', + 'placement' => '35', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1174', + ), + 5763 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '36', + 'prev_word_id' => '1174', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1838', + ), + 5764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '37', + 'prev_word_id' => '1838', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '940', + ), + 5765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '38', + 'prev_word_id' => '940', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '968', + ), + 5766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '39', + 'prev_word_id' => '968', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1839', + ), + 5767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '40', + 'prev_word_id' => '1839', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '41', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1840', + ), + 5769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '42', + 'prev_word_id' => '1840', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1547', + ), + 5770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1841', + 'placement' => '43', + 'prev_word_id' => '1547', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1548', + ), + 5771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '44', + 'prev_word_id' => '1548', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1841', + ), + 5772 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1842', + 'placement' => '45', + 'prev_word_id' => '1841', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5773 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '46', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1842', + ), + 5774 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '47', + 'prev_word_id' => '1842', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 5775 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '48', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '846', + ), + 5776 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '49', + 'prev_word_id' => '846', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5777 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '50', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5778 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '51', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '938', + ), + 5779 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '52', + 'prev_word_id' => '938', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5780 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '53', + 'prev_word_id' => '1417', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 5781 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '54', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1843', + ), + 5782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '55', + 'prev_word_id' => '1843', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '56', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '57', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1258', + ), + 5785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '58', + 'prev_word_id' => '1258', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '59', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1237', + ), + 5787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '60', + 'prev_word_id' => '1237', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '61', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1838', + 'placement' => '62', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1174', + ), + 5790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '63', + 'prev_word_id' => '1174', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1838', + ), + 5791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1844', + 'placement' => '64', + 'prev_word_id' => '1838', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1609', + ), + 5792 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '65', + 'prev_word_id' => '1609', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1844', + ), + 5793 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '66', + 'prev_word_id' => '1844', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5794 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '67', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5795 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '68', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 5796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '69', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '70', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '71', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '72', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '73', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '74', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1683', + ), + 5802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '75', + 'prev_word_id' => '1683', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '76', + 'prev_word_id' => '1417', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1845', + 'placement' => '77', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 5805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '78', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1845', + ), + 5806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '79', + 'prev_word_id' => '1845', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '80', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '81', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '901', + ), + 5809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '82', + 'prev_word_id' => '901', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '83', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1174', + ), + 5811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '84', + 'prev_word_id' => '1174', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '85', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '86', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1174', + ), + 5814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '87', + 'prev_word_id' => '1174', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1846', + 'placement' => '88', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '89', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1846', + ), + 5817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '90', + 'prev_word_id' => '1846', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1847', + 'placement' => '91', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 5819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '92', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1847', + ), + 5820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1849', + 'placement' => '93', + 'prev_word_id' => '1847', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1848', + ), + 5821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '94', + 'prev_word_id' => '1848', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1849', + ), + 5822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1850', + 'placement' => '95', + 'prev_word_id' => '1849', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '836', + ), + 5823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '96', + 'prev_word_id' => '836', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1850', + ), + 5824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1706', + 'placement' => '97', + 'prev_word_id' => '1850', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1318', + ), + 5825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '98', + 'prev_word_id' => '1318', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1706', + ), + 5826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1851', + 'placement' => '99', + 'prev_word_id' => '1706', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1609', + ), + 5827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '100', + 'prev_word_id' => '1609', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1851', + ), + 5828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '101', + 'prev_word_id' => '1851', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1848', + ), + 5829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '102', + 'prev_word_id' => '1848', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '103', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '104', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1174', + ), + 5832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1789', + 'placement' => '105', + 'prev_word_id' => '1174', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '106', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1789', + ), + 5834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '107', + 'prev_word_id' => '1789', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '917', + ), + 5835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1852', + 'placement' => '108', + 'prev_word_id' => '917', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '109', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1852', + ), + 5837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1853', + 'placement' => '110', + 'prev_word_id' => '1852', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '111', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1853', + ), + 5839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '112', + 'prev_word_id' => '1853', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1854', + 'placement' => '113', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 5841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '114', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1854', + ), + 5842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1855', + 'placement' => '115', + 'prev_word_id' => '1854', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '886', + ), + 5843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '116', + 'prev_word_id' => '886', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1855', + ), + 5844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '117', + 'prev_word_id' => '1855', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1008', + ), + 5845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1856', + 'placement' => '118', + 'prev_word_id' => '1008', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '119', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1856', + ), + 5847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '120', + 'prev_word_id' => '1856', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1857', + 'placement' => '121', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '122', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1857', + ), + 5850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '123', + 'prev_word_id' => '1857', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 5851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '124', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1854', + 'placement' => '125', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '901', + ), + 5853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '126', + 'prev_word_id' => '901', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1854', + ), + 5854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1858', + 'placement' => '127', + 'prev_word_id' => '1854', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1008', + ), + 5855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '128', + 'prev_word_id' => '1008', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1858', + ), + 5856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1859', + 'placement' => '129', + 'prev_word_id' => '1858', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1816', + ), + 5857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '130', + 'prev_word_id' => '1816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1859', + ), + 5858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '131', + 'prev_word_id' => '1859', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '836', + ), + 5859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '915', + 'placement' => '132', + 'prev_word_id' => '836', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '133', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '915', + ), + 5861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1860', + 'placement' => '134', + 'prev_word_id' => '915', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 5862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1861', + 'placement' => '135', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1860', + ), + 5863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '136', + 'prev_word_id' => '1860', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1861', + ), + 5864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1798', + 'placement' => '137', + 'prev_word_id' => '1861', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1848', + ), + 5865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '138', + 'prev_word_id' => '1848', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1798', + ), + 5866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1862', + 'placement' => '139', + 'prev_word_id' => '1798', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1863', + 'placement' => '140', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1862', + ), + 5868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1864', + 'placement' => '141', + 'prev_word_id' => '1862', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1863', + ), + 5869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '142', + 'prev_word_id' => '1863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1864', + ), + 5870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1865', + 'placement' => '143', + 'prev_word_id' => '1864', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '144', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1865', + ), + 5872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '145', + 'prev_word_id' => '1865', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '146', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '147', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '830', + ), + 5875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1684', + 'placement' => '148', + 'prev_word_id' => '830', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1174', + ), + 5876 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '149', + 'prev_word_id' => '1174', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1684', + ), + 5877 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '150', + 'prev_word_id' => '1684', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1336', + ), + 5878 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1756', + 'placement' => '151', + 'prev_word_id' => '1336', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5879 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '152', + 'prev_word_id' => '1417', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1756', + ), + 5880 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '153', + 'prev_word_id' => '1756', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5881 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1849', + 'placement' => '154', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1848', + ), + 5882 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '155', + 'prev_word_id' => '1848', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1849', + ), + 5883 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1866', + 'placement' => '156', + 'prev_word_id' => '1849', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 5884 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '157', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1866', + ), + 5885 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '158', + 'prev_word_id' => '1866', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1517', + ), + 5886 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '159', + 'prev_word_id' => '1517', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1337', + ), + 5887 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1867', + 'placement' => '160', + 'prev_word_id' => '1337', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '836', + ), + 5888 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '161', + 'prev_word_id' => '836', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1867', + ), + 5889 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1852', + 'placement' => '162', + 'prev_word_id' => '1867', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5890 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '163', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1852', + ), + 5891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '164', + 'prev_word_id' => '1852', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1310', + ), + 5892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1866', + 'placement' => '165', + 'prev_word_id' => '1310', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 5893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '166', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1866', + ), + 5894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1868', + 'placement' => '167', + 'prev_word_id' => '1866', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '168', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1868', + ), + 5896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1869', + 'placement' => '169', + 'prev_word_id' => '1868', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 5897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1677', + 'placement' => '170', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1869', + ), + 5898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '171', + 'prev_word_id' => '1869', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1677', + ), + 5899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '172', + 'prev_word_id' => '1677', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1851', + 'placement' => '173', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1870', + 'placement' => '174', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1851', + ), + 5902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '175', + 'prev_word_id' => '1851', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1870', + ), + 5903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '176', + 'prev_word_id' => '1870', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '177', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 5905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '178', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1336', + ), + 5906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '179', + 'prev_word_id' => '1336', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '940', + ), + 5907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '180', + 'prev_word_id' => '940', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '968', + ), + 5908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '181', + 'prev_word_id' => '968', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1839', + ), + 5909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '182', + 'prev_word_id' => '1839', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '183', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1840', + ), + 5911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1471', + 'placement' => '184', + 'prev_word_id' => '1840', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1871', + 'placement' => '185', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1471', + ), + 5913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '186', + 'prev_word_id' => '1471', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1871', + ), + 5914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '187', + 'prev_word_id' => '1871', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 5915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '188', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1342', + ), + 5916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1343', + 'placement' => '189', + 'prev_word_id' => '1342', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '844', + ), + 5917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '190', + 'prev_word_id' => '844', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1343', + ), + 5918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '191', + 'prev_word_id' => '1343', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 5919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '192', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1317', + ), + 5920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '193', + 'prev_word_id' => '1317', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 5921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1739', + 'placement' => '194', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 5922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '195', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1739', + ), + 5923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1872', + 'placement' => '196', + 'prev_word_id' => '1739', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '197', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1872', + ), + 5925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '198', + 'prev_word_id' => '1872', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '199', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '974', + ), + 5927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '200', + 'prev_word_id' => '974', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '201', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '202', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '807', + ), + 5930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '203', + 'prev_word_id' => '807', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '804', + ), + 5931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '204', + 'prev_word_id' => '804', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '843', + ), + 5932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1873', + 'placement' => '205', + 'prev_word_id' => '843', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '844', + ), + 5933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '206', + 'prev_word_id' => '844', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1873', + ), + 5934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1874', + 'placement' => '207', + 'prev_word_id' => '1873', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1008', + ), + 5935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '208', + 'prev_word_id' => '1008', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1874', + ), + 5936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '209', + 'prev_word_id' => '1874', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '210', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1839', + ), + 5938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '211', + 'prev_word_id' => '1839', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '212', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '213', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1875', + 'placement' => '214', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '215', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1875', + ), + 5943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '216', + 'prev_word_id' => '1875', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1840', + ), + 5944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '217', + 'prev_word_id' => '1840', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 5945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '218', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '843', + ), + 5946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '219', + 'prev_word_id' => '843', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1631', + ), + 5947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1876', + 'placement' => '220', + 'prev_word_id' => '1631', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '939', + ), + 5948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '221', + 'prev_word_id' => '939', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1876', + ), + 5949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1877', + 'placement' => '222', + 'prev_word_id' => '1876', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '807', + ), + 5950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '223', + 'prev_word_id' => '807', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1877', + ), + 5951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1878', + 'placement' => '224', + 'prev_word_id' => '1877', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 5952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '225', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1878', + ), + 5953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '226', + 'prev_word_id' => '1878', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1560', + ), + 5954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '227', + 'prev_word_id' => '1560', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1839', + ), + 5955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '228', + 'prev_word_id' => '1839', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 5956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '229', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1879', + ), + 5957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '230', + 'prev_word_id' => '1879', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1787', + ), + 5958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '231', + 'prev_word_id' => '1787', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1547', + ), + 5959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1841', + 'placement' => '232', + 'prev_word_id' => '1547', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1548', + ), + 5960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '233', + 'prev_word_id' => '1548', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1841', + ), + 5961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1842', + 'placement' => '234', + 'prev_word_id' => '1841', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '235', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1842', + ), + 5963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '236', + 'prev_word_id' => '1842', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 5964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '237', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1880', + 'placement' => '238', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '239', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1880', + ), + 5967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '240', + 'prev_word_id' => '1880', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1410', + ), + 5968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '241', + 'prev_word_id' => '1410', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1569', + ), + 5969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '242', + 'prev_word_id' => '1569', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1410', + ), + 5970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1881', + 'placement' => '243', + 'prev_word_id' => '1410', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 5971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1882', + 'placement' => '244', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1881', + ), + 5972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '245', + 'prev_word_id' => '1881', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1882', + ), + 5973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '246', + 'prev_word_id' => '1882', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '247', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '248', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 5976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '249', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '886', + ), + 5977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '250', + 'prev_word_id' => '886', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '854', + ), + 5978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '251', + 'prev_word_id' => '854', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '976', + ), + 5979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '252', + 'prev_word_id' => '976', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 5980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '253', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 5981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '254', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1417', + ), + 5982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '255', + 'prev_word_id' => '1417', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '886', + ), + 5983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '256', + 'prev_word_id' => '886', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 5984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '257', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1547', + ), + 5985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1841', + 'placement' => '258', + 'prev_word_id' => '1547', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1548', + ), + 5986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '259', + 'prev_word_id' => '1548', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1841', + ), + 5987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1883', + 'placement' => '260', + 'prev_word_id' => '1841', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 5988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '261', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1883', + ), + 5989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1884', + 'placement' => '262', + 'prev_word_id' => '1883', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 5990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '263', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1884', + ), + 5991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '264', + 'prev_word_id' => '1884', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 5992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '265', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '910', + ), + 5993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1671', + 'placement' => '266', + 'prev_word_id' => '910', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1835', + ), + 5994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '267', + 'prev_word_id' => '1835', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1671', + ), + 5995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1885', + 'placement' => '268', + 'prev_word_id' => '1671', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '841', + ), + 5996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '269', + 'prev_word_id' => '841', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1885', + ), + 5997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '270', + 'prev_word_id' => '1885', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1620', + ), + 5998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '271', + 'prev_word_id' => '1620', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1280', + ), + 5999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '272', + 'prev_word_id' => '1280', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 6000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1886', + 'placement' => '273', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1749', + ), + 6001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '274', + 'prev_word_id' => '1749', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1886', + ), + 6002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1887', + 'placement' => '275', + 'prev_word_id' => '1886', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 6003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '276', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1887', + ), + 6004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '277', + 'prev_word_id' => '1887', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '278', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '279', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '280', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '281', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '282', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 6010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '283', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 6011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '284', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1396', + ), + 6012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '285', + 'prev_word_id' => '1396', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '897', + ), + 6013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '286', + 'prev_word_id' => '897', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 6014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1888', + 'placement' => '287', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 6015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1321', + 'placement' => '288', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1888', + ), + 6016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1479', + 'placement' => '289', + 'prev_word_id' => '1888', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1321', + ), + 6017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '290', + 'prev_word_id' => '1321', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1479', + ), + 6018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1889', + 'placement' => '291', + 'prev_word_id' => '1479', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '976', + ), + 6019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1890', + 'placement' => '292', + 'prev_word_id' => '976', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1889', + ), + 6020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1891', + 'placement' => '293', + 'prev_word_id' => '1889', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1890', + ), + 6021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '294', + 'prev_word_id' => '1890', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1891', + ), + 6022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '295', + 'prev_word_id' => '1891', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 6023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '296', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '841', + ), + 6024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '297', + 'prev_word_id' => '841', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '298', + 'prev_word_id' => '1550', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 6026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '299', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1359', + ), + 6027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1892', + 'placement' => '300', + 'prev_word_id' => '1359', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '886', + ), + 6028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '301', + 'prev_word_id' => '886', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1892', + ), + 6029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1889', + 'placement' => '302', + 'prev_word_id' => '1892', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 6030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '303', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1889', + ), + 6031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '304', + 'prev_word_id' => '1889', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1893', + 'placement' => '305', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '895', + ), + 6033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1567', + 'placement' => '306', + 'prev_word_id' => '895', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1893', + ), + 6034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '307', + 'prev_word_id' => '1893', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1567', + ), + 6035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '308', + 'prev_word_id' => '1567', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 6036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '309', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '841', + ), + 6037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '310', + 'prev_word_id' => '841', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '311', + 'prev_word_id' => '1550', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1835', + ), + 6039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '312', + 'prev_word_id' => '1835', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1319', + ), + 6040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1894', + 'placement' => '313', + 'prev_word_id' => '1319', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '314', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1894', + ), + 6042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '315', + 'prev_word_id' => '1894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '809', + ), + 6043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1895', + 'placement' => '316', + 'prev_word_id' => '809', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1321', + 'placement' => '317', + 'prev_word_id' => '1605', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1895', + ), + 6045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '318', + 'prev_word_id' => '1895', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1321', + ), + 6046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1896', + 'placement' => '319', + 'prev_word_id' => '1321', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1620', + ), + 6047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '320', + 'prev_word_id' => '1620', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1896', + ), + 6048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1897', + 'placement' => '321', + 'prev_word_id' => '1896', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1609', + ), + 6049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1898', + 'placement' => '322', + 'prev_word_id' => '1609', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1897', + ), + 6050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '323', + 'prev_word_id' => '1897', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1898', + ), + 6051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1899', + 'placement' => '324', + 'prev_word_id' => '1898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '325', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1899', + ), + 6053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1900', + 'placement' => '326', + 'prev_word_id' => '1899', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '327', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1900', + ), + 6055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '328', + 'prev_word_id' => '1900', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 6056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1901', + 'placement' => '329', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '804', + ), + 6057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '330', + 'prev_word_id' => '804', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1901', + ), + 6058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '331', + 'prev_word_id' => '1901', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1548', + ), + 6059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '332', + 'prev_word_id' => '1548', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 6060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '333', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '882', + ), + 6061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1890', + 'placement' => '334', + 'prev_word_id' => '882', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 6062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1902', + 'placement' => '335', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1890', + ), + 6063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '336', + 'prev_word_id' => '1890', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1902', + ), + 6064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '337', + 'prev_word_id' => '1902', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '338', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '339', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1358', + ), + 6067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1509', + 'placement' => '340', + 'prev_word_id' => '1358', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 6068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1903', + 'placement' => '341', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1509', + ), + 6069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '342', + 'prev_word_id' => '1509', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1903', + ), + 6070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1904', + 'placement' => '343', + 'prev_word_id' => '1903', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 6071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1905', + 'placement' => '344', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1904', + ), + 6072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '345', + 'prev_word_id' => '1904', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1905', + ), + 6073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1906', + 'placement' => '346', + 'prev_word_id' => '1905', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 6074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1468', + 'placement' => '347', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1906', + ), + 6075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '348', + 'prev_word_id' => '1906', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1468', + ), + 6076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1907', + 'placement' => '349', + 'prev_word_id' => '1468', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 6077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1908', + 'placement' => '350', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1907', + ), + 6078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '351', + 'prev_word_id' => '1907', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1908', + ), + 6079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1591', + 'placement' => '352', + 'prev_word_id' => '1908', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 6080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '353', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1591', + ), + 6081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1909', + 'placement' => '354', + 'prev_word_id' => '1591', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '870', + ), + 6082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '355', + 'prev_word_id' => '870', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1909', + ), + 6083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1910', + 'placement' => '356', + 'prev_word_id' => '1909', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '868', + 'placement' => '357', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1910', + ), + 6085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1911', + 'placement' => '358', + 'prev_word_id' => '1910', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '868', + ), + 6086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '359', + 'prev_word_id' => '868', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1911', + ), + 6087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '360', + 'prev_word_id' => '1911', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '804', + ), + 6088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1912', + 'placement' => '361', + 'prev_word_id' => '804', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '882', + ), + 6089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '362', + 'prev_word_id' => '882', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1912', + ), + 6090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '363', + 'prev_word_id' => '1912', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1913', + 'placement' => '364', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 6092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '365', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1913', + ), + 6093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '366', + 'prev_word_id' => '1913', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '943', + ), + 6094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '367', + 'prev_word_id' => '943', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 6095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '368', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1835', + ), + 6096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '369', + 'prev_word_id' => '1835', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '370', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '881', + ), + 6098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '371', + 'prev_word_id' => '881', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '846', + ), + 6099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '372', + 'prev_word_id' => '846', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '373', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '374', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '938', + ), + 6102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '375', + 'prev_word_id' => '938', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1366', + ), + 6103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '376', + 'prev_word_id' => '1366', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 6104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1834', + 'placement' => '377', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 6105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '378', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1834', + ), + 6106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '379', + 'prev_word_id' => '1834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '943', + ), + 6107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '937', + 'placement' => '380', + 'prev_word_id' => '943', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '381', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '937', + ), + 6109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '975', + 'placement' => '382', + 'prev_word_id' => '937', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '974', + ), + 6110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1842', + 'placement' => '383', + 'prev_word_id' => '974', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '975', + ), + 6111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '384', + 'prev_word_id' => '975', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1842', + ), + 6112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '385', + 'prev_word_id' => '1842', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '938', + ), + 6113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1899', + 'placement' => '386', + 'prev_word_id' => '938', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '387', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1899', + ), + 6115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1837', + 'placement' => '388', + 'prev_word_id' => '1899', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '389', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1837', + ), + 6117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '390', + 'prev_word_id' => '1837', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '391', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '815', + ), + 6119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '392', + 'prev_word_id' => '815', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '813', + ), + 6120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '393', + 'prev_word_id' => '813', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '394', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1602', + 'placement' => '395', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1008', + ), + 6123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '396', + 'prev_word_id' => '1008', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1602', + ), + 6124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '397', + 'prev_word_id' => '1602', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '938', + ), + 6125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '398', + 'prev_word_id' => '938', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '836', + ), + 6126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '915', + 'placement' => '399', + 'prev_word_id' => '836', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 6127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '400', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '915', + ), + 6128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '401', + 'prev_word_id' => '915', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '402', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '939', + ), + 6130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1914', + 'placement' => '403', + 'prev_word_id' => '939', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '929', + ), + 6131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1859', + 'placement' => '404', + 'prev_word_id' => '929', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1914', + ), + 6132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '405', + 'prev_word_id' => '1914', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1859', + ), + 6133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1915', + 'placement' => '406', + 'prev_word_id' => '1859', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1879', + ), + 6134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '407', + 'prev_word_id' => '1879', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1915', + ), + 6135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1225', + 'placement' => '408', + 'prev_word_id' => '1915', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '941', + ), + 6136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '409', + 'prev_word_id' => '941', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1225', + ), + 6137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '410', + 'prev_word_id' => '1225', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '823', + ), + 6138 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10808', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1132', + 'placement' => '411', + 'prev_word_id' => '823', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1609', + ), + 6139 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10809', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '412', + 'prev_word_id' => '1609', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1132', + ), + 6140 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10810', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1916', + 'placement' => '413', + 'prev_word_id' => '1132', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '809', + ), + 6141 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10811', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1917', + 'placement' => '414', + 'prev_word_id' => '809', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1916', + ), + 6142 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10812', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '415', + 'prev_word_id' => '1916', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1917', + ), + 6143 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10813', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '416', + 'prev_word_id' => '1917', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1620', + ), + 6144 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10814', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '417', + 'prev_word_id' => '1620', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 6145 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10815', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '418', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1396', + ), + 6146 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10816', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '419', + 'prev_word_id' => '1396', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '897', + ), + 6147 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10817', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1918', + 'placement' => '420', + 'prev_word_id' => '897', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1384', + ), + 6148 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10818', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '421', + 'prev_word_id' => '1384', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1918', + ), + 6149 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10819', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1298', + 'placement' => '422', + 'prev_word_id' => '1918', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '938', + ), + 6150 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10820', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '423', + 'prev_word_id' => '938', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1298', + ), + 6151 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10821', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1919', + 'placement' => '424', + 'prev_word_id' => '1298', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '825', + ), + 6152 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10822', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '425', + 'prev_word_id' => '825', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1919', + ), + 6153 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '426', + 'prev_word_id' => '1919', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1263', + ), + 6154 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '427', + 'prev_word_id' => '1263', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1417', + ), + 6155 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '428', + 'prev_word_id' => '1417', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 6156 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '429', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1843', + ), + 6157 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '430', + 'prev_word_id' => '1843', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '948', + ), + 6158 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '431', + 'prev_word_id' => '948', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '949', + ), + 6159 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '432', + 'prev_word_id' => '949', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6160 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '433', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 6161 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '434', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6162 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '435', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6163 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '436', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1502', + ), + 6164 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1515', + 'placement' => '437', + 'prev_word_id' => '1502', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '810', + ), + 6165 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1438', + 'placement' => '438', + 'prev_word_id' => '810', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1515', + ), + 6166 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1516', + 'placement' => '439', + 'prev_word_id' => '1515', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1438', + ), + 6167 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '440', + 'prev_word_id' => '1438', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1516', + ), + 6168 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1365', + 'placement' => '441', + 'prev_word_id' => '1516', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 6169 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '442', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1365', + ), + 6170 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '443', + 'prev_word_id' => '1365', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1549', + ), + 6171 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '444', + 'prev_word_id' => '1549', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '917', + ), + 6172 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1786', + 'placement' => '445', + 'prev_word_id' => '917', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6173 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '446', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1786', + ), + 6174 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '447', + 'prev_word_id' => '1786', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1443', + ), + 6175 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1920', + 'placement' => '448', + 'prev_word_id' => '1443', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1787', + ), + 6176 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '449', + 'prev_word_id' => '1787', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1920', + ), + 6177 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1460', + 'placement' => '450', + 'prev_word_id' => '1920', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 6178 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '451', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1460', + ), + 6179 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '452', + 'prev_word_id' => '1460', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6180 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '453', + 'prev_word_id' => '1605', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '836', + ), + 6181 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '454', + 'prev_word_id' => '836', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1530', + ), + 6182 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1921', + 'placement' => '455', + 'prev_word_id' => '1530', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6183 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1721', + 'placement' => '456', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1921', + ), + 6184 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1922', + 'placement' => '457', + 'prev_word_id' => '1921', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1721', + ), + 6185 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '458', + 'prev_word_id' => '1721', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1922', + ), + 6186 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1923', + 'placement' => '459', + 'prev_word_id' => '1922', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 6187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '460', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1923', + ), + 6188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1924', + 'placement' => '461', + 'prev_word_id' => '1923', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1319', + ), + 6189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1925', + 'placement' => '462', + 'prev_word_id' => '1319', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1924', + ), + 6190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '463', + 'prev_word_id' => '1924', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1925', + ), + 6191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '464', + 'prev_word_id' => '1925', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '816', + ), + 6192 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '465', + 'prev_word_id' => '816', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6193 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '466', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6194 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '467', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6195 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '468', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6196 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '469', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1258', + ), + 6197 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '470', + 'prev_word_id' => '1258', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '833', + ), + 6198 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '471', + 'prev_word_id' => '833', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1237', + ), + 6199 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '472', + 'prev_word_id' => '1237', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6200 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1926', + 'placement' => '473', + 'prev_word_id' => '1605', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 6201 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1492', + 'placement' => '474', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1926', + ), + 6202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '475', + 'prev_word_id' => '1926', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1492', + ), + 6203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '476', + 'prev_word_id' => '1492', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '809', + ), + 6204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '477', + 'prev_word_id' => '809', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '802', + ), + 6205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '478', + 'prev_word_id' => '802', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '803', + ), + 6206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '479', + 'prev_word_id' => '803', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '480', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1258', + ), + 6208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1927', + 'placement' => '481', + 'prev_word_id' => '1258', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '805', + ), + 6209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '482', + 'prev_word_id' => '805', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1927', + ), + 6210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '483', + 'prev_word_id' => '1927', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '898', + ), + 6211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '484', + 'prev_word_id' => '898', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1843', + ), + 6212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '485', + 'prev_word_id' => '1843', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '801', + ), + 6213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '486', + 'prev_word_id' => '801', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1251', + ), + 6214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1928', + 'placement' => '487', + 'prev_word_id' => '1251', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '488', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1928', + ), + 6216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '489', + 'prev_word_id' => '1928', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '809', + ), + 6217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '490', + 'prev_word_id' => '809', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 6218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '491', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1396', + ), + 6219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '492', + 'prev_word_id' => '1396', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '897', + ), + 6220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1292', + 'placement' => '493', + 'prev_word_id' => '897', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '974', + ), + 6221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '494', + 'prev_word_id' => '974', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1292', + ), + 6222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '495', + 'prev_word_id' => '1292', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '823', + ), + 6223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '496', + 'prev_word_id' => '823', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1251', + ), + 6224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '497', + 'prev_word_id' => '1251', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '910', + ), + 6225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '498', + 'prev_word_id' => '910', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '499', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '814', + ), + 6227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '500', + 'prev_word_id' => '814', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '860', + ), + 6228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '501', + 'prev_word_id' => '860', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1410', + ), + 6229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '502', + 'prev_word_id' => '1410', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1569', + ), + 6230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '503', + 'prev_word_id' => '1569', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1410', + ), + 6231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1929', + 'placement' => '504', + 'prev_word_id' => '1410', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1384', + ), + 6232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '505', + 'prev_word_id' => '1384', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1929', + ), + 6233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '506', + 'prev_word_id' => '1929', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1437', + ), + 6234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '507', + 'prev_word_id' => '1437', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1396', + ), + 6235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1930', + 'placement' => '508', + 'prev_word_id' => '1396', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '906', + ), + 6236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '509', + 'prev_word_id' => '906', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1930', + ), + 6237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '510', + 'prev_word_id' => '1930', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '894', + ), + 6238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '511', + 'prev_word_id' => '894', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1688', + ), + 6239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '512', + 'prev_word_id' => '1688', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '863', + ), + 6240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '513', + 'prev_word_id' => '863', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '974', + ), + 6241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1460', + 'placement' => '514', + 'prev_word_id' => '974', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '834', + ), + 6242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '515', + 'prev_word_id' => '834', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1460', + ), + 6243 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10913', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '516', + 'prev_word_id' => '1460', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6244 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '127', + 'frequency' => '0', + 'id' => '10914', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '517', + 'prev_word_id' => '1191', + 'published' => '1311154189', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6245 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '128', + 'frequency' => '0', + 'id' => '10915', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6246 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '128', + 'frequency' => '0', + 'id' => '10916', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6247 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '129', + 'frequency' => '0', + 'id' => '10917', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6248 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '129', + 'frequency' => '0', + 'id' => '10918', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6249 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10919', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1931', + ), + 6250 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10920', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '1', + 'prev_word_id' => '1931', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6251 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10921', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '2', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1715', + ), + 6252 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10922', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '3', + 'prev_word_id' => '1715', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6253 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10923', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '4', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6254 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10924', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '5', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6255 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10925', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1932', + 'placement' => '6', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '826', + ), + 6256 => + array ( + 'contentclass_attribute_id' => '184', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10926', + 'identifier' => 'short_title', + 'integer_value' => '0', + 'next_word_id' => '1933', + 'placement' => '7', + 'prev_word_id' => '826', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1932', + ), + 6257 => + array ( + 'contentclass_attribute_id' => '184', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10927', + 'identifier' => 'short_title', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '8', + 'prev_word_id' => '1932', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1933', + ), + 6258 => + array ( + 'contentclass_attribute_id' => '184', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10928', + 'identifier' => 'short_title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '9', + 'prev_word_id' => '1933', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6259 => + array ( + 'contentclass_attribute_id' => '184', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10929', + 'identifier' => 'short_title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '10', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6260 => + array ( + 'contentclass_attribute_id' => '184', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10930', + 'identifier' => 'short_title', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '11', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6261 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10931', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '934', + 'placement' => '12', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '804', + ), + 6262 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10932', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1264', + 'placement' => '13', + 'prev_word_id' => '804', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '934', + ), + 6263 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10933', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '14', + 'prev_word_id' => '934', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1264', + ), + 6264 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10934', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '15', + 'prev_word_id' => '1264', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1835', + ), + 6265 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10935', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1934', + 'placement' => '16', + 'prev_word_id' => '1835', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6266 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10936', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '17', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1934', + ), + 6267 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10937', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1837', + 'placement' => '18', + 'prev_word_id' => '1934', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6268 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10938', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '19', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1837', + ), + 6269 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10939', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '20', + 'prev_word_id' => '1837', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6270 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10940', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '21', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1370', + ), + 6271 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10941', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1935', + 'placement' => '22', + 'prev_word_id' => '1370', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6272 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10942', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '23', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1935', + ), + 6273 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10943', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '24', + 'prev_word_id' => '1935', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6274 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10944', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '25', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6275 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10945', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1936', + 'placement' => '26', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6276 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10946', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '27', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1936', + ), + 6277 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10947', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1937', + 'placement' => '28', + 'prev_word_id' => '1936', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6278 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10948', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '29', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1937', + ), + 6279 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10949', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '30', + 'prev_word_id' => '1937', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '821', + ), + 6280 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10950', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1276', + 'placement' => '31', + 'prev_word_id' => '821', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6281 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10951', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '32', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1276', + ), + 6282 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10952', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1938', + 'placement' => '33', + 'prev_word_id' => '1276', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '898', + ), + 6283 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10953', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1367', + 'placement' => '34', + 'prev_word_id' => '898', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1938', + ), + 6284 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10954', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '35', + 'prev_word_id' => '1938', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1367', + ), + 6285 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10955', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '36', + 'prev_word_id' => '1367', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6286 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10956', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '37', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6287 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10957', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '38', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '826', + ), + 6288 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10958', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '39', + 'prev_word_id' => '826', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '825', + ), + 6289 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10959', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '40', + 'prev_word_id' => '825', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6290 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10960', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '41', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1639', + ), + 6291 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10961', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '42', + 'prev_word_id' => '1639', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6292 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10962', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '934', + 'placement' => '43', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '804', + ), + 6293 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10963', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '44', + 'prev_word_id' => '804', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '934', + ), + 6294 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10964', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '45', + 'prev_word_id' => '934', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '894', + ), + 6295 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10965', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '46', + 'prev_word_id' => '894', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1396', + ), + 6296 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10966', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1939', + 'placement' => '47', + 'prev_word_id' => '1396', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1319', + ), + 6297 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10967', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '48', + 'prev_word_id' => '1319', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1939', + ), + 6298 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10968', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '49', + 'prev_word_id' => '1939', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '936', + ), + 6299 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10969', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1940', + 'placement' => '50', + 'prev_word_id' => '936', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6300 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10970', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1941', + 'placement' => '51', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1940', + ), + 6301 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10971', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '52', + 'prev_word_id' => '1940', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1941', + ), + 6302 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10972', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '53', + 'prev_word_id' => '1941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6303 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10973', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '54', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6304 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10974', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1942', + 'placement' => '55', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1259', + ), + 6305 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10975', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1838', + 'placement' => '56', + 'prev_word_id' => '1259', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1942', + ), + 6306 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10976', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '57', + 'prev_word_id' => '1942', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1838', + ), + 6307 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10977', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '58', + 'prev_word_id' => '1838', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6308 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10978', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '59', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '939', + ), + 6309 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10979', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '60', + 'prev_word_id' => '939', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1596', + ), + 6310 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10980', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '61', + 'prev_word_id' => '1596', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1715', + ), + 6311 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10981', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '62', + 'prev_word_id' => '1715', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '836', + ), + 6312 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10982', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1943', + 'placement' => '63', + 'prev_word_id' => '836', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1396', + ), + 6313 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10983', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '64', + 'prev_word_id' => '1396', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1943', + ), + 6314 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10984', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1944', + 'placement' => '65', + 'prev_word_id' => '1943', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '894', + ), + 6315 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10985', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '66', + 'prev_word_id' => '894', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1944', + ), + 6316 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10986', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1838', + 'placement' => '67', + 'prev_word_id' => '1944', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '804', + ), + 6317 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10987', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '68', + 'prev_word_id' => '804', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1838', + ), + 6318 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10988', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '69', + 'prev_word_id' => '1838', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1277', + ), + 6319 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10989', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1945', + 'placement' => '70', + 'prev_word_id' => '1277', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6320 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10990', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1486', + 'placement' => '71', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1945', + ), + 6321 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10991', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '72', + 'prev_word_id' => '1945', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1486', + ), + 6322 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10992', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1895', + 'placement' => '73', + 'prev_word_id' => '1486', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6323 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10993', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1354', + 'placement' => '74', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1895', + ), + 6324 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10994', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '75', + 'prev_word_id' => '1895', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1354', + ), + 6325 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10995', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1678', + 'placement' => '76', + 'prev_word_id' => '1354', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1816', + ), + 6326 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10996', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '77', + 'prev_word_id' => '1816', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1678', + ), + 6327 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10997', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '78', + 'prev_word_id' => '1678', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1715', + ), + 6328 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10998', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '79', + 'prev_word_id' => '1715', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '976', + ), + 6329 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '10999', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1937', + 'placement' => '80', + 'prev_word_id' => '976', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6330 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11000', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '81', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1937', + ), + 6331 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11001', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '82', + 'prev_word_id' => '1937', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6332 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11002', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1845', + 'placement' => '83', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6333 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11003', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1869', + 'placement' => '84', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1845', + ), + 6334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '85', + 'prev_word_id' => '1845', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1869', + ), + 6335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '86', + 'prev_word_id' => '1869', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '930', + ), + 6336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '87', + 'prev_word_id' => '930', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '88', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1946', + 'placement' => '89', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1947', + 'placement' => '90', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1946', + ), + 6340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '91', + 'prev_word_id' => '1946', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1947', + ), + 6341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '92', + 'prev_word_id' => '1947', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '893', + ), + 6342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '93', + 'prev_word_id' => '893', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '836', + ), + 6343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '915', + 'placement' => '94', + 'prev_word_id' => '836', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '95', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '915', + ), + 6345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '96', + 'prev_word_id' => '915', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '97', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '906', + ), + 6347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '98', + 'prev_word_id' => '906', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '881', + ), + 6348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '99', + 'prev_word_id' => '881', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1937', + 'placement' => '100', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '101', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1937', + ), + 6351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '102', + 'prev_word_id' => '1937', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '826', + ), + 6352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '103', + 'prev_word_id' => '826', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '104', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '105', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '106', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '816', + ), + 6356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '107', + 'prev_word_id' => '816', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1596', + ), + 6357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '108', + 'prev_word_id' => '1596', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1715', + ), + 6358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '899', + 'placement' => '109', + 'prev_word_id' => '1715', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '110', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '899', + ), + 6360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1948', + 'placement' => '111', + 'prev_word_id' => '899', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '112', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1948', + ), + 6362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1934', + 'placement' => '113', + 'prev_word_id' => '1948', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '114', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1934', + ), + 6364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '115', + 'prev_word_id' => '1934', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1949', + 'placement' => '116', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '117', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1949', + ), + 6367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1950', + 'placement' => '118', + 'prev_word_id' => '1949', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '119', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1950', + ), + 6369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1951', + 'placement' => '120', + 'prev_word_id' => '1950', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '898', + ), + 6370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '121', + 'prev_word_id' => '898', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1951', + ), + 6371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1933', + 'placement' => '122', + 'prev_word_id' => '1951', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1264', + 'placement' => '123', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1933', + ), + 6373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '124', + 'prev_word_id' => '1933', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1264', + ), + 6374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '125', + 'prev_word_id' => '1264', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1952', + 'placement' => '126', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '127', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1952', + ), + 6377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '128', + 'prev_word_id' => '1952', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1953', + 'placement' => '129', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1317', + ), + 6379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '130', + 'prev_word_id' => '1317', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1953', + ), + 6380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '131', + 'prev_word_id' => '1953', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '921', + ), + 6381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1954', + 'placement' => '132', + 'prev_word_id' => '921', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1414', + ), + 6382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1815', + 'placement' => '133', + 'prev_word_id' => '1414', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1954', + ), + 6383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '134', + 'prev_word_id' => '1954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1815', + ), + 6384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '135', + 'prev_word_id' => '1815', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1596', + ), + 6385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '136', + 'prev_word_id' => '1596', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1818', + ), + 6386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '137', + 'prev_word_id' => '1818', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '138', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '139', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '826', + ), + 6389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '140', + 'prev_word_id' => '826', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '809', + ), + 6390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1955', + 'placement' => '141', + 'prev_word_id' => '809', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '804', + ), + 6391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '142', + 'prev_word_id' => '804', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1955', + ), + 6392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '143', + 'prev_word_id' => '1955', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '894', + ), + 6393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '144', + 'prev_word_id' => '894', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '843', + ), + 6394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '145', + 'prev_word_id' => '843', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '906', + ), + 6395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1647', + 'placement' => '146', + 'prev_word_id' => '906', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '836', + ), + 6396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '147', + 'prev_word_id' => '836', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1647', + ), + 6397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '148', + 'prev_word_id' => '1647', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '149', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1257', + ), + 6399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1956', + 'placement' => '150', + 'prev_word_id' => '1257', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '830', + ), + 6400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1957', + 'placement' => '151', + 'prev_word_id' => '830', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1956', + ), + 6401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1958', + 'placement' => '152', + 'prev_word_id' => '1956', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1957', + ), + 6402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '153', + 'prev_word_id' => '1957', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1958', + ), + 6403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '154', + 'prev_word_id' => '1958', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1812', + 'placement' => '155', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1698', + ), + 6405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '156', + 'prev_word_id' => '1698', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1812', + ), + 6406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1959', + 'placement' => '157', + 'prev_word_id' => '1812', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '158', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1959', + ), + 6408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '159', + 'prev_word_id' => '1959', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '881', + ), + 6409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1937', + 'placement' => '160', + 'prev_word_id' => '881', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1779', + 'placement' => '161', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1937', + ), + 6411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1960', + 'placement' => '162', + 'prev_word_id' => '1937', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1779', + ), + 6412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '163', + 'prev_word_id' => '1779', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1960', + ), + 6413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '164', + 'prev_word_id' => '1960', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '165', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1961', + 'placement' => '166', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '167', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1961', + ), + 6417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '168', + 'prev_word_id' => '1961', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1307', + ), + 6418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '169', + 'prev_word_id' => '1307', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '816', + ), + 6419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '170', + 'prev_word_id' => '816', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1596', + ), + 6420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '171', + 'prev_word_id' => '1596', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1818', + ), + 6421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '172', + 'prev_word_id' => '1818', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '809', + ), + 6422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1501', + 'placement' => '173', + 'prev_word_id' => '809', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '174', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1501', + ), + 6424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '175', + 'prev_word_id' => '1501', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '823', + ), + 6425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '176', + 'prev_word_id' => '823', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1816', + ), + 6426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1962', + 'placement' => '177', + 'prev_word_id' => '1816', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '830', + ), + 6427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '178', + 'prev_word_id' => '830', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1962', + ), + 6428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '179', + 'prev_word_id' => '1962', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1963', + 'placement' => '180', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '181', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1963', + ), + 6431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1964', + 'placement' => '182', + 'prev_word_id' => '1963', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1008', + ), + 6432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1656', + 'placement' => '183', + 'prev_word_id' => '1008', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1964', + ), + 6433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '184', + 'prev_word_id' => '1964', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1656', + ), + 6434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '185', + 'prev_word_id' => '1656', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1818', + ), + 6435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '186', + 'prev_word_id' => '1818', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '976', + ), + 6436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '187', + 'prev_word_id' => '976', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '188', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '826', + ), + 6438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '189', + 'prev_word_id' => '826', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '804', + ), + 6439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1965', + 'placement' => '190', + 'prev_word_id' => '804', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '191', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1965', + ), + 6441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '192', + 'prev_word_id' => '1965', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '830', + ), + 6442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1966', + 'placement' => '193', + 'prev_word_id' => '830', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1967', + 'placement' => '194', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1966', + ), + 6444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1968', + 'placement' => '195', + 'prev_word_id' => '1966', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1967', + ), + 6445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '819', + 'placement' => '196', + 'prev_word_id' => '1967', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1968', + ), + 6446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '926', + 'placement' => '197', + 'prev_word_id' => '1968', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '819', + ), + 6447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '198', + 'prev_word_id' => '819', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '926', + ), + 6448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '199', + 'prev_word_id' => '926', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '948', + ), + 6449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1288', + 'placement' => '200', + 'prev_word_id' => '948', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '949', + ), + 6450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '923', + 'placement' => '201', + 'prev_word_id' => '949', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1288', + ), + 6451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '202', + 'prev_word_id' => '1288', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '923', + ), + 6452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1969', + 'placement' => '203', + 'prev_word_id' => '923', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1970', + 'placement' => '204', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1969', + ), + 6454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1971', + 'placement' => '205', + 'prev_word_id' => '1969', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1970', + ), + 6455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1972', + 'placement' => '206', + 'prev_word_id' => '1970', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1971', + ), + 6456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1970', + 'placement' => '207', + 'prev_word_id' => '1971', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1972', + ), + 6457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '208', + 'prev_word_id' => '1972', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1970', + ), + 6458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '209', + 'prev_word_id' => '1970', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1973', + 'placement' => '210', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1974', + 'placement' => '211', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1973', + ), + 6461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '212', + 'prev_word_id' => '1973', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1974', + ), + 6462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '213', + 'prev_word_id' => '1974', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '214', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '948', + ), + 6464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1975', + 'placement' => '215', + 'prev_word_id' => '948', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '949', + ), + 6465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1976', + 'placement' => '216', + 'prev_word_id' => '949', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1975', + ), + 6466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '217', + 'prev_word_id' => '1975', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1976', + ), + 6467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '218', + 'prev_word_id' => '1976', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '219', + 'prev_word_id' => '1290', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1977', + 'placement' => '220', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '221', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1977', + ), + 6471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '222', + 'prev_word_id' => '1977', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '223', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1978', + 'placement' => '224', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '834', + ), + 6474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '225', + 'prev_word_id' => '834', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1978', + ), + 6475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '226', + 'prev_word_id' => '1978', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1979', + 'placement' => '227', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1980', + 'placement' => '228', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1979', + ), + 6478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '229', + 'prev_word_id' => '1979', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1980', + ), + 6479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1981', + 'placement' => '230', + 'prev_word_id' => '1980', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '231', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1981', + ), + 6481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1982', + 'placement' => '232', + 'prev_word_id' => '1981', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '233', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1982', + ), + 6483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '234', + 'prev_word_id' => '1982', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1303', + 'placement' => '235', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1983', + 'placement' => '236', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1303', + ), + 6486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '237', + 'prev_word_id' => '1303', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1983', + ), + 6487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1984', + 'placement' => '238', + 'prev_word_id' => '1983', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1689', + ), + 6488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1375', + 'placement' => '239', + 'prev_word_id' => '1689', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1984', + ), + 6489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '240', + 'prev_word_id' => '1984', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1375', + ), + 6490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1985', + 'placement' => '241', + 'prev_word_id' => '1375', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '242', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1985', + ), + 6492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '243', + 'prev_word_id' => '1985', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1835', + ), + 6493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1986', + 'placement' => '244', + 'prev_word_id' => '1835', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '976', + ), + 6494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1987', + 'placement' => '245', + 'prev_word_id' => '976', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1986', + ), + 6495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1988', + 'placement' => '246', + 'prev_word_id' => '1986', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1987', + ), + 6496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1983', + 'placement' => '247', + 'prev_word_id' => '1987', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1988', + ), + 6497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1250', + 'placement' => '248', + 'prev_word_id' => '1988', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1983', + ), + 6498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1624', + 'placement' => '249', + 'prev_word_id' => '1983', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1250', + ), + 6499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '250', + 'prev_word_id' => '1250', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1624', + ), + 6500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '251', + 'prev_word_id' => '1624', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '809', + ), + 6501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '252', + 'prev_word_id' => '809', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '253', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1989', + 'placement' => '254', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1990', + 'placement' => '255', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1989', + ), + 6505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1991', + 'placement' => '256', + 'prev_word_id' => '1989', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1990', + ), + 6506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1992', + 'placement' => '257', + 'prev_word_id' => '1990', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1991', + ), + 6507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '258', + 'prev_word_id' => '1991', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1992', + ), + 6508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1983', + 'placement' => '259', + 'prev_word_id' => '1992', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '260', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1983', + ), + 6510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1993', + 'placement' => '261', + 'prev_word_id' => '1983', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '886', + ), + 6511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1994', + 'placement' => '262', + 'prev_word_id' => '886', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1993', + ), + 6512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '263', + 'prev_word_id' => '1993', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1994', + ), + 6513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1995', + 'placement' => '264', + 'prev_word_id' => '1994', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1996', + 'placement' => '265', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1995', + ), + 6515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1997', + 'placement' => '266', + 'prev_word_id' => '1995', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1996', + ), + 6516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '267', + 'prev_word_id' => '1996', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1997', + ), + 6517 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11187', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '268', + 'prev_word_id' => '1997', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6518 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11188', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '1942', + 'placement' => '269', + 'prev_word_id' => '1191', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6519 => + array ( + 'contentclass_attribute_id' => '193', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11189', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '270', + 'prev_word_id' => '1191', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1942', + ), + 6520 => + array ( + 'contentclass_attribute_id' => '193', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11190', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '271', + 'prev_word_id' => '1942', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1596', + ), + 6521 => + array ( + 'contentclass_attribute_id' => '193', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11191', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '1998', + 'placement' => '272', + 'prev_word_id' => '1596', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1818', + ), + 6522 => + array ( + 'contentclass_attribute_id' => '193', + 'contentclass_id' => '16', + 'contentobject_id' => '130', + 'frequency' => '0', + 'id' => '11192', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '273', + 'prev_word_id' => '1818', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1998', + ), + 6523 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '131', + 'frequency' => '0', + 'id' => '11193', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '929', + ), + 6524 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '131', + 'frequency' => '0', + 'id' => '11194', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '929', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1370', + ), + 6525 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11195', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1999', + ), + 6526 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11196', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2000', + 'placement' => '1', + 'prev_word_id' => '1999', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6527 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11197', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2000', + ), + 6528 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11198', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2001', + 'placement' => '3', + 'prev_word_id' => '2000', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6529 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11199', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '4', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2001', + ), + 6530 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11200', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '5', + 'prev_word_id' => '2001', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6531 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11201', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '6', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '816', + ), + 6532 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11202', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '7', + 'prev_word_id' => '816', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6533 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11203', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '8', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1638', + ), + 6534 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11204', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '9', + 'prev_word_id' => '1638', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1639', + ), + 6535 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11205', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1227', + 'placement' => '10', + 'prev_word_id' => '1639', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6536 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11206', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2000', + 'placement' => '11', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1227', + ), + 6537 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11207', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1340', + 'placement' => '12', + 'prev_word_id' => '1227', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2000', + ), + 6538 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11208', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '13', + 'prev_word_id' => '2000', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1340', + ), + 6539 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11209', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '14', + 'prev_word_id' => '1340', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6540 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11210', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2002', + 'placement' => '15', + 'prev_word_id' => '1605', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '894', + ), + 6541 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11211', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '16', + 'prev_word_id' => '894', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2002', + ), + 6542 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11212', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '17', + 'prev_word_id' => '2002', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6543 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11213', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '885', + 'placement' => '18', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1719', + ), + 6544 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11214', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2003', + 'placement' => '19', + 'prev_word_id' => '1719', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '885', + ), + 6545 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11215', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '20', + 'prev_word_id' => '885', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2003', + ), + 6546 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11216', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '21', + 'prev_word_id' => '2003', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '976', + ), + 6547 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11217', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '22', + 'prev_word_id' => '976', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6548 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11218', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '23', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '974', + ), + 6549 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11219', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2004', + 'placement' => '24', + 'prev_word_id' => '974', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '832', + ), + 6550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '25', + 'prev_word_id' => '832', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2004', + ), + 6551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2005', + 'placement' => '26', + 'prev_word_id' => '2004', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '27', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2005', + ), + 6553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '28', + 'prev_word_id' => '2005', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '29', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '30', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '939', + ), + 6556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2006', + 'placement' => '31', + 'prev_word_id' => '939', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '32', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2006', + ), + 6558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '33', + 'prev_word_id' => '2006', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '34', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2007', + 'placement' => '35', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '929', + ), + 6561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1403', + 'placement' => '36', + 'prev_word_id' => '929', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2007', + ), + 6562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '37', + 'prev_word_id' => '2007', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1403', + ), + 6563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '38', + 'prev_word_id' => '1403', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2001', + 'placement' => '39', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '809', + ), + 6565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '40', + 'prev_word_id' => '809', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2001', + ), + 6566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2008', + 'placement' => '41', + 'prev_word_id' => '2001', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2004', + 'placement' => '42', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2008', + ), + 6568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '43', + 'prev_word_id' => '2008', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2004', + ), + 6569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2001', + 'placement' => '44', + 'prev_word_id' => '2004', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '45', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2001', + ), + 6571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '46', + 'prev_word_id' => '2001', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1764', + 'placement' => '47', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '815', + ), + 6573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '48', + 'prev_word_id' => '815', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1764', + ), + 6574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '49', + 'prev_word_id' => '1764', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '50', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '51', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '931', + ), + 6577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2009', + 'placement' => '52', + 'prev_word_id' => '931', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '822', + ), + 6578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2010', + 'placement' => '53', + 'prev_word_id' => '822', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2009', + ), + 6579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '54', + 'prev_word_id' => '2009', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2010', + ), + 6580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '55', + 'prev_word_id' => '2010', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '939', + ), + 6581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '56', + 'prev_word_id' => '939', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2000', + 'placement' => '57', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '58', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2000', + ), + 6584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2011', + 'placement' => '59', + 'prev_word_id' => '2000', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2012', + 'placement' => '60', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2011', + ), + 6586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '61', + 'prev_word_id' => '2011', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2012', + ), + 6587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2013', + 'placement' => '62', + 'prev_word_id' => '2012', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '63', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2013', + ), + 6589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '64', + 'prev_word_id' => '2013', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '845', + 'placement' => '65', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '66', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '845', + ), + 6592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '67', + 'prev_word_id' => '845', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '68', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1639', + ), + 6594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2000', + 'placement' => '69', + 'prev_word_id' => '1639', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '70', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2000', + ), + 6596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2014', + 'placement' => '71', + 'prev_word_id' => '2000', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '72', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2014', + ), + 6598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2015', + 'placement' => '73', + 'prev_word_id' => '2014', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2016', + 'placement' => '74', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2015', + ), + 6600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '75', + 'prev_word_id' => '2015', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2016', + ), + 6601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '76', + 'prev_word_id' => '2016', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1437', + ), + 6602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '77', + 'prev_word_id' => '1437', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '78', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2017', + 'placement' => '79', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2018', + 'placement' => '80', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2017', + ), + 6606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '81', + 'prev_word_id' => '2017', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2018', + ), + 6607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '82', + 'prev_word_id' => '2018', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '948', + ), + 6608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '83', + 'prev_word_id' => '948', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '949', + ), + 6609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '84', + 'prev_word_id' => '949', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '939', + ), + 6610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '85', + 'prev_word_id' => '939', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '86', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2019', + 'placement' => '87', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '88', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2019', + ), + 6614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '89', + 'prev_word_id' => '2019', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2000', + 'placement' => '90', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2011', + 'placement' => '91', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2000', + ), + 6617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2020', + 'placement' => '92', + 'prev_word_id' => '2000', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2011', + ), + 6618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2006', + 'placement' => '93', + 'prev_word_id' => '2011', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2020', + ), + 6619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '94', + 'prev_word_id' => '2020', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2006', + ), + 6620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1354', + 'placement' => '95', + 'prev_word_id' => '2006', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1723', + 'placement' => '96', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1354', + ), + 6622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '97', + 'prev_word_id' => '1354', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1723', + ), + 6623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2007', + 'placement' => '98', + 'prev_word_id' => '1723', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2012', + 'placement' => '99', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2007', + ), + 6625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '100', + 'prev_word_id' => '2007', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2012', + ), + 6626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2021', + 'placement' => '101', + 'prev_word_id' => '2012', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '102', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2021', + ), + 6628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2022', + 'placement' => '103', + 'prev_word_id' => '2021', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2020', + 'placement' => '104', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2022', + ), + 6630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '105', + 'prev_word_id' => '2022', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2020', + ), + 6631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2021', + 'placement' => '106', + 'prev_word_id' => '2020', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '107', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2021', + ), + 6633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2023', + 'placement' => '108', + 'prev_word_id' => '2021', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2024', + 'placement' => '109', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2023', + ), + 6635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '110', + 'prev_word_id' => '2023', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2024', + ), + 6636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '111', + 'prev_word_id' => '2024', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '894', + ), + 6637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '112', + 'prev_word_id' => '894', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1319', + ), + 6638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '113', + 'prev_word_id' => '1319', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1549', + ), + 6639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '114', + 'prev_word_id' => '1549', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '917', + ), + 6640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '115', + 'prev_word_id' => '917', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2001', + 'placement' => '116', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1670', + 'placement' => '117', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2001', + ), + 6643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '118', + 'prev_word_id' => '2001', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1670', + ), + 6644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '119', + 'prev_word_id' => '1670', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '120', + 'prev_word_id' => '1605', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2003', + 'placement' => '121', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '122', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2003', + ), + 6648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '123', + 'prev_word_id' => '2003', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1403', + 'placement' => '124', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2025', + 'placement' => '125', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1403', + ), + 6651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '126', + 'prev_word_id' => '1403', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2025', + ), + 6652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '127', + 'prev_word_id' => '2025', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1410', + ), + 6653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '128', + 'prev_word_id' => '1410', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1983', + 'placement' => '129', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '130', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1983', + ), + 6656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2026', + 'placement' => '131', + 'prev_word_id' => '1983', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '132', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2026', + ), + 6658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '133', + 'prev_word_id' => '2026', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '809', + ), + 6659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2001', + 'placement' => '134', + 'prev_word_id' => '809', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '898', + ), + 6660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '135', + 'prev_word_id' => '898', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2001', + ), + 6661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '136', + 'prev_word_id' => '2001', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '941', + ), + 6662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1471', + 'placement' => '137', + 'prev_word_id' => '941', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '825', + ), + 6663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '138', + 'prev_word_id' => '825', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1471', + ), + 6664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2027', + 'placement' => '139', + 'prev_word_id' => '1471', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1688', + ), + 6665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '140', + 'prev_word_id' => '1688', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2027', + ), + 6666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '141', + 'prev_word_id' => '2027', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2028', + 'placement' => '142', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '916', + 'placement' => '143', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2028', + ), + 6669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '144', + 'prev_word_id' => '2028', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '916', + ), + 6670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '145', + 'prev_word_id' => '916', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '917', + ), + 6671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1403', + 'placement' => '146', + 'prev_word_id' => '917', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '147', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1403', + ), + 6673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1500', + 'placement' => '148', + 'prev_word_id' => '1403', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '898', + ), + 6674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '149', + 'prev_word_id' => '898', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1500', + ), + 6675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '150', + 'prev_word_id' => '1500', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '948', + ), + 6676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '151', + 'prev_word_id' => '948', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '949', + ), + 6677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2029', + 'placement' => '152', + 'prev_word_id' => '949', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '153', + 'prev_word_id' => '1605', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2029', + ), + 6679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2030', + 'placement' => '154', + 'prev_word_id' => '2029', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '155', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2030', + ), + 6681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2031', + 'placement' => '156', + 'prev_word_id' => '2030', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '157', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2031', + ), + 6683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '158', + 'prev_word_id' => '2031', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2032', + 'placement' => '159', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '160', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2032', + ), + 6686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '161', + 'prev_word_id' => '2032', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1285', + 'placement' => '162', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '163', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1285', + ), + 6689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '164', + 'prev_word_id' => '1285', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '165', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '166', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '931', + ), + 6692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '167', + 'prev_word_id' => '931', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '822', + ), + 6693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2033', + 'placement' => '168', + 'prev_word_id' => '822', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '898', + ), + 6694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '169', + 'prev_word_id' => '898', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2033', + ), + 6695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1680', + 'placement' => '170', + 'prev_word_id' => '2033', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '805', + ), + 6696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '171', + 'prev_word_id' => '805', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1680', + ), + 6697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '172', + 'prev_word_id' => '1680', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2034', + 'placement' => '173', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '174', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2034', + ), + 6700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '175', + 'prev_word_id' => '2034', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '948', + ), + 6701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2035', + 'placement' => '176', + 'prev_word_id' => '948', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '949', + ), + 6702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2036', + 'placement' => '177', + 'prev_word_id' => '949', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2035', + ), + 6703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '178', + 'prev_word_id' => '2035', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2036', + ), + 6704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '179', + 'prev_word_id' => '2036', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '813', + ), + 6705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '958', + 'placement' => '180', + 'prev_word_id' => '813', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '898', + ), + 6706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '181', + 'prev_word_id' => '898', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '958', + ), + 6707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '182', + 'prev_word_id' => '958', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '823', + ), + 6708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '853', + 'placement' => '183', + 'prev_word_id' => '823', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1420', + ), + 6709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '184', + 'prev_word_id' => '1420', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '853', + ), + 6710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '185', + 'prev_word_id' => '853', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '809', + ), + 6711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1348', + 'placement' => '186', + 'prev_word_id' => '809', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2037', + 'placement' => '187', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1348', + ), + 6713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '188', + 'prev_word_id' => '1348', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2037', + ), + 6714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '958', + 'placement' => '189', + 'prev_word_id' => '2037', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '190', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '958', + ), + 6716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2024', + 'placement' => '191', + 'prev_word_id' => '958', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '843', + ), + 6717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1636', + 'placement' => '192', + 'prev_word_id' => '843', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2024', + ), + 6718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2038', + 'placement' => '193', + 'prev_word_id' => '2024', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1636', + ), + 6719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2039', + 'placement' => '194', + 'prev_word_id' => '1636', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2038', + ), + 6720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '195', + 'prev_word_id' => '2038', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2039', + ), + 6721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2040', + 'placement' => '196', + 'prev_word_id' => '2039', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '823', + ), + 6722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '197', + 'prev_word_id' => '823', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2040', + ), + 6723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2041', + 'placement' => '198', + 'prev_word_id' => '2040', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '199', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2041', + ), + 6725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '200', + 'prev_word_id' => '2041', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '816', + ), + 6726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2000', + 'placement' => '201', + 'prev_word_id' => '816', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '202', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2000', + ), + 6728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '203', + 'prev_word_id' => '2000', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '814', + ), + 6729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2042', + 'placement' => '204', + 'prev_word_id' => '814', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '954', + ), + 6730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '205', + 'prev_word_id' => '954', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2042', + ), + 6731 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2015', + 'placement' => '206', + 'prev_word_id' => '2042', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '810', + ), + 6732 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2030', + 'placement' => '207', + 'prev_word_id' => '810', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2015', + ), + 6733 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '208', + 'prev_word_id' => '2015', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '2030', + ), + 6734 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '209', + 'prev_word_id' => '2030', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '833', + ), + 6735 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1499', + 'placement' => '210', + 'prev_word_id' => '833', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '843', + ), + 6736 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '211', + 'prev_word_id' => '843', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1499', + ), + 6737 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '212', + 'prev_word_id' => '1499', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '863', + ), + 6738 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '213', + 'prev_word_id' => '863', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '801', + ), + 6739 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '214', + 'prev_word_id' => '801', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '802', + ), + 6740 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '215', + 'prev_word_id' => '802', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '803', + ), + 6741 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11411', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '216', + 'prev_word_id' => '803', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6742 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '132', + 'frequency' => '0', + 'id' => '11412', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '217', + 'prev_word_id' => '1191', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6743 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '133', + 'frequency' => '0', + 'id' => '11413', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6744 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '133', + 'frequency' => '0', + 'id' => '11414', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154190', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6745 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '134', + 'frequency' => '0', + 'id' => '11415', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6746 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '134', + 'frequency' => '0', + 'id' => '11416', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6747 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '135', + 'frequency' => '0', + 'id' => '11417', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6748 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '135', + 'frequency' => '0', + 'id' => '11418', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6749 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11419', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2043', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1999', + ), + 6750 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11420', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '1', + 'prev_word_id' => '1999', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2043', + ), + 6751 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11421', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2044', + 'placement' => '2', + 'prev_word_id' => '2043', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6752 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11422', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '3', + 'prev_word_id' => '1665', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2044', + ), + 6753 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11423', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2045', + 'placement' => '4', + 'prev_word_id' => '2044', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '833', + ), + 6754 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11424', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '5', + 'prev_word_id' => '833', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2045', + ), + 6755 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11425', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '6', + 'prev_word_id' => '2045', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1787', + ), + 6756 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11426', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '7', + 'prev_word_id' => '1787', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '814', + ), + 6757 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11427', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2036', + 'placement' => '8', + 'prev_word_id' => '814', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '929', + ), + 6758 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11428', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '9', + 'prev_word_id' => '929', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2036', + ), + 6759 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11429', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1932', + 'placement' => '10', + 'prev_word_id' => '2036', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '816', + ), + 6760 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11430', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2046', + 'placement' => '11', + 'prev_word_id' => '816', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1932', + ), + 6761 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11431', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2047', + 'placement' => '12', + 'prev_word_id' => '1932', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2046', + ), + 6762 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11432', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2048', + 'placement' => '13', + 'prev_word_id' => '2046', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2047', + ), + 6763 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11433', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '14', + 'prev_word_id' => '2047', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2048', + ), + 6764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '15', + 'prev_word_id' => '2048', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '814', + ), + 6765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2036', + 'placement' => '16', + 'prev_word_id' => '814', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '929', + ), + 6766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '17', + 'prev_word_id' => '929', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2036', + ), + 6767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2049', + 'placement' => '18', + 'prev_word_id' => '2036', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '816', + ), + 6768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1852', + 'placement' => '19', + 'prev_word_id' => '816', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2049', + ), + 6769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '20', + 'prev_word_id' => '2049', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1852', + ), + 6770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2046', + 'placement' => '21', + 'prev_word_id' => '1852', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '816', + ), + 6771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '22', + 'prev_word_id' => '816', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '2046', + ), + 6772 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11442', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '23', + 'prev_word_id' => '2046', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6773 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '136', + 'frequency' => '0', + 'id' => '11443', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '24', + 'prev_word_id' => '1191', + 'published' => '1311154191', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6774 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '137', + 'frequency' => '0', + 'id' => '11444', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6775 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '137', + 'frequency' => '0', + 'id' => '11445', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6776 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '138', + 'frequency' => '0', + 'id' => '11446', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6777 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '138', + 'frequency' => '0', + 'id' => '11447', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6778 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11448', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1999', + ), + 6779 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11449', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '1', + 'prev_word_id' => '1999', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1638', + ), + 6780 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11450', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '2', + 'prev_word_id' => '1638', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1639', + ), + 6781 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11451', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '3', + 'prev_word_id' => '1639', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '4', + 'prev_word_id' => '1665', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1638', + ), + 6783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '5', + 'prev_word_id' => '1638', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1639', + ), + 6784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '6', + 'prev_word_id' => '1639', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2050', + 'placement' => '7', + 'prev_word_id' => '1665', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1603', + ), + 6786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '8', + 'prev_word_id' => '1603', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2050', + ), + 6787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1491', + 'placement' => '9', + 'prev_word_id' => '2050', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '863', + ), + 6788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '10', + 'prev_word_id' => '863', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1491', + ), + 6789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '11', + 'prev_word_id' => '1491', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '813', + ), + 6790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2051', + 'placement' => '12', + 'prev_word_id' => '813', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1592', + ), + 6791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2052', + 'placement' => '13', + 'prev_word_id' => '1592', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2051', + ), + 6792 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '14', + 'prev_word_id' => '2051', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2052', + ), + 6793 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '15', + 'prev_word_id' => '2052', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '809', + ), + 6794 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2053', + 'placement' => '16', + 'prev_word_id' => '809', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '814', + ), + 6795 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1872', + 'placement' => '17', + 'prev_word_id' => '814', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2053', + ), + 6796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '18', + 'prev_word_id' => '2053', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1872', + ), + 6797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1282', + 'placement' => '19', + 'prev_word_id' => '1872', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '833', + ), + 6798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '20', + 'prev_word_id' => '833', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1282', + ), + 6799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2054', + 'placement' => '21', + 'prev_word_id' => '1282', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '929', + ), + 6800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '22', + 'prev_word_id' => '929', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2054', + ), + 6801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '23', + 'prev_word_id' => '2054', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '801', + ), + 6802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '24', + 'prev_word_id' => '801', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '828', + ), + 6803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '25', + 'prev_word_id' => '828', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '814', + ), + 6804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '26', + 'prev_word_id' => '814', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '931', + ), + 6805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '27', + 'prev_word_id' => '931', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '822', + ), + 6806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '28', + 'prev_word_id' => '822', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '863', + ), + 6807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '29', + 'prev_word_id' => '863', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '810', + ), + 6808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2051', + 'placement' => '30', + 'prev_word_id' => '810', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '929', + ), + 6809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2055', + 'placement' => '31', + 'prev_word_id' => '929', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2051', + ), + 6810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '32', + 'prev_word_id' => '2051', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2055', + ), + 6811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '33', + 'prev_word_id' => '2055', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '929', + ), + 6812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2056', + 'placement' => '34', + 'prev_word_id' => '929', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '833', + ), + 6813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2057', + 'placement' => '35', + 'prev_word_id' => '833', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2056', + ), + 6814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2058', + 'placement' => '36', + 'prev_word_id' => '2056', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2057', + ), + 6815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '37', + 'prev_word_id' => '2057', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2058', + ), + 6816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '38', + 'prev_word_id' => '2058', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1603', + ), + 6817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2059', + 'placement' => '39', + 'prev_word_id' => '1603', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1787', + ), + 6818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '40', + 'prev_word_id' => '1787', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2059', + ), + 6819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '41', + 'prev_word_id' => '2059', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '801', + ), + 6820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '42', + 'prev_word_id' => '801', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '881', + ), + 6821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '43', + 'prev_word_id' => '881', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '833', + ), + 6822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '44', + 'prev_word_id' => '833', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '882', + ), + 6823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '45', + 'prev_word_id' => '882', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1417', + ), + 6824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '46', + 'prev_word_id' => '1417', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '938', + ), + 6825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2060', + 'placement' => '47', + 'prev_word_id' => '938', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '833', + ), + 6826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '48', + 'prev_word_id' => '833', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2060', + ), + 6827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2061', + 'placement' => '49', + 'prev_word_id' => '2060', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '894', + ), + 6828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '50', + 'prev_word_id' => '894', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2061', + ), + 6829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2062', + 'placement' => '51', + 'prev_word_id' => '2061', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '863', + ), + 6830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2051', + 'placement' => '52', + 'prev_word_id' => '863', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2062', + ), + 6831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '53', + 'prev_word_id' => '2062', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2051', + ), + 6832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '54', + 'prev_word_id' => '2051', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '863', + ), + 6833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2063', + 'placement' => '55', + 'prev_word_id' => '863', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '56', + 'prev_word_id' => '1665', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2063', + ), + 6835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '57', + 'prev_word_id' => '2063', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1605', + ), + 6836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2064', + 'placement' => '58', + 'prev_word_id' => '1605', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '59', + 'prev_word_id' => '1665', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2064', + ), + 6838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '60', + 'prev_word_id' => '2064', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1638', + ), + 6839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '61', + 'prev_word_id' => '1638', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1639', + ), + 6840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '62', + 'prev_word_id' => '1639', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1603', + ), + 6841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '63', + 'prev_word_id' => '1603', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '948', + ), + 6842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2065', + 'placement' => '64', + 'prev_word_id' => '948', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '949', + ), + 6843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '65', + 'prev_word_id' => '949', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2065', + ), + 6844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2066', + 'placement' => '66', + 'prev_word_id' => '2065', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '805', + ), + 6845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '67', + 'prev_word_id' => '805', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2066', + ), + 6846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2067', + 'placement' => '68', + 'prev_word_id' => '2066', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '69', + 'prev_word_id' => '1665', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2067', + ), + 6848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '70', + 'prev_word_id' => '2067', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1603', + ), + 6849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '71', + 'prev_word_id' => '1603', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '948', + ), + 6850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2068', + 'placement' => '72', + 'prev_word_id' => '948', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '949', + ), + 6851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1301', + 'placement' => '73', + 'prev_word_id' => '949', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2068', + ), + 6852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1445', + 'placement' => '74', + 'prev_word_id' => '2068', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1301', + ), + 6853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2069', + 'placement' => '75', + 'prev_word_id' => '1301', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1445', + ), + 6854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '76', + 'prev_word_id' => '1445', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2069', + ), + 6855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '77', + 'prev_word_id' => '2069', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1698', + ), + 6856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2043', + 'placement' => '78', + 'prev_word_id' => '1698', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '801', + ), + 6857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2070', + 'placement' => '79', + 'prev_word_id' => '801', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2043', + ), + 6858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2071', + 'placement' => '80', + 'prev_word_id' => '2043', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2070', + ), + 6859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2055', + 'placement' => '81', + 'prev_word_id' => '2070', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2071', + ), + 6860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '82', + 'prev_word_id' => '2071', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2055', + ), + 6861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '83', + 'prev_word_id' => '2055', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '931', + ), + 6862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '84', + 'prev_word_id' => '931', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '822', + ), + 6863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2063', + 'placement' => '85', + 'prev_word_id' => '822', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1665', + ), + 6864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '86', + 'prev_word_id' => '1665', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2063', + ), + 6865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '87', + 'prev_word_id' => '2063', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1603', + ), + 6866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '88', + 'prev_word_id' => '1603', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '948', + ), + 6867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2072', + 'placement' => '89', + 'prev_word_id' => '948', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '949', + ), + 6868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2073', + 'placement' => '90', + 'prev_word_id' => '949', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2072', + ), + 6869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2074', + 'placement' => '91', + 'prev_word_id' => '2072', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2073', + ), + 6870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '92', + 'prev_word_id' => '2073', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2074', + ), + 6871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1458', + 'placement' => '93', + 'prev_word_id' => '2074', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1594', + ), + 6872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2054', + 'placement' => '94', + 'prev_word_id' => '1594', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1458', + ), + 6873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '95', + 'prev_word_id' => '1458', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2054', + ), + 6874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2075', + 'placement' => '96', + 'prev_word_id' => '2054', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '809', + ), + 6875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '97', + 'prev_word_id' => '809', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '2075', + ), + 6876 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11546', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '98', + 'prev_word_id' => '2075', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6877 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '139', + 'frequency' => '0', + 'id' => '11547', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '99', + 'prev_word_id' => '1191', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6878 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '140', + 'frequency' => '0', + 'id' => '11548', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6879 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '140', + 'frequency' => '0', + 'id' => '11549', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6880 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '141', + 'frequency' => '0', + 'id' => '11550', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6881 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '141', + 'frequency' => '0', + 'id' => '11551', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154192', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6882 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '142', + 'frequency' => '0', + 'id' => '11552', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6883 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '142', + 'frequency' => '0', + 'id' => '11553', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6884 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '143', + 'frequency' => '0', + 'id' => '11554', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6885 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '143', + 'frequency' => '0', + 'id' => '11555', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1716', + ), + 6886 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11556', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2076', + ), + 6887 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11557', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '1', + 'prev_word_id' => '2076', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '802', + ), + 6888 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11558', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2077', + 'placement' => '2', + 'prev_word_id' => '802', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '803', + ), + 6889 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11559', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '3', + 'prev_word_id' => '803', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2077', + ), + 6890 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11560', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '4', + 'prev_word_id' => '2077', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2076', + ), + 6891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '5', + 'prev_word_id' => '2076', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1790', + ), + 6892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '6', + 'prev_word_id' => '1790', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '805', + ), + 6893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '7', + 'prev_word_id' => '805', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2076', + ), + 6894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2078', + 'placement' => '8', + 'prev_word_id' => '2076', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1280', + ), + 6895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '9', + 'prev_word_id' => '1280', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2078', + ), + 6896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '10', + 'prev_word_id' => '2078', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2076', + ), + 6897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '11', + 'prev_word_id' => '2076', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '805', + ), + 6898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '12', + 'prev_word_id' => '805', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '882', + ), + 6899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1883', + 'placement' => '13', + 'prev_word_id' => '882', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1323', + ), + 6900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '14', + 'prev_word_id' => '1323', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1883', + ), + 6901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1845', + 'placement' => '15', + 'prev_word_id' => '1883', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '816', + ), + 6902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '16', + 'prev_word_id' => '816', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1845', + ), + 6903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '17', + 'prev_word_id' => '1845', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2076', + ), + 6904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '18', + 'prev_word_id' => '2076', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1791', + ), + 6905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1480', + 'placement' => '19', + 'prev_word_id' => '1791', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '810', + ), + 6906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '20', + 'prev_word_id' => '810', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1480', + ), + 6907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2079', + 'placement' => '21', + 'prev_word_id' => '1480', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '801', + ), + 6908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '22', + 'prev_word_id' => '801', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2079', + ), + 6909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2080', + 'placement' => '23', + 'prev_word_id' => '2079', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '24', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2080', + ), + 6911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '25', + 'prev_word_id' => '2080', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '813', + ), + 6912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2081', + 'placement' => '26', + 'prev_word_id' => '813', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '27', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2081', + ), + 6914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2082', + 'placement' => '28', + 'prev_word_id' => '2081', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '813', + ), + 6915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '29', + 'prev_word_id' => '813', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2082', + ), + 6916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '30', + 'prev_word_id' => '2082', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1620', + ), + 6917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '31', + 'prev_word_id' => '1620', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1437', + ), + 6918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1924', + 'placement' => '32', + 'prev_word_id' => '1437', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1319', + ), + 6919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1892', + 'placement' => '33', + 'prev_word_id' => '1319', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1924', + ), + 6920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '34', + 'prev_word_id' => '1924', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1892', + ), + 6921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '35', + 'prev_word_id' => '1892', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '816', + ), + 6922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '36', + 'prev_word_id' => '816', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '37', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '841', + ), + 6924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2078', + 'placement' => '38', + 'prev_word_id' => '841', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1280', + ), + 6925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '39', + 'prev_word_id' => '1280', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2078', + ), + 6926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2083', + 'placement' => '40', + 'prev_word_id' => '2078', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2076', + ), + 6927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '41', + 'prev_word_id' => '2076', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2083', + ), + 6928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '42', + 'prev_word_id' => '2083', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1620', + ), + 6929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2084', + 'placement' => '43', + 'prev_word_id' => '1620', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '863', + ), + 6930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2085', + 'placement' => '44', + 'prev_word_id' => '863', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2084', + ), + 6931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '45', + 'prev_word_id' => '2084', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2085', + ), + 6932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '46', + 'prev_word_id' => '2085', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '848', + ), + 6933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '47', + 'prev_word_id' => '848', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '48', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2086', + ), + 6935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '49', + 'prev_word_id' => '2086', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '841', + ), + 6936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '50', + 'prev_word_id' => '841', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1577', + ), + 6937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '51', + 'prev_word_id' => '1577', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1417', + ), + 6938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2087', + 'placement' => '52', + 'prev_word_id' => '1417', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1791', + ), + 6939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2088', + 'placement' => '53', + 'prev_word_id' => '1791', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2087', + ), + 6940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '54', + 'prev_word_id' => '2087', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2088', + ), + 6941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1910', + 'placement' => '55', + 'prev_word_id' => '2088', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1414', + ), + 6942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1910', + 'placement' => '56', + 'prev_word_id' => '1414', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1910', + ), + 6943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '57', + 'prev_word_id' => '1910', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1910', + ), + 6944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '58', + 'prev_word_id' => '1910', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2089', + ), + 6945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1512', + 'placement' => '59', + 'prev_word_id' => '2089', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '60', + 'prev_word_id' => '1550', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1512', + ), + 6947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '61', + 'prev_word_id' => '1512', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '870', + ), + 6948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '62', + 'prev_word_id' => '870', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '63', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2086', + ), + 6950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '64', + 'prev_word_id' => '2086', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '841', + ), + 6951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '65', + 'prev_word_id' => '841', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1577', + ), + 6952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1744', + 'placement' => '66', + 'prev_word_id' => '1577', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1417', + ), + 6953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '67', + 'prev_word_id' => '1417', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1744', + ), + 6954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '68', + 'prev_word_id' => '1744', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1437', + ), + 6955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2090', + 'placement' => '69', + 'prev_word_id' => '1437', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '810', + ), + 6956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '70', + 'prev_word_id' => '810', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2090', + ), + 6957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '71', + 'prev_word_id' => '2090', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '863', + ), + 6958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '72', + 'prev_word_id' => '863', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1290', + ), + 6959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '73', + 'prev_word_id' => '1290', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '943', + ), + 6960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '74', + 'prev_word_id' => '943', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '854', + ), + 6961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '75', + 'prev_word_id' => '854', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2091', + 'placement' => '76', + 'prev_word_id' => '1550', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '843', + ), + 6963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '77', + 'prev_word_id' => '843', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2091', + ), + 6964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '78', + 'prev_word_id' => '2091', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1420', + ), + 6965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '79', + 'prev_word_id' => '1420', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '80', + 'prev_word_id' => '1550', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '823', + ), + 6967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '81', + 'prev_word_id' => '823', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '82', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2086', + ), + 6969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '83', + 'prev_word_id' => '2086', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1577', + ), + 6970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2092', + 'placement' => '84', + 'prev_word_id' => '1577', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '810', + ), + 6971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '85', + 'prev_word_id' => '810', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2092', + ), + 6972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '86', + 'prev_word_id' => '2092', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '943', + ), + 6973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '87', + 'prev_word_id' => '943', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '854', + ), + 6974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '88', + 'prev_word_id' => '854', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '89', + 'prev_word_id' => '1550', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '843', + ), + 6976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '90', + 'prev_word_id' => '843', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '816', + ), + 6977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2093', + 'placement' => '91', + 'prev_word_id' => '816', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1749', + ), + 6978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1830', + 'placement' => '92', + 'prev_word_id' => '1749', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2093', + ), + 6979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2088', + 'placement' => '93', + 'prev_word_id' => '2093', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1830', + ), + 6980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2094', + 'placement' => '94', + 'prev_word_id' => '1830', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2088', + ), + 6981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '95', + 'prev_word_id' => '2088', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2094', + ), + 6982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '96', + 'prev_word_id' => '2094', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '848', + ), + 6983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '97', + 'prev_word_id' => '848', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1420', + ), + 6984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '98', + 'prev_word_id' => '1420', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1550', + ), + 6985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '99', + 'prev_word_id' => '1550', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '823', + ), + 6986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '100', + 'prev_word_id' => '823', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 6987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '101', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2086', + ), + 6988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '102', + 'prev_word_id' => '2086', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1577', + ), + 6989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '103', + 'prev_word_id' => '1577', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '890', + ), + 6990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '104', + 'prev_word_id' => '890', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '921', + ), + 6991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '105', + 'prev_word_id' => '921', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '948', + ), + 6992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '106', + 'prev_word_id' => '948', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '949', + ), + 6993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2095', + 'placement' => '107', + 'prev_word_id' => '949', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1287', + ), + 6994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2096', + 'placement' => '108', + 'prev_word_id' => '1287', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2095', + ), + 6995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '109', + 'prev_word_id' => '2095', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2096', + ), + 6996 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11666', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '110', + 'prev_word_id' => '2096', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6997 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '144', + 'frequency' => '0', + 'id' => '11667', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '111', + 'prev_word_id' => '1191', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1191', + ), + 6998 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11668', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '912', + ), + 6999 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11669', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2097', + 'placement' => '1', + 'prev_word_id' => '912', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '816', + ), + 7000 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11670', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2098', + 'placement' => '2', + 'prev_word_id' => '816', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2097', + ), + 7001 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11671', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '3', + 'prev_word_id' => '2097', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2098', + ), + 7002 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11672', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2099', + 'placement' => '4', + 'prev_word_id' => '2098', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7003 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11673', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '5', + 'prev_word_id' => '1133', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2099', + ), + 7004 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11674', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '6', + 'prev_word_id' => '2099', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '809', + ), + 7005 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11675', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '7', + 'prev_word_id' => '809', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '802', + ), + 7006 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11676', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '8', + 'prev_word_id' => '802', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '803', + ), + 7007 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11677', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '9', + 'prev_word_id' => '803', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7008 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11678', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '10', + 'prev_word_id' => '1133', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '894', + ), + 7009 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11679', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2024', + 'placement' => '11', + 'prev_word_id' => '894', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '843', + ), + 7010 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11680', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1578', + 'placement' => '12', + 'prev_word_id' => '843', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2024', + ), + 7011 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11681', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '13', + 'prev_word_id' => '2024', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1578', + ), + 7012 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11682', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '14', + 'prev_word_id' => '1578', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '810', + ), + 7013 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11683', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2100', + 'placement' => '15', + 'prev_word_id' => '810', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '832', + ), + 7014 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11684', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '16', + 'prev_word_id' => '832', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2100', + ), + 7015 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11685', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '17', + 'prev_word_id' => '2100', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1443', + ), + 7016 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11686', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '18', + 'prev_word_id' => '1443', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1277', + ), + 7017 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11687', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2101', + 'placement' => '19', + 'prev_word_id' => '1277', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '814', + ), + 7018 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11688', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '20', + 'prev_word_id' => '814', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '2101', + ), + 7019 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11689', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '21', + 'prev_word_id' => '2101', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7020 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '145', + 'frequency' => '0', + 'id' => '11690', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '22', + 'prev_word_id' => '1191', + 'published' => '1311154193', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7021 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '146', + 'frequency' => '0', + 'id' => '11691', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1716', + ), + 7022 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '146', + 'frequency' => '0', + 'id' => '11692', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1716', + ), + 7023 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11693', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2103', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2102', + ), + 7024 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11694', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1', + 'prev_word_id' => '2102', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2103', + ), + 7025 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11695', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '2', + 'prev_word_id' => '2103', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '802', + ), + 7026 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11696', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '947', + 'placement' => '3', + 'prev_word_id' => '802', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '803', + ), + 7027 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11697', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2077', + 'placement' => '4', + 'prev_word_id' => '803', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '947', + ), + 7028 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11698', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '5', + 'prev_word_id' => '947', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2077', + ), + 7029 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11699', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '6', + 'prev_word_id' => '2077', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7030 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11700', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '7', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2102', + ), + 7031 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11701', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '8', + 'prev_word_id' => '2102', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2089', + ), + 7032 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11702', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '9', + 'prev_word_id' => '2089', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1429', + ), + 7033 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11703', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1421', + 'placement' => '10', + 'prev_word_id' => '1429', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7034 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11704', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '11', + 'prev_word_id' => '1437', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1421', + ), + 7035 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11705', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1827', + 'placement' => '12', + 'prev_word_id' => '1421', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1481', + ), + 7036 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11706', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '13', + 'prev_word_id' => '1481', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1827', + ), + 7037 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11707', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2104', + 'placement' => '14', + 'prev_word_id' => '1827', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7038 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11708', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '15', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2104', + ), + 7039 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11709', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2105', + 'placement' => '16', + 'prev_word_id' => '2104', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1368', + ), + 7040 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11710', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '17', + 'prev_word_id' => '1368', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2105', + ), + 7041 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11711', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1567', + 'placement' => '18', + 'prev_word_id' => '2105', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '830', + ), + 7042 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11712', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '19', + 'prev_word_id' => '830', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1567', + ), + 7043 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11713', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2106', + 'placement' => '20', + 'prev_word_id' => '1567', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '833', + ), + 7044 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11714', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1390', + 'placement' => '21', + 'prev_word_id' => '833', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2106', + ), + 7045 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11715', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '22', + 'prev_word_id' => '2106', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1390', + ), + 7046 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11716', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2107', + 'placement' => '23', + 'prev_word_id' => '1390', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7047 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11717', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1531', + 'placement' => '24', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2107', + ), + 7048 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11718', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '25', + 'prev_word_id' => '2107', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1531', + ), + 7049 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11719', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '26', + 'prev_word_id' => '1531', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '830', + ), + 7050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '27', + 'prev_word_id' => '830', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1933', + 'placement' => '28', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1513', + ), + 7052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '29', + 'prev_word_id' => '1513', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1933', + ), + 7053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2108', + 'placement' => '30', + 'prev_word_id' => '1933', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1280', + ), + 7054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2109', + 'placement' => '31', + 'prev_word_id' => '1280', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2108', + ), + 7055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2110', + 'placement' => '32', + 'prev_word_id' => '2108', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2109', + ), + 7056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2111', + 'placement' => '33', + 'prev_word_id' => '2109', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2110', + ), + 7057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '34', + 'prev_word_id' => '2110', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2111', + ), + 7058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '35', + 'prev_word_id' => '2111', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2112', + 'placement' => '36', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1429', + ), + 7060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '37', + 'prev_word_id' => '1429', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2112', + ), + 7061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '38', + 'prev_word_id' => '2112', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1368', + ), + 7062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '39', + 'prev_word_id' => '1368', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '40', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '41', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1084', + ), + 7065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '42', + 'prev_word_id' => '1084', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '948', + ), + 7066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '43', + 'prev_word_id' => '948', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '949', + ), + 7067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1861', + 'placement' => '44', + 'prev_word_id' => '949', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '921', + ), + 7068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2113', + 'placement' => '45', + 'prev_word_id' => '921', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1861', + ), + 7069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2114', + 'placement' => '46', + 'prev_word_id' => '1861', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2113', + ), + 7070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '47', + 'prev_word_id' => '2113', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2114', + ), + 7071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '972', + 'placement' => '48', + 'prev_word_id' => '2114', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '49', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '972', + ), + 7073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '50', + 'prev_word_id' => '972', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1300', + ), + 7074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '51', + 'prev_word_id' => '1300', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2115', + 'placement' => '52', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '53', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2115', + ), + 7077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '54', + 'prev_word_id' => '2115', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '894', + ), + 7078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '55', + 'prev_word_id' => '894', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '881', + ), + 7079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '56', + 'prev_word_id' => '881', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '57', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2102', + ), + 7081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '58', + 'prev_word_id' => '2102', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2089', + ), + 7082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1510', + 'placement' => '59', + 'prev_word_id' => '2089', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '60', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1510', + ), + 7084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '61', + 'prev_word_id' => '1510', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1827', + 'placement' => '62', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1481', + ), + 7086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '63', + 'prev_word_id' => '1481', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1827', + ), + 7087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '64', + 'prev_word_id' => '1827', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1417', + ), + 7088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '65', + 'prev_word_id' => '1417', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1686', + ), + 7089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '66', + 'prev_word_id' => '1686', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '805', + ), + 7090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1418', + 'placement' => '67', + 'prev_word_id' => '805', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '68', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1418', + ), + 7092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '69', + 'prev_word_id' => '1418', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1290', + ), + 7093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '70', + 'prev_word_id' => '1290', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1605', + ), + 7094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '71', + 'prev_word_id' => '1605', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '894', + ), + 7095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1656', + 'placement' => '72', + 'prev_word_id' => '894', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1319', + ), + 7096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2105', + 'placement' => '73', + 'prev_word_id' => '1319', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1656', + ), + 7097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2116', + 'placement' => '74', + 'prev_word_id' => '1656', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2105', + ), + 7098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '75', + 'prev_word_id' => '2105', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2116', + ), + 7099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '76', + 'prev_word_id' => '2116', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1749', + ), + 7100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2105', + 'placement' => '77', + 'prev_word_id' => '1749', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2116', + 'placement' => '78', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2105', + ), + 7102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2117', + 'placement' => '79', + 'prev_word_id' => '2105', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2116', + ), + 7103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '80', + 'prev_word_id' => '2116', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2117', + ), + 7104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '81', + 'prev_word_id' => '2117', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2118', + ), + 7105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2117', + 'placement' => '82', + 'prev_word_id' => '2118', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2118', + ), + 7106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '83', + 'prev_word_id' => '2118', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2117', + ), + 7107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2119', + 'placement' => '84', + 'prev_word_id' => '2117', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2118', + ), + 7108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '85', + 'prev_word_id' => '2118', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2119', + ), + 7109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2120', + 'placement' => '86', + 'prev_word_id' => '2119', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2118', + ), + 7110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '87', + 'prev_word_id' => '2118', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2120', + ), + 7111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '88', + 'prev_word_id' => '2120', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1749', + ), + 7112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '89', + 'prev_word_id' => '1749', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '90', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2102', + ), + 7114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '91', + 'prev_word_id' => '2102', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2089', + ), + 7115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '92', + 'prev_word_id' => '2089', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1054', + ), + 7116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2121', + 'placement' => '93', + 'prev_word_id' => '1054', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2089', + ), + 7117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '94', + 'prev_word_id' => '2089', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2121', + ), + 7118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2122', + 'placement' => '95', + 'prev_word_id' => '2121', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2102', + ), + 7119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '96', + 'prev_word_id' => '2102', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2122', + ), + 7120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2117', + 'placement' => '97', + 'prev_word_id' => '2122', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1287', + ), + 7121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '98', + 'prev_word_id' => '1287', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2117', + ), + 7122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '99', + 'prev_word_id' => '2117', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2118', + ), + 7123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '100', + 'prev_word_id' => '2118', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1061', + ), + 7124 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11794', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '101', + 'prev_word_id' => '1061', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7125 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '147', + 'frequency' => '0', + 'id' => '11795', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '102', + 'prev_word_id' => '1191', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7126 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11796', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '944', + ), + 7127 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11797', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1', + 'prev_word_id' => '944', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7128 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11798', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1952', + 'placement' => '2', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7129 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11799', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '3', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1952', + ), + 7130 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11800', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '4', + 'prev_word_id' => '1952', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7131 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11801', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2123', + 'placement' => '5', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '881', + ), + 7132 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11802', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '6', + 'prev_word_id' => '881', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2123', + ), + 7133 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11803', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '7', + 'prev_word_id' => '2123', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7134 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11804', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1999', + 'placement' => '8', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7135 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11805', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2124', + 'placement' => '9', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1999', + ), + 7136 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11806', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '10', + 'prev_word_id' => '1999', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2124', + ), + 7137 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11807', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '11', + 'prev_word_id' => '2124', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7138 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11808', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2125', + 'placement' => '12', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1547', + ), + 7139 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11809', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '13', + 'prev_word_id' => '1547', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2125', + ), + 7140 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11810', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '14', + 'prev_word_id' => '2125', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1690', + ), + 7141 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11811', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2126', + 'placement' => '15', + 'prev_word_id' => '1690', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '932', + ), + 7142 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11812', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '16', + 'prev_word_id' => '932', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2126', + ), + 7143 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11813', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '17', + 'prev_word_id' => '2126', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '802', + ), + 7144 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11814', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '947', + 'placement' => '18', + 'prev_word_id' => '802', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '803', + ), + 7145 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11815', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2077', + 'placement' => '19', + 'prev_word_id' => '803', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '947', + ), + 7146 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11816', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '20', + 'prev_word_id' => '947', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2077', + ), + 7147 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11817', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '21', + 'prev_word_id' => '2077', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7148 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11818', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '22', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '929', + ), + 7149 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11819', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1213', + 'placement' => '23', + 'prev_word_id' => '929', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7150 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11820', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '845', + 'placement' => '24', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1213', + ), + 7151 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11821', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '25', + 'prev_word_id' => '1213', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '845', + ), + 7152 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11822', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '26', + 'prev_word_id' => '845', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7153 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '27', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '898', + ), + 7154 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '28', + 'prev_word_id' => '898', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1843', + ), + 7155 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '29', + 'prev_word_id' => '1843', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '809', + ), + 7156 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1907', + 'placement' => '30', + 'prev_word_id' => '809', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7157 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2127', + 'placement' => '31', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1907', + ), + 7158 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2125', + 'placement' => '32', + 'prev_word_id' => '1907', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2127', + ), + 7159 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '33', + 'prev_word_id' => '2127', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2125', + ), + 7160 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '34', + 'prev_word_id' => '2125', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '976', + ), + 7161 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2128', + 'placement' => '35', + 'prev_word_id' => '976', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7162 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2129', + 'placement' => '36', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2128', + ), + 7163 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '37', + 'prev_word_id' => '2128', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2129', + ), + 7164 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2130', + 'placement' => '38', + 'prev_word_id' => '2129', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7165 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '39', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2130', + ), + 7166 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '40', + 'prev_word_id' => '2130', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1690', + ), + 7167 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '41', + 'prev_word_id' => '1690', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '932', + ), + 7168 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '42', + 'prev_word_id' => '932', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1843', + ), + 7169 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2131', + 'placement' => '43', + 'prev_word_id' => '1843', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '809', + ), + 7170 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '44', + 'prev_word_id' => '809', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2131', + ), + 7171 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2132', + 'placement' => '45', + 'prev_word_id' => '2131', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7172 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '46', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2132', + ), + 7173 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1367', + 'placement' => '47', + 'prev_word_id' => '2132', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7174 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '48', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1367', + ), + 7175 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1959', + 'placement' => '49', + 'prev_word_id' => '1367', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7176 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '50', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1959', + ), + 7177 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '51', + 'prev_word_id' => '1959', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7178 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '52', + 'prev_word_id' => '1437', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '843', + ), + 7179 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '53', + 'prev_word_id' => '843', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '844', + ), + 7180 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2133', + 'placement' => '54', + 'prev_word_id' => '844', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1761', + ), + 7181 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2134', + 'placement' => '55', + 'prev_word_id' => '1761', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2133', + ), + 7182 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '56', + 'prev_word_id' => '2133', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2134', + ), + 7183 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2135', + 'placement' => '57', + 'prev_word_id' => '2134', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7184 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '58', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2135', + ), + 7185 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '59', + 'prev_word_id' => '2135', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7186 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '60', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '61', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '944', + 'placement' => '62', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '63', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '944', + ), + 7190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '64', + 'prev_word_id' => '944', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2137', + 'placement' => '65', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7192 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2138', + 'placement' => '66', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2137', + ), + 7193 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '67', + 'prev_word_id' => '2137', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2138', + ), + 7194 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '68', + 'prev_word_id' => '2138', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7195 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2135', + 'placement' => '69', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7196 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '70', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2135', + ), + 7197 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '71', + 'prev_word_id' => '2135', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '833', + ), + 7198 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '72', + 'prev_word_id' => '833', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7199 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '73', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7200 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '74', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7201 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2139', + 'placement' => '75', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '76', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2139', + ), + 7203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '77', + 'prev_word_id' => '2139', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1957', + 'placement' => '78', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1596', + ), + 7205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1913', + 'placement' => '79', + 'prev_word_id' => '1596', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1957', + ), + 7206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2128', + 'placement' => '80', + 'prev_word_id' => '1957', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1913', + ), + 7207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2140', + 'placement' => '81', + 'prev_word_id' => '1913', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2128', + ), + 7208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2141', + 'placement' => '82', + 'prev_word_id' => '2128', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2140', + ), + 7209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2142', + 'placement' => '83', + 'prev_word_id' => '2140', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2141', + ), + 7210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2143', + 'placement' => '84', + 'prev_word_id' => '2141', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2142', + ), + 7211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '85', + 'prev_word_id' => '2142', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2143', + ), + 7212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1670', + 'placement' => '86', + 'prev_word_id' => '2143', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2144', + 'placement' => '87', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1670', + ), + 7214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1284', + 'placement' => '88', + 'prev_word_id' => '1670', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2144', + ), + 7215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '89', + 'prev_word_id' => '2144', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1284', + ), + 7216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '90', + 'prev_word_id' => '1284', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '91', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2041', + 'placement' => '92', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '93', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2041', + ), + 7220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '94', + 'prev_word_id' => '2041', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '95', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '803', + ), + 7222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2145', + 'placement' => '96', + 'prev_word_id' => '803', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '805', + ), + 7223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '97', + 'prev_word_id' => '805', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2145', + ), + 7224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '98', + 'prev_word_id' => '2145', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '804', + ), + 7225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '99', + 'prev_word_id' => '804', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2146', + 'placement' => '100', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '805', + ), + 7227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '101', + 'prev_word_id' => '805', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2146', + ), + 7228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '102', + 'prev_word_id' => '2146', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1008', + ), + 7229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2137', + 'placement' => '103', + 'prev_word_id' => '1008', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '104', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2137', + ), + 7231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '105', + 'prev_word_id' => '2137', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '948', + ), + 7232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1439', + 'placement' => '106', + 'prev_word_id' => '948', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '949', + ), + 7233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '107', + 'prev_word_id' => '949', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1439', + ), + 7234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1435', + 'placement' => '108', + 'prev_word_id' => '1439', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '109', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1435', + ), + 7236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '110', + 'prev_word_id' => '1435', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '111', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '112', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2147', + 'placement' => '113', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1770', + 'placement' => '114', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2147', + ), + 7241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '115', + 'prev_word_id' => '2147', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1770', + ), + 7242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '116', + 'prev_word_id' => '1770', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2041', + 'placement' => '117', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '118', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2041', + ), + 7245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2024', + 'placement' => '119', + 'prev_word_id' => '2041', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '805', + ), + 7246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '120', + 'prev_word_id' => '805', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2024', + ), + 7247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '121', + 'prev_word_id' => '2024', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '122', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '123', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '124', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2135', + 'placement' => '125', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1624', + 'placement' => '126', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2135', + ), + 7253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '127', + 'prev_word_id' => '2135', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1624', + ), + 7254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2041', + 'placement' => '128', + 'prev_word_id' => '1624', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '129', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2041', + ), + 7256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2148', + 'placement' => '130', + 'prev_word_id' => '2041', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '805', + ), + 7257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '131', + 'prev_word_id' => '805', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2148', + ), + 7258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '132', + 'prev_word_id' => '2148', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '133', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '897', + ), + 7260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '134', + 'prev_word_id' => '897', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '135', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '136', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '833', + ), + 7263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2149', + 'placement' => '137', + 'prev_word_id' => '833', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '138', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2149', + ), + 7265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '139', + 'prev_word_id' => '2149', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '140', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '141', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '142', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1761', + ), + 7269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2041', + 'placement' => '143', + 'prev_word_id' => '1761', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '144', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2041', + ), + 7271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1924', + 'placement' => '145', + 'prev_word_id' => '2041', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1689', + ), + 7272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2148', + 'placement' => '146', + 'prev_word_id' => '1689', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1924', + ), + 7273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '147', + 'prev_word_id' => '1924', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2148', + ), + 7274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '148', + 'prev_word_id' => '2148', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '833', + ), + 7275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '149', + 'prev_word_id' => '833', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '150', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1683', + ), + 7277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2150', + 'placement' => '151', + 'prev_word_id' => '1683', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1761', + ), + 7278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2151', + 'placement' => '152', + 'prev_word_id' => '1761', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2150', + ), + 7279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2140', + 'placement' => '153', + 'prev_word_id' => '2150', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2151', + ), + 7280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1426', + 'placement' => '154', + 'prev_word_id' => '2151', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2140', + ), + 7281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2004', + 'placement' => '155', + 'prev_word_id' => '2140', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1426', + ), + 7282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '156', + 'prev_word_id' => '1426', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2004', + ), + 7283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '157', + 'prev_word_id' => '2004', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '158', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1247', + ), + 7285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2152', + 'placement' => '159', + 'prev_word_id' => '1247', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2153', + 'placement' => '160', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2152', + ), + 7287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2004', + 'placement' => '161', + 'prev_word_id' => '2152', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2153', + ), + 7288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2154', + 'placement' => '162', + 'prev_word_id' => '2153', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2004', + ), + 7289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '163', + 'prev_word_id' => '2004', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2154', + ), + 7290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '944', + 'placement' => '164', + 'prev_word_id' => '2154', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '165', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '944', + ), + 7292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '166', + 'prev_word_id' => '944', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2155', + 'placement' => '167', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1429', + ), + 7294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2008', + 'placement' => '168', + 'prev_word_id' => '1429', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2155', + ), + 7295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1836', + 'placement' => '169', + 'prev_word_id' => '2155', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2008', + ), + 7296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '170', + 'prev_word_id' => '2008', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1836', + ), + 7297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2136', + 'placement' => '171', + 'prev_word_id' => '1836', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2156', + 'placement' => '172', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2136', + ), + 7299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '173', + 'prev_word_id' => '2136', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2156', + ), + 7300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2152', + 'placement' => '174', + 'prev_word_id' => '2156', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2153', + 'placement' => '175', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2152', + ), + 7302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '176', + 'prev_word_id' => '2152', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2153', + ), + 7303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '177', + 'prev_word_id' => '2153', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '936', + ), + 7304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2131', + 'placement' => '178', + 'prev_word_id' => '936', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1384', + ), + 7305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '179', + 'prev_word_id' => '1384', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2131', + ), + 7306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2157', + 'placement' => '180', + 'prev_word_id' => '2131', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '945', + ), + 7307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '181', + 'prev_word_id' => '945', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2157', + ), + 7308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '182', + 'prev_word_id' => '2157', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '888', + ), + 7309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2158', + 'placement' => '183', + 'prev_word_id' => '888', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '844', + ), + 7310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1682', + 'placement' => '184', + 'prev_word_id' => '844', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2158', + ), + 7311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2069', + 'placement' => '185', + 'prev_word_id' => '2158', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1682', + ), + 7312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2159', + 'placement' => '186', + 'prev_word_id' => '1682', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2069', + ), + 7313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2069', + 'placement' => '187', + 'prev_word_id' => '2069', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2159', + ), + 7314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2049', + 'placement' => '188', + 'prev_word_id' => '2159', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2069', + ), + 7315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '189', + 'prev_word_id' => '2069', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2049', + ), + 7316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '190', + 'prev_word_id' => '2049', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '917', + ), + 7317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '191', + 'prev_word_id' => '917', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '814', + ), + 7318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '192', + 'prev_word_id' => '814', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1247', + ), + 7319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '193', + 'prev_word_id' => '1247', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '809', + ), + 7320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2160', + 'placement' => '194', + 'prev_word_id' => '809', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '898', + ), + 7321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2161', + 'placement' => '195', + 'prev_word_id' => '898', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2160', + ), + 7322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2162', + 'placement' => '196', + 'prev_word_id' => '2160', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2161', + ), + 7323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '197', + 'prev_word_id' => '2161', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2162', + ), + 7324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '198', + 'prev_word_id' => '2162', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '863', + ), + 7325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2163', + 'placement' => '199', + 'prev_word_id' => '863', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '810', + ), + 7326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2049', + 'placement' => '200', + 'prev_word_id' => '810', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2163', + ), + 7327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '201', + 'prev_word_id' => '2163', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2049', + ), + 7328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2097', + 'placement' => '202', + 'prev_word_id' => '2049', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '11999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2098', + 'placement' => '203', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2097', + ), + 7330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '204', + 'prev_word_id' => '2097', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2098', + ), + 7331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2164', + 'placement' => '205', + 'prev_word_id' => '2098', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2165', + 'placement' => '206', + 'prev_word_id' => '1133', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2164', + ), + 7333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2166', + 'placement' => '207', + 'prev_word_id' => '2164', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2165', + ), + 7334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2167', + 'placement' => '208', + 'prev_word_id' => '2165', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2166', + ), + 7335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2168', + 'placement' => '209', + 'prev_word_id' => '2166', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2167', + ), + 7336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2169', + 'placement' => '210', + 'prev_word_id' => '2167', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2168', + ), + 7337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2170', + 'placement' => '211', + 'prev_word_id' => '2168', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2169', + ), + 7338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '212', + 'prev_word_id' => '2169', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2170', + ), + 7339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '213', + 'prev_word_id' => '2170', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2172', + 'placement' => '214', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '215', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2172', + ), + 7342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2173', + 'placement' => '216', + 'prev_word_id' => '2172', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '833', + ), + 7343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2168', + 'placement' => '217', + 'prev_word_id' => '833', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2173', + ), + 7344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2169', + 'placement' => '218', + 'prev_word_id' => '2173', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2168', + ), + 7345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2172', + 'placement' => '219', + 'prev_word_id' => '2168', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2169', + ), + 7346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '220', + 'prev_word_id' => '2169', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2172', + ), + 7347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '221', + 'prev_word_id' => '2172', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '222', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1749', + ), + 7349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2161', + 'placement' => '223', + 'prev_word_id' => '1749', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '813', + ), + 7350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '224', + 'prev_word_id' => '813', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2161', + ), + 7351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2172', + 'placement' => '225', + 'prev_word_id' => '2161', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '816', + ), + 7352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1082', + 'placement' => '226', + 'prev_word_id' => '816', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2172', + ), + 7353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2174', + 'placement' => '227', + 'prev_word_id' => '2172', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1082', + ), + 7354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2175', + 'placement' => '228', + 'prev_word_id' => '1082', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2174', + ), + 7355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2176', + 'placement' => '229', + 'prev_word_id' => '2174', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2175', + ), + 7356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '230', + 'prev_word_id' => '2175', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2176', + ), + 7357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2177', + 'placement' => '231', + 'prev_word_id' => '2176', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1259', + ), + 7358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '232', + 'prev_word_id' => '1259', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2177', + ), + 7359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1362', + 'placement' => '233', + 'prev_word_id' => '2177', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2168', + 'placement' => '234', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1362', + ), + 7361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2169', + 'placement' => '235', + 'prev_word_id' => '1362', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2168', + ), + 7362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2172', + 'placement' => '236', + 'prev_word_id' => '2168', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2169', + ), + 7363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '237', + 'prev_word_id' => '2169', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2172', + ), + 7364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2178', + 'placement' => '238', + 'prev_word_id' => '2172', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2179', + 'placement' => '239', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2178', + ), + 7366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '240', + 'prev_word_id' => '2178', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2179', + ), + 7367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1926', + 'placement' => '241', + 'prev_word_id' => '2179', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2137', + 'placement' => '242', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1926', + ), + 7369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2174', + 'placement' => '243', + 'prev_word_id' => '1926', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2137', + ), + 7370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2175', + 'placement' => '244', + 'prev_word_id' => '2137', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2174', + ), + 7371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '245', + 'prev_word_id' => '2174', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2175', + ), + 7372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1926', + 'placement' => '246', + 'prev_word_id' => '2175', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2137', + 'placement' => '247', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1926', + ), + 7374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1067', + 'placement' => '248', + 'prev_word_id' => '1926', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2137', + ), + 7375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2174', + 'placement' => '249', + 'prev_word_id' => '2137', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1067', + ), + 7376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2175', + 'placement' => '250', + 'prev_word_id' => '1067', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2174', + ), + 7377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '251', + 'prev_word_id' => '2174', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2175', + ), + 7378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '252', + 'prev_word_id' => '2175', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2005', + 'placement' => '253', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '910', + ), + 7380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2137', + 'placement' => '254', + 'prev_word_id' => '910', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2005', + ), + 7381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '255', + 'prev_word_id' => '2005', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2137', + ), + 7382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1926', + 'placement' => '256', + 'prev_word_id' => '2137', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '801', + ), + 7383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '257', + 'prev_word_id' => '801', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1926', + ), + 7384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '258', + 'prev_word_id' => '1926', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '917', + ), + 7385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2180', + 'placement' => '259', + 'prev_word_id' => '917', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '976', + ), + 7386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2181', + 'placement' => '260', + 'prev_word_id' => '976', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2180', + ), + 7387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2171', + 'placement' => '261', + 'prev_word_id' => '2180', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2181', + ), + 7388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '262', + 'prev_word_id' => '2181', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '2171', + ), + 7389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '263', + 'prev_word_id' => '2171', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '976', + ), + 7390 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12060', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '264', + 'prev_word_id' => '976', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7391 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '148', + 'frequency' => '0', + 'id' => '12061', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '265', + 'prev_word_id' => '1191', + 'published' => '1311154194', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7392 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '149', + 'frequency' => '0', + 'id' => '12062', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1716', + ), + 7393 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '149', + 'frequency' => '0', + 'id' => '12063', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1716', + ), + 7394 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12064', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '942', + ), + 7395 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12065', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '1', + 'prev_word_id' => '942', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '943', + ), + 7396 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12066', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '2', + 'prev_word_id' => '943', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '822', + ), + 7397 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12067', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2182', + 'placement' => '3', + 'prev_word_id' => '822', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '929', + ), + 7398 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12068', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '4', + 'prev_word_id' => '929', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2182', + ), + 7399 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12069', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '5', + 'prev_word_id' => '2182', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '822', + ), + 7400 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12070', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '6', + 'prev_word_id' => '822', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1417', + ), + 7401 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12071', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2106', + 'placement' => '7', + 'prev_word_id' => '1417', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1396', + ), + 7402 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12072', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2183', + 'placement' => '8', + 'prev_word_id' => '1396', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2106', + ), + 7403 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12073', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1371', + 'placement' => '9', + 'prev_word_id' => '2106', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2183', + ), + 7404 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12074', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2184', + 'placement' => '10', + 'prev_word_id' => '2183', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1371', + ), + 7405 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12075', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '11', + 'prev_word_id' => '1371', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2184', + ), + 7406 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12076', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '12', + 'prev_word_id' => '2184', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7407 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12077', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '13', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '856', + ), + 7408 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12078', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2185', + 'placement' => '14', + 'prev_word_id' => '856', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7409 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12079', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '15', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2185', + ), + 7410 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12080', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '16', + 'prev_word_id' => '2185', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7411 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12081', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2186', + 'placement' => '17', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1237', + ), + 7412 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12082', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '18', + 'prev_word_id' => '1237', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2186', + ), + 7413 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12083', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '19', + 'prev_word_id' => '2186', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '898', + ), + 7414 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12084', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '20', + 'prev_word_id' => '898', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7415 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12085', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '21', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7416 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12086', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '22', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '826', + ), + 7417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1057', + 'placement' => '23', + 'prev_word_id' => '826', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1056', + ), + 7418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '24', + 'prev_word_id' => '1056', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1057', + ), + 7419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '25', + 'prev_word_id' => '1057', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '26', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '942', + 'placement' => '27', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '28', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '942', + ), + 7423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2187', + 'placement' => '29', + 'prev_word_id' => '942', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '943', + ), + 7424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '30', + 'prev_word_id' => '943', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2187', + ), + 7425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '31', + 'prev_word_id' => '2187', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '948', + ), + 7426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2188', + 'placement' => '32', + 'prev_word_id' => '948', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '949', + ), + 7427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2189', + 'placement' => '33', + 'prev_word_id' => '949', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2188', + ), + 7428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '34', + 'prev_word_id' => '2188', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2189', + ), + 7429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '35', + 'prev_word_id' => '2189', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '948', + ), + 7430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1833', + 'placement' => '36', + 'prev_word_id' => '948', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '949', + ), + 7431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '37', + 'prev_word_id' => '949', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1833', + ), + 7432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2190', + 'placement' => '38', + 'prev_word_id' => '1833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '39', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2190', + ), + 7434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '40', + 'prev_word_id' => '2190', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '948', + ), + 7435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '942', + 'placement' => '41', + 'prev_word_id' => '948', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '949', + ), + 7436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '42', + 'prev_word_id' => '949', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '942', + ), + 7437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '43', + 'prev_word_id' => '942', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '943', + ), + 7438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1754', + 'placement' => '44', + 'prev_word_id' => '943', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1307', + ), + 7439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '45', + 'prev_word_id' => '1307', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1754', + ), + 7440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '46', + 'prev_word_id' => '1754', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '948', + ), + 7441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '942', + 'placement' => '47', + 'prev_word_id' => '948', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '949', + ), + 7442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '48', + 'prev_word_id' => '949', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '942', + ), + 7443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1724', + 'placement' => '49', + 'prev_word_id' => '942', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '943', + ), + 7444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2191', + 'placement' => '50', + 'prev_word_id' => '943', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1724', + ), + 7445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '51', + 'prev_word_id' => '1724', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2191', + ), + 7446 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12116', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '52', + 'prev_word_id' => '2191', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7447 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '150', + 'frequency' => '0', + 'id' => '12117', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '53', + 'prev_word_id' => '1191', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1191', + ), + 7448 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12118', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7449 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12119', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '1', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7450 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12120', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '2', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7451 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12121', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '3', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7452 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12122', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '4', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '841', + ), + 7453 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12123', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '5', + 'prev_word_id' => '841', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7454 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12124', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '6', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '831', + ), + 7455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2192', + 'placement' => '7', + 'prev_word_id' => '831', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '8', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2192', + ), + 7457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '9', + 'prev_word_id' => '2192', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '841', + ), + 7458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '10', + 'prev_word_id' => '841', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '11', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '831', + ), + 7460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2193', + 'placement' => '12', + 'prev_word_id' => '831', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '832', + ), + 7461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '13', + 'prev_word_id' => '832', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2193', + ), + 7462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '14', + 'prev_word_id' => '2193', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2194', + 'placement' => '15', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '925', + ), + 7464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2195', + 'placement' => '16', + 'prev_word_id' => '925', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2194', + ), + 7465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '17', + 'prev_word_id' => '2194', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2195', + ), + 7466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2196', + 'placement' => '18', + 'prev_word_id' => '2195', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '19', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2196', + ), + 7468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '20', + 'prev_word_id' => '2196', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2069', + 'placement' => '21', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1689', + ), + 7470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2197', + 'placement' => '22', + 'prev_word_id' => '1689', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2069', + ), + 7471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2198', + 'placement' => '23', + 'prev_word_id' => '2069', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2197', + ), + 7472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '24', + 'prev_word_id' => '2197', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2198', + ), + 7473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2199', + 'placement' => '25', + 'prev_word_id' => '2198', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2200', + 'placement' => '26', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2199', + ), + 7475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2201', + 'placement' => '27', + 'prev_word_id' => '2199', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2200', + ), + 7476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '28', + 'prev_word_id' => '2200', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2201', + ), + 7477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '29', + 'prev_word_id' => '2201', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '30', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '31', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2202', + 'placement' => '32', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '33', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2202', + ), + 7482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '34', + 'prev_word_id' => '2202', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '35', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '841', + ), + 7484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '36', + 'prev_word_id' => '841', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2203', + 'placement' => '37', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '831', + ), + 7486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '38', + 'prev_word_id' => '831', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2203', + ), + 7487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2204', + 'placement' => '39', + 'prev_word_id' => '2203', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1320', + ), + 7488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '40', + 'prev_word_id' => '1320', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2204', + ), + 7489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2205', + 'placement' => '41', + 'prev_word_id' => '2204', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '42', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2205', + ), + 7491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2206', + 'placement' => '43', + 'prev_word_id' => '2205', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '44', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2206', + ), + 7493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '45', + 'prev_word_id' => '2206', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '816', + ), + 7494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2207', + 'placement' => '46', + 'prev_word_id' => '816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '841', + ), + 7495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2208', + 'placement' => '47', + 'prev_word_id' => '841', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2207', + ), + 7496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2209', + 'placement' => '48', + 'prev_word_id' => '2207', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2208', + ), + 7497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '49', + 'prev_word_id' => '2208', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2209', + ), + 7498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '50', + 'prev_word_id' => '2209', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '865', + 'placement' => '51', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '921', + ), + 7500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '52', + 'prev_word_id' => '921', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '865', + ), + 7501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '53', + 'prev_word_id' => '865', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '54', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '55', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2210', + 'placement' => '56', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '57', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2210', + ), + 7506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '58', + 'prev_word_id' => '2210', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '828', + ), + 7507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2201', + 'placement' => '59', + 'prev_word_id' => '828', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '829', + ), + 7508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '60', + 'prev_word_id' => '829', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2201', + ), + 7509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '61', + 'prev_word_id' => '2201', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2211', + 'placement' => '62', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '925', + ), + 7511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '63', + 'prev_word_id' => '925', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2211', + ), + 7512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1941', + 'placement' => '64', + 'prev_word_id' => '2211', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 7513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '65', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1941', + ), + 7514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2212', + 'placement' => '66', + 'prev_word_id' => '1941', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '67', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2212', + ), + 7516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '68', + 'prev_word_id' => '2212', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '848', + ), + 7517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2192', + 'placement' => '69', + 'prev_word_id' => '848', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '70', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2192', + ), + 7519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '71', + 'prev_word_id' => '2192', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1258', + ), + 7520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1720', + 'placement' => '72', + 'prev_word_id' => '1258', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2213', + 'placement' => '73', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1720', + ), + 7522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2214', + 'placement' => '74', + 'prev_word_id' => '1720', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2213', + ), + 7523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '75', + 'prev_word_id' => '2213', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2214', + ), + 7524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '76', + 'prev_word_id' => '2214', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1835', + ), + 7525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1982', + 'placement' => '77', + 'prev_word_id' => '1835', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2215', + 'placement' => '78', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1982', + ), + 7527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2216', + 'placement' => '79', + 'prev_word_id' => '1982', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2215', + ), + 7528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '80', + 'prev_word_id' => '2215', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2216', + ), + 7529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2212', + 'placement' => '81', + 'prev_word_id' => '2216', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 7530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2217', + 'placement' => '82', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2212', + ), + 7531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1720', + 'placement' => '83', + 'prev_word_id' => '2212', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2217', + ), + 7532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2218', + 'placement' => '84', + 'prev_word_id' => '2217', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1720', + ), + 7533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2214', + 'placement' => '85', + 'prev_word_id' => '1720', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2218', + ), + 7534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2198', + 'placement' => '86', + 'prev_word_id' => '2218', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2214', + ), + 7535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2219', + 'placement' => '87', + 'prev_word_id' => '2214', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2198', + ), + 7536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2220', + 'placement' => '88', + 'prev_word_id' => '2198', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2219', + ), + 7537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '89', + 'prev_word_id' => '2219', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2220', + ), + 7538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '90', + 'prev_word_id' => '2220', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '91', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '92', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '93', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '94', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1290', + ), + 7543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '95', + 'prev_word_id' => '1290', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2221', + 'placement' => '96', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2222', + 'placement' => '97', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2221', + ), + 7546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '98', + 'prev_word_id' => '2221', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2222', + ), + 7547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '99', + 'prev_word_id' => '2222', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '828', + ), + 7548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2223', + 'placement' => '100', + 'prev_word_id' => '828', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2203', + 'placement' => '101', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2223', + ), + 7550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2224', + 'placement' => '102', + 'prev_word_id' => '2223', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2203', + ), + 7551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '103', + 'prev_word_id' => '2203', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2224', + ), + 7552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '104', + 'prev_word_id' => '2224', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2225', + 'placement' => '105', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '106', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2225', + ), + 7555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '107', + 'prev_word_id' => '2225', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '108', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '109', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2226', + 'placement' => '110', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '111', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2226', + ), + 7560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '112', + 'prev_word_id' => '2226', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2227', + 'placement' => '113', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2228', + 'placement' => '114', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2227', + ), + 7563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '115', + 'prev_word_id' => '2227', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2228', + ), + 7564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2223', + 'placement' => '116', + 'prev_word_id' => '2228', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2229', + 'placement' => '117', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2223', + ), + 7566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '118', + 'prev_word_id' => '2223', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2229', + ), + 7567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '119', + 'prev_word_id' => '2229', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 7568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '120', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2230', + 'placement' => '121', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1548', + ), + 7570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2212', + 'placement' => '122', + 'prev_word_id' => '1548', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2230', + ), + 7571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '123', + 'prev_word_id' => '2230', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2212', + ), + 7572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2231', + 'placement' => '124', + 'prev_word_id' => '2212', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2232', + 'placement' => '125', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2231', + ), + 7574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '126', + 'prev_word_id' => '2231', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2232', + ), + 7575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2233', + 'placement' => '127', + 'prev_word_id' => '2232', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2234', + 'placement' => '128', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2233', + ), + 7577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2235', + 'placement' => '129', + 'prev_word_id' => '2233', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2234', + ), + 7578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1824', + 'placement' => '130', + 'prev_word_id' => '2234', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2235', + ), + 7579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2236', + 'placement' => '131', + 'prev_word_id' => '2235', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1824', + ), + 7580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '132', + 'prev_word_id' => '1824', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2236', + ), + 7581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '133', + 'prev_word_id' => '2236', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '816', + ), + 7582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2237', + 'placement' => '134', + 'prev_word_id' => '816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 7583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1641', + 'placement' => '135', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2237', + ), + 7584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '919', + 'placement' => '136', + 'prev_word_id' => '2237', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1641', + ), + 7585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '137', + 'prev_word_id' => '1641', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '919', + ), + 7586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '861', + 'placement' => '138', + 'prev_word_id' => '919', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '914', + 'placement' => '139', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '861', + ), + 7588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '140', + 'prev_word_id' => '861', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '914', + ), + 7589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '141', + 'prev_word_id' => '914', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '142', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2238', + 'placement' => '143', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '925', + ), + 7592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2239', + 'placement' => '144', + 'prev_word_id' => '925', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2238', + ), + 7593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1022', + 'placement' => '145', + 'prev_word_id' => '2238', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2239', + ), + 7594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2240', + 'placement' => '146', + 'prev_word_id' => '2239', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1022', + ), + 7595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1424', + 'placement' => '147', + 'prev_word_id' => '1022', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2240', + ), + 7596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2072', + 'placement' => '148', + 'prev_word_id' => '2240', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1424', + ), + 7597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2241', + 'placement' => '149', + 'prev_word_id' => '1424', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2072', + ), + 7598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '150', + 'prev_word_id' => '2072', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2241', + ), + 7599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '151', + 'prev_word_id' => '2241', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1443', + ), + 7600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '152', + 'prev_word_id' => '1443', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '153', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 7602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '154', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1530', + ), + 7603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1504', + 'placement' => '155', + 'prev_word_id' => '1530', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '809', + ), + 7604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2242', + 'placement' => '156', + 'prev_word_id' => '809', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1504', + ), + 7605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2236', + 'placement' => '157', + 'prev_word_id' => '1504', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2242', + ), + 7606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '158', + 'prev_word_id' => '2242', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2236', + ), + 7607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2197', + 'placement' => '159', + 'prev_word_id' => '2236', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '809', + ), + 7608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '160', + 'prev_word_id' => '809', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2197', + ), + 7609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2243', + 'placement' => '161', + 'prev_word_id' => '2197', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '162', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2243', + ), + 7611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2244', + 'placement' => '163', + 'prev_word_id' => '2243', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '164', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2244', + ), + 7613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2245', + 'placement' => '165', + 'prev_word_id' => '2244', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '166', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2245', + ), + 7615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2246', + 'placement' => '167', + 'prev_word_id' => '2245', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '168', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2246', + ), + 7617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '169', + 'prev_word_id' => '2246', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '170', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '925', + ), + 7619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '171', + 'prev_word_id' => '925', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2247', + 'placement' => '172', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2192', + 'placement' => '173', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2247', + ), + 7622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2203', + 'placement' => '174', + 'prev_word_id' => '2247', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2192', + ), + 7623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2193', + 'placement' => '175', + 'prev_word_id' => '2192', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2203', + ), + 7624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '176', + 'prev_word_id' => '2203', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2193', + ), + 7625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '177', + 'prev_word_id' => '2193', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '961', + 'placement' => '178', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '179', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '961', + ), + 7628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '180', + 'prev_word_id' => '961', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1126', + 'placement' => '181', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '945', + ), + 7630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '182', + 'prev_word_id' => '945', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1126', + ), + 7631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1126', + 'placement' => '183', + 'prev_word_id' => '1126', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 7632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2248', + 'placement' => '184', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1126', + ), + 7633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '185', + 'prev_word_id' => '1126', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2248', + ), + 7634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2221', + 'placement' => '186', + 'prev_word_id' => '2248', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1802', + 'placement' => '187', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2221', + ), + 7636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2249', + 'placement' => '188', + 'prev_word_id' => '2221', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1802', + ), + 7637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2250', + 'placement' => '189', + 'prev_word_id' => '1802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2249', + ), + 7638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '190', + 'prev_word_id' => '2249', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2250', + ), + 7639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1861', + 'placement' => '191', + 'prev_word_id' => '2250', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '842', + 'placement' => '192', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1861', + ), + 7641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '193', + 'prev_word_id' => '1861', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '842', + ), + 7642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1934', + 'placement' => '194', + 'prev_word_id' => '842', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1907', + 'placement' => '195', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1934', + ), + 7644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '196', + 'prev_word_id' => '1934', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1907', + ), + 7645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2251', + 'placement' => '197', + 'prev_word_id' => '1907', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '841', + ), + 7646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '198', + 'prev_word_id' => '841', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2251', + ), + 7647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1640', + 'placement' => '199', + 'prev_word_id' => '2251', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2252', + 'placement' => '200', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1640', + ), + 7649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '201', + 'prev_word_id' => '1640', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2252', + ), + 7650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '202', + 'prev_word_id' => '2252', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '848', + ), + 7651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2253', + 'placement' => '203', + 'prev_word_id' => '848', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '898', + ), + 7652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '204', + 'prev_word_id' => '898', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2253', + ), + 7653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '205', + 'prev_word_id' => '2253', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2254', + 'placement' => '206', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '207', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2254', + ), + 7656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '208', + 'prev_word_id' => '2254', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '809', + ), + 7657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1786', + 'placement' => '209', + 'prev_word_id' => '809', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2255', + 'placement' => '210', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1786', + ), + 7659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2256', + 'placement' => '211', + 'prev_word_id' => '1786', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2255', + ), + 7660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '212', + 'prev_word_id' => '2255', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2256', + ), + 7661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '213', + 'prev_word_id' => '2256', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '921', + ), + 7662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2069', + 'placement' => '214', + 'prev_word_id' => '921', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1414', + ), + 7663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2257', + 'placement' => '215', + 'prev_word_id' => '1414', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2069', + ), + 7664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '216', + 'prev_word_id' => '2069', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2257', + ), + 7665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '217', + 'prev_word_id' => '2257', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2048', + 'placement' => '218', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 7667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '219', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2048', + ), + 7668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '220', + 'prev_word_id' => '2048', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '221', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2024', + 'placement' => '222', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1689', + ), + 7671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2258', + 'placement' => '223', + 'prev_word_id' => '1689', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2024', + ), + 7672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '224', + 'prev_word_id' => '2024', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2258', + ), + 7673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1022', + 'placement' => '225', + 'prev_word_id' => '2258', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '226', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1022', + ), + 7675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2259', + 'placement' => '227', + 'prev_word_id' => '1022', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '228', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2259', + ), + 7677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2231', + 'placement' => '229', + 'prev_word_id' => '2259', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '816', + ), + 7678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '230', + 'prev_word_id' => '816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2231', + ), + 7679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1127', + 'placement' => '231', + 'prev_word_id' => '2231', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '232', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1127', + ), + 7681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2260', + 'placement' => '233', + 'prev_word_id' => '1127', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2261', + 'placement' => '234', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2260', + ), + 7683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2262', + 'placement' => '235', + 'prev_word_id' => '2260', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2261', + ), + 7684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '236', + 'prev_word_id' => '2261', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2262', + ), + 7685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '237', + 'prev_word_id' => '2262', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2262', + 'placement' => '238', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1042', + ), + 7687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2263', + 'placement' => '239', + 'prev_word_id' => '1042', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2262', + ), + 7688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '240', + 'prev_word_id' => '2262', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2263', + ), + 7689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '241', + 'prev_word_id' => '2263', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '893', + ), + 7690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '242', + 'prev_word_id' => '893', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 7691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '862', + 'placement' => '243', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1319', + ), + 7692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '244', + 'prev_word_id' => '1319', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '862', + ), + 7693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1795', + 'placement' => '245', + 'prev_word_id' => '862', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '945', + ), + 7694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '246', + 'prev_word_id' => '945', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1795', + ), + 7695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '247', + 'prev_word_id' => '1795', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '248', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1348', + 'placement' => '249', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '250', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1348', + ), + 7699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '251', + 'prev_word_id' => '1348', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '816', + ), + 7700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2205', + 'placement' => '252', + 'prev_word_id' => '816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 7701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '253', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2205', + ), + 7702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2206', + 'placement' => '254', + 'prev_word_id' => '2205', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '255', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2206', + ), + 7704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '256', + 'prev_word_id' => '2206', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2264', + 'placement' => '257', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2265', + 'placement' => '258', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2264', + ), + 7707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2205', + 'placement' => '259', + 'prev_word_id' => '2264', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2265', + ), + 7708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2266', + 'placement' => '260', + 'prev_word_id' => '2265', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2205', + ), + 7709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '261', + 'prev_word_id' => '2205', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2266', + ), + 7710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2004', + 'placement' => '262', + 'prev_word_id' => '2266', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2231', + 'placement' => '263', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2004', + ), + 7712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '264', + 'prev_word_id' => '2004', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2231', + ), + 7713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2267', + 'placement' => '265', + 'prev_word_id' => '2231', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '266', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2267', + ), + 7715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '267', + 'prev_word_id' => '2267', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1368', + ), + 7716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2268', + 'placement' => '268', + 'prev_word_id' => '1368', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '269', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2268', + ), + 7718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2269', + 'placement' => '270', + 'prev_word_id' => '2268', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2270', + 'placement' => '271', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2269', + ), + 7720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '272', + 'prev_word_id' => '2269', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2270', + ), + 7721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '273', + 'prev_word_id' => '2270', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1368', + ), + 7722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '274', + 'prev_word_id' => '1368', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '275', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '276', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1084', + ), + 7725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2271', + 'placement' => '277', + 'prev_word_id' => '1084', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '815', + ), + 7726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2124', + 'placement' => '278', + 'prev_word_id' => '815', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2271', + ), + 7727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '279', + 'prev_word_id' => '2271', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2124', + ), + 7728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2130', + 'placement' => '280', + 'prev_word_id' => '2124', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '281', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2130', + ), + 7730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '282', + 'prev_word_id' => '2130', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '943', + ), + 7731 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '283', + 'prev_word_id' => '943', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '910', + ), + 7732 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '284', + 'prev_word_id' => '910', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 7733 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '285', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7734 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '286', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1317', + ), + 7735 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1590', + 'placement' => '287', + 'prev_word_id' => '1317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 7736 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2272', + 'placement' => '288', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1590', + ), + 7737 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '289', + 'prev_word_id' => '1590', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2272', + ), + 7738 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '290', + 'prev_word_id' => '2272', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7739 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '291', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1688', + ), + 7740 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2225', + 'placement' => '292', + 'prev_word_id' => '1688', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7741 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '293', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2225', + ), + 7742 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2273', + 'placement' => '294', + 'prev_word_id' => '2225', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1808', + ), + 7743 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '295', + 'prev_word_id' => '1808', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2273', + ), + 7744 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2215', + 'placement' => '296', + 'prev_word_id' => '2273', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7745 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2274', + 'placement' => '297', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2215', + ), + 7746 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '298', + 'prev_word_id' => '2215', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2274', + ), + 7747 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '299', + 'prev_word_id' => '2274', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '948', + ), + 7748 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '300', + 'prev_word_id' => '948', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '949', + ), + 7749 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '301', + 'prev_word_id' => '949', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '948', + ), + 7750 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2275', + 'placement' => '302', + 'prev_word_id' => '948', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '949', + ), + 7751 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '303', + 'prev_word_id' => '949', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2275', + ), + 7752 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '304', + 'prev_word_id' => '2275', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7753 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12423', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '305', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7754 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12424', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '306', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7755 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12425', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '307', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1791', + ), + 7756 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12426', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1732', + 'placement' => '308', + 'prev_word_id' => '1791', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7757 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12427', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2276', + 'placement' => '309', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1732', + ), + 7758 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12428', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '310', + 'prev_word_id' => '1732', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2276', + ), + 7759 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12429', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '311', + 'prev_word_id' => '2276', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1549', + ), + 7760 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '312', + 'prev_word_id' => '1549', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7761 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2277', + 'placement' => '313', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1646', + ), + 7762 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '314', + 'prev_word_id' => '1646', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2277', + ), + 7763 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '315', + 'prev_word_id' => '2277', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '316', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1665', + ), + 7765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '317', + 'prev_word_id' => '1665', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '318', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1513', + ), + 7767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2278', + 'placement' => '319', + 'prev_word_id' => '1513', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '320', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2278', + ), + 7769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '321', + 'prev_word_id' => '2278', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2279', + 'placement' => '322', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '323', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2279', + ), + 7772 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2280', + 'placement' => '324', + 'prev_word_id' => '2279', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7773 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '325', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2280', + ), + 7774 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2281', + 'placement' => '326', + 'prev_word_id' => '2280', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7775 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2282', + 'placement' => '327', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2281', + ), + 7776 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '328', + 'prev_word_id' => '2281', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2282', + ), + 7777 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '329', + 'prev_word_id' => '2282', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7778 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '330', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1317', + ), + 7779 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '331', + 'prev_word_id' => '1317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1790', + ), + 7780 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '332', + 'prev_word_id' => '1790', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1359', + ), + 7781 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1940', + 'placement' => '333', + 'prev_word_id' => '1359', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1317', + ), + 7782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '334', + 'prev_word_id' => '1317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1940', + ), + 7783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '335', + 'prev_word_id' => '1940', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '336', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2283', + 'placement' => '337', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '809', + ), + 7786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '338', + 'prev_word_id' => '809', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2283', + ), + 7787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2284', + 'placement' => '339', + 'prev_word_id' => '2283', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1908', + 'placement' => '340', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2284', + ), + 7789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2285', + 'placement' => '341', + 'prev_word_id' => '2284', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1908', + ), + 7790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2286', + 'placement' => '342', + 'prev_word_id' => '1908', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2285', + ), + 7791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2287', + 'placement' => '343', + 'prev_word_id' => '2285', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2286', + ), + 7792 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '344', + 'prev_word_id' => '2286', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2287', + ), + 7793 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '345', + 'prev_word_id' => '2287', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '945', + ), + 7794 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '346', + 'prev_word_id' => '945', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7795 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1871', + 'placement' => '347', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1290', + ), + 7796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1415', + 'placement' => '348', + 'prev_word_id' => '1290', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1871', + ), + 7797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2288', + 'placement' => '349', + 'prev_word_id' => '1871', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1415', + ), + 7798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2289', + 'placement' => '350', + 'prev_word_id' => '1415', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2288', + ), + 7799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '351', + 'prev_word_id' => '2288', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2289', + ), + 7800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '352', + 'prev_word_id' => '2289', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '905', + 'placement' => '353', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1638', + ), + 7802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '354', + 'prev_word_id' => '1638', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '905', + ), + 7803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '355', + 'prev_word_id' => '905', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 7804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '356', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2290', + 'placement' => '357', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1816', + ), + 7806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '358', + 'prev_word_id' => '1816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2290', + ), + 7807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '359', + 'prev_word_id' => '2290', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '360', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '361', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 7810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '362', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1689', + ), + 7811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1727', + 'placement' => '363', + 'prev_word_id' => '1689', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1327', + 'placement' => '364', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1727', + ), + 7813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '365', + 'prev_word_id' => '1727', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1327', + ), + 7814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '900', + 'placement' => '366', + 'prev_word_id' => '1327', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '831', + ), + 7815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '367', + 'prev_word_id' => '831', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '900', + ), + 7816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '368', + 'prev_word_id' => '900', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '369', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1606', + ), + 7818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '370', + 'prev_word_id' => '1606', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '371', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1861', + 'placement' => '372', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '846', + ), + 7821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '373', + 'prev_word_id' => '846', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1861', + ), + 7822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2291', + 'placement' => '374', + 'prev_word_id' => '1861', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1263', + ), + 7823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '375', + 'prev_word_id' => '1263', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2291', + ), + 7824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2285', + 'placement' => '376', + 'prev_word_id' => '2291', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2286', + 'placement' => '377', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2285', + ), + 7826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '378', + 'prev_word_id' => '2285', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2286', + ), + 7827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2287', + 'placement' => '379', + 'prev_word_id' => '2286', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '380', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2287', + ), + 7829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2292', + 'placement' => '381', + 'prev_word_id' => '2287', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2293', + 'placement' => '382', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2292', + ), + 7831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '383', + 'prev_word_id' => '2292', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2293', + ), + 7832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2294', + 'placement' => '384', + 'prev_word_id' => '2293', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '385', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2294', + ), + 7834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2295', + 'placement' => '386', + 'prev_word_id' => '2294', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '824', + 'placement' => '387', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2295', + ), + 7836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '388', + 'prev_word_id' => '2295', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '824', + ), + 7837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1732', + 'placement' => '389', + 'prev_word_id' => '824', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '390', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1732', + ), + 7839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '391', + 'prev_word_id' => '1732', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1327', + 'placement' => '392', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1277', + ), + 7841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '905', + 'placement' => '393', + 'prev_word_id' => '1277', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1327', + ), + 7842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '394', + 'prev_word_id' => '1327', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '905', + ), + 7843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '395', + 'prev_word_id' => '905', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '816', + ), + 7844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '396', + 'prev_word_id' => '816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1749', + ), + 7845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '397', + 'prev_word_id' => '1749', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1797', + 'placement' => '398', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 7847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '399', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1797', + ), + 7848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2296', + 'placement' => '400', + 'prev_word_id' => '1797', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1596', + ), + 7849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '904', + 'placement' => '401', + 'prev_word_id' => '1596', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2296', + ), + 7850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '402', + 'prev_word_id' => '2296', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '904', + ), + 7851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1937', + 'placement' => '403', + 'prev_word_id' => '904', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '404', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1937', + ), + 7853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2297', + 'placement' => '405', + 'prev_word_id' => '1937', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1263', + ), + 7854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '904', + 'placement' => '406', + 'prev_word_id' => '1263', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2297', + ), + 7855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1681', + 'placement' => '407', + 'prev_word_id' => '2297', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '904', + ), + 7856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2298', + 'placement' => '408', + 'prev_word_id' => '904', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1681', + ), + 7857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '409', + 'prev_word_id' => '1681', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2298', + ), + 7858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '410', + 'prev_word_id' => '2298', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2299', + 'placement' => '411', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '939', + ), + 7860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '412', + 'prev_word_id' => '939', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2299', + ), + 7861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2300', + 'placement' => '413', + 'prev_word_id' => '2299', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '414', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2300', + ), + 7863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '415', + 'prev_word_id' => '2300', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '416', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1751', + 'placement' => '417', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1480', + 'placement' => '418', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1751', + ), + 7867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1881', + 'placement' => '419', + 'prev_word_id' => '1751', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1480', + ), + 7868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '420', + 'prev_word_id' => '1480', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1881', + ), + 7869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2301', + 'placement' => '421', + 'prev_word_id' => '1881', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '422', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2301', + ), + 7871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2302', + 'placement' => '423', + 'prev_word_id' => '2301', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '823', + ), + 7872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '424', + 'prev_word_id' => '823', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2302', + ), + 7873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '425', + 'prev_word_id' => '2302', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1698', + ), + 7874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1959', + 'placement' => '426', + 'prev_word_id' => '1698', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '427', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1959', + ), + 7876 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '428', + 'prev_word_id' => '1959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7877 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2046', + 'placement' => '429', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1560', + ), + 7878 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '430', + 'prev_word_id' => '1560', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2046', + ), + 7879 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1497', + 'placement' => '431', + 'prev_word_id' => '2046', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7880 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2293', + 'placement' => '432', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1497', + ), + 7881 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '433', + 'prev_word_id' => '1497', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2293', + ), + 7882 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2303', + 'placement' => '434', + 'prev_word_id' => '2293', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7883 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '824', + 'placement' => '435', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2303', + ), + 7884 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '436', + 'prev_word_id' => '2303', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '824', + ), + 7885 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2304', + 'placement' => '437', + 'prev_word_id' => '824', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7886 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '438', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2304', + ), + 7887 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '439', + 'prev_word_id' => '2304', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7888 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '440', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7889 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2305', + 'placement' => '441', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7890 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '442', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2305', + ), + 7891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '443', + 'prev_word_id' => '2305', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '870', + ), + 7892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2306', + 'placement' => '444', + 'prev_word_id' => '870', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '445', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2306', + ), + 7894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1295', + 'placement' => '446', + 'prev_word_id' => '2306', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2307', + 'placement' => '447', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1295', + ), + 7896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '448', + 'prev_word_id' => '1295', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2307', + ), + 7897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2308', + 'placement' => '449', + 'prev_word_id' => '2307', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '450', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2308', + ), + 7899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '451', + 'prev_word_id' => '2308', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1651', + ), + 7900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2065', + 'placement' => '452', + 'prev_word_id' => '1651', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '453', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2065', + ), + 7902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2073', + 'placement' => '454', + 'prev_word_id' => '2065', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '455', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2073', + ), + 7904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1766', + 'placement' => '456', + 'prev_word_id' => '2073', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '457', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1766', + ), + 7906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2309', + 'placement' => '458', + 'prev_word_id' => '1766', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '836', + ), + 7907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1351', + 'placement' => '459', + 'prev_word_id' => '836', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2309', + ), + 7908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '460', + 'prev_word_id' => '2309', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1351', + ), + 7909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2310', + 'placement' => '461', + 'prev_word_id' => '1351', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 7910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1670', + 'placement' => '462', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2310', + ), + 7911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '463', + 'prev_word_id' => '2310', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1670', + ), + 7912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '464', + 'prev_word_id' => '1670', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 7913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2311', + 'placement' => '465', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '844', + ), + 7914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1896', + 'placement' => '466', + 'prev_word_id' => '844', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2311', + ), + 7915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '467', + 'prev_word_id' => '2311', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1896', + ), + 7916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '468', + 'prev_word_id' => '1896', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '469', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 7918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '470', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '471', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 7920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1303', + 'placement' => '472', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '841', + ), + 7921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2312', + 'placement' => '473', + 'prev_word_id' => '841', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1303', + ), + 7922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2313', + 'placement' => '474', + 'prev_word_id' => '1303', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2312', + ), + 7923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2314', + 'placement' => '475', + 'prev_word_id' => '2312', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2313', + ), + 7924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '476', + 'prev_word_id' => '2313', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2314', + ), + 7925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '477', + 'prev_word_id' => '2314', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '478', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '959', + ), + 7927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '479', + 'prev_word_id' => '959', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1317', + ), + 7928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2315', + 'placement' => '480', + 'prev_word_id' => '1317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1318', + ), + 7929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2316', + 'placement' => '481', + 'prev_word_id' => '1318', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2315', + ), + 7930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '482', + 'prev_word_id' => '2315', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2316', + ), + 7931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '483', + 'prev_word_id' => '2316', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 7932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '484', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 7933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1802', + 'placement' => '485', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1791', + ), + 7934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '486', + 'prev_word_id' => '1791', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1802', + ), + 7935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '487', + 'prev_word_id' => '1802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '941', + ), + 7936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1755', + 'placement' => '488', + 'prev_word_id' => '941', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1736', + 'placement' => '489', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1755', + ), + 7938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '490', + 'prev_word_id' => '1755', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1736', + ), + 7939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2317', + 'placement' => '491', + 'prev_word_id' => '1736', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '492', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2317', + ), + 7941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2318', + 'placement' => '493', + 'prev_word_id' => '2317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '494', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2318', + ), + 7943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1509', + 'placement' => '495', + 'prev_word_id' => '2318', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '496', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1509', + ), + 7945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2319', + 'placement' => '497', + 'prev_word_id' => '1509', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 7946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '498', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2319', + ), + 7947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '499', + 'prev_word_id' => '2319', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '500', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 7949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2005', + 'placement' => '501', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 7950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '502', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2005', + ), + 7951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '503', + 'prev_word_id' => '2005', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '504', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '832', + ), + 7953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2320', + 'placement' => '505', + 'prev_word_id' => '832', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '506', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2320', + ), + 7955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '507', + 'prev_word_id' => '2320', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '975', + 'placement' => '508', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1723', + 'placement' => '509', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '975', + ), + 7958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2321', + 'placement' => '510', + 'prev_word_id' => '975', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1723', + ), + 7959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2322', + 'placement' => '511', + 'prev_word_id' => '1723', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2321', + ), + 7960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '512', + 'prev_word_id' => '2321', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2322', + ), + 7961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '513', + 'prev_word_id' => '2322', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1359', + ), + 7962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '514', + 'prev_word_id' => '1359', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1342', + ), + 7963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2222', + 'placement' => '515', + 'prev_word_id' => '1342', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '844', + ), + 7964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '516', + 'prev_word_id' => '844', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2222', + ), + 7965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '517', + 'prev_word_id' => '2222', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '518', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1713', + ), + 7967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '519', + 'prev_word_id' => '1713', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 7968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1806', + 'placement' => '520', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '954', + ), + 7969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2270', + 'placement' => '521', + 'prev_word_id' => '954', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1806', + ), + 7970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1727', + 'placement' => '522', + 'prev_word_id' => '1806', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2270', + ), + 7971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1802', + 'placement' => '523', + 'prev_word_id' => '2270', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1727', + ), + 7972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '524', + 'prev_word_id' => '1727', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1802', + ), + 7973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '525', + 'prev_word_id' => '1802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2323', + 'placement' => '526', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1728', + ), + 7975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2324', + 'placement' => '527', + 'prev_word_id' => '1728', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2323', + ), + 7976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '528', + 'prev_word_id' => '2323', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2324', + ), + 7977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '529', + 'prev_word_id' => '2324', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2191', + 'placement' => '530', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '848', + ), + 7979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '531', + 'prev_word_id' => '848', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2191', + ), + 7980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '532', + 'prev_word_id' => '2191', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1404', + ), + 7981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '533', + 'prev_word_id' => '1404', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 7982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1212', + 'placement' => '534', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 7983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '535', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1212', + ), + 7984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '536', + 'prev_word_id' => '1212', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 7985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '537', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 7986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '538', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 7987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2320', + 'placement' => '539', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 7988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '540', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2320', + ), + 7989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '541', + 'prev_word_id' => '2320', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 7990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2325', + 'placement' => '542', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1609', + ), + 7991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '543', + 'prev_word_id' => '1609', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2325', + ), + 7992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2326', + 'placement' => '544', + 'prev_word_id' => '2325', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '823', + ), + 7993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2206', + 'placement' => '545', + 'prev_word_id' => '823', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2326', + ), + 7994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1373', + 'placement' => '546', + 'prev_word_id' => '2326', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2206', + ), + 7995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2327', + 'placement' => '547', + 'prev_word_id' => '2206', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1373', + ), + 7996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '548', + 'prev_word_id' => '1373', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2327', + ), + 7997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '549', + 'prev_word_id' => '2327', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 7998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '550', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 7999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '551', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '968', + ), + 8000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '552', + 'prev_word_id' => '968', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '553', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '832', + ), + 8002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2328', + 'placement' => '554', + 'prev_word_id' => '832', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '555', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2328', + ), + 8004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2329', + 'placement' => '556', + 'prev_word_id' => '2328', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '557', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2329', + ), + 8006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '558', + 'prev_word_id' => '2329', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1317', + ), + 8007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '559', + 'prev_word_id' => '1317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1318', + ), + 8008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '560', + 'prev_word_id' => '1318', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1319', + ), + 8009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2330', + 'placement' => '561', + 'prev_word_id' => '1319', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '562', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2330', + ), + 8011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '563', + 'prev_word_id' => '2330', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '564', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 8013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '565', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '870', + ), + 8014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2331', + 'placement' => '566', + 'prev_word_id' => '870', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 8015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2156', + 'placement' => '567', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2331', + ), + 8016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2332', + 'placement' => '568', + 'prev_word_id' => '2331', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2156', + ), + 8017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2333', + 'placement' => '569', + 'prev_word_id' => '2156', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2332', + ), + 8018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2334', + 'placement' => '570', + 'prev_word_id' => '2332', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2333', + ), + 8019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '571', + 'prev_word_id' => '2333', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2334', + ), + 8020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1849', + 'placement' => '572', + 'prev_word_id' => '2334', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 8021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2335', + 'placement' => '573', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1849', + ), + 8022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '574', + 'prev_word_id' => '1849', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2335', + ), + 8023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '575', + 'prev_word_id' => '2335', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1283', + 'placement' => '576', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 8025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '577', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1283', + ), + 8026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '578', + 'prev_word_id' => '1283', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '816', + ), + 8027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '579', + 'prev_word_id' => '816', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '895', + ), + 8028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '580', + 'prev_word_id' => '895', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '881', + ), + 8029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '581', + 'prev_word_id' => '881', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2336', + 'placement' => '582', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '895', + ), + 8031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '583', + 'prev_word_id' => '895', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2336', + ), + 8032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '584', + 'prev_word_id' => '2336', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 8033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1935', + 'placement' => '585', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1733', + ), + 8034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '586', + 'prev_word_id' => '1733', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1935', + ), + 8035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '587', + 'prev_word_id' => '1935', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 8036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '588', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '589', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '829', + ), + 8038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2270', + 'placement' => '590', + 'prev_word_id' => '829', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2337', + 'placement' => '591', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2270', + ), + 8040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '592', + 'prev_word_id' => '2270', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2337', + ), + 8041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2205', + 'placement' => '593', + 'prev_word_id' => '2337', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1410', + ), + 8042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '594', + 'prev_word_id' => '1410', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2205', + ), + 8043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '595', + 'prev_word_id' => '2205', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 8044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '596', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '831', + ), + 8045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '597', + 'prev_word_id' => '831', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1320', + ), + 8046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '598', + 'prev_word_id' => '1320', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '599', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '832', + ), + 8048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2338', + 'placement' => '600', + 'prev_word_id' => '832', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '882', + ), + 8049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '601', + 'prev_word_id' => '882', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2338', + ), + 8050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '602', + 'prev_word_id' => '2338', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2339', + 'placement' => '603', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2340', + 'placement' => '604', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2339', + ), + 8053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '605', + 'prev_word_id' => '2339', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2340', + ), + 8054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2315', + 'placement' => '606', + 'prev_word_id' => '2340', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '607', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2315', + ), + 8056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '608', + 'prev_word_id' => '2315', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1359', + ), + 8057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1666', + 'placement' => '609', + 'prev_word_id' => '1359', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '843', + ), + 8058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '610', + 'prev_word_id' => '843', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1666', + ), + 8059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1627', + 'placement' => '611', + 'prev_word_id' => '1666', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '612', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1627', + ), + 8061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '613', + 'prev_word_id' => '1627', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '830', + ), + 8062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '614', + 'prev_word_id' => '830', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '848', + ), + 8063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2254', + 'placement' => '615', + 'prev_word_id' => '848', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1596', + ), + 8064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2341', + 'placement' => '616', + 'prev_word_id' => '1596', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2254', + ), + 8065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '617', + 'prev_word_id' => '2254', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2341', + ), + 8066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '618', + 'prev_word_id' => '2341', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 8067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '619', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1513', + ), + 8068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '620', + 'prev_word_id' => '1513', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1665', + ), + 8069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '621', + 'prev_word_id' => '1665', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1603', + ), + 8070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2342', + 'placement' => '622', + 'prev_word_id' => '1603', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1808', + ), + 8071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '623', + 'prev_word_id' => '1808', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2342', + ), + 8072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '624', + 'prev_word_id' => '2342', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '625', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '807', + ), + 8074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '626', + 'prev_word_id' => '807', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '823', + ), + 8075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '627', + 'prev_word_id' => '823', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '881', + ), + 8076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '628', + 'prev_word_id' => '881', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1490', + 'placement' => '629', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1733', + ), + 8078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1626', + 'placement' => '630', + 'prev_word_id' => '1733', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1490', + ), + 8079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '631', + 'prev_word_id' => '1490', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1626', + ), + 8080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2343', + 'placement' => '632', + 'prev_word_id' => '1626', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1665', + ), + 8081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '633', + 'prev_word_id' => '1665', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2343', + ), + 8082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1645', + 'placement' => '634', + 'prev_word_id' => '2343', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '635', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1645', + ), + 8084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1806', + 'placement' => '636', + 'prev_word_id' => '1645', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '954', + ), + 8085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '637', + 'prev_word_id' => '954', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1806', + ), + 8086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1935', + 'placement' => '638', + 'prev_word_id' => '1806', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2344', + 'placement' => '639', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1935', + ), + 8088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '640', + 'prev_word_id' => '1935', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2344', + ), + 8089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1236', + 'placement' => '641', + 'prev_word_id' => '2344', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2345', + 'placement' => '642', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1236', + ), + 8091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '643', + 'prev_word_id' => '1236', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2345', + ), + 8092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2346', + 'placement' => '644', + 'prev_word_id' => '2345', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2347', + 'placement' => '645', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2346', + ), + 8094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2348', + 'placement' => '646', + 'prev_word_id' => '2346', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2347', + ), + 8095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '647', + 'prev_word_id' => '2347', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2348', + ), + 8096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '648', + 'prev_word_id' => '2348', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '649', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 8098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '650', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '803', + ), + 8099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '651', + 'prev_word_id' => '803', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '828', + ), + 8100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2349', + 'placement' => '652', + 'prev_word_id' => '828', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 8101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '653', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2349', + ), + 8102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2350', + 'placement' => '654', + 'prev_word_id' => '2349', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 8103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '655', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2350', + ), + 8104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2351', + 'placement' => '656', + 'prev_word_id' => '2350', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '828', + ), + 8105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2077', + 'placement' => '657', + 'prev_word_id' => '828', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2351', + ), + 8106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2352', + 'placement' => '658', + 'prev_word_id' => '2351', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2077', + ), + 8107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '659', + 'prev_word_id' => '2077', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2352', + ), + 8108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2353', + 'placement' => '660', + 'prev_word_id' => '2352', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '828', + ), + 8109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '661', + 'prev_word_id' => '828', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2353', + ), + 8110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1055', + 'placement' => '662', + 'prev_word_id' => '2353', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1280', + ), + 8111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2354', + 'placement' => '663', + 'prev_word_id' => '1280', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1055', + ), + 8112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2355', + 'placement' => '664', + 'prev_word_id' => '1055', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2354', + ), + 8113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '942', + 'placement' => '665', + 'prev_word_id' => '2354', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2355', + ), + 8114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2356', + 'placement' => '666', + 'prev_word_id' => '2355', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '942', + ), + 8115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '667', + 'prev_word_id' => '942', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2356', + ), + 8116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '668', + 'prev_word_id' => '2356', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1605', + ), + 8117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2341', + 'placement' => '669', + 'prev_word_id' => '1605', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 8118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '670', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2341', + ), + 8119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '671', + 'prev_word_id' => '2341', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '672', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1733', + ), + 8121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2357', + 'placement' => '673', + 'prev_word_id' => '1733', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '943', + ), + 8122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '674', + 'prev_word_id' => '943', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2357', + ), + 8123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '675', + 'prev_word_id' => '2357', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1513', + ), + 8124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2358', + 'placement' => '676', + 'prev_word_id' => '1513', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '677', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2358', + ), + 8126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '678', + 'prev_word_id' => '2358', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '679', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 8128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '680', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 8129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '681', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1320', + ), + 8130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '682', + 'prev_word_id' => '1320', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '809', + ), + 8131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '683', + 'prev_word_id' => '809', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1443', + ), + 8132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '684', + 'prev_word_id' => '1443', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '922', + 'placement' => '685', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '686', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '922', + ), + 8135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '687', + 'prev_word_id' => '922', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '831', + ), + 8136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '688', + 'prev_word_id' => '831', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '925', + ), + 8137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1950', + 'placement' => '689', + 'prev_word_id' => '925', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 8138 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12808', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '690', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1950', + ), + 8139 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12809', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '691', + 'prev_word_id' => '1950', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1366', + ), + 8140 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12810', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1720', + 'placement' => '692', + 'prev_word_id' => '1366', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '886', + ), + 8141 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12811', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2359', + 'placement' => '693', + 'prev_word_id' => '886', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1720', + ), + 8142 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12812', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '694', + 'prev_word_id' => '1720', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2359', + ), + 8143 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12813', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1298', + 'placement' => '695', + 'prev_word_id' => '2359', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '938', + ), + 8144 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12814', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '696', + 'prev_word_id' => '938', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1298', + ), + 8145 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12815', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2360', + 'placement' => '697', + 'prev_word_id' => '1298', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8146 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12816', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '698', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2360', + ), + 8147 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12817', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '699', + 'prev_word_id' => '2360', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8148 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12818', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '700', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1502', + ), + 8149 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12819', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2361', + 'placement' => '701', + 'prev_word_id' => '1502', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8150 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12820', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '702', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2361', + ), + 8151 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12821', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2274', + 'placement' => '703', + 'prev_word_id' => '2361', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '834', + ), + 8152 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12822', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2223', + 'placement' => '704', + 'prev_word_id' => '834', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2274', + ), + 8153 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2229', + 'placement' => '705', + 'prev_word_id' => '2274', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2223', + ), + 8154 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '706', + 'prev_word_id' => '2223', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2229', + ), + 8155 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '707', + 'prev_word_id' => '2229', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 8156 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '708', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 8157 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '709', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '925', + ), + 8158 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '710', + 'prev_word_id' => '925', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 8159 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '711', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1310', + ), + 8160 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '712', + 'prev_word_id' => '1310', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8161 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2362', + 'placement' => '713', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8162 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2313', + 'placement' => '714', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2362', + ), + 8163 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2363', + 'placement' => '715', + 'prev_word_id' => '2362', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2313', + ), + 8164 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '716', + 'prev_word_id' => '2313', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2363', + ), + 8165 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '717', + 'prev_word_id' => '2363', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1447', + ), + 8166 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '718', + 'prev_word_id' => '1447', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '893', + ), + 8167 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '719', + 'prev_word_id' => '893', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '894', + ), + 8168 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2364', + 'placement' => '720', + 'prev_word_id' => '894', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1317', + ), + 8169 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2231', + 'placement' => '721', + 'prev_word_id' => '1317', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2364', + ), + 8170 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2365', + 'placement' => '722', + 'prev_word_id' => '2364', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2231', + ), + 8171 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '723', + 'prev_word_id' => '2231', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2365', + ), + 8172 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2364', + 'placement' => '724', + 'prev_word_id' => '2365', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '848', + ), + 8173 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2210', + 'placement' => '725', + 'prev_word_id' => '848', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2364', + ), + 8174 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '726', + 'prev_word_id' => '2364', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2210', + ), + 8175 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1877', + 'placement' => '727', + 'prev_word_id' => '2210', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 8176 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '728', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1877', + ), + 8177 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '729', + 'prev_word_id' => '1877', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1437', + ), + 8178 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '839', + 'placement' => '730', + 'prev_word_id' => '1437', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '886', + ), + 8179 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '731', + 'prev_word_id' => '886', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '839', + ), + 8180 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2366', + 'placement' => '732', + 'prev_word_id' => '839', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8181 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '733', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2366', + ), + 8182 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '867', + 'placement' => '734', + 'prev_word_id' => '2366', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8183 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '735', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '867', + ), + 8184 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '736', + 'prev_word_id' => '867', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8185 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '737', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8186 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '738', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1502', + ), + 8187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '739', + 'prev_word_id' => '1502', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1743', + 'placement' => '740', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1247', + ), + 8189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2367', + 'placement' => '741', + 'prev_word_id' => '1247', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1743', + ), + 8190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2364', + 'placement' => '742', + 'prev_word_id' => '1743', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2367', + ), + 8191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2368', + 'placement' => '743', + 'prev_word_id' => '2367', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2364', + ), + 8192 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2369', + 'placement' => '744', + 'prev_word_id' => '2364', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2368', + ), + 8193 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2201', + 'placement' => '745', + 'prev_word_id' => '2368', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2369', + ), + 8194 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '746', + 'prev_word_id' => '2369', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2201', + ), + 8195 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2211', + 'placement' => '747', + 'prev_word_id' => '2201', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 8196 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2370', + 'placement' => '748', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2211', + ), + 8197 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '749', + 'prev_word_id' => '2211', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2370', + ), + 8198 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '750', + 'prev_word_id' => '2370', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '976', + ), + 8199 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2371', + 'placement' => '751', + 'prev_word_id' => '976', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '974', + ), + 8200 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2372', + 'placement' => '752', + 'prev_word_id' => '974', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2371', + ), + 8201 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '753', + 'prev_word_id' => '2371', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2372', + ), + 8202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1578', + 'placement' => '754', + 'prev_word_id' => '2372', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2275', + 'placement' => '755', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1578', + ), + 8204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2364', + 'placement' => '756', + 'prev_word_id' => '1578', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2275', + ), + 8205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2216', + 'placement' => '757', + 'prev_word_id' => '2275', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2364', + ), + 8206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '758', + 'prev_word_id' => '2364', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2216', + ), + 8207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2231', + 'placement' => '759', + 'prev_word_id' => '2216', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '760', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2231', + ), + 8209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2373', + 'placement' => '761', + 'prev_word_id' => '2231', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '809', + ), + 8210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '762', + 'prev_word_id' => '809', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2373', + ), + 8211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2374', + 'placement' => '763', + 'prev_word_id' => '2373', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2375', + 'placement' => '764', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2374', + ), + 8213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '765', + 'prev_word_id' => '2374', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2375', + ), + 8214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '766', + 'prev_word_id' => '2375', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2135', + 'placement' => '767', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 8216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '768', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2135', + ), + 8217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '864', + 'placement' => '769', + 'prev_word_id' => '2135', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 8218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '770', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '864', + ), + 8219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '771', + 'prev_word_id' => '864', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1938', + 'placement' => '772', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '804', + ), + 8221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2201', + 'placement' => '773', + 'prev_word_id' => '804', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1938', + ), + 8222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '774', + 'prev_word_id' => '1938', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2201', + ), + 8223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2313', + 'placement' => '775', + 'prev_word_id' => '2201', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '912', + ), + 8224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1718', + 'placement' => '776', + 'prev_word_id' => '912', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2313', + ), + 8225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '777', + 'prev_word_id' => '2313', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1718', + ), + 8226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2376', + 'placement' => '778', + 'prev_word_id' => '1718', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '810', + ), + 8227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '779', + 'prev_word_id' => '810', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2376', + ), + 8228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2377', + 'placement' => '780', + 'prev_word_id' => '2376', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '919', + 'placement' => '781', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2377', + ), + 8230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '782', + 'prev_word_id' => '2377', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '919', + ), + 8231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '913', + 'placement' => '783', + 'prev_word_id' => '919', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '914', + 'placement' => '784', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '913', + ), + 8233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '785', + 'prev_word_id' => '913', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '914', + ), + 8234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2378', + 'placement' => '786', + 'prev_word_id' => '914', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '787', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2378', + ), + 8236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2379', + 'placement' => '788', + 'prev_word_id' => '2378', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '789', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2379', + ), + 8238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '790', + 'prev_word_id' => '2379', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1835', + ), + 8239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2215', + 'placement' => '791', + 'prev_word_id' => '1835', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2216', + 'placement' => '792', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2215', + ), + 8241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1357', + 'placement' => '793', + 'prev_word_id' => '2215', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2216', + ), + 8242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '794', + 'prev_word_id' => '2216', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1357', + ), + 8243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2380', + 'placement' => '795', + 'prev_word_id' => '1357', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2313', + 'placement' => '796', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2380', + ), + 8245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1815', + 'placement' => '797', + 'prev_word_id' => '2380', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2313', + ), + 8246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1227', + 'placement' => '798', + 'prev_word_id' => '2313', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1815', + ), + 8247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '799', + 'prev_word_id' => '1815', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1227', + ), + 8248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1736', + 'placement' => '800', + 'prev_word_id' => '1227', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1247', + ), + 8249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '801', + 'prev_word_id' => '1247', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1736', + ), + 8250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '802', + 'prev_word_id' => '1736', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1280', + ), + 8251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '803', + 'prev_word_id' => '1280', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '954', + ), + 8252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '804', + 'prev_word_id' => '954', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '805', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '971', + ), + 8254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '806', + 'prev_word_id' => '971', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '874', + ), + 8255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1241', + 'placement' => '807', + 'prev_word_id' => '874', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '860', + ), + 8256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '928', + 'placement' => '808', + 'prev_word_id' => '860', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1241', + ), + 8257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '809', + 'prev_word_id' => '1241', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '928', + ), + 8258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '810', + 'prev_word_id' => '928', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1337', + ), + 8259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '811', + 'prev_word_id' => '1337', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '812', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1258', + ), + 8261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '813', + 'prev_word_id' => '1258', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1818', + ), + 8262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2381', + 'placement' => '814', + 'prev_word_id' => '1818', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '815', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2381', + ), + 8264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1257', + 'placement' => '816', + 'prev_word_id' => '2381', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1940', + 'placement' => '817', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1257', + ), + 8266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2382', + 'placement' => '818', + 'prev_word_id' => '1257', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1940', + ), + 8267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2364', + 'placement' => '819', + 'prev_word_id' => '1940', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2382', + ), + 8268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2383', + 'placement' => '820', + 'prev_word_id' => '2382', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2364', + ), + 8269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '821', + 'prev_word_id' => '2364', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2383', + ), + 8270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2384', + 'placement' => '822', + 'prev_word_id' => '2383', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '801', + ), + 8271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2364', + 'placement' => '823', + 'prev_word_id' => '801', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2384', + ), + 8272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1375', + 'placement' => '824', + 'prev_word_id' => '2384', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2364', + ), + 8273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '825', + 'prev_word_id' => '2364', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1375', + ), + 8274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2216', + 'placement' => '826', + 'prev_word_id' => '1375', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '833', + ), + 8275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '827', + 'prev_word_id' => '833', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2216', + ), + 8276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '828', + 'prev_word_id' => '2216', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '805', + ), + 8277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '829', + 'prev_word_id' => '805', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '814', + ), + 8278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '830', + 'prev_word_id' => '814', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2086', + ), + 8279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '831', + 'prev_word_id' => '2086', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1247', + ), + 8280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2270', + 'placement' => '832', + 'prev_word_id' => '1247', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '813', + ), + 8281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '833', + 'prev_word_id' => '813', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2270', + ), + 8282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '834', + 'prev_word_id' => '2270', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1133', + ), + 8283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '835', + 'prev_word_id' => '1133', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '828', + ), + 8284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1131', + 'placement' => '836', + 'prev_word_id' => '828', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '829', + ), + 8285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '837', + 'prev_word_id' => '829', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1131', + ), + 8286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '838', + 'prev_word_id' => '1131', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1728', + ), + 8287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2385', + 'placement' => '839', + 'prev_word_id' => '1728', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1359', + ), + 8288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '840', + 'prev_word_id' => '1359', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '2385', + ), + 8289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '841', + 'prev_word_id' => '2385', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '863', + ), + 8290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '842', + 'prev_word_id' => '863', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '802', + ), + 8291 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12961', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '843', + 'prev_word_id' => '802', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1191', + ), + 8292 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '151', + 'frequency' => '0', + 'id' => '12962', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '844', + 'prev_word_id' => '1191', + 'published' => '1311154195', + 'section_id' => '1', + 'word_id' => '1191', + ), + 8293 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '152', + 'frequency' => '0', + 'id' => '12963', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154196', + 'section_id' => '1', + 'word_id' => '1716', + ), + 8294 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '152', + 'frequency' => '0', + 'id' => '12964', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154196', + 'section_id' => '1', + 'word_id' => '1716', + ), + 8295 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '153', + 'frequency' => '0', + 'id' => '12965', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1716', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154196', + 'section_id' => '1', + 'word_id' => '1716', + ), + 8296 => + array ( + 'contentclass_attribute_id' => '267', + 'contentclass_id' => '30', + 'contentobject_id' => '153', + 'frequency' => '0', + 'id' => '12966', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '1716', + 'published' => '1311154196', + 'section_id' => '1', + 'word_id' => '1716', + ), + 8297 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '154', + 'frequency' => '0', + 'id' => '12967', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '2216', + ), + 8298 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12968', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1753', + ), + 8299 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12969', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '1', + 'prev_word_id' => '1753', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1517', + ), + 8300 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12970', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '2', + 'prev_word_id' => '1517', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1005', + ), + 8301 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12971', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '3', + 'prev_word_id' => '1005', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1198', + ), + 8302 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12972', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '4', + 'prev_word_id' => '1198', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8303 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12973', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '5', + 'prev_word_id' => '1046', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '989', + ), + 8304 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12974', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '6', + 'prev_word_id' => '989', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1085', + ), + 8305 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12975', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '7', + 'prev_word_id' => '1085', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1086', + ), + 8306 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12976', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '8', + 'prev_word_id' => '1086', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1087', + ), + 8307 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12977', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '9', + 'prev_word_id' => '1087', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8308 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12978', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '10', + 'prev_word_id' => '1088', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8309 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12979', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '11', + 'prev_word_id' => '1089', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8310 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12980', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '12', + 'prev_word_id' => '1090', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8311 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12981', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '13', + 'prev_word_id' => '1091', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1092', + ), + 8312 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12982', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '14', + 'prev_word_id' => '1092', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1093', + ), + 8313 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12983', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '15', + 'prev_word_id' => '1093', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1094', + ), + 8314 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12984', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '16', + 'prev_word_id' => '1094', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1095', + ), + 8315 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12985', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '17', + 'prev_word_id' => '1095', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1096', + ), + 8316 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12986', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1230', + 'placement' => '18', + 'prev_word_id' => '1096', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8317 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12987', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '19', + 'prev_word_id' => '1108', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1230', + ), + 8318 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12988', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '20', + 'prev_word_id' => '1230', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8319 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12989', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '21', + 'prev_word_id' => '1220', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8320 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12990', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '22', + 'prev_word_id' => '1116', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8321 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12991', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '23', + 'prev_word_id' => '1231', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8322 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12992', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '24', + 'prev_word_id' => '1089', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1232', + ), + 8323 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12993', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '25', + 'prev_word_id' => '1232', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8324 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12994', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '26', + 'prev_word_id' => '1089', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '994', + ), + 8325 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12995', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '27', + 'prev_word_id' => '994', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1233', + ), + 8326 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12996', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '28', + 'prev_word_id' => '1233', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8327 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12997', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '29', + 'prev_word_id' => '1188', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8328 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12998', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '30', + 'prev_word_id' => '1016', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8329 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '12999', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '31', + 'prev_word_id' => '1043', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8330 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13000', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '32', + 'prev_word_id' => '1172', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '999', + ), + 8331 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13001', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '33', + 'prev_word_id' => '999', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8332 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13002', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '34', + 'prev_word_id' => '1141', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1101', + ), + 8333 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13003', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '35', + 'prev_word_id' => '1101', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '863', + ), + 8334 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13004', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '36', + 'prev_word_id' => '863', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1203', + ), + 8335 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13005', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '37', + 'prev_word_id' => '1203', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8336 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13006', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '38', + 'prev_word_id' => '1042', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1115', + ), + 8337 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13007', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '39', + 'prev_word_id' => '1115', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '995', + ), + 8338 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13008', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '40', + 'prev_word_id' => '995', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8339 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13009', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '41', + 'prev_word_id' => '1034', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8340 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13010', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '42', + 'prev_word_id' => '1172', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8341 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13011', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '43', + 'prev_word_id' => '1189', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8342 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13012', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '44', + 'prev_word_id' => '1161', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1170', + ), + 8343 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13013', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '45', + 'prev_word_id' => '1170', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '999', + ), + 8344 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13014', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '46', + 'prev_word_id' => '999', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8345 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13015', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '47', + 'prev_word_id' => '1026', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1197', + ), + 8346 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13016', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '48', + 'prev_word_id' => '1197', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1113', + ), + 8347 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13017', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '49', + 'prev_word_id' => '1113', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8348 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13018', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '50', + 'prev_word_id' => '1042', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8349 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13019', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '51', + 'prev_word_id' => '1006', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8350 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13020', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '52', + 'prev_word_id' => '1011', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8351 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13021', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '53', + 'prev_word_id' => '1187', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1163', + ), + 8352 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13022', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '54', + 'prev_word_id' => '1163', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1186', + ), + 8353 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13023', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '55', + 'prev_word_id' => '1186', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8354 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13024', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '56', + 'prev_word_id' => '1187', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1109', + ), + 8355 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13025', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '57', + 'prev_word_id' => '1109', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8356 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13026', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '58', + 'prev_word_id' => '1014', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8357 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13027', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '59', + 'prev_word_id' => '1106', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1038', + ), + 8358 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13028', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '60', + 'prev_word_id' => '1038', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '982', + ), + 8359 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13029', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '61', + 'prev_word_id' => '982', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '825', + ), + 8360 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13030', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '62', + 'prev_word_id' => '825', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8361 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13031', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '63', + 'prev_word_id' => '1043', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1107', + ), + 8362 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13032', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '64', + 'prev_word_id' => '1107', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8363 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13033', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '65', + 'prev_word_id' => '1189', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1029', + ), + 8364 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13034', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '66', + 'prev_word_id' => '1029', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8365 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13035', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '67', + 'prev_word_id' => '1006', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8366 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13036', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '68', + 'prev_word_id' => '1011', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8367 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13037', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '69', + 'prev_word_id' => '1147', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8368 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13038', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '70', + 'prev_word_id' => '1006', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8369 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13039', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '71', + 'prev_word_id' => '1188', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8370 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13040', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '72', + 'prev_word_id' => '1051', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8371 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '155', + 'frequency' => '0', + 'id' => '13041', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '73', + 'prev_word_id' => '1202', + 'published' => '1311154196', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8372 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13042', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8373 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13043', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '1', + 'prev_word_id' => '1108', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8374 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13044', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '2', + 'prev_word_id' => '1006', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8375 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13045', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '3', + 'prev_word_id' => '1000', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1005', + ), + 8376 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13046', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '4', + 'prev_word_id' => '1005', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1198', + ), + 8377 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13047', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '5', + 'prev_word_id' => '1198', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8378 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13048', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '6', + 'prev_word_id' => '1046', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '989', + ), + 8379 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13049', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '7', + 'prev_word_id' => '989', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1085', + ), + 8380 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13050', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '8', + 'prev_word_id' => '1085', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1086', + ), + 8381 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13051', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '9', + 'prev_word_id' => '1086', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1087', + ), + 8382 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13052', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '10', + 'prev_word_id' => '1087', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8383 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13053', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '11', + 'prev_word_id' => '1088', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8384 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13054', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '12', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8385 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13055', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '13', + 'prev_word_id' => '1090', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8386 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13056', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '14', + 'prev_word_id' => '1091', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1092', + ), + 8387 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13057', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '15', + 'prev_word_id' => '1092', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1093', + ), + 8388 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13058', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '16', + 'prev_word_id' => '1093', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1094', + ), + 8389 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13059', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '17', + 'prev_word_id' => '1094', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1095', + ), + 8390 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13060', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '18', + 'prev_word_id' => '1095', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1096', + ), + 8391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '19', + 'prev_word_id' => '1096', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1145', + ), + 8392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '20', + 'prev_word_id' => '1145', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1230', + 'placement' => '21', + 'prev_word_id' => '1046', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '22', + 'prev_word_id' => '1108', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1230', + ), + 8395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '23', + 'prev_word_id' => '1230', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '24', + 'prev_word_id' => '1220', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '25', + 'prev_word_id' => '1116', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '26', + 'prev_word_id' => '1231', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '27', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1232', + ), + 8400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '28', + 'prev_word_id' => '1232', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '29', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '994', + ), + 8402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '30', + 'prev_word_id' => '994', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1233', + ), + 8403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '31', + 'prev_word_id' => '1233', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '32', + 'prev_word_id' => '1188', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '33', + 'prev_word_id' => '1016', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1104', + 'placement' => '34', + 'prev_word_id' => '1043', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '981', + ), + 8407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '35', + 'prev_word_id' => '981', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1104', + ), + 8408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '36', + 'prev_word_id' => '1104', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1049', + ), + 8409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '37', + 'prev_word_id' => '1049', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1170', + ), + 8410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '38', + 'prev_word_id' => '1170', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '39', + 'prev_word_id' => '1046', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1029', + ), + 8412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '40', + 'prev_word_id' => '1029', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '41', + 'prev_word_id' => '1141', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '42', + 'prev_word_id' => '1142', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '994', + ), + 8415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '43', + 'prev_word_id' => '994', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '999', + ), + 8416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '44', + 'prev_word_id' => '999', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '825', + ), + 8417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '45', + 'prev_word_id' => '825', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1029', + ), + 8418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '46', + 'prev_word_id' => '1029', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1164', + ), + 8419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '47', + 'prev_word_id' => '1164', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1162', + ), + 8420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '48', + 'prev_word_id' => '1162', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1107', + ), + 8421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '49', + 'prev_word_id' => '1107', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1103', + ), + 8422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '50', + 'prev_word_id' => '1103', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1001', + ), + 8423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '51', + 'prev_word_id' => '1001', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '52', + 'prev_word_id' => '1043', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1199', + ), + 8425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '53', + 'prev_word_id' => '1199', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '54', + 'prev_word_id' => '1141', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1047', + ), + 8427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '55', + 'prev_word_id' => '1047', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1015', + ), + 8428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '56', + 'prev_word_id' => '1015', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '57', + 'prev_word_id' => '1110', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1149', + ), + 8430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '58', + 'prev_word_id' => '1149', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '59', + 'prev_word_id' => '1026', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1019', + ), + 8432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '60', + 'prev_word_id' => '1019', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1100', + ), + 8433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '61', + 'prev_word_id' => '1100', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1010', + ), + 8434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '62', + 'prev_word_id' => '1010', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '63', + 'prev_word_id' => '1048', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '998', + ), + 8436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '64', + 'prev_word_id' => '998', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1160', + ), + 8437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '65', + 'prev_word_id' => '1160', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1033', + ), + 8438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '66', + 'prev_word_id' => '1033', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '67', + 'prev_word_id' => '1165', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1027', + ), + 8440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '68', + 'prev_word_id' => '1027', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1193', + ), + 8441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '69', + 'prev_word_id' => '1193', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1209', + ), + 8442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '70', + 'prev_word_id' => '1209', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '71', + 'prev_word_id' => '1034', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '995', + ), + 8444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '72', + 'prev_word_id' => '995', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1203', + ), + 8445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '73', + 'prev_word_id' => '1203', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1193', + ), + 8446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '74', + 'prev_word_id' => '1193', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '999', + ), + 8447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '75', + 'prev_word_id' => '999', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '76', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1149', + ), + 8449 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13119', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '77', + 'prev_word_id' => '1149', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8450 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13120', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '78', + 'prev_word_id' => '1108', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8451 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13121', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '79', + 'prev_word_id' => '1006', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8452 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13122', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '80', + 'prev_word_id' => '1000', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8453 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13123', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '81', + 'prev_word_id' => '1108', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8454 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13124', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '2386', + 'placement' => '82', + 'prev_word_id' => '1006', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8455 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13125', + 'identifier' => 'publish_date', + 'integer_value' => '1175497860', + 'next_word_id' => '1191', + 'placement' => '83', + 'prev_word_id' => '1000', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '2386', + ), + 8456 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '156', + 'frequency' => '0', + 'id' => '13126', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '84', + 'prev_word_id' => '2386', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1191', + ), + 8457 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13127', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8458 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13128', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '1', + 'prev_word_id' => '1088', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8459 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13129', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '2', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8460 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13130', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '3', + 'prev_word_id' => '1090', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8461 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13131', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '4', + 'prev_word_id' => '1091', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8462 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13132', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '5', + 'prev_word_id' => '1108', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8463 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13133', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '6', + 'prev_word_id' => '1006', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8464 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13134', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '7', + 'prev_word_id' => '1000', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8465 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13135', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '8', + 'prev_word_id' => '1192', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '825', + ), + 8466 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13136', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '9', + 'prev_word_id' => '825', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1112', + ), + 8467 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13137', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '10', + 'prev_word_id' => '1112', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8468 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13138', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '11', + 'prev_word_id' => '1013', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1111', + ), + 8469 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13139', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '12', + 'prev_word_id' => '1111', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8470 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13140', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '13', + 'prev_word_id' => '1011', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '989', + ), + 8471 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13141', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '14', + 'prev_word_id' => '989', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8472 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13142', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '15', + 'prev_word_id' => '1026', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8473 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13143', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '16', + 'prev_word_id' => '1165', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1117', + ), + 8474 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13144', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '17', + 'prev_word_id' => '1117', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1099', + ), + 8475 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13145', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '18', + 'prev_word_id' => '1099', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8476 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13146', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '19', + 'prev_word_id' => '1108', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8477 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13147', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '20', + 'prev_word_id' => '1110', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8478 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13148', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '21', + 'prev_word_id' => '1088', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8479 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13149', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '22', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8480 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13150', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '2387', + 'placement' => '23', + 'prev_word_id' => '1090', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8481 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13151', + 'identifier' => 'publish_date', + 'integer_value' => '1175498940', + 'next_word_id' => '1191', + 'placement' => '24', + 'prev_word_id' => '1091', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '2387', + ), + 8482 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '157', + 'frequency' => '0', + 'id' => '13152', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '25', + 'prev_word_id' => '2387', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1191', + ), + 8483 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13153', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1517', + ), + 8484 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13154', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '1', + 'prev_word_id' => '1517', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8485 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13155', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '2', + 'prev_word_id' => '1051', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1103', + ), + 8486 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13156', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '3', + 'prev_word_id' => '1103', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1099', + ), + 8487 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13157', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '4', + 'prev_word_id' => '1099', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '992', + ), + 8488 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13158', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '5', + 'prev_word_id' => '992', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '993', + ), + 8489 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13159', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '6', + 'prev_word_id' => '993', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1052', + ), + 8490 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13160', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '7', + 'prev_word_id' => '1052', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '985', + ), + 8491 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13161', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '8', + 'prev_word_id' => '985', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1032', + ), + 8492 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13162', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '9', + 'prev_word_id' => '1032', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1135', + ), + 8493 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13163', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '10', + 'prev_word_id' => '1135', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1143', + ), + 8494 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13164', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '11', + 'prev_word_id' => '1143', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8495 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13165', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '12', + 'prev_word_id' => '1000', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8496 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13166', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '13', + 'prev_word_id' => '1013', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1193', + ), + 8497 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13167', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '14', + 'prev_word_id' => '1193', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1159', + ), + 8498 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13168', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '15', + 'prev_word_id' => '1159', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '984', + ), + 8499 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13169', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '16', + 'prev_word_id' => '984', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1168', + ), + 8500 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13170', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '17', + 'prev_word_id' => '1168', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1030', + ), + 8501 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13171', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '18', + 'prev_word_id' => '1030', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8502 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13172', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '19', + 'prev_word_id' => '1202', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1217', + ), + 8503 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13173', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '20', + 'prev_word_id' => '1217', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8504 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13174', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '21', + 'prev_word_id' => '1192', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1157', + ), + 8505 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13175', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1173', + 'placement' => '22', + 'prev_word_id' => '1157', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1044', + ), + 8506 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13176', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '23', + 'prev_word_id' => '1044', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1173', + ), + 8507 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13177', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '24', + 'prev_word_id' => '1173', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1001', + ), + 8508 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13178', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '25', + 'prev_word_id' => '1001', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1203', + ), + 8509 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13179', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '26', + 'prev_word_id' => '1203', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1164', + ), + 8510 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13180', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '27', + 'prev_word_id' => '1164', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8511 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13181', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '28', + 'prev_word_id' => '1048', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1194', + ), + 8512 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13182', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '29', + 'prev_word_id' => '1194', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1001', + ), + 8513 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13183', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '30', + 'prev_word_id' => '1001', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8514 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13184', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '31', + 'prev_word_id' => '1034', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8515 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13185', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '32', + 'prev_word_id' => '1142', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1156', + ), + 8516 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13186', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '33', + 'prev_word_id' => '1156', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1033', + ), + 8517 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13187', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '34', + 'prev_word_id' => '1033', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1052', + ), + 8518 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13188', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '35', + 'prev_word_id' => '1052', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1171', + ), + 8519 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13189', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '36', + 'prev_word_id' => '1171', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '984', + ), + 8520 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13190', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '37', + 'prev_word_id' => '984', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8521 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13191', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '38', + 'prev_word_id' => '1188', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8522 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13192', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '39', + 'prev_word_id' => '1051', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1114', + ), + 8523 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13193', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '40', + 'prev_word_id' => '1114', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1105', + ), + 8524 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13194', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '41', + 'prev_word_id' => '1105', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8525 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13195', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '42', + 'prev_word_id' => '1202', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8526 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13196', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '43', + 'prev_word_id' => '1016', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8527 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13197', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '44', + 'prev_word_id' => '1034', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1239', + ), + 8528 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13198', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '45', + 'prev_word_id' => '1239', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1171', + ), + 8529 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13199', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '46', + 'prev_word_id' => '1171', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8530 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13200', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '47', + 'prev_word_id' => '1116', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '825', + ), + 8531 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13201', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '48', + 'prev_word_id' => '825', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8532 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13202', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '49', + 'prev_word_id' => '1165', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1020', + ), + 8533 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13203', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '50', + 'prev_word_id' => '1020', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8534 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13204', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '51', + 'prev_word_id' => '1006', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1163', + ), + 8535 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13205', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '52', + 'prev_word_id' => '1163', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1100', + ), + 8536 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13206', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '53', + 'prev_word_id' => '1100', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8537 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13207', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '54', + 'prev_word_id' => '1106', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1030', + ), + 8538 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13208', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '55', + 'prev_word_id' => '1030', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1029', + ), + 8539 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13209', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '56', + 'prev_word_id' => '1029', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8540 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13210', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '57', + 'prev_word_id' => '1048', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1002', + ), + 8541 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13211', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '58', + 'prev_word_id' => '1002', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8542 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13212', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '59', + 'prev_word_id' => '1141', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '990', + ), + 8543 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13213', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '60', + 'prev_word_id' => '990', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8544 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13214', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '61', + 'prev_word_id' => '1051', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8545 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13215', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '62', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1138', + ), + 8546 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13216', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '63', + 'prev_word_id' => '1138', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1040', + ), + 8547 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13217', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '64', + 'prev_word_id' => '1040', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1103', + ), + 8548 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13218', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '65', + 'prev_word_id' => '1103', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1030', + ), + 8549 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13219', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '66', + 'prev_word_id' => '1030', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1194', + ), + 8550 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13220', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '67', + 'prev_word_id' => '1194', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1017', + ), + 8551 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13221', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '68', + 'prev_word_id' => '1017', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '810', + ), + 8552 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13222', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '69', + 'prev_word_id' => '810', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1109', + ), + 8553 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13223', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '70', + 'prev_word_id' => '1109', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '810', + ), + 8554 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13224', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '71', + 'prev_word_id' => '810', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '986', + ), + 8555 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13225', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '72', + 'prev_word_id' => '986', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '985', + ), + 8556 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13226', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '73', + 'prev_word_id' => '985', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1139', + ), + 8557 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13227', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '74', + 'prev_word_id' => '1139', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1005', + ), + 8558 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13228', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '75', + 'prev_word_id' => '1005', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8559 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13229', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '76', + 'prev_word_id' => '1165', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '988', + ), + 8560 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13230', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '77', + 'prev_word_id' => '988', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1020', + ), + 8561 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13231', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '78', + 'prev_word_id' => '1020', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1007', + ), + 8562 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13232', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '79', + 'prev_word_id' => '1007', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '987', + ), + 8563 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13233', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '80', + 'prev_word_id' => '987', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8564 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13234', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '81', + 'prev_word_id' => '1187', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8565 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13235', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '82', + 'prev_word_id' => '1192', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1157', + ), + 8566 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13236', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '83', + 'prev_word_id' => '1157', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '983', + ), + 8567 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13237', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '84', + 'prev_word_id' => '983', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8568 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13238', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '85', + 'prev_word_id' => '1110', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1028', + ), + 8569 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13239', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '86', + 'prev_word_id' => '1028', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1218', + ), + 8570 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13240', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '87', + 'prev_word_id' => '1218', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1001', + ), + 8571 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13241', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '88', + 'prev_word_id' => '1001', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1196', + ), + 8572 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13242', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '89', + 'prev_word_id' => '1196', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '999', + ), + 8573 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13243', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '90', + 'prev_word_id' => '999', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '863', + ), + 8574 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '158', + 'frequency' => '0', + 'id' => '13244', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '91', + 'prev_word_id' => '863', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8575 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13245', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1047', + ), + 8576 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13246', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '1', + 'prev_word_id' => '1047', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1015', + ), + 8577 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13247', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '2', + 'prev_word_id' => '1015', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8578 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13248', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '3', + 'prev_word_id' => '1110', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1047', + ), + 8579 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13249', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '4', + 'prev_word_id' => '1047', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1015', + ), + 8580 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13250', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '5', + 'prev_word_id' => '1015', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8581 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13251', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '6', + 'prev_word_id' => '1110', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1149', + ), + 8582 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13252', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '7', + 'prev_word_id' => '1149', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8583 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13253', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '8', + 'prev_word_id' => '1026', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1019', + ), + 8584 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13254', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '9', + 'prev_word_id' => '1019', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1100', + ), + 8585 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13255', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '10', + 'prev_word_id' => '1100', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1010', + ), + 8586 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13256', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '11', + 'prev_word_id' => '1010', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8587 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13257', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '12', + 'prev_word_id' => '1048', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '998', + ), + 8588 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13258', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '13', + 'prev_word_id' => '998', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1160', + ), + 8589 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13259', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '14', + 'prev_word_id' => '1160', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1033', + ), + 8590 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13260', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '15', + 'prev_word_id' => '1033', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8591 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13261', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '16', + 'prev_word_id' => '1165', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '983', + ), + 8592 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13262', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '17', + 'prev_word_id' => '983', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8593 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13263', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '18', + 'prev_word_id' => '1013', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8594 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13264', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '19', + 'prev_word_id' => '1006', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1035', + ), + 8595 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13265', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '20', + 'prev_word_id' => '1035', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8596 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13266', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '21', + 'prev_word_id' => '1048', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8597 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13267', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '22', + 'prev_word_id' => '1147', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1208', + ), + 8598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '23', + 'prev_word_id' => '1208', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1027', + ), + 8599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '24', + 'prev_word_id' => '1027', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1193', + ), + 8600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '25', + 'prev_word_id' => '1193', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1209', + ), + 8601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '26', + 'prev_word_id' => '1209', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '27', + 'prev_word_id' => '1034', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '995', + ), + 8603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '28', + 'prev_word_id' => '995', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1203', + ), + 8604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '29', + 'prev_word_id' => '1203', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1193', + ), + 8605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '30', + 'prev_word_id' => '1193', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '999', + ), + 8606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '31', + 'prev_word_id' => '999', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '32', + 'prev_word_id' => '1089', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1149', + ), + 8608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '33', + 'prev_word_id' => '1149', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '34', + 'prev_word_id' => '1202', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '35', + 'prev_word_id' => '1048', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '36', + 'prev_word_id' => '1106', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1020', + ), + 8612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '37', + 'prev_word_id' => '1020', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '38', + 'prev_word_id' => '1106', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '39', + 'prev_word_id' => '1014', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1148', + ), + 8615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '40', + 'prev_word_id' => '1148', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '41', + 'prev_word_id' => '1116', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1164', + ), + 8617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '42', + 'prev_word_id' => '1164', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1035', + ), + 8618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '43', + 'prev_word_id' => '1035', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '995', + ), + 8619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '44', + 'prev_word_id' => '995', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '988', + ), + 8620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '45', + 'prev_word_id' => '988', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1001', + ), + 8621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '46', + 'prev_word_id' => '1001', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1208', + ), + 8622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '47', + 'prev_word_id' => '1208', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '48', + 'prev_word_id' => '1026', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1019', + ), + 8624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '49', + 'prev_word_id' => '1019', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1100', + ), + 8625 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13295', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '50', + 'prev_word_id' => '1100', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1047', + ), + 8626 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13296', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '51', + 'prev_word_id' => '1047', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1015', + ), + 8627 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13297', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '52', + 'prev_word_id' => '1015', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8628 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13298', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '53', + 'prev_word_id' => '1110', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1047', + ), + 8629 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13299', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '2388', + 'placement' => '54', + 'prev_word_id' => '1047', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1015', + ), + 8630 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13300', + 'identifier' => 'publish_date', + 'integer_value' => '1175497920', + 'next_word_id' => '1191', + 'placement' => '55', + 'prev_word_id' => '1015', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '2388', + ), + 8631 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '159', + 'frequency' => '0', + 'id' => '13301', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '56', + 'prev_word_id' => '2388', + 'published' => '1311154197', + 'section_id' => '6', + 'word_id' => '1191', + ), + 8632 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13302', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8633 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13303', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '1', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8634 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13304', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '2', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8635 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13305', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '3', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8636 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13306', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '4', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8637 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13307', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '5', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8638 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13308', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '6', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1170', + ), + 8639 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13309', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '7', + 'prev_word_id' => '1170', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '999', + ), + 8640 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13310', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '8', + 'prev_word_id' => '999', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8641 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13311', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '9', + 'prev_word_id' => '1026', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1197', + ), + 8642 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13312', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '10', + 'prev_word_id' => '1197', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1113', + ), + 8643 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13313', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '11', + 'prev_word_id' => '1113', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8644 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13314', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '12', + 'prev_word_id' => '1042', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8645 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13315', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '13', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8646 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13316', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '14', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8647 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13317', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '15', + 'prev_word_id' => '1187', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1163', + ), + 8648 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13318', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '16', + 'prev_word_id' => '1163', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1186', + ), + 8649 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13319', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '17', + 'prev_word_id' => '1186', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8650 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13320', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '18', + 'prev_word_id' => '1187', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1109', + ), + 8651 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13321', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '19', + 'prev_word_id' => '1109', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8652 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13322', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '20', + 'prev_word_id' => '1014', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8653 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13323', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '21', + 'prev_word_id' => '1106', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1038', + ), + 8654 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13324', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '22', + 'prev_word_id' => '1038', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '982', + ), + 8655 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13325', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '23', + 'prev_word_id' => '982', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '825', + ), + 8656 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13326', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '24', + 'prev_word_id' => '825', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8657 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13327', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '25', + 'prev_word_id' => '1043', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1107', + ), + 8658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '26', + 'prev_word_id' => '1107', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '27', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '28', + 'prev_word_id' => '1147', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '29', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '30', + 'prev_word_id' => '1188', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '31', + 'prev_word_id' => '1051', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '32', + 'prev_word_id' => '1202', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '33', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1017', + ), + 8666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '34', + 'prev_word_id' => '1017', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1012', + ), + 8667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1242', + 'placement' => '35', + 'prev_word_id' => '1012', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1103', + ), + 8668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '36', + 'prev_word_id' => '1103', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1242', + ), + 8669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '37', + 'prev_word_id' => '1242', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '863', + ), + 8670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '38', + 'prev_word_id' => '863', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1138', + ), + 8671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1223', + 'placement' => '39', + 'prev_word_id' => '1138', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '40', + 'prev_word_id' => '1142', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1223', + ), + 8673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '41', + 'prev_word_id' => '1223', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '42', + 'prev_word_id' => '1089', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1115', + ), + 8675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1243', + 'placement' => '43', + 'prev_word_id' => '1115', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1118', + ), + 8676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1244', + 'placement' => '44', + 'prev_word_id' => '1118', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1243', + ), + 8677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '45', + 'prev_word_id' => '1243', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1244', + ), + 8678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '46', + 'prev_word_id' => '1244', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1114', + ), + 8679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '47', + 'prev_word_id' => '1114', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '48', + 'prev_word_id' => '1192', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1041', + ), + 8681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '49', + 'prev_word_id' => '1041', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1010', + ), + 8682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '50', + 'prev_word_id' => '1010', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '985', + ), + 8683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '51', + 'prev_word_id' => '985', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1119', + ), + 8684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '52', + 'prev_word_id' => '1119', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1158', + ), + 8685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '53', + 'prev_word_id' => '1158', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '54', + 'prev_word_id' => '1108', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '55', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '56', + 'prev_word_id' => '1000', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '57', + 'prev_word_id' => '1192', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '825', + ), + 8690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '58', + 'prev_word_id' => '825', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1112', + ), + 8691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '59', + 'prev_word_id' => '1112', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '60', + 'prev_word_id' => '1013', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1111', + ), + 8693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '61', + 'prev_word_id' => '1111', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '62', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '989', + ), + 8695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '63', + 'prev_word_id' => '989', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '64', + 'prev_word_id' => '1026', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '65', + 'prev_word_id' => '1165', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1117', + ), + 8698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '66', + 'prev_word_id' => '1117', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1099', + ), + 8699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '67', + 'prev_word_id' => '1099', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '68', + 'prev_word_id' => '1108', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '69', + 'prev_word_id' => '1110', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '70', + 'prev_word_id' => '1142', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1085', + ), + 8703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '71', + 'prev_word_id' => '1085', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1086', + ), + 8704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '72', + 'prev_word_id' => '1086', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1087', + ), + 8705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '73', + 'prev_word_id' => '1087', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '74', + 'prev_word_id' => '1088', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '75', + 'prev_word_id' => '1089', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '76', + 'prev_word_id' => '1090', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '77', + 'prev_word_id' => '1091', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1092', + ), + 8710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '78', + 'prev_word_id' => '1092', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1093', + ), + 8711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '79', + 'prev_word_id' => '1093', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1094', + ), + 8712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '80', + 'prev_word_id' => '1094', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1095', + ), + 8713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '81', + 'prev_word_id' => '1095', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1096', + ), + 8714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1151', + 'placement' => '82', + 'prev_word_id' => '1096', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1137', + ), + 8715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '83', + 'prev_word_id' => '1137', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1151', + ), + 8716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '84', + 'prev_word_id' => '1151', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '983', + ), + 8717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '85', + 'prev_word_id' => '983', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '86', + 'prev_word_id' => '1013', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '87', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1035', + ), + 8720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '88', + 'prev_word_id' => '1035', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '89', + 'prev_word_id' => '1048', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '90', + 'prev_word_id' => '1147', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1208', + ), + 8723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '91', + 'prev_word_id' => '1208', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1040', + ), + 8724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '92', + 'prev_word_id' => '1040', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1150', + ), + 8725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '93', + 'prev_word_id' => '1150', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '94', + 'prev_word_id' => '1014', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '863', + ), + 8727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '95', + 'prev_word_id' => '863', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8728 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13398', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '96', + 'prev_word_id' => '1016', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8729 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13399', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '97', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8730 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13400', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '98', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8731 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13401', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '99', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8732 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13402', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '2389', + 'placement' => '100', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8733 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13403', + 'identifier' => 'publish_date', + 'integer_value' => '1175498280', + 'next_word_id' => '1191', + 'placement' => '101', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '2389', + ), + 8734 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '160', + 'frequency' => '0', + 'id' => '13404', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '102', + 'prev_word_id' => '2389', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1191', + ), + 8735 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13405', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8736 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13406', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '1', + 'prev_word_id' => '1220', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8737 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13407', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '2', + 'prev_word_id' => '1116', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8738 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13408', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '3', + 'prev_word_id' => '1231', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8739 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13409', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '4', + 'prev_word_id' => '1220', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8740 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13410', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '5', + 'prev_word_id' => '1116', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8741 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13411', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '6', + 'prev_word_id' => '1231', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8742 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13412', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '7', + 'prev_word_id' => '1089', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1232', + ), + 8743 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13413', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '8', + 'prev_word_id' => '1232', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8744 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13414', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '9', + 'prev_word_id' => '1089', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '994', + ), + 8745 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13415', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '10', + 'prev_word_id' => '994', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1233', + ), + 8746 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13416', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '11', + 'prev_word_id' => '1233', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8747 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13417', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '12', + 'prev_word_id' => '1188', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8748 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13418', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '13', + 'prev_word_id' => '1016', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8749 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13419', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '14', + 'prev_word_id' => '1043', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8750 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13420', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '15', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '999', + ), + 8751 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13421', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '16', + 'prev_word_id' => '999', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8752 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13422', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '17', + 'prev_word_id' => '1141', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1101', + ), + 8753 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13423', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '18', + 'prev_word_id' => '1101', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '863', + ), + 8754 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13424', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '19', + 'prev_word_id' => '863', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1203', + ), + 8755 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13425', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '20', + 'prev_word_id' => '1203', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8756 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13426', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '21', + 'prev_word_id' => '1042', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1115', + ), + 8757 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13427', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '22', + 'prev_word_id' => '1115', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '995', + ), + 8758 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13428', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '23', + 'prev_word_id' => '995', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8759 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13429', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '24', + 'prev_word_id' => '1034', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8760 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13430', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '25', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8761 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13431', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '26', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8762 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13432', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '27', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1170', + ), + 8763 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13433', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '28', + 'prev_word_id' => '1170', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '999', + ), + 8764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '29', + 'prev_word_id' => '999', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '30', + 'prev_word_id' => '1026', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1197', + ), + 8766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '31', + 'prev_word_id' => '1197', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1113', + ), + 8767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '32', + 'prev_word_id' => '1113', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '33', + 'prev_word_id' => '1042', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '34', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '35', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '36', + 'prev_word_id' => '1187', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1163', + ), + 8772 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '37', + 'prev_word_id' => '1163', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1186', + ), + 8773 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '38', + 'prev_word_id' => '1186', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8774 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '39', + 'prev_word_id' => '1187', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1109', + ), + 8775 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '40', + 'prev_word_id' => '1109', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8776 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '41', + 'prev_word_id' => '1014', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8777 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '42', + 'prev_word_id' => '1106', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1038', + ), + 8778 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '43', + 'prev_word_id' => '1038', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '982', + ), + 8779 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '44', + 'prev_word_id' => '982', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '825', + ), + 8780 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '45', + 'prev_word_id' => '825', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8781 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '46', + 'prev_word_id' => '1043', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1107', + ), + 8782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '47', + 'prev_word_id' => '1107', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '48', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1029', + ), + 8784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '49', + 'prev_word_id' => '1029', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '50', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '51', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '52', + 'prev_word_id' => '1147', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '53', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '54', + 'prev_word_id' => '1188', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '55', + 'prev_word_id' => '1051', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '56', + 'prev_word_id' => '1202', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8792 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13462', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '57', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8793 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13463', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '58', + 'prev_word_id' => '1220', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8794 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13464', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '59', + 'prev_word_id' => '1116', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8795 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13465', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '60', + 'prev_word_id' => '1231', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8796 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13466', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '61', + 'prev_word_id' => '1220', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8797 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13467', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '2390', + 'placement' => '62', + 'prev_word_id' => '1116', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8798 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13468', + 'identifier' => 'publish_date', + 'integer_value' => '1175498880', + 'next_word_id' => '1191', + 'placement' => '63', + 'prev_word_id' => '1231', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '2390', + ), + 8799 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '161', + 'frequency' => '0', + 'id' => '13469', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '64', + 'prev_word_id' => '2390', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1191', + ), + 8800 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13470', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '924', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1753', + ), + 8801 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13471', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '1', + 'prev_word_id' => '1753', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '924', + ), + 8802 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13472', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '2', + 'prev_word_id' => '924', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1005', + ), + 8803 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13473', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '3', + 'prev_word_id' => '1005', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8804 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13474', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '4', + 'prev_word_id' => '1188', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1099', + ), + 8805 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13475', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '5', + 'prev_word_id' => '1099', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1035', + ), + 8806 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13476', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '6', + 'prev_word_id' => '1035', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1053', + ), + 8807 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13477', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '7', + 'prev_word_id' => '1053', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8808 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13478', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '8', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1107', + ), + 8809 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13479', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '9', + 'prev_word_id' => '1107', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1049', + ), + 8810 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13480', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '10', + 'prev_word_id' => '1049', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8811 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13481', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '11', + 'prev_word_id' => '1165', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1209', + ), + 8812 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13482', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '12', + 'prev_word_id' => '1209', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8813 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13483', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '13', + 'prev_word_id' => '1051', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1103', + ), + 8814 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13484', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '14', + 'prev_word_id' => '1103', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1099', + ), + 8815 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13485', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '15', + 'prev_word_id' => '1099', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '992', + ), + 8816 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13486', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '16', + 'prev_word_id' => '992', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '993', + ), + 8817 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13487', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '17', + 'prev_word_id' => '993', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1052', + ), + 8818 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13488', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '18', + 'prev_word_id' => '1052', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '985', + ), + 8819 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13489', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1230', + 'placement' => '19', + 'prev_word_id' => '985', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8820 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13490', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '20', + 'prev_word_id' => '1108', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1230', + ), + 8821 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13491', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '21', + 'prev_word_id' => '1230', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8822 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13492', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '22', + 'prev_word_id' => '1220', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8823 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13493', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '23', + 'prev_word_id' => '1116', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8824 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13494', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '24', + 'prev_word_id' => '1231', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8825 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13495', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '25', + 'prev_word_id' => '1089', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1232', + ), + 8826 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13496', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '26', + 'prev_word_id' => '1232', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8827 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13497', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '27', + 'prev_word_id' => '1089', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '994', + ), + 8828 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13498', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '28', + 'prev_word_id' => '994', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1233', + ), + 8829 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13499', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '29', + 'prev_word_id' => '1233', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8830 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13500', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '30', + 'prev_word_id' => '1188', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8831 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13501', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '31', + 'prev_word_id' => '1016', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8832 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13502', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '32', + 'prev_word_id' => '1043', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8833 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13503', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '33', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '999', + ), + 8834 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13504', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '34', + 'prev_word_id' => '999', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8835 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13505', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '35', + 'prev_word_id' => '1141', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1101', + ), + 8836 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13506', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '36', + 'prev_word_id' => '1101', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '863', + ), + 8837 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13507', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '37', + 'prev_word_id' => '863', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1203', + ), + 8838 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13508', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '38', + 'prev_word_id' => '1203', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8839 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13509', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '39', + 'prev_word_id' => '1042', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1115', + ), + 8840 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13510', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '40', + 'prev_word_id' => '1115', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '995', + ), + 8841 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13511', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '41', + 'prev_word_id' => '995', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1034', + ), + 8842 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13512', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '42', + 'prev_word_id' => '1034', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1172', + ), + 8843 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13513', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '43', + 'prev_word_id' => '1172', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8844 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13514', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '44', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8845 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13515', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '45', + 'prev_word_id' => '1161', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1170', + ), + 8846 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13516', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '46', + 'prev_word_id' => '1170', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '999', + ), + 8847 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13517', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '47', + 'prev_word_id' => '999', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8848 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13518', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '48', + 'prev_word_id' => '1026', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1197', + ), + 8849 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13519', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '49', + 'prev_word_id' => '1197', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1113', + ), + 8850 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13520', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '50', + 'prev_word_id' => '1113', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1042', + ), + 8851 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13521', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '51', + 'prev_word_id' => '1042', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8852 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13522', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '52', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8853 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13523', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '53', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8854 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13524', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '54', + 'prev_word_id' => '1187', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1163', + ), + 8855 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13525', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '55', + 'prev_word_id' => '1163', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1186', + ), + 8856 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13526', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1109', + 'placement' => '56', + 'prev_word_id' => '1186', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1187', + ), + 8857 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13527', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '57', + 'prev_word_id' => '1187', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1109', + ), + 8858 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13528', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '58', + 'prev_word_id' => '1109', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8859 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13529', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '59', + 'prev_word_id' => '1014', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8860 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13530', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '60', + 'prev_word_id' => '1106', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1038', + ), + 8861 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13531', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '61', + 'prev_word_id' => '1038', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '982', + ), + 8862 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13532', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '62', + 'prev_word_id' => '982', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '825', + ), + 8863 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13533', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '63', + 'prev_word_id' => '825', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8864 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13534', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '64', + 'prev_word_id' => '1043', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1107', + ), + 8865 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13535', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '65', + 'prev_word_id' => '1107', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1189', + ), + 8866 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13536', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '66', + 'prev_word_id' => '1189', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1029', + ), + 8867 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13537', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '67', + 'prev_word_id' => '1029', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8868 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13538', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '68', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8869 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13539', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '69', + 'prev_word_id' => '1011', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8870 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13540', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '70', + 'prev_word_id' => '1147', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8871 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13541', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '71', + 'prev_word_id' => '1006', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8872 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13542', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '72', + 'prev_word_id' => '1188', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1051', + ), + 8873 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13543', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '73', + 'prev_word_id' => '1051', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8874 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '162', + 'frequency' => '0', + 'id' => '13544', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '74', + 'prev_word_id' => '1202', + 'published' => '1311154198', + 'section_id' => '6', + 'word_id' => '1161', + ), + 8875 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13545', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '2216', + ), + 8876 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13546', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '1', + 'prev_word_id' => '2216', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '863', + ), + 8877 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13547', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '2', + 'prev_word_id' => '863', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '863', + ), + 8878 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13548', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '3', + 'prev_word_id' => '863', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1012', + ), + 8879 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13549', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '4', + 'prev_word_id' => '1012', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1017', + ), + 8880 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13550', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '5', + 'prev_word_id' => '1017', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1012', + ), + 8881 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13551', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1242', + 'placement' => '6', + 'prev_word_id' => '1012', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1103', + ), + 8882 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13552', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '7', + 'prev_word_id' => '1103', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1242', + ), + 8883 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13553', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '8', + 'prev_word_id' => '1242', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '863', + ), + 8884 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13554', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '9', + 'prev_word_id' => '863', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1138', + ), + 8885 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13555', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1223', + 'placement' => '10', + 'prev_word_id' => '1138', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8886 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13556', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '11', + 'prev_word_id' => '1142', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1223', + ), + 8887 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13557', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1115', + 'placement' => '12', + 'prev_word_id' => '1223', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8888 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13558', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '13', + 'prev_word_id' => '1089', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1115', + ), + 8889 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13559', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1243', + 'placement' => '14', + 'prev_word_id' => '1115', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1118', + ), + 8890 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13560', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1244', + 'placement' => '15', + 'prev_word_id' => '1118', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1243', + ), + 8891 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13561', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '16', + 'prev_word_id' => '1243', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1244', + ), + 8892 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13562', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '17', + 'prev_word_id' => '1244', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1114', + ), + 8893 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13563', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '18', + 'prev_word_id' => '1114', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8894 => + array ( + 'contentclass_attribute_id' => '119', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13564', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '19', + 'prev_word_id' => '1192', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1041', + ), + 8895 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13565', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '20', + 'prev_word_id' => '1041', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1010', + ), + 8896 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13566', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '21', + 'prev_word_id' => '1010', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '985', + ), + 8897 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13567', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '22', + 'prev_word_id' => '985', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1119', + ), + 8898 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13568', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '23', + 'prev_word_id' => '1119', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1158', + ), + 8899 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13569', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '24', + 'prev_word_id' => '1158', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8900 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13570', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '25', + 'prev_word_id' => '1108', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8901 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13571', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '26', + 'prev_word_id' => '1006', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1000', + ), + 8902 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13572', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '27', + 'prev_word_id' => '1000', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1192', + ), + 8903 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13573', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '28', + 'prev_word_id' => '1192', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '825', + ), + 8904 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13574', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '29', + 'prev_word_id' => '825', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1112', + ), + 8905 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13575', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '30', + 'prev_word_id' => '1112', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8906 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13576', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '31', + 'prev_word_id' => '1013', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1111', + ), + 8907 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13577', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '32', + 'prev_word_id' => '1111', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1011', + ), + 8908 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13578', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '33', + 'prev_word_id' => '1011', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '989', + ), + 8909 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13579', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '34', + 'prev_word_id' => '989', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8910 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13580', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '35', + 'prev_word_id' => '1026', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1165', + ), + 8911 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13581', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '36', + 'prev_word_id' => '1165', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1117', + ), + 8912 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13582', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '37', + 'prev_word_id' => '1117', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1099', + ), + 8913 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13583', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '38', + 'prev_word_id' => '1099', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8914 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13584', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '39', + 'prev_word_id' => '1108', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1110', + ), + 8915 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13585', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '40', + 'prev_word_id' => '1110', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8916 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13586', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '41', + 'prev_word_id' => '1142', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1085', + ), + 8917 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13587', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '42', + 'prev_word_id' => '1085', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1086', + ), + 8918 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13588', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '43', + 'prev_word_id' => '1086', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1087', + ), + 8919 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13589', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '44', + 'prev_word_id' => '1087', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8920 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13590', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '45', + 'prev_word_id' => '1088', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8921 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13591', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '46', + 'prev_word_id' => '1089', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8922 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13592', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '47', + 'prev_word_id' => '1090', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8923 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13593', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '48', + 'prev_word_id' => '1091', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1092', + ), + 8924 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13594', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '49', + 'prev_word_id' => '1092', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1093', + ), + 8925 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13595', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '50', + 'prev_word_id' => '1093', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1094', + ), + 8926 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13596', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '51', + 'prev_word_id' => '1094', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1095', + ), + 8927 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13597', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '52', + 'prev_word_id' => '1095', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1096', + ), + 8928 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13598', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1151', + 'placement' => '53', + 'prev_word_id' => '1096', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1137', + ), + 8929 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13599', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '54', + 'prev_word_id' => '1137', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1151', + ), + 8930 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13600', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '55', + 'prev_word_id' => '1151', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '983', + ), + 8931 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13601', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '56', + 'prev_word_id' => '983', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1013', + ), + 8932 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13602', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '57', + 'prev_word_id' => '1013', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1006', + ), + 8933 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13603', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '58', + 'prev_word_id' => '1006', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1035', + ), + 8934 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13604', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '59', + 'prev_word_id' => '1035', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8935 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13605', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '60', + 'prev_word_id' => '1048', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1147', + ), + 8936 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13606', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '61', + 'prev_word_id' => '1147', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1208', + ), + 8937 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13607', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '62', + 'prev_word_id' => '1208', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1040', + ), + 8938 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13608', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '63', + 'prev_word_id' => '1040', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1150', + ), + 8939 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13609', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '64', + 'prev_word_id' => '1150', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8940 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13610', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '65', + 'prev_word_id' => '1014', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '863', + ), + 8941 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '163', + 'frequency' => '0', + 'id' => '13611', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '66', + 'prev_word_id' => '863', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8942 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13612', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1141', + ), + 8943 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13613', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '1', + 'prev_word_id' => '1141', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1142', + ), + 8944 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13614', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '2', + 'prev_word_id' => '1142', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '994', + ), + 8945 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13615', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '3', + 'prev_word_id' => '994', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '999', + ), + 8946 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13616', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '4', + 'prev_word_id' => '999', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1145', + ), + 8947 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13617', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '5', + 'prev_word_id' => '1145', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8948 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13618', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1230', + 'placement' => '6', + 'prev_word_id' => '1046', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1108', + ), + 8949 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13619', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '7', + 'prev_word_id' => '1108', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1230', + ), + 8950 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13620', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '8', + 'prev_word_id' => '1230', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1220', + ), + 8951 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13621', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1231', + 'placement' => '9', + 'prev_word_id' => '1220', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8952 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13622', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '10', + 'prev_word_id' => '1116', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1231', + ), + 8953 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13623', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1232', + 'placement' => '11', + 'prev_word_id' => '1231', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8954 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13624', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '12', + 'prev_word_id' => '1089', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1232', + ), + 8955 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13625', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '13', + 'prev_word_id' => '1232', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8956 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13626', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1233', + 'placement' => '14', + 'prev_word_id' => '1089', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '994', + ), + 8957 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13627', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '15', + 'prev_word_id' => '994', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1233', + ), + 8958 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13628', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '16', + 'prev_word_id' => '1233', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1188', + ), + 8959 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13629', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '17', + 'prev_word_id' => '1188', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1016', + ), + 8960 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13630', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '18', + 'prev_word_id' => '1016', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1043', + ), + 8961 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13631', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '19', + 'prev_word_id' => '1043', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1202', + ), + 8962 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13632', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '20', + 'prev_word_id' => '1202', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1048', + ), + 8963 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13633', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '21', + 'prev_word_id' => '1048', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8964 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13634', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '22', + 'prev_word_id' => '1106', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1020', + ), + 8965 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13635', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '23', + 'prev_word_id' => '1020', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1106', + ), + 8966 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13636', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '24', + 'prev_word_id' => '1106', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1014', + ), + 8967 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13637', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '25', + 'prev_word_id' => '1014', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1148', + ), + 8968 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13638', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '26', + 'prev_word_id' => '1148', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1116', + ), + 8969 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13639', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '27', + 'prev_word_id' => '1116', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1164', + ), + 8970 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13640', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '28', + 'prev_word_id' => '1164', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1035', + ), + 8971 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13641', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '29', + 'prev_word_id' => '1035', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '995', + ), + 8972 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13642', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '30', + 'prev_word_id' => '995', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '988', + ), + 8973 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13643', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '31', + 'prev_word_id' => '988', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1001', + ), + 8974 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13644', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '32', + 'prev_word_id' => '1001', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1208', + ), + 8975 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13645', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '33', + 'prev_word_id' => '1208', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1026', + ), + 8976 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13646', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '34', + 'prev_word_id' => '1026', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1019', + ), + 8977 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13647', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '35', + 'prev_word_id' => '1019', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1100', + ), + 8978 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13648', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '36', + 'prev_word_id' => '1100', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1005', + ), + 8979 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13649', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '37', + 'prev_word_id' => '1005', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1198', + ), + 8980 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13650', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '38', + 'prev_word_id' => '1198', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8981 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13651', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '39', + 'prev_word_id' => '1046', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '989', + ), + 8982 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13652', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '40', + 'prev_word_id' => '989', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1085', + ), + 8983 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13653', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '41', + 'prev_word_id' => '1085', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1086', + ), + 8984 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13654', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '42', + 'prev_word_id' => '1086', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1087', + ), + 8985 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13655', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '43', + 'prev_word_id' => '1087', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1088', + ), + 8986 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13656', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '44', + 'prev_word_id' => '1088', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1089', + ), + 8987 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13657', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '45', + 'prev_word_id' => '1089', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1090', + ), + 8988 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13658', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '46', + 'prev_word_id' => '1090', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1091', + ), + 8989 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13659', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '47', + 'prev_word_id' => '1091', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1092', + ), + 8990 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13660', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '48', + 'prev_word_id' => '1092', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1093', + ), + 8991 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13661', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '49', + 'prev_word_id' => '1093', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1094', + ), + 8992 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13662', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '50', + 'prev_word_id' => '1094', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1095', + ), + 8993 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13663', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '51', + 'prev_word_id' => '1095', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1096', + ), + 8994 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13664', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '52', + 'prev_word_id' => '1096', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1145', + ), + 8995 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13665', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '53', + 'prev_word_id' => '1145', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1046', + ), + 8996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1104', + 'placement' => '54', + 'prev_word_id' => '1046', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '981', + ), + 8997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '55', + 'prev_word_id' => '981', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1104', + ), + 8998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '56', + 'prev_word_id' => '1104', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1049', + ), + 8999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '57', + 'prev_word_id' => '1049', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1170', + ), + 9000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '58', + 'prev_word_id' => '1170', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1046', + ), + 9001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '59', + 'prev_word_id' => '1046', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1029', + ), + 9002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '60', + 'prev_word_id' => '1029', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1141', + ), + 9003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '61', + 'prev_word_id' => '1141', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1142', + ), + 9004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '62', + 'prev_word_id' => '1142', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '994', + ), + 9005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '63', + 'prev_word_id' => '994', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '999', + ), + 9006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '64', + 'prev_word_id' => '999', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '825', + ), + 9007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '65', + 'prev_word_id' => '825', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1029', + ), + 9008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '66', + 'prev_word_id' => '1029', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1164', + ), + 9009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '67', + 'prev_word_id' => '1164', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1162', + ), + 9010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '68', + 'prev_word_id' => '1162', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1107', + ), + 9011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '69', + 'prev_word_id' => '1107', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1103', + ), + 9012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '70', + 'prev_word_id' => '1103', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1001', + ), + 9013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '71', + 'prev_word_id' => '1001', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1043', + ), + 9014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '72', + 'prev_word_id' => '1043', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1199', + ), + 9015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '73', + 'prev_word_id' => '1199', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1141', + ), + 9016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '74', + 'prev_word_id' => '1141', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1047', + ), + 9017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '75', + 'prev_word_id' => '1047', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1015', + ), + 9018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '76', + 'prev_word_id' => '1015', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1110', + ), + 9019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '77', + 'prev_word_id' => '1110', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1149', + ), + 9020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '78', + 'prev_word_id' => '1149', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1026', + ), + 9021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '79', + 'prev_word_id' => '1026', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1019', + ), + 9022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '80', + 'prev_word_id' => '1019', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1100', + ), + 9023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '81', + 'prev_word_id' => '1100', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1010', + ), + 9024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '82', + 'prev_word_id' => '1010', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1048', + ), + 9025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '83', + 'prev_word_id' => '1048', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '998', + ), + 9026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '84', + 'prev_word_id' => '998', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1160', + ), + 9027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '85', + 'prev_word_id' => '1160', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1033', + ), + 9028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '86', + 'prev_word_id' => '1033', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1165', + ), + 9029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '87', + 'prev_word_id' => '1165', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1027', + ), + 9030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '88', + 'prev_word_id' => '1027', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1193', + ), + 9031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '89', + 'prev_word_id' => '1193', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1209', + ), + 9032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '90', + 'prev_word_id' => '1209', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1034', + ), + 9033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '91', + 'prev_word_id' => '1034', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '995', + ), + 9034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '92', + 'prev_word_id' => '995', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1203', + ), + 9035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '93', + 'prev_word_id' => '1203', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1193', + ), + 9036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '94', + 'prev_word_id' => '1193', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '999', + ), + 9037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '95', + 'prev_word_id' => '999', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1089', + ), + 9038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '96', + 'prev_word_id' => '1089', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1149', + ), + 9039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1048', + 'placement' => '97', + 'prev_word_id' => '1149', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1202', + ), + 9040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '98', + 'prev_word_id' => '1202', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1048', + ), + 9041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '99', + 'prev_word_id' => '1048', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1106', + ), + 9042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '100', + 'prev_word_id' => '1106', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1020', + ), + 9043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '101', + 'prev_word_id' => '1020', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1106', + ), + 9044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1148', + 'placement' => '102', + 'prev_word_id' => '1106', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1014', + ), + 9045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '103', + 'prev_word_id' => '1014', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1148', + ), + 9046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '104', + 'prev_word_id' => '1148', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1116', + ), + 9047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '105', + 'prev_word_id' => '1116', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1164', + ), + 9048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '106', + 'prev_word_id' => '1164', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1035', + ), + 9049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '107', + 'prev_word_id' => '1035', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '995', + ), + 9050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '108', + 'prev_word_id' => '995', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '988', + ), + 9051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '109', + 'prev_word_id' => '988', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1001', + ), + 9052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '110', + 'prev_word_id' => '1001', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1208', + ), + 9053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '111', + 'prev_word_id' => '1208', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1026', + ), + 9054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '112', + 'prev_word_id' => '1026', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1019', + ), + 9055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '113', + 'prev_word_id' => '1019', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1100', + ), + 9056 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13726', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '114', + 'prev_word_id' => '1100', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1141', + ), + 9057 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13727', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '115', + 'prev_word_id' => '1141', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1142', + ), + 9058 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13728', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '116', + 'prev_word_id' => '1142', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '994', + ), + 9059 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13729', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '117', + 'prev_word_id' => '994', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '999', + ), + 9060 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13730', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '118', + 'prev_word_id' => '999', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1141', + ), + 9061 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13731', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '119', + 'prev_word_id' => '1141', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1142', + ), + 9062 => + array ( + 'contentclass_attribute_id' => '190', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13732', + 'identifier' => 'caption', + 'integer_value' => '0', + 'next_word_id' => '2391', + 'placement' => '120', + 'prev_word_id' => '1142', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '994', + ), + 9063 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13733', + 'identifier' => 'publish_date', + 'integer_value' => '1175499180', + 'next_word_id' => '1191', + 'placement' => '121', + 'prev_word_id' => '994', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '2391', + ), + 9064 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '164', + 'frequency' => '0', + 'id' => '13734', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '122', + 'prev_word_id' => '2391', + 'published' => '1311154199', + 'section_id' => '6', + 'word_id' => '1191', + ), + 9065 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '165', + 'frequency' => '0', + 'id' => '13735', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154199', + 'section_id' => '1', + 'word_id' => '1258', + ), + 9066 => + array ( + 'contentclass_attribute_id' => '302', + 'contentclass_id' => '37', + 'contentobject_id' => '166', + 'frequency' => '0', + 'id' => '13736', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '908', + ), + 9067 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13737', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9068 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13738', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '1', + 'prev_word_id' => '1040', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1170', + ), + 9069 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13739', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '2', + 'prev_word_id' => '1170', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '996', + ), + 9070 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13740', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '3', + 'prev_word_id' => '996', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '992', + ), + 9071 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13741', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '4', + 'prev_word_id' => '992', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '993', + ), + 9072 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13742', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '5', + 'prev_word_id' => '993', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9073 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13743', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '6', + 'prev_word_id' => '1040', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1170', + ), + 9074 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13744', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '7', + 'prev_word_id' => '1170', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '996', + ), + 9075 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13745', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '8', + 'prev_word_id' => '996', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '992', + ), + 9076 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13746', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '9', + 'prev_word_id' => '992', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '993', + ), + 9077 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13747', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '10', + 'prev_word_id' => '993', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '989', + ), + 9078 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13748', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '11', + 'prev_word_id' => '989', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '984', + ), + 9079 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13749', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '12', + 'prev_word_id' => '984', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1140', + ), + 9080 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13750', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '13', + 'prev_word_id' => '1140', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '981', + ), + 9081 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13751', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '14', + 'prev_word_id' => '981', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1169', + ), + 9082 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13752', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '15', + 'prev_word_id' => '1169', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9083 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13753', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '16', + 'prev_word_id' => '1049', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1089', + ), + 9084 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13754', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '17', + 'prev_word_id' => '1089', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1221', + ), + 9085 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13755', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '18', + 'prev_word_id' => '1221', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1209', + ), + 9086 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13756', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '19', + 'prev_word_id' => '1209', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '986', + ), + 9087 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13757', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1136', + 'placement' => '20', + 'prev_word_id' => '986', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1012', + ), + 9088 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13758', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '21', + 'prev_word_id' => '1012', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1136', + ), + 9089 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13759', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '22', + 'prev_word_id' => '1136', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '989', + ), + 9090 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13760', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '23', + 'prev_word_id' => '989', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9091 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13761', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '24', + 'prev_word_id' => '1020', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1198', + ), + 9092 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13762', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '25', + 'prev_word_id' => '1198', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9093 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13763', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '26', + 'prev_word_id' => '1218', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1038', + ), + 9094 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13764', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '27', + 'prev_word_id' => '1038', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '810', + ), + 9095 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13765', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '28', + 'prev_word_id' => '810', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1019', + ), + 9096 => + array ( + 'contentclass_attribute_id' => '306', + 'contentclass_id' => '38', + 'contentobject_id' => '167', + 'frequency' => '0', + 'id' => '13766', + 'identifier' => 'sticky', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '29', + 'prev_word_id' => '1019', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1191', + ), + 9097 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13767', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9098 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13768', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '1', + 'prev_word_id' => '1011', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1167', + ), + 9099 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13769', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '2', + 'prev_word_id' => '1167', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1192', + ), + 9100 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13770', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '3', + 'prev_word_id' => '1192', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9101 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13771', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '4', + 'prev_word_id' => '1158', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '997', + ), + 9102 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13772', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '5', + 'prev_word_id' => '997', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1198', + ), + 9103 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13773', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '6', + 'prev_word_id' => '1198', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1002', + ), + 9104 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13774', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '7', + 'prev_word_id' => '1002', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1137', + ), + 9105 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13775', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '8', + 'prev_word_id' => '1137', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1117', + ), + 9106 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13776', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '9', + 'prev_word_id' => '1117', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1146', + ), + 9107 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13777', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '10', + 'prev_word_id' => '1146', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1038', + ), + 9108 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13778', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '11', + 'prev_word_id' => '1038', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1163', + ), + 9109 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13779', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '12', + 'prev_word_id' => '1163', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1042', + ), + 9110 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13780', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '13', + 'prev_word_id' => '1042', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '989', + ), + 9111 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13781', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '14', + 'prev_word_id' => '989', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9112 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13782', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '15', + 'prev_word_id' => '1171', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1032', + ), + 9113 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13783', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '16', + 'prev_word_id' => '1032', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1045', + ), + 9114 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13784', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '17', + 'prev_word_id' => '1045', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1186', + ), + 9115 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13785', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '18', + 'prev_word_id' => '1186', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9116 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13786', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '19', + 'prev_word_id' => '1011', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9117 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13787', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '20', + 'prev_word_id' => '1144', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1101', + ), + 9118 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13788', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '21', + 'prev_word_id' => '1101', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1142', + ), + 9119 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13789', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '22', + 'prev_word_id' => '1142', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9120 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13790', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '23', + 'prev_word_id' => '1011', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1167', + ), + 9121 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13791', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '24', + 'prev_word_id' => '1167', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1192', + ), + 9122 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13792', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '25', + 'prev_word_id' => '1192', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9123 => + array ( + 'contentclass_attribute_id' => '306', + 'contentclass_id' => '38', + 'contentobject_id' => '168', + 'frequency' => '0', + 'id' => '13793', + 'identifier' => 'sticky', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '26', + 'prev_word_id' => '1158', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1191', + ), + 9124 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13794', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1035', + ), + 9125 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13795', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '1', + 'prev_word_id' => '1035', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9126 => + array ( + 'contentclass_attribute_id' => '304', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13796', + 'identifier' => 'subject', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '2', + 'prev_word_id' => '1161', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1194', + ), + 9127 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13797', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1150', + 'placement' => '3', + 'prev_word_id' => '1194', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9128 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13798', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '4', + 'prev_word_id' => '1040', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1150', + ), + 9129 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13799', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '5', + 'prev_word_id' => '1150', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1035', + ), + 9130 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13800', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '6', + 'prev_word_id' => '1035', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9131 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13801', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '7', + 'prev_word_id' => '1161', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1194', + ), + 9132 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13802', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '8', + 'prev_word_id' => '1194', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '990', + ), + 9133 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13803', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '9', + 'prev_word_id' => '990', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1089', + ), + 9134 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13804', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '10', + 'prev_word_id' => '1089', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '990', + ), + 9135 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13805', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '11', + 'prev_word_id' => '990', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9136 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13806', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '12', + 'prev_word_id' => '1011', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9137 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13807', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '13', + 'prev_word_id' => '1026', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9138 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13808', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1085', + 'placement' => '14', + 'prev_word_id' => '1001', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9139 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13809', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1086', + 'placement' => '15', + 'prev_word_id' => '1218', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1085', + ), + 9140 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13810', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1087', + 'placement' => '16', + 'prev_word_id' => '1085', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1086', + ), + 9141 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13811', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1088', + 'placement' => '17', + 'prev_word_id' => '1086', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1087', + ), + 9142 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13812', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '18', + 'prev_word_id' => '1087', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1088', + ), + 9143 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13813', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1090', + 'placement' => '19', + 'prev_word_id' => '1088', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1089', + ), + 9144 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13814', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1091', + 'placement' => '20', + 'prev_word_id' => '1089', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1090', + ), + 9145 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13815', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1092', + 'placement' => '21', + 'prev_word_id' => '1090', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1091', + ), + 9146 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13816', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1093', + 'placement' => '22', + 'prev_word_id' => '1091', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1092', + ), + 9147 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13817', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1094', + 'placement' => '23', + 'prev_word_id' => '1092', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1093', + ), + 9148 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13818', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1095', + 'placement' => '24', + 'prev_word_id' => '1093', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1094', + ), + 9149 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13819', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1096', + 'placement' => '25', + 'prev_word_id' => '1094', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1095', + ), + 9150 => + array ( + 'contentclass_attribute_id' => '305', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13820', + 'identifier' => 'message', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '26', + 'prev_word_id' => '1095', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1096', + ), + 9151 => + array ( + 'contentclass_attribute_id' => '306', + 'contentclass_id' => '38', + 'contentobject_id' => '169', + 'frequency' => '0', + 'id' => '13821', + 'identifier' => 'sticky', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '27', + 'prev_word_id' => '1096', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1191', + ), + 9152 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13822', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '2392', + ), + 9153 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '1', + 'prev_word_id' => '2392', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9154 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '2', + 'prev_word_id' => '1017', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1166', + ), + 9155 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '3', + 'prev_word_id' => '1166', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9156 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '4', + 'prev_word_id' => '1051', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9157 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '5', + 'prev_word_id' => '1001', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9158 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '6', + 'prev_word_id' => '1049', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '997', + ), + 9159 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '7', + 'prev_word_id' => '997', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1036', + ), + 9160 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '8', + 'prev_word_id' => '1036', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9161 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '9', + 'prev_word_id' => '1145', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1197', + ), + 9162 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '10', + 'prev_word_id' => '1197', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1002', + ), + 9163 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '11', + 'prev_word_id' => '1002', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1167', + ), + 9164 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '12', + 'prev_word_id' => '1167', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1050', + ), + 9165 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1193', + 'placement' => '13', + 'prev_word_id' => '1050', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1140', + ), + 9166 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '14', + 'prev_word_id' => '1140', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1193', + ), + 9167 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '15', + 'prev_word_id' => '1193', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1143', + ), + 9168 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '16', + 'prev_word_id' => '1143', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1045', + ), + 9169 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '17', + 'prev_word_id' => '1045', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1102', + ), + 9170 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '18', + 'prev_word_id' => '1102', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1052', + ), + 9171 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '19', + 'prev_word_id' => '1052', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1028', + ), + 9172 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '20', + 'prev_word_id' => '1028', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1168', + ), + 9173 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '21', + 'prev_word_id' => '1168', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1157', + ), + 9174 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '22', + 'prev_word_id' => '1157', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9175 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '23', + 'prev_word_id' => '1107', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1157', + ), + 9176 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '24', + 'prev_word_id' => '1157', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '997', + ), + 9177 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '25', + 'prev_word_id' => '997', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9178 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '26', + 'prev_word_id' => '1040', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9179 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '27', + 'prev_word_id' => '1218', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1156', + ), + 9180 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1209', + 'placement' => '28', + 'prev_word_id' => '1156', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1089', + ), + 9181 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '29', + 'prev_word_id' => '1089', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1209', + ), + 9182 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '30', + 'prev_word_id' => '1209', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9183 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '31', + 'prev_word_id' => '1013', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '994', + ), + 9184 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '32', + 'prev_word_id' => '994', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9185 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '33', + 'prev_word_id' => '1020', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1007', + ), + 9186 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '34', + 'prev_word_id' => '1007', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9187 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '35', + 'prev_word_id' => '1145', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '863', + ), + 9188 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '36', + 'prev_word_id' => '863', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1162', + ), + 9189 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '37', + 'prev_word_id' => '1162', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '863', + ), + 9190 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '38', + 'prev_word_id' => '863', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9191 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '39', + 'prev_word_id' => '1099', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1166', + ), + 9192 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '40', + 'prev_word_id' => '1166', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1119', + ), + 9193 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '41', + 'prev_word_id' => '1119', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1047', + ), + 9194 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '42', + 'prev_word_id' => '1047', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1108', + ), + 9195 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '43', + 'prev_word_id' => '1108', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1101', + ), + 9196 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '44', + 'prev_word_id' => '1101', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '988', + ), + 9197 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '45', + 'prev_word_id' => '988', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1137', + ), + 9198 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '46', + 'prev_word_id' => '1137', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '994', + ), + 9199 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '47', + 'prev_word_id' => '994', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1014', + ), + 9200 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '48', + 'prev_word_id' => '1014', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '810', + ), + 9201 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '49', + 'prev_word_id' => '810', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1203', + ), + 9202 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '50', + 'prev_word_id' => '1203', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1221', + ), + 9203 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '51', + 'prev_word_id' => '1221', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1002', + ), + 9204 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '52', + 'prev_word_id' => '1002', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1016', + ), + 9205 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '53', + 'prev_word_id' => '1016', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1156', + ), + 9206 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '54', + 'prev_word_id' => '1156', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '986', + ), + 9207 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '55', + 'prev_word_id' => '986', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9208 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '56', + 'prev_word_id' => '1013', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1037', + ), + 9209 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '57', + 'prev_word_id' => '1037', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9210 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '58', + 'prev_word_id' => '1161', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9211 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '59', + 'prev_word_id' => '1113', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9212 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '60', + 'prev_word_id' => '1107', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9213 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '61', + 'prev_word_id' => '1218', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9214 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '62', + 'prev_word_id' => '1001', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '982', + ), + 9215 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '63', + 'prev_word_id' => '982', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '991', + ), + 9216 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '64', + 'prev_word_id' => '991', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1019', + ), + 9217 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '65', + 'prev_word_id' => '1019', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9218 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '66', + 'prev_word_id' => '1017', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9219 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '67', + 'prev_word_id' => '1144', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1147', + ), + 9220 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '68', + 'prev_word_id' => '1147', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9221 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '69', + 'prev_word_id' => '1039', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9222 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '70', + 'prev_word_id' => '1011', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1187', + ), + 9223 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '71', + 'prev_word_id' => '1187', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9224 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '72', + 'prev_word_id' => '1039', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '810', + ), + 9225 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '73', + 'prev_word_id' => '810', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1139', + ), + 9226 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '74', + 'prev_word_id' => '1139', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1101', + ), + 9227 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '75', + 'prev_word_id' => '1101', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1168', + ), + 9228 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '76', + 'prev_word_id' => '1168', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9229 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '77', + 'prev_word_id' => '1113', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1031', + ), + 9230 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '78', + 'prev_word_id' => '1031', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9231 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '79', + 'prev_word_id' => '1039', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '863', + ), + 9232 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '80', + 'prev_word_id' => '863', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1239', + ), + 9233 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '81', + 'prev_word_id' => '1239', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9234 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '82', + 'prev_word_id' => '1158', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1149', + ), + 9235 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '83', + 'prev_word_id' => '1149', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1188', + ), + 9236 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '84', + 'prev_word_id' => '1188', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1103', + ), + 9237 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '85', + 'prev_word_id' => '1103', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1014', + ), + 9238 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '86', + 'prev_word_id' => '1014', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9239 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '87', + 'prev_word_id' => '1158', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '986', + ), + 9240 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '88', + 'prev_word_id' => '986', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1196', + ), + 9241 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '89', + 'prev_word_id' => '1196', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9242 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '90', + 'prev_word_id' => '1020', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9243 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '91', + 'prev_word_id' => '1017', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9244 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '92', + 'prev_word_id' => '1171', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9245 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '93', + 'prev_word_id' => '1144', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '825', + ), + 9246 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '94', + 'prev_word_id' => '825', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1019', + ), + 9247 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '95', + 'prev_word_id' => '1019', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9248 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '170', + 'frequency' => '0', + 'id' => '13918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '96', + 'prev_word_id' => '1040', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1165', + ), + 9249 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13919', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9250 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13920', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '1', + 'prev_word_id' => '1001', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '982', + ), + 9251 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '2', + 'prev_word_id' => '982', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9252 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '3', + 'prev_word_id' => '1001', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '982', + ), + 9253 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '4', + 'prev_word_id' => '982', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '991', + ), + 9254 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '5', + 'prev_word_id' => '991', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1019', + ), + 9255 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '6', + 'prev_word_id' => '1019', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9256 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '7', + 'prev_word_id' => '1017', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9257 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '8', + 'prev_word_id' => '1144', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1147', + ), + 9258 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '9', + 'prev_word_id' => '1147', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9259 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '10', + 'prev_word_id' => '1039', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9260 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '11', + 'prev_word_id' => '1011', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1187', + ), + 9261 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '12', + 'prev_word_id' => '1187', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9262 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '13', + 'prev_word_id' => '1039', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '810', + ), + 9263 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1101', + 'placement' => '14', + 'prev_word_id' => '810', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1139', + ), + 9264 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '15', + 'prev_word_id' => '1139', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1101', + ), + 9265 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '16', + 'prev_word_id' => '1101', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1168', + ), + 9266 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '17', + 'prev_word_id' => '1168', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9267 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '18', + 'prev_word_id' => '1113', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1031', + ), + 9268 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '19', + 'prev_word_id' => '1031', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9269 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '20', + 'prev_word_id' => '1039', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '863', + ), + 9270 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '21', + 'prev_word_id' => '863', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1239', + ), + 9271 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '22', + 'prev_word_id' => '1239', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9272 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '23', + 'prev_word_id' => '1158', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1149', + ), + 9273 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '24', + 'prev_word_id' => '1149', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1188', + ), + 9274 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '25', + 'prev_word_id' => '1188', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1103', + ), + 9275 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '26', + 'prev_word_id' => '1103', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1014', + ), + 9276 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '27', + 'prev_word_id' => '1014', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9277 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '28', + 'prev_word_id' => '1158', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '986', + ), + 9278 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '29', + 'prev_word_id' => '986', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1196', + ), + 9279 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '30', + 'prev_word_id' => '1196', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9280 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '31', + 'prev_word_id' => '1020', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9281 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '32', + 'prev_word_id' => '1017', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9282 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '33', + 'prev_word_id' => '1171', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9283 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '34', + 'prev_word_id' => '1144', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '825', + ), + 9284 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '35', + 'prev_word_id' => '825', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1019', + ), + 9285 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '36', + 'prev_word_id' => '1019', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9286 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '171', + 'frequency' => '0', + 'id' => '13956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '37', + 'prev_word_id' => '1040', + 'published' => '1311154200', + 'section_id' => '1', + 'word_id' => '1165', + ), + 9287 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13957', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9288 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13958', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '1', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9289 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '2', + 'prev_word_id' => '1144', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '987', + ), + 9290 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '3', + 'prev_word_id' => '987', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9291 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '4', + 'prev_word_id' => '1107', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1038', + ), + 9292 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '5', + 'prev_word_id' => '1038', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1172', + ), + 9293 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '6', + 'prev_word_id' => '1172', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9294 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '7', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9295 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '8', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1028', + ), + 9296 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '9', + 'prev_word_id' => '1028', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1105', + ), + 9297 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '10', + 'prev_word_id' => '1105', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1217', + ), + 9298 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '11', + 'prev_word_id' => '1217', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9299 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '12', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1196', + ), + 9300 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '13', + 'prev_word_id' => '1196', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9301 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '14', + 'prev_word_id' => '1013', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1143', + ), + 9302 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1019', + 'placement' => '15', + 'prev_word_id' => '1143', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9303 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '16', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1019', + ), + 9304 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '17', + 'prev_word_id' => '1019', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1100', + ), + 9305 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '18', + 'prev_word_id' => '1100', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '981', + ), + 9306 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '19', + 'prev_word_id' => '981', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1015', + ), + 9307 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '20', + 'prev_word_id' => '1015', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9308 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1005', + 'placement' => '21', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1103', + ), + 9309 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '22', + 'prev_word_id' => '1103', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1005', + ), + 9310 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '23', + 'prev_word_id' => '1005', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '982', + ), + 9311 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '24', + 'prev_word_id' => '982', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1012', + ), + 9312 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '25', + 'prev_word_id' => '1012', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9313 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '26', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9314 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '27', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9315 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1143', + 'placement' => '28', + 'prev_word_id' => '1161', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1163', + ), + 9316 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '29', + 'prev_word_id' => '1163', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1143', + ), + 9317 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '30', + 'prev_word_id' => '1143', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '983', + ), + 9318 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '31', + 'prev_word_id' => '983', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1053', + ), + 9319 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '32', + 'prev_word_id' => '1053', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1197', + ), + 9320 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '33', + 'prev_word_id' => '1197', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1168', + ), + 9321 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '34', + 'prev_word_id' => '1168', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9322 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '35', + 'prev_word_id' => '1040', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9323 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '36', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9324 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '37', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1036', + ), + 9325 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '38', + 'prev_word_id' => '1036', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1196', + ), + 9326 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '39', + 'prev_word_id' => '1196', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '999', + ), + 9327 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '40', + 'prev_word_id' => '999', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9328 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '41', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1053', + ), + 9329 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '13999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '42', + 'prev_word_id' => '1053', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '981', + ), + 9330 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '43', + 'prev_word_id' => '981', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9331 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '44', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9332 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '45', + 'prev_word_id' => '1039', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9333 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '46', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1192', + ), + 9334 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '47', + 'prev_word_id' => '1192', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1116', + ), + 9335 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '48', + 'prev_word_id' => '1116', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9336 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '49', + 'prev_word_id' => '1161', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9337 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '50', + 'prev_word_id' => '1145', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9338 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '51', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1027', + ), + 9339 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '52', + 'prev_word_id' => '1027', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1114', + ), + 9340 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '53', + 'prev_word_id' => '1114', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1164', + ), + 9341 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '54', + 'prev_word_id' => '1164', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1106', + ), + 9342 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '55', + 'prev_word_id' => '1106', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1221', + ), + 9343 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '56', + 'prev_word_id' => '1221', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9344 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '57', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1033', + ), + 9345 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '58', + 'prev_word_id' => '1033', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9346 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '59', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9347 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '60', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1053', + ), + 9348 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '61', + 'prev_word_id' => '1053', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1188', + ), + 9349 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '62', + 'prev_word_id' => '1188', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1034', + ), + 9350 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '63', + 'prev_word_id' => '1034', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1044', + ), + 9351 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '64', + 'prev_word_id' => '1044', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1033', + ), + 9352 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '65', + 'prev_word_id' => '1033', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1149', + ), + 9353 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '66', + 'prev_word_id' => '1149', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9354 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1018', + 'placement' => '67', + 'prev_word_id' => '1013', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1018', + ), + 9355 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '68', + 'prev_word_id' => '1018', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1018', + ), + 9356 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '69', + 'prev_word_id' => '1018', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1157', + ), + 9357 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '70', + 'prev_word_id' => '1157', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1006', + ), + 9358 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '71', + 'prev_word_id' => '1006', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1138', + ), + 9359 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '72', + 'prev_word_id' => '1138', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9360 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '73', + 'prev_word_id' => '1161', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '995', + ), + 9361 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '74', + 'prev_word_id' => '995', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '990', + ), + 9362 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '75', + 'prev_word_id' => '990', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9363 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '76', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '988', + ), + 9364 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '77', + 'prev_word_id' => '988', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9365 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '172', + 'frequency' => '0', + 'id' => '14035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '78', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '998', + ), + 9366 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14036', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9367 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14037', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '1', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1111', + ), + 9368 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '2', + 'prev_word_id' => '1111', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '997', + ), + 9369 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '3', + 'prev_word_id' => '997', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1052', + ), + 9370 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '4', + 'prev_word_id' => '1052', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1192', + ), + 9371 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '5', + 'prev_word_id' => '1192', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '986', + ), + 9372 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '6', + 'prev_word_id' => '986', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1035', + ), + 9373 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '7', + 'prev_word_id' => '1035', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1045', + ), + 9374 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '8', + 'prev_word_id' => '1045', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1202', + ), + 9375 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '9', + 'prev_word_id' => '1202', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1169', + ), + 9376 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '10', + 'prev_word_id' => '1169', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9377 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '11', + 'prev_word_id' => '1113', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9378 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '12', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9379 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '13', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '981', + ), + 9380 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1119', + 'placement' => '14', + 'prev_word_id' => '981', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1003', + ), + 9381 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '15', + 'prev_word_id' => '1003', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1119', + ), + 9382 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '16', + 'prev_word_id' => '1119', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9383 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '17', + 'prev_word_id' => '1040', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9384 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '18', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1003', + ), + 9385 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '19', + 'prev_word_id' => '1003', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1208', + ), + 9386 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '20', + 'prev_word_id' => '1208', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '810', + ), + 9387 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '21', + 'prev_word_id' => '810', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9388 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '22', + 'prev_word_id' => '1099', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1202', + ), + 9389 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '23', + 'prev_word_id' => '1202', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1141', + ), + 9390 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1050', + 'placement' => '24', + 'prev_word_id' => '1141', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9391 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '25', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1050', + ), + 9392 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '26', + 'prev_word_id' => '1050', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9393 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '27', + 'prev_word_id' => '1107', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1239', + ), + 9394 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1105', + 'placement' => '28', + 'prev_word_id' => '1239', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9395 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '29', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1105', + ), + 9396 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '30', + 'prev_word_id' => '1105', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '995', + ), + 9397 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '31', + 'prev_word_id' => '995', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9398 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '32', + 'prev_word_id' => '1113', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1114', + ), + 9399 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '33', + 'prev_word_id' => '1114', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9400 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '34', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1108', + ), + 9401 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '35', + 'prev_word_id' => '1108', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1194', + ), + 9402 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '36', + 'prev_word_id' => '1194', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9403 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '37', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9404 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '38', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1012', + ), + 9405 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '39', + 'prev_word_id' => '1012', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9406 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '40', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1167', + ), + 9407 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '41', + 'prev_word_id' => '1167', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9408 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '42', + 'prev_word_id' => '1099', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9409 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '43', + 'prev_word_id' => '1171', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '994', + ), + 9410 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '44', + 'prev_word_id' => '994', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1187', + ), + 9411 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '45', + 'prev_word_id' => '1187', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '996', + ), + 9412 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '46', + 'prev_word_id' => '996', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1162', + ), + 9413 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '47', + 'prev_word_id' => '1162', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1015', + ), + 9414 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '48', + 'prev_word_id' => '1015', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9415 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '49', + 'prev_word_id' => '1218', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9416 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '50', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9417 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '51', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9418 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '52', + 'prev_word_id' => '1017', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1141', + ), + 9419 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '53', + 'prev_word_id' => '1141', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1036', + ), + 9420 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '54', + 'prev_word_id' => '1036', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9421 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '55', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9422 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '56', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1010', + ), + 9423 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '57', + 'prev_word_id' => '1010', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9424 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '58', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1007', + ), + 9425 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '59', + 'prev_word_id' => '1007', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9426 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '60', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9427 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '61', + 'prev_word_id' => '1171', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1034', + ), + 9428 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '62', + 'prev_word_id' => '1034', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9429 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1217', + 'placement' => '63', + 'prev_word_id' => '1107', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '996', + ), + 9430 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1033', + 'placement' => '64', + 'prev_word_id' => '996', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1217', + ), + 9431 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '65', + 'prev_word_id' => '1217', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1033', + ), + 9432 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1111', + 'placement' => '66', + 'prev_word_id' => '1033', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9433 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '67', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1111', + ), + 9434 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '68', + 'prev_word_id' => '1111', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '994', + ), + 9435 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '69', + 'prev_word_id' => '994', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1158', + ), + 9436 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '70', + 'prev_word_id' => '1158', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9437 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '71', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '991', + ), + 9438 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '72', + 'prev_word_id' => '991', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '988', + ), + 9439 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '73', + 'prev_word_id' => '988', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9440 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '74', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9441 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '75', + 'prev_word_id' => '1040', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1010', + ), + 9442 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '999', + 'placement' => '76', + 'prev_word_id' => '1010', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1170', + ), + 9443 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '77', + 'prev_word_id' => '1170', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '999', + ), + 9444 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '78', + 'prev_word_id' => '999', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9445 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '79', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9446 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1156', + 'placement' => '80', + 'prev_word_id' => '1040', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1140', + ), + 9447 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '81', + 'prev_word_id' => '1140', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1156', + ), + 9448 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '82', + 'prev_word_id' => '1156', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9449 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '83', + 'prev_word_id' => '1145', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '998', + ), + 9450 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '84', + 'prev_word_id' => '998', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1149', + ), + 9451 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '85', + 'prev_word_id' => '1149', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1166', + ), + 9452 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '86', + 'prev_word_id' => '1166', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9453 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '87', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1187', + ), + 9454 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '88', + 'prev_word_id' => '1187', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1170', + ), + 9455 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '89', + 'prev_word_id' => '1170', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1147', + ), + 9456 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '90', + 'prev_word_id' => '1147', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1030', + ), + 9457 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '91', + 'prev_word_id' => '1030', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1006', + ), + 9458 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '92', + 'prev_word_id' => '1006', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9459 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '93', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1164', + ), + 9460 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '94', + 'prev_word_id' => '1164', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1157', + ), + 9461 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1170', + 'placement' => '95', + 'prev_word_id' => '1157', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1028', + ), + 9462 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '96', + 'prev_word_id' => '1028', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1170', + ), + 9463 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '97', + 'prev_word_id' => '1170', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1112', + ), + 9464 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '98', + 'prev_word_id' => '1112', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9465 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '99', + 'prev_word_id' => '1013', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1160', + ), + 9466 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '100', + 'prev_word_id' => '1160', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9467 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '101', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9468 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '102', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9469 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '103', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1195', + ), + 9470 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '104', + 'prev_word_id' => '1195', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1031', + ), + 9471 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '105', + 'prev_word_id' => '1031', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9472 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '106', + 'prev_word_id' => '1218', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1047', + ), + 9473 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '107', + 'prev_word_id' => '1047', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9474 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '108', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1141', + ), + 9475 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1046', + 'placement' => '109', + 'prev_word_id' => '1141', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '983', + ), + 9476 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '110', + 'prev_word_id' => '983', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1046', + ), + 9477 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '111', + 'prev_word_id' => '1046', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9478 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '173', + 'frequency' => '0', + 'id' => '14148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '112', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1164', + ), + 9479 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14149', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1202', + ), + 9480 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14150', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '1', + 'prev_word_id' => '1202', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9481 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14151', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '2', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1041', + ), + 9482 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '3', + 'prev_word_id' => '1041', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9483 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1202', + 'placement' => '4', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1045', + ), + 9484 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '5', + 'prev_word_id' => '1045', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1202', + ), + 9485 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1041', + 'placement' => '6', + 'prev_word_id' => '1202', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9486 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '7', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1041', + ), + 9487 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '8', + 'prev_word_id' => '1041', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9488 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '9', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9489 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '10', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1006', + ), + 9490 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '11', + 'prev_word_id' => '1006', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1144', + ), + 9491 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '12', + 'prev_word_id' => '1144', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '990', + ), + 9492 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '13', + 'prev_word_id' => '990', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1017', + ), + 9493 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '14', + 'prev_word_id' => '1017', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1197', + ), + 9494 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '15', + 'prev_word_id' => '1197', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1034', + ), + 9495 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '16', + 'prev_word_id' => '1034', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1042', + ), + 9496 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '17', + 'prev_word_id' => '1042', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9497 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '18', + 'prev_word_id' => '1113', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1040', + ), + 9498 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1034', + 'placement' => '19', + 'prev_word_id' => '1040', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9499 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '20', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1034', + ), + 9500 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '21', + 'prev_word_id' => '1034', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9501 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '22', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9502 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '23', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1102', + ), + 9503 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '24', + 'prev_word_id' => '1102', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9504 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '25', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1161', + ), + 9505 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1029', + 'placement' => '26', + 'prev_word_id' => '1161', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1206', + ), + 9506 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '27', + 'prev_word_id' => '1206', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1029', + ), + 9507 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '28', + 'prev_word_id' => '1029', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9508 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '29', + 'prev_word_id' => '1145', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9509 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '30', + 'prev_word_id' => '1039', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '996', + ), + 9510 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '31', + 'prev_word_id' => '996', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1147', + ), + 9511 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1139', + 'placement' => '32', + 'prev_word_id' => '1147', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1188', + ), + 9512 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '33', + 'prev_word_id' => '1188', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1139', + ), + 9513 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '34', + 'prev_word_id' => '1139', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9514 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '35', + 'prev_word_id' => '1171', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1198', + ), + 9515 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '36', + 'prev_word_id' => '1198', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1042', + ), + 9516 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '37', + 'prev_word_id' => '1042', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9517 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '38', + 'prev_word_id' => '1049', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '981', + ), + 9518 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '39', + 'prev_word_id' => '981', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1146', + ), + 9519 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '40', + 'prev_word_id' => '1146', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1157', + ), + 9520 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '41', + 'prev_word_id' => '1157', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9521 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '42', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1142', + ), + 9522 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1147', + 'placement' => '43', + 'prev_word_id' => '1142', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1159', + ), + 9523 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '44', + 'prev_word_id' => '1159', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1147', + ), + 9524 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '45', + 'prev_word_id' => '1147', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9525 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '46', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1157', + ), + 9526 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '47', + 'prev_word_id' => '1157', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9527 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '48', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9528 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '49', + 'prev_word_id' => '1013', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1038', + ), + 9529 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '50', + 'prev_word_id' => '1038', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9530 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '51', + 'prev_word_id' => '1013', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9531 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '52', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1197', + ), + 9532 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1035', + 'placement' => '53', + 'prev_word_id' => '1197', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1037', + ), + 9533 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '54', + 'prev_word_id' => '1037', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1035', + ), + 9534 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '55', + 'prev_word_id' => '1035', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '986', + ), + 9535 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '56', + 'prev_word_id' => '986', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1162', + ), + 9536 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '57', + 'prev_word_id' => '1162', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1165', + ), + 9537 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '58', + 'prev_word_id' => '1165', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9538 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '59', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1045', + ), + 9539 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1203', + 'placement' => '60', + 'prev_word_id' => '1045', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9540 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '61', + 'prev_word_id' => '1171', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1203', + ), + 9541 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '62', + 'prev_word_id' => '1203', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1013', + ), + 9542 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '63', + 'prev_word_id' => '1013', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1032', + ), + 9543 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '64', + 'prev_word_id' => '1032', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9544 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '65', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9545 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '66', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9546 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '67', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9547 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '68', + 'prev_word_id' => '1107', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '989', + ), + 9548 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '69', + 'prev_word_id' => '989', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9549 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '70', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1208', + ), + 9550 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '71', + 'prev_word_id' => '1208', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '994', + ), + 9551 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '72', + 'prev_word_id' => '994', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1199', + ), + 9552 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '73', + 'prev_word_id' => '1199', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1163', + ), + 9553 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '74', + 'prev_word_id' => '1163', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1030', + ), + 9554 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '75', + 'prev_word_id' => '1030', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1032', + ), + 9555 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '76', + 'prev_word_id' => '1032', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9556 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '77', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9557 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '78', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '985', + ), + 9558 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1163', + 'placement' => '79', + 'prev_word_id' => '985', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1189', + ), + 9559 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '80', + 'prev_word_id' => '1189', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1163', + ), + 9560 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '81', + 'prev_word_id' => '1163', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9561 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '82', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1149', + ), + 9562 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '83', + 'prev_word_id' => '1149', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9563 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1159', + 'placement' => '84', + 'prev_word_id' => '1107', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '986', + ), + 9564 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '85', + 'prev_word_id' => '986', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1159', + ), + 9565 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '86', + 'prev_word_id' => '1159', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9566 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '87', + 'prev_word_id' => '1171', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1102', + ), + 9567 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '88', + 'prev_word_id' => '1102', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9568 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '89', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9569 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '90', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '996', + ), + 9570 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '91', + 'prev_word_id' => '996', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1042', + ), + 9571 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '92', + 'prev_word_id' => '1042', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9572 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '93', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1045', + ), + 9573 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1044', + 'placement' => '94', + 'prev_word_id' => '1045', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1165', + ), + 9574 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '95', + 'prev_word_id' => '1165', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1044', + ), + 9575 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '96', + 'prev_word_id' => '1044', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '825', + ), + 9576 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '97', + 'prev_word_id' => '825', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9577 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '98', + 'prev_word_id' => '1051', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1160', + ), + 9578 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '99', + 'prev_word_id' => '1160', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1162', + ), + 9579 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '100', + 'prev_word_id' => '1162', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1197', + ), + 9580 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '101', + 'prev_word_id' => '1197', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1165', + ), + 9581 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '102', + 'prev_word_id' => '1165', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9582 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1192', + 'placement' => '103', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1187', + ), + 9583 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '104', + 'prev_word_id' => '1187', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1192', + ), + 9584 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '105', + 'prev_word_id' => '1192', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '998', + ), + 9585 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1052', + 'placement' => '106', + 'prev_word_id' => '998', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9586 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '107', + 'prev_word_id' => '1145', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1052', + ), + 9587 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '108', + 'prev_word_id' => '1052', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9588 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1036', + 'placement' => '109', + 'prev_word_id' => '1049', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1188', + ), + 9589 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1037', + 'placement' => '110', + 'prev_word_id' => '1188', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1036', + ), + 9590 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '111', + 'prev_word_id' => '1036', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1037', + ), + 9591 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '174', + 'frequency' => '0', + 'id' => '14261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '112', + 'prev_word_id' => '1037', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1221', + ), + 9592 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14262', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1047', + ), + 9593 => + array ( + 'contentclass_attribute_id' => '243', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14263', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '1', + 'prev_word_id' => '1047', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1221', + ), + 9594 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '2', + 'prev_word_id' => '1221', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1000', + ), + 9595 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '3', + 'prev_word_id' => '1000', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9596 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '990', + 'placement' => '4', + 'prev_word_id' => '1049', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1102', + ), + 9597 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '5', + 'prev_word_id' => '1102', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '990', + ), + 9598 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1116', + 'placement' => '6', + 'prev_word_id' => '990', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '995', + ), + 9599 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '7', + 'prev_word_id' => '995', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1116', + ), + 9600 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '8', + 'prev_word_id' => '1116', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1171', + ), + 9601 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '9', + 'prev_word_id' => '1171', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1117', + ), + 9602 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '10', + 'prev_word_id' => '1117', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9603 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1168', + 'placement' => '11', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9604 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '12', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1168', + ), + 9605 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '13', + 'prev_word_id' => '1168', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9606 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '14', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9607 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1108', + 'placement' => '15', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1039', + ), + 9608 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1003', + 'placement' => '16', + 'prev_word_id' => '1039', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1108', + ), + 9609 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '17', + 'prev_word_id' => '1108', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1003', + ), + 9610 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '18', + 'prev_word_id' => '1003', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1239', + ), + 9611 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '19', + 'prev_word_id' => '1239', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '989', + ), + 9612 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '20', + 'prev_word_id' => '989', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9613 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '21', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1107', + ), + 9614 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '983', + 'placement' => '22', + 'prev_word_id' => '1107', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1106', + ), + 9615 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '23', + 'prev_word_id' => '1106', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '983', + ), + 9616 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1038', + 'placement' => '24', + 'prev_word_id' => '983', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1031', + ), + 9617 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '25', + 'prev_word_id' => '1031', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1038', + ), + 9618 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '26', + 'prev_word_id' => '1038', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9619 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '27', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '996', + ), + 9620 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '28', + 'prev_word_id' => '996', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9621 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '29', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '996', + ), + 9622 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1197', + 'placement' => '30', + 'prev_word_id' => '996', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1032', + ), + 9623 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '31', + 'prev_word_id' => '1032', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1197', + ), + 9624 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '32', + 'prev_word_id' => '1197', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '825', + ), + 9625 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '33', + 'prev_word_id' => '825', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '984', + ), + 9626 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '34', + 'prev_word_id' => '984', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1043', + ), + 9627 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '35', + 'prev_word_id' => '1043', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '994', + ), + 9628 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '36', + 'prev_word_id' => '994', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1001', + ), + 9629 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '37', + 'prev_word_id' => '1001', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1113', + ), + 9630 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '38', + 'prev_word_id' => '1113', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9631 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '39', + 'prev_word_id' => '1026', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1118', + ), + 9632 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '40', + 'prev_word_id' => '1118', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1239', + ), + 9633 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '41', + 'prev_word_id' => '1239', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9634 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1221', + 'placement' => '42', + 'prev_word_id' => '1049', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1047', + ), + 9635 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1189', + 'placement' => '43', + 'prev_word_id' => '1047', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1221', + ), + 9636 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1014', + 'placement' => '44', + 'prev_word_id' => '1221', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1189', + ), + 9637 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1010', + 'placement' => '45', + 'prev_word_id' => '1189', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1014', + ), + 9638 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '46', + 'prev_word_id' => '1014', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1010', + ), + 9639 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '47', + 'prev_word_id' => '1010', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1239', + ), + 9640 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '48', + 'prev_word_id' => '1239', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9641 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1049', + 'placement' => '49', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1188', + ), + 9642 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '50', + 'prev_word_id' => '1188', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1049', + ), + 9643 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '51', + 'prev_word_id' => '1049', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1011', + ), + 9644 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '52', + 'prev_word_id' => '1011', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '863', + ), + 9645 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '53', + 'prev_word_id' => '863', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1141', + ), + 9646 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '985', + 'placement' => '54', + 'prev_word_id' => '1141', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1135', + ), + 9647 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1162', + 'placement' => '55', + 'prev_word_id' => '1135', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '985', + ), + 9648 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '56', + 'prev_word_id' => '985', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1162', + ), + 9649 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '57', + 'prev_word_id' => '1162', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '992', + ), + 9650 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '58', + 'prev_word_id' => '992', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '993', + ), + 9651 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1145', + 'placement' => '59', + 'prev_word_id' => '993', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '989', + ), + 9652 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1053', + 'placement' => '60', + 'prev_word_id' => '989', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1145', + ), + 9653 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '61', + 'prev_word_id' => '1145', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1053', + ), + 9654 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1098', + 'placement' => '62', + 'prev_word_id' => '1053', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '981', + ), + 9655 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '63', + 'prev_word_id' => '981', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1098', + ), + 9656 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '64', + 'prev_word_id' => '1098', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1218', + ), + 9657 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1002', + 'placement' => '65', + 'prev_word_id' => '1218', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9658 => + array ( + 'contentclass_attribute_id' => '244', + 'contentclass_id' => '24', + 'contentobject_id' => '175', + 'frequency' => '0', + 'id' => '14328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '66', + 'prev_word_id' => '1020', + 'published' => '1311154201', + 'section_id' => '1', + 'word_id' => '1002', + ), + 9659 => + array ( + 'contentclass_attribute_id' => '286', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14329', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '962', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '1600', + ), + 9660 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14330', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1', + 'prev_word_id' => '1600', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '962', + ), + 9661 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14331', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '2', + 'prev_word_id' => '962', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '948', + ), + 9662 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14332', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '3', + 'prev_word_id' => '948', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '949', + ), + 9663 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14333', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '2393', + 'placement' => '4', + 'prev_word_id' => '949', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '1008', + ), + 9664 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14334', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '2394', + 'placement' => '5', + 'prev_word_id' => '1008', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2393', + ), + 9665 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14335', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '6', + 'prev_word_id' => '2393', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2394', + ), + 9666 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14336', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '2395', + 'placement' => '7', + 'prev_word_id' => '2394', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '833', + ), + 9667 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14337', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '2396', + 'placement' => '8', + 'prev_word_id' => '833', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2395', + ), + 9668 => + array ( + 'contentclass_attribute_id' => '287', + 'contentclass_id' => '35', + 'contentobject_id' => '176', + 'frequency' => '0', + 'id' => '14338', + 'identifier' => 'short_description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '9', + 'prev_word_id' => '2395', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2396', + ), + 9669 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '177', + 'frequency' => '0', + 'id' => '14339', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2397', + ), + 9670 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '177', + 'frequency' => '0', + 'id' => '14340', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1', + 'prev_word_id' => '2397', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '976', + ), + 9671 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '177', + 'frequency' => '0', + 'id' => '14341', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1832', + 'placement' => '2', + 'prev_word_id' => '976', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '802', + ), + 9672 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '177', + 'frequency' => '0', + 'id' => '14342', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '3', + 'prev_word_id' => '802', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '1832', + ), + 9673 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14343', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '886', + ), + 9674 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14344', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2398', + 'placement' => '1', + 'prev_word_id' => '886', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '894', + ), + 9675 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14345', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '2', + 'prev_word_id' => '894', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2398', + ), + 9676 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14346', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '3', + 'prev_word_id' => '2398', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '816', + ), + 9677 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14347', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '4', + 'prev_word_id' => '816', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '814', + ), + 9678 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14348', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2399', + 'placement' => '5', + 'prev_word_id' => '814', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '1258', + ), + 9679 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '178', + 'frequency' => '0', + 'id' => '14349', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '6', + 'prev_word_id' => '1258', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2399', + ), + 9680 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '179', + 'frequency' => '0', + 'id' => '14350', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '1943', + ), + 9681 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '179', + 'frequency' => '0', + 'id' => '14351', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2315', + 'placement' => '1', + 'prev_word_id' => '1943', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '1259', + ), + 9682 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '179', + 'frequency' => '0', + 'id' => '14352', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2400', + 'placement' => '2', + 'prev_word_id' => '1259', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2315', + ), + 9683 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '179', + 'frequency' => '0', + 'id' => '14353', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '3', + 'prev_word_id' => '2315', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2400', + ), + 9684 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '180', + 'frequency' => '0', + 'id' => '14354', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2401', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '814', + ), + 9685 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '180', + 'frequency' => '0', + 'id' => '14355', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2402', + 'placement' => '1', + 'prev_word_id' => '814', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2401', + ), + 9686 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '180', + 'frequency' => '0', + 'id' => '14356', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '2', + 'prev_word_id' => '2401', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2402', + ), + 9687 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '180', + 'frequency' => '0', + 'id' => '14357', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2403', + 'placement' => '3', + 'prev_word_id' => '2402', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '848', + ), + 9688 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '180', + 'frequency' => '0', + 'id' => '14358', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '848', + 'published' => '1311154202', + 'section_id' => '1', + 'word_id' => '2403', + ), + 9689 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '181', + 'frequency' => '0', + 'id' => '14359', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2405', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2404', + ), + 9690 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '181', + 'frequency' => '0', + 'id' => '14360', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '1', + 'prev_word_id' => '2404', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2405', + ), + 9691 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '181', + 'frequency' => '0', + 'id' => '14361', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2406', + 'placement' => '2', + 'prev_word_id' => '2405', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '825', + ), + 9692 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '181', + 'frequency' => '0', + 'id' => '14362', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '3', + 'prev_word_id' => '825', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2406', + ), + 9693 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14363', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2407', + ), + 9694 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14364', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1', + 'prev_word_id' => '2407', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '976', + ), + 9695 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14365', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2408', + 'placement' => '2', + 'prev_word_id' => '976', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '814', + ), + 9696 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14366', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2409', + 'placement' => '3', + 'prev_word_id' => '814', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2408', + ), + 9697 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14367', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '4', + 'prev_word_id' => '2408', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2409', + ), + 9698 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14368', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2410', + 'placement' => '5', + 'prev_word_id' => '2409', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '976', + ), + 9699 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14369', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '6', + 'prev_word_id' => '976', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2410', + ), + 9700 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14370', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2411', + 'placement' => '7', + 'prev_word_id' => '2410', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '833', + ), + 9701 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '182', + 'frequency' => '0', + 'id' => '14371', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '8', + 'prev_word_id' => '833', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2411', + ), + 9702 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '183', + 'frequency' => '0', + 'id' => '14372', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2406', + ), + 9703 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '183', + 'frequency' => '0', + 'id' => '14373', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2412', + 'placement' => '1', + 'prev_word_id' => '2406', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '863', + ), + 9704 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '183', + 'frequency' => '0', + 'id' => '14374', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2413', + 'placement' => '2', + 'prev_word_id' => '863', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2412', + ), + 9705 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '183', + 'frequency' => '0', + 'id' => '14375', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2414', + 'placement' => '3', + 'prev_word_id' => '2412', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2413', + ), + 9706 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '183', + 'frequency' => '0', + 'id' => '14376', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '2413', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2414', + ), + 9707 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '184', + 'frequency' => '0', + 'id' => '14377', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2326', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2415', + ), + 9708 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '184', + 'frequency' => '0', + 'id' => '14378', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2416', + 'placement' => '1', + 'prev_word_id' => '2415', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2326', + ), + 9709 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '184', + 'frequency' => '0', + 'id' => '14379', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2222', + 'placement' => '2', + 'prev_word_id' => '2326', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2416', + ), + 9710 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '184', + 'frequency' => '0', + 'id' => '14380', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '3', + 'prev_word_id' => '2416', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2222', + ), + 9711 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '184', + 'frequency' => '0', + 'id' => '14381', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2223', + 'placement' => '4', + 'prev_word_id' => '2222', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '828', + ), + 9712 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '184', + 'frequency' => '0', + 'id' => '14382', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '5', + 'prev_word_id' => '828', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '2223', + ), + 9713 => + array ( + 'contentclass_attribute_id' => '211', + 'contentclass_id' => '19', + 'contentobject_id' => '185', + 'frequency' => '0', + 'id' => '14383', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154203', + 'section_id' => '1', + 'word_id' => '1381', + ), + 9714 => + array ( + 'contentclass_attribute_id' => '214', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14384', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2417', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '926', + ), + 9715 => + array ( + 'contentclass_attribute_id' => '214', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14385', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '1', + 'prev_word_id' => '926', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2417', + ), + 9716 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1103', + 'placement' => '2', + 'prev_word_id' => '2417', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9717 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '3', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1103', + ), + 9718 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '4', + 'prev_word_id' => '1103', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9719 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '5', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9720 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '6', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9721 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '7', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9722 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '8', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9723 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '9', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9724 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '10', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9725 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '11', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9726 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '12', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9727 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '13', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9728 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '14', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9729 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '15', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9730 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '16', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9731 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '17', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9732 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '18', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9733 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '19', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9734 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '20', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9735 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '21', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9736 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '22', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9737 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '23', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9738 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '24', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9739 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '25', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9740 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '26', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9741 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '27', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9742 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '28', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9743 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '29', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9744 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '30', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9745 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '31', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9746 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '32', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9747 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '33', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9748 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '34', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9749 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '35', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9750 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '36', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9751 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '37', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9752 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '38', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9753 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14423', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '39', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9754 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14424', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '40', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9755 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14425', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '41', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9756 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14426', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '42', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9757 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14427', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '43', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9758 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14428', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '44', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9759 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14429', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '45', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9760 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '46', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9761 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '47', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9762 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '48', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9763 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '49', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9764 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '50', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9765 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '51', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9766 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '52', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9767 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '53', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9768 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '54', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9769 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '55', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9770 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '56', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9771 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '57', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9772 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '58', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9773 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '59', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9774 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '60', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9775 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '61', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9776 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '62', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9777 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '63', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9778 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '64', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9779 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '65', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9780 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '66', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9781 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '67', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9782 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '68', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9783 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '69', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9784 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '70', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9785 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '71', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9786 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '72', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9787 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '73', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9788 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '74', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9789 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '75', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9790 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '76', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9791 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '77', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9792 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '78', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9793 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '79', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9794 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '80', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9795 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '81', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9796 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '82', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9797 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '83', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9798 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '84', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9799 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '85', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9800 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '86', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9801 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '87', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9802 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '88', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9803 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '89', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9804 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '90', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9805 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '91', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9806 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '92', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9807 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '93', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9808 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '94', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9809 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '95', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9810 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '96', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9811 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '97', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9812 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '98', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9813 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '99', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9814 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '100', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9815 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '101', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9816 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '102', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9817 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '103', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9818 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '104', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9819 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '105', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9820 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '106', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9821 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '107', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9822 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '108', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9823 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '109', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9824 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '110', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9825 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '111', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9826 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '112', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9827 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '113', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9828 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '114', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9829 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '115', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9830 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '116', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9831 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '117', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9832 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '118', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9833 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '119', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9834 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '120', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9835 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '121', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9836 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '122', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9837 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '123', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9838 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '124', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9839 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '125', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9840 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '126', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9841 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '127', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9842 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '128', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9843 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '129', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9844 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '130', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9845 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '131', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9846 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '132', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9847 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '133', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9848 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '134', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9849 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '135', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9850 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2419', + 'placement' => '136', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9851 => + array ( + 'contentclass_attribute_id' => '216', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14521', + 'identifier' => 'publication_date', + 'integer_value' => '1193915460', + 'next_word_id' => '1191', + 'placement' => '137', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2419', + ), + 9852 => + array ( + 'contentclass_attribute_id' => '217', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14522', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '2420', + 'placement' => '138', + 'prev_word_id' => '2419', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1191', + ), + 9853 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14523', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '2421', + 'placement' => '139', + 'prev_word_id' => '1191', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2420', + ), + 9854 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14524', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '2422', + 'placement' => '140', + 'prev_word_id' => '2420', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2421', + ), + 9855 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14525', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '858', + 'placement' => '141', + 'prev_word_id' => '2421', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2422', + ), + 9856 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14526', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '2423', + 'placement' => '142', + 'prev_word_id' => '2422', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '858', + ), + 9857 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14527', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '143', + 'prev_word_id' => '858', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2423', + ), + 9858 => + array ( + 'contentclass_attribute_id' => '219', + 'contentclass_id' => '20', + 'contentobject_id' => '186', + 'frequency' => '0', + 'id' => '14528', + 'identifier' => 'enable_comments', + 'integer_value' => '1', + 'next_word_id' => '0', + 'placement' => '144', + 'prev_word_id' => '2423', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1070', + ), + 9859 => + array ( + 'contentclass_attribute_id' => '214', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14529', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2417', + ), + 9860 => + array ( + 'contentclass_attribute_id' => '214', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14530', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2424', + 'placement' => '1', + 'prev_word_id' => '2417', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 9861 => + array ( + 'contentclass_attribute_id' => '214', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14531', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '2', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2424', + ), + 9862 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '3', + 'prev_word_id' => '2424', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9863 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '4', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9864 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '5', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9865 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '6', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9866 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '7', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9867 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '8', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9868 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '9', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9869 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '10', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9870 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '11', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9871 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '12', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9872 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '13', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9873 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '14', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9874 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '15', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9875 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '16', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9876 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '17', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9877 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '18', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9878 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '19', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9879 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '20', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9880 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '21', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9881 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '22', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9882 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '23', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9883 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '24', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9884 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '25', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9885 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '26', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9886 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '27', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9887 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '28', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9888 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '29', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9889 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '30', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9890 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '31', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9891 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '32', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9892 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '33', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9893 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '34', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9894 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '35', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9895 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '36', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9896 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '37', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9897 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '38', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9898 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '39', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9899 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '40', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9900 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '41', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9901 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '42', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9902 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '43', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9903 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '44', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9904 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '45', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9905 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '46', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9906 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '47', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9907 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '48', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9908 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '49', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9909 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '50', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9910 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '51', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9911 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '52', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9912 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '53', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9913 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '54', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9914 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '55', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9915 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '56', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9916 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '57', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9917 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '58', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9918 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '59', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9919 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '60', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9920 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '61', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9921 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '62', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9922 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '63', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9923 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '64', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9924 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '65', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9925 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '66', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9926 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '67', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9927 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '68', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9928 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '69', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9929 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '70', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9930 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '71', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9931 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '72', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9932 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '73', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9933 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '74', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9934 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '75', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9935 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '76', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9936 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '77', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9937 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '78', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9938 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '79', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9939 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '80', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9940 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '81', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9941 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '82', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9942 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '83', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9943 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '84', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9944 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '85', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9945 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '86', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9946 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '87', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9947 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '88', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9948 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '89', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9949 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '90', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9950 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '91', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9951 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '92', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9952 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '93', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9953 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '94', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9954 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '95', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9955 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '96', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9956 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '97', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9957 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '98', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9958 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '99', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9959 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '100', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9960 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '101', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9961 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '102', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9962 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '103', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9963 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '104', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9964 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '105', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9965 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '106', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9966 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '107', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9967 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '108', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9968 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '109', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9969 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '110', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9970 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '111', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9971 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '112', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9972 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '113', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9973 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '114', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9974 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '115', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9975 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '116', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9976 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1051', + 'placement' => '117', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9977 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2418', + 'placement' => '118', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1051', + ), + 9978 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '119', + 'prev_word_id' => '1051', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2418', + ), + 9979 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '992', + 'placement' => '120', + 'prev_word_id' => '2418', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 9980 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '993', + 'placement' => '121', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '992', + ), + 9981 => + array ( + 'contentclass_attribute_id' => '215', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2425', + 'placement' => '122', + 'prev_word_id' => '992', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '993', + ), + 9982 => + array ( + 'contentclass_attribute_id' => '216', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14652', + 'identifier' => 'publication_date', + 'integer_value' => '1193915580', + 'next_word_id' => '1191', + 'placement' => '123', + 'prev_word_id' => '993', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2425', + ), + 9983 => + array ( + 'contentclass_attribute_id' => '217', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14653', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '2424', + 'placement' => '124', + 'prev_word_id' => '2425', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1191', + ), + 9984 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14654', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '2420', + 'placement' => '125', + 'prev_word_id' => '1191', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2424', + ), + 9985 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14655', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '2421', + 'placement' => '126', + 'prev_word_id' => '2424', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2420', + ), + 9986 => + array ( + 'contentclass_attribute_id' => '218', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14656', + 'identifier' => 'tags', + 'integer_value' => '0', + 'next_word_id' => '1070', + 'placement' => '127', + 'prev_word_id' => '2420', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2421', + ), + 9987 => + array ( + 'contentclass_attribute_id' => '219', + 'contentclass_id' => '20', + 'contentobject_id' => '187', + 'frequency' => '0', + 'id' => '14657', + 'identifier' => 'enable_comments', + 'integer_value' => '1', + 'next_word_id' => '0', + 'placement' => '128', + 'prev_word_id' => '2421', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1070', + ), + 9988 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14658', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2426', + ), + 9989 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14659', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1042', + 'placement' => '1', + 'prev_word_id' => '2426', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '981', + ), + 9990 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14660', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '2', + 'prev_word_id' => '981', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1042', + ), + 9991 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14661', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '3', + 'prev_word_id' => '1042', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1141', + ), + 9992 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14662', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '4', + 'prev_word_id' => '1141', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1172', + ), + 9993 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14663', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '5', + 'prev_word_id' => '1172', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1020', + ), + 9994 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14664', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '6', + 'prev_word_id' => '1020', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1208', + ), + 9995 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14665', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '7', + 'prev_word_id' => '1208', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1026', + ), + 9996 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14666', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '8', + 'prev_word_id' => '1026', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '810', + ), + 9997 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14667', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '9', + 'prev_word_id' => '810', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '996', + ), + 9998 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14668', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '10', + 'prev_word_id' => '996', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '997', + ), + 9999 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14669', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '11', + 'prev_word_id' => '997', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1169', + ), + 10000 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14670', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '12', + 'prev_word_id' => '1169', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1112', + ), + 10001 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14671', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '13', + 'prev_word_id' => '1112', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1157', + ), + 10002 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14672', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '984', + 'placement' => '14', + 'prev_word_id' => '1157', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1026', + ), + 10003 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14673', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '15', + 'prev_word_id' => '1026', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '984', + ), + 10004 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14674', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '16', + 'prev_word_id' => '984', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1174', + ), + 10005 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14675', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1176', + 'placement' => '17', + 'prev_word_id' => '1174', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1175', + ), + 10006 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14676', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1177', + 'placement' => '18', + 'prev_word_id' => '1175', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1176', + ), + 10007 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14677', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1178', + 'placement' => '19', + 'prev_word_id' => '1176', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1177', + ), + 10008 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14678', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1179', + 'placement' => '20', + 'prev_word_id' => '1177', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1178', + ), + 10009 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14679', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1180', + 'placement' => '21', + 'prev_word_id' => '1178', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1179', + ), + 10010 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14680', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '22', + 'prev_word_id' => '1179', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1180', + ), + 10011 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14681', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1182', + 'placement' => '23', + 'prev_word_id' => '1180', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1181', + ), + 10012 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14682', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1183', + 'placement' => '24', + 'prev_word_id' => '1181', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1182', + ), + 10013 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14683', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1181', + 'placement' => '25', + 'prev_word_id' => '1182', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1183', + ), + 10014 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14684', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1184', + 'placement' => '26', + 'prev_word_id' => '1183', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1181', + ), + 10015 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14685', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1185', + 'placement' => '27', + 'prev_word_id' => '1181', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1184', + ), + 10016 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14686', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '28', + 'prev_word_id' => '1184', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1185', + ), + 10017 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14687', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '29', + 'prev_word_id' => '1185', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 10018 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14688', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '30', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '982', + ), + 10019 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14689', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '31', + 'prev_word_id' => '982', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1160', + ), + 10020 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14690', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '32', + 'prev_word_id' => '1160', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1208', + ), + 10021 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14691', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1039', + 'placement' => '33', + 'prev_word_id' => '1208', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '997', + ), + 10022 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14692', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '34', + 'prev_word_id' => '997', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1039', + ), + 10023 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14693', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '35', + 'prev_word_id' => '1039', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1012', + ), + 10024 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14694', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '36', + 'prev_word_id' => '1012', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1165', + ), + 10025 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14695', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '991', + 'placement' => '37', + 'prev_word_id' => '1165', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '810', + ), + 10026 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14696', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '38', + 'prev_word_id' => '810', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '991', + ), + 10027 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14697', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1118', + 'placement' => '39', + 'prev_word_id' => '991', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 10028 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14698', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '40', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1118', + ), + 10029 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14699', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '41', + 'prev_word_id' => '1118', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1015', + ), + 10030 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14700', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '42', + 'prev_word_id' => '1015', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 10031 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14701', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '43', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1220', + ), + 10032 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14702', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '44', + 'prev_word_id' => '1220', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1117', + ), + 10033 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14703', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '45', + 'prev_word_id' => '1117', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1027', + ), + 10034 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14704', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '46', + 'prev_word_id' => '1027', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1188', + ), + 10035 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14705', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1240', + 'placement' => '47', + 'prev_word_id' => '1188', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1144', + ), + 10036 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14706', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '48', + 'prev_word_id' => '1144', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1240', + ), + 10037 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14707', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1007', + 'placement' => '49', + 'prev_word_id' => '1240', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1149', + ), + 10038 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14708', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1043', + 'placement' => '50', + 'prev_word_id' => '1149', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1007', + ), + 10039 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14709', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1113', + 'placement' => '51', + 'prev_word_id' => '1007', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1043', + ), + 10040 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14710', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '52', + 'prev_word_id' => '1043', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1113', + ), + 10041 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14711', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1239', + 'placement' => '53', + 'prev_word_id' => '1113', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1089', + ), + 10042 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14712', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1218', + 'placement' => '54', + 'prev_word_id' => '1089', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1239', + ), + 10043 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14713', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1164', + 'placement' => '55', + 'prev_word_id' => '1239', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1218', + ), + 10044 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14714', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '56', + 'prev_word_id' => '1218', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1164', + ), + 10045 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14715', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '989', + 'placement' => '57', + 'prev_word_id' => '1164', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '825', + ), + 10046 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14716', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '58', + 'prev_word_id' => '825', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '989', + ), + 10047 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14717', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '59', + 'prev_word_id' => '989', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1026', + ), + 10048 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14718', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '60', + 'prev_word_id' => '1026', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 10049 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14719', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '61', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1102', + ), + 10050 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14720', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '62', + 'prev_word_id' => '1102', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1188', + ), + 10051 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14721', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '63', + 'prev_word_id' => '1188', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '986', + ), + 10052 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14722', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '64', + 'prev_word_id' => '986', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1146', + ), + 10053 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14723', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '65', + 'prev_word_id' => '1146', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1206', + ), + 10054 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14724', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '66', + 'prev_word_id' => '1206', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1026', + ), + 10055 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14725', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '67', + 'prev_word_id' => '1026', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '810', + ), + 10056 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14726', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '68', + 'prev_word_id' => '810', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '996', + ), + 10057 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14727', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1175', + 'placement' => '69', + 'prev_word_id' => '996', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1174', + ), + 10058 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14728', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '997', + 'placement' => '70', + 'prev_word_id' => '1174', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1175', + ), + 10059 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14729', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '71', + 'prev_word_id' => '1175', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '997', + ), + 10060 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14730', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1112', + 'placement' => '72', + 'prev_word_id' => '997', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1169', + ), + 10061 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14731', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '73', + 'prev_word_id' => '1169', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1112', + ), + 10062 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14732', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '74', + 'prev_word_id' => '1112', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1157', + ), + 10063 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14733', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '75', + 'prev_word_id' => '1157', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1172', + ), + 10064 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14734', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '76', + 'prev_word_id' => '1172', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1020', + ), + 10065 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14735', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1026', + 'placement' => '77', + 'prev_word_id' => '1020', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1208', + ), + 10066 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14736', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '78', + 'prev_word_id' => '1208', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1026', + ), + 10067 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14737', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1102', + 'placement' => '79', + 'prev_word_id' => '1026', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 10068 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14738', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '80', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1102', + ), + 10069 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14739', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '81', + 'prev_word_id' => '1102', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1188', + ), + 10070 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14740', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '82', + 'prev_word_id' => '1188', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '986', + ), + 10071 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14741', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1206', + 'placement' => '83', + 'prev_word_id' => '986', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1146', + ), + 10072 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14742', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1220', + 'placement' => '84', + 'prev_word_id' => '1146', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1206', + ), + 10073 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14743', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1117', + 'placement' => '85', + 'prev_word_id' => '1206', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1220', + ), + 10074 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14744', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1027', + 'placement' => '86', + 'prev_word_id' => '1220', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1117', + ), + 10075 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14745', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1188', + 'placement' => '87', + 'prev_word_id' => '1117', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1027', + ), + 10076 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14746', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1144', + 'placement' => '88', + 'prev_word_id' => '1027', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1188', + ), + 10077 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14747', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1114', + 'placement' => '89', + 'prev_word_id' => '1188', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1144', + ), + 10078 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14748', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '90', + 'prev_word_id' => '1144', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1114', + ), + 10079 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14749', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1015', + 'placement' => '91', + 'prev_word_id' => '1114', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1186', + ), + 10080 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14750', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1016', + 'placement' => '92', + 'prev_word_id' => '1186', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1015', + ), + 10081 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14751', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '93', + 'prev_word_id' => '1015', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1016', + ), + 10082 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14752', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '94', + 'prev_word_id' => '1016', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1047', + ), + 10083 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14753', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1199', + 'placement' => '95', + 'prev_word_id' => '1047', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '982', + ), + 10084 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14754', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '96', + 'prev_word_id' => '982', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1199', + ), + 10085 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14755', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '97', + 'prev_word_id' => '1199', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1040', + ), + 10086 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14756', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '98', + 'prev_word_id' => '1040', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1001', + ), + 10087 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14757', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1149', + 'placement' => '99', + 'prev_word_id' => '1001', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1000', + ), + 10088 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14758', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '100', + 'prev_word_id' => '1000', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1149', + ), + 10089 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14759', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '101', + 'prev_word_id' => '1149', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1045', + ), + 10090 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14760', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1160', + 'placement' => '102', + 'prev_word_id' => '1045', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '995', + ), + 10091 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14761', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '103', + 'prev_word_id' => '995', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1160', + ), + 10092 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14762', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '104', + 'prev_word_id' => '1160', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1011', + ), + 10093 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14763', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1089', + 'placement' => '105', + 'prev_word_id' => '1011', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1146', + ), + 10094 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14764', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1157', + 'placement' => '106', + 'prev_word_id' => '1146', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1089', + ), + 10095 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14765', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1135', + 'placement' => '107', + 'prev_word_id' => '1089', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1157', + ), + 10096 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14766', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '108', + 'prev_word_id' => '1157', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1135', + ), + 10097 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14767', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1161', + 'placement' => '109', + 'prev_word_id' => '1135', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1011', + ), + 10098 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14768', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1040', + 'placement' => '110', + 'prev_word_id' => '1011', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1161', + ), + 10099 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14769', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1000', + 'placement' => '111', + 'prev_word_id' => '1161', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1040', + ), + 10100 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14770', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '112', + 'prev_word_id' => '1040', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1000', + ), + 10101 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14771', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '113', + 'prev_word_id' => '1000', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '998', + ), + 10102 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14772', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1030', + 'placement' => '114', + 'prev_word_id' => '998', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1198', + ), + 10103 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14773', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1110', + 'placement' => '115', + 'prev_word_id' => '1198', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1030', + ), + 10104 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14774', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '116', + 'prev_word_id' => '1030', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1110', + ), + 10105 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14775', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '117', + 'prev_word_id' => '1110', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '995', + ), + 10106 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14776', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1011', + 'placement' => '118', + 'prev_word_id' => '995', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1028', + ), + 10107 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14777', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1141', + 'placement' => '119', + 'prev_word_id' => '1028', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1011', + ), + 10108 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14778', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '120', + 'prev_word_id' => '1011', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1141', + ), + 10109 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14779', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '121', + 'prev_word_id' => '1141', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '987', + ), + 10110 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14780', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1012', + 'placement' => '122', + 'prev_word_id' => '987', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1001', + ), + 10111 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14781', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '123', + 'prev_word_id' => '1001', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1012', + ), + 10112 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14782', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '124', + 'prev_word_id' => '1012', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1047', + ), + 10113 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14783', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1099', + 'placement' => '125', + 'prev_word_id' => '1047', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 10114 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14784', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1107', + 'placement' => '126', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1099', + ), + 10115 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14785', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '996', + 'placement' => '127', + 'prev_word_id' => '1099', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1107', + ), + 10116 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14786', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1165', + 'placement' => '128', + 'prev_word_id' => '1107', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '996', + ), + 10117 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14787', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1140', + 'placement' => '129', + 'prev_word_id' => '996', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1165', + ), + 10118 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14788', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1172', + 'placement' => '130', + 'prev_word_id' => '1165', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1140', + ), + 10119 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14789', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1138', + 'placement' => '131', + 'prev_word_id' => '1140', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1172', + ), + 10120 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14790', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1031', + 'placement' => '132', + 'prev_word_id' => '1172', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1138', + ), + 10121 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14791', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1106', + 'placement' => '133', + 'prev_word_id' => '1138', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1031', + ), + 10122 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14792', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1137', + 'placement' => '134', + 'prev_word_id' => '1031', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1106', + ), + 10123 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14793', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1186', + 'placement' => '135', + 'prev_word_id' => '1106', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1137', + ), + 10124 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14794', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '987', + 'placement' => '136', + 'prev_word_id' => '1137', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1186', + ), + 10125 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14795', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1171', + 'placement' => '137', + 'prev_word_id' => '1186', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '987', + ), + 10126 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14796', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '138', + 'prev_word_id' => '987', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1171', + ), + 10127 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14797', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1013', + 'placement' => '139', + 'prev_word_id' => '1171', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1032', + ), + 10128 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14798', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1208', + 'placement' => '140', + 'prev_word_id' => '1032', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1013', + ), + 10129 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14799', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1187', + 'placement' => '141', + 'prev_word_id' => '1013', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1208', + ), + 10130 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14800', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1028', + 'placement' => '142', + 'prev_word_id' => '1208', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1187', + ), + 10131 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14801', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '143', + 'prev_word_id' => '1187', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1028', + ), + 10132 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14802', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '986', + 'placement' => '144', + 'prev_word_id' => '1028', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1001', + ), + 10133 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14803', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1032', + 'placement' => '145', + 'prev_word_id' => '1001', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '986', + ), + 10134 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14804', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1100', + 'placement' => '146', + 'prev_word_id' => '986', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1032', + ), + 10135 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14805', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '995', + 'placement' => '147', + 'prev_word_id' => '1032', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1100', + ), + 10136 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14806', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1166', + 'placement' => '148', + 'prev_word_id' => '1100', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '995', + ), + 10137 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14807', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1020', + 'placement' => '149', + 'prev_word_id' => '995', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1166', + ), + 10138 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14808', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1146', + 'placement' => '150', + 'prev_word_id' => '1166', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1020', + ), + 10139 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14809', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '151', + 'prev_word_id' => '1020', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1146', + ), + 10140 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14810', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '988', + 'placement' => '152', + 'prev_word_id' => '1146', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '810', + ), + 10141 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14811', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '153', + 'prev_word_id' => '810', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '988', + ), + 10142 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14812', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1169', + 'placement' => '154', + 'prev_word_id' => '988', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '863', + ), + 10143 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14813', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1196', + 'placement' => '155', + 'prev_word_id' => '863', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1169', + ), + 10144 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14814', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1006', + 'placement' => '156', + 'prev_word_id' => '1169', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1196', + ), + 10145 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14815', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1001', + 'placement' => '157', + 'prev_word_id' => '1196', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1006', + ), + 10146 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14816', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '994', + 'placement' => '158', + 'prev_word_id' => '1006', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1001', + ), + 10147 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14817', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1045', + 'placement' => '159', + 'prev_word_id' => '1001', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '994', + ), + 10148 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14818', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '998', + 'placement' => '160', + 'prev_word_id' => '994', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1045', + ), + 10149 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14819', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '161', + 'prev_word_id' => '1045', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '998', + ), + 10150 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14820', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1167', + 'placement' => '162', + 'prev_word_id' => '998', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1047', + ), + 10151 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14821', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1195', + 'placement' => '163', + 'prev_word_id' => '1047', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1167', + ), + 10152 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14822', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1158', + 'placement' => '164', + 'prev_word_id' => '1167', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1195', + ), + 10153 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14823', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1047', + 'placement' => '165', + 'prev_word_id' => '1195', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1158', + ), + 10154 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14824', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '166', + 'prev_word_id' => '1158', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1047', + ), + 10155 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14825', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1142', + 'placement' => '167', + 'prev_word_id' => '1047', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '825', + ), + 10156 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14826', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '168', + 'prev_word_id' => '825', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1142', + ), + 10157 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14827', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1194', + 'placement' => '169', + 'prev_word_id' => '1142', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '825', + ), + 10158 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14828', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1198', + 'placement' => '170', + 'prev_word_id' => '825', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1194', + ), + 10159 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14829', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '1017', + 'placement' => '171', + 'prev_word_id' => '1194', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1198', + ), + 10160 => + array ( + 'contentclass_attribute_id' => '156', + 'contentclass_id' => '1', + 'contentobject_id' => '188', + 'frequency' => '0', + 'id' => '14830', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '172', + 'prev_word_id' => '1198', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '1017', + ), + 10161 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '189', + 'frequency' => '0', + 'id' => '14831', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2426', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '923', + ), + 10162 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '189', + 'frequency' => '0', + 'id' => '14832', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '923', + 'published' => '1311154204', + 'section_id' => '1', + 'word_id' => '2426', + ), + 10163 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '190', + 'frequency' => '0', + 'id' => '14833', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '929', + ), + 10164 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '190', + 'frequency' => '0', + 'id' => '14834', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '929', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1370', + ), + 10165 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14835', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2427', + ), + 10166 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14836', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '1', + 'prev_word_id' => '2427', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10167 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14837', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '2', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '948', + ), + 10168 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14838', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '3', + 'prev_word_id' => '948', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10169 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14839', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '4', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10170 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14840', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '5', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10171 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14841', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '6', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10172 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14842', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '7', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1808', + ), + 10173 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14843', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '8', + 'prev_word_id' => '1808', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1366', + ), + 10174 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14844', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '9', + 'prev_word_id' => '1366', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10175 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14845', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '10', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1384', + ), + 10176 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14846', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '11', + 'prev_word_id' => '1384', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10177 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14847', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '925', + 'placement' => '12', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '831', + ), + 10178 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14848', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '13', + 'prev_word_id' => '831', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '925', + ), + 10179 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14849', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '14', + 'prev_word_id' => '925', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '978', + ), + 10180 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14850', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '15', + 'prev_word_id' => '978', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10181 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14851', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2225', + 'placement' => '16', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10182 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14852', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1535', + 'placement' => '17', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2225', + ), + 10183 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14853', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2428', + 'placement' => '18', + 'prev_word_id' => '2225', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1535', + ), + 10184 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14854', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '19', + 'prev_word_id' => '1535', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2428', + ), + 10185 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14855', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2429', + 'placement' => '20', + 'prev_word_id' => '2428', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1317', + ), + 10186 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14856', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '21', + 'prev_word_id' => '1317', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2429', + ), + 10187 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14857', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '22', + 'prev_word_id' => '2429', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1790', + ), + 10188 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14858', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '23', + 'prev_word_id' => '1790', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10189 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14859', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '24', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '978', + ), + 10190 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14860', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2430', + 'placement' => '25', + 'prev_word_id' => '978', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10191 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14861', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '26', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2430', + ), + 10192 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14862', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '27', + 'prev_word_id' => '2430', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10193 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14863', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2431', + 'placement' => '28', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1317', + ), + 10194 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14864', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '29', + 'prev_word_id' => '1317', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2431', + ), + 10195 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14865', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2432', + 'placement' => '30', + 'prev_word_id' => '2431', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10196 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14866', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2433', + 'placement' => '31', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2432', + ), + 10197 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14867', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1956', + 'placement' => '32', + 'prev_word_id' => '2432', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2433', + ), + 10198 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14868', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '33', + 'prev_word_id' => '2433', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1956', + ), + 10199 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14869', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '34', + 'prev_word_id' => '1956', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10200 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14870', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '35', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10201 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14871', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '36', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '37', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1790', + ), + 10203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '38', + 'prev_word_id' => '1790', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '39', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '40', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '41', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '42', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '922', + 'placement' => '43', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '44', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '922', + ), + 10210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '45', + 'prev_word_id' => '922', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2434', + 'placement' => '46', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '47', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2434', + ), + 10213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1693', + 'placement' => '48', + 'prev_word_id' => '2434', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '49', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1693', + ), + 10215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '50', + 'prev_word_id' => '1693', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2435', + 'placement' => '51', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2436', + 'placement' => '52', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2435', + ), + 10218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '53', + 'prev_word_id' => '2435', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2436', + ), + 10219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '54', + 'prev_word_id' => '2436', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1008', + ), + 10220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '55', + 'prev_word_id' => '1008', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '56', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '57', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '58', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1749', + ), + 10224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '59', + 'prev_word_id' => '1749', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '60', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1342', + ), + 10226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '61', + 'prev_word_id' => '1342', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '62', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '63', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1358', + ), + 10229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '64', + 'prev_word_id' => '1358', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '65', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '66', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1517', + ), + 10232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2437', + 'placement' => '67', + 'prev_word_id' => '1517', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1336', + ), + 10233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '68', + 'prev_word_id' => '1336', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2437', + ), + 10234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '69', + 'prev_word_id' => '2437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1410', + ), + 10235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1868', + 'placement' => '70', + 'prev_word_id' => '1410', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1869', + 'placement' => '71', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1868', + ), + 10237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1870', + 'placement' => '72', + 'prev_word_id' => '1868', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1869', + ), + 10238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '73', + 'prev_word_id' => '1869', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1870', + ), + 10239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '962', + 'placement' => '74', + 'prev_word_id' => '1870', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '75', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '962', + ), + 10241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '76', + 'prev_word_id' => '962', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2251', + 'placement' => '77', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '78', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2251', + ), + 10244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '79', + 'prev_word_id' => '2251', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2438', + 'placement' => '80', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2437', + 'placement' => '81', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2438', + ), + 10247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '82', + 'prev_word_id' => '2438', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2437', + ), + 10248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '83', + 'prev_word_id' => '2437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1410', + ), + 10249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '84', + 'prev_word_id' => '1410', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2439', + 'placement' => '85', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1728', + ), + 10251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '86', + 'prev_word_id' => '1728', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2439', + ), + 10252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2440', + 'placement' => '87', + 'prev_word_id' => '2439', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '88', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2440', + ), + 10254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '922', + 'placement' => '89', + 'prev_word_id' => '2440', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1443', + ), + 10255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '90', + 'prev_word_id' => '1443', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '922', + ), + 10256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '91', + 'prev_word_id' => '922', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1693', + 'placement' => '92', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '93', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1693', + ), + 10259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '94', + 'prev_word_id' => '1693', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2441', + 'placement' => '95', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '96', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2441', + ), + 10262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2442', + 'placement' => '97', + 'prev_word_id' => '2441', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2190', + 'placement' => '98', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2442', + ), + 10264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '99', + 'prev_word_id' => '2442', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2190', + ), + 10265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2443', + 'placement' => '100', + 'prev_word_id' => '2190', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '101', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2443', + ), + 10267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '102', + 'prev_word_id' => '2443', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '103', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1410', + ), + 10269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '104', + 'prev_word_id' => '1410', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2191', + 'placement' => '105', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '106', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2191', + ), + 10272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '107', + 'prev_word_id' => '2191', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '108', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1855', + 'placement' => '109', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '110', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1855', + ), + 10276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '111', + 'prev_word_id' => '1855', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1008', + ), + 10277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '112', + 'prev_word_id' => '1008', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '113', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '114', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '115', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '116', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 10282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '117', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1808', + ), + 10283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2444', + 'placement' => '118', + 'prev_word_id' => '1808', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '119', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2444', + ), + 10285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2435', + 'placement' => '120', + 'prev_word_id' => '2444', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '121', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2435', + ), + 10287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '122', + 'prev_word_id' => '2435', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1848', + ), + 10288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2444', + 'placement' => '123', + 'prev_word_id' => '1848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '124', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2444', + ), + 10290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '125', + 'prev_word_id' => '2444', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1480', + 'placement' => '126', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '127', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1480', + ), + 10293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '128', + 'prev_word_id' => '1480', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '129', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1848', + ), + 10295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2445', + 'placement' => '130', + 'prev_word_id' => '1848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2026', + 'placement' => '131', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2445', + ), + 10297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '132', + 'prev_word_id' => '2445', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2026', + ), + 10298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2446', + 'placement' => '133', + 'prev_word_id' => '2026', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '134', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2446', + ), + 10300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2447', + 'placement' => '135', + 'prev_word_id' => '2446', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '136', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2447', + ), + 10302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '137', + 'prev_word_id' => '2447', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '138', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '906', + ), + 10304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '139', + 'prev_word_id' => '906', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '917', + ), + 10305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '140', + 'prev_word_id' => '917', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '141', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 10307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1613', + 'placement' => '142', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '822', + ), + 10308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2448', + 'placement' => '143', + 'prev_word_id' => '822', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1613', + ), + 10309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '144', + 'prev_word_id' => '1613', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2448', + ), + 10310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '962', + 'placement' => '145', + 'prev_word_id' => '2448', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1839', + ), + 10311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '146', + 'prev_word_id' => '1839', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '962', + ), + 10312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '147', + 'prev_word_id' => '962', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '148', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1752', + 'placement' => '149', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1318', + ), + 10315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '150', + 'prev_word_id' => '1318', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1752', + ), + 10316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '151', + 'prev_word_id' => '1752', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '152', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2449', + 'placement' => '153', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2450', + 'placement' => '154', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2449', + ), + 10320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '155', + 'prev_word_id' => '2449', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2450', + ), + 10321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '156', + 'prev_word_id' => '2450', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '157', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1404', + ), + 10323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '158', + 'prev_word_id' => '1404', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '976', + ), + 10324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '159', + 'prev_word_id' => '976', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1404', + ), + 10325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '160', + 'prev_word_id' => '1404', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1808', + ), + 10326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2451', + 'placement' => '161', + 'prev_word_id' => '1808', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '162', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2451', + ), + 10328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1866', + 'placement' => '163', + 'prev_word_id' => '2451', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '14999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '164', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1866', + ), + 10330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2452', + 'placement' => '165', + 'prev_word_id' => '1866', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '166', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2452', + ), + 10332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '167', + 'prev_word_id' => '2452', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1848', + ), + 10333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2453', + 'placement' => '168', + 'prev_word_id' => '1848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '169', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2453', + ), + 10335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '170', + 'prev_word_id' => '2453', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '936', + ), + 10336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '171', + 'prev_word_id' => '936', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '172', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '173', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '888', + ), + 10339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2026', + 'placement' => '174', + 'prev_word_id' => '888', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2454', + 'placement' => '175', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2026', + ), + 10341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '176', + 'prev_word_id' => '2026', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2454', + ), + 10342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '177', + 'prev_word_id' => '2454', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '178', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '179', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '180', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '831', + ), + 10346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '181', + 'prev_word_id' => '831', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '832', + ), + 10347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1952', + 'placement' => '182', + 'prev_word_id' => '832', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '183', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1952', + ), + 10349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2455', + 'placement' => '184', + 'prev_word_id' => '1952', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '185', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2455', + ), + 10351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2456', + 'placement' => '186', + 'prev_word_id' => '2455', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1956', + 'placement' => '187', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2456', + ), + 10353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2452', + 'placement' => '188', + 'prev_word_id' => '2456', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1956', + ), + 10354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '189', + 'prev_word_id' => '1956', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2452', + ), + 10355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2457', + 'placement' => '190', + 'prev_word_id' => '2452', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '191', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2457', + ), + 10357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '192', + 'prev_word_id' => '2457', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '193', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '194', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1290', + ), + 10360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '195', + 'prev_word_id' => '1290', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1830', + 'placement' => '196', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '197', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1830', + ), + 10363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '198', + 'prev_word_id' => '1830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1370', + ), + 10364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '199', + 'prev_word_id' => '1370', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '200', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '201', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2433', + 'placement' => '202', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '203', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2433', + ), + 10369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '204', + 'prev_word_id' => '2433', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '205', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '206', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '207', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '208', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1791', + ), + 10374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1278', + 'placement' => '209', + 'prev_word_id' => '1791', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2454', + 'placement' => '210', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1278', + ), + 10376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '211', + 'prev_word_id' => '1278', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2454', + ), + 10377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '212', + 'prev_word_id' => '2454', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '213', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '959', + ), + 10379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2458', + 'placement' => '214', + 'prev_word_id' => '959', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '215', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2458', + ), + 10381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2315', + 'placement' => '216', + 'prev_word_id' => '2458', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2459', + 'placement' => '217', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2315', + ), + 10383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1896', + 'placement' => '218', + 'prev_word_id' => '2315', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2459', + ), + 10384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2460', + 'placement' => '219', + 'prev_word_id' => '2459', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1896', + ), + 10385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '220', + 'prev_word_id' => '1896', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2460', + ), + 10386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '221', + 'prev_word_id' => '2460', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '222', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '223', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '868', + 'placement' => '224', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1761', + ), + 10390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '225', + 'prev_word_id' => '1761', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '868', + ), + 10391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '226', + 'prev_word_id' => '868', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2461', + 'placement' => '227', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1596', + ), + 10393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '228', + 'prev_word_id' => '1596', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2461', + ), + 10394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '229', + 'prev_word_id' => '2461', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '868', + 'placement' => '230', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '231', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '868', + ), + 10397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2462', + 'placement' => '232', + 'prev_word_id' => '868', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '233', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2462', + ), + 10399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '234', + 'prev_word_id' => '2462', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2463', + 'placement' => '235', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '895', + ), + 10401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2192', + 'placement' => '236', + 'prev_word_id' => '895', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2463', + ), + 10402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2464', + 'placement' => '237', + 'prev_word_id' => '2463', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2192', + ), + 10403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '238', + 'prev_word_id' => '2192', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2464', + ), + 10404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '239', + 'prev_word_id' => '2464', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '240', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1787', + ), + 10406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '241', + 'prev_word_id' => '1787', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2465', + 'placement' => '242', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '243', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2465', + ), + 10409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '244', + 'prev_word_id' => '2465', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2466', + 'placement' => '245', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1513', + ), + 10411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2467', + 'placement' => '246', + 'prev_word_id' => '1513', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2466', + ), + 10412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '247', + 'prev_word_id' => '2466', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2467', + ), + 10413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '248', + 'prev_word_id' => '2467', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '249', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '250', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1840', + ), + 10416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1860', + 'placement' => '251', + 'prev_word_id' => '1840', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1840', + ), + 10417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '252', + 'prev_word_id' => '1840', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1860', + ), + 10418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2468', + 'placement' => '253', + 'prev_word_id' => '1860', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2469', + 'placement' => '254', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2468', + ), + 10420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '255', + 'prev_word_id' => '2468', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2469', + ), + 10421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '256', + 'prev_word_id' => '2469', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '257', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 10423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '258', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '968', + ), + 10424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '259', + 'prev_word_id' => '968', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '260', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '261', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '262', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '263', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1749', + ), + 10429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '264', + 'prev_word_id' => '1749', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1632', + 'placement' => '265', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1879', + ), + 10431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2470', + 'placement' => '266', + 'prev_word_id' => '1879', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1632', + ), + 10432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '267', + 'prev_word_id' => '1632', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2470', + ), + 10433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '268', + 'prev_word_id' => '2470', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '269', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '270', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1263', + ), + 10436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2471', + 'placement' => '271', + 'prev_word_id' => '1263', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '888', + ), + 10437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '272', + 'prev_word_id' => '888', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2471', + ), + 10438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '273', + 'prev_word_id' => '2471', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '274', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1259', + 'placement' => '275', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 10441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1868', + 'placement' => '276', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1259', + ), + 10442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '277', + 'prev_word_id' => '1259', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1868', + ), + 10443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '278', + 'prev_word_id' => '1868', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '825', + ), + 10444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1491', + 'placement' => '279', + 'prev_word_id' => '825', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '280', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1491', + ), + 10446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '281', + 'prev_word_id' => '1491', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '282', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '951', + 'placement' => '283', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '284', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '951', + ), + 10450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '285', + 'prev_word_id' => '951', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '286', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2472', + 'placement' => '287', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '288', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2472', + ), + 10454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '289', + 'prev_word_id' => '2472', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '290', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '291', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1263', + ), + 10457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2473', + 'placement' => '292', + 'prev_word_id' => '1263', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '293', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2473', + ), + 10459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '294', + 'prev_word_id' => '2473', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '295', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '296', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '831', + ), + 10462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1544', + 'placement' => '297', + 'prev_word_id' => '831', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '832', + ), + 10463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '298', + 'prev_word_id' => '832', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1544', + ), + 10464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '299', + 'prev_word_id' => '1544', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '300', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1851', + 'placement' => '301', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1868', + 'placement' => '302', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1851', + ), + 10468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '303', + 'prev_word_id' => '1851', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1868', + ), + 10469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1870', + 'placement' => '304', + 'prev_word_id' => '1868', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1677', + 'placement' => '305', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1870', + ), + 10471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '306', + 'prev_word_id' => '1870', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1677', + ), + 10472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '307', + 'prev_word_id' => '1677', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '870', + ), + 10473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1697', + 'placement' => '308', + 'prev_word_id' => '870', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1812', + 'placement' => '309', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1697', + ), + 10475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '310', + 'prev_word_id' => '1697', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1812', + ), + 10476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '311', + 'prev_word_id' => '1812', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '312', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '313', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1879', + ), + 10479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '314', + 'prev_word_id' => '1879', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '898', + ), + 10480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '315', + 'prev_word_id' => '898', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '316', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '317', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1879', + ), + 10483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '318', + 'prev_word_id' => '1879', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '319', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2474', + 'placement' => '320', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '940', + ), + 10486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1613', + 'placement' => '321', + 'prev_word_id' => '940', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2474', + ), + 10487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2115', + 'placement' => '322', + 'prev_word_id' => '2474', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1613', + ), + 10488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '323', + 'prev_word_id' => '1613', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2115', + ), + 10489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2475', + 'placement' => '324', + 'prev_word_id' => '2115', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '325', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2475', + ), + 10491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2476', + 'placement' => '326', + 'prev_word_id' => '2475', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '936', + ), + 10492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2477', + 'placement' => '327', + 'prev_word_id' => '936', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2476', + ), + 10493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '328', + 'prev_word_id' => '2476', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2477', + ), + 10494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '329', + 'prev_word_id' => '2477', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '888', + 'placement' => '330', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '331', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '888', + ), + 10497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2026', + 'placement' => '332', + 'prev_word_id' => '888', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '333', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2026', + ), + 10499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '334', + 'prev_word_id' => '2026', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '335', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1749', + ), + 10501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '336', + 'prev_word_id' => '1749', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1366', + ), + 10502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '337', + 'prev_word_id' => '1366', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '338', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '339', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1879', + ), + 10505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2478', + 'placement' => '340', + 'prev_word_id' => '1879', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '341', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2478', + ), + 10507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2067', + 'placement' => '342', + 'prev_word_id' => '2478', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '343', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2067', + ), + 10509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '866', + 'placement' => '344', + 'prev_word_id' => '2067', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2479', + 'placement' => '345', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '866', + ), + 10511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '346', + 'prev_word_id' => '866', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2479', + ), + 10512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '347', + 'prev_word_id' => '2479', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '348', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1517', + ), + 10514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '349', + 'prev_word_id' => '1517', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1336', + ), + 10515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2479', + 'placement' => '350', + 'prev_word_id' => '1336', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '351', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2479', + ), + 10517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '352', + 'prev_word_id' => '2479', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2480', + 'placement' => '353', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '354', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2480', + ), + 10520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2481', + 'placement' => '355', + 'prev_word_id' => '2480', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1410', + ), + 10521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '961', + 'placement' => '356', + 'prev_word_id' => '1410', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2481', + ), + 10522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '357', + 'prev_word_id' => '2481', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '961', + ), + 10523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '358', + 'prev_word_id' => '961', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '963', + ), + 10524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1265', + 'placement' => '359', + 'prev_word_id' => '963', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1410', + ), + 10525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2482', + 'placement' => '360', + 'prev_word_id' => '1410', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1265', + ), + 10526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '908', + 'placement' => '361', + 'prev_word_id' => '1265', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2482', + ), + 10527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2483', + 'placement' => '362', + 'prev_word_id' => '2482', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '908', + ), + 10528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '363', + 'prev_word_id' => '908', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2483', + ), + 10529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '364', + 'prev_word_id' => '2483', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '365', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1404', + ), + 10531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '366', + 'prev_word_id' => '1404', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '976', + ), + 10532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '883', + 'placement' => '367', + 'prev_word_id' => '976', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1419', + 'placement' => '368', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '883', + ), + 10534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '369', + 'prev_word_id' => '883', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1419', + ), + 10535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '370', + 'prev_word_id' => '1419', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '371', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '372', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1631', + ), + 10538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '373', + 'prev_word_id' => '1631', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1319', + ), + 10539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '374', + 'prev_word_id' => '1319', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1816', + ), + 10540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '375', + 'prev_word_id' => '1816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1336', + ), + 10541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '376', + 'prev_word_id' => '1336', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1840', + ), + 10542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '377', + 'prev_word_id' => '1840', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '854', + ), + 10543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '378', + 'prev_word_id' => '854', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '976', + ), + 10544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2484', + 'placement' => '379', + 'prev_word_id' => '976', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1816', + ), + 10545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '380', + 'prev_word_id' => '1816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2484', + ), + 10546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '381', + 'prev_word_id' => '2484', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '382', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1337', + ), + 10548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1468', + 'placement' => '383', + 'prev_word_id' => '1337', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '384', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1468', + ), + 10550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '385', + 'prev_word_id' => '1468', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1359', + ), + 10551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2485', + 'placement' => '386', + 'prev_word_id' => '1359', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '387', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2485', + ), + 10553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '388', + 'prev_word_id' => '2485', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '389', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2486', + 'placement' => '390', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '391', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2486', + ), + 10557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2487', + 'placement' => '392', + 'prev_word_id' => '2486', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '393', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2487', + ), + 10559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '394', + 'prev_word_id' => '2487', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1840', + ), + 10560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '395', + 'prev_word_id' => '1840', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2488', + 'placement' => '396', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2469', + 'placement' => '397', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2488', + ), + 10563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '398', + 'prev_word_id' => '2488', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2469', + ), + 10564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2489', + 'placement' => '399', + 'prev_word_id' => '2469', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '400', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2489', + ), + 10566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '401', + 'prev_word_id' => '2489', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2297', + 'placement' => '402', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 10568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1636', + 'placement' => '403', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2297', + ), + 10569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '404', + 'prev_word_id' => '2297', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1636', + ), + 10570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '405', + 'prev_word_id' => '1636', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2310', + 'placement' => '406', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '898', + ), + 10572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2490', + 'placement' => '407', + 'prev_word_id' => '898', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2310', + ), + 10573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '408', + 'prev_word_id' => '2310', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2490', + ), + 10574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '883', + 'placement' => '409', + 'prev_word_id' => '2490', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1752', + 'placement' => '410', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '883', + ), + 10576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '411', + 'prev_word_id' => '883', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1752', + ), + 10577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '412', + 'prev_word_id' => '1752', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '413', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '414', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1263', + ), + 10580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1278', + 'placement' => '415', + 'prev_word_id' => '1263', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1523', + 'placement' => '416', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1278', + ), + 10582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2491', + 'placement' => '417', + 'prev_word_id' => '1278', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1523', + ), + 10583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '936', + 'placement' => '418', + 'prev_word_id' => '1523', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2491', + ), + 10584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '419', + 'prev_word_id' => '2491', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '936', + ), + 10585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '420', + 'prev_word_id' => '936', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1816', + ), + 10586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2315', + 'placement' => '421', + 'prev_word_id' => '1816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1840', + ), + 10587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2400', + 'placement' => '422', + 'prev_word_id' => '1840', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2315', + ), + 10588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '423', + 'prev_word_id' => '2315', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2400', + ), + 10589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2492', + 'placement' => '424', + 'prev_word_id' => '2400', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '425', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2492', + ), + 10591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '426', + 'prev_word_id' => '2492', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2493', + 'placement' => '427', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1263', + ), + 10593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '428', + 'prev_word_id' => '1263', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2493', + ), + 10594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '429', + 'prev_word_id' => '2493', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '921', + ), + 10595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '430', + 'prev_word_id' => '921', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1525', + 'placement' => '431', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1835', + ), + 10597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '432', + 'prev_word_id' => '1835', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1525', + ), + 10598 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15268', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '433', + 'prev_word_id' => '1525', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1191', + ), + 10599 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '191', + 'frequency' => '0', + 'id' => '15269', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '434', + 'prev_word_id' => '1191', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1191', + ), + 10600 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '192', + 'frequency' => '0', + 'id' => '15270', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '2494', + ), + 10601 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15271', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '936', + ), + 10602 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15272', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '1', + 'prev_word_id' => '936', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10603 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15273', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '2', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '881', + ), + 10604 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15274', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '3', + 'prev_word_id' => '881', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10605 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15275', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '4', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10606 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15276', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '5', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10607 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15277', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '6', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10608 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15278', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '7', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1530', + ), + 10609 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15279', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '8', + 'prev_word_id' => '1530', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10610 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15280', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1588', + 'placement' => '9', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10611 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15281', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '10', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1588', + ), + 10612 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15282', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '11', + 'prev_word_id' => '1588', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10613 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15283', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '12', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1370', + ), + 10614 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15284', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '13', + 'prev_word_id' => '1370', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1368', + ), + 10615 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15285', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '14', + 'prev_word_id' => '1368', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10616 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15286', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '15', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10617 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15287', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1589', + 'placement' => '16', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1084', + ), + 10618 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15288', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '17', + 'prev_word_id' => '1084', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1589', + ), + 10619 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15289', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '18', + 'prev_word_id' => '1589', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1437', + ), + 10620 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15290', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '19', + 'prev_word_id' => '1437', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10621 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15291', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1590', + 'placement' => '20', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10622 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15292', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1591', + 'placement' => '21', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1590', + ), + 10623 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15293', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '22', + 'prev_word_id' => '1590', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1591', + ), + 10624 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15294', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '23', + 'prev_word_id' => '1591', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10625 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15295', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '24', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10626 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15296', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '25', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '857', + ), + 10627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '26', + 'prev_word_id' => '857', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '27', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '28', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 10630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '29', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '30', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 10632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '31', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1592', + ), + 10633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '32', + 'prev_word_id' => '1592', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '33', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '34', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 10636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1593', + 'placement' => '35', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1489', + ), + 10637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '36', + 'prev_word_id' => '1489', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1593', + ), + 10638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '37', + 'prev_word_id' => '1593', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1594', + ), + 10639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '38', + 'prev_word_id' => '1594', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '39', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '40', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1595', + ), + 10642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '41', + 'prev_word_id' => '1595', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1596', + ), + 10643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '42', + 'prev_word_id' => '1596', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '963', + ), + 10644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '43', + 'prev_word_id' => '963', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '825', + ), + 10645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '44', + 'prev_word_id' => '825', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1597', + ), + 10646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '45', + 'prev_word_id' => '1597', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1598', + ), + 10647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '46', + 'prev_word_id' => '1598', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1522', + ), + 10648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '47', + 'prev_word_id' => '1522', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '933', + ), + 10649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '48', + 'prev_word_id' => '933', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '945', + ), + 10650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1599', + 'placement' => '49', + 'prev_word_id' => '945', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 10651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '50', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1599', + ), + 10652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '51', + 'prev_word_id' => '1599', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1370', + ), + 10653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '52', + 'prev_word_id' => '1370', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1481', + ), + 10654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '53', + 'prev_word_id' => '1481', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '54', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '55', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 10657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '56', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '57', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 10659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '58', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1592', + ), + 10660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '59', + 'prev_word_id' => '1592', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '60', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '61', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '62', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '63', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '64', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '65', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '66', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1280', + ), + 10668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1600', + 'placement' => '67', + 'prev_word_id' => '1280', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1337', + ), + 10669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '68', + 'prev_word_id' => '1337', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1600', + ), + 10670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '69', + 'prev_word_id' => '1600', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1601', + 'placement' => '70', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '963', + ), + 10672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '71', + 'prev_word_id' => '963', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1601', + ), + 10673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '72', + 'prev_word_id' => '1601', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 10674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '73', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1592', + 'placement' => '74', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 10676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1602', + 'placement' => '75', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1592', + ), + 10677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '76', + 'prev_word_id' => '1592', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1602', + ), + 10678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '77', + 'prev_word_id' => '1602', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '78', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '821', + ), + 10680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '79', + 'prev_word_id' => '821', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1603', + ), + 10681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1603', + 'placement' => '80', + 'prev_word_id' => '1603', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '804', + ), + 10682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1604', + 'placement' => '81', + 'prev_word_id' => '804', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1603', + ), + 10683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '82', + 'prev_word_id' => '1603', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1604', + ), + 10684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '83', + 'prev_word_id' => '1604', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1499', + 'placement' => '84', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '85', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1499', + ), + 10687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '86', + 'prev_word_id' => '1499', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '87', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '88', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1606', + ), + 10690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '89', + 'prev_word_id' => '1606', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '90', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1607', + 'placement' => '91', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1608', + 'placement' => '92', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1607', + ), + 10694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '93', + 'prev_word_id' => '1607', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1608', + ), + 10695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '94', + 'prev_word_id' => '1608', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '95', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1594', + ), + 10697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1610', + 'placement' => '96', + 'prev_word_id' => '1594', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1609', + ), + 10698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '97', + 'prev_word_id' => '1609', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1610', + ), + 10699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '98', + 'prev_word_id' => '1610', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '99', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '857', + 'placement' => '100', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '101', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '857', + ), + 10703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '102', + 'prev_word_id' => '857', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '932', + ), + 10704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '103', + 'prev_word_id' => '932', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1611', + 'placement' => '104', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '105', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1611', + ), + 10707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1612', + 'placement' => '106', + 'prev_word_id' => '1611', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '932', + ), + 10708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '107', + 'prev_word_id' => '932', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1612', + ), + 10709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '108', + 'prev_word_id' => '1612', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '870', + ), + 10710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '109', + 'prev_word_id' => '870', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1504', + 'placement' => '110', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '821', + ), + 10712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1613', + 'placement' => '111', + 'prev_word_id' => '821', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1504', + ), + 10713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1614', + 'placement' => '112', + 'prev_word_id' => '1504', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1613', + ), + 10714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1615', + 'placement' => '113', + 'prev_word_id' => '1613', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1614', + ), + 10715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1616', + 'placement' => '114', + 'prev_word_id' => '1614', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1615', + ), + 10716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1617', + 'placement' => '115', + 'prev_word_id' => '1615', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1616', + ), + 10717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1618', + 'placement' => '116', + 'prev_word_id' => '1616', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1617', + ), + 10718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1505', + 'placement' => '117', + 'prev_word_id' => '1617', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1618', + ), + 10719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '118', + 'prev_word_id' => '1618', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1505', + ), + 10720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '119', + 'prev_word_id' => '1505', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1619', + 'placement' => '120', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1489', + ), + 10722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '121', + 'prev_word_id' => '1489', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1619', + ), + 10723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '122', + 'prev_word_id' => '1619', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1620', + ), + 10724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '123', + 'prev_word_id' => '1620', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '124', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '125', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 10727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1621', + 'placement' => '126', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '127', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1621', + ), + 10729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1622', + 'placement' => '128', + 'prev_word_id' => '1621', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1489', + ), + 10730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '129', + 'prev_word_id' => '1489', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1622', + ), + 10731 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '130', + 'prev_word_id' => '1622', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1384', + ), + 10732 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1623', + 'placement' => '131', + 'prev_word_id' => '1384', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10733 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1508', + 'placement' => '132', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1623', + ), + 10734 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1624', + 'placement' => '133', + 'prev_word_id' => '1623', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1508', + ), + 10735 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1601', + 'placement' => '134', + 'prev_word_id' => '1508', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1624', + ), + 10736 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '135', + 'prev_word_id' => '1624', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1601', + ), + 10737 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1625', + 'placement' => '136', + 'prev_word_id' => '1601', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10738 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '137', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1625', + ), + 10739 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '138', + 'prev_word_id' => '1625', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1489', + ), + 10740 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '828', + 'placement' => '139', + 'prev_word_id' => '1489', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10741 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1626', + 'placement' => '140', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '828', + ), + 10742 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '141', + 'prev_word_id' => '828', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1626', + ), + 10743 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1627', + 'placement' => '142', + 'prev_word_id' => '1626', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10744 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1628', + 'placement' => '143', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1627', + ), + 10745 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '144', + 'prev_word_id' => '1627', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1628', + ), + 10746 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '145', + 'prev_word_id' => '1628', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1429', + ), + 10747 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '146', + 'prev_word_id' => '1429', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1606', + ), + 10748 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '147', + 'prev_word_id' => '1606', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10749 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '148', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10750 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '149', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '939', + ), + 10751 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1629', + 'placement' => '150', + 'prev_word_id' => '939', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10752 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '151', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1629', + ), + 10753 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15423', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '152', + 'prev_word_id' => '1629', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 10754 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15424', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '153', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10755 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15425', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '154', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10756 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15426', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1630', + 'placement' => '155', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10757 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15427', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1489', + 'placement' => '156', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1630', + ), + 10758 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15428', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1622', + 'placement' => '157', + 'prev_word_id' => '1630', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1489', + ), + 10759 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15429', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '158', + 'prev_word_id' => '1489', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1622', + ), + 10760 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15430', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '159', + 'prev_word_id' => '1622', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1631', + ), + 10761 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15431', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '160', + 'prev_word_id' => '1631', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10762 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15432', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1632', + 'placement' => '161', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10763 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15433', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '162', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1632', + ), + 10764 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15434', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '163', + 'prev_word_id' => '1632', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1318', + ), + 10765 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15435', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1633', + 'placement' => '164', + 'prev_word_id' => '1318', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1319', + ), + 10766 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15436', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '165', + 'prev_word_id' => '1319', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1633', + ), + 10767 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15437', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1634', + 'placement' => '166', + 'prev_word_id' => '1633', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '856', + ), + 10768 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15438', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '167', + 'prev_word_id' => '856', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1634', + ), + 10769 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15439', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '168', + 'prev_word_id' => '1634', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10770 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15440', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '169', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10771 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15441', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '170', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1595', + ), + 10772 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15442', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1635', + 'placement' => '171', + 'prev_word_id' => '1595', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10773 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15443', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '172', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1635', + ), + 10774 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15444', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1636', + 'placement' => '173', + 'prev_word_id' => '1635', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1277', + ), + 10775 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15445', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '174', + 'prev_word_id' => '1277', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1636', + ), + 10776 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15446', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1637', + 'placement' => '175', + 'prev_word_id' => '1636', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10777 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15447', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1371', + 'placement' => '176', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1637', + ), + 10778 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15448', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '177', + 'prev_word_id' => '1637', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1371', + ), + 10779 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15449', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '178', + 'prev_word_id' => '1371', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10780 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15450', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1638', + 'placement' => '179', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10781 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15451', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '180', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1638', + ), + 10782 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15452', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '181', + 'prev_word_id' => '1638', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1639', + ), + 10783 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15453', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '182', + 'prev_word_id' => '1639', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 10784 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15454', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '183', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10785 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15455', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '184', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 10786 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15456', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1640', + 'placement' => '185', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10787 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15457', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '186', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1640', + ), + 10788 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15458', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1641', + 'placement' => '187', + 'prev_word_id' => '1640', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10789 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15459', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '188', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1641', + ), + 10790 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15460', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '874', + 'placement' => '189', + 'prev_word_id' => '1641', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1337', + ), + 10791 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15461', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '905', + 'placement' => '190', + 'prev_word_id' => '1337', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '874', + ), + 10792 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15462', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '191', + 'prev_word_id' => '874', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '905', + ), + 10793 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15463', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '192', + 'prev_word_id' => '905', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10794 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15464', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '193', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1404', + ), + 10795 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15465', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '194', + 'prev_word_id' => '1404', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '976', + ), + 10796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '195', + 'prev_word_id' => '976', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1594', + ), + 10797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '196', + 'prev_word_id' => '1594', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '197', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '198', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1443', + ), + 10800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '199', + 'prev_word_id' => '1443', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '200', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '201', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 10803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '202', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 10804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '203', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1642', + 'placement' => '204', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '205', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1642', + ), + 10807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '206', + 'prev_word_id' => '1642', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1643', + 'placement' => '207', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1596', + ), + 10809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1276', + 'placement' => '208', + 'prev_word_id' => '1596', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1643', + ), + 10810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '209', + 'prev_word_id' => '1643', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1276', + ), + 10811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '210', + 'prev_word_id' => '1276', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1447', + ), + 10812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '211', + 'prev_word_id' => '1447', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1290', + ), + 10813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '212', + 'prev_word_id' => '1290', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '821', + ), + 10814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1644', + 'placement' => '213', + 'prev_word_id' => '821', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '214', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1644', + ), + 10816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1645', + 'placement' => '215', + 'prev_word_id' => '1644', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '216', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1645', + ), + 10818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '217', + 'prev_word_id' => '1645', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '218', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1646', + ), + 10820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1647', + 'placement' => '219', + 'prev_word_id' => '1646', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '836', + ), + 10821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '220', + 'prev_word_id' => '836', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1647', + ), + 10822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1648', + 'placement' => '221', + 'prev_word_id' => '1647', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '222', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1648', + ), + 10824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1649', + 'placement' => '223', + 'prev_word_id' => '1648', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1650', + 'placement' => '224', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1649', + ), + 10826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '225', + 'prev_word_id' => '1649', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1650', + ), + 10827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1643', + 'placement' => '226', + 'prev_word_id' => '1650', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1651', + ), + 10828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '227', + 'prev_word_id' => '1651', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1643', + ), + 10829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1652', + 'placement' => '228', + 'prev_word_id' => '1643', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '229', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1652', + ), + 10831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1653', + 'placement' => '230', + 'prev_word_id' => '1652', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '898', + ), + 10832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1654', + 'placement' => '231', + 'prev_word_id' => '898', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1653', + ), + 10833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '232', + 'prev_word_id' => '1653', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1654', + ), + 10834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1655', + 'placement' => '233', + 'prev_word_id' => '1654', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '234', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1655', + ), + 10836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '235', + 'prev_word_id' => '1655', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '236', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1319', + ), + 10838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '237', + 'prev_word_id' => '1319', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1290', + ), + 10839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '238', + 'prev_word_id' => '1290', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '821', + ), + 10840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '239', + 'prev_word_id' => '821', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '240', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1656', + 'placement' => '241', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1643', + 'placement' => '242', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1656', + ), + 10844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '243', + 'prev_word_id' => '1656', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1643', + ), + 10845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '244', + 'prev_word_id' => '1643', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1657', + 'placement' => '245', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1658', + 'placement' => '246', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1657', + ), + 10848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '247', + 'prev_word_id' => '1657', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1658', + ), + 10849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '248', + 'prev_word_id' => '1658', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '249', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1323', + ), + 10851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1659', + 'placement' => '250', + 'prev_word_id' => '1323', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '251', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1659', + ), + 10853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '252', + 'prev_word_id' => '1659', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 10854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '253', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1660', + 'placement' => '254', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1661', + 'placement' => '255', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1660', + ), + 10857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '256', + 'prev_word_id' => '1660', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1661', + ), + 10858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '257', + 'prev_word_id' => '1661', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '893', + ), + 10859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '258', + 'prev_word_id' => '893', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '259', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1319', + ), + 10861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1662', + 'placement' => '260', + 'prev_word_id' => '1319', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1318', + ), + 10862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1642', + 'placement' => '261', + 'prev_word_id' => '1318', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1662', + ), + 10863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '262', + 'prev_word_id' => '1662', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1642', + ), + 10864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '263', + 'prev_word_id' => '1642', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '901', + ), + 10865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '264', + 'prev_word_id' => '901', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '265', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '836', + ), + 10867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '266', + 'prev_word_id' => '836', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1396', + ), + 10868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1663', + 'placement' => '267', + 'prev_word_id' => '1396', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '268', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1663', + ), + 10870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '269', + 'prev_word_id' => '1663', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '270', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '271', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '829', + ), + 10873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '272', + 'prev_word_id' => '829', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1323', + ), + 10874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '273', + 'prev_word_id' => '1323', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '274', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1318', + ), + 10876 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '275', + 'prev_word_id' => '1318', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '825', + ), + 10877 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1664', + 'placement' => '276', + 'prev_word_id' => '825', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1443', + ), + 10878 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '277', + 'prev_word_id' => '1443', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1664', + ), + 10879 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '278', + 'prev_word_id' => '1664', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '976', + ), + 10880 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '279', + 'prev_word_id' => '976', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 10881 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '280', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1300', + ), + 10882 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '281', + 'prev_word_id' => '1300', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10883 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '282', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10884 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '283', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10885 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '284', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1665', + ), + 10886 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '285', + 'prev_word_id' => '1665', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10887 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '286', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10888 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1666', + 'placement' => '287', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10889 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '288', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1666', + ), + 10890 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1667', + 'placement' => '289', + 'prev_word_id' => '1666', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '290', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1667', + ), + 10892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '291', + 'prev_word_id' => '1667', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '292', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1323', + ), + 10894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '293', + 'prev_word_id' => '1323', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1668', + 'placement' => '294', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '295', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1668', + ), + 10897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '296', + 'prev_word_id' => '1668', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1665', + ), + 10898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '297', + 'prev_word_id' => '1665', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1594', + 'placement' => '298', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '299', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1594', + ), + 10901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '300', + 'prev_word_id' => '1594', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 10902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '301', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1290', + ), + 10903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '302', + 'prev_word_id' => '1290', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1323', + ), + 10904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '303', + 'prev_word_id' => '1323', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '304', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1420', + ), + 10906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '305', + 'prev_word_id' => '1420', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '306', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '307', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '308', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '829', + ), + 10910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '309', + 'prev_word_id' => '829', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1323', + ), + 10911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1663', + 'placement' => '310', + 'prev_word_id' => '1323', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 10912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '311', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1663', + ), + 10913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '312', + 'prev_word_id' => '1663', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '313', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1313', + 'placement' => '314', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 10916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '315', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1313', + ), + 10917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1669', + 'placement' => '316', + 'prev_word_id' => '1313', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '317', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1669', + ), + 10919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '318', + 'prev_word_id' => '1669', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1670', + 'placement' => '319', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '320', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1670', + ), + 10922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1671', + 'placement' => '321', + 'prev_word_id' => '1670', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1605', + ), + 10923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '322', + 'prev_word_id' => '1605', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1671', + ), + 10924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1672', + 'placement' => '323', + 'prev_word_id' => '1671', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '324', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1672', + ), + 10926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1314', + 'placement' => '325', + 'prev_word_id' => '1672', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '326', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1314', + ), + 10928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '327', + 'prev_word_id' => '1314', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '328', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '329', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '882', + ), + 10931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '330', + 'prev_word_id' => '882', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '881', + ), + 10932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '331', + 'prev_word_id' => '881', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '332', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1673', + ), + 10934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '333', + 'prev_word_id' => '1673', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1674', + 'placement' => '334', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 10936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '335', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1674', + ), + 10937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '336', + 'prev_word_id' => '1674', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '815', + ), + 10938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1422', + 'placement' => '337', + 'prev_word_id' => '815', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '338', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1422', + ), + 10940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1675', + 'placement' => '339', + 'prev_word_id' => '1422', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '340', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1675', + ), + 10942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1676', + 'placement' => '341', + 'prev_word_id' => '1675', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1677', + 'placement' => '342', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1676', + ), + 10944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '343', + 'prev_word_id' => '1676', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1677', + ), + 10945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '344', + 'prev_word_id' => '1677', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 10946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '829', + 'placement' => '345', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 10947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '346', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '829', + ), + 10948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '347', + 'prev_word_id' => '829', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1323', + ), + 10949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1678', + 'placement' => '348', + 'prev_word_id' => '1323', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1596', + ), + 10950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1679', + 'placement' => '349', + 'prev_word_id' => '1596', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1678', + ), + 10951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '350', + 'prev_word_id' => '1678', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1679', + ), + 10952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '351', + 'prev_word_id' => '1679', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1680', + 'placement' => '352', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '844', + ), + 10954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '353', + 'prev_word_id' => '844', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1680', + ), + 10955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1681', + 'placement' => '354', + 'prev_word_id' => '1680', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 10956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '355', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1681', + ), + 10957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '356', + 'prev_word_id' => '1681', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1263', + ), + 10958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1682', + 'placement' => '357', + 'prev_word_id' => '1263', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1008', + ), + 10959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '358', + 'prev_word_id' => '1008', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1682', + ), + 10960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '359', + 'prev_word_id' => '1682', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '360', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 10962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '361', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1319', + ), + 10963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '362', + 'prev_word_id' => '1319', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '898', + ), + 10964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1684', + 'placement' => '363', + 'prev_word_id' => '898', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1683', + ), + 10965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '364', + 'prev_word_id' => '1683', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1684', + ), + 10966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '365', + 'prev_word_id' => '1684', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1685', + ), + 10967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '366', + 'prev_word_id' => '1685', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '367', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '368', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1686', + ), + 10970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1415', + 'placement' => '369', + 'prev_word_id' => '1686', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1685', + ), + 10971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '370', + 'prev_word_id' => '1685', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1415', + ), + 10972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '371', + 'prev_word_id' => '1415', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '882', + ), + 10973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '372', + 'prev_word_id' => '882', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '939', + ), + 10974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1391', + 'placement' => '373', + 'prev_word_id' => '939', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1458', + 'placement' => '374', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1391', + ), + 10976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '375', + 'prev_word_id' => '1391', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1458', + ), + 10977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '376', + 'prev_word_id' => '1458', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 10978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '377', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 10979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1687', + 'placement' => '378', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1686', + ), + 10980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '379', + 'prev_word_id' => '1686', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1687', + ), + 10981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '380', + 'prev_word_id' => '1687', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1595', + ), + 10982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '963', + 'placement' => '381', + 'prev_word_id' => '1595', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1596', + ), + 10983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '382', + 'prev_word_id' => '1596', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '963', + ), + 10984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '383', + 'prev_word_id' => '963', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '825', + ), + 10985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '384', + 'prev_word_id' => '825', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1597', + ), + 10986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '385', + 'prev_word_id' => '1597', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '893', + ), + 10987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '386', + 'prev_word_id' => '893', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 10988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '387', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '973', + ), + 10989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '388', + 'prev_word_id' => '973', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 10990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '389', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1595', + ), + 10991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '390', + 'prev_word_id' => '1595', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '921', + ), + 10992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '391', + 'prev_word_id' => '921', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1414', + ), + 10993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1635', + 'placement' => '392', + 'prev_word_id' => '1414', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1290', + ), + 10994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '393', + 'prev_word_id' => '1290', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1635', + ), + 10995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '394', + 'prev_word_id' => '1635', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1598', + ), + 10996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '395', + 'prev_word_id' => '1598', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 10997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '396', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '933', + ), + 10998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '397', + 'prev_word_id' => '933', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '825', + ), + 10999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '398', + 'prev_word_id' => '825', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 11000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '399', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1688', + ), + 11001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '400', + 'prev_word_id' => '1688', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '401', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '402', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1689', + ), + 11004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '403', + 'prev_word_id' => '1689', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1690', + ), + 11005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '404', + 'prev_word_id' => '1690', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1595', + ), + 11006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '405', + 'prev_word_id' => '1595', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '815', + ), + 11007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1295', + 'placement' => '406', + 'prev_word_id' => '815', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1691', + 'placement' => '407', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1295', + ), + 11009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '408', + 'prev_word_id' => '1295', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1691', + ), + 11010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '409', + 'prev_word_id' => '1691', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '410', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 11012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '411', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '412', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '973', + ), + 11014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '413', + 'prev_word_id' => '973', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 11015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1692', + 'placement' => '414', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 11016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '415', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1692', + ), + 11017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '416', + 'prev_word_id' => '1692', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 11018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '417', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '848', + ), + 11019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '418', + 'prev_word_id' => '848', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1468', + 'placement' => '419', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1577', + ), + 11021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '420', + 'prev_word_id' => '1577', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1468', + ), + 11022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '421', + 'prev_word_id' => '1468', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 11023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '422', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 11024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1693', + 'placement' => '423', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 11025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '424', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1693', + ), + 11026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '425', + 'prev_word_id' => '1693', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '426', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1694', + 'placement' => '427', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 11029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '428', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1694', + ), + 11030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '429', + 'prev_word_id' => '1694', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '430', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1024', + ), + 11032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '431', + 'prev_word_id' => '1024', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 11033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1695', + 'placement' => '432', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 11034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '433', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1695', + ), + 11035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1696', + 'placement' => '434', + 'prev_word_id' => '1695', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '435', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1696', + ), + 11037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1697', + 'placement' => '436', + 'prev_word_id' => '1696', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '437', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1697', + ), + 11039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '905', + 'placement' => '438', + 'prev_word_id' => '1697', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 11040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '439', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '905', + ), + 11041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '440', + 'prev_word_id' => '905', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1598', + ), + 11042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '441', + 'prev_word_id' => '1598', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1522', + ), + 11043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '442', + 'prev_word_id' => '1522', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '443', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '444', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1646', + ), + 11046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '445', + 'prev_word_id' => '1646', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '836', + ), + 11047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '446', + 'prev_word_id' => '836', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1685', + ), + 11048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '447', + 'prev_word_id' => '1685', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 11049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1598', + 'placement' => '448', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '939', + ), + 11050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '449', + 'prev_word_id' => '939', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1598', + ), + 11051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '450', + 'prev_word_id' => '1598', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1522', + ), + 11052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '451', + 'prev_word_id' => '1522', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '809', + ), + 11053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '452', + 'prev_word_id' => '809', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1595', + 'placement' => '453', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1690', + ), + 11055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '454', + 'prev_word_id' => '1690', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1595', + ), + 11056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '455', + 'prev_word_id' => '1595', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '815', + ), + 11057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '456', + 'prev_word_id' => '815', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '457', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 11059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '458', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1698', + ), + 11060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1600', + 'placement' => '459', + 'prev_word_id' => '1698', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1384', + ), + 11061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '460', + 'prev_word_id' => '1384', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1600', + ), + 11062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '461', + 'prev_word_id' => '1600', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '825', + ), + 11063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1497', + 'placement' => '462', + 'prev_word_id' => '825', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1597', + ), + 11064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '463', + 'prev_word_id' => '1597', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1497', + ), + 11065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '464', + 'prev_word_id' => '1497', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '465', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1699', + 'placement' => '466', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1396', + ), + 11068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1700', + 'placement' => '467', + 'prev_word_id' => '1396', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1699', + ), + 11069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '468', + 'prev_word_id' => '1699', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1700', + ), + 11070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1701', + 'placement' => '469', + 'prev_word_id' => '1700', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '470', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1701', + ), + 11072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1600', + 'placement' => '471', + 'prev_word_id' => '1701', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1702', + 'placement' => '472', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1600', + ), + 11074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '473', + 'prev_word_id' => '1600', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1702', + ), + 11075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '474', + 'prev_word_id' => '1702', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1497', + 'placement' => '475', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 11077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1703', + 'placement' => '476', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1497', + ), + 11078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '477', + 'prev_word_id' => '1497', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1703', + ), + 11079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '478', + 'prev_word_id' => '1703', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1277', + ), + 11080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1522', + 'placement' => '479', + 'prev_word_id' => '1277', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '480', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1522', + ), + 11082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '481', + 'prev_word_id' => '1522', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '482', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '895', + ), + 11084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '962', + 'placement' => '483', + 'prev_word_id' => '895', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '881', + ), + 11085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1704', + 'placement' => '484', + 'prev_word_id' => '881', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '962', + ), + 11086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '485', + 'prev_word_id' => '962', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1704', + ), + 11087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '486', + 'prev_word_id' => '1704', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 11088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '487', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 11089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '488', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '821', + ), + 11090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '489', + 'prev_word_id' => '821', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '933', + ), + 11091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1705', + 'placement' => '490', + 'prev_word_id' => '933', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '945', + ), + 11092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '491', + 'prev_word_id' => '945', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1705', + ), + 11093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '492', + 'prev_word_id' => '1705', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '810', + ), + 11094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '493', + 'prev_word_id' => '810', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '933', + ), + 11095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '494', + 'prev_word_id' => '933', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 11096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1024', + 'placement' => '495', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1420', + ), + 11097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '496', + 'prev_word_id' => '1420', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1024', + ), + 11098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '497', + 'prev_word_id' => '1024', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 11099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '498', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 11100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '499', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '500', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 11102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '501', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '930', + ), + 11103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '502', + 'prev_word_id' => '930', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '813', + ), + 11104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '503', + 'prev_word_id' => '813', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 11105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '504', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '821', + ), + 11106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '505', + 'prev_word_id' => '821', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 11107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '506', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '507', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '508', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 11110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '509', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '881', + ), + 11111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '510', + 'prev_word_id' => '881', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '511', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1706', + 'placement' => '512', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 11114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '513', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1706', + ), + 11115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1707', + 'placement' => '514', + 'prev_word_id' => '1706', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '515', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1707', + ), + 11117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '516', + 'prev_word_id' => '1707', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1609', + ), + 11118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1700', + 'placement' => '517', + 'prev_word_id' => '1609', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '933', + ), + 11119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '518', + 'prev_word_id' => '933', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1700', + ), + 11120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '519', + 'prev_word_id' => '1700', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 11121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1708', + 'placement' => '520', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 11122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '521', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1708', + ), + 11123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '522', + 'prev_word_id' => '1708', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '815', + ), + 11124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '933', + 'placement' => '523', + 'prev_word_id' => '815', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '823', + ), + 11125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '524', + 'prev_word_id' => '823', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '933', + ), + 11126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1505', + 'placement' => '525', + 'prev_word_id' => '933', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '945', + ), + 11127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '526', + 'prev_word_id' => '945', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1505', + ), + 11128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1709', + 'placement' => '527', + 'prev_word_id' => '1505', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 11129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '528', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1709', + ), + 11130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1599', + 'placement' => '529', + 'prev_word_id' => '1709', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '841', + ), + 11131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '530', + 'prev_word_id' => '841', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1599', + ), + 11132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1710', + 'placement' => '531', + 'prev_word_id' => '1599', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1370', + ), + 11133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1711', + 'placement' => '532', + 'prev_word_id' => '1370', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1710', + ), + 11134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1253', + 'placement' => '533', + 'prev_word_id' => '1710', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1711', + ), + 11135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '534', + 'prev_word_id' => '1711', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1253', + ), + 11136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '535', + 'prev_word_id' => '1253', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '860', + ), + 11137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1712', + 'placement' => '536', + 'prev_word_id' => '860', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11138 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15808', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '537', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1712', + ), + 11139 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15809', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '538', + 'prev_word_id' => '1712', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '886', + ), + 11140 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15810', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '539', + 'prev_word_id' => '886', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1443', + ), + 11141 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15811', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '540', + 'prev_word_id' => '1443', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1673', + ), + 11142 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15812', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '541', + 'prev_word_id' => '1673', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 11143 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15813', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '542', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11144 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15814', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '543', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11145 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15815', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '544', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1370', + ), + 11146 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15816', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '545', + 'prev_word_id' => '1370', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '906', + ), + 11147 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15817', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '546', + 'prev_word_id' => '906', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 11148 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15818', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1344', + 'placement' => '547', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '930', + ), + 11149 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15819', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '548', + 'prev_word_id' => '930', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1344', + ), + 11150 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15820', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '549', + 'prev_word_id' => '1344', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11151 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15821', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1316', + 'placement' => '550', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '846', + ), + 11152 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15822', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '551', + 'prev_word_id' => '846', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1316', + ), + 11153 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '552', + 'prev_word_id' => '1316', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1481', + ), + 11154 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '553', + 'prev_word_id' => '1481', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 11155 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '554', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '897', + ), + 11156 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '555', + 'prev_word_id' => '897', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1609', + ), + 11157 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '556', + 'prev_word_id' => '1609', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '830', + ), + 11158 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '557', + 'prev_word_id' => '830', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '976', + ), + 11159 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '558', + 'prev_word_id' => '976', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '974', + ), + 11160 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '559', + 'prev_word_id' => '974', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11161 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '560', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11162 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '561', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '807', + ), + 11163 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '562', + 'prev_word_id' => '807', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '894', + ), + 11164 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '563', + 'prev_word_id' => '894', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '843', + ), + 11165 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '564', + 'prev_word_id' => '843', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '881', + ), + 11166 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1612', + 'placement' => '565', + 'prev_word_id' => '881', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '814', + ), + 11167 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '566', + 'prev_word_id' => '814', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1612', + ), + 11168 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '567', + 'prev_word_id' => '1612', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1481', + ), + 11169 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '568', + 'prev_word_id' => '1481', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1713', + ), + 11170 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '569', + 'prev_word_id' => '1713', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '863', + ), + 11171 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '570', + 'prev_word_id' => '863', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11172 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '571', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11173 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1698', + 'placement' => '572', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '801', + ), + 11174 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '573', + 'prev_word_id' => '801', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1698', + ), + 11175 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '574', + 'prev_word_id' => '1698', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '921', + ), + 11176 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '575', + 'prev_word_id' => '921', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '815', + ), + 11177 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1699', + 'placement' => '576', + 'prev_word_id' => '815', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '833', + ), + 11178 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '577', + 'prev_word_id' => '833', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1699', + ), + 11179 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1714', + 'placement' => '578', + 'prev_word_id' => '1699', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1547', + ), + 11180 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '579', + 'prev_word_id' => '1547', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1714', + ), + 11181 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '580', + 'prev_word_id' => '1714', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1715', + ), + 11182 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '581', + 'prev_word_id' => '1715', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11183 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '582', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '897', + ), + 11184 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '583', + 'prev_word_id' => '897', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '805', + ), + 11185 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '584', + 'prev_word_id' => '805', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '898', + ), + 11186 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '585', + 'prev_word_id' => '898', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1133', + ), + 11187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1307', + 'placement' => '586', + 'prev_word_id' => '1133', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1481', + ), + 11188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '587', + 'prev_word_id' => '1481', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1307', + ), + 11189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '588', + 'prev_word_id' => '1307', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '816', + ), + 11190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '589', + 'prev_word_id' => '816', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '802', + ), + 11191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '590', + 'prev_word_id' => '802', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '803', + ), + 11192 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15862', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '591', + 'prev_word_id' => '803', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1191', + ), + 11193 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '193', + 'frequency' => '0', + 'id' => '15863', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '592', + 'prev_word_id' => '1191', + 'published' => '1311154205', + 'section_id' => '1', + 'word_id' => '1191', + ), + 11194 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '194', + 'frequency' => '0', + 'id' => '15864', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154206', + 'section_id' => '1', + 'word_id' => '2495', + ), + 11195 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '195', + 'frequency' => '0', + 'id' => '15865', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154206', + 'section_id' => '1', + 'word_id' => '2496', + ), + 11196 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '196', + 'frequency' => '0', + 'id' => '15866', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154206', + 'section_id' => '1', + 'word_id' => '2497', + ), + 11197 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '197', + 'frequency' => '0', + 'id' => '15867', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154206', + 'section_id' => '1', + 'word_id' => '2498', + ), + 11198 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '198', + 'frequency' => '0', + 'id' => '15868', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154207', + 'section_id' => '1', + 'word_id' => '2499', + ), + 11199 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '199', + 'frequency' => '0', + 'id' => '15869', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154207', + 'section_id' => '1', + 'word_id' => '2500', + ), + 11200 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '200', + 'frequency' => '0', + 'id' => '15870', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154207', + 'section_id' => '3', + 'word_id' => '2501', + ), + 11201 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '201', + 'frequency' => '0', + 'id' => '15871', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154207', + 'section_id' => '3', + 'word_id' => '2502', + ), + 11202 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15872', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '936', + ), + 11203 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15873', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1717', + 'placement' => '1', + 'prev_word_id' => '936', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11204 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15874', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '2', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1717', + ), + 11205 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15875', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '3', + 'prev_word_id' => '1717', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11206 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15876', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '4', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11207 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15877', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1718', + 'placement' => '5', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11208 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15878', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '6', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1718', + ), + 11209 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15879', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '7', + 'prev_word_id' => '1718', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11210 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15880', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '817', + 'placement' => '8', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '809', + ), + 11211 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15881', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '9', + 'prev_word_id' => '809', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '817', + ), + 11212 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15882', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1720', + 'placement' => '10', + 'prev_word_id' => '817', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1719', + ), + 11213 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15883', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '11', + 'prev_word_id' => '1719', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1720', + ), + 11214 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15884', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '821', + 'placement' => '12', + 'prev_word_id' => '1720', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '974', + ), + 11215 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15885', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '13', + 'prev_word_id' => '974', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '821', + ), + 11216 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15886', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '14', + 'prev_word_id' => '821', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11217 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15887', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '15', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11218 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15888', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '16', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1689', + ), + 11219 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15889', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '17', + 'prev_word_id' => '1689', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1384', + ), + 11220 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15890', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '18', + 'prev_word_id' => '1384', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1370', + ), + 11221 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15891', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '19', + 'prev_word_id' => '1370', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11222 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15892', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '20', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '906', + ), + 11223 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15893', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '21', + 'prev_word_id' => '906', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '836', + ), + 11224 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15894', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '22', + 'prev_word_id' => '836', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1685', + ), + 11225 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15895', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1717', + 'placement' => '23', + 'prev_word_id' => '1685', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11226 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15896', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1721', + 'placement' => '24', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1717', + ), + 11227 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15897', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '25', + 'prev_word_id' => '1717', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1721', + ), + 11228 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15898', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '26', + 'prev_word_id' => '1721', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11229 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15899', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '27', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11230 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15900', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '28', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '930', + ), + 11231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '29', + 'prev_word_id' => '930', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '931', + ), + 11232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1722', + 'placement' => '30', + 'prev_word_id' => '931', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '822', + ), + 11233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '31', + 'prev_word_id' => '822', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1722', + ), + 11234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '32', + 'prev_word_id' => '1722', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '33', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '856', + ), + 11236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1723', + 'placement' => '34', + 'prev_word_id' => '856', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1719', + ), + 11237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1724', + 'placement' => '35', + 'prev_word_id' => '1719', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1723', + ), + 11238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '36', + 'prev_word_id' => '1723', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1724', + ), + 11239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1725', + 'placement' => '37', + 'prev_word_id' => '1724', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1726', + 'placement' => '38', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1725', + ), + 11241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '39', + 'prev_word_id' => '1725', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1726', + ), + 11242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1727', + 'placement' => '40', + 'prev_word_id' => '1726', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '41', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1727', + ), + 11244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '42', + 'prev_word_id' => '1727', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '43', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1728', + ), + 11246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1729', + 'placement' => '44', + 'prev_word_id' => '1728', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '45', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1729', + ), + 11248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '46', + 'prev_word_id' => '1729', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '945', + ), + 11249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '47', + 'prev_word_id' => '945', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1690', + ), + 11250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1730', + 'placement' => '48', + 'prev_word_id' => '1690', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '49', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1730', + ), + 11252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '50', + 'prev_word_id' => '1730', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1481', + ), + 11253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1731', + 'placement' => '51', + 'prev_word_id' => '1481', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1713', + ), + 11254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '52', + 'prev_word_id' => '1713', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1731', + ), + 11255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1732', + 'placement' => '53', + 'prev_word_id' => '1731', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '54', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1732', + ), + 11257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '55', + 'prev_word_id' => '1732', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '56', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1733', + ), + 11259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '57', + 'prev_word_id' => '1733', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '931', + ), + 11260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '58', + 'prev_word_id' => '931', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '822', + ), + 11261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '59', + 'prev_word_id' => '822', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '60', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '61', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '62', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '63', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '64', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1660', + 'placement' => '65', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '66', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1660', + ), + 11269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1734', + 'placement' => '67', + 'prev_word_id' => '1660', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '68', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1734', + ), + 11271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '918', + 'placement' => '69', + 'prev_word_id' => '1734', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1735', + 'placement' => '70', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '918', + ), + 11273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '71', + 'prev_word_id' => '918', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1735', + ), + 11274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '72', + 'prev_word_id' => '1735', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '73', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '931', + ), + 11276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '74', + 'prev_word_id' => '931', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '822', + ), + 11277 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15947', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '75', + 'prev_word_id' => '822', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '805', + ), + 11278 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15948', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '862', + 'placement' => '76', + 'prev_word_id' => '805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11279 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15949', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1490', + 'placement' => '77', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '862', + ), + 11280 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15950', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1639', + 'placement' => '78', + 'prev_word_id' => '862', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1490', + ), + 11281 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15951', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '79', + 'prev_word_id' => '1490', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1639', + ), + 11282 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15952', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1616', + 'placement' => '80', + 'prev_word_id' => '1639', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '822', + ), + 11283 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15953', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1733', + 'placement' => '81', + 'prev_word_id' => '822', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1616', + ), + 11284 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15954', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1736', + 'placement' => '82', + 'prev_word_id' => '1616', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1733', + ), + 11285 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15955', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '83', + 'prev_word_id' => '1733', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1736', + ), + 11286 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15956', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '84', + 'prev_word_id' => '1736', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11287 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15957', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '85', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11288 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15958', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '86', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '831', + ), + 11289 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15959', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1665', + 'placement' => '87', + 'prev_word_id' => '831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11290 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15960', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '88', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1665', + ), + 11291 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15961', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '89', + 'prev_word_id' => '1665', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1410', + ), + 11292 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15962', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '90', + 'prev_word_id' => '1410', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1569', + ), + 11293 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15963', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '91', + 'prev_word_id' => '1569', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1410', + ), + 11294 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15964', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '92', + 'prev_word_id' => '1410', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11295 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15965', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '93', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '831', + ), + 11296 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15966', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1737', + 'placement' => '94', + 'prev_word_id' => '831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1300', + ), + 11297 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15967', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '95', + 'prev_word_id' => '1300', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1737', + ), + 11298 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15968', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '96', + 'prev_word_id' => '1737', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11299 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15969', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '97', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '834', + ), + 11300 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15970', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '861', + 'placement' => '98', + 'prev_word_id' => '834', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11301 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15971', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1738', + 'placement' => '99', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '861', + ), + 11302 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15972', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '100', + 'prev_word_id' => '861', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1738', + ), + 11303 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15973', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '101', + 'prev_word_id' => '1738', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11304 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15974', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1739', + 'placement' => '102', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11305 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15975', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1740', + 'placement' => '103', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1739', + ), + 11306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1741', + 'placement' => '104', + 'prev_word_id' => '1739', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1740', + ), + 11307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '923', + 'placement' => '105', + 'prev_word_id' => '1740', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1741', + ), + 11308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '106', + 'prev_word_id' => '1741', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '923', + ), + 11309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '107', + 'prev_word_id' => '923', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '108', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '109', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '931', + 'placement' => '110', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '111', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '931', + ), + 11314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1722', + 'placement' => '112', + 'prev_word_id' => '931', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '822', + ), + 11315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1742', + 'placement' => '113', + 'prev_word_id' => '822', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1722', + ), + 11316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '114', + 'prev_word_id' => '1722', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1742', + ), + 11317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '115', + 'prev_word_id' => '1742', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '831', + ), + 11318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '116', + 'prev_word_id' => '831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1719', + 'placement' => '117', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '856', + ), + 11320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '118', + 'prev_word_id' => '856', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1719', + ), + 11321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '119', + 'prev_word_id' => '1719', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '120', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '121', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '122', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '856', + ), + 11325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '123', + 'prev_word_id' => '856', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '832', + ), + 11326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '124', + 'prev_word_id' => '832', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '805', + ), + 11327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1743', + 'placement' => '125', + 'prev_word_id' => '805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1690', + ), + 11328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '126', + 'prev_word_id' => '1690', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1743', + ), + 11329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '15999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '853', + 'placement' => '127', + 'prev_word_id' => '1743', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '128', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '853', + ), + 11331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '129', + 'prev_word_id' => '853', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '854', + ), + 11332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1744', + 'placement' => '130', + 'prev_word_id' => '854', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '804', + ), + 11333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '131', + 'prev_word_id' => '804', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1744', + ), + 11334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '132', + 'prev_word_id' => '1744', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '133', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11336 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16006', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1745', + 'placement' => '134', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11337 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16007', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '135', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1745', + ), + 11338 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16008', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '136', + 'prev_word_id' => '1745', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11339 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16009', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '137', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '954', + ), + 11340 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16010', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '138', + 'prev_word_id' => '954', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '823', + ), + 11341 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16011', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '139', + 'prev_word_id' => '823', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11342 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16012', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '140', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '952', + ), + 11343 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16013', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '141', + 'prev_word_id' => '952', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11344 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16014', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '142', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '930', + ), + 11345 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16015', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '143', + 'prev_word_id' => '930', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '856', + ), + 11346 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16016', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '144', + 'prev_word_id' => '856', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11347 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16017', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1746', + 'placement' => '145', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11348 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16018', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '146', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1746', + ), + 11349 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16019', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1618', + 'placement' => '147', + 'prev_word_id' => '1746', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11350 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16020', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '148', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1618', + ), + 11351 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16021', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '149', + 'prev_word_id' => '1618', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1651', + ), + 11352 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16022', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1747', + 'placement' => '150', + 'prev_word_id' => '1651', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11353 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16023', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '151', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1747', + ), + 11354 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16024', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '152', + 'prev_word_id' => '1747', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11355 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16025', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '904', + 'placement' => '153', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '823', + ), + 11356 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16026', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '154', + 'prev_word_id' => '823', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '904', + ), + 11357 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16027', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '155', + 'prev_word_id' => '904', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11358 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16028', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1748', + 'placement' => '156', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '901', + ), + 11359 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16029', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '157', + 'prev_word_id' => '901', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1748', + ), + 11360 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16030', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '158', + 'prev_word_id' => '1748', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11361 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16031', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '159', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11362 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16032', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '160', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11363 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16033', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '161', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11364 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16034', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '162', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1749', + ), + 11365 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16035', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1750', + 'placement' => '163', + 'prev_word_id' => '1749', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11366 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16036', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '164', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1750', + ), + 11367 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16037', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1751', + 'placement' => '165', + 'prev_word_id' => '1750', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11368 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16038', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1752', + 'placement' => '166', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1751', + ), + 11369 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16039', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '167', + 'prev_word_id' => '1751', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1752', + ), + 11370 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16040', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '168', + 'prev_word_id' => '1752', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11371 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16041', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '169', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11372 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16042', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '170', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11373 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16043', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '171', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11374 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16044', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '172', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1258', + ), + 11375 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16045', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1753', + 'placement' => '173', + 'prev_word_id' => '1258', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '823', + ), + 11376 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16046', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1385', + 'placement' => '174', + 'prev_word_id' => '823', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1753', + ), + 11377 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16047', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1723', + 'placement' => '175', + 'prev_word_id' => '1753', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1385', + ), + 11378 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16048', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '176', + 'prev_word_id' => '1385', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1723', + ), + 11379 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16049', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '177', + 'prev_word_id' => '1723', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11380 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16050', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '178', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11381 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16051', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '179', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1530', + ), + 11382 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16052', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '180', + 'prev_word_id' => '1530', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '809', + ), + 11383 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16053', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1612', + 'placement' => '181', + 'prev_word_id' => '809', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '898', + ), + 11384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '182', + 'prev_word_id' => '898', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1612', + ), + 11385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1754', + 'placement' => '183', + 'prev_word_id' => '1612', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '941', + ), + 11386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '184', + 'prev_word_id' => '941', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1754', + ), + 11387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '185', + 'prev_word_id' => '1754', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '898', + ), + 11388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '186', + 'prev_word_id' => '898', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1749', + ), + 11389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '187', + 'prev_word_id' => '1749', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '188', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '804', + ), + 11391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '189', + 'prev_word_id' => '804', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '805', + ), + 11392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '190', + 'prev_word_id' => '805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '191', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1673', + ), + 11394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1755', + 'placement' => '192', + 'prev_word_id' => '1673', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '193', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1755', + ), + 11396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '194', + 'prev_word_id' => '1755', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '832', + ), + 11397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1756', + 'placement' => '195', + 'prev_word_id' => '832', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '196', + 'prev_word_id' => '1417', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1756', + ), + 11399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1757', + 'placement' => '197', + 'prev_word_id' => '1756', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '898', + ), + 11400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1758', + 'placement' => '198', + 'prev_word_id' => '898', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1757', + ), + 11401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '199', + 'prev_word_id' => '1757', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1758', + ), + 11402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1759', + 'placement' => '200', + 'prev_word_id' => '1758', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '201', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1759', + ), + 11404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '202', + 'prev_word_id' => '1759', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1760', + 'placement' => '203', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1275', + 'placement' => '204', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1760', + ), + 11407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '205', + 'prev_word_id' => '1760', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1275', + ), + 11408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '206', + 'prev_word_id' => '1275', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '207', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '208', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '932', + ), + 11411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '209', + 'prev_word_id' => '932', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1689', + ), + 11412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '210', + 'prev_word_id' => '1689', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1761', + ), + 11413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '211', + 'prev_word_id' => '1761', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '898', + ), + 11414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1762', + 'placement' => '212', + 'prev_word_id' => '898', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1683', + ), + 11415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '213', + 'prev_word_id' => '1683', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1762', + ), + 11416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '214', + 'prev_word_id' => '1762', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '215', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '974', + ), + 11418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '216', + 'prev_word_id' => '974', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '217', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1689', + ), + 11420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1763', + 'placement' => '218', + 'prev_word_id' => '1689', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '219', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1763', + ), + 11422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '220', + 'prev_word_id' => '1763', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '221', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1443', + ), + 11424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '222', + 'prev_word_id' => '1443', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '223', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1689', + ), + 11426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1764', + 'placement' => '224', + 'prev_word_id' => '1689', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '225', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1764', + ), + 11428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '226', + 'prev_word_id' => '1764', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1277', + ), + 11429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '227', + 'prev_word_id' => '1277', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '898', + ), + 11430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '228', + 'prev_word_id' => '898', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '932', + ), + 11431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1765', + 'placement' => '229', + 'prev_word_id' => '932', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1766', + 'placement' => '230', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1765', + ), + 11433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1586', + 'placement' => '231', + 'prev_word_id' => '1765', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1766', + ), + 11434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '232', + 'prev_word_id' => '1766', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1586', + ), + 11435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '233', + 'prev_word_id' => '1586', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1761', + ), + 11436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '234', + 'prev_word_id' => '1761', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '836', + ), + 11437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '235', + 'prev_word_id' => '836', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '236', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '237', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1549', + ), + 11440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1767', + 'placement' => '238', + 'prev_word_id' => '1549', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1410', + ), + 11441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1766', + 'placement' => '239', + 'prev_word_id' => '1410', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1767', + ), + 11442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1586', + 'placement' => '240', + 'prev_word_id' => '1767', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1766', + ), + 11443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1768', + 'placement' => '241', + 'prev_word_id' => '1766', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1586', + ), + 11444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '242', + 'prev_word_id' => '1586', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1768', + ), + 11445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '243', + 'prev_word_id' => '1768', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1761', + 'placement' => '244', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '245', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1761', + ), + 11448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '246', + 'prev_word_id' => '1761', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '976', + ), + 11449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '861', + 'placement' => '247', + 'prev_word_id' => '976', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1769', + 'placement' => '248', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '861', + ), + 11451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '249', + 'prev_word_id' => '861', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1769', + ), + 11452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '250', + 'prev_word_id' => '1769', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '893', + ), + 11453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1770', + 'placement' => '251', + 'prev_word_id' => '893', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '252', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1770', + ), + 11455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '253', + 'prev_word_id' => '1770', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1056', + ), + 11456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1771', + 'placement' => '254', + 'prev_word_id' => '1056', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '805', + ), + 11457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '255', + 'prev_word_id' => '805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1771', + ), + 11458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '256', + 'prev_word_id' => '1771', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1008', + ), + 11459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '257', + 'prev_word_id' => '1008', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '258', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '932', + ), + 11461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '259', + 'prev_word_id' => '932', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '836', + ), + 11462 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16132', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '260', + 'prev_word_id' => '836', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11463 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16133', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '261', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11464 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16134', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '262', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1549', + ), + 11465 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16135', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1772', + 'placement' => '263', + 'prev_word_id' => '1549', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1410', + ), + 11466 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16136', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '264', + 'prev_word_id' => '1410', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1772', + ), + 11467 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16137', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '265', + 'prev_word_id' => '1772', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '948', + ), + 11468 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16138', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '266', + 'prev_word_id' => '948', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '949', + ), + 11469 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16139', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '267', + 'prev_word_id' => '949', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1420', + ), + 11470 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16140', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '268', + 'prev_word_id' => '1420', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1749', + ), + 11471 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16141', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '269', + 'prev_word_id' => '1749', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '805', + ), + 11472 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16142', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1773', + 'placement' => '270', + 'prev_word_id' => '805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11473 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16143', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1774', + 'placement' => '271', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1773', + ), + 11474 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16144', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '272', + 'prev_word_id' => '1773', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1774', + ), + 11475 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16145', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '273', + 'prev_word_id' => '1774', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1713', + ), + 11476 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16146', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '274', + 'prev_word_id' => '1713', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11477 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16147', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '275', + 'prev_word_id' => '1417', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11478 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16148', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '845', + 'placement' => '276', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11479 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16149', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '277', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '845', + ), + 11480 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16150', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1717', + 'placement' => '278', + 'prev_word_id' => '845', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11481 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16151', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1775', + 'placement' => '279', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1717', + ), + 11482 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16152', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '280', + 'prev_word_id' => '1717', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1775', + ), + 11483 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16153', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '281', + 'prev_word_id' => '1775', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '976', + ), + 11484 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16154', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '961', + 'placement' => '282', + 'prev_word_id' => '976', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11485 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16155', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '283', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '961', + ), + 11486 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16156', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1776', + 'placement' => '284', + 'prev_word_id' => '961', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11487 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16157', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '285', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1776', + ), + 11488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '286', + 'prev_word_id' => '1776', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '856', + ), + 11489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1777', + 'placement' => '287', + 'prev_word_id' => '856', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1778', + 'placement' => '288', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1777', + ), + 11491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '289', + 'prev_word_id' => '1777', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1778', + ), + 11492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '290', + 'prev_word_id' => '1778', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1779', + 'placement' => '291', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '890', + ), + 11494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '292', + 'prev_word_id' => '890', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1779', + ), + 11495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '293', + 'prev_word_id' => '1779', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1517', + ), + 11496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1780', + 'placement' => '294', + 'prev_word_id' => '1517', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '950', + 'placement' => '295', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1780', + ), + 11498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '296', + 'prev_word_id' => '1780', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '950', + ), + 11499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1404', + 'placement' => '297', + 'prev_word_id' => '950', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '298', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1404', + ), + 11501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1724', + 'placement' => '299', + 'prev_word_id' => '1404', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '976', + ), + 11502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '300', + 'prev_word_id' => '976', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1724', + ), + 11503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1725', + 'placement' => '301', + 'prev_word_id' => '1724', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1726', + 'placement' => '302', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1725', + ), + 11505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1276', + 'placement' => '303', + 'prev_word_id' => '1725', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1726', + ), + 11506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '304', + 'prev_word_id' => '1726', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1276', + ), + 11507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '305', + 'prev_word_id' => '1276', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '856', + ), + 11508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1781', + 'placement' => '306', + 'prev_word_id' => '856', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1562', + 'placement' => '307', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1781', + ), + 11510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '308', + 'prev_word_id' => '1781', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1562', + ), + 11511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '309', + 'prev_word_id' => '1562', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '310', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1782', + 'placement' => '311', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1606', + ), + 11514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '312', + 'prev_word_id' => '1606', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1782', + ), + 11515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '959', + 'placement' => '313', + 'prev_word_id' => '1782', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '823', + ), + 11516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '314', + 'prev_word_id' => '823', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '959', + ), + 11517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1765', + 'placement' => '315', + 'prev_word_id' => '959', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '316', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1765', + ), + 11519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1503', + 'placement' => '317', + 'prev_word_id' => '1765', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '318', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1503', + ), + 11521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1783', + 'placement' => '319', + 'prev_word_id' => '1503', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '320', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1783', + ), + 11523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1784', + 'placement' => '321', + 'prev_word_id' => '1783', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '823', + ), + 11524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '322', + 'prev_word_id' => '823', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1784', + ), + 11525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '323', + 'prev_word_id' => '1784', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '324', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '325', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '326', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1702', + 'placement' => '327', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1785', + 'placement' => '328', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1702', + ), + 11531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1786', + 'placement' => '329', + 'prev_word_id' => '1702', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1785', + ), + 11532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '330', + 'prev_word_id' => '1785', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1786', + ), + 11533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '331', + 'prev_word_id' => '1786', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '332', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '333', + 'prev_word_id' => '1417', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1788', + 'placement' => '334', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1787', + ), + 11537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1789', + 'placement' => '335', + 'prev_word_id' => '1787', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1788', + ), + 11538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '336', + 'prev_word_id' => '1788', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1789', + ), + 11539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '337', + 'prev_word_id' => '1789', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1008', + ), + 11540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '338', + 'prev_word_id' => '1008', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '339', + 'prev_word_id' => '1417', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '930', + ), + 11542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '340', + 'prev_word_id' => '930', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '825', + ), + 11543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '341', + 'prev_word_id' => '825', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1790', + ), + 11544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '342', + 'prev_word_id' => '1790', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1688', + ), + 11545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '343', + 'prev_word_id' => '1688', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '344', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1791', + ), + 11547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1073', + 'placement' => '345', + 'prev_word_id' => '1791', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '346', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1073', + ), + 11549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1792', + 'placement' => '347', + 'prev_word_id' => '1073', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '348', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1792', + ), + 11551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '349', + 'prev_word_id' => '1792', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '350', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1793', + 'placement' => '351', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1056', + 'placement' => '352', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1793', + ), + 11555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '353', + 'prev_word_id' => '1793', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1056', + ), + 11556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1727', + 'placement' => '354', + 'prev_word_id' => '1056', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '355', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1727', + ), + 11558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1728', + 'placement' => '356', + 'prev_word_id' => '1727', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '357', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1728', + ), + 11560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '358', + 'prev_word_id' => '1728', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '945', + ), + 11561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '359', + 'prev_word_id' => '945', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1504', + 'placement' => '360', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '805', + ), + 11563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1794', + 'placement' => '361', + 'prev_word_id' => '805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1504', + ), + 11564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '362', + 'prev_word_id' => '1504', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1794', + ), + 11565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '923', + 'placement' => '363', + 'prev_word_id' => '1794', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1447', + ), + 11566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '364', + 'prev_word_id' => '1447', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '923', + ), + 11567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '365', + 'prev_word_id' => '923', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '945', + ), + 11568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1664', + 'placement' => '366', + 'prev_word_id' => '945', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1337', + ), + 11569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '367', + 'prev_word_id' => '1337', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1664', + ), + 11570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '368', + 'prev_word_id' => '1664', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '976', + ), + 11571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1795', + 'placement' => '369', + 'prev_word_id' => '976', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '974', + ), + 11572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '370', + 'prev_word_id' => '974', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1795', + ), + 11573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1796', + 'placement' => '371', + 'prev_word_id' => '1795', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1797', + 'placement' => '372', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1796', + ), + 11575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '373', + 'prev_word_id' => '1796', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1797', + ), + 11576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '374', + 'prev_word_id' => '1797', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '901', + ), + 11577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1798', + 'placement' => '375', + 'prev_word_id' => '901', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '376', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1798', + ), + 11579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1799', + 'placement' => '377', + 'prev_word_id' => '1798', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1800', + 'placement' => '378', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1799', + ), + 11581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '379', + 'prev_word_id' => '1799', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1800', + ), + 11582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '924', + 'placement' => '380', + 'prev_word_id' => '1800', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '901', + ), + 11583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '381', + 'prev_word_id' => '901', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '924', + ), + 11584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '382', + 'prev_word_id' => '924', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1801', + 'placement' => '383', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '974', + ), + 11586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '384', + 'prev_word_id' => '974', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1801', + ), + 11587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '385', + 'prev_word_id' => '1801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '386', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '921', + ), + 11589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '387', + 'prev_word_id' => '921', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1689', + 'placement' => '388', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '389', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1689', + ), + 11592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1802', + 'placement' => '390', + 'prev_word_id' => '1689', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11593 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16263', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '391', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1802', + ), + 11594 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16264', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '392', + 'prev_word_id' => '1802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11595 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16265', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '393', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1713', + ), + 11596 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16266', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1606', + 'placement' => '394', + 'prev_word_id' => '1713', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11597 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16267', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1803', + 'placement' => '395', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1606', + ), + 11598 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16268', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '396', + 'prev_word_id' => '1606', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1803', + ), + 11599 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16269', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '397', + 'prev_word_id' => '1803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11600 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16270', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '398', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '939', + ), + 11601 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16271', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '399', + 'prev_word_id' => '939', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1560', + ), + 11602 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16272', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1804', + 'placement' => '400', + 'prev_word_id' => '1560', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11603 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16273', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1601', + 'placement' => '401', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1804', + ), + 11604 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16274', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '402', + 'prev_word_id' => '1804', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1601', + ), + 11605 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16275', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1805', + 'placement' => '403', + 'prev_word_id' => '1601', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1277', + ), + 11606 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16276', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '404', + 'prev_word_id' => '1277', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1805', + ), + 11607 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16277', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1806', + 'placement' => '405', + 'prev_word_id' => '1805', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '954', + ), + 11608 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16278', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '406', + 'prev_word_id' => '954', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1806', + ), + 11609 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16279', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1729', + 'placement' => '407', + 'prev_word_id' => '1806', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11610 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16280', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '408', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1729', + ), + 11611 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16281', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1602', + 'placement' => '409', + 'prev_word_id' => '1729', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '945', + ), + 11612 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16282', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '410', + 'prev_word_id' => '945', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1602', + ), + 11613 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16283', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1729', + 'placement' => '411', + 'prev_word_id' => '1602', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11614 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16284', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '412', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1729', + ), + 11615 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16285', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '413', + 'prev_word_id' => '1729', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '945', + ), + 11616 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16286', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '414', + 'prev_word_id' => '945', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1429', + ), + 11617 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16287', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '415', + 'prev_word_id' => '1429', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11618 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16288', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '416', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11619 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16289', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '417', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '895', + ), + 11620 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16290', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '418', + 'prev_word_id' => '895', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '881', + ), + 11621 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16291', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1807', + 'placement' => '419', + 'prev_word_id' => '881', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11622 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16292', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '420', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1807', + ), + 11623 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16293', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '421', + 'prev_word_id' => '1807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11624 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16294', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1808', + 'placement' => '422', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11625 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16295', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1809', + 'placement' => '423', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1808', + ), + 11626 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16296', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1810', + 'placement' => '424', + 'prev_word_id' => '1808', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1809', + ), + 11627 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16297', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1811', + 'placement' => '425', + 'prev_word_id' => '1809', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1810', + ), + 11628 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16298', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '426', + 'prev_word_id' => '1810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1811', + ), + 11629 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16299', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '427', + 'prev_word_id' => '1811', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11630 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16300', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '428', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11631 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16301', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '429', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11632 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16302', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1122', + 'placement' => '430', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '886', + ), + 11633 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16303', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '431', + 'prev_word_id' => '886', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1122', + ), + 11634 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16304', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1648', + 'placement' => '432', + 'prev_word_id' => '1122', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11635 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16305', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '893', + 'placement' => '433', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1648', + ), + 11636 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16306', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '434', + 'prev_word_id' => '1648', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '893', + ), + 11637 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16307', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1604', + 'placement' => '435', + 'prev_word_id' => '893', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11638 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16308', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '436', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1604', + ), + 11639 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16309', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1596', + 'placement' => '437', + 'prev_word_id' => '1604', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '825', + ), + 11640 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16310', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1812', + 'placement' => '438', + 'prev_word_id' => '825', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1596', + ), + 11641 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16311', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '439', + 'prev_word_id' => '1596', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1812', + ), + 11642 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16312', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1447', + 'placement' => '440', + 'prev_word_id' => '1812', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11643 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16313', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '441', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1447', + ), + 11644 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16314', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '442', + 'prev_word_id' => '1447', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1319', + ), + 11645 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16315', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1629', + 'placement' => '443', + 'prev_word_id' => '1319', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11646 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16316', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '444', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1629', + ), + 11647 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16317', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '445', + 'prev_word_id' => '1629', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11648 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16318', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1597', + 'placement' => '446', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1683', + ), + 11649 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16319', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1813', + 'placement' => '447', + 'prev_word_id' => '1683', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1597', + ), + 11650 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16320', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '448', + 'prev_word_id' => '1597', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1813', + ), + 11651 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16321', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '449', + 'prev_word_id' => '1813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11652 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16322', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '450', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1787', + ), + 11653 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16323', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '451', + 'prev_word_id' => '1787', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1396', + ), + 11654 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16324', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1814', + 'placement' => '452', + 'prev_word_id' => '1396', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11655 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16325', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '453', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1814', + ), + 11656 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16326', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '454', + 'prev_word_id' => '1814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '825', + ), + 11657 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16327', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1812', + 'placement' => '455', + 'prev_word_id' => '825', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1443', + ), + 11658 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16328', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '456', + 'prev_word_id' => '1443', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1812', + ), + 11659 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16329', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '457', + 'prev_word_id' => '1812', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1690', + ), + 11660 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16330', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1730', + 'placement' => '458', + 'prev_word_id' => '1690', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11661 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16331', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '459', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1730', + ), + 11662 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16332', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '460', + 'prev_word_id' => '1730', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1290', + ), + 11663 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16333', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '461', + 'prev_word_id' => '1290', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '826', + ), + 11664 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16334', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '462', + 'prev_word_id' => '826', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11665 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16335', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '463', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11666 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16336', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '464', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11667 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16337', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1815', + 'placement' => '465', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11668 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16338', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '466', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1815', + ), + 11669 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16339', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '467', + 'prev_word_id' => '1815', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1384', + ), + 11670 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16340', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1715', + 'placement' => '468', + 'prev_word_id' => '1384', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1816', + ), + 11671 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16341', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '469', + 'prev_word_id' => '1816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1715', + ), + 11672 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16342', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '470', + 'prev_word_id' => '1715', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '809', + ), + 11673 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16343', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1817', + 'placement' => '471', + 'prev_word_id' => '809', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11674 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16344', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '472', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1817', + ), + 11675 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16345', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '473', + 'prev_word_id' => '1817', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11676 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16346', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '474', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '895', + ), + 11677 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16347', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '475', + 'prev_word_id' => '895', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '881', + ), + 11678 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16348', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '476', + 'prev_word_id' => '881', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11679 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16349', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '477', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '815', + ), + 11680 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16350', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '478', + 'prev_word_id' => '815', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11681 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16351', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1651', + 'placement' => '479', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '968', + ), + 11682 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16352', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '480', + 'prev_word_id' => '968', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1651', + ), + 11683 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16353', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '481', + 'prev_word_id' => '1651', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11684 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16354', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '482', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1816', + ), + 11685 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16355', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '483', + 'prev_word_id' => '1816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1818', + ), + 11686 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16356', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '484', + 'prev_word_id' => '1818', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11687 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16357', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '485', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11688 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16358', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '486', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1319', + ), + 11689 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16359', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1819', + 'placement' => '487', + 'prev_word_id' => '1319', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '810', + ), + 11690 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16360', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1820', + 'placement' => '488', + 'prev_word_id' => '810', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1819', + ), + 11691 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16361', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '489', + 'prev_word_id' => '1819', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1820', + ), + 11692 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16362', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '490', + 'prev_word_id' => '1820', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11693 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16363', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '491', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1443', + ), + 11694 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16364', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1818', + 'placement' => '492', + 'prev_word_id' => '1443', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '974', + ), + 11695 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16365', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '493', + 'prev_word_id' => '974', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1818', + ), + 11696 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16366', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '494', + 'prev_word_id' => '1818', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11697 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16367', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '495', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '843', + ), + 11698 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16368', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1821', + 'placement' => '496', + 'prev_word_id' => '843', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1631', + ), + 11699 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16369', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '497', + 'prev_word_id' => '1631', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1821', + ), + 11700 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16370', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1730', + 'placement' => '498', + 'prev_word_id' => '1821', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '804', + ), + 11701 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16371', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1822', + 'placement' => '499', + 'prev_word_id' => '804', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1730', + ), + 11702 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16372', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '500', + 'prev_word_id' => '1730', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1822', + ), + 11703 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16373', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '501', + 'prev_word_id' => '1822', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '814', + ), + 11704 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16374', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1823', + 'placement' => '502', + 'prev_word_id' => '814', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '807', + ), + 11705 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16375', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '503', + 'prev_word_id' => '807', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1823', + ), + 11706 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16376', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1247', + 'placement' => '504', + 'prev_word_id' => '1823', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '831', + ), + 11707 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16377', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '505', + 'prev_word_id' => '831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1247', + ), + 11708 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16378', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '506', + 'prev_word_id' => '1247', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11709 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16379', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '507', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11710 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16380', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1779', + 'placement' => '508', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11711 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16381', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1824', + 'placement' => '509', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1779', + ), + 11712 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16382', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '914', + 'placement' => '510', + 'prev_word_id' => '1779', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1824', + ), + 11713 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16383', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '511', + 'prev_word_id' => '1824', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '914', + ), + 11714 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16384', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '512', + 'prev_word_id' => '914', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1686', + ), + 11715 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16385', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '513', + 'prev_word_id' => '1686', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '831', + ), + 11716 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16386', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '514', + 'prev_word_id' => '831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11717 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16387', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1713', + 'placement' => '515', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1481', + ), + 11718 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16388', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1731', + 'placement' => '516', + 'prev_word_id' => '1481', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1713', + ), + 11719 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16389', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '517', + 'prev_word_id' => '1713', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1731', + ), + 11720 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16390', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '518', + 'prev_word_id' => '1731', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '802', + ), + 11721 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16391', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1646', + 'placement' => '519', + 'prev_word_id' => '802', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '803', + ), + 11722 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16392', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '520', + 'prev_word_id' => '803', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1646', + ), + 11723 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16393', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '521', + 'prev_word_id' => '1646', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '836', + ), + 11724 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16394', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '522', + 'prev_word_id' => '836', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1685', + ), + 11725 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16395', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '523', + 'prev_word_id' => '1685', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '816', + ), + 11726 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16396', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '524', + 'prev_word_id' => '816', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '894', + ), + 11727 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16397', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '525', + 'prev_word_id' => '894', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '801', + ), + 11728 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16398', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '526', + 'prev_word_id' => '801', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '939', + ), + 11729 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16399', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '527', + 'prev_word_id' => '939', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '830', + ), + 11730 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16400', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '528', + 'prev_word_id' => '830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11731 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16401', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '529', + 'prev_word_id' => '1437', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1396', + ), + 11732 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16402', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1825', + 'placement' => '530', + 'prev_word_id' => '1396', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '844', + ), + 11733 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16403', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1826', + 'placement' => '531', + 'prev_word_id' => '844', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1825', + ), + 11734 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16404', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '532', + 'prev_word_id' => '1825', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1826', + ), + 11735 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16405', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '533', + 'prev_word_id' => '1826', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1008', + ), + 11736 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16406', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1827', + 'placement' => '534', + 'prev_word_id' => '1008', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1481', + ), + 11737 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16407', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1828', + 'placement' => '535', + 'prev_word_id' => '1481', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1827', + ), + 11738 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16408', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1829', + 'placement' => '536', + 'prev_word_id' => '1827', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1828', + ), + 11739 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16409', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1679', + 'placement' => '537', + 'prev_word_id' => '1828', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1829', + ), + 11740 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16410', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '538', + 'prev_word_id' => '1829', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1679', + ), + 11741 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16411', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1685', + 'placement' => '539', + 'prev_word_id' => '1679', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '833', + ), + 11742 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16412', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '540', + 'prev_word_id' => '833', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1685', + ), + 11743 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16413', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '541', + 'prev_word_id' => '1685', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '831', + ), + 11744 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16414', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1830', + 'placement' => '542', + 'prev_word_id' => '831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '813', + ), + 11745 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16415', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1831', + 'placement' => '543', + 'prev_word_id' => '813', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1830', + ), + 11746 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16416', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1832', + 'placement' => '544', + 'prev_word_id' => '1830', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1831', + ), + 11747 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16417', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '545', + 'prev_word_id' => '1831', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1832', + ), + 11748 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16418', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '546', + 'prev_word_id' => '1832', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '886', + ), + 11749 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16419', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1673', + 'placement' => '547', + 'prev_word_id' => '886', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1443', + ), + 11750 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16420', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '548', + 'prev_word_id' => '1443', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1673', + ), + 11751 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16421', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1370', + 'placement' => '549', + 'prev_word_id' => '1673', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '863', + ), + 11752 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16422', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '550', + 'prev_word_id' => '863', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1370', + ), + 11753 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16423', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '551', + 'prev_word_id' => '1370', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1191', + ), + 11754 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '202', + 'frequency' => '0', + 'id' => '16424', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '552', + 'prev_word_id' => '1191', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '1191', + ), + 11755 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '203', + 'frequency' => '0', + 'id' => '16425', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '2503', + ), + 11756 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '204', + 'frequency' => '0', + 'id' => '16426', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '2504', + ), + 11757 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '205', + 'frequency' => '0', + 'id' => '16427', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154208', + 'section_id' => '1', + 'word_id' => '2505', + ), + 11758 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '206', + 'frequency' => '0', + 'id' => '16428', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154209', + 'section_id' => '1', + 'word_id' => '2506', + ), + 11759 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '207', + 'frequency' => '0', + 'id' => '16429', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154209', + 'section_id' => '1', + 'word_id' => '2507', + ), + 11760 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '208', + 'frequency' => '0', + 'id' => '16430', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154209', + 'section_id' => '1', + 'word_id' => '2508', + ), + 11761 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '209', + 'frequency' => '0', + 'id' => '16431', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154209', + 'section_id' => '1', + 'word_id' => '2509', + ), + 11762 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '210', + 'frequency' => '0', + 'id' => '16432', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '2510', + ), + 11763 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16433', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '936', + ), + 11764 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16434', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '937', + 'placement' => '1', + 'prev_word_id' => '936', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 11765 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16435', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '2', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '937', + ), + 11766 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16436', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '3', + 'prev_word_id' => '937', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '809', + ), + 11767 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16437', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '4', + 'prev_word_id' => '809', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11768 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16438', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '5', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11769 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16439', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '6', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11770 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16440', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '7', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11771 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16441', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '8', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11772 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16442', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '9', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '921', + ), + 11773 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16443', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '10', + 'prev_word_id' => '921', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1414', + ), + 11774 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16444', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1833', + 'placement' => '11', + 'prev_word_id' => '1414', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11775 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16445', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '12', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1833', + ), + 11776 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16446', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1415', + 'placement' => '13', + 'prev_word_id' => '1833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '978', + ), + 11777 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16447', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '14', + 'prev_word_id' => '978', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1415', + ), + 11778 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16448', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '15', + 'prev_word_id' => '1415', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11779 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16449', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '831', + 'placement' => '16', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11780 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16450', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1320', + 'placement' => '17', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '831', + ), + 11781 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16451', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '18', + 'prev_word_id' => '831', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1320', + ), + 11782 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16452', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '19', + 'prev_word_id' => '1320', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '854', + ), + 11783 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16453', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '20', + 'prev_word_id' => '854', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '976', + ), + 11784 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16454', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1834', + 'placement' => '21', + 'prev_word_id' => '976', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11785 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16455', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '22', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1834', + ), + 11786 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16456', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '23', + 'prev_word_id' => '1834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '943', + ), + 11787 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16457', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '837', + 'placement' => '24', + 'prev_word_id' => '943', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11788 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16458', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '25', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '837', + ), + 11789 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16459', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '26', + 'prev_word_id' => '837', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1835', + ), + 11790 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16460', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1836', + 'placement' => '27', + 'prev_word_id' => '1835', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 11791 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16461', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '28', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1836', + ), + 11792 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16462', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1837', + 'placement' => '29', + 'prev_word_id' => '1836', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11793 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16463', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '30', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1837', + ), + 11794 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16464', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '31', + 'prev_word_id' => '1837', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11795 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16465', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '32', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11796 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16466', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '33', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11797 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16467', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '34', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11798 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16468', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1838', + 'placement' => '35', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 11799 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16469', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '36', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1838', + ), + 11800 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16470', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '37', + 'prev_word_id' => '1838', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '940', + ), + 11801 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16471', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '38', + 'prev_word_id' => '940', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '968', + ), + 11802 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16472', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '39', + 'prev_word_id' => '968', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1839', + ), + 11803 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16473', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '40', + 'prev_word_id' => '1839', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11804 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16474', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '41', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1840', + ), + 11805 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16475', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '42', + 'prev_word_id' => '1840', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1547', + ), + 11806 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16476', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1841', + 'placement' => '43', + 'prev_word_id' => '1547', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1548', + ), + 11807 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16477', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '44', + 'prev_word_id' => '1548', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1841', + ), + 11808 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16478', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1842', + 'placement' => '45', + 'prev_word_id' => '1841', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11809 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16479', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '46', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1842', + ), + 11810 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16480', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '47', + 'prev_word_id' => '1842', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 11811 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16481', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '48', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '846', + ), + 11812 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16482', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '49', + 'prev_word_id' => '846', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11813 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16483', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '50', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11814 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16484', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '51', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '938', + ), + 11815 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16485', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '52', + 'prev_word_id' => '938', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11816 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16486', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '53', + 'prev_word_id' => '1417', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 11817 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16487', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '54', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1843', + ), + 11818 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16488', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '55', + 'prev_word_id' => '1843', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11819 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16489', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '56', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11820 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16490', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '57', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1258', + ), + 11821 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16491', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '58', + 'prev_word_id' => '1258', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11822 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16492', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '59', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1237', + ), + 11823 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16493', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '60', + 'prev_word_id' => '1237', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11824 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16494', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '61', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11825 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16495', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1838', + 'placement' => '62', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 11826 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16496', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '63', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1838', + ), + 11827 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16497', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1844', + 'placement' => '64', + 'prev_word_id' => '1838', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1609', + ), + 11828 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16498', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '65', + 'prev_word_id' => '1609', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1844', + ), + 11829 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16499', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '66', + 'prev_word_id' => '1844', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11830 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16500', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '67', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11831 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16501', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '68', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 11832 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16502', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '69', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11833 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16503', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '70', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11834 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16504', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '71', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11835 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16505', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '72', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11836 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16506', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1683', + 'placement' => '73', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11837 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16507', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '74', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1683', + ), + 11838 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16508', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '75', + 'prev_word_id' => '1683', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11839 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16509', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '76', + 'prev_word_id' => '1417', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11840 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16510', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1845', + 'placement' => '77', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 11841 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16511', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '78', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1845', + ), + 11842 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16512', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '79', + 'prev_word_id' => '1845', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11843 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16513', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '80', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11844 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16514', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '81', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '901', + ), + 11845 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16515', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '82', + 'prev_word_id' => '901', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11846 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16516', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '83', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 11847 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16517', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '84', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11848 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16518', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '85', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11849 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16519', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '86', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 11850 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16520', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '87', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11851 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16521', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1846', + 'placement' => '88', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11852 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16522', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '89', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1846', + ), + 11853 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16523', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '90', + 'prev_word_id' => '1846', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11854 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16524', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1847', + 'placement' => '91', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 11855 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16525', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '92', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1847', + ), + 11856 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16526', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1849', + 'placement' => '93', + 'prev_word_id' => '1847', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1848', + ), + 11857 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16527', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '94', + 'prev_word_id' => '1848', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1849', + ), + 11858 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16528', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1850', + 'placement' => '95', + 'prev_word_id' => '1849', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '836', + ), + 11859 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16529', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1318', + 'placement' => '96', + 'prev_word_id' => '836', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1850', + ), + 11860 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16530', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1706', + 'placement' => '97', + 'prev_word_id' => '1850', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1318', + ), + 11861 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16531', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '98', + 'prev_word_id' => '1318', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1706', + ), + 11862 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16532', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1851', + 'placement' => '99', + 'prev_word_id' => '1706', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1609', + ), + 11863 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16533', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '100', + 'prev_word_id' => '1609', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1851', + ), + 11864 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16534', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '101', + 'prev_word_id' => '1851', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1848', + ), + 11865 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16535', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '102', + 'prev_word_id' => '1848', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11866 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16536', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '103', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11867 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16537', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '104', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 11868 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16538', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1789', + 'placement' => '105', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11869 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16539', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '106', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1789', + ), + 11870 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16540', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '107', + 'prev_word_id' => '1789', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '917', + ), + 11871 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16541', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1852', + 'placement' => '108', + 'prev_word_id' => '917', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11872 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16542', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '109', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1852', + ), + 11873 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16543', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1853', + 'placement' => '110', + 'prev_word_id' => '1852', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11874 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16544', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '111', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1853', + ), + 11875 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16545', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '112', + 'prev_word_id' => '1853', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11876 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16546', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1854', + 'placement' => '113', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 11877 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16547', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '114', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1854', + ), + 11878 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16548', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1855', + 'placement' => '115', + 'prev_word_id' => '1854', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '886', + ), + 11879 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16549', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '116', + 'prev_word_id' => '886', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1855', + ), + 11880 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16550', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '117', + 'prev_word_id' => '1855', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1008', + ), + 11881 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16551', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1856', + 'placement' => '118', + 'prev_word_id' => '1008', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11882 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16552', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '119', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1856', + ), + 11883 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16553', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '120', + 'prev_word_id' => '1856', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11884 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16554', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1857', + 'placement' => '121', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11885 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16555', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '122', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1857', + ), + 11886 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16556', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '123', + 'prev_word_id' => '1857', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 11887 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16557', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '901', + 'placement' => '124', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11888 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16558', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1854', + 'placement' => '125', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '901', + ), + 11889 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16559', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '126', + 'prev_word_id' => '901', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1854', + ), + 11890 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16560', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1858', + 'placement' => '127', + 'prev_word_id' => '1854', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1008', + ), + 11891 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16561', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '128', + 'prev_word_id' => '1008', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1858', + ), + 11892 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16562', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1859', + 'placement' => '129', + 'prev_word_id' => '1858', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1816', + ), + 11893 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16563', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '130', + 'prev_word_id' => '1816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1859', + ), + 11894 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16564', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '131', + 'prev_word_id' => '1859', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '836', + ), + 11895 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16565', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '915', + 'placement' => '132', + 'prev_word_id' => '836', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11896 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16566', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '133', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '915', + ), + 11897 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16567', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1860', + 'placement' => '134', + 'prev_word_id' => '915', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 11898 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16568', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1861', + 'placement' => '135', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1860', + ), + 11899 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16569', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '136', + 'prev_word_id' => '1860', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1861', + ), + 11900 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16570', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1798', + 'placement' => '137', + 'prev_word_id' => '1861', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1848', + ), + 11901 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16571', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '138', + 'prev_word_id' => '1848', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1798', + ), + 11902 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16572', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1862', + 'placement' => '139', + 'prev_word_id' => '1798', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11903 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16573', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1863', + 'placement' => '140', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1862', + ), + 11904 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16574', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1864', + 'placement' => '141', + 'prev_word_id' => '1862', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1863', + ), + 11905 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16575', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '142', + 'prev_word_id' => '1863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1864', + ), + 11906 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16576', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1865', + 'placement' => '143', + 'prev_word_id' => '1864', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11907 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16577', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '144', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1865', + ), + 11908 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16578', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '145', + 'prev_word_id' => '1865', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11909 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16579', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '146', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11910 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16580', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '147', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 11911 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16581', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1684', + 'placement' => '148', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 11912 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16582', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '149', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1684', + ), + 11913 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16583', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '150', + 'prev_word_id' => '1684', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1336', + ), + 11914 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16584', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1756', + 'placement' => '151', + 'prev_word_id' => '1336', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1417', + ), + 11915 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16585', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '152', + 'prev_word_id' => '1417', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1756', + ), + 11916 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16586', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1848', + 'placement' => '153', + 'prev_word_id' => '1756', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 11917 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16587', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1849', + 'placement' => '154', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1848', + ), + 11918 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16588', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '155', + 'prev_word_id' => '1848', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1849', + ), + 11919 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16589', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1866', + 'placement' => '156', + 'prev_word_id' => '1849', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 11920 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16590', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1517', + 'placement' => '157', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1866', + ), + 11921 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16591', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1337', + 'placement' => '158', + 'prev_word_id' => '1866', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1517', + ), + 11922 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16592', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '159', + 'prev_word_id' => '1517', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1337', + ), + 11923 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16593', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1867', + 'placement' => '160', + 'prev_word_id' => '1337', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '836', + ), + 11924 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16594', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '161', + 'prev_word_id' => '836', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1867', + ), + 11925 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16595', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1852', + 'placement' => '162', + 'prev_word_id' => '1867', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11926 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16596', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1310', + 'placement' => '163', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1852', + ), + 11927 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16597', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '164', + 'prev_word_id' => '1852', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1310', + ), + 11928 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16598', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1866', + 'placement' => '165', + 'prev_word_id' => '1310', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 11929 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16599', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '166', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1866', + ), + 11930 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16600', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1868', + 'placement' => '167', + 'prev_word_id' => '1866', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11931 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16601', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '168', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1868', + ), + 11932 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16602', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1869', + 'placement' => '169', + 'prev_word_id' => '1868', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 11933 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16603', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1677', + 'placement' => '170', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1869', + ), + 11934 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16604', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '171', + 'prev_word_id' => '1869', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1677', + ), + 11935 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16605', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '172', + 'prev_word_id' => '1677', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11936 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16606', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1851', + 'placement' => '173', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11937 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16607', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1870', + 'placement' => '174', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1851', + ), + 11938 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16608', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '175', + 'prev_word_id' => '1851', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1870', + ), + 11939 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16609', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '176', + 'prev_word_id' => '1870', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11940 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16610', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1336', + 'placement' => '177', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 11941 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16611', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '940', + 'placement' => '178', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1336', + ), + 11942 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16612', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '968', + 'placement' => '179', + 'prev_word_id' => '1336', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '940', + ), + 11943 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16613', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '180', + 'prev_word_id' => '940', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '968', + ), + 11944 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16614', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '181', + 'prev_word_id' => '968', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1839', + ), + 11945 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16615', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '182', + 'prev_word_id' => '1839', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11946 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16616', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '183', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1840', + ), + 11947 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16617', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1471', + 'placement' => '184', + 'prev_word_id' => '1840', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11948 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16618', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1871', + 'placement' => '185', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1471', + ), + 11949 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16619', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '186', + 'prev_word_id' => '1471', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1871', + ), + 11950 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16620', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1342', + 'placement' => '187', + 'prev_word_id' => '1871', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 11951 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16621', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '188', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1342', + ), + 11952 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16622', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1343', + 'placement' => '189', + 'prev_word_id' => '1342', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '844', + ), + 11953 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16623', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '190', + 'prev_word_id' => '844', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1343', + ), + 11954 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16624', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1317', + 'placement' => '191', + 'prev_word_id' => '1343', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 11955 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16625', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '192', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1317', + ), + 11956 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16626', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '193', + 'prev_word_id' => '1317', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 11957 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16627', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1739', + 'placement' => '194', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 11958 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16628', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '195', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1739', + ), + 11959 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16629', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1872', + 'placement' => '196', + 'prev_word_id' => '1739', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11960 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16630', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '197', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1872', + ), + 11961 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16631', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '198', + 'prev_word_id' => '1872', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11962 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16632', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '199', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '974', + ), + 11963 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16633', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '200', + 'prev_word_id' => '974', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11964 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16634', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '201', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11965 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16635', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '202', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '807', + ), + 11966 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16636', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '203', + 'prev_word_id' => '807', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '804', + ), + 11967 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16637', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '204', + 'prev_word_id' => '804', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '843', + ), + 11968 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16638', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1873', + 'placement' => '205', + 'prev_word_id' => '843', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '844', + ), + 11969 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16639', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '206', + 'prev_word_id' => '844', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1873', + ), + 11970 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16640', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1874', + 'placement' => '207', + 'prev_word_id' => '1873', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1008', + ), + 11971 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16641', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '208', + 'prev_word_id' => '1008', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1874', + ), + 11972 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16642', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '209', + 'prev_word_id' => '1874', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 11973 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16643', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '210', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1839', + ), + 11974 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16644', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '211', + 'prev_word_id' => '1839', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11975 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16645', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '212', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 11976 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16646', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '213', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 11977 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16647', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1875', + 'placement' => '214', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11978 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16648', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1840', + 'placement' => '215', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1875', + ), + 11979 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16649', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '216', + 'prev_word_id' => '1875', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1840', + ), + 11980 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16650', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '217', + 'prev_word_id' => '1840', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 11981 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16651', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1631', + 'placement' => '218', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '843', + ), + 11982 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16652', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '219', + 'prev_word_id' => '843', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1631', + ), + 11983 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16653', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1876', + 'placement' => '220', + 'prev_word_id' => '1631', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '939', + ), + 11984 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16654', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '807', + 'placement' => '221', + 'prev_word_id' => '939', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1876', + ), + 11985 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16655', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1877', + 'placement' => '222', + 'prev_word_id' => '1876', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '807', + ), + 11986 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16656', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '223', + 'prev_word_id' => '807', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1877', + ), + 11987 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16657', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1878', + 'placement' => '224', + 'prev_word_id' => '1877', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 11988 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16658', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1560', + 'placement' => '225', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1878', + ), + 11989 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16659', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1839', + 'placement' => '226', + 'prev_word_id' => '1878', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1560', + ), + 11990 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16660', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '227', + 'prev_word_id' => '1560', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1839', + ), + 11991 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16661', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '228', + 'prev_word_id' => '1839', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 11992 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16662', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '229', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1879', + ), + 11993 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16663', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '230', + 'prev_word_id' => '1879', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1787', + ), + 11994 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16664', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '231', + 'prev_word_id' => '1787', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1547', + ), + 11995 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16665', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1841', + 'placement' => '232', + 'prev_word_id' => '1547', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1548', + ), + 11996 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16666', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '233', + 'prev_word_id' => '1548', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1841', + ), + 11997 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16667', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1842', + 'placement' => '234', + 'prev_word_id' => '1841', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 11998 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16668', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '235', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1842', + ), + 11999 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16669', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '236', + 'prev_word_id' => '1842', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 12000 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16670', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '237', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12001 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16671', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1880', + 'placement' => '238', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12002 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16672', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '239', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1880', + ), + 12003 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16673', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '240', + 'prev_word_id' => '1880', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1410', + ), + 12004 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16674', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '241', + 'prev_word_id' => '1410', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1569', + ), + 12005 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16675', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '242', + 'prev_word_id' => '1569', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1410', + ), + 12006 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16676', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1881', + 'placement' => '243', + 'prev_word_id' => '1410', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12007 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16677', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1882', + 'placement' => '244', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1881', + ), + 12008 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16678', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '245', + 'prev_word_id' => '1881', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1882', + ), + 12009 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16679', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '246', + 'prev_word_id' => '1882', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 12010 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16680', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '247', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12011 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16681', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '248', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12012 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16682', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '249', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '886', + ), + 12013 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16683', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '250', + 'prev_word_id' => '886', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '854', + ), + 12014 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16684', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '251', + 'prev_word_id' => '854', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '976', + ), + 12015 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16685', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '252', + 'prev_word_id' => '976', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12016 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16686', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '253', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 12017 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16687', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '254', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1417', + ), + 12018 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16688', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '255', + 'prev_word_id' => '1417', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '886', + ), + 12019 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16689', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '256', + 'prev_word_id' => '886', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 12020 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16690', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '257', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1547', + ), + 12021 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16691', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1841', + 'placement' => '258', + 'prev_word_id' => '1547', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1548', + ), + 12022 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16692', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '259', + 'prev_word_id' => '1548', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1841', + ), + 12023 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16693', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1883', + 'placement' => '260', + 'prev_word_id' => '1841', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 12024 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16694', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '261', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1883', + ), + 12025 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16695', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1884', + 'placement' => '262', + 'prev_word_id' => '1883', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 12026 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16696', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '263', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1884', + ), + 12027 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16697', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '264', + 'prev_word_id' => '1884', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12028 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16698', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '265', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '910', + ), + 12029 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16699', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1671', + 'placement' => '266', + 'prev_word_id' => '910', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1835', + ), + 12030 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16700', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '267', + 'prev_word_id' => '1835', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1671', + ), + 12031 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16701', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1885', + 'placement' => '268', + 'prev_word_id' => '1671', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '841', + ), + 12032 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16702', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '269', + 'prev_word_id' => '841', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1885', + ), + 12033 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16703', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '270', + 'prev_word_id' => '1885', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1620', + ), + 12034 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16704', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '271', + 'prev_word_id' => '1620', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1280', + ), + 12035 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16705', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '272', + 'prev_word_id' => '1280', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 12036 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16706', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1886', + 'placement' => '273', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1749', + ), + 12037 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16707', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '274', + 'prev_word_id' => '1749', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1886', + ), + 12038 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16708', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1887', + 'placement' => '275', + 'prev_word_id' => '1886', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 12039 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16709', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '276', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1887', + ), + 12040 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16710', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '277', + 'prev_word_id' => '1887', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12041 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16711', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '278', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12042 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16712', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '279', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12043 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16713', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '280', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12044 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16714', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '281', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12045 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16715', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '282', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 12046 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16716', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '283', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 12047 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16717', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '284', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1396', + ), + 12048 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16718', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '285', + 'prev_word_id' => '1396', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '897', + ), + 12049 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16719', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '286', + 'prev_word_id' => '897', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 12050 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16720', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1888', + 'placement' => '287', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 12051 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16721', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1321', + 'placement' => '288', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1888', + ), + 12052 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16722', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1479', + 'placement' => '289', + 'prev_word_id' => '1888', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1321', + ), + 12053 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16723', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '290', + 'prev_word_id' => '1321', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1479', + ), + 12054 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16724', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1889', + 'placement' => '291', + 'prev_word_id' => '1479', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '976', + ), + 12055 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16725', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1890', + 'placement' => '292', + 'prev_word_id' => '976', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1889', + ), + 12056 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16726', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1891', + 'placement' => '293', + 'prev_word_id' => '1889', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1890', + ), + 12057 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16727', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '294', + 'prev_word_id' => '1890', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1891', + ), + 12058 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16728', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '295', + 'prev_word_id' => '1891', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 12059 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16729', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '296', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '841', + ), + 12060 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16730', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '297', + 'prev_word_id' => '841', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12061 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16731', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1359', + 'placement' => '298', + 'prev_word_id' => '1550', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 12062 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16732', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '886', + 'placement' => '299', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1359', + ), + 12063 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16733', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1892', + 'placement' => '300', + 'prev_word_id' => '1359', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '886', + ), + 12064 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16734', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '301', + 'prev_word_id' => '886', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1892', + ), + 12065 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16735', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1889', + 'placement' => '302', + 'prev_word_id' => '1892', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 12066 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16736', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '303', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1889', + ), + 12067 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16737', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '895', + 'placement' => '304', + 'prev_word_id' => '1889', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12068 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16738', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1893', + 'placement' => '305', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '895', + ), + 12069 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16739', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1567', + 'placement' => '306', + 'prev_word_id' => '895', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1893', + ), + 12070 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16740', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '307', + 'prev_word_id' => '1893', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1567', + ), + 12071 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16741', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '308', + 'prev_word_id' => '1567', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 12072 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16742', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '309', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '841', + ), + 12073 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16743', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '310', + 'prev_word_id' => '841', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12074 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16744', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '311', + 'prev_word_id' => '1550', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1835', + ), + 12075 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16745', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '312', + 'prev_word_id' => '1835', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1319', + ), + 12076 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16746', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1894', + 'placement' => '313', + 'prev_word_id' => '1319', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12077 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16747', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '314', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1894', + ), + 12078 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16748', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '315', + 'prev_word_id' => '1894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '809', + ), + 12079 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16749', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1895', + 'placement' => '316', + 'prev_word_id' => '809', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1605', + ), + 12080 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16750', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1321', + 'placement' => '317', + 'prev_word_id' => '1605', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1895', + ), + 12081 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16751', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '318', + 'prev_word_id' => '1895', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1321', + ), + 12082 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16752', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1896', + 'placement' => '319', + 'prev_word_id' => '1321', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1620', + ), + 12083 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16753', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '320', + 'prev_word_id' => '1620', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1896', + ), + 12084 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16754', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1897', + 'placement' => '321', + 'prev_word_id' => '1896', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1609', + ), + 12085 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16755', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1898', + 'placement' => '322', + 'prev_word_id' => '1609', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1897', + ), + 12086 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16756', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '323', + 'prev_word_id' => '1897', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1898', + ), + 12087 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16757', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1899', + 'placement' => '324', + 'prev_word_id' => '1898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12088 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16758', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '325', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1899', + ), + 12089 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16759', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1900', + 'placement' => '326', + 'prev_word_id' => '1899', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12090 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16760', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '327', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1900', + ), + 12091 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16761', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '328', + 'prev_word_id' => '1900', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 12092 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16762', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1901', + 'placement' => '329', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '804', + ), + 12093 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16763', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1548', + 'placement' => '330', + 'prev_word_id' => '804', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1901', + ), + 12094 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16764', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '331', + 'prev_word_id' => '1901', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1548', + ), + 12095 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16765', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '332', + 'prev_word_id' => '1548', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 12096 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16766', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '333', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '882', + ), + 12097 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16767', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1890', + 'placement' => '334', + 'prev_word_id' => '882', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 12098 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16768', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1902', + 'placement' => '335', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1890', + ), + 12099 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16769', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '336', + 'prev_word_id' => '1890', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1902', + ), + 12100 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16770', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '337', + 'prev_word_id' => '1902', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12101 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16771', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1358', + 'placement' => '338', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12102 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16772', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '339', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1358', + ), + 12103 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16773', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1509', + 'placement' => '340', + 'prev_word_id' => '1358', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 12104 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16774', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1903', + 'placement' => '341', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1509', + ), + 12105 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16775', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '342', + 'prev_word_id' => '1509', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1903', + ), + 12106 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16776', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1904', + 'placement' => '343', + 'prev_word_id' => '1903', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 12107 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16777', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1905', + 'placement' => '344', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1904', + ), + 12108 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16778', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '345', + 'prev_word_id' => '1904', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1905', + ), + 12109 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16779', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1906', + 'placement' => '346', + 'prev_word_id' => '1905', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 12110 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16780', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1468', + 'placement' => '347', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1906', + ), + 12111 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16781', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '348', + 'prev_word_id' => '1906', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1468', + ), + 12112 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16782', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1907', + 'placement' => '349', + 'prev_word_id' => '1468', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 12113 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16783', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1908', + 'placement' => '350', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1907', + ), + 12114 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16784', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '351', + 'prev_word_id' => '1907', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1908', + ), + 12115 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16785', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1591', + 'placement' => '352', + 'prev_word_id' => '1908', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 12116 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16786', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '353', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1591', + ), + 12117 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16787', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1909', + 'placement' => '354', + 'prev_word_id' => '1591', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '870', + ), + 12118 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16788', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '355', + 'prev_word_id' => '870', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1909', + ), + 12119 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16789', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1910', + 'placement' => '356', + 'prev_word_id' => '1909', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12120 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16790', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '868', + 'placement' => '357', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1910', + ), + 12121 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16791', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1911', + 'placement' => '358', + 'prev_word_id' => '1910', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '868', + ), + 12122 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16792', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '804', + 'placement' => '359', + 'prev_word_id' => '868', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1911', + ), + 12123 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16793', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '360', + 'prev_word_id' => '1911', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '804', + ), + 12124 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16794', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1912', + 'placement' => '361', + 'prev_word_id' => '804', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '882', + ), + 12125 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16795', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '362', + 'prev_word_id' => '882', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1912', + ), + 12126 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16796', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '363', + 'prev_word_id' => '1912', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12127 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16797', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1913', + 'placement' => '364', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 12128 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16798', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '365', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1913', + ), + 12129 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16799', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '366', + 'prev_word_id' => '1913', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '943', + ), + 12130 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16800', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1835', + 'placement' => '367', + 'prev_word_id' => '943', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 12131 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16801', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '368', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1835', + ), + 12132 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16802', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '369', + 'prev_word_id' => '1835', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12133 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16803', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '846', + 'placement' => '370', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '881', + ), + 12134 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16804', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '371', + 'prev_word_id' => '881', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '846', + ), + 12135 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16805', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '372', + 'prev_word_id' => '846', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12136 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16806', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '373', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12137 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16807', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1366', + 'placement' => '374', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '938', + ), + 12138 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16808', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '375', + 'prev_word_id' => '938', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1366', + ), + 12139 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16809', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '376', + 'prev_word_id' => '1366', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 12140 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16810', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1834', + 'placement' => '377', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 12141 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16811', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '378', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1834', + ), + 12142 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16812', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '379', + 'prev_word_id' => '1834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '943', + ), + 12143 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16813', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '937', + 'placement' => '380', + 'prev_word_id' => '943', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12144 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16814', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '381', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '937', + ), + 12145 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16815', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '975', + 'placement' => '382', + 'prev_word_id' => '937', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '974', + ), + 12146 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16816', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1842', + 'placement' => '383', + 'prev_word_id' => '974', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '975', + ), + 12147 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16817', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '384', + 'prev_word_id' => '975', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1842', + ), + 12148 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16818', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '385', + 'prev_word_id' => '1842', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '938', + ), + 12149 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16819', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1899', + 'placement' => '386', + 'prev_word_id' => '938', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12150 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16820', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '387', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1899', + ), + 12151 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16821', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1837', + 'placement' => '388', + 'prev_word_id' => '1899', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12152 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16822', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '389', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1837', + ), + 12153 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16823', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '815', + 'placement' => '390', + 'prev_word_id' => '1837', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12154 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16824', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '391', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '815', + ), + 12155 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16825', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '392', + 'prev_word_id' => '815', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '813', + ), + 12156 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16826', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '393', + 'prev_word_id' => '813', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12157 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16827', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '394', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12158 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16828', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1602', + 'placement' => '395', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1008', + ), + 12159 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16829', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '396', + 'prev_word_id' => '1008', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1602', + ), + 12160 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16830', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '397', + 'prev_word_id' => '1602', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '938', + ), + 12161 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16831', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '398', + 'prev_word_id' => '938', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '836', + ), + 12162 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16832', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '915', + 'placement' => '399', + 'prev_word_id' => '836', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 12163 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16833', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '400', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '915', + ), + 12164 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16834', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '939', + 'placement' => '401', + 'prev_word_id' => '915', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12165 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16835', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '402', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '939', + ), + 12166 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16836', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1914', + 'placement' => '403', + 'prev_word_id' => '939', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '929', + ), + 12167 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16837', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1859', + 'placement' => '404', + 'prev_word_id' => '929', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1914', + ), + 12168 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16838', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1879', + 'placement' => '405', + 'prev_word_id' => '1914', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1859', + ), + 12169 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16839', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1915', + 'placement' => '406', + 'prev_word_id' => '1859', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1879', + ), + 12170 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16840', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '941', + 'placement' => '407', + 'prev_word_id' => '1879', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1915', + ), + 12171 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16841', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1225', + 'placement' => '408', + 'prev_word_id' => '1915', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '941', + ), + 12172 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16842', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '409', + 'prev_word_id' => '941', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1225', + ), + 12173 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16843', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1609', + 'placement' => '410', + 'prev_word_id' => '1225', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '823', + ), + 12174 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16844', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1132', + 'placement' => '411', + 'prev_word_id' => '823', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1609', + ), + 12175 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16845', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '412', + 'prev_word_id' => '1609', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1132', + ), + 12176 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16846', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1916', + 'placement' => '413', + 'prev_word_id' => '1132', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '809', + ), + 12177 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16847', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1917', + 'placement' => '414', + 'prev_word_id' => '809', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1916', + ), + 12178 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16848', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '415', + 'prev_word_id' => '1916', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1917', + ), + 12179 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16849', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '416', + 'prev_word_id' => '1917', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1620', + ), + 12180 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16850', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '417', + 'prev_word_id' => '1620', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 12181 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16851', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '418', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1396', + ), + 12182 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16852', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '419', + 'prev_word_id' => '1396', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '897', + ), + 12183 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16853', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1918', + 'placement' => '420', + 'prev_word_id' => '897', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1384', + ), + 12184 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16854', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '938', + 'placement' => '421', + 'prev_word_id' => '1384', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1918', + ), + 12185 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16855', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1298', + 'placement' => '422', + 'prev_word_id' => '1918', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '938', + ), + 12186 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16856', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '423', + 'prev_word_id' => '938', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1298', + ), + 12187 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16857', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1919', + 'placement' => '424', + 'prev_word_id' => '1298', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '825', + ), + 12188 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16858', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1263', + 'placement' => '425', + 'prev_word_id' => '825', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1919', + ), + 12189 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16859', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '426', + 'prev_word_id' => '1919', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1263', + ), + 12190 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16860', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '427', + 'prev_word_id' => '1263', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1417', + ), + 12191 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16861', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '428', + 'prev_word_id' => '1417', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 12192 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16862', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '429', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1843', + ), + 12193 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16863', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '430', + 'prev_word_id' => '1843', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12194 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16864', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '431', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 12195 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16865', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '432', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12196 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16866', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1502', + 'placement' => '433', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12197 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16867', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '434', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1502', + ), + 12198 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16868', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1515', + 'placement' => '435', + 'prev_word_id' => '1502', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '810', + ), + 12199 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16869', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1438', + 'placement' => '436', + 'prev_word_id' => '810', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1515', + ), + 12200 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16870', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1516', + 'placement' => '437', + 'prev_word_id' => '1515', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1438', + ), + 12201 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16871', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '438', + 'prev_word_id' => '1438', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1516', + ), + 12202 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16872', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1365', + 'placement' => '439', + 'prev_word_id' => '1516', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 12203 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16873', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1549', + 'placement' => '440', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1365', + ), + 12204 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16874', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '917', + 'placement' => '441', + 'prev_word_id' => '1365', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1549', + ), + 12205 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16875', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '442', + 'prev_word_id' => '1549', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '917', + ), + 12206 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16876', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1786', + 'placement' => '443', + 'prev_word_id' => '917', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12207 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16877', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '444', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1786', + ), + 12208 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16878', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1787', + 'placement' => '445', + 'prev_word_id' => '1786', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1443', + ), + 12209 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16879', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1920', + 'placement' => '446', + 'prev_word_id' => '1443', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1787', + ), + 12210 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16880', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '447', + 'prev_word_id' => '1787', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1920', + ), + 12211 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16881', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1460', + 'placement' => '448', + 'prev_word_id' => '1920', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 12212 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16882', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '449', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1460', + ), + 12213 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16883', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '836', + 'placement' => '450', + 'prev_word_id' => '1460', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1605', + ), + 12214 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16884', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1530', + 'placement' => '451', + 'prev_word_id' => '1605', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '836', + ), + 12215 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16885', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '452', + 'prev_word_id' => '836', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1530', + ), + 12216 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16886', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1921', + 'placement' => '453', + 'prev_word_id' => '1530', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12217 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16887', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1721', + 'placement' => '454', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1921', + ), + 12218 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16888', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1922', + 'placement' => '455', + 'prev_word_id' => '1921', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1721', + ), + 12219 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16889', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '456', + 'prev_word_id' => '1721', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1922', + ), + 12220 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16890', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1923', + 'placement' => '457', + 'prev_word_id' => '1922', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 12221 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16891', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '458', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1923', + ), + 12222 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16892', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1924', + 'placement' => '459', + 'prev_word_id' => '1923', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1319', + ), + 12223 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16893', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1925', + 'placement' => '460', + 'prev_word_id' => '1319', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1924', + ), + 12224 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16894', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '461', + 'prev_word_id' => '1924', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1925', + ), + 12225 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16895', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '462', + 'prev_word_id' => '1925', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '816', + ), + 12226 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16896', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '463', + 'prev_word_id' => '816', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12227 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16897', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '464', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12228 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16898', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '465', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12229 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16899', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '466', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12230 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16900', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '467', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1258', + ), + 12231 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16901', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '468', + 'prev_word_id' => '1258', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '833', + ), + 12232 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16902', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '469', + 'prev_word_id' => '833', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1237', + ), + 12233 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16903', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '470', + 'prev_word_id' => '1237', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1605', + ), + 12234 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16904', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1926', + 'placement' => '471', + 'prev_word_id' => '1605', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 12235 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16905', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1492', + 'placement' => '472', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1926', + ), + 12236 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16906', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '473', + 'prev_word_id' => '1926', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1492', + ), + 12237 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16907', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '474', + 'prev_word_id' => '1492', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '809', + ), + 12238 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16908', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '475', + 'prev_word_id' => '809', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '802', + ), + 12239 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16909', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '476', + 'prev_word_id' => '802', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '803', + ), + 12240 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16910', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1258', + 'placement' => '477', + 'prev_word_id' => '803', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12241 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16911', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '478', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1258', + ), + 12242 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16912', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1927', + 'placement' => '479', + 'prev_word_id' => '1258', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '805', + ), + 12243 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16913', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '480', + 'prev_word_id' => '805', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1927', + ), + 12244 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16914', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1843', + 'placement' => '481', + 'prev_word_id' => '1927', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '898', + ), + 12245 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16915', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '482', + 'prev_word_id' => '898', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1843', + ), + 12246 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16916', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '483', + 'prev_word_id' => '1843', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '801', + ), + 12247 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16917', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '484', + 'prev_word_id' => '801', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1251', + ), + 12248 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16918', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1928', + 'placement' => '485', + 'prev_word_id' => '1251', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12249 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16919', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '486', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1928', + ), + 12250 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16920', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '487', + 'prev_word_id' => '1928', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '809', + ), + 12251 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16921', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '488', + 'prev_word_id' => '809', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 12252 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16922', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '897', + 'placement' => '489', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1396', + ), + 12253 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16923', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '490', + 'prev_word_id' => '1396', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '897', + ), + 12254 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16924', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1292', + 'placement' => '491', + 'prev_word_id' => '897', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '974', + ), + 12255 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16925', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '492', + 'prev_word_id' => '974', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1292', + ), + 12256 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16926', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1251', + 'placement' => '493', + 'prev_word_id' => '1292', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '823', + ), + 12257 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16927', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '910', + 'placement' => '494', + 'prev_word_id' => '823', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1251', + ), + 12258 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16928', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '495', + 'prev_word_id' => '1251', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '910', + ), + 12259 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16929', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '496', + 'prev_word_id' => '910', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12260 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16930', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '860', + 'placement' => '497', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '814', + ), + 12261 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16931', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '498', + 'prev_word_id' => '814', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '860', + ), + 12262 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16932', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1569', + 'placement' => '499', + 'prev_word_id' => '860', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1410', + ), + 12263 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16933', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '500', + 'prev_word_id' => '1410', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1569', + ), + 12264 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16934', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1384', + 'placement' => '501', + 'prev_word_id' => '1569', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1410', + ), + 12265 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16935', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1929', + 'placement' => '502', + 'prev_word_id' => '1410', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1384', + ), + 12266 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16936', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '503', + 'prev_word_id' => '1384', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1929', + ), + 12267 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16937', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '504', + 'prev_word_id' => '1929', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1437', + ), + 12268 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16938', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '906', + 'placement' => '505', + 'prev_word_id' => '1437', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1396', + ), + 12269 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16939', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1930', + 'placement' => '506', + 'prev_word_id' => '1396', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '906', + ), + 12270 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16940', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '507', + 'prev_word_id' => '906', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1930', + ), + 12271 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16941', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1688', + 'placement' => '508', + 'prev_word_id' => '1930', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '894', + ), + 12272 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16942', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '509', + 'prev_word_id' => '894', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1688', + ), + 12273 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16943', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '510', + 'prev_word_id' => '1688', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '863', + ), + 12274 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16944', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '834', + 'placement' => '511', + 'prev_word_id' => '863', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '974', + ), + 12275 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16945', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1460', + 'placement' => '512', + 'prev_word_id' => '974', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '834', + ), + 12276 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16946', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '513', + 'prev_word_id' => '834', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1460', + ), + 12277 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16947', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1174', + 'placement' => '514', + 'prev_word_id' => '1460', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '830', + ), + 12278 => + array ( + 'contentclass_attribute_id' => '189', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16948', + 'identifier' => 'image', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '515', + 'prev_word_id' => '830', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1174', + ), + 12279 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16949', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '516', + 'prev_word_id' => '1174', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12280 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '211', + 'frequency' => '0', + 'id' => '16950', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '517', + 'prev_word_id' => '1191', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12281 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '212', + 'frequency' => '0', + 'id' => '16951', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154210', + 'section_id' => '1', + 'word_id' => '2506', + ), + 12282 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '213', + 'frequency' => '0', + 'id' => '16952', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2511', + ), + 12283 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16953', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '942', + ), + 12284 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16954', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '1', + 'prev_word_id' => '942', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '943', + ), + 12285 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16955', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '929', + 'placement' => '2', + 'prev_word_id' => '943', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '822', + ), + 12286 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16956', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2182', + 'placement' => '3', + 'prev_word_id' => '822', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '929', + ), + 12287 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16957', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '4', + 'prev_word_id' => '929', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2182', + ), + 12288 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16958', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '5', + 'prev_word_id' => '2182', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '822', + ), + 12289 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16959', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '6', + 'prev_word_id' => '822', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1417', + ), + 12290 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16960', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2106', + 'placement' => '7', + 'prev_word_id' => '1417', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1396', + ), + 12291 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16961', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2183', + 'placement' => '8', + 'prev_word_id' => '1396', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2106', + ), + 12292 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16962', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1371', + 'placement' => '9', + 'prev_word_id' => '2106', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2183', + ), + 12293 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16963', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2184', + 'placement' => '10', + 'prev_word_id' => '2183', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1371', + ), + 12294 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16964', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '11', + 'prev_word_id' => '1371', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2184', + ), + 12295 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16965', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '856', + 'placement' => '12', + 'prev_word_id' => '2184', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '801', + ), + 12296 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16966', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '13', + 'prev_word_id' => '801', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '856', + ), + 12297 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16967', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2185', + 'placement' => '14', + 'prev_word_id' => '856', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '833', + ), + 12298 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16968', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '15', + 'prev_word_id' => '833', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2185', + ), + 12299 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16969', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1237', + 'placement' => '16', + 'prev_word_id' => '2185', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '830', + ), + 12300 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16970', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2186', + 'placement' => '17', + 'prev_word_id' => '830', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1237', + ), + 12301 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16971', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '898', + 'placement' => '18', + 'prev_word_id' => '1237', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2186', + ), + 12302 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16972', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '19', + 'prev_word_id' => '2186', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '898', + ), + 12303 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16973', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '20', + 'prev_word_id' => '898', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '802', + ), + 12304 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16974', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '826', + 'placement' => '21', + 'prev_word_id' => '802', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '803', + ), + 12305 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16975', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1816', + 'placement' => '22', + 'prev_word_id' => '803', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '826', + ), + 12306 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16976', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2512', + 'placement' => '23', + 'prev_word_id' => '826', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1816', + ), + 12307 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16977', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '24', + 'prev_word_id' => '1816', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2512', + ), + 12308 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16978', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '25', + 'prev_word_id' => '2512', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '813', + ), + 12309 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16979', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '26', + 'prev_word_id' => '813', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12310 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16980', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1959', + 'placement' => '27', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '830', + ), + 12311 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16981', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '28', + 'prev_word_id' => '830', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1959', + ), + 12312 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16982', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '844', + 'placement' => '29', + 'prev_word_id' => '1959', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '843', + ), + 12313 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16983', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2513', + 'placement' => '30', + 'prev_word_id' => '843', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '844', + ), + 12314 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16984', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '31', + 'prev_word_id' => '844', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2513', + ), + 12315 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16985', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1396', + 'placement' => '32', + 'prev_word_id' => '2513', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '825', + ), + 12316 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16986', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2437', + 'placement' => '33', + 'prev_word_id' => '825', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1396', + ), + 12317 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16987', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1410', + 'placement' => '34', + 'prev_word_id' => '1396', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2437', + ), + 12318 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16988', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2514', + 'placement' => '35', + 'prev_word_id' => '2437', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1410', + ), + 12319 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16989', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '36', + 'prev_word_id' => '1410', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2514', + ), + 12320 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16990', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1851', + 'placement' => '37', + 'prev_word_id' => '2514', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '823', + ), + 12321 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16991', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2515', + 'placement' => '38', + 'prev_word_id' => '823', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1851', + ), + 12322 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16992', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '39', + 'prev_word_id' => '1851', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2515', + ), + 12323 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16993', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '942', + 'placement' => '40', + 'prev_word_id' => '2515', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12324 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16994', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '822', + 'placement' => '41', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '942', + ), + 12325 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16995', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '42', + 'prev_word_id' => '942', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '822', + ), + 12326 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16996', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2516', + 'placement' => '43', + 'prev_word_id' => '822', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '805', + ), + 12327 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16997', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1636', + 'placement' => '44', + 'prev_word_id' => '805', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2516', + ), + 12328 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16998', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1008', + 'placement' => '45', + 'prev_word_id' => '2516', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1636', + ), + 12329 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '16999', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2188', + 'placement' => '46', + 'prev_word_id' => '1636', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1008', + ), + 12330 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17000', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1599', + 'placement' => '47', + 'prev_word_id' => '1008', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2188', + ), + 12331 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17001', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '48', + 'prev_word_id' => '2188', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1599', + ), + 12332 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17002', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '49', + 'prev_word_id' => '1599', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '823', + ), + 12333 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17003', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1833', + 'placement' => '50', + 'prev_word_id' => '823', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1287', + ), + 12334 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17004', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2189', + 'placement' => '51', + 'prev_word_id' => '1287', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1833', + ), + 12335 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17005', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '52', + 'prev_word_id' => '1833', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2189', + ), + 12336 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17006', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '53', + 'prev_word_id' => '2189', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12337 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '214', + 'frequency' => '0', + 'id' => '17007', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '54', + 'prev_word_id' => '1191', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12338 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17008', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '944', + ), + 12339 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17009', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '1', + 'prev_word_id' => '944', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '945', + ), + 12340 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17010', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1952', + 'placement' => '2', + 'prev_word_id' => '945', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12341 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17011', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '3', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1952', + ), + 12342 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17012', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '4', + 'prev_word_id' => '1952', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '801', + ), + 12343 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17013', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2123', + 'placement' => '5', + 'prev_word_id' => '801', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '881', + ), + 12344 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17014', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '945', + 'placement' => '6', + 'prev_word_id' => '881', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2123', + ), + 12345 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17015', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '7', + 'prev_word_id' => '2123', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '945', + ), + 12346 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17016', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1999', + 'placement' => '8', + 'prev_word_id' => '945', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '816', + ), + 12347 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17017', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2124', + 'placement' => '9', + 'prev_word_id' => '816', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1999', + ), + 12348 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17018', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '10', + 'prev_word_id' => '1999', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2124', + ), + 12349 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17019', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1547', + 'placement' => '11', + 'prev_word_id' => '2124', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '863', + ), + 12350 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17020', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2125', + 'placement' => '12', + 'prev_word_id' => '863', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1547', + ), + 12351 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17021', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1690', + 'placement' => '13', + 'prev_word_id' => '1547', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2125', + ), + 12352 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17022', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '932', + 'placement' => '14', + 'prev_word_id' => '2125', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1690', + ), + 12353 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17023', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2126', + 'placement' => '15', + 'prev_word_id' => '1690', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '932', + ), + 12354 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17024', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '16', + 'prev_word_id' => '932', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2126', + ), + 12355 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17025', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '17', + 'prev_word_id' => '2126', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12356 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '215', + 'frequency' => '0', + 'id' => '17026', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '18', + 'prev_word_id' => '1191', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12357 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17027', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2103', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2102', + ), + 12358 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17028', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '1', + 'prev_word_id' => '2102', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2103', + ), + 12359 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17029', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '2', + 'prev_word_id' => '2103', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '802', + ), + 12360 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17030', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '947', + 'placement' => '3', + 'prev_word_id' => '802', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '803', + ), + 12361 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17031', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2077', + 'placement' => '4', + 'prev_word_id' => '803', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '947', + ), + 12362 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17032', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '5', + 'prev_word_id' => '947', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2077', + ), + 12363 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17033', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '6', + 'prev_word_id' => '2077', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '810', + ), + 12364 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17034', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '7', + 'prev_word_id' => '810', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2102', + ), + 12365 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17035', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '8', + 'prev_word_id' => '2102', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2089', + ), + 12366 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17036', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '9', + 'prev_word_id' => '2089', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1429', + ), + 12367 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17037', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1421', + 'placement' => '10', + 'prev_word_id' => '1429', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1437', + ), + 12368 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17038', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '11', + 'prev_word_id' => '1437', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1421', + ), + 12369 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17039', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1827', + 'placement' => '12', + 'prev_word_id' => '1421', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1481', + ), + 12370 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17040', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '13', + 'prev_word_id' => '1481', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1827', + ), + 12371 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17041', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2104', + 'placement' => '14', + 'prev_word_id' => '1827', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '801', + ), + 12372 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17042', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '15', + 'prev_word_id' => '801', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2104', + ), + 12373 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17043', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2105', + 'placement' => '16', + 'prev_word_id' => '2104', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1368', + ), + 12374 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17044', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '17', + 'prev_word_id' => '1368', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2105', + ), + 12375 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17045', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1567', + 'placement' => '18', + 'prev_word_id' => '2105', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '830', + ), + 12376 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17046', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '833', + 'placement' => '19', + 'prev_word_id' => '830', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1567', + ), + 12377 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17047', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2106', + 'placement' => '20', + 'prev_word_id' => '1567', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '833', + ), + 12378 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17048', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1390', + 'placement' => '21', + 'prev_word_id' => '833', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2106', + ), + 12379 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17049', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '22', + 'prev_word_id' => '2106', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1390', + ), + 12380 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17050', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2107', + 'placement' => '23', + 'prev_word_id' => '1390', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '801', + ), + 12381 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17051', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1531', + 'placement' => '24', + 'prev_word_id' => '801', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2107', + ), + 12382 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17052', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '830', + 'placement' => '25', + 'prev_word_id' => '2107', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1531', + ), + 12383 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17053', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '26', + 'prev_word_id' => '1531', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '830', + ), + 12384 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17054', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1513', + 'placement' => '27', + 'prev_word_id' => '830', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '816', + ), + 12385 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17055', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1933', + 'placement' => '28', + 'prev_word_id' => '816', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1513', + ), + 12386 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17056', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '29', + 'prev_word_id' => '1513', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1933', + ), + 12387 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17057', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2108', + 'placement' => '30', + 'prev_word_id' => '1933', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1280', + ), + 12388 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17058', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2109', + 'placement' => '31', + 'prev_word_id' => '1280', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2108', + ), + 12389 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17059', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2110', + 'placement' => '32', + 'prev_word_id' => '2108', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2109', + ), + 12390 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17060', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2111', + 'placement' => '33', + 'prev_word_id' => '2109', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2110', + ), + 12391 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17061', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '34', + 'prev_word_id' => '2110', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2111', + ), + 12392 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17062', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1429', + 'placement' => '35', + 'prev_word_id' => '2111', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12393 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17063', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2112', + 'placement' => '36', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1429', + ), + 12394 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17064', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1368', + 'placement' => '37', + 'prev_word_id' => '1429', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2112', + ), + 12395 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17065', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '38', + 'prev_word_id' => '2112', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1368', + ), + 12396 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17066', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '39', + 'prev_word_id' => '1368', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '813', + ), + 12397 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17067', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1084', + 'placement' => '40', + 'prev_word_id' => '813', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12398 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17068', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '41', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1084', + ), + 12399 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17069', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '42', + 'prev_word_id' => '1084', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '948', + ), + 12400 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17070', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '43', + 'prev_word_id' => '948', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '949', + ), + 12401 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17071', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1861', + 'placement' => '44', + 'prev_word_id' => '949', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '921', + ), + 12402 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17072', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2113', + 'placement' => '45', + 'prev_word_id' => '921', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1861', + ), + 12403 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17073', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2114', + 'placement' => '46', + 'prev_word_id' => '1861', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2113', + ), + 12404 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17074', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '47', + 'prev_word_id' => '2113', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2114', + ), + 12405 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17075', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '972', + 'placement' => '48', + 'prev_word_id' => '2114', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '810', + ), + 12406 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17076', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1300', + 'placement' => '49', + 'prev_word_id' => '810', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '972', + ), + 12407 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17077', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '50', + 'prev_word_id' => '972', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1300', + ), + 12408 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17078', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '51', + 'prev_word_id' => '1300', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '863', + ), + 12409 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17079', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2115', + 'placement' => '52', + 'prev_word_id' => '863', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12410 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17080', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '53', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2115', + ), + 12411 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17081', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '881', + 'placement' => '54', + 'prev_word_id' => '2115', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '894', + ), + 12412 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17082', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '55', + 'prev_word_id' => '894', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '881', + ), + 12413 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17083', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '56', + 'prev_word_id' => '881', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12414 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17084', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '57', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2102', + ), + 12415 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17085', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '58', + 'prev_word_id' => '2102', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2089', + ), + 12416 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17086', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1510', + 'placement' => '59', + 'prev_word_id' => '2089', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '801', + ), + 12417 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17087', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '60', + 'prev_word_id' => '801', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1510', + ), + 12418 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17088', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1481', + 'placement' => '61', + 'prev_word_id' => '1510', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12419 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17089', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1827', + 'placement' => '62', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1481', + ), + 12420 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17090', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '63', + 'prev_word_id' => '1481', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1827', + ), + 12421 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17091', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1686', + 'placement' => '64', + 'prev_word_id' => '1827', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1417', + ), + 12422 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17092', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '65', + 'prev_word_id' => '1417', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1686', + ), + 12423 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17093', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '66', + 'prev_word_id' => '1686', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '805', + ), + 12424 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17094', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1418', + 'placement' => '67', + 'prev_word_id' => '805', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12425 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17095', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '68', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1418', + ), + 12426 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17096', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1605', + 'placement' => '69', + 'prev_word_id' => '1418', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1290', + ), + 12427 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17097', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '70', + 'prev_word_id' => '1290', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1605', + ), + 12428 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17098', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '71', + 'prev_word_id' => '1605', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '894', + ), + 12429 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17099', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1656', + 'placement' => '72', + 'prev_word_id' => '894', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1319', + ), + 12430 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17100', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2105', + 'placement' => '73', + 'prev_word_id' => '1319', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1656', + ), + 12431 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17101', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2116', + 'placement' => '74', + 'prev_word_id' => '1656', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2105', + ), + 12432 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17102', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '75', + 'prev_word_id' => '2105', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2116', + ), + 12433 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17103', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '76', + 'prev_word_id' => '2116', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1749', + ), + 12434 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17104', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2105', + 'placement' => '77', + 'prev_word_id' => '1749', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '813', + ), + 12435 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17105', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2116', + 'placement' => '78', + 'prev_word_id' => '813', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2105', + ), + 12436 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17106', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '79', + 'prev_word_id' => '2105', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2116', + ), + 12437 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17107', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '80', + 'prev_word_id' => '2116', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '948', + ), + 12438 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17108', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2117', + 'placement' => '81', + 'prev_word_id' => '948', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '949', + ), + 12439 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17109', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '82', + 'prev_word_id' => '949', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2117', + ), + 12440 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17110', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '83', + 'prev_word_id' => '2117', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2118', + ), + 12441 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17111', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '84', + 'prev_word_id' => '2118', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2118', + ), + 12442 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17112', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '85', + 'prev_word_id' => '2118', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '948', + ), + 12443 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17113', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2117', + 'placement' => '86', + 'prev_word_id' => '948', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '949', + ), + 12444 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17114', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '87', + 'prev_word_id' => '949', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2117', + ), + 12445 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17115', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2119', + 'placement' => '88', + 'prev_word_id' => '2117', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2118', + ), + 12446 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17116', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '89', + 'prev_word_id' => '2118', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2119', + ), + 12447 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17117', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2120', + 'placement' => '90', + 'prev_word_id' => '2119', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2118', + ), + 12448 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17118', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '91', + 'prev_word_id' => '2118', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2120', + ), + 12449 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17119', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '92', + 'prev_word_id' => '2120', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1749', + ), + 12450 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17120', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '93', + 'prev_word_id' => '1749', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '813', + ), + 12451 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17121', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '94', + 'prev_word_id' => '813', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2102', + ), + 12452 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17122', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1054', + 'placement' => '95', + 'prev_word_id' => '2102', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2089', + ), + 12453 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17123', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '96', + 'prev_word_id' => '2089', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1054', + ), + 12454 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17124', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2121', + 'placement' => '97', + 'prev_word_id' => '1054', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2089', + ), + 12455 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17125', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2102', + 'placement' => '98', + 'prev_word_id' => '2089', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2121', + ), + 12456 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17126', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2122', + 'placement' => '99', + 'prev_word_id' => '2121', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2102', + ), + 12457 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17127', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '100', + 'prev_word_id' => '2102', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2122', + ), + 12458 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17128', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2117', + 'placement' => '101', + 'prev_word_id' => '2122', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1287', + ), + 12459 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17129', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2118', + 'placement' => '102', + 'prev_word_id' => '1287', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2117', + ), + 12460 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17130', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1061', + 'placement' => '103', + 'prev_word_id' => '2117', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2118', + ), + 12461 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17131', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '104', + 'prev_word_id' => '2118', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1061', + ), + 12462 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17132', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '105', + 'prev_word_id' => '1061', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12463 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '216', + 'frequency' => '0', + 'id' => '17133', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '106', + 'prev_word_id' => '1191', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12464 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17134', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '912', + ), + 12465 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17135', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2097', + 'placement' => '1', + 'prev_word_id' => '912', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '816', + ), + 12466 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17136', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2098', + 'placement' => '2', + 'prev_word_id' => '816', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2097', + ), + 12467 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17137', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '3', + 'prev_word_id' => '2097', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2098', + ), + 12468 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17138', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '2099', + 'placement' => '4', + 'prev_word_id' => '2098', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1133', + ), + 12469 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17139', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '809', + 'placement' => '5', + 'prev_word_id' => '1133', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2099', + ), + 12470 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17140', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '802', + 'placement' => '6', + 'prev_word_id' => '2099', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '809', + ), + 12471 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17141', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '803', + 'placement' => '7', + 'prev_word_id' => '809', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '802', + ), + 12472 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17142', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1133', + 'placement' => '8', + 'prev_word_id' => '802', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '803', + ), + 12473 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17143', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '9', + 'prev_word_id' => '803', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1133', + ), + 12474 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17144', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '10', + 'prev_word_id' => '1133', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '894', + ), + 12475 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17145', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2024', + 'placement' => '11', + 'prev_word_id' => '894', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '843', + ), + 12476 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17146', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '12', + 'prev_word_id' => '843', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2024', + ), + 12477 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17147', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '832', + 'placement' => '13', + 'prev_word_id' => '2024', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '810', + ), + 12478 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17148', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2100', + 'placement' => '14', + 'prev_word_id' => '810', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '832', + ), + 12479 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17149', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1443', + 'placement' => '15', + 'prev_word_id' => '832', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2100', + ), + 12480 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17150', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1277', + 'placement' => '16', + 'prev_word_id' => '2100', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1443', + ), + 12481 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17151', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '17', + 'prev_word_id' => '1443', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1277', + ), + 12482 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17152', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '2101', + 'placement' => '18', + 'prev_word_id' => '1277', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '814', + ), + 12483 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17153', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '19', + 'prev_word_id' => '814', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '2101', + ), + 12484 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17154', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '20', + 'prev_word_id' => '2101', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12485 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '217', + 'frequency' => '0', + 'id' => '17155', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '21', + 'prev_word_id' => '1191', + 'published' => '1311154211', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12486 => + array ( + 'contentclass_attribute_id' => '183', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17156', + 'identifier' => 'title', + 'integer_value' => '0', + 'next_word_id' => '912', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2076', + ), + 12487 => + array ( + 'contentclass_attribute_id' => '186', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17157', + 'identifier' => 'intro', + 'integer_value' => '0', + 'next_word_id' => '1790', + 'placement' => '1', + 'prev_word_id' => '2076', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '912', + ), + 12488 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17158', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '2', + 'prev_word_id' => '912', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1790', + ), + 12489 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17159', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '3', + 'prev_word_id' => '1790', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '805', + ), + 12490 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17160', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '4', + 'prev_word_id' => '805', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2076', + ), + 12491 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17161', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2078', + 'placement' => '5', + 'prev_word_id' => '2076', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1280', + ), + 12492 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17162', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '6', + 'prev_word_id' => '1280', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2078', + ), + 12493 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17163', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '805', + 'placement' => '7', + 'prev_word_id' => '2078', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2076', + ), + 12494 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17164', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '8', + 'prev_word_id' => '2076', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '805', + ), + 12495 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17165', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1323', + 'placement' => '9', + 'prev_word_id' => '805', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '882', + ), + 12496 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17166', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1883', + 'placement' => '10', + 'prev_word_id' => '882', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1323', + ), + 12497 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17167', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '11', + 'prev_word_id' => '1323', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1883', + ), + 12498 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17168', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1845', + 'placement' => '12', + 'prev_word_id' => '1883', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '816', + ), + 12499 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17169', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '13', + 'prev_word_id' => '816', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1845', + ), + 12500 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17170', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '14', + 'prev_word_id' => '1845', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2076', + ), + 12501 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17171', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '15', + 'prev_word_id' => '2076', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1791', + ), + 12502 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17172', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1480', + 'placement' => '16', + 'prev_word_id' => '1791', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '810', + ), + 12503 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17173', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '17', + 'prev_word_id' => '810', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1480', + ), + 12504 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17174', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2079', + 'placement' => '18', + 'prev_word_id' => '1480', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '801', + ), + 12505 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17175', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '19', + 'prev_word_id' => '801', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2079', + ), + 12506 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17176', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2080', + 'placement' => '20', + 'prev_word_id' => '2079', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12507 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17177', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '21', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2080', + ), + 12508 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17178', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '22', + 'prev_word_id' => '2080', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '813', + ), + 12509 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17179', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2081', + 'placement' => '23', + 'prev_word_id' => '813', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12510 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17180', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '813', + 'placement' => '24', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2081', + ), + 12511 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17181', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2082', + 'placement' => '25', + 'prev_word_id' => '2081', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '813', + ), + 12512 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17182', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '26', + 'prev_word_id' => '813', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2082', + ), + 12513 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17183', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '27', + 'prev_word_id' => '2082', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1620', + ), + 12514 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17184', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1319', + 'placement' => '28', + 'prev_word_id' => '1620', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1437', + ), + 12515 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17185', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1924', + 'placement' => '29', + 'prev_word_id' => '1437', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1319', + ), + 12516 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17186', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1892', + 'placement' => '30', + 'prev_word_id' => '1319', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1924', + ), + 12517 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17187', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '31', + 'prev_word_id' => '1924', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1892', + ), + 12518 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17188', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '32', + 'prev_word_id' => '1892', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '816', + ), + 12519 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17189', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '33', + 'prev_word_id' => '816', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12520 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17190', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1280', + 'placement' => '34', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '841', + ), + 12521 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17191', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2078', + 'placement' => '35', + 'prev_word_id' => '841', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1280', + ), + 12522 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17192', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2076', + 'placement' => '36', + 'prev_word_id' => '1280', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2078', + ), + 12523 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17193', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2083', + 'placement' => '37', + 'prev_word_id' => '2078', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2076', + ), + 12524 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17194', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1620', + 'placement' => '38', + 'prev_word_id' => '2076', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2083', + ), + 12525 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17195', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '39', + 'prev_word_id' => '2083', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1620', + ), + 12526 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17196', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2084', + 'placement' => '40', + 'prev_word_id' => '1620', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '863', + ), + 12527 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17197', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2085', + 'placement' => '41', + 'prev_word_id' => '863', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2084', + ), + 12528 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17198', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '42', + 'prev_word_id' => '2084', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2085', + ), + 12529 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17199', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '43', + 'prev_word_id' => '2085', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '848', + ), + 12530 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17200', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '44', + 'prev_word_id' => '848', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12531 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17201', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '45', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2086', + ), + 12532 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17202', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '46', + 'prev_word_id' => '2086', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '841', + ), + 12533 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17203', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '47', + 'prev_word_id' => '841', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1577', + ), + 12534 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17204', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1791', + 'placement' => '48', + 'prev_word_id' => '1577', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1417', + ), + 12535 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17205', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2087', + 'placement' => '49', + 'prev_word_id' => '1417', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1791', + ), + 12536 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17206', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2088', + 'placement' => '50', + 'prev_word_id' => '1791', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2087', + ), + 12537 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17207', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1414', + 'placement' => '51', + 'prev_word_id' => '2087', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2088', + ), + 12538 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17208', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1910', + 'placement' => '52', + 'prev_word_id' => '2088', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1414', + ), + 12539 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17209', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1910', + 'placement' => '53', + 'prev_word_id' => '1414', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1910', + ), + 12540 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17210', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2089', + 'placement' => '54', + 'prev_word_id' => '1910', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1910', + ), + 12541 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17211', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '55', + 'prev_word_id' => '1910', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2089', + ), + 12542 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17212', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1512', + 'placement' => '56', + 'prev_word_id' => '2089', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12543 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17213', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '870', + 'placement' => '57', + 'prev_word_id' => '1550', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1512', + ), + 12544 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17214', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '58', + 'prev_word_id' => '1512', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '870', + ), + 12545 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17215', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '59', + 'prev_word_id' => '870', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12546 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17216', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '841', + 'placement' => '60', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2086', + ), + 12547 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17217', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '61', + 'prev_word_id' => '2086', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '841', + ), + 12548 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17218', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1417', + 'placement' => '62', + 'prev_word_id' => '841', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1577', + ), + 12549 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17219', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1744', + 'placement' => '63', + 'prev_word_id' => '1577', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1417', + ), + 12550 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17220', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1437', + 'placement' => '64', + 'prev_word_id' => '1417', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1744', + ), + 12551 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17221', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '65', + 'prev_word_id' => '1744', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1437', + ), + 12552 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17222', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2090', + 'placement' => '66', + 'prev_word_id' => '1437', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '810', + ), + 12553 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17223', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '67', + 'prev_word_id' => '810', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2090', + ), + 12554 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17224', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1290', + 'placement' => '68', + 'prev_word_id' => '2090', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '863', + ), + 12555 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17225', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '69', + 'prev_word_id' => '863', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1290', + ), + 12556 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17226', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '70', + 'prev_word_id' => '1290', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '943', + ), + 12557 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17227', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '71', + 'prev_word_id' => '943', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '854', + ), + 12558 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17228', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '72', + 'prev_word_id' => '854', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12559 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17229', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2091', + 'placement' => '73', + 'prev_word_id' => '1550', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '843', + ), + 12560 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17230', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '74', + 'prev_word_id' => '843', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2091', + ), + 12561 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17231', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '75', + 'prev_word_id' => '2091', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1420', + ), + 12562 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17232', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '76', + 'prev_word_id' => '1420', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12563 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17233', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '77', + 'prev_word_id' => '1550', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '823', + ), + 12564 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17234', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '78', + 'prev_word_id' => '823', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12565 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17235', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '79', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2086', + ), + 12566 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17236', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '810', + 'placement' => '80', + 'prev_word_id' => '2086', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1577', + ), + 12567 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17237', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2092', + 'placement' => '81', + 'prev_word_id' => '1577', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '810', + ), + 12568 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17238', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '943', + 'placement' => '82', + 'prev_word_id' => '810', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2092', + ), + 12569 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17239', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '854', + 'placement' => '83', + 'prev_word_id' => '2092', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '943', + ), + 12570 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17240', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '84', + 'prev_word_id' => '943', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '854', + ), + 12571 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17241', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '85', + 'prev_word_id' => '854', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12572 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17242', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '86', + 'prev_word_id' => '1550', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '843', + ), + 12573 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17243', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1749', + 'placement' => '87', + 'prev_word_id' => '843', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '816', + ), + 12574 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17244', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2093', + 'placement' => '88', + 'prev_word_id' => '816', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1749', + ), + 12575 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17245', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1830', + 'placement' => '89', + 'prev_word_id' => '1749', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2093', + ), + 12576 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17246', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2088', + 'placement' => '90', + 'prev_word_id' => '2093', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1830', + ), + 12577 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17247', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2094', + 'placement' => '91', + 'prev_word_id' => '1830', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2088', + ), + 12578 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17248', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '848', + 'placement' => '92', + 'prev_word_id' => '2088', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2094', + ), + 12579 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17249', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1420', + 'placement' => '93', + 'prev_word_id' => '2094', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '848', + ), + 12580 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17250', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1550', + 'placement' => '94', + 'prev_word_id' => '848', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1420', + ), + 12581 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17251', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '823', + 'placement' => '95', + 'prev_word_id' => '1420', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1550', + ), + 12582 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17252', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '96', + 'prev_word_id' => '1550', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '823', + ), + 12583 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17253', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2086', + 'placement' => '97', + 'prev_word_id' => '823', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '814', + ), + 12584 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17254', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1577', + 'placement' => '98', + 'prev_word_id' => '814', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2086', + ), + 12585 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17255', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '890', + 'placement' => '99', + 'prev_word_id' => '2086', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1577', + ), + 12586 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17256', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '921', + 'placement' => '100', + 'prev_word_id' => '1577', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '890', + ), + 12587 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17257', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '948', + 'placement' => '101', + 'prev_word_id' => '890', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '921', + ), + 12588 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17258', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '949', + 'placement' => '102', + 'prev_word_id' => '921', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '948', + ), + 12589 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17259', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1287', + 'placement' => '103', + 'prev_word_id' => '948', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '949', + ), + 12590 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17260', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2095', + 'placement' => '104', + 'prev_word_id' => '949', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1287', + ), + 12591 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17261', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '2096', + 'placement' => '105', + 'prev_word_id' => '1287', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2095', + ), + 12592 => + array ( + 'contentclass_attribute_id' => '187', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17262', + 'identifier' => 'body', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '106', + 'prev_word_id' => '2095', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2096', + ), + 12593 => + array ( + 'contentclass_attribute_id' => '191', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17263', + 'identifier' => 'publish_date', + 'integer_value' => '0', + 'next_word_id' => '1191', + 'placement' => '107', + 'prev_word_id' => '2096', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12594 => + array ( + 'contentclass_attribute_id' => '192', + 'contentclass_id' => '16', + 'contentobject_id' => '218', + 'frequency' => '0', + 'id' => '17264', + 'identifier' => 'unpublish_date', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '108', + 'prev_word_id' => '1191', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1191', + ), + 12595 => + array ( + 'contentclass_attribute_id' => '252', + 'contentclass_id' => '26', + 'contentobject_id' => '219', + 'frequency' => '0', + 'id' => '17265', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1225', + ), + 12596 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '220', + 'frequency' => '0', + 'id' => '17266', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2517', + ), + 12597 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '221', + 'frequency' => '0', + 'id' => '17267', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2519', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2518', + ), + 12598 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '221', + 'frequency' => '0', + 'id' => '17268', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '2518', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2519', + ), + 12599 => + array ( + 'contentclass_attribute_id' => '229', + 'contentclass_id' => '22', + 'contentobject_id' => '222', + 'frequency' => '0', + 'id' => '17269', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '1256', + ), + 12600 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '224', + 'frequency' => '0', + 'id' => '17270', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '2520', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2426', + ), + 12601 => + array ( + 'contentclass_attribute_id' => '266', + 'contentclass_id' => '30', + 'contentobject_id' => '224', + 'frequency' => '0', + 'id' => '17271', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '2426', + 'published' => '1311154212', + 'section_id' => '1', + 'word_id' => '2520', + ), + 12602 => + array ( + 'contentclass_attribute_id' => '8', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '17272', + 'identifier' => 'first_name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '958', + ), + 12603 => + array ( + 'contentclass_attribute_id' => '9', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '17273', + 'identifier' => 'last_name', + 'integer_value' => '0', + 'next_word_id' => '2521', + 'placement' => '1', + 'prev_word_id' => '958', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '954', + ), + 12604 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '17274', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '2522', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '2521', + ), + 12605 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '17275', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '3', + 'prev_word_id' => '2521', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '2522', + ), + 12606 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '17276', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '2522', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '927', + ), + 12607 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '225', + 'frequency' => '0', + 'id' => '17277', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1311154215', + 'section_id' => '1', + 'word_id' => '2216', + ), + 12608 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '11', + 'frequency' => '0', + 'id' => '17278', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920746', + 'section_id' => '2', + 'word_id' => '1385', + ), + ), + 'ezcobj_state' => + array ( + 0 => + array ( + 'default_language_id' => '2', + 'group_id' => '2', + 'id' => '1', + 'identifier' => 'not_locked', + 'language_mask' => '3', + 'priority' => '0', + ), + 1 => + array ( + 'default_language_id' => '2', + 'group_id' => '2', + 'id' => '2', + 'identifier' => 'locked', + 'language_mask' => '3', + 'priority' => '1', + ), + ), + 'ezcobj_state_group' => + array ( + 0 => + array ( + 'default_language_id' => '2', + 'id' => '2', + 'identifier' => 'ez_lock', + 'language_mask' => '3', + ), + ), + 'ezcobj_state_group_language' => + array ( + 0 => + array ( + 'contentobject_state_group_id' => '2', + 'description' => '', + 'language_id' => '3', + 'real_language_id' => '2', + 'name' => 'Lock', + ), + ), + 'ezcobj_state_language' => + array ( + 0 => + array ( + 'contentobject_state_id' => '1', + 'description' => '', + 'language_id' => '3', + 'name' => 'Not locked', + ), + 1 => + array ( + 'contentobject_state_id' => '2', + 'description' => '', + 'language_id' => '3', + 'name' => 'Locked', + ), + ), + 'ezcobj_state_link' => + array ( + 0 => + array ( + 'contentobject_id' => '4', + 'contentobject_state_id' => '1', + ), + 1 => + array ( + 'contentobject_id' => '10', + 'contentobject_state_id' => '1', + ), + 2 => + array ( + 'contentobject_id' => '11', + 'contentobject_state_id' => '1', + ), + 3 => + array ( + 'contentobject_id' => '12', + 'contentobject_state_id' => '1', + ), + 4 => + array ( + 'contentobject_id' => '13', + 'contentobject_state_id' => '1', + ), + 5 => + array ( + 'contentobject_id' => '14', + 'contentobject_state_id' => '1', + ), + 6 => + array ( + 'contentobject_id' => '41', + 'contentobject_state_id' => '1', + ), + 7 => + array ( + 'contentobject_id' => '42', + 'contentobject_state_id' => '1', + ), + 8 => + array ( + 'contentobject_id' => '45', + 'contentobject_state_id' => '1', + ), + 9 => + array ( + 'contentobject_id' => '49', + 'contentobject_state_id' => '1', + ), + 10 => + array ( + 'contentobject_id' => '50', + 'contentobject_state_id' => '1', + ), + 11 => + array ( + 'contentobject_id' => '51', + 'contentobject_state_id' => '1', + ), + 12 => + array ( + 'contentobject_id' => '52', + 'contentobject_state_id' => '1', + ), + 13 => + array ( + 'contentobject_id' => '54', + 'contentobject_state_id' => '1', + ), + 14 => + array ( + 'contentobject_id' => '56', + 'contentobject_state_id' => '1', + ), + 15 => + array ( + 'contentobject_id' => '57', + 'contentobject_state_id' => '1', + ), + 16 => + array ( + 'contentobject_id' => '58', + 'contentobject_state_id' => '1', + ), + 17 => + array ( + 'contentobject_id' => '59', + 'contentobject_state_id' => '1', + ), + 18 => + array ( + 'contentobject_id' => '60', + 'contentobject_state_id' => '1', + ), + 19 => + array ( + 'contentobject_id' => '61', + 'contentobject_state_id' => '1', + ), + 20 => + array ( + 'contentobject_id' => '62', + 'contentobject_state_id' => '1', + ), + 21 => + array ( + 'contentobject_id' => '63', + 'contentobject_state_id' => '1', + ), + 22 => + array ( + 'contentobject_id' => '64', + 'contentobject_state_id' => '1', + ), + 23 => + array ( + 'contentobject_id' => '65', + 'contentobject_state_id' => '1', + ), + 24 => + array ( + 'contentobject_id' => '66', + 'contentobject_state_id' => '1', + ), + 25 => + array ( + 'contentobject_id' => '67', + 'contentobject_state_id' => '1', + ), + 26 => + array ( + 'contentobject_id' => '68', + 'contentobject_state_id' => '1', + ), + 27 => + array ( + 'contentobject_id' => '69', + 'contentobject_state_id' => '1', + ), + 28 => + array ( + 'contentobject_id' => '70', + 'contentobject_state_id' => '1', + ), + 29 => + array ( + 'contentobject_id' => '71', + 'contentobject_state_id' => '1', + ), + 30 => + array ( + 'contentobject_id' => '72', + 'contentobject_state_id' => '1', + ), + 31 => + array ( + 'contentobject_id' => '73', + 'contentobject_state_id' => '1', + ), + 32 => + array ( + 'contentobject_id' => '74', + 'contentobject_state_id' => '1', + ), + 33 => + array ( + 'contentobject_id' => '75', + 'contentobject_state_id' => '1', + ), + 34 => + array ( + 'contentobject_id' => '76', + 'contentobject_state_id' => '1', + ), + 35 => + array ( + 'contentobject_id' => '77', + 'contentobject_state_id' => '1', + ), + 36 => + array ( + 'contentobject_id' => '78', + 'contentobject_state_id' => '1', + ), + 37 => + array ( + 'contentobject_id' => '79', + 'contentobject_state_id' => '1', + ), + 38 => + array ( + 'contentobject_id' => '80', + 'contentobject_state_id' => '1', + ), + 39 => + array ( + 'contentobject_id' => '81', + 'contentobject_state_id' => '1', + ), + 40 => + array ( + 'contentobject_id' => '82', + 'contentobject_state_id' => '1', + ), + 41 => + array ( + 'contentobject_id' => '83', + 'contentobject_state_id' => '1', + ), + 42 => + array ( + 'contentobject_id' => '84', + 'contentobject_state_id' => '1', + ), + 43 => + array ( + 'contentobject_id' => '85', + 'contentobject_state_id' => '1', + ), + 44 => + array ( + 'contentobject_id' => '86', + 'contentobject_state_id' => '1', + ), + 45 => + array ( + 'contentobject_id' => '87', + 'contentobject_state_id' => '1', + ), + 46 => + array ( + 'contentobject_id' => '88', + 'contentobject_state_id' => '1', + ), + 47 => + array ( + 'contentobject_id' => '89', + 'contentobject_state_id' => '1', + ), + 48 => + array ( + 'contentobject_id' => '90', + 'contentobject_state_id' => '1', + ), + 49 => + array ( + 'contentobject_id' => '91', + 'contentobject_state_id' => '1', + ), + 50 => + array ( + 'contentobject_id' => '92', + 'contentobject_state_id' => '1', + ), + 51 => + array ( + 'contentobject_id' => '93', + 'contentobject_state_id' => '1', + ), + 52 => + array ( + 'contentobject_id' => '94', + 'contentobject_state_id' => '1', + ), + 53 => + array ( + 'contentobject_id' => '95', + 'contentobject_state_id' => '1', + ), + 54 => + array ( + 'contentobject_id' => '96', + 'contentobject_state_id' => '1', + ), + 55 => + array ( + 'contentobject_id' => '97', + 'contentobject_state_id' => '1', + ), + 56 => + array ( + 'contentobject_id' => '98', + 'contentobject_state_id' => '1', + ), + 57 => + array ( + 'contentobject_id' => '99', + 'contentobject_state_id' => '1', + ), + 58 => + array ( + 'contentobject_id' => '100', + 'contentobject_state_id' => '1', + ), + 59 => + array ( + 'contentobject_id' => '101', + 'contentobject_state_id' => '1', + ), + 60 => + array ( + 'contentobject_id' => '102', + 'contentobject_state_id' => '1', + ), + 61 => + array ( + 'contentobject_id' => '103', + 'contentobject_state_id' => '1', + ), + 62 => + array ( + 'contentobject_id' => '104', + 'contentobject_state_id' => '1', + ), + 63 => + array ( + 'contentobject_id' => '105', + 'contentobject_state_id' => '1', + ), + 64 => + array ( + 'contentobject_id' => '106', + 'contentobject_state_id' => '1', + ), + 65 => + array ( + 'contentobject_id' => '107', + 'contentobject_state_id' => '1', + ), + 66 => + array ( + 'contentobject_id' => '108', + 'contentobject_state_id' => '1', + ), + 67 => + array ( + 'contentobject_id' => '109', + 'contentobject_state_id' => '1', + ), + 68 => + array ( + 'contentobject_id' => '110', + 'contentobject_state_id' => '1', + ), + 69 => + array ( + 'contentobject_id' => '111', + 'contentobject_state_id' => '1', + ), + 70 => + array ( + 'contentobject_id' => '112', + 'contentobject_state_id' => '1', + ), + 71 => + array ( + 'contentobject_id' => '113', + 'contentobject_state_id' => '1', + ), + 72 => + array ( + 'contentobject_id' => '114', + 'contentobject_state_id' => '1', + ), + 73 => + array ( + 'contentobject_id' => '115', + 'contentobject_state_id' => '1', + ), + 74 => + array ( + 'contentobject_id' => '116', + 'contentobject_state_id' => '1', + ), + 75 => + array ( + 'contentobject_id' => '117', + 'contentobject_state_id' => '1', + ), + 76 => + array ( + 'contentobject_id' => '118', + 'contentobject_state_id' => '1', + ), + 77 => + array ( + 'contentobject_id' => '119', + 'contentobject_state_id' => '1', + ), + 78 => + array ( + 'contentobject_id' => '120', + 'contentobject_state_id' => '1', + ), + 79 => + array ( + 'contentobject_id' => '121', + 'contentobject_state_id' => '1', + ), + 80 => + array ( + 'contentobject_id' => '122', + 'contentobject_state_id' => '1', + ), + 81 => + array ( + 'contentobject_id' => '123', + 'contentobject_state_id' => '1', + ), + 82 => + array ( + 'contentobject_id' => '124', + 'contentobject_state_id' => '1', + ), + 83 => + array ( + 'contentobject_id' => '125', + 'contentobject_state_id' => '1', + ), + 84 => + array ( + 'contentobject_id' => '126', + 'contentobject_state_id' => '1', + ), + 85 => + array ( + 'contentobject_id' => '127', + 'contentobject_state_id' => '1', + ), + 86 => + array ( + 'contentobject_id' => '128', + 'contentobject_state_id' => '1', + ), + 87 => + array ( + 'contentobject_id' => '129', + 'contentobject_state_id' => '1', + ), + 88 => + array ( + 'contentobject_id' => '130', + 'contentobject_state_id' => '1', + ), + 89 => + array ( + 'contentobject_id' => '131', + 'contentobject_state_id' => '1', + ), + 90 => + array ( + 'contentobject_id' => '132', + 'contentobject_state_id' => '1', + ), + 91 => + array ( + 'contentobject_id' => '133', + 'contentobject_state_id' => '1', + ), + 92 => + array ( + 'contentobject_id' => '134', + 'contentobject_state_id' => '1', + ), + 93 => + array ( + 'contentobject_id' => '135', + 'contentobject_state_id' => '1', + ), + 94 => + array ( + 'contentobject_id' => '136', + 'contentobject_state_id' => '1', + ), + 95 => + array ( + 'contentobject_id' => '137', + 'contentobject_state_id' => '1', + ), + 96 => + array ( + 'contentobject_id' => '138', + 'contentobject_state_id' => '1', + ), + 97 => + array ( + 'contentobject_id' => '139', + 'contentobject_state_id' => '1', + ), + 98 => + array ( + 'contentobject_id' => '140', + 'contentobject_state_id' => '1', + ), + 99 => + array ( + 'contentobject_id' => '141', + 'contentobject_state_id' => '1', + ), + 100 => + array ( + 'contentobject_id' => '142', + 'contentobject_state_id' => '1', + ), + 101 => + array ( + 'contentobject_id' => '143', + 'contentobject_state_id' => '1', + ), + 102 => + array ( + 'contentobject_id' => '144', + 'contentobject_state_id' => '1', + ), + 103 => + array ( + 'contentobject_id' => '145', + 'contentobject_state_id' => '1', + ), + 104 => + array ( + 'contentobject_id' => '146', + 'contentobject_state_id' => '1', + ), + 105 => + array ( + 'contentobject_id' => '147', + 'contentobject_state_id' => '1', + ), + 106 => + array ( + 'contentobject_id' => '148', + 'contentobject_state_id' => '1', + ), + 107 => + array ( + 'contentobject_id' => '149', + 'contentobject_state_id' => '1', + ), + 108 => + array ( + 'contentobject_id' => '150', + 'contentobject_state_id' => '1', + ), + 109 => + array ( + 'contentobject_id' => '151', + 'contentobject_state_id' => '1', + ), + 110 => + array ( + 'contentobject_id' => '152', + 'contentobject_state_id' => '1', + ), + 111 => + array ( + 'contentobject_id' => '153', + 'contentobject_state_id' => '1', + ), + 112 => + array ( + 'contentobject_id' => '154', + 'contentobject_state_id' => '1', + ), + 113 => + array ( + 'contentobject_id' => '155', + 'contentobject_state_id' => '1', + ), + 114 => + array ( + 'contentobject_id' => '156', + 'contentobject_state_id' => '1', + ), + 115 => + array ( + 'contentobject_id' => '157', + 'contentobject_state_id' => '1', + ), + 116 => + array ( + 'contentobject_id' => '158', + 'contentobject_state_id' => '1', + ), + 117 => + array ( + 'contentobject_id' => '159', + 'contentobject_state_id' => '1', + ), + 118 => + array ( + 'contentobject_id' => '160', + 'contentobject_state_id' => '1', + ), + 119 => + array ( + 'contentobject_id' => '161', + 'contentobject_state_id' => '1', + ), + 120 => + array ( + 'contentobject_id' => '162', + 'contentobject_state_id' => '1', + ), + 121 => + array ( + 'contentobject_id' => '163', + 'contentobject_state_id' => '1', + ), + 122 => + array ( + 'contentobject_id' => '164', + 'contentobject_state_id' => '1', + ), + 123 => + array ( + 'contentobject_id' => '165', + 'contentobject_state_id' => '1', + ), + 124 => + array ( + 'contentobject_id' => '166', + 'contentobject_state_id' => '1', + ), + 125 => + array ( + 'contentobject_id' => '167', + 'contentobject_state_id' => '1', + ), + 126 => + array ( + 'contentobject_id' => '168', + 'contentobject_state_id' => '1', + ), + 127 => + array ( + 'contentobject_id' => '169', + 'contentobject_state_id' => '1', + ), + 128 => + array ( + 'contentobject_id' => '170', + 'contentobject_state_id' => '1', + ), + 129 => + array ( + 'contentobject_id' => '171', + 'contentobject_state_id' => '1', + ), + 130 => + array ( + 'contentobject_id' => '172', + 'contentobject_state_id' => '1', + ), + 131 => + array ( + 'contentobject_id' => '173', + 'contentobject_state_id' => '1', + ), + 132 => + array ( + 'contentobject_id' => '174', + 'contentobject_state_id' => '1', + ), + 133 => + array ( + 'contentobject_id' => '175', + 'contentobject_state_id' => '1', + ), + 134 => + array ( + 'contentobject_id' => '176', + 'contentobject_state_id' => '1', + ), + 135 => + array ( + 'contentobject_id' => '177', + 'contentobject_state_id' => '1', + ), + 136 => + array ( + 'contentobject_id' => '178', + 'contentobject_state_id' => '1', + ), + 137 => + array ( + 'contentobject_id' => '179', + 'contentobject_state_id' => '1', + ), + 138 => + array ( + 'contentobject_id' => '180', + 'contentobject_state_id' => '1', + ), + 139 => + array ( + 'contentobject_id' => '181', + 'contentobject_state_id' => '1', + ), + 140 => + array ( + 'contentobject_id' => '182', + 'contentobject_state_id' => '1', + ), + 141 => + array ( + 'contentobject_id' => '183', + 'contentobject_state_id' => '1', + ), + 142 => + array ( + 'contentobject_id' => '184', + 'contentobject_state_id' => '1', + ), + 143 => + array ( + 'contentobject_id' => '185', + 'contentobject_state_id' => '1', + ), + 144 => + array ( + 'contentobject_id' => '186', + 'contentobject_state_id' => '1', + ), + 145 => + array ( + 'contentobject_id' => '187', + 'contentobject_state_id' => '1', + ), + 146 => + array ( + 'contentobject_id' => '188', + 'contentobject_state_id' => '1', + ), + 147 => + array ( + 'contentobject_id' => '189', + 'contentobject_state_id' => '1', + ), + 148 => + array ( + 'contentobject_id' => '190', + 'contentobject_state_id' => '1', + ), + 149 => + array ( + 'contentobject_id' => '191', + 'contentobject_state_id' => '1', + ), + 150 => + array ( + 'contentobject_id' => '192', + 'contentobject_state_id' => '1', + ), + 151 => + array ( + 'contentobject_id' => '193', + 'contentobject_state_id' => '1', + ), + 152 => + array ( + 'contentobject_id' => '194', + 'contentobject_state_id' => '1', + ), + 153 => + array ( + 'contentobject_id' => '195', + 'contentobject_state_id' => '1', + ), + 154 => + array ( + 'contentobject_id' => '196', + 'contentobject_state_id' => '1', + ), + 155 => + array ( + 'contentobject_id' => '197', + 'contentobject_state_id' => '1', + ), + 156 => + array ( + 'contentobject_id' => '198', + 'contentobject_state_id' => '1', + ), + 157 => + array ( + 'contentobject_id' => '199', + 'contentobject_state_id' => '1', + ), + 158 => + array ( + 'contentobject_id' => '200', + 'contentobject_state_id' => '1', + ), + 159 => + array ( + 'contentobject_id' => '201', + 'contentobject_state_id' => '1', + ), + 160 => + array ( + 'contentobject_id' => '202', + 'contentobject_state_id' => '1', + ), + 161 => + array ( + 'contentobject_id' => '203', + 'contentobject_state_id' => '1', + ), + 162 => + array ( + 'contentobject_id' => '204', + 'contentobject_state_id' => '1', + ), + 163 => + array ( + 'contentobject_id' => '205', + 'contentobject_state_id' => '1', + ), + 164 => + array ( + 'contentobject_id' => '206', + 'contentobject_state_id' => '1', + ), + 165 => + array ( + 'contentobject_id' => '207', + 'contentobject_state_id' => '1', + ), + 166 => + array ( + 'contentobject_id' => '208', + 'contentobject_state_id' => '1', + ), + 167 => + array ( + 'contentobject_id' => '209', + 'contentobject_state_id' => '1', + ), + 168 => + array ( + 'contentobject_id' => '210', + 'contentobject_state_id' => '1', + ), + 169 => + array ( + 'contentobject_id' => '211', + 'contentobject_state_id' => '1', + ), + 170 => + array ( + 'contentobject_id' => '212', + 'contentobject_state_id' => '1', + ), + 171 => + array ( + 'contentobject_id' => '213', + 'contentobject_state_id' => '1', + ), + 172 => + array ( + 'contentobject_id' => '214', + 'contentobject_state_id' => '1', + ), + 173 => + array ( + 'contentobject_id' => '215', + 'contentobject_state_id' => '1', + ), + 174 => + array ( + 'contentobject_id' => '216', + 'contentobject_state_id' => '1', + ), + 175 => + array ( + 'contentobject_id' => '217', + 'contentobject_state_id' => '1', + ), + 176 => + array ( + 'contentobject_id' => '218', + 'contentobject_state_id' => '1', + ), + 177 => + array ( + 'contentobject_id' => '219', + 'contentobject_state_id' => '1', + ), + 178 => + array ( + 'contentobject_id' => '220', + 'contentobject_state_id' => '1', + ), + 179 => + array ( + 'contentobject_id' => '221', + 'contentobject_state_id' => '1', + ), + 180 => + array ( + 'contentobject_id' => '222', + 'contentobject_state_id' => '1', + ), + 181 => + array ( + 'contentobject_id' => '223', + 'contentobject_state_id' => '1', + ), + 182 => + array ( + 'contentobject_id' => '224', + 'contentobject_state_id' => '1', + ), + 183 => + array ( + 'contentobject_id' => '225', + 'contentobject_state_id' => '1', + ), + ), + 'ezuservisit' => + array ( + 0 => + array ( + 'current_visit_timestamp' => '1338281105', + 'failed_login_attempts' => '0', + 'last_visit_timestamp' => '1338281097', + 'login_count' => '1', + 'user_id' => '14', + ), + ), + 'ezuser_setting' => + array ( + 0 => + array ( + 'is_enabled' => '1', + 'max_login' => '1000', + 'user_id' => '10', + ), + 1 => + array ( + 'is_enabled' => '1', + 'max_login' => '10', + 'user_id' => '14', + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr new file mode 100644 index 0000000..0a18668 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr @@ -0,0 +1,46 @@ +# Rules for ASCII handling +# +# ASCII is the basis for all charsets and will always be used +# +# See basic.tr for formatting options + +# Upper and lowercase handling + +ascii_lowercase: +U+0041 - U+005A + 20 + +ascii_uppercase: +U+0061 - U+007A - 20 + +ascii_search_cleanup: +U+0023 = U+0020 # Number sign / hash +U+0024 = U+0020 # Dollar sign +U+0026 = U+0020 # Ampersand +U+005E = U+0020 # Circumflex accent +# U+005F = U+0020 # Low line +U+007B = U+0020 # Left curly bracket +U+007D = U+0020 # Right curly bracket +U+007C = U+0020 # Vertical line +U+0040 = U+0020 # Commercial at +U+003A = U+0020 # Colon : +U+003B = U+0020 # Semi-colon ; +U+002C = U+0020 # Comma , +U+0028 = U+0020 # parenthesis start ( +U+0029 = U+0020 # parenthesis end ) +U+002D = U+0020 # Hyphen minus - +U+002B = U+0020 # Plus sign + +U+002F = U+0020 # Slash / +U+005B = U+0020 # Square bracket start [ +U+005D = U+0020 # Square bracket end ] +U+005C = U+0020 # Back slash \ +U+003C = U+0020 # Angular bracket start < +U+003E = U+0020 # Angular bracket end +U+003D = U+0020 # Equal sign = +U+0027 = U+0020 # Apostrophe ' +U+0060 = U+0020 # Grave accent ` + +# C0 controls +# Tab, line feed and carriage return are not touched by these rules +U+0000 - U+0009 = U+0020 +U+000B - U+000C = U+0020 +U+000E - U+001F = U+0020 diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr.result new file mode 100644 index 0000000..8b09cb7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr.result @@ -0,0 +1,221 @@ +<?php + +return array ( + 'ascii_lowercase' => array ( + 0 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0041', + 'srcEnd' => 'U+005A', + 'op' => '+', + 'dest' => '20', + ), + ), + ), + 'ascii_uppercase' => array ( + 0 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0061', + 'srcEnd' => 'U+007A', + 'op' => '-', + 'dest' => '20', + ), + ), + ), + 'ascii_search_cleanup' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0023', + 'dest' => 'U+0020', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0024', + 'dest' => 'U+0020', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0026', + 'dest' => 'U+0020', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+005E', + 'dest' => 'U+0020', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+007B', + 'dest' => 'U+0020', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+007D', + 'dest' => 'U+0020', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+007C', + 'dest' => 'U+0020', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0040', + 'dest' => 'U+0020', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+003A', + 'dest' => 'U+0020', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+003B', + 'dest' => 'U+0020', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+002C', + 'dest' => 'U+0020', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0028', + 'dest' => 'U+0020', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0029', + 'dest' => 'U+0020', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+002D', + 'dest' => 'U+0020', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+002B', + 'dest' => 'U+0020', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+002F', + 'dest' => 'U+0020', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+005B', + 'dest' => 'U+0020', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+005D', + 'dest' => 'U+0020', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+005C', + 'dest' => 'U+0020', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+003C', + 'dest' => 'U+0020', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+003E', + 'dest' => 'U+0020', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+003D', + 'dest' => 'U+0020', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0027', + 'dest' => 'U+0020', + ), + ), + 23 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0060', + 'dest' => 'U+0020', + ), + ), + 24 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+0000', + 'srcEnd' => 'U+0009', + 'dest' => 'U+0020', + ), + ), + 25 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+000B', + 'srcEnd' => 'U+000C', + 'dest' => 'U+0020', + ), + ), + 26 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+000E', + 'srcEnd' => 'U+001F', + 'dest' => 'U+0020', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr new file mode 100644 index 0000000..2a1bc7c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr @@ -0,0 +1,63 @@ +# Transformation formats +# CF = CF... : Map from one char to one or more chars (map) +# CF - CF = CF... : Map range of chars to one or more chars (replace) +# CF - CF +- xx : Transpose several chars by value xx (transpose) +# CF - CF % yy +- xx : Transpose several chars by value xx, yy denotes skip value +# yy equal to 1 is the same as 'transpose' (transpose-modulo) +# TI[,TI...] : +# +# CF = Character Format +# TI = Transform Identifier +# +# Character formats: +# U+xxxx : Unicode value in hexadecimal +# xx: Ascii value in hexadecimal +# remove : Remove character from result, can only be used in destination +# keep : Keep character as it is, can only be used in destination +# "xxxx" : Multiple characters as a string, can only be used in destination, \\ means \ and \" means " +# +# +# + +space_normalize: +U+202F = U+00A0 # Narrow no-break space => No-break space +U+FEFF = U+00A0 # Zero width no-break space => No-break space +U+00A0 = U+0020 # Turn non-breaking-space into normal space +#U+00BC - U+00B = U+0020 # test of parser error detection +#U+0041 - U+005G + 20 # test of parser error detection + +hyphen_normalize: +U+007E = U+002D # tilde/swung dash into hyphen-minus +U+00AD = remove # Soft hyphens are only meant for helping with wordbreaking + +apostrophe_normalize: +# Turn special accents into apostrophe which is defined in ASCII +U+0060 = U+0027 # Grave accent +U+00B4 = U+0027 # Acute accent +U+02CA = U+0027 # Modified letter acute accent +U+02CB = U+0027 # Modified letter grave accent +U+02CF = U+0027 # Modified letter low acute accent +U+02CE = U+0027 # Modified letter low grave accent + +doublequote_normalize: +# Turns fancy double quote into ASCII double quote +U+00AB = U+0022 # left-pointing double angle quotation mark +U+00BB = U+0022 # right-pointing double angle quotation mark +U+02DD = U+0027 # double accute accent + +apostrophe_to_doublequote: +# Turns apostrophe into doublequote +U+0027 = U+0022 + +special_decompose: +U+00A9 = "(C)" # Copyright sign +U+00AE = "(R)" # Registered sign +U+00B1 = "+-" # Plus/minus sign +U+00B2 = "2" # Superscript two +U+00B3 = "3" # Superscript three +U+00B9 = "1" # Superscript one +U+00BA = "1" # Superscript one +U+00BC = "1/4" # Vulgar fraction one quarter +U+00BD = "1/2" # Vulgar fraction one half +U+00BE = "3/4" # Vulgar fraction three quarter + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr.result new file mode 100644 index 0000000..d557ac3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr.result @@ -0,0 +1,192 @@ +<?php + +return array ( + 'space_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+202F', + 'dest' => 'U+00A0', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+FEFF', + 'dest' => 'U+00A0', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A0', + 'dest' => 'U+0020', + ), + ), + ), + 'hyphen_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+007E', + 'dest' => 'U+002D', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AD', + 'dest' => 'remove', + ), + ), + ), + 'apostrophe_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0060', + 'dest' => 'U+0027', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B4', + 'dest' => 'U+0027', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+02CA', + 'dest' => 'U+0027', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+02CB', + 'dest' => 'U+0027', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+02CF', + 'dest' => 'U+0027', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+02CE', + 'dest' => 'U+0027', + ), + ), + ), + 'doublequote_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AB', + 'dest' => 'U+0022', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BB', + 'dest' => 'U+0022', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+02DD', + 'dest' => 'U+0027', + ), + ), + ), + 'apostrophe_to_doublequote' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0027', + 'dest' => 'U+0022', + ), + ), + ), + 'special_decompose' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A9', + 'dest' => '"(C)"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AE', + 'dest' => '"(R)"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B1', + 'dest' => '"+-"', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B2', + 'dest' => '"2"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B3', + 'dest' => '"3"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B9', + 'dest' => '"1"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BA', + 'dest' => '"1"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BC', + 'dest' => '"1/4"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BD', + 'dest' => '"1/2"', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BE', + 'dest' => '"3/4"', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr new file mode 100644 index 0000000..53f803d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr @@ -0,0 +1,202 @@ +# Rules related to cyrillic +# +# The following charsets uses characters from cyrillic: +# koi-8, koi-8r, iso-8859-5, cp932, cp866, cp855, windows-1251 +# +# See basic.tr for formatting options + +# Transliteration of cyrillic, is used in URLs and identifiers + +cyrillic_uppercase: +U+0450 - U+045F - U+0050 +U+0430 - U+044F - U+0020 + +U+0461 - U+0481 % 02 - U+0001 +U+048B - U+04BF % 02 - U+0001 +U+04C2 - U+04CC % 02 - U+0001 +U+04D1 - U+04F5 % 02 - U+0001 + +# Cyrillic Supplementary +U+0501 - U+050F % 02 - U+0001 + +cyrillic_lowercase: +U+0400 - U+040F + U+0050 +U+0410 - U+042F + U+0020 + +U+0460 - U+0480 % 02 + U+0001 +U+048A - U+04BE % 02 + U+0001 +U+04C1 - U+04CD % 02 + U+0001 +U+04D0 - U+04F4 % 02 + U+0001 + +# Cyrillic Supplementary +U+0500 - U+050E % 02 + U+0001 + +cyrillic_diacritical: +# Cyrillic extension +U+0400 - U+0401 = U+0415 +U+0403 = U+0413 +U+0407 = U+0406 +U+040C = U+041A +U+040D = U+0418 +U+040E = U+0423 + +# Basic russian +U+0419 = U+0418 +U+0439 = U+0438 + +# Cyrillic extension +U+0450 = U+0435 +U+0451 = U+0435 +U+0453 = U+0433 +U+0457 = U+0456 +U+045C = U+043A +U+045D = U+0438 +U+045E = U+0443 + +# Historic letters +U+0476 = U+0474 +U+0477 = U+0475 + +# Extended cyrillic +U+04C1 = U+0416 +U+04C2 = U+0436 +U+04D0 = U+0410 +U+04D1 = U+0430 +U+04D2 = U+0410 +U+04D3 = U+0430 +U+04D6 = U+0415 +U+04D7 = U+0435 +U+04DA = U+04D8 +U+04DB = U+04D9 +U+04DC = U+0416 +U+04DD = U+0436 +U+04DE = U+0417 +U+04DF = U+0437 +U+04E2 = U+0418 +U+04E3 = U+0438 +U+04E4 = U+0418 +U+04E5 = U+0438 +U+04E6 = U+041E +U+04E7 = U+043E +U+04EA = U+04E8 +U+04EB = U+04E9 +U+04EC = U+042D +U+04ED = U+044D +U+04EE = U+0423 +U+04EF = U+0443 +U+04F0 = U+0423 +U+04F1 = U+0443 +U+04F2 = U+0423 +U+04F3 = U+0443 +U+04F4 = U+0427 +U+04F5 = U+0447 +U+04F8 = U+042B +U+04F9 = U+044B + +cyrillic_transliterate_ascii: +U+0400 = "IE" +U+0401 = "IO" +U+0402 = "D" +U+0403 = "G" +U+0404 = "IE" +U+0405 = "DS" +U+0406 = "II" +U+0407 = "YI" +U+0408 = "J" +U+0409 = "LJ" +U+040A = "NJ" +U+040B = "Ts" +U+040C = "KJ" +U+040D = "I" +U+040E = "V" +U+040F = "DZ" + +U+0410 = "A" +U+0411 = "B" +U+0412 = "V" +U+0413 = "G" +U+0414 = "D" +U+0415 = "E" +U+0416 = "ZH" +U+0417 = "Z" +U+0418 = "I" +U+0419 = "J" +U+041A = "K" +U+041B = "L" +U+041C = "M" +U+041D = "N" +U+041E = "O" +U+041F = "P" + +U+0420 = "R" +U+0421 = "S" +U+0422 = "T" +U+0423 = "U" +U+0424 = "F" +U+0425 = "H" +U+0426 = "C" +U+0427 = "CH" +U+0428 = "SH" +U+0429 = "SCH" +U+042A = "\'" +U+042B = "Y" +U+042C = "\'" +U+042D = "E" +U+042E = "YU" +U+042F = "YA" + +U+0430 = "a" +U+0431 = "b" +U+0432 = "v" +U+0433 = "g" +U+0434 = "d" +U+0435 = "e" +U+0436 = "zh" +U+0437 = "z" +U+0438 = "i" +U+0439 = "j" +U+043A = "k" +U+043B = "l" +U+043C = "m" +U+043D = "n" +U+043E = "o" +U+043F = "p" + +U+0440 = "r" +U+0441 = "s" +U+0442 = "t" +U+0443 = "u" +U+0444 = "f" +U+0445 = "h" +U+0446 = "c" +U+0447 = "ch" +U+0448 = "sh" +U+0449 = "sch" +U+044A = "\'" +U+044B = "y" +U+044C = "\'" +U+044D = "e" +U+044E = "yu" +U+044F = "ya" + +U+0450 = "ie" +U+0451 = "io" +U+0452 = "dj" +U+0453 = "g" +U+0454 = "e" +U+0455 = "z" +U+0456 = "i" +U+0457 = "yi" +U+0458 = "j" +U+0459 = "lj" +U+045A = "nj" +U+045B = "c" +U+045C = "kj" +U+045D = "i" +U+045E = "v" +U+045F = "dz" + +cyrillic_search_cleanup: +# Turns some special characters into spaces +U+0482 - U+0486 = U+0020 +U+0488 - U+0489 = U+0020 diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr.result new file mode 100644 index 0000000..8087c72 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr.result @@ -0,0 +1,1197 @@ +<?php + +return array ( + 'cyrillic_uppercase' => array ( + 0 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0450', + 'srcEnd' => 'U+045F', + 'op' => '-', + 'dest' => 'U+0050', + ), + ), + 1 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0430', + 'srcEnd' => 'U+044F', + 'op' => '-', + 'dest' => 'U+0020', + ), + ), + 2 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0461', + 'srcEnd' => 'U+0481', + 'modulo' => '02', + 'op' => '-', + 'dest' => 'U+0001', + ), + ), + 3 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+048B', + 'srcEnd' => 'U+04BF', + 'modulo' => '02', + 'op' => '-', + 'dest' => 'U+0001', + ), + ), + 4 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+04C2', + 'srcEnd' => 'U+04CC', + 'modulo' => '02', + 'op' => '-', + 'dest' => 'U+0001', + ), + ), + 5 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+04D1', + 'srcEnd' => 'U+04F5', + 'modulo' => '02', + 'op' => '-', + 'dest' => 'U+0001', + ), + ), + 6 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0501', + 'srcEnd' => 'U+050F', + 'modulo' => '02', + 'op' => '-', + 'dest' => 'U+0001', + ), + ), + ), + 'cyrillic_lowercase' => array ( + 0 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0400', + 'srcEnd' => 'U+040F', + 'op' => '+', + 'dest' => 'U+0050', + ), + ), + 1 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0410', + 'srcEnd' => 'U+042F', + 'op' => '+', + 'dest' => 'U+0020', + ), + ), + 2 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0460', + 'srcEnd' => 'U+0480', + 'modulo' => '02', + 'op' => '+', + 'dest' => 'U+0001', + ), + ), + 3 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+048A', + 'srcEnd' => 'U+04BE', + 'modulo' => '02', + 'op' => '+', + 'dest' => 'U+0001', + ), + ), + 4 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+04C1', + 'srcEnd' => 'U+04CD', + 'modulo' => '02', + 'op' => '+', + 'dest' => 'U+0001', + ), + ), + 5 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+04D0', + 'srcEnd' => 'U+04F4', + 'modulo' => '02', + 'op' => '+', + 'dest' => 'U+0001', + ), + ), + 6 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0500', + 'srcEnd' => 'U+050E', + 'modulo' => '02', + 'op' => '+', + 'dest' => 'U+0001', + ), + ), + ), + 'cyrillic_diacritical' => array ( + 0 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+0400', + 'srcEnd' => 'U+0401', + 'dest' => 'U+0415', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0403', + 'dest' => 'U+0413', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0407', + 'dest' => 'U+0406', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040C', + 'dest' => 'U+041A', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040D', + 'dest' => 'U+0418', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040E', + 'dest' => 'U+0423', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0419', + 'dest' => 'U+0418', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0439', + 'dest' => 'U+0438', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0450', + 'dest' => 'U+0435', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0451', + 'dest' => 'U+0435', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0453', + 'dest' => 'U+0433', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0457', + 'dest' => 'U+0456', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045C', + 'dest' => 'U+043A', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045D', + 'dest' => 'U+0438', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045E', + 'dest' => 'U+0443', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0476', + 'dest' => 'U+0474', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0477', + 'dest' => 'U+0475', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04C1', + 'dest' => 'U+0416', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04C2', + 'dest' => 'U+0436', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04D0', + 'dest' => 'U+0410', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04D1', + 'dest' => 'U+0430', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04D2', + 'dest' => 'U+0410', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04D3', + 'dest' => 'U+0430', + ), + ), + 23 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04D6', + 'dest' => 'U+0415', + ), + ), + 24 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04D7', + 'dest' => 'U+0435', + ), + ), + 25 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04DA', + 'dest' => 'U+04D8', + ), + ), + 26 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04DB', + 'dest' => 'U+04D9', + ), + ), + 27 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04DC', + 'dest' => 'U+0416', + ), + ), + 28 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04DD', + 'dest' => 'U+0436', + ), + ), + 29 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04DE', + 'dest' => 'U+0417', + ), + ), + 30 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04DF', + 'dest' => 'U+0437', + ), + ), + 31 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04E2', + 'dest' => 'U+0418', + ), + ), + 32 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04E3', + 'dest' => 'U+0438', + ), + ), + 33 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04E4', + 'dest' => 'U+0418', + ), + ), + 34 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04E5', + 'dest' => 'U+0438', + ), + ), + 35 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04E6', + 'dest' => 'U+041E', + ), + ), + 36 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04E7', + 'dest' => 'U+043E', + ), + ), + 37 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04EA', + 'dest' => 'U+04E8', + ), + ), + 38 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04EB', + 'dest' => 'U+04E9', + ), + ), + 39 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04EC', + 'dest' => 'U+042D', + ), + ), + 40 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04ED', + 'dest' => 'U+044D', + ), + ), + 41 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04EE', + 'dest' => 'U+0423', + ), + ), + 42 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04EF', + 'dest' => 'U+0443', + ), + ), + 43 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F0', + 'dest' => 'U+0423', + ), + ), + 44 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F1', + 'dest' => 'U+0443', + ), + ), + 45 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F2', + 'dest' => 'U+0423', + ), + ), + 46 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F3', + 'dest' => 'U+0443', + ), + ), + 47 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F4', + 'dest' => 'U+0427', + ), + ), + 48 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F5', + 'dest' => 'U+0447', + ), + ), + 49 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F8', + 'dest' => 'U+042B', + ), + ), + 50 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+04F9', + 'dest' => 'U+044B', + ), + ), + ), + 'cyrillic_transliterate_ascii' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0400', + 'dest' => '"IE"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0401', + 'dest' => '"IO"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0402', + 'dest' => '"D"', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0403', + 'dest' => '"G"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0404', + 'dest' => '"IE"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0405', + 'dest' => '"DS"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0406', + 'dest' => '"II"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0407', + 'dest' => '"YI"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0408', + 'dest' => '"J"', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0409', + 'dest' => '"LJ"', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040A', + 'dest' => '"NJ"', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040B', + 'dest' => '"Ts"', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040C', + 'dest' => '"KJ"', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040D', + 'dest' => '"I"', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040E', + 'dest' => '"V"', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+040F', + 'dest' => '"DZ"', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0410', + 'dest' => '"A"', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0411', + 'dest' => '"B"', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0412', + 'dest' => '"V"', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0413', + 'dest' => '"G"', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0414', + 'dest' => '"D"', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0415', + 'dest' => '"E"', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0416', + 'dest' => '"ZH"', + ), + ), + 23 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0417', + 'dest' => '"Z"', + ), + ), + 24 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0418', + 'dest' => '"I"', + ), + ), + 25 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0419', + 'dest' => '"J"', + ), + ), + 26 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+041A', + 'dest' => '"K"', + ), + ), + 27 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+041B', + 'dest' => '"L"', + ), + ), + 28 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+041C', + 'dest' => '"M"', + ), + ), + 29 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+041D', + 'dest' => '"N"', + ), + ), + 30 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+041E', + 'dest' => '"O"', + ), + ), + 31 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+041F', + 'dest' => '"P"', + ), + ), + 32 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0420', + 'dest' => '"R"', + ), + ), + 33 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0421', + 'dest' => '"S"', + ), + ), + 34 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0422', + 'dest' => '"T"', + ), + ), + 35 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0423', + 'dest' => '"U"', + ), + ), + 36 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0424', + 'dest' => '"F"', + ), + ), + 37 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0425', + 'dest' => '"H"', + ), + ), + 38 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0426', + 'dest' => '"C"', + ), + ), + 39 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0427', + 'dest' => '"CH"', + ), + ), + 40 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0428', + 'dest' => '"SH"', + ), + ), + 41 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0429', + 'dest' => '"SCH"', + ), + ), + 42 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+042A', + 'dest' => '"\\\'"', + ), + ), + 43 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+042B', + 'dest' => '"Y"', + ), + ), + 44 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+042C', + 'dest' => '"\\\'"', + ), + ), + 45 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+042D', + 'dest' => '"E"', + ), + ), + 46 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+042E', + 'dest' => '"YU"', + ), + ), + 47 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+042F', + 'dest' => '"YA"', + ), + ), + 48 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0430', + 'dest' => '"a"', + ), + ), + 49 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0431', + 'dest' => '"b"', + ), + ), + 50 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0432', + 'dest' => '"v"', + ), + ), + 51 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0433', + 'dest' => '"g"', + ), + ), + 52 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0434', + 'dest' => '"d"', + ), + ), + 53 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0435', + 'dest' => '"e"', + ), + ), + 54 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0436', + 'dest' => '"zh"', + ), + ), + 55 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0437', + 'dest' => '"z"', + ), + ), + 56 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0438', + 'dest' => '"i"', + ), + ), + 57 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0439', + 'dest' => '"j"', + ), + ), + 58 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+043A', + 'dest' => '"k"', + ), + ), + 59 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+043B', + 'dest' => '"l"', + ), + ), + 60 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+043C', + 'dest' => '"m"', + ), + ), + 61 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+043D', + 'dest' => '"n"', + ), + ), + 62 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+043E', + 'dest' => '"o"', + ), + ), + 63 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+043F', + 'dest' => '"p"', + ), + ), + 64 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0440', + 'dest' => '"r"', + ), + ), + 65 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0441', + 'dest' => '"s"', + ), + ), + 66 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0442', + 'dest' => '"t"', + ), + ), + 67 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0443', + 'dest' => '"u"', + ), + ), + 68 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0444', + 'dest' => '"f"', + ), + ), + 69 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0445', + 'dest' => '"h"', + ), + ), + 70 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0446', + 'dest' => '"c"', + ), + ), + 71 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0447', + 'dest' => '"ch"', + ), + ), + 72 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0448', + 'dest' => '"sh"', + ), + ), + 73 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0449', + 'dest' => '"sch"', + ), + ), + 74 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+044A', + 'dest' => '"\\\'"', + ), + ), + 75 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+044B', + 'dest' => '"y"', + ), + ), + 76 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+044C', + 'dest' => '"\\\'"', + ), + ), + 77 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+044D', + 'dest' => '"e"', + ), + ), + 78 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+044E', + 'dest' => '"yu"', + ), + ), + 79 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+044F', + 'dest' => '"ya"', + ), + ), + 80 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0450', + 'dest' => '"ie"', + ), + ), + 81 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0451', + 'dest' => '"io"', + ), + ), + 82 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0452', + 'dest' => '"dj"', + ), + ), + 83 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0453', + 'dest' => '"g"', + ), + ), + 84 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0454', + 'dest' => '"e"', + ), + ), + 85 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0455', + 'dest' => '"z"', + ), + ), + 86 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0456', + 'dest' => '"i"', + ), + ), + 87 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0457', + 'dest' => '"yi"', + ), + ), + 88 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0458', + 'dest' => '"j"', + ), + ), + 89 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0459', + 'dest' => '"lj"', + ), + ), + 90 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045A', + 'dest' => '"nj"', + ), + ), + 91 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045B', + 'dest' => '"c"', + ), + ), + 92 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045C', + 'dest' => '"kj"', + ), + ), + 93 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045D', + 'dest' => '"i"', + ), + ), + 94 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045E', + 'dest' => '"v"', + ), + ), + 95 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+045F', + 'dest' => '"dz"', + ), + ), + ), + 'cyrillic_search_cleanup' => array ( + 0 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+0482', + 'srcEnd' => 'U+0486', + 'dest' => 'U+0020', + ), + ), + 1 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+0488', + 'srcEnd' => 'U+0489', + 'dest' => 'U+0020', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr new file mode 100644 index 0000000..e431f63 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr @@ -0,0 +1,202 @@ +# Rules related to greek +# +# The following charsets uses characters from greek: +# cp437, cp737, cp860, cp861, cp862, cp863, cp864, cp865, cp869, cp932, +# iso-8859-7, macintosh, windows-1253 +# +# See basic.tr for formatting options + +greek_uppercase: +U+03AC = U+0386 +U+03AD - U+03AF - U+0025 + +U+03B1 - U+03C1 - U+0020 +U+03C3 - U+03CB - U+0020 + +U+03CC = U+038C +U+03CD - U+03CE - U+003F + +U+03DB - U+03EF % 02 - U+0001 + +# One way: +U+03D0 = U+0392 +U+03D1 = U+0398 +U+03D5 = U+03A6 +U+03D6 = U+03A0 + +greek_lowercase: +U+0386 = U+03AC +U+0388 - U+038A + U+0025 + +U+0391 - U+03A1 + U+0020 +U+03A3 - U+03AB + U+0020 + +U+038C = U+03CC +U+038E - U+038F + U+003F + +U+03DA - U+03EE % 02 + U+0001 + +greek_diacritical: +U+0386 = U+0391 +U+0388 = U+0395 +U+0389 = U+0397 +U+038A = U+0399 +U+038C = U+039F +U+038E = U+03A5 +U+038F = U+03A9 +U+0390 = U+03CA + +U+03AA = U+0399 +U+03AB = U+03A5 +U+03AC = U+03B1 +U+03AD = U+03B5 +U+03AE = U+03B7 +U+03AF = U+03B9 +U+03B0 = U+03CB + +U+03CA = U+03B9 +U+03CB = U+03C5 +U+03CC = U+03BF +U+03CD = U+03C5 +U+03CE = U+03C9 + +# Variant letterforms +U+03D4 = U+03D2 + +greek_normalize: +U+037A = U+0020 # Greek ypogegrammeni +U+037E = U+003F # Greek question mark +U+0384 = U+0020 # Greek tonos +U+0385 = U+00A8 # Greek dialytika tonos +U+0387 = U+00B7 # Greek ano teleia + +# Transliteration of greek, is used in URLs and identifiers +greek_transliterate_ascii: +U+0374 = "\'" +U+0375 = "\'" +U+037A = "" +U+037E = ";" + +U+0384 = "\'" +U+0385 = ";" +U+0386 = "Ha" +U+0388 = "He" +U+0389 = "He" +U+038A = "Hi" +U+038C = "Ho" +U+038E = "Hu" +U+038F = "Ho" + +U+0390 = "I" +U+0391 = "A" +U+0392 = "V" +U+0393 = "G" +U+0394 = "D" +U+0395 = "E" +U+0396 = "Z" +U+0397 = "E" +U+0398 = "Th" +U+0399 = "I" +U+039A = "K" +U+039B = "L" +U+039C = "M" +U+039D = "N" +U+039E = "X" +U+039F = "O" + +U+03A0 = "P" +U+03A1 = "R" + +U+03A3 = "S" +U+03A4 = "T" +U+03A5 = "Y" +U+03A6 = "Ph" +U+03A7 = "Ch" +U+03A8 = "Ps" +U+03A9 = "O" +U+03AA = "I" +U+03AB = "Y" +U+03AC = "ha" +U+03AD = "he" +U+03AE = "he" +U+03AF = "hi" + +U+03B0 = "y" +U+03B1 = "a" +U+03B2 = "v" +U+03B3 = "g" +U+03B4 = "d" +U+03B5 = "e" +U+03B6 = "z" +U+03B7 = "e" +U+03B8 = "th" +U+03B9 = "i" +U+03BA = "k" +U+03BB = "l" +U+03BC = "m" +U+03BD = "n" +U+03BE = "x" +U+03BF = "o" + +U+03C0 = "p" +U+03C1 = "r" +U+03C2 = "s" +U+03C3 = "s" +U+03C4 = "t" +U+03C5 = "y" +U+03C6 = "ph" +U+03C7 = "ch" +U+03C8 = "ps" +U+03C9 = "o" +U+03CA = "i" +U+03CB = "y" +U+03CC = "ho" +U+03CD = "hu" +U+03CE = "ho" + +U+03D0 = "b" +U+03D1 = "th" +U+03D2 = "Y" +U+03D3 = "Y" +U+03D4 = "Y" +U+03D5 = "phi" +U+03D6 = "pi" +U+03D7 = "&" +U+03D8 = "K" +U+03D9 = "k" +U+03DA = "6" +U+03DB = "s" +U+03DC = "F" +U+03DD = "f" +U+03DE = "K" +U+03DF = "90" + +U+03E0 = "S" +U+03E1 = "900" +U+03E2 = "" +U+03E3 = "" +U+03E4 = "" +U+03E5 = "" +U+03E6 = "" +U+03E7 = "" +U+03E8 = "" +U+03E9 = "" +U+03EA = "" +U+03EB = "" +U+03EC = "" +U+03ED = "" +U+03EE = "" +U+03EF = "" + +U+03F0 = "" +U+03F1 = "r" +U+03F2 = "" +U+03F3 = "j" +U+03F4 = "" +U+03F5 = "e" +U+03F6 = "e" +U+03F7 = "" +U+03F8 = "" +U+03F9 = "" +U+03FA = "" +U+03FB = "" diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr.result new file mode 100644 index 0000000..c775e8d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr.result @@ -0,0 +1,1178 @@ +<?php + +return array ( + 'greek_uppercase' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AC', + 'dest' => 'U+0386', + ), + ), + 1 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+03AD', + 'srcEnd' => 'U+03AF', + 'op' => '-', + 'dest' => 'U+0025', + ), + ), + 2 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+03B1', + 'srcEnd' => 'U+03C1', + 'op' => '-', + 'dest' => 'U+0020', + ), + ), + 3 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+03C3', + 'srcEnd' => 'U+03CB', + 'op' => '-', + 'dest' => 'U+0020', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CC', + 'dest' => 'U+038C', + ), + ), + 5 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+03CD', + 'srcEnd' => 'U+03CE', + 'op' => '-', + 'dest' => 'U+003F', + ), + ), + 6 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+03DB', + 'srcEnd' => 'U+03EF', + 'modulo' => '02', + 'op' => '-', + 'dest' => 'U+0001', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D0', + 'dest' => 'U+0392', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D1', + 'dest' => 'U+0398', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D5', + 'dest' => 'U+03A6', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D6', + 'dest' => 'U+03A0', + ), + ), + ), + 'greek_lowercase' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0386', + 'dest' => 'U+03AC', + ), + ), + 1 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0388', + 'srcEnd' => 'U+038A', + 'op' => '+', + 'dest' => 'U+0025', + ), + ), + 2 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+0391', + 'srcEnd' => 'U+03A1', + 'op' => '+', + 'dest' => 'U+0020', + ), + ), + 3 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+03A3', + 'srcEnd' => 'U+03AB', + 'op' => '+', + 'dest' => 'U+0020', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038C', + 'dest' => 'U+03CC', + ), + ), + 5 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+038E', + 'srcEnd' => 'U+038F', + 'op' => '+', + 'dest' => 'U+003F', + ), + ), + 6 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+03DA', + 'srcEnd' => 'U+03EE', + 'modulo' => '02', + 'op' => '+', + 'dest' => 'U+0001', + ), + ), + ), + 'greek_diacritical' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0386', + 'dest' => 'U+0391', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0388', + 'dest' => 'U+0395', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0389', + 'dest' => 'U+0397', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038A', + 'dest' => 'U+0399', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038C', + 'dest' => 'U+039F', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038E', + 'dest' => 'U+03A5', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038F', + 'dest' => 'U+03A9', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0390', + 'dest' => 'U+03CA', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AA', + 'dest' => 'U+0399', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AB', + 'dest' => 'U+03A5', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AC', + 'dest' => 'U+03B1', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AD', + 'dest' => 'U+03B5', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AE', + 'dest' => 'U+03B7', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AF', + 'dest' => 'U+03B9', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B0', + 'dest' => 'U+03CB', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CA', + 'dest' => 'U+03B9', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CB', + 'dest' => 'U+03C5', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CC', + 'dest' => 'U+03BF', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CD', + 'dest' => 'U+03C5', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CE', + 'dest' => 'U+03C9', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D4', + 'dest' => 'U+03D2', + ), + ), + ), + 'greek_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+037A', + 'dest' => 'U+0020', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+037E', + 'dest' => 'U+003F', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0384', + 'dest' => 'U+0020', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0385', + 'dest' => 'U+00A8', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0387', + 'dest' => 'U+00B7', + ), + ), + ), + 'greek_transliterate_ascii' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0374', + 'dest' => '"\\\'"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0375', + 'dest' => '"\\\'"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+037A', + 'dest' => '""', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+037E', + 'dest' => '";"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0384', + 'dest' => '"\\\'"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0385', + 'dest' => '";"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0386', + 'dest' => '"Ha"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0388', + 'dest' => '"He"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0389', + 'dest' => '"He"', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038A', + 'dest' => '"Hi"', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038C', + 'dest' => '"Ho"', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038E', + 'dest' => '"Hu"', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+038F', + 'dest' => '"Ho"', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0390', + 'dest' => '"I"', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0391', + 'dest' => '"A"', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0392', + 'dest' => '"V"', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0393', + 'dest' => '"G"', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0394', + 'dest' => '"D"', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0395', + 'dest' => '"E"', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0396', + 'dest' => '"Z"', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0397', + 'dest' => '"E"', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0398', + 'dest' => '"Th"', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0399', + 'dest' => '"I"', + ), + ), + 23 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+039A', + 'dest' => '"K"', + ), + ), + 24 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+039B', + 'dest' => '"L"', + ), + ), + 25 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+039C', + 'dest' => '"M"', + ), + ), + 26 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+039D', + 'dest' => '"N"', + ), + ), + 27 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+039E', + 'dest' => '"X"', + ), + ), + 28 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+039F', + 'dest' => '"O"', + ), + ), + 29 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A0', + 'dest' => '"P"', + ), + ), + 30 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A1', + 'dest' => '"R"', + ), + ), + 31 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A3', + 'dest' => '"S"', + ), + ), + 32 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A4', + 'dest' => '"T"', + ), + ), + 33 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A5', + 'dest' => '"Y"', + ), + ), + 34 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A6', + 'dest' => '"Ph"', + ), + ), + 35 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A7', + 'dest' => '"Ch"', + ), + ), + 36 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A8', + 'dest' => '"Ps"', + ), + ), + 37 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03A9', + 'dest' => '"O"', + ), + ), + 38 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AA', + 'dest' => '"I"', + ), + ), + 39 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AB', + 'dest' => '"Y"', + ), + ), + 40 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AC', + 'dest' => '"ha"', + ), + ), + 41 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AD', + 'dest' => '"he"', + ), + ), + 42 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AE', + 'dest' => '"he"', + ), + ), + 43 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03AF', + 'dest' => '"hi"', + ), + ), + 44 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B0', + 'dest' => '"y"', + ), + ), + 45 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B1', + 'dest' => '"a"', + ), + ), + 46 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B2', + 'dest' => '"v"', + ), + ), + 47 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B3', + 'dest' => '"g"', + ), + ), + 48 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B4', + 'dest' => '"d"', + ), + ), + 49 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B5', + 'dest' => '"e"', + ), + ), + 50 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B6', + 'dest' => '"z"', + ), + ), + 51 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B7', + 'dest' => '"e"', + ), + ), + 52 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B8', + 'dest' => '"th"', + ), + ), + 53 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03B9', + 'dest' => '"i"', + ), + ), + 54 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03BA', + 'dest' => '"k"', + ), + ), + 55 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03BB', + 'dest' => '"l"', + ), + ), + 56 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03BC', + 'dest' => '"m"', + ), + ), + 57 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03BD', + 'dest' => '"n"', + ), + ), + 58 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03BE', + 'dest' => '"x"', + ), + ), + 59 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03BF', + 'dest' => '"o"', + ), + ), + 60 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C0', + 'dest' => '"p"', + ), + ), + 61 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C1', + 'dest' => '"r"', + ), + ), + 62 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C2', + 'dest' => '"s"', + ), + ), + 63 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C3', + 'dest' => '"s"', + ), + ), + 64 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C4', + 'dest' => '"t"', + ), + ), + 65 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C5', + 'dest' => '"y"', + ), + ), + 66 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C6', + 'dest' => '"ph"', + ), + ), + 67 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C7', + 'dest' => '"ch"', + ), + ), + 68 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C8', + 'dest' => '"ps"', + ), + ), + 69 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03C9', + 'dest' => '"o"', + ), + ), + 70 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CA', + 'dest' => '"i"', + ), + ), + 71 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CB', + 'dest' => '"y"', + ), + ), + 72 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CC', + 'dest' => '"ho"', + ), + ), + 73 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CD', + 'dest' => '"hu"', + ), + ), + 74 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03CE', + 'dest' => '"ho"', + ), + ), + 75 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D0', + 'dest' => '"b"', + ), + ), + 76 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D1', + 'dest' => '"th"', + ), + ), + 77 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D2', + 'dest' => '"Y"', + ), + ), + 78 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D3', + 'dest' => '"Y"', + ), + ), + 79 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D4', + 'dest' => '"Y"', + ), + ), + 80 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D5', + 'dest' => '"phi"', + ), + ), + 81 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D6', + 'dest' => '"pi"', + ), + ), + 82 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D7', + 'dest' => '"&"', + ), + ), + 83 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D8', + 'dest' => '"K"', + ), + ), + 84 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03D9', + 'dest' => '"k"', + ), + ), + 85 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03DA', + 'dest' => '"6"', + ), + ), + 86 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03DB', + 'dest' => '"s"', + ), + ), + 87 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03DC', + 'dest' => '"F"', + ), + ), + 88 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03DD', + 'dest' => '"f"', + ), + ), + 89 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03DE', + 'dest' => '"K"', + ), + ), + 90 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03DF', + 'dest' => '"90"', + ), + ), + 91 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E0', + 'dest' => '"S"', + ), + ), + 92 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E1', + 'dest' => '"900"', + ), + ), + 93 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E2', + 'dest' => '""', + ), + ), + 94 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E3', + 'dest' => '""', + ), + ), + 95 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E4', + 'dest' => '""', + ), + ), + 96 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E5', + 'dest' => '""', + ), + ), + 97 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E6', + 'dest' => '""', + ), + ), + 98 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E7', + 'dest' => '""', + ), + ), + 99 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E8', + 'dest' => '""', + ), + ), + 100 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03E9', + 'dest' => '""', + ), + ), + 101 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03EA', + 'dest' => '""', + ), + ), + 102 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03EB', + 'dest' => '""', + ), + ), + 103 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03EC', + 'dest' => '""', + ), + ), + 104 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03ED', + 'dest' => '""', + ), + ), + 105 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03EE', + 'dest' => '""', + ), + ), + 106 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03EF', + 'dest' => '""', + ), + ), + 107 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F0', + 'dest' => '""', + ), + ), + 108 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F1', + 'dest' => '"r"', + ), + ), + 109 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F2', + 'dest' => '""', + ), + ), + 110 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F3', + 'dest' => '"j"', + ), + ), + 111 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F4', + 'dest' => '""', + ), + ), + 112 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F5', + 'dest' => '"e"', + ), + ), + 113 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F6', + 'dest' => '"e"', + ), + ), + 114 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F7', + 'dest' => '""', + ), + ), + 115 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F8', + 'dest' => '""', + ), + ), + 116 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03F9', + 'dest' => '""', + ), + ), + 117 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03FA', + 'dest' => '""', + ), + ), + 118 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+03FB', + 'dest' => '""', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr new file mode 100644 index 0000000..53975d0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr @@ -0,0 +1,67 @@ +# Rules related to hebrew +# +# The following charsets uses characters from hebrew: +# cp862, iso-8859-8, windows-1255 +# +# See basic.tr for formatting options + +# Transliteration of hebrew, is used in URLs and identifiers + +hebrew_transliterate_ascii: +U+0591 - U+05A1 = "" +U+05A3 - U+05AF = "" + +U+05B0 = "" +U+05B1 = "e" +U+05B2 = "a" +U+05B3 = "o" +U+05B4 = "i" +U+05B5 = "e" +U+05B6 = "e" +U+05B7 = "a" +U+05B8 = "e" +U+05B9 = "o" +U+05BA = "" +U+05BB = "u" +U+05BC = "" +U+05BD = "" +U+05BE = "\'" +U+05BF = "" + +U+05C0 = "|" +U+05C3 = ":" + +U+05D0 = "\'" +U+05D1 = "b" +U+05D2 = "g" +U+05D3 = "d" +U+05D4 = "h" +U+05D5 = "o" +U+05D6 = "z" +U+05D7 = "h" +U+05D8 = "t" +U+05D9 = "y" +U+05DA = "k" +U+05DB = "k" +U+05DC = "l" +U+05DD = "m" +U+05DE = "m" +U+05DF = "n" + +U+05E0 = "n" +U+05E1 = "s" +U+05E2 = "\'" +U+05E3 = "p" +U+05E4 = "p" +U+05E5 = "z" +U+05E6 = "z" +U+05E7 = "q" +U+05E8 = "r" +U+05E9 = "s" +U+05EA = "t" + +U+05F0 = "ww" +U+05F1 = "wy" +U+05F4 = "\"" +U+05F2 = "yy" +U+05F3 = "\'" diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr.result new file mode 100644 index 0000000..7d1b8e2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr.result @@ -0,0 +1,373 @@ +<?php + +return array ( + 'hebrew_transliterate_ascii' => array ( + 0 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+0591', + 'srcEnd' => 'U+05A1', + 'dest' => '""', + ), + ), + 1 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+05A3', + 'srcEnd' => 'U+05AF', + 'dest' => '""', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B0', + 'dest' => '""', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B1', + 'dest' => '"e"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B2', + 'dest' => '"a"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B3', + 'dest' => '"o"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B4', + 'dest' => '"i"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B5', + 'dest' => '"e"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B6', + 'dest' => '"e"', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B7', + 'dest' => '"a"', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B8', + 'dest' => '"e"', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05B9', + 'dest' => '"o"', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05BA', + 'dest' => '""', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05BB', + 'dest' => '"u"', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05BC', + 'dest' => '""', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05BD', + 'dest' => '""', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05BE', + 'dest' => '"\\\'"', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05BF', + 'dest' => '""', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05C0', + 'dest' => '"|"', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05C3', + 'dest' => '":"', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D0', + 'dest' => '"\\\'"', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D1', + 'dest' => '"b"', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D2', + 'dest' => '"g"', + ), + ), + 23 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D3', + 'dest' => '"d"', + ), + ), + 24 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D4', + 'dest' => '"h"', + ), + ), + 25 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D5', + 'dest' => '"o"', + ), + ), + 26 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D6', + 'dest' => '"z"', + ), + ), + 27 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D7', + 'dest' => '"h"', + ), + ), + 28 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D8', + 'dest' => '"t"', + ), + ), + 29 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05D9', + 'dest' => '"y"', + ), + ), + 30 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05DA', + 'dest' => '"k"', + ), + ), + 31 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05DB', + 'dest' => '"k"', + ), + ), + 32 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05DC', + 'dest' => '"l"', + ), + ), + 33 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05DD', + 'dest' => '"m"', + ), + ), + 34 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05DE', + 'dest' => '"m"', + ), + ), + 35 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05DF', + 'dest' => '"n"', + ), + ), + 36 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E0', + 'dest' => '"n"', + ), + ), + 37 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E1', + 'dest' => '"s"', + ), + ), + 38 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E2', + 'dest' => '"\\\'"', + ), + ), + 39 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E3', + 'dest' => '"p"', + ), + ), + 40 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E4', + 'dest' => '"p"', + ), + ), + 41 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E5', + 'dest' => '"z"', + ), + ), + 42 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E6', + 'dest' => '"z"', + ), + ), + 43 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E7', + 'dest' => '"q"', + ), + ), + 44 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E8', + 'dest' => '"r"', + ), + ), + 45 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05E9', + 'dest' => '"s"', + ), + ), + 46 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05EA', + 'dest' => '"t"', + ), + ), + 47 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05F0', + 'dest' => '"ww"', + ), + ), + 48 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05F1', + 'dest' => '"wy"', + ), + ), + 49 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05F4', + 'dest' => '"\\""', + ), + ), + 50 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05F2', + 'dest' => '"yy"', + ), + ), + 51 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+05F3', + 'dest' => '"\\\'"', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr new file mode 100644 index 0000000..ed11e9d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr @@ -0,0 +1,257 @@ +# Rules related to latin (latin1, latin extended-a, latin extended-b) +# Note: ascii.tr covers basic latin which is the same as US-ASCII +# +# The following charsets uses characters from latin: +# iso-8859-1, iso-8859-2, iso-8859-3, iso-8859-4, iso-8859-9, iso-8859-10, +# iso-8859-13, iso-8859-14, iso-8859-15, cp437, cp775, cp850, cp852, cp857, +# cp860, cp861, cp862, cp863, cp865, cp932 +# +# Webpages of interest: +# http://www.cs.tut.fi/~jkorpela/latin1/all.html +# +# See basic.tr for formatting options + +latin1_lowercase: +U+00C0 - U+00D6 + 20 # Lowercase diacritical latin1 characters +U+00D8 - U+00DE + 20 # Lowercase diacritical latin1 characters + +latin1_uppercase: +U+00E0 - U+00F6 - 20 # Lowercase diacritical latin1 characters +U+00F8 - U+00FE - 20 # Lowercase diacritical latin1 characters +U+00DF = "SS" + + +latin-exta_lowercase: +U+0100 - U+012E % 02 + 01 +U+0132 - U+0136 % 02 + 01 +U+0139 - U+0147 % 02 + 01 +U+014A - U+0176 % 02 + 01 +U+0179 - U+017D % 02 + 01 + +latin-exta_uppercase: +U+0101 - U+012F % 02 - 01 +U+0133 - U+0137 % 02 - 01 +U+013A - U+0148 % 02 - 01 +U+014B - U+0177 % 02 - 01 +U+017A - U+017E % 02 - 01 + +latin_lowercase: +# These characters span multiple uncode sets +U+0178 = U+00FF + +latin_uppercase: +# These characters span multiple uncode sets +U+00FF = U+0178 + +latin1_diacritical: +# Remove diacriticals from several latin characters +U+00C0 - U+00C4 = "A" # A +U+00E0 - U+00E4 = "a" # a +U+00C8 - U+00CB = "E" # E +U+00E8 - U+00EB = "e" # e +U+00CC - U+00CF = "I" # I +U+00EC - U+00EF = "i" # i +U+00D2 - U+00D6 = "O" # O +U+00F2 - U+00F6 = "o" # o +U+00D9 - U+00DC = "U" # U +U+00F9 - U+00FC = "u" # u + +U+00DD = "Y" # Y +U+009F = "Y" # Y +U+00FD = "y" # y +U+00FF = "y" # y +U+00C7 = "C" # C +U+00E7 = "c" # c +U+00D0 = "D" # D +U+00F0 = "d" # d +U+00D1 = "N" # N +U+00F1 = "n" # n +U+00DE = "TH" # latin capital letter thorn => TH? (icelandic, runic, old english) +U+00FE = "th" # latin small letter thorn => th? (icelandic, runic, old english) +U+00DF = "ss" # latin small letter sharp s (german) + +latin-exta_diacritical: +U+0100 = "A" +U+0102 = "A" +U+0104 = "A" +U+0101 = "a" +U+0103 = "a" +U+0105 = "a" +U+0106 = "C" +U+0108 = "C" +U+010A = "C" +U+010C = "C" +U+0107 = "c" +U+0109 = "c" +U+010B = "c" +U+010D = "c" +U+010E = "D" +U+0110 = "D" +U+010F = "d" +U+0111 = "d" +U+0112 = "E" +U+0114 = "E" +U+0116 = "E" +U+0118 = "E" +U+011A = "E" +U+0113 = "e" +U+0115 = "e" +U+0117 = "e" +U+0119 = "e" +U+011B = "e" +U+011C = "G" +U+011E = "G" +U+0120 = "G" +U+0122 = "G" +U+011D = "g" +U+011F = "g" +U+0121 = "g" +U+0123 = "g" +U+0124 = "H" +U+0126 = "H" +U+0125 = "h" +U+0127 = "h" +U+0128 = "I" +U+012A = "I" +U+012C = "I" +U+012E = "I" +U+0130 = "I" +U+0129 = "i" +U+012B = "i" +U+012D = "i" +U+012F = "i" +U+0131 = "i" +U+0134 = "J" +U+0135 = "j" +U+0136 = "K" +U+0137 = "k" +U+0139 = "L" +U+013B = "L" +U+013D = "L" +U+013F = "L" +U+0141 = "L" +U+013A = "l" +U+013C = "l" +U+013E = "l" +U+0140 = "l" +U+0142 = "l" +U+0143 = "N" +U+0145 = "N" +U+0147 = "N" +U+0144 = "n" +U+0146 = "n" +U+0148 = "n" +U+014C = "O" +U+014E = "O" +U+0150 = "O" +U+014D = "o" +U+014F = "o" +U+0151 = "o" +U+0154 = "R" +U+0156 = "R" +U+0158 = "R" +U+0155 = "r" +U+0157 = "r" +U+0159 = "r" +U+015A = "S" +U+015C = "S" +U+015E = "S" +U+0160 = "S" +U+015B = "s" +U+015D = "s" +U+015F = "s" +U+0161 = "s" +U+0162 = "T" +U+0164 = "T" +U+0166 = "T" +U+0163 = "t" +U+0165 = "t" +U+0167 = "t" +U+0168 = "U" +U+016A = "U" +U+016C = "U" +U+016E = "U" +U+0170 = "U" +U+0172 = "U" +U+0169 = "u" +U+016B = "u" +U+016D = "u" +U+016F = "u" +U+0171 = "u" +U+0173 = "u" +U+0174 = "W" +U+0175 = "w" +U+0176 = "Y" +U+0177 = "y" +U+0178 = "Y" +U+0179 = "Z" +U+017B = "Z" +U+017D = "Z" +U+017A = "z" +U+017C = "z" +U+017E = "z" + +# Transliteration of latin1, is used in URLs and identifiers +latin1_transliterate_ascii: +# Turn some latin1 characters into ASCII equivalents +U+00E6 = "ae" # => ae +U+00C6 = "AE" # => AE +U+00E5 = "aa" # => aa +U+00C5 = "AA" # => AA +U+00F8 = "oe" # => oe +U+00D8 = "OE" # => OE +U+009C = "oe" # oe ligature +U+008C = "OE" # OE ligature +U+00AA = "a" # feminine ordinal indicator (spanish) +U+00BA = "o" # masculine ordinal indicator (spanish) + +# Some german transliteration rules +U+00E4 = "ae" +U+00F6 = "oe" +U+00FC = "ue" +U+00C4 = "Ae" +U+00D6 = "Oe" +U+00DC = "Ue" + +latin-exta_transliterate_ascii: +U+0132 = "IJ" +U+0133 = "ij" +U+0138 = "k" +U+0149 = "'n" +U+014A = "N" +U+014B = "n" +U+0152 = "AE" +U+0153 = "ae" +U+017F = "s" + +math_to_ascii: +# Turn some special math symbols into ASCII equivalents +U+00D7 = "*" # multiplication sign +U+00F7 = "/" # division sign + +inverted_to_normal: +# Turns inverted characters into their normal counterparts +U+00BF = U+003F # Inverted question mark +U+00A1 = U+0021 # Inverted exclamation + +latin_search_cleanup: +# Map some special characters into spaces, needed for search engine +U+00BC - U+00BE = U+0020 # 1/4, 1/2 and 3/4 +U+00A2 - U+00A7 = U+0020 # Cent, pound, currency, yen, broken sign, section +U+00AC = U+002D # Not sign +U+00AF = U+002D # Macron +U+00B5 = U+0020 # Micron sign +U+00B6 = U+0020 # Pillcrow sign +U+00B7 = U+0020 # Middle dot +U+00B8 = U+0020 # Cedilla +U+00A6 = U+0020 # Broken bar +U+00A7 = U+0020 # Paragraph +U+00A8 = remove # Diaresis +U+00B0 = U+0020 # Degree sign +U+00A9 = U+0020 # Copyright sign +U+00AE = U+0020 # Registered sign + +U+00B4 = U+0020 # Accute accent + +# C1 control characters +U+0080 - U+009F = U+0020 diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr.result new file mode 100644 index 0000000..57b0d9c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr.result @@ -0,0 +1,1510 @@ +<?php + +return array ( + 'latin1_lowercase' => array ( + 0 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+00C0', + 'srcEnd' => 'U+00D6', + 'op' => '+', + 'dest' => '20', + ), + ), + 1 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+00D8', + 'srcEnd' => 'U+00DE', + 'op' => '+', + 'dest' => '20', + ), + ), + ), + 'latin1_uppercase' => array ( + 0 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+00E0', + 'srcEnd' => 'U+00F6', + 'op' => '-', + 'dest' => '20', + ), + ), + 1 => array ( + 'type' => 13, + 'data' => array ( + 'srcStart' => 'U+00F8', + 'srcEnd' => 'U+00FE', + 'op' => '-', + 'dest' => '20', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00DF', + 'dest' => '"SS"', + ), + ), + ), + 'latin-exta_lowercase' => array ( + 0 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0100', + 'srcEnd' => 'U+012E', + 'modulo' => '02', + 'op' => '+', + 'dest' => '01', + ), + ), + 1 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0132', + 'srcEnd' => 'U+0136', + 'modulo' => '02', + 'op' => '+', + 'dest' => '01', + ), + ), + 2 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0139', + 'srcEnd' => 'U+0147', + 'modulo' => '02', + 'op' => '+', + 'dest' => '01', + ), + ), + 3 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+014A', + 'srcEnd' => 'U+0176', + 'modulo' => '02', + 'op' => '+', + 'dest' => '01', + ), + ), + 4 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0179', + 'srcEnd' => 'U+017D', + 'modulo' => '02', + 'op' => '+', + 'dest' => '01', + ), + ), + ), + 'latin-exta_uppercase' => array ( + 0 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0101', + 'srcEnd' => 'U+012F', + 'modulo' => '02', + 'op' => '-', + 'dest' => '01', + ), + ), + 1 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+0133', + 'srcEnd' => 'U+0137', + 'modulo' => '02', + 'op' => '-', + 'dest' => '01', + ), + ), + 2 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+013A', + 'srcEnd' => 'U+0148', + 'modulo' => '02', + 'op' => '-', + 'dest' => '01', + ), + ), + 3 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+014B', + 'srcEnd' => 'U+0177', + 'modulo' => '02', + 'op' => '-', + 'dest' => '01', + ), + ), + 4 => array ( + 'type' => 14, + 'data' => array ( + 'srcStart' => 'U+017A', + 'srcEnd' => 'U+017E', + 'modulo' => '02', + 'op' => '-', + 'dest' => '01', + ), + ), + ), + 'latin_lowercase' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0178', + 'dest' => 'U+00FF', + ), + ), + ), + 'latin_uppercase' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00FF', + 'dest' => 'U+0178', + ), + ), + ), + 'latin1_diacritical' => array ( + 0 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00C0', + 'srcEnd' => 'U+00C4', + 'dest' => '"A"', + ), + ), + 1 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00E0', + 'srcEnd' => 'U+00E4', + 'dest' => '"a"', + ), + ), + 2 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00C8', + 'srcEnd' => 'U+00CB', + 'dest' => '"E"', + ), + ), + 3 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00E8', + 'srcEnd' => 'U+00EB', + 'dest' => '"e"', + ), + ), + 4 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00CC', + 'srcEnd' => 'U+00CF', + 'dest' => '"I"', + ), + ), + 5 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00EC', + 'srcEnd' => 'U+00EF', + 'dest' => '"i"', + ), + ), + 6 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00D2', + 'srcEnd' => 'U+00D6', + 'dest' => '"O"', + ), + ), + 7 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00F2', + 'srcEnd' => 'U+00F6', + 'dest' => '"o"', + ), + ), + 8 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00D9', + 'srcEnd' => 'U+00DC', + 'dest' => '"U"', + ), + ), + 9 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00F9', + 'srcEnd' => 'U+00FC', + 'dest' => '"u"', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00DD', + 'dest' => '"Y"', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+009F', + 'dest' => '"Y"', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00FD', + 'dest' => '"y"', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00FF', + 'dest' => '"y"', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00C7', + 'dest' => '"C"', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00E7', + 'dest' => '"c"', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00D0', + 'dest' => '"D"', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00F0', + 'dest' => '"d"', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00D1', + 'dest' => '"N"', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00F1', + 'dest' => '"n"', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00DE', + 'dest' => '"TH"', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00FE', + 'dest' => '"th"', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00DF', + 'dest' => '"ss"', + ), + ), + ), + 'latin-exta_diacritical' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0100', + 'dest' => '"A"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0102', + 'dest' => '"A"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0104', + 'dest' => '"A"', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0101', + 'dest' => '"a"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0103', + 'dest' => '"a"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0105', + 'dest' => '"a"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0106', + 'dest' => '"C"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0108', + 'dest' => '"C"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+010A', + 'dest' => '"C"', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+010C', + 'dest' => '"C"', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0107', + 'dest' => '"c"', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0109', + 'dest' => '"c"', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+010B', + 'dest' => '"c"', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+010D', + 'dest' => '"c"', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+010E', + 'dest' => '"D"', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0110', + 'dest' => '"D"', + ), + ), + 16 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+010F', + 'dest' => '"d"', + ), + ), + 17 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0111', + 'dest' => '"d"', + ), + ), + 18 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0112', + 'dest' => '"E"', + ), + ), + 19 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0114', + 'dest' => '"E"', + ), + ), + 20 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0116', + 'dest' => '"E"', + ), + ), + 21 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0118', + 'dest' => '"E"', + ), + ), + 22 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+011A', + 'dest' => '"E"', + ), + ), + 23 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0113', + 'dest' => '"e"', + ), + ), + 24 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0115', + 'dest' => '"e"', + ), + ), + 25 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0117', + 'dest' => '"e"', + ), + ), + 26 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0119', + 'dest' => '"e"', + ), + ), + 27 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+011B', + 'dest' => '"e"', + ), + ), + 28 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+011C', + 'dest' => '"G"', + ), + ), + 29 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+011E', + 'dest' => '"G"', + ), + ), + 30 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0120', + 'dest' => '"G"', + ), + ), + 31 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0122', + 'dest' => '"G"', + ), + ), + 32 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+011D', + 'dest' => '"g"', + ), + ), + 33 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+011F', + 'dest' => '"g"', + ), + ), + 34 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0121', + 'dest' => '"g"', + ), + ), + 35 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0123', + 'dest' => '"g"', + ), + ), + 36 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0124', + 'dest' => '"H"', + ), + ), + 37 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0126', + 'dest' => '"H"', + ), + ), + 38 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0125', + 'dest' => '"h"', + ), + ), + 39 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0127', + 'dest' => '"h"', + ), + ), + 40 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0128', + 'dest' => '"I"', + ), + ), + 41 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+012A', + 'dest' => '"I"', + ), + ), + 42 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+012C', + 'dest' => '"I"', + ), + ), + 43 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+012E', + 'dest' => '"I"', + ), + ), + 44 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0130', + 'dest' => '"I"', + ), + ), + 45 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0129', + 'dest' => '"i"', + ), + ), + 46 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+012B', + 'dest' => '"i"', + ), + ), + 47 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+012D', + 'dest' => '"i"', + ), + ), + 48 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+012F', + 'dest' => '"i"', + ), + ), + 49 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0131', + 'dest' => '"i"', + ), + ), + 50 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0134', + 'dest' => '"J"', + ), + ), + 51 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0135', + 'dest' => '"j"', + ), + ), + 52 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0136', + 'dest' => '"K"', + ), + ), + 53 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0137', + 'dest' => '"k"', + ), + ), + 54 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0139', + 'dest' => '"L"', + ), + ), + 55 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+013B', + 'dest' => '"L"', + ), + ), + 56 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+013D', + 'dest' => '"L"', + ), + ), + 57 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+013F', + 'dest' => '"L"', + ), + ), + 58 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0141', + 'dest' => '"L"', + ), + ), + 59 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+013A', + 'dest' => '"l"', + ), + ), + 60 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+013C', + 'dest' => '"l"', + ), + ), + 61 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+013E', + 'dest' => '"l"', + ), + ), + 62 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0140', + 'dest' => '"l"', + ), + ), + 63 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0142', + 'dest' => '"l"', + ), + ), + 64 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0143', + 'dest' => '"N"', + ), + ), + 65 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0145', + 'dest' => '"N"', + ), + ), + 66 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0147', + 'dest' => '"N"', + ), + ), + 67 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0144', + 'dest' => '"n"', + ), + ), + 68 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0146', + 'dest' => '"n"', + ), + ), + 69 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0148', + 'dest' => '"n"', + ), + ), + 70 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+014C', + 'dest' => '"O"', + ), + ), + 71 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+014E', + 'dest' => '"O"', + ), + ), + 72 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0150', + 'dest' => '"O"', + ), + ), + 73 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+014D', + 'dest' => '"o"', + ), + ), + 74 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+014F', + 'dest' => '"o"', + ), + ), + 75 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0151', + 'dest' => '"o"', + ), + ), + 76 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0154', + 'dest' => '"R"', + ), + ), + 77 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0156', + 'dest' => '"R"', + ), + ), + 78 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0158', + 'dest' => '"R"', + ), + ), + 79 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0155', + 'dest' => '"r"', + ), + ), + 80 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0157', + 'dest' => '"r"', + ), + ), + 81 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0159', + 'dest' => '"r"', + ), + ), + 82 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+015A', + 'dest' => '"S"', + ), + ), + 83 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+015C', + 'dest' => '"S"', + ), + ), + 84 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+015E', + 'dest' => '"S"', + ), + ), + 85 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0160', + 'dest' => '"S"', + ), + ), + 86 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+015B', + 'dest' => '"s"', + ), + ), + 87 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+015D', + 'dest' => '"s"', + ), + ), + 88 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+015F', + 'dest' => '"s"', + ), + ), + 89 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0161', + 'dest' => '"s"', + ), + ), + 90 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0162', + 'dest' => '"T"', + ), + ), + 91 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0164', + 'dest' => '"T"', + ), + ), + 92 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0166', + 'dest' => '"T"', + ), + ), + 93 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0163', + 'dest' => '"t"', + ), + ), + 94 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0165', + 'dest' => '"t"', + ), + ), + 95 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0167', + 'dest' => '"t"', + ), + ), + 96 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0168', + 'dest' => '"U"', + ), + ), + 97 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+016A', + 'dest' => '"U"', + ), + ), + 98 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+016C', + 'dest' => '"U"', + ), + ), + 99 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+016E', + 'dest' => '"U"', + ), + ), + 100 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0170', + 'dest' => '"U"', + ), + ), + 101 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0172', + 'dest' => '"U"', + ), + ), + 102 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0169', + 'dest' => '"u"', + ), + ), + 103 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+016B', + 'dest' => '"u"', + ), + ), + 104 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+016D', + 'dest' => '"u"', + ), + ), + 105 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+016F', + 'dest' => '"u"', + ), + ), + 106 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0171', + 'dest' => '"u"', + ), + ), + 107 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0173', + 'dest' => '"u"', + ), + ), + 108 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0174', + 'dest' => '"W"', + ), + ), + 109 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0175', + 'dest' => '"w"', + ), + ), + 110 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0176', + 'dest' => '"Y"', + ), + ), + 111 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0177', + 'dest' => '"y"', + ), + ), + 112 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0178', + 'dest' => '"Y"', + ), + ), + 113 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0179', + 'dest' => '"Z"', + ), + ), + 114 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+017B', + 'dest' => '"Z"', + ), + ), + 115 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+017D', + 'dest' => '"Z"', + ), + ), + 116 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+017A', + 'dest' => '"z"', + ), + ), + 117 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+017C', + 'dest' => '"z"', + ), + ), + 118 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+017E', + 'dest' => '"z"', + ), + ), + ), + 'latin1_transliterate_ascii' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00E6', + 'dest' => '"ae"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00C6', + 'dest' => '"AE"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00E5', + 'dest' => '"aa"', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00C5', + 'dest' => '"AA"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00F8', + 'dest' => '"oe"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00D8', + 'dest' => '"OE"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+009C', + 'dest' => '"oe"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+008C', + 'dest' => '"OE"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AA', + 'dest' => '"a"', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BA', + 'dest' => '"o"', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00E4', + 'dest' => '"ae"', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00F6', + 'dest' => '"oe"', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00FC', + 'dest' => '"ue"', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00C4', + 'dest' => '"Ae"', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00D6', + 'dest' => '"Oe"', + ), + ), + 15 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00DC', + 'dest' => '"Ue"', + ), + ), + ), + 'latin-exta_transliterate_ascii' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0132', + 'dest' => '"IJ"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0133', + 'dest' => '"ij"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0138', + 'dest' => '"k"', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0149', + 'dest' => '"\'n"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+014A', + 'dest' => '"N"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+014B', + 'dest' => '"n"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0152', + 'dest' => '"AE"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0153', + 'dest' => '"ae"', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+017F', + 'dest' => '"s"', + ), + ), + ), + 'math_to_ascii' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00D7', + 'dest' => '"*"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00F7', + 'dest' => '"/"', + ), + ), + ), + 'inverted_to_normal' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BF', + 'dest' => 'U+003F', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A1', + 'dest' => 'U+0021', + ), + ), + ), + 'latin_search_cleanup' => array ( + 0 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00BC', + 'srcEnd' => 'U+00BE', + 'dest' => 'U+0020', + ), + ), + 1 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+00A2', + 'srcEnd' => 'U+00A7', + 'dest' => 'U+0020', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AC', + 'dest' => 'U+002D', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AF', + 'dest' => 'U+002D', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B5', + 'dest' => 'U+0020', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B6', + 'dest' => 'U+0020', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B7', + 'dest' => 'U+0020', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B8', + 'dest' => 'U+0020', + ), + ), + 8 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A6', + 'dest' => 'U+0020', + ), + ), + 9 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A7', + 'dest' => 'U+0020', + ), + ), + 10 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A8', + 'dest' => 'remove', + ), + ), + 11 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B0', + 'dest' => 'U+0020', + ), + ), + 12 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00A9', + 'dest' => 'U+0020', + ), + ), + 13 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AE', + 'dest' => 'U+0020', + ), + ), + 14 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B4', + 'dest' => 'U+0020', + ), + ), + 15 => array ( + 'type' => 12, + 'data' => array ( + 'srcStart' => 'U+0080', + 'srcEnd' => 'U+009F', + 'dest' => 'U+0020', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr new file mode 100644 index 0000000..8736478 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr @@ -0,0 +1,38 @@ +# Search normalization rules +# +# See basic.tr for formatting options +# +# The rest of search handling is done in the various larger alphabet groups +# e.g latin.tr and cyrillic.tr +# They will have rules called <identifier>_search_cleanup + +endline_search_normalize: +# Turns endlines \n, \r and \r\n into a space +U+000A = U+0020 +U+000D = U+0020 + +tab_search_normalize: +# Turns tabs \t into a space +U+0008 = U+0020 + +specialwords_search_normalize: +U+00AA = "a" # feminine ordinal indicator (spanish) +U+00BA = "o" # masculine ordinal indicator (spanish) + +punctuation_normalize: +# Turn some symbols which are considered punctuations marks into +# the ASCII punctuation U+002E +U+0021 = U+002E # exclamation mark ! +U+003F = U+002E # question mark ? +U+002C = U+002E # comma , + +latin_search_decompose: +U+00B1 = "+-" # Plus/minus sign +U+00B2 = "2" # Superscript two +U+00B3 = "3" # Superscript three +U+00B9 = "1" # Superscript one +U+00BA = "1" # Superscript one +U+00BC = "1/4" # Vulgar fraction one quarter +U+00BD = "1/2" # Vulgar fraction one half +U+00BE = "3/4" # Vulgar fraction three quarter + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr.result b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr.result new file mode 100644 index 0000000..ddcdae3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr.result @@ -0,0 +1,127 @@ +<?php + +return array ( + 'endline_search_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+000A', + 'dest' => 'U+0020', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+000D', + 'dest' => 'U+0020', + ), + ), + ), + 'tab_search_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0008', + 'dest' => 'U+0020', + ), + ), + ), + 'specialwords_search_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00AA', + 'dest' => '"a"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BA', + 'dest' => '"o"', + ), + ), + ), + 'punctuation_normalize' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+0021', + 'dest' => 'U+002E', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+003F', + 'dest' => 'U+002E', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+002C', + 'dest' => 'U+002E', + ), + ), + ), + 'latin_search_decompose' => array ( + 0 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B1', + 'dest' => '"+-"', + ), + ), + 1 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B2', + 'dest' => '"2"', + ), + ), + 2 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B3', + 'dest' => '"3"', + ), + ), + 3 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00B9', + 'dest' => '"1"', + ), + ), + 4 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BA', + 'dest' => '"1"', + ), + ), + 5 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BC', + 'dest' => '"1/4"', + ), + ), + 6 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BD', + 'dest' => '"1/2"', + ), + ), + 7 => array ( + 'type' => 11, + 'data' => array ( + 'src' => 'U+00BE', + 'dest' => '"3/4"', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandlerSortTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandlerSortTest.php new file mode 100644 index 0000000..736539e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandlerSortTest.php @@ -0,0 +1,605 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\SearchHandlerSortTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content; + +use eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder; +use eZ\Publish\Core\Persistence\Legacy\Content; +use eZ\Publish\SPI\Persistence\Content as ContentObject; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; +use eZ\Publish\SPI\Persistence\Content\VersionInfo; +use eZ\Publish\SPI\Persistence\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Query; + +/** + * Test case for ContentSearchHandler + */ +class SearchHandlerSortTest extends LanguageAwareTestCase +{ + protected static $setUp = false; + + /** + * Field registry mock + * + * @var \eZ\Publish\SPI\Persistence\Content\FieldValue\ConverterRegistry + */ + protected $fieldRegistry; + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } + + /** + * Only set up once for these read only tests on a large fixture + * + * Skipping the reset-up, since setting up for these tests takes quite some + * time, which is not required to spent, since we are only reading from the + * database anyways. + * + * @return void + */ + public function setUp() + { + if ( !self::$setUp ) + { + parent::setUp(); + $this->insertDatabaseFixture( __DIR__ . '/SearchHandler/_fixtures/full_dump.php' ); + self::$setUp = $this->handler; + } + else + { + $this->handler = self::$setUp; + } + } + + /** + * Returns the content search handler to test + * + * This method returns a fully functional search handler to perform tests + * on. + * + * @param array $fullTextSearchConfiguration + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler + */ + protected function getContentSearchHandler( array $fullTextSearchConfiguration = array() ) + { + $db = $this->getDatabaseHandler(); + return new Content\Search\Handler( + new Content\Search\Gateway\EzcDatabase( + $this->getDatabaseHandler(), + new Content\Search\Gateway\CriteriaConverter( + array( + new Content\Search\Gateway\CriterionHandler\SectionId( $db ), + ) + ), + new Content\Search\Gateway\SortClauseConverter( + array( + new Content\Search\Gateway\SortClauseHandler\LocationPathString( $db ), + new Content\Search\Gateway\SortClauseHandler\LocationDepth( $db ), + new Content\Search\Gateway\SortClauseHandler\LocationPriority( $db ), + new Content\Search\Gateway\SortClauseHandler\DateModified( $db ), + new Content\Search\Gateway\SortClauseHandler\DatePublished( $db ), + new Content\Search\Gateway\SortClauseHandler\SectionIdentifier( $db ), + new Content\Search\Gateway\SortClauseHandler\SectionName( $db ), + new Content\Search\Gateway\SortClauseHandler\ContentName( $db ), + new Content\Search\Gateway\SortClauseHandler\Field( $db ), + ) + ), + new QueryBuilder( $this->getDatabaseHandler() ), + $this->getLanguageHandler(), + $this->getLanguageMaskGenerator() + ), + $this->getContentMapperMock(), + $this->getContentFieldHandlerMock() + ); + } + + /** + * Returns a content mapper mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Mapper + */ + protected function getContentMapperMock() + { + $mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper', + array( 'extractContentFromRows' ), + array( + $this->getFieldRegistry(), + $this->getLanguageHandler() + ) + ); + $mapperMock->expects( $this->any() ) + ->method( 'extractContentFromRows' ) + ->with( $this->isType( 'array' ) ) + ->will( + $this->returnCallback( + function ( $rows ) + { + $contentObjs = array(); + foreach ( $rows as $row ) + { + $contentId = (int)$row['ezcontentobject_id']; + if ( !isset( $contentObjs[$contentId] ) ) + { + $contentObjs[$contentId] = new ContentObject(); + $contentObjs[$contentId]->versionInfo = new VersionInfo; + $contentObjs[$contentId]->versionInfo->contentInfo = new ContentInfo; + $contentObjs[$contentId]->versionInfo->contentInfo->id = $contentId; + } + } + return array_values( $contentObjs ); + } + ) + ); + return $mapperMock; + } + + /** + * Returns a field registry mock object + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + protected function getFieldRegistry() + { + if ( !isset( $this->fieldRegistry ) ) + { + $this->fieldRegistry = $this->getMock( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\ConverterRegistry', + array(), + array( array() ) + ); + } + return $this->fieldRegistry; + } + + /** + * Returns a content field handler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler + */ + protected function getContentFieldHandlerMock() + { + return $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldHandler', + array( 'loadExternalFieldData' ), + array(), + '', + false + ); + } + + public function testNoSorting() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array() + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 42 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortLocationPathString() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( new SortClause\LocationPathString( Query::SORT_DESC ) ) + ) + ) + ); + + $this->assertEquals( + array( 10, 42, 13, 14, 12, 11, 4 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortLocationDepth() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( new SortClause\LocationDepth( Query::SORT_ASC ) ) + ) + ) + ); + + $this->assertEquals( + array( 4, 11, 12, 13, 42, 10, 14 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortLocationDepthAndPathString() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\LocationDepth( Query::SORT_ASC ), + new SortClause\LocationPathString( Query::SORT_DESC ), + ) + ) + ) + ); + + $this->assertEquals( + array( 4, 42, 13, 12, 11, 10, 14 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortLocationPriority() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\LocationPriority( Query::SORT_DESC ), + ) + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 42 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortDateModified() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\DateModified(), + ) + ) + ) + ); + + $this->assertEquals( + array( 4, 12, 13, 42, 10, 14, 11 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortDatePublished() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2 ) ), + 'offset' => 0, + 'limit' => 10, + 'sortClauses' => array( + new SortClause\DatePublished(), + ) + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 42 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortSectionIdentifier() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 4, 2, 6, 3 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\SectionIdentifier(), + ) + ) + ) + ); + + // First, results of section 2 should appear, then the ones of 3, 4 and 6 + // From inside a specific section, no particular order should be defined + // the logic is then to have a set of sorted id's to compare with + // the comparison being done slice by slice. + $idMapSet = array( + 2 => array( 4, 10, 11, 12, 13, 14, 42 ), + 3 => array( 41, 49, 50, 51, 57, 58, 59, 60, 61, 62, 63, 64, 66, 200, 201 ), + 4 => array( 45, 52 ), + 6 => array( 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 ), + ); + $contentIds = array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ); + $index = 0; + + foreach ( $idMapSet as $idSet ) + { + $contentIdsSubset = array_slice( $contentIds, $index, $count = count( $idSet ) ); + $index += $count; + sort( $contentIdsSubset ); + $this->assertEquals( + $idSet, + $contentIdsSubset + ); + } + } + + public function testSortSectionName() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 4, 2, 6, 3 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\SectionName(), + ) + ) + ) + ); + + // First, results of section "Media" should appear, then the ones of "Protected", + // "Setup" and "Users" + // From inside a specific section, no particular order should be defined + // the logic is then to have a set of sorted id's to compare with + // the comparison being done slice by slice. + $idMapSet = array( + "media" => array( 41, 49, 50, 51, 57, 58, 59, 60, 61, 62, 63, 64, 66, 200, 201 ), + "protected" => array( 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164 ), + "setup" => array( 45, 52 ), + "users" => array( 4, 10, 11, 12, 13, 14, 42 ), + ); + $contentIds = array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ); + $index = 0; + + foreach ( $idMapSet as $idSet ) + { + $contentIdsSubset = array_slice( $contentIds, $index, $count = count( $idSet ) ); + $index += $count; + sort( $contentIdsSubset ); + $this->assertEquals( + $idSet, + $contentIdsSubset + ); + } + } + + public function testSortContentName() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 2, 3 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\ContentName(), + ) + ) + ) + ); + + $this->assertEquals( + array( 14, 12, 10, 42, 57, 13, 50, 49, 41, 11, 51, 62, 4, 58, 59, 61, 60, 64, 63, 200, 66, 201 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + public function testSortFieldText() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\Field( "article", "title" ), + ) + ) + ) + ); + + // There are several identical titles, need to take care about this + $idMapSet = array( + "aenean malesuada ligula" => array( 83 ), + "aliquam pulvinar suscipit tellus" => array( 102 ), + "asynchronous publishing" => array( 148, 215 ), + "canonical links" => array( 147, 216 ), + "class aptent taciti" => array( 88 ), + "class aptent taciti sociosqu" => array( 82 ), + "duis auctor vehicula erat" => array( 89 ), + "etiam posuere sodales arcu" => array( 78 ), + "etiam sodales mauris" => array( 87 ), + "ez publish enterprise" => array( 151 ), + "fastcgi" => array( 144, 218 ), + "fusce sagittis sagittis" => array( 77 ), + "fusce sagittis sagittis urna" => array( 81 ), + "get involved" => array( 107 ), + "how to develop with ez publish" => array( 127, 211 ), + "how to manage ez publish" => array( 118, 202 ), + "how to use ez publish" => array( 108, 193 ), + "improved block editing" => array( 136 ), + "improved front-end editing" => array( 139 ), + "improved user registration workflow" => array( 132 ), + "in hac habitasse platea" => array( 79 ), + "lots of websites, one ez publish installation" => array( 130 ), + "rest api interface" => array( 150, 214 ), + "separate content & design in ez publish" => array( 191 ), + "support for red hat enterprise" => array( 145, 217 ), + "tutorials for" => array( 106 ), + ); + $contentIds = array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ); + $index = 0; + + foreach ( $idMapSet as $idSet ) + { + $contentIdsSubset = array_slice( $contentIds, $index, $count = count( $idSet ) ); + $index += $count; + sort( $contentIdsSubset ); + $this->assertEquals( + $idSet, + $contentIdsSubset + ); + } + } + + public function testSortFieldNumeric() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( array( 1 ) ), + 'offset' => 0, + 'limit' => null, + 'sortClauses' => array( + new SortClause\Field( "product", "price" ), + ) + ) + ) + ); + + $this->assertEquals( + array( 73, 71, 72, 69 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandlerTest.php new file mode 100644 index 0000000..cfc55b2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandlerTest.php @@ -0,0 +1,1552 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\SearchHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content; + +use eZ\Publish\Core\Persistence\Legacy\Content\Gateway\EzcDatabase\QueryBuilder; +use eZ\Publish\Core\Persistence\Legacy\Content; +use eZ\Publish\SPI\Persistence\Content as ContentObject; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\SPI\Persistence\Content\VersionInfo; +use eZ\Publish\SPI\Persistence\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry; +use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer; +use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine; + +/** + * Test case for ContentSearchHandler + */ +class SearchHandlerTest extends LanguageAwareTestCase +{ + protected static $setUp = false; + + /** + * Field registry mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + protected $fieldRegistry; + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } + + /** + * Only set up once for these read only tests on a large fixture + * + * Skipping the reset-up, since setting up for these tests takes quite some + * time, which is not required to spent, since we are only reading from the + * database anyways. + * + * @return void + */ + public function setUp() + { + if ( !self::$setUp ) + { + parent::setUp(); + $this->insertDatabaseFixture( __DIR__ . '/SearchHandler/_fixtures/full_dump.php' ); + self::$setUp = $this->handler; + } + else + { + $this->handler = self::$setUp; + } + } + + /** + * Returns the content search handler to test + * + * This method returns a fully functional search handler to perform tests + * on. + * + * @param array $fullTextSearchConfiguration + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler + */ + protected function getContentSearchHandler( array $fullTextSearchConfiguration = array() ) + { + $rules = array(); + foreach ( glob( __DIR__ . '/SearchHandler/_fixtures/transformations/*.tr' ) as $file ) + { + $rules[] = str_replace( self::getInstallationDir(), '', $file ); + } + + return new Content\Search\Handler( + new Content\Search\Gateway\EzcDatabase( + $this->getDatabaseHandler(), + new Content\Search\Gateway\CriteriaConverter( + array( + new Content\Search\Gateway\CriterionHandler\ContentId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\LogicalNot( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\LogicalAnd( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\LogicalOr( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\Subtree( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\ContentTypeId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\ContentTypeGroupId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\DateMetadata( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\LocationId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\ParentLocationId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\RemoteId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\LocationRemoteId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\SectionId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\Status( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\FullText( + $this->getDatabaseHandler(), + new Content\Search\TransformationProcessor\DefinitionBased( + new Content\Search\TransformationProcessor\DefinitionBased\Parser( self::getInstallationDir() ), + new Content\Search\TransformationProcessor\PcreCompiler( + new Content\Search\Utf8Converter() + ), + $rules + ), + $fullTextSearchConfiguration + ), + new Content\Search\Gateway\CriterionHandler\Field( + $this->getDatabaseHandler(), + $this->fieldRegistry = new ConverterRegistry( + array( + 'ezint' => new Integer(), + 'ezstring' => new TextLine(), + 'ezprice' => new Integer() + ) + ) + ), + new Content\Search\Gateway\CriterionHandler\ObjectStateId( + $this->getDatabaseHandler() + ), + new Content\Search\Gateway\CriterionHandler\LanguageCode( + $this->getDatabaseHandler(), + $this->getLanguageMaskGenerator() + ), + new Content\Search\Gateway\CriterionHandler\Visibility( + $this->getDatabaseHandler() + ), + ) + ), + new Content\Search\Gateway\SortClauseConverter(), + new QueryBuilder( $this->getDatabaseHandler() ), + $this->getLanguageHandler(), + $this->getLanguageMaskGenerator() + ), + $this->getContentMapperMock(), + $this->getContentFieldHandlerMock() + ); + } + + /** + * Returns a content mapper mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Mapper + */ + protected function getContentMapperMock() + { + $mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Mapper', + array( 'extractContentFromRows' ), + array( + $this->fieldRegistry, + $this->getLanguageHandler() + ) + ); + $mapperMock->expects( $this->any() ) + ->method( 'extractContentFromRows' ) + ->with( $this->isType( 'array' ) ) + ->will( + $this->returnCallback( + function ( $rows ) + { + $contentObjs = array(); + foreach ( $rows as $row ) + { + $contentId = (int)$row['ezcontentobject_id']; + if ( !isset( $contentObjs[$contentId] ) ) + { + $contentObjs[$contentId] = new ContentObject(); + $contentObjs[$contentId]->versionInfo = new VersionInfo; + $contentObjs[$contentId]->versionInfo->contentInfo = new ContentInfo; + $contentObjs[$contentId]->versionInfo->contentInfo->id = $contentId; + } + } + return array_values( $contentObjs ); + } + ) + ); + return $mapperMock; + } + + /** + * Returns a content field handler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldHandler + */ + protected function getContentFieldHandlerMock() + { + return $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldHandler', + array( 'loadExternalFieldData' ), + array(), + '', + false + ); + } + + /** + * Bug #80 + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase::find + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findContent + */ + public function testFindWithoutOffsetLimit() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( 10 ) + ) + ) + ); + + $this->assertEquals( + 1, + $result->totalCount + ); + } + + /** + * Bug #81, bug #82 + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase::find + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findContent + */ + public function testFindWithZeroLimit() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( 10 ), + 'offset' => 0, + 'limit' => 0, + ) + ) + ); + + $this->assertEquals( + 1, + $result->totalCount + ); + $this->assertEquals( + array(), + $result->searchHits + ); + } + + /** + * Issue with PHP_MAX_INT limit overflow in databases + * + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase::find + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findContent + */ + public function testFindWithNullLimit() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( 10 ), + 'offset' => 0, + 'limit' => null, + ) + ) + ); + + $this->assertEquals( + 1, + $result->totalCount + ); + $this->assertEquals( + 1, + count( $result->searchHits ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase::find + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findContent + */ + public function testFindWithExistingLanguageFields() + { + $this->markTestSkipped( "Translation filters are currently not supported by new search API." ); + + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( 11 ), + 'offset' => 0, + 'limit' => null, + 'translations' => array( 'eng-US' ) + ) + ) + ); + + $this->assertEquals( + 1, + $result->totalCount + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase::find + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findContent + */ + public function testFindWithMissingLanguageFields() + { + $this->markTestSkipped( "Translation filters are currently not supported by new search API." ); + + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( 4 ), + 'offset' => 0, + 'limit' => null, + 'translations' => array( 'eng-GB' ) + ) + ) + ); + + $this->assertEquals( + 0, + $result->totalCount + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findSingle + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriteriaConverter + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler + */ + public function testFindSingle() + { + $locator = $this->getContentSearchHandler(); + + $content = $locator->findSingle( new Criterion\ContentId( 10 ) ); + + $this->assertEquals( 10, $content->versionInfo->contentInfo->id ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findSingle + */ + public function testFindSingleTooMany() + { + $locator = $this->getContentSearchHandler(); + $locator->findSingle( new Criterion\ContentId( array( 4, 10, 12, 23 ) ) ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler::findSingle + */ + public function testFindSingleZero() + { + $locator = $this->getContentSearchHandler(); + $locator->findSingle( new Criterion\ContentId( 0 ) ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ContentId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentIdFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( + array( 1, 4, 10 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ContentId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentIdFilterCount() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentId( + array( 1, 4, 10 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertSame( 2, $result->totalCount ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LogicalAnd + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentAndCombinatorFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LogicalAnd( + array( + new Criterion\ContentId( + array( 1, 4, 10 ) + ), + new Criterion\ContentId( + array( 4, 12 ) + ), + ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LogicalOr + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentOrCombinatorFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LogicalOr( + array( + new Criterion\ContentId( + array( 1, 4, 10 ) + ), + new Criterion\ContentId( + array( 4, 12 ) + ), + ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 12 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LogicalNot + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentNotCombinatorFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LogicalAnd( + array( + new Criterion\ContentId( + array( 1, 4, 10 ) + ), + new Criterion\LogicalNot( + new Criterion\ContentId( + array( 10, 12 ) + ) + ), + ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Subtree + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentSubtreeFilterIn() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Subtree( + array( + '/1/2/69/', + ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 67, 68, 69, 70, 71, 72, 73, 74 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Subtree + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentSubtreeFilterEq() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Subtree( + '/1/2/69/' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 67, 68, 69, 70, 71, 72, 73, 74 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ContentTypeId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentTypeFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentTypeId( + 4 + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 10, 14 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ContentTypeGroupId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testContentTypeGroupFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ContentTypeGroupId( + 2 + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 11, 12, 13, 42, 225, 10, 14 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\DateMetadata + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testDateMetadataFilterModifiedGreater() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::GT, + 1311154214 + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11, 225 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\DateMetadata + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testDateMetadataFilterModifiedGreaterOrEqual() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::GTE, + 1311154214 + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11, 14, 225 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\DateMetadata + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testDateMetadataFilterModifiedIn() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::IN, + array( 1311154214, 1311154215 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11, 14, 225 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\DateMetadata + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testDateMetadataFilterModifiedBetween() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::MODIFIED, + Criterion\Operator::BETWEEN, + array( 1311154213, 1311154215 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11, 14, 225 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\DateMetadata + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testDateMetadataFilterCreatedBetween() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\DateMetadata( + Criterion\DateMetadata::CREATED, + Criterion\Operator::BETWEEN, + array( 1299780749, 1311154215 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 131, 66, 225 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LocationId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testLocationIdFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LocationId( + array( 1, 2, 5 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 65 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ParentLocationId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testParentLocationIdFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ParentLocationId( + array( 1 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 41, 45, 56, 65 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\RemoteId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testRemoteIdFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\RemoteId( + array( 'f5c88a2209584891056f987fd965b0ba', 'faaeb9be3bd98ed09f606fc16d144eca' ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LocationRemoteId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testLocationRemoteIdFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LocationRemoteId( + array( '3f6d92f8044aed134f32153517850f5a', 'f3e90596361e31d496d4026eb624c983' ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 65 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\SectionId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testSectionFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\SectionId( + array( 2 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 42 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Status + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testStatusFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Status( + array( Criterion\Status::STATUS_PUBLISHED ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 41, 42, 45, 49 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Field + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFieldFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Field( + 'name', + Criterion\Operator::EQ, + 'members' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Field + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFieldFilterIn() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Field( + 'name', + Criterion\Operator::IN, + array( 'members', 'anonymous users' ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11, 42 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Field + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFieldFilterBetween() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Field( + 'price', + Criterion\Operator::BETWEEN, + array( 10000, 1000000 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 69, 71, 72 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Field + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LogicalOr + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFieldFilterOr() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LogicalOr( + array( + new Criterion\Field( + 'name', + Criterion\Operator::EQ, + 'members' + ), + new Criterion\Field( + 'price', + Criterion\Operator::BETWEEN, + array( 10000, 1000000 ) + ) + ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 11, 69, 71, 72 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\FullText + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFullTextFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'applied webpage' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 191 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\FullText + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFullTextWildcardFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'applie*' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 191 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\FullText + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFullTextDisabledWildcardFilter() + { + $locator = $this->getContentSearchHandler( + array( + 'enableWildcards' => false, + ) + ); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'applie*' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array(), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\FullText + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFullTextFilterStopwordRemoval() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'the' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array(), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\FullText + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testFullTextFilterNoStopwordRemoval() + { + $locator = $this->getContentSearchHandler( + array( + 'searchThresholdValue' => PHP_INT_MAX + ) + ); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\FullText( + 'the' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + 10, + count( + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ObjectStateId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testObjectStateIdFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ObjectStateId( + 1 + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 41, 42, 45, 49 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\ObjectStateId + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testObjectStateIdFilterIn() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\ObjectStateId( + array( 1, 2 ) + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 41, 42, 45, 49 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LanguageCode + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testLanguageCodeFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LanguageCode( + 'eng-GB' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 41, 42, 45, 49 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\LanguageCode + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testLanguageCodeFilterIn() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\LanguageCode( + 'eng-US', 'eng-GB' + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 41, 42, 45, 49 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\CriterionHandler\Visibility + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Search\Gateway\EzcDatabase + */ + public function testVisibilityFilter() + { + $locator = $this->getContentSearchHandler(); + + $result = $locator->findContent( + new Query( + array( + 'criterion' => new Criterion\Visibility( + Criterion\Visibility::VISIBLE + ), + 'limit' => 10, + ) + ) + ); + + $this->assertEquals( + array( 4, 10, 11, 12, 13, 14, 41, 42, 45, 49 ), + array_map( + function ( $hit ) + { + return $hit->valueObject->versionInfo->contentInfo->id; + }, + $result->searchHits + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Section/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Section/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..625d2da --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Section/Gateway/EzcDatabaseTest.php @@ -0,0 +1,317 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Section\Gateway\EzcDatabaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Section\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase; + +/** + * Test case for eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase. + */ +class EzcDatabaseTest extends TestCase +{ + /** + * Database gateway to test. + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase + */ + protected $databaseGateway; + + /** + * Inserts DB fixture. + * + * @return void + */ + public function setUp() + { + parent::setUp(); + + $this->insertDatabaseFixture( + __DIR__ . '/../../_fixtures/sections.php' + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::__construct + * + * @return void + */ + public function testCtor() + { + $handler = $this->getDatabaseHandler(); + $gateway = $this->getDatabaseGateway(); + + $this->assertAttributeSame( + $handler, + 'dbHandler', + $gateway + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::insertSection + * + * @return void + */ + public function testInsertSection() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->insertSection( 'New Section', 'new_section' ); + $query = $this->getDatabaseHandler()->createSelectQuery(); + + $this->assertQueryResult( + array( + array( + 'id' => '7', + 'identifier' => 'new_section', + 'name' => 'New Section', + 'locale' => '', + ) + ), + $query + ->select( 'id', 'identifier', 'name', 'locale' ) + ->from( 'ezsection' ) + ->where( $query->expr->eq( 'identifier', $query->bindValue( "new_section" ) ) ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::updateSection + * + * @return void + */ + public function testUpdateSection() + { + $gateway = $this->getDatabaseGateway(); + + $gateway->updateSection( 2, 'New Section', 'new_section' ); + + $this->assertQueryResult( + array( + array( + 'id' => '2', + 'identifier' => 'new_section', + 'name' => 'New Section', + 'locale' => '', + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'id', 'identifier', 'name', 'locale' ) + ->from( 'ezsection' ) + ->where( 'id=2' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::loadSectionData + * + * @return void + */ + public function testLoadSectionData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadSectionData( 2 ); + + $this->assertEquals( + array( + array( + 'id' => '2', + 'identifier' => 'users', + 'name' => 'Users', + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::loadAllSectionData + * + * @return void + */ + public function testLoadAllSectionData() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadAllSectionData(); + + $expected = array( + array( + 'id' => '1', + 'identifier' => 'standard', + 'name' => 'Standard', + ), + + array( + 'id' => '2', + 'identifier' => 'users', + 'name' => 'Users', + ), + + array( + 'id' => '3', + 'identifier' => 'media', + 'name' => 'Media', + ), + + array( + 'id' => '4', + 'identifier' => 'setup', + 'name' => 'Setup', + ), + + array( + 'id' => '5', + 'identifier' => 'design', + 'name' => 'Design', + ), + + array( + 'id' => '6', + 'identifier' => '', + 'name' => 'Restricted', + ) + ); + $this->assertEquals( + $expected, + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::loadSectionDataByIdentifier + * + * @return void + */ + public function testLoadSectionDataByIdentifier() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->loadSectionDataByIdentifier( 'users' ); + + $this->assertEquals( + array( + array( + 'id' => '2', + 'identifier' => 'users', + 'name' => 'Users', + ) + ), + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::countContentObjectsInSection + * + * @return void + */ + public function testCountContentObjectsInSection() + { + $this->insertDatabaseFixture( + __DIR__ . '/../../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->countContentObjectsInSection( 2 ); + + $this->assertSame( + 7, + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::deleteSection + * + * @return void + */ + public function testDeleteSection() + { + $gateway = $this->getDatabaseGateway(); + + $result = $gateway->deleteSection( 2 ); + + $this->assertQueryResult( + array( + array( + 'count' => '5' + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * ) AS count' ) + ->from( 'ezsection' ) + ); + + $this->assertQueryResult( + array( + array( + 'count' => '0' + ) + ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * ) AS count' ) + ->from( 'ezsection' ) + ->where( 'id=2' ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase::assignSectionToContent + * @depends testCountContentObjectsInSection + */ + public function testAssignSectionToContent() + { + $this->insertDatabaseFixture( + __DIR__ . '/../../_fixtures/contentobjects.php' + ); + + $gateway = $this->getDatabaseGateway(); + + $beforeCount = $gateway->countContentObjectsInSection( 4 ); + + $result = $gateway->assignSectionToContent( 4, 10 ); + + $this->assertSame( + $beforeCount + 1, + $gateway->countContentObjectsInSection( 4 ) + ); + } + + /** + * Returns a ready to test EzcDatabase gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway\EzcDatabase + */ + protected function getDatabaseGateway() + { + if ( !isset( $this->databaseGateway ) ) + { + $this->databaseGateway = new EzcDatabase( + $this->getDatabaseHandler() + ); + } + return $this->databaseGateway; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Section/SectionHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Section/SectionHandlerTest.php new file mode 100644 index 0000000..784f42b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Section/SectionHandlerTest.php @@ -0,0 +1,336 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Section\SectionHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Section; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\SPI\Persistence\Content\Section; +use eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler; + +/** + * Test case for Section Handler + */ +class SectionHandlerTest extends TestCase +{ + /** + * Section handler + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler + */ + protected $sectionHandler; + + /** + * Section gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway + */ + protected $gatewayMock; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::create + * + * @return void + */ + public function testCreate() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertSection' ) + ->with( + $this->equalTo( 'New Section' ), + $this->equalTo( 'new_section' ) + )->will( $this->returnValue( 23 ) ); + + $sectionRef = new Section(); + $sectionRef->id = 23; + $sectionRef->name = 'New Section'; + $sectionRef->identifier = 'new_section'; + + $result = $handler->create( 'New Section', 'new_section' ); + + $this->assertEquals( + $sectionRef, + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::update + * + * @return void + */ + public function testUpdate() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'updateSection' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 'New Section' ), + $this->equalTo( 'new_section' ) + ); + + $sectionRef = new Section(); + $sectionRef->id = 23; + $sectionRef->name = 'New Section'; + $sectionRef->identifier = 'new_section'; + + $result = $handler->update( 23, 'New Section', 'new_section' ); + + $this->assertEquals( + $sectionRef, + $result + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::createSectionFromArray + */ + public function testLoad() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadSectionData' ) + ->with( + $this->equalTo( 23 ) + )->will( + $this->returnValue( + array( + array( + 'id' => '23', + 'identifier' => 'new_section', + 'name' => 'New Section', + ), + ) + ) + ); + + $sectionRef = new Section(); + $sectionRef->id = 23; + $sectionRef->name = 'New Section'; + $sectionRef->identifier = 'new_section'; + + $result = $handler->load( 23 ); + + $this->assertEquals( + $sectionRef, + $result + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::loadAll + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::createSectionFromArray + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::createSectionsFromArray + */ + public function testLoadAll() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadAllSectionData' ) + ->will( + $this->returnValue( + array( + array( + 'id' => '23', + 'identifier' => 'new_section', + 'name' => 'New Section', + ), + array( + 'id' => '46', + 'identifier' => 'new_section2', + 'name' => 'New Section2', + ), + ) + ) + ); + + $sectionRef = new Section(); + $sectionRef->id = 23; + $sectionRef->name = 'New Section'; + $sectionRef->identifier = 'new_section'; + + $sectionRef2 = new Section(); + $sectionRef2->id = 46; + $sectionRef2->name = 'New Section2'; + $sectionRef2->identifier = 'new_section2'; + + $result = $handler->loadAll(); + + $this->assertEquals( + array( $sectionRef, $sectionRef2 ), + $result + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::loadByIdentifier + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::createSectionFromArray + */ + public function testLoadByIdentifier() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'loadSectionDataByIdentifier' ) + ->with( + $this->equalTo( 'new_section' ) + )->will( + $this->returnValue( + array( + array( + 'id' => '23', + 'identifier' => 'new_section', + 'name' => 'New Section', + ), + ) + ) + ); + + $sectionRef = new Section(); + $sectionRef->id = 23; + $sectionRef->name = 'New Section'; + $sectionRef->identifier = 'new_section'; + + $result = $handler->loadByIdentifier( 'new_section' ); + + $this->assertEquals( + $sectionRef, + $result + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::delete + * + * @return void + */ + public function testDelete() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'countContentObjectsInSection' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( 0 ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'deleteSection' ) + ->with( + $this->equalTo( 23 ) + ); + + $result = $handler->delete( 23 ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::delete + * @expectedException RuntimeException + */ + public function testDeleteFailure() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'countContentObjectsInSection' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( 2 ) ); + + $gatewayMock->expects( $this->never() ) + ->method( 'deleteSection' ); + + $result = $handler->delete( 23 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler::assign + * + * @return void + */ + public function testAssign() + { + $handler = $this->getSectionHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'assignSectionToContent' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 42 ) + ); + + $result = $handler->assign( 23, 42 ); + } + + /** + * Returns the section handler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Section\Handler + */ + protected function getSectionHandler() + { + if ( !isset( $this->sectionHandler ) ) + { + $this->sectionHandler = new Handler( + $this->getGatewayMock() + ); + } + return $this->sectionHandler; + } + + /** + * Returns a mock for the section gateway + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Section\Gateway + */ + protected function getGatewayMock() + { + if ( !isset( $this->gatewayMock ) ) + { + $this->gatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Section\\Gateway' + ); + } + return $this->gatewayMock; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/StorageHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/StorageHandlerTest.php new file mode 100644 index 0000000..fa66285 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/StorageHandlerTest.php @@ -0,0 +1,253 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\StorageHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler; +use eZ\Publish\SPI\Persistence\Content\VersionInfo; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldValue; + +/** + * Test case for Content Handler + */ +class StorageHandlerTest extends TestCase +{ + /** + * StorageRegistry mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry + */ + protected $storageRegistryMock; + + /** + * StorageHandler to test + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected $storageHandler; + + /** + * Mock for external storage + * + * @var \eZ\Publish\SPI\FieldType\FieldStorage + */ + protected $storageMock; + + /** + * Mock for versionInfo + * + * @var \eZ\Publish\Core\Repository\Values\Content\VersionInfo + */ + protected $versionInfoMock; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler::storeFieldData + * + * @return void + */ + public function testStoreFieldData() + { + $storageMock = $this->getStorageMock(); + $storageRegistryMock = $this->getStorageRegistryMock(); + + $storageMock->expects( $this->once() ) + ->method( 'storeFieldData' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ), + $this->equalTo( $this->getContextMock() ) + ); + + $storageRegistryMock->expects( $this->once() ) + ->method( 'getStorage' ) + ->with( $this->equalTo( 'foobar' ) ) + ->will( $this->returnValue( $storageMock ) ); + + $field = new Field(); + $field->type = 'foobar'; + $field->value = new FieldValue(); + + $handler = $this->getStorageHandler(); + $handler->storeFieldData( $this->getVersionInfoMock(), $field ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler::getFieldData + * + * @return void + */ + public function testGetFieldDataAvailable() + { + $storageMock = $this->getStorageMock(); + $storageRegistryMock = $this->getStorageRegistryMock(); + + $storageMock->expects( $this->once() ) + ->method( 'hasFieldData' ) + ->will( $this->returnValue( true ) ); + $storageMock->expects( $this->once() ) + ->method( 'getFieldData' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Field' ), + $this->equalTo( $this->getContextMock() ) + ); + + $storageRegistryMock->expects( $this->once() ) + ->method( 'getStorage' ) + ->with( $this->equalTo( 'foobar' ) ) + ->will( $this->returnValue( $storageMock ) ); + + $field = new Field(); + $field->type = 'foobar'; + $field->value = new FieldValue(); + + $handler = $this->getStorageHandler(); + $handler->getFieldData( $this->getVersionInfoMock(), $field ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler::getFieldData + * + * @return void + */ + public function testGetFieldDataNotAvailable() + { + $storageMock = $this->getStorageMock(); + $storageRegistryMock = $this->getStorageRegistryMock(); + + $storageMock->expects( $this->once() ) + ->method( 'hasFieldData' ) + ->will( $this->returnValue( false ) ); + $storageMock->expects( $this->never() ) + ->method( 'getFieldData' ); + + $storageRegistryMock->expects( $this->once() ) + ->method( 'getStorage' ) + ->with( $this->equalTo( 'foobar' ) ) + ->will( $this->returnValue( $storageMock ) ); + + $field = new Field(); + $field->type = 'foobar'; + $field->value = new FieldValue(); + + $handler = $this->getStorageHandler(); + $handler->getFieldData( $this->getVersionInfoMock(), $field ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler::deleteFieldData + * + * @return void + */ + public function testDeleteFieldData() + { + $storageMock = $this->getStorageMock(); + $storageRegistryMock = $this->getStorageRegistryMock(); + + $storageMock->expects( $this->once() ) + ->method( 'deleteFieldData' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->equalTo( array( 1, 2, 3 ) ), + $this->equalTo( $this->getContextMock() ) + ); + + $storageRegistryMock->expects( $this->once() ) + ->method( 'getStorage' ) + ->with( $this->equalTo( 'foobar' ) ) + ->will( $this->returnValue( $storageMock ) ); + + $handler = $this->getStorageHandler(); + $handler->deleteFieldData( 'foobar', new VersionInfo(), array( 1, 2, 3 ) ); + } + + /** + * Returns the StorageHandler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected function getStorageHandler() + { + if ( !isset( $this->storageHandler ) ) + { + $this->storageHandler = new StorageHandler( + $this->getStorageRegistryMock(), + $this->getContextMock() + ); + } + return $this->storageHandler; + } + + /** + * Returns a context mock + * + * @return array + */ + protected function getContextMock() + { + return array( 23, 42 ); + } + + /** + * Returns a StorageRegistry mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry + */ + protected function getStorageRegistryMock() + { + if ( !isset( $this->storageRegistryMock ) ) + { + $this->storageRegistryMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageRegistry', + array(), + array( array() ) + ); + } + return $this->storageRegistryMock; + } + + /** + * Returns a Storage mock + * + * @return \eZ\Publish\SPI\FieldType\FieldStorage + */ + protected function getStorageMock() + { + if ( !isset( $this->storageMock ) ) + { + $this->storageMock = $this->getMock( + 'eZ\\Publish\\SPI\\FieldType\\FieldStorage' + ); + } + return $this->storageMock; + } + + protected function getVersionInfoMock() + { + if ( !isset( $this->versionInfoMock ) ) + { + $this->versionInfoMock = $this->getMock( + 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' + ); + } + return $this->versionInfoMock; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/StorageRegistryTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/StorageRegistryTest.php new file mode 100644 index 0000000..f0b1f12 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/StorageRegistryTest.php @@ -0,0 +1,92 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\StorageRegistryTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry; + +/** + * Test case for StorageRegistry + */ +class StorageRegistryTest extends TestCase +{ + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry::register + * + * @return void + */ + public function testRegister() + { + $storage = $this->getStorageMock(); + $registry = new StorageRegistry( array( 'some-type' => $storage ) ); + + $this->assertAttributeSame( + array( + 'some-type' => $storage, + ), + 'storageMap', + $registry + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry::getStorage + * + * @return void + */ + public function testGetStorage() + { + $storage = $this->getStorageMock(); + $registry = new StorageRegistry( array( 'some-type' => $storage ) ); + + $res = $registry->getStorage( 'some-type' ); + + $this->assertSame( + $storage, + $res + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry::getStorage + * @covers eZ\Publish\Core\Persistence\Legacy\Exception\StorageNotFound + */ + public function testGetNotFound() + { + $registry = new StorageRegistry( array() ); + self::assertInstanceOf( + 'eZ\\Publish\\Core\\FieldType\\NullStorage', + $registry->getStorage( 'not-found' ) + ); + } + + /** + * Returns a mock for Storage + * + * @return Storage + */ + protected function getStorageMock() + { + return $this->getMock( + 'eZ\\Publish\\SPI\\FieldType\\FieldStorage' + ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentTypeHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentTypeHandlerTest.php new file mode 100644 index 0000000..179d454 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentTypeHandlerTest.php @@ -0,0 +1,1289 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentTypeHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type; + +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\SPI\Persistence\Content\Type\CreateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition; +use eZ\Publish\SPI\Persistence\Content\Type\Group; +use eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct as GroupCreateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct as GroupUpdateStruct; +use eZ\Publish\Core\Persistence\Legacy\Exception; +use eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler; + +/** + * Test case for Content Type Handler. + */ +class ContentTypeHandlerTest extends \PHPUnit_Framework_TestCase +{ + /** + * Gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected $gatewayMock; + + /** + * Mapper mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper + */ + protected $mapperMock; + + /** + * Update\Handler mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler + */ + protected $updateHandlerMock; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::__construct + * + * @return void + */ + public function testCtor() + { + $handler = $this->getHandler(); + + $this->assertAttributeSame( + $this->getGatewayMock(), + 'contentTypeGateway', + $handler + ); + $this->assertAttributeSame( + $this->getMapperMock(), + 'mapper', + $handler + ); + $this->assertAttributeSame( + $this->getUpdateHandlerMock(), + 'updateHandler', + $handler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::createGroup + * + * @return void + */ + public function testCreateGroup() + { + $createStruct = new GroupCreateStruct(); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'createGroupFromCreateStruct' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group\\CreateStruct' + ) + ) + ->will( + $this->returnValue( new Group() ) + ); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'insertGroup' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group' + ) + ) + ->will( $this->returnValue( 23 ) ); + + $handler = $this->getHandler(); + $group = $handler->createGroup( + new GroupCreateStruct() + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', + $group + ); + $this->assertEquals( + 23, + $group->id + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::updateGroup + * + * @return void + */ + public function testUpdateGroup() + { + $updateStruct = new GroupUpdateStruct(); + $updateStruct->id = 23; + + $mapperMock = $this->getMapperMock(); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'updateGroup' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group\\UpdateStruct' + ) + ); + + $handlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Handler', + array( 'loadGroup' ), + array( $gatewayMock, $mapperMock, $this->getUpdateHandlerMock() ) + ); + $handlerMock->expects( $this->once() ) + ->method( 'loadGroup' ) + ->with( + $this->equalTo( 23 ) + )->will( + $this->returnValue( new Group() ) + ); + + $res = $handlerMock->updateGroup( + $updateStruct + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::deleteGroup + * + * @return void + */ + public function testDeleteGroupSuccess() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'countTypesInGroup' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( 0 ) ); + $gatewayMock->expects( $this->once() ) + ->method( 'deleteGroup' ) + ->with( $this->equalTo( 23 ) ); + + $handler = $this->getHandler(); + $handler->deleteGroup( 23 ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::deleteGroup + * @covers eZ\Publish\Core\Persistence\Legacy\Exception\GroupNotEmpty + * @expectedException eZ\Publish\Core\Persistence\Legacy\Exception\GroupNotEmpty + * @expectedExceptionMessage Group with ID "23" is not empty. + */ + public function testDeleteGroupFailure() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'countTypesInGroup' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( 42 ) ); + $gatewayMock->expects( $this->never() ) + ->method( 'deleteGroup' ); + + $handler = $this->getHandler(); + $handler->deleteGroup( 23 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadGroup + * + * @return void + */ + public function testLoadGroup() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadGroupData' ) + ->with( $this->equalTo( 23 ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractGroupsFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Group() ) ) ); + + $handler = $this->getHandler(); + $res = $handler->loadGroup( 23 ); + + $this->assertEquals( + new Group(), + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadGroupByIdentifier + * + * @return void + */ + public function testLoadGroupByIdentifier() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadGroupDataByIdentifier' ) + ->with( $this->equalTo( 'content' ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractGroupsFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Group() ) ) ); + + $handler = $this->getHandler(); + $res = $handler->loadGroupByIdentifier( 'content' ); + + $this->assertEquals( + new Group(), + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadAllGroups + * + * @return void + */ + public function testLoadAllGroups() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadAllGroupsData' ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractGroupsFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Group() ) ) ); + + $handler = $this->getHandler(); + $res = $handler->loadAllGroups(); + + $this->assertEquals( + array( new Group() ), + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadContentTypes + * + * @return void + */ + public function testLoadContentTypes() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadTypesDataForGroup' ) + ->with( $this->equalTo( 23 ), $this->equalTo( 0 ) ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractTypesFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( $this->returnValue( array( new Type() ) ) ); + + $handler = $this->getHandler(); + $res = $handler->loadContentTypes( 23, 0 ); + + $this->assertEquals( + array( new Type() ), + $res + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadFromRows + */ + public function testLoad() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadTypeData' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractTypesFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( + $this->returnValue( + array( new Type() ) + ) + ); + + $handler = $this->getHandler(); + $type = $handler->load( 23, 1 ); + + $this->assertEquals( + new Type(), + $type, + 'Type not loaded correctly' + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadFromRows + * @expectedException \eZ\Publish\Core\Persistence\Legacy\Exception\TypeNotFound + */ + public function testLoadNotFound() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadTypeData' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractTypesFromRows' ) + ->with( $this->equalTo( array() ) ) + ->will( + $this->returnValue( + array() + ) + ); + + $handler = $this->getHandler(); + $type = $handler->load( 23, 1 ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::load + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadFromRows + */ + public function testLoadDefaultVersion() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadTypeData' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractTypesFromRows' ) + ->will( + $this->returnValue( + array( new Type() ) + ) + ); + + $handler = $this->getHandler(); + $type = $handler->load( 23 ); + + $this->assertEquals( + new Type(), + $type, + 'Type not loaded correctly' + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadByIdentifier + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadFromRows + */ + public function testLoadByIdentifier() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadTypeDataByIdentifier' ) + ->with( + $this->equalTo( 'blogentry' ), + $this->equalTo( 0 ) + ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractTypesFromRows' ) + ->will( + $this->returnValue( + array( new Type() ) + ) + ); + + $handler = $this->getHandler(); + $type = $handler->loadByIdentifier( 'blogentry' ); + + $this->assertEquals( + new Type(), + $type, + 'Type not loaded correctly' + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadByRemoteId + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::loadFromRows + */ + public function testLoadByRemoteId() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadTypeDataByRemoteId' ) + ->with( + $this->equalTo( 'someLongHash' ), + $this->equalTo( 0 ) + ) + ->will( $this->returnValue( array() ) ); + + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'extractTypesFromRows' ) + ->will( + $this->returnValue( + array( new Type() ) + ) + ); + + $handler = $this->getHandler(); + $type = $handler->loadByRemoteId( 'someLongHash' ); + + $this->assertEquals( + new Type(), + $type, + 'Type not loaded correctly' + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::create + * + * @return void + */ + public function testCreate() + { + $createStructFix = $this->getContenTypeCreateStructFixture(); + $createStructClone = clone $createStructFix; + + $mapperMock = $this->getMapperMock( + array( + 'toStorageFieldDefinition' + ) + ); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'insertType' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' + ) + ) + ->will( $this->returnValue( 23 ) ); + $gatewayMock->expects( $this->once() ) + ->method( 'insertGroupAssignment' ) + ->with( + $this->equalTo( 42 ), + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ); + $gatewayMock->expects( $this->exactly( 2 ) ) + ->method( 'insertFieldDefinition' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' ), + $this->isInstanceOf( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' ) + ) + ->will( $this->returnValue( 42 ) ); + + $mapperMock->expects( $this->exactly( 2 ) ) + ->method( 'toStorageFieldDefinition' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' ), + $this->isInstanceOf( 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' ) + ); + + $handler = $this->getHandler(); + $type = $handler->create( $createStructFix ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', + $type, + 'Incorrect type returned from create()' + ); + $this->assertEquals( + 23, + $type->id, + 'Incorrect ID for Type.' + ); + + $this->assertEquals( + 42, + $type->fieldDefinitions[0]->id, + 'Field definition ID not set correctly' + ); + $this->assertEquals( + 42, + $type->fieldDefinitions[1]->id, + 'Field definition ID not set correctly' + ); + + $this->assertEquals( + $createStructClone, + $createStructFix, + 'Create struct manipulated' + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::update + * + * @return void + */ + public function testUpdate() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'updateType' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ), + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\UpdateStruct' + ) + ); + + $handlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Handler', + array( 'load' ), + array( $gatewayMock, $this->getMapperMock(), $this->getUpdateHandlerMock() ) + ); + $handlerMock->expects( $this->once() ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ) + ->will( $this->returnValue( new Type() ) ); + + $res = $handlerMock->update( + 23, 1, new UpdateStruct() + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::delete + * + * @return void + */ + public function testDeleteSuccess() + { + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( + $this->once() + )->method( + "loadTypeData" + )->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + )->will( + $this->returnValue( array( 42 ) ) + ); + + $gatewayMock->expects( + $this->once() + )->method( + "countInstancesOfType" + )->with( + $this->equalTo( 23 ) + )->will( + $this->returnValue( 0 ) + ); + + $gatewayMock->expects( + $this->once() + )->method( + "delete" + )->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + ); + + $handler = $this->getHandler(); + $res = $handler->delete( 23, 0 ); + + $this->assertTrue( $res ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::delete + * @expectedException \eZ\Publish\Core\Base\Exceptions\NotFoundException + */ + public function testDeleteThrowsNotFoundException() + { + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( + $this->once() + )->method( + "loadTypeData" + )->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + )->will( + $this->returnValue( array() ) + ); + + $gatewayMock->expects( $this->never() )->method( "delete" ); + + $handler = $this->getHandler(); + $res = $handler->delete( 23, 0 ); + } + + /** + * @return void + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::delete + * @expectedException \eZ\Publish\Core\Base\Exceptions\BadStateException + */ + public function testDeleteThrowsBadStateException() + { + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( + $this->once() + )->method( + "loadTypeData" + )->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + )->will( + $this->returnValue( array( 42 ) ) + ); + + $gatewayMock->expects( + $this->once() + )->method( + "countInstancesOfType" + )->with( + $this->equalTo( 23 ) + )->will( + $this->returnValue( 1 ) + ); + + $gatewayMock->expects( $this->never() )->method( "delete" ); + + $handler = $this->getHandler(); + $res = $handler->delete( 23, 0 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::createDraft + * + * @return void + */ + public function testCreateVersion() + { + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'createCreateStructFromType' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' + ) + )->will( + $this->returnValue( new CreateStruct() ) + ); + + $handlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Handler', + array( 'load', 'internalCreate' ), + array( $gatewayMock, $mapperMock, $this->getUpdateHandlerMock() ) + ); + $handlerMock->expects( $this->once() ) + ->method( 'load' ) + ->with( + $this->equalTo( 23, 0 ) + )->will( + $this->returnValue( + new Type() + ) + ); + $handlerMock->expects( $this->once() ) + ->method( 'internalCreate' ) + ->with( + $this->logicalAnd( + $this->attributeEqualTo( + 'status', 1 + ), + $this->attributeEqualTo( + 'modifierId', 42 + ), + $this->attribute( + $this->greaterThanOrEqual( + time() + ), + 'modified' + ) + ) + )->will( + $this->returnValue( new Type() ) + ); + + $res = $handlerMock->createDraft( + 42, 23 + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::copy + * + * @return void + */ + public function testCopy() + { + $gatewayMock = $this->getGatewayMock(); + $mapperMock = $this->getMapperMock(); + $mapperMock->expects( $this->once() ) + ->method( 'createCreateStructFromType' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' + ) + )->will( + $this->returnValue( new CreateStruct() ) + ); + + $handlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Handler', + array( 'load', 'internalCreate' ), + array( $gatewayMock, $mapperMock, $this->getUpdateHandlerMock() ) + ); + $handlerMock->expects( $this->once() ) + ->method( 'load' ) + ->with( + $this->equalTo( 23, 0 ) + )->will( + $this->returnValue( + new Type() + ) + ); + $handlerMock->expects( $this->once() ) + ->method( 'internalCreate' ) + ->with( + $this->logicalAnd( + $this->attributeEqualTo( + 'modifierId', 42 + ), + $this->attribute( + $this->greaterThanOrEqual( + time() + ), + 'modified' + ), + $this->attributeEqualTo( + 'creatorId', 42 + ), + $this->attribute( + $this->greaterThanOrEqual( + time() + ), + 'created' + ) + ) + )->will( + $this->returnValue( new Type() ) + ); + + $res = $handlerMock->copy( + 42, 23, 0 + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type', + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::link + * + * @return void + */ + public function testLink() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'insertGroupAssignment' ) + ->with( + $this->equalTo( 3 ), + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ); + + $mapperMock = $this->getMapperMock(); + + $handler = $this->getHandler(); + $res = $handler->link( 3, 23, 1 ); + + $this->assertTrue( $res ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::unlink + * + * @return void + */ + public function testUnlinkSuccess() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'countGroupsForType' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ) + )->will( $this->returnValue( 2 ) ); + + $gatewayMock->expects( $this->once() ) + ->method( 'deleteGroupAssignment' ) + ->with( + $this->equalTo( 3 ), + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ); + + $mapperMock = $this->getMapperMock(); + + $handler = $this->getHandler(); + $res = $handler->unlink( 3, 23, 1 ); + + $this->assertTrue( $res ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::unlink + * @covers eZ\Publish\Core\Persistence\Legacy\Exception\RemoveLastGroupFromType + * @expectedException eZ\Publish\Core\Persistence\Legacy\Exception\RemoveLastGroupFromType + * @expectedExceptionMessage Type with ID "23" in status "1" cannot be unlinked from its last group. + */ + public function testUnlinkFailure() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'countGroupsForType' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ) + ) + // Only 1 group assigned + ->will( $this->returnValue( 1 ) ); + + $mapperMock = $this->getMapperMock(); + + $handler = $this->getHandler(); + $res = $handler->unlink( 3, 23, 1 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::getFieldDefinition + * + * @return void + */ + public function testGetFieldDefinition() + { + $mapperMock = $this->getMapperMock( + array( 'extractFieldFromRow' ) + ); + $mapperMock->expects( $this->once() ) + ->method( 'extractFieldFromRow' ) + ->with( + $this->equalTo( array() ) + )->will( + $this->returnValue( new FieldDefinition() ) + ); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'loadFieldDefinition' ) + ->with( + $this->equalTo( 42 ), + $this->equalTo( Type::STATUS_DEFINED ) + )->will( + $this->returnValue( array() ) + ); + + $handler = $this->getHandler(); + $fieldDefinition = $handler->getFieldDefinition( 42, Type::STATUS_DEFINED ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition', + $fieldDefinition + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::addFieldDefinition + * + * @return void + */ + public function testAddFieldDefinition() + { + $mapperMock = $this->getMapperMock( + array( 'toStorageFieldDefinition' ) + ); + $mapperMock->expects( $this->once() ) + ->method( 'toStorageFieldDefinition' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' + ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' + ) + ); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'insertFieldDefinition' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ), + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' + ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' + ) + )->will( + $this->returnValue( 42 ) + ); + + $fieldDef = new FieldDefinition(); + + $handler = $this->getHandler(); + $handler->addFieldDefinition( 23, 1, $fieldDef ); + + $this->assertEquals( + 42, + $fieldDef->id + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::removeFieldDefinition + * + * @return void + */ + public function testRemoveFieldDefinition() + { + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'deleteFieldDefinition' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ), + $this->equalTo( 42 ) + ); + + $handler = $this->getHandler(); + $res = $handler->removeFieldDefinition( 23, 1, 42 ); + + $this->assertTrue( $res ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::updateFieldDefinition + * + * @return void + */ + public function testUpdateFieldDefinition() + { + $mapperMock = $this->getMapperMock( + array( 'toStorageFieldDefinition' ) + ); + $mapperMock->expects( $this->once() ) + ->method( 'toStorageFieldDefinition' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' + ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' + ) + ); + + $gatewayMock = $this->getGatewayMock(); + $gatewayMock->expects( $this->once() ) + ->method( 'updateFieldDefinition' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ), + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' + ) + ); + + $fieldDef = new FieldDefinition(); + + $handler = $this->getHandler(); + $res = $handler->updateFieldDefinition( 23, 1, $fieldDef ); + + $this->assertNull( $res ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::publish + * + * @return void + */ + public function testPublish() + { + $handler = $this->getPartlyMockedHandler( array( 'load' ) ); + $updateHandlerMock = $this->getUpdateHandlerMock(); + + $handler->expects( $this->exactly( 2 ) ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->logicalOr( + $this->equalTo( 0 ), + $this->equalTo( 1 ) + ) + )->will( + $this->returnValue( new Type() ) + ); + + $updateHandlerMock->expects( $this->once() ) + ->method( 'updateContentObjects' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' ) + ); + $updateHandlerMock->expects( $this->once() ) + ->method( 'deleteOldType' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' ) + ); + $updateHandlerMock->expects( $this->once() ) + ->method( 'publishNewType' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' ), + $this->equalTo( 0 ) + ); + + $handler->publish( 23 ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler::publish + * + * @return void + */ + public function testPublishNoOldType() + { + $handler = $this->getPartlyMockedHandler( array( 'load' ) ); + $updateHandlerMock = $this->getUpdateHandlerMock(); + + $handler->expects( $this->at( 0 ) ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 1 ) + )->will( + $this->returnValue( new Type() ) + ); + + $handler->expects( $this->at( 1 ) ) + ->method( 'load' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + )->will( + $this->throwException( new Exception\TypeNotFound( 23, 0 ) ) + ); + + $updateHandlerMock->expects( $this->never() ) + ->method( 'updateContentObjects' ); + $updateHandlerMock->expects( $this->never() ) + ->method( 'deleteOldType' ); + $updateHandlerMock->expects( $this->once() ) + ->method( 'publishNewType' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' ), + $this->equalTo( 0 ) + ); + + $handler->publish( 23 ); + } + + /** + * Returns a handler to test, based on mock objects + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler + */ + protected function getHandler() + { + return new Handler( + $this->getGatewayMock(), + $this->getMapperMock(), + $this->getUpdateHandlerMock() + ); + } + + /** + * Returns a handler to test with $methods mocked + * + * @param array $methods + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Handler + */ + protected function getPartlyMockedHandler( array $methods ) + { + return $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Handler', + $methods, + array( + $this->getGatewayMock(), + $this->getMapperMock(), + $this->getUpdateHandlerMock() + ) + ); + } + + /** + * Returns a gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected function getGatewayMock() + { + if ( !isset( $this->gatewayMock ) ) + { + $this->gatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Gateway' + ); + } + return $this->gatewayMock; + } + + /** + * Returns a mapper mock + * + * @param array $methods + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper + */ + protected function getMapperMock( $methods = array() ) + { + if ( !isset( $this->mapperMock ) ) + { + $this->mapperMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Mapper', + $methods, + array(), + '', + false + ); + } + return $this->mapperMock; + } + + /** + * Returns a Update\Handler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler + */ + public function getUpdateHandlerMock() + { + if ( !isset( $this->updateHandlerMock ) ) + { + $this->updateHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Update\\Handler', + array(), + array(), + '', + false + ); + } + return $this->updateHandlerMock; + } + + /** + * Returns a CreateStruct fixture. + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct + */ + protected function getContenTypeCreateStructFixture() + { + $struct = new CreateStruct(); + $struct->status = 1; + $struct->groupIds = array( + 42, + ); + + $fieldDefName = new FieldDefinition( array( 'position' => 1 ) ); + $fieldDefShortDescription = new FieldDefinition( array( 'position' => 2 ) ); + + $struct->fieldDefinitions = array( + $fieldDefName, + $fieldDefShortDescription + ); + + return $struct; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdater/Action/AddFieldTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdater/Action/AddFieldTest.php new file mode 100644 index 0000000..eee0fa3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdater/Action/AddFieldTest.php @@ -0,0 +1,274 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentUpdater\Action\AddFieldTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentUpdater\Action; + +use eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldValue; + +/** + * Test case for Content Type Updater. + */ +class AddFieldTest extends \PHPUnit_Framework_TestCase +{ + /** + * Content gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected $contentGatewayMock; + + /** + * Content gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected $contentStorageHandlerMock; + + /** + * FieldValue converter mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter + */ + protected $fieldValueConverterMock; + + /** + * AddField action to test + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField + */ + protected $addFieldAction; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater::__construct + * + * @return void + */ + public function testCtor() + { + $action = $this->getAddFieldAction(); + + $this->assertAttributeSame( + $this->getContentGatewayMock(), + 'contentGateway', + $action + ); + $this->assertAttributeEquals( + $this->getFieldDefinitionFixture(), + 'fieldDefinition', + $action + ); + $this->assertAttributeSame( + $this->getFieldValueConverterMock(), + 'fieldValueConverter', + $action + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField::apply + * + * @return void + */ + public function testApply() + { + $action = $this->getAddFieldAction(); + $content = $this->getContentFixture(); + + $this->getFieldValueConverterMock() + ->expects( $this->once() ) + ->method( 'toStorageValue' ) + ->with( $this->equalTo( $this->getFieldReference()->value ) ) + ->will( $this->returnValue( new StorageFieldValue() ) ); + + $this->getContentGatewayMock()->expects( $this->any() )// "any" is workaround for failure, should be once + ->method( 'insertNewField' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content' ), + $this->equalTo( $this->getFieldReference() ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldValue' + ) + )->will( $this->returnValue( 23 ) ); + + $this->getContentStorageHandlerMock()->expects( $this->once() ) + ->method( 'storeFieldData' ); + + $action->apply( $content ); + + $this->assertEquals( + 1, + count( $content->fields ), + 'Field not added to content' + ); + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Field', + $content->fields[0] + ); + $this->assertEquals( + 23, + $content->fields[0]->id + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField::apply + * + * @return void + */ + public function testApplyUnTranslatableField() + { + self::markTestIncomplete( "@todo Test Action/AddField with untranslatable field" ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField::apply + * + * @return void + */ + public function testApplyUpdatingStorageHandler() + { + self::markTestIncomplete( "@todo Test Action/AddField with Storage Handler that returns true" ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField::apply + * + * @return void + */ + public function testApplyUpdatingStorageHandlerUnTranslatableField() + { + self::markTestIncomplete( "@todo Test Action/AddField with Storage Handler that returns true and untranslatable field" ); + } + + /** + * Returns a Content fixture + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + protected function getContentFixture() + { + $content = new Content(); + $content->versionInfo = new Content\VersionInfo(); + $content->fields = array(); + $content->versionInfo->versionNo = 3; + return $content; + } + + /** + * Returns a Content Gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected function getContentGatewayMock() + { + if ( !isset( $this->contentGatewayMock ) ) + { + $this->contentGatewayMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Gateway' + ); + } + return $this->contentGatewayMock; + } + + /** + * Returns a FieldValue converter mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter + */ + protected function getFieldValueConverterMock() + { + if ( !isset( $this->fieldValueConverterMock ) ) + { + $this->fieldValueConverterMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + } + return $this->fieldValueConverterMock; + } + + /** + * Returns a Content StorageHandler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected function getContentStorageHandlerMock() + { + if ( !isset( $this->contentStorageHandlerMock ) ) + { + $this->contentStorageHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageHandler', + array(), + array(), + '', + false + ); + } + return $this->contentStorageHandlerMock; + } + + /** + * Returns a FieldDefinition fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + protected function getFieldDefinitionFixture() + { + $fieldDef = new Content\Type\FieldDefinition(); + $fieldDef->id = 42; + $fieldDef->fieldType = 'ezstring'; + $fieldDef->defaultValue = new Content\FieldValue(); + return $fieldDef; + } + + /** + * Returns a reference Field + * + * @return \eZ\Publish\SPI\Persistence\Content\Field + */ + public function getFieldReference() + { + $field = new Content\Field(); + $field->fieldDefinitionId = 42; + $field->type = 'ezstring'; + $field->value = new Content\FieldValue(); + $field->versionNo = 3; + return $field; + } + + /** + * Returns the AddField action to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\AddField + */ + protected function getAddFieldAction() + { + if ( !isset( $this->addFieldAction ) ) + { + $this->addFieldAction = new AddField( + $this->getContentGatewayMock(), + $this->getFieldDefinitionFixture(), + $this->getFieldValueConverterMock(), + $this->getContentStorageHandlerMock() + ); + } + return $this->addFieldAction; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdater/Action/RemoveFieldTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdater/Action/RemoveFieldTest.php new file mode 100644 index 0000000..51fe6a3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdater/Action/RemoveFieldTest.php @@ -0,0 +1,196 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentUpdater\Action\RemoveFieldTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentUpdater\Action; + +use eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\RemoveField; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Test case for Content Type Updater. + */ +class RemoveFieldTest extends \PHPUnit_Framework_TestCase +{ + /** + * Content gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected $contentGatewayMock; + + /** + * Content gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected $contentStorageHandlerMock; + + /** + * RemoveField action to test + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\RemoveField + */ + protected $removeFieldAction; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater::__construct + * + * @return void + */ + public function testCtor() + { + $action = $this->getRemoveFieldAction(); + + $this->assertAttributeSame( + $this->getContentGatewayMock(), + 'contentGateway', + $action + ); + $this->assertAttributeEquals( + $this->getFieldDefinitionFixture(), + 'fieldDefinition', + $action + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\RemoveField::apply + * + * @return void + */ + public function testApply() + { + $action = $this->getRemoveFieldAction(); + $content = $this->getContentFixture(); + + $this->getContentGatewayMock()->expects( $this->once() ) + ->method( 'deleteField' ) + ->with( + $this->equalTo( 3 ), + $this->equalTo( 13 ) + ); + + $this->getContentStorageHandlerMock()->expects( $this->once() ) + ->method( 'deleteFieldData' ) + ->with( + $this->equalTo( 'ezstring' ), + $this->isInstanceOf( 'eZ\\Publish\\SPI\\Persistence\\Content\\VersionInfo' ), + $this->equalTo( array( 3 ) ) + ); + + $action->apply( $content ); + } + + /** + * Returns a Content fixture + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + protected function getContentFixture() + { + $fieldNoRemove = new Content\Field(); + $fieldNoRemove->id = 2; + $fieldNoRemove->versionNo = 13; + $fieldNoRemove->fieldDefinitionId = 23; + $fieldNoRemove->type = 'ezstring'; + + $fieldRemove = new Content\Field(); + $fieldRemove->id = 3; + $fieldRemove->versionNo = 13; + $fieldRemove->fieldDefinitionId = 42; + $fieldRemove->type = 'ezstring'; + + $content = new Content(); + $content->versionInfo = new Content\VersionInfo(); + $content->fields = array( + $fieldNoRemove, + $fieldRemove + ); + $content->versionInfo->versionNo = 3; + return $content; + } + + /** + * Returns a Content Gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected function getContentGatewayMock() + { + if ( !isset( $this->contentGatewayMock ) ) + { + $this->contentGatewayMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Gateway' + ); + } + return $this->contentGatewayMock; + } + + /** + * Returns a Content StorageHandler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected function getContentStorageHandlerMock() + { + if ( !isset( $this->contentStorageHandlerMock ) ) + { + $this->contentStorageHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageHandler', + array(), + array(), + '', + false + ); + } + return $this->contentStorageHandlerMock; + } + + /** + * Returns a FieldDefinition fixture + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + protected function getFieldDefinitionFixture() + { + $fieldDef = new Content\Type\FieldDefinition(); + $fieldDef->id = 42; + $fieldDef->fieldType = 'ezstring'; + $fieldDef->defaultValue = new Content\FieldValue(); + return $fieldDef; + } + + /** + * Returns the RemoveField action to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater\Action\RemoveField + */ + protected function getRemoveFieldAction() + { + if ( !isset( $this->removeFieldAction ) ) + { + $this->removeFieldAction = new RemoveField( + $this->getContentGatewayMock(), + $this->getFieldDefinitionFixture(), + $this->getContentStorageHandlerMock() + ); + } + return $this->removeFieldAction; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdaterTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdaterTest.php new file mode 100644 index 0000000..2c5d8fc --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/ContentUpdaterTest.php @@ -0,0 +1,336 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentTypeUpdaterTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type; + +use eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeId as CriterionContentTypeId; +use eZ\Publish\API\Repository\Values\Content\Search\SearchResult; +use eZ\Publish\API\Repository\Values\Content\Search\SearchHit; +use eZ\Publish\API\Repository\Values\Content\Query; + +/** + * Test case for Content Type Updater. + */ +class ContentUpdaterTest extends \PHPUnit_Framework_TestCase +{ + /** + * Content gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected $contentGatewayMock; + + /** + * FieldValue converter registry mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + protected $converterRegistryMock; + + /** + * Search handler mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler + */ + protected $searchHandlerMock; + + /** + * Content StorageHandler mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected $contentStorageHandlerMock; + + /** + * Content Updater to test + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater + */ + protected $contentUpdater; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater::__construct + * + * @return void + */ + public function testCtor() + { + $updater = $this->getContentUpdater(); + + $this->assertAttributeSame( + $this->getContentGatewayMock(), + 'contentGateway', + $updater + ); + $this->assertAttributeSame( + $this->getConverterRegistryMock(), + 'converterRegistry', + $updater + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater::determineActions + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater::hasFieldDefinition + */ + public function testDetermineActions() + { + $fromType = $this->getFromTypeFixture(); + $toType = $this->getToTypeFixture(); + + $converterRegMock = $this->getConverterRegistryMock(); + $converterRegMock->expects( $this->once() ) + ->method( 'getConverter' ) + ->with( 'ezstring' ) + ->will( + $this->returnValue( + ( $converterMock = $this->getMock( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ) ) + ) + ); + + $updater = $this->getContentUpdater(); + + $actions = $updater->determineActions( + $fromType, $toType + ); + + $this->assertEquals( + array( + new ContentUpdater\Action\RemoveField( + $this->getContentGatewayMock(), + $fromType->fieldDefinitions[0], + $this->getContentStorageHandlerMock() + ), + new ContentUpdater\Action\AddField( + $this->getContentGatewayMock(), + $toType->fieldDefinitions[2], + $converterMock, + $this->getContentStorageHandlerMock() + ) + ), + $actions + ); + } + + public function testApplyUpdates() + { + $updater = $this->getContentUpdater(); + + $actionA = $this->getMockForAbstractClass( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\ContentUpdater\\Action', + array(), + '', + false + ); + $actionA->expects( $this->exactly( 2 ) ) + ->method( 'apply' ) + ->with( + $this->isInstanceOf( + '\\eZ\\Publish\\SPI\\Persistence\\Content' + ) + ); + $actionB = $this->getMockForAbstractClass( + '\\eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\ContentUpdater\\Action', + array(), + '', + false + ); + $actionB->expects( $this->exactly( 2 ) ) + ->method( 'apply' ) + ->with( + $this->isInstanceOf( + '\\eZ\\Publish\\SPI\\Persistence\\Content' + ) + ); + + $actions = array( $actionA, $actionB ); + + $content = new Content(); + + $result = new SearchResult(); + + $hit = new SearchHit(); + $hit->valueObject = $content; + $result->searchHits[] = $hit; + + $hit = new SearchHit(); + $hit->valueObject = clone $content; + $result->searchHits[] = $hit; + + $this->getSearchHandlerMock() + ->expects( $this->once() ) + ->method( 'findContent' ) + ->with( + $this->equalTo( + new Query( + array( + 'criterion' => new CriterionContentTypeId( 23 ) + ) + ) + ) + )->will( + $this->returnValue( $result ) + ); + + $updater->applyUpdates( 23, $actions ); + } + + /** + * Returns a fixture for the from Type + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + protected function getFromTypeFixture() + { + $type = new Type(); + + $fieldA = new Type\FieldDefinition(); + $fieldA->id = 1; + $fieldA->fieldType = 'ezstring'; + + $fieldB = new Type\FieldDefinition(); + $fieldB->id = 2; + $fieldB->fieldType = 'ezstring'; + + $type->fieldDefinitions = array( + $fieldA, $fieldB + ); + + return $type; + } + + /** + * Returns a fixture for the to Type + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + protected function getToTypeFixture() + { + $type = clone $this->getFromTypeFixture(); + + unset( $type->fieldDefinitions[0] ); + + $fieldC = new Type\FieldDefinition(); + $fieldC->id = 3; + $fieldC->fieldType = 'ezstring'; + + $type->fieldDefinitions[] = $fieldC; + + return $type; + } + + /** + * Returns a Content Gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Gateway + */ + protected function getContentGatewayMock() + { + if ( !isset( $this->contentGatewayMock ) ) + { + $this->contentGatewayMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Gateway' + ); + } + return $this->contentGatewayMock; + } + + /** + * Returns a FieldValue Converter registry mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + protected function getConverterRegistryMock() + { + if ( !isset( $this->converterRegistryMock ) ) + { + $this->converterRegistryMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\ConverterRegistry', + array(), + array( array() ) + ); + } + return $this->converterRegistryMock; + } + + /** + * Returns a Search Handler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Search\Handler + */ + protected function getSearchHandlerMock() + { + if ( !isset( $this->searchHandlerMock ) ) + { + $this->searchHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Search\\Handler', + array(), + array(), + '', + false + ); + } + return $this->searchHandlerMock; + } + + /** + * Returns a Content StorageHandler mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\StorageHandler + */ + protected function getContentStorageHandlerMock() + { + if ( !isset( $this->contentStorageHandlerMock ) ) + { + $this->contentStorageHandlerMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageHandler', + array(), + array(), + '', + false + ); + } + return $this->contentStorageHandlerMock; + } + + /** + * Returns the content updater to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater + */ + protected function getContentUpdater() + { + if ( !isset( $this->contentUpdater ) ) + { + $this->contentUpdater = new ContentUpdater( + $this->getSearchHandlerMock(), + $this->getContentGatewayMock(), + $this->getConverterRegistryMock(), + $this->getContentStorageHandlerMock() + ); + } + return $this->contentUpdater; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..cc8c00b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/EzcDatabaseTest.php @@ -0,0 +1,1355 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\Gateway\EzcDatabaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\Tests\Content\LanguageAwareTestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase; +// For SORT_ORDER_* constants +use eZ\Publish\SPI\Persistence\Content\Location; + +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition; +use eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\Group; +use eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct as GroupUpdateStruct; +use eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition; + +/** + * Test case for eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase. + */ +class EzcDatabaseTest extends LanguageAwareTestCase +{ + /** + * The EzcDatabase gateway to test + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase + */ + protected $gateway; + + public function setUp() + { + parent::setUp(); + + $this->insertDatabaseFixture( __DIR__ . '/_fixtures/languages.php' ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::__construct + * + * @return void + */ + public function testCtor() + { + $handlerMock = $this->getDatabaseHandler(); + $gateway = $this->getGateway(); + + $this->assertAttributeSame( + $handlerMock, + 'dbHandler', + $gateway + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertGroup + * + * @return void + */ + public function testInsertGroup() + { + $gateway = $this->getGateway(); + + $group = $this->getGroupFixture(); + + $id = $gateway->insertGroup( $group ); + + $this->assertQueryResult( + array( + array( + 'id' => '1', + 'created' => '1032009743', + 'creator_id' => '14', + 'modified' => '1033922120', + 'modifier_id' => '14', + 'name' => 'Media', + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + 'id', + 'created', + 'creator_id', + 'modified', + 'modifier_id', + 'name' + ) + ->from( 'ezcontentclassgroup' ) + ); + } + + /** + * Returns a Group fixture. + * + * @return Group + */ + protected function getGroupFixture() + { + $group = new Group(); + + $group->name = array( + 'always-available' => 'eng-GB', + 'eng-GB' => 'Media', + ); + $group->description = array( + 'always-available' => 'eng-GB', + 'eng-GB' => '', + ); + $group->identifier = 'Media'; + $group->created = 1032009743; + $group->modified = 1033922120; + $group->creatorId = 14; + $group->modifierId = 14; + + return $group; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::updateGroup + * + * @return void + */ + public function testUpdateGroup() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_groups.php' + ); + + $gateway = $this->getGateway(); + + $struct = $this->getGroupUpdateStructFixture(); + + $res = $gateway->updateGroup( $struct ); + + $this->assertQueryResult( + array( + array( '3' ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'COUNT(*)' ) + ->from( 'ezcontentclassgroup' ) + ); + + $q = $this->getDatabaseHandler()->createSelectQuery(); + $q + ->select( + 'id', + 'created', + 'creator_id', + 'modified', + 'modifier_id', + 'name' + ) + ->from( 'ezcontentclassgroup' ) + ->orderBy( 'id' ); + $this->assertQueryResult( + array( + array( + 'id' => 1, + 'created' => 1031216928, + 'creator_id' => 14, + 'modified' => 1033922106, + 'modifier_id' => 14, + 'name' => 'Content', + ), + array( + 'id' => 2, + 'created' => 1031216941, + 'creator_id' => 14, + 'modified' => 1311454096, + 'modifier_id' => 23, + 'name' => 'UpdatedGroup', + ), + array( + 'id' => 3, + 'created' => 1032009743, + 'creator_id' => 14, + 'modified' => 1033922120, + 'modifier_id' => 14, + 'name' => 'Media', + ), + ), + $q + ); + } + + /** + * Returns a Group update struct fixture. + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct + */ + protected function getGroupUpdateStructFixture() + { + $struct = new GroupUpdateStruct(); + + $struct->id = 2; + $struct->name = array( + 'always-available' => 'eng-GB', + 'eng-GB' => 'UpdatedGroupName', + ); + $struct->description = array( + 'always-available' => 'eng-GB', + 'eng-GB' => '', + ); + $struct->identifier = 'UpdatedGroup'; + $struct->modified = 1311454096; + $struct->modifierId = 23; + + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::countTypesInGroup + * + * @return void + */ + public function testCountTypesInGroup() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $this->assertEquals( + 3, + $gateway->countTypesInGroup( 1 ) + ); + $this->assertEquals( + 0, + $gateway->countTypesInGroup( 23 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::countGroupsForType + * + * @return void + */ + public function testCountGroupsForType() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $this->assertEquals( + 1, + $gateway->countGroupsForType( 1, 1 ) + ); + $this->assertEquals( + 0, + $gateway->countGroupsForType( 23, 0 ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteGroup + * + * @return void + */ + public function testDeleteGroup() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_groups.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteGroup( 2 ); + + $this->assertQueryResult( + array( + array( '1' ), + array( '3' ), + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'id' ) + ->from( 'ezcontentclassgroup' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadGroupData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::createGroupLoadQuery + * + * @return void + */ + public function testLoadGroupData() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_groups.php' + ); + + $gateway = $this->getGateway(); + $data = $gateway->loadGroupData( 2 ); + + $this->assertEquals( + array( + array( + 'created' => '1031216941', + 'creator_id' => '14', + 'id' => '2', + 'modified' => '1033922113', + 'modifier_id' => '14', + 'name' => 'Users', + ) + ), + $data + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadGroupDataByIdentifier + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::createGroupLoadQuery + * + * @return void + */ + public function testLoadGroupDataByIdentifier() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_groups.php' + ); + + $gateway = $this->getGateway(); + $data = $gateway->loadGroupDataByIdentifier( 'Users' ); + + $this->assertEquals( + array( + array( + 'created' => '1031216941', + 'creator_id' => '14', + 'id' => '2', + 'modified' => '1033922113', + 'modifier_id' => '14', + 'name' => 'Users', + ) + ), + $data + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadAllGroupsData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::createGroupLoadQuery + * + * @return void + */ + public function testLoadAllGroupsData() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_groups.php' + ); + + $gateway = $this->getGateway(); + $data = $gateway->loadAllGroupsData(); + + $this->assertEquals( + 3, + count( $data ) + ); + + $this->assertEquals( + array( + 'created' => '1031216941', + 'creator_id' => '14', + 'id' => '2', + 'modified' => '1033922113', + 'modifier_id' => '14', + 'name' => 'Users', + ), + $data[1] + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadTypesDataForGroup + * + * @return void + */ + public function testLoadTypesDataForGroup() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + $rows = $gateway->loadTypesDataForGroup( 1, 0 ); + + $this->assertEquals( + 6, + count( $rows ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadTypeData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::getLoadTypeQuery + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::selectColumns + */ + public function testLoadTypeData() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + $rows = $gateway->loadTypeData( 1, 0 ); + + $this->assertEquals( + 5, + count( $rows ) + ); + $this->assertEquals( + 45, + count( $rows[0] ) + ); + + /* + * Store mapper fixture + * + file_put_contents( + dirname( __DIR__ ) . '/_fixtures/map_load_type.php', + "<?php\n\nreturn " . var_export( $rows, true ) . ";\n" + ); + */ + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadTypeDataByIdentifier + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::getLoadTypeQuery + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::selectColumns + */ + public function testLoadTypeDataByIdentifier() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + $rows = $gateway->loadTypeDataByIdentifier( 'folder', 0 ); + + $this->assertEquals( + 5, + count( $rows ) + ); + $this->assertEquals( + 45, + count( $rows[0] ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadTypeDataByRemoteId + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::getLoadTypeQuery + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::selectColumns + */ + public function testLoadTypeDataByRemoteId() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + $rows = $gateway->loadTypeDataByRemoteId( 'a3d405b81be900468eb153d774f4f0d2', 0 ); + + $this->assertEquals( + 5, + count( $rows ) + ); + $this->assertEquals( + 45, + count( $rows[0] ) + ); + } + + /** + * Returns the expected data from creating a type. + * + * @return string[][] + */ + public static function getTypeCreationExpectations() + { + return array( + array( 'always_available', 0 ), + array( 'contentobject_name', '<short_name|name>' ), + array( 'created', '1024392098' ), + array( 'creator_id', '14' ), + array( 'identifier', 'folder' ), + array( 'initial_language_id', '2' ), + array( 'is_container', '1' ), + array( 'language_mask', 7 ), + array( 'modified', '1082454875' ), + array( 'modifier_id', '14' ), + array( 'remote_id', 'a3d405b81be900468eb153d774f4f0d2' ), + array( 'serialized_description_list', 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}' ), + array( 'serialized_name_list', 'a:3:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";s:6:"eng-GB";s:11:"Folder (GB)";}' ), + array( 'sort_field', 7 ), + array( 'sort_order', 1 ), + array( 'url_alias_name', '' ), + array( 'version', '0' ), + ); + } + + /** + * @dataProvider getTypeCreationExpectations + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertType + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::setCommonTypeColumns + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertTypeNameData + */ + public function testInsertType( $column, $expectation ) + { + $gateway = $this->getGateway(); + $type = $this->getTypeFixture(); + + $gateway->insertType( $type ); + + $this->assertQueryResult( + array( array( $expectation ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( $column ) + ->from( 'ezcontentclass' ), + 'Inserted Type data incorrect in column ' . $column + ); + } + + /** + * Returns the data expected to be inserted in ezcontentclass_name. + * + * @return string[][] + */ + public static function getTypeCreationContentClassNameExpectations() + { + return array( + array( 'contentclass_id', array( 1, 1 ) ), + array( 'contentclass_version', array( 0, 0 ) ), + array( 'language_id', array( 3, 4 ) ), + array( 'language_locale', array( 'eng-US', 'eng-GB' ) ), + array( 'name', array( 'Folder', 'Folder (GB)' ) ), + ); + } + + /** + * @dataProvider getTypeCreationContentClassNameExpectations + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertType + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::setCommonTypeColumns + */ + public function testInsertTypeContentClassName( $column, $expectation ) + { + $gateway = $this->getGateway(); + $type = $this->getTypeFixture(); + + $gateway->insertType( $type ); + + $this->assertQueryResult( + array_map( + function( $value ) + { + return array( $value ); + }, + $expectation + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( $column ) + ->from( 'ezcontentclass_name' ), + 'Inserted Type data incorrect in column ' . $column + ); + } + + /** + * Returns a Type fixture. + * + * @return Type + */ + protected function getTypeFixture() + { + $type = new Type(); + + $type->status = 0; + $type->name = array( + 'always-available' => 'eng-US', + 'eng-US' => 'Folder', + 'eng-GB' => 'Folder (GB)', + ); + $type->description = array( + 0 => '', + 'always-available' => false, + ); + $type->identifier = 'folder'; + $type->created = 1024392098; + $type->modified = 1082454875; + $type->creatorId = 14; + $type->modifierId = 14; + $type->remoteId = 'a3d405b81be900468eb153d774f4f0d2'; + $type->urlAliasSchema = ''; + $type->nameSchema = '<short_name|name>'; + $type->isContainer = true; + $type->initialLanguageId = 2; + $type->sortField = Location::SORT_FIELD_CLASS_NAME; + $type->sortOrder = Location::SORT_ORDER_ASC; + + return $type; + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertFieldDefinition + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::setCommonFieldColumns + */ + public function testInsertFieldDefinition() + { + $gateway = $this->getGateway(); + + $field = $this->getFieldDefinitionFixture(); + $storageField = $this->getStorageFieldDefinitionFixture(); + + $gateway->insertFieldDefinition( 23, 1, $field, $storageField ); + + $this->assertQueryResult( + array( + array( + 'contentclass_id' => '23', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'serialized_description_list' => 'a:2:{s:16:"always-available";s:6:"eng-GB";s:6:"eng-GB";s:16:"Some description";}', + 'identifier' => 'description', + 'category' => 'meta', + 'placement' => '4', + 'data_type_string' => 'ezxmltext', + 'can_translate' => '1', + 'is_required' => '1', + 'is_information_collector' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'version' => '1', + + 'data_float1' => '0.1', + 'data_float2' => '0.2', + 'data_float3' => '0.3', + 'data_float4' => '0.4', + 'data_int1' => '1', + 'data_int2' => '2', + 'data_int3' => '3', + 'data_int4' => '4', + 'data_text1' => 'a', + 'data_text2' => 'b', + 'data_text3' => 'c', + 'data_text4' => 'd', + 'data_text5' => 'e', + 'serialized_data_text' => 'a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}' + ), + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + 'contentclass_id', + 'serialized_name_list', + 'serialized_description_list', + 'identifier', + 'category', + 'placement', + 'data_type_string', + 'can_translate', + 'is_required', + 'is_information_collector', + 'serialized_data_text', + 'version', + + 'data_float1', + 'data_float2', + 'data_float3', + 'data_float4', + 'data_int1', + 'data_int2', + 'data_int3', + 'data_int4', + 'data_text1', + 'data_text2', + 'data_text3', + 'data_text4', + 'data_text5', + 'serialized_data_text' + ) + ->from( 'ezcontentclass_attribute' ), + 'FieldDefinition not inserted correctly' + ); + } + + /** + * Returns a FieldDefinition fixture. + * + * @return FieldDefinition + */ + protected function getFieldDefinitionFixture() + { + $field = new FieldDefinition(); + + $field->name = array( + 'always-available' => 'eng-US', + 'eng-US' => 'Description', + ); + $field->description = array( + 'always-available' => 'eng-GB', + 'eng-GB' => 'Some description', + ); + $field->identifier = 'description'; + $field->fieldGroup = 'meta'; + $field->position = 4; + $field->fieldType = 'ezxmltext'; + $field->isTranslatable = true; + $field->isRequired = true; + $field->isInfoCollector = true; + // $field->fieldTypeConstraints ??? + $field->defaultValue = array( + 0 => '', + 'always-available' => false, + ); + + return $field; + } + + /** + * Returns a StorageFieldDefinition fixture + * + * @return StorageFieldDefinition + */ + protected function getStorageFieldDefinitionFixture() + { + $fieldDef = new StorageFieldDefinition(); + + $fieldDef->dataFloat1 = 0.1; + $fieldDef->dataFloat2 = 0.2; + $fieldDef->dataFloat3 = 0.3; + $fieldDef->dataFloat4 = 0.4; + + $fieldDef->dataInt1 = 1; + $fieldDef->dataInt2 = 2; + $fieldDef->dataInt3 = 3; + $fieldDef->dataInt4 = 4; + + $fieldDef->dataText1 = 'a'; + $fieldDef->dataText2 = 'b'; + $fieldDef->dataText3 = 'c'; + $fieldDef->dataText4 = 'd'; + $fieldDef->dataText5 = 'e'; + + $fieldDef->serializedDataText = array( + 'foo', 'bar' + ); + + return $fieldDef; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteFieldDefinition + * + * @return void + */ + public function testDeleteFieldDefinition() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteFieldDefinition( 1, 0, 119 ); + + $this->assertQueryResult( + array( array( 6 ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( 'COUNT(*)' ) + ->from( 'ezcontentclass_attribute' ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::updateFieldDefinition + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::setCommonFieldColumns + */ + public function testUpdateFieldDefinition() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + $fieldDefinitionFixture = $this->getFieldDefinitionFixture(); + $fieldDefinitionFixture->id = 160; + $storageFieldDefinitionFixture = $this->getStorageFieldDefinitionFixture(); + + $gateway = $this->getGateway(); + $gateway->updateFieldDefinition( 2, 0, $fieldDefinitionFixture, $storageFieldDefinitionFixture ); + + $this->assertQueryResult( + array( + // "random" sample + array( + 'category' => 'meta', + 'contentclass_id' => '2', + 'version' => '0', + 'data_type_string' => 'ezxmltext', + 'identifier' => 'description', + 'is_information_collector' => '1', + 'placement' => '4', + 'serialized_description_list' => 'a:2:{s:16:"always-available";s:6:"eng-GB";s:6:"eng-GB";s:16:"Some description";}', + + 'data_float1' => '0.1', + 'data_float2' => '0.2', + 'data_float3' => '0.3', + 'data_float4' => '0.4', + 'data_int1' => '1', + 'data_int2' => '2', + 'data_int3' => '3', + 'data_int4' => '4', + 'data_text1' => 'a', + 'data_text2' => 'b', + 'data_text3' => 'c', + 'data_text4' => 'd', + 'data_text5' => 'e', + 'serialized_data_text' => 'a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}' + ), + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + 'category', + 'contentclass_id', + 'version', + 'data_type_string', + 'identifier', + 'is_information_collector', + 'placement', + 'serialized_description_list', + + 'data_float1', + 'data_float2', + 'data_float3', + 'data_float4', + 'data_int1', + 'data_int2', + 'data_int3', + 'data_int4', + 'data_text1', + 'data_text2', + 'data_text3', + 'data_text4', + 'data_text5', + 'serialized_data_text' + ) + ->from( 'ezcontentclass_attribute' ) + ->where( 'id = 160' ), + 'FieldDefinition not updated correctly' + ); + + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertGroupAssignment + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::loadGroupData + */ + public function testInsertGroupAssignment() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_groups.php' + ); + + $gateway = $this->getGateway(); + + $gateway->insertGroupAssignment( 3, 42, 1 ); + + $this->assertQueryResult( + array( + array( + 'contentclass_id' => '42', + 'contentclass_version' => '1', + 'group_id' => '3', + 'group_name' => 'Media', + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + 'contentclass_id', + 'contentclass_version', + 'group_id', + 'group_name' + )->from( 'ezcontentclass_classgroup' ) + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteGroupAssignment + * + * @return void + */ + public function testDeleteGroupAssignment() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteGroupAssignment( 1, 1, 0 ); + + $this->assertQueryResult( + array( array( '1' ) ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + 'COUNT(*)' + )->from( 'ezcontentclass_classgroup' ) + ->where( 'contentclass_id = 1' ) + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::updateType + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::setCommonTypeColumns + * @dataProvider getTypeUpdateExpectations + */ + public function testUpdateType( $fieldName, $expectedValue ) + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $updateStruct = $this->getTypeUpdateFixture(); + + $gateway->updateType( 1, 0, $updateStruct ); + + $this->assertQueryResult( + array( + array( + $fieldName => $expectedValue + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( + $fieldName + )->from( 'ezcontentclass' ) + ->where( 'id = 1 AND version = 0' ), + "Incorrect value stored for '{$fieldName}'." + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteTypeNameData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::insertTypeNameData + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::updateType + */ + public function testUpdateTypeName() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $updateStruct = $this->getTypeUpdateFixture(); + + $gateway->updateType( 1, 0, $updateStruct ); + + $this->assertQueryResult( + array( + array( + 'contentclass_id' => 1, + 'contentclass_version' => 0, + 'language_id' => 3, + 'language_locale' => 'eng-US', + 'name' => 'New Folder' + ), + array( + 'contentclass_id' => 1, + 'contentclass_version' => 0, + 'language_id' => 4, + 'language_locale' => 'eng-GB', + 'name' => 'New Folder for you' + ) + ), + $this->getDatabaseHandler() + ->createSelectQuery() + ->select( '*' ) + ->from( 'ezcontentclass_name' ) + ->where( 'contentclass_id = 1 AND contentclass_version = 0' ) + ); + } + + /** + * Returns expected data after update + * + * Data provider for {@link testUpdateType()}. + * + * @return string[][] + */ + public static function getTypeUpdateExpectations() + { + return array( + array( 'serialized_name_list', 'a:3:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"New Folder";s:6:"eng-GB";s:18:"New Folder for you";}' ), + array( 'serialized_description_list', 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}' ), + array( 'identifier', 'new_folder' ), + array( 'modified', '1311621548' ), + array( 'modifier_id', '42' ), + array( 'remote_id', 'foobar' ), + array( 'url_alias_name', 'some scheke' ), + array( 'contentobject_name', '<short_name>' ), + array( 'is_container', '0' ), + array( 'initial_language_id', '23' ), + array( 'sort_field', '3' ), + array( 'sort_order', '0' ), + array( 'always_available', '1' ), + ); + } + + /** + * Returns a eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct fixture. + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct + */ + protected function getTypeUpdateFixture() + { + $struct = new UpdateStruct(); + + $struct->name = array( + 'always-available' => 'eng-US', + 'eng-US' => 'New Folder', + 'eng-GB' => 'New Folder for you', + ); + $struct->description = array( + 0 => '', + 'always-available' => false, + ); + $struct->identifier = 'new_folder'; + $struct->modified = 1311621548; + $struct->modifierId = 42; + $struct->remoteId = 'foobar'; + $struct->urlAliasSchema = 'some scheke'; + $struct->nameSchema = '<short_name>'; + $struct->isContainer = false; + $struct->initialLanguageId = 23; + $struct->sortField = 3; + $struct->sortOrder = Location::SORT_ORDER_DESC; + $struct->defaultAlwaysAvailable = true; + + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::countInstancesOfType + * + * @return void + */ + public function testCountInstancesOfTypeExist() + { + $this->insertDatabaseFixture( + // Fixture for content objects + __DIR__ . '/../../_fixtures/contentobjects.php' + ); + + $gateway = $this->getGateway(); + $res = $gateway->countInstancesOfType( 3, 0 ); + + $this->assertEquals( + 6, + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::countInstancesOfType + * + * @return void + */ + public function testCountInstancesOfTypeNotExist() + { + $this->insertDatabaseFixture( + // Fixture for content objects + __DIR__ . '/../../_fixtures/contentobjects.php' + ); + + $gateway = $this->getGateway(); + $res = $gateway->countInstancesOfType( 23422342, 1 ); + + $this->assertEquals( + 0, + $res + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteFieldDefinitionsForType + * + * @return void + */ + public function testDeleteFieldDefinitionsForTypeExisting() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteFieldDefinitionsForType( 1, 0 ); + + $countAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countAffectedAttr + ->select( 'COUNT(*)' ) + ->from( 'ezcontentclass_attribute' ) + ->where( + $countAffectedAttr->expr->eq( + 'contentclass_id', + 1 + ) + ); + // 1 left with version 1 + $this->assertQueryResult( + array( array( 1 ) ), + $countAffectedAttr + ); + + $countNotAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countNotAffectedAttr->select( 'COUNT(*)' ) + ->from( 'ezcontentclass_attribute' ); + + $this->assertQueryResult( + array( array( 2 ) ), + $countNotAffectedAttr + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteFieldDefinitionsForType + * + * @return void + */ + public function testDeleteFieldDefinitionsForTypeNotExisting() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteFieldDefinitionsForType( 23, 1 ); + + $countNotAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countNotAffectedAttr->select( 'COUNT(*)' ) + ->from( 'ezcontentclass_attribute' ); + + $this->assertQueryResult( + array( array( 7 ) ), + $countNotAffectedAttr + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteGroupAssignmentsForType + * + * @return void + */ + public function testDeleteGroupAssignmentsForTypeExisting() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteGroupAssignmentsForType( 1, 0 ); + + $countAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countAffectedAttr->select( 'COUNT(*)' ) + ->from( 'ezcontentclass_classgroup' ); + + $this->assertQueryResult( + array( array( 2 ) ), + $countAffectedAttr + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteGroupAssignmentsForType + * + * @return void + */ + public function testDeleteGroupAssignmentsForTypeNotExisting() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteType( 23, 1 ); + + $countAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countAffectedAttr->select( 'COUNT(*)' ) + ->from( 'ezcontentclass_classgroup' ); + + $this->assertQueryResult( + array( array( 3 ) ), + $countAffectedAttr + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteType + * + * @return void + */ + public function testDeleteTypeExisting() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteType( 1, 0 ); + + $countAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countAffectedAttr->select( 'COUNT(*)' ) + ->from( 'ezcontentclass' ); + + $this->assertQueryResult( + array( array( 1 ) ), + $countAffectedAttr + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::deleteType + * + * @return void + */ + public function testDeleteTypeNotExisting() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/existing_types.php' + ); + + $gateway = $this->getGateway(); + + $gateway->deleteType( 23, 1 ); + + $countAffectedAttr = $this->getDatabaseHandler() + ->createSelectQuery(); + $countAffectedAttr->select( 'COUNT(*)' ) + ->from( 'ezcontentclass' ); + + $this->assertQueryResult( + array( array( 2 ) ), + $countAffectedAttr + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase::publishTypeAndFields + * + * @return void + */ + public function testPublishTypeAndFields() + { + $this->insertDatabaseFixture( + __DIR__ . '/_fixtures/type_to_publish.php' + ); + + $gateway = $this->getGateway(); + $gateway->publishTypeAndFields( 1, 1, 0 ); + + $this->assertQueryResult( + array( array( 1 ) ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * )' ) + ->from( 'ezcontentclass' ) + ->where( 'id = 1 AND version = 0' ) + ); + + $this->assertQueryResult( + array( array( 2 ) ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * )' ) + ->from( 'ezcontentclass_classgroup' ) + ->where( 'contentclass_id = 1 AND contentclass_version = 0' ) + ); + + $this->assertQueryResult( + array( array( 5 ) ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * )' ) + ->from( 'ezcontentclass_attribute' ) + ->where( 'contentclass_id = 1 AND version = 0' ) + ); + + $this->assertQueryResult( + array( array( 1 ) ), + $this->getDatabaseHandler()->createSelectQuery() + ->select( 'COUNT( * )' ) + ->from( 'ezcontentclass_name' ) + ->where( 'contentclass_id = 1 AND contentclass_version = 0' ) + ); + } + + /** + * Returns the EzcDatabase gateway to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway\EzcDatabase + */ + protected function getGateway() + { + if ( !isset( $this->gateway ) ) + { + $this->gateway = new EzcDatabase( + $this->getDatabaseHandler(), + $this->getLanguageMaskGenerator() + ); + } + return $this->gateway; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/existing_groups.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/existing_groups.php new file mode 100644 index 0000000..00e1f8b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/existing_groups.php @@ -0,0 +1,30 @@ +<?php + +return array( + 'ezcontentclassgroup' => array( + array( + 'created' => 1031216928, + 'creator_id' => 14, + 'id' => 1, + 'modified' => 1033922106, + 'modifier_id' => 14, + 'name' => 'Content', + ), + array( + 'created' => 1031216941, + 'creator_id' => 14, + 'id' => 2, + 'modified' => 1033922113, + 'modifier_id' => 14, + 'name' => 'Users', + ), + array( + 'created' => 1032009743, + 'creator_id' => 14, + 'id' => 3, + 'modified' => 1033922120, + 'modifier_id' => 14, + 'name' => 'Media', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/existing_types.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/existing_types.php new file mode 100644 index 0000000..281ded9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/existing_types.php @@ -0,0 +1,289 @@ +<?php + +return array( + 'ezcontentclass' => array( + // loaded + array( + 'id' => 1, + 'always_available' => 1, + 'contentobject_name' => '<short_name|name>', + 'created' => 1024392098, + 'creator_id' => 14, + 'identifier' => 'folder', + 'initial_language_id' => 2, + 'is_container' => 1, + 'language_mask' => 3, + 'modified' => 1082454875, + 'modifier_id' => 14, + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => 1, + 'sort_order' => 1, + 'url_alias_name' => '', + 'version' => 0 + ), + // not loaded, id mismatch + array( + 'id' => 2, + 'always_available' => 1, + 'contentobject_name' => '<short_name|name>', + 'created' => 1024392098, + 'creator_id' => 14, + 'identifier' => 'folder_3', + 'initial_language_id' => 2, + 'is_container' => 1, + 'language_mask' => 3, + 'modified' => 1082454875, + 'modifier_id' => 14, + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d3', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => 1, + 'sort_order' => 1, + 'url_alias_name' => '', + 'version' => 0 + ), + ), + 'ezcontentclass_attribute' => array( + // loaded + array( + 'id' => 4, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 255, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => 'Folder', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'identifier' => 'name', + 'is_information_collector' => 0, + 'is_required' => 1, + 'is_searchable' => 1, + 'placement' => 1, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => 0 + ), + array( + 'id' => 119, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 5, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'identifier' => 'short_description', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 1, + 'placement' => 3, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Short description";}', + 'version' => 0 + ), + array( + 'id' => 155, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 100, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'identifier' => 'short_name', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 1, + 'placement' => 2, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Short name";}', + 'version' => 0 + ), + array( + 'id' => 156, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 20, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'identifier' => 'description', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 1, + 'placement' => 4, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => 0 + ), + array( + 'id' => 158, + 'contentclass_id' => 1, + 'can_translate' => 0, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 0, + 'data_int2' => 0, + 'data_int3' => 1, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'identifier' => 'show_children', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 0, + 'placement' => 5, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Show children";}', + 'version' => 0 + ), + // not loaded, version mismatch + array( + 'id' => 159, + 'contentclass_id' => 1, + 'can_translate' => 0, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 0, + 'data_int2' => 0, + 'data_int3' => 1, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'identifier' => 'show_children', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 0, + 'placement' => 5, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Show children";}', + 'version' => 1 + ), + // not loaded, contentclass_id mismatch + array( + 'id' => 160, + 'contentclass_id' => 2, + 'can_translate' => 0, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 0, + 'data_int2' => 0, + 'data_int3' => 1, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'identifier' => 'show_children', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 0, + 'placement' => 5, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Show children";}', + 'version' => 0 + ), + ), + 'ezcontentclass_classgroup' => array( + // loaded + array( + 'contentclass_id' => 1, + 'contentclass_version' => 0, + 'group_id' => 1, + 'group_name' => 'Content' + ), + // not loaded, version mismatch + array( + 'contentclass_id' => 1, + 'contentclass_version' => 1, + 'group_id' => 1, + 'group_name' => 'Content' + ), + // not loaded, id mismatch + array( + 'contentclass_id' => 2, + 'contentclass_version' => 0, + 'group_id' => 1, + 'group_name' => 'Content' + ), + ), + 'ezcontentclass_name' => array( + array( + 'contentclass_id' => 1, + 'contentclass_version' => 0, + 'language_id' => 3, + 'language_locale' => 'eng-US', + 'name' => 'Folder' + ) + ), + 'ezcontent_language' => array() +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/languages.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/languages.php new file mode 100644 index 0000000..a358198 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/languages.php @@ -0,0 +1,22 @@ +<?php + +return array ( + 'ezcontent_language' => + array ( + 0 => + array ( + 'disabled' => '0', + 'id' => '2', + 'locale' => 'eng-US', + 'name' => 'English (American)', + ), + 1 => + array ( + 'disabled' => '0', + 'id' => '4', + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)', + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/type_to_publish.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/type_to_publish.php new file mode 100644 index 0000000..05d1ed3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Gateway/_fixtures/type_to_publish.php @@ -0,0 +1,245 @@ +<?php + +return array( + 'ezcontentclass' => array( + array( + 'id' => 1, + 'always_available' => 1, + 'contentobject_name' => '<short_name|name>', + 'created' => 1024392098, + 'creator_id' => 14, + 'identifier' => 'folder', + 'initial_language_id' => 2, + 'is_container' => 1, + 'language_mask' => 3, + 'modified' => 1082454875, + 'modifier_id' => 14, + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => 1, + 'sort_order' => 1, + 'url_alias_name' => '', + 'version' => 1 + ), + array( + 'id' => 2, + 'always_available' => 1, + 'contentobject_name' => '<short_name|name>', + 'created' => 1024392098, + 'creator_id' => 14, + 'identifier' => 'folder_3', + 'initial_language_id' => 2, + 'is_container' => 1, + 'language_mask' => 3, + 'modified' => 1082454875, + 'modifier_id' => 14, + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => 1, + 'sort_order' => 1, + 'url_alias_name' => '', + 'version' => 0 + ), + ), + 'ezcontentclass_attribute' => array( + array( + 'id' => 4, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 255, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => 'Folder', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'identifier' => 'name', + 'is_information_collector' => 0, + 'is_required' => 1, + 'is_searchable' => 1, + 'placement' => 1, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => 1 + ), + array( + 'id' => 119, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 5, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'identifier' => 'short_description', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 1, + 'placement' => 3, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Short description";}', + 'version' => 1 + ), + array( + 'id' => 155, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 100, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'identifier' => 'short_name', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 1, + 'placement' => 2, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Short name";}', + 'version' => 1 + ), + array( + 'id' => 156, + 'contentclass_id' => 1, + 'can_translate' => 1, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 20, + 'data_int2' => 0, + 'data_int3' => 0, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'identifier' => 'description', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 1, + 'placement' => 4, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => 1 + ), + array( + 'id' => 158, + 'contentclass_id' => 1, + 'can_translate' => 0, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 0, + 'data_int2' => 0, + 'data_int3' => 1, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'identifier' => 'show_children', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 0, + 'placement' => 5, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Show children";}', + 'version' => 1 + ), + array( + 'id' => 160, + 'contentclass_id' => 2, + 'can_translate' => 0, + 'category' => '', + 'data_float1' => 0, + 'data_float2' => 0, + 'data_float3' => 0, + 'data_float4' => 0, + 'data_int1' => 0, + 'data_int2' => 0, + 'data_int3' => 1, + 'data_int4' => 0, + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'identifier' => 'show_children', + 'is_information_collector' => 0, + 'is_required' => 0, + 'is_searchable' => 0, + 'placement' => 5, + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Show children";}', + 'version' => 0 + ), + ), + 'ezcontentclass_name' => array( + array( + 'contentclass_id' => 1, + 'contentclass_version' => 1, + 'language_id' => 3, + 'language_locale' => 'eng-US', + 'name' => 'Folder' + ) + ), + 'ezcontentclass_classgroup' => array( + array( + 'contentclass_id' => 1, + 'contentclass_version' => 1, + 'group_id' => 1, + 'group_name' => 'Content' + ), + array( + 'contentclass_id' => 1, + 'contentclass_version' => 1, + 'group_id' => 4, + 'group_name' => 'Setup' + ) + ) +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/MapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/MapperTest.php new file mode 100644 index 0000000..feb0b31 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/MapperTest.php @@ -0,0 +1,448 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\MapperTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper; +use eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition; +use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry; +// Needed for $sortOrder and $sortField properties +use eZ\Publish\SPI\Persistence\Content\Location; + +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\SPI\Persistence\Content\Type\CreateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition; + +use eZ\Publish\SPI\Persistence\Content\Type\Group; +use eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct as GroupCreateStruct; + +/** + * Test case for Mapper. + */ +class MapperTest extends TestCase +{ + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::createGroupFromCreateStruct + * + * @return void + */ + public function testCreateGroupFromCreateStruct() + { + $createStruct = $this->getGroupCreateStructFixture(); + + $mapper = new Mapper( $this->getConverterRegistryMock() ); + + $group = $mapper->createGroupFromCreateStruct( $createStruct ); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Group', + $group + ); + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'name' => array( + 'eng-GB' => 'Media', + ), + 'description' => array(), + 'identifier' => 'Media', + 'created' => 1032009743, + 'modified' => 1033922120, + 'creatorId' => 14, + 'modifierId' => 14, + ), + $group + ); + } + + /** + * Returns a GroupCreateStruct fixture. + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct + */ + protected function getGroupCreateStructFixture() + { + $struct = new GroupCreateStruct(); + + $struct->name = array( + 'eng-GB' => 'Media', + ); + $struct->description = array(); + $struct->identifier = 'Media'; + $struct->created = 1032009743; + $struct->modified = 1033922120; + $struct->creatorId = 14; + $struct->modifierId = 14; + + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::createTypeFromCreateStruct + * + * @return void + */ + public function testTypeFromCreateStruct() + { + $struct = $this->getContentTypeCreateStructFixture(); + + $mapper = new Mapper( $this->getConverterRegistryMock() ); + $type = $mapper->createTypeFromCreateStruct( $struct ); + + foreach ( $struct as $propName => $propVal ) + { + $this->assertEquals( + $struct->$propName, + $type->$propName, + "Property \${$propName} not equal" + ); + } + } + + /** + * Returns a CreateStruct fixture. + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct + */ + protected function getContentTypeCreateStructFixture() + { + // Taken from example DB + $struct = new CreateStruct(); + $struct->name = array( + 'eng-US' => 'Folder', + ); + $struct->status = 0; + $struct->description = array(); + $struct->identifier = 'folder'; + $struct->created = 1024392098; + $struct->modified = 1082454875; + $struct->creatorId = 14; + $struct->modifierId = 14; + $struct->remoteId = 'a3d405b81be900468eb153d774f4f0d2'; + $struct->urlAliasSchema = ''; + $struct->nameSchema = '<short_name|name>'; + $struct->isContainer = true; + $struct->initialLanguageId = 2; + $struct->sortField = Location::SORT_FIELD_MODIFIED_SUBNODE; + $struct->sortOrder = Location::SORT_ORDER_ASC; + $struct->defaultAlwaysAvailable = true; + + $struct->groupIds = array( + 1, + ); + + $fieldDefName = new FieldDefinition(); + + $fieldDefShortDescription = new FieldDefinition(); + + $struct->fieldDefinitions = array( + $fieldDefName, + $fieldDefShortDescription + ); + + return $struct; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::createCreateStructFromType + * + * @return void + */ + public function testCreateStructFromType() + { + $type = $this->getContentTypeFixture(); + + $mapper = new Mapper( $this->getConverterRegistryMock() ); + $struct = $mapper->createCreateStructFromType( $type ); + + // Iterate through struct, since it has fewer props + foreach ( $struct as $propName => $propVal ) + { + $this->assertEquals( + $struct->$propName, + $type->$propName, + "Property \${$propName} not equal" + ); + } + } + + /** + * Returns a Type fixture. + * + * @return Type + */ + protected function getContentTypeFixture() + { + // Taken from example DB + $type = new Type(); + $type->id = 23; + $type->name = array( + 'eng-US' => 'Folder', + ); + $type->status = 0; + $type->description = array(); + $type->identifier = 'folder'; + $type->created = 1024392098; + $type->modified = 1082454875; + $type->creatorId = 14; + $type->modifierId = 14; + $type->remoteId = 'a3d405b81be900468eb153d774f4f0d2'; + $type->urlAliasSchema = ''; + $type->nameSchema = '<short_name|name>'; + $type->isContainer = true; + $type->initialLanguageId = 2; + $type->sortField = Location::SORT_FIELD_MODIFIED_SUBNODE; + $type->sortOrder = Location::SORT_ORDER_ASC; + $type->defaultAlwaysAvailable = true; + $type->groupIds = array( + 1, + ); + + $fieldDefName = new FieldDefinition(); + $fieldDefName->id = 42; + + $fieldDefShortDescription = new FieldDefinition(); + $fieldDefName->id = 128; + + $type->fieldDefinitions = array( + $fieldDefName, + $fieldDefShortDescription + ); + + return $type; + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::extractGroupsFromRows + * + * @return void + */ + public function testExtractGroupsFromRows() + { + $rows = $this->getLoadGroupFixture(); + + $mapper = new Mapper( $this->getConverterRegistryMock() ); + $groups = $mapper->extractGroupsFromRows( $rows ); + + $groupFixture = new Group(); + $groupFixture->created = 1032009743; + $groupFixture->creatorId = 14; + $groupFixture->id = 3; + $groupFixture->modified = 1033922120; + $groupFixture->modifierId = 14; + $groupFixture->identifier = 'Media'; + + $this->assertEquals( + array( $groupFixture ), + $groups + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::extractTypesFromRows + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::extractTypeFromRow + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::extractStorageFieldFromRow + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::extractFieldFromRow + */ + public function testExtractTypesFromRowsSingle() + { + $rows = $this->getLoadTypeFixture(); + + $mapper = $this->getNonConvertingMapper(); + $types = $mapper->extractTypesFromRows( $rows ); + + $this->assertEquals( + 1, + count( $types ), + 'Incorrect number of types extracted' + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'status' => 0, + 'name' => array( + 'eng-US' => 'Folder' + ), + 'description' => array(), + 'created' => 1024392098, + 'creatorId' => 14, + 'modified' => 1082454875, + 'modifierId' => 14, + 'identifier' => 'folder', + 'remoteId' => 'a3d405b81be900468eb153d774f4f0d2', + 'urlAliasSchema' => '', + 'nameSchema' => '<short_name|name>', + 'isContainer' => true, + 'initialLanguageId' => 2, + 'groupIds' => array( 1 ), + 'sortField' => 1, + 'sortOrder' => 1, + 'defaultAlwaysAvailable' => true, + ), + $types[0] + ); + + $this->assertEquals( + 5, + count( $types[0]->fieldDefinitions ), + 'Incorrect number of field definitions' + ); + $this->assertPropertiesCorrect( + array( + 'id' => 155, + 'name' => array( + 'eng-US' => 'Short name', + ), + 'description' => array(), + 'identifier' => 'short_name', + 'fieldGroup' => '', + 'fieldType' => 'ezstring', + 'isTranslatable' => true, + 'isRequired' => false, + 'isInfoCollector' => false, + 'isSearchable' => true, + 'position' => 2, + ), + $types[0]->fieldDefinitions[2] + ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::toStorageFieldDefinition + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition + */ + public function testToStorageFieldDefinition() + { + $converterMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + $converterMock->expects( $this->once() ) + ->method( 'toStorageFieldDefinition' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' + ), + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' + ) + ); + + $converterRegistry = new ConverterRegistry( array( 'some_type' => $converterMock ) ); + + $mapper = new Mapper( $converterRegistry ); + + $fieldDef = new FieldDefinition(); + $fieldDef->fieldType = 'some_type'; + + $storageFieldDef = new StorageFieldDefinition(); + + $mapper->toStorageFieldDefinition( $fieldDef, $storageFieldDef ); + } + + /** + * @return void + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Mapper::toFieldDefinition + * @covers eZ\Publish\Core\Persistence\Legacy\Content\StorageFieldDefinition + */ + public function testToFieldDefinition() + { + $converterMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\Converter' + ); + $converterMock->expects( $this->once() ) + ->method( 'toFieldDefinition' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' + ), + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\FieldDefinition' + ) + ); + + $converterRegistry = new ConverterRegistry( array( 'some_type' => $converterMock ) ); + + $mapper = new Mapper( $converterRegistry ); + + $storageFieldDef = new StorageFieldDefinition(); + + $fieldDef = new FieldDefinition(); + $fieldDef->fieldType = 'some_type'; + + $mapper->toFieldDefinition( $storageFieldDef, $fieldDef ); + } + + /** + * Returns a Mapper with conversion methods mocked + * + * @return Mapper + */ + protected function getNonConvertingMapper() + { + $mapper = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Mapper', + array( 'toFieldDefinition' ), + array( $this->getConverterRegistryMock() ) + ); + // Dedicatedly tested test + $mapper->expects( $this->atLeastOnce() ) + ->method( 'toFieldDefinition' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageFieldDefinition' + ) + )->will( + $this->returnCallback( + function () + { + return new FieldDefinition(); + } + ) + ); + return $mapper; + } + + /** + * Returns a converter registry mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry + */ + protected function getConverterRegistryMock() + { + return $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\ConverterRegistry', + array(), + array( array() ) + ); + } + + /** + * Returns fixture for {@link testExtractTypesFromRowsSingle()} + * + * @return array + */ + protected function getLoadTypeFixture() + { + return require __DIR__ . '/_fixtures/map_load_type.php'; + } + + /** + * Returns fixture for {@link testExtractGroupsFromRows()} + * + * @return array + */ + protected function getLoadGroupFixture() + { + return require __DIR__ . '/_fixtures/map_load_group.php'; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Update/Handler/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Update/Handler/EzcDatabaseTest.php new file mode 100644 index 0000000..b6a6d8c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/Update/Handler/EzcDatabaseTest.php @@ -0,0 +1,190 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\ContentTypeHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\Type\UpdateHandler; + +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler\EzcDatabase; + +/** + * Test case for Content Type Handler. + */ +class ContentTypeHandlerTest extends \PHPUnit_Framework_TestCase +{ + /** + * Gateway mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected $gatewayMock; + + /** + * Content Updater mock + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater + */ + protected $contentUpdaterMock; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler\EzcDatabase::updateContentObjects + * + * @return void + */ + public function testUpdateContentObjects() + { + $handler = $this->getUpdateHandler(); + + $updaterMock = $this->getContentUpdaterMock(); + + $updaterMock->expects( $this->once() ) + ->method( 'determineActions' ) + ->with( + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' + ), + $this->isInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type' + ) + )->will( $this->returnValue( array() ) ); + + $updaterMock->expects( $this->once() ) + ->method( 'applyUpdates' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( array() ) + ); + + $types = $this->getTypeFixtures(); + + $handler->updateContentObjects( $types['from'], $types['to'] ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler\EzcDatabase::deleteOldType + * + * @return void + */ + public function testDeleteOldType() + { + $handler = $this->getUpdateHandler(); + + $gatewayMock = $this->getGatewayMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'delete' ) + ->with( + $this->equalTo( 23 ), + $this->equalTo( 0 ) + ); + + $types = $this->getTypeFixtures(); + + $handler->deleteOldType( $types['from'], $types['to'] ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler\EzcDatabase::publishNewType + * + * @return void + */ + public function testPublishNewType() + { + $handler = $this->getUpdateHandler(); + + $gatewayMock = $this->getGatewayMock(); + $updaterMock = $this->getContentUpdaterMock(); + + $gatewayMock->expects( $this->once() ) + ->method( 'publishTypeAndFields' ) + ->with( $this->equalTo( 23 ), $this->equalTo( 1 ), $this->equalTo( 0 ) ); + + $types = $this->getTypeFixtures(); + + $handler->publishNewType( $types['to'], 0 ); + } + + /** + * Returns an array with 'from' and 'to' types + * + * @return \eZ\Publish\SPI\Persistence\Content\Type[] + */ + protected function getTypeFixtures() + { + $types = array(); + + $types['from'] = new Type(); + $types['from']->id = 23; + $types['from']->status = Type::STATUS_DEFINED; + + $types['to'] = new Type(); + $types['to']->id = 23; + $types['to']->status = Type::STATUS_DRAFT; + + return $types; + } + + /** + * Returns the Update Handler to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Update\Handler\EzcDatabase + */ + protected function getUpdateHandler() + { + return new EzcDatabase( + $this->getGatewayMock(), + $this->getContentUpdaterMock() + ); + } + + /** + * Returns a gateway mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\Gateway + */ + protected function getGatewayMock() + { + if ( !isset( $this->gatewayMock ) ) + { + $this->gatewayMock = $this->getMockForAbstractClass( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Gateway' + ); + } + return $this->gatewayMock; + } + + /** + * Returns a Content Updater mock + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Type\ContentUpdater + */ + protected function getContentUpdaterMock() + { + if ( !isset( $this->contentUpdaterMock ) ) + { + $this->contentUpdaterMock = $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\ContentUpdater', + array(), + array(), + '', + false + ); + } + return $this->contentUpdaterMock; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/_fixtures/map_load_group.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/_fixtures/map_load_group.php new file mode 100644 index 0000000..33b97e0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/_fixtures/map_load_group.php @@ -0,0 +1,12 @@ +<?php + +return array( + array( + 'created' => 1032009743, + 'creator_id' => 14, + 'id' => 3, + 'modified' => 1033922120, + 'modifier_id' => 14, + 'name' => 'Media', + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/_fixtures/map_load_type.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/_fixtures/map_load_type.php new file mode 100644 index 0000000..d83f675 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/Type/_fixtures/map_load_type.php @@ -0,0 +1,239 @@ +<?php + +return array( + 0 => array( + 'ezcontentclass_id' => '1', + 'ezcontentclass_always_available' => '1', + 'ezcontentclass_contentobject_name' => '<short_name|name>', + 'ezcontentclass_created' => '1024392098', + 'ezcontentclass_creator_id' => '14', + 'ezcontentclass_modified' => '1082454875', + 'ezcontentclass_modifier_id' => '14', + 'ezcontentclass_identifier' => 'folder', + 'ezcontentclass_initial_language_id' => '2', + 'ezcontentclass_is_container' => '1', + 'ezcontentclass_language_mask' => '3', + 'ezcontentclass_remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'ezcontentclass_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'ezcontentclass_sort_field' => '1', + 'ezcontentclass_sort_order' => '1', + 'ezcontentclass_url_alias_name' => '', + 'ezcontentclass_version' => '0', + 'ezcontentclass_attribute_id' => '4', + 'ezcontentclass_attribute_can_translate' => '1', + 'ezcontentclass_attribute_category' => '', + 'ezcontentclass_attribute_contentclass_id' => '1', + 'ezcontentclass_attribute_data_float1' => '0.0', + 'ezcontentclass_attribute_data_float2' => '0.0', + 'ezcontentclass_attribute_data_float3' => '0.0', + 'ezcontentclass_attribute_data_float4' => '0.0', + 'ezcontentclass_attribute_data_int1' => '255', + 'ezcontentclass_attribute_data_int2' => '0', + 'ezcontentclass_attribute_data_int3' => '0', + 'ezcontentclass_attribute_data_int4' => '0', + 'ezcontentclass_attribute_data_text1' => 'Folder', + 'ezcontentclass_attribute_data_text2' => '', + 'ezcontentclass_attribute_data_text3' => '', + 'ezcontentclass_attribute_data_text4' => '', + 'ezcontentclass_attribute_data_text5' => '', + 'ezcontentclass_attribute_data_type_string' => 'ezstring', + 'ezcontentclass_attribute_identifier' => 'name', + 'ezcontentclass_attribute_is_information_collector' => '0', + 'ezcontentclass_attribute_is_required' => '1', + 'ezcontentclass_attribute_is_searchable' => '1', + 'ezcontentclass_attribute_placement' => '1', + 'ezcontentclass_attribute_serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'ezcontentclass_classgroup_group_id' => '1', + ), + 1 => array( + 'ezcontentclass_id' => '1', + 'ezcontentclass_always_available' => '1', + 'ezcontentclass_contentobject_name' => '<short_name|name>', + 'ezcontentclass_created' => '1024392098', + 'ezcontentclass_creator_id' => '14', + 'ezcontentclass_modified' => '1082454875', + 'ezcontentclass_modifier_id' => '14', + 'ezcontentclass_identifier' => 'folder', + 'ezcontentclass_initial_language_id' => '2', + 'ezcontentclass_is_container' => '1', + 'ezcontentclass_language_mask' => '3', + 'ezcontentclass_remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'ezcontentclass_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'ezcontentclass_sort_field' => '1', + 'ezcontentclass_sort_order' => '1', + 'ezcontentclass_url_alias_name' => '', + 'ezcontentclass_version' => '0', + 'ezcontentclass_attribute_id' => '119', + 'ezcontentclass_attribute_can_translate' => '1', + 'ezcontentclass_attribute_category' => '', + 'ezcontentclass_attribute_contentclass_id' => '1', + 'ezcontentclass_attribute_data_float1' => '0.0', + 'ezcontentclass_attribute_data_float2' => '0.0', + 'ezcontentclass_attribute_data_float3' => '0.0', + 'ezcontentclass_attribute_data_float4' => '0.0', + 'ezcontentclass_attribute_data_int1' => '5', + 'ezcontentclass_attribute_data_int2' => '0', + 'ezcontentclass_attribute_data_int3' => '0', + 'ezcontentclass_attribute_data_int4' => '0', + 'ezcontentclass_attribute_data_text1' => '', + 'ezcontentclass_attribute_data_text2' => '', + 'ezcontentclass_attribute_data_text3' => '', + 'ezcontentclass_attribute_data_text4' => '', + 'ezcontentclass_attribute_data_text5' => '', + 'ezcontentclass_attribute_data_type_string' => 'ezxmltext', + 'ezcontentclass_attribute_identifier' => 'short_description', + 'ezcontentclass_attribute_is_information_collector' => '0', + 'ezcontentclass_attribute_is_required' => '0', + 'ezcontentclass_attribute_is_searchable' => '1', + 'ezcontentclass_attribute_placement' => '3', + 'ezcontentclass_attribute_serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Short description";}', + 'ezcontentclass_classgroup_group_id' => '1', + ), + 2 => array( + 'ezcontentclass_id' => '1', + 'ezcontentclass_always_available' => '1', + 'ezcontentclass_contentobject_name' => '<short_name|name>', + 'ezcontentclass_created' => '1024392098', + 'ezcontentclass_creator_id' => '14', + 'ezcontentclass_modified' => '1082454875', + 'ezcontentclass_modifier_id' => '14', + 'ezcontentclass_identifier' => 'folder', + 'ezcontentclass_initial_language_id' => '2', + 'ezcontentclass_is_container' => '1', + 'ezcontentclass_language_mask' => '3', + 'ezcontentclass_remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'ezcontentclass_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'ezcontentclass_sort_field' => '1', + 'ezcontentclass_sort_order' => '1', + 'ezcontentclass_url_alias_name' => '', + 'ezcontentclass_version' => '0', + 'ezcontentclass_attribute_id' => '155', + 'ezcontentclass_attribute_can_translate' => '1', + 'ezcontentclass_attribute_category' => '', + 'ezcontentclass_attribute_contentclass_id' => '1', + 'ezcontentclass_attribute_data_float1' => '0.0', + 'ezcontentclass_attribute_data_float2' => '0.0', + 'ezcontentclass_attribute_data_float3' => '0.0', + 'ezcontentclass_attribute_data_float4' => '0.0', + 'ezcontentclass_attribute_data_int1' => '100', + 'ezcontentclass_attribute_data_int2' => '0', + 'ezcontentclass_attribute_data_int3' => '0', + 'ezcontentclass_attribute_data_int4' => '0', + 'ezcontentclass_attribute_data_text1' => '', + 'ezcontentclass_attribute_data_text2' => '', + 'ezcontentclass_attribute_data_text3' => '', + 'ezcontentclass_attribute_data_text4' => '', + 'ezcontentclass_attribute_data_text5' => '', + 'ezcontentclass_attribute_data_type_string' => 'ezstring', + 'ezcontentclass_attribute_identifier' => 'short_name', + 'ezcontentclass_attribute_is_information_collector' => '0', + 'ezcontentclass_attribute_is_required' => '0', + 'ezcontentclass_attribute_is_searchable' => '1', + 'ezcontentclass_attribute_placement' => '2', + 'ezcontentclass_attribute_serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Short name";}', + 'ezcontentclass_classgroup_group_id' => '1', + ), + 3 => array( + 'ezcontentclass_id' => '1', + 'ezcontentclass_always_available' => '1', + 'ezcontentclass_contentobject_name' => '<short_name|name>', + 'ezcontentclass_created' => '1024392098', + 'ezcontentclass_creator_id' => '14', + 'ezcontentclass_modified' => '1082454875', + 'ezcontentclass_modifier_id' => '14', + 'ezcontentclass_identifier' => 'folder', + 'ezcontentclass_initial_language_id' => '2', + 'ezcontentclass_is_container' => '1', + 'ezcontentclass_language_mask' => '3', + 'ezcontentclass_remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'ezcontentclass_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'ezcontentclass_sort_field' => '1', + 'ezcontentclass_sort_order' => '1', + 'ezcontentclass_url_alias_name' => '', + 'ezcontentclass_version' => '0', + 'ezcontentclass_attribute_id' => '156', + 'ezcontentclass_attribute_can_translate' => '1', + 'ezcontentclass_attribute_category' => '', + 'ezcontentclass_attribute_contentclass_id' => '1', + 'ezcontentclass_attribute_data_float1' => '0.0', + 'ezcontentclass_attribute_data_float2' => '0.0', + 'ezcontentclass_attribute_data_float3' => '0.0', + 'ezcontentclass_attribute_data_float4' => '0.0', + 'ezcontentclass_attribute_data_int1' => '20', + 'ezcontentclass_attribute_data_int2' => '0', + 'ezcontentclass_attribute_data_int3' => '0', + 'ezcontentclass_attribute_data_int4' => '0', + 'ezcontentclass_attribute_data_text1' => '', + 'ezcontentclass_attribute_data_text2' => '', + 'ezcontentclass_attribute_data_text3' => '', + 'ezcontentclass_attribute_data_text4' => '', + 'ezcontentclass_attribute_data_text5' => '', + 'ezcontentclass_attribute_data_type_string' => 'ezxmltext', + 'ezcontentclass_attribute_identifier' => 'description', + 'ezcontentclass_attribute_is_information_collector' => '0', + 'ezcontentclass_attribute_is_required' => '0', + 'ezcontentclass_attribute_is_searchable' => '1', + 'ezcontentclass_attribute_placement' => '4', + 'ezcontentclass_attribute_serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'ezcontentclass_classgroup_group_id' => '1', + ), + 4 => array( + 'ezcontentclass_id' => '1', + 'ezcontentclass_always_available' => '1', + 'ezcontentclass_contentobject_name' => '<short_name|name>', + 'ezcontentclass_created' => '1024392098', + 'ezcontentclass_creator_id' => '14', + 'ezcontentclass_modified' => '1082454875', + 'ezcontentclass_modifier_id' => '14', + 'ezcontentclass_identifier' => 'folder', + 'ezcontentclass_initial_language_id' => '2', + 'ezcontentclass_is_container' => '1', + 'ezcontentclass_language_mask' => '3', + 'ezcontentclass_remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'ezcontentclass_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'ezcontentclass_sort_field' => '1', + 'ezcontentclass_sort_order' => '1', + 'ezcontentclass_url_alias_name' => '', + 'ezcontentclass_version' => '0', + 'ezcontentclass_attribute_id' => '158', + 'ezcontentclass_attribute_can_translate' => '0', + 'ezcontentclass_attribute_category' => '', + 'ezcontentclass_attribute_contentclass_id' => '1', + 'ezcontentclass_attribute_data_float1' => '0.0', + 'ezcontentclass_attribute_data_float2' => '0.0', + 'ezcontentclass_attribute_data_float3' => '0.0', + 'ezcontentclass_attribute_data_float4' => '0.0', + 'ezcontentclass_attribute_data_int1' => '0', + 'ezcontentclass_attribute_data_int2' => '0', + 'ezcontentclass_attribute_data_int3' => '1', + 'ezcontentclass_attribute_data_int4' => '0', + 'ezcontentclass_attribute_data_text1' => '', + 'ezcontentclass_attribute_data_text2' => '', + 'ezcontentclass_attribute_data_text3' => '', + 'ezcontentclass_attribute_data_text4' => '', + 'ezcontentclass_attribute_data_text5' => '', + 'ezcontentclass_attribute_data_type_string' => 'ezboolean', + 'ezcontentclass_attribute_identifier' => 'show_children', + 'ezcontentclass_attribute_is_information_collector' => '0', + 'ezcontentclass_attribute_is_required' => '0', + 'ezcontentclass_attribute_is_searchable' => '0', + 'ezcontentclass_attribute_placement' => '5', + 'ezcontentclass_attribute_serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'ezcontentclass_attribute_serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Show children";}', + 'ezcontentclass_classgroup_group_id' => '1', + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..9c0d886 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/EzcDatabaseTest.php @@ -0,0 +1,489 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlAlias\Gateway\EzcDatabaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlAlias\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator as LanguageMaskGenerator; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler as LanguageHandler; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\Mapper as LanguageMapper; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase as LanguageGateway; + +/** + * Test case for eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase. + * + * @group urlalias-gateway + */ +class EzcDatabaseTest extends TestCase +{ + /** + * Database gateway to test. + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway + */ + protected $gateway; + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::__construct + */ + public function testConstructor() + { + $dbHandler = $this->getDatabaseHandler(); + $gateway = $this->getGateway(); + + $this->assertAttributeSame( + $dbHandler, + "dbHandler", + $gateway + ); + } + + /** + * Test for the loadUrlAliasData() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::loadUrlAliasData + */ + public function testLoadUrlaliasDataNonExistent() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_simple.php" ); + $gateway = $this->getGateway(); + + $rows = $gateway->loadUrlAliasData( array( md5( "tri" ) ) ); + + self::assertEmpty( $rows ); + } + + /** + * Test for the loadUrlAliasData() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::loadUrlAliasData + */ + public function testLoadUrlaliasData() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_simple.php" ); + $gateway = $this->getGateway(); + + $row = $gateway->loadUrlAliasData( array( md5( "jedan" ), md5( "dva" ) ) ); + + self::assertEquals( + array( + "ezurlalias_ml0_id" => "2", + "ezurlalias_ml0_link" => "2", + "ezurlalias_ml0_is_alias" => "0", + "ezurlalias_ml0_alias_redirects" => "1", + "ezurlalias_ml0_is_original" => "1", + "ezurlalias_ml0_action" => "eznode:314", + "ezurlalias_ml0_action_type" => "eznode", + "ezurlalias_ml0_lang_mask" => "2", + "ezurlalias_ml0_text" => "jedan", + "ezurlalias_ml0_parent" => "0", + "ezurlalias_ml0_text_md5" => "6896260129051a949051c3847c34466f", + "id" => "3", + "link" => "3", + "is_alias" => "0", + "alias_redirects" => "1", + "is_original" => "1", + "action" => "eznode:315", + "action_type" => "eznode", + "lang_mask" => "3", + "text" => "dva", + "parent" => "2", + "text_md5" => "c67ed9a09ab136fae610b6a087d82e21", + ), + $row + ); + } + + /** + * Test for the loadUrlAliasData() method. + * + * Test with fixture containing language mask with multiple languages. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::loadUrlAliasData + */ + public function testLoadUrlaliasDataMultipleLanguages() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_multilang.php" ); + $gateway = $this->getGateway(); + + $row = $gateway->loadUrlAliasData( array( md5( "jedan" ), md5( "dva" ) ) ); + + self::assertEquals( + array( + "ezurlalias_ml0_id" => "2", + "ezurlalias_ml0_link" => "2", + "ezurlalias_ml0_is_alias" => "0", + "ezurlalias_ml0_alias_redirects" => "1", + "ezurlalias_ml0_is_original" => "1", + "ezurlalias_ml0_action" => "eznode:314", + "ezurlalias_ml0_action_type" => "eznode", + "ezurlalias_ml0_lang_mask" => "3", + "ezurlalias_ml0_text" => "jedan", + "ezurlalias_ml0_parent" => "0", + "ezurlalias_ml0_text_md5" => "6896260129051a949051c3847c34466f", + "id" => "3", + "link" => "3", + "is_alias" => "0", + "alias_redirects" => "1", + "is_original" => "1", + "action" => "eznode:315", + "action_type" => "eznode", + "lang_mask" => "6", + "text" => "dva", + "parent" => "2", + "text_md5" => "c67ed9a09ab136fae610b6a087d82e21", + ), + $row + ); + } + + /** + * @return array + */ + public function providerForTestLoadPathData() + { + return array( + array( + 2, + array( + array( + array( "parent" => "0", "lang_mask" => "3", "text" => "jedan" ), + ), + ) + ), + array( + 3, + array( + array( + array( "parent" => "0", "lang_mask" => "3", "text" => "jedan" ), + ), + array( + array( "parent" => "2", "lang_mask" => "5", "text" => "two" ), + array( "parent" => "2", "lang_mask" => "3", "text" => "dva" ), + ), + ) + ), + array( + 4, + array( + array( + array( "parent" => "0", "lang_mask" => "3", "text" => "jedan" ), + ), + array( + array( "parent" => "2", "lang_mask" => "5", "text" => "two" ), + array( "parent" => "2", "lang_mask" => "3", "text" => "dva" ), + ), + array( + array( "parent" => "3", "lang_mask" => "9", "text" => "drei" ), + array( "parent" => "3", "lang_mask" => "5", "text" => "three" ), + array( "parent" => "3", "lang_mask" => "3", "text" => "tri" ), + ), + ) + ), + ); + } + + /** + * Test for the loadPathData() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::loadPathData + * @dataProvider providerForTestLoadPathData + */ + public function testLoadPathData( $id, $pathData ) + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_fallback.php" ); + $gateway = $this->getGateway(); + + $loadedPathData = $gateway->loadPathData( $id ); + + self::assertEquals( + $pathData, + $loadedPathData + ); + } + + /** + * @return array + */ + public function providerForTestLoadPathDataMultipleLanguages() + { + return array( + array( + 2, + array( + array( + array( "parent" => "0", "lang_mask" => "3", "text" => "jedan" ), + ), + ) + ), + array( + 3, + array( + array( + array( "parent" => "0", "lang_mask" => "3", "text" => "jedan" ), + ), + array( + array( "parent" => "2", "lang_mask" => "6", "text" => "dva" ), + ), + ) + ), + array( + 4, + array( + array( + array( "parent" => "0", "lang_mask" => "3", "text" => "jedan" ), + ), + array( + array( "parent" => "2", "lang_mask" => "6", "text" => "dva" ), + ), + array( + array( "parent" => "3", "lang_mask" => "4", "text" => "three" ), + array( "parent" => "3", "lang_mask" => "2", "text" => "tri" ), + ), + ) + ), + ); + } + + /** + * Test for the loadPathData() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::loadPathData + * @dataProvider providerForTestLoadPathDataMultipleLanguages + */ + public function testLoadPathDataMultipleLanguages( $id, $pathData ) + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_multilang.php" ); + $gateway = $this->getGateway(); + + $loadedPathData = $gateway->loadPathData( $id ); + + self::assertEquals( + $pathData, + $loadedPathData + ); + } + + /** + * @return array + */ + public function providerForTestCleanupAfterPublishHistorize() + { + return array( + array( + "action" => "eznode:314", + "languageId" => 2, + "parentId" => 0, + "textMD5" => "6896260129051a949051c3847c34466f" + ), + array( + "action" => "eznode:315", + "languageId" => 2, + "parentId" => 0, + "textMD5" => "c67ed9a09ab136fae610b6a087d82e21" + ), + ); + } + + /** + * Test for the cleanupAfterPublish() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::cleanupAfterPublish + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::historize + * @dataProvider providerForTestCleanupAfterPublishHistorize + */ + public function testCleanupAfterPublishHistorize( $action, $languageId, $parentId, $textMD5 ) + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_downgrade.php" ); + $gateway = $this->getGateway(); + + $loadedRow = $gateway->loadRow( $parentId, $textMD5 ); + + $gateway->cleanupAfterPublish( $action, $languageId, 42, $parentId, "jabberwocky" ); + + $reloadedRow = $gateway->loadRow( $parentId, $textMD5 ); + $loadedRow["is_original"] = "0"; + $loadedRow["link"] = 42; + $loadedRow["id"] = 6; + + self::assertEquals( $reloadedRow, $loadedRow ); + } + + /** + * @return array + */ + public function providerForTestCleanupAfterPublishRemovesLanguage() + { + return array( + array( + "action" => "eznode:316", + "languageId" => 2, + "parentId" => 0, + "textMD5" => "d2cfe69af2d64330670e08efb2c86df7" + ), + array( + "action" => "eznode:317", + "languageId" => 2, + "parentId" => 0, + "textMD5" => "538dca05643d220317ad233cd7be7a0a" + ), + ); + } + + /** + * Test for the cleanupAfterPublish() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::cleanupAfterPublish + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::removeTranslation + * @dataProvider providerForTestCleanupAfterPublishRemovesLanguage + */ + public function testCleanupAfterPublishRemovesLanguage( $action, $languageId, $parentId, $textMD5 ) + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_downgrade.php" ); + $gateway = $this->getGateway(); + + $loadedRow = $gateway->loadRow( $parentId, $textMD5 ); + + $gateway->cleanupAfterPublish( $action, $languageId, 42, $parentId, "jabberwocky" ); + + $reloadedRow = $gateway->loadRow( $parentId, $textMD5 ); + $loadedRow["lang_mask"] = $loadedRow["lang_mask"] & ~$languageId; + + self::assertEquals( $reloadedRow, $loadedRow ); + } + + /** + * Test for the reparent() method. + * + * @todo document + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::reparent + */ + public function testReparent() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_simple.php" ); + $gateway = $this->getGateway(); + + $gateway->reparent( 2, 42 ); + + self::assertEquals( + array( + "action" => "eznode:315", + "action_type" => "eznode", + "alias_redirects" => "1", + "id" => "3", + "is_alias" => "0", + "is_original" => "1", + "lang_mask" => "3", + "link" => "3", + "parent" => "42", + "text" => "dva", + "text_md5" => "c67ed9a09ab136fae610b6a087d82e21" + ), + $gateway->loadRow( 42, "c67ed9a09ab136fae610b6a087d82e21" ) + ); + } + + /** + * Test for the removeByAction() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::removeByAction + */ + public function testRemoveByAction() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reparent.php" ); + $gateway = $this->getGateway(); + + $gateway->removeByAction( "eznode:315" ); + + self::assertEquals( + array( + "action" => "nop:", + "action_type" => "nop", + "alias_redirects" => "1", + "id" => "3", + "is_alias" => "0", + "is_original" => "0", + "lang_mask" => "1", + "link" => "3", + "parent" => "2", + "text" => "new-location", + "text_md5" => "1cdf796099b4596aed1c1c86c102526f" + ), + $gateway->loadRow( 2, "1cdf796099b4596aed1c1c86c102526f" ) + ); + self::assertEquals( + array( + "action" => "nop:", + "action_type" => "nop", + "alias_redirects" => "1", + "id" => "6", + "is_alias" => "0", + "is_original" => "0", + "lang_mask" => "1", + "link" => "6", + "parent" => "0", + "text" => "old-location-historized", + "text_md5" => "e504bfae32f8c3ecd2922bcd1b9a8b6a" + ), + $gateway->loadRow( 0, "e504bfae32f8c3ecd2922bcd1b9a8b6a" ) + ); + } + + /** + * Test for the getNewId() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase::getNextId + */ + public function testGetNextId() + { + $gateway = $this->getGateway(); + + $refObject = new \ReflectionObject( $gateway ); + $refMethod = $refObject->getMethod( "getNextId" ); + $refMethod->setAccessible( true ); + + self::assertEquals( 1, $refMethod->invoke( $gateway ) ); + self::assertEquals( 2, $refMethod->invoke( $gateway ) ); + } + + /** + * Returns the EzcDatabase gateway to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase + */ + protected function getGateway() + { + if ( !isset( $this->gateway ) ) + { + $languageHandler = new LanguageHandler( + new LanguageGateway( + $this->getDatabaseHandler() + ), + new LanguageMapper() + ); + $this->gateway = new EzcDatabase( + $this->getDatabaseHandler(), + new LanguageMaskGenerator( $languageHandler ) + ); + } + return $this->gateway; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_downgrade.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_downgrade.php new file mode 100644 index 0000000..59f2f71 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_downgrade.php @@ -0,0 +1,88 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '2', + 'parent' => '0', + 'text' => 'jedan', + 'text_md5' => '6896260129051a949051c3847c34466f', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '3', + 'parent' => '0', + 'text' => 'dva', + 'text_md5' => 'c67ed9a09ab136fae610b6a087d82e21', + ), + 3 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '6', + 'link' => '4', + 'parent' => '0', + 'text' => 'tri', + 'text_md5' => 'd2cfe69af2d64330670e08efb2c86df7', + ), + 4 => array ( + 'action' => 'eznode:317', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '7', + 'link' => '5', + 'parent' => '0', + 'text' => 'cetiri', + 'text_md5' => '538dca05643d220317ad233cd7be7a0a', + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_fallback.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_fallback.php new file mode 100644 index 0000000..1406d41 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_fallback.php @@ -0,0 +1,138 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'jedan', + 'text_md5' => '6896260129051a949051c3847c34466f', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '5', + 'link' => '3', + 'parent' => '2', + 'text' => 'two', + 'text_md5' => 'b8a9f715dbb64fd5c56e7783c6820a61', + ), + 3 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '3', + 'parent' => '2', + 'text' => 'dva', + 'text_md5' => 'c67ed9a09ab136fae610b6a087d82e21', + ), + 4 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '9', + 'link' => '4', + 'parent' => '3', + 'text' => 'drei', + 'text_md5' => '1d8d2fd0a99802b89eb356a86e029d25', + ), + 5 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '5', + 'link' => '4', + 'parent' => '3', + 'text' => 'three', + 'text_md5' => '35d6d33467aae9a2e3dccb4b6b027878', + ), + 6 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '3', + 'text' => 'tri', + 'text_md5' => 'd2cfe69af2d64330670e08efb2c86df7', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + 2 => array( + 'disabled' => 0, + 'id' => 8, + 'locale' => 'ger-DE', + 'name' => 'German' + ), + 3 => array( + 'disabled' => 0, + 'id' => 16, + 'locale' => 'kli-KR', + 'name' => 'Klingon (Kronos)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_multilang.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_multilang.php new file mode 100644 index 0000000..4dd4ee1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_multilang.php @@ -0,0 +1,99 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'jedan', + 'text_md5' => '6896260129051a949051c3847c34466f', + ), + 3 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '6', + 'link' => '3', + 'parent' => '2', + 'text' => 'dva', + 'text_md5' => 'c67ed9a09ab136fae610b6a087d82e21', + ), + 4 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '4', + 'parent' => '3', + 'text' => 'three', + 'text_md5' => '35d6d33467aae9a2e3dccb4b6b027878', + ), + 5 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '4', + 'parent' => '3', + 'text' => 'tri', + 'text_md5' => 'd2cfe69af2d64330670e08efb2c86df7', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_relink.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_relink.php new file mode 100644 index 0000000..d3eec5a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_relink.php @@ -0,0 +1,59 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '2', + 'parent' => '0', + 'text' => 'history', + 'text_md5' => '3cd15f8f2940aff879df34df4e5c2cd1', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '3', + 'parent' => '0', + 'text' => 'reused-history', + 'text_md5' => '51e775a611265b7b0cde62a413c91cdc', + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_reparent.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_reparent.php new file mode 100644 index 0000000..c68a57a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_reparent.php @@ -0,0 +1,91 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '2', + 'parent' => '0', + 'text' => 'new-parent-location', + 'text_md5' => 'b4b3d842c2df6834d493359386763492', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '3', + 'parent' => '2', + 'text' => 'new-location', + 'text_md5' => '1cdf796099b4596aed1c1c86c102526f', + ), + 3 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '6', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '4', + 'parent' => '0', + 'text' => 'old-location-historized', + 'text_md5' => 'e504bfae32f8c3ecd2922bcd1b9a8b6a', + ), + 4 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '5', + 'parent' => '4', + 'text' => 'to-be-reparented', + 'text_md5' => '97d0d0299c217478587ca24fcc5bdb2e', + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + 5 => array ( + 'id' => '6', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_simple.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_simple.php new file mode 100644 index 0000000..4c6c3f1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/Gateway/_fixtures/urlaliases_simple.php @@ -0,0 +1,65 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '2', + 'parent' => '0', + 'text' => 'jedan', + 'text_md5' => '6896260129051a949051c3847c34466f', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '3', + 'parent' => '2', + 'text' => 'dva', + 'text_md5' => 'c67ed9a09ab136fae610b6a087d82e21', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/UrlAliasHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/UrlAliasHandlerTest.php new file mode 100644 index 0000000..8154efe --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/UrlAliasHandlerTest.php @@ -0,0 +1,2975 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlAliasHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Gateway\EzcDatabase; +use eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway\EzcDatabase as EzcDatabaseLocation; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\Handler as LanguageHandler; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\Gateway\EzcDatabase as LanguageGateway; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\Mapper as LanguageMapper; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator as LanguageMaskGenerator; +use eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\DefinitionBased; +use eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\DefinitionBased\Parser; +use eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\PcreCompiler; +use eZ\Publish\Core\Persistence\Legacy\Content\Search\Utf8Converter; +use eZ\Publish\SPI\Persistence\Content\UrlAlias; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; + +/** + * Test case for UrlAliasHandler. + * + * @group urlalias-handler + */ +class UrlAliasHandlerTest extends TestCase +{ + /** + * Test for the lookup() method. + * + * Simple lookup case. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @group location + * @group virtual + * @group resource + * @group case-correction + * @group multiple-languages + */ + public function testLookup() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $urlAlias = $handler->lookup( "jedan" ); + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + } + + /** + * Test for the lookup() method. + * + * Trying to lookup non existent URL alias throws NotFoundException. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @group location + * @group virtual + * @group resource + */ + public function testLookupThrowsNotFoundException() + { + $handler = $this->getHandler(); + $handler->lookup( "wooden/iron" ); + } + + public function providerForTestLookupLocationUrlAlias() + { + return array( + array( + "jedan", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ) + ), + array( "cro-HR" ), + true, + 314, + "0-6896260129051a949051c3847c34466f" + ), + array( + "jedan/dva", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ) + ), + array( "cro-HR" ), + false, + 315, + "2-c67ed9a09ab136fae610b6a087d82e21" + ), + array( + "jedan/two", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ) + ), + array( "eng-GB" ), + false, + 315, + "2-b8a9f715dbb64fd5c56e7783c6820a61" + ), + array( + "jedan/dva/tri", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ), + ), + array( "cro-HR" ), + false, + 316, + "3-d2cfe69af2d64330670e08efb2c86df7" + ), + array( + "jedan/two/three", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ), + ), + array( "eng-GB" ), + false, + 316, + "3-35d6d33467aae9a2e3dccb4b6b027878" + ), + array( + "jedan/dva/three", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ), + ), + array( "eng-GB" ), + false, + 316, + "3-35d6d33467aae9a2e3dccb4b6b027878" + ), + array( + "jedan/two/tri", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ), + ), + array( "cro-HR" ), + false, + 316, + "3-d2cfe69af2d64330670e08efb2c86df7" + ), + array( + "jedan/dva/drei", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ), + ), + array( "ger-DE" ), + false, + 316, + "3-1d8d2fd0a99802b89eb356a86e029d25" + ), + array( + "jedan/two/drei", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ), + ), + array( "ger-DE" ), + false, + 316, + "3-1d8d2fd0a99802b89eb356a86e029d25" + ), + ); + } + + /** + * Test for the lookup() method. + * + * Testing that UrlAlias is found and has expected state. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupLocationUrlAlias + * @depends testLookup + * @group location + */ + public function testLookupLocationUrlAlias( + $url, + array $pathData, + array $languageCodes, + $alwaysAvailable, + $locationId, + $id + ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $urlAlias = $handler->lookup( $url ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $locationId, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Testing that looking up case incorrect URL results in redirection to case correct path. + * + * Note that case corrected path is not always equal to case corrected case incorrect path, eg. "JEDAN/TWO/THREE" + * will not always redirect to "jedan/two/three". + * In some cases, depending on list of prioritized languages and if Content available in the different language + * higher in the list of prioritized languages, path showing to that Content will be used. + * Example: "JEDAN/TWO/DREI" with "eng-GB" and "ger-DE" as prioritized languages will produce redirection + * to the "jedan/two/three", as "eng-GB" is the most prioritized language and Content that URL alias is pointing + * to is available in it. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupLocationUrlAlias + * @depends testLookup + * @group case-correction + * @group location + * @todo refactor, only forward pertinent + */ + public function testLookupLocationCaseCorrection( + $url, + array $pathData, + array $languageCodes, + $alwaysAvailable, + $locationId, + $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $urlAlias = $handler->lookup( strtoupper( $url ) ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $locationId, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + public function providerForTestLookupLocationMultipleLanguages() + { + return array( + array( + "jedan/dva", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "dva", + ) + ), + ), + array( "cro-HR", "eng-GB" ), + false, + 315, + "2-c67ed9a09ab136fae610b6a087d82e21" + ), + array( + "jedan/dva/tri", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "dva", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + ) + ), + ), + array( "cro-HR" ), + false, + 316, + "3-d2cfe69af2d64330670e08efb2c86df7" + ), + array( + "jedan/dva/three", + array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "dva", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + ) + ), + ), + array( "eng-GB" ), + false, + 316, + "3-35d6d33467aae9a2e3dccb4b6b027878" + ), + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupLocationMultipleLanguages + * @depends testLookup + * @group multiple-languages + * @group location + */ + public function testLookupLocationMultipleLanguages( + $url, + array $pathData, + array $languageCodes, + $alwaysAvailable, + $locationId, + $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_multilang.php" ); + + $urlAlias = $handler->lookup( $url ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $locationId, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @depends testLookup + * @group history + * @group location + */ + public function testLookupLocationHistoryUrlAlias() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $urlAlias = $handler->lookup( "jedan/dva/tri-history" ); + + self::assertEquals( + $this->getHistoryAlias(), + $urlAlias + ); + } + + public function providerForTestLookupCustomLocationUrlAlias() + { + return array( + array( + "autogenerated-hello/everybody", + array( + array( + "always-available" => true, + "translations" => array( + "eng-GB" => "autogenerated-hello", + ) + ), + array( + "always-available" => true, + "translations" => array( + "eng-GB" => "everybody", + ) + ), + ), + array( "eng-GB" ), + false, + true, + 315, + "2-88150d7d17390010ba6222de68bfafb5" + ), + array( + "hello", + array( + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "hello", + ) + ) + ), + array( "eng-GB" ), + true, + false, + 314, + "0-5d41402abc4b2a76b9719d911017c592" + ), + array( + "hello/and/goodbye", + array( + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "hello", + ) + ), + array( + "always-available" => true, + "translations" => array( + "always-available" => "and", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "goodbye", + ) + ), + ), + array( "eng-GB" ), + true, + false, + 316, + "8-69faab6268350295550de7d587bc323d" + ), + array( + "hello/everyone", + array( + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "hello", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "everyone", + ) + ), + ), + array( "eng-GB" ), + true, + false, + 315, + "6-ed881bac6397ede33c0a285c9f50bb83" + ), + array( + "well/ha-ha-ha", + array( + array( + "always-available" => true, + "translations" => array( + "always-available" => "well", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "ha-ha-ha", + ) + ), + ), + array( "eng-GB" ), + false, + false, + 317, + "10-17a197f4bbe127c368b889a67effd1b3" + ), + ); + } + + /** + * Test for the lookup() method. + * + * Testing that UrlAlias is found and has expected state. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupCustomLocationUrlAlias + * @depends testLookup + * @group location + * @group custom + */ + public function testLookupCustomLocationUrlAlias( + $url, + array $pathData, + array $languageCodes, + $forward, + $alwaysAvailable, + $destination, + $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_custom.php" ); + + $urlAlias = $handler->lookup( $url ); + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $destination, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forward + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * Testing that UrlAlias is found and has expected state. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupCustomLocationUrlAlias + * @depends testLookup + * @group location + * @group custom + */ + public function testLookupCustomLocationUrlAliasCaseCorrection( + $url, + array $pathData, + array $languageCodes, + $forward, + $alwaysAvailable, + $destination, + $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_custom.php" ); + + $urlAlias = $handler->lookup( strtoupper( $url ) ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $destination, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forward + ) + ), + $urlAlias + ); + } + + public function providerForTestLookupVirtualUrlAlias() + { + return array( + array( + "hello/and", + "6-be5d5d37542d75f93a87094459f76678" + ), + array( + "HELLO/AND", + "6-be5d5d37542d75f93a87094459f76678" + ), + ); + } + + /** + * Test for the lookup() method. + * + * Testing that NOP action redirects to site root. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupVirtualUrlAlias + * @depends testLookup + * @group virtual + */ + public function testLookupVirtualUrlAlias( $url, $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_custom.php" ); + + $urlAlias = $handler->lookup( $url ); + + $this->assertVirtualUrlAliasValid( $urlAlias, $id ); + } + + public function providerForTestLookupResourceUrlAlias() + { + return array( + array( + "is-alive", + array( + array( + "always-available" => true, + "translations" => array( + "eng-GB" => "is-alive" + ) + ), + ), + array( "eng-GB" ), + true, + true, + "ezinfo/isalive", + "0-d003895fa282a14c8ec3eddf23ca4ca2" + ), + array( + "is-alive/then/search", + array( + array( + "always-available" => true, + "translations" => array( + "eng-GB" => "is-alive" + ) + ), + array( + "always-available" => true, + "translations" => array( + "always-available" => "then" + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "search" + ) + ), + ), + array( "cro-HR" ), + false, + false, + "content/search", + "3-06a943c59f33a34bb5924aaf72cd2995" + ) + ); + } + + /** + * Test for the lookup() method. + * + * Testing that UrlAlias is found and has expected state. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupResourceUrlAlias + * @depends testLookup + * @group resource + */ + public function testLookupResourceUrlAlias( + $url, + $pathData, + array $languageCodes, + $forward, + $alwaysAvailable, + $destination, + $id + ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $urlAlias = $handler->lookup( $url ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::RESOURCE, + "destination" => $destination, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forward + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * Testing that UrlAlias is found and has expected state. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::lookup + * @dataProvider providerForTestLookupResourceUrlAlias + * @depends testLookup + * @group resource + */ + public function testLookupResourceUrlAliasCaseInsensitive( + $url, + $pathData, + array $languageCodes, + $forward, + $alwaysAvailable, + $destination, + $id + ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $urlAlias = $handler->lookup( strtoupper( $url ) ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::RESOURCE, + "destination" => $destination, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forward + ) + ), + $urlAlias + ); + } + + protected function assertVirtualUrlAliasValid( UrlAlias $urlAlias, $id ) + { + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( $id, $urlAlias->id ); + self::assertEquals( UrlAlias::VIRTUAL, $urlAlias->type ); + /*self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::VIRTUAL, + "destination" => null, + "languageCodes" => array(), + "pathData" => null, + "alwaysAvailable" => true, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + );*/ + } + + /** + * Test for the listURLAliasesForLocation() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::listURLAliasesForLocation + */ + public function testListURLAliasesForLocation() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $urlAliases = $handler->listURLAliasesForLocation( 315 ); + + self::assertEquals( + array( + new UrlAlias( + array( + "id" => "2-b8a9f715dbb64fd5c56e7783c6820a61", + "type" => UrlAlias::LOCATION, + "destination" => 315, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( "cro-HR" => "jedan" ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + new UrlAlias( + array( + "id" => "2-c67ed9a09ab136fae610b6a087d82e21", + "type" => UrlAlias::LOCATION, + "destination" => 315, + "languageCodes" => array( "cro-HR" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( "cro-HR" => "jedan" ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + ), + $urlAliases + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testLookupLocationUrlAlias + * @group publish + */ + public function testPublishUrlAliasForLocation() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "simple", "eng-GB", true ); + $publishedUrlAlias = $handler->lookup( "simple" ); + + self::assertEquals( 2, $this->countRows() ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-" . md5( "simple" ), + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( + "eng-GB" => "simple", + ) + ) + ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $publishedUrlAlias + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @group publish + */ + public function testPublishUrlAliasForLocationRepublish() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "simple", "eng-GB", true ); + $publishedUrlAlias = $handler->lookup( "simple" ); + $handler->publishUrlAliasForLocation( 314, 2, "simple", "eng-GB", true ); + $republishedUrlAlias = $handler->lookup( "simple" ); + + self::assertEquals( 2, $this->countRows() ); + self::assertEquals( + $publishedUrlAlias, + $republishedUrlAlias + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @group publish + */ + public function testPublishUrlAliasCreatesUniqueAlias() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "simple", "eng-GB", true ); + $handler->publishUrlAliasForLocation( 315, 2, "simple", "eng-GB", true ); + self::assertEquals( 3, $this->countRows() ); + + $urlAlias = $handler->lookup( "simple2" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-" . md5( "simple2" ), + "type" => UrlAlias::LOCATION, + "destination" => 315, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( + "eng-GB" => "simple2", + ) + ) + ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * @return array + */ + public function providerForTestPublishUrlAliasForLocationComplex() + { + return $this->providerForTestLookupLocationUrlAlias(); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @dataProvider providerForTestPublishUrlAliasForLocationComplex + * @depends testPublishUrlAliasForLocation + * @group publish + */ + public function testPublishUrlAliasForLocationComplex( + $url, + $pathData, + array $languageCodes, + $alwaysAvailable, + $locationId, + $id + ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR", true ); + $handler->publishUrlAliasForLocation( 315, 314, "dva", "cro-HR", false ); + $handler->publishUrlAliasForLocation( 315, 314, "two", "eng-GB", false ); + $handler->publishUrlAliasForLocation( 316, 315, "tri", "cro-HR", false ); + $handler->publishUrlAliasForLocation( 316, 315, "three", "eng-GB", false ); + $handler->publishUrlAliasForLocation( 316, 315, "drei", "ger-DE", false ); + + $urlAlias = $handler->lookup( $url ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $locationId, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @group publish + */ + public function testPublishUrlAliasForLocationSameAliasForMultipleLanguages() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR", false ); + $urlAlias1 = $handler->lookup( "jedan" ); + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "eng-GB", false ); + $urlAlias2 = $handler->lookup( "jedan" ); + + self::assertEquals( 2, $this->countRows() ); + + foreach ( $urlAlias2 as $propertyName => $propertyValue ) + { + if ( $propertyName === "languageCodes" ) + { + self::assertEquals( + array( "cro-HR", "eng-GB" ), + $urlAlias2->languageCodes + ); + } + else if ( $propertyName === "pathData" ) + { + self::assertEquals( + array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "jedan" + ) + ), + ), + $urlAlias2->pathData + ); + } + else + { + self::assertEquals( + $urlAlias1->$propertyName, + $urlAlias2->$propertyName + ); + } + } + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @group publish + */ + public function testPublishUrlAliasForLocationDowngradesOldEntryToHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR", false ); + $handler->publishUrlAliasForLocation( 314, 2, "dva", "cro-HR", true ); + + self::assertEquals( 3, $this->countRows() ); + + $newUrlAlias = $handler->lookup( "dva" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "0-c67ed9a09ab136fae610b6a087d82e21", + "type" => 0, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( + "cro-HR" => "dva" + ) + ) + ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $newUrlAlias + ); + + $historyUrlAlias = $handler->lookup( "jedan" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "0-6896260129051a949051c3847c34466f", + "type" => 0, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan" + ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + $historyUrlAlias + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @depends testPublishUrlAliasForLocationSameAliasForMultipleLanguages + * @group publish + * @group downgrade + */ + public function testPublishUrlAliasForLocationDowngradesOldEntryRemovesLanguage() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR" ); + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "eng-GB" ); + $handler->publishUrlAliasForLocation( 314, 2, "dva", "eng-GB" ); + + self::assertEquals( 3, $this->countRows() ); + + $urlAlias = $handler->lookup( "dva" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-c67ed9a09ab136fae610b6a087d82e21", + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "dva", + ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + + $downgradedUrlAlias = $handler->lookup( "jedan" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-6896260129051a949051c3847c34466f", + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "dva", + ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $downgradedUrlAlias + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @depends testPublishUrlAliasForLocationDowngradesOldEntryToHistory + * @group publish + */ + public function testPublishUrlAliasForLocationReusesHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR" ); + $urlAlias = $handler->lookup( "jedan" ); + $handler->publishUrlAliasForLocation( 314, 2, "dva", "cro-HR" ); + $countBeforeReusing = $this->countRows(); + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR" ); + $urlAliasReusesHistory = $handler->lookup( "jedan" ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + + self::assertEquals( + $urlAlias, + $urlAliasReusesHistory + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @depends testPublishUrlAliasForLocationDowngradesOldEntryToHistory + * @group publish + */ + public function testPublishUrlAliasForLocationReusesHistoryOfDifferentLanguage() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $handler->publishUrlAliasForLocation( 314, 2, "jedan", "cro-HR" ); + $handler->publishUrlAliasForLocation( 314, 2, "one-history", "eng-GB" ); + $handler->publishUrlAliasForLocation( 314, 2, "one-new", "eng-GB" ); + $countBeforeReusing = $this->countRows(); + $handler->publishUrlAliasForLocation( 314, 2, "one-history", "cro-HR" ); + $urlAliasReusesHistory = $handler->lookup( "one-history" ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "0-" . md5( "one-history" ), + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "one-history", + "eng-GB" => "one-new", + ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAliasReusesHistory + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @group publish + */ + public function testPublishUrlAliasForLocationReusesCustomAlias() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $handler->publishUrlAliasForLocation( 314, 2, "custom-hello", "eng-GB", false ); + $urlAlias = $handler->lookup( "custom-hello" ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + self::assertFalse( $urlAlias->isCustom ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + */ + public function testPublishUrlAliasForLocationReusingNopElement() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $virtualUrlAlias = $handler->lookup( "nop-element/search" ); + $handler->publishUrlAliasForLocation( 315, 2, "nop-element", "eng-GB", false ); + $publishedLocationUrlAlias = $handler->lookup( "nop-element" ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $publishedLocationUrlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-de55c2fff721217cc4cb67b58dc35f85", + "type" => UrlAlias::LOCATION, + "destination" => 315, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "nop-element" ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $publishedLocationUrlAlias + ); + + $virtualUrlAliasReloaded = $handler->lookup( "nop-element/search" ); + foreach ( $virtualUrlAliasReloaded as $propertyName => $propertyValue ) + { + if ( $propertyName === "pathData" ) + { + self::assertEquals( + array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "nop-element" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "search" ) + ), + ), + $virtualUrlAliasReloaded->pathData + ); + } + else + { + self::assertEquals( + $virtualUrlAlias->$propertyName, + $virtualUrlAliasReloaded->$propertyName + ); + } + } + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @depends testPublishUrlAliasForLocationReusingNopElement + */ + public function testPublishUrlAliasForLocationReusingNopElementChangesCustomPath() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $virtualUrlAlias = $handler->lookup( "nop-element/search" ); + $handler->publishUrlAliasForLocation( 315, 2, "nop-element", "eng-GB", false ); + $handler->publishUrlAliasForLocation( 315, 2, "nop-element-renamed", "eng-GB", false ); + $virtualUrlAliasChanged = $handler->lookup( "nop-element-renamed/search" ); + + self::assertEquals( + $countBeforeReusing + 1, + $this->countRows() + ); + + foreach ( $virtualUrlAliasChanged as $propertyName => $propertyValue ) + { + if ( $propertyName === "pathData" ) + { + self::assertEquals( + array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "nop-element-renamed" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "search" ) + ) + ), + $virtualUrlAliasChanged->pathData + ); + } + else + { + self::assertEquals( + $virtualUrlAlias->$propertyName, + $virtualUrlAliasChanged->$propertyName + ); + } + } + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @todo document + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + * @depends testPublishUrlAliasForLocation + * @depends testPublishUrlAliasForLocationReusingNopElementChangesCustomPath + */ + public function testPublishUrlAliasForLocationReusingNopElementChangesCustomPathAndCreatesHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $handler->publishUrlAliasForLocation( 315, 2, "nop-element", "eng-GB", false ); + $handler->publishUrlAliasForLocation( 315, 2, "nop-element-renamed", "eng-GB", false ); + + $customUrlAliasChanged = $handler->lookup( "nop-element-renamed/search" ); + $customUrlAliasHistory = $handler->lookup( "nop-element/search" ); + + self::assertTrue( $customUrlAliasHistory->isHistory ); + $customUrlAliasHistory->isHistory = false; + self::assertEquals( + $customUrlAliasChanged, + $customUrlAliasHistory + ); + } + + /** + * Test for the publishUrlAliasForLocation() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::publishUrlAliasForLocation + */ + public function testPublishUrlAliasForLocationUpdatesLocationPathIdentificationString() + { + $handler = $this->getHandler(); + $locationGateway = $this->getLocationGateway(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + // Publishes the alias indicating that language is main, triggering updating of path_identification_string + $handler->publishUrlAliasForLocation( 316, 315, "TEST TEST TEST", "eng-GB", false, true ); + + $locationData = $locationGateway->getBasicNodeData( 316 ); + + self::assertEquals( "path314/path315/test_test_test", $locationData["path_identification_string"] ); + } + + /** + * Test for the createCustomUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createCustomUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAliasBehaviour() + { + $handlerMock = $this->getPartlyMockedHandler( array( "createUrlAlias" ) ); + + $handlerMock->expects( + $this->once() + )->method( + "createUrlAlias" + )->with( + $this->equalTo( "eznode:1" ), + $this->equalTo( "path" ), + $this->equalTo( false ), + $this->equalTo( null ), + $this->equalTo( false ) + )->will( + $this->returnValue( + new UrlAlias() + ) + ); + + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", + $handlerMock->createCustomUrlAlias( 1, "path" ) + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createGlobalUrlAlias + * @group create + * @group global + */ + public function testCreateGlobalUrlAliasBehaviour() + { + $handlerMock = $this->getPartlyMockedHandler( array( "createUrlAlias" ) ); + + $handlerMock->expects( + $this->once() + )->method( + "createUrlAlias" + )->with( + $this->equalTo( "module/module" ), + $this->equalTo( "path" ), + $this->equalTo( false ), + $this->equalTo( null ), + $this->equalTo( false ) + )->will( + $this->returnValue( + new UrlAlias() + ) + ); + + $this->assertInstanceOf( + "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", + $handlerMock->createGlobalUrlAlias( "module/module", "path" ) + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAlias() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $path = "custom-location-alias"; + $customUrlAlias = $handler->createCustomUrlAlias( + 314, + $path, + false, + "cro-HR", + false + ); + + self::assertEquals( 2, $this->countRows() ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-" . md5( $path ), + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => true, + "forward" => false + ) + ), + $customUrlAlias + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + * @todo pathData + */ + public function testCreatedCustomUrlAliasIsLoadable() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $path = "custom-location-alias"; + $customUrlAlias = $handler->createCustomUrlAlias( + 314, + $path, + false, + "cro-HR", + false + ); + $loadedCustomUrlAlias = $handler->lookup( $path ); + + self::assertEquals( 2, $this->countRows() ); + + foreach ( $loadedCustomUrlAlias as $propertyName => $propertyValue ) + { + if ( $propertyName === "pathData" ) + { + self::assertEquals( + array( + array( + "always-available" => false, + "translations" => array( "cro-HR" => $path ) + ), + ), + $loadedCustomUrlAlias->$propertyName + ); + } + else + { + self::assertEquals( + $customUrlAlias->$propertyName, + $loadedCustomUrlAlias->$propertyName + ); + } + } + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAliasWithNopElement() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/publish_base.php" ); + + $path = "ribar/palunko"; + $customUrlAlias = $handler->createCustomUrlAlias( + 314, + $path, + false, + "cro-HR", + true + ); + + self::assertEquals( 3, $this->countRows() ); + self::assertEquals( + new UrlAlias( + array( + "id" => "2-" . md5( "palunko" ), + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => false + ) + ), + $customUrlAlias + ); + + return $handler; + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @depends testCreateCustomUrlAliasWithNopElement + * @group create + * @group custom + */ + public function testCreateUrlAliasWithNopElementCreatesValidNopElement( Handler $handler ) + { + $url = "ribar"; + $urlAlias = $handler->lookup( $url ); + + $this->assertVirtualUrlAliasValid( + $urlAlias, + "0-" . md5( $url ) + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAliasReusesHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $handler->createCustomUrlAlias( + 314, + "history-hello", + true, + "eng-GB", + true + ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-da94285592c46d4396d3ca6904a4aa8f", + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( "eng-GB" => "history-hello" ) + ) + ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => true + ) + ), + $handler->lookup( "history-hello" ) + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAliasReusesHistoryOfDifferentLanguage() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $handler->createCustomUrlAlias( + 314, + "history-hello", + true, + "cro-HR", + true + ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-da94285592c46d4396d3ca6904a4aa8f", + "type" => UrlAlias::LOCATION, + "destination" => 314, + "languageCodes" => array( "cro-HR" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( "cro-HR" => "history-hello" ) + ) + ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => true + ) + ), + $handler->lookup( "history-hello" ) + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAliasReusesNopElement() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $handler->createCustomUrlAlias( + 314, + "nop-element", + true, + "cro-HR", + true + ); + + self::assertEquals( + $countBeforeReusing, + $this->countRows() + ); + + // Check that custom alias whose nop element was reused still works as expected + self::assertEquals( + new UrlAlias( + array( + "id" => "2-06a943c59f33a34bb5924aaf72cd2995", + "type" => UrlAlias::RESOURCE, + "destination" => "content/search", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => true, + "translations" => array( "cro-HR" => "nop-element" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "search" ) + ) + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => true, + "forward" => false + ) + ), + $handler->lookup( "nop-element/search" ) + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::createUrlAlias + * @group create + * @group custom + */ + public function testCreateCustomUrlAliasReusesLocationElement() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_reusing.php" ); + + $countBeforeReusing = $this->countRows(); + $locationUrlAlias = $handler->lookup( "autogenerated-hello" ); + $handler->createCustomUrlAlias( + 315, + "autogenerated-hello/custom-location-alias-for-315", + true, + "cro-HR", + true + ); + + self::assertEquals( + $countBeforeReusing + 1, + $this->countRows() + ); + + // Check that location alias still works as expected + self::assertEquals( + $locationUrlAlias, + $handler->lookup( "autogenerated-hello" ) + ); + } + + /** + * Test for the listGlobalURLAliases() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::listGlobalURLAliases + * @depends testLookupResourceUrlAlias + */ + public function testListGlobalURLAliases() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $globalAliasList = $handler->listGlobalURLAliases(); + + self::assertEquals( + array( + $handler->lookup( "is-alive" ), + $handler->lookup( "is-alive/then/search" ), + $handler->lookup( "nop-element/search" ), + ), + $globalAliasList + ); + } + + /** + * Test for the listGlobalURLAliases() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::listGlobalURLAliases + * @depends testLookupResourceUrlAlias + */ + public function testListGlobalURLAliasesWithLanguageCode() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $globalAliasList = $handler->listGlobalURLAliases( "eng-GB" ); + + self::assertEquals( + array( + $handler->lookup( "is-alive" ), + $handler->lookup( "nop-element/search" ), + ), + $globalAliasList + ); + } + + /** + * Test for the listGlobalURLAliases() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::listGlobalURLAliases + * @depends testLookupResourceUrlAlias + */ + public function testListGlobalURLAliasesWithOffset() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $globalAliasList = $handler->listGlobalURLAliases( null, 2 ); + + self::assertEquals( + array( + $handler->lookup( "nop-element/search" ), + ), + $globalAliasList + ); + } + + /** + * Test for the listGlobalURLAliases() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::listGlobalURLAliases + * @depends testLookupResourceUrlAlias + */ + public function testListGlobalURLAliasesWithOffsetAndLimit() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $globalAliasList = $handler->listGlobalURLAliases( null, 1, 1 ); + + self::assertEquals( + array( + $handler->lookup( "is-alive/then/search" ), + ), + $globalAliasList + ); + } + + /** + * Test for the locationDeleted() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationDeleted + */ + public function testLocationDeleted() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $countBeforeDeleting = $this->countRows(); + + $handler->locationDeleted( 315 ); + + self::assertEquals( + $countBeforeDeleting, + $this->countRows() + ); + + self::assertEmpty( + $handler->listURLAliasesForLocation( 315 ) + ); + + $virtualAliasesData = array( + array( "jedan/dva", "2-c67ed9a09ab136fae610b6a087d82e21" ), + array( "jedan/two", "2-b8a9f715dbb64fd5c56e7783c6820a61" ), + array( "jedan/dva/tri", "3-d2cfe69af2d64330670e08efb2c86df7" ), + array( "jedan/dva/three", "3-35d6d33467aae9a2e3dccb4b6b027878" ), + array( "jedan/dva/drei", "3-1d8d2fd0a99802b89eb356a86e029d25" ), + array( "jedan/dva/tri-history", "3-5f46413bb0ba5998caef84ab1ea590e1" ), + ); + foreach ( $virtualAliasesData as $virtualAliasData ) + { + $this->assertVirtualUrlAliasValid( + $handler->lookup( $virtualAliasData[0] ), + $virtualAliasData[1] + ); + } + } + + /** + * Test for the locationDeleted() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationDeleted + */ + public function testLocationDeletedRemovesCustomAliases() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_custom.php" ); + + $countBeforeDeleting = $this->countRows(); + + $handler->locationDeleted( 314 ); + + self::assertEquals( + $countBeforeDeleting, + $this->countRows() + ); + + self::assertEmpty( $handler->listURLAliasesForLocation( 314 ) ); + + self::assertEmpty( $handler->listURLAliasesForLocation( 314, true ) ); + + $this->assertVirtualUrlAliasValid( + $handler->lookup( "autogenerated-hello" ), + "0-2eb35041e168cb62fe790b7555a0e90d" + ); + + $this->assertVirtualUrlAliasValid( + $handler->lookup( "hello" ), + "0-5d41402abc4b2a76b9719d911017c592" + ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + */ + public function testLocationMovedHistorize() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $urlAlias = $handler->lookup( "move-this" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-" . md5( "move-this" ), + "type" => UrlAlias::LOCATION, + "destination" => "4", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + */ + public function testLocationMovedHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $urlAlias = $handler->lookup( "move-this-history" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "0-" . md5( "move-this-history" ), + "type" => UrlAlias::LOCATION, + "destination" => "4", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this-history" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + */ + public function testLocationMovedHistorySubtree() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $urlAlias = $handler->lookup( "move-this/sub1/sub2" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "5-" . md5( "sub2" ), + "type" => UrlAlias::LOCATION, + "destination" => "6", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub1" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub2" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + */ + public function testLocationMovedReparent() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $urlAlias = $handler->lookup( "move-here/move-this/sub1" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "9-" . md5( "sub1" ), + "type" => UrlAlias::LOCATION, + "destination" => "5", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-here" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub1" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLocationMovedReparentHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $handler->lookup( "move-here/move-this-history" ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + */ + public function testLocationMovedReparentSubtree() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $urlAlias = $handler->lookup( "move-here/move-this/sub1/sub2" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "5-" . md5( "sub2" ), + "type" => UrlAlias::LOCATION, + "destination" => "6", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-here" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub1" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub2" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the locationMoved() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationMoved + */ + public function testLocationMovedReparentSubtreeHistory() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_move.php" ); + + $handler->publishUrlAliasForLocation( 4, 3, "move-this", "eng-GB", false ); + $handler->locationMoved( 4, 2, 3 ); + + $urlAlias = $handler->lookup( "move-here/move-this/sub1/sub2-history" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "5-" . md5( "sub2-history" ), + "type" => UrlAlias::LOCATION, + "destination" => "6", + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-here" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub1" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub2-history" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the locationCopied() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationCopied + */ + public function testLocationCopiedCopiedLocationAliasIsValid() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_copy.php" ); + + $urlAlias = $handler->lookup( "move-this" ); + + $handler->locationCopied( 4, 400, 3 ); + + self::assertEquals( + $urlAlias, + $handler->lookup( "move-this" ) + ); + } + + /** + * Test for the locationCopied() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationCopied + * + */ + public function testLocationCopiedCopiedSubtreeIsValid() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_copy.php" ); + + $urlAlias = $handler->lookup( "move-this/sub1/sub2" ); + + $handler->locationCopied( 4, 400, 3 ); + + self::assertEquals( + $urlAlias, + $handler->lookup( "move-this/sub1/sub2" ) + ); + } + + /** + * Test for the locationCopied() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationCopied + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLocationCopiedHistoryNotCopied() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_copy.php" ); + + $handler->locationCopied( 4, 400, 3 ); + + $handler->lookup( "move-here/move-this-history" ); + } + + /** + * Test for the locationCopied() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationCopied + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLocationCopiedSubtreeHistoryNotCopied() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_copy.php" ); + + $handler->locationCopied( 4, 400, 3 ); + + $handler->lookup( "move-here/move-this/sub1/sub2-history" ); + } + + /** + * Test for the locationCopied() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::locationCopied + */ + public function testLocationCopiedSubtree() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_copy.php" ); + + $countBeforeCopying = $this->countRows(); + + $handler->locationCopied( 4, 400, 3 ); + + self::assertEquals( + $countBeforeCopying + 2, + $this->countRows() + ); + + $urlAlias = $handler->lookup( "move-here/move-this/sub1/sub2" ); + self::assertEquals( + new UrlAlias( + array( + "id" => "10-" . md5( "sub2" ), + "type" => UrlAlias::LOCATION, + "destination" => 600, + "languageCodes" => array( "eng-GB" ), + "pathData" => array( + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-here" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "move-this" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub1" ) + ), + array( + "always-available" => false, + "translations" => array( "eng-GB" => "sub2" ) + ), + ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the loadUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::loadUrlAlias + * @dataProvider providerForTestLookupLocationMultipleLanguages + */ + public function testLoadAutogeneratedUrlAlias( + $url, + array $pathData, + array $languageCodes, + $alwaysAvailable, + $locationId, + $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_multilang.php" ); + + $urlAlias = $handler->loadUrlAlias( $id ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::LOCATION, + "destination" => $locationId, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => false, + "forward" => false + ) + ), + $urlAlias + ); + } + + /** + * Test for the loadUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::loadUrlAlias + * @dataProvider providerForTestLookupResourceUrlAlias + */ + public function testLoadResourceUrlAlias( + $url, + $pathData, + array $languageCodes, + $forward, + $alwaysAvailable, + $destination, + $id + ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_resource.php" ); + + $urlAlias = $handler->loadUrlAlias( $id ); + + self::assertInstanceOf( "eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias", $urlAlias ); + self::assertEquals( + new UrlAlias( + array( + "id" => $id, + "type" => UrlAlias::RESOURCE, + "destination" => $destination, + "languageCodes" => $languageCodes, + "pathData" => $pathData, + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forward + ) + ), + $urlAlias + ); + } + + /** + * Test for the loadUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::loadUrlAlias + * @dataProvider providerForTestLookupVirtualUrlAlias + */ + public function testLoadVirtualUrlAlias( $url, $id ) + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location_custom.php" ); + + $urlAlias = $handler->loadUrlAlias( $id ); + + $this->assertVirtualUrlAliasValid( $urlAlias, $id ); + } + + protected function getHistoryAlias() + { + return new UrlAlias( + array( + "id" => "3-5f46413bb0ba5998caef84ab1ea590e1", + "type" => UrlAlias::LOCATION, + "destination" => "316", + "pathData" => array( + array( + "always-available" => true, + "translations" => array( "cro-HR" => "jedan" ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ), + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri-history", + ) + ), + ), + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + "isHistory" => true, + "isCustom" => false, + "forward" => false, + ) + ); + } + + /** + * Test for the loadUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::loadUrlAlias + */ + public function testLoadHistoryUrlAlias() + { + $handler = $this->getHandler(); + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlaliases_location.php" ); + + $historyAlias = $this->getHistoryAlias(); + $urlAlias = $handler->loadUrlAlias( $historyAlias->id ); + + self::assertEquals( + $historyAlias, + $urlAlias + ); + } + + /** + * Test for the loadUrlAlias() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler::loadUrlAlias + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadUrlAliasThrowsNotFoundException() + { + $handler = $this->getHandler(); + + $handler->loadUrlAlias( "non-existent" ); + } + + /** + * @return int + */ + protected function countRows() + { + /** @var \ezcQuerySelect $query */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + $query->expr->count( "*" ) + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return (int)$statement->fetchColumn(); + } + + /** + * @return int + */ + protected function dump() + { + /** @var \ezcQuerySelect $query */ + $query = $this->dbHandler->createSelectQuery(); + $query->select( + "*" + )->from( + $this->dbHandler->quoteTable( "ezurlalias_ml" ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + var_dump( $statement->fetchAll( \PDO::FETCH_ASSOC ) ); + } + + /** + * @var \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected $dbHandler; + + /** + * @var \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway + */ + protected $locationGateway; + + /** + * @param array $methods + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartlyMockedHandler( array $methods ) + { + $mock = $this->getMock( + "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\UrlAlias\\Handler", + $methods, + array( + self::getMock( "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\UrlAlias\\Gateway" ), + self::getMock( + "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\UrlAlias\\Mapper", + array(), + array(), + '', + false + ), + self::getMock( "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Gateway" ), + self::getMock( + "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Language\\Handler", + array(), + array(), + '', + false + ), + self::getMock( + "eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Search\\TransformationProcessor\\DefinitionBased", + array(), + array(), + '', + false + ) + ) + ); + + return $mock; + } + + /** + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Handler + */ + protected function getHandler() + { + $this->dbHandler = $this->getDatabaseHandler(); + $languageHandler = new LanguageHandler( + new LanguageGateway( + $this->getDatabaseHandler() + ), + new LanguageMapper() + ); + $languageMaskGenerator = new LanguageMaskGenerator( $languageHandler ); + $gateway = new EzcDatabase( + $this->dbHandler, + $languageMaskGenerator + ); + $mapper = new Mapper( $languageMaskGenerator ); + + return new Handler( + $gateway, + $mapper, + $this->getLocationGateway(), + $languageHandler, + $this->getProcessor() + ); + } + + /** + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Location\Gateway + */ + protected function getLocationGateway() + { + if ( !isset( $this->dbHandler) ) + { + $this->dbHandler = $this->getDatabaseHandler(); + } + + if ( !isset( $this->locationGateway ) ) + { + $this->locationGateway = new EzcDatabaseLocation( $this->dbHandler ); + } + + return $this->locationGateway; + } + + /** + * @return \eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor + */ + public function getProcessor() + { + $rules = array(); + foreach ( glob( __DIR__ . '/_fixtures/transformations/*.tr' ) as $file ) + { + $rules[] = str_replace( self::getInstallationDir(), '', $file ); + } + + return new DefinitionBased( + new Parser( self::getInstallationDir() ), + new PcreCompiler( new Utf8Converter() ), + $rules + ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/UrlAliasMapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/UrlAliasMapperTest.php new file mode 100644 index 0000000..be3d4a7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/UrlAliasMapperTest.php @@ -0,0 +1,256 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlAliasMapperTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlAlias; + +use eZ\Publish\Core\Persistence\Legacy\Tests\Content\LanguageAwareTestCase; +use eZ\Publish\SPI\Persistence\Content\UrlAlias; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper; +use eZ\Publish\Core\Persistence\Legacy\Content\Language\MaskGenerator as LanguageMaskGenerator; + +/** + * Test case for UrlAliasMapper + */ +class UrlAliasMapperTest extends LanguageAwareTestCase +{ + protected $fixture = array( + 0 => array( + "action" => "eznode:314", + "parent" => "1", + "text_md5" => "f97c5d29941bfb1b2fdab0874906ab82", + "raw_path_data" => array( + 0 => array( + array( + "lang_mask" => 2, + "text" => "root_us" + ), + array( + "lang_mask" => 4, + "text" => "root_gb" + ) + ), + 1 => array( + array( + "lang_mask" => 4, + "text" => "one" + ) + ) + ), + "lang_mask" => 5, + "is_original" => "1", + "is_alias" => "1", + "alias_redirects" => "0", + ), + 1 => array( + "action" => "eznode:314", + "parent" => "2", + "text_md5" => "b8a9f715dbb64fd5c56e7783c6820a61", + "raw_path_data" => array( + 0 => array( + array( + "lang_mask" => 3, + "text" => "two" + ), + ), + ), + "lang_mask" => 3, + "is_original" => "0", + "is_alias" => "0", + "alias_redirects" => "1", + ), + 2 => array( + "action" => "module:content/search", + "parent" => "0", + "text_md5" => "35d6d33467aae9a2e3dccb4b6b027878", + "raw_path_data" => array( + 0 => array( + array( + "lang_mask" => 6, + "text" => "three" + ), + ), + ), + "lang_mask" => 6, + "is_original" => "1", + "is_alias" => "1", + "alias_redirects" => "1", + ), + 3 => array( + "action" => "nop:", + "parent" => "3", + "text_md5" => "8cbad96aced40b3838dd9f07f6ef5772", + "raw_path_data" => array( + 0 => array( + array( + "lang_mask" => 1, + "text" => "four" + ), + ), + ), + "lang_mask" => 1, + "is_original" => "0", + "is_alias" => "0", + "alias_redirects" => "1", + ), + ); + + protected function getExpectation() + { + return array( + 0 => new UrlAlias( + array( + "id" => "1-f97c5d29941bfb1b2fdab0874906ab82", + "type" => UrlAlias::LOCATION, + "destination" => 314, + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "eng-US" => "root_us", + "eng-GB" => "root_gb", + ), + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "one", + ), + ), + ), + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => false + ) + ), + 1 => new UrlAlias( + array( + "id" => "2-b8a9f715dbb64fd5c56e7783c6820a61", + "type" => UrlAlias::LOCATION, + "destination" => 314, + "pathData" => array( + array( + "always-available" => true, + "translations" => array( + "eng-US" => "two", + ), + ), + ), + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + 2 => new UrlAlias( + array( + "id" => "0-35d6d33467aae9a2e3dccb4b6b027878", + "type" => UrlAlias::RESOURCE, + "destination" => "content/search", + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "eng-US" => "three", + "eng-GB" => "three", + ), + ), + ), + "languageCodes" => array( "eng-US", "eng-GB" ), + "alwaysAvailable" => false, + "isHistory" => false, + "isCustom" => true, + "forward" => true + ) + ), + 3 => new UrlAlias( + array( + "id" => "3-8cbad96aced40b3838dd9f07f6ef5772", + "type" => UrlAlias::VIRTUAL, + "destination" => null, + "pathData" => array( + array( + "always-available" => true, + "translations" => array( + "always-available" => "four", + ), + ), + ), + "languageCodes" => array(), + "alwaysAvailable" => true, + "isHistory" => true, + "isCustom" => false, + "forward" => false + ) + ), + ); + } + + public function providerForTestExtractUrlAliasFromData() + { + return array( array( 0 ), array( 1 ), array( 2 ), array( 3 ) ); + } + + /** + * Test for the extractUrlAliasFromData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper::extractUrlAliasFromData + * @dataProvider providerForTestExtractUrlAliasFromData + */ + public function testExtractUrlAliasFromData( $index ) + { + $mapper = $this->getMapper(); + + $urlAlias = $mapper->extractUrlAliasFromData( $this->fixture[$index] ); + $expectation = $this->getExpectation(); + + self::assertEquals( + $expectation[$index], + $urlAlias + ); + } + + /** + * Test for the extractUrlAliasListFromData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper::extractUrlAliasListFromData + * @depends testExtractUrlAliasFromData + */ + public function testExtractUrlAliasListFromData() + { + $mapper = $this->getMapper(); + + self::assertEquals( + $this->getExpectation(), + $mapper->extractUrlAliasListFromData( $this->fixture ) + ); + } + + /** + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlAlias\Mapper + */ + protected function getMapper() + { + $languageHandler = $this->getLanguageHandler(); + $languageMaskGenerator = new LanguageMaskGenerator( $languageHandler ); + return new Mapper( $languageMaskGenerator ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/publish_base.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/publish_base.php new file mode 100644 index 0000000..5e05584 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/publish_base.php @@ -0,0 +1,87 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + 2 => array( + 'disabled' => 0, + 'id' => 8, + 'locale' => 'ger-DE', + 'name' => 'German' + ), + 3 => array( + 'disabled' => 0, + 'id' => 16, + 'locale' => 'kli-KR', + 'name' => 'Klingon (Kronos)' + ), + ), + 'ezcontentobject_tree' => array( + 0 => array( + 'node_id' => 1, + 'parent_node_id' => 1, + 'path_string' => '', + 'path_identification_string' => '', + 'remote_id' => '', + ), + 1 => array( + 'node_id' => 2, + 'parent_node_id' => 1, + 'path_string' => '', + 'path_identification_string' => '', + 'remote_id' => '', + ), + 2 => array( + 'node_id' => 314, + 'parent_node_id' => 2, + 'path_string' => '', + 'path_identification_string' => 'path314', + 'remote_id' => '', + ), + 3 => array( + 'node_id' => 315, + 'parent_node_id' => 314, + 'path_string' => '', + 'path_identification_string' => 'path314/path315', + 'remote_id' => '', + ), + 4 => array( + 'node_id' => 316, + 'parent_node_id' => 315, + 'path_string' => '', + 'path_identification_string' => 'path314/path315/path316', + 'remote_id' => '', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_copy.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_copy.php new file mode 100644 index 0000000..3e72557 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_copy.php @@ -0,0 +1,209 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:3', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '2', + 'parent' => '0', + 'text' => 'move-here', + 'text_md5' => '8c09d75fa9c06724b51b2f837107a5ca', + ), + 2 => array ( + 'action' => 'eznode:4', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '0', + 'text' => 'move-this', + 'text_md5' => '93dc83851ede7c440fe00c29e7487d1b', + ), + 4 => array ( + 'action' => 'eznode:4', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '0', + 'text' => 'move-this-history', + 'text_md5' => '869f933f715cc635b70923256fa04033', + ), + 5 => array ( + 'action' => 'eznode:5', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '5', + 'parent' => '3', + 'text' => 'sub1', + 'text_md5' => '1b52eb8ef2c1875cfdf3ffbe9e3c05da', + ), + 6 => array ( + 'action' => 'eznode:6', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '7', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '4', + 'link' => '6', + 'parent' => '5', + 'text' => 'sub2-history', + 'text_md5' => 'be302a8ff37091d2b3bc31f2b8f95207', + ), + 7 => array ( + 'action' => 'eznode:6', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '8', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '8', + 'parent' => '5', + 'text' => 'sub2', + 'text_md5' => '5fbef65269a99bddc2106251dd89b1dc', + ), + 8 => array ( + 'action' => 'eznode:400', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '9', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '9', + 'parent' => '2', + 'text' => 'move-this', + 'text_md5' => '93dc83851ede7c440fe00c29e7487d1b', + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + 5 => array ( + 'id' => '6', + ), + 6 => array ( + 'id' => '7', + ), + 7 => array ( + 'id' => '8', + ), + 8 => array ( + 'id' => '9', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), + 'ezcontentobject_tree' => array( + 0 => array( + 'node_id' => 1, + 'parent_node_id' => 1, + 'path_string' => '/1/', + 'remote_id' => '', + ), + 1 => array( + 'node_id' => 2, + 'parent_node_id' => 1, + 'path_string' => '/1/2/', + 'remote_id' => '', + ), + 2 => array( + 'node_id' => 3, + 'parent_node_id' => 2, + 'path_string' => '/1/2/3/', + 'remote_id' => '', + ), + 3 => array( + 'node_id' => 4, + 'parent_node_id' => 2, + 'path_string' => '/1/2/4/', + 'remote_id' => '', + ), + 4 => array( + 'node_id' => 5, + 'parent_node_id' => 4, + 'path_string' => '/1/2/4/5/', + 'remote_id' => '', + ), + 5 => array( + 'node_id' => 6, + 'parent_node_id' => 5, + 'path_string' => '/1/2/4/5/6/', + 'remote_id' => '', + ), + 6 => array( + 'node_id' => 400, + 'parent_node_id' => 3, + 'path_string' => '/1/2/3/400/', + 'remote_id' => '', + ), + 7 => array( + 'node_id' => 500, + 'parent_node_id' => 400, + 'path_string' => '/1/2/3/400/500/', + 'remote_id' => '', + ), + 8 => array( + 'node_id' => 600, + 'parent_node_id' => 500, + 'path_string' => '/1/2/3/400/500/600/', + 'remote_id' => '', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location.php new file mode 100644 index 0000000..7895eca --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location.php @@ -0,0 +1,154 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'jedan', + 'text_md5' => '6896260129051a949051c3847c34466f', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '2', + 'text' => 'two', + 'text_md5' => 'b8a9f715dbb64fd5c56e7783c6820a61', + ), + 3 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '3', + 'parent' => '2', + 'text' => 'dva', + 'text_md5' => 'c67ed9a09ab136fae610b6a087d82e21', + ), + 4 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '8', + 'link' => '4', + 'parent' => '3', + 'text' => 'drei', + 'text_md5' => '1d8d2fd0a99802b89eb356a86e029d25', + ), + 5 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '4', + 'parent' => '3', + 'text' => 'three', + 'text_md5' => '35d6d33467aae9a2e3dccb4b6b027878', + ), + 6 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '4', + 'parent' => '3', + 'text' => 'tri', + 'text_md5' => 'd2cfe69af2d64330670e08efb2c86df7', + ), + 7 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '4', + 'parent' => '3', + 'text' => 'tri-history', + 'text_md5' => '5f46413bb0ba5998caef84ab1ea590e1', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + 2 => array( + 'disabled' => 0, + 'id' => 8, + 'locale' => 'ger-DE', + 'name' => 'German' + ), + 3 => array( + 'disabled' => 0, + 'id' => 16, + 'locale' => 'kli-KR', + 'name' => 'Klingon (Kronos)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location_custom.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location_custom.php new file mode 100644 index 0000000..8ec231e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location_custom.php @@ -0,0 +1,214 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '5', + 'link' => '2', + 'parent' => '0', + 'text' => 'autogenerated-hello', + 'text_md5' => '2eb35041e168cb62fe790b7555a0e90d', + ), + 2 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '0', + 'text' => 'autogenerated-everyone', + 'text_md5' => 'ab383b12f6b706215a252d06ada52b20', + ), + 3 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '4', + 'parent' => '0', + 'text' => 'autogenerated-goodbye', + 'text_md5' => 'da37edc08656a56c3e65a0e3d1c07457', + ), + 4 => array ( + 'action' => 'eznode:317', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '5', + 'parent' => '0', + 'text' => 'autogenerated-ha-ha-ha', + 'text_md5' => '830ee0c223eca7f011dfa2e25318bb21', + ), + 5 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '6', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '6', + 'parent' => '0', + 'text' => 'hello', + 'text_md5' => '5d41402abc4b2a76b9719d911017c592', + ), + 6 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '7', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '7', + 'parent' => '6', + 'text' => 'everyone', + 'text_md5' => 'ed881bac6397ede33c0a285c9f50bb83', + ), + 7 => array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '8', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '8', + 'parent' => '6', + 'text' => 'and', + 'text_md5' => 'be5d5d37542d75f93a87094459f76678', + ), + 8 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '9', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '9', + 'parent' => '8', + 'text' => 'goodbye', + 'text_md5' => '69faab6268350295550de7d587bc323d', + ), + 9 => array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '10', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '10', + 'parent' => '0', + 'text' => 'well', + 'text_md5' => 'f9323f5b51fc23e30c10623bd38de6ff', + ), + 10 => array ( + 'action' => 'eznode:317', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '11', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '11', + 'parent' => '10', + 'text' => 'ha-ha-ha', + 'text_md5' => '17a197f4bbe127c368b889a67effd1b3', + ), + 11 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '12', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '5', + 'link' => '12', + 'parent' => '2', + 'text' => 'everybody', + 'text_md5' => '88150d7d17390010ba6222de68bfafb5', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + 5 => array ( + 'id' => '6', + ), + 6 => array ( + 'id' => '7', + ), + 7 => array ( + 'id' => '8', + ), + 8 => array ( + 'id' => '9', + ), + 9 => array ( + 'id' => '10', + ), + 10 => array ( + 'id' => '11', + ), + 11 => array ( + 'id' => '12', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location_multilang.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location_multilang.php new file mode 100644 index 0000000..4dd4ee1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_location_multilang.php @@ -0,0 +1,99 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'jedan', + 'text_md5' => '6896260129051a949051c3847c34466f', + ), + 3 => array ( + 'action' => 'eznode:315', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '6', + 'link' => '3', + 'parent' => '2', + 'text' => 'dva', + 'text_md5' => 'c67ed9a09ab136fae610b6a087d82e21', + ), + 4 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '4', + 'parent' => '3', + 'text' => 'three', + 'text_md5' => '35d6d33467aae9a2e3dccb4b6b027878', + ), + 5 => array ( + 'action' => 'eznode:316', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '4', + 'parent' => '3', + 'text' => 'tri', + 'text_md5' => 'd2cfe69af2d64330670e08efb2c86df7', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_move.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_move.php new file mode 100644 index 0000000..e893c69 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_move.php @@ -0,0 +1,137 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'eznode:3', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '2', + 'parent' => '0', + 'text' => 'move-here', + 'text_md5' => '8c09d75fa9c06724b51b2f837107a5ca', + ), + 2 => array ( + 'action' => 'eznode:4', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '0', + 'text' => 'move-this', + 'text_md5' => '93dc83851ede7c440fe00c29e7487d1b', + ), + 4 => array ( + 'action' => 'eznode:4', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '0', + 'text' => 'move-this-history', + 'text_md5' => '869f933f715cc635b70923256fa04033', + ), + 5 => array ( + 'action' => 'eznode:5', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '5', + 'parent' => '3', + 'text' => 'sub1', + 'text_md5' => '1b52eb8ef2c1875cfdf3ffbe9e3c05da', + ), + 6 => array ( + 'action' => 'eznode:6', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '7', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '4', + 'link' => '6', + 'parent' => '5', + 'text' => 'sub2-history', + 'text_md5' => 'be302a8ff37091d2b3bc31f2b8f95207', + ), + 7 => array ( + 'action' => 'eznode:6', + 'action_type' => 'eznode', + 'alias_redirects' => '0', + 'id' => '8', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '8', + 'parent' => '5', + 'text' => 'sub2', + 'text_md5' => '5fbef65269a99bddc2106251dd89b1dc', + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + 5 => array ( + 'id' => '6', + ), + 6 => array ( + 'id' => '7', + ), + 7 => array ( + 'id' => '8', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_resource.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_resource.php new file mode 100644 index 0000000..a5c42c9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_resource.php @@ -0,0 +1,138 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'module:ezinfo/isalive', + 'action_type' => 'module', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '5', + 'link' => '2', + 'parent' => '0', + 'text' => 'is-alive', + 'text_md5' => 'd003895fa282a14c8ec3eddf23ca4ca2', + ), + 2 => array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '3', + 'parent' => '2', + 'text' => 'then', + 'text_md5' => '0e5243d9965540f62aac19a985f3f33e', + ), + 3 => array ( + 'action' => 'module:content/search', + 'action_type' => 'module', + 'alias_redirects' => '0', + 'id' => '4', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '4', + 'parent' => '3', + 'text' => 'search', + 'text_md5' => '06a943c59f33a34bb5924aaf72cd2995', + ), + 4 => array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '5', + 'parent' => '0', + 'text' => 'nop-element', + 'text_md5' => 'de55c2fff721217cc4cb67b58dc35f85', + ), + 5 => array ( + 'action' => 'module:content/search', + 'action_type' => 'module', + 'alias_redirects' => '0', + 'id' => '6', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '6', + 'parent' => '5', + 'text' => 'search', + 'text_md5' => '06a943c59f33a34bb5924aaf72cd2995', + ), + ), + 'ezcontentobject_tree' => array( + 0 => array( + 'node_id' => 1, + 'parent_node_id' => 1, + 'path_string' => '', + 'remote_id' => '', + ), + 1 => array( + 'node_id' => 2, + 'parent_node_id' => 1, + 'path_string' => '', + 'remote_id' => '', + ), + 2 => array( + 'node_id' => 314, + 'parent_node_id' => 2, + 'path_string' => '', + 'remote_id' => '', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + 5 => array ( + 'id' => '6', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_reusing.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_reusing.php new file mode 100644 index 0000000..96d9f59 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlAlias/_fixtures/urlaliases_reusing.php @@ -0,0 +1,144 @@ +<?php + +return array ( + 'ezurlalias_ml' => array ( + 0 => array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 1 => array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '2', + 'parent' => '0', + 'text' => 'nop-element', + 'text_md5' => 'de55c2fff721217cc4cb67b58dc35f85', + ), + 2 => array ( + 'action' => 'module:content/search', + 'action_type' => 'module', + 'alias_redirects' => '0', + 'id' => '3', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '3', + 'parent' => '2', + 'text' => 'search', + 'text_md5' => '06a943c59f33a34bb5924aaf72cd2995', + ), + 3 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '4', + 'link' => '4', + 'parent' => '0', + 'text' => 'history-hello', + 'text_md5' => 'da94285592c46d4396d3ca6904a4aa8f', + ), + 4 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '4', + 'parent' => '0', + 'text' => 'autogenerated-hello', + 'text_md5' => '2eb35041e168cb62fe790b7555a0e90d', + ), + 5 => array ( + 'action' => 'eznode:314', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '6', + 'is_alias' => '1', + 'is_original' => '1', + 'lang_mask' => '4', + 'link' => '6', + 'parent' => '0', + 'text' => 'custom-hello', + 'text_md5' => 'c0254f50ddbeea89a6523d79c330cd57', + ), + ), + 'ezcontentobject_tree' => array( + 0 => array( + 'node_id' => 1, + 'parent_node_id' => 1, + 'path_string' => '', + 'remote_id' => '', + ), + 1 => array( + 'node_id' => 2, + 'parent_node_id' => 1, + 'path_string' => '', + 'remote_id' => '', + ), + 2 => array( + 'node_id' => 314, + 'parent_node_id' => 2, + 'path_string' => '', + 'remote_id' => '', + ), + 3 => array( + 'node_id' => 315, + 'parent_node_id' => 2, + 'path_string' => '', + 'remote_id' => '', + ), + ), + 'ezcontent_language' => array ( + 0 => array( + 'disabled' => 0, + 'id' => 2, + 'locale' => 'cro-HR', + 'name' => 'Croatian (Hrvatski)' + ), + 1 => array( + 'disabled' => 0, + 'id' => 4, + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)' + ), + ), + 'ezurlalias_ml_incr' => array ( + 0 => array ( + 'id' => '1', + ), + 1 => array ( + 'id' => '2', + ), + 2 => array ( + 'id' => '3', + ), + 3 => array ( + 'id' => '4', + ), + 4 => array ( + 'id' => '5', + ), + 5 => array ( + 'id' => '6', + ), + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/Gateway/EzcDatabaseTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/Gateway/EzcDatabaseTest.php new file mode 100644 index 0000000..59b6dc0 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/Gateway/EzcDatabaseTest.php @@ -0,0 +1,214 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlWildcard\Gateway\EzcDatabaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlWildcard\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase; +use eZ\Publish\SPI\Persistence\Content\UrlWildcard; + +/** + * Test case for eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase. + */ +class EzcDatabaseTest extends TestCase +{ + /** + * Database gateway to test. + * + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase + */ + protected $gateway; + + protected $fixtureData = array( + 0 => array( + 'id' => '1', + 'source_url' => 'developer/*', + 'destination_url' => 'dev/{1}', + 'type' => '2', + ), + 1 => array( + 'id' => '2', + 'source_url' => 'repository/*', + 'destination_url' => 'repo/{1}', + 'type' => '2', + ), + 2 => array( + 'id' => '3', + 'source_url' => 'information/*', + 'destination_url' => 'info/{1}', + 'type' => '2', + ), + ); + + /** + * Test for the __construct() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::__construct + */ + public function testConstructor() + { + $dbHandler = $this->getDatabaseHandler(); + $gateway = $this->getGateway(); + + $this->assertAttributeSame( + $dbHandler, + "dbHandler", + $gateway + ); + } + + /** + * Test for the loadUrlWildcardData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::loadUrlWildcardData + */ + public function testLoadUrlWildcardData() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlwildcards.php" ); + $gateway = $this->getGateway(); + + $row = $gateway->loadUrlWildcardData( 1 ); + + self::assertEquals( + $this->fixtureData[0], + $row + ); + } + + /** + * Test for the loadUrlWildcardsData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::loadUrlWildcardsData + */ + public function testLoadUrlWildcardsData() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlwildcards.php" ); + $gateway = $this->getGateway(); + + $rows = $gateway->loadUrlWildcardsData(); + + self::assertEquals( + $this->fixtureData, + $rows + ); + } + + /** + * Test for the loadUrlWildcardsData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::loadUrlWildcardsData + */ + public function testLoadUrlWildcardsDataWithOffset() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlwildcards.php" ); + $gateway = $this->getGateway(); + + $row = $gateway->loadUrlWildcardsData( 1 ); + + self::assertEquals( + array( + 0 => $this->fixtureData[1], + 1 => $this->fixtureData[2], + ), + $row + ); + } + + /** + * Test for the loadUrlWildcardsData() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::loadUrlWildcardsData + */ + public function testLoadUrlWildcardsDataWithOffsetAndLimit() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlwildcards.php" ); + $gateway = $this->getGateway(); + + $row = $gateway->loadUrlWildcardsData( 1, 1 ); + + self::assertEquals( + array( + 0 => $this->fixtureData[1], + ), + $row + ); + } + + /** + * Test for the insertUrlWildcard() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::insertUrlWildcard + * @depends testLoadUrlWildcardData + */ + public function testInsertUrlWildcard() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlwildcards.php" ); + $gateway = $this->getGateway(); + + $id = $gateway->insertUrlWildcard( + new UrlWildcard( + array( + "sourceUrl" => "/contact-information/*", + "destinationUrl" => "/contact/{1}", + "forward" => true, + ) + ) + ); + + self::assertEquals( + array( + "id" => $id, + "source_url" => "contact-information/*", + "destination_url" => "contact/{1}", + "type" => "1", + ), + $gateway->loadUrlWildcardData( $id ) + ); + } + + /** + * Test for the deleteUrlWildcard() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase::deleteUrlWildcard + * @depends testLoadUrlWildcardData + */ + public function testDeleteUrlWildcard() + { + $this->insertDatabaseFixture( __DIR__ . "/_fixtures/urlwildcards.php" ); + $gateway = $this->getGateway(); + + $gateway->deleteUrlWildcard( 1 ); + + self::assertEmpty( $gateway->loadUrlWildcardData( 1 ) ); + } + + /** + * Returns the EzcDatabase gateway to test + * + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase + */ + protected function getGateway() + { + if ( !isset( $this->gateway ) ) + { + $this->gateway = new EzcDatabase( $this->getDatabaseHandler() ); + } + return $this->gateway; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/Gateway/_fixtures/urlwildcards.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/Gateway/_fixtures/urlwildcards.php new file mode 100644 index 0000000..8a3d72b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/Gateway/_fixtures/urlwildcards.php @@ -0,0 +1,25 @@ +<?php + +return array ( + 'ezurlwildcard' => array ( + 0 => array ( + 'id' => '1', + 'source_url' => 'developer/*', + 'destination_url' => 'dev/{1}', + 'type' => '2', + ), + 1 => array ( + 'id' => '2', + 'source_url' => 'repository/*', + 'destination_url' => 'repo/{1}', + 'type' => '2', + ), + 2 => array ( + 'id' => '3', + 'source_url' => 'information/*', + 'destination_url' => 'info/{1}', + 'type' => '2', + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/UrlWildcardHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/UrlWildcardHandlerTest.php new file mode 100644 index 0000000..3704fa2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/UrlWildcardHandlerTest.php @@ -0,0 +1,260 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlWildcardHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlWildcard; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper; +use eZ\Publish\SPI\Persistence\Content\UrlWildcard; + +/** + * Test case for UrlWildcard Handler + */ +class UrlWildcardHandlerTest extends TestCase +{ + /** + * Test for the __construct() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::__construct + */ + public function testConstructor() + { + $handler = $this->getHandler(); + + self::assertAttributeSame( + $this->gateway, + 'gateway', + $handler + ); + self::assertAttributeSame( + $this->mapper, + 'mapper', + $handler + ); + } + + /** + * Test for the load() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::load + */ + public function testLoad() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $urlWildcard = $handler->load( 1 ); + + self::assertEquals( + new UrlWildcard( + array( + "id" => 1, + "sourceUrl" => "/developer/*", + "destinationUrl" => "/dev/{1}", + "forward" => false + ) + ), + $urlWildcard + ); + } + + /** + * Test for the load() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadThrowsNotFoundException() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $handler->load( 100 ); + } + + /** + * Test for the create() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::create + * @depends testLoad + */ + public function testCreate() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $urlWildcard = $handler->create( + "amber", + "pattern", + true + ); + + self::assertEquals( + new UrlWildcard( + array( + "id" => 4, + "sourceUrl" => "/amber", + "destinationUrl" => "/pattern", + "forward" => true + ) + ), + $urlWildcard + ); + + self::assertEquals( + $urlWildcard, + $handler->load( 4 ) + ); + } + + /** + * Test for the remove() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::remove + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @depends testLoad + */ + public function testRemove() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $handler->remove( 1 ); + $handler->load( 1 ); + } + + /** + * Test for the loadAll() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::loadAll + */ + public function testLoadAll() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $urlWildcards = $handler->loadAll(); + + self::assertEquals( + array( + new UrlWildcard( $this->fixtureData[0] ), + new UrlWildcard( $this->fixtureData[1] ), + new UrlWildcard( $this->fixtureData[2] ), + ), + $urlWildcards + ); + } + + /** + * Test for the loadAll() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::loadAll + */ + public function testLoadAllWithOffset() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $urlWildcards = $handler->loadAll( 2 ); + + self::assertEquals( + array( + new UrlWildcard( $this->fixtureData[2] ), + ), + $urlWildcards + ); + } + + /** + * Test for the loadAll() method. + * + * @covers \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler::loadAll + */ + public function testLoadAllWithOffsetAndLimit() + { + $this->insertDatabaseFixture( __DIR__ . "/Gateway/_fixtures/urlwildcards.php" ); + $handler = $this->getHandler(); + + $urlWildcards = $handler->loadAll( 1, 1 ); + + self::assertEquals( + array( + new UrlWildcard( $this->fixtureData[1] ), + ), + $urlWildcards + ); + } + + protected $fixtureData = array( + array( + "id" => 1, + "sourceUrl" => "/developer/*", + "destinationUrl" => "/dev/{1}", + "forward" => false + ), + array( + "id" => 2, + "sourceUrl" => "/repository/*", + "destinationUrl" => "/repo/{1}", + "forward" => false + ), + array( + "id" => 3, + "sourceUrl" => "/information/*", + "destinationUrl" => "/info/{1}", + "forward" => false + ) + ); + + /** + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Gateway\EzcDatabase + */ + protected $gateway; + + /** + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper + */ + protected $mapper; + + /** + * @var \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler + */ + protected $urlWildcardHandler; + + /** + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Handler + */ + protected function getHandler() + { + if ( !isset( $this->urlWildcardHandler ) ) + { + $this->gateway = new EzcDatabase( $this->getDatabaseHandler() ); + $this->mapper = new Mapper(); + + $this->urlWildcardHandler = new Handler( + $this->gateway, + $this->mapper + ); + } + + return $this->urlWildcardHandler; + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/UrlWildcardMapperTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/UrlWildcardMapperTest.php new file mode 100644 index 0000000..c2d3ccb --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/UrlWildcard/UrlWildcardMapperTest.php @@ -0,0 +1,144 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlWildcard\UrlWildcardMapperTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\Content\UrlWildcard; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper; +use eZ\Publish\SPI\Persistence\Content\UrlWildcard; + +/** + * Test case for UrlWildcard Mapper + */ +class UrlWildcardMapperTest extends TestCase +{ + /** + * Test for the createUrlWildcard() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper::createUrlWildcard + */ + public function testCreateUrlWildcard() + { + $mapper = $this->getMapper(); + + $urlWildcard = $mapper->createUrlWildcard( + "pancake/*", + "cake/{1}", + true + ); + + self::assertEquals( + new UrlWildcard( + array( + "id" => null, + "sourceUrl" => "/pancake/*", + "destinationUrl" => "/cake/{1}", + "forward" => true + ) + ), + $urlWildcard + ); + } + + /** + * Test for the extractUrlWildcardFromRow() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper::extractUrlWildcardFromRow + */ + public function testExtractUrlWildcardFromRow() + { + $mapper = $this->getMapper(); + $row = array( + 'id' => '42', + 'source_url' => 'faq/*', + 'destination_url' => '42', + 'type' => '1', + ); + + $urlWildcard = $mapper->extractUrlWildcardFromRow( $row ); + + self::assertEquals( + new UrlWildcard( + array( + "id" => 42, + "sourceUrl" => "/faq/*", + "destinationUrl" => "/42", + "forward" => true + ) + ), + $urlWildcard + ); + } + + /** + * Test for the extractUrlWildcardFromRow() method. + * + * @covers eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper::extractUrlWildcardFromRow + */ + public function testExtractUrlWildcardsFromRows() + { + $mapper = $this->getMapper(); + $rows = array( + array( + 'id' => '24', + 'source_url' => 'contact-information', + 'destination_url' => 'contact', + 'type' => '2', + ), + array( + 'id' => '42', + 'source_url' => 'faq/*', + 'destination_url' => '42', + 'type' => '1', + ) + ); + + $urlWildcards = $mapper->extractUrlWildcardsFromRows( $rows ); + + self::assertEquals( + array( + new UrlWildcard( + array( + "id" => 24, + "sourceUrl" => "/contact-information", + "destinationUrl" => "/contact", + "forward" => false + ) + ), + new UrlWildcard( + array( + "id" => 42, + "sourceUrl" => "/faq/*", + "destinationUrl" => "/42", + "forward" => true + ) + ) + ), + $urlWildcards + ); + } + + /** + * @return \eZ\Publish\Core\Persistence\Legacy\Content\UrlWildcard\Mapper + */ + protected function getMapper() + { + return new Mapper(); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/contentobjects.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/contentobjects.php new file mode 100644 index 0000000..ff986c3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/contentobjects.php @@ -0,0 +1,30540 @@ +<?php + +return array ( + 'ezcontentobject_attribute' => array ( + 0 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Main group', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Users', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 2 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous', + 'data_type_string' => 'ezstring', + 'id' => '19', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous', + 'version' => '2', + ), + 3 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '20', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '2', + ), + 4 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '21', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 5 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Guest accounts', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 6 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Members', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'members', + 'version' => '2', + ), + 7 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 8 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 9 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator users', + 'data_type_string' => 'ezstring', + 'id' => '24', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 10 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '25', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 11 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Editors', + 'data_type_string' => 'ezstring', + 'id' => '26', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 12 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '27', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 13 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '3', + ), + 14 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '4', + ), + 15 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '3', + ), + 16 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '4', + ), + 17 => array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 18 => array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 19 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Media', + 'data_type_string' => 'ezstring', + 'id' => '98', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 20 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '99', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 21 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous Users', + 'data_type_string' => 'ezstring', + 'id' => '100', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous users', + 'version' => '1', + ), + 22 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User group for the anonymous user', + 'data_type_string' => 'ezstring', + 'id' => '101', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user group for the anonymous user', + 'version' => '1', + ), + 23 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '103', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 24 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '105', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 25 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '109', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 26 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Setup', + 'data_type_string' => 'ezstring', + 'id' => '123', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'setup', + 'version' => '1', + ), + 27 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '124', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 28 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '125', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 29 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '126', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 30 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '128', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 31 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Images', + 'data_type_string' => 'ezstring', + 'id' => '142', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'images', + 'version' => '1', + ), + 32 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '143', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 33 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '144', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 34 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '145', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 35 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '146', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 36 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Files', + 'data_type_string' => 'ezstring', + 'id' => '147', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'files', + 'version' => '1', + ), + 37 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '148', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 38 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '149', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 39 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '150', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 40 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '151', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 41 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Multimedia', + 'data_type_string' => 'ezstring', + 'id' => '152', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'multimedia', + 'version' => '1', + ), + 42 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '153', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 43 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '154', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 44 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '155', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 45 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '156', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 46 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '159', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Common INI settings', + 'data_type_string' => 'ezstring', + 'id' => '157', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'common ini settings', + 'version' => '1', + ), + 47 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '160', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2/', + 'data_type_string' => 'ezinisetting', + 'id' => '158', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 48 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '161', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2', + 'data_type_string' => 'ezinisetting', + 'id' => '159', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 49 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '162', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 50 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '163', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 51 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '164', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 52 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '165', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 53 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '166', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 54 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '167', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 55 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '168', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 56 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '169', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=100;100', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 57 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '170', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=200;200', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 58 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '171', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=300;300', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 59 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '172', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Website Interface', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 60 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '173', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'author=eZ Systems +copyright=eZ Systems +description=Content Management System +keywords=cms, publish, e-commerce, content management, development framework', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 61 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '174', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Website-Interface1.png" suffix="png" basename="Website-Interface1" dirpath="var/ezwebin_site/storage/images/design/plain-site/172-2-eng-US" url="var/ezwebin_site/storage/images/design/plain-site/172-2-eng-US/Website-Interface1.png" original_filename="logo.png" mime_type="image/png" width="176" height="42" alternative_text="" alias_key="1293033771" timestamp="1311154215"><original attribute_id="172" attribute_version="2" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '172', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 62 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '175', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '0', + 'data_type_string' => 'ezpackage', + 'id' => '173', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '0', + 'version' => '2', + ), + 63 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '177', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'kn@ez.no', + 'data_type_string' => 'ezinisetting', + 'id' => '175', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 64 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '178', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'ezpublish/index.php', + 'data_type_string' => 'ezinisetting', + 'id' => '176', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 65 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '177', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 66 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 67 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 68 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezimage', + 'id' => '179', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 69 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 70 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 71 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Design', + 'data_type_string' => 'ezstring', + 'id' => '181', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'design', + 'version' => '1', + ), + 72 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '182', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 73 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '183', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 74 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '184', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 75 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '185', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 76 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '187', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 77 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '188', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 78 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '189', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 79 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '190', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 80 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '191', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 81 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '192', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 82 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '194', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 83 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '195', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 84 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '196', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 85 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '197', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 86 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '198', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 87 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '199', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 88 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Banners', + 'data_type_string' => 'ezstring', + 'id' => '200', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'banners', + 'version' => '1', + ), + 89 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '201', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 90 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'data_type_string' => 'ezxmltext', + 'id' => '202', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 91 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'data_type_string' => 'ezxmltext', + 'id' => '203', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 92 => array ( + 'attribute_original_id' => '204', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '204', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 93 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '205', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 94 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '206', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 95 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Communities)', + 'data_type_string' => 'ezstring', + 'id' => '207', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (communities)', + 'version' => '1', + ), + 96 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '208', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 97 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Communities.jpg" suffix="jpg" basename="Woman-Communities" dirpath="var/ezwebin_site/storage/images/media/banners/woman-communities/209-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-communities/209-1-eng-US/Woman-Communities.jpg" original_filename="84f1da4c.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Communities)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="209" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '209', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 98 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '210', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 99 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '211', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 100 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Frontpage)', + 'data_type_string' => 'ezstring', + 'id' => '212', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (frontpage)', + 'version' => '1', + ), + 101 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '213', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 102 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Frontpage.jpg" suffix="jpg" basename="Woman-Frontpage" dirpath="var/ezwebin_site/storage/images/media/banners/woman-frontpage/214-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-frontpage/214-1-eng-US/Woman-Frontpage.jpg" original_filename="83ea7f16.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Frontpage)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="214" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '214', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 103 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '215', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 104 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '216', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 105 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Products)', + 'data_type_string' => 'ezstring', + 'id' => '217', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (products)', + 'version' => '1', + ), + 106 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '218', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 107 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Products.jpg" suffix="jpg" basename="Woman-Products" dirpath="var/ezwebin_site/storage/images/media/banners/woman-products/219-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-products/219-1-eng-US/Woman-Products.jpg" original_filename="99bedbaa.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Products)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="219" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '219', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 108 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '220', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 109 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '60', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '221', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 110 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Partners)', + 'data_type_string' => 'ezstring', + 'id' => '222', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (partners)', + 'version' => '1', + ), + 111 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '223', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 112 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Partners.jpg" suffix="jpg" basename="Woman-Partners" dirpath="var/ezwebin_site/storage/images/media/banners/woman-partners/224-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-partners/224-1-eng-US/Woman-Partners.jpg" original_filename="24ec46f7.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Partners)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="224" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '224', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 113 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '225', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 114 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '61', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '226', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 115 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Pencils (Support)', + 'data_type_string' => 'ezstring', + 'id' => '227', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'pencils (support)', + 'version' => '1', + ), + 116 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '228', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 117 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Pencils-Support.jpg" suffix="jpg" basename="Pencils-Support" dirpath="var/ezwebin_site/storage/images/media/banners/pencils-support/229-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/pencils-support/229-1-eng-US/Pencils-Support.jpg" original_filename="50dbb211.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Pencils (Support)" alias_key="1293033771" timestamp="1311154173"><original attribute_id="229" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '229', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 118 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '230', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 119 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '62', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '231', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 120 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Training)', + 'data_type_string' => 'ezstring', + 'id' => '232', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (training)', + 'version' => '1', + ), + 121 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '233', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 122 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Training.jpg" suffix="jpg" basename="Woman-Training" dirpath="var/ezwebin_site/storage/images/media/banners/woman-training/234-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-training/234-1-eng-US/Woman-Training.jpg" original_filename="47966db1.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Training)" alias_key="1293033771" timestamp="1311154174"><original attribute_id="234" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '234', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 123 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '235', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 124 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '63', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '236', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 125 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '319', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Woman (Solutions)', + 'data_type_string' => 'ezstring', + 'id' => '237', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'woman (solutions)', + 'version' => '1', + ), + 126 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '320', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '238', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 127 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '321', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Woman-Solutions.jpg" suffix="jpg" basename="Woman-Solutions" dirpath="var/ezwebin_site/storage/images/media/banners/woman-solutions/239-1-eng-US" url="var/ezwebin_site/storage/images/media/banners/woman-solutions/239-1-eng-US/Woman-Solutions.jpg" original_filename="944390f8.jpg" mime_type="image/jpeg" width="764" height="197" alternative_text="Woman (Solutions)" alias_key="1293033771" timestamp="1311154174"><original attribute_id="239" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="764" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '239', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 128 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '322', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '240', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 129 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '323', + 'contentobject_id' => '64', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '241', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 130 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Home', + 'data_type_string' => 'ezstring', + 'id' => '242', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'home', + 'version' => '1', + ), + 131 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '243', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 132 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '244', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 133 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><line><embed class="highlighted_object" align="center" view="embed" size="medium" custom:offset="0" custom:limit="5" object_id="106"/><embed class="highlighted_object" align="center" view="embed" size="medium" custom:offset="0" custom:limit="5" object_id="107"/><embed class="horizontally_listed_sub_items" align="center" view="embed" size="medium" custom:offset="0" custom:limit="5" object_id="176"/></line><table class="default" width="100%" border="0"><tr><td/><td/></tr><tr><td xhtml:width="50%"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><custom name="factbox" custom:title="Documentation" custom:align="left"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_blank" url_id="23">Technical manual</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_blank" url_id="24">User manual</link></paragraph></li></ul></paragraph></custom></paragraph></td><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><custom name="quote" custom:align="right"><paragraph>If you want to create your own custom site on a solid framework, <link object_id="151">this CMS could be for you</link>".</paragraph></custom></paragraph></td></tr></table></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '245', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 134 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="vertically_listed_sub_items" view="embed" size="medium" custom:offset="0" custom:limit="9" object_id="131"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '246', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 135 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '247', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 136 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '65', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '248', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 137 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'rest_api', + 'data_type_string' => 'ezstring', + 'id' => '249', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'rest_api', + 'version' => '1', + ), + 138 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '250', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 139 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="rest_api.png" suffix="png" basename="rest_api" dirpath="var/ezwebin_site/storage/images/media/images/rest_api/251-1-eng-US" url="var/ezwebin_site/storage/images/media/images/rest_api/251-1-eng-US/rest_api.png" original_filename="4d710d81.png" mime_type="image/png" width="442" height="356" alternative_text="" alias_key="1293033771" timestamp="1311154174"><original attribute_id="251" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '251', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 140 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '66', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '252', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 141 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Products', + 'data_type_string' => 'ezstring', + 'id' => '253', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'products', + 'version' => '1', + ), + 142 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '60', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '254', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '60', + 'sort_key_string' => '', + 'version' => '1', + ), + 143 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><custom name="factbox" custom:title="Next steps"><paragraph>Vivamus suscipit. Praesent tincidunt adipiscing urna. Etiam ligula velit, tincidunt accumsan, feugiat sit amet, malesuada vel, tellus.</paragraph><paragraph><ol><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Mauris sed lectus vel + </paragraph></li><li><paragraph>Praesent pharetra + </paragraph></li></ol></paragraph></custom></paragraph><section><header>Products sheets</header><paragraph><ul><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Maecenas quam nisi + </paragraph></li></ul></paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '255', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 144 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><section><header>Products by Category</header><paragraph><table class="default" width="100%" border="0"><tr><td><paragraph><ul><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Mauris sed lectus vel + </paragraph></li><li><paragraph>Praesent pharetra + </paragraph></li><li><paragraph>Maecenas quam nisi + </paragraph></li><li><paragraph>Phasellus ut ante eu nunc + </paragraph></li></ul></paragraph></td><td><paragraph><ul><li><paragraph>Donec hendrerit + </paragraph></li><li><paragraph>Vivamus turpis + </paragraph></li><li><paragraph>Vestibulum laoreet erat id tellus + </paragraph></li><li><paragraph>Maecenas quam nisi + </paragraph></li></ul></paragraph></td></tr></table></paragraph><paragraph><custom name="separator"/></paragraph></section><section><header>Featured Products</header><paragraph><table class="default" border="0"><tr><td><paragraph><embed size="medium" align="center" object_id="71"/></paragraph></td><td><paragraph><embed size="medium" align="center" object_id="72"/></paragraph></td><td><paragraph><embed size="medium" align="center" object_id="73"/></paragraph></td></tr></table></paragraph></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '256', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 145 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '257', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 146 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '258', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 147 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '67', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '259', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 148 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Software', + 'data_type_string' => 'ezstring', + 'id' => '260', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'software', + 'version' => '1', + ), + 149 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '261', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 150 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '262', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 151 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '263', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 152 => array ( + 'attribute_original_id' => '264', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '264', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 153 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '265', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 154 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '68', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '266', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 155 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'OS Type I', + 'data_type_string' => 'ezstring', + 'id' => '267', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'os type i', + 'version' => '1', + ), + 156 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '268', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 157 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '269', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 158 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '270', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 159 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '69', + 'data_float' => '499', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '271', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '49900', + 'sort_key_string' => '', + 'version' => '1', + ), + 160 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="OS-Type-I.jpg" suffix="jpg" basename="OS-Type-I" dirpath="var/ezwebin_site/storage/images/products/software/os-type-i/272-1-eng-US" url="var/ezwebin_site/storage/images/products/software/os-type-i/272-1-eng-US/OS-Type-I.jpg" original_filename="5a7ae69c.jpg" mime_type="image/jpeg" width="148" height="116" alternative_text="OS Type I" alias_key="1293033771" timestamp="1311154175"><original attribute_id="272" attribute_version="1" attribute_language="eng-US"/><information Height="116" Width="148" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '272', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 161 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>OS Type I</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '273', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 162 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Type" priority="1" default_option_id=""><option id="1" option_id="1" value="Silver" additional_price="10.00"/><option id="2" option_id="2" value="Gold" additional_price="20.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '274', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 163 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '69', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '275', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 164 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Boxes', + 'data_type_string' => 'ezstring', + 'id' => '276', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'boxes', + 'version' => '1', + ), + 165 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '277', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 166 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '278', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 167 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '279', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 168 => array ( + 'attribute_original_id' => '280', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '280', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 169 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '281', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 170 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '70', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '282', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 171 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CD/DVD Box I', + 'data_type_string' => 'ezstring', + 'id' => '283', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'cd/dvd box i', + 'version' => '1', + ), + 172 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '284', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 173 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '285', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 174 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius. </paragraph><paragraph>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus venenatis elementum dolor. Praesent velit. Aliquam erat volutpat. Donec auctor. Etiam accumsan libero vel ipsum. Sed ligula turpis, lobortis in, aliquet a, dapibus non, eros. Nunc nulla arcu, pharetra nec, pellentesque at, malesuada quis, diam. Nulla pellentesque volutpat arcu. Vestibulum eros nulla, dignissim id, pulvinar sed, rutrum non, nisl. Quisque id nisi quis dolor suscipit ultrices. Vivamus dapibus tincidunt nunc. Curabitur nec massa nec ipsum tristique accumsan. Praesent tempus. Nunc posuere pretium lectus. Ut magna. </paragraph><paragraph><ol><li><paragraph>Quisque id nisi quis</paragraph></li><li><paragraph>Vivamus dapibus tincidunt</paragraph></li><li><paragraph>Curabitur nec</paragraph></li></ol></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '286', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 175 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '71', + 'data_float' => '199', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '287', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '19900', + 'sort_key_string' => '', + 'version' => '1', + ), + 176 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CD-DVD-Box-I.jpg" suffix="jpg" basename="CD-DVD-Box-I" dirpath="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-i/288-1-eng-US" url="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-i/288-1-eng-US/CD-DVD-Box-I.jpg" original_filename="835c5e5d.jpg" mime_type="image/jpeg" width="150" height="114" alternative_text="CD/DVD Box I" alias_key="1293033771" timestamp="1311154176"><original attribute_id="288" attribute_version="1" attribute_language="eng-US"/><information Height="114" Width="150" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '288', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 177 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>CD/DVD Box I</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '289', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 178 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Cover type" priority="1" default_option_id=""><option id="1" option_id="1" value="Soft" additional_price="10.00"/><option id="2" option_id="2" value="Hard" additional_price="15.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '290', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 179 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '71', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '291', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 180 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CD/DVD Box II', + 'data_type_string' => 'ezstring', + 'id' => '292', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'cd/dvd box ii', + 'version' => '1', + ), + 181 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '293', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 182 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '294', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 183 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius. </paragraph><paragraph>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus venenatis elementum dolor. Praesent velit. Aliquam erat volutpat. Donec auctor. Etiam accumsan libero vel ipsum. Sed ligula turpis, lobortis in, aliquet a, dapibus non, eros. Nunc nulla arcu, pharetra nec, pellentesque at, malesuada quis, diam. Nulla pellentesque volutpat arcu. Vestibulum eros nulla, dignissim id, pulvinar sed, rutrum non, nisl. Quisque id nisi quis dolor suscipit ultrices. Vivamus dapibus tincidunt nunc. Curabitur nec massa nec ipsum tristique accumsan. Praesent tempus. Nunc posuere pretium lectus. Ut magna. </paragraph><paragraph><ol><li><paragraph>Quisque id nisi quis</paragraph></li><li><paragraph>Vivamus dapibus tincidunt</paragraph></li><li><paragraph>Curabitur nec</paragraph></li></ol></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '295', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 184 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '72', + 'data_float' => '299', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '296', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '29900', + 'sort_key_string' => '', + 'version' => '1', + ), + 185 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CD-DVD-Box-II.jpg" suffix="jpg" basename="CD-DVD-Box-II" dirpath="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-ii/297-1-eng-US" url="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-ii/297-1-eng-US/CD-DVD-Box-II.jpg" original_filename="f2444e89.jpg" mime_type="image/jpeg" width="152" height="124" alternative_text="CD/DVD Box II" alias_key="1293033771" timestamp="1311154176"><original attribute_id="297" attribute_version="1" attribute_language="eng-US"/><information Height="124" Width="152" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '297', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 186 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>CD/DVD Box II</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '298', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 187 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Cover type" priority="1" default_option_id=""><option id="1" option_id="1" value="Soft" additional_price="10.00"/><option id="2" option_id="2" value="Hard" additional_price="15.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '299', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 188 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '72', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '300', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 189 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CD/DVD Box III', + 'data_type_string' => 'ezstring', + 'id' => '301', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'cd/dvd box iii', + 'version' => '1', + ), + 190 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '221', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '302', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 191 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '222', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '303', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 192 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '223', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam sem felis, lobortis sed, bibendum quis, viverra vestibulum, elit. Sed placerat lectus vel odio. Nunc quis magna. Nam at massa. Vestibulum porta vestibulum metus. Aliquam adipiscing arcu quis magna. Aliquam nulla tortor, accumsan non, egestas non, feugiat vel, ante. Aenean iaculis facilisis arcu. Curabitur porta sollicitudin turpis. Curabitur sit amet erat. Praesent quis pede egestas tellus porta rhoncus. Curabitur a ligula quis lorem consectetuer varius. </paragraph><paragraph>Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Phasellus venenatis elementum dolor. Praesent velit. Aliquam erat volutpat. Donec auctor. Etiam accumsan libero vel ipsum. Sed ligula turpis, lobortis in, aliquet a, dapibus non, eros. Nunc nulla arcu, pharetra nec, pellentesque at, malesuada quis, diam. Nulla pellentesque volutpat arcu. Vestibulum eros nulla, dignissim id, pulvinar sed, rutrum non, nisl. Quisque id nisi quis dolor suscipit ultrices. Vivamus dapibus tincidunt nunc. Curabitur nec massa nec ipsum tristique accumsan. Praesent tempus. Nunc posuere pretium lectus. Ut magna. </paragraph><paragraph><ol><li><paragraph>Quisque id nisi quis</paragraph></li><li><paragraph>Vivamus dapibus tincidunt</paragraph></li><li><paragraph>Curabitur nec</paragraph></li></ol></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '304', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 193 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '224', + 'contentobject_id' => '73', + 'data_float' => '99', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezprice', + 'id' => '305', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '9900', + 'sort_key_string' => '', + 'version' => '1', + ), + 194 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '225', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CD-DVD-Box-III.jpg" suffix="jpg" basename="CD-DVD-Box-III" dirpath="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-iii/306-1-eng-US" url="var/ezwebin_site/storage/images/products/boxes/cd-dvd-box-iii/306-1-eng-US/CD-DVD-Box-III.jpg" original_filename="eff90c13.jpg" mime_type="image/jpeg" width="150" height="108" alternative_text="CD/DVD Box III" alias_key="1293033771" timestamp="1311154176"><original attribute_id="306" attribute_version="1" attribute_language="eng-US"/><information Height="108" Width="150" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '306', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 195 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '226', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>CD/DVD Box III</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '307', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 196 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '227', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezmultioption option_counter="2"><name>Additional options</name><multioptions><multioption id="1" name="Cover type" priority="1" default_option_id=""><option id="1" option_id="1" value="Soft" additional_price="10.00"/><option id="2" option_id="2" value="Hard" additional_price="15.00"/></multioption></multioptions></ezmultioption> +', + 'data_type_string' => 'ezmultioption', + 'id' => '308', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 197 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '228', + 'contentobject_id' => '73', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '309', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 198 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Products sheets', + 'data_type_string' => 'ezstring', + 'id' => '310', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'products sheets', + 'version' => '1', + ), + 199 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '311', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 200 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '312', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 201 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '313', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 202 => array ( + 'attribute_original_id' => '314', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '314', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 203 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '315', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 204 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '74', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '316', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 205 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Solutions', + 'data_type_string' => 'ezstring', + 'id' => '317', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'solutions', + 'version' => '1', + ), + 206 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '64', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '318', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '64', + 'sort_key_string' => '', + 'version' => '1', + ), + 207 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '319', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 208 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="highlighted_object" size="medium" align="center" object_id="77"/></paragraph><paragraph><table class="default" width="100%" border="0"><tr><td xhtml:width="50%"><paragraph>Solutions by industry:</paragraph><paragraph><ul><li><paragraph>Banking + </paragraph></li><li><paragraph>Automotive + </paragraph></li><li><paragraph>Education + </paragraph></li><li><paragraph>Electronics + </paragraph></li></ul></paragraph></td><td><paragraph>Solutions by business topics:</paragraph><paragraph><ul><li><paragraph><link object_id="76">Web publishing</link></paragraph></li><li><paragraph><link object_id="80">Content management</link></paragraph></li><li><paragraph>Information integration + </paragraph></li><li><paragraph>Enterprise resource + </paragraph></li></ul></paragraph></td></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" object_id="79"/></paragraph><paragraph><embed size="medium" align="center" object_id="78"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '320', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 209 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="itemized_sub_items" size="medium" align="center" object_id="76"/></paragraph><paragraph><embed class="itemized_sub_items" size="medium" align="center" object_id="80"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '321', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 210 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '322', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 211 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '75', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '323', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 212 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Web publishing', + 'data_type_string' => 'ezstring', + 'id' => '324', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'web publishing', + 'version' => '1', + ), + 213 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '325', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 214 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '326', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 215 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '327', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 216 => array ( + 'attribute_original_id' => '328', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '328', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 217 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '329', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 218 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '76', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '330', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 219 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Fusce sagittis sagittis', + 'data_type_string' => 'ezstring', + 'id' => '331', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fusce sagittis sagittis', + 'version' => '1', + ), + 220 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '332', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 221 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '333', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 222 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nulla tortor. Suspendisse ut diam in mauris faucibus rutrum. Fusce sagittis sagittis urna. Pellentesque nec quam. Sed pretium, nisi sit amet ornare gravida, neque orci malesuada lacus, et interdum arcu felis ut tellus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '334', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 223 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras molestie. Nulla congue convallis justo. Nulla facilisi. Suspendisse potenti. In hac habitasse platea dictumst. Donec commodo orci sit amet ligula. Nunc purus. Suspendisse quis nibh vel felis consectetuer aliquet. Integer dictum risus id mi. Phasellus eu libero eu tortor adipiscing sagittis. Vivamus tincidunt ligula sed sem. Nullam est. </paragraph><paragraph>Pellentesque consequat orci sit amet erat. Nulla rutrum, elit ut ultricies mollis, sapien est cursus est, vitae malesuada metus lorem eget urna. Mauris viverra. Donec tristique. Proin lectus. Mauris ullamcorper est facilisis libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Praesent et elit eget dolor pretium tempus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus varius. In hac habitasse platea dictumst. Nulla pede purus, fringilla nec, ultrices nec, dignissim sit amet, eros. Cras id est eget mauris dapibus euismod. Nulla ornare. Aenean eu mi. Sed ac purus quis mi sagittis condimentum.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '335', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 224 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '336', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 225 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Fusce-sagittis-sagittis.jpg" suffix="jpg" basename="Fusce-sagittis-sagittis" dirpath="var/ezwebin_site/storage/images/solutions/web-publishing/fusce-sagittis-sagittis/337-1-eng-US" url="var/ezwebin_site/storage/images/solutions/web-publishing/fusce-sagittis-sagittis/337-1-eng-US/Fusce-sagittis-sagittis.jpg" original_filename="cf8327d1.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Fusce sagittis" alias_key="1293033771" timestamp="1311154177"><original attribute_id="337" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '337', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 226 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce sagittis</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '338', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 227 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '1174643880', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '339', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174643880', + 'sort_key_string' => '', + 'version' => '1', + ), + 228 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '340', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 229 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '341', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 230 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '77', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '342', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 231 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Etiam posuere sodales arcu', + 'data_type_string' => 'ezstring', + 'id' => '343', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'etiam posuere sodales arcu', + 'version' => '1', + ), + 232 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '344', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 233 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '345', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 234 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus sed quam. In hac habitasse platea dictumst. Nam quis magna. Curabitur elit enim, egestas quis, tristique sit amet, pharetra vel, sem. Nullam quam. Quisque in leo. Pellentesque odio nibh, vehicula ut, tristique vel, adipiscing a, sapien.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '346', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 235 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur pretium, lacus ut tincidunt cursus, mauris lorem suscipit ante, in molestie nisl est eget ante. Suspendisse laoreet nunc ac enim. Nullam hendrerit, enim id convallis hendrerit, sapien est tristique nisl, sed varius lorem ante sed est. In hac habitasse platea dictumst. Nunc enim orci, venenatis ac, ornare sit amet, nonummy a, nulla. Nullam quam massa, imperdiet ultrices, tristique et, suscipit ac, lectus. Sed convallis vulputate justo. Praesent nulla pede, vestibulum condimentum, facilisis eu, blandit eu, massa. Etiam posuere sodales arcu. Vivamus sed quam. In hac habitasse platea dictumst. Nam quis magna. Curabitur elit enim, egestas quis, tristique sit amet, pharetra vel, sem. Nullam quam. Quisque in leo. Pellentesque odio nibh, vehicula ut, tristique vel, adipiscing a, sapien. Fusce commodo dolor.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '347', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 236 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '348', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 237 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Etiam-posuere-sodales-arcu.jpg" suffix="jpg" basename="Etiam-posuere-sodales-arcu" dirpath="var/ezwebin_site/storage/images/solutions/web-publishing/etiam-posuere-sodales-arcu/349-1-eng-US" url="var/ezwebin_site/storage/images/solutions/web-publishing/etiam-posuere-sodales-arcu/349-1-eng-US/Etiam-posuere-sodales-arcu.jpg" original_filename="6e62eb23.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Vivamus sed" alias_key="1293033771" timestamp="1311154178"><original attribute_id="349" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '349', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 238 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus sed</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '350', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 239 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '1174644060', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '351', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174644060', + 'sort_key_string' => '', + 'version' => '1', + ), + 240 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '352', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 241 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '353', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 242 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '78', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '354', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 243 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'In hac habitasse platea', + 'data_type_string' => 'ezstring', + 'id' => '355', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'in hac habitasse platea', + 'version' => '1', + ), + 244 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '356', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 245 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '357', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 246 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras molestie. Nulla congue convallis justo. Nulla facilisi. Suspendisse potenti. In hac habitasse platea dictumst. Donec commodo orci sit amet ligula. Nunc purus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '358', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 247 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur pretium, lacus ut tincidunt cursus, mauris lorem suscipit ante, in molestie nisl est eget ante. Suspendisse laoreet nunc ac enim. Nullam hendrerit, enim id convallis hendrerit, sapien est tristique nisl, sed varius lorem ante sed est. In hac habitasse platea dictumst. Nunc enim orci, venenatis ac, ornare sit amet, nonummy a, nulla. Nullam quam massa, imperdiet ultrices, tristique et, suscipit ac, lectus. Sed convallis vulputate justo. Praesent nulla pede, vestibulum condimentum, facilisis eu, blandit eu, massa. Etiam posuere sodales arcu. Vivamus sed quam. In hac habitasse platea dictumst. Nam quis magna. Curabitur elit enim, egestas quis, tristique sit amet, pharetra vel, sem. Nullam quam. Quisque in leo. Pellentesque odio nibh, vehicula ut, tristique vel, adipiscing a, sapien. Fusce commodo dolor.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '359', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 248 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '360', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 249 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="In-hac-habitasse-platea.jpg" suffix="jpg" basename="In-hac-habitasse-platea" dirpath="var/ezwebin_site/storage/images/solutions/web-publishing/in-hac-habitasse-platea/361-1-eng-US" url="var/ezwebin_site/storage/images/solutions/web-publishing/in-hac-habitasse-platea/361-1-eng-US/In-hac-habitasse-platea.jpg" original_filename="f36b1c32.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="In hac habitasse" alias_key="1293033771" timestamp="1311154178"><original attribute_id="361" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '361', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 250 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>In hac habitasse</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '362', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 251 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '1174643640', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '363', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174643640', + 'sort_key_string' => '', + 'version' => '1', + ), + 252 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '364', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 253 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '365', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 254 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '79', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '366', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 255 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Content management', + 'data_type_string' => 'ezstring', + 'id' => '367', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'content management', + 'version' => '1', + ), + 256 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '368', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 257 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '369', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 258 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '370', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 259 => array ( + 'attribute_original_id' => '371', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '371', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 260 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '372', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 261 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '80', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '373', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 262 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Fusce sagittis sagittis urna', + 'data_type_string' => 'ezstring', + 'id' => '374', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fusce sagittis sagittis urna', + 'version' => '1', + ), + 263 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '375', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 264 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '376', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 265 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nulla tortor. Suspendisse ut diam in mauris faucibus rutrum. Fusce sagittis sagittis urna. Pellentesque nec quam. Sed pretium, nisi sit amet ornare gravida, neque orci malesuada lacus, et interdum arcu felis ut tellus. Proin ac felis. Duis faucibus, arcu a pretium placerat, ante orci ullamcorper ante, at pharetra tellus justo tincidunt arcu. Sed urna odio, porta sit amet, aliquam a, consectetuer facilisis, leo. Aliquam tempor arcu.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '377', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 266 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '378', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 267 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '379', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 268 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154179"><original attribute_id="380" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '380', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 269 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '381', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 270 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '1174645140', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '382', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174645140', + 'sort_key_string' => '', + 'version' => '1', + ), + 271 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '383', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 272 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '384', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 273 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '81', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '385', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 274 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Class aptent taciti sociosqu', + 'data_type_string' => 'ezstring', + 'id' => '386', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'class aptent taciti sociosqu', + 'version' => '1', + ), + 275 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '387', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 276 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '388', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 277 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Donec tristique. Proin lectus. Mauris ullamcorper est facilisis libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Praesent et elit eget dolor pretium tempus. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus varius. In hac habitasse platea dictumst.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '389', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 278 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '390', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 279 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '391', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 280 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154179"><original attribute_id="392" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '392', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 281 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '393', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 282 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '1174645260', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '394', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174645260', + 'sort_key_string' => '', + 'version' => '1', + ), + 283 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '395', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 284 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '396', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 285 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '82', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '397', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 286 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Aenean malesuada ligula', + 'data_type_string' => 'ezstring', + 'id' => '398', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'aenean malesuada ligula', + 'version' => '1', + ), + 287 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '399', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 288 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '400', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 289 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aenean malesuada ligula in magna. Donec pellentesque. Ut vulputate nisl. Praesent et ligula eleifend nibh tempus fermentum. Integer metus. Proin et erat id sem feugiat viverra. Nulla facilisi. Sed accumsan augue sed orci. Phasellus porttitor, ipsum at blandit molestie, libero quam ullamcorper justo, a placerat mi tortor vel arcu.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '401', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 290 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '402', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 291 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '403', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 292 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154179"><original attribute_id="404" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '404', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 293 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '405', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 294 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '1174645260', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '406', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1174645260', + 'sort_key_string' => '', + 'version' => '1', + ), + 295 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '407', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 296 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '408', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 297 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '83', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '409', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 298 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Training', + 'data_type_string' => 'ezstring', + 'id' => '410', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'training', + 'version' => '1', + ), + 299 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '63', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '411', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '63', + 'sort_key_string' => '', + 'version' => '1', + ), + 300 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '412', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 301 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><table class="default" width="100%" border="0"><tr><td xhtml:width="49%"><paragraph><embed size="medium" align="center" object_id="85"/></paragraph></td><td/><td xhtml:width="49%"><paragraph><embed size="medium" align="center" object_id="93"/></paragraph></td></tr><tr><td><paragraph><embed size="medium" align="center" object_id="91"/></paragraph></td><td/><td><paragraph><embed size="medium" align="center" object_id="92"/></paragraph></td></tr><tr><td/><td/><td/></tr><tr><td><paragraph><strong>Training by Type:</strong></paragraph><paragraph><ul><li><paragraph>Technical training + </paragraph></li><li><paragraph>Standard exam + </paragraph></li></ul></paragraph><paragraph><strong>Training by Delivery Method:</strong></paragraph><paragraph><ul><li><paragraph>Classroom + </paragraph></li><li><paragraph>Online + </paragraph></li></ul></paragraph></td><td/><td><paragraph><embed class="itemized_sub_items" size="medium" align="center" custom:offset="0" custom:limit="5" object_id="86"/></paragraph></td></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="87"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '413', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 302 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><custom name="factbox" custom:title="Next steps"><paragraph>Vivamus suscipit. Praesent tincidunt adipiscing urna. Etiam ligula velit, tincidunt accumsan, feugiat sit amet, malesuada vel, tellus.</paragraph><paragraph><ol><li><paragraph>Donec magna felis + </paragraph></li><li><paragraph>Mauris sed lectus vel + </paragraph></li><li><paragraph>Praesent pharetra + </paragraph></li></ol></paragraph></custom></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '414', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 303 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '415', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 304 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '84', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '416', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 305 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Certification', + 'data_type_string' => 'ezstring', + 'id' => '417', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'certification', + 'version' => '1', + ), + 306 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '418', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 307 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque iaculis ultrices orci. Ut interdum felis et lacus. Pellentesque eu mi. Vestibulum quis sapien. Donec ut pede.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '419', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 308 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '420', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 309 => array ( + 'attribute_original_id' => '421', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '421', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 310 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '422', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 311 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '85', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '423', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 312 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Professional workshops', + 'data_type_string' => 'ezstring', + 'id' => '424', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'professional workshops', + 'version' => '1', + ), + 313 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '425', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 314 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce quam erat, pulvinar non, semper sit amet, accumsan ut, magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '426', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 315 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '427', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 316 => array ( + 'attribute_original_id' => '428', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '428', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 317 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '429', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 318 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '86', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '430', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 319 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Etiam sodales mauris', + 'data_type_string' => 'ezstring', + 'id' => '431', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'etiam sodales mauris', + 'version' => '1', + ), + 320 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '432', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 321 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '433', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 322 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sed ultrices. Integer tincidunt purus ac leo. Vestibulum nulla lectus, congue vitae, pellentesque sed, adipiscing id, felis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '434', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 323 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vestibulum fermentum turpis sollicitudin turpis. Proin fringilla malesuada odio. Donec quis dui et nibh ultricies nonummy. Nunc in quam. Integer turpis dui, molestie quis, vestibulum id, tincidunt at, metus. Quisque at ipsum. Fusce lectus massa, suscipit id, volutpat eget, sodales ut, massa. Etiam sodales mauris non nulla gravida gravida</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '435', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 324 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '436', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 325 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Etiam-sodales-mauris.jpg" suffix="jpg" basename="Etiam-sodales-mauris" dirpath="var/ezwebin_site/storage/images/training/professional-workshops/etiam-sodales-mauris/437-1-eng-US" url="var/ezwebin_site/storage/images/training/professional-workshops/etiam-sodales-mauris/437-1-eng-US/Etiam-sodales-mauris.jpg" original_filename="7fa13e41.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Etiam sodales" alias_key="1293033771" timestamp="1311154180"><original attribute_id="437" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '437', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 326 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Etiam sodales</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '438', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 327 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '1175235780', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '439', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175235780', + 'sort_key_string' => '', + 'version' => '1', + ), + 328 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '440', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 329 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '441', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 330 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '87', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '442', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 331 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Class aptent taciti', + 'data_type_string' => 'ezstring', + 'id' => '443', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'class aptent taciti', + 'version' => '1', + ), + 332 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '444', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 333 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '445', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 334 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus venenatis, turpis sed nonummy posuere, lacus diam laoreet magna, vitae fringilla tortor libero at nisi. Cras sodales dolor sed diam. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '446', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 335 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Quisque massa sapien, bibendum vitae, imperdiet in, tempor at, lacus. Morbi eu augue. Nunc sagittis sem vitae risus. Nullam eu dolor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Sed quis est non massa rhoncus lacinia. Fusce lacus tellus, facilisis condimentum, porttitor pulvinar, laoreet at, nulla. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '447', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 336 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '448', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 337 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Class-aptent-taciti.jpg" suffix="jpg" basename="Class-aptent-taciti" dirpath="var/ezwebin_site/storage/images/training/professional-workshops/class-aptent-taciti/449-1-eng-US" url="var/ezwebin_site/storage/images/training/professional-workshops/class-aptent-taciti/449-1-eng-US/Class-aptent-taciti.jpg" original_filename="579f544b.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Class aptent" alias_key="1293033771" timestamp="1311154180"><original attribute_id="449" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '449', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 338 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Class aptent</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '450', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 339 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '1175236020', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '451', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175236020', + 'sort_key_string' => '', + 'version' => '1', + ), + 340 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '452', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 341 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '453', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 342 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '88', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '454', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 343 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Duis auctor vehicula erat', + 'data_type_string' => 'ezstring', + 'id' => '455', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'duis auctor vehicula erat', + 'version' => '1', + ), + 344 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '456', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 345 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '457', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 346 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis tincidunt, massa non rhoncus luctus, nunc metus pellentesque ante, sed tincidunt nisi lorem nec ligula. </paragraph><paragraph>Proin congue rutrum odio. Pellentesque cursus, nisl nec eleifend fermentum, lectus tortor aliquam tortor, nec semper ante nisi at risus. Duis mi lorem, porta quis, congue eget, varius sit amet, mi. Quisque augue. Duis auctor vehicula erat. Vivamus laoreet dictum velit. Cras vitae odio a quam bibendum lobortis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '458', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 347 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '459', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 348 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '460', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 349 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Duis-auctor-vehicula-erat.jpg" suffix="jpg" basename="Duis-auctor-vehicula-erat" dirpath="var/ezwebin_site/storage/images/training/professional-workshops/duis-auctor-vehicula-erat/461-1-eng-US" url="var/ezwebin_site/storage/images/training/professional-workshops/duis-auctor-vehicula-erat/461-1-eng-US/Duis-auctor-vehicula-erat.jpg" original_filename="15509f33.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Duis auctor" alias_key="1293033771" timestamp="1311154181"><original attribute_id="461" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '461', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 350 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis auctor</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '462', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 351 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '1175236920', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '463', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175236920', + 'sort_key_string' => '', + 'version' => '1', + ), + 352 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '464', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 353 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '465', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 354 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '89', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '466', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 355 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '316', + 'contentobject_id' => '90', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Events and seminars', + 'data_type_string' => 'ezstring', + 'id' => '467', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'events and seminars', + 'version' => '1', + ), + 356 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '317', + 'contentobject_id' => '90', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '468', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 357 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '318', + 'contentobject_id' => '90', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '0', + 'data_type_string' => 'ezselection', + 'id' => '469', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '0', + 'version' => '1', + ), + 358 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Self-paced courses', + 'data_type_string' => 'ezstring', + 'id' => '470', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'self-paced courses', + 'version' => '1', + ), + 359 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '471', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 360 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis sollicitudin neque.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '472', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 361 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '473', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 362 => array ( + 'attribute_original_id' => '474', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '474', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 363 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '475', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 364 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '91', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '476', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 365 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Instructor-led courses', + 'data_type_string' => 'ezstring', + 'id' => '477', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'instructor-led courses', + 'version' => '1', + ), + 366 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '478', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 367 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nunc a purus. Nunc quis urna at diam sodales fermentum. Sed mauris tortor, gravida ac, consequat sed.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '479', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 368 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '480', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 369 => array ( + 'attribute_original_id' => '481', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '481', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 370 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '482', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 371 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '92', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '483', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 372 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Additional learning resources', + 'data_type_string' => 'ezstring', + 'id' => '484', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'additional learning resources', + 'version' => '1', + ), + 373 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '485', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 374 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce bibendum nisi sed mauris. Morbi mi tellus, porta ac, vulputate ac, interdum et, dolor.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '486', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 375 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '487', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 376 => array ( + 'attribute_original_id' => '488', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '488', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 377 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '489', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 378 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '93', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '490', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 379 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support', + 'data_type_string' => 'ezstring', + 'id' => '491', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'support', + 'version' => '1', + ), + 380 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '62', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '492', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '62', + 'sort_key_string' => '', + 'version' => '1', + ), + 381 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><custom name="factbox" custom:title="Self Support"><paragraph>Vivamus suscipit. Praesent tincidunt adipiscing urna. Etiam ligula velit, tincidunt accumsan, feugiat sit amet, malesuada vel, tellus.</paragraph><paragraph><ul><li><paragraph><link object_id="98">Documentation</link></paragraph></li><li><paragraph><link object_id="95">Knowledgebase</link></paragraph></li></ul></paragraph></custom></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '493', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 382 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><table class="default" width="100%" border="0"><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="101"/></paragraph></td><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="103"/></paragraph></td></tr><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="104"/></paragraph></td><td/></tr><tr><td/><td/></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="102"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '494', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 383 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '495', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 384 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '496', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 385 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '94', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '497', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 386 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Knowledgebase', + 'data_type_string' => 'ezstring', + 'id' => '498', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'knowledgebase', + 'version' => '1', + ), + 387 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Mauris in est. Mauris fringilla egestas nisl. Vestibulum commodo tristique mi. Morbi congue. Aliquam erat volutpat. Donec pharetra. Maecenas at nibh. Proin adipiscing vehicula nisi. Aliquam interdum erat et urna. Integer quis felis gravida est bibendum iaculis. Etiam nec quam quis nisi euismod dictum. Proin ut diam ut metus condimentum posuere. Praesent id ligula vitae felis lacinia feugiat. Ut dictum hendrerit nunc. Cras magna nisl, auctor non, varius non, laoreet ac, orci. In pellentesque aliquam pede. Nam metus magna, porta ut, feugiat eget, consectetuer sit amet, elit. Vivamus ac orci vitae nunc facilisis consequat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '499', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 388 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '500', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 389 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '95', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '501', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 390 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Sed suscipit', + 'data_type_string' => 'ezstring', + 'id' => '502', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'sed suscipit', + 'version' => '1', + ), + 391 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '503', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 392 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '504', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 393 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '96', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '505', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 394 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ut interdum', + 'data_type_string' => 'ezstring', + 'id' => '506', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ut interdum', + 'version' => '1', + ), + 395 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Etiam nec metus. Proin mauris lorem, lobortis dapibus, semper id, nonummy eu, lacus. Aliquam erat volutpat. Vivamus hendrerit aliquam ipsum. Maecenas suscipit ante sit amet risus. Nullam lacus. Praesent varius imperdiet sapien. Nulla sit amet massa nonummy felis aliquam varius. Vivamus sed arcu. Mauris sodales tristique risus. Cras sed sem. Quisque est eros, lacinia id, placerat sit amet, varius ac, odio. Aenean placerat, justo eu laoreet laoreet, purus quam faucibus risus, vel accumsan mauris ligula in magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '507', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 396 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '508', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 397 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '97', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '509', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 398 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Documentation', + 'data_type_string' => 'ezstring', + 'id' => '510', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'documentation', + 'version' => '1', + ), + 399 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vestibulum ultricies lorem sed pede. Donec massa. Cras imperdiet, lectus mollis rhoncus gravida, enim lacus iaculis libero, consectetuer lobortis sapien purus nec purus. Donec nulla dui, commodo et, porttitor eu, malesuada id, nisi. Cras in mi in dolor ultricies pretium. Curabitur pellentesque auctor ligula. Suspendisse malesuada, nunc a tempor lacinia, lectus turpis commodo urna, eu porta risus nisl nec dui. Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '511', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 400 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '512', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 401 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '98', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '513', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 402 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Mauris pretium', + 'data_type_string' => 'ezstring', + 'id' => '514', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'mauris pretium', + 'version' => '1', + ), + 403 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Praesent pretium mi eget odio. Nunc sed lectus eget purus eleifend mattis. Vivamus aliquam, metus quis rutrum venenatis, mi felis tempus ipsum, sed varius metus erat eget leo. Ut fringilla, urna vel consectetuer dignissim, tellus ante mattis quam, semper scelerisque nulla tortor eu enim. Vivamus tortor. Donec eleifend fringilla dui. Nullam semper interdum ipsum. Proin quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. In hac habitasse platea dictumst. Mauris pretium posuere justo. Proin vestibulum cursus odio. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '515', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 404 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '516', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 405 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '99', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '517', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 406 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Aliquam posuere', + 'data_type_string' => 'ezstring', + 'id' => '518', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'aliquam posuere', + 'version' => '1', + ), + 407 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nam at nulla id lectus vehicula sollicitudin. Nullam lobortis facilisis mi. In hac habitasse platea dictumst. Aliquam dignissim iaculis est. Mauris egestas. Phasellus at mi. Mauris pede libero, accumsan vel, tristique eget, tempus sit amet, sapien. Fusce sed arcu. Pellentesque pharetra mattis velit. In nec eros. Praesent viverra metus ut tellus. In tellus elit, imperdiet at, tincidunt egestas, malesuada sed, nisl. Aliquam posuere mattis pede. Curabitur lacinia condimentum nunc. Phasellus mattis. Fusce ac pede. Ut in neque. Fusce adipiscing mi sit amet velit. Cras varius. Vivamus elementum dui id lectus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '519', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 408 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '520', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 409 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '100', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '521', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 410 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Books', + 'data_type_string' => 'ezstring', + 'id' => '522', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'books', + 'version' => '1', + ), + 411 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '523', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 412 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Quisque fringilla hendrerit turpis. Curabitur suscipit blandit nulla. Sed mauris justo, iaculis vel, dictum ut, molestie et, purus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '524', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 413 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce ut risus. Nulla mauris magna, vulputate quis, dignissim vel, lobortis ut, neque. Etiam sed ante. Curabitur in dolor nec tellus consequat gravida. Proin faucibus viverra eros. Suspendisse fringilla. Etiam eget elit eu augue euismod lobortis. Sed urna elit, volutpat vel, ultricies id, molestie a, ligula. In cursus nonummy quam. Sed malesuada iaculis magna. Curabitur mollis vehicula nibh. Curabitur at orci at leo vulputate vestibulum. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '525', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 414 => array ( + 'attribute_original_id' => '526', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '526', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 415 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '527', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 416 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '101', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '528', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 417 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Aliquam pulvinar suscipit tellus', + 'data_type_string' => 'ezstring', + 'id' => '529', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'aliquam pulvinar suscipit tellus', + 'version' => '1', + ), + 418 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '530', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 419 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '531', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 420 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras sollicitudin dolor eget sapien. Etiam sit amet tortor sit amet tortor adipiscing ultricies. Aliquam pulvinar suscipit tellus. Suspendisse sed magna. In vulputate erat. Nulla vel augue. Aenean magna. Phasellus vestibulum auctor nisi. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '532', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 421 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Nam laoreet, orci vitae tempor porttitor, mauris tellus blandit sapien, ac dignissim massa ipsum dignissim eros. Ut a urna. Aliquam consequat mollis eros.</paragraph><paragraph>In in ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque sodales tortor. Phasellus adipiscing pretium nibh. Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Praesent eu quam. Nam sollicitudin congue augue. Nulla facilisi. Nunc in turpis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '533', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 422 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '534', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 423 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Aliquam-pulvinar-suscipit-tellus.jpg" suffix="jpg" basename="Aliquam-pulvinar-suscipit-tellus" dirpath="var/ezwebin_site/storage/images/support/books/aliquam-pulvinar-suscipit-tellus/535-1-eng-US" url="var/ezwebin_site/storage/images/support/books/aliquam-pulvinar-suscipit-tellus/535-1-eng-US/Aliquam-pulvinar-suscipit-tellus.jpg" original_filename="7bf18646.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Aliquam pulvinar" alias_key="1293033771" timestamp="1311154184"><original attribute_id="535" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '535', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 424 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam pulvinar</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '536', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 425 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '1175496180', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '537', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175496180', + 'sort_key_string' => '', + 'version' => '1', + ), + 426 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '538', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 427 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '539', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 428 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '102', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '540', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 429 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Customer Service', + 'data_type_string' => 'ezstring', + 'id' => '541', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'customer service', + 'version' => '1', + ), + 430 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '542', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 431 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis non nulla non enim tempus tempor. Donec diam diam, consectetuer sit amet, imperdiet ac, consectetuer at, massa. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '543', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 432 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Phasellus vitae est. Proin tellus leo, accumsan ut, ullamcorper non, sagittis vitae, elit. Suspendisse placerat luctus ligula. Nunc turpis elit, vulputate nec, vehicula ac, tempor et, ipsum. Maecenas dignissim rutrum ante. Sed ultrices, quam et nonummy vulputate, massa dolor mattis risus, at tempus nibh est eu ipsum. Sed lacus dui, luctus at, iaculis vel, scelerisque vel, sem. Vivamus tellus justo, fermentum et, lobortis et, lobortis euismod, augue. Etiam cursus varius ligula. Quisque pharetra. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '544', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 433 => array ( + 'attribute_original_id' => '545', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '545', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 434 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '546', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 435 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '103', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '547', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 436 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support Programs', + 'data_type_string' => 'ezstring', + 'id' => '548', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'support programs', + 'version' => '1', + ), + 437 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '549', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 438 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Mauris in est. Mauris fringilla egestas nisl. Vestibulum commodo tristique mi. Morbi congue. Aliquam erat volutpat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '550', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 439 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Donec pharetra. Maecenas at nibh. Proin adipiscing vehicula nisi. Aliquam interdum erat et urna. Integer quis felis gravida est bibendum iaculis. Etiam nec quam quis nisi euismod dictum. Proin ut diam ut metus condimentum posuere. Praesent id ligula vitae felis lacinia feugiat. Ut dictum hendrerit nunc. Cras magna nisl, auctor non, varius non, laoreet ac, orci. In pellentesque aliquam pede. Nam metus magna, porta ut, feugiat eget, consectetuer sit amet, elit. Vivamus ac orci vitae nunc facilisis consequat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '551', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 440 => array ( + 'attribute_original_id' => '552', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '552', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 441 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '553', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 442 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '104', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '554', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 443 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Getting started', + 'data_type_string' => 'ezstring', + 'id' => '555', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'getting started', + 'version' => '1', + ), + 444 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '556', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 445 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '557', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 446 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '558', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 447 => array ( + 'attribute_original_id' => '559', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '559', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 448 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '560', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 449 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '105', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '561', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 450 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Tutorials for', + 'data_type_string' => 'ezstring', + 'id' => '562', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'tutorials for', + 'version' => '1', + ), + 451 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '563', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 452 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '564', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 453 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><table class="default" width="100%" border="0" custom:summary="tutorials"><tr><td><paragraph align="left"><strong><strong>new to eZ Publish users</strong></strong></paragraph></td><td><paragraph align="left"><strong>experienced users</strong></paragraph></td></tr><tr><td align="center"/><td align="center"/></tr><tr><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="108"/></paragraph></td><td><paragraph><link target="_blank" url_id="16">How to develop eZ Publish Extensions</link></paragraph></td></tr><tr><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="202"/></paragraph></td><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="17">How to create custom workflow</link></paragraph></td></tr><tr><td><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="127"/></paragraph></td><td><paragraph><link target="_blank" url_id="18">How to use REST API interface</link></paragraph></td></tr><tr><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="13">eZ Publish Administration Interface</link></paragraph></td><td><paragraph><link target="_blank" url_id="19">Asynchronous publishing</link></paragraph></td></tr><tr><td><paragraph><link target="_blank" url_id="14">eZ Publish Online Editor Video</link></paragraph></td><td><paragraph><embed view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="130"/></paragraph></td></tr><tr><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="15">eZ Flow Video Tutorial</link></paragraph></td><td><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="20">Upgrading to 4.5</link></paragraph></td></tr><tr><td xhtml:colspan="2"/></tr><tr><td xhtml:colspan="2" align="right"><paragraph align="right"><strong>more <link target="_blank" url_id="21">tutorials</link> and <link target="_blank" url_id="22">videos</link></strong></paragraph></td></tr></table></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '565', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 454 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '566', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 455 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '567', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 456 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154185"><original attribute_id="568" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '568', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 457 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '569', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 458 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '570', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 459 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '571', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 460 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '572', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 461 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '106', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '573', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 462 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Get involved', + 'data_type_string' => 'ezstring', + 'id' => '574', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'get involved', + 'version' => '1', + ), + 463 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '575', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 464 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '576', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 465 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><link target="_blank" xhtml:id="internal-source-marker_0.15448186383582652" url_id="25">Forums</link>,&nbsp;<link target="_blank" url_id="26">Blogs</link>,&nbsp;<link target="_blank" url_id="27">Twitter</link>,&nbsp;<link target="_blank" url_id="28">LinkedIn</link></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '577', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 466 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>[<link target="_self" anchor_name="contact" url_id="29">contact</link>] [<link target="_self" anchor_name="share" url_id="29">share</link>] [<link target="_self" anchor_name="develop" url_id="29">develop</link>]</paragraph><paragraph>If you want to get involved in the eZ Community\'s life, help, be helped, share and participate, this page is for you. It gives you a list of hints and tricks on how to actually get involved.</paragraph><paragraph>Make sure you also read the&nbsp;<link target="_self" url_id="30">Etiquette, blogging and usage guidelines</link></paragraph><paragraph><anchor name="contact"/></paragraph><paragraph><anchor name="eztoc772_1"/></paragraph><paragraph><anchor name="eztoc1010_1_1"/></paragraph><paragraph><anchor name="eztoc1031_0_1_1"/></paragraph><section><section><section><section><header>Contact</header><paragraph>Should anything be unclear ( after having read through the following :) ), or if you would like to ask a question, feel free to send an email to community@ez.no.</paragraph><paragraph><anchor name="share"/></paragraph><paragraph><anchor name="eztoc772_2"/></paragraph><paragraph><anchor name="eztoc1010_1_2"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2"/></paragraph></section></section></section></section><section><section><section><section><header>Sharing</header><paragraph><anchor name="eztoc772_2_1"/></paragraph><paragraph><anchor name="eztoc1010_1_2_1"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_1"/></paragraph><section><header>Forums</header><paragraph>From&nbsp;<link target="_self" xhtml:title="eZ Community forums" url_id="25">http://share.ez.no/forums</link>, you can pick one of the existing forums and ask a question, make a remark, answers others\' questions, or simply read through, looking for a bit of information. The following forums are available:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="31">Install & configuration</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="32">Setup & design</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="33">General</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="34">Developer</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="35">Suggestions</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="36">Extensions</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>The "Extensions" forum is broken down into extension-specific subforums:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="37">eZ Newsletter</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="38">Website Interface</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="39">eZ Flow</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="40">eZ Find</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>One forum is dedicated to translators and linguists translating eZ Publish :</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" xhtml:title="Forum dedicated to translators" url_id="41">Translations</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>One forum is dedicated to local eZ Publish communities who do not have a dedicated platform and would like to share in their native language :</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" xhtml:title="Localized forums" url_id="42">Localized forums</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>A last forum welcomes suggestions for this portal:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="43">Feedback and ideas for this portal</link>&nbsp;(<link target="_self" anchor_name="RSS" url_id="29">rss</link>)</paragraph></li></ul></paragraph><paragraph>It is often used in conjunction with the&nbsp;<link target="_blank" xhtml:title="Issue tracker for the Community Portal" url_id="44">share.ez.no-dedicated issue tracker</link>&nbsp;(not to be confused with the&nbsp;<link target="_blank" xhtml:title="General eZ Publish issue tracker" url_id="45">general eZ Publish issue tracker</link>).</paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_2"/></paragraph><paragraph><anchor name="eztoc1010_1_2_2"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_2"/></paragraph></section><section><header>Your experience through an article or tutorial</header><paragraph>The&nbsp;<link target="_self" xhtml:title="eZ Community Articles" url_id="46">Articles</link>&nbsp;and&nbsp;<link target="_self" xhtml:title="eZ Community Tutorials" url_id="47">Tutorials</link>&nbsp;sections are gold mines of useful, practical information on eZ Publish and eZ Software usage. You may be willing to contribute to growing the amount of common gold by sharing one of your experiences, right here. Read more on this here :<link target="_self" url_id="48">Share your experience, write a tutorial for the Community</link>.</paragraph><paragraph><anchor name="IRC"/></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_3"/></paragraph><paragraph><anchor name="eztoc1010_1_2_3"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_3"/></paragraph></section><section><header>Live chat on IRC</header><paragraph>Two channels are dedicated to live chat (mostly around eZ Publish and eZ Components), here they are :</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">eZ Publish room:&nbsp;<link target="_self" anchor_name="ezpublish" url_id="49">irc://irc.freenode.net/#ezpublish</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">eZ Components room:&nbsp;<link target="_self" anchor_name="zetacomponents" url_id="49">irc://irc.freenode.net/#zetacomponents</link></paragraph></li></ul></paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Feel free and join the chat. Usually there is a number of people willing to help you out with your problem or discuss features.&nbsp;</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">You need an&nbsp;<link target="_self" anchor_name="Clients" url_id="50">IRC Client</link>&nbsp;for joining the channel. Here is an indicative list of popular IRC clients :</line></paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="51">XChat</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="52">mIRC</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="53">Pidgin</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link target="_self" url_id="54">Colloquy</link></paragraph></li></ul></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_4"/></paragraph><paragraph><anchor name="eztoc1010_1_2_4"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_4"/></paragraph></section><section><header>Blogging</header><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">A central blog planet is aggregating many community members\' blogs:<link target="_blank" xhtml:title="Planet eZ Publish" url_id="55">http://planetezpublish.org/</link>&nbsp;(available through&nbsp;<link target="_blank" xhtml:title="planetezpublish RSS feed" url_id="56">RSS</link>&nbsp;).</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Local initiatives exists, among them the french-speaking blog-planet :&nbsp;<link target="_blank" xhtml:title="French eZ Publish blog planet" url_id="57">http://www.planet-ezpublish.fr/</link>.</line></paragraph><paragraph>Atop, this platform will soon open to public blogging, stay tuned.</paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_5"/></paragraph><paragraph><anchor name="eztoc1010_1_2_5"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_5"/></paragraph></section><section><header>Mailing-lists</header><paragraph>Feel free to register on the eZ Community mailing-list. You can do so here :<link target="_blank" xhtml:title="eZ Community mailing-list" url_id="58">http://lists.ez.no/mailman/listinfo/sdk-public</link>. It serves as a community support channel, obviously less responsive than IRC or twitter, but more persistent, which can be preferred in some cases.</paragraph><paragraph>Another mailing-list helps you see pass by every commit messages on eZ Publish\'s development trunk. If you are eager to see one specific feature implemented, or simply like to be updated with the bleeding-edge, vip status of eZ Publish, you should subscribe to that one :&nbsp;<link target="_blank" url_id="59">http://lists.ez.no/mailman/listinfo/sdk-svn</link></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_6"/></paragraph><paragraph><anchor name="eztoc1010_1_2_6"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_6"/></paragraph></section><section><header>RSS</header><paragraph><anchor name="RSS"/></paragraph><paragraph>Follow the eZ Community activity through RSS. Here are the feeds at your disposal:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">All forums (topics & replies):&nbsp;<link target="_self" url_id="60">http://share.ez.no/rss/feed/all_forums</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forum topics ONLY :&nbsp;<link target="_self" xhtml:title="RSS feed for forum topics ONLY" url_id="61">http://share.ez.no/rss/feed/forum_topics_only</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Articles and Tutorials :&nbsp;<link target="_self" url_id="62">http://share.ez.no/rss/feed/articles</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Blogs :&nbsp;<link target="_self" url_id="63">http://share.ez.no/rss/feed/blogs</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Developer :&nbsp;<link target="_self" url_id="64">http://share.ez.no/rss/feed/forums_developer</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Discussions :&nbsp;<link target="_self" url_id="65">http://share.ez.no/rss/feed/forums_discussions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Extensions :&nbsp;<link target="_self" url_id="66">http://share.ez.no/rss/feed/forums_extensions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Feedback :&nbsp;<link target="_self" url_id="67">http://share.ez.no/rss/feed/forums_feedback</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > General :&nbsp;<link target="_self" url_id="68">http://share.ez.no/rss/feed/forums_general</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Install and Configuration :<link target="_self" url_id="69">http://share.ez.no/rss/feed/forums_install_and_configuration</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Setup and Design :&nbsp;<link target="_self" url_id="70">http://share.ez.no/rss/feed/forums_setup_and_design</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Suggestions :&nbsp;<link target="_self" url_id="71">http://share.ez.no/rss/feed/forums_suggestions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Forums > Translation :&nbsp;<link target="_self" xhtml:title="Translation related forum" url_id="72">http://share.ez.no/rss/feed/forums_translation</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Projects :&nbsp;<link target="_self" url_id="73">http://share.ez.no/rss/feed/projects</link></paragraph></li></ul></paragraph><paragraph>&nbsp;<anchor name="eztoc772_2_7"/></paragraph><paragraph><anchor name="eztoc1010_1_2_7"/></paragraph><paragraph><anchor name="eztoc1031_0_1_2_7"/></paragraph></section><section><header>Social networks</header><paragraph>Stay tuned on the portal\'s activity by following&nbsp;<link target="_blank" xhtml:title="eZ Publish Community on twitter" url_id="27">@ezcommunity</link>. Also, cool instant pings happen on Twitter, where many community members are active. Feel free to join this sphere, and the first step could be to follow this Twitter list :&nbsp;<link target="_blank" xhtml:title="eZ Community members on Twitter" url_id="74">http://twitter.com/i_robin/cms-ezpublish/members</link>.</paragraph><paragraph>The eZ Publish Community is also gathered on LinkedIn, swing by&nbsp;<link target="_blank" xhtml:title="eZ Ecosystem on LinkedIn" url_id="28">there</link>!</paragraph><paragraph>Some&nbsp;<link target="_blank" xhtml:title="Google Wave" url_id="75">Waves</link>&nbsp;also got attention from the community members. One way to see them is to search, from Google Wave, the following: "with:public ezpublish". So come by and wave on with us. In case you need an invitation, drop a word here :<link target="_self" url_id="76">http://share.ez.no/forums/general/ez-publish-on-google-wave</link>.</paragraph><paragraph><anchor name="develop"/>[<link target="_self" xhtml:title="Back to top" anchor_name="top" url_id="29">back to top</link>]</paragraph><paragraph><anchor name="eztoc772_3"/></paragraph><paragraph><anchor name="eztoc1010_1_3"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3"/></paragraph></section></section></section></section></section><section><section><section><section><header>Developing</header><paragraph><anchor name="eztoc772_3_8"/></paragraph><paragraph><anchor name="eztoc1010_1_3_8"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_8"/></paragraph><section><header>Collaborative development</header><paragraph>You have developed a cool extension for eZ Publish ? You would like to share it, and get other community members to help you push it ahead ? Then you should visit<link target="_blank" xhtml:title="eZ Community projects" url_id="77">http://projects.ez.no</link>&nbsp;and open-source it there. You can log in with your ez.no account (the same as your share.ez.no account), and create a new project there. You may want to first check that no similar extension already exists, in which case you would probably prefer joining the existing team and tell about your ideas, suggestions and already crafted code.</paragraph><paragraph>This platform gives every project a simple collaborative development sandbox:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">forums</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a subversion repository</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a news wall</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a home page</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a rating system for people to praise or blame</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">galleries for screenshots</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">a download section</paragraph></li></ul></paragraph><paragraph><anchor name="doc"/></paragraph><paragraph><anchor name="eztoc772_3_9"/></paragraph><paragraph><anchor name="eztoc1010_1_3_9"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_9"/></paragraph></section><section><header>Documentation</header><paragraph>Online documentation helps you in your daily development and administration tasks. The official documentation for eZ Publish is available at&nbsp;<link target="_blank" xhtml:title="eZ Publish documentation" url_id="9">http://doc.ez.no</link>. A community initiative,<link target="_blank" xhtml:title="ez Publish community documentation" url_id="78">http://ezpedia.org</link>, comes as a relevant and handy knowledge base, very complimentary to the online documentation. The eZ Publish API documentation is&nbsp;<link target="_blank" xhtml:title="eZ Publish API documentation" url_id="79">here</link>, and the official documentation for the Apache Zeta Components (formerly known as eZ Components) lies<link target="_blank" xhtml:title="Apache Zeta Components" url_id="80">here</link>. The Apache Zeta Components serve nowadays, in many places, as base libraries for eZ Publish, and are a generally high-quality set of libraries for web application development.</paragraph><paragraph>&nbsp;<anchor name="eztoc772_3_10"/></paragraph><paragraph><anchor name="eztoc1010_1_3_10"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_10"/></paragraph></section><section><header>Trunk, testing and sending feedback</header><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">For every eZ Publish release, the usual alpha-beta-rc countdown should happen, and the eZ Community will be in first line to check these pre-release versions of eZ Publish Community Project and push feedback on them.</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">On top of these regular fevers, on a daily basis you may want to report issues found on eZ Publish, as well as propose enhancements. And this happens here :<link target="_blank" xhtml:title="eZ Publish general issue tracker" url_id="81">http://issues.ez.no/ezpublish</link>.</line></paragraph><paragraph>You can as well follow every step of eZ Publish\'s development by checking out the trunk version of it. It is hosted on a Github server. All you need is to visit&nbsp;<link target="_blank" xhtml:title="eZ Publish Community Project\'s github repository" url_id="82">eZ Publish Community Project\'s github repository</link>, and enjoy :)</paragraph><paragraph>&nbsp;<anchor name="eztoc772_3_11"/></paragraph><paragraph><anchor name="eztoc1010_1_3_11"/></paragraph><paragraph><anchor name="eztoc1031_0_1_3_11"/></paragraph></section><section><header>Translation and localisation</header><paragraph>A central community translation initiative is hosted here<link target="_blank" xhtml:title="Community Translation Initiative" url_id="83">http://projects.ez.no/ezpublish_translation</link>. The homepage of the project gives you all necessary details to get involved in translating eZ Publish into your preferred language. If you feel you have a linguist soul, or simply are fed up with not being able to use eZ Publish in your native language, this initiative is for you!</paragraph></section></section></section></section></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '578', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 467 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '579', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 468 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154185"><original attribute_id="580" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '580', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 469 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '581', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 470 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '582', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 471 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '583', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 472 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '584', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 473 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '107', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '585', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 474 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to use eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '586', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to use ez publish', + 'version' => '1', + ), + 475 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '587', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 476 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '588', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 477 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish comes with a multitude of features out of the box, ensuring that you can quickly put your content online.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '589', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 478 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Publish content from your web browser</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Publish content from word processors</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Translate your content</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Upload multiple files at once</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Picture galleries</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Video publishing</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Web 2.0 features</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Search</paragraph></li></ul></paragraph><section><section><header>Publish content from your web browser</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="109"/></paragraph><paragraph>With eZ Publish, you can publish content like articles, pictures and files directly from your web browser, using the Website Toolbar.</paragraph><paragraph>This toolbar appears when you log in and enables you to publish, move, replace or translate any kind of content.</paragraph><paragraph>The Online Editor is a WYSIWYG editor integrated into the website (no HTML coding required), providing formatting functions similar to word processing applications.</paragraph></section></section><section><section><header>Publish content from your favourite word processor</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="110"/></paragraph><paragraph>Many content managers prefer working directly in Microsoft Word or Open Office. The import / export feature enables you to create or edit site content in your favorite word processor, even when you might not have Internet access.</paragraph><paragraph>Afterwards, you can upload the document through either a WebDAV client or the front-end of your site to generate or update articles, documentation pages and so on.</paragraph></section></section><section><section><header>Translate your content</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="111"/></paragraph><paragraph>All content in eZ Publish can be translated to multiple languages. Having only one website to administer is efficient and makes it easier to maintain a consistent brand across languages and countries.</paragraph><paragraph>An international corporation or organization can have one website with content in several languages. When a visitor selects a language, the menus and content are displayed accordingly. If you have not yet translated specific content, it will be shown in the source language or not at all (depending on your configuration).</paragraph><paragraph>When you are editing content, you can choose to switch the language you are currently editing or to translate from one language to another. Content in the source language is shown when you are translating, to aid in the process. When creating or updating content translations, you can also use the built-in content “diff” functionality to see the added or removed text in the source language.</paragraph><paragraph>Multiple, multilingual URLs can be created for each page. By default, you can have an object called "Easy" with a URL "/easy" but also create a French translation with a URL "/facile".</paragraph></section></section><section><section><header>&nbsp;Upload multiple files at once</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="112"/></paragraph><paragraph>If you want to upload more than one document, picture or video at a time, eZ Publish has multi-upload functionality.</paragraph><paragraph>You simply select the content you want from your computer or from the server where your content is stored. eZ Publish can detect the type of content uploaded and creates the appropriate web pages.</paragraph></section></section><section><section><header>Picture galleries</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="113"/></paragraph><paragraph>eZ Publish makes it easy to create picture galleries. With the multi-upload functionality, you can add many pictures at once, then eZ Publish will scale, format and resize the pictures automatically.</paragraph><paragraph>You can then browse through the galleries and re-use images elsewhere in your website.</paragraph></section></section><section><section><header>Video publishing</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="114"/></paragraph><paragraph>Basically, a video is another type of content you or users of your website can publish. You can use eZ Publish to store and display any video format for web TV functionality or video publishing similar to Youtube.</paragraph></section></section><section><section><header>Web 2.0 features</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="115"/></paragraph><paragraph>Tag clouds, blogs, forums and polls are all built-in eZ Publish features. Make your users contribute and build communities.</paragraph></section></section><section><section><header>Search</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="116"/></paragraph><paragraph>To find any content on your eZ Publish site, you can use the integrated search engine in eZ Publish. To add more functionality and scale high-loaded websites, <link url_id="84">eZ Find</link> is an enterprise search extension for eZ Publish.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '590', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 479 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '591', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 480 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-use-eZ-Publish.jpg" suffix="jpg" basename="How-to-use-eZ-Publish" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/592-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/592-1-eng-US/How-to-use-eZ-Publish.jpg" original_filename="affa2705.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154185"><original attribute_id="592" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '592', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 481 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '593', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 482 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '594', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 483 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '595', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 484 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '596', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 485 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '108', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '597', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 486 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '598', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 487 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '599', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 488 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics1/600-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics1/600-1-eng-US/graphics1.jpg" original_filename="c6a49b95.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="600" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '600', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 489 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '109', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '601', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 490 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '602', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 491 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '603', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 492 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics12/604-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics12/604-1-eng-US/graphics1.jpg" original_filename="afc64b77.jpg" mime_type="image/jpeg" width="540" height="357" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="604" attribute_version="1" attribute_language="eng-US"/><information Height="357" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '604', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 493 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '110', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '605', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 494 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '606', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 495 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '607', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 496 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics13/608-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics13/608-1-eng-US/graphics1.jpg" original_filename="ccb0f9f7.jpg" mime_type="image/jpeg" width="540" height="419" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="608" attribute_version="1" attribute_language="eng-US"/><information Height="419" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '608', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 497 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '111', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '609', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 498 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '610', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 499 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '611', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 500 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics14/612-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics14/612-1-eng-US/graphics1.jpg" original_filename="be2fb4a2.jpg" mime_type="image/jpeg" width="540" height="404" alternative_text="" alias_key="1293033771" timestamp="1311154186"><original attribute_id="612" attribute_version="1" attribute_language="eng-US"/><information Height="404" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '612', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 501 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '112', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '613', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 502 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '614', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 503 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '615', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 504 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics15/616-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics15/616-1-eng-US/graphics1.jpg" original_filename="2db91653.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="616" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '616', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 505 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '113', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '617', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 506 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '618', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 507 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '619', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 508 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics16/620-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics16/620-1-eng-US/graphics1.jpg" original_filename="b14081cb.jpg" mime_type="image/jpeg" width="540" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="620" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '620', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 509 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '114', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '621', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 510 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '622', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 511 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '623', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 512 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics17/624-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics17/624-1-eng-US/graphics1.jpg" original_filename="dd1815c4.jpg" mime_type="image/jpeg" width="540" height="425" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="624" attribute_version="1" attribute_language="eng-US"/><information Height="425" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '624', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 513 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '115', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '625', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 514 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '626', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 515 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '627', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 516 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics18/628-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics18/628-1-eng-US/graphics1.jpg" original_filename="485af257.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="628" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '628', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 517 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '116', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '629', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 518 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '630', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 519 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '631', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 520 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics19/632-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-use-ez-publish/graphics19/632-1-eng-US/graphics1.jpg" original_filename="1a13bc86.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="632" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '632', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 521 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '117', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '633', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 522 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to manage eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '634', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to manage ez publish', + 'version' => '1', + ), + 523 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '635', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 524 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '636', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 525 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>To provide you with full control over your website, eZ Publish has many features that make it easy to manage both content and users.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '637', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 526 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph><ul><li><paragraph>Administration Interface</paragraph></li><li><paragraph>Permission and access control</paragraph></li><li><paragraph>Workflows</paragraph></li><li><paragraph>Versioning and modification tracking</paragraph></li><li><paragraph>A unique content model</paragraph></li><li><paragraph>Content cross publishing</paragraph></li><li><paragraph>Multi-site deployment</paragraph></li><li><paragraph>Search engine optimization</paragraph></li></ul></paragraph><section><header>A rich and powerful Administration Interface</header><paragraph><embed align="center" size="original" object_id="119"/></paragraph><paragraph>The content of a site can be displayed (and modified) in various ways. The Administration Interface is the advanced back-end interface, providing powerful tools for content management and editing as well as site management, configuration, customization and development.</paragraph><paragraph>In other words, you can change almost everything about a site in the Administration Interface.</paragraph><header>Permission, rights management and access control</header><paragraph><embed align="center" size="original" object_id="120"/></paragraph><paragraph>The eZ Publish access system is multi-level and role-based. This means that you can give a user or a group of users access to a combination of functions across the whole site or within a specific area of the site. For example, you restrict a certain part of a site to community or partner members.</paragraph><header>Workflows</header><paragraph><embed align="center" size="original" object_id="121"/></paragraph><paragraph>eZ Publish comes with an integrated workflow mechanism. An example of this is the built-in collaboration system, which defines an ordered sequence of actions to be executed after a content editor has published an object.</paragraph><paragraph>Suppose that your site has a restriction that all content has to go through an editor-in-chief before being published. It can be set as “pending” before being approved to be published. On the other hand, if a pending version is rejected by the editor, it can be set as “rejected”.</paragraph><paragraph>&nbsp;Another example is the e-commerce engine, which can be used to manage subscriptions on a media site, automating access for paid subscribers to read premium news content, watch videos, and so on.</paragraph><header>Versioning and modification tracking</header><paragraph><embed align="center" size="original" object_id="122"/></paragraph><paragraph>Having access to older versions of content enables supervisors or editors-in-chief to check for inconsistency or errors in the content. eZ Publish automatically keeps track of which content changes were made by which users at what time, and provides the option to revert content to a previous version.</paragraph><header>A unique content model</header><paragraph><embed align="center" size="original" object_id="123"/></paragraph><paragraph>Publishing content is no longer only about publishing articles. Depending on your needs you must define specific content structures for cars, recipes, specific products for your webshop and more. eZ Publish has a flexible content engine that enables administrators to create these content definitions directly through graphical user interfaces.</paragraph><header>Content cross publishing</header><paragraph><embed align="center" size="original" object_id="124"/></paragraph><paragraph>Using the cross publishing feature, you can re-use content throughout the site while avoiding inconsistent duplicates of content that are hard to maintain. If content appears at multiple locations, you only have to edit the object once – the changes will be reflected at all locations.</paragraph><header>Multi-site deployment</header><paragraph><embed align="center" size="original" object_id="125"/></paragraph><paragraph>One installation of eZ Publish can host many different websites with the possibility to re-use content, functionality and design across the different sites. You can have a continuous overview of all your sites and can even industrialize this deployment via the Site Factory management service in <link url_id="85">eZ Publish Premium</link> subscription services.</paragraph><header>URL management and search engine optimization</header><paragraph><embed align="center" size="original" object_id="126"/></paragraph><paragraph>eZ Publish makes it easy for you to create content that will be effectively indexed by search engines. Sitemaps, friendly URLs, and easy management of key XHTML tags are all built-in features.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '638', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 527 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '639', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 528 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-manage-eZ-Publish.jpg" suffix="jpg" basename="How-to-manage-eZ-Publish" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/640-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/640-1-eng-US/How-to-manage-eZ-Publish.jpg" original_filename="c6fabb5a.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154187"><original attribute_id="640" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '640', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 529 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '641', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 530 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '642', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 531 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '643', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 532 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '644', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 533 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '118', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '645', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 534 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '646', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 535 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '647', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 536 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics1/648-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics1/648-1-eng-US/graphics1.jpg" original_filename="3268defa.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="648" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '648', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 537 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '119', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '649', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 538 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '650', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 539 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '651', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 540 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics12/652-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics12/652-1-eng-US/graphics1.jpg" original_filename="06b28423.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="652" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '652', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 541 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '120', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '653', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 542 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '654', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 543 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '655', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 544 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics13/656-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics13/656-1-eng-US/graphics1.jpg" original_filename="fb93c150.jpg" mime_type="image/jpeg" width="540" height="414" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="656" attribute_version="1" attribute_language="eng-US"/><information Height="414" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '656', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 545 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '121', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '657', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 546 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '658', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 547 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '659', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 548 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics14/660-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics14/660-1-eng-US/graphics1.jpg" original_filename="e472d575.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="660" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '660', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 549 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '122', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '661', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 550 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '662', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 551 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '663', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 552 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics15/664-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics15/664-1-eng-US/graphics1.png" original_filename="724f9667.png" mime_type="image/png" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154188"><original attribute_id="664" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '664', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 553 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '123', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '665', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 554 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '666', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 555 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '667', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 556 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics16/668-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics16/668-1-eng-US/graphics1.jpg" original_filename="13338db0.jpg" mime_type="image/jpeg" width="540" height="405" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="668" attribute_version="1" attribute_language="eng-US"/><information Height="405" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '668', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 557 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '124', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '669', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 558 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '670', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 559 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '671', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 560 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics17/672-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics17/672-1-eng-US/graphics1.jpg" original_filename="00bc8122.jpg" mime_type="image/jpeg" width="500" height="423" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="672" attribute_version="1" attribute_language="eng-US"/><information Height="423" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '672', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 561 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '125', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '673', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 562 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '674', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 563 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '675', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 564 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics18/676-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-manage-ez-publish/graphics18/676-1-eng-US/graphics1.jpg" original_filename="d265bd27.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="676" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '676', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 565 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '126', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '677', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 566 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to develop with eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '678', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to develop with ez publish', + 'version' => '1', + ), + 567 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '679', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 568 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '680', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 569 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish is more than a basic CMS, but a content management platform based on a clear API that allows developers to customize and extend eZ Publish.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '681', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 570 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The content class concept</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Custom design: CSS and templates</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">High-quality library of PHP components</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Build eZ Publish extensions</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Which development environment?</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">eZ Publish community and resources</paragraph></li></ul></paragraph><section><section><header>The content class concept</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="128"/></paragraph><paragraph>Any piece of content in eZ Publish is a content object, which is an instance of a specific content class. A content class is a definition of an arbitrary data structure. It does not store any actual data.</paragraph><paragraph>A content class is made up of attributes. The characteristics of an attribute are determined by the datatype that is chosen for that specific attribute. By combining different datatypes, it is possible to represent complex data structures.</paragraph><paragraph>The illustration above shows the anatomy of a content class called "Article", which defines a data structure for storing news articles. It consists of attributes dedicated for storing the title, an introduction text and the actual body of an article.</paragraph></section></section><section><section><header>Custom design: CSS and templates</header><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="129"/></paragraph><paragraph>The first thing you may be willing to do is to change the look of your eZ Publish site. This can be done by modifying the CSS of eZ Publish and <link url_id="86">overriding templates</link>. You can even create reusable <link url_id="87">site packages</link> that include these CSS and template changes.</paragraph></section></section><section><section><header>High-quality library of PHP components</header><paragraph>eZ Publish 4.X as well as the next generations of eZ Publish are based on <link url_id="88">eZ Components</link> which are a high quality library of independent components aiming to help developers creating web centric applications like for example customising and extending eZ Publish.</paragraph><paragraph>In the eZ Components you will find components that focus their attention on solving important parts of Web application development. They are written for solving the re-occurring issues that Web application developers have to deal with when building their applications - without any superfluous ballast.</paragraph><paragraph>In order to cater for this goal, quality is also an important factor. The eZ Components development team uses a test-driven development methodology where a large effort is put into making the APIs easily testable. This also results in a better API for developers to use.</paragraph></section></section><section><section><header>Build eZ Publish extensions</header><paragraph>There is a clear API to develop your own PHP extensions in order to extend the functionality of eZ Publish. By using extensions it is possible to create new modules, datatypes, template operators, workflow events , or any integration with third party applications. You will find many contributed extensions available at <link url_id="89">Contribution page</link>.</paragraph></section></section><section><section><header>Which development environment?</header><paragraph>&nbsp;In an eZ Publish project, a <link url_id="90">Subversion (SVN)</link> repository is usually set up to track all changes during development projects. When it comes to IDE, both <link url_id="91">Eclipse</link> and <link url_id="92">PHPEdit</link> have been optimised for eZ Publish.</paragraph></section></section><section><section><header>eZ Publish community and resources</header><paragraph>When you start developing with eZ Publish, the community is definitely an environment to get in touch with. You will find your answers or get help in the forums as well as many contributions that will make save you time in your development projects.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '682', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 571 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '683', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 572 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-develop-with-eZ-Publish.png" suffix="png" basename="How-to-develop-with-eZ-Publish" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/684-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/684-1-eng-US/How-to-develop-with-eZ-Publish.png" original_filename="db3eaa06.png" mime_type="image/png" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154189"><original attribute_id="684" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '684', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 573 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '685', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 574 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '686', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 575 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '687', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 576 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '688', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 577 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '127', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '689', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 578 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '690', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 579 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '691', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 580 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics1/692-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics1/692-1-eng-US/graphics1.jpg" original_filename="c9dbc90f.jpg" mime_type="image/jpeg" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="692" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '692', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 581 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '128', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '693', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 582 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '694', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 583 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '695', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 584 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics12/696-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/how-to-develop-with-ez-publish/graphics12/696-1-eng-US/graphics1.png" original_filename="7e906b13.png" mime_type="image/png" width="540" height="411" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="696" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '696', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 585 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '129', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '697', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 586 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Lots of Websites, One eZ Publish Installation', + 'data_type_string' => 'ezstring', + 'id' => '698', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'lots of websites, one ez publish installation', + 'version' => '1', + ), + 587 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Adding Siteaccesses in eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '699', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'adding siteaccesses in ez publish', + 'version' => '1', + ), + 588 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Greg McAvoy-Jensen" email="admin@myportal.com"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '700', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 589 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>This tutorial gives developers the power to extend the features and flexibility of eZ Publish beyond a single website, to having an unlimited number in one installation. At the end of this tutorial you will have learned how to best leverage eZ Publish\'s siteaccess concept to create multiple websites. It will let you apply this concept through the concrete case of building two different, multilingual websites on one single eZ Publish instance.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '701', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 590 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><section><header>Introduction</header><paragraph>Users of eZ Publish sometimes wonder if it is possible to make use of a single installation of eZ Publish for multiple websites. The answer is yes - through the power of the siteaccess. In fact, an understanding of siteaccesses gives one the ability to do much more than just host multiple sites in one installation. With this technique you can:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">make it easier to share content between databases</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">copy and add locations to objects</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">use a single Premium agreement and one eZ Network extension for multiple sites with the same or different content</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">simplify eZ Publish upgrades by consolidating several sites on one installation</paragraph></li></ul></paragraph><paragraph>This is demo content, to continue real reading, please visit&nbsp;<link target="_blank" url_id="93">share.ez.no</link></paragraph></section><section><header>About the author : Greg McAvoy-Jensen</header><paragraph>Greg is the executive director of&nbsp;<link target="_blank" xhtml:title="Granite Horizon" url_id="94">Granite Horizon</link>, one of the largest eZ Publish development firms in the United States of America. A certified eZ Publish developer, he has served clients and trained developers on four continents since he started working with eZ Publish in 2003. His wife Heather and he are proud parents of three wonderful children.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '702', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 591 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '703', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 592 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="704" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '704', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 593 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '705', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 594 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '706', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 595 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '707', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 596 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '708', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 597 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '130', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '709', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 598 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'New features', + 'data_type_string' => 'ezstring', + 'id' => '710', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'new features', + 'version' => '1', + ), + 599 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '711', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 600 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '712', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 601 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '713', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 602 => array ( + 'attribute_original_id' => '714', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '714', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 603 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '715', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 604 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '131', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '716', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 605 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Improved user registration workflow', + 'data_type_string' => 'ezstring', + 'id' => '717', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'improved user registration workflow', + 'version' => '1', + ), + 606 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '718', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 607 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '719', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 608 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Approval workflow for the front-end user self-registration</paragraph><paragraph>Useful when you wish to control who logs on to your system</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '720', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 609 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Enable and configure the workflow:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Create workflow</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Connect workflow to new triggers</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Register user with approval workflow enabled</paragraph></li></ul></paragraph><paragraph>Enable the approval workflow functionality:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Go to the Administration Interface - “Setup” - “Workflows”</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><line>Create a user registration workflow, e.g “UserRegistration1”</line><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The FinishUserRegistration workflow is used to end the registration and trigger a confirmation notification that the user is successfully registered&nbsp;</paragraph></li></ul></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Create a workflow to finish the user registration, e.g “FinishUserRegistration”</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="original" custom:offset="0" custom:limit="5" object_id="133"/></paragraph><paragraph>Connect the two workflows to triggers:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">“UserRegistration1” to “content-publish-before”</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">“FinishUserRegistration” to “content-publish-after”</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="imagelarge" custom:offset="0" custom:limit="5" object_id="134"/></paragraph><paragraph>Now you have set up a workflow approval process. When a user logs in to register himself as a user he is presented with an approval workflow</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">At first time login the user clicks "Sign up" to register an account</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;When finished a mail is sent to to confirm the user email</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="imagelarge" custom:offset="0" custom:limit="5" object_id="135"/></paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">In the administration interface an event is created in the Dashboard’s&nbsp; “Collaboration” screen of an administrator or another role with the right policies</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The administrator can now either comment, approve or deny the request for user registration</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">The user gets a confirmation mail and can log in to eZ Publish.</paragraph></li></ul></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '721', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 610 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '722', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 611 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="723" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '723', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 612 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '724', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 613 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '725', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 614 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '726', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 615 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '727', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 616 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '132', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '728', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 617 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '729', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 618 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '730', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 619 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics1/731-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics1/731-1-eng-US/graphics1.png" original_filename="2f51f75c.png" mime_type="image/png" width="509" height="238" alternative_text="" alias_key="1293033771" timestamp="1311154190"><original attribute_id="731" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '731', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 620 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '133', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '732', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 621 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '733', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 622 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '734', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 623 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics12/735-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics12/735-1-eng-US/graphics1.jpg" original_filename="ec2680c6.jpg" mime_type="image/jpeg" width="1159" height="503" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="735" attribute_version="1" attribute_language="eng-US"/><information Height="503" Width="1159" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTE1OQ==</item><item key="ExifImageLength" base64="1">NTAz</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '735', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 624 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '134', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '736', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 625 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '737', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 626 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '738', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 627 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics13/739-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-user-registration-workflow/graphics13/739-1-eng-US/graphics1.jpg" original_filename="884d3f23.jpg" mime_type="image/jpeg" width="1338" height="217" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="739" attribute_version="1" attribute_language="eng-US"/><information Height="217" Width="1338" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTMzOA==</item><item key="ExifImageLength" base64="1">MjE3</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '739', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 628 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '135', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '740', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 629 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Improved block editing', + 'data_type_string' => 'ezstring', + 'id' => '741', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'improved block editing', + 'version' => '1', + ), + 630 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '742', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 631 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '743', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 632 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>Visual and usability changes:</paragraph><paragraph><ul><li><paragraph>The new screen for adding blocks</paragraph></li><li><paragraph>Saves space</paragraph></li></ul></paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '744', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 633 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph><embed align="center" size="large" object_id="137"/></paragraph><paragraph>The new screen for setting attributes for blocks</paragraph><paragraph><embed align="center" size="large" object_id="138"/></paragraph></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '745', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 634 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '746', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 635 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="747" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '747', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 636 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '748', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 637 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '749', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 638 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '750', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 639 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '751', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 640 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '136', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '752', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 641 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '753', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 642 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '754', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 643 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics1/755-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics1/755-1-eng-US/graphics1.jpg" original_filename="afc16bee.jpg" mime_type="image/jpeg" width="832" height="599" alternative_text="" alias_key="1293033771" timestamp="1311154191"><original attribute_id="755" attribute_version="1" attribute_language="eng-US"/><information Height="599" Width="832" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">ODMy</item><item key="ExifImageLength" base64="1">NTk5</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '755', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 644 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '137', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '756', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 645 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '757', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 646 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '758', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 647 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics12/759-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-block-editing/graphics12/759-1-eng-US/graphics1.jpg" original_filename="e9bde168.jpg" mime_type="image/jpeg" width="911" height="626" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="759" attribute_version="1" attribute_language="eng-US"/><information Height="626" Width="911" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">OTEx</item><item key="ExifImageLength" base64="1">NjI2</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '759', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 648 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '138', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '760', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 649 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Improved front-end editing', + 'data_type_string' => 'ezstring', + 'id' => '761', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'improved front-end editing', + 'version' => '1', + ), + 650 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '762', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 651 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '763', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 652 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed align="center" view="embed-inline" size="medium" custom:offset="0" custom:limit="5" object_id="141"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '764', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 653 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Front-end editing toolbar always in top of browser window</paragraph><paragraph>Aligned with the Admin2 look and feel</paragraph><paragraph>New button to open the administration interface in a new window (12)</paragraph><paragraph>New and higher contrast icons</paragraph><paragraph>Toolbar changes according to use, and also which extensions and program you run</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">In opening window</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">In editing mode</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">When editing folders</paragraph></li></ul></paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="140"/></paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Front-end toolbar: </line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;Timeline is marked.</line></paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="141"/></paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Editing folder toolbar: </line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;9-RSS feed, 10-Add to block, 11-Multiupload, 12-Administration interface</line></paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="142"/></paragraph><paragraph>Editing mode toolbar:&nbsp;</paragraph><paragraph>6-Preview, 7-Translate + translation button with flags</paragraph><paragraph><embed align="center" view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="143"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '765', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 654 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '766', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 655 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="767" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '767', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 656 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '768', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 657 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '769', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 658 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '770', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 659 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '771', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 660 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '139', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '772', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 661 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '773', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 662 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '774', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 663 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics1/775-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics1/775-1-eng-US/graphics1.jpg" original_filename="ff6bcfd1.jpg" mime_type="image/jpeg" width="1030" height="151" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="775" attribute_version="1" attribute_language="eng-US"/><information Height="151" Width="1030" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">OTA=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTAzMA==</item><item key="ExifImageLength" base64="1">MTUx</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '775', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 664 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '140', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '776', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 665 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '777', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 666 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '778', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 667 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US/graphics1.jpg" original_filename="f30d1e92.jpg" mime_type="image/jpeg" width="805" height="84" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="779" attribute_version="1" attribute_language="eng-US"/><information Height="84" Width="805" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">ODA1</item><item key="ExifImageLength" base64="1">ODQ=</item></array></information><alias name="medium" filename="graphics1_medium.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics12/779-1-eng-US/graphics1_medium.jpg" mime_type="image/jpeg" width="200" height="21" alias_key="3736024005" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '779', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 668 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '141', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '780', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 669 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '781', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 670 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '782', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 671 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics13/783-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics13/783-1-eng-US/graphics1.jpg" original_filename="17d497d3.jpg" mime_type="image/jpeg" width="1278" height="136" alternative_text="" alias_key="1293033771" timestamp="1311154192"><original attribute_id="783" attribute_version="1" attribute_language="eng-US"/><information Height="136" Width="1278" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTI3OA==</item><item key="ExifImageLength" base64="1">MTM2</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '783', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 672 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '142', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '784', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 673 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '785', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 674 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '786', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 675 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics14/787-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/improved-front-end-editing/graphics14/787-1-eng-US/graphics1.jpg" original_filename="c3833d09.jpg" mime_type="image/jpeg" width="1365" height="140" alternative_text="" alias_key="1293033771" timestamp="1311154193"><original attribute_id="787" attribute_version="1" attribute_language="eng-US"/><information Height="140" Width="1365" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTM2NQ==</item><item key="ExifImageLength" base64="1">MTQw</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '787', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 676 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '143', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '788', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 677 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'FastCGI', + 'data_type_string' => 'ezstring', + 'id' => '789', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fastcgi', + 'version' => '1', + ), + 678 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '790', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 679 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '791', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 680 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish supports FastCGI</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '792', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 681 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>What is FastCGI?</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI is also language-independent. For instance, FastCGI provides a way to improve the performance of the thousands of Perl applications that have been written for the Web.</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI runs applications in processes isolated from the core Web server, which provides greater security than APIs. (APIs link application code into the core Web server, which means that a bug in one API-based application can corrupt another application or the core server; a malicious API-based application can, for example, steal key security secrets from another application or the core server.)</paragraph></li></ul></paragraph><paragraph>Read more&nbsp;http://www.fastcgi.com/</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '793', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 682 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '794', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 683 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154193"><original attribute_id="795" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '795', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 684 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '796', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 685 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '797', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 686 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '798', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 687 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '799', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 688 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '144', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '800', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 689 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support for Red Hat Enterprise', + 'data_type_string' => 'ezstring', + 'id' => '801', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'support for red hat enterprise', + 'version' => '1', + ), + 690 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '802', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 691 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '803', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 692 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>combined with eZ Publish Enterprise, you can now enjoy a system supported all through the stack!</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '804', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 693 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed align="center" view="embed" size="original" object_id="146"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '805', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 694 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '806', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 695 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154193"><original attribute_id="807" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '807', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 696 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '808', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 697 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '809', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 698 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '810', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 699 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '811', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 700 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '145', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '812', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 701 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '813', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 702 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '814', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 703 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/support-for-red-hat-enterprise/graphics1/815-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/support-for-red-hat-enterprise/graphics1/815-1-eng-US/graphics1.png" original_filename="733e4b0a.png" mime_type="image/png" width="476" height="128" alternative_text="" alias_key="1293033771" timestamp="1311154194"><original attribute_id="815" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '815', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 704 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '146', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '816', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 705 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Canonical links', + 'data_type_string' => 'ezstring', + 'id' => '817', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'canonical links', + 'version' => '1', + ), + 706 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '818', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 707 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '819', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 708 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>eZ Publish 4.5 supports a canonical link feature that helps search engines to figure out duplicate content issues and allow them to index relevant content.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '820', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 709 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>For simple siteaccesses, like nor, fre, ger, eng the feature works out of the box &nbsp;</paragraph><paragraph><ul><li><paragraph>More complex mappings require a manual configuration in the file</paragraph></li><li><paragraph>You use the canonical link to tell the search engines which url is the preferred one when you have several duplicate urls.</paragraph></li></ul></paragraph><paragraph>Example of duplicate urls:</paragraph><paragraph>- <link url_id="95">www.example.com</link></paragraph><paragraph>- example.com</paragraph><paragraph>- <link url_id="96">www.example.com/index.html</link></paragraph><paragraph>- example.com/home.asp</paragraph><paragraph>Example of canonical link:</paragraph><paragraph><link rel="canonical" href="<link url_id="95">http://www.example.com</link>/" /></paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '821', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 710 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '822', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 711 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154194"><original attribute_id="823" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '823', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 712 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '824', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 713 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '825', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 714 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '826', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 715 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '827', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 716 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '147', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '828', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 717 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Asynchronous publishing', + 'data_type_string' => 'ezstring', + 'id' => '829', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'asynchronous publishing', + 'version' => '1', + ), + 718 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '830', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 719 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '831', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 720 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>The ability to use defer publishing, for improved scalability in high load, multi-editor environments.</paragraph></section></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '832', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 721 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section><paragraph>eZ Publish 4.5 supports a new publishing method used in an environment with a large simultaneous load on the database</paragraph><paragraph><ul><li><paragraph>offers a robust multi-editor environment with parallel publishing</paragraph></li><li><paragraph>controls the number of objects that can be published concurrently</paragraph></li><li><paragraph>sends publishing requests to a queue for asynchronous publishing </paragraph></li><li><paragraph>a daemon handles the publishing requests and the queue in the background </paragraph></li><li><paragraph>for multiple databases</paragraph></li><li><paragraph>better database error handling</paragraph></li><li><paragraph>filtering hooks</paragraph></li></ul></paragraph><paragraph><table width="100%"><tr><td><paragraph>The process:</paragraph><paragraph><ul><li><paragraph>Press "Send for publishing"</paragraph></li><li><paragraph>The request to publish is queued</paragraph></li><li><paragraph>This queue is monitored by the daemon&nbsp;</paragraph></li><li><paragraph>Follow the status of the publishing</paragraph></li></ul></paragraph><paragraph>Queue statuses:</paragraph><paragraph><strong>Pending:</strong> The publishing request is now in a queue of publishing requests</paragraph><paragraph><strong>Working:</strong> The request is processed to find a queue and a place in the queue</paragraph><paragraph><strong>Published:</strong> The request has been processed and the object published</paragraph><paragraph>Irregularities prompts error messages</paragraph></td><td/></tr></table></paragraph><paragraph><embed align="center" size="large" object_id="149"/></paragraph><paragraph>Enable the service in “content.ini”:</paragraph><paragraph><literal>[PublishingSettings] + # Enable/Disable the asynchronous publishing feature + AsynchronousPublishing=enabled + </literal></paragraph><paragraph>Customize the queue size in “content.ini”:</paragraph><paragraph><literal>[PublishingSettings] + # how many parallel publishing operations should be allowed + # default: 10 + PublishingProcessSlots=10 + </literal></paragraph><paragraph>Setting up the service with an init script (recommended in a production setting):</paragraph><paragraph>- For Red Hat Enterprise Linux, CentOS, Fedora, SUSE:</paragraph><paragraph><literal>bin/startup/rhel/ezasynchronouspublisher + </literal></paragraph><paragraph>- For Debian and Ubuntu:</paragraph><paragraph><literal>bin/startup/debian/ezasynchronouspublisher + </literal></paragraph><paragraph>Example of script for Debian:</paragraph><paragraph><literal>cd /etc/init.d + ln -s /path/to/ezpublish/bin/startup/debian/ezasynchronouspublisher + chmod +x ezasynchronouspublisher + </literal></paragraph><paragraph>Start daemon:</paragraph><paragraph><literal>/etc/init.d/ezasynchronouspublisher start + </literal></paragraph><paragraph>Daemon options:</paragraph><paragraph><literal>/etc/init.d/ezasynchronouspublisher help + </literal></paragraph><paragraph>Configure daemon to start up on boot:</paragraph><paragraph><literal>chkconfig ezasynchronouspublisher on + </literal></paragraph></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '833', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 722 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '834', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 723 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154194"><original attribute_id="835" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '835', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 724 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/"><section/></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '836', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 725 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '837', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 726 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '838', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 727 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '839', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 728 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '148', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '840', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 729 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '841', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 730 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '842', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 731 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.jpg" suffix="jpg" basename="graphics1" dirpath="var/ezwebin_site/storage/images/getting-started/new-features/asynchronous-publishing/graphics1/843-1-eng-US" url="var/ezwebin_site/storage/images/getting-started/new-features/asynchronous-publishing/graphics1/843-1-eng-US/graphics1.jpg" original_filename="a2a28ec0.jpg" mime_type="image/jpeg" width="1413" height="1060" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="843" attribute_version="1" attribute_language="eng-US"/><information Height="1060" Width="1413" IsColor="1" ByteOrderMotorola="1"><array name="ifd0"><item key="XResolution" base64="1">MTUwLzE=</item><item key="YResolution" base64="1">MTUwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">Nzg=</item></array><array name="exif"><item key="ExifImageWidth" base64="1">MTQxMw==</item><item key="ExifImageLength" base64="1">MTA2MA==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '843', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 732 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '149', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '844', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 733 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'REST API interface', + 'data_type_string' => 'ezstring', + 'id' => '845', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'rest api interface', + 'version' => '1', + ), + 734 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '846', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 735 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '847', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 736 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>New RESTful interface, which will allow external client implementations, to access and query content resources inside an eZ Publish installation.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '848', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 737 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Version 1.0 of eZ Publish REST API contains:</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;OAUTH authentication</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;Basic content retrieval</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;REST API Extension mechanism</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">&nbsp;REST API versioning</paragraph></li></ul></paragraph><paragraph><strong>Presentation</strong></paragraph><paragraph><link target="_blank" url_id="18"><embed align="left" view="embed" size="original" custom:offset="0" custom:limit="5" object_id="66"/></link></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '849', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 738 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '850', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 739 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="851" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '851', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 740 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '852', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 741 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '853', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 742 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '854', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 743 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '855', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 744 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '150', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '856', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 745 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'eZ Publish Enterprise', + 'data_type_string' => 'ezstring', + 'id' => '857', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ez publish enterprise', + 'version' => '1', + ), + 746 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '858', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 747 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '859', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 748 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Enterprise Web Content Management</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '860', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 749 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><table class="default" width="100%" border="0" custom:summary="paragraph" custom:caption=""><tr><td><paragraph>A global web content management system leader, eZ Systems was founded in 1999 and has 10 offices worldwide. eZ Systems’ flagship product, eZ Publish, is the leading enterprise Web Content Management (WCM) platform specializing in multichannel content distribution for web, mobile, tablets, print and more.</paragraph><paragraph>Because eZ Publish is a commercial open source product, eZ Systems engineers can leverage the innovation from a global community of over 38 000 developers and certified implementation partners. This innovation drives over 200 000 worldwide installations, proving that eZ Publish is one of the most adaptable, open and reliable WCM platforms in the market.</paragraph></td><td><paragraph><embed align="center" view="embed-inline" size="listitem" custom:offset="0" custom:limit="5" object_id="152"/></paragraph></td></tr></table></paragraph><paragraph>The eZ Publish Enterprise Edition is the perfect blend of reliable vendor support and quality</paragraph><paragraph>assured innovation: enterprise customers pay a cost effective yearly subscription fee for support, maintenance, update training and other services, and eZ Systems releases major software updates every 6 months. All of this comes with no license fee.</paragraph><paragraph>With offices in Europe, the Nordics, the Americas and Asia, eZ Systems is a recognized global WCM leader in the media and publishing industry. This industry demands the most flexible, secure, maintainable and complex solutions to power large web properties and generate revenue from an array of content sources. With a track record spanning more than 10 years in this space, eZ Publish has now become the software of choice for customers in banking and finance, retail, government and non- government organizations. If you have advanced publishing needs, eZ Publish is right for you.</paragraph><section><section><header>Multichannel Content Distribution</header><paragraph>eZ Publish delivers unsurpassed multichannel capabilities that enable customers to reach out and engage your audience. eZ’s out-of-the-box functionality, intrinsic scalability and robust API help you to do this quickly, accelerating your time to market while reducing your implementation costs.&nbsp;</paragraph><paragraph><strong>&nbsp;</strong></paragraph></section></section><section><section><header>Enabling Editors</header><paragraph>eZ Publish provides a rich tool set that makes authoring and editing content simple and engaging. eZ Publish frees your editorial and creative staff to do what they do best: publish content with enthusiasm and minimal effort.</paragraph><section><header>Plan, Review, Automate</header><paragraph>Publishing is one thing, but managing portals and front pages is a different story. eZ Publish Enterprise has a unique portal management solution that enables editors to build complex page layouts and plan, review and automate the publication schedule to ensure a constant flow of rich content through portal pages.</paragraph><paragraph>For example, editors can define multiple “zones” within a single page layout. Within each zone, editors create “blocks” that promote content in a certain way. Next, editors explicitly or implicitly add content objects to these blocks and then schedule</paragraph><paragraph>the promotion, flow and rotation of content. To “look into the future,” editors simply drag a slider across a timeline to preview content before it goes live. This entire process can be managed without the support of a web developer.</paragraph></section><section><header>Collaborate</header><paragraph>We know that editors do not work alone. eZ Publish provides flexible workflow and collaboration tools and dashboards to keep your team in sync. And you can configure the system to adapt to your own workflows, however intricate they may be.</paragraph></section></section></section><section><section><header>Adaptable Content Engine and User Interfaces</header><paragraph>eZ’s unique, flexible content model completely separates content from presentation, so that the delivery of your content can adapt to any current or future distribution channel. Furthermore, you can design the system to fit your needs—your do not have to force your content into a “one size fits all” construct. This structure sets your content free for re-use and re-purposing. This powerful flexibility is the source of eZ’s strength as multichannel content management platform.</paragraph><paragraph>The system also adapts to your editors’ style of work. They can choose to import content from multiple sources, utilize a simple editing toolbar while browsing your site, or use the powerful back office editing suite. The efficient user interfaces and flexibility flattens the learning curve and accelerates internal adoption of eZ Publish.</paragraph></section></section><section><section><header>Open Enterprise Technology</header><paragraph>eZ Publish’s open architecture supports Interoperability Open Standards like XML, ODF, SOAP, REST, JSON. When you utilize the powerful API, it’s simple to integrate the eZ Enterprise platform with all of your information management systems. In fact, there are over 1000 extensions available to accelerate your project and reduce development costs.</paragraph></section></section><section><section><header>Reliable Vendor Support</header><paragraph>eZ Systems is dedicated to your success. We succeed only if you do. Our customers benefit from our commercial support packages that are customized to meet the nature of your project and service level agreements. Our highly qualified product support engineers thrive on your complete satisfaction, and enjoy enabling our partners and customers with accurate and thorough responses to support requests.</paragraph><paragraph>In addition to this unlimited product support, we provide a variety of expert training and consulting services to certify and assist developers and implementation partners around the globe. We host self-service tools like user and technical documentation, forums, books, tutorials, articles and community sites to distribute and share best practices. Our dedication to supporting our clients and partners is the core service of eZ’s Enterprise Open Source Business model.</paragraph></section></section><section><section><header>They trust in eZ</header><paragraph><embed view="embed-inline" size="large" custom:offset="0" custom:limit="5" object_id="153"/></paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '861', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 750 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '862', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 751 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="863" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '863', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 752 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '864', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 753 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '865', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 754 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '866', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 755 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '867', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 756 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '151', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '868', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 757 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '869', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 758 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '870', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 759 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics1/871-1-eng-US" url="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics1/871-1-eng-US/graphics1.png" original_filename="068699a4.png" mime_type="image/png" width="332" height="293" alternative_text="" alias_key="1293033771" timestamp="1311154195"><original attribute_id="871" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '871', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 760 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '152', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '872', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 761 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'graphics1', + 'data_type_string' => 'ezstring', + 'id' => '873', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'graphics1', + 'version' => '1', + ), + 762 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>graphics1</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '874', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 763 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="graphics1.png" suffix="png" basename="graphics1" dirpath="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics12/875-1-eng-US" url="var/ezwebin_site/storage/images/ez-publish-enterprise/graphics12/875-1-eng-US/graphics1.png" original_filename="d1120108.png" mime_type="image/png" width="448" height="151" alternative_text="" alias_key="1293033771" timestamp="1311154196"><original attribute_id="875" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '875', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 764 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '153', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '876', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 765 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '877', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 766 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '61', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '878', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '61', + 'sort_key_string' => '', + 'version' => '1', + ), + 767 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '879', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 768 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><table class="default" width="100%" border="0"><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="163"/></paragraph></td><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="162"/></paragraph></td></tr><tr><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="158"/></paragraph></td><td><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="155"/></paragraph></td></tr><tr><td/><td/></tr></table></paragraph><paragraph><custom name="separator"/></paragraph><paragraph><embed size="medium" align="center" custom:offset="0" custom:limit="5" object_id="164"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '880', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 769 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="vertically_listed_sub_items" size="medium" align="center" custom:offset="0" custom:limit="5" object_id="155"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '881', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 770 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed class="horizontally_listed_sub_items" size="medium" align="center" custom:offset="0" custom:limit="5" object_id="158"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '882', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 771 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '154', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '883', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 772 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partner News', + 'data_type_string' => 'ezstring', + 'id' => '884', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partner news', + 'version' => '1', + ), + 773 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '885', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 774 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Maecenas vulputate facilisis velit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '886', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 775 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin felis neque, auctor in, tempor non, ultrices vel, odio. Proin condimentum risus vitae felis. Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec, condimentum bibendum, quam. Ut congue quam ac lorem. Duis risus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '887', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 776 => array ( + 'attribute_original_id' => '888', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '888', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 777 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '889', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 778 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '155', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '890', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 779 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Pellentesque quam mauris', + 'data_type_string' => 'ezstring', + 'id' => '891', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'pellentesque quam mauris', + 'version' => '1', + ), + 780 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '892', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 781 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '893', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 782 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Maecenas vulputate facilisis velit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '894', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 783 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras facilisis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vivamus aliquet, pede vitae facilisis bibendum, neque orci malesuada felis, at bibendum est mi nec ipsum. Sed egestas blandit neque. Curabitur hendrerit dignissim justo. Aliquam erat volutpat. Phasellus sollicitudin, magna dictum placerat consequat, sem enim porttitor odio, vel tempor enim felis et justo.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '895', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 784 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '896', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 785 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Pellentesque-quam-mauris.jpg" suffix="jpg" basename="Pellentesque-quam-mauris" dirpath="var/ezwebin_site/storage/images/partners/partner-news/pellentesque-quam-mauris/897-1-eng-US" url="var/ezwebin_site/storage/images/partners/partner-news/pellentesque-quam-mauris/897-1-eng-US/Pellentesque-quam-mauris.jpg" original_filename="61bfee3f.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Pellentesque quam mauris" alias_key="1293033771" timestamp="1311154196"><original attribute_id="897" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '897', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 786 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque quam mauris</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '898', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 787 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '1175497860', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '899', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175497860', + 'sort_key_string' => '', + 'version' => '1', + ), + 788 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '900', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 789 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '901', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 790 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '156', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '902', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 791 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Penatibus et magnis dis', + 'data_type_string' => 'ezstring', + 'id' => '903', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'penatibus et magnis dis', + 'version' => '1', + ), + 792 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '904', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 793 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '905', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 794 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '906', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 795 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '907', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 796 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '908', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 797 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Penatibus-et-magnis-dis.jpg" suffix="jpg" basename="Penatibus-et-magnis-dis" dirpath="var/ezwebin_site/storage/images/partners/partner-news/penatibus-et-magnis-dis/909-1-eng-US" url="var/ezwebin_site/storage/images/partners/partner-news/penatibus-et-magnis-dis/909-1-eng-US/Penatibus-et-magnis-dis.jpg" original_filename="e86ae2c7.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Penatibus et magnis dis" alias_key="1293033771" timestamp="1311154197"><original attribute_id="909" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '909', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 798 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '910', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 799 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '1175498940', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '911', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175498940', + 'sort_key_string' => '', + 'version' => '1', + ), + 800 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '912', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 801 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '913', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 802 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '157', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '914', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 803 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'News', + 'data_type_string' => 'ezstring', + 'id' => '915', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'news', + 'version' => '1', + ), + 804 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '916', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 805 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce lacus. Mauris eu enim. Integer tincidunt sapien quis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '917', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 806 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Duis semper sodales purus. Aenean ullamcorper. Sed tempor est sollicitudin leo. Sed odio orci, commodo placerat, consectetuer eget, tincidunt ac, lorem. Quisque dapibus. Duis turpis odio, mattis eget, tristique at, consequat id, quam. Nullam volutpat, eros quis bibendum sollicitudin, lectus neque accumsan lorem, et faucibus nulla ipsum quis leo. Vestibulum a diam a urna adipiscing ornare. Maecenas consequat ligula id nisi. Etiam euismod sodales purus. Praesent dignissim lobortis dui. Sed nonummy felis in lorem. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '918', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 807 => array ( + 'attribute_original_id' => '919', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '919', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 808 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '920', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 809 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '158', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '921', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 810 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Curabitur hendrerit dignissim', + 'data_type_string' => 'ezstring', + 'id' => '922', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'curabitur hendrerit dignissim', + 'version' => '1', + ), + 811 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '923', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 812 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '924', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 813 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur hendrerit dignissim justo. Aliquam erat volutpat. Phasellus sollicitudin, magna dictum placerat consequat. Praesent eu quam. Nam sollicitudin congue augue.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '925', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 814 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sem enim porttitor odio, vel tempor enim felis et justo. Duis sollicitudin eros id eros. Nunc convallis tristique est. Nam vel ligula. Sed augue. Aliquam erat volutpat. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '926', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 815 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '927', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 816 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Curabitur-hendrerit-dignissim.jpg" suffix="jpg" basename="Curabitur-hendrerit-dignissim" dirpath="var/ezwebin_site/storage/images/partners/news/curabitur-hendrerit-dignissim/928-1-eng-US" url="var/ezwebin_site/storage/images/partners/news/curabitur-hendrerit-dignissim/928-1-eng-US/Curabitur-hendrerit-dignissim.jpg" original_filename="806a2270.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Curabitur hendrerit dignissim" alias_key="1293033771" timestamp="1311154197"><original attribute_id="928" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '928', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 817 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Curabitur hendrerit</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '929', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 818 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '1175497920', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '930', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175497920', + 'sort_key_string' => '', + 'version' => '1', + ), + 819 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '931', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 820 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '932', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 821 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '159', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '933', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 822 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Proin condimentum risus', + 'data_type_string' => 'ezstring', + 'id' => '934', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'proin condimentum risus', + 'version' => '1', + ), + 823 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '935', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 824 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '936', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 825 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Proin condimentum risus vitae felis. Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '937', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 826 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Ut congue quam ac lorem. Duis risus. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque sodales tortor. Phasellus adipiscing pretium nibh. Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Praesent eu quam. Nam sollicitudin congue augue. Nulla facilisi. Nunc in turpis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '938', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 827 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '939', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 828 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Proin-condimentum-risus.jpg" suffix="jpg" basename="Proin-condimentum-risus" dirpath="var/ezwebin_site/storage/images/partners/news/proin-condimentum-risus/940-1-eng-US" url="var/ezwebin_site/storage/images/partners/news/proin-condimentum-risus/940-1-eng-US/Proin-condimentum-risus.jpg" original_filename="815e11b9.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Proin condimentum risus" alias_key="1293033771" timestamp="1311154198"><original attribute_id="940" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '940', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 829 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Proin condimentum</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '941', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 830 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '1175498280', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '942', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175498280', + 'sort_key_string' => '', + 'version' => '1', + ), + 831 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '943', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 832 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '944', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 833 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '160', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '945', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 834 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Morbi tristique senectus', + 'data_type_string' => 'ezstring', + 'id' => '946', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'morbi tristique senectus', + 'version' => '1', + ), + 835 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '947', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 836 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '948', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 837 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin felis neque, auctor in, tempor non, ultrices vel, odio. Proin condimentum risus vitae felis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '949', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 838 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec, condimentum bibendum, quam. Ut congue quam ac lorem. Duis risus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '950', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 839 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '951', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 840 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Morbi-tristique-senectus.jpg" suffix="jpg" basename="Morbi-tristique-senectus" dirpath="var/ezwebin_site/storage/images/partners/news/morbi-tristique-senectus/952-1-eng-US" url="var/ezwebin_site/storage/images/partners/news/morbi-tristique-senectus/952-1-eng-US/Morbi-tristique-senectus.jpg" original_filename="d992fbc6.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Morbi tristique senectus" alias_key="1293033771" timestamp="1311154198"><original attribute_id="952" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '952', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 841 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Morbi tristique senectus</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '953', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 842 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '1175498880', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '954', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175498880', + 'sort_key_string' => '', + 'version' => '1', + ), + 843 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '955', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 844 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '956', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 845 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '161', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '957', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 846 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partner Products', + 'data_type_string' => 'ezstring', + 'id' => '958', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partner products', + 'version' => '1', + ), + 847 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '959', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 848 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Maecenas ac dolor. Nam varius risus nec pede consequat porttitor. Lorem ipsum dolor sit amet, consectetuer adipiscing.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '960', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 849 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Proin felis neque, auctor in, tempor non, ultrices vel, odio. Proin condimentum risus vitae felis. Aliquam imperdiet nisl non quam. Ut euismod. Nullam fringilla euismod diam. Nunc eros metus, suscipit at, egestas nec, condimentum bibendum, quam. Ut congue quam ac lorem. Duis risus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '961', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 850 => array ( + 'attribute_original_id' => '962', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '962', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 851 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '963', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 852 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '162', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '964', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 853 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '965', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 854 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '966', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 855 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>In in ante. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Quisque sodales tortor. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '967', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 856 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Phasellus adipiscing pretium nibh. Pellentesque quam mauris, sodales at, rutrum eu, pulvinar ut, velit. Aliquam consequat tempus dolor. Pellentesque dignissim orci. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Praesent eu quam. Nam sollicitudin congue augue. Nulla facilisi. Nunc in turpis. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '968', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 857 => array ( + 'attribute_original_id' => '969', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '969', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 858 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '970', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 859 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '163', + 'data_float' => '0', + 'data_int' => '1176187671', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '971', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187671', + 'sort_key_string' => '', + 'version' => '1', + ), + 860 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Neque orci malesuada felis', + 'data_type_string' => 'ezstring', + 'id' => '972', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'neque orci malesuada felis', + 'version' => '1', + ), + 861 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '973', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 862 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '974', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 863 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Cras facilisis. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis sollicitudin eros id eros. Nunc convallis tristique est. Nam vel ligula. Sed augue. Aliquam erat volutpat. Maecenas vulputate facilisis velit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras facilisis.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '975', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 864 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus aliquet, pede vitae facilisis bibendum, neque orci malesuada felis, at bibendum est mi nec ipsum. Sed egestas blandit neque. Curabitur hendrerit dignissim justo. Aliquam erat volutpat. Phasellus sollicitudin, magna dictum placerat consequat, sem enim porttitor odio, vel tempor enim felis et justo. Duis sollicitudin eros id eros. Nunc convallis tristique est. Nam vel ligula. Sed augue. Aliquam erat volutpat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '976', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 865 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '977', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 866 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Neque-orci-malesuada-felis.jpg" suffix="jpg" basename="Neque-orci-malesuada-felis" dirpath="var/ezwebin_site/storage/images/partners/partners/neque-orci-malesuada-felis/978-1-eng-US" url="var/ezwebin_site/storage/images/partners/partners/neque-orci-malesuada-felis/978-1-eng-US/Neque-orci-malesuada-felis.jpg" original_filename="4aa68ccb.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Neque orci malesuada felis" alias_key="1293033771" timestamp="1311154199"><original attribute_id="978" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '978', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 867 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Neque orci malesuada</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '979', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 868 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '1175499180', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '980', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1175499180', + 'sort_key_string' => '', + 'version' => '1', + ), + 869 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '981', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 870 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '982', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 871 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '164', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '983', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 872 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Community', + 'data_type_string' => 'ezstring', + 'id' => '984', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'community', + 'version' => '1', + ), + 873 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '58', + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '985', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '58', + 'sort_key_string' => '', + 'version' => '1', + ), + 874 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="itemized_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="170"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '986', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 875 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '239', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="itemized_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="185"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '987', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 876 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '240', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="itemized_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="166"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '988', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 877 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '241', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="medium" class="horizontally_listed_sub_items" align="center" custom:offset="0" custom:limit="5" object_id="176"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '989', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 878 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '242', + 'contentobject_id' => '165', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '990', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 879 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '302', + 'contentobject_id' => '166', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Forum', + 'data_type_string' => 'ezstring', + 'id' => '991', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'forum', + 'version' => '1', + ), + 880 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '303', + 'contentobject_id' => '166', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '992', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 881 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '304', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nulla vitae tellus sit amet', + 'data_type_string' => 'ezstring', + 'id' => '993', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'nulla vitae tellus sit amet', + 'version' => '1', + ), + 882 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '305', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nulla vitae tellus sit amet velit tincidunt gravida. Vivamus cursus, pede et lacinia porttitor, urna ante sagittis velit, id vulputate dui metus a erat.', + 'data_type_string' => 'eztext', + 'id' => '994', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 883 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '306', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '995', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 884 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '307', + 'contentobject_id' => '167', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '996', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 885 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '304', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ut mollis sodales nibh', + 'data_type_string' => 'ezstring', + 'id' => '997', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ut mollis sodales nibh', + 'version' => '1', + ), + 886 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '305', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Donec vulputate lectus. Suspendisse tempus molestie metus. Nullam non velit eget elit iaculis fringilla. Ut interdum auctor orci. Ut mollis sodales nibh.', + 'data_type_string' => 'eztext', + 'id' => '998', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 887 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '306', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '999', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 888 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '307', + 'contentobject_id' => '168', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '1000', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 889 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '304', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nam risus leo', + 'data_type_string' => 'ezstring', + 'id' => '1001', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'nam risus leo', + 'version' => '1', + ), + 890 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '305', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Nulla facilisi. Nam risus leo, accumsan et, accumsan ut, aliquam sed, dui. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.', + 'data_type_string' => 'eztext', + 'id' => '1002', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 891 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '306', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1003', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 892 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '307', + 'contentobject_id' => '169', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '1004', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 893 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Wiki', + 'data_type_string' => 'ezstring', + 'id' => '1005', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'wiki', + 'version' => '1', + ), + 894 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vestibulum ultricies lorem sed pede. Donec massa. Cras imperdiet, lectus mollis rhoncus gravida, enim lacus iaculis libero, consectetuer lobortis sapien purus nec purus. Donec nulla dui, commodo et, porttitor eu, malesuada id, nisi. Cras in mi in dolor ultricies pretium. Curabitur pellentesque auctor ligula. Suspendisse malesuada, nunc a tempor lacinia, lectus turpis commodo urna, eu porta risus nisl nec dui. Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1006', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 895 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1007', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 896 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '170', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1008', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 897 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Sed suscipit', + 'data_type_string' => 'ezstring', + 'id' => '1009', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'sed suscipit', + 'version' => '1', + ), + 898 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Sed suscipit feugiat erat. Vestibulum interdum congue arcu. Ut euismod, arcu a ornare auctor, sapien nisl viverra arcu, in mattis nibh justo ac ipsum. Nunc nibh urna, nonummy id, vestibulum eget, interdum at, erat. Nulla consequat.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1010', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 899 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1011', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 900 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '171', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1012', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 901 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ut interdum', + 'data_type_string' => 'ezstring', + 'id' => '1013', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ut interdum', + 'version' => '1', + ), + 902 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Etiam nec metus. Proin mauris lorem, lobortis dapibus, semper id, nonummy eu, lacus. Aliquam erat volutpat. Vivamus hendrerit aliquam ipsum. Maecenas suscipit ante sit amet risus. Nullam lacus. Praesent varius imperdiet sapien. Nulla sit amet massa nonummy felis aliquam varius. Vivamus sed arcu. Mauris sodales tristique risus. Cras sed sem. Quisque est eros, lacinia id, placerat sit amet, varius ac, odio. Aenean placerat, justo eu laoreet laoreet, purus quam faucibus risus, vel accumsan mauris ligula in magna.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1014', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 903 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1015', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 904 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '172', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1016', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 905 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Fusce pulvinar', + 'data_type_string' => 'ezstring', + 'id' => '1017', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fusce pulvinar', + 'version' => '1', + ), + 906 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Donec consectetuer sodales urna. Nam iaculis. Duis cursus nisl ut lorem. Vivamus pharetra pretium nulla. Mauris pharetra augue a dolor. Duis neque lorem, rhoncus nec, mattis id, dapibus vel, nisl. Quisque aliquam pellentesque leo. Ut in ante. Aliquam mollis, dolor eget malesuada euismod, tellus mi hendrerit dui, sit amet vestibulum neque massa ut mauris. Phasellus sed nisi. In eget odio nec tellus semper placerat. Fusce pulvinar malesuada nibh. Aliquam feugiat ligula ut nulla. Phasellus vitae felis in nulla gravida commodo. Cras magna justo, ultricies ut, euismod vitae, congue quis, quam. Mauris est purus, lobortis vitae, rutrum eu, dictum sed, mauris. In vehicula viverra dui. Curabitur id neque. Praesent facilisis. Mauris est. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1018', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 907 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1019', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 908 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '173', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1020', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 909 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Duis id tortor', + 'data_type_string' => 'ezstring', + 'id' => '1021', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'duis id tortor', + 'version' => '1', + ), + 910 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Fusce iaculis. Duis id tortor sit amet quam interdum accumsan. Vestibulum imperdiet odio non nisl. Nulla in odio. Sed sed libero sed risus eleifend bibendum. Cras arcu tellus, congue ac, ornare eget, vulputate non, pede. Vivamus molestie purus ut orci. Integer congue aliquam purus. Fusce eu metus eu mauris imperdiet porta. Nam urna mi, consequat in, iaculis eget, tempor eu, elit. Fusce lorem. Sed nec velit sed augue malesuada blandit. Nullam quis elit id lorem adipiscing condimentum. Nullam aliquam justo nec urna. Integer eget libero. Sed in tellus non lorem iaculis consequat. Aenean at lorem dictum mi imperdiet consequat. Sed euismod sodales magna. Cras consectetuer pede ac massa porta lacinia.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1022', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 911 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1023', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 912 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '174', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1024', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 913 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '243', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Curabitur lacinia', + 'data_type_string' => 'ezstring', + 'id' => '1025', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'curabitur lacinia', + 'version' => '1', + ), + 914 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '244', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Mauris pede libero, accumsan vel, tristique eget, tempus sit amet, sapien. Fusce sed arcu. Pellentesque pharetra mattis velit. In nec eros. Praesent viverra metus ut tellus. In tellus elit, imperdiet at, tincidunt egestas, malesuada sed, nisl. Aliquam posuere mattis pede. Curabitur lacinia condimentum nunc. Phasellus mattis. Fusce ac pede. Ut in neque. Fusce adipiscing mi sit amet velit. Cras varius. Vivamus elementum dui id lectus. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1026', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 915 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '245', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1027', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 916 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '246', + 'contentobject_id' => '175', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1028', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 917 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '286', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Pictures', + 'data_type_string' => 'ezstring', + 'id' => '1029', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'pictures', + 'version' => '1', + ), + 918 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '287', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>images&nbsp;by Quoc Huy and Paal Berg</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1030', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 919 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '288', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1031', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 920 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '289', + 'contentobject_id' => '176', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '1032', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 921 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Ivo on eZ Tags', + 'data_type_string' => 'ezstring', + 'id' => '1033', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ivo on ez tags', + 'version' => '1', + ), + 922 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1034', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 923 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Ivo-on-eZ-Tags.jpg" suffix="jpg" basename="Ivo-on-eZ-Tags" dirpath="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US/Ivo-on-eZ-Tags.jpg" original_filename="9c0a818b.jpg" mime_type="image/jpeg" width="640" height="480" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1035" attribute_version="1" attribute_language="eng-US"/><information Height="480" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/4.9" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxMTozNjo1MQ==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvMzAw</item><item key="FNumber" base64="1">NDkvMTA=</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">ODAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxMTozNjo1MQ==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxMTozNjo1MQ==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">NDcwLzEw</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAAAAQAAAaAAMAAQAAAAIAAAAcAAMAAQAAAAIAAAAfAAMAAQAAAAEAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAANAlAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAAAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAIAAAAyAAMAAQAAAAAAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAEAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAAAAAAAACgAMAAQAAAAIAAAADgAMAAQAAAAEAAAAEgAMAAQAAAKQGAAAFgAMAAQAAAB4EAAAGgAMAAQAAAIYHAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCAoq8AAqSvADCmrwAAyq9EALKvAQC0rwAAuq8IALyv7/++rw0A+K8AAPqvAACor1QEqq9sD8ivTUDYr3wDtq8gAbivAADOr9MA0q8hANCvKACsr5UBsK9EAK6vRADUr2UA9K8oAPKvKADirwAA5K8CAOCvXw/mrwAA6K8BAOqvAADsrwAA9q9xNNqvAADWrwAE8K8kAAQGwxkKBmwPyAYBAZqvAACcryAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFXQIiBWIC7gddAiQFcgQQBWgD3gaeAyYFCwDABgAAKAU6ARgFWQI6BQEAxRkAAFAFVwJSBYACygaoAAAFAwA2BQAAQgUAAAgFAAACBQAACgUAAAQFAABABQAABAcAAAwHAAAGBwAACAcAAAoHAADyBgAA9gb///QGAAD4Bv//DgVnAyoFTgAsBQEDMgUBA/oGWQL8BqgAAAcAAjsFAQA+BQEAxhlXAsgZkAIwBQABHAXfAOgG+AoaBWoT7wYBAPAGAAD+BoAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgczABAHAAASByMAFAcBABYHXgAXBwAAGAcAAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFKgFYBRIDWgXUAPD/V0LqAAAEpAYCBIYHXAQeBAQE/QAGBA0BYASeAxoEGQBeBA4AXwQGABIE1wAUBPsAFgR1ARgERgHMBGcEzgTnCdAE7wbSBDkHCAQDAQoEKgG0BNIAtgQAAUAE9QAwBF4AOAR4ADIEgAA6BIQANATg/zwEBAA2BBAAPgQpAEwE/gBOBAsBwAT9AMIEDQHqBAAAgAUOAIIFfwCDBYUAjAUAAI4FhgCPBYwAUgTXAFQE+wBWBNcAWAT7ANQE1wDWBPsA2ATXANoE+wDwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qFABQqhQAUqoUAFSqFABEqv//RqrMiEiqdwNKqgAATKoAADiqUAA6qlAAPKpQAD6qUAAuqoiIMKrMiDKqd1U0qiIRNqoAAIIEIACABAkAhAQAAISqcABgqikzYqopM2SqYHxmqmB8aKo6SWqqAQBsqgAAbqoAAIaqAACIqgAAiqoUAIyqFACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgAAXKoAAF6qIACaqgAAnKoAAMCq0ADCqtAAxKrQAMaq0ADIqggI8P9DTQ4A/AUAMASsAADw/0RTLgAArwABAq+nhQqv5wAEr4UBBq8QAQivCQAMr0gBDq8QARCvhQESr6sA8P9JU8oAiK4AALSuawC2rmIAuK4UC7quFAuArq8Dgq7+A4Su5wOGrucDAK64AwKusAMErqwDBq6mAwiupgMKrqIDDK6mAw6upAMQrqYDEq6oAxSurAMWrq4DGK62AxquugMcrsADHq7IAyCuGAQirg4EJK4QBCauEAQorhYEKq4UBCyuFAQurgwEMK4MBDKuCgQ0rgQENq72Aziu9AM6rvgDPK74Az6uAARArgYCQq4HAkSuAABGrgAAYK4RAmKuEAJkrgAAZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAUAAGQFAADw/0lBOgCgqf//oqn//6Sp//+mqf//qKn//6qp//+sqf//rqn//4CpAACCqQAAhKkAAIipAACGqTgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk0OB3QHnQeZB3YHNQd8AjQBogAdAEEAHwAfACAAIAAgAOcGagfWB6wHkgerB6ECUgGnAB8ARgAiACIAIwAjACMADQiaCIYISgizBwEIlgJZAaUAIQBJACMAIwAlACUAJACjCOcI5gjYCKUIYQh0Ak4BmAAXACMAOAA5ADcANQAzAHYI3gjXCMMImAhgCGMCTAHMAHEALACXAOUA5wDqAOwAvwjTCKwH2waXB10IPgJNAcgAcAB/AOUA8gD3APIA/wDnCAkHKQbIB1wIXAgPAjoBfgBYAKYAmgBSAI8ACgE8AecIVQfMBdMFGAdbCOUBFAEgABwALgAkAAwADgCfAEEB3AjKBnAFkgSHBl4FWQF4ABUAEgAdABUADAAMAFAAbQHGCF8HFwW5A4ABswBKAA4AFAAPACIAIgALABIAFQARAf0CWwKNAV4APABHADMAPAAaAA4AGwAaAAoAEwAPANEArAMGBO4ExAKrA1UFIgHzACkADAAdADIAEgAPABkAdwASCIAIbwg2CA4Inwc4AfsAJgAMAEMAUAAbABMALwDqACkHRQfwB6sH5gdsBzcBAQEgAAwAHwAeAA0AGgCiAHgB1AXQBWQGHgZIBtQFJgHyABEACQAWABcAEAAkAGwAlgHLAOIA/QAIAQgBDwERAeAADAAGAAgACgAHABAANwCiAVBSU1RXGBsDvgJAA7oDxwOWA/EDCgUdBSYD/gzFC+sLNw1IEJ0Z3wNhA9oDDAQaBBAEkgXJBx8H/wM3C4oINwjLDnoLDRyjBDoERgRWBI8ECQX/B5AKdwoQCX8DYwKOAbMFOwcpIDkHuAdSBx0HJwc5CB8N+A9uDoAI8gEXAboAAQIqBH4fhgUuBTQFNwVcBcYG0QyXEjURAgXYAe4ApQAZAgQEwB1VBnAFlBTxLRMsvCLjIaQzvjHyBbICCwNhAq4CAgTUGgAGJQUIFLYcawOoAqYCSQKKDLcLHgPmBmMLlwEbBBgYHAWlBHwPVBRGAggCkAIrAfkA5wAyAXYC3Ag5AmkDQRbBBCAETAbUC7ID6QM8BKQB8QClAvMBtgIGB/wBpAdiFSUE6QN6Dk8NGQIrArECpAGiAukB1wCiBCYQtwPwACIUUgbWBj8JDhKtA00JwQgSCmsRbAzCB8kGNgdfAskAkg3LA4EEywQsBQkEfwOSBc4GoAWzBH4EHQOmAcsA3gAFHbQfTyTEIRIi8BtVDW0eRyGKCBYEhgLNALsAiADJAH8iA2qxdRt5nX2ceMxJzYWnO9AH+APNAYsAaAB5AI4AoyoLyvTIgtBwxlO182UbyjFOWAdiAsQAoQAhAo8AgQCYLd3Npsy10hO1pJ6FrT/I81BTB90B/QEsAisDQAGTAPoWzALMAm0D0AO+A6MDMQSWBREFxQOODHgLqguXDrQOUxhKA4ID7AMcBCQEMgQNBmgIowe4BesJ9QYrB9ANjArLG88DUgRRBG0EiwRTBasIGAuhClUIfQLhASoBKwU9BsceqwaxB3YHHgc6B4sIxw0+EHgOaQfNAQUBrQBOAgsEER6qBDUFpgU3CGoNSRLyGLkdKhZaBOwB3ACqALoCFQSdHN4EYAUFGmAzVCzAH8IfzjPTMlIIMQPbA9oDVQJGBKEZmQQEBZkVrxn7A8oCpAJrAnYOVwuDA7UHmwqBAVEE6BYvBIwEnxHXDxMC1wGCAiYB7gDbAHYBHQKjCA4C5wMmFbYD8APyB0gNAAT7AxcEfwHoAHcCuAGYAsUGBAJ3Bw4UjwPNA9MO4QoUAh4CuAJ9AZsC4wHXAOgGTxEzA/MAixISBsIGmwdnDDgCNQdqBloGrAidCZ0IlAaXBJcB1gDTDcsHEAnJCPUImgVqBeIIUAvOBdwDtgP2AXoBoAD5AHQeJSKeJi8k2CRoG60QlCAFIqAGSwQEAqAAjgCCAM8AXCuViauTNZeQmoSED19Bo145zwVYA3MBcgBYAHAAhQCHN1nMq8np0DK7O6bzaVrJxkFzBSECsADtAMsCjQBzABQ8086EzZTSU65joCOtxsejRLkF2gEzAj0C9QQCAoMAAAAAAAAAgAHgDzwMLAoACAAOBAgIAMAPwA0AAAAAAAAmAAAAAAAAAAAAwB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAABwBGQ0NWBQABAGwPXw8AAAAAAAAAAAAAAAAAAAAAAAAAAFIlCAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBgDcsBoQH6APgB+QDfACQBkwHpAKoDGAT5AkwBfASWATYB/QF7A9QAjAfyAAAAAACiADMBAAAAAIAO3gG6AQUBIgI3Ad8ARQGAAfkA5AM5BBgDagGRBBQCNgEjAo0D5gDNB/cAAAAAAKYARAEAAAAAoA/gAboBHwEkAjgB2gBbAZQBBAHdA1QEMgN5AZ8EHgIuAT8CtAPwAAgI/wAAAAAArQBWAQAAAADAEMsBwAEhAf4BNQHZAGUBhwEFAdEDQwQ1A4EBmAQQAiwBRgKWA/EAAwgAAQAAAAChAFcBAAAAAOARhQGkAQ0B3gENAdgAKQFDAfEAUgMLBAgDYAF5BP4BNQEBAsIC6QCIB9YAAAAAAIQA8AAAAAAAlTjTAOYG5QHGAcABbwLyAbUBAAAMBAwCvA2jA60BBgMfAxkDogEAAOMF6wAAAAAAHAAOAAAAAAA1NyQBRAEKASEBhAI9ATgBBAFZAQYDBwFwAvgAJwIKBscB/QFsAu8C0QW/AQAAAABsAvgCAAAAABU2RgGeATMBUgGWA1ABZAGBAR4C/gNIAfYCHgGFAisHDgI+AgoDlQP7BjUCAAAAAJ8C8wIAAAAA9TRhAbsBNwFnAQ4EVAFmAZoBLAJqBHMBVQM0AacCeAcgAkwCLgO3A3wHjwIAAAAA/QILAwAAAADVM50BOwJbAdgBwwShAbkBMALCAmsFngGdA10BvgLcB0QCZwJIA/4DEQiFAgAAAADjAv0CAAAAALUyaQG3AUoBgAGkA2MBcgFwAf0BSASUAVcDUgFkAkAHAwInAr0CjQNlB00CAAAAAK4CnQIAAAAAlTEuAUgBGAE3AR8CQQEoAeoAOgECA18B1AIiAQ8CCgbAAd8BUQLYAjIGRQIAAAAApQKYAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWg8PDw8PDw8MDA4KDg4ODg4PDw8PDw8PAwoOCg4ODg4ODw8PDw8PDwMKDg4ODg4ODg8PDw8PDw8DCgoOCgoKCgoPDw8PDw8PAwoKCgoKCgoKDw8PDw8PDwMKCgoKCgoKCg8PDw8PDw8DCg4KCQ4OCgoPDw8PDw8PDAoODg4ODgoKDw8PDwUPAQEODg4ODg4KCg8PDw8PAQ8ODg4ODg4OCQoPDw8BDw8PCQoODg4ODg4KDwIBDw8PDwEKDgoKDg4OCg8PDw8PDw8DCg4KCg4ODgoPDw8PDw8PAwoODg4ODgoKDw8PDw8PDwMKDg4ODg4KCgUFBQICAgEDCg4ODg4OCgpCTUhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAH8AAAAAAQAAfwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">NDgw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">Mjgw</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">Mg==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">MA==</item><item key="ImageUniqueID" base64="1">ZjMzYWVmMjUxZTZhNWRhYjYwMDdhYzAyOGJjZDU3NjI=</item></array></information><alias name="listitem" filename="Ivo-on-eZ-Tags_listitem.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/ivo-on-ez-tags/1035-1-eng-US/Ivo-on-eZ-Tags_listitem.jpg" mime_type="image/jpeg" width="130" height="98" alias_key="379714049" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1035', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 924 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '177', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1036', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 925 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Are you ready for the Community day?', + 'data_type_string' => 'ezstring', + 'id' => '1037', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'are you ready for the community day?', + 'version' => '1', + ), + 926 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1038', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 927 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Are-you-ready-for-the-Community-day.jpg" suffix="jpg" basename="Are-you-ready-for-the-Community-day" dirpath="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US/Are-you-ready-for-the-Community-day.jpg" original_filename="65d29873.jpg" mime_type="image/jpeg" width="640" height="480" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1039" attribute_version="1" attribute_language="eng-US"/><information Height="480" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/4.5" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxMTozODozNg==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvNDAw</item><item key="FNumber" base64="1">NDUvMTA=</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">MTYw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxMTozODozNg==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxMTozODozNg==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MTEzLzEw</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAAAAQAAAaAAMAAQAAAAIAAAAcAAMAAQAAAAIAAAAfAAMAAQAAAAEAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAAEkHAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAAAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAIAAAAyAAMAAQAAAAAAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAEAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAAAAAAAACgAMAAQAAAAEAAAADgAMAAQAAAAEAAAAEgAMAAQAAACoHAAAFgAMAAQAAAB4EAAAGgAMAAQAAAAUIAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCBoq8AAqSvADCmrwAAyq8sALKvAQC0rwAAuq8iALyv6f++rxcA+K8AAPqvAACor2YCqq8MLciv8gPYr0ACtq/AALivAADOr5cA0q8WANCvKACsrx0BsK9HAK6vRwDUrz8A9K8iAPKvKADirwAA5K8BAOCv9SzmrwcA6K8HAOqvAwDsrwAA9q8AANqvAADWrwAE8K8OAAQGvREKBgwtyAYBAZqvAACcrwAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFmQIiBWIC7geZAiQFdgUQBWsE3gaPBCYFegDABgAAKAW2ABgFgAE6BQEAxRkAAFAFLQJSBUkDygY5AAAFAwA2BQAAQgUAAAgFAAACBQAACgUAAAQFAABABQAABAcAAAwHAAAGBwAACAcAAAoHAADyBgAA9gb///QGAAD4Bv//DgV6BCoFaAAsBYABMgWAAfoGgAH8BgAAAAcAATsFAQA+BQEAxhktAsgZpwIwBQABHAXFAOgG7QoaBWoT7wYBAPAGAQD+BgAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgcAABAHAAASBwEAFAcBABYHAAAXBwAAGAcAAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFKgFYBRIDWgVAAPD/V0LqAAAEKgcCBAUIXAQeBAQEEQEGBPsAYASPBBoEAAFeBHIAXwQKABIE3AAUBPsAFgR1ARgERgHMBGcEzgTnCdAE7wbSBDkHCAQXAQoE9gC0BNIQtgSAAEAE9QAwBF8AOAR3ADIEfwA6BI8ANATs/zwEDgA2BBIAPgQnAEwEEgFOBPYAwAQRAcIE+QDqBAAAgAVoAIIFiQCDBXsAjAUKAI4FhgCPBYwAUgTcAFQE+wBWBNwAWAT7ANQE3ADWBPsA2ATcANoE+wDwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qBgBQqgYAUqoGAFSqBgBEqoiIRqrdqkiqiGZKqhEATKoAADiqMAA6qjAAPKowAD6qMAAuqoiIMKrMiDKqd2Y0qiIRNqoAAIIEAACABAkAhAQAAISqcABgqkVFYqpFRWSqWHJmqlhyaKpDQ2qqAgBsqgAAbqoAAIaqAACIqgAAiqoIAIyqCACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgkAXKoJAF6qIACaqgAAnKoAAMCq///Cqv//xKr//8aq///Iqv//8P9DTQ4A/AUAMASsAADw/0RTLgAAr4AAAq/xhwqvVAAEr1YBBq83AAivAAAMr3UADq8AABCvVgESrzcA8P9JU8oAiK4AALSurgC2rpoAuK6jALquTAGArkwDgq76A4Su5wOGrucDAK4mAwKuLAMEri4DBq4uAwiuNAMKrjgDDK5AAw6uSgMQrkwDEq5SAxSuVAMWrloDGK5iAxquaAMcrmoDHq5sAyCu8AMirvgDJK74Ayau8AMorugDKq7kAyyu3AMurt4DMK7YAzKu4AM0ruYDNq7iAziu5AM6ruwDPK7uAz6u7gNArukBQq7qAUSuAABGrgAAYK7wAWKu7gFkrgAAZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAUAAGQFAADw/0lBOgCgqf//oqn//6Sp//+mqf//qKn//6qp//+sqf//rqn//4CpAACCqQAAhKkAAIipAACGqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk38AuICzAK4AqoCngKdApoCkQKMAoYCfwJ+AoECfgJkAoQCRgKHAnUCOQK0AoECTQJCAg0CygHEAb8BzQEcAjcCTwJ+AfgB8AGDAscCpwKXApICUAJEAsMBmwGyAdABGwL7Aq8C5ALeAt0C3wLjAugC3QLTAsgCuAKsAqUClAJ3AgoDAQP1AvIC8gL0AvwC+ALrAt0C0AK9ArACogKNAnECDgMJAwEDBAMIAwoDDQMJA/gC6ALZAsICtQKeAosCcwITAxAD/wLwAiIDJQMrAyIDAQPuAuEClwK8AqgCkwJ7AhMDEgNqAiUC9AGwAdgBCwKxAagBMQKfAXEBKwKYAoYCCgMPA/4CzgKfAtMC7QKWArwCagKuAoQCQQJzApgCgwL9AgQDCgMWA4ICTQJrAq8CJQIQAggCLgK7AqgClQJ7AuMC7wLzAgMDCQMIAwsDBQP6Au8C4gLMArMCmQKHAmMC0QLVAt0C5wLrAugC6ALkAt4C2ALNAroCqQKRAnYCXgLMAssCzALPAtACywLHAscCxgLCArkCrAKiAo4CcwJSAoICdQJyAnICcgJwAmsCbgJxAnECawJsAmcCYAJJAiwCdgEgARcBGQFQAVMBNwErAUoBEQE8AUMB/gD5APEAEQFYAkICPAI5AjcCMQIzAjQCLwInAhsCFAIOAg0C/QHjAVBSU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGQ0NWBgABAAwt9SwTLTwtAAAAAAAAAAAAAAAAAAAAAEk0uCUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQDJKqQBfQFvAcwA0wAAAAAAAAAAAAAAOAPzAmEDjQBYAQAAAAAAAAAAAACGAwAAAACGA4YDAAAAAIkr3gGrAbsBywDnAAAAAAAAAAAAAACGAz4DvgObAIEBAAAAAAAAAAAAAMsDAAAAAMsDywMAAAAASSwzAvIBHALXAA8BAAAAAAAAAAAAAM8DfgMYBKgAogEAAAAAAAAAAAAADgQAAAAADgQOBAAAAAAJLWYCKwJ0AuEAPAEAAAAAAAAAAAAA7AOnA1sEsAC4AQAAAAAAAAAAAAAsBAAAAAAsBCwEAAAAAMktPQIPAm4C4gBGAQAAAAAAAAAAAADZA48DTAS6AMoBAAAAAAAAAAAAAA4EAAAAAA4EDgQAAAAAiS7wAcgBJgLdADYBAAAAAAAAAAAAAI8DUwMgBLEAvgEAAAAAAAAAAAAA1QMAAAAA1QPVAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWgYGBgYGBgYGBgYGBgYGAwMGBgMGBgYGAwMDBgYGAwMDBgMDAwYGBgYGBgYGBgYDAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGAwYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgYGBgMGAwYGBgYGBgYGBgYDBgYGAwMGBgYGBgYGBgMGBgMDAwMDBgYGBgYGBgYGBgYGAwMDBgYGBgYGBgYGBgYDAwMDAwYGBgYGBgYGBgYGAwMDAwMGBgYGBgYGBgMGBgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBAQEBAQEBAQEBAQEBANCTUhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAH8AAAAAAQAAfwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">NDgw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">Njc=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">MQ==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">MA==</item><item key="ImageUniqueID" base64="1">MzZlNTczMTBhYjA5ZTQ1ZGIzYWRiOTA2ZWY1YTAzZWU=</item></array></information><alias name="listitem" filename="Are-you-ready-for-the-Community-day_listitem.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/are-you-ready-for-the-community-day/1039-1-eng-US/Are-you-ready-for-the-Community-day_listitem.jpg" mime_type="image/jpeg" width="130" height="98" alias_key="379714049" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1039', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 928 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '178', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1040', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 929 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Let\'s work together!', + 'data_type_string' => 'ezstring', + 'id' => '1041', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'let\'s work together!', + 'version' => '1', + ), + 930 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1042', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 931 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Let-s-work-together.jpg" suffix="jpg" basename="Let-s-work-together" dirpath="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US/Let-s-work-together.jpg" original_filename="3ef0e6bc.jpg" mime_type="image/jpeg" width="640" height="360" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1043" attribute_version="1" attribute_language="eng-US"/><information Height="360" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/3.3" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxNjo0NTowOA==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvMTUw</item><item key="FNumber" base64="1">MzMvMTA=</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">ODAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxNjo0NTowOA==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxNjo0NTowOA==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">NDcvMTA=</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAACAAAAAaAAMAAQAAAAQAAAAcAAMAAQAAAAIAAAAfAAMAAQAAABUAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAAIUQAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAIAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAEAAAAyAAMAAQAAAAEAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAUAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAABUAAAACgAMAAQAAAAIAAAADgAMAAQAAAAIAAAAEgAMAAQAAABQFAAAFgAMAAQAAAB4EAAAGgAMAAQAAAIsIAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCIoq8CgqSvEDCmrwAAyq9QALKvAwC0rwEAuq8IALyv7/++rwAA+K8AAPqvMACor+ADqq/IDMivQJzYr5T+tq8gAbivAADOr0sB0q8oANCvKACsr4QCsK9TAK6vUwDUrycA9K8pAPKvKQDirwAA5K8BAOCvmAzmrwEA6K8AAOqvAADsrwAA9q8WU9qvAADWrwAA8K8AAAQGtgoKBsgMyAYBAZqvAACcrwAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFFQIiBWIC7gcdBSQFsAIQBaUB3ga0ASYFBgDABgAAKAWyARgFWQI6BQEAxRkCAFAFxQFSBasBygYTAgAFAwA2BQAAQgUAAAgFAAACBQAACgUAAAQFAABABQAABAfT/gwHsP8GBwAACAcZAAoHAADyBgAA9gb///QGAAD4Bk0ADgUxAioFFQAsBQEDMgUBA/oGWQL8BqgAAAcAAjsFAQA+BQIAxhnFAcgZ7QEwBYABHAUbAugGvwoaBWoT7wYCAPAGAQD+BgAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgckABAHEQASBzgAFAdCDRYHQgAXBzYAGAcjAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFKAFYBTIBWgXUAPD/V0LqAAAEFAUCBIsIXAQeBAQEwQAGBOgAYAS0ARoEBABeBAAAXwQGABIE//8UBP//FgT//xgE///MBGcEzgTnCdAE7wbSBDkHCASEAAoECgG0BAAAtgQBAUAE9QAwBEoAOARZADIEZAA6BHsANAT7/zwEGwA2BBMAPgQlAEwEDAFOBBgBwATBAMIE6ADqBAAAgAUAAIIFhgCDBYwAjAUAAI4FhgCPBYwAUgS4AFQE3gBWBLgAWATeANQEygDWBPEA2AS4ANoE3gDwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qFABQqhQAUqoUAFSqFABEqv//RqrMiEiqdwNKqgAATKoAADiqUAA6qlAAPKpQAD6qUAAuqoiIMKrMiDKqd1U0qiIRNqoAAIIEKgCABAQAhAQAAISqcABgqjI+YqoyPmSqOktmqjpLaKoxPmqqAQBsqgAAbqoAAIaqAACIqgAAiqoMAIyqDACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgAAXKoAAF6qIACaqgAAnKoAAMCq0ADCqtAAxKrQAMaq0ADIqggI8P9DTQ4A/AUAMASsAADw/0RTLgAArwAAAq8AAAqvAAAErwAABq8AAAivAAAMrwAADq8AABCvAAASrwAA8P9JU8oAiK4AALSuMQC2rjcAuK7SArquBwKArncDgq7sBoSu5wOGrucDAK50AwKuXAMErlIDBq5IAwiuRAMKrkIDDK5IAw6uTAMQrlIDEq5SAxSuUgMWrk4DGK4AABquAAAcrgAAHq4AACCu9gMiruYDJK7YAyauyAMorsoDKq7YAyyu7AMurvYDMK72AzKu0gM0rrQDNq6kAziuAAA6rgAAPK4AAD6uAABArvABQq7oAUSu6AFGrgAAYK7wAWKu8QFkrvABZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAViAGQFAATw/0lBOgCgqfECoqnwD6Sp//+mqf//qKkRQqqpQA+sqf//rqn//4CpPwKCqQAAhKkAAIipjwCGqQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk3YA+ACEQSTA7MA8AB6AY4B0wLiCxwM6gqSAusA6AACASUFtAIbAvsAvwBgAMQAGgHVAsYOZg+lDjkDcgQuAiMBFgXJAyID+wDmAFoAywAsARkD5g5kD4cOmQSaCdYDMgHuBSYElAP+Av4A2gB6AT0BGgMHD2EPsg7IBdQLHwObAc4GCwQDAS8BCAEAATAC8QFlAkQH3wVnCtgG0Q0ABIADmQY6BW4BYgFqAbMBcQLnA30CRAE7ArMBDQUnChoCkgPTAdYBAAK7AS0BHgJ1BCEEQwNGAloBWQLhAKAHGQMUAeoB8ADJAWgAegDXAIkCXQJlAxIDugCxAWgAIwTtBVAA3gBOADYBQgCZAFkAqQF1AOoBVQE/AfkAKAAvACoAUwA3ABsASQBQAOQAtgXAAFEA8gAbA/wBeQAoAH8AFgA1ACIAHAA4AC0ADwFPAZAATABoAMwAUAFrAFkAbwAcAB4AFgAYAC0AKwASAa8AOAA0ACsAWAApABcAGAAnAB4AHAAUAB0AIwAYAOQACAExACIAHABiACkAEAAdABoAFwAaADAAMAA7ABcAYwCYANsAJAAcAH8AMQAsADIAIAAPABMAwgAsAEIAGQAlACgALQAnAC8AswA4AC8AIQAiABEADwA0AGQAPgAlACEALwAeACEAIwBXAB8AKAAjABQAEAAMAFBSU1QbFMMMYRLwDysCnwS3BocHkhE8SB5PXkVoCd8E+wQuBbUZXQyGC8QFVwLEASgE3AUSEorpK+DMmvgMgBSzB8kFiBrmEQwQbgYpArQBNgRVBqITpfEH2BSF5BaMMZENCwZKHsMSDRUKDyUCCQVRB9gGfxUK9371Wb4HH4k+YAiDB+IieBBRBfMHdQJKBh0KbAtmDdVf3kgDeLoo7FEmED0QOh6EFrYIhQjQBUQJXA7rExIKswY0CxkH3Cc9RhwMLRMbB5sHqgl7CGwFVAu0Fv4Ulg5wC0IHvwygBkcoYQvAFC0I8QOKCJ0BgQKWBDQNjwoXEtEN6QPcCOAB2yNaJ6ELJwNEAkkETgG2AuwBKQg6AqUJTgYEBY0ErwDZAP0ARgLRAOQANAFNAWgEUC15A3oBgwcZE5IJsAH/ANsBcwAWAY4AAwH1ANkAEgVIBa4CZwHtAekDqwaTAScCxAF3AJoAbQAZAdEAKwHcBNYC5QDlAMoAogGPAF4AggCtAIYAhwBYABQBlgCbAG0E4gSXAJgAhAAGArMAWwCbAHYAeAB8AIEADwH9AGcAeAFgAo4BsQC9ABEDBAHQAP8AdwBcAG4AwwH6ADIBaQDkAMUAvAC7APoArQP6AOwAtACLAFYAXADxAAsCHgGrAJgA1wCDAKYAlQC9AcIAzACjAFsAVQBVAEMUfAubEIgOAgJmBEkGSgfUEvVK8E41QrMH5wQUBUMFdxlxCyoLigU9Ar8BRQRHBqkUqfHw3zCYdQvxE8UGugWnGgQRBQ9PBgYCtwFFBIMGiBpg9d3Wd4O7FukywgnzBSce3RCfFL4N+wGaBUAHBAdcIEL3KvXIsrsgPD3fBkcH2iL9DlcFNQjYAbYG0QkwDO8P/F53SXZwCix4TskPfg8YHPYUIwlqCR0FlwkaDwEUYQmqBkgLeQaRKzlDdwwNE2wGugbRCacI/wSpC5cWexUGDnILYgcJDfgH1SZeCXkblQfJA7IIugGWAh8F2AxVCrASHA3WAywJ5gFkKfojnhWZAqsCbgNlAZECdwKlB3wCNwlMBn0EjwS4AOsALgEsBM8AAQExAVIBWgQpLYwDzwFvC4UPsgmJATcBrwF5ACIBhQBQAe8A4QAfBaMEtwJyARMCFATHBmgBSwKxAXIAoABhAEcCzAAvAaoEqwLqAOkAxgC1AawAjgCQALoAjACEAFYA3gGWAKgAOgTlBI0AmACGAP4BfgBeAJsAfAB+AH4AawASAfYAYgBXAYQC4gGrAN0AxwLQAMcAAwFkAFMAaABOAfsAJQFfAM0AwQC5ALUACQFVA80A2wC0AIMAWQBcAOwAFgIWAaAAlQDMAHQAmwCOAJkBugC+AKAAWABTAHkAAAAAAAAARALUAgQLjAJIAgACwAAAAAAAAAAAAAAAAAAWAAAAAAAAAAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAABgBGQ0NWBQABAMgMmAwAAAAAAAAAAAAAAAAAAAAAAAAAAD8ZdwsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQB3C+sChAffAaoBSgEHAakBjwIAAMcEsQQyDMsC6wKrAbcAdQIkBQAAoQdDAQAAAAACAAEAAAAAAJcM4APFCYUCDAJqAUwBAwIgAwAAagY5BVoNMANJA84B4QD0AqAFAABhCHcBAAAAAAIAAgAAAAAAtw23A9gJwQJOApoBbAE7AsMDAABzBjoFZQ1GA1gD3gECAQADBgYAAGoIfgEAAAAAAgAAAAAAAADXDjAD9AikAoQCegEhATECFwQAAKwFFQXfDEwDeQPZAecAEQNRBgAADAiBAQAAAAADAAIAAAAAAPcPXwJiBuIByAEqAfcApwH7AgAA/gNKBCMLzQIlA4MB0wCPApMFAAC1BmIBAAAAAAMAAgAAAAAAoxBCAkkG+wH/AbABggGIAVQBAAAGBNsBgAeqAc0BGQFjASgBxwAAAGkEwgAAAAAACAAFAAAAAACDD0YCqwYGAnECsgGpAZMBTwEAAC0EKwKbCdQBQAI/AaMBWAHYAAAAnwXhAAAAAAAJAAQAAAAAAGMORAJxCCkCKwPLAb0BngFJAQAABgWDApILFwKbAl0ByQF8AdwAAAC4BvQAAAAAAAoABQAAAAAAQw2bAmEKdgIGA+IBpwG9AVwBAADyBd0CnwxKApoCcQHFAZEB5gAAAHUH6QAAAAAACQAFAAAAAAAjDIkCyQlTAmICswGIAZIBWwEAACAG2gJODC0CQQJLAZgBcwHVAAAAbwfgAAAAAAAIAAIAAAAAAAMLSQI9B/sBAwKkAXkBjgFWAQAAugSIAk4K8gHHATABVwE7AcMAAABvBtEAAAAAAAkABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWgQKCgoKCgoKCg4ODgoKCgoKCgEJCg4OCg4ODg4KCgoKCgoCCgoOCgoODg4OCgoKCgoKDgoKCgoKDg4ODgoKCgoKCgoKCgoACg4ODg4KCgAKCgoKCgoKCgoKCgoKBAoKCgoKCgoKCgoOCgoKCgoKCgoKDgoKCg4KDgoKCgoKCgoKDg4OCg4KCgoKCgoKDg4OCg4OCgoOCgoOCgoKDgoODgoOCgoOCgoKDgkKCg4KDg4ODgoODgoKDg4ODg4ODg4ODgoKDg4KCg4ODgoODg4ODg4KCg4ODgoKDg4KDg4KDg4OCg4ODg4ODg4OCg4ODg4ODg4KDg4ODg4ODg4ODg4ODg5CTUhMAAAAAAAAAAAAERoWAAAAAAAAAAAAAAAAAFdhTwAAAAAAAAAAAAAAAABZYEwAAAUAAAAEAAAAAAAAW2JTAAEGAAAAAAAAAAAAACIYMAo6AQABAAAAAAAAAQAAAAARKAAAAAAAAAAAAAAAAAAAAAYGAgAAAAAAAAAAAQAAAAAKGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAFcAAAAAAQAAXwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">MzYw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">Mjg=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">Mg==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MQ==</item><item key="Sharpness" base64="1">MQ==</item><item key="ImageUniqueID" base64="1">Yjc5N2I4MDg4NTA1NDM4OGY2NTYwYzI1ZWY3MTkwM2E=</item></array></information><alias name="listitem" filename="Let-s-work-together_listitem.jpg" suffix="jpg" dirpath="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/let-s-work-together/1043-1-eng-US/Let-s-work-together_listitem.jpg" mime_type="image/jpeg" width="130" height="73" alias_key="379714049" timestamp="1311154279" is_valid="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1043', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 932 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '179', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1044', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 933 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'The Mediterranean seen from Nice!', + 'data_type_string' => 'ezstring', + 'id' => '1045', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'the mediterranean seen from nice!', + 'version' => '1', + ), + 934 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1046', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 935 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="The-Mediterranean-seen-from-Nice.jpg" suffix="jpg" basename="The-Mediterranean-seen-from-Nice" dirpath="var/ezwebin_site/storage/images/community/pictures/the-mediterranean-seen-from-nice/1047-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/the-mediterranean-seen-from-nice/1047-1-eng-US/The-Mediterranean-seen-from-Nice.jpg" original_filename="56b81989.jpg" mime_type="image/jpeg" width="640" height="360" alternative_text="" alias_key="1293033771" timestamp="1311154202"><original attribute_id="1047" attribute_version="1" attribute_language="eng-US"/><information Height="360" Width="640" IsColor="1" ByteOrderMotorola="0" ApertureFNumber="f/9.0" Thumbnail.FileType="2" Thumbnail.MimeType="image/jpeg"><array name="ifd0"><item key="Make" base64="1">UGFuYXNvbmlj</item><item key="Model" base64="1">RE1DLVRaNQ==</item><item key="XResolution" base64="1">MTgwLzE=</item><item key="YResolution" base64="1">MTgwLzE=</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">VmVyLjEuMCAg</item><item key="DateTime" base64="1">MjAxMTowMToyNyAxMTozOTo1Mg==</item><item key="Artist" base64="1">UGljYXNh</item><item key="YCbCrPositioning" base64="1">Mg==</item><item key="Exif_IFD_Pointer" base64="1">NTAy</item><item key="UndefinedTag:0xC4A5" base64="1">UHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAAAAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkRAAAQJwAACw8AABAnAACXBQAAECcAALAIAAAQJwAAARwAABAnAABeAgAAECcAAIsAAAAQJwAAywMAABAnAADlGwAAECcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item><item key="UndefinedTag:0xC6D2" base64="1">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</item></array><array name="exif"><item key="ExposureTime" base64="1">MTAvNjQwMA==</item><item key="FNumber" base64="1">OTAvMTA=</item><item key="ExposureProgram" base64="1">OA==</item><item key="ISOSpeedRatings" base64="1">MTYw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyNyAxMTozOTo1Mg==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyNyAxMTozOTo1Mg==</item><item key="ComponentsConfiguration" base64="1">AQIDAA==</item><item key="CompressedBitsPerPixel" base64="1">NC8x</item><item key="ExposureBiasValue" base64="1">MC8xMDA=</item><item key="MaxApertureValue" base64="1">MzQ0LzEwMA==</item><item key="MeteringMode" base64="1">NQ==</item><item key="LightSource" base64="1">MA==</item><item key="Flash" base64="1">MjQ=</item><item key="FocalLength" base64="1">NjcvMTA=</item><item key="MakerNote" base64="1">UGFuYXNvbmljAAAANgABAAMAAQAAAAIAAAACAAcABAAAAAABAgADAAMAAQAAAAEAAAAHAAMAAQAAAAUAAAAPAAEAAgAAACAAAAAaAAMAAQAAAAQAAAAcAAMAAQAAAAIAAAAfAAMAAQAAAAMAAAAgAAMAAQAAAAIAAAAhAAcACCAAALwGAAAiAAMAAQAAAAAAAAAjAAMAAQAAAAAAAAAkAAMAAQAAAAAAAAAlAAcAEAAAAMQmAAAmAAcABAAAADAyNzAnAAMAAQAAAAAAAAAoAAMAAQAAAAEAAAApAAQAAQAAAOskAAAqAAMAAQAAAAAAAAArAAQAAQAAAAAAAAAsAAMAAQAAAAAAAAAtAAMAAQAAAAAAAAAuAAMAAQAAAAEAAAAvAAMAAQAAAAEAAAAwAAMAAQAAAAEAAAAxAAMAAQAAAAIAAAAyAAMAAQAAAAEAAAAzAAIAFAAAANQmAAA0AAMAAQAAAAEAAAA1AAMAAQAAAAEAAAA2AAMAAQAAAP//AAA3AAMAAQAAAAEBAAA4AAMAAQAAAAEAAAA6AAMAAQAAAAIAAAA7AAMAAQAAAAEAAAA8AAMAAQAAAP//AAA9AAMAAQAAAAUAAAA+AAMAAQAAAAEAAAA/AAMAAQAAAAAAAABNAAUAAgAAAOgmAABOAAcAKgAAAPgmAABPAAMAAQAAAAAAAABeAAcABAAAAAAAAAAAgAcABAAAADAxMjEBgAMAAQAAAAMAAAACgAMAAQAAAAEAAAADgAMAAQAAAAEAAAAEgAMAAQAAABYHAAAFgAMAAQAAAB4EAAAGgAMAAQAAACoHAAAHgAMAAQAAAAEAAAAIgAMAAQAAAAEAAAAJgAMAAQAAAAEAAAAQgAIAFAAAACInAAAAAAAARFYBAkVQAADw/0RCCgbw/0FGtgCgrxCAoq8AAqSvADCmrwAAyq9UALKvAQC0rwAAuq+OALyv7/++rwAA+K8AAPqvFwCor7wBqq9ZGsivQJzYr63/tq8gAbivAADOr4cA0q8UANCvKACsr/8AsK8oAK6vKADUr0oA9K8mAPKvKADirwAA5K8BAOCvQhrmr98B6K//AeqvGQDsrwAA9q8AANqvAADWrwAE8K8GAAQGbg4KBlkayAYCApqvAACcrwAAnq8AAPD/U1RyAKQGAACmBgAAqAYAAKoGAACsBgAA+gcAAK4GAACwBgAAtgYAALgGAAC6BgAA9AcAAPYHAACyBgAAtAYAALAEAACyBAAAYKkAAGKpAABkqQAAaKkAAGapAABqqQAAeKkAAHqpAAB8qQAAfqkAAPD/QUUmASAFZgIiBWIC7gdmAiQF9ggQBesH3gYJCCYFsQDABp0BKAW2ABgFCgE6BQIAxRkAAFAFPANSBboFygYCAAAFAwA2BQAAQgUAAAgFAAACBcr/CgUAAAQFAABABQAABAfK/wwHAAAGBwAACAcAAAoHAADyBgAA9gb///QGAAD4Bv//DgXsByoFHgAsBQoBMgUKAfoGCgH8BgAAAAcAATsFAgA+BQAAxhk8A8gZsAQwBQAAHAUMAOgGvQoaBaoT7wYBAPAGAQD+BgAALgUAAAEFAABgBQAANAUAAA5noAI4BQAADgcJABAHAAASBz0AFAcBABYHEAAXBwAAGAcAAEgFAABKBQAARAUAAEYFAAAUBTEBFgUnADwFLQFYBRIYWgVCAPD/V0LqAAAEFgcCBCoHXAQeBAQEDgEGBBoBYAQJCBoE0gBeBP8AXwQKABIE+QAUBAoBFgQOARgEGgHMBGcEzgTnCdAE7wbSBDkHCAQhAQoEFwG0BAQitgQAAUAE9QAwBFIAOARpADIEcAA6BHMANATg/zwEBAA2BBAAPgQpAEwEGAFOBBYBwAQTAcIEHQHqBAAAgAUFAYIFjACDBYsAjAUJAI4FhwCPBY0AUgT6AFQEFQFWBPoAWAQVAdQE+gDWBBUB2AT6ANoEFQHwBCQH8gRRBvQEGAH2BDEB+AQhB/oERwb8BBcB/gQzAfD/WUPmAE6qBgBQqgYAUqoGAFSqBgBEqoiIRqrdqkiqiGZKqhEATKoAADiqMAA6qjAAPKowAD6qMAAuqoiIMKrMiDKqd2Y0qiIRNqoAAIIEAACABAkAhAQAAISqcABgqpubYqqbm2SqY39mqmN/aKpoaGqqAgBsqgAAbqoAAIaqAACIqgAAiqoIAIyqCACOqgAAkKoAAJKqHwCUqh8AlqoAAJiqAACgqvAAoqoQAKSq6ACmqgAAqKoKAFiqAQBaqgkAXKoJAF6qIACaqgAAnKoAAMCq///Cqv//xKr//8aq///Iqv//8P9DTQ4A/AUAMASsAADw/0RTLgAArwAAAq8AAAqvAAAErwAABq8AAAivAAAMrwAADq8AABCvAAASrwAA8P9JU8oAiK4AALSuQQG2rlcBuK5uA7qutQmArmcEgq7mA4Su5wOGrucDAK5uBAKucgQErnYEBq58BAiuggQKroQEDK6GBA6uggQQrooEEq6EBBSuiAQWroIEGK6IBBquhAQcroYEHq6ABCCu8AMiruwDJK7oAyau5gMort4DKq7gAyyu2AMurtgDMK7cAzKu3AM0ruADNq7kAziu4gM6rt4DPK7iAz6u3gNArvEBQq4AAESuAABGrgAAYK7wAWKuAABkrgAAZq4AAPD/RkSmAGCsAABirAAAgKwAAIKsAACErAAAhqwAAIisAACKrAAAjKwAAI6sAACQrAAAkqwAAJSsAACWrAAAmKwAAJqsAACcrAAAnqwAAECsAABCrAAARKwAAEasAABIrAAASqwAAEysAABOrAAAUKwAAFKsAABUrAAAVqwAAFisAABarAAAXKwAAF6sAABmBQAAbgUAAHAFAAByBQAAbAViAGQFAAjw/0lBOgCgqfIioqnwD6Sp8iKmqfAPqKkCIqqpAA+sqf//rqn//4CpFACCqQAAhKkAAIipGwCGqQcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEFFQk0cAo8DwwTuBcYF/QIPAnwCvQLcBEEEUwPwAgcC5gHzAbsBTALIBH0DbQP0A+oCIAPLAhwE7gPSAuIC7wLnAeIBqQP6A/kCpAIxA5QDFQRgBG4EpgN/A0gDYwS2A8ICKgKMAxEFKQZKBnUD3AMIBMsBdgUQBowF0wTFBF8CCAOjA6AEVwXpBcIFcQVvBMUCZQIxANUAsgMuBKoEJgNzA4wDMQRqBScGsgbBBaEF/gQOApQAFgNKAqAD4ALEAwgEjgPLAwQFQAUyBf4E1QMyBH4BUgAQAt4DsAM+A8IDjwPDAj8ERgNVA1gDjAPRA8EDygIvAHYAFwFXApsCpgJeAlACxgPyAykEvwNkA4oDUwOHASkAigE5AicByAGQAooCbwLwAnMDsAOHAx4DtgIsATMAJAAhAeICKwIxApICxQJ6AkgB+wAQAbgBxAF/AFwAHwGhAEsBrAEaAVABPQHvALoA8gAtAUMBSQE4ANkANQEXAXIACQH4AHkBAwEeAcoA6gC1AAkBLAEtAVYBHQEZAeQAYAC3AAwBCAEcAesA1ADEAIwA5gDbAPcAKgEDAeAAzQBHAKUA5gDcAAMBxQCtALsAeQDCAKgAoQD5AOEAjADyAJwAEwF/ALwAAQG5AKIAogDaAMQB4AGuAIUAdgBdAKcAZACdAGwAkgB2AHwAigB5AFBSU1QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGQ0NWCAABAFkaQhomGigaBRoNGpoZChrdGSYaAAAAAB4nmBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQBzFu0AogDXABsBEgGWALAAAgHtACMCmQLgALkBswN3AvIAiQGHAkYC6wXhAgAAAABmBZkCAAAAAJMXJwGqAOcAjwFlAZ8AygBYAUYBwgL6AgUBDAJSBNYCEwHFAe4CmQLhBiUDAAAAAOQF0AIAAAAAsxhyAbcAJAFpAvwBtAAHAdEBvQHlA1EDIwFsAuIEJAMsARACPQPtArkHTwMAAAAANAb4AgAAAADTGbwB2QB7AeMCVAK8ADYBLAIMAq4EewM8Aa4CKgVPAy8BQwJeAxMDHwhiAwAAAABjBhIDAAAAAPMaowHHAE4BhgIWArUAFAHOAeIBKARdAyEBjAL5BCoDKQEjAiwD/ALGB08DAAAAAD8G8AIAAAAAExxHAagAAwGgAX8BngDVAE0BZAH9AgYD+QAhAmcE2wIDAdcB1wK6Av8GGAMAAAAA4gXHAgAAAAAzHfQAngDZABEBAgGOAL8ABAEJAR8CmgLQAMgBsgNuAtkAkQFvAlMC9AXLAgAAAABRBYgCAAAAAFMezAChAMYA4wDiAI0AsgDhAN0AwQE1ArYAiQEWAwYCvABRAfwB8wH7BH4CAAAAAMYEPQIAAAAAzyuwAKwAsgDHAKwAwwDLAJYAqgB6AZQAlwB/AKsAVAC5AJwAXQBcADcBfAAAAAAAoAAdAAAAAACvKq8AqACsAMUArQDBAMUAmACqAHQBkgCUAH4AtwBTAMEAnQBcAF4ARQF1AAAAAACoAB4AAAAAAI8prgCsALMAxwCgAMQAxwCZAKgAegGcAJYAhwDFAFQA0ACkAFwAYgBbAYIAAAAAALcAHQAAAAAAbyivAKoAsADJAKMAxQDFAJ0AqgB5AaYAnwCMAM0AUwDdAKgAWgBgAG8BkgAAAAAAxwAcAAAAAABPJ6wArACuAMkApgDEAMMAnwCoAHcBrgCvAJIA3ABTAPIArgBdAGAAggGQAAAAAADVABwAAAAAAC8mqwCvAK0AwwCsAMgAxQChAKcAfAGoAK0AlADqAFUACAGuAFwAXwCHAX0AAAAAAOsAHwAAAAAADyWrAKwAsADDAKMAwgDDAJ0AqQBzAbEAuwCbAPoAUAATAboAYABhAJYBjwAAAAAABQEfAAAAAADvI64AqwC0AMAApQDGAMYAoQCmAHsBwwCgAKkACgFTACcBxQBiAGUAsQGrAAAAAAAYAR4AAAAAAM8irgCqALIAywChAMEAwwCdAKgAfQHNAKAAtwAeAVUAQgHYAGQAYwDDAbIAAAAAADEBHgAAAAAAryGtAKoAswDKAK0AyQDEAKMArAB/AeEArADCADkBVQBlAekAYwBhAO8BwQAAAAAAVgEeAAAAAACPIK4AqQCxAMwApQDRAMMAoACuAH4B+QDgANgAVAFWAJUB/wBiAGcAHwLlAAAAAAB6AR0AAAAAAG8fswCqALkAywCfAM8AyACpAKoAgwERAcoA7AB6AVMAwAEdAWgAaABJAu0AAAAAAKEBIAAAAAAATx61AK0AtgDVAKcA0wDJAKMArACNASUBygACAbIBVgAEAjwBaABoAHoCBAEAAAAA4AEhAAAAAAAvHbgAqQDBANIAqADgAMoAogCrAJEBVwEPAS8B6gFVAFICbwF0AG0A3QIwAQAAAAAoAiQAAAAAAA8cvwCvAMsA3gCmAPUAzwCpAKwAogGQARsBWwExAlYAxwKzAXcAbQAyA1wBAAAAAHsCJAAAAAAA7xrIALUA6wADAagAJQHfAKgArgDFAcUBSAGXAZ4CWABjAwECewBuAKUDdwEAAAAAzgIkAAAAAADPGe4AygAfATgBpQCSASABpwCsABECTALwAeEBIwNYADEEkQKQAHUAegT4AQAAAABBAyUAAAAAAK8YOQHjAGEB1wGjAEICeAGmAK0AtAKlAicCDwLBA1kAvwTaApoAgQAlBSgCAAAAAJoDJAAAAAAAjxezARkBogGXAqUAOQPkAbIArQCHA/ACMAIuAkgEWwAuBRYDoACNAKQFMAIAAAAAxQMpAAAAAABvFgMCRwGmASYDpQB5A/EBwQCyABsEFwNoAkYCfgRhAD4FFwOzAKUA6gVLAgAAAADjAzgAAAAAAE8VIwIvAVIBKAOnAP8CswG9ALYAJgQtA6UCJQJ2BG4AAAUDA9kAzAASBoQCAAAAAM0DRwAAAAAALxSuAd0AFAGFAqoA+AE/Ab8AxwBaA+YCKAIBAhoEgABtBJgC4gDxAKoFOwIAAAAAjwNVAAAAAAAPEzYB3AD9ALoBrQBqAe0A2wD1AKACjwLYAdQBiQOUAM8DPgIQARwBLAXsAQAAAAA/A20AAAAAAO8R8AAUASsBNAG9ADUB5gAXATcBagI+ArsBsgH9AqkAOAPoAToBUAHABMIBAAAAAO4CggAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAV0JDWgIFAQEBAQICAgEBAgIFBQUFBQIBAgEBAgICAQICAgUFAgEBAgIBAQEBAQECAQICAgUFAQMBAQEBAQEBAQECAgIBAQEDAQEBAQECAgIBBQECAgEDAwMBAQEBAwECBQEBAQIBAQEDAQEBAwEBAQEBAQIBAQUFBQICDwoBDw8PDw8PAQEBAQIFBQUKBQUCDw8PDwEDAQMDAwMDAwMDAQEBAQICAgEBAQMDAQMBAQIBAQIBAgIBAQEBAQEDAQECAgICBQ8FBQEBAQICAwUFBQUFBQUGDwUFAQUFBQMPDw8FDw8PBg8GBgUPBgYGBQYPBQ8PDw8PBgYDBgYFAwUGBgYGBgZCTUhMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEY1NTA4MTAxNTAxMTkAMDA5OTk5Ojk5Ojk5IDAwOjAwOjAwAH8AAAAAAQAAfwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5OTk5Ojk5Ojk5IDAwOjAwOjAwAA==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NjQw</item><item key="ExifImageLength" base64="1">MzYw</item><item key="InteroperabilityOffset" base64="1">MTAwMzg=</item><item key="SensingMethod" base64="1">Mg==</item><item key="FileSource" base64="1">Aw==</item><item key="SceneType" base64="1">AQ==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="DigitalZoomRatio" base64="1">MC8xMA==</item><item key="FocalLengthIn35mmFilm" base64="1">NDA=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="GainControl" base64="1">MQ==</item><item key="Contrast" base64="1">MA==</item><item key="Saturation" base64="1">MQ==</item><item key="Sharpness" base64="1">MQ==</item><item key="ImageUniqueID" base64="1">MzNkZmVjZDk3NDk5NmE2MDBiYTA0ZGE0Y2I0NjUwNTc=</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1047', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 936 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '180', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1048', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 937 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Hotel lobby at Isola2000', + 'data_type_string' => 'ezstring', + 'id' => '1049', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'hotel lobby at isola2000', + 'version' => '1', + ), + 938 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1050', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 939 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Hotel-lobby-at-Isola2000.jpg" suffix="jpg" basename="Hotel-lobby-at-Isola2000" dirpath="var/ezwebin_site/storage/images/community/pictures/hotel-lobby-at-isola2000/1051-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/hotel-lobby-at-isola2000/1051-1-eng-US/Hotel-lobby-at-Isola2000.jpg" original_filename="7485826a.jpg" mime_type="image/jpeg" width="388" height="584" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1051" attribute_version="1" attribute_language="eng-US"/><information Height="584" Width="388" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/3.5"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOSAxMDoyNToxNg==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8xNQ==</item><item key="FNumber" base64="1">Ny8y</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">NDAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOSAxMDoyNToxNg==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOSAxMDoyNToxNg==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MTgvMQ==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">Mzg4</item><item key="ExifImageLength" base64="1">NTg0</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">Mjc=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1051', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 940 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '181', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1052', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 941 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Alexander on the past, Gaby on today and tomorrow', + 'data_type_string' => 'ezstring', + 'id' => '1053', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'alexander on the past, gaby on today and tomorrow', + 'version' => '1', + ), + 942 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1054', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 943 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Alexander-on-the-past-Gaby-on-today-and-tomorrow.jpg" suffix="jpg" basename="Alexander-on-the-past-Gaby-on-today-and-tomorrow" dirpath="var/ezwebin_site/storage/images/community/pictures/alexander-on-the-past-gaby-on-today-and-tomorrow/1055-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/alexander-on-the-past-gaby-on-today-and-tomorrow/1055-1-eng-US/Alexander-on-the-past-Gaby-on-today-and-tomorrow.jpg" original_filename="9243daf4.jpg" mime_type="image/jpeg" width="584" height="388" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1055" attribute_version="1" attribute_language="eng-US"/><information Height="388" Width="584" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/8.0"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOCAwOToxMTozNw==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8xODA=</item><item key="FNumber" base64="1">OC8x</item><item key="ExposureProgram" base64="1">MQ==</item><item key="ISOSpeedRatings" base64="1">NDAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOCAwOToxMTozNw==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOCAwOToxMTozNw==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">ODAvMQ==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NTg0</item><item key="ExifImageLength" base64="1">Mzg4</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MQ==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">MTIw</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1055', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 944 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '182', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1056', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 945 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Isola2000 in white - beautiful skiing!', + 'data_type_string' => 'ezstring', + 'id' => '1057', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'isola2000 in white - beautiful skiing!', + 'version' => '1', + ), + 946 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1058', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 947 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Isola2000-in-white-beautiful-skiing.jpg" suffix="jpg" basename="Isola2000-in-white-beautiful-skiing" dirpath="var/ezwebin_site/storage/images/community/pictures/isola2000-in-white-beautiful-skiing/1059-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/isola2000-in-white-beautiful-skiing/1059-1-eng-US/Isola2000-in-white-beautiful-skiing.jpg" original_filename="a2e4cb83.jpg" mime_type="image/jpeg" width="584" height="388" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1059" attribute_version="1" attribute_language="eng-US"/><information Height="388" Width="584" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/8.0"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOSAxMzozNDowMA==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8zNTA=</item><item key="FNumber" base64="1">OC8x</item><item key="ExposureProgram" base64="1">Mg==</item><item key="ISOSpeedRatings" base64="1">MTAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOSAxMzozNDowMA==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOSAxMzozNDowMA==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MjAvMQ==</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NTg0</item><item key="ExifImageLength" base64="1">Mzg4</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MA==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">MzA=</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1059', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 948 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '183', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1060', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 949 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'CEO future pitch - Adaptable, open, reliable!', + 'data_type_string' => 'ezstring', + 'id' => '1061', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ceo future pitch - adaptable, open, reliable!', + 'version' => '1', + ), + 950 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1062', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 951 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="CEO-future-pitch-Adaptable-open-reliable.jpg" suffix="jpg" basename="CEO-future-pitch-Adaptable-open-reliable" dirpath="var/ezwebin_site/storage/images/community/pictures/ceo-future-pitch-adaptable-open-reliable/1063-1-eng-US" url="var/ezwebin_site/storage/images/community/pictures/ceo-future-pitch-adaptable-open-reliable/1063-1-eng-US/CEO-future-pitch-Adaptable-open-reliable.jpg" original_filename="90d2d17c.jpg" mime_type="image/jpeg" width="584" height="388" alternative_text="" alias_key="1293033771" timestamp="1311154203"><original attribute_id="1063" attribute_version="1" attribute_language="eng-US"/><information Height="388" Width="584" IsColor="1" ByteOrderMotorola="1" ApertureFNumber="f/8.0"><array name="ifd0"><item key="Make" base64="1">UEVOVEFYICAgICAgICAgICAgIA==</item><item key="Model" base64="1">UEVOVEFYIEsyMEQgICAgICAgIA==</item><item key="Orientation" base64="1">MQ==</item><item key="XResolution" base64="1">NzIvMQ==</item><item key="YResolution" base64="1">NzIvMQ==</item><item key="ResolutionUnit" base64="1">Mg==</item><item key="Software" base64="1">SzIwRCBWZXIgMS4wNCAgICAgICAgICA=</item><item key="DateTime" base64="1">MjAxMTowMToyOCAwOToxNzozNw==</item><item key="Exif_IFD_Pointer" base64="1">MjIy</item></array><array name="exif"><item key="ExposureTime" base64="1">MS8xODA=</item><item key="FNumber" base64="1">OC8x</item><item key="ExposureProgram" base64="1">MQ==</item><item key="ISOSpeedRatings" base64="1">NDAw</item><item key="ExifVersion" base64="1">MDIyMQ==</item><item key="DateTimeOriginal" base64="1">MjAxMTowMToyOCAwOToxNzozNw==</item><item key="DateTimeDigitized" base64="1">MjAxMTowMToyOCAwOToxNzozNw==</item><item key="ExposureBiasValue" base64="1">MC8x</item><item key="MeteringMode" base64="1">NQ==</item><item key="Flash" base64="1">MTY=</item><item key="FocalLength" base64="1">MTA1LzE=</item><item key="FlashPixVersion" base64="1">MDEwMA==</item><item key="ColorSpace" base64="1">MQ==</item><item key="ExifImageWidth" base64="1">NTg0</item><item key="ExifImageLength" base64="1">Mzg4</item><item key="SensingMethod" base64="1">Mg==</item><item key="CustomRendered" base64="1">MA==</item><item key="ExposureMode" base64="1">MQ==</item><item key="WhiteBalance" base64="1">MA==</item><item key="FocalLengthIn35mmFilm" base64="1">MTU3</item><item key="SceneCaptureType" base64="1">MA==</item><item key="Contrast" base64="1">Mg==</item><item key="Saturation" base64="1">MA==</item><item key="Sharpness" base64="1">Mg==</item><item key="SubjectDistanceRange" base64="1">Mw==</item></array></information></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1063', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 952 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '184', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1064', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 953 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '211', + 'contentobject_id' => '185', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Blog', + 'data_type_string' => 'ezstring', + 'id' => '1065', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'blog', + 'version' => '1', + ), + 954 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '212', + 'contentobject_id' => '185', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1066', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 955 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '213', + 'contentobject_id' => '185', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1067', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 956 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '214', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Visit Paris', + 'data_type_string' => 'ezstring', + 'id' => '1068', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'visit paris', + 'version' => '1', + ), + 957 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '215', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Lorem ipsum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph><ul><li><paragraph>Lorem ispum dolor sit amet. </paragraph></li><li><paragraph>Lorem ispum dolor sit amet. </paragraph></li><li><paragraph>Lorem ispum dolor sit amet. </paragraph></li><li><paragraph>Lorem ispum dolor sit amet.</paragraph></li></ul></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1069', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 958 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '216', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '1193915460', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1070', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1193915460', + 'sort_key_string' => '', + 'version' => '1', + ), + 959 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '217', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1071', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 960 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '218', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1072', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 961 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '219', + 'contentobject_id' => '186', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1073', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 962 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '214', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Paris in France', + 'data_type_string' => 'ezstring', + 'id' => '1074', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'paris in france', + 'version' => '1', + ), + 963 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '215', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph><paragraph>Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. Lorem ispum dolor sit amet. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1075', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 964 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '216', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '1193915580', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1076', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1193915580', + 'sort_key_string' => '', + 'version' => '1', + ), + 965 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '217', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1077', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 966 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '218', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1078', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 967 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '219', + 'contentobject_id' => '187', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1079', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 968 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Company', + 'data_type_string' => 'ezstring', + 'id' => '1080', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'company', + 'version' => '1', + ), + 969 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1081', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 970 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><embed size="original" align="center" custom:offset="0" custom:limit="5" object_id="224"/></paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1082', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 971 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Vivamus non neque. Proin id augue. Aliquam a tellus. + <strong>Donec cursus rutrum purus.</strong> Aliquam tincidunt. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. In suscipit dictum augue. Donec arcu ante, consequat a, feugiat in, posuere hendrerit, dolor. Morbi tempus, sem ac interdum scelerisque, justo nisi egestas nisl, et mattis dui est at velit. Aliquam in libero ac urna molestie eleifend.</paragraph><paragraph><table class="list" width="100%" border="0"><tr><th xhtml:width="50%"><paragraph>Aliquam a tellus</paragraph></th><th><paragraph>Class aptent</paragraph></th></tr><tr><td><paragraph>Donec cursus rutrum purus.</paragraph></td><td><paragraph>Proin id augue.</paragraph></td></tr><tr><td><paragraph>Aliquam in libero ac urna molestie eleifend.</paragraph></td><td><paragraph>Morbi tempus, sem ac interdum.</paragraph></td></tr></table></paragraph><paragraph>Quisque fringilla hendrerit turpis. Curabitur suscipit blandit nulla. Sed mauris justo, iaculis vel, dictum ut, molestie et, purus. Fusce ut risus. Nulla mauris magna, vulputate quis, dignissim vel, lobortis ut, neque. Etiam sed ante. </paragraph><paragraph>Curabitur in dolor nec tellus consequat gravida. Proin faucibus viverra eros. Suspendisse fringilla. Etiam eget elit eu augue euismod lobortis. Sed urna elit, volutpat vel, ultricies id, molestie a, ligula. In cursus nonummy quam. Sed malesuada iaculis magna. Curabitur mollis vehicula nibh. Curabitur at orci at leo vulputate vestibulum. </paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1083', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 972 => array ( + 'attribute_original_id' => '1084', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1084', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 973 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1085', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 974 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '188', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1086', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 975 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'About company', + 'data_type_string' => 'ezstring', + 'id' => '1087', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'about company', + 'version' => '1', + ), + 976 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1088', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 977 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1089', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 978 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1090', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 979 => array ( + 'attribute_original_id' => '1091', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1091', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 980 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1092', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 981 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '189', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1093', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 982 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'New features', + 'data_type_string' => 'ezstring', + 'id' => '1094', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'new features', + 'version' => '1', + ), + 983 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1095', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 984 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1096', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 985 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1097', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 986 => array ( + 'attribute_original_id' => '1098', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1098', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 987 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1099', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 988 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '190', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1100', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 989 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Separate content & design in eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1101', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'separate content & design in ez publish', + 'version' => '1', + ), + 990 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1102', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 991 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1103', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 992 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>While there are many Content Management Systems (CMS) in the market, very few do exactly what a CMS is supposed to do: achieve a clean separation between content and design.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1104', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 993 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><section><section><header>What is content and design?</header><paragraph>Content is information that is organized and stored in a structured manner by <link url_id="97">eZ Publish</link>. For example, content may be the components of a news article (such as the title, introduction, body, and images) or the properties of a car (such as the model, year, and color). </paragraph><paragraph>All information that is stored for the purpose of later retrieval is referred to as content. The presentation of content is determined by the design of a site. </paragraph><paragraph>While content refers to structured data, design refers to the way the data is visually presented. Design includes the things that make up a web interface: HTML, stylesheets (CSS), images that are not part of the content, typography, fonts, and so on. </paragraph><paragraph>So, while content deals with storing and structuring data, design dictates how the content should be presented. </paragraph><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="192"/></paragraph></section></section><section><section><header>Benefits of a Content Management System</header><paragraph>The ability to handle the distinction between structuring and displaying content is one of the <link url_id="98">key features of eZ Publish</link>. The separation of content and design provides the following benefits: </paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content editors and designers can work separately without conflicts</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content can be published easily in multiple formats</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content can easily be transferred and re-purposed</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Global redesigns and changes can be applied with simple modifications</paragraph></li></ul></paragraph></section></section><section><section><header>Presenting the content: templates</header><paragraph>Templates represent the fundamental unit of site design in eZ Publish. For example, a template might dictate that a page should appear with the site\'s title at the top and with the main content in the middle. When the page is accessed, the Content Management System places the content (the actual title and body text) into the appropriate locations in the template. </paragraph><paragraph>An eZ Publish template is a custom, extended HTML file that describes how particular types of content should be presented. For example, there is a template for viewing a folder and its contents, a news article, the contents of a <link anchor_name="picturegallery" url_id="99">gallery</link> as thumbnails, <link anchor_name="videoplayer" url_id="100">media files</link> as list items, <link anchor_name="visitorinteraction" url_id="101">forum posts</link> and so on. </paragraph><paragraph>In some cases, you can even have different article templates based on different kinds of articles or where they are located in the content hierarchy. In short, templates are the transforming unit that produces the site layout, either for an entire webpage or some part of that page. The following screenshots illustrate how different templates work together to produce a page. </paragraph><paragraph> Learn more in <link url_id="102">Developers section</link>. </paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1105', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 994 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1106', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 995 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Separate-content-design-in-eZ-Publish.jpg" suffix="jpg" basename="Separate-content-design-in-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/1107-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/1107-1-eng-US/Separate-content-design-in-eZ-Publish.jpg" original_filename="844e123d.jpg" mime_type="image/jpeg" width="530" height="420" alternative_text="" alias_key="1293033771" timestamp="1311154205"><original attribute_id="1107" attribute_version="1" attribute_language="eng-US"/><information Height="420" Width="530" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1107', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 996 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1108', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 997 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1109', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 998 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1110', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 999 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1111', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1000 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '191', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1112', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1001 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'separation_of_content_and_design', + 'data_type_string' => 'ezstring', + 'id' => '1113', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'separation_of_content_and_design', + 'version' => '1', + ), + 1002 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1114', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1003 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="separation_of_content_and_design.jpg" suffix="jpg" basename="separation_of_content_and_design" dirpath="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/separation_of_content_and_design/1115-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/separate-content-design-in-ez-publish/separation_of_content_and_design/1115-1-eng-US/separation_of_content_and_design.jpg" original_filename="1cb1af18.jpg" mime_type="image/jpeg" width="500" height="195" alternative_text="" alias_key="1293033771" timestamp="1311154205"><original attribute_id="1115" attribute_version="1" attribute_language="eng-US"/><information Height="195" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1115', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1004 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '192', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1116', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1005 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to use eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1117', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to use ez publish', + 'version' => '1', + ), + 1006 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1118', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1007 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1119', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1008 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish comes with a multitude of features out of the box, ensuring that you can quickly put your content online.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1120', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1009 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="eztoolbar" url_id="98">Publish content from your web browser</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="openofficeimport" url_id="98">Publish content from word processors</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="contenttranslation" url_id="98">Translate your content</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="multiupload" url_id="98">Upload multiple files at once</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="picturegalleries" url_id="98">Picture galleries</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="videopublishing" url_id="98">Video publishing</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="web2.0" url_id="98">Web 2.0 features</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="defaultsearch" url_id="98">Search</link></paragraph></li></ul></paragraph><section><section><header>Publish content from your web browser</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="199"/></paragraph><paragraph>With eZ Publish, you can publish content like articles, pictures and files directly from your web browser, using the Website Toolbar. </paragraph><paragraph>This toolbar appears when you log in and enables you to publish, move, replace or translate any kind of content. </paragraph><paragraph>The Online Editor is a WYSIWYG editor integrated into the website (no HTML coding required), providing formatting functions similar to word processing applications. </paragraph></section></section><section><section><header>Publish content from your favourite word processor</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="194"/></paragraph><paragraph>Many content managers prefer working directly in Microsoft Word or Open Office. The import / export feature enables you to create or edit site content in your favorite word processor, even when you might not have Internet access. </paragraph><paragraph>Afterwards, you can upload the document through either a WebDAV client or the front-end of your site to generate or update articles, documentation pages and so on. </paragraph></section></section><section><section><header>Translate your content</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="195"/></paragraph><paragraph>All content in eZ Publish can be translated to multiple languages. Having only one website to administer is efficient and makes it easier to maintain a consistent brand across languages and countries. </paragraph><paragraph>An international corporation or organization can have one website with content in several languages. When a visitor selects a language, the menus and content are displayed accordingly. If you have not yet translated specific content, it will be shown in the source language or not at all (depending on your configuration). </paragraph><paragraph>When you are editing content, you can choose to switch the language you are currently editing or to translate from one language to another. Content in the source language is shown when you are translating, to aid in the process. When creating or updating content translations, you can also use the built-in content “diff” functionality to see the added or removed text in the source language. </paragraph><paragraph>Multiple, multilingual URLs can be created for each page. By default, you can have an object called "Easy" with a URL "/easy" but also create a French translation with a URL "/facile". </paragraph></section></section><section><section><header> Upload multiple files at once</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="196"/></paragraph><paragraph>If you want to upload more than one document, picture or video at a time, eZ Publish has multi-upload functionality. </paragraph><paragraph>You simply select the content you want from your computer or from the server where your content is stored. eZ Publish can detect the type of content uploaded and creates the appropriate web pages. </paragraph></section></section><section><section><header>Picture galleries</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="197"/></paragraph><paragraph>eZ Publish makes it easy to create picture galleries. With the multi-upload functionality, you can add many pictures at once, then eZ Publish will scale, format and resize the pictures automatically. </paragraph><paragraph>You can then browse through the galleries and re-use images elsewhere in your website. </paragraph></section></section><section><section><header>Video publishing</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="200"/></paragraph><paragraph>Basically, a video is another type of content you or users of your website can publish. You can use eZ Publish to store and display any video format for web TV functionality or video publishing similar to Youtube. </paragraph></section></section><section><section><header>Web 2.0 features</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="201"/></paragraph><paragraph>Tag clouds, blogs, forums and polls are all built-in eZ Publish features. Make your users contribute and build communities. </paragraph></section></section><section><section><header>Search</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="198"/></paragraph><paragraph>To find any content on your eZ Publish site, you can use the integrated search engine in eZ Publish. To add more functionality and scale high-loaded websites, <link url_id="84">eZ Find</link> is an enterprise search extension for eZ Publish. </paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1121', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1010 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1122', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1011 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-use-eZ-Publish.jpg" suffix="jpg" basename="How-to-use-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/1123-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/1123-1-eng-US/How-to-use-eZ-Publish.jpg" original_filename="0aab879e.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154205"><original attribute_id="1123" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1123', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1012 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1124', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1013 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1125', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1014 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1126', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1015 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1127', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1016 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '193', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1128', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1017 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'openoffice_import_large', + 'data_type_string' => 'ezstring', + 'id' => '1129', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'openoffice_import_large', + 'version' => '1', + ), + 1018 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1130', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1019 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="openoffice_import_large.jpg" suffix="jpg" basename="openoffice_import_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/openoffice_import_large/1131-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/openoffice_import_large/1131-1-eng-US/openoffice_import_large.jpg" original_filename="36b1357b.jpg" mime_type="image/jpeg" width="540" height="357" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1131" attribute_version="1" attribute_language="eng-US"/><information Height="357" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1131', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1020 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '194', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1132', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1021 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'translation_large', + 'data_type_string' => 'ezstring', + 'id' => '1133', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'translation_large', + 'version' => '1', + ), + 1022 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1134', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1023 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="translation_large.jpg" suffix="jpg" basename="translation_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/translation_large/1135-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/translation_large/1135-1-eng-US/translation_large.jpg" original_filename="503004df.jpg" mime_type="image/jpeg" width="540" height="419" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1135" attribute_version="1" attribute_language="eng-US"/><information Height="419" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1135', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1024 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '195', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1136', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1025 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'multiupload_large', + 'data_type_string' => 'ezstring', + 'id' => '1137', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'multiupload_large', + 'version' => '1', + ), + 1026 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1138', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1027 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="multiupload_large.jpg" suffix="jpg" basename="multiupload_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/multiupload_large/1139-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/multiupload_large/1139-1-eng-US/multiupload_large.jpg" original_filename="9652f5a1.jpg" mime_type="image/jpeg" width="540" height="404" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1139" attribute_version="1" attribute_language="eng-US"/><information Height="404" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1139', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1028 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '196', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1140', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1029 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'gallery_large', + 'data_type_string' => 'ezstring', + 'id' => '1141', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'gallery_large', + 'version' => '1', + ), + 1030 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1142', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1031 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="gallery_large.jpg" suffix="jpg" basename="gallery_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/gallery_large/1143-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/gallery_large/1143-1-eng-US/gallery_large.jpg" original_filename="b1b5ed39.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154206"><original attribute_id="1143" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1143', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1032 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '197', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1144', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1033 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'search_result_large', + 'data_type_string' => 'ezstring', + 'id' => '1145', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'search_result_large', + 'version' => '1', + ), + 1034 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1146', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1035 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="search_result_large.jpg" suffix="jpg" basename="search_result_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/search_result_large/1147-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/search_result_large/1147-1-eng-US/search_result_large.jpg" original_filename="fb6cf7d3.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1147" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1147', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1036 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '198', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1148', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1037 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'ez_tool_bar_large', + 'data_type_string' => 'ezstring', + 'id' => '1149', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'ez_tool_bar_large', + 'version' => '1', + ), + 1038 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1150', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1039 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="ez_tool_bar_large.jpg" suffix="jpg" basename="ez_tool_bar_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/ez_tool_bar_large/1151-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/ez_tool_bar_large/1151-1-eng-US/ez_tool_bar_large.jpg" original_filename="9c1fd673.jpg" mime_type="image/jpeg" width="540" height="351" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1151" attribute_version="1" attribute_language="eng-US"/><information Height="351" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1151', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1040 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '199', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1152', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1041 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'quicktime_large', + 'data_type_string' => 'ezstring', + 'id' => '1153', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'quicktime_large', + 'version' => '1', + ), + 1042 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1154', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1043 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="quicktime_large.jpg" suffix="jpg" basename="quicktime_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/quicktime_large/1155-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/quicktime_large/1155-1-eng-US/quicktime_large.jpg" original_filename="af4e1807.jpg" mime_type="image/jpeg" width="540" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1155" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1155', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1044 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '200', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1156', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1045 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'web_2_0_large', + 'data_type_string' => 'ezstring', + 'id' => '1157', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'web_2_0_large', + 'version' => '1', + ), + 1046 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1158', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1047 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="web_2_0_large.jpg" suffix="jpg" basename="web_2_0_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/web_2_0_large/1159-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-use-ez-publish/web_2_0_large/1159-1-eng-US/web_2_0_large.jpg" original_filename="cd03d9fc.jpg" mime_type="image/jpeg" width="540" height="425" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1159" attribute_version="1" attribute_language="eng-US"/><information Height="425" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1159', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1048 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '201', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1160', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1049 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to manage eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1161', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to manage ez publish', + 'version' => '1', + ), + 1050 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1162', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1051 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1163', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1052 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>To provide you with full control over your website, eZ Publish has many features that make it easy to manage both content and users.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1164', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1053 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Administration Interface</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Permission and access control</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Workflows</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Versioning and modification tracking</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">A unique content model</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Content cross publishing</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Multi-site deployment</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Search engine optimization</paragraph></li></ul></paragraph><section><section><header>A rich and powerful Administration Interface</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="210"/></paragraph><paragraph>The content of a site can be displayed (and modified) in various ways. The Administration Interface is the advanced back-end interface, providing powerful tools for content management and editing as well as site management, configuration, customization and development.</paragraph><paragraph>In other words, you can change almost everything about a site in the Administration Interface.</paragraph></section></section><section><section><header>Permission, rights management and access control</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="203"/></paragraph><paragraph>The eZ Publish access system is multi-level and role-based. This means that you can give a user or a group of users access to a combination of functions across the whole site or within a specific area of the site. For example, you restrict a certain part of a site to community or partner members.</paragraph></section></section><section><section><header>Workflows</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="204"/></paragraph><paragraph>eZ Publish comes with an integrated workflow mechanism. An example of this is the built-in collaboration system, which defines an ordered sequence of actions to be executed after a content editor has published an object.</paragraph><paragraph>Suppose that your site has a restriction that all content has to go through an editor-in-chief before being published. It can be set as “pending” before being approved to be published. On the other hand, if a pending version is rejected by the editor, it can be set as “rejected”.</paragraph><paragraph>&nbsp;Another example is the e-commerce engine, which can be used to manage subscriptions on a media site, automating access for paid subscribers to read premium news content, watch videos, and so on.</paragraph></section></section><section><section><header>Versioning and modification tracking</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="205"/></paragraph><paragraph>Having access to older versions of content enables supervisors or editors-in-chief to check for inconsistency or errors in the content. eZ Publish automatically keeps track of which content changes were made by which users at what time, and provides the option to revert content to a previous version.</paragraph></section></section><section><section><header>A unique content model</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="206"/></paragraph><paragraph>Publishing content is no longer only about publishing articles. Depending on your needs you must define specific content structures for cars, recipes, specific products for your webshop and more. eZ Publish has a flexible content engine that enables administrators to create these content definitions directly through graphical user interfaces.</paragraph></section></section><section><section><header>Content cross publishing</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="207"/></paragraph><paragraph>Using the cross publishing feature, you can re-use content throughout the site while avoiding inconsistent duplicates of content that are hard to maintain. If content appears at multiple locations, you only have to edit the object once – the changes will be reflected at all locations.</paragraph></section></section><section><section><header>Multi-site deployment</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="208"/></paragraph><paragraph>One installation of eZ Publish can host many different websites with the possibility to re-use content, functionality and design across the different sites. You can have a continuous overview of all your sites and can even industrialize this deployment via the Site Factory management service in <link url_id="85">eZ Publish Premium</link> subscription services.</paragraph></section></section><section><section><header>URL management and search engine optimization</header><paragraph><embed view="embed" size="original" custom:offset="0" custom:limit="5" object_id="209"/></paragraph><paragraph>eZ Publish makes it easy for you to create content that will be effectively indexed by search engines. Sitemaps, friendly URLs, and easy management of key XHTML tags are all built-in features.</paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1165', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1054 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1166', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1055 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-manage-eZ-Publish.jpg" suffix="jpg" basename="How-to-manage-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/1167-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/1167-1-eng-US/How-to-manage-eZ-Publish.jpg" original_filename="4da87751.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154207"><original attribute_id="1167" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1167', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1056 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1168', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1057 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1169', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1058 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1170', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1059 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1171', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1060 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '202', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1172', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1061 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'usermanagement_large', + 'data_type_string' => 'ezstring', + 'id' => '1173', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'usermanagement_large', + 'version' => '1', + ), + 1062 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1174', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1063 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="usermanagement_large.jpg" suffix="jpg" basename="usermanagement_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/usermanagement_large/1175-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/usermanagement_large/1175-1-eng-US/usermanagement_large.jpg" original_filename="c7fdf3e4.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154208"><original attribute_id="1175" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1175', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1064 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '203', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1176', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1065 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'workflow_large', + 'data_type_string' => 'ezstring', + 'id' => '1177', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'workflow_large', + 'version' => '1', + ), + 1066 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1178', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1067 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="workflow_large.jpg" suffix="jpg" basename="workflow_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/workflow_large/1179-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/workflow_large/1179-1-eng-US/workflow_large.jpg" original_filename="d4a5a15d.jpg" mime_type="image/jpeg" width="540" height="414" alternative_text="" alias_key="1293033771" timestamp="1311154208"><original attribute_id="1179" attribute_version="1" attribute_language="eng-US"/><information Height="414" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1179', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1068 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '204', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1180', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1069 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'versioning_large', + 'data_type_string' => 'ezstring', + 'id' => '1181', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'versioning_large', + 'version' => '1', + ), + 1070 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1182', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1071 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="versioning_large.jpg" suffix="jpg" basename="versioning_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/versioning_large/1183-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/versioning_large/1183-1-eng-US/versioning_large.jpg" original_filename="5041e7aa.jpg" mime_type="image/jpeg" width="540" height="346" alternative_text="" alias_key="1293033771" timestamp="1311154208"><original attribute_id="1183" attribute_version="1" attribute_language="eng-US"/><information Height="346" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1183', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1072 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '205', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1184', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1073 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'datatypes_attributes_content_class_and_objects_large', + 'data_type_string' => 'ezstring', + 'id' => '1185', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'datatypes_attributes_content_class_and_objects_large', + 'version' => '1', + ), + 1074 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1186', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1075 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="datatypes_attributes_content_class_and_objects_large.png" suffix="png" basename="datatypes_attributes_content_class_and_objects_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/datatypes_attributes_content_class_and_objects_large/1187-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/datatypes_attributes_content_class_and_objects_large/1187-1-eng-US/datatypes_attributes_content_class_and_objects_large.png" original_filename="3ac3d302.png" mime_type="image/png" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1187" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1187', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1076 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '206', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1188', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1077 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'multiple_location_large', + 'data_type_string' => 'ezstring', + 'id' => '1189', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'multiple_location_large', + 'version' => '1', + ), + 1078 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1190', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1079 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="multiple_location_large.jpg" suffix="jpg" basename="multiple_location_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multiple_location_large/1191-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multiple_location_large/1191-1-eng-US/multiple_location_large.jpg" original_filename="d2bd9a18.jpg" mime_type="image/jpeg" width="540" height="405" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1191" attribute_version="1" attribute_language="eng-US"/><information Height="405" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1191', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1080 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '207', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1192', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1081 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'multisite_deployment_large', + 'data_type_string' => 'ezstring', + 'id' => '1193', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'multisite_deployment_large', + 'version' => '1', + ), + 1082 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1194', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1083 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="multisite_deployment_large.jpg" suffix="jpg" basename="multisite_deployment_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multisite_deployment_large/1195-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/multisite_deployment_large/1195-1-eng-US/multisite_deployment_large.jpg" original_filename="fa5f0924.jpg" mime_type="image/jpeg" width="500" height="423" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1195" attribute_version="1" attribute_language="eng-US"/><information Height="423" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1195', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1084 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '208', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1196', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1085 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'seo_large', + 'data_type_string' => 'ezstring', + 'id' => '1197', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'seo_large', + 'version' => '1', + ), + 1086 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1198', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1087 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="seo_large.jpg" suffix="jpg" basename="seo_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/seo_large/1199-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/seo_large/1199-1-eng-US/seo_large.jpg" original_filename="25149bcc.jpg" mime_type="image/jpeg" width="540" height="347" alternative_text="" alias_key="1293033771" timestamp="1311154209"><original attribute_id="1199" attribute_version="1" attribute_language="eng-US"/><information Height="347" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1199', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1088 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '209', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1200', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1089 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'admin_site_large', + 'data_type_string' => 'ezstring', + 'id' => '1201', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'admin_site_large', + 'version' => '1', + ), + 1090 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1202', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1091 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="admin_site_large.jpg" suffix="jpg" basename="admin_site_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/admin_site_large/1203-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-manage-ez-publish/admin_site_large/1203-1-eng-US/admin_site_large.jpg" original_filename="57b1a75c.jpg" mime_type="image/jpeg" width="540" height="332" alternative_text="" alias_key="1293033771" timestamp="1311154210"><original attribute_id="1203" attribute_version="1" attribute_language="eng-US"/><information Height="332" Width="540" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1203', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1092 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '210', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1204', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1093 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'How to develop with eZ Publish', + 'data_type_string' => 'ezstring', + 'id' => '1205', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'how to develop with ez publish', + 'version' => '1', + ), + 1094 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1206', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1095 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="nospam@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1207', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1096 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish is more than a basic CMS, but a content management platform based on a clear API that allows developers to customize and extend eZ Publish.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1208', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1097 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="contentclass" url_id="103">The content class concept</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="customdesign" url_id="103">Custom design: CSS and templates</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="phpcomponents" url_id="103">High-quality library of PHP components</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="buildextensions" url_id="103">Build eZ Publish extensions</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="developmentenvironment" url_id="103">Which development environment?</link></paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><link anchor_name="ezcommunity" url_id="103">eZ Publish community and resources</link></paragraph></li></ul></paragraph><section><section><header>The content class concept</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="212"/></paragraph><paragraph>Any piece of content in eZ Publish is a content object, which is an instance of a specific content class. A content class is a definition of an arbitrary data structure. It does not store any actual data. </paragraph><paragraph>A content class is made up of attributes. The characteristics of an attribute are determined by the datatype that is chosen for that specific attribute. By combining different datatypes, it is possible to represent complex data structures. </paragraph><paragraph>The illustration above shows the anatomy of a content class called "Article", which defines a data structure for storing news articles. It consists of attributes dedicated for storing the title, an introduction text and the actual body of an article.</paragraph></section></section><section><section><header>Custom design: CSS and templates</header><paragraph><embed size="original" view="embed" custom:offset="0" custom:limit="5" object_id="213"/></paragraph><paragraph>The first thing you may be willing to do is to change the look of your eZ Publish site. This can be done by modifying the CSS of eZ Publish and <link url_id="86">overriding templates</link>. You can even create reusable <link url_id="87">site packages</link> that include these CSS and template changes. </paragraph></section></section><section><section><header>High-quality library of PHP components</header><paragraph>eZ Publish 4.X as well as the next generations of eZ Publish are based on <link url_id="88">eZ Components</link> which are a high quality library of independent components aiming to help developers creating web centric applications like for example customising and extending eZ Publish. </paragraph><paragraph>In the eZ Components you will find components that focus their attention on solving important parts of Web application development. They are written for solving the re-occurring issues that Web application developers have to deal with when building their applications - without any superfluous ballast. </paragraph><paragraph>In order to cater for this goal, quality is also an important factor. The eZ Components development team uses a test-driven development methodology where a large effort is put into making the APIs easily testable. This also results in a better API for developers to use. </paragraph></section></section><section><section><header>Build eZ Publish extensions</header><paragraph>There is a clear API to develop your own PHP extensions in order to extend the functionality of eZ Publish. By using extensions it is possible to create new modules, datatypes, template operators, workflow events , or any integration with third party applications. You will find many contributed extensions available at <link url_id="89">Contribution page</link>. </paragraph></section></section><section><section><header>Which development environment?</header><paragraph> In an eZ Publish project, a <link target="_blank" url_id="90">Subversion (SVN)</link> repository is usually set up to track all changes during development projects. When it comes to IDE, both <link target="_blank" url_id="91">Eclipse</link> and <link target="_blank" url_id="92">PHPEdit</link> have been optimised for eZ Publish. </paragraph></section></section><section><section><header>eZ Publish community and resources</header><paragraph>When you start developing with eZ Publish, the community is definitely an environment to get in touch with. You will find your answers or get help in the forums as well as many contributions that will make save you time in your development projects. </paragraph></section></section></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1209', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1098 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1210', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1099 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="How-to-develop-with-eZ-Publish.png" suffix="png" basename="How-to-develop-with-eZ-Publish" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/1211-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/1211-1-eng-US/How-to-develop-with-eZ-Publish.png" original_filename="33e36be8.png" mime_type="image/png" width="500" height="409" alternative_text="Content class" alias_key="1293033771" timestamp="1311154210"><original attribute_id="1211" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1211', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1100 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1212', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1101 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1213', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1102 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1214', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1103 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1215', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1104 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '211', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1216', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1105 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'datatypes_attributes_content_class_and_objects_large', + 'data_type_string' => 'ezstring', + 'id' => '1217', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'datatypes_attributes_content_class_and_objects_large', + 'version' => '1', + ), + 1106 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1218', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1107 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="datatypes_attributes_content_class_and_objects_large.jpg" suffix="jpg" basename="datatypes_attributes_content_class_and_objects_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/datatypes_attributes_content_class_and_objects_large/1219-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/datatypes_attributes_content_class_and_objects_large/1219-1-eng-US/datatypes_attributes_content_class_and_objects_large.jpg" original_filename="e252a562.jpg" mime_type="image/jpeg" width="500" height="409" alternative_text="" alias_key="1293033771" timestamp="1311154210"><original attribute_id="1219" attribute_version="1" attribute_language="eng-US"/><information Height="409" Width="500" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1219', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1108 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '212', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1220', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1109 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'site_style_large', + 'data_type_string' => 'ezstring', + 'id' => '1221', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'site_style_large', + 'version' => '1', + ), + 1110 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1222', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1111 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="site_style_large.png" suffix="png" basename="site_style_large" dirpath="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/site_style_large/1223-1-eng-US" url="var/ezwebin_site/storage/images/company/new-features/how-to-develop-with-ez-publish/site_style_large/1223-1-eng-US/site_style_large.png" original_filename="b3b89834.png" mime_type="image/png" width="540" height="411" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1223" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1223', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1112 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '213', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1224', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1113 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'REST API interface', + 'data_type_string' => 'ezstring', + 'id' => '1225', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'rest api interface', + 'version' => '1', + ), + 1114 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1226', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1115 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1227', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1116 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>New RESTful interface, which will allow external client implementations, to access and query content resources inside an eZ Publish installation</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1228', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1117 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Different aspects of the content objects can be queried at will, such as metadata or actual values. The REST interface is protected either by OAuth 2.0 or HTTP Basic authentication</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1229', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1118 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1230', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1119 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1231" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1231', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1120 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1232', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1121 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1233', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1122 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1234', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1123 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1235', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1124 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '214', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1236', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1125 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Asynchronous Publishing', + 'data_type_string' => 'ezstring', + 'id' => '1237', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'asynchronous publishing', + 'version' => '1', + ), + 1126 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1238', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1127 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1239', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1128 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>The ability to use defer publishing, for improved scalability in high load, multi-editor environments.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1240', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1129 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1241', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1130 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1242', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1131 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1243" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1243', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1132 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1244', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1133 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1245', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1134 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1246', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1135 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1247', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1136 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '215', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1248', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1137 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Canonical links', + 'data_type_string' => 'ezstring', + 'id' => '1249', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'canonical links', + 'version' => '1', + ), + 1138 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1250', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1139 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1251', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1140 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>eZ Publish 4.5 supports a canonical link feature that helps search engines to figure out duplicate content issues and allow them to index relevant content.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1252', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1141 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>- For simple siteaccesses, like nor, fre,, ger, eng the feature works out of the box &nbsp;</paragraph><paragraph>- More complex mappings require a manual configuration in the file</paragraph><paragraph>- You use the canonical link to tell the search engines which url is the preferred one when you have several duplicate urls.</paragraph><paragraph>Example of duplicate urls:</paragraph><paragraph>-&nbsp;<link target="_self" url_id="104">www.example.com</link></paragraph><paragraph>- example.com</paragraph><paragraph>-&nbsp;<link target="_self" url_id="96">www.example.com/index.html</link></paragraph><paragraph>- example.com/home.asp</paragraph><paragraph>Example of canonical link:</paragraph><paragraph><link rel="canonical" href="<link target="_self" url_id="104">http://www.example.com</link>/" /></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1253', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1142 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1254', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1143 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1255" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1255', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1144 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1256', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1145 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1257', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1146 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1258', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1147 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1259', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1148 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '216', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1260', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1149 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Support for Red Hat Enterprise', + 'data_type_string' => 'ezstring', + 'id' => '1261', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'support for red hat enterprise', + 'version' => '1', + ), + 1150 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1262', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1151 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1263', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1152 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>combined with eZ Publish Enterprise, you can now a system supported all through the stack!</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1264', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1153 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1265', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1154 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1266', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1155 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154211"><original attribute_id="1267" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1267', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1156 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1268', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1157 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1269', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1158 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1270', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1159 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1271', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1160 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '217', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1272', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1161 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'FastCGI', + 'data_type_string' => 'ezstring', + 'id' => '1273', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'fastcgi', + 'version' => '1', + ), + 1162 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1274', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1163 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="bk@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1275', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1164 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>support</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1276', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1165 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>What is FastCGI?</paragraph><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><ul><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI is also language-independent. For instance, FastCGI provides a way to improve the performance of the thousands of Perl applications that have been written for the Web.</paragraph></li><li><paragraph xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Like CGI, FastCGI runs applications in processes isolated from the core Web server, which provides greater security than APIs. (APIs link application code into the core Web server, which means that a bug in one API-based application can corrupt another application or the core server; a malicious API-based application can, for example, steal key security secrets from another application or the core server.)</paragraph></li></ul></paragraph><paragraph>Read more&nbsp;http://www.fastcgi.com/</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1277', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1166 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1278', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1167 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1311154212"><original attribute_id="1279" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1279', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1168 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1280', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1169 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1281', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1170 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1282', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1171 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1283', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1172 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '218', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1284', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1173 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '252', + 'contentobject_id' => '219', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Events', + 'data_type_string' => 'ezstring', + 'id' => '1285', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'events', + 'version' => '1', + ), + 1174 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '253', + 'contentobject_id' => '219', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1286', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1175 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '254', + 'contentobject_id' => '219', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<related-objects><relation-list/></related-objects> +', + 'data_type_string' => 'ezobjectrelationlist', + 'id' => '1287', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1176 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Career', + 'data_type_string' => 'ezstring', + 'id' => '1288', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'career', + 'version' => '1', + ), + 1177 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1289', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1178 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1290', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1179 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1291', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1180 => array ( + 'attribute_original_id' => '1292', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1292', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 1181 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1293', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1182 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '220', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1294', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 1183 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Investors Relation', + 'data_type_string' => 'ezstring', + 'id' => '1295', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'investors relation', + 'version' => '1', + ), + 1184 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1296', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1185 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1297', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1186 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1298', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1187 => array ( + 'attribute_original_id' => '1299', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1299', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 1188 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1300', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1189 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '221', + 'data_float' => '0', + 'data_int' => '1176187670', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1301', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1176187670', + 'sort_key_string' => '', + 'version' => '1', + ), + 1190 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '229', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Contact', + 'data_type_string' => 'ezstring', + 'id' => '1302', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'contact', + 'version' => '1', + ), + 1191 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '230', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1303', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1192 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '231', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1304', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1193 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '232', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1305', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1194 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '233', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '1306', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1195 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '234', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezemail', + 'id' => '1307', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1196 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '235', + 'contentobject_id' => '222', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezemail', + 'id' => '1308', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1197 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '247', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Morbi neque', + 'data_type_string' => 'ezstring', + 'id' => '1309', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'morbi neque', + 'version' => '1', + ), + 1198 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '248', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Morbi-neque.jpg" suffix="jpg" basename="Morbi-neque" dirpath="var/ezwebin_site/storage/images/company/contact/morbi-neque/1310-1-eng-US" url="var/ezwebin_site/storage/images/company/contact/morbi-neque/1310-1-eng-US/Morbi-neque.jpg" original_filename="c74270b3.jpg" mime_type="image/jpeg" width="120" height="120" alternative_text="Morbi neque" alias_key="1293033771" timestamp="1311154212"><original attribute_id="1310" attribute_version="1" attribute_language="eng-US"/><information Height="120" Width="120" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1310', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1199 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '249', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1311', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1200 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '250', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph><strong>Morbi neque. Proin porta dapibus turpis.</strong></paragraph><paragraph>Vivamus placerat fringilla purus. Pellentesque at libero. In hac habitasse platea dictumst. Pellentesque ante.</paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '1312', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1201 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '251', + 'contentobject_id' => '223', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezurl', + 'id' => '1313', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1202 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '266', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Company banner', + 'data_type_string' => 'ezstring', + 'id' => '1314', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'company banner', + 'version' => '1', + ), + 1203 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '267', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '1315', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1204 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '268', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="Company-banner.jpg" suffix="jpg" basename="Company-banner" dirpath="var/ezwebin_site/storage/images/company/company-banner/1316-1-eng-US" url="var/ezwebin_site/storage/images/company/company-banner/1316-1-eng-US/Company-banner.jpg" original_filename="0e055a7f.jpg" mime_type="image/jpeg" width="566" height="197" alternative_text="Company banner" alias_key="1293033771" timestamp="1311154212"><original attribute_id="1316" attribute_version="1" attribute_language="eng-US"/><information Height="197" Width="566" IsColor="1"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1316', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1205 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '269', + 'contentobject_id' => '224', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1317', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1206 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '329', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '105', + 'data_text' => 'Site map', + 'data_type_string' => 'ezurl', + 'id' => '1318', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1207 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '330', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '106', + 'data_text' => 'Tag cloud', + 'data_type_string' => 'ezurl', + 'id' => '1319', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1208 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '331', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Login', + 'data_type_string' => 'ezstring', + 'id' => '1320', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'login', + 'version' => '2', + ), + 1209 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '332', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Logout', + 'data_type_string' => 'ezstring', + 'id' => '1321', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'logout', + 'version' => '2', + ), + 1210 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '333', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'My profile', + 'data_type_string' => 'ezstring', + 'id' => '1322', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'my profile', + 'version' => '2', + ), + 1211 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '334', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Register', + 'data_type_string' => 'ezstring', + 'id' => '1323', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'register', + 'version' => '2', + ), + 1212 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '335', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '/rss/feed/my_feed', + 'data_type_string' => 'ezstring', + 'id' => '1324', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '/rss/feed/my_feed', + 'version' => '2', + ), + 1213 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '336', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Shopping basket', + 'data_type_string' => 'ezstring', + 'id' => '1325', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'shopping basket', + 'version' => '2', + ), + 1214 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '337', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Site settings', + 'data_type_string' => 'ezstring', + 'id' => '1326', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'site settings', + 'version' => '2', + ), + 1215 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '338', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Copyright © 2011 <a href="http://ez.no" title="eZ Systems">eZ Systems AS</a> (except where otherwise noted). All rights reserved.', + 'data_type_string' => 'eztext', + 'id' => '1327', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1216 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '339', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1328', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1217 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '340', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '1329', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1218 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '225', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '1330', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 1219 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '225', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '1331', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1220 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'New test article', + 'data_type_string' => 'ezstring', + 'id' => '1332', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'new test article', + 'version' => '1', + ), + 1221 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '183', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'New test article (2)', + 'data_type_string' => 'ezstring', + 'id' => '1332', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'new test article (2)', + 'version' => '2', + ), + 1222 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Something', + 'data_type_string' => 'ezstring', + 'id' => '1333', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'something', + 'version' => '1', + ), + 1223 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '184', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Something', + 'data_type_string' => 'ezstring', + 'id' => '1333', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'something', + 'version' => '2', + ), + 1224 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="kn@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1334', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1225 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '185', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="kn@ez.no"/></authors></ezauthor> +', + 'data_type_string' => 'ezauthor', + 'id' => '1334', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1226 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Something is in here!</paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1335', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1227 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '186', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Something is in here!</paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1335', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1228 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Something is in here!</paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1336', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1229 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '187', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Something is in here!</paragraph></section> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1336', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1230 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1337', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 1231 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '188', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '1337', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '2', + ), + 1232 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1313047865"><original attribute_id="1338" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1338', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1233 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '189', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1313047865"><original attribute_id="1338" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '1338', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1234 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1339', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1235 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '190', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'data_type_string' => 'ezxmltext', + 'id' => '1339', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1236 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1340', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1237 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '191', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1340', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1238 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1341', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1239 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '192', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '1341', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1240 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1342', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1241 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '193', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '1342', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1242 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1343', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1243 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '1343', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1244 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '194', + 'contentobject_id' => '226', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '4000', + 'language_code' => 'eng-GB', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1245 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '225', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '4001', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '2', + ), + 1246 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '225', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '4002', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 1247 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '302', + 'contentobject_id' => '166', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Forum', + 'data_type_string' => 'ezstring', + 'id' => '4003', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'forum', + 'version' => '2', + ), + 1248 => array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '303', + 'contentobject_id' => '166', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/>', + 'data_type_string' => 'ezxmltext', + 'id' => '4004', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ) + ), + 'ezcontentobject_version' => array ( + 0 => array ( + 'contentobject_id' => '4', + 'created' => '0', + 'creator_id' => '14', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '0', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '1', + ), + 1 => array ( + 'contentobject_id' => '11', + 'created' => '1033920737', + 'creator_id' => '14', + 'id' => '439', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920746', + 'status' => '3', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 2 => array ( + 'contentobject_id' => '12', + 'created' => '1033920760', + 'creator_id' => '14', + 'id' => '440', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 3 => array ( + 'contentobject_id' => '13', + 'created' => '1033920786', + 'creator_id' => '14', + 'id' => '441', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 4 => array ( + 'contentobject_id' => '41', + 'created' => '1060695450', + 'creator_id' => '14', + 'id' => '472', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 5 => array ( + 'contentobject_id' => '42', + 'created' => '1072180278', + 'creator_id' => '14', + 'id' => '473', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 6 => array ( + 'contentobject_id' => '10', + 'created' => '1072180337', + 'creator_id' => '14', + 'id' => '474', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 7 => array ( + 'contentobject_id' => '45', + 'created' => '1079684084', + 'creator_id' => '14', + 'id' => '477', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 8 => array ( + 'contentobject_id' => '49', + 'created' => '1080220181', + 'creator_id' => '14', + 'id' => '488', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 9 => array ( + 'contentobject_id' => '50', + 'created' => '1080220211', + 'creator_id' => '14', + 'id' => '489', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 10 => array ( + 'contentobject_id' => '51', + 'created' => '1080220225', + 'creator_id' => '14', + 'id' => '490', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 11 => array ( + 'contentobject_id' => '52', + 'created' => '1082016497', + 'creator_id' => '14', + 'id' => '491', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 12 => array ( + 'contentobject_id' => '56', + 'created' => '1103023120', + 'creator_id' => '14', + 'id' => '495', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023120', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 13 => array ( + 'contentobject_id' => '14', + 'created' => '1301061783', + 'creator_id' => '14', + 'id' => '499', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1301062024', + 'status' => '3', + 'user_id' => '0', + 'version' => '3', + 'workflow_event_pos' => '0', + ), + 14 => array ( + 'contentobject_id' => '54', + 'created' => '1301062300', + 'creator_id' => '14', + 'id' => '500', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062375', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 15 => array ( + 'contentobject_id' => '57', + 'created' => '1168428357', + 'creator_id' => '14', + 'id' => '504', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1168428357', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 16 => array ( + 'contentobject_id' => '58', + 'created' => '1175499884', + 'creator_id' => '14', + 'id' => '505', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499903', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 17 => array ( + 'contentobject_id' => '59', + 'created' => '1175499919', + 'creator_id' => '14', + 'id' => '506', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499932', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 18 => array ( + 'contentobject_id' => '60', + 'created' => '1175499947', + 'creator_id' => '14', + 'id' => '507', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499959', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 19 => array ( + 'contentobject_id' => '61', + 'created' => '1175500068', + 'creator_id' => '14', + 'id' => '508', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500074', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 20 => array ( + 'contentobject_id' => '62', + 'created' => '1175500086', + 'creator_id' => '14', + 'id' => '509', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500182', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 21 => array ( + 'contentobject_id' => '63', + 'created' => '1175500520', + 'creator_id' => '14', + 'id' => '510', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500542', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 22 => array ( + 'contentobject_id' => '64', + 'created' => '1175500561', + 'creator_id' => '14', + 'id' => '511', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500602', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 23 => array ( + 'contentobject_id' => '65', + 'created' => '1299780934', + 'creator_id' => '14', + 'id' => '512', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780998', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 24 => array ( + 'contentobject_id' => '66', + 'created' => '1299781436', + 'creator_id' => '14', + 'id' => '513', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781436', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 25 => array ( + 'contentobject_id' => '67', + 'created' => '1174567458', + 'creator_id' => '14', + 'id' => '514', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174567474', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 26 => array ( + 'contentobject_id' => '68', + 'created' => '1174302333', + 'creator_id' => '14', + 'id' => '515', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302360', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 27 => array ( + 'contentobject_id' => '69', + 'created' => '1174303659', + 'creator_id' => '14', + 'id' => '516', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174303791', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 28 => array ( + 'contentobject_id' => '70', + 'created' => '1174302380', + 'creator_id' => '14', + 'id' => '517', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302388', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 29 => array ( + 'contentobject_id' => '71', + 'created' => '1174303300', + 'creator_id' => '14', + 'id' => '518', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174303350', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 30 => array ( + 'contentobject_id' => '72', + 'created' => '1174303407', + 'creator_id' => '14', + 'id' => '519', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174303441', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 31 => array ( + 'contentobject_id' => '73', + 'created' => '1174304926', + 'creator_id' => '14', + 'id' => '520', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174304934', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 32 => array ( + 'contentobject_id' => '74', + 'created' => '1174302401', + 'creator_id' => '14', + 'id' => '521', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302417', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 33 => array ( + 'contentobject_id' => '75', + 'created' => '1175500667', + 'creator_id' => '14', + 'id' => '522', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175500673', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 34 => array ( + 'contentobject_id' => '76', + 'created' => '1175069333', + 'creator_id' => '14', + 'id' => '523', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069345', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 35 => array ( + 'contentobject_id' => '77', + 'created' => '1174643924', + 'creator_id' => '14', + 'id' => '524', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174643989', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 36 => array ( + 'contentobject_id' => '78', + 'created' => '1174644062', + 'creator_id' => '14', + 'id' => '525', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174644139', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 37 => array ( + 'contentobject_id' => '79', + 'created' => '1174644699', + 'creator_id' => '14', + 'id' => '526', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174644713', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 38 => array ( + 'contentobject_id' => '80', + 'created' => '1175069353', + 'creator_id' => '14', + 'id' => '527', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069361', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 39 => array ( + 'contentobject_id' => '81', + 'created' => '1174645164', + 'creator_id' => '14', + 'id' => '528', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174645183', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 40 => array ( + 'contentobject_id' => '82', + 'created' => '1174645280', + 'creator_id' => '14', + 'id' => '529', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174645301', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 41 => array ( + 'contentobject_id' => '83', + 'created' => '1174645353', + 'creator_id' => '14', + 'id' => '530', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174645360', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 42 => array ( + 'contentobject_id' => '84', + 'created' => '1175513890', + 'creator_id' => '14', + 'id' => '531', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175513914', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 43 => array ( + 'contentobject_id' => '85', + 'created' => '1175238144', + 'creator_id' => '14', + 'id' => '532', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238155', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 44 => array ( + 'contentobject_id' => '86', + 'created' => '1175069166', + 'creator_id' => '14', + 'id' => '533', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069183', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 45 => array ( + 'contentobject_id' => '87', + 'created' => '1175236143', + 'creator_id' => '14', + 'id' => '534', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175236156', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 46 => array ( + 'contentobject_id' => '88', + 'created' => '1175236170', + 'creator_id' => '14', + 'id' => '535', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175236181', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 47 => array ( + 'contentobject_id' => '89', + 'created' => '1175238540', + 'creator_id' => '14', + 'id' => '536', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238552', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 48 => array ( + 'contentobject_id' => '90', + 'created' => '1174389626', + 'creator_id' => '14', + 'id' => '537', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174389633', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 49 => array ( + 'contentobject_id' => '91', + 'created' => '1175238182', + 'creator_id' => '14', + 'id' => '538', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238194', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 50 => array ( + 'contentobject_id' => '92', + 'created' => '1175238211', + 'creator_id' => '14', + 'id' => '539', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238222', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 51 => array ( + 'contentobject_id' => '93', + 'created' => '1175069305', + 'creator_id' => '14', + 'id' => '540', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069321', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 52 => array ( + 'contentobject_id' => '94', + 'created' => '1175496885', + 'creator_id' => '14', + 'id' => '541', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175496901', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 53 => array ( + 'contentobject_id' => '95', + 'created' => '1175258807', + 'creator_id' => '14', + 'id' => '542', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175258817', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 54 => array ( + 'contentobject_id' => '96', + 'created' => '1175253354', + 'creator_id' => '14', + 'id' => '543', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253354', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 55 => array ( + 'contentobject_id' => '97', + 'created' => '1175253355', + 'creator_id' => '14', + 'id' => '544', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253355', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 56 => array ( + 'contentobject_id' => '98', + 'created' => '1175082027', + 'creator_id' => '14', + 'id' => '545', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175082041', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 57 => array ( + 'contentobject_id' => '99', + 'created' => '1175082005', + 'creator_id' => '14', + 'id' => '546', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175082005', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 58 => array ( + 'contentobject_id' => '100', + 'created' => '1175082007', + 'creator_id' => '14', + 'id' => '547', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175082007', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 59 => array ( + 'contentobject_id' => '101', + 'created' => '1175253486', + 'creator_id' => '14', + 'id' => '548', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253508', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 60 => array ( + 'contentobject_id' => '102', + 'created' => '1175496936', + 'creator_id' => '14', + 'id' => '549', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175496958', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 61 => array ( + 'contentobject_id' => '103', + 'created' => '1175253638', + 'creator_id' => '14', + 'id' => '550', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253665', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 62 => array ( + 'contentobject_id' => '104', + 'created' => '1175253680', + 'creator_id' => '14', + 'id' => '551', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253697', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 63 => array ( + 'contentobject_id' => '105', + 'created' => '1299158726', + 'creator_id' => '14', + 'id' => '552', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299158749', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 64 => array ( + 'contentobject_id' => '106', + 'created' => '1299826193', + 'creator_id' => '14', + 'id' => '553', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299826201', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 65 => array ( + 'contentobject_id' => '107', + 'created' => '1299782457', + 'creator_id' => '14', + 'id' => '554', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782490', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 66 => array ( + 'contentobject_id' => '108', + 'created' => '1299782077', + 'creator_id' => '14', + 'id' => '555', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782140', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 67 => array ( + 'contentobject_id' => '109', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '556', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 68 => array ( + 'contentobject_id' => '110', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '557', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 69 => array ( + 'contentobject_id' => '111', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '558', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 70 => array ( + 'contentobject_id' => '112', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '559', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 71 => array ( + 'contentobject_id' => '113', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '560', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 72 => array ( + 'contentobject_id' => '114', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '561', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 73 => array ( + 'contentobject_id' => '115', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '562', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 74 => array ( + 'contentobject_id' => '116', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '563', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 75 => array ( + 'contentobject_id' => '117', + 'created' => '1299772463', + 'creator_id' => '14', + 'id' => '564', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772463', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 76 => array ( + 'contentobject_id' => '118', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '565', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 77 => array ( + 'contentobject_id' => '119', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '566', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 78 => array ( + 'contentobject_id' => '120', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '567', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 79 => array ( + 'contentobject_id' => '121', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '568', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 80 => array ( + 'contentobject_id' => '122', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '569', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 81 => array ( + 'contentobject_id' => '123', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '570', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 82 => array ( + 'contentobject_id' => '124', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '571', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 83 => array ( + 'contentobject_id' => '125', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '572', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 84 => array ( + 'contentobject_id' => '126', + 'created' => '1299772545', + 'creator_id' => '14', + 'id' => '573', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772545', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 85 => array ( + 'contentobject_id' => '127', + 'created' => '1299782157', + 'creator_id' => '14', + 'id' => '574', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782177', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 86 => array ( + 'contentobject_id' => '128', + 'created' => '1299772637', + 'creator_id' => '14', + 'id' => '575', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772637', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 87 => array ( + 'contentobject_id' => '129', + 'created' => '1299772637', + 'creator_id' => '14', + 'id' => '576', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299772637', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 88 => array ( + 'contentobject_id' => '130', + 'created' => '1284398171', + 'creator_id' => '14', + 'id' => '577', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1284398357', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 89 => array ( + 'contentobject_id' => '131', + 'created' => '1299780740', + 'creator_id' => '14', + 'id' => '578', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780749', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 90 => array ( + 'contentobject_id' => '132', + 'created' => '1299781985', + 'creator_id' => '14', + 'id' => '579', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782001', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 91 => array ( + 'contentobject_id' => '133', + 'created' => '1299773631', + 'creator_id' => '14', + 'id' => '580', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773631', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 92 => array ( + 'contentobject_id' => '134', + 'created' => '1299773631', + 'creator_id' => '14', + 'id' => '581', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773631', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 93 => array ( + 'contentobject_id' => '135', + 'created' => '1299773631', + 'creator_id' => '14', + 'id' => '582', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773631', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 94 => array ( + 'contentobject_id' => '136', + 'created' => '1299773644', + 'creator_id' => '14', + 'id' => '583', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773644', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 95 => array ( + 'contentobject_id' => '137', + 'created' => '1299773644', + 'creator_id' => '14', + 'id' => '584', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773644', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 96 => array ( + 'contentobject_id' => '138', + 'created' => '1299773644', + 'creator_id' => '14', + 'id' => '585', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773644', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 97 => array ( + 'contentobject_id' => '139', + 'created' => '1299781873', + 'creator_id' => '14', + 'id' => '586', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781914', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 98 => array ( + 'contentobject_id' => '140', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '587', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 99 => array ( + 'contentobject_id' => '141', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '588', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 100 => array ( + 'contentobject_id' => '142', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '589', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 101 => array ( + 'contentobject_id' => '143', + 'created' => '1299773656', + 'creator_id' => '14', + 'id' => '590', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773656', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 102 => array ( + 'contentobject_id' => '144', + 'created' => '1299781559', + 'creator_id' => '14', + 'id' => '591', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781605', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 103 => array ( + 'contentobject_id' => '145', + 'created' => '1299826213', + 'creator_id' => '14', + 'id' => '592', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299826223', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 104 => array ( + 'contentobject_id' => '146', + 'created' => '1299773676', + 'creator_id' => '14', + 'id' => '593', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773676', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 105 => array ( + 'contentobject_id' => '147', + 'created' => '1299773690', + 'creator_id' => '14', + 'id' => '594', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773690', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 106 => array ( + 'contentobject_id' => '148', + 'created' => '1299773704', + 'creator_id' => '14', + 'id' => '595', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773704', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 107 => array ( + 'contentobject_id' => '149', + 'created' => '1299773703', + 'creator_id' => '14', + 'id' => '596', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773703', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 108 => array ( + 'contentobject_id' => '150', + 'created' => '1299781471', + 'creator_id' => '14', + 'id' => '597', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299781476', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 109 => array ( + 'contentobject_id' => '151', + 'created' => '1299780633', + 'creator_id' => '14', + 'id' => '598', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780653', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 110 => array ( + 'contentobject_id' => '152', + 'created' => '1299780355', + 'creator_id' => '14', + 'id' => '599', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780355', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 111 => array ( + 'contentobject_id' => '153', + 'created' => '1299780355', + 'creator_id' => '14', + 'id' => '600', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780355', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 112 => array ( + 'contentobject_id' => '154', + 'created' => '1175499320', + 'creator_id' => '14', + 'id' => '601', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499365', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 113 => array ( + 'contentobject_id' => '155', + 'created' => '1175498170', + 'creator_id' => '14', + 'id' => '602', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498179', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 114 => array ( + 'contentobject_id' => '156', + 'created' => '1175497864', + 'creator_id' => '14', + 'id' => '603', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497937', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 115 => array ( + 'contentobject_id' => '157', + 'created' => '1175499122', + 'creator_id' => '14', + 'id' => '604', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499136', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 116 => array ( + 'contentobject_id' => '158', + 'created' => '1175497254', + 'creator_id' => '14', + 'id' => '605', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497280', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 117 => array ( + 'contentobject_id' => '159', + 'created' => '1175498224', + 'creator_id' => '14', + 'id' => '606', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498242', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 118 => array ( + 'contentobject_id' => '160', + 'created' => '1175498737', + 'creator_id' => '14', + 'id' => '607', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498746', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 119 => array ( + 'contentobject_id' => '161', + 'created' => '1175498890', + 'creator_id' => '14', + 'id' => '608', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498940', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 120 => array ( + 'contentobject_id' => '162', + 'created' => '1175497211', + 'creator_id' => '14', + 'id' => '609', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497237', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 121 => array ( + 'contentobject_id' => '163', + 'created' => '1175497171', + 'creator_id' => '14', + 'id' => '610', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497203', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 122 => array ( + 'contentobject_id' => '164', + 'created' => '1175499551', + 'creator_id' => '14', + 'id' => '611', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499563', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 123 => array ( + 'contentobject_id' => '165', + 'created' => '1193915715', + 'creator_id' => '14', + 'id' => '612', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915732', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 124 => array ( + 'contentobject_id' => '166', + 'created' => '1193915699', + 'creator_id' => '14', + 'id' => '613', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915707', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 125 => array ( + 'contentobject_id' => '167', + 'created' => '1193906039', + 'creator_id' => '14', + 'id' => '614', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906039', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 126 => array ( + 'contentobject_id' => '168', + 'created' => '1193906579', + 'creator_id' => '14', + 'id' => '615', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906579', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 127 => array ( + 'contentobject_id' => '169', + 'created' => '1193906040', + 'creator_id' => '14', + 'id' => '616', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906040', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 128 => array ( + 'contentobject_id' => '170', + 'created' => '1193906045', + 'creator_id' => '14', + 'id' => '617', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906045', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 129 => array ( + 'contentobject_id' => '171', + 'created' => '1299779680', + 'creator_id' => '14', + 'id' => '618', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299779688', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 130 => array ( + 'contentobject_id' => '172', + 'created' => '1193906046', + 'creator_id' => '14', + 'id' => '619', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906046', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 131 => array ( + 'contentobject_id' => '173', + 'created' => '1193906046', + 'creator_id' => '14', + 'id' => '620', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906046', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 132 => array ( + 'contentobject_id' => '174', + 'created' => '1193906047', + 'creator_id' => '14', + 'id' => '621', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906047', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 133 => array ( + 'contentobject_id' => '175', + 'created' => '1193906047', + 'creator_id' => '14', + 'id' => '622', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193906047', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 134 => array ( + 'contentobject_id' => '176', + 'created' => '1299773437', + 'creator_id' => '14', + 'id' => '623', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773449', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 135 => array ( + 'contentobject_id' => '177', + 'created' => '1299773204', + 'creator_id' => '14', + 'id' => '624', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773210', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 136 => array ( + 'contentobject_id' => '178', + 'created' => '1299773232', + 'creator_id' => '14', + 'id' => '625', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773237', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 137 => array ( + 'contentobject_id' => '179', + 'created' => '1299773245', + 'creator_id' => '14', + 'id' => '626', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773259', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 138 => array ( + 'contentobject_id' => '180', + 'created' => '1299773266', + 'creator_id' => '14', + 'id' => '627', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773275', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 139 => array ( + 'contentobject_id' => '181', + 'created' => '1299773330', + 'creator_id' => '14', + 'id' => '628', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773344', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 140 => array ( + 'contentobject_id' => '182', + 'created' => '1299773379', + 'creator_id' => '14', + 'id' => '629', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773383', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 141 => array ( + 'contentobject_id' => '183', + 'created' => '1299773397', + 'creator_id' => '14', + 'id' => '630', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773410', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 142 => array ( + 'contentobject_id' => '184', + 'created' => '1299773419', + 'creator_id' => '14', + 'id' => '631', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299773429', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 143 => array ( + 'contentobject_id' => '185', + 'created' => '1193915419', + 'creator_id' => '14', + 'id' => '632', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915424', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 144 => array ( + 'contentobject_id' => '186', + 'created' => '1193915476', + 'creator_id' => '14', + 'id' => '633', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915590', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 145 => array ( + 'contentobject_id' => '187', + 'created' => '1193915617', + 'creator_id' => '14', + 'id' => '634', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915639', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 146 => array ( + 'contentobject_id' => '188', + 'created' => '1175242696', + 'creator_id' => '14', + 'id' => '635', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242706', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 147 => array ( + 'contentobject_id' => '189', + 'created' => '1174305514', + 'creator_id' => '14', + 'id' => '636', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174305524', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 148 => array ( + 'contentobject_id' => '190', + 'created' => '1299159416', + 'creator_id' => '14', + 'id' => '637', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159424', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 149 => array ( + 'contentobject_id' => '191', + 'created' => '1193907125', + 'creator_id' => '14', + 'id' => '638', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193935923', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 150 => array ( + 'contentobject_id' => '192', + 'created' => '1253010589', + 'creator_id' => '14', + 'id' => '639', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010589', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 151 => array ( + 'contentobject_id' => '193', + 'created' => '1193914499', + 'creator_id' => '14', + 'id' => '640', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193914551', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 152 => array ( + 'contentobject_id' => '194', + 'created' => '1253009641', + 'creator_id' => '14', + 'id' => '641', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009641', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 153 => array ( + 'contentobject_id' => '195', + 'created' => '1253009692', + 'creator_id' => '14', + 'id' => '642', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009692', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 154 => array ( + 'contentobject_id' => '196', + 'created' => '1253009743', + 'creator_id' => '14', + 'id' => '643', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009743', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 155 => array ( + 'contentobject_id' => '197', + 'created' => '1253009784', + 'creator_id' => '14', + 'id' => '644', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009784', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 156 => array ( + 'contentobject_id' => '198', + 'created' => '1253009879', + 'creator_id' => '14', + 'id' => '645', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009879', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 157 => array ( + 'contentobject_id' => '199', + 'created' => '1253010805', + 'creator_id' => '14', + 'id' => '646', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010805', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 158 => array ( + 'contentobject_id' => '200', + 'created' => '1253009816', + 'creator_id' => '14', + 'id' => '647', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009816', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 159 => array ( + 'contentobject_id' => '201', + 'created' => '1253009848', + 'creator_id' => '14', + 'id' => '648', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253009848', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 160 => array ( + 'contentobject_id' => '202', + 'created' => '1299782198', + 'creator_id' => '14', + 'id' => '649', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299782207', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 161 => array ( + 'contentobject_id' => '203', + 'created' => '1253010223', + 'creator_id' => '14', + 'id' => '650', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010223', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 162 => array ( + 'contentobject_id' => '204', + 'created' => '1253010249', + 'creator_id' => '14', + 'id' => '651', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010249', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 163 => array ( + 'contentobject_id' => '205', + 'created' => '1253010272', + 'creator_id' => '14', + 'id' => '652', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010272', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 164 => array ( + 'contentobject_id' => '206', + 'created' => '1253010315', + 'creator_id' => '14', + 'id' => '653', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010315', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 165 => array ( + 'contentobject_id' => '207', + 'created' => '1253010343', + 'creator_id' => '14', + 'id' => '654', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010343', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 166 => array ( + 'contentobject_id' => '208', + 'created' => '1253010367', + 'creator_id' => '14', + 'id' => '655', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010367', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 167 => array ( + 'contentobject_id' => '209', + 'created' => '1253010401', + 'creator_id' => '14', + 'id' => '656', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010401', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 168 => array ( + 'contentobject_id' => '210', + 'created' => '1253010921', + 'creator_id' => '14', + 'id' => '657', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253010921', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 169 => array ( + 'contentobject_id' => '211', + 'created' => '1193914345', + 'creator_id' => '14', + 'id' => '658', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193914399', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 170 => array ( + 'contentobject_id' => '212', + 'created' => '1253011179', + 'creator_id' => '14', + 'id' => '659', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253011179', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 171 => array ( + 'contentobject_id' => '213', + 'created' => '1253011241', + 'creator_id' => '14', + 'id' => '660', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1253011241', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 172 => array ( + 'contentobject_id' => '214', + 'created' => '1299159430', + 'creator_id' => '14', + 'id' => '661', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159460', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 173 => array ( + 'contentobject_id' => '215', + 'created' => '1299159470', + 'creator_id' => '14', + 'id' => '662', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159490', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 174 => array ( + 'contentobject_id' => '216', + 'created' => '1299159503', + 'creator_id' => '14', + 'id' => '663', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159523', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 175 => array ( + 'contentobject_id' => '217', + 'created' => '1299159538', + 'creator_id' => '14', + 'id' => '664', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159553', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 176 => array ( + 'contentobject_id' => '218', + 'created' => '1299216456', + 'creator_id' => '14', + 'id' => '665', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299216558', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 177 => array ( + 'contentobject_id' => '219', + 'created' => '1174305636', + 'creator_id' => '14', + 'id' => '666', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174305643', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 178 => array ( + 'contentobject_id' => '220', + 'created' => '1175069781', + 'creator_id' => '14', + 'id' => '667', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069794', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 179 => array ( + 'contentobject_id' => '221', + 'created' => '1175069727', + 'creator_id' => '14', + 'id' => '668', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069741', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 180 => array ( + 'contentobject_id' => '222', + 'created' => '1174308738', + 'creator_id' => '14', + 'id' => '669', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174308756', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 181 => array ( + 'contentobject_id' => '223', + 'created' => '1174654820', + 'creator_id' => '14', + 'id' => '670', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174654830', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 182 => array ( + 'contentobject_id' => '224', + 'created' => '1175242951', + 'creator_id' => '14', + 'id' => '671', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242960', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 183 => array ( + 'contentobject_id' => '14', + 'created' => '1311154214', + 'creator_id' => '14', + 'id' => '672', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154214', + 'status' => '1', + 'user_id' => '0', + 'version' => '4', + 'workflow_event_pos' => '0', + ), + 184 => array ( + 'contentobject_id' => '225', + 'created' => '1311154215', + 'creator_id' => '14', + 'id' => '673', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 185 => array ( + 'contentobject_id' => '11', + 'created' => '1311154215', + 'creator_id' => '14', + 'id' => '674', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 186 => array ( + 'contentobject_id' => '226', + 'created' => '1313047865', + 'creator_id' => '14', + 'id' => '675', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1313047907', + 'status' => '3', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 187 => array ( + 'contentobject_id' => '226', + 'created' => '1313061317', + 'creator_id' => '14', + 'id' => '676', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1313061404', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 188 => array ( + 'contentobject_id' => '225', + 'created' => '1311155215', + 'creator_id' => '14', + 'id' => '677', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311155215', + 'status' => '0', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 124 => array ( + 'contentobject_id' => '166', + 'created' => '1193916699', + 'creator_id' => '14', + 'id' => '678', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193916707', + 'status' => '0', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ) + ), + 'ezcontentobject' => array ( + 0 => array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033917596', + 'name' => 'Users', + 'owner_id' => '14', + 'published' => '1033917596', + 'remote_id' => 'f5c88a2209584891056f987fd965b0ba', + 'section_id' => '2', + 'status' => '1', + ), + 1 => array ( + 'contentclass_id' => '4', + 'current_version' => '2', + 'id' => '10', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'name' => 'Anonymous User', + 'owner_id' => '14', + 'published' => '1033920665', + 'remote_id' => 'faaeb9be3bd98ed09f606fc16d144eca', + 'section_id' => '2', + 'status' => '1', + ), + 2 => array ( + 'contentclass_id' => '3', + 'current_version' => '2', + 'id' => '11', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'name' => 'Members', + 'owner_id' => '14', + 'published' => '1033920746', + 'remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'section_id' => '2', + 'status' => '1', + ), + 3 => array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '12', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'name' => 'Administrator users', + 'owner_id' => '14', + 'published' => '1033920775', + 'remote_id' => '9b47a45624b023b1a76c73b74d704acf', + 'section_id' => '2', + 'status' => '1', + ), + 4 => array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '13', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'name' => 'Editors', + 'owner_id' => '14', + 'published' => '1033920794', + 'remote_id' => '3c160cca19fb135f83bd02d911f04db2', + 'section_id' => '2', + 'status' => '1', + ), + 5 => array ( + 'contentclass_id' => '4', + 'current_version' => '4', + 'id' => '14', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154214', + 'name' => 'Administrator User', + 'owner_id' => '14', + 'published' => '1033920830', + 'remote_id' => '1bb4fe25487f05527efa8bfd394cecc7', + 'section_id' => '2', + 'status' => '1', + ), + 6 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '41', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'name' => 'Media', + 'owner_id' => '14', + 'published' => '1060695457', + 'remote_id' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + 'section_id' => '3', + 'status' => '1', + ), + 7 => array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '42', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'name' => 'Anonymous Users', + 'owner_id' => '14', + 'published' => '1072180330', + 'remote_id' => '15b256dbea2ae72418ff5facc999e8f9', + 'section_id' => '2', + 'status' => '1', + ), + 8 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '45', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'name' => 'Setup', + 'owner_id' => '14', + 'published' => '1079684190', + 'remote_id' => '241d538ce310074e602f29f49e44e938', + 'section_id' => '4', + 'status' => '1', + ), + 9 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '49', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'name' => 'Images', + 'owner_id' => '14', + 'published' => '1080220197', + 'remote_id' => 'e7ff633c6b8e0fd3531e74c6e712bead', + 'section_id' => '3', + 'status' => '1', + ), + 10 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '50', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'name' => 'Files', + 'owner_id' => '14', + 'published' => '1080220220', + 'remote_id' => '732a5acd01b51a6fe6eab448ad4138a9', + 'section_id' => '3', + 'status' => '1', + ), + 11 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '51', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'name' => 'Multimedia', + 'owner_id' => '14', + 'published' => '1080220233', + 'remote_id' => '09082deb98662a104f325aaa8c4933d3', + 'section_id' => '3', + 'status' => '1', + ), + 12 => array ( + 'contentclass_id' => '14', + 'current_version' => '1', + 'id' => '52', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'name' => 'Common INI settings', + 'owner_id' => '14', + 'published' => '1082016591', + 'remote_id' => '27437f3547db19cf81a33c92578b2c89', + 'section_id' => '4', + 'status' => '1', + ), + 13 => array ( + 'contentclass_id' => '15', + 'current_version' => '2', + 'id' => '54', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062376', + 'name' => 'Website Interface', + 'owner_id' => '14', + 'published' => '1082016652', + 'remote_id' => '8b8b22fe3c6061ed500fbd2b377b885f', + 'section_id' => '5', + 'status' => '1', + ), + 14 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '56', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023132', + 'name' => 'Design', + 'owner_id' => '14', + 'published' => '1103023132', + 'remote_id' => '08799e609893f7aba22f10cb466d9cc8', + 'section_id' => '5', + 'status' => '1', + ), + 15 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '57', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1168428358', + 'name' => 'Banners', + 'owner_id' => '14', + 'published' => '1168428358', + 'remote_id' => 'f1826ada5e88c8f79e7048b2145040b2', + 'section_id' => '3', + 'status' => '1', + ), + 16 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '58', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499903', + 'name' => 'Woman (Communities)', + 'owner_id' => '14', + 'published' => '1174469194', + 'remote_id' => '99730850bd806030c4ae9ea92571bdd0', + 'section_id' => '3', + 'status' => '1', + ), + 17 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '59', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499933', + 'name' => 'Woman (Frontpage)', + 'owner_id' => '14', + 'published' => '1174474836', + 'remote_id' => '52f728d4880ca5def392e4f2e782ee6d', + 'section_id' => '3', + 'status' => '1', + ), + 18 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '60', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499960', + 'name' => 'Woman (Products)', + 'owner_id' => '14', + 'published' => '1174552827', + 'remote_id' => 'ec19f2662ebb0f930ce024a48f17f7ee', + 'section_id' => '3', + 'status' => '1', + ), + 19 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '61', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500074', + 'name' => 'Woman (Partners)', + 'owner_id' => '14', + 'published' => '1174655952', + 'remote_id' => '55e6c9acf534ff2f3564290cb38ffddc', + 'section_id' => '3', + 'status' => '1', + ), + 20 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '62', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500183', + 'name' => 'Pencils (Support)', + 'owner_id' => '14', + 'published' => '1174984631', + 'remote_id' => '768a04778081c6e08db5d77dd01f98a9', + 'section_id' => '3', + 'status' => '1', + ), + 21 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '63', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500542', + 'name' => 'Woman (Training)', + 'owner_id' => '14', + 'published' => '1174987052', + 'remote_id' => 'a7c0be8039efe452ca7d1e7ec1d28dcf', + 'section_id' => '3', + 'status' => '1', + ), + 22 => array ( + 'contentclass_id' => '42', + 'current_version' => '1', + 'id' => '64', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500602', + 'name' => 'Woman (Solutions)', + 'owner_id' => '14', + 'published' => '1175243716', + 'remote_id' => '1000aa14a05b968a2faa3def83aa1994', + 'section_id' => '3', + 'status' => '1', + ), + 23 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '65', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780998', + 'name' => 'Home', + 'owner_id' => '14', + 'published' => '1193906012', + 'remote_id' => '8a9c9c761004866fb458d89910f52bee', + 'section_id' => '1', + 'status' => '1', + ), + 24 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '66', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781436', + 'name' => 'rest_api', + 'owner_id' => '14', + 'published' => '1299781436', + 'remote_id' => '800a632abc6258f5e0a6229c2ff55b46', + 'section_id' => '3', + 'status' => '1', + ), + 25 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '67', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174567474', + 'name' => 'Products', + 'owner_id' => '14', + 'published' => '1174302316', + 'remote_id' => '5dba9f5125423db2eda9ba8858a38775', + 'section_id' => '1', + 'status' => '1', + ), + 26 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '68', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302361', + 'name' => 'Software', + 'owner_id' => '14', + 'published' => '1174302361', + 'remote_id' => '02d35489c12bcbff3239c3b739823678', + 'section_id' => '1', + 'status' => '1', + ), + 27 => array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '69', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174303791', + 'name' => 'OS Type I', + 'owner_id' => '14', + 'published' => '1174303791', + 'remote_id' => '2995f126f24a5ef2b937c63ecae2ffc0', + 'section_id' => '1', + 'status' => '1', + ), + 28 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '70', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302388', + 'name' => 'Boxes', + 'owner_id' => '14', + 'published' => '1174302388', + 'remote_id' => '7e60420c152b5b1821ff8dda1d5002aa', + 'section_id' => '1', + 'status' => '1', + ), + 29 => array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '71', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174303350', + 'name' => 'CD/DVD Box I', + 'owner_id' => '14', + 'published' => '1174302627', + 'remote_id' => 'c0e62f667c7edf5b69f3131c98292387', + 'section_id' => '1', + 'status' => '1', + ), + 30 => array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '72', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174303441', + 'name' => 'CD/DVD Box II', + 'owner_id' => '14', + 'published' => '1174303394', + 'remote_id' => '71692736085cf6f8a36cdbb082249764', + 'section_id' => '1', + 'status' => '1', + ), + 31 => array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '73', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174304934', + 'name' => 'CD/DVD Box III', + 'owner_id' => '14', + 'published' => '1174304181', + 'remote_id' => '14f969f0d7f75f507394372c22919d00', + 'section_id' => '1', + 'status' => '1', + ), + 32 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '74', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174302417', + 'name' => 'Products sheets', + 'owner_id' => '14', + 'published' => '1174302417', + 'remote_id' => '3524ea164ee11e7e102c9aaa56d02488', + 'section_id' => '1', + 'status' => '1', + ), + 33 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '75', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175500673', + 'name' => 'Solutions', + 'owner_id' => '14', + 'published' => '1174389373', + 'remote_id' => '3388409c96f37a7974f35befa5a14650', + 'section_id' => '1', + 'status' => '1', + ), + 34 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '76', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069345', + 'name' => 'Web publishing', + 'owner_id' => '14', + 'published' => '1174389439', + 'remote_id' => 'f21f7c41fd73c70814c46cb26b0851ed', + 'section_id' => '1', + 'status' => '1', + ), + 35 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '77', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174643990', + 'name' => 'Fusce sagittis sagittis', + 'owner_id' => '14', + 'published' => '1174643990', + 'remote_id' => '91ac81d846554a305a4029b19ba52d31', + 'section_id' => '1', + 'status' => '1', + ), + 36 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '78', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174644140', + 'name' => 'Etiam posuere sodales arcu', + 'owner_id' => '14', + 'published' => '1174644140', + 'remote_id' => 'f20f40a2f49aeec1ec40e9fb5d7cb86c', + 'section_id' => '1', + 'status' => '1', + ), + 37 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '79', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174644714', + 'name' => 'In hac habitasse platea', + 'owner_id' => '14', + 'published' => '1174644661', + 'remote_id' => 'b703033b4165a4e5b13a5b8d36b02cd1', + 'section_id' => '1', + 'status' => '1', + ), + 38 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '80', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069362', + 'name' => 'Content management', + 'owner_id' => '14', + 'published' => '1174389466', + 'remote_id' => '7dfe6d524e63a6759fd31db11a3e1490', + 'section_id' => '1', + 'status' => '1', + ), + 39 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '81', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174645184', + 'name' => 'Fusce sagittis sagittis urna', + 'owner_id' => '14', + 'published' => '1174645184', + 'remote_id' => '4179733ef0b35e2608ce72158ffe3893', + 'section_id' => '1', + 'status' => '1', + ), + 40 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '82', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174645301', + 'name' => 'Class aptent taciti sociosqu', + 'owner_id' => '14', + 'published' => '1174645301', + 'remote_id' => '5e182ad2a35120c9579c3f6d61e143cc', + 'section_id' => '1', + 'status' => '1', + ), + 41 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '83', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174645360', + 'name' => 'Aenean malesuada ligula', + 'owner_id' => '14', + 'published' => '1174645332', + 'remote_id' => 'a771e29e5157372b4798dd69a3f3eaaf', + 'section_id' => '1', + 'status' => '1', + ), + 42 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '84', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175513915', + 'name' => 'Training', + 'owner_id' => '14', + 'published' => '1174389534', + 'remote_id' => '79c3b8005e960653895177d765421342', + 'section_id' => '1', + 'status' => '1', + ), + 43 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '85', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238156', + 'name' => 'Certification', + 'owner_id' => '14', + 'published' => '1174389566', + 'remote_id' => '6a18ed16e2ea7618cc57b45791287408', + 'section_id' => '1', + 'status' => '1', + ), + 44 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '86', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069183', + 'name' => 'Professional workshops', + 'owner_id' => '14', + 'published' => '1174389594', + 'remote_id' => '895d89a8052f65834296b66318586044', + 'section_id' => '1', + 'status' => '1', + ), + 45 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '87', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175236156', + 'name' => 'Etiam sodales mauris', + 'owner_id' => '14', + 'published' => '1175235860', + 'remote_id' => '926e4fa2734f1fb6c73865417d374fea', + 'section_id' => '1', + 'status' => '1', + ), + 46 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '88', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175236182', + 'name' => 'Class aptent taciti', + 'owner_id' => '14', + 'published' => '1175236124', + 'remote_id' => '4014d37e72cee9e4dd45ab83b8b487ad', + 'section_id' => '1', + 'status' => '1', + ), + 47 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '89', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175238553', + 'name' => 'Duis auctor vehicula erat', + 'owner_id' => '14', + 'published' => '1175236994', + 'remote_id' => '93d52b9e156bd0fcd8b04cc3848e6399', + 'section_id' => '1', + 'status' => '1', + ), + 48 => array ( + 'contentclass_id' => '41', + 'current_version' => '1', + 'id' => '90', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174389633', + 'name' => 'Events and seminars', + 'owner_id' => '14', + 'published' => '1174389633', + 'remote_id' => '8ce63c01bab6005a389b7bde97f67dae', + 'section_id' => '1', + 'status' => '1', + ), + 49 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '91', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238194', + 'name' => 'Self-paced courses', + 'owner_id' => '14', + 'published' => '1174389656', + 'remote_id' => 'bafe7b5d33ea8ff41c0b8eab1bf8fc04', + 'section_id' => '1', + 'status' => '1', + ), + 50 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '92', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175238223', + 'name' => 'Instructor-led courses', + 'owner_id' => '14', + 'published' => '1174389673', + 'remote_id' => 'b2b0a9addbbe01a7cb0160e70e42645c', + 'section_id' => '1', + 'status' => '1', + ), + 51 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '93', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069321', + 'name' => 'Additional learning resources', + 'owner_id' => '14', + 'published' => '1174389699', + 'remote_id' => '34ceeed46f3ff3a5b29b8f96eb5d0d81', + 'section_id' => '1', + 'status' => '1', + ), + 52 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '94', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175496902', + 'name' => 'Support', + 'owner_id' => '14', + 'published' => '1174458644', + 'remote_id' => 'affc99e41128c1475fa4f23dafb7159b', + 'section_id' => '1', + 'status' => '1', + ), + 53 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '95', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175258818', + 'name' => 'Knowledgebase', + 'owner_id' => '14', + 'published' => '1174459837', + 'remote_id' => 'c4d3b3ee85f36777a744015c7f234387', + 'section_id' => '1', + 'status' => '1', + ), + 54 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '96', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175253354', + 'name' => 'Sed suscipit', + 'owner_id' => '14', + 'published' => '1175253354', + 'remote_id' => 'c8294dd0b321e556905fa73df3d7ca8e', + 'section_id' => '1', + 'status' => '1', + ), + 55 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '97', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175253355', + 'name' => 'Ut interdum', + 'owner_id' => '14', + 'published' => '1175253355', + 'remote_id' => '9ca41b0930e91ae61b2d67bab735ea76', + 'section_id' => '1', + 'status' => '1', + ), + 56 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '98', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175082041', + 'name' => 'Documentation', + 'owner_id' => '14', + 'published' => '1175081995', + 'remote_id' => '8366aa92a2a1b25e6f3ffc09e6fb6ce4', + 'section_id' => '1', + 'status' => '1', + ), + 57 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '99', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175082006', + 'name' => 'Mauris pretium', + 'owner_id' => '14', + 'published' => '1175082005', + 'remote_id' => '89a584d09ab2f7dbc3374aad02839f21', + 'section_id' => '1', + 'status' => '1', + ), + 58 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '100', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175082007', + 'name' => 'Aliquam posuere', + 'owner_id' => '14', + 'published' => '1175082007', + 'remote_id' => 'f6e9707b5c57b6559f71d1c208452586', + 'section_id' => '1', + 'status' => '1', + ), + 59 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '101', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253508', + 'name' => 'Books', + 'owner_id' => '14', + 'published' => '1174459757', + 'remote_id' => 'e9aacd027d83d0c7f938521743cd7c98', + 'section_id' => '1', + 'status' => '1', + ), + 60 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '102', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175496958', + 'name' => 'Aliquam pulvinar suscipit tellus', + 'owner_id' => '14', + 'published' => '1175496424', + 'remote_id' => 'ec2989a9d3928f616fc3f9a8230928a2', + 'section_id' => '1', + 'status' => '1', + ), + 61 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '103', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253665', + 'name' => 'Customer Service', + 'owner_id' => '14', + 'published' => '1174459783', + 'remote_id' => '6a972b9a9541a2cb8a1947f222c8a629', + 'section_id' => '1', + 'status' => '1', + ), + 62 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '104', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175253697', + 'name' => 'Support Programs', + 'owner_id' => '14', + 'published' => '1174459806', + 'remote_id' => 'be5e492565ceefe997010cec6518103e', + 'section_id' => '1', + 'status' => '1', + ), + 63 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '105', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299158749', + 'name' => 'Getting started', + 'owner_id' => '14', + 'published' => '1177409070', + 'remote_id' => '5eeb942341753fc43a2c03c64e86f849', + 'section_id' => '1', + 'status' => '1', + ), + 64 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '106', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299826201', + 'name' => 'Tutorials for', + 'owner_id' => '14', + 'published' => '1299158700', + 'remote_id' => 'fe77fde45a90fa16043f39d3e3e87e4b', + 'section_id' => '1', + 'status' => '1', + ), + 65 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '107', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782490', + 'name' => 'Get involved', + 'owner_id' => '14', + 'published' => '1299159072', + 'remote_id' => '5bae6a310785e4f43fcc592e28eb7fd0', + 'section_id' => '1', + 'status' => '1', + ), + 66 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '108', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782140', + 'name' => 'How to use eZ Publish', + 'owner_id' => '14', + 'published' => '1299772464', + 'remote_id' => '2ded978c269bba85013b86c2964009be', + 'section_id' => '1', + 'status' => '1', + ), + 67 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '109', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-500ab8787316f4299c770900bf0b0361', + 'section_id' => '1', + 'status' => '1', + ), + 68 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '110', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-ad2898c2625326a0d31d18153febbd23', + 'section_id' => '1', + 'status' => '1', + ), + 69 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '111', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-56d3f1d0fc6fc6833653e95d50ac37fe', + 'section_id' => '1', + 'status' => '1', + ), + 70 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '112', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-108ac92f1474159b11e596f43a621a50', + 'section_id' => '1', + 'status' => '1', + ), + 71 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '113', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-ceba80e058bbe31bd6c34bb0e4b70bb7', + 'section_id' => '1', + 'status' => '1', + ), + 72 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '114', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772465', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772465', + 'remote_id' => 'ezoo-9c4764dca2a879664b1d6d78275e3bf5', + 'section_id' => '1', + 'status' => '1', + ), + 73 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '115', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772466', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772466', + 'remote_id' => 'ezoo-1ade41acf96c3c4b1a12860e1b273f34', + 'section_id' => '1', + 'status' => '1', + ), + 74 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '116', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772466', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772466', + 'remote_id' => 'ezoo-7ba827c696f3e1a2f1346541ce006bc9', + 'section_id' => '1', + 'status' => '1', + ), + 75 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '117', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772466', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772466', + 'remote_id' => 'ezoo-807f36478d500837a867f092f16d2edb', + 'section_id' => '1', + 'status' => '1', + ), + 76 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '118', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772545', + 'name' => 'How to manage eZ Publish', + 'owner_id' => '14', + 'published' => '1299772545', + 'remote_id' => '90ee91c224c69f28aa775cf9edc34ef3', + 'section_id' => '1', + 'status' => '1', + ), + 77 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '119', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-6dd0f99f173ac80b7a02278b7a16d591', + 'section_id' => '1', + 'status' => '1', + ), + 78 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '120', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-9a1aaccfcceb5f0c6deed712dc3e8ad2', + 'section_id' => '1', + 'status' => '1', + ), + 79 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '121', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-833ab68985a7f8c1684b267b30a559c6', + 'section_id' => '1', + 'status' => '1', + ), + 80 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '122', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-93e2315c451c7126eae706b473b1c52a', + 'section_id' => '1', + 'status' => '1', + ), + 81 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '123', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-23e06358318331a1c2106d7c33a58418', + 'section_id' => '1', + 'status' => '1', + ), + 82 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '124', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-04a89e84e1f234c3c994d9d4c0e97427', + 'section_id' => '1', + 'status' => '1', + ), + 83 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '125', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772546', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772546', + 'remote_id' => 'ezoo-074e119f8e73af31122dbb65c5e2e051', + 'section_id' => '1', + 'status' => '1', + ), + 84 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '126', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772547', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772547', + 'remote_id' => 'ezoo-523ece70d73d5d9181766024536432ac', + 'section_id' => '1', + 'status' => '1', + ), + 85 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '127', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782177', + 'name' => 'How to develop with eZ Publish', + 'owner_id' => '14', + 'published' => '1299772637', + 'remote_id' => '564f94afa87f70227199e951450b19a4', + 'section_id' => '1', + 'status' => '1', + ), + 86 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '128', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772637', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772637', + 'remote_id' => 'ezoo-0766000124cbc5f97cbc2ab2a866d211', + 'section_id' => '1', + 'status' => '1', + ), + 87 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '129', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299772637', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299772637', + 'remote_id' => 'ezoo-e6d52e4230c6537bb443681a3e2227f1', + 'section_id' => '1', + 'status' => '1', + ), + 88 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '130', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1284398357', + 'name' => 'Adding Siteaccesses in eZ Publish', + 'owner_id' => '14', + 'published' => '1284398357', + 'remote_id' => 'e02b80d7cd9059cf469aafbe7d2d1969', + 'section_id' => '1', + 'status' => '1', + ), + 89 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '131', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299780749', + 'name' => 'New features', + 'owner_id' => '14', + 'published' => '1299780749', + 'remote_id' => '5602aa2e97cc42199dbdf09d39602fa1', + 'section_id' => '1', + 'status' => '1', + ), + 90 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '132', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782001', + 'name' => 'Improved user registration workflow', + 'owner_id' => '14', + 'published' => '1299773631', + 'remote_id' => 'b3a55b313b9dcc062b0a72d353a061f0', + 'section_id' => '1', + 'status' => '1', + ), + 91 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '133', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773632', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773632', + 'remote_id' => 'ezoo-824ecec8d77eacebe80a14de50be1407', + 'section_id' => '1', + 'status' => '1', + ), + 92 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '134', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773632', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773632', + 'remote_id' => 'ezoo-be5800de6f1768c0246c98fb8ab82ae8', + 'section_id' => '1', + 'status' => '1', + ), + 93 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '135', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773632', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773632', + 'remote_id' => 'ezoo-898e714f495796d827e14fabcad39004', + 'section_id' => '1', + 'status' => '1', + ), + 94 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '136', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773644', + 'name' => 'Improved block editing', + 'owner_id' => '14', + 'published' => '1299773644', + 'remote_id' => '600871786c620b262ed880d0712cf9e0', + 'section_id' => '1', + 'status' => '1', + ), + 95 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '137', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773644', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773644', + 'remote_id' => 'ezoo-786d2237126858b0ae103bba831194c5', + 'section_id' => '1', + 'status' => '1', + ), + 96 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '138', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773645', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773645', + 'remote_id' => 'ezoo-30636a746c10b209d065b6236322cae9', + 'section_id' => '1', + 'status' => '1', + ), + 97 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '139', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781914', + 'name' => 'Improved front-end editing', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'c04fb6e7abdfcf2c032389cfb246df10', + 'section_id' => '1', + 'status' => '1', + ), + 98 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '140', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773656', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'ezoo-25c6a6c4283f817e868846e4e4e047bc', + 'section_id' => '1', + 'status' => '1', + ), + 99 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '141', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773656', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'ezoo-e8c8e5be0ab861883249f1f140645d1b', + 'section_id' => '1', + 'status' => '1', + ), + 100 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '142', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773656', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773656', + 'remote_id' => 'ezoo-d91c6b1b2436f599b0c235f1d49bffe6', + 'section_id' => '1', + 'status' => '1', + ), + 101 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '143', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773657', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773657', + 'remote_id' => 'ezoo-834c4dc12c2470e235dfca5a9b56a751', + 'section_id' => '1', + 'status' => '1', + ), + 102 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '144', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781605', + 'name' => 'FastCGI', + 'owner_id' => '14', + 'published' => '1299773667', + 'remote_id' => '726413c0a78a8b4d75e6681d7f9883f6', + 'section_id' => '1', + 'status' => '1', + ), + 103 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '145', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299826224', + 'name' => 'Support for Red Hat Enterprise', + 'owner_id' => '14', + 'published' => '1299773676', + 'remote_id' => '8377bca8d648a3cab863ef09de4a33ba', + 'section_id' => '1', + 'status' => '1', + ), + 104 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '146', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773677', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773677', + 'remote_id' => 'ezoo-312c7da896e31f74afa5bdfcf2ec3c4b', + 'section_id' => '1', + 'status' => '1', + ), + 105 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '147', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773691', + 'name' => 'Canonical links', + 'owner_id' => '14', + 'published' => '1299773691', + 'remote_id' => '56d03ef66308781ea1bda4adbd10fed5', + 'section_id' => '1', + 'status' => '1', + ), + 106 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '148', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773704', + 'name' => 'Asynchronous publishing', + 'owner_id' => '14', + 'published' => '1299773704', + 'remote_id' => '15450851f4f20dbd0f7e612f3355c4a4', + 'section_id' => '1', + 'status' => '1', + ), + 107 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '149', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773705', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299773705', + 'remote_id' => 'ezoo-341682c9084fad2fd8ec02129a427721', + 'section_id' => '1', + 'status' => '1', + ), + 108 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '150', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299781476', + 'name' => 'REST API interface', + 'owner_id' => '14', + 'published' => '1299773717', + 'remote_id' => 'a7bf7875d4f020de21f7fd6281eb7922', + 'section_id' => '1', + 'status' => '1', + ), + 109 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '151', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299780653', + 'name' => 'eZ Publish Enterprise', + 'owner_id' => '14', + 'published' => '1299780355', + 'remote_id' => 'bea2aa5ed17c617531344b6c71aff596', + 'section_id' => '1', + 'status' => '1', + ), + 110 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '152', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299780356', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299780356', + 'remote_id' => 'ezoo-0b8f65be2b80b4a7138990b335736563', + 'section_id' => '1', + 'status' => '1', + ), + 111 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '153', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299780356', + 'name' => 'graphics1', + 'owner_id' => '14', + 'published' => '1299780356', + 'remote_id' => 'ezoo-db3fcade578f2fc9da52a81f503394c2', + 'section_id' => '1', + 'status' => '1', + ), + 112 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '154', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175499365', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1168428420', + 'remote_id' => '4ce71da8102ee02db016158cd06895ed', + 'section_id' => '6', + 'status' => '1', + ), + 113 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '155', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175498179', + 'name' => 'Partner News', + 'owner_id' => '14', + 'published' => '1174463557', + 'remote_id' => '96525aef27696fa39e69d43481ffc2b1', + 'section_id' => '6', + 'status' => '1', + ), + 114 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '156', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175497937', + 'name' => 'Pellentesque quam mauris', + 'owner_id' => '14', + 'published' => '1175497937', + 'remote_id' => '2803bc1a519d7a60567721200db49d27', + 'section_id' => '6', + 'status' => '1', + ), + 115 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '157', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499136', + 'name' => 'Penatibus et magnis dis', + 'owner_id' => '14', + 'published' => '1175499050', + 'remote_id' => 'b76742278b7144f55c8c8dddc496d762', + 'section_id' => '6', + 'status' => '1', + ), + 116 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '158', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497280', + 'name' => 'News', + 'owner_id' => '14', + 'published' => '1174463579', + 'remote_id' => '9e60cb050cfd8faf02af8fed62e37d94', + 'section_id' => '6', + 'status' => '1', + ), + 117 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '159', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175498242', + 'name' => 'Curabitur hendrerit dignissim', + 'owner_id' => '14', + 'published' => '1175498136', + 'remote_id' => '95edc648f6300157ecd3749b2adf8ab0', + 'section_id' => '6', + 'status' => '1', + ), + 118 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '160', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175498747', + 'name' => 'Proin condimentum risus', + 'owner_id' => '14', + 'published' => '1175498377', + 'remote_id' => '3bcff60495f6c4b165d15f47628f7245', + 'section_id' => '6', + 'status' => '1', + ), + 119 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '161', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175498941', + 'name' => 'Morbi tristique senectus', + 'owner_id' => '14', + 'published' => '1175498941', + 'remote_id' => '54965750523a6caf827bd255ab4833bb', + 'section_id' => '6', + 'status' => '1', + ), + 120 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '162', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497237', + 'name' => 'Partner Products', + 'owner_id' => '14', + 'published' => '1174463692', + 'remote_id' => '3f1c8e4d7736f54032138ea330ee461a', + 'section_id' => '6', + 'status' => '1', + ), + 121 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '163', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175497203', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1174463828', + 'remote_id' => '18ed8ae5378a8a1431fc5c8f88f0a86a', + 'section_id' => '6', + 'status' => '1', + ), + 122 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '164', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1175499564', + 'name' => 'Neque orci malesuada felis', + 'owner_id' => '14', + 'published' => '1175499308', + 'remote_id' => 'cc72df346e00e35cc78d5c6b466a2c11', + 'section_id' => '6', + 'status' => '1', + ), + 123 => array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '165', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1193915732', + 'name' => 'Community', + 'owner_id' => '14', + 'published' => '1193906037', + 'remote_id' => '378acc2bc7a52400701956047a2f7d45', + 'section_id' => '1', + 'status' => '1', + ), + 124 => array ( + 'contentclass_id' => '37', + 'current_version' => '1', + 'id' => '166', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915707', + 'name' => 'Forum', + 'owner_id' => '14', + 'published' => '1193904899', + 'remote_id' => '219ca29549fe687005593716f9fe5d68', + 'section_id' => '1', + 'status' => '1', + ), + 125 => array ( + 'contentclass_id' => '38', + 'current_version' => '1', + 'id' => '167', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906039', + 'name' => 'Nulla vitae tellus sit amet', + 'owner_id' => '14', + 'published' => '1193906039', + 'remote_id' => 'c5976544daefad2cf0855dbe54a4e748', + 'section_id' => '1', + 'status' => '1', + ), + 126 => array ( + 'contentclass_id' => '38', + 'current_version' => '1', + 'id' => '168', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906579', + 'name' => 'Ut mollis sodales nibh', + 'owner_id' => '14', + 'published' => '1193906579', + 'remote_id' => 'e6ce013587fd32057017c4459c03b681', + 'section_id' => '1', + 'status' => '1', + ), + 127 => array ( + 'contentclass_id' => '38', + 'current_version' => '1', + 'id' => '169', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906040', + 'name' => 'Nam risus leo', + 'owner_id' => '14', + 'published' => '1193906040', + 'remote_id' => 'bd4ff900964c8b09694478f5432afc41', + 'section_id' => '1', + 'status' => '1', + ), + 128 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '170', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906045', + 'name' => 'Wiki', + 'owner_id' => '14', + 'published' => '1193906045', + 'remote_id' => '27c68e844e2663ddd20dfb59961d5268', + 'section_id' => '1', + 'status' => '1', + ), + 129 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '171', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299779689', + 'name' => 'Sed suscipit', + 'owner_id' => '14', + 'published' => '1193906045', + 'remote_id' => 'ee8e3c6f437198adaa073a9e2b4dc338', + 'section_id' => '1', + 'status' => '1', + ), + 130 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '172', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906046', + 'name' => 'Ut interdum', + 'owner_id' => '14', + 'published' => '1193906046', + 'remote_id' => '4ce7df1966ec83aadb0901ed6162bf9b', + 'section_id' => '1', + 'status' => '1', + ), + 131 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '173', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906046', + 'name' => 'Fusce pulvinar', + 'owner_id' => '14', + 'published' => '1193906046', + 'remote_id' => 'fa54ccddf28481b513b60c68911baef8', + 'section_id' => '1', + 'status' => '1', + ), + 132 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '174', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906047', + 'name' => 'Duis id tortor', + 'owner_id' => '14', + 'published' => '1193906047', + 'remote_id' => 'e20a6ec858de6a28a7ba14c26164753a', + 'section_id' => '1', + 'status' => '1', + ), + 133 => array ( + 'contentclass_id' => '24', + 'current_version' => '1', + 'id' => '175', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193906047', + 'name' => 'Curabitur lacinia', + 'owner_id' => '14', + 'published' => '1193906047', + 'remote_id' => '5a3d6806ccd2f6edd86f6219ddc51525', + 'section_id' => '1', + 'status' => '1', + ), + 134 => array ( + 'contentclass_id' => '35', + 'current_version' => '1', + 'id' => '176', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773449', + 'name' => 'Pictures', + 'owner_id' => '14', + 'published' => '1193910178', + 'remote_id' => 'c0180d604d5f5d273702b7d675d6c0cd', + 'section_id' => '1', + 'status' => '1', + ), + 135 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '177', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773210', + 'name' => 'Ivo on eZ Tags', + 'owner_id' => '14', + 'published' => '1299772902', + 'remote_id' => '32709d6df489b5debc03caddec908363', + 'section_id' => '1', + 'status' => '1', + ), + 136 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '178', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773237', + 'name' => 'Are you ready for the Community day?', + 'owner_id' => '14', + 'published' => '1299772906', + 'remote_id' => '36e3a053ea7c2eb0270f7e814db08437', + 'section_id' => '1', + 'status' => '1', + ), + 137 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '179', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773259', + 'name' => 'Let\'s work together!', + 'owner_id' => '14', + 'published' => '1299772907', + 'remote_id' => '94b6dac5fe7da860b3d1517c50fe778c', + 'section_id' => '1', + 'status' => '1', + ), + 138 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '180', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773275', + 'name' => 'The Mediterranean seen from Nice!', + 'owner_id' => '14', + 'published' => '1299772908', + 'remote_id' => '3563d8cdc914573dcff797de2e6e19e1', + 'section_id' => '1', + 'status' => '1', + ), + 139 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '181', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773344', + 'name' => 'Hotel lobby at Isola2000', + 'owner_id' => '14', + 'published' => '1299773320', + 'remote_id' => 'd1d0d736feaffd107778d8a7f980f262', + 'section_id' => '1', + 'status' => '1', + ), + 140 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '182', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773383', + 'name' => 'Alexander on the past, Gaby on today and tomorrow', + 'owner_id' => '14', + 'published' => '1299773321', + 'remote_id' => '18be5e657fce9d909d0e5662d4ce2455', + 'section_id' => '1', + 'status' => '1', + ), + 141 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '183', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773410', + 'name' => 'Isola2000 in white - beautiful skiing!', + 'owner_id' => '14', + 'published' => '1299773322', + 'remote_id' => 'a1375875fc7657d934d402e20b76bce2', + 'section_id' => '1', + 'status' => '1', + ), + 142 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '184', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299773429', + 'name' => 'CEO future pitch - Adaptable, open, reliable!', + 'owner_id' => '14', + 'published' => '1299773323', + 'remote_id' => '0caf4e0ea84c4919570def36f782ef6d', + 'section_id' => '1', + 'status' => '1', + ), + 143 => array ( + 'contentclass_id' => '19', + 'current_version' => '1', + 'id' => '185', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915424', + 'name' => 'Blog', + 'owner_id' => '14', + 'published' => '1193915424', + 'remote_id' => '6a715c29ec67ed5e13ded872e1615690', + 'section_id' => '1', + 'status' => '1', + ), + 144 => array ( + 'contentclass_id' => '20', + 'current_version' => '1', + 'id' => '186', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915590', + 'name' => 'Visit Paris', + 'owner_id' => '14', + 'published' => '1193915590', + 'remote_id' => 'bfe5bf501b832f165089c8d1c0ee959f', + 'section_id' => '1', + 'status' => '1', + ), + 145 => array ( + 'contentclass_id' => '20', + 'current_version' => '1', + 'id' => '187', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193915640', + 'name' => 'Paris in France', + 'owner_id' => '14', + 'published' => '1193915640', + 'remote_id' => 'e88c60fabc96a9dc0a5d429b1a9872ed', + 'section_id' => '1', + 'status' => '1', + ), + 146 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '188', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242707', + 'name' => 'Company', + 'owner_id' => '14', + 'published' => '1168428469', + 'remote_id' => 'b4668ac60d726ddfb655c3895cb0cae5', + 'section_id' => '1', + 'status' => '1', + ), + 147 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '189', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1174305524', + 'name' => 'About company', + 'owner_id' => '14', + 'published' => '1174305524', + 'remote_id' => '10705bd08a74c34556ffee6a70d0be0b', + 'section_id' => '1', + 'status' => '1', + ), + 148 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '190', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1299159424', + 'name' => 'New features', + 'owner_id' => '14', + 'published' => '1193906508', + 'remote_id' => 'dc3e2c928288ee4773493fe16db9ec08', + 'section_id' => '1', + 'status' => '1', + ), + 149 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '191', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193935923', + 'name' => 'Separate content & design in eZ Publish', + 'owner_id' => '14', + 'published' => '1193907125', + 'remote_id' => '932072228b62943d3d3521e7712b54e9', + 'section_id' => '1', + 'status' => '1', + ), + 150 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '192', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010589', + 'name' => 'separation_of_content_and_design', + 'owner_id' => '14', + 'published' => '1253010589', + 'remote_id' => '5e5d7350606f50f5b2e9c85080ef83a3', + 'section_id' => '1', + 'status' => '1', + ), + 151 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '193', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193914552', + 'name' => 'How to use eZ Publish', + 'owner_id' => '14', + 'published' => '1193908304', + 'remote_id' => 'afad8dfca54311e15bfd241ef09da280', + 'section_id' => '1', + 'status' => '1', + ), + 152 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '194', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009641', + 'name' => 'openoffice_import_large', + 'owner_id' => '14', + 'published' => '1253009641', + 'remote_id' => '0df4432f360b63cc55331524bea095bc', + 'section_id' => '1', + 'status' => '1', + ), + 153 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '195', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009692', + 'name' => 'translation_large', + 'owner_id' => '14', + 'published' => '1253009692', + 'remote_id' => '632542f33d621670300a843c2c3d7790', + 'section_id' => '1', + 'status' => '1', + ), + 154 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '196', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009744', + 'name' => 'multiupload_large', + 'owner_id' => '14', + 'published' => '1253009744', + 'remote_id' => 'be4b68a49195b504f7854e38ee97c9e6', + 'section_id' => '1', + 'status' => '1', + ), + 155 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '197', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009784', + 'name' => 'gallery_large', + 'owner_id' => '14', + 'published' => '1253009784', + 'remote_id' => '9737ed22471ac3baf2dbbb45fcb3af5c', + 'section_id' => '1', + 'status' => '1', + ), + 156 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '198', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009879', + 'name' => 'search_result_large', + 'owner_id' => '14', + 'published' => '1253009879', + 'remote_id' => '2ff25f3949e9c4d49442170ca0726fea', + 'section_id' => '1', + 'status' => '1', + ), + 157 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '199', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010806', + 'name' => 'ez_tool_bar_large', + 'owner_id' => '14', + 'published' => '1253010806', + 'remote_id' => 'ab7ed2ea1e71e7ec0479195fc0dc5440', + 'section_id' => '1', + 'status' => '1', + ), + 158 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '200', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009816', + 'name' => 'quicktime_large', + 'owner_id' => '14', + 'published' => '1253009816', + 'remote_id' => '4cf0621be70d809727b8a3581343dee1', + 'section_id' => '3', + 'status' => '1', + ), + 159 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '201', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253009848', + 'name' => 'web_2_0_large', + 'owner_id' => '14', + 'published' => '1253009848', + 'remote_id' => 'fad6a8133332373683847f76158e8719', + 'section_id' => '3', + 'status' => '1', + ), + 160 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '202', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299782207', + 'name' => 'How to manage eZ Publish', + 'owner_id' => '14', + 'published' => '1193908398', + 'remote_id' => '81d949fde405dbe3e5bc6d83452bd927', + 'section_id' => '1', + 'status' => '1', + ), + 161 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '203', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010224', + 'name' => 'usermanagement_large', + 'owner_id' => '14', + 'published' => '1253010224', + 'remote_id' => '344e4197cdaf6ad6f06e0c99ad81dbed', + 'section_id' => '1', + 'status' => '1', + ), + 162 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '204', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010249', + 'name' => 'workflow_large', + 'owner_id' => '14', + 'published' => '1253010249', + 'remote_id' => 'ffc4840fd5b1f8c7ec21d569787252ed', + 'section_id' => '1', + 'status' => '1', + ), + 163 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '205', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010272', + 'name' => 'versioning_large', + 'owner_id' => '14', + 'published' => '1253010272', + 'remote_id' => '3e192eaaaaaceea57be51f2fec5b4abd', + 'section_id' => '1', + 'status' => '1', + ), + 164 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '206', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010315', + 'name' => 'datatypes_attributes_content_class_and_objects_large', + 'owner_id' => '14', + 'published' => '1253010315', + 'remote_id' => 'ee5ad7e637d4da303960cc8800ced740', + 'section_id' => '1', + 'status' => '1', + ), + 165 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '207', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010343', + 'name' => 'multiple_location_large', + 'owner_id' => '14', + 'published' => '1253010343', + 'remote_id' => '59a7ab331d043dddcf9011a8ef32a32b', + 'section_id' => '1', + 'status' => '1', + ), + 166 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '208', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010367', + 'name' => 'multisite_deployment_large', + 'owner_id' => '14', + 'published' => '1253010367', + 'remote_id' => 'e9ba83a65cdaf91039bbffbbfdc5d77b', + 'section_id' => '1', + 'status' => '1', + ), + 167 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '209', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010401', + 'name' => 'seo_large', + 'owner_id' => '14', + 'published' => '1253010401', + 'remote_id' => '46683944a42aefbbb42cf615489f3627', + 'section_id' => '1', + 'status' => '1', + ), + 168 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '210', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253010921', + 'name' => 'admin_site_large', + 'owner_id' => '14', + 'published' => '1253010921', + 'remote_id' => '58f0b7745496ec9ba4e3238dbd481a4b', + 'section_id' => '1', + 'status' => '1', + ), + 169 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '211', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1193914399', + 'name' => 'How to develop with eZ Publish', + 'owner_id' => '14', + 'published' => '1193908946', + 'remote_id' => '96a6b67d897f8dda1053f2a56a734941', + 'section_id' => '1', + 'status' => '1', + ), + 170 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '212', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253011179', + 'name' => 'datatypes_attributes_content_class_and_objects_large', + 'owner_id' => '14', + 'published' => '1253011179', + 'remote_id' => '9bf3262d95b411ed99b6efb704aba830', + 'section_id' => '1', + 'status' => '1', + ), + 171 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '213', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1253011241', + 'name' => 'site_style_large', + 'owner_id' => '14', + 'published' => '1253011241', + 'remote_id' => 'a1dc5eaa5bb06066e033df54ecd76180', + 'section_id' => '1', + 'status' => '1', + ), + 172 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '214', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159460', + 'name' => 'REST API interface', + 'owner_id' => '14', + 'published' => '1299159460', + 'remote_id' => 'e14eb9cc916fd2f8e0e5660cdda0f25d', + 'section_id' => '1', + 'status' => '1', + ), + 173 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '215', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159490', + 'name' => 'Asynchronous Publishing', + 'owner_id' => '14', + 'published' => '1299159490', + 'remote_id' => 'e56b267f79afc37b624d3348a0e85f6e', + 'section_id' => '1', + 'status' => '1', + ), + 174 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '216', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159523', + 'name' => 'Canonical links', + 'owner_id' => '14', + 'published' => '1299159523', + 'remote_id' => 'df9492099e7fc03de8823726eb7c5b56', + 'section_id' => '1', + 'status' => '1', + ), + 175 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '217', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299159553', + 'name' => 'Support for Red Hat Enterprise', + 'owner_id' => '14', + 'published' => '1299159553', + 'remote_id' => 'ce7a6712771252619b2a32e277ea7aac', + 'section_id' => '1', + 'status' => '1', + ), + 176 => array ( + 'contentclass_id' => '16', + 'current_version' => '1', + 'id' => '218', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1299216558', + 'name' => 'FastCGI', + 'owner_id' => '14', + 'published' => '1299159579', + 'remote_id' => '83d9df9fbe02ae449c2208625b6803e0', + 'section_id' => '1', + 'status' => '1', + ), + 177 => array ( + 'contentclass_id' => '26', + 'current_version' => '1', + 'id' => '219', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174305643', + 'name' => 'Events', + 'owner_id' => '14', + 'published' => '1174305643', + 'remote_id' => '36a66a1bf73a17b098642b52c7b62c35', + 'section_id' => '1', + 'status' => '1', + ), + 178 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '220', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069794', + 'name' => 'Career', + 'owner_id' => '14', + 'published' => '1174305674', + 'remote_id' => '493a855d8565518e07369352e295facc', + 'section_id' => '1', + 'status' => '1', + ), + 179 => array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '221', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175069741', + 'name' => 'Investors Relation', + 'owner_id' => '14', + 'published' => '1174305734', + 'remote_id' => 'c9822f47546396138c1318d3e0dcbdfe', + 'section_id' => '1', + 'status' => '1', + ), + 180 => array ( + 'contentclass_id' => '22', + 'current_version' => '1', + 'id' => '222', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174308757', + 'name' => 'Contact', + 'owner_id' => '14', + 'published' => '1174308757', + 'remote_id' => 'c8e19a5426d741de3d587579de89c91e', + 'section_id' => '1', + 'status' => '1', + ), + 181 => array ( + 'contentclass_id' => '25', + 'current_version' => '1', + 'id' => '223', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1174654830', + 'name' => 'Morbi neque', + 'owner_id' => '14', + 'published' => '1174654751', + 'remote_id' => '73ab8d14922e13d67ef3c295d0663fa9', + 'section_id' => '1', + 'status' => '1', + ), + 182 => array ( + 'contentclass_id' => '30', + 'current_version' => '1', + 'id' => '224', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1175242960', + 'name' => 'Company banner', + 'owner_id' => '14', + 'published' => '1175242413', + 'remote_id' => 'a457bec5fb0afe243c16fe254e2fbcdf', + 'section_id' => '1', + 'status' => '1', + ), + 183 => array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '225', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1311154215', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1311154215', + 'remote_id' => '713e1709ba03bf1fde1396d2a0451e28', + 'section_id' => '1', + 'status' => '1', + ), + 184 => array ( + 'contentclass_id' => '16', + 'current_version' => '2', + 'id' => '226', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1313061404', + 'name' => 'Something', + 'owner_id' => '14', + 'published' => '1313047907', + 'remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'section_id' => '1', + 'status' => '1', + ), + ), + 'ezcontentobject_tree' => array ( + 0 => array ( + 'contentobject_id' => '0', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '0', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '1', + 'modified_subnode' => '1313061404', + 'node_id' => '1', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/', + 'priority' => '0', + 'remote_id' => '629709ba256fe317c3ddcee35453a96a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => array ( + 'contentobject_id' => '65', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '2', + 'modified_subnode' => '1313061404', + 'node_id' => '2', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/2/', + 'priority' => '0', + 'remote_id' => 'f3e90596361e31d496d4026eb624c983', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 2 => array ( + 'contentobject_id' => '4', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '5', + 'modified_subnode' => '1311154216', + 'node_id' => '5', + 'parent_node_id' => '1', + 'path_identification_string' => 'users', + 'path_string' => '/1/5/', + 'priority' => '0', + 'remote_id' => '3f6d92f8044aed134f32153517850f5a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 3 => array ( + 'contentobject_id' => '11', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '12', + 'modified_subnode' => '1311154216', + 'node_id' => '12', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/members', + 'path_string' => '/1/5/12/', + 'priority' => '0', + 'remote_id' => '602dcf84765e56b7f999eaafd3821dd3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => array ( + 'contentobject_id' => '12', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '13', + 'modified_subnode' => '1311154214', + 'node_id' => '13', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/administrator_users', + 'path_string' => '/1/5/13/', + 'priority' => '0', + 'remote_id' => '769380b7aa94541679167eab817ca893', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => array ( + 'contentobject_id' => '13', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '14', + 'modified_subnode' => '1081860719', + 'node_id' => '14', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/editors', + 'path_string' => '/1/5/14/', + 'priority' => '0', + 'remote_id' => 'f7dda2854fc68f7c8455d9cb14bd04a9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => array ( + 'contentobject_id' => '14', + 'contentobject_is_published' => '1', + 'contentobject_version' => '4', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '15', + 'modified_subnode' => '1311154214', + 'node_id' => '15', + 'parent_node_id' => '13', + 'path_identification_string' => 'users/administrator_users/administrator_user', + 'path_string' => '/1/5/13/15/', + 'priority' => '0', + 'remote_id' => 'e5161a99f733200b9ed4e80f9c16187b', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => array ( + 'contentobject_id' => '41', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '43', + 'modified_subnode' => '1311154174', + 'node_id' => '43', + 'parent_node_id' => '1', + 'path_identification_string' => 'media', + 'path_string' => '/1/43/', + 'priority' => '0', + 'remote_id' => '75c715a51699d2d309a924eca6a95145', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 8 => array ( + 'contentobject_id' => '42', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '44', + 'modified_subnode' => '1081860719', + 'node_id' => '44', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/anonymous_users', + 'path_string' => '/1/5/44/', + 'priority' => '0', + 'remote_id' => '4fdf0072da953bb276c0c7e0141c5c9b', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => array ( + 'contentobject_id' => '10', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '45', + 'modified_subnode' => '1081860719', + 'node_id' => '45', + 'parent_node_id' => '44', + 'path_identification_string' => 'users/anonymous_users/anonymous_user', + 'path_string' => '/1/5/44/45/', + 'priority' => '0', + 'remote_id' => '2cf8343bee7b482bab82b269d8fecd76', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => array ( + 'contentobject_id' => '45', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '48', + 'modified_subnode' => '1184592117', + 'node_id' => '48', + 'parent_node_id' => '1', + 'path_identification_string' => 'setup2', + 'path_string' => '/1/48/', + 'priority' => '0', + 'remote_id' => '182ce1b5af0c09fa378557c462ba2617', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => array ( + 'contentobject_id' => '49', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '51', + 'modified_subnode' => '1311154174', + 'node_id' => '51', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/images', + 'path_string' => '/1/43/51/', + 'priority' => '0', + 'remote_id' => '1b26c0454b09bb49dfb1b9190ffd67cb', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => array ( + 'contentobject_id' => '50', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '52', + 'modified_subnode' => '1081860720', + 'node_id' => '52', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/files', + 'path_string' => '/1/43/52/', + 'priority' => '0', + 'remote_id' => '0b113a208f7890f9ad3c24444ff5988c', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 13 => array ( + 'contentobject_id' => '51', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '53', + 'modified_subnode' => '1081860720', + 'node_id' => '53', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/multimedia', + 'path_string' => '/1/43/53/', + 'priority' => '0', + 'remote_id' => '4f18b82c75f10aad476cae5adf98c11f', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 14 => array ( + 'contentobject_id' => '52', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '54', + 'modified_subnode' => '1184592117', + 'node_id' => '54', + 'parent_node_id' => '48', + 'path_identification_string' => 'setup2/common_ini_settings', + 'path_string' => '/1/48/54/', + 'priority' => '0', + 'remote_id' => 'fa9f3cff9cf90ecfae335718dcbddfe2', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => array ( + 'contentobject_id' => '54', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '56', + 'modified_subnode' => '1311154215', + 'node_id' => '56', + 'parent_node_id' => '58', + 'path_identification_string' => 'design/plain_site', + 'path_string' => '/1/58/56/', + 'priority' => '0', + 'remote_id' => '772da20ecf88b3035d73cbdfcea0f119', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => array ( + 'contentobject_id' => '56', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '58', + 'modified_subnode' => '1311154215', + 'node_id' => '58', + 'parent_node_id' => '1', + 'path_identification_string' => 'design', + 'path_string' => '/1/58/', + 'priority' => '0', + 'remote_id' => '79f2d67372ab56f59b5d65bb9e0ca3b9', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 17 => array ( + 'contentobject_id' => '57', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '59', + 'modified_subnode' => '1311154174', + 'node_id' => '59', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/banners', + 'path_string' => '/1/43/59/', + 'priority' => '0', + 'remote_id' => '437ef9d0a9b7ae326ec83fa3bb73956d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 18 => array ( + 'contentobject_id' => '58', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '60', + 'modified_subnode' => '1311154173', + 'node_id' => '60', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_communities', + 'path_string' => '/1/43/59/60/', + 'priority' => '0', + 'remote_id' => 'eaa7f2f48c3f35801961abad12151db4', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 19 => array ( + 'contentobject_id' => '59', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '61', + 'modified_subnode' => '1311154173', + 'node_id' => '61', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_frontpage', + 'path_string' => '/1/43/59/61/', + 'priority' => '0', + 'remote_id' => 'b8c85fd926d61dab6e68fa1865cee987', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 20 => array ( + 'contentobject_id' => '60', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '62', + 'modified_subnode' => '1311154173', + 'node_id' => '62', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_products', + 'path_string' => '/1/43/59/62/', + 'priority' => '0', + 'remote_id' => 'c65aba2485585bdd09dfb66afccf645e', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 21 => array ( + 'contentobject_id' => '61', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '63', + 'modified_subnode' => '1311154173', + 'node_id' => '63', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_partners', + 'path_string' => '/1/43/59/63/', + 'priority' => '0', + 'remote_id' => '64bb803471e53898aa38a7c29e482370', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 22 => array ( + 'contentobject_id' => '62', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '64', + 'modified_subnode' => '1311154174', + 'node_id' => '64', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/pencils_support', + 'path_string' => '/1/43/59/64/', + 'priority' => '0', + 'remote_id' => '95e29503817570c6458fa0f37d227306', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 23 => array ( + 'contentobject_id' => '63', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '65', + 'modified_subnode' => '1311154174', + 'node_id' => '65', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_training', + 'path_string' => '/1/43/59/65/', + 'priority' => '0', + 'remote_id' => 'aa4a1afd9c02d00f2f31186e8a271332', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 24 => array ( + 'contentobject_id' => '64', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '66', + 'modified_subnode' => '1311154174', + 'node_id' => '66', + 'parent_node_id' => '59', + 'path_identification_string' => 'media/banners/woman_solutions', + 'path_string' => '/1/43/59/66/', + 'priority' => '0', + 'remote_id' => '93d5115082a23b266613868051b8d803', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 25 => array ( + 'contentobject_id' => '66', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '68', + 'modified_subnode' => '1311154174', + 'node_id' => '68', + 'parent_node_id' => '51', + 'path_identification_string' => 'media/images/rest_api', + 'path_string' => '/1/43/51/68/', + 'priority' => '0', + 'remote_id' => '31fd28362c18a36cb56223f3609d5d90', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 26 => array ( + 'contentobject_id' => '67', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '69', + 'modified_subnode' => '1311154177', + 'node_id' => '69', + 'parent_node_id' => '2', + 'path_identification_string' => 'products', + 'path_string' => '/1/2/69/', + 'priority' => '0', + 'remote_id' => '9cec85d730eec7578190ee95ce5a36f5', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 27 => array ( + 'contentobject_id' => '68', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '70', + 'modified_subnode' => '1311154175', + 'node_id' => '70', + 'parent_node_id' => '69', + 'path_identification_string' => 'products/software', + 'path_string' => '/1/2/69/70/', + 'priority' => '0', + 'remote_id' => 'b0b85c15125ca1732e5e528de2717599', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 28 => array ( + 'contentobject_id' => '69', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '71', + 'modified_subnode' => '1311154175', + 'node_id' => '71', + 'parent_node_id' => '70', + 'path_identification_string' => 'products/software/os_type_i', + 'path_string' => '/1/2/69/70/71/', + 'priority' => '0', + 'remote_id' => '087adb763245e0cdcac593fb4a5996cf', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 29 => array ( + 'contentobject_id' => '70', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '72', + 'modified_subnode' => '1311154176', + 'node_id' => '72', + 'parent_node_id' => '69', + 'path_identification_string' => 'products/boxes', + 'path_string' => '/1/2/69/72/', + 'priority' => '0', + 'remote_id' => 'e607aab6e924091909f3def02415bc53', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 30 => array ( + 'contentobject_id' => '71', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '73', + 'modified_subnode' => '1311154176', + 'node_id' => '73', + 'parent_node_id' => '72', + 'path_identification_string' => 'products/boxes/cd_dvd_box_i', + 'path_string' => '/1/2/69/72/73/', + 'priority' => '0', + 'remote_id' => '054d9f10c6fa97689c0fc3b2ac412ebd', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 31 => array ( + 'contentobject_id' => '72', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '74', + 'modified_subnode' => '1311154176', + 'node_id' => '74', + 'parent_node_id' => '72', + 'path_identification_string' => 'products/boxes/cd_dvd_box_ii', + 'path_string' => '/1/2/69/72/74/', + 'priority' => '0', + 'remote_id' => '9801bda46e5f8b9d692e1120d50fc7b3', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 32 => array ( + 'contentobject_id' => '73', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '75', + 'modified_subnode' => '1311154176', + 'node_id' => '75', + 'parent_node_id' => '72', + 'path_identification_string' => 'products/boxes/cd_dvd_box_iii', + 'path_string' => '/1/2/69/72/75/', + 'priority' => '0', + 'remote_id' => '005067a5eee6505aa0f601cca30681d0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 33 => array ( + 'contentobject_id' => '74', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '76', + 'modified_subnode' => '1311154177', + 'node_id' => '76', + 'parent_node_id' => '69', + 'path_identification_string' => 'products/products_sheets', + 'path_string' => '/1/2/69/76/', + 'priority' => '0', + 'remote_id' => '18f14551cc555c094b15a732ccd27fb2', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 34 => array ( + 'contentobject_id' => '75', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '77', + 'modified_subnode' => '1313061404', + 'node_id' => '77', + 'parent_node_id' => '2', + 'path_identification_string' => 'solutions', + 'path_string' => '/1/2/77/', + 'priority' => '0', + 'remote_id' => 'dbc2f3c8716c12f32c379dbf0b1cb133', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 35 => array ( + 'contentobject_id' => '76', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '78', + 'modified_subnode' => '1311154178', + 'node_id' => '78', + 'parent_node_id' => '77', + 'path_identification_string' => 'solutions/web_publishing', + 'path_string' => '/1/2/77/78/', + 'priority' => '0', + 'remote_id' => 'bc766fe955437def220a3fa2966a34ee', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 36 => array ( + 'contentobject_id' => '77', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '79', + 'modified_subnode' => '1311154178', + 'node_id' => '79', + 'parent_node_id' => '78', + 'path_identification_string' => 'solutions/web_publishing/fusce_sagittis_sagittis', + 'path_string' => '/1/2/77/78/79/', + 'priority' => '0', + 'remote_id' => 'f0c2216ecb29600cd8ae93951a0c8f3a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 37 => array ( + 'contentobject_id' => '78', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '80', + 'modified_subnode' => '1311154178', + 'node_id' => '80', + 'parent_node_id' => '78', + 'path_identification_string' => 'solutions/web_publishing/etiam_posuere_sodales_arcu', + 'path_string' => '/1/2/77/78/80/', + 'priority' => '0', + 'remote_id' => 'eaf16bddfd36206dad265aadfbc98f17', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 38 => array ( + 'contentobject_id' => '79', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '81', + 'modified_subnode' => '1311154178', + 'node_id' => '81', + 'parent_node_id' => '78', + 'path_identification_string' => 'solutions/web_publishing/in_hac_habitasse_platea', + 'path_string' => '/1/2/77/78/81/', + 'priority' => '0', + 'remote_id' => 'd2a11e56093b77eb7a347229361c3377', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 39 => array ( + 'contentobject_id' => '80', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '82', + 'modified_subnode' => '1311154179', + 'node_id' => '82', + 'parent_node_id' => '77', + 'path_identification_string' => 'solutions/content_management', + 'path_string' => '/1/2/77/82/', + 'priority' => '0', + 'remote_id' => '17d65b568e3500cf1f8b42bc5de2d12b', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 40 => array ( + 'contentobject_id' => '81', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '83', + 'modified_subnode' => '1311154179', + 'node_id' => '83', + 'parent_node_id' => '82', + 'path_identification_string' => 'solutions/content_management/fusce_sagittis_sagittis_urna', + 'path_string' => '/1/2/77/82/83/', + 'priority' => '0', + 'remote_id' => 'ecc4f0e94b05bf10f4f783d660ff0ad0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 41 => array ( + 'contentobject_id' => '82', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '84', + 'modified_subnode' => '1311154179', + 'node_id' => '84', + 'parent_node_id' => '82', + 'path_identification_string' => 'solutions/content_management/class_aptent_taciti_sociosqu', + 'path_string' => '/1/2/77/82/84/', + 'priority' => '0', + 'remote_id' => '74280af2cba9002ea9660749225562b6', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 42 => array ( + 'contentobject_id' => '83', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '85', + 'modified_subnode' => '1311154179', + 'node_id' => '85', + 'parent_node_id' => '82', + 'path_identification_string' => 'solutions/content_management/aenean_malesuada_ligula', + 'path_string' => '/1/2/77/82/85/', + 'priority' => '0', + 'remote_id' => '4e526426523e47aeacf353541284cbf8', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 43 => array ( + 'contentobject_id' => '84', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '86', + 'modified_subnode' => '1311154182', + 'node_id' => '86', + 'parent_node_id' => '2', + 'path_identification_string' => 'training', + 'path_string' => '/1/2/86/', + 'priority' => '0', + 'remote_id' => '95f3c4261719ea27ab67f980fbee0694', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 44 => array ( + 'contentobject_id' => '85', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '87', + 'modified_subnode' => '1311154180', + 'node_id' => '87', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/certification', + 'path_string' => '/1/2/86/87/', + 'priority' => '0', + 'remote_id' => '4a1391d3563d056c9d9ea2653093ae3e', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 45 => array ( + 'contentobject_id' => '86', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '88', + 'modified_subnode' => '1311154181', + 'node_id' => '88', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/professional_workshops', + 'path_string' => '/1/2/86/88/', + 'priority' => '0', + 'remote_id' => '8889727909b5f34b6aa23f7eee32606b', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 46 => array ( + 'contentobject_id' => '87', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '89', + 'modified_subnode' => '1311154180', + 'node_id' => '89', + 'parent_node_id' => '88', + 'path_identification_string' => 'training/professional_workshops/etiam_sodales_mauris', + 'path_string' => '/1/2/86/88/89/', + 'priority' => '0', + 'remote_id' => '1721dbee55639fe280f6a54195f9577c', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 47 => array ( + 'contentobject_id' => '88', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '90', + 'modified_subnode' => '1311154181', + 'node_id' => '90', + 'parent_node_id' => '88', + 'path_identification_string' => 'training/professional_workshops/class_aptent_taciti', + 'path_string' => '/1/2/86/88/90/', + 'priority' => '0', + 'remote_id' => '7fabb9ee5bcb6630a3947d1c5585d995', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 48 => array ( + 'contentobject_id' => '89', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '91', + 'modified_subnode' => '1311154181', + 'node_id' => '91', + 'parent_node_id' => '88', + 'path_identification_string' => 'training/professional_workshops/duis_auctor_vehicula_erat', + 'path_string' => '/1/2/86/88/91/', + 'priority' => '0', + 'remote_id' => 'a95ae3e4a64f08eb2002b31680fe8989', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 49 => array ( + 'contentobject_id' => '90', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '92', + 'modified_subnode' => '1311154181', + 'node_id' => '92', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/events_and_seminars', + 'path_string' => '/1/2/86/92/', + 'priority' => '0', + 'remote_id' => '2acc8bb8f7eda4de2cf74f6dc277661f', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 50 => array ( + 'contentobject_id' => '91', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '93', + 'modified_subnode' => '1311154181', + 'node_id' => '93', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/self_paced_courses', + 'path_string' => '/1/2/86/93/', + 'priority' => '0', + 'remote_id' => '6d8cc9831b86d79b8c184507f8e0cbb6', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 51 => array ( + 'contentobject_id' => '92', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '94', + 'modified_subnode' => '1311154182', + 'node_id' => '94', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/instructor_led_courses', + 'path_string' => '/1/2/86/94/', + 'priority' => '0', + 'remote_id' => '30f12ecd29608eceb20bb903ddb780c7', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 52 => array ( + 'contentobject_id' => '93', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '95', + 'modified_subnode' => '1311154182', + 'node_id' => '95', + 'parent_node_id' => '86', + 'path_identification_string' => 'training/additional_learning_resources', + 'path_string' => '/1/2/86/95/', + 'priority' => '0', + 'remote_id' => '341e63bdce0f1601519d1b8e82e62766', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 53 => array ( + 'contentobject_id' => '94', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '96', + 'modified_subnode' => '1311154185', + 'node_id' => '96', + 'parent_node_id' => '2', + 'path_identification_string' => 'support', + 'path_string' => '/1/2/96/', + 'priority' => '0', + 'remote_id' => '0d55a3f510cc7cd9a7b8eb838f50ff5c', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 54 => array ( + 'contentobject_id' => '95', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '97', + 'modified_subnode' => '1311154183', + 'node_id' => '97', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/knowledgebase', + 'path_string' => '/1/2/96/97/', + 'priority' => '0', + 'remote_id' => '89ce8eed8fa06c4105fd612aa83d87d6', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 55 => array ( + 'contentobject_id' => '96', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '98', + 'modified_subnode' => '1311154183', + 'node_id' => '98', + 'parent_node_id' => '97', + 'path_identification_string' => 'support/knowledgebase/sed_suscipit', + 'path_string' => '/1/2/96/97/98/', + 'priority' => '0', + 'remote_id' => '78f3b9a9268c7b0206bf1c4d39211495', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 56 => array ( + 'contentobject_id' => '97', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '99', + 'modified_subnode' => '1311154183', + 'node_id' => '99', + 'parent_node_id' => '98', + 'path_identification_string' => 'support/knowledgebase/sed_suscipit/ut_interdum', + 'path_string' => '/1/2/96/97/98/99/', + 'priority' => '0', + 'remote_id' => 'a1f9b32547e58064e645388512c16a39', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 57 => array ( + 'contentobject_id' => '98', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '100', + 'modified_subnode' => '1311154184', + 'node_id' => '100', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/documentation', + 'path_string' => '/1/2/96/100/', + 'priority' => '0', + 'remote_id' => '0f9c7380f8af1f29f1017e412bdd4016', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 58 => array ( + 'contentobject_id' => '99', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '101', + 'modified_subnode' => '1311154184', + 'node_id' => '101', + 'parent_node_id' => '100', + 'path_identification_string' => 'support/documentation/mauris_pretium', + 'path_string' => '/1/2/96/100/101/', + 'priority' => '0', + 'remote_id' => '036394ec8b160f0782bec2dda452d798', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 59 => array ( + 'contentobject_id' => '100', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '102', + 'modified_subnode' => '1311154184', + 'node_id' => '102', + 'parent_node_id' => '101', + 'path_identification_string' => 'support/documentation/mauris_pretium/aliquam_posuere', + 'path_string' => '/1/2/96/100/101/102/', + 'priority' => '0', + 'remote_id' => '78da6a4fae1c2eaabe1dbe7af818d970', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 60 => array ( + 'contentobject_id' => '101', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '103', + 'modified_subnode' => '1311154184', + 'node_id' => '103', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/books', + 'path_string' => '/1/2/96/103/', + 'priority' => '0', + 'remote_id' => '06cdeb27be466ea8330de5df16144263', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 61 => array ( + 'contentobject_id' => '102', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '104', + 'modified_subnode' => '1311154184', + 'node_id' => '104', + 'parent_node_id' => '103', + 'path_identification_string' => 'support/books/aliquam_pulvinar_suscipit_tellus', + 'path_string' => '/1/2/96/103/104/', + 'priority' => '0', + 'remote_id' => 'ab30399896b8e54442c3a619ba7eeecb', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 62 => array ( + 'contentobject_id' => '103', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '105', + 'modified_subnode' => '1311154184', + 'node_id' => '105', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/customer_service', + 'path_string' => '/1/2/96/105/', + 'priority' => '0', + 'remote_id' => 'ca2ae9d0f0322798f632e896325f22c3', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 63 => array ( + 'contentobject_id' => '104', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '106', + 'modified_subnode' => '1311154185', + 'node_id' => '106', + 'parent_node_id' => '96', + 'path_identification_string' => 'support/support_programs', + 'path_string' => '/1/2/96/106/', + 'priority' => '0', + 'remote_id' => '7ba1d48c0151bae62366095ef6f64c28', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 64 => array ( + 'contentobject_id' => '105', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '107', + 'modified_subnode' => '1311154195', + 'node_id' => '107', + 'parent_node_id' => '2', + 'path_identification_string' => 'getting_started', + 'path_string' => '/1/2/107/', + 'priority' => '0', + 'remote_id' => 'e81507d3446726ebd7361352fef5fad3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 65 => array ( + 'contentobject_id' => '106', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '108', + 'modified_subnode' => '1311154185', + 'node_id' => '108', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/tutorials_for', + 'path_string' => '/1/2/107/108/', + 'priority' => '0', + 'remote_id' => '51278360f39d5b8ce1d9249953f4de98', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 66 => array ( + 'contentobject_id' => '107', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '109', + 'modified_subnode' => '1311154185', + 'node_id' => '109', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/get_involved', + 'path_string' => '/1/2/107/109/', + 'priority' => '0', + 'remote_id' => '33151e24acea9c837d2b9fc52e03b1de', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 67 => array ( + 'contentobject_id' => '108', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '110', + 'modified_subnode' => '1311154187', + 'node_id' => '110', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish', + 'path_string' => '/1/2/107/110/', + 'priority' => '0', + 'remote_id' => '6b3bcab0f149c5acc2e3728df7c66b73', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 68 => array ( + 'contentobject_id' => '109', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '111', + 'modified_subnode' => '1311154186', + 'node_id' => '111', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics1', + 'path_string' => '/1/2/107/110/111/', + 'priority' => '0', + 'remote_id' => '28f9dfe5c0680955eec7a2dec4ebc642', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 69 => array ( + 'contentobject_id' => '110', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '112', + 'modified_subnode' => '1311154186', + 'node_id' => '112', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics12', + 'path_string' => '/1/2/107/110/112/', + 'priority' => '0', + 'remote_id' => '191faba79dc108a19893944befa50d94', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 70 => array ( + 'contentobject_id' => '111', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '113', + 'modified_subnode' => '1311154186', + 'node_id' => '113', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics13', + 'path_string' => '/1/2/107/110/113/', + 'priority' => '0', + 'remote_id' => '8679b5fa3ad0ec216293419ab9834e44', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 71 => array ( + 'contentobject_id' => '112', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '114', + 'modified_subnode' => '1311154187', + 'node_id' => '114', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics14', + 'path_string' => '/1/2/107/110/114/', + 'priority' => '0', + 'remote_id' => '7f32cdefd0cf55b966a44aa52181e30d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 72 => array ( + 'contentobject_id' => '113', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '115', + 'modified_subnode' => '1311154187', + 'node_id' => '115', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics15', + 'path_string' => '/1/2/107/110/115/', + 'priority' => '0', + 'remote_id' => '29db3c1fcdb497e5cb2c74eb85c0906a', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 73 => array ( + 'contentobject_id' => '114', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '116', + 'modified_subnode' => '1311154187', + 'node_id' => '116', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics16', + 'path_string' => '/1/2/107/110/116/', + 'priority' => '0', + 'remote_id' => '96e30009f712a0315217fed93eba6a18', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 74 => array ( + 'contentobject_id' => '115', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '117', + 'modified_subnode' => '1311154187', + 'node_id' => '117', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics17', + 'path_string' => '/1/2/107/110/117/', + 'priority' => '0', + 'remote_id' => '3a6b87470a25b19a6ad15caa5e24e719', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 75 => array ( + 'contentobject_id' => '116', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '118', + 'modified_subnode' => '1311154187', + 'node_id' => '118', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics18', + 'path_string' => '/1/2/107/110/118/', + 'priority' => '0', + 'remote_id' => 'd0bc77a21920b63543d7b0accab81b24', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 76 => array ( + 'contentobject_id' => '117', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '119', + 'modified_subnode' => '1311154187', + 'node_id' => '119', + 'parent_node_id' => '110', + 'path_identification_string' => 'getting_started/how_to_use_ez_publish/graphics19', + 'path_string' => '/1/2/107/110/119/', + 'priority' => '0', + 'remote_id' => 'c75b4b4b870e0e3611e19e1323103282', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 77 => array ( + 'contentobject_id' => '118', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '120', + 'modified_subnode' => '1311154189', + 'node_id' => '120', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish', + 'path_string' => '/1/2/107/120/', + 'priority' => '0', + 'remote_id' => '262d8c936d3757ff81e7bb49392b703f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 78 => array ( + 'contentobject_id' => '119', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '121', + 'modified_subnode' => '1311154188', + 'node_id' => '121', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics1', + 'path_string' => '/1/2/107/120/121/', + 'priority' => '0', + 'remote_id' => '220d4e10bf4619525c3165823079482c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 79 => array ( + 'contentobject_id' => '120', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '122', + 'modified_subnode' => '1311154188', + 'node_id' => '122', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics12', + 'path_string' => '/1/2/107/120/122/', + 'priority' => '0', + 'remote_id' => 'f13a938ce2c79a9d438548299220d6dd', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 80 => array ( + 'contentobject_id' => '121', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '123', + 'modified_subnode' => '1311154188', + 'node_id' => '123', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics13', + 'path_string' => '/1/2/107/120/123/', + 'priority' => '0', + 'remote_id' => '04f5e08293954b1851a4dd1cbd976cff', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 81 => array ( + 'contentobject_id' => '122', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '124', + 'modified_subnode' => '1311154188', + 'node_id' => '124', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics14', + 'path_string' => '/1/2/107/120/124/', + 'priority' => '0', + 'remote_id' => 'dc80ae3d9de55855a16218b032062c62', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 82 => array ( + 'contentobject_id' => '123', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '125', + 'modified_subnode' => '1311154189', + 'node_id' => '125', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics15', + 'path_string' => '/1/2/107/120/125/', + 'priority' => '0', + 'remote_id' => '4cb6d4015dd80474074043ab28f96e36', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 83 => array ( + 'contentobject_id' => '124', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '126', + 'modified_subnode' => '1311154189', + 'node_id' => '126', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics16', + 'path_string' => '/1/2/107/120/126/', + 'priority' => '0', + 'remote_id' => '74ce7d6cbae81d90592b4a8a242a284a', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 84 => array ( + 'contentobject_id' => '125', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '127', + 'modified_subnode' => '1311154189', + 'node_id' => '127', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics17', + 'path_string' => '/1/2/107/120/127/', + 'priority' => '0', + 'remote_id' => '6f76d2f7e5812acf4f7c5c70258f4f7e', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 85 => array ( + 'contentobject_id' => '126', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '128', + 'modified_subnode' => '1311154189', + 'node_id' => '128', + 'parent_node_id' => '120', + 'path_identification_string' => 'getting_started/how_to_manage_ez_publish/graphics18', + 'path_string' => '/1/2/107/120/128/', + 'priority' => '0', + 'remote_id' => '5ba07103968a6bb3f05c275c212440f6', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 86 => array ( + 'contentobject_id' => '127', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '129', + 'modified_subnode' => '1311154190', + 'node_id' => '129', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish', + 'path_string' => '/1/2/107/129/', + 'priority' => '0', + 'remote_id' => '3579b6c5cd166d5137eada55274892d3', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 87 => array ( + 'contentobject_id' => '128', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '130', + 'modified_subnode' => '1311154190', + 'node_id' => '130', + 'parent_node_id' => '129', + 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish/graphics1', + 'path_string' => '/1/2/107/129/130/', + 'priority' => '0', + 'remote_id' => 'e38a43ce35832e5af2df4f1e9272b926', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 88 => array ( + 'contentobject_id' => '129', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '131', + 'modified_subnode' => '1311154190', + 'node_id' => '131', + 'parent_node_id' => '129', + 'path_identification_string' => 'getting_started/how_to_develop_with_ez_publish/graphics12', + 'path_string' => '/1/2/107/129/131/', + 'priority' => '0', + 'remote_id' => '1ba7889f63e32acf70f66349ce1a8953', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 89 => array ( + 'contentobject_id' => '130', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '132', + 'modified_subnode' => '1311154190', + 'node_id' => '132', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/adding_siteaccesses_in_ez_publish', + 'path_string' => '/1/2/107/132/', + 'priority' => '0', + 'remote_id' => '19ae9fcb7334a0e407b2781920247122', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 90 => array ( + 'contentobject_id' => '131', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '133', + 'modified_subnode' => '1311154195', + 'node_id' => '133', + 'parent_node_id' => '107', + 'path_identification_string' => 'getting_started/new_features', + 'path_string' => '/1/2/107/133/', + 'priority' => '0', + 'remote_id' => '423b6d20325263abaa2012536cc736a4', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 91 => array ( + 'contentobject_id' => '132', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '134', + 'modified_subnode' => '1311154191', + 'node_id' => '134', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow', + 'path_string' => '/1/2/107/133/134/', + 'priority' => '0', + 'remote_id' => '07f0de334c83d631a59defe61f1a7cbf', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 92 => array ( + 'contentobject_id' => '133', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '135', + 'modified_subnode' => '1311154191', + 'node_id' => '135', + 'parent_node_id' => '134', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics1', + 'path_string' => '/1/2/107/133/134/135/', + 'priority' => '0', + 'remote_id' => 'a7ca1a8878210a9978df0b00e9184b20', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 93 => array ( + 'contentobject_id' => '134', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '136', + 'modified_subnode' => '1311154191', + 'node_id' => '136', + 'parent_node_id' => '134', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics12', + 'path_string' => '/1/2/107/133/134/136/', + 'priority' => '0', + 'remote_id' => '12c86be2151c426b990d47efd023cc40', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 94 => array ( + 'contentobject_id' => '135', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '137', + 'modified_subnode' => '1311154191', + 'node_id' => '137', + 'parent_node_id' => '134', + 'path_identification_string' => 'getting_started/new_features/improved_user_registration_workflow/graphics13', + 'path_string' => '/1/2/107/133/134/137/', + 'priority' => '0', + 'remote_id' => 'ff4473534c7cef8212a11feab57a5f0e', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 95 => array ( + 'contentobject_id' => '136', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '138', + 'modified_subnode' => '1311154192', + 'node_id' => '138', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/improved_block_editing', + 'path_string' => '/1/2/107/133/138/', + 'priority' => '0', + 'remote_id' => 'e0a1b1b2a3d248bf8d43a83581c22ae8', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 96 => array ( + 'contentobject_id' => '137', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '139', + 'modified_subnode' => '1311154192', + 'node_id' => '139', + 'parent_node_id' => '138', + 'path_identification_string' => 'getting_started/new_features/improved_block_editing/graphics1', + 'path_string' => '/1/2/107/133/138/139/', + 'priority' => '0', + 'remote_id' => '8e6f0ba5195410b03a84ef3fdcc3ff0b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 97 => array ( + 'contentobject_id' => '138', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '140', + 'modified_subnode' => '1311154192', + 'node_id' => '140', + 'parent_node_id' => '138', + 'path_identification_string' => 'getting_started/new_features/improved_block_editing/graphics12', + 'path_string' => '/1/2/107/133/138/140/', + 'priority' => '0', + 'remote_id' => 'bc416b97e1592c7a396f6f5f85e131ac', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 98 => array ( + 'contentobject_id' => '139', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '141', + 'modified_subnode' => '1311154193', + 'node_id' => '141', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing', + 'path_string' => '/1/2/107/133/141/', + 'priority' => '0', + 'remote_id' => 'facfd2587054ea863cbe53768da04a47', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 99 => array ( + 'contentobject_id' => '140', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '142', + 'modified_subnode' => '1311154192', + 'node_id' => '142', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics1', + 'path_string' => '/1/2/107/133/141/142/', + 'priority' => '0', + 'remote_id' => 'd159e8d4d590e481b06ecb441c0f14dc', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 100 => array ( + 'contentobject_id' => '141', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '143', + 'modified_subnode' => '1311154192', + 'node_id' => '143', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics12', + 'path_string' => '/1/2/107/133/141/143/', + 'priority' => '0', + 'remote_id' => '7457db5919dd349bd878b60592fc009b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 101 => array ( + 'contentobject_id' => '142', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '144', + 'modified_subnode' => '1311154193', + 'node_id' => '144', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics13', + 'path_string' => '/1/2/107/133/141/144/', + 'priority' => '0', + 'remote_id' => 'ebe1e9d1242a3aeedfda25da7cc25564', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 102 => array ( + 'contentobject_id' => '143', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '145', + 'modified_subnode' => '1311154193', + 'node_id' => '145', + 'parent_node_id' => '141', + 'path_identification_string' => 'getting_started/new_features/improved_front_end_editing/graphics14', + 'path_string' => '/1/2/107/133/141/145/', + 'priority' => '0', + 'remote_id' => 'b3acf4c0f2df8977f1c6932725339a1d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 103 => array ( + 'contentobject_id' => '144', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '146', + 'modified_subnode' => '1311154193', + 'node_id' => '146', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/fastcgi', + 'path_string' => '/1/2/107/133/146/', + 'priority' => '0', + 'remote_id' => 'a324a48fea49eb3e6826b3295dc5f413', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 104 => array ( + 'contentobject_id' => '145', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '147', + 'modified_subnode' => '1311154194', + 'node_id' => '147', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/support_for_red_hat_enterprise', + 'path_string' => '/1/2/107/133/147/', + 'priority' => '0', + 'remote_id' => '8c0133434d7bea077a614e1a85fca5b7', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 105 => array ( + 'contentobject_id' => '146', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '148', + 'modified_subnode' => '1311154194', + 'node_id' => '148', + 'parent_node_id' => '147', + 'path_identification_string' => 'getting_started/new_features/support_for_red_hat_enterprise/graphics1', + 'path_string' => '/1/2/107/133/147/148/', + 'priority' => '0', + 'remote_id' => '46653e0e5fa60ab86788cad8084a759d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 106 => array ( + 'contentobject_id' => '147', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '149', + 'modified_subnode' => '1311154194', + 'node_id' => '149', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/canonical_links', + 'path_string' => '/1/2/107/133/149/', + 'priority' => '0', + 'remote_id' => '9b17e8d0b2cee501b75f7b481155e64f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 107 => array ( + 'contentobject_id' => '148', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '150', + 'modified_subnode' => '1311154195', + 'node_id' => '150', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/asynchronous_publishing', + 'path_string' => '/1/2/107/133/150/', + 'priority' => '0', + 'remote_id' => '3983d3aa7604f45a8ecbb953a98d646f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 108 => array ( + 'contentobject_id' => '149', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '151', + 'modified_subnode' => '1311154195', + 'node_id' => '151', + 'parent_node_id' => '150', + 'path_identification_string' => 'getting_started/new_features/asynchronous_publishing/graphics1', + 'path_string' => '/1/2/107/133/150/151/', + 'priority' => '0', + 'remote_id' => '92756622f207c0b1902ca156947a77de', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 109 => array ( + 'contentobject_id' => '150', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '152', + 'modified_subnode' => '1311154195', + 'node_id' => '152', + 'parent_node_id' => '133', + 'path_identification_string' => 'getting_started/new_features/rest_api_interface', + 'path_string' => '/1/2/107/133/152/', + 'priority' => '0', + 'remote_id' => '60adbb1e37a6524246d3af372366754f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 110 => array ( + 'contentobject_id' => '151', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '153', + 'modified_subnode' => '1311154196', + 'node_id' => '153', + 'parent_node_id' => '2', + 'path_identification_string' => 'ez_publish_enterprise', + 'path_string' => '/1/2/153/', + 'priority' => '0', + 'remote_id' => 'f4bf2e6c1cf75e15b15f0123a82778a1', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 111 => array ( + 'contentobject_id' => '152', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '154', + 'modified_subnode' => '1311154196', + 'node_id' => '154', + 'parent_node_id' => '153', + 'path_identification_string' => 'ez_publish_enterprise/graphics1', + 'path_string' => '/1/2/153/154/', + 'priority' => '0', + 'remote_id' => '1b95356b68bd59ef32b0fd7bb2c29130', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 112 => array ( + 'contentobject_id' => '153', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '155', + 'modified_subnode' => '1311154196', + 'node_id' => '155', + 'parent_node_id' => '153', + 'path_identification_string' => 'ez_publish_enterprise/graphics12', + 'path_string' => '/1/2/153/155/', + 'priority' => '0', + 'remote_id' => '94b7059eb5e0fe667f7c63eadd53a62b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 113 => array ( + 'contentobject_id' => '154', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '156', + 'modified_subnode' => '1311154199', + 'node_id' => '156', + 'parent_node_id' => '2', + 'path_identification_string' => 'partners', + 'path_string' => '/1/2/156/', + 'priority' => '3', + 'remote_id' => '0c523dfd6b1eccbfb0d1bfe632ee7411', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 114 => array ( + 'contentobject_id' => '155', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '157', + 'modified_subnode' => '1311154197', + 'node_id' => '157', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/partner_news', + 'path_string' => '/1/2/156/157/', + 'priority' => '0', + 'remote_id' => 'f5db8acf1150afc15eb514d380e3855d', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 115 => array ( + 'contentobject_id' => '156', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '158', + 'modified_subnode' => '1311154197', + 'node_id' => '158', + 'parent_node_id' => '157', + 'path_identification_string' => 'partners/partner_news/pellentesque_quam_mauris', + 'path_string' => '/1/2/156/157/158/', + 'priority' => '0', + 'remote_id' => '6366a99ac1cec2133e87fdd805d108c8', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 116 => array ( + 'contentobject_id' => '157', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '159', + 'modified_subnode' => '1311154197', + 'node_id' => '159', + 'parent_node_id' => '157', + 'path_identification_string' => 'partners/partner_news/penatibus_et_magnis_dis', + 'path_string' => '/1/2/156/157/159/', + 'priority' => '0', + 'remote_id' => '7ee406cb6e5f0b2a29bc9f97f5a5b9db', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 117 => array ( + 'contentobject_id' => '158', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '160', + 'modified_subnode' => '1311154198', + 'node_id' => '160', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/news', + 'path_string' => '/1/2/156/160/', + 'priority' => '0', + 'remote_id' => '007109e7f353c86dfd48d844cb18ce73', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 118 => array ( + 'contentobject_id' => '159', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '161', + 'modified_subnode' => '1311154198', + 'node_id' => '161', + 'parent_node_id' => '160', + 'path_identification_string' => 'partners/news/curabitur_hendrerit_dignissim', + 'path_string' => '/1/2/156/160/161/', + 'priority' => '0', + 'remote_id' => '63769c39380a45a731aa44068c0f4e33', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 119 => array ( + 'contentobject_id' => '160', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '162', + 'modified_subnode' => '1311154198', + 'node_id' => '162', + 'parent_node_id' => '160', + 'path_identification_string' => 'partners/news/proin_condimentum_risus', + 'path_string' => '/1/2/156/160/162/', + 'priority' => '0', + 'remote_id' => 'f761918d15e356e50ce94294cad79765', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 120 => array ( + 'contentobject_id' => '161', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '163', + 'modified_subnode' => '1311154198', + 'node_id' => '163', + 'parent_node_id' => '160', + 'path_identification_string' => 'partners/news/morbi_tristique_senectus', + 'path_string' => '/1/2/156/160/163/', + 'priority' => '0', + 'remote_id' => '68187b44ef9051a4db10bd9bb7f228a4', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 121 => array ( + 'contentobject_id' => '162', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '164', + 'modified_subnode' => '1311154198', + 'node_id' => '164', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/partner_products', + 'path_string' => '/1/2/156/164/', + 'priority' => '0', + 'remote_id' => '472e9bc321148baa71d2070063f24bb9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 122 => array ( + 'contentobject_id' => '163', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '165', + 'modified_subnode' => '1311154199', + 'node_id' => '165', + 'parent_node_id' => '156', + 'path_identification_string' => 'partners/partners', + 'path_string' => '/1/2/156/165/', + 'priority' => '0', + 'remote_id' => 'b1a68df10cdf379cf78999c8012db679', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 123 => array ( + 'contentobject_id' => '164', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '166', + 'modified_subnode' => '1311154199', + 'node_id' => '166', + 'parent_node_id' => '165', + 'path_identification_string' => 'partners/partners/neque_orci_malesuada_felis', + 'path_string' => '/1/2/156/165/166/', + 'priority' => '0', + 'remote_id' => 'e9ee6724fffb012f918300de66af27e1', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 124 => array ( + 'contentobject_id' => '165', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '167', + 'modified_subnode' => '1311154204', + 'node_id' => '167', + 'parent_node_id' => '2', + 'path_identification_string' => 'community', + 'path_string' => '/1/2/167/', + 'priority' => '4', + 'remote_id' => 'c4604fb2e100a6681a4f53fbe6e5eeae', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 125 => array ( + 'contentobject_id' => '166', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '168', + 'modified_subnode' => '1311154200', + 'node_id' => '168', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/forum', + 'path_string' => '/1/2/167/168/', + 'priority' => '0', + 'remote_id' => '5e6762a083ab4c0357bad163902ba8f7', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 126 => array ( + 'contentobject_id' => '167', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '169', + 'modified_subnode' => '1311154200', + 'node_id' => '169', + 'parent_node_id' => '168', + 'path_identification_string' => 'community/forum/nulla_vitae_tellus_sit_amet', + 'path_string' => '/1/2/167/168/169/', + 'priority' => '0', + 'remote_id' => '2549eee03064d55ae7fc84fe41ae1ef6', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 127 => array ( + 'contentobject_id' => '168', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '170', + 'modified_subnode' => '1311154200', + 'node_id' => '170', + 'parent_node_id' => '168', + 'path_identification_string' => 'community/forum/ut_mollis_sodales_nibh', + 'path_string' => '/1/2/167/168/170/', + 'priority' => '0', + 'remote_id' => '7bfca4bdde619ac9104e235629e2dbc7', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 128 => array ( + 'contentobject_id' => '169', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '171', + 'modified_subnode' => '1311154200', + 'node_id' => '171', + 'parent_node_id' => '168', + 'path_identification_string' => 'community/forum/nam_risus_leo', + 'path_string' => '/1/2/167/168/171/', + 'priority' => '0', + 'remote_id' => '81fd930afe94962395074b762592a356', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 129 => array ( + 'contentobject_id' => '170', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '172', + 'modified_subnode' => '1311154201', + 'node_id' => '172', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/wiki', + 'path_string' => '/1/2/167/172/', + 'priority' => '0', + 'remote_id' => '8b570ac03318b7e29eb5fd1bae15efde', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 130 => array ( + 'contentobject_id' => '171', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '173', + 'modified_subnode' => '1311154201', + 'node_id' => '173', + 'parent_node_id' => '172', + 'path_identification_string' => 'community/wiki/sed_suscipit', + 'path_string' => '/1/2/167/172/173/', + 'priority' => '0', + 'remote_id' => '4329dcc6a8d441aa7253660512dfd5b6', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 131 => array ( + 'contentobject_id' => '172', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '174', + 'modified_subnode' => '1311154201', + 'node_id' => '174', + 'parent_node_id' => '173', + 'path_identification_string' => 'community/wiki/sed_suscipit/ut_interdum', + 'path_string' => '/1/2/167/172/173/174/', + 'priority' => '0', + 'remote_id' => '6cf7b9370a0d9800ed49ba3be13b6be5', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 132 => array ( + 'contentobject_id' => '173', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '175', + 'modified_subnode' => '1311154201', + 'node_id' => '175', + 'parent_node_id' => '173', + 'path_identification_string' => 'community/wiki/sed_suscipit/fusce_pulvinar', + 'path_string' => '/1/2/167/172/173/175/', + 'priority' => '0', + 'remote_id' => 'f71191fcce35c83530cddde467a908b2', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 133 => array ( + 'contentobject_id' => '174', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '176', + 'modified_subnode' => '1311154201', + 'node_id' => '176', + 'parent_node_id' => '172', + 'path_identification_string' => 'community/wiki/duis_id_tortor', + 'path_string' => '/1/2/167/172/176/', + 'priority' => '0', + 'remote_id' => '2d3cf4fe8d439e16e0ed75ef947b5e3d', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 134 => array ( + 'contentobject_id' => '175', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '177', + 'modified_subnode' => '1311154201', + 'node_id' => '177', + 'parent_node_id' => '176', + 'path_identification_string' => 'community/wiki/duis_id_tortor/curabitur_lacinia', + 'path_string' => '/1/2/167/172/176/177/', + 'priority' => '0', + 'remote_id' => '49c9ad954328ab5f5a76d580873961a4', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 135 => array ( + 'contentobject_id' => '176', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '178', + 'modified_subnode' => '1311154203', + 'node_id' => '178', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/pictures', + 'path_string' => '/1/2/167/178/', + 'priority' => '0', + 'remote_id' => 'ae32173cedf3a5ec441e3afcadc4abcb', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 136 => array ( + 'contentobject_id' => '177', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '179', + 'modified_subnode' => '1311154202', + 'node_id' => '179', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/ivo_on_ez_tags', + 'path_string' => '/1/2/167/178/179/', + 'priority' => '0', + 'remote_id' => 'c6c32c884db955ea09338c90eee84746', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 137 => array ( + 'contentobject_id' => '178', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '180', + 'modified_subnode' => '1311154202', + 'node_id' => '180', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/are_you_ready_for_the_community_day', + 'path_string' => '/1/2/167/178/180/', + 'priority' => '0', + 'remote_id' => 'db191e87b9b6ac22a18742cd32d2b3d4', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 138 => array ( + 'contentobject_id' => '179', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '181', + 'modified_subnode' => '1311154202', + 'node_id' => '181', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/let_s_work_together', + 'path_string' => '/1/2/167/178/181/', + 'priority' => '0', + 'remote_id' => '02a6d1506bf437eda1317d0c36a8545b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 139 => array ( + 'contentobject_id' => '180', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '182', + 'modified_subnode' => '1311154203', + 'node_id' => '182', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/the_mediterranean_seen_from_nice', + 'path_string' => '/1/2/167/178/182/', + 'priority' => '0', + 'remote_id' => '40d743025e4ec4d813bd864dad08e0cc', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 140 => array ( + 'contentobject_id' => '181', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '183', + 'modified_subnode' => '1311154203', + 'node_id' => '183', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/hotel_lobby_at_isola2000', + 'path_string' => '/1/2/167/178/183/', + 'priority' => '0', + 'remote_id' => 'eb2a8ef7d4b1fb8ffb68f0764b615de1', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 141 => array ( + 'contentobject_id' => '182', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '184', + 'modified_subnode' => '1311154203', + 'node_id' => '184', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/alexander_on_the_past_gaby_on_today_and_tomorrow', + 'path_string' => '/1/2/167/178/184/', + 'priority' => '0', + 'remote_id' => '9e45f3ee0f15995b670fb3a117b6ee49', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 142 => array ( + 'contentobject_id' => '183', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '185', + 'modified_subnode' => '1311154203', + 'node_id' => '185', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/isola2000_in_white_beautiful_skiing', + 'path_string' => '/1/2/167/178/185/', + 'priority' => '0', + 'remote_id' => 'f368c4ae469c596344e15fca8c7370c2', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 143 => array ( + 'contentobject_id' => '184', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '186', + 'modified_subnode' => '1311154203', + 'node_id' => '186', + 'parent_node_id' => '178', + 'path_identification_string' => 'community/pictures/ceo_future_pitch_adaptable_open_reliable', + 'path_string' => '/1/2/167/178/186/', + 'priority' => '0', + 'remote_id' => '7e153b75dd0ee0476ac7463d4a3daaef', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 144 => array ( + 'contentobject_id' => '185', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '187', + 'modified_subnode' => '1311154204', + 'node_id' => '187', + 'parent_node_id' => '167', + 'path_identification_string' => 'community/blog', + 'path_string' => '/1/2/167/187/', + 'priority' => '0', + 'remote_id' => '09fb4147e4b124b9770a527bdd66799c', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 145 => array ( + 'contentobject_id' => '186', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '188', + 'modified_subnode' => '1311154204', + 'node_id' => '188', + 'parent_node_id' => '187', + 'path_identification_string' => 'community/blog/visit_paris', + 'path_string' => '/1/2/167/187/188/', + 'priority' => '0', + 'remote_id' => '8f73d6d4ffca33c619d2f2645340ccc0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 146 => array ( + 'contentobject_id' => '187', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '189', + 'modified_subnode' => '1311154204', + 'node_id' => '189', + 'parent_node_id' => '187', + 'path_identification_string' => 'community/blog/paris_in_france', + 'path_string' => '/1/2/167/187/189/', + 'priority' => '0', + 'remote_id' => '5cdc175d45aeb3fa054a95f40df56e79', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 147 => array ( + 'contentobject_id' => '188', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '190', + 'modified_subnode' => '1311154212', + 'node_id' => '190', + 'parent_node_id' => '2', + 'path_identification_string' => 'company', + 'path_string' => '/1/2/190/', + 'priority' => '6', + 'remote_id' => 'e060ff40aa17eb21dc1e4595c9a5eb9a', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 148 => array ( + 'contentobject_id' => '189', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '191', + 'modified_subnode' => '1311154204', + 'node_id' => '191', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/about_company', + 'path_string' => '/1/2/190/191/', + 'priority' => '0', + 'remote_id' => '7bf290af79b3b51e6ccc1f95f321618c', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 149 => array ( + 'contentobject_id' => '190', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '192', + 'modified_subnode' => '1311154212', + 'node_id' => '192', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/new_features', + 'path_string' => '/1/2/190/192/', + 'priority' => '0', + 'remote_id' => '9f804eee139dcee343dbe4175d14654c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 150 => array ( + 'contentobject_id' => '191', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '193', + 'modified_subnode' => '1311154205', + 'node_id' => '193', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/separate_content_design_in_ez_publish', + 'path_string' => '/1/2/190/192/193/', + 'priority' => '0', + 'remote_id' => '10d57795c986ca61689e6c2c11382eb3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 151 => array ( + 'contentobject_id' => '192', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '194', + 'modified_subnode' => '1311154205', + 'node_id' => '194', + 'parent_node_id' => '193', + 'path_identification_string' => 'company/new_features/separate_content_design_in_ez_publish/separation_of_content_and_design', + 'path_string' => '/1/2/190/192/193/194/', + 'priority' => '0', + 'remote_id' => '87417129b080d24d335eb2653dd1a40c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 152 => array ( + 'contentobject_id' => '193', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '195', + 'modified_subnode' => '1311154207', + 'node_id' => '195', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish', + 'path_string' => '/1/2/190/192/195/', + 'priority' => '0', + 'remote_id' => 'fd56d839df6e2b52055d4a62f4df7c3e', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 153 => array ( + 'contentobject_id' => '194', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '196', + 'modified_subnode' => '1311154206', + 'node_id' => '196', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/openoffice_import_large', + 'path_string' => '/1/2/190/192/195/196/', + 'priority' => '0', + 'remote_id' => 'ab2f2093f16c56ac2e61f40f25d2dbe0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 154 => array ( + 'contentobject_id' => '195', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '197', + 'modified_subnode' => '1311154206', + 'node_id' => '197', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/translation_large', + 'path_string' => '/1/2/190/192/195/197/', + 'priority' => '0', + 'remote_id' => '185a1737e9012e7c3025df876bbb4f9b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 155 => array ( + 'contentobject_id' => '196', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '198', + 'modified_subnode' => '1311154206', + 'node_id' => '198', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/multiupload_large', + 'path_string' => '/1/2/190/192/195/198/', + 'priority' => '0', + 'remote_id' => 'efdca2f6ddd2c8befc283ae3465b9acd', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 156 => array ( + 'contentobject_id' => '197', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '199', + 'modified_subnode' => '1311154207', + 'node_id' => '199', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/gallery_large', + 'path_string' => '/1/2/190/192/195/199/', + 'priority' => '0', + 'remote_id' => 'f81b0e4c31ea13d94b9838e9e7e7ad7e', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 157 => array ( + 'contentobject_id' => '198', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '200', + 'modified_subnode' => '1311154207', + 'node_id' => '200', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/search_result_large', + 'path_string' => '/1/2/190/192/195/200/', + 'priority' => '0', + 'remote_id' => '666efc49c267cddf55ca707408f4ac42', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 158 => array ( + 'contentobject_id' => '199', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '201', + 'modified_subnode' => '1311154207', + 'node_id' => '201', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/ez_tool_bar_large', + 'path_string' => '/1/2/190/192/195/201/', + 'priority' => '0', + 'remote_id' => 'afb51a5f898c549c9e1f35afc75d66f3', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 159 => array ( + 'contentobject_id' => '200', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '202', + 'modified_subnode' => '1311154207', + 'node_id' => '202', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/quicktime_large', + 'path_string' => '/1/2/190/192/195/202/', + 'priority' => '0', + 'remote_id' => '94b71866ede0d2776c140e85a823d31d', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 160 => array ( + 'contentobject_id' => '201', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '203', + 'modified_subnode' => '1311154207', + 'node_id' => '203', + 'parent_node_id' => '195', + 'path_identification_string' => 'company/new_features/how_to_use_ez_publish/web_2_0_large', + 'path_string' => '/1/2/190/192/195/203/', + 'priority' => '0', + 'remote_id' => 'e74475a240fb7061b40c75f5e6fcd52c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 161 => array ( + 'contentobject_id' => '202', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '204', + 'modified_subnode' => '1311154210', + 'node_id' => '204', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish', + 'path_string' => '/1/2/190/192/204/', + 'priority' => '0', + 'remote_id' => '42a3b07037390457ad0f2c65494bfd97', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 162 => array ( + 'contentobject_id' => '203', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '205', + 'modified_subnode' => '1311154208', + 'node_id' => '205', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/usermanagement_large', + 'path_string' => '/1/2/190/192/204/205/', + 'priority' => '0', + 'remote_id' => '6da1a82ba3d962d2ad953fff8ee26362', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 163 => array ( + 'contentobject_id' => '204', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '206', + 'modified_subnode' => '1311154208', + 'node_id' => '206', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/workflow_large', + 'path_string' => '/1/2/190/192/204/206/', + 'priority' => '0', + 'remote_id' => 'b284abd88bdcb1887a86e40304ffc66f', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 164 => array ( + 'contentobject_id' => '205', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '207', + 'modified_subnode' => '1311154209', + 'node_id' => '207', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/versioning_large', + 'path_string' => '/1/2/190/192/204/207/', + 'priority' => '0', + 'remote_id' => 'e3400bb44aae5fcb416156e7450f3f32', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 165 => array ( + 'contentobject_id' => '206', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '208', + 'modified_subnode' => '1311154209', + 'node_id' => '208', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/datatypes_attributes_content_class_and_objects_large', + 'path_string' => '/1/2/190/192/204/208/', + 'priority' => '0', + 'remote_id' => '2b2b27bbaaec688aaec1a5d39b4b13ae', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 166 => array ( + 'contentobject_id' => '207', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '209', + 'modified_subnode' => '1311154209', + 'node_id' => '209', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/multiple_location_large', + 'path_string' => '/1/2/190/192/204/209/', + 'priority' => '0', + 'remote_id' => '37e5feed6574d1d8da4b4531569a27a2', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 167 => array ( + 'contentobject_id' => '208', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '210', + 'modified_subnode' => '1311154209', + 'node_id' => '210', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/multisite_deployment_large', + 'path_string' => '/1/2/190/192/204/210/', + 'priority' => '0', + 'remote_id' => '5625695a66034f53b9b6e14029e06e80', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 168 => array ( + 'contentobject_id' => '209', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '211', + 'modified_subnode' => '1311154210', + 'node_id' => '211', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/seo_large', + 'path_string' => '/1/2/190/192/204/211/', + 'priority' => '0', + 'remote_id' => '824aba4122ee51d9638847e55642feec', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 169 => array ( + 'contentobject_id' => '210', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '212', + 'modified_subnode' => '1311154210', + 'node_id' => '212', + 'parent_node_id' => '204', + 'path_identification_string' => 'company/new_features/how_to_manage_ez_publish/admin_site_large', + 'path_string' => '/1/2/190/192/204/212/', + 'priority' => '0', + 'remote_id' => '73e95051b800ce051c3851c60807787b', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 170 => array ( + 'contentobject_id' => '211', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '213', + 'modified_subnode' => '1311154211', + 'node_id' => '213', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish', + 'path_string' => '/1/2/190/192/213/', + 'priority' => '0', + 'remote_id' => '3f921d3c490a6c17870b1f01fcfbceed', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 171 => array ( + 'contentobject_id' => '212', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '214', + 'modified_subnode' => '1311154211', + 'node_id' => '214', + 'parent_node_id' => '213', + 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish/datatypes_attributes_content_class_and_objects_large', + 'path_string' => '/1/2/190/192/213/214/', + 'priority' => '0', + 'remote_id' => '97f7b391f1522bf404ff672ac338b91c', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 172 => array ( + 'contentobject_id' => '213', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '5', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '215', + 'modified_subnode' => '1311154211', + 'node_id' => '215', + 'parent_node_id' => '213', + 'path_identification_string' => 'company/new_features/how_to_develop_with_ez_publish/site_style_large', + 'path_string' => '/1/2/190/192/213/215/', + 'priority' => '0', + 'remote_id' => 'c5549bf68962a5384bd2225931cba302', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 173 => array ( + 'contentobject_id' => '214', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '216', + 'modified_subnode' => '1311154211', + 'node_id' => '216', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/rest_api_interface', + 'path_string' => '/1/2/190/192/216/', + 'priority' => '0', + 'remote_id' => '54adfd9f7c80638f5560eb3f0618c57b', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 174 => array ( + 'contentobject_id' => '215', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '217', + 'modified_subnode' => '1311154211', + 'node_id' => '217', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/asynchronous_publishing', + 'path_string' => '/1/2/190/192/217/', + 'priority' => '0', + 'remote_id' => 'a7dbafbf963821b71e5522c21e09d9dd', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 175 => array ( + 'contentobject_id' => '216', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '218', + 'modified_subnode' => '1311154211', + 'node_id' => '218', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/canonical_links', + 'path_string' => '/1/2/190/192/218/', + 'priority' => '0', + 'remote_id' => '61e3b15f020590df0759b779e5f1fb9d', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 176 => array ( + 'contentobject_id' => '217', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '219', + 'modified_subnode' => '1311154212', + 'node_id' => '219', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/support_for_red_hat_enterprise', + 'path_string' => '/1/2/190/192/219/', + 'priority' => '0', + 'remote_id' => '42560fa30a55ac5ddf1f76a52d44a613', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 177 => array ( + 'contentobject_id' => '218', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '220', + 'modified_subnode' => '1311154212', + 'node_id' => '220', + 'parent_node_id' => '192', + 'path_identification_string' => 'company/new_features/fastcgi', + 'path_string' => '/1/2/190/192/220/', + 'priority' => '0', + 'remote_id' => '416c28c9ba34a9114381a6ec3ae197e0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 178 => array ( + 'contentobject_id' => '219', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '221', + 'modified_subnode' => '1311154212', + 'node_id' => '221', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/events', + 'path_string' => '/1/2/190/221/', + 'priority' => '0', + 'remote_id' => 'ae6afe955af19209125961b6c0d9a840', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 179 => array ( + 'contentobject_id' => '220', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '222', + 'modified_subnode' => '1311154212', + 'node_id' => '222', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/career', + 'path_string' => '/1/2/190/222/', + 'priority' => '0', + 'remote_id' => '28b7fd81eaf6b9702c9f8ff8268daac9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 180 => array ( + 'contentobject_id' => '221', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '223', + 'modified_subnode' => '1311154212', + 'node_id' => '223', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/investors_relation', + 'path_string' => '/1/2/190/223/', + 'priority' => '0', + 'remote_id' => '627c1c5cdf124dc2f92489e686cd04bb', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 181 => array ( + 'contentobject_id' => '222', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '224', + 'modified_subnode' => '1311154212', + 'node_id' => '224', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/contact', + 'path_string' => '/1/2/190/224/', + 'priority' => '0', + 'remote_id' => 'daa3004ede25b0130ca5bef83c1922c3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 182 => array ( + 'contentobject_id' => '223', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '4', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '225', + 'modified_subnode' => '1311154212', + 'node_id' => '225', + 'parent_node_id' => '224', + 'path_identification_string' => 'company/contact/morbi_neque', + 'path_string' => '/1/2/190/224/225/', + 'priority' => '0', + 'remote_id' => '9d2bdcb8b35464ee03651c191ac4d1ff', + 'sort_field' => '2', + 'sort_order' => '1', + ), + 183 => array ( + 'contentobject_id' => '224', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '226', + 'modified_subnode' => '1311154212', + 'node_id' => '226', + 'parent_node_id' => '190', + 'path_identification_string' => 'company/company_banner', + 'path_string' => '/1/2/190/226/', + 'priority' => '0', + 'remote_id' => '9ae96e2ecc3a5a79964405273cc8542a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 184 => array ( + 'contentobject_id' => '225', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '227', + 'modified_subnode' => '1311154215', + 'node_id' => '227', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/partners', + 'path_string' => '/1/5/227/', + 'priority' => '0', + 'remote_id' => '1ee27657f5f41fe6458fcb90e81d5d82', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 185 => array ( + 'contentobject_id' => '226', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '228', + 'modified_subnode' => '1313061404', + 'node_id' => '228', + 'parent_node_id' => '77', + 'path_identification_string' => 'solutions/something', + 'path_string' => '/1/2/77/228/', + 'priority' => '0', + 'remote_id' => 'ee684db77223bb1a10300d7b250232cf', + 'sort_field' => '1', + 'sort_order' => '1', + ), + ), + 'ezcontentobject_link' => array( + array( + 'contentclassattribute_id'=>237, + 'from_contentobject_id'=>67, + 'from_contentobject_version'=>1, + 'id'=>1, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>60 + ), + array( + 'contentclassattribute_id'=>237, + 'from_contentobject_id'=>75, + 'from_contentobject_version'=>1, + 'id'=>2, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>64 + ), + array( + 'contentclassattribute_id'=>237, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>3, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>63 + ), + array( + 'contentclassattribute_id'=>237, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>4, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>62 + ), + array( + 'contentclassattribute_id'=>237, + 'from_contentobject_id'=>154, + 'from_contentobject_version'=>1, + 'id'=>5, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>61 + ), + array( + 'contentclassattribute_id'=>237, + 'from_contentobject_id'=>165, + 'from_contentobject_version'=>1, + 'id'=>6, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>58 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>109, + 'from_contentobject_version'=>1, + 'id'=>7, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>109 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>110, + 'from_contentobject_version'=>1, + 'id'=>8, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>110 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>111, + 'from_contentobject_version'=>1, + 'id'=>9, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>111 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>112, + 'from_contentobject_version'=>1, + 'id'=>10, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>112 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>113, + 'from_contentobject_version'=>1, + 'id'=>11, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>113 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>114, + 'from_contentobject_version'=>1, + 'id'=>12, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>114 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>115, + 'from_contentobject_version'=>1, + 'id'=>13, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>115 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>116, + 'from_contentobject_version'=>1, + 'id'=>14, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>116 + ), + array( + 'contentclassattribute_id'=>108, + 'from_contentobject_id'=>117, + 'from_contentobject_version'=>1, + 'id'=>15, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>117 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>119, + 'from_contentobject_version'=>1, + 'id'=>16, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>119 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>120, + 'from_contentobject_version'=>1, + 'id'=>17, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>120 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>121, + 'from_contentobject_version'=>1, + 'id'=>18, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>121 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>122, + 'from_contentobject_version'=>1, + 'id'=>19, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>122 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>123, + 'from_contentobject_version'=>1, + 'id'=>20, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>123 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>124, + 'from_contentobject_version'=>1, + 'id'=>21, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>124 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>125, + 'from_contentobject_version'=>1, + 'id'=>22, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>125 + ), + array( + 'contentclassattribute_id'=>118, + 'from_contentobject_id'=>126, + 'from_contentobject_version'=>1, + 'id'=>23, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>126 + ), + array( + 'contentclassattribute_id'=>127, + 'from_contentobject_id'=>128, + 'from_contentobject_version'=>1, + 'id'=>24, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>128 + ), + array( + 'contentclassattribute_id'=>127, + 'from_contentobject_id'=>129, + 'from_contentobject_version'=>1, + 'id'=>25, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>129 + ), + array( + 'contentclassattribute_id'=>132, + 'from_contentobject_id'=>133, + 'from_contentobject_version'=>1, + 'id'=>26, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>133 + ), + array( + 'contentclassattribute_id'=>132, + 'from_contentobject_id'=>134, + 'from_contentobject_version'=>1, + 'id'=>27, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>134 + ), + array( + 'contentclassattribute_id'=>132, + 'from_contentobject_id'=>135, + 'from_contentobject_version'=>1, + 'id'=>28, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>135 + ), + array( + 'contentclassattribute_id'=>136, + 'from_contentobject_id'=>137, + 'from_contentobject_version'=>1, + 'id'=>29, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>137 + ), + array( + 'contentclassattribute_id'=>136, + 'from_contentobject_id'=>138, + 'from_contentobject_version'=>1, + 'id'=>30, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>138 + ), + array( + 'contentclassattribute_id'=>139, + 'from_contentobject_id'=>140, + 'from_contentobject_version'=>1, + 'id'=>31, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>140 + ), + array( + 'contentclassattribute_id'=>139, + 'from_contentobject_id'=>141, + 'from_contentobject_version'=>1, + 'id'=>32, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>141 + ), + array( + 'contentclassattribute_id'=>139, + 'from_contentobject_id'=>142, + 'from_contentobject_version'=>1, + 'id'=>33, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>142 + ), + array( + 'contentclassattribute_id'=>139, + 'from_contentobject_id'=>143, + 'from_contentobject_version'=>1, + 'id'=>34, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>143 + ), + array( + 'contentclassattribute_id'=>145, + 'from_contentobject_id'=>146, + 'from_contentobject_version'=>1, + 'id'=>35, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>146 + ), + array( + 'contentclassattribute_id'=>148, + 'from_contentobject_id'=>149, + 'from_contentobject_version'=>1, + 'id'=>36, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>149 + ), + array( + 'contentclassattribute_id'=>151, + 'from_contentobject_id'=>152, + 'from_contentobject_version'=>1, + 'id'=>37, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>152 + ), + array( + 'contentclassattribute_id'=>151, + 'from_contentobject_id'=>153, + 'from_contentobject_version'=>1, + 'id'=>38, + 'op_code'=>0, + 'relation_type'=>8, + 'to_contentobject_id'=>153 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>65, + 'from_contentobject_version'=>1, + 'id'=>39, + 'op_code'=>0, + 'relation_type'=>4, + 'to_contentobject_id'=>151 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>65, + 'from_contentobject_version'=>1, + 'id'=>40, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>106 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>65, + 'from_contentobject_version'=>1, + 'id'=>41, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>107 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>65, + 'from_contentobject_version'=>1, + 'id'=>42, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>176 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>65, + 'from_contentobject_version'=>1, + 'id'=>43, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>131 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>67, + 'from_contentobject_version'=>1, + 'id'=>44, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>71 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>67, + 'from_contentobject_version'=>1, + 'id'=>45, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>72 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>67, + 'from_contentobject_version'=>1, + 'id'=>46, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>73 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>75, + 'from_contentobject_version'=>1, + 'id'=>47, + 'op_code'=>0, + 'relation_type'=>6, + 'to_contentobject_id'=>76 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>75, + 'from_contentobject_version'=>1, + 'id'=>48, + 'op_code'=>0, + 'relation_type'=>6, + 'to_contentobject_id'=>80 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>75, + 'from_contentobject_version'=>1, + 'id'=>49, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>77 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>75, + 'from_contentobject_version'=>1, + 'id'=>50, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>79 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>75, + 'from_contentobject_version'=>1, + 'id'=>51, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>78 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>52, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>85 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>53, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>93 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>54, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>91 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>55, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>92 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>56, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>86 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>84, + 'from_contentobject_version'=>1, + 'id'=>57, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>87 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>58, + 'op_code'=>0, + 'relation_type'=>4, + 'to_contentobject_id'=>98 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>59, + 'op_code'=>0, + 'relation_type'=>4, + 'to_contentobject_id'=>95 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>60, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>101 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>61, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>103 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>62, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>104 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>94, + 'from_contentobject_version'=>1, + 'id'=>63, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>102 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>106, + 'from_contentobject_version'=>1, + 'id'=>64, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>108 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>106, + 'from_contentobject_version'=>1, + 'id'=>65, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>202 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>106, + 'from_contentobject_version'=>1, + 'id'=>66, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>127 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>106, + 'from_contentobject_version'=>1, + 'id'=>67, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>130 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>68, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>109 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>69, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>110 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>70, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>111 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>71, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>112 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>72, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>113 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>73, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>114 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>74, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>115 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>108, + 'from_contentobject_version'=>1, + 'id'=>75, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>116 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>76, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>119 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>77, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>120 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>78, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>121 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>79, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>122 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>80, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>123 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>81, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>124 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>82, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>125 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>118, + 'from_contentobject_version'=>1, + 'id'=>83, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>126 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>127, + 'from_contentobject_version'=>1, + 'id'=>84, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>128 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>127, + 'from_contentobject_version'=>1, + 'id'=>85, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>129 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>132, + 'from_contentobject_version'=>1, + 'id'=>86, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>133 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>132, + 'from_contentobject_version'=>1, + 'id'=>87, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>134 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>132, + 'from_contentobject_version'=>1, + 'id'=>88, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>135 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>136, + 'from_contentobject_version'=>1, + 'id'=>89, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>137 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>136, + 'from_contentobject_version'=>1, + 'id'=>90, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>138 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>139, + 'from_contentobject_version'=>1, + 'id'=>91, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>141 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>139, + 'from_contentobject_version'=>1, + 'id'=>92, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>140 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>139, + 'from_contentobject_version'=>1, + 'id'=>93, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>142 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>139, + 'from_contentobject_version'=>1, + 'id'=>94, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>143 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>145, + 'from_contentobject_version'=>1, + 'id'=>95, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>146 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>148, + 'from_contentobject_version'=>1, + 'id'=>96, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>149 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>150, + 'from_contentobject_version'=>1, + 'id'=>97, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>66 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>151, + 'from_contentobject_version'=>1, + 'id'=>98, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>152 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>151, + 'from_contentobject_version'=>1, + 'id'=>99, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>153 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>154, + 'from_contentobject_version'=>1, + 'id'=>100, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>163 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>154, + 'from_contentobject_version'=>1, + 'id'=>101, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>162 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>154, + 'from_contentobject_version'=>1, + 'id'=>102, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>158 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>154, + 'from_contentobject_version'=>1, + 'id'=>103, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>155 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>154, + 'from_contentobject_version'=>1, + 'id'=>104, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>164 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>165, + 'from_contentobject_version'=>1, + 'id'=>105, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>170 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>165, + 'from_contentobject_version'=>1, + 'id'=>106, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>185 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>165, + 'from_contentobject_version'=>1, + 'id'=>107, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>166 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>165, + 'from_contentobject_version'=>1, + 'id'=>108, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>176 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>188, + 'from_contentobject_version'=>1, + 'id'=>109, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>224 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>191, + 'from_contentobject_version'=>1, + 'id'=>110, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>192 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>111, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>199 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>112, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>194 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>113, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>195 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>114, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>196 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>115, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>197 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>116, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>200 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>117, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>201 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>193, + 'from_contentobject_version'=>1, + 'id'=>118, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>198 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>119, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>210 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>120, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>203 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>121, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>204 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>122, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>205 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>123, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>206 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>124, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>207 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>125, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>208 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>202, + 'from_contentobject_version'=>1, + 'id'=>126, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>209 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>211, + 'from_contentobject_version'=>1, + 'id'=>127, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>212 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>211, + 'from_contentobject_version'=>1, + 'id'=>128, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>213 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>225, + 'from_contentobject_version'=>1, + 'id'=>129, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>213 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>225, + 'from_contentobject_version'=>2, + 'id'=>130, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>213 + ), + array( + 'contentclassattribute_id'=>0, + 'from_contentobject_id'=>211, + 'from_contentobject_version'=>1, + 'id'=>131, + 'op_code'=>0, + 'relation_type'=>2, + 'to_contentobject_id'=>225 + ) + ), + 'ezcontentobject_name' => array( + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>4, + 'language_id'=>3, + 'name'=>'Users', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>2, + 'contentobject_id'=>10, + 'language_id'=>3, + 'name'=>'Anonymous User', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>11, + 'language_id'=>3, + 'name'=>'Guest accounts', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>2, + 'contentobject_id'=>11, + 'language_id'=>3, + 'name'=>'Members', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>12, + 'language_id'=>3, + 'name'=>'Administrator users', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>13, + 'language_id'=>3, + 'name'=>'Editors', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>3, + 'contentobject_id'=>14, + 'language_id'=>3, + 'name'=>'Administrator User', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>4, + 'contentobject_id'=>14, + 'language_id'=>3, + 'name'=>'Administrator User', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>41, + 'language_id'=>3, + 'name'=>'Media', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>42, + 'language_id'=>3, + 'name'=>'Anonymous Users', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>45, + 'language_id'=>3, + 'name'=>'Setup', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>49, + 'language_id'=>3, + 'name'=>'Images', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>50, + 'language_id'=>3, + 'name'=>'Files', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>51, + 'language_id'=>3, + 'name'=>'Multimedia', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>52, + 'language_id'=>2, + 'name'=>'Common INI settings', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>2, + 'contentobject_id'=>54, + 'language_id'=>2, + 'name'=>'Website Interface', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>56, + 'language_id'=>3, + 'name'=>'Design', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>57, + 'language_id'=>3, + 'name'=>'Banners', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>58, + 'language_id'=>2, + 'name'=>'Woman (Communities)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>59, + 'language_id'=>2, + 'name'=>'Woman (Frontpage)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>60, + 'language_id'=>2, + 'name'=>'Woman (Products)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>61, + 'language_id'=>2, + 'name'=>'Woman (Partners)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>62, + 'language_id'=>2, + 'name'=>'Pencils (Support)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>63, + 'language_id'=>2, + 'name'=>'Woman (Training)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>64, + 'language_id'=>2, + 'name'=>'Woman (Solutions)', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>65, + 'language_id'=>3, + 'name'=>'Home', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>66, + 'language_id'=>2, + 'name'=>'rest_api', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>67, + 'language_id'=>2, + 'name'=>'Products', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>68, + 'language_id'=>3, + 'name'=>'Software', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>69, + 'language_id'=>2, + 'name'=>'OS Type I', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>70, + 'language_id'=>3, + 'name'=>'Boxes', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>71, + 'language_id'=>2, + 'name'=>'CD/DVD Box I', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>72, + 'language_id'=>2, + 'name'=>'CD/DVD Box II', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>73, + 'language_id'=>2, + 'name'=>'CD/DVD Box III', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>74, + 'language_id'=>3, + 'name'=>'Products sheets', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>75, + 'language_id'=>2, + 'name'=>'Solutions', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>76, + 'language_id'=>3, + 'name'=>'Web publishing', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>77, + 'language_id'=>2, + 'name'=>'Fusce sagittis sagittis', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>78, + 'language_id'=>2, + 'name'=>'Etiam posuere sodales arcu', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>79, + 'language_id'=>2, + 'name'=>'In hac habitasse platea', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>80, + 'language_id'=>3, + 'name'=>'Content management', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>81, + 'language_id'=>2, + 'name'=>'Fusce sagittis sagittis urna', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>82, + 'language_id'=>2, + 'name'=>'Class aptent taciti sociosqu', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>83, + 'language_id'=>2, + 'name'=>'Aenean malesuada ligula', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>84, + 'language_id'=>2, + 'name'=>'Training', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>85, + 'language_id'=>3, + 'name'=>'Certification', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>86, + 'language_id'=>3, + 'name'=>'Professional workshops', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>87, + 'language_id'=>2, + 'name'=>'Etiam sodales mauris', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>88, + 'language_id'=>2, + 'name'=>'Class aptent taciti', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>89, + 'language_id'=>2, + 'name'=>'Duis auctor vehicula erat', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>90, + 'language_id'=>2, + 'name'=>'Events and seminars', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>91, + 'language_id'=>3, + 'name'=>'Self-paced courses', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>92, + 'language_id'=>3, + 'name'=>'Instructor-led courses', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>93, + 'language_id'=>3, + 'name'=>'Additional learning resources', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>94, + 'language_id'=>2, + 'name'=>'Support', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>95, + 'language_id'=>2, + 'name'=>'Knowledgebase', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>96, + 'language_id'=>2, + 'name'=>'Sed suscipit', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>97, + 'language_id'=>2, + 'name'=>'Ut interdum', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>98, + 'language_id'=>2, + 'name'=>'Documentation', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>99, + 'language_id'=>2, + 'name'=>'Mauris pretium', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>100, + 'language_id'=>2, + 'name'=>'Aliquam posuere', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>101, + 'language_id'=>3, + 'name'=>'Books', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>102, + 'language_id'=>2, + 'name'=>'Aliquam pulvinar suscipit tellus', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>103, + 'language_id'=>3, + 'name'=>'Customer Service', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>104, + 'language_id'=>3, + 'name'=>'Support Programs', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>105, + 'language_id'=>3, + 'name'=>'Getting started', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>106, + 'language_id'=>2, + 'name'=>'Tutorials for', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>107, + 'language_id'=>2, + 'name'=>'Get involved', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>108, + 'language_id'=>2, + 'name'=>'How to use eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>109, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>110, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>111, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>112, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>113, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>114, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>115, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>116, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>117, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>118, + 'language_id'=>2, + 'name'=>'How to manage eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>119, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>120, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>121, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>122, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>123, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>124, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>125, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>126, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>127, + 'language_id'=>2, + 'name'=>'How to develop with eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>128, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>129, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>130, + 'language_id'=>2, + 'name'=>'Adding Siteaccesses in eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>131, + 'language_id'=>3, + 'name'=>'New features', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>132, + 'language_id'=>2, + 'name'=>'Improved user registration workflow', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>133, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>134, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>135, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>136, + 'language_id'=>2, + 'name'=>'Improved block editing', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>137, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>138, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>139, + 'language_id'=>2, + 'name'=>'Improved front-end editing', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>140, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>141, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>142, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>143, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>144, + 'language_id'=>2, + 'name'=>'FastCGI', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>145, + 'language_id'=>2, + 'name'=>'Support for Red Hat Enterprise', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>146, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>147, + 'language_id'=>2, + 'name'=>'Canonical links', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>148, + 'language_id'=>2, + 'name'=>'Asynchronous publishing', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>149, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>150, + 'language_id'=>2, + 'name'=>'REST API interface', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>151, + 'language_id'=>2, + 'name'=>'eZ Publish Enterprise', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>152, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>153, + 'language_id'=>2, + 'name'=>'graphics1', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>154, + 'language_id'=>3, + 'name'=>'Partners', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>155, + 'language_id'=>3, + 'name'=>'Partner News', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>156, + 'language_id'=>2, + 'name'=>'Pellentesque quam mauris', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>157, + 'language_id'=>2, + 'name'=>'Penatibus et magnis dis', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>158, + 'language_id'=>3, + 'name'=>'News', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>159, + 'language_id'=>2, + 'name'=>'Curabitur hendrerit dignissim', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>160, + 'language_id'=>2, + 'name'=>'Proin condimentum risus', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>161, + 'language_id'=>2, + 'name'=>'Morbi tristique senectus', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>162, + 'language_id'=>3, + 'name'=>'Partner Products', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>163, + 'language_id'=>3, + 'name'=>'Partners', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>164, + 'language_id'=>2, + 'name'=>'Neque orci malesuada felis', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>165, + 'language_id'=>3, + 'name'=>'Community', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>166, + 'language_id'=>2, + 'name'=>'Forum', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>167, + 'language_id'=>2, + 'name'=>'Nulla vitae tellus sit amet', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>168, + 'language_id'=>2, + 'name'=>'Ut mollis sodales nibh', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>169, + 'language_id'=>2, + 'name'=>'Nam risus leo', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>170, + 'language_id'=>2, + 'name'=>'Wiki', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>171, + 'language_id'=>2, + 'name'=>'Sed suscipit', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>172, + 'language_id'=>2, + 'name'=>'Ut interdum', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>173, + 'language_id'=>2, + 'name'=>'Fusce pulvinar', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>174, + 'language_id'=>2, + 'name'=>'Duis id tortor', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>175, + 'language_id'=>2, + 'name'=>'Curabitur lacinia', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>176, + 'language_id'=>2, + 'name'=>'Pictures', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>177, + 'language_id'=>2, + 'name'=>'Ivo on eZ Tags', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>178, + 'language_id'=>2, + 'name'=>'Are you ready for the Community day?', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>179, + 'language_id'=>2, + 'name'=>'Let\'s work together!', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>180, + 'language_id'=>2, + 'name'=>'The Mediterranean seen from Nice!', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>181, + 'language_id'=>2, + 'name'=>'Hotel lobby at Isola2000', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>182, + 'language_id'=>2, + 'name'=>'Alexander on the past, + Gaby on today and tomorrow', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>183, + 'language_id'=>2, + 'name'=>'Isola2000 in white - beautiful skiing!', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>184, + 'language_id'=>2, + 'name'=>'CEO future pitch - Adaptable, + open, + reliable!', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>185, + 'language_id'=>2, + 'name'=>'Blog', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>186, + 'language_id'=>2, + 'name'=>'Visit Paris', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>187, + 'language_id'=>2, + 'name'=>'Paris in France', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>188, + 'language_id'=>3, + 'name'=>'Company', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>189, + 'language_id'=>3, + 'name'=>'About company', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>190, + 'language_id'=>3, + 'name'=>'New features', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>191, + 'language_id'=>2, + 'name'=>'Separate content & design in eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>192, + 'language_id'=>2, + 'name'=>'separation_of_content_and_design', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>193, + 'language_id'=>2, + 'name'=>'How to use eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>194, + 'language_id'=>2, + 'name'=>'openoffice_import_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>195, + 'language_id'=>2, + 'name'=>'translation_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>196, + 'language_id'=>2, + 'name'=>'multiupload_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>197, + 'language_id'=>2, + 'name'=>'gallery_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>198, + 'language_id'=>2, + 'name'=>'search_result_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>199, + 'language_id'=>2, + 'name'=>'ez_tool_bar_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>200, + 'language_id'=>2, + 'name'=>'quicktime_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>201, + 'language_id'=>2, + 'name'=>'web_2_0_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>202, + 'language_id'=>2, + 'name'=>'How to manage eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>203, + 'language_id'=>2, + 'name'=>'usermanagement_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>204, + 'language_id'=>2, + 'name'=>'workflow_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>205, + 'language_id'=>2, + 'name'=>'versioning_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>206, + 'language_id'=>2, + 'name'=>'datatypes_attributes_content_class_and_objects_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>207, + 'language_id'=>2, + 'name'=>'multiple_location_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>208, + 'language_id'=>2, + 'name'=>'multisite_deployment_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>209, + 'language_id'=>2, + 'name'=>'seo_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>210, + 'language_id'=>2, + 'name'=>'admin_site_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>211, + 'language_id'=>2, + 'name'=>'How to develop with eZ Publish', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>212, + 'language_id'=>2, + 'name'=>'datatypes_attributes_content_class_and_objects_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>213, + 'language_id'=>2, + 'name'=>'site_style_large', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>214, + 'language_id'=>2, + 'name'=>'REST API interface', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>215, + 'language_id'=>2, + 'name'=>'Asynchronous Publishing', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>216, + 'language_id'=>2, + 'name'=>'Canonical links', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>217, + 'language_id'=>2, + 'name'=>'Support for Red Hat Enterprise', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>218, + 'language_id'=>2, + 'name'=>'FastCGI', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>219, + 'language_id'=>2, + 'name'=>'Events', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>220, + 'language_id'=>3, + 'name'=>'Career', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>221, + 'language_id'=>3, + 'name'=>'Investors Relation', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>222, + 'language_id'=>2, + 'name'=>'Contact', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>223, + 'language_id'=>2, + 'name'=>'Morbi neque', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>224, + 'language_id'=>3, + 'name'=>'Company banner', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>225, + 'language_id'=>3, + 'name'=>'Partners', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>2, + 'contentobject_id'=>225, + 'language_id'=>3, + 'name'=>'Partners', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>1, + 'contentobject_id'=>226, + 'language_id'=>3, + 'name'=>'Something', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>2, + 'contentobject_id'=>226, + 'language_id'=>3, + 'name'=>'Something', + 'real_translation'=>'eng-US' + ), + + array( + 'content_translation'=>'eng-US', + 'content_version'=>2, + 'contentobject_id'=>166, + 'language_id'=>2, + 'name'=>'Forum', + 'real_translation'=>'eng-US' + ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows.php new file mode 100644 index 0000000..91a4b73 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows.php @@ -0,0 +1,508 @@ +<?php + +return array ( + 0 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '4000', + 'ezcontentobject_attribute_contentclassattribute_id' => '194', + 'ezcontentobject_attribute_data_type_string' => 'ezsrrating', + 'ezcontentobject_attribute_language_code' => 'eng-GB', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 1 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1332', + 'ezcontentobject_attribute_contentclassattribute_id' => '183', + 'ezcontentobject_attribute_data_type_string' => 'ezstring', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => 'New test article (2)', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => 'new test article (2)', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 2 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1333', + 'ezcontentobject_attribute_contentclassattribute_id' => '184', + 'ezcontentobject_attribute_data_type_string' => 'ezstring', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => 'Something', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => 'something', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 3 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1334', + 'ezcontentobject_attribute_contentclassattribute_id' => '185', + 'ezcontentobject_attribute_data_type_string' => 'ezauthor', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezauthor><authors><author id="0" name="Administrator User" email="kn@ez.no"/></authors></ezauthor> +', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 4 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1335', + 'ezcontentobject_attribute_contentclassattribute_id' => '186', + 'ezcontentobject_attribute_data_type_string' => 'ezxmltext', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '1045487555', + 'ezcontentobject_attribute_data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Something is in here!</paragraph></section> +', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 5 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1336', + 'ezcontentobject_attribute_contentclassattribute_id' => '187', + 'ezcontentobject_attribute_data_type_string' => 'ezxmltext', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '1045487555', + 'ezcontentobject_attribute_data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Something is in here!</paragraph></section> +', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 6 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1337', + 'ezcontentobject_attribute_contentclassattribute_id' => '188', + 'ezcontentobject_attribute_data_type_string' => 'ezboolean', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '1', + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '1', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 7 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1338', + 'ezcontentobject_attribute_contentclassattribute_id' => '189', + 'ezcontentobject_attribute_data_type_string' => 'ezimage', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1313047865"><original attribute_id="1338" attribute_version="1" attribute_language="eng-US"/></ezimage> +', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 8 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1339', + 'ezcontentobject_attribute_contentclassattribute_id' => '190', + 'ezcontentobject_attribute_data_type_string' => 'ezxmltext', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '1045487555', + 'ezcontentobject_attribute_data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"/> +', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 9 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1340', + 'ezcontentobject_attribute_contentclassattribute_id' => '191', + 'ezcontentobject_attribute_data_type_string' => 'ezdatetime', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '0', + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 10 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1341', + 'ezcontentobject_attribute_contentclassattribute_id' => '192', + 'ezcontentobject_attribute_data_type_string' => 'ezdatetime', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '0', + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 11 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1342', + 'ezcontentobject_attribute_contentclassattribute_id' => '193', + 'ezcontentobject_attribute_data_type_string' => 'ezkeyword', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), + 12 => + array ( + 'ezcontentobject_id' => '226', + 'ezcontentobject_contentclass_id' => '16', + 'ezcontentobject_section_id' => '1', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '95a226fb62c1533f60c16c3769bc7c6c', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1313061404', + 'ezcontentobject_published' => '1313047907', + 'ezcontentobject_status' => '1', + 'ezcontentobject_name' => 'Something', + 'ezcontentobject_language_mask' => '2', + 'ezcontentobject_version_id' => '676', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1313061404', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1313061317', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '226', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '1343', + 'ezcontentobject_attribute_contentclassattribute_id' => '194', + 'ezcontentobject_attribute_data_type_string' => 'ezsrrating', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '2', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => NULL, + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_name_name' => 'Something', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_tree_main_node_id' => '228', + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_multiple_versions.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_multiple_versions.php new file mode 100644 index 0000000..9820806 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_multiple_versions.php @@ -0,0 +1,156 @@ +<?php + +return array ( + 0 => + array ( + 'ezcontentobject_id' => '11', + 'ezcontentobject_contentclass_id' => '3', + 'ezcontentobject_section_id' => '2', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1311154215', + 'ezcontentobject_published' => '1033920746', + 'ezcontentobject_status' => '1', + 'ezcontentobject_version_id' => '439', + 'ezcontentobject_name' => 'Members', + 'ezcontentobject_language_mask' => '3', + 'ezcontentobject_name_name' => 'Guest accounts', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_version_version' => '1', + 'ezcontentobject_version_modified' => '1033920746', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1033920737', + 'ezcontentobject_version_status' => '3', + 'ezcontentobject_version_contentobject_id' => '11', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '22', + 'ezcontentobject_attribute_contentclassattribute_id' => '6', + 'ezcontentobject_attribute_data_type_string' => 'ezstring', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '3', + 'ezcontentobject_attribute_version' => '1', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '0', + 'ezcontentobject_attribute_data_text' => 'Guest accounts', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_tree_main_node_id' => NULL, + ), + 1 => + array ( + 'ezcontentobject_id' => '11', + 'ezcontentobject_contentclass_id' => '3', + 'ezcontentobject_section_id' => '2', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1311154215', + 'ezcontentobject_published' => '1033920746', + 'ezcontentobject_status' => '1', + 'ezcontentobject_version_id' => '439', + 'ezcontentobject_name' => 'Members', + 'ezcontentobject_language_mask' => '3', + 'ezcontentobject_name_name' => 'Guest accounts', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_version_version' => '1', + 'ezcontentobject_version_modified' => '1033920746', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1033920737', + 'ezcontentobject_version_status' => '3', + 'ezcontentobject_version_contentobject_id' => '11', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '23', + 'ezcontentobject_attribute_contentclassattribute_id' => '7', + 'ezcontentobject_attribute_data_type_string' => 'ezstring', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '3', + 'ezcontentobject_attribute_version' => '1', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '0', + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_tree_main_node_id' => NULL, + ), + 2 => + array ( + 'ezcontentobject_id' => '11', + 'ezcontentobject_contentclass_id' => '3', + 'ezcontentobject_section_id' => '2', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1311154215', + 'ezcontentobject_published' => '1033920746', + 'ezcontentobject_status' => '1', + 'ezcontentobject_version_id' => '674', + 'ezcontentobject_name' => 'Members', + 'ezcontentobject_language_mask' => '3', + 'ezcontentobject_name_name' => 'Members', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1311154215', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1311154215', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '11', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '22', + 'ezcontentobject_attribute_contentclassattribute_id' => '6', + 'ezcontentobject_attribute_data_type_string' => 'ezstring', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '3', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '0', + 'ezcontentobject_attribute_data_text' => 'Members', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => 'members', + 'ezcontentobject_tree_main_node_id' => '12', + ), + 3 => + array ( + 'ezcontentobject_id' => '11', + 'ezcontentobject_contentclass_id' => '3', + 'ezcontentobject_section_id' => '2', + 'ezcontentobject_owner_id' => '14', + 'ezcontentobject_remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'ezcontentobject_current_version' => '2', + 'ezcontentobject_initial_language_id' => '2', + 'ezcontentobject_modified' => '1311154215', + 'ezcontentobject_published' => '1033920746', + 'ezcontentobject_status' => '1', + 'ezcontentobject_version_id' => '674', + 'ezcontentobject_name' => 'Members', + 'ezcontentobject_language_mask' => '3', + 'ezcontentobject_name_name' => 'Members', + 'ezcontentobject_name_content_translation' => 'eng-US', + 'ezcontentobject_version_version' => '2', + 'ezcontentobject_version_modified' => '1311154215', + 'ezcontentobject_version_creator_id' => '14', + 'ezcontentobject_version_created' => '1311154215', + 'ezcontentobject_version_status' => '1', + 'ezcontentobject_version_contentobject_id' => '11', + 'ezcontentobject_version_language_mask' => '3', + 'ezcontentobject_version_initial_language_id' => '2', + 'ezcontentobject_attribute_id' => '23', + 'ezcontentobject_attribute_contentclassattribute_id' => '7', + 'ezcontentobject_attribute_data_type_string' => 'ezstring', + 'ezcontentobject_attribute_language_code' => 'eng-US', + 'ezcontentobject_attribute_language_id' => '3', + 'ezcontentobject_attribute_version' => '2', + 'ezcontentobject_attribute_data_float' => '0.0', + 'ezcontentobject_attribute_data_int' => '0', + 'ezcontentobject_attribute_data_text' => '', + 'ezcontentobject_attribute_sort_key_int' => '0', + 'ezcontentobject_attribute_sort_key_string' => '', + 'ezcontentobject_tree_main_node_id' => '12', + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php new file mode 100644 index 0000000..9ca7121 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/extract_content_from_rows_result.php @@ -0,0 +1,172 @@ +<?php + +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\ContentInfo; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldValue; +use eZ\Publish\SPI\Persistence\Content\Location; +use eZ\Publish\SPI\Persistence\Content\VersionInfo; + +$content = new Content(); + +$content->fields = array(); + +$versionInfo = new VersionInfo(); +$versionInfo->id = 676; +$versionInfo->names = array( 'eng-US' => 'Something' ); +$versionInfo->versionNo = 2; +$versionInfo->modificationDate = 1313061404; +$versionInfo->creatorId = 14; +$versionInfo->creationDate = 1313061317; +$versionInfo->status = 1; +$versionInfo->initialLanguageCode = 'eng-US'; +$versionInfo->languageIds = array( 2 ); + +$versionInfo->contentInfo = new ContentInfo(); +$versionInfo->contentInfo->id = 226; +$versionInfo->contentInfo->contentTypeId = 16; +$versionInfo->contentInfo->sectionId = 1; +$versionInfo->contentInfo->ownerId = 14; +$versionInfo->contentInfo->remoteId = '95a226fb62c1533f60c16c3769bc7c6c'; +$versionInfo->contentInfo->alwaysAvailable = false; +$versionInfo->contentInfo->modificationDate = 1313061404; +$versionInfo->contentInfo->publicationDate = 1313047907; +$versionInfo->contentInfo->currentVersionNo = 2; +$versionInfo->contentInfo->isPublished = true; +$versionInfo->contentInfo->mainLanguageCode = 'eng-US'; +$versionInfo->contentInfo->name = 'Something'; +$versionInfo->contentInfo->mainLocationId = 228; + +$content->versionInfo = $versionInfo; + +$field = new Field(); +$field->id = 4000; +$field->fieldDefinitionId = 194; +$field->type = 'ezsrrating'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-GB'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1332; +$field->fieldDefinitionId = 183; +$field->type = 'ezstring'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1333; +$field->fieldDefinitionId = 184; +$field->type = 'ezstring'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1334; +$field->fieldDefinitionId = 185; +$field->type = 'ezauthor'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1335; +$field->fieldDefinitionId = 186; +$field->type = 'ezxmltext'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1336; +$field->fieldDefinitionId = 187; +$field->type = 'ezxmltext'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1337; +$field->fieldDefinitionId = 188; +$field->type = 'ezboolean'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1338; +$field->fieldDefinitionId = 189; +$field->type = 'ezimage'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1339; +$field->fieldDefinitionId = 190; +$field->type = 'ezxmltext'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1340; +$field->fieldDefinitionId = 191; +$field->type = 'ezdatetime'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1341; +$field->fieldDefinitionId = 192; +$field->type = 'ezdatetime'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1342; +$field->fieldDefinitionId = 193; +$field->type = 'ezkeyword'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +$field = new Field(); +$field->id = 1343; +$field->fieldDefinitionId = 194; +$field->type = 'ezsrrating'; +$field->value = new FieldValue(); +$field->languageCode = 'eng-US'; +$field->versionNo = 2; + +$content->fields[] = $field; + +return $content; diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/languages.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/languages.php new file mode 100644 index 0000000..a5070c9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/languages.php @@ -0,0 +1,8 @@ +<?php + +return array( + 'ezcontent_language' => array( + array('disabled'=>0,'id'=>2,'locale'=>'eng-US','name'=>'English (American)'), + array('disabled'=>0,'id'=>4,'locale'=>'eng-GB','name'=>'English (United Kingdom)') + ) +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/objectstates.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/objectstates.php new file mode 100644 index 0000000..fc0e578 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/objectstates.php @@ -0,0 +1,801 @@ +<?php + +return array( + 'ezcobj_state_group' => array( + array( + 'default_language_id' => 2, + 'id' => 2, + 'identifier' => 'ez_lock', + 'language_mask' => 3 + ), + ), + + 'ezcobj_state_group_language' => array( + array( + 'contentobject_state_group_id' => 2, + 'description' => '', + 'language_id' => 3, + 'real_language_id' => 2, + 'name' => 'Lock' + ), + ), + + 'ezcobj_state' => array( + array( + 'default_language_id' => 2, + 'group_id' => 2, + 'id' => 1, + 'identifier' => 'not_locked', + 'language_mask' => 3, + 'priority' => 0 + ), + + array( + 'default_language_id' => 2, + 'group_id' => 2, + 'id' => 2, + 'identifier' => 'locked', + 'language_mask' => 3, + 'priority' => 1 + ), + ), + + 'ezcobj_state_language' => array( + array( + 'contentobject_state_id' => 1, + 'description' => '', + 'language_id' => 3, + 'name' => 'Not locked' + ), + + array( + 'contentobject_state_id' => 2, + 'description' => '', + 'language_id' => 3, + 'name' => 'Locked' + ), + ), + + 'ezcobj_state_link' => array( + array( + 'contentobject_id' => 4, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 10, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 11, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 12, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 13, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 14, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 41, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 42, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 45, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 49, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 50, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 51, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 52, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 54, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 56, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 57, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 58, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 59, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 60, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 61, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 62, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 63, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 64, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 65, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 66, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 67, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 68, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 69, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 70, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 71, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 72, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 73, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 74, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 75, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 76, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 77, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 78, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 79, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 80, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 81, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 82, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 83, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 84, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 85, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 86, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 87, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 88, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 89, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 90, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 91, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 92, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 93, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 94, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 95, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 96, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 97, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 98, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 99, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 100, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 101, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 102, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 103, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 104, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 105, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 106, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 107, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 108, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 109, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 110, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 111, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 112, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 113, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 114, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 115, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 116, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 117, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 118, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 119, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 120, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 121, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 122, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 123, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 124, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 125, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 126, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 127, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 128, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 129, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 130, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 131, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 132, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 133, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 134, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 135, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 136, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 137, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 138, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 139, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 140, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 141, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 142, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 143, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 144, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 145, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 146, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 147, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 148, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 149, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 150, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 151, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 152, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 153, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 154, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 155, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 156, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 157, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 158, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 159, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 160, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 161, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 162, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 163, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 164, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 165, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 166, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 167, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 168, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 169, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 170, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 171, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 172, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 173, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 174, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 175, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 176, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 177, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 178, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 179, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 180, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 181, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 182, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 183, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 184, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 185, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 186, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 187, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 188, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 189, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 190, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 191, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 192, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 193, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 194, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 195, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 196, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 197, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 198, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 199, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 200, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 201, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 202, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 203, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 204, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 205, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 206, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 207, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 208, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 209, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 210, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 211, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 212, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 213, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 214, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 215, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 216, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 217, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 218, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 219, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 220, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 221, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 222, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 223, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 224, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 225, + 'contentobject_state_id' => 1 + ), + array( + 'contentobject_id' => 226, + 'contentobject_state_id' => 1 + ) + ) +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_data.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_data.php new file mode 100644 index 0000000..e375982 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_data.php @@ -0,0 +1,18 @@ +<?php +return array( + 'ezcontentobject_link' => array ( + array( 'contentclassattribute_id' => '0', 'from_contentobject_id' => '57', 'from_contentobject_version' => '1', 'id' => '2', 'op_code' => '0', 'relation_type' => '1', 'to_contentobject_id' => '58' ), + array( 'contentclassattribute_id' => '0', 'from_contentobject_id' => '57', 'from_contentobject_version' => '2', 'id' => '8', 'op_code' => '0', 'relation_type' => '1', 'to_contentobject_id' => '58' ), + array( 'contentclassattribute_id' => '0', 'from_contentobject_id' => '57', 'from_contentobject_version' => '2', 'id' => '9', 'op_code' => '0', 'relation_type' => '2', 'to_contentobject_id' => '59' ), + array( 'contentclassattribute_id' => '0', 'from_contentobject_id' => '57', 'from_contentobject_version' => '2', 'id' => '10', 'op_code' => '0', 'relation_type' => '4', 'to_contentobject_id' => '60' ), + array( 'contentclassattribute_id' => '0', 'from_contentobject_id' => '61', 'from_contentobject_version' => '1', 'id' => '12', 'op_code' => '0', 'relation_type' => '2', 'to_contentobject_id' => '58' ), + ), + 'ezcontentobject' => array ( + array( 'contentclass_id' => '16', 'current_version' => '2', 'id' => '57', 'initial_language_id' => '2', 'language_mask' => '2', 'modified' => '1331139665', 'name' => 'Source object 1', 'owner_id' => '14', 'published' => '1331139554', 'remote_id' => '23e48f5c29729a227307853c9663b1b8', 'section_id' => '1', 'status' => '1' ), + array( 'contentclass_id' => '16', 'current_version' => '1', 'id' => '58', 'initial_language_id' => '2', 'language_mask' => '2', 'modified' => '1331139512', 'name' => 'Destination object A', 'owner_id' => '14', 'published' => '1331139512', 'remote_id' => '522539d6713ad28b3c891c11a5e7b890', 'section_id' => '1', 'status' => '1' ), + array( 'contentclass_id' => '16', 'current_version' => '1', 'id' => '59', 'initial_language_id' => '2', 'language_mask' => '2', 'modified' => '1331139569', 'name' => 'Destination object B', 'owner_id' => '14', 'published' => '1331139569', 'remote_id' => '4eb28b942892635bc8ad85115e01fd70', 'section_id' => '1', 'status' => '1' ), + array( 'contentclass_id' => '16', 'current_version' => '1', 'id' => '60', 'initial_language_id' => '2', 'language_mask' => '2', 'modified' => '1331139582', 'name' => 'Destination object C', 'owner_id' => '14', 'published' => '1331139582', 'remote_id' => '9cf4f2eea95df63686b51d92153522b7', 'section_id' => '1', 'status' => '1' ), + array( 'contentclass_id' => '16', 'current_version' => '1', 'id' => '61', 'initial_language_id' => '2', 'language_mask' => '2', 'modified' => '1331139995', 'name' => 'Source object 2', 'owner_id' => '14', 'published' => '1331139995', 'remote_id' => 'cdf3381ee45b89007dcdff20489403d5', 'section_id' => '1', 'status' => '1' ), + ), +); + diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_results.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_results.php new file mode 100644 index 0000000..d7541b9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_results.php @@ -0,0 +1,11 @@ +<?php +use eZ\Publish\SPI\Persistence\Content\Relation; + +$relation = new Relation(); +$relation->id = 1; +$relation->sourceContentId = 1; +$relation->sourceContentVersionNo = 1; +$relation->type = 1; +$relation->destinationContentId = 2; + +return array( 1 => $relation ); \ No newline at end of file diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_rows.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_rows.php new file mode 100644 index 0000000..f2781b3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/relations_rows.php @@ -0,0 +1,13 @@ +<?php + +return array( + array( + 'ezcontentobject_link_id' => 1, + 'ezcontentobject_link_contentclassattribute_id' => 0, + 'ezcontentobject_link_from_contentobject_id' => 1, + 'ezcontentobject_link_from_contentobject_version' => 1, + 'ezcontentobject_link_op_code' => 0, + 'ezcontentobject_link_relation_type' => 1, + 'ezcontentobject_link_to_contentobject_id' => 2 + ), +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/sections.php b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/sections.php new file mode 100644 index 0000000..c565418 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/Content/_fixtures/sections.php @@ -0,0 +1,53 @@ +<?php + +return array( + 'ezsection' => array( + array( + 'id' => 1, + 'identifier' => 'standard', + 'locale' => '', + 'name' => 'Standard', + 'navigation_part_identifier' => 'ezcontentnavigationpart' + ), + + array( + 'id' => 2, + 'identifier' => 'users', + 'locale' => '', + 'name' => 'Users', + 'navigation_part_identifier' => 'ezusernavigationpart' + ), + + array( + 'id' => 3, + 'identifier' => 'media', + 'locale' => '', + 'name' => 'Media', + 'navigation_part_identifier' => 'ezmedianavigationpart' + ), + + array( + 'id' => 4, + 'identifier' => 'setup', + 'locale' => '', + 'name' => 'Setup', + 'navigation_part_identifier' => 'ezsetupnavigationpart' + ), + + array( + 'id' => 5, + 'identifier' => 'design', + 'locale' => '', + 'name' => 'Design', + 'navigation_part_identifier' => 'ezvisualnavigationpart' + ), + + array( + 'id' => 6, + 'identifier' => '', + 'locale' => '', + 'name' => 'Restricted', + 'navigation_part_identifier' => 'ezcontentnavigationpart' + ) + ) +); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/HandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/HandlerTest.php new file mode 100644 index 0000000..91e4cdb --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/HandlerTest.php @@ -0,0 +1,441 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Base\ConfigurationManager; +use eZ\Publish\Core\Base\ServiceContainer; +use eZ\Publish\Core\Persistence\Legacy\Handler; + +/** + * Test case for Repository Handler + */ +class HandlerTest extends TestCase +{ + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::contentHandler + * + * @return void + */ + public function testContentHandler() + { + $handler = $this->getHandlerFixture(); + $contentHandler = $handler->contentHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Handler', + $contentHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Handler', + $contentHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::contentHandler + * + * @return void + */ + public function testContentHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->contentHandler(), + $handler->contentHandler() + ); + } + + /** + * Issue #97 + * + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::contentHandler + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::getStorageRegistry + * + * @return void + */ + public function testStorageRegistryReused() + { + $handler = $this->getHandlerFixture(); + + $storageRegistry = $handler->getStorageRegistry(); + $contentHandler = $handler->contentHandler(); + $fieldHandler = $this->readAttribute( + $contentHandler, + 'fieldHandler' + ); + $storageHandler = $this->readAttribute( + $fieldHandler, + 'storageHandler' + ); + + $this->assertAttributeSame( + $storageRegistry, + 'storageRegistry', + $storageHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::getFieldValueConverterRegistry + * + * @return void + */ + public function testGetFieldValueConverterRegistry() + { + $handler = $this->getHandlerFixture(); + $registry = $handler->getFieldValueConverterRegistry(); + + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\FieldValue\\ConverterRegistry', + $registry + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::getFieldValueConverterRegistry + * + * @return void + */ + public function testGetFieldValueConverterRegistryTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->getFieldValueConverterRegistry(), + $handler->getFieldValueConverterRegistry() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::getStorageRegistry + * + * @return void + */ + public function testGetStorageRegistry() + { + $handler = $this->getHandlerFixture(); + $registry = $handler->getStorageRegistry(); + + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\StorageRegistry', + $registry + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::getStorageRegistry + * + * @return void + */ + public function testGetStorageRegistryTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->getStorageRegistry(), + $handler->getStorageRegistry() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::searchHandler + * + * @return void + */ + public function testSearchHandler() + { + $handler = $this->getHandlerFixture(); + $searchHandler = $handler->searchHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Search\\Handler', + $searchHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Search\\Handler', + $searchHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::searchHandler + * + * @return void + */ + public function testSearchHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->searchHandler(), + $handler->searchHandler() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::contentTypeHandler + * + * @return void + */ + public function testContentTypeHandler() + { + $handler = $this->getHandlerFixture(); + $contentTypeHandler = $handler->contentTypeHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Type\\Handler', + $contentTypeHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Type\\Handler', + $contentTypeHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::contentLanguageHandler + * + * @return void + */ + public function testContentLanguageHandler() + { + $handler = $this->getHandlerFixture(); + $contentLanguageHandler = $handler->contentLanguageHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Language\\Handler', + $contentLanguageHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::contentTypeHandler + * + * @return void + */ + public function testContentTypeHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->contentTypeHandler(), + $handler->contentTypeHandler() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::locationHandler + * + * @return void + */ + public function testLocationHandler() + { + $handler = $this->getHandlerFixture(); + $locationHandler = $handler->locationHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Location\\Handler', + $locationHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Location\\Handler', + $locationHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::locationHandler + * + * @return void + */ + public function testLocationHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->locationHandler(), + $handler->locationHandler() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::userHandler + * + * @return void + */ + public function testUserHandler() + { + $handler = $this->getHandlerFixture(); + $userHandler = $handler->userHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\User\\Handler', + $userHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\User\\Handler', + $userHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::userHandler + * + * @return void + */ + public function testUserHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->userHandler(), + $handler->userHandler() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::sectionHandler + * + * @return void + */ + public function testSectionHandler() + { + $handler = $this->getHandlerFixture(); + $sectionHandler = $handler->sectionHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\Section\\Handler', + $sectionHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Section\\Handler', + $sectionHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::sectionHandler + * + * @return void + */ + public function testSectionHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->sectionHandler(), + $handler->sectionHandler() + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::urlAliasHandler + * + * @return void + */ + public function testUrlAliasHandler() + { + $handler = $this->getHandlerFixture(); + $urlAliasHandler = $handler->urlAliasHandler(); + + $this->assertInstanceOf( + 'eZ\\Publish\\SPI\\Persistence\\Content\\UrlAlias\\Handler', + $urlAliasHandler + ); + $this->assertInstanceOf( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\UrlAlias\\Handler', + $urlAliasHandler + ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\Handler::urlAliasHandler + * + * @return void + */ + public function testUrlAliasHandlerTwice() + { + $handler = $this->getHandlerFixture(); + + $this->assertSame( + $handler->urlAliasHandler(), + $handler->urlAliasHandler() + ); + } + + /** + * Returns the Handler + * + * @return Handler + */ + protected function getHandlerFixture() + { + // get configuration config + if ( !( $settings = include 'config.php' ) ) + { + throw new \RuntimeException( 'Could not find config.php, please copy config.php-DEVELOPMENT to config.php customize to your needs!' ); + } + + // load configuration uncached + $configManager = new ConfigurationManager( + array_merge_recursive( + $settings, + array( + 'base' => array( + 'Configuration' => array( + 'UseCache' => false + ) + ) + ) + ), + $settings['base']['Configuration']['Paths'] + ); + + $serviceSettings = $configManager->getConfiguration( 'service' )->getAll(); + $serviceSettings['legacy_db_handler']['arguments']['dsn'] = $this->getDsn(); + $sc = new ServiceContainer( + $serviceSettings, + array() + ); + + return $sc->get( 'persistence_handler_legacy' ); + } + + /** + * @covers eZ\Publish\Core\Persistence\Legacy\EzcDbHandler::create + * + * @return void + */ + public function testDatabaseInstance() + { + $method = new \ReflectionProperty( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Handler', + 'dbHandler' + ); + $method->setAccessible( true ); + + $dbHandler = $method->getValue( $this->getHandlerFixture() ); + $className = get_class( $this->getDatabaseHandler() ); + + $this->assertTrue( $dbHandler instanceof $className, get_class( $dbHandler ) . " not of type $className." ); + } + + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/TestCase.php b/eZ/Publish/Core/Persistence/Legacy/Tests/TestCase.php new file mode 100644 index 0000000..e559aa1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/TestCase.php @@ -0,0 +1,361 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\TestCase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests; + +use eZ\Publish\Core\Persistence\Legacy\EzcDbHandler; +use ezcQuerySelect; + +/** + * Base test case for database related tests + */ +abstract class TestCase extends \PHPUnit_Framework_TestCase +{ + /** + * DSN used for the DB backend + * + * @var string + */ + protected $dsn; + + /** + * Name of the DB, extracted from DSN + * + * @var string + */ + protected $db; + + /** + * Database handler -- to not be constructed twice for one test + * + * @var \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + protected $handler; + + /** + * Property which holds the state if this is the initial test run, so that + * we should set up the database, or if this is any of the following test + * runs, where it is sufficient to reset the database. + */ + protected static $initial = true; + + /** + * Get data source name + * + * The database connection string is read from an optional environment + * variable "DATABASE" and defaults to an in-memory SQLite database. + * + * @return string + */ + protected function getDsn() + { + if ( !$this->dsn ) + { + $this->dsn = getenv( "DATABASE" ); + if ( !$this->dsn ) + $this->dsn = "sqlite://:memory:"; + $this->db = preg_replace( '(^([a-z]+).*)', '\\1', $this->dsn ); + } + + return $this->dsn; + } + + /** + * Get a ezcDbHandler + * + * Get a ezcDbHandler, which can be used to interact with the configured + * database. The database connection string is read from an optional + * environment variable "DATABASE" and defaults to an in-memory SQLite + * database. + * + * @return \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler + */ + public function getDatabaseHandler() + { + if ( !$this->handler ) + { + $this->handler = EzcDbHandler::create( $this->getDsn() ); + } + + return $this->handler; + } + + /** + * Resets the database on test setup, so we always operate on a clean + * database. + * + * @return void + */ + public function setUp() + { + if ( !class_exists( 'ezcBase' ) ) + { + $this->markTestSkipped( 'Missing Apache Zeta Components.' ); + } + + try + { + $handler = $this->getDatabaseHandler(); + } + catch ( \PDOException $e ) + { + $this->markTestSkipped( + 'PDO session could not be created: ' . $e->getMessage() + ); + } + + $schema = __DIR__ . '/_fixtures/schema.' . $this->db . '.sql'; + + $queries = array_filter( preg_split( '(;\\s*$)m', file_get_contents( $schema ) ) ); + foreach ( $queries as $query ) + { + $handler->exec( $query ); + } + + $this->resetSequences(); + + // Set "global" static var, that we are behind the initial run + self::$initial = false; + } + + protected function tearDown() + { + unset( $this->handler ); + } + + /** + * Get a text representation of a result set + * + * @param array $result + * + * @return string + */ + protected static function getResultTextRepresentation( array $result ) + { + return implode( + "\n", + array_map( + function ( $row ) + { + return implode( ', ', $row ); + }, + $result + ) + ); + } + + /** + * Inserts database fixture from $file. + * + * @param string $file + * + * @return void + */ + protected function insertDatabaseFixture( $file ) + { + $data = require $file; + $db = $this->getDatabaseHandler(); + + foreach ( $data as $table => $rows ) + { + // Check that at least one row exists + if ( !isset( $rows[0] ) ) + { + continue; + } + + $q = $db->createInsertQuery(); + $q->insertInto( $db->quoteIdentifier( $table ) ); + + // Contains the bound parameters + $values = array(); + + // Binding the parameters + foreach ( $rows[0] as $col => $val ) + { + $q->set( + $db->quoteIdentifier( $col ), + $q->bindParam( $values[$col] ) + ); + } + + $stmt = $q->prepare(); + + foreach ( $rows as $row ) + { + try + { + // This CANNOT be replaced by: + // $values = $row + // each $values[$col] is a PHP reference which should be + // kept for parameters binding to work + foreach ( $row as $col => $val ) + { + $values[$col] = $val; + } + + $stmt->execute(); + } + catch ( \Exception $e ) + { + echo "$table ( ", implode( ', ', $row ), " )\n"; + throw $e; + } + } + } + + $this->resetSequences(); + } + + /** + * Reset DB sequences + * + * @return void + */ + public function resetSequences() + { + switch ( $this->db ) + { + case 'pgsql': + // Update PostgreSQL sequences + $handler = $this->getDatabaseHandler(); + + $queries = array_filter( preg_split( '(;\\s*$)m', file_get_contents( __DIR__ . '/_fixtures/setval.pgsql.sql' ) ) ); + foreach ( $queries as $query ) + { + $handler->exec( $query ); + } + } + } + + /** + * Assert query result as correct + * + * Builds text representations of the asserted and fetched query result, + * based on a ezcQuerySelect object. Compares them using classic diff for + * maximum readability of the differences between expectations and real + * results. + * + * The expectation MUST be passed as a two dimensional array containing + * rows of columns. + * + * @param array $expectation + * @param \ezcQuerySelect $query + * @param string $message + * + * @return void + */ + public static function assertQueryResult( array $expectation, ezcQuerySelect $query, $message = null ) + { + $statement = $query->prepare(); + $statement->execute(); + + $result = array(); + while ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + $result[] = $row; + } + + return self::assertEquals( + self::getResultTextRepresentation( $expectation ), + self::getResultTextRepresentation( $result ), + $message + ); + } + + /** + * Asserts correct property values on $object. + * + * Asserts that for all keys in $properties a corresponding property + * exists in $object with the *same* value as in $properties. + * + * @param array $properties + * @param object $object + * + * @return void + */ + protected function assertPropertiesCorrect( array $properties, $object ) + { + if ( !is_object( $object ) ) + { + throw new \InvalidArgumentException( + 'Expected object as second parameter, received ' . gettype( $object ) + ); + } + foreach ( $properties as $propName => $propVal ) + { + $this->assertSame( + $propVal, + $object->$propName, + "Incorrect value for \${$propName}" + ); + } + } + + /** + * Asserts $expStruct equals $actStruct in at least $propertyNames + * + * Asserts that properties of $actStruct equal properties of $expStruct (not + * vice versa!). If $propertyNames is null, all properties are checked. + * Otherwise, $propertyNames provides a white list. + * + * @param object $expStruct + * @param object $actStruct + * @param array $propertyNames + */ + protected function assertStructsEqual( + $expStruct, $actStruct, array $propertyNames = null ) + { + if ( $propertyNames === null ) + { + $propertyNames = $this->getPublicPropertyNames( $expStruct ); + } + foreach ( $propertyNames as $propName ) + { + $this->assertEquals( + $expStruct->$propName, + $actStruct->$propName, + "Properties \${$propName} not same" + ); + } + } + + /** + * Returns public property names in $object + * + * @param object $object + * + * @return array + */ + protected function getPublicPropertyNames( $object ) + { + $refl = new ReflectionObject( $object ); + return array_map( + function ( $prop ) + { + return $prop->getName(); + }, + $refl->getProperties( ReflectionProperty::IS_PUBLIC ) + ); + } + + /** + * @return string + */ + static protected function getInstallationDir() + { + static $installDir = null; + if ( $installDir === null ) + { + $config = require 'config.php'; + $installDir = $config['service']['parameters']['install_dir']; + } + return $installDir; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/User/UserHandlerTest.php b/eZ/Publish/Core/Persistence/Legacy/Tests/User/UserHandlerTest.php new file mode 100644 index 0000000..28c7bb7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/User/UserHandlerTest.php @@ -0,0 +1,1003 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\User\UserHandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\Tests\User; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy\User; +use eZ\Publish\SPI\Persistence; + +/** + * Test case for UserHandlerTest + */ +class UserHandlerTest extends TestCase +{ + /** + * Returns the test suite with all tests declared in this class. + * + * @return \PHPUnit_Framework_TestSuite + */ + public static function suite() + { + return new \PHPUnit_Framework_TestSuite( __CLASS__ ); + } + + protected function getUserHandler() + { + $dbHandler = $this->getDatabaseHandler(); + return new User\Handler( + new User\Gateway\EzcDatabase( $dbHandler ), + new User\Role\Gateway\EzcDatabase( $dbHandler ), + new User\Mapper() + ); + } + + protected function getValidUser() + { + $user = new Persistence\User(); + $user->id = 42; + $user->login = 'kore'; + $user->email = 'kore@example.org'; + $user->passwordHash = '1234567890'; + $user->hashAlgorithm = 2; + $user->isEnabled = true; + $user->maxLogin = 23; + + return $user; + } + + public function testCreateUser() + { + $handler = $this->getUserHandler(); + + $handler->create( $this->getValidUser() ); + $this->assertQueryResult( + array( array( 1 ) ), + $this->handler->createSelectQuery()->select( 'COUNT( * )' )->from( 'ezuser' ), + 'Expected one user to be created.' + ); + + $this->assertQueryResult( + array( array( 1 ) ), + $this->handler->createSelectQuery()->select( 'COUNT( * )' )->from( 'ezuser_setting' ), + 'Expected one user setting to be created.' + ); + } + + /** + * @expectedException \PDOException + */ + public function testCreateDuplicateUser() + { + $handler = $this->getUserHandler(); + + $handler->create( $user = $this->getValidUser() ); + $handler->create( $user ); + } + + /** + * @expectedException \PDOException + */ + public function testInsertIncompleteUser() + { + $handler = $this->getUserHandler(); + + $user = new Persistence\User(); + $user->id = 42; + + $handler->create( $user ); + } + + public function testLoadUser() + { + $handler = $this->getUserHandler(); + $handler->create( $user = $this->getValidUser() ); + + $this->assertEquals( + $user, + $handler->load( $user->id ) + ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadUnknownUser() + { + $handler = $this->getUserHandler(); + + $handler->load( 1337 ); + } + + public function testLoadUserByLogin() + { + $handler = $this->getUserHandler(); + $handler->create( $user = $this->getValidUser() ); + + $users = $handler->loadByLogin( $user->login ); + $this->assertEquals( + $user, + $users[0] + ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadUserByEmailNotFound() + { + $handler = $this->getUserHandler(); + $handler->create( $user = $this->getValidUser() ); + + $handler->loadByLogin( $user->email ); + } + + public function testLoadUserByEmail() + { + $handler = $this->getUserHandler(); + $handler->create( $user = $this->getValidUser() ); + + $users = $handler->loadByLogin( $user->email, true ); + $this->assertEquals( + $user, + $users[0] + ); + } + + public function testCreateAndDeleteUser() + { + $handler = $this->getUserHandler(); + + $handler->create( $user = $this->getValidUser() ); + $this->assertQueryResult( + array( array( 1 ) ), + $this->handler->createSelectQuery()->select( 'COUNT( * )' )->from( 'ezuser' ), + 'Expected one user to be created.' + ); + + $handler->delete( $user->id ); + $this->assertQueryResult( + array( array( 0 ) ), + $this->handler->createSelectQuery()->select( 'COUNT( * )' )->from( 'ezuser' ), + 'Expected one user to be removed.' + ); + } + + public function testDeleteNonExistingUser() + { + $handler = $this->getUserHandler(); + + $handler->delete( 1337 ); + $this->assertQueryResult( + array( array( 0 ) ), + $this->handler->createSelectQuery()->select( 'COUNT( * )' )->from( 'ezuser' ), + 'Expected no existing user.' + ); + } + + public function testUpdateUser() + { + $handler = $this->getUserHandler(); + + $handler->create( $user = $this->getValidUser() ); + + $user->login = 'new_login'; + $handler->update( $user ); + + $this->assertQueryResult( + array( array( 42, 'kore@example.org', 'new_login', 1234567890, '2' ) ), + $this->handler->createSelectQuery()->select( '*' )->from( 'ezuser' ), + 'Expected user data to be updated.' + ); + } + + public function testUpdateUserSettings() + { + $handler = $this->getUserHandler(); + + $handler->create( $user = $this->getValidUser() ); + + $user->maxLogin = 42; + $handler->update( $user ); + + $this->assertQueryResult( + array( array( 1, 42, 42 ) ), + $this->handler->createSelectQuery()->select( '*' )->from( 'ezuser_setting' ), + 'Expected user data to be updated.' + ); + } + + public function testSilentlyUpdateNotExistingUser() + { + $handler = $this->getUserHandler(); + $handler->update( $this->getValidUser() ); + $this->assertQueryResult( + array( array( 0 ) ), + $this->handler->createSelectQuery()->select( 'COUNT( * )' )->from( 'ezuser' ), + 'Expected no existing user.' + ); + } + + public function testCreateNewRoleWithoutPolicies() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $handler->createRole( $role ); + + $this->assertQueryResult( + array( array( 1, 'Test' ) ), + $this->handler->createSelectQuery()->select( 'id', 'name' )->from( 'ezrole' ), + 'Expected a new role.' + ); + } + + public function testCreateNewRoleRoleId() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $this->assertSame( '1', $role->id ); + } + + public function testLoadRole() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $this->assertEquals( + $role, + $handler->loadRole( $role->id ) + ); + } + + public function testLoadRoleWithGroups() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $handler->assignRole( 23, $role->id ); + $handler->assignRole( 42, $role->id ); + + $loaded = $handler->loadRole( $role->id ); + $this->assertEquals( + array( 23, 42 ), + $loaded->groupIds + ); + } + + public function testLoadRoleWithPolicies() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + + $handler->addPolicy( $role->id, $policy ); + + $loaded = $handler->loadRole( $role->id ); + $this->assertEquals( + array( + new Persistence\User\Policy( + array( + 'id' => 1, + 'roleId' => 1, + 'module' => 'foo', + 'function' => 'bar', + 'limitations' => '*', + ) + ) + ), + $loaded->policies + ); + } + + public function testLoadRoleWithPoliciesAndGroups() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + + $handler->addPolicy( $role->id, $policy ); + + $handler->assignRole( 23, $role->id ); + $handler->assignRole( 42, $role->id ); + + $loaded = $handler->loadRole( $role->id ); + $this->assertEquals( + array( + new Persistence\User\Policy( + array( + 'id' => 1, + 'roleId' => 1, + 'module' => 'foo', + 'function' => 'bar', + 'limitations' => '*', + ) + ) + ), + $loaded->policies + ); + + $this->assertEquals( + array( 23, 42 ), + $loaded->groupIds + ); + } + + public function testLoadRoleWithPoliciyLimitations() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + $policy->limitations = array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ); + + $handler->addPolicy( $role->id, $policy ); + + $loaded = $handler->loadRole( $role->id ); + $this->assertEquals( + array( + new Persistence\User\Policy( + array( + 'id' => 1, + 'roleId' => 1, + 'module' => 'foo', + 'function' => 'bar', + 'limitations' => array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ), + ) + ) + ), + $loaded->policies + ); + } + + public function testLoadRoles() + { + $handler = $this->getUserHandler(); + + $this->assertEquals( + array(), + $handler->loadRoles() + ); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $this->assertEquals( + array( $role ), + $handler->loadRoles() + ); + } + + public function testUpdateRole() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + + $role = $handler->createRole( $role ); + + $update = new Persistence\User\RoleUpdateStruct(); + $update->id = $role->id; + $update->identifier = 'Changed'; + + $handler->updateRole( $update ); + + $this->assertQueryResult( + array( array( 1, 'Changed' ) ), + $this->handler->createSelectQuery()->select( 'id', 'name' )->from( 'ezrole' ), + 'Expected a changed role.' + ); + } + + public function testDeleteRole() + { + $this->insertDatabaseFixture( __DIR__ . '/../../../../Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php' ); + $handler = $this->getUserHandler(); + + // 3 is the ID of Editor role + $handler->deleteRole( 3 ); + + $this->assertQueryResult( + array(), + $this->handler->createSelectQuery()->select( "id" )->from( "ezrole" )->where( "id = 3" ), + 'Expected an empty set.' + ); + + $this->assertQueryResult( + array(), + $this->handler->createSelectQuery()->select( "role_id" )->from( "ezpolicy" )->where( "role_id = 3" ), + 'Expected an empty set.' + ); + + $this->assertQueryResult( + array(), + $this->handler->createSelectQuery()->select( "role_id" )->from( "ezuser_role" )->where( "role_id = 3" ), + 'Expected an empty set.' + ); + } + + public function testAddPolicyToRoleLimitations() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + + $handler->addPolicy( $role->id, $policy ); + + $this->assertQueryResult( + array( array( 1, 'foo', 'bar', 1 ) ), + $this->handler->createSelectQuery()->select( 'id', 'module_name', 'function_name', 'role_id' )->from( 'ezpolicy' ), + 'Expected a new policy.' + ); + } + + public function testAddPolicyPolicyId() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + + $policy = $handler->addPolicy( $role->id, $policy ); + + $this->assertEquals( 1, $policy->id ); + } + + public function testAddPolicyLimitations() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + $policy->limitations = array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ); + + $handler->addPolicy( $role->id, $policy ); + + $this->assertQueryResult( + array( + array( 1, 'Subtree', 1 ), + array( 2, 'Foo', 1 ), + ), + $this->handler->createSelectQuery()->select( 'id', 'identifier', 'policy_id' )->from( 'ezpolicy_limitation' ), + 'Expected a new policy.' + ); + } + + public function testAddPolicyLimitationValues() + { + $handler = $this->getUserHandler(); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + $handler->createRole( $role ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo'; + $policy->function = 'bar'; + $policy->limitations = array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ); + + $handler->addPolicy( $role->id, $policy ); + + $this->assertQueryResult( + array( + array( 1, '/1', 1 ), + array( 2, '/1/2', 1 ), + array( 3, 'Bar', 2 ), + ), + $this->handler->createSelectQuery()->select( 'id', 'value', 'limitation_id' )->from( 'ezpolicy_limitation_value' ), + 'Expected a new policy.' + ); + } + + protected function createRole() + { + $handler = $this->getUserHandler(); + + $policy1 = new Persistence\User\Policy(); + $policy1->module = 'foo'; + $policy1->function = 'bar'; + $policy1->limitations = array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ); + + $policy2 = new Persistence\User\Policy(); + $policy2->module = 'foo'; + $policy2->function = 'blubb'; + $policy2->limitations = array( + 'Foo' => array( 'Blubb' ), + ); + + $role = new Persistence\User\Role(); + $role->identifier = 'Test'; + $role->policies = array( $policy1, $policy2 ); + return $handler->createRole( $role ); + } + + public function testImplicitlyCreatePolicies() + { + $this->createRole(); + + $this->assertQueryResult( + array( + array( 1, 'foo', 'bar', 1 ), + array( 2, 'foo', 'blubb', 1 ), + ), + $this->handler->createSelectQuery()->select( 'id', 'module_name', 'function_name', 'role_id' )->from( 'ezpolicy' ), + 'Expected a new policy.' + ); + } + + public function testRemovePolicy() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->removePolicy( $role->id, $role->policies[0]->id ); + + $this->assertQueryResult( + array( + array( 2, 'foo', 'blubb', 1 ), + ), + $this->handler->createSelectQuery()->select( 'id', 'module_name', 'function_name', 'role_id' )->from( 'ezpolicy' ), + 'Expected a new policy.' + ); + } + + public function testRemovePolicyLimitations() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->removePolicy( $role->id, $role->policies[0]->id ); + + $this->assertQueryResult( + array( array( 3, 'Foo', 2 ) ), + $this->handler->createSelectQuery()->select( '*' )->from( 'ezpolicy_limitation' ) + ); + } + + public function testRemovePolicyLimitationValues() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->removePolicy( $role->id, $role->policies[0]->id ); + + $this->assertQueryResult( + array( array( 4, 3, 'Blubb' ) ), + $this->handler->createSelectQuery()->select( '*' )->from( 'ezpolicy_limitation_value' ) + ); + } + + public function testUpdatePolicies() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + + $policy = $role->policies[0]; + $policy->limitations = array( + 'new' => array( 'something' ), + ); + + $handler->updatePolicy( $policy ); + + $this->assertQueryResult( + array( + array( 3, 'Foo', 2 ), + array( 4, 'new', 1 ), + ), + $this->handler->createSelectQuery()->select( '*' )->from( 'ezpolicy_limitation' ) + ); + + $this->assertQueryResult( + array( + array( 4, 3, 'Blubb' ), + array( 5, 4, 'something' ), + ), + $this->handler->createSelectQuery()->select( '*' )->from( 'ezpolicy_limitation_value' ) + ); + } + + public function testAddRoleToUser() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->create( $user = $this->getValidUser() ); + + $handler->assignRole( $user->id, $role->id, array() ); + + $this->assertQueryResult( + array( + array( 1, 42, 1, null, null ), + ), + $this->handler->createSelectQuery()->select( 'id', 'contentobject_id', 'role_id', 'limit_identifier', 'limit_value' )->from( 'ezuser_role' ), + 'Expected a new user policy association.' + ); + } + + public function testAddRoleToUserWithLimitation() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->create( $user = $this->getValidUser() ); + + $handler->assignRole( + $user->id, + $role->id, + array( + 'Subtree' => array( '/1' ), + ) + ); + + $this->assertQueryResult( + array( + array( 1, 42, 1, 'Subtree', '/1' ), + ), + $this->handler->createSelectQuery()->select( 'id', 'contentobject_id', 'role_id', 'limit_identifier', 'limit_value' )->from( 'ezuser_role' ), + 'Expected a new user policy association.' + ); + } + + public function testAddRoleToUserWithComplexLimitation() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->create( $user = $this->getValidUser() ); + + $handler->assignRole( + $user->id, + $role->id, + array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ) + ); + + $this->assertQueryResult( + array( + array( 1, 42, 1, 'Subtree', '/1' ), + array( 2, 42, 1, 'Subtree', '/1/2' ), + array( 3, 42, 1, 'Foo', 'Bar' ), + ), + $this->handler->createSelectQuery()->select( 'id', 'contentobject_id', 'role_id', 'limit_identifier', 'limit_value' )->from( 'ezuser_role' ), + 'Expected a new user policy association.' + ); + } + + public function testRemoveUserRoleAssociation() + { + $handler = $this->getUserHandler(); + + $role = $this->createRole(); + $handler->create( $user = $this->getValidUser() ); + + $handler->assignRole( + $user->id, + $role->id, + array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ) + ); + + $handler->unAssignRole( $user->id, $role->id ); + + $this->assertQueryResult( + array(), + $this->handler->createSelectQuery()->select( 'id', 'contentobject_id', 'role_id', 'limit_identifier', 'limit_value' )->from( 'ezuser_role' ), + 'Expected no user policy associations.' + ); + } + + public function testLoadPoliciesForGroup() + { + $handler = $this->getUserHandler(); + + $role1 = new Persistence\User\Role(); + $role1->identifier = 'Test role 1'; + $handler->createRole( $role1 ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo_1'; + $policy->function = 'blubb'; + $policy->limitations = array( + 'Foo' => array( 'Bar' ), + ); + + $handler->addPolicy( $role1->id, $policy ); + + $role2 = new Persistence\User\Role(); + $role2->identifier = 'Test role 2'; + $handler->createRole( $role2 ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo_1'; + $policy->function = 'bar'; + $policy->limitations = array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ); + + $handler->addPolicy( $role2->id, $policy ); + + $policy = new Persistence\User\Policy(); + $policy->module = 'foo_2'; + $policy->function = 'bar'; + $policy->limitations = array( + 'Subtree' => array( '/1/2/3' ), + ); + + $handler->addPolicy( $role2->id, $policy ); + + $handler->assignRole( 23, $role1->id ); + $handler->assignRole( 23, $role2->id ); + $handler->assignRole( 42, $role2->id ); + + $this->assertEquals( + array( + new Persistence\User\Role( + array( + 'id' => 1, + 'identifier' => 'Test role 1', + 'policies' => array( + new Persistence\User\Policy( + array( + 'id' => 1, + 'roleId' => 1, + 'module' => 'foo_1', + 'function' => 'blubb', + 'limitations' => array( + 'Foo' => array( 'Bar' ), + ), + ) + ), + ), + 'groupIds' => array( 23 ), + ) + ), + new Persistence\User\Role( + array( + 'id' => 2, + 'identifier' => 'Test role 2', + 'policies' => array( + new Persistence\User\Policy( + array( + 'id' => 2, + 'roleId' => 2, + 'module' => 'foo_1', + 'function' => 'bar', + 'limitations' => array( + 'Subtree' => array( '/1', '/1/2' ), + 'Foo' => array( 'Bar' ), + ), + ) + ), + new Persistence\User\Policy( + array( + 'id' => 3, + 'roleId' => 2, + 'module' => 'foo_2', + 'function' => 'bar', + 'limitations' => array( + 'Subtree' => array( '/1/2/3' ), + ), + ) + ), + ), + 'groupIds' => array( 23, 42 ), + ) + ), + ), + $handler->loadRolesByGroupId( 23 ) + ); + } + + public function testLoadPoliciesForUser() + { + $this->insertDatabaseFixture( __DIR__ . '/../../../../Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php' ); + $handler = $this->getUserHandler(); + + $policies = $handler->loadPoliciesByUserId( 10 ); // Anonymous user + + // Verify, that we received an array of Policy objects + $this->assertTrue( + array_reduce( + array_map( + function ( $policy ) + { + return $policy instanceof Persistence\User\Policy; + }, + $policies + ), + function ( $a, $b ) + { + return $a && $b; + }, + true + ) + ); + $this->assertEquals( 8, count( $policies ) ); + } + + public function testLoadRoleAssignmentsByGroupId() + { + $this->insertDatabaseFixture( __DIR__ . '/../../../../Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php' ); + $handler = $this->getUserHandler(); + + $this->assertEquals( + array( + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 1 ), + 'contentId' => 11 + ) + ), + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 5 ), + 'contentId' => 11 + ) + ) + ), + $handler->loadRoleAssignmentsByGroupId( 11 )// 11: Members + ); + + $this->assertEquals( + array( + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 1 ), + 'contentId' => 42 + ) + ) + ), + $handler->loadRoleAssignmentsByGroupId( 42 )// 42: Anonymous Users + ); + + $this->assertEquals( + array(), + $handler->loadRoleAssignmentsByGroupId( 10 )// 10: Anonymous User + ); + } + + public function testLoadRoleAssignmentsByGroupIdInherited() + { + $this->insertDatabaseFixture( __DIR__ . '/../../../../Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php' ); + $handler = $this->getUserHandler(); + + $this->assertEquals( + array( + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 1 ), + 'contentId' => 42 + ) + ) + ), + $handler->loadRoleAssignmentsByGroupId( 10, true )// 10: Anonymous User + ); + } + + public function testLoadComplexRoleAssignments() + { + $this->insertDatabaseFixture( __DIR__ . '/../../../../Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php' ); + $handler = $this->getUserHandler(); + + $this->assertEquals( + array( + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 3 ), + 'contentId' => 13, + 'limitationIdentifier' => 'Subtree', + 'values' => array( '/1/2/', '/1/43/' ) + ) + ), + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 5 ), + 'contentId' => 13 + ) + ) + ), + $handler->loadRoleAssignmentsByGroupId( 13 ) + ); + + $this->assertEquals( + array( + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 3 ), + 'contentId' => 13, + 'limitationIdentifier' => 'Subtree', + 'values' => array( '/1/2/', '/1/43/' ) + ) + ), + new Persistence\User\RoleAssignment( + array( + 'role' => $handler->loadRole( 5 ), + 'contentId' => 13 + ) + ) + ), + $handler->loadRoleAssignmentsByGroupId( 13, true ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.mysql.sql b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.mysql.sql new file mode 100644 index 0000000..d514c01 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.mysql.sql @@ -0,0 +1,736 @@ + +DROP TABLE IF EXISTS ezbinaryfile; +CREATE TABLE ezbinaryfile ( + contentobject_attribute_id int(11) NOT NULL default '0', + download_count int(11) NOT NULL default '0', + filename varchar(255) NOT NULL default '', + mime_type varchar(255) NOT NULL default '', + original_filename varchar(255) NOT NULL default '', + version int(11) NOT NULL default '0', + PRIMARY KEY (contentobject_attribute_id,version) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezimagefile; +CREATE TABLE ezimagefile ( + contentobject_attribute_id int(11) NOT NULL DEFAULT '0', + filepath longtext NOT NULL, + id int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (id), + KEY ezimagefile_coid (contentobject_attribute_id), + KEY ezimagefile_file (filepath(200)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezmedia`; +CREATE TABLE `ezmedia` ( + `contentobject_attribute_id` int(11) NOT NULL DEFAULT '0', + `controls` varchar(50) DEFAULT NULL, + `filename` varchar(255) NOT NULL DEFAULT '', + `has_controller` int(11) DEFAULT '0', + `height` int(11) DEFAULT NULL, + `is_autoplay` int(11) DEFAULT '0', + `is_loop` int(11) DEFAULT '0', + `mime_type` varchar(50) NOT NULL DEFAULT '', + `original_filename` varchar(255) NOT NULL DEFAULT '', + `pluginspage` varchar(255) DEFAULT NULL, + `quality` varchar(50) DEFAULT NULL, + `version` int(11) NOT NULL DEFAULT '0', + `width` int(11) DEFAULT NULL, + PRIMARY KEY (`contentobject_attribute_id`,`version`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS ezcobj_state; +CREATE TABLE ezcobj_state ( + default_language_id int(11) NOT NULL DEFAULT 0, + group_id int(11) NOT NULL DEFAULT 0, + id int(11) NOT NULL auto_increment, + identifier varchar(45) NOT NULL DEFAULT '', + language_mask int(11) NOT NULL DEFAULT 0, + priority int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (id), + UNIQUE KEY ezcobj_state_identifier ( group_id, identifier ), + KEY ezcobj_state_lmask ( language_mask ), + KEY ezcobj_state_priority ( priority ) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezcobj_state_group; +CREATE TABLE ezcobj_state_group ( + default_language_id int(11) NOT NULL DEFAULT 0, + id int(11) NOT NULL auto_increment, + identifier varchar(45) NOT NULL DEFAULT '', + language_mask int(11) NOT NULL DEFAULT 0, + PRIMARY KEY ( id ), + UNIQUE KEY ezcobj_state_group_identifier ( identifier ), + KEY ezcobj_state_group_lmask ( language_mask ) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezcobj_state_group_language; +CREATE TABLE ezcobj_state_group_language ( + contentobject_state_group_id int(11) NOT NULL DEFAULT 0, + description longtext NOT NULL, + language_id int(11) NOT NULL DEFAULT 0, + real_language_id int(11) NOT NULL DEFAULT 0, + name varchar(45) NOT NULL DEFAULT '', + PRIMARY KEY ( contentobject_state_group_id, real_language_id ) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezcobj_state_language; +CREATE TABLE ezcobj_state_language ( + contentobject_state_id int(11) NOT NULL DEFAULT 0, + description longtext NOT NULL, + language_id int(11) NOT NULL DEFAULT 0, + name varchar(45) NOT NULL DEFAULT '', + PRIMARY KEY ( contentobject_state_id, language_id ) +) ENGINE=InnoDB; + +-- +DROP TABLE IF EXISTS ezcobj_state_link; +CREATE TABLE ezcobj_state_link ( + contentobject_id int(11) NOT NULL DEFAULT '0', + contentobject_state_id int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (contentobject_id,contentobject_state_id) +) ENGINE=InnoDB; +-- + +DROP TABLE IF EXISTS ezcontent_language; +CREATE TABLE ezcontent_language ( + disabled int(11) NOT NULL default '0', + id int(11) NOT NULL default '0', + locale varchar(20) NOT NULL default '', + name varchar(255) NOT NULL default '', + PRIMARY KEY (id), + KEY ezcontent_language_name (name) +) ENGINE=InnoDB; + + + +DROP TABLE IF EXISTS ezcontentclass; +CREATE TABLE ezcontentclass ( + always_available int(11) NOT NULL default '0', + contentobject_name varchar(255) default NULL, + created int(11) NOT NULL default '0', + creator_id int(11) NOT NULL default '0', + id int(11) NOT NULL auto_increment, + identifier varchar(50) NOT NULL default '', + initial_language_id int(11) NOT NULL default '0', + is_container int(11) NOT NULL default '0', + language_mask int(11) NOT NULL default '0', + modified int(11) NOT NULL default '0', + modifier_id int(11) NOT NULL default '0', + remote_id varchar(100) NOT NULL default '', + serialized_description_list longtext, + serialized_name_list longtext, + sort_field int(11) NOT NULL default '1', + sort_order int(11) NOT NULL default '1', + url_alias_name varchar(255) default NULL, + version int(11) NOT NULL default '0', + PRIMARY KEY (id,version), + KEY ezcontentclass_version (version) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezcontentclass_attribute; +CREATE TABLE ezcontentclass_attribute ( + can_translate int(11) default '1', + category varchar(25) NOT NULL default '', + contentclass_id int(11) NOT NULL default '0', + data_float1 float default NULL, + data_float2 float default NULL, + data_float3 float default NULL, + data_float4 float default NULL, + data_int1 int(11) default NULL, + data_int2 int(11) default NULL, + data_int3 int(11) default NULL, + data_int4 int(11) default NULL, + data_text1 varchar(50) default NULL, + data_text2 varchar(50) default NULL, + data_text3 varchar(50) default NULL, + data_text4 varchar(255) default NULL, + data_text5 longtext, + data_type_string varchar(50) NOT NULL default '', + id int(11) NOT NULL auto_increment, + identifier varchar(50) NOT NULL default '', + is_information_collector int(11) NOT NULL default '0', + is_required int(11) NOT NULL default '0', + is_searchable int(11) NOT NULL default '0', + placement int(11) NOT NULL default '0', + serialized_data_text longtext, + serialized_description_list longtext, + serialized_name_list longtext NOT NULL, + version int(11) NOT NULL default '0', + PRIMARY KEY (id,version), + KEY ezcontentclass_attr_ccid (contentclass_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentclass_classgroup; +CREATE TABLE ezcontentclass_classgroup ( + contentclass_id int(11) NOT NULL default '0', + contentclass_version int(11) NOT NULL default '0', + group_id int(11) NOT NULL default '0', + group_name varchar(255) default NULL, + PRIMARY KEY (contentclass_id,contentclass_version,group_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentclass_name; +CREATE TABLE ezcontentclass_name ( + contentclass_id int(11) NOT NULL default '0', + contentclass_version int(11) NOT NULL default '0', + language_id int(11) NOT NULL default '0', + language_locale varchar(20) NOT NULL default '', + name varchar(255) NOT NULL default '', + PRIMARY KEY (contentclass_id,contentclass_version,language_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentclassgroup; +CREATE TABLE ezcontentclassgroup ( + created int(11) NOT NULL default '0', + creator_id int(11) NOT NULL default '0', + id int(11) NOT NULL auto_increment, + modified int(11) NOT NULL default '0', + modifier_id int(11) NOT NULL default '0', + name varchar(255) default NULL, + PRIMARY KEY (id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject; +CREATE TABLE ezcontentobject ( + contentclass_id int(11) NOT NULL default '0', + current_version int(11) default NULL, + id int(11) NOT NULL auto_increment, + initial_language_id int(11) NOT NULL default '0', + language_mask int(11) NOT NULL default '0', + modified int(11) NOT NULL default '0', + name varchar(255) default NULL, + owner_id int(11) NOT NULL default '0', + published int(11) NOT NULL default '0', + remote_id varchar(100) default NULL, + section_id int(11) NOT NULL default '0', + status int(11) default '0', + PRIMARY KEY (id), + KEY ezcontentobject_classid (contentclass_id), + KEY ezcontentobject_currentversion (current_version), + KEY ezcontentobject_lmask (language_mask), + KEY ezcontentobject_owner (owner_id), + KEY ezcontentobject_pub (published), + UNIQUE KEY ezcontentobject_remote_id (remote_id), + KEY ezcontentobject_status (status) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject_attribute; +CREATE TABLE ezcontentobject_attribute ( + attribute_original_id int(11) default '0', + contentclassattribute_id int(11) NOT NULL default '0', + contentobject_id int(11) NOT NULL default '0', + data_float float default NULL, + data_int int(11) default NULL, + data_text longtext, + data_type_string varchar(50) default '', + id int(11) NOT NULL auto_increment, + language_code varchar(20) NOT NULL default '', + language_id int(11) NOT NULL default '0', + sort_key_int int(11) NOT NULL default '0', + sort_key_string varchar(255) NOT NULL default '', + version int(11) NOT NULL default '0', + PRIMARY KEY (id,version), + KEY ezcontentobject_attr_id (id), + KEY ezcontentobject_attribute_co_id_ver_lang_code (contentobject_id,version,language_code), + KEY ezcontentobject_attribute_contentobject_id (contentobject_id), + KEY ezcontentobject_attribute_language_code (language_code), + KEY sort_key_int (sort_key_int), + KEY sort_key_string (sort_key_string) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject_link; +CREATE TABLE ezcontentobject_link ( + contentclassattribute_id int(11) NOT NULL default '0', + from_contentobject_id int(11) NOT NULL default '0', + from_contentobject_version int(11) NOT NULL default '0', + id int(11) NOT NULL auto_increment, + op_code int(11) NOT NULL default '0', + relation_type int(11) NOT NULL default '1', + to_contentobject_id int(11) NOT NULL default '0', + PRIMARY KEY (id), + KEY ezco_link_from (from_contentobject_id,from_contentobject_version,contentclassattribute_id), + KEY ezco_link_to_co_id (to_contentobject_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject_name; +CREATE TABLE ezcontentobject_name ( + content_translation varchar(20) NOT NULL default '', + content_version int(11) NOT NULL default '0', + contentobject_id int(11) NOT NULL default '0', + language_id int(11) NOT NULL default '0', + name varchar(255) default NULL, + real_translation varchar(20) default NULL, + PRIMARY KEY (contentobject_id,content_version,content_translation), + KEY ezcontentobject_name_co_id (contentobject_id), + KEY ezcontentobject_name_cov_id (content_version), + KEY ezcontentobject_name_lang_id (language_id), + KEY ezcontentobject_name_name (name) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject_trash; +CREATE TABLE ezcontentobject_trash ( + contentobject_id int(11) default NULL, + contentobject_version int(11) default NULL, + depth int(11) NOT NULL default '0', + is_hidden int(11) NOT NULL default '0', + is_invisible int(11) NOT NULL default '0', + main_node_id int(11) default NULL, + modified_subnode int(11) default '0', + node_id int(11) NOT NULL default '0', + parent_node_id int(11) NOT NULL default '0', + path_identification_string longtext, + path_string varchar(255) NOT NULL default '', + priority int(11) NOT NULL default '0', + remote_id varchar(100) NOT NULL default '', + sort_field int(11) default '1', + sort_order int(11) default '1', + PRIMARY KEY (node_id), + KEY ezcobj_trash_co_id (contentobject_id), + KEY ezcobj_trash_depth (depth), + KEY ezcobj_trash_modified_subnode (modified_subnode), + KEY ezcobj_trash_p_node_id (parent_node_id), + KEY ezcobj_trash_path (path_string), + KEY ezcobj_trash_path_ident (path_identification_string(50)) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject_tree; +CREATE TABLE ezcontentobject_tree ( + contentobject_id int(11) default NULL, + contentobject_is_published int(11) default NULL, + contentobject_version int(11) default NULL, + depth int(11) NOT NULL default '0', + is_hidden int(11) NOT NULL default '0', + is_invisible int(11) NOT NULL default '0', + main_node_id int(11) default NULL, + modified_subnode int(11) default '0', + node_id int(11) NOT NULL auto_increment, + parent_node_id int(11) NOT NULL default '0', + path_identification_string longtext, + path_string varchar(255) NOT NULL default '', + priority int(11) NOT NULL default '0', + remote_id varchar(100) NOT NULL default '', + sort_field int(11) default '1', + sort_order int(11) default '1', + PRIMARY KEY (node_id), + KEY ezcontentobject_tree_co_id (contentobject_id), + KEY ezcontentobject_tree_depth (depth), + KEY ezcontentobject_tree_p_node_id (parent_node_id), + KEY ezcontentobject_tree_path (path_string), + KEY ezcontentobject_tree_path_ident (path_identification_string(50)), + KEY modified_subnode (modified_subnode) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezcontentobject_version; +CREATE TABLE ezcontentobject_version ( + contentobject_id int(11) default NULL, + created int(11) NOT NULL default '0', + creator_id int(11) NOT NULL default '0', + id int(11) NOT NULL auto_increment, + initial_language_id int(11) NOT NULL default '0', + language_mask int(11) NOT NULL default '0', + modified int(11) NOT NULL default '0', + status int(11) NOT NULL default '0', + user_id int(11) NOT NULL default '0', + version int(11) NOT NULL default '0', + workflow_event_pos int(11) default '0', + PRIMARY KEY (id), + KEY ezcobj_version_creator_id (creator_id), + KEY ezcobj_version_status (status), + KEY idx_object_version_objver (contentobject_id,version) +) ENGINE=InnoDB; + + + + +DROP TABLE IF EXISTS eznode_assignment; +CREATE TABLE eznode_assignment ( + contentobject_id int(11) default NULL, + contentobject_version int(11) default NULL, + from_node_id int(11) default '0', + id int(11) NOT NULL auto_increment, + is_main int(11) NOT NULL default '0', + op_code int(11) NOT NULL default '0', + parent_node int(11) default NULL, + parent_remote_id varchar(100) NOT NULL default '', + remote_id varchar(100) NOT NULL default '0', + sort_field int(11) default '1', + sort_order int(11) default '1', + PRIMARY KEY (id), + KEY eznode_assignment_co_id (contentobject_id), + KEY eznode_assignment_co_version (contentobject_version), + KEY eznode_assignment_coid_cov (contentobject_id,contentobject_version), + KEY eznode_assignment_is_main (is_main), + KEY eznode_assignment_parent_node (parent_node) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezpolicy; +CREATE TABLE ezpolicy ( + function_name varchar(255) default NULL, + id int(11) NOT NULL auto_increment, + module_name varchar(255) default NULL, + original_id int(11) NOT NULL default '0', + role_id int(11) default NULL, + PRIMARY KEY (id), + KEY ezpolicy_original_id (original_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezpolicy_limitation; +CREATE TABLE ezpolicy_limitation ( + id int(11) NOT NULL auto_increment, + identifier varchar(255) NOT NULL default '', + policy_id int(11) default NULL, + PRIMARY KEY (id), + KEY policy_id (policy_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezpolicy_limitation_value; +CREATE TABLE ezpolicy_limitation_value ( + id int(11) NOT NULL auto_increment, + limitation_id int(11) default NULL, + value varchar(255) default NULL, + PRIMARY KEY (id), + KEY ezpolicy_limitation_value_val (value) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezrole; +CREATE TABLE ezrole ( + id int(11) NOT NULL auto_increment, + is_new int(11) NOT NULL default '0', + name varchar(255) NOT NULL default '', + value char(1) default NULL, + version int(11) default '0', + PRIMARY KEY (id) +) ENGINE=InnoDB; + + + + +DROP TABLE IF EXISTS ezurl; +CREATE TABLE ezurl ( + created int(11) NOT NULL default '0', + id int(11) NOT NULL auto_increment, + is_valid int(11) NOT NULL default '1', + last_checked int(11) NOT NULL default '0', + modified int(11) NOT NULL default '0', + original_url_md5 varchar(32) NOT NULL default '', + url longtext, + PRIMARY KEY (id), + KEY ezurl_url (url(255)) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezurl_object_link; +CREATE TABLE ezurl_object_link ( + contentobject_attribute_id int(11) NOT NULL default '0', + contentobject_attribute_version int(11) NOT NULL default '0', + url_id int(11) NOT NULL default '0', + KEY ezurl_ol_coa_id (contentobject_attribute_id), + KEY ezurl_ol_coa_version (contentobject_attribute_version), + KEY ezurl_ol_url_id (url_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezurlalias; +CREATE TABLE ezurlalias ( + destination_url longtext NOT NULL, + forward_to_id int(11) NOT NULL default '0', + id int(11) NOT NULL auto_increment, + is_imported int(11) NOT NULL default '0', + is_internal int(11) NOT NULL default '1', + is_wildcard int(11) NOT NULL default '0', + source_md5 varchar(32) default NULL, + source_url longtext NOT NULL, + PRIMARY KEY (id), + KEY ezurlalias_desturl (destination_url(200)), + KEY ezurlalias_forward_to_id (forward_to_id), + KEY ezurlalias_imp_wcard_fwd (is_imported,is_wildcard,forward_to_id), + KEY ezurlalias_source_md5 (source_md5), + KEY ezurlalias_source_url (source_url(255)), + KEY ezurlalias_wcard_fwd (is_wildcard,forward_to_id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezurlalias_ml; +CREATE TABLE ezurlalias_ml ( + action longtext NOT NULL, + action_type varchar(32) NOT NULL default '', + alias_redirects int(11) NOT NULL default '1', + id int(11) NOT NULL default '0', + is_alias int(11) NOT NULL default '0', + is_original int(11) NOT NULL default '0', + lang_mask int(11) NOT NULL default '0', + link int(11) NOT NULL default '0', + parent int(11) NOT NULL default '0', + text longtext NOT NULL, + text_md5 varchar(32) NOT NULL default '', + PRIMARY KEY (parent,text_md5), + KEY ezurlalias_ml_act_org (action(32),is_original), + KEY ezurlalias_ml_action (action(32),id,link), + KEY ezurlalias_ml_actt (action_type), + KEY ezurlalias_ml_actt_org_al (action_type,is_original,is_alias), + KEY ezurlalias_ml_id (id), + KEY ezurlalias_ml_par_act_id_lnk (parent,action(32),id,link), + KEY ezurlalias_ml_par_lnk_txt (parent,link,text(32)), + KEY ezurlalias_ml_par_txt (parent,text(32)), + KEY ezurlalias_ml_text (text(32),id,link), + KEY ezurlalias_ml_text_lang (text(32),lang_mask,parent) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezurlalias_ml_incr; +CREATE TABLE ezurlalias_ml_incr ( + id int(11) NOT NULL auto_increment, + PRIMARY KEY (id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezurlwildcard; +CREATE TABLE ezurlwildcard ( + destination_url longtext NOT NULL, + id int(11) NOT NULL auto_increment, + source_url longtext NOT NULL, + type int(11) NOT NULL default '0', + PRIMARY KEY (id) +) ENGINE=InnoDB; + + + + + +DROP TABLE IF EXISTS ezuser; +CREATE TABLE ezuser ( + contentobject_id int(11) NOT NULL default '0', + email varchar(150) NOT NULL default '', + login varchar(150) NOT NULL default '', + password_hash varchar(50) default NULL, + password_hash_type int(11) NOT NULL default '1', + PRIMARY KEY (contentobject_id) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezuser_role; +CREATE TABLE ezuser_role ( + contentobject_id int(11) default NULL, + id int(11) NOT NULL auto_increment, + limit_identifier varchar(255) default '', + limit_value varchar(255) default '', + role_id int(11) default NULL, + PRIMARY KEY (id), + KEY ezuser_role_contentobject_id (contentobject_id), + KEY ezuser_role_role_id (role_id) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS ezuser_setting; +CREATE TABLE ezuser_setting ( + is_enabled int(11) NOT NULL default '0', + max_login int(11) default NULL, + user_id int(11) NOT NULL default '0', + PRIMARY KEY (user_id) +) ENGINE=InnoDB; + + +DROP TABLE IF EXISTS `ezsearch_object_word_link`; +CREATE TABLE `ezsearch_object_word_link` ( + `contentclass_attribute_id` int(11) NOT NULL DEFAULT '0', + `contentclass_id` int(11) NOT NULL DEFAULT '0', + `contentobject_id` int(11) NOT NULL DEFAULT '0', + `frequency` float NOT NULL DEFAULT '0', + `id` int(11) NOT NULL AUTO_INCREMENT, + `identifier` varchar(255) NOT NULL DEFAULT '', + `integer_value` int(11) NOT NULL DEFAULT '0', + `next_word_id` int(11) NOT NULL DEFAULT '0', + `placement` int(11) NOT NULL DEFAULT '0', + `prev_word_id` int(11) NOT NULL DEFAULT '0', + `published` int(11) NOT NULL DEFAULT '0', + `section_id` int(11) NOT NULL DEFAULT '0', + `word_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `ezsearch_object_word_link_frequency` (`frequency`), + KEY `ezsearch_object_word_link_identifier` (`identifier`), + KEY `ezsearch_object_word_link_integer_value` (`integer_value`), + KEY `ezsearch_object_word_link_object` (`contentobject_id`), + KEY `ezsearch_object_word_link_word` (`word_id`) +) ENGINE=InnoDB AUTO_INCREMENT=17279 DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezsearch_return_count`; +CREATE TABLE `ezsearch_return_count` ( + `count` int(11) NOT NULL DEFAULT '0', + `id` int(11) NOT NULL AUTO_INCREMENT, + `phrase_id` int(11) NOT NULL DEFAULT '0', + `time` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `ezsearch_return_cnt_ph_id_cnt` (`phrase_id`,`count`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +DROP TABLE IF EXISTS `ezsearch_search_phrase`; +CREATE TABLE `ezsearch_search_phrase` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `phrase` varchar(250) DEFAULT NULL, + `phrase_count` int(11) DEFAULT '0', + `result_count` int(11) DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `ezsearch_search_phrase_phrase` (`phrase`), + KEY `ezsearch_search_phrase_count` (`phrase_count`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +DROP TABLE IF EXISTS `ezsearch_word`; +CREATE TABLE `ezsearch_word` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `object_count` int(11) NOT NULL DEFAULT '0', + `word` varchar(150) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ezsearch_word_obj_count` (`object_count`), + KEY `ezsearch_word_word_i` (`word`) +) ENGINE=InnoDB AUTO_INCREMENT=2523 DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezsection`; +CREATE TABLE `ezsection` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `identifier` varchar(255) DEFAULT NULL, + `locale` varchar(255) DEFAULT NULL, + `name` varchar(255) DEFAULT NULL, + `navigation_part_identifier` varchar(100) DEFAULT 'ezcontentnavigationpart', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezuser_accountkey`; +CREATE TABLE `ezuser_accountkey` ( + `hash_key` varchar(32) NOT NULL DEFAULT '', + `id` int(11) NOT NULL AUTO_INCREMENT, + `time` int(11) NOT NULL DEFAULT '0', + `user_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `hash_key` (`hash_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezuservisit`; +CREATE TABLE `ezuservisit` ( + `current_visit_timestamp` int(11) NOT NULL DEFAULT '0', + `failed_login_attempts` int(11) NOT NULL DEFAULT '0', + `last_visit_timestamp` int(11) NOT NULL DEFAULT '0', + `login_count` int(11) NOT NULL DEFAULT '0', + `user_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`user_id`), + KEY `ezuservisit_co_visit_count` (`current_visit_timestamp`,`login_count`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezkeyword`; +CREATE TABLE `ezkeyword` ( + `class_id` int(11) NOT NULL DEFAULT '0', + `id` int(11) NOT NULL AUTO_INCREMENT, + `keyword` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `ezkeyword_keyword` (`keyword`), + KEY `ezkeyword_keyword_id` (`keyword`,`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezkeyword_attribute_link`; +CREATE TABLE `ezkeyword_attribute_link` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `keyword_id` int(11) NOT NULL DEFAULT '0', + `objectattribute_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `ezkeyword_attr_link_keyword_id` (`keyword_id`), + KEY `ezkeyword_attr_link_kid_oaid` (`keyword_id`,`objectattribute_id`), + KEY `ezkeyword_attr_link_oaid` (`objectattribute_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP TABLE IF EXISTS `ezimagefile`; +CREATE TABLE `ezimagefile` ( + `contentobject_attribute_id` int(11) NOT NULL DEFAULT '0', + `filepath` longtext NOT NULL, + `id` int(11) NOT NULL AUTO_INCREMENT, + PRIMARY KEY (`id`), + KEY `ezimagefile_coid` (`contentobject_attribute_id`), + KEY `ezimagefile_file` (`filepath`(200)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=193 ; + +DROP TABLE IF EXISTS `ezgmaplocation`; +CREATE TABLE `ezgmaplocation` ( + `contentobject_attribute_id` int(11) NOT NULL DEFAULT '0', + `contentobject_version` int(11) NOT NULL DEFAULT '0', + `latitude` double NOT NULL DEFAULT '0', + `longitude` double NOT NULL DEFAULT '0', + `address` varchar(150) DEFAULT NULL, + PRIMARY KEY (`contentobject_attribute_id`,`contentobject_version`), + KEY `latitude_longitude_key` (`latitude`,`longitude`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.pgsql.sql b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.pgsql.sql new file mode 100644 index 0000000..7206432 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.pgsql.sql @@ -0,0 +1,987 @@ +DROP SEQUENCE IF EXISTS ezcontentclass_s; +CREATE SEQUENCE ezcontentclass_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentclass_attribute_s; +CREATE SEQUENCE ezcontentclass_attribute_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentclassgroup_s; +CREATE SEQUENCE ezcontentclassgroup_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentobject_s; +CREATE SEQUENCE ezcontentobject_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentobject_attribute_s; +CREATE SEQUENCE ezcontentobject_attribute_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentobject_link_s; +CREATE SEQUENCE ezcontentobject_link_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentobject_tree_s; +CREATE SEQUENCE ezcontentobject_tree_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezcontentobject_version_s; +CREATE SEQUENCE ezcontentobject_version_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS eznode_assignment_s; +CREATE SEQUENCE eznode_assignment_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezpolicy_s; +CREATE SEQUENCE ezpolicy_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezpolicy_limitation_s; +CREATE SEQUENCE ezpolicy_limitation_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezpolicy_limitation_value_s; +CREATE SEQUENCE ezpolicy_limitation_value_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezrole_s; +CREATE SEQUENCE ezrole_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezsearch_object_word_link_s; +CREATE SEQUENCE ezsearch_object_word_link_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezsearch_return_count_s; +CREATE SEQUENCE ezsearch_return_count_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezsearch_search_phrase_s; +CREATE SEQUENCE ezsearch_search_phrase_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezsearch_word_s; +CREATE SEQUENCE ezsearch_word_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezsection_s; +CREATE SEQUENCE ezsection_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezurl_s; +CREATE SEQUENCE ezurl_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezurlalias_s; +CREATE SEQUENCE ezurlalias_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezurlalias_ml_incr_s; +CREATE SEQUENCE ezurlalias_ml_incr_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezurlwildcard_s; +CREATE SEQUENCE ezurlwildcard_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezuser_role_s; +CREATE SEQUENCE ezuser_role_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezkeyword_s; +CREATE SEQUENCE ezkeyword_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezkeyword_attribute_link_s; +CREATE SEQUENCE ezkeyword_attribute_link_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP SEQUENCE IF EXISTS ezimagefile_s; +CREATE SEQUENCE ezimagefile_s + START 1 + INCREMENT 1 + MAXVALUE 9223372036854775807 + MINVALUE 1 + CACHE 1; + +DROP TABLE IF EXISTS ezbinaryfile; +CREATE TABLE ezbinaryfile ( + contentobject_attribute_id integer DEFAULT 0 NOT NULL, + download_count integer DEFAULT 0 NOT NULL, + filename character varying(255) DEFAULT ''::character varying NOT NULL, + mime_type character varying(255) DEFAULT ''::character varying NOT NULL, + original_filename character varying(255) DEFAULT ''::character varying NOT NULL, + "version" integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezmedia; +CREATE TABLE ezmedia ( + contentobject_attribute_id integer DEFAULT 0 NOT NULL, + download_count integer DEFAULT 0 NOT NULL, + filename character varying(255) DEFAULT ''::character varying NOT NULL, + mime_type character varying(255) DEFAULT ''::character varying NOT NULL, + original_filename character varying(255) DEFAULT ''::character varying NOT NULL, + "version" integer DEFAULT 0 NOT NULL, + "controls" character varying(50) DEFAULT ''::character varying NOT NULL, + "has_controller" integer DEFAULT 0 NOT NULL, + "height" integer DEFAULT 0 NOT NULL, + "is_autoplay" integer DEFAULT 0 NOT NULL, + "is_loop" integer DEFAULT 0 NOT NULL, + "pluginspage" character varying(255) DEFAULT ''::character varying NOT NULL, + "quality" character varying(50) DEFAULT ''::character varying NOT NULL, + "width" integer DEFAULT NULL +); + +DROP TABLE IF EXISTS ezimagefile; +CREATE TABLE ezimagefile ( + contentobject_attribute_id integer DEFAULT 0 NOT NULL, + filepath text NOT NULL, + id integer DEFAULT nextval('ezimagefile_s'::text) NOT NULL +); + +DROP TABLE IF EXISTS ezgmaplocation; +CREATE TABLE ezgmaplocation ( + contentobject_attribute_id integer DEFAULT '0' NOT NULL, + contentobject_version integer DEFAULT '0' NOT NULL, + latitude double precision DEFAULT '0' NOT NULL, + longitude double precision DEFAULT '0' NOT NULL, + address varying(150) DEFAULT NULL +); + +DROP TABLE IF EXISTS ezcobj_state; +CREATE TABLE ezcobj_state ( + default_language_id integer NOT NULL DEFAULT 0, + group_id integer NOT NULL DEFAULT 0, + id integer DEFAULT nextval('ezcobj_state_s'::text) NOT NULL, + identifier character varying(45) NOT NULL DEFAULT ''::character varying, + language_mask integer NOT NULL DEFAULT 0, + priority integer NOT NULL DEFAULT 0 +); + + +DROP TABLE IF EXISTS ezcobj_state_group; +CREATE TABLE ezcobj_state_group ( + default_language_id integer NOT NULL DEFAULT 0, + id integer DEFAULT nextval('ezcobj_state_group_s'::text) NOT NULL, + identifier character varying(45) NOT NULL DEFAULT ''::character varying, + language_mask integer NOT NULL DEFAULT 0 +); + + +DROP TABLE IF EXISTS ezcobj_state_group_language; +CREATE TABLE ezcobj_state_group_language ( + contentobject_state_group_id integer NOT NULL DEFAULT 0, + description text NOT NULL, + language_id integer NOT NULL DEFAULT 0, + real_language_id integer NOT NULL DEFAULT 0, + name character varying(45) NOT NULL DEFAULT ''::character varying +); + + +DROP TABLE IF EXISTS ezcobj_state_language; +CREATE TABLE ezcobj_state_language ( + contentobject_state_id integer NOT NULL DEFAULT 0, + description text NOT NULL, + language_id integer NOT NULL DEFAULT 0, + name character varying(45) NOT NULL DEFAULT ''::character varying +); + +DROP TABLE IF EXISTS ezcobj_state_link; +CREATE TABLE ezcobj_state_link ( + contentobject_id integer NOT NULL DEFAULT 0, + contentobject_state_id integer NOT NULL DEFAULT 0 +); + +DROP TABLE IF EXISTS ezcontent_language; +CREATE TABLE ezcontent_language ( + disabled integer DEFAULT 0 NOT NULL, + id integer DEFAULT 0 NOT NULL, + locale character varying(20) DEFAULT ''::character varying NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL +); + +DROP TABLE IF EXISTS ezcontentclass; +CREATE TABLE ezcontentclass ( + always_available integer DEFAULT 0 NOT NULL, + contentobject_name character varying(255), + created integer DEFAULT 0 NOT NULL, + creator_id integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezcontentclass_s'::text) NOT NULL, + identifier character varying(50) DEFAULT ''::character varying NOT NULL, + initial_language_id integer DEFAULT 0 NOT NULL, + is_container integer DEFAULT 0 NOT NULL, + language_mask integer DEFAULT 0 NOT NULL, + modified integer DEFAULT 0 NOT NULL, + modifier_id integer DEFAULT 0 NOT NULL, + remote_id character varying(100) DEFAULT ''::character varying NOT NULL, + serialized_description_list text, + serialized_name_list text, + sort_field integer DEFAULT 1 NOT NULL, + sort_order integer DEFAULT 1 NOT NULL, + url_alias_name character varying(255), + "version" integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezcontentclass_attribute; +CREATE TABLE ezcontentclass_attribute ( + can_translate integer DEFAULT 1, + category character varying(25) DEFAULT ''::character varying NOT NULL, + contentclass_id integer DEFAULT 0 NOT NULL, + data_float1 double precision, + data_float2 double precision, + data_float3 double precision, + data_float4 double precision, + data_int1 integer, + data_int2 integer, + data_int3 integer, + data_int4 integer, + data_text1 character varying(50), + data_text2 character varying(50), + data_text3 character varying(50), + data_text4 character varying(255), + data_text5 text, + data_type_string character varying(50) DEFAULT ''::character varying NOT NULL, + id integer DEFAULT nextval('ezcontentclass_attribute_s'::text) NOT NULL, + identifier character varying(50) DEFAULT ''::character varying NOT NULL, + is_information_collector integer DEFAULT 0 NOT NULL, + is_required integer DEFAULT 0 NOT NULL, + is_searchable integer DEFAULT 0 NOT NULL, + placement integer DEFAULT 0 NOT NULL, + serialized_data_text text, + serialized_description_list text, + serialized_name_list text NOT NULL, + "version" integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezcontentclass_classgroup; +CREATE TABLE ezcontentclass_classgroup ( + contentclass_id integer DEFAULT 0 NOT NULL, + contentclass_version integer DEFAULT 0 NOT NULL, + group_id integer DEFAULT 0 NOT NULL, + group_name character varying(255) +); + +DROP TABLE IF EXISTS ezcontentclass_name; +CREATE TABLE ezcontentclass_name ( + contentclass_id integer DEFAULT 0 NOT NULL, + contentclass_version integer DEFAULT 0 NOT NULL, + language_id integer DEFAULT 0 NOT NULL, + language_locale character varying(20) DEFAULT ''::character varying NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL +); + +DROP TABLE IF EXISTS ezcontentclassgroup; +CREATE TABLE ezcontentclassgroup ( + created integer DEFAULT 0 NOT NULL, + creator_id integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezcontentclassgroup_s'::text) NOT NULL, + modified integer DEFAULT 0 NOT NULL, + modifier_id integer DEFAULT 0 NOT NULL, + name character varying(255) +); + +DROP TABLE IF EXISTS ezcontentobject; +CREATE TABLE ezcontentobject ( + contentclass_id integer DEFAULT 0 NOT NULL, + current_version integer, + id integer DEFAULT nextval('ezcontentobject_s'::text) NOT NULL, + initial_language_id integer DEFAULT 0 NOT NULL, + language_mask integer DEFAULT 0 NOT NULL, + modified integer DEFAULT 0 NOT NULL, + name character varying(255), + owner_id integer DEFAULT 0 NOT NULL, + published integer DEFAULT 0 NOT NULL, + remote_id character varying(100), + section_id integer DEFAULT 0 NOT NULL, + status integer DEFAULT 0 +); + +DROP TABLE IF EXISTS ezcontentobject_attribute; +CREATE TABLE ezcontentobject_attribute ( + attribute_original_id integer DEFAULT 0, + contentclassattribute_id integer DEFAULT 0 NOT NULL, + contentobject_id integer DEFAULT 0 NOT NULL, + data_float double precision, + data_int integer, + data_text text, + data_type_string character varying(50) DEFAULT ''::character varying, + id integer DEFAULT nextval('ezcontentobject_attribute_s'::text) NOT NULL, + language_code character varying(20) DEFAULT ''::character varying NOT NULL, + language_id integer DEFAULT 0 NOT NULL, + sort_key_int integer DEFAULT 0 NOT NULL, + sort_key_string character varying(255) DEFAULT ''::character varying NOT NULL, + "version" integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezcontentobject_link; +CREATE TABLE ezcontentobject_link ( + contentclassattribute_id integer DEFAULT 0 NOT NULL, + from_contentobject_id integer DEFAULT 0 NOT NULL, + from_contentobject_version integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezcontentobject_link_s'::text) NOT NULL, + op_code integer DEFAULT 0 NOT NULL, + relation_type integer DEFAULT 1 NOT NULL, + to_contentobject_id integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezcontentobject_name; +CREATE TABLE ezcontentobject_name ( + content_translation character varying(20) DEFAULT ''::character varying NOT NULL, + content_version integer DEFAULT 0 NOT NULL, + contentobject_id integer DEFAULT 0 NOT NULL, + language_id integer DEFAULT 0 NOT NULL, + name character varying(255), + real_translation character varying(20) +); + +DROP TABLE IF EXISTS ezcontentobject_trash; +CREATE TABLE ezcontentobject_trash ( + contentobject_id integer, + contentobject_version integer, + depth integer DEFAULT 0 NOT NULL, + is_hidden integer DEFAULT 0 NOT NULL, + is_invisible integer DEFAULT 0 NOT NULL, + main_node_id integer, + modified_subnode integer DEFAULT 0, + node_id integer DEFAULT 0 NOT NULL, + parent_node_id integer DEFAULT 0 NOT NULL, + path_identification_string text, + path_string character varying(255) DEFAULT ''::character varying NOT NULL, + priority integer DEFAULT 0 NOT NULL, + remote_id character varying(100) DEFAULT ''::character varying NOT NULL, + sort_field integer DEFAULT 1, + sort_order integer DEFAULT 1 +); + +DROP TABLE IF EXISTS ezcontentobject_tree; +CREATE TABLE ezcontentobject_tree ( + contentobject_id integer, + contentobject_is_published integer, + contentobject_version integer, + depth integer DEFAULT 0 NOT NULL, + is_hidden integer DEFAULT 0 NOT NULL, + is_invisible integer DEFAULT 0 NOT NULL, + main_node_id integer, + modified_subnode integer DEFAULT 0, + node_id integer DEFAULT nextval('ezcontentobject_tree_s'::text) NOT NULL, + parent_node_id integer DEFAULT 0 NOT NULL, + path_identification_string text, + path_string character varying(255) DEFAULT ''::character varying NOT NULL, + priority integer DEFAULT 0 NOT NULL, + remote_id character varying(100) DEFAULT ''::character varying NOT NULL, + sort_field integer DEFAULT 1, + sort_order integer DEFAULT 1 +); + +DROP TABLE IF EXISTS ezcontentobject_version; +CREATE TABLE ezcontentobject_version ( + contentobject_id integer, + created integer DEFAULT 0 NOT NULL, + creator_id integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezcontentobject_version_s'::text) NOT NULL, + initial_language_id integer DEFAULT 0 NOT NULL, + language_mask integer DEFAULT 0 NOT NULL, + modified integer DEFAULT 0 NOT NULL, + status integer DEFAULT 0 NOT NULL, + user_id integer DEFAULT 0 NOT NULL, + "version" integer DEFAULT 0 NOT NULL, + workflow_event_pos integer DEFAULT 0 +); + +DROP TABLE IF EXISTS eznode_assignment; +CREATE TABLE eznode_assignment ( + contentobject_id integer, + contentobject_version integer, + from_node_id integer DEFAULT 0, + id integer DEFAULT nextval('eznode_assignment_s'::text) NOT NULL, + is_main integer DEFAULT 0 NOT NULL, + op_code integer DEFAULT 0 NOT NULL, + parent_node integer, + parent_remote_id character varying(100) DEFAULT ''::character varying NOT NULL, + remote_id character varying(100) DEFAULT '0'::character varying NOT NULL, + sort_field integer DEFAULT 1, + sort_order integer DEFAULT 1 +); + +DROP TABLE IF EXISTS ezpolicy; +CREATE TABLE ezpolicy ( + function_name character varying(255), + id integer DEFAULT nextval('ezpolicy_s'::text) NOT NULL, + module_name character varying(255), + original_id integer DEFAULT 0 NOT NULL, + role_id integer +); + +DROP TABLE IF EXISTS ezpolicy_limitation; +CREATE TABLE ezpolicy_limitation ( + id integer DEFAULT nextval('ezpolicy_limitation_s'::text) NOT NULL, + identifier character varying(255) DEFAULT ''::character varying NOT NULL, + policy_id integer +); + +DROP TABLE IF EXISTS ezpolicy_limitation_value; +CREATE TABLE ezpolicy_limitation_value ( + id integer DEFAULT nextval('ezpolicy_limitation_value_s'::text) NOT NULL, + limitation_id integer, + value character varying(255) +); + +DROP TABLE IF EXISTS ezrole; +CREATE TABLE ezrole ( + id integer DEFAULT nextval('ezrole_s'::text) NOT NULL, + is_new integer DEFAULT 0 NOT NULL, + name character varying(255) DEFAULT ''::character varying NOT NULL, + value character(1), + "version" integer DEFAULT 0 +); + +DROP TABLE IF EXISTS ezsearch_object_word_link; +CREATE TABLE ezsearch_object_word_link ( + contentclass_attribute_id integer DEFAULT 0 NOT NULL, + contentclass_id integer DEFAULT 0 NOT NULL, + contentobject_id integer DEFAULT 0 NOT NULL, + frequency double precision DEFAULT 0::double precision NOT NULL, + id integer DEFAULT nextval('ezsearch_object_word_link_s'::text) NOT NULL, + identifier character varying(255) DEFAULT ''::character varying NOT NULL, + integer_value integer DEFAULT 0 NOT NULL, + next_word_id integer DEFAULT 0 NOT NULL, + placement integer DEFAULT 0 NOT NULL, + prev_word_id integer DEFAULT 0 NOT NULL, + published integer DEFAULT 0 NOT NULL, + section_id integer DEFAULT 0 NOT NULL, + word_id integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezsearch_return_count; +CREATE TABLE ezsearch_return_count ( + count integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezsearch_return_count_s'::text) NOT NULL, + phrase_id integer DEFAULT 0 NOT NULL, + "time" integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezsearch_search_phrase; +CREATE TABLE ezsearch_search_phrase ( + id integer DEFAULT nextval('ezsearch_search_phrase_s'::text) NOT NULL, + phrase character varying(250), + phrase_count integer DEFAULT 0, + result_count integer DEFAULT 0 +); + +DROP TABLE IF EXISTS ezsearch_word; +CREATE TABLE ezsearch_word ( + id integer DEFAULT nextval('ezsearch_word_s'::text) NOT NULL, + object_count integer DEFAULT 0 NOT NULL, + word character varying(150) +); + +DROP TABLE IF EXISTS ezsection; +CREATE TABLE ezsection ( + id integer DEFAULT nextval('ezsection_s'::text) NOT NULL, + identifier character varying(255), + locale character varying(255), + name character varying(255), + navigation_part_identifier character varying(100) DEFAULT 'ezcontentnavigationpart'::character varying +); + +DROP TABLE IF EXISTS ezurl; +CREATE TABLE ezurl ( + created integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezurl_s'::text) NOT NULL, + is_valid integer DEFAULT 1 NOT NULL, + last_checked integer DEFAULT 0 NOT NULL, + modified integer DEFAULT 0 NOT NULL, + original_url_md5 character varying(32) DEFAULT ''::character varying NOT NULL, + url text +); + +DROP TABLE IF EXISTS ezurl_object_link; +CREATE TABLE ezurl_object_link ( + contentobject_attribute_id integer DEFAULT 0 NOT NULL, + contentobject_attribute_version integer DEFAULT 0 NOT NULL, + url_id integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezurlalias; +CREATE TABLE ezurlalias ( + destination_url text NOT NULL, + forward_to_id integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezurlalias_s'::text) NOT NULL, + is_imported integer DEFAULT 0 NOT NULL, + is_internal integer DEFAULT 1 NOT NULL, + is_wildcard integer DEFAULT 0 NOT NULL, + source_md5 character varying(32), + source_url text NOT NULL +); + +DROP TABLE IF EXISTS ezurlalias_ml; +CREATE TABLE ezurlalias_ml ( + "action" text NOT NULL, + action_type character varying(32) DEFAULT ''::character varying NOT NULL, + alias_redirects integer DEFAULT 1 NOT NULL, + id integer DEFAULT 0 NOT NULL, + is_alias integer DEFAULT 0 NOT NULL, + is_original integer DEFAULT 0 NOT NULL, + lang_mask integer DEFAULT 0 NOT NULL, + link integer DEFAULT 0 NOT NULL, + parent integer DEFAULT 0 NOT NULL, + text text NOT NULL, + text_md5 character varying(32) DEFAULT ''::character varying NOT NULL +); + +DROP TABLE IF EXISTS ezurlalias_ml_incr; +CREATE TABLE ezurlalias_ml_incr ( + id integer DEFAULT nextval('ezurlalias_ml_incr_s'::text) NOT NULL +); + +DROP TABLE IF EXISTS ezurlwildcard; +CREATE TABLE ezurlwildcard ( + destination_url text NOT NULL, + id integer DEFAULT nextval('ezurlwildcard_s'::text) NOT NULL, + source_url text NOT NULL, + "type" integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezuser; +CREATE TABLE ezuser ( + contentobject_id integer DEFAULT 0 NOT NULL, + email character varying(150) DEFAULT ''::character varying NOT NULL, + login character varying(150) DEFAULT ''::character varying NOT NULL, + password_hash character varying(50), + password_hash_type integer DEFAULT 1 NOT NULL +); + +DROP TABLE IF EXISTS ezuser_role; +CREATE TABLE ezuser_role ( + contentobject_id integer, + id integer DEFAULT nextval('ezuser_role_s'::text) NOT NULL, + limit_identifier character varying(255) DEFAULT ''::character varying, + limit_value character varying(255) DEFAULT ''::character varying, + role_id integer +); + +DROP TABLE IF EXISTS ezuser_setting; +CREATE TABLE ezuser_setting ( + is_enabled integer DEFAULT 0 NOT NULL, + max_login integer, + user_id integer DEFAULT 0 NOT NULL +); + +DROP TABLE IF EXISTS ezkeyword; +CREATE TABLE ezkeyword ( + class_id integer DEFAULT 0 NOT NULL, + id integer DEFAULT nextval('ezkeyword_s'::text) NOT NULL, + keyword character varying(255) DEFAULT NULL +); + +DROP TABLE IF EXISTS ezkeyword_attribute_link; +CREATE TABLE ezkeyword_attribute_link ( + id integer nextval('ezkeyword_attribute_link_s'::text) NOT NULL, + keyword_id integer DEFAULT 0 NOT NULL, + objectattribute_id integer DEFAULT 0 NOT NULL +); + +CREATE INDEX ezimagefile_coid ON ezimagefile USING btree (contentobject_attribute_id); + +CREATE INDEX ezimagefile_file ON ezimagefile USING btree (filepath); + +CREATE INDEX ezgmaplocation_file ON ezgmaplocation USING btree (latitude,longitude); + +CREATE UNIQUE INDEX ezcobj_state_identifier ON ezcobj_state USING btree (group_id, identifier); + +CREATE INDEX ezcobj_state_lmask ON ezcobj_state USING btree (language_mask); + +CREATE INDEX ezcobj_state_priority ON ezcobj_state USING btree (priority); + +CREATE UNIQUE INDEX ezcobj_state_group_identifier ON ezcobj_state_group USING btree (identifier); + +CREATE INDEX ezcobj_state_group_lmask ON ezcobj_state_group USING btree (language_mask); + +CREATE INDEX ezcontent_language_name ON ezcontent_language USING btree (name); + +CREATE INDEX ezcontentclass_version ON ezcontentclass USING btree ("version"); + +CREATE INDEX ezcontentclass_attr_ccid ON ezcontentclass_attribute USING btree (contentclass_id); + +CREATE INDEX ezcontentobject_classid ON ezcontentobject USING btree (contentclass_id); + +CREATE INDEX ezcontentobject_currentversion ON ezcontentobject USING btree (current_version); + +CREATE INDEX ezcontentobject_lmask ON ezcontentobject USING btree (language_mask); + +CREATE INDEX ezcontentobject_owner ON ezcontentobject USING btree (owner_id); + +CREATE INDEX ezcontentobject_pub ON ezcontentobject USING btree (published); + +CREATE UNIQUE INDEX ezcontentobject_remote_id ON ezcontentobject USING btree (remote_id); + +CREATE INDEX ezcontentobject_status ON ezcontentobject USING btree (status); + +CREATE INDEX ezcontentobject_attr_id ON ezcontentobject_attribute USING btree (id); + +CREATE INDEX ezcontentobject_attribute_co_id_ver_lang_code ON ezcontentobject_attribute USING btree (contentobject_id, "version", language_code); + +CREATE INDEX ezcontentobject_attribute_contentobject_id ON ezcontentobject_attribute USING btree (contentobject_id); + +CREATE INDEX ezcontentobject_attribute_language_code ON ezcontentobject_attribute USING btree (language_code); + +CREATE INDEX sort_key_int ON ezcontentobject_attribute USING btree (sort_key_int); + +CREATE INDEX sort_key_string ON ezcontentobject_attribute USING btree (sort_key_string); + +CREATE INDEX ezco_link_from ON ezcontentobject_link USING btree (from_contentobject_id, from_contentobject_version, contentclassattribute_id); + +CREATE INDEX ezco_link_to_co_id ON ezcontentobject_link USING btree (to_contentobject_id); + +CREATE INDEX ezcontentobject_name_co_id ON ezcontentobject_name USING btree (contentobject_id); + +CREATE INDEX ezcontentobject_name_cov_id ON ezcontentobject_name USING btree (content_version); + +CREATE INDEX ezcontentobject_name_lang_id ON ezcontentobject_name USING btree (language_id); + +CREATE INDEX ezcontentobject_name_name ON ezcontentobject_name USING btree (name); + +CREATE INDEX ezcobj_trash_co_id ON ezcontentobject_trash USING btree (contentobject_id); + +CREATE INDEX ezcobj_trash_depth ON ezcontentobject_trash USING btree (depth); + +CREATE INDEX ezcobj_trash_modified_subnode ON ezcontentobject_trash USING btree (modified_subnode); + +CREATE INDEX ezcobj_trash_p_node_id ON ezcontentobject_trash USING btree (parent_node_id); + +CREATE INDEX ezcobj_trash_path ON ezcontentobject_trash USING btree (path_string); + +CREATE INDEX ezcobj_trash_path_ident ON ezcontentobject_trash USING btree (path_identification_string); + +CREATE INDEX ezcontentobject_tree_co_id ON ezcontentobject_tree USING btree (contentobject_id); + +CREATE INDEX ezcontentobject_tree_depth ON ezcontentobject_tree USING btree (depth); + +CREATE INDEX ezcontentobject_tree_p_node_id ON ezcontentobject_tree USING btree (parent_node_id); + +CREATE INDEX ezcontentobject_tree_path ON ezcontentobject_tree USING btree (path_string); + +CREATE INDEX ezcontentobject_tree_path_ident ON ezcontentobject_tree USING btree (path_identification_string); + +CREATE INDEX modified_subnode ON ezcontentobject_tree USING btree (modified_subnode); + +CREATE INDEX ezcobj_version_creator_id ON ezcontentobject_version USING btree (creator_id); + +CREATE INDEX ezcobj_version_status ON ezcontentobject_version USING btree (status); + +CREATE INDEX idx_object_version_objver ON ezcontentobject_version USING btree (contentobject_id, "version"); + +CREATE INDEX eznode_assignment_co_id ON eznode_assignment USING btree (contentobject_id); + +CREATE INDEX eznode_assignment_co_version ON eznode_assignment USING btree (contentobject_version); + +CREATE INDEX eznode_assignment_coid_cov ON eznode_assignment USING btree (contentobject_id, contentobject_version); + +CREATE INDEX eznode_assignment_is_main ON eznode_assignment USING btree (is_main); + +CREATE INDEX eznode_assignment_parent_node ON eznode_assignment USING btree (parent_node); + +CREATE INDEX ezpolicy_original_id ON ezpolicy USING btree (original_id); + +CREATE INDEX policy_id ON ezpolicy_limitation USING btree (policy_id); + +CREATE INDEX ezpolicy_limitation_value_val ON ezpolicy_limitation_value USING btree (value); + +CREATE INDEX ezsearch_object_word_link_frequency ON ezsearch_object_word_link USING btree (frequency); + +CREATE INDEX ezsearch_object_word_link_identifier ON ezsearch_object_word_link USING btree (identifier); + +CREATE INDEX ezsearch_object_word_link_integer_value ON ezsearch_object_word_link USING btree (integer_value); + +CREATE INDEX ezsearch_object_word_link_object ON ezsearch_object_word_link USING btree (contentobject_id); + +CREATE INDEX ezsearch_object_word_link_word ON ezsearch_object_word_link USING btree (word_id); + +CREATE INDEX ezsearch_return_cnt_ph_id_cnt ON ezsearch_return_count USING btree (phrase_id, count); + +CREATE INDEX ezsearch_search_phrase_count ON ezsearch_search_phrase USING btree (phrase_count); + +CREATE UNIQUE INDEX ezsearch_search_phrase_phrase ON ezsearch_search_phrase USING btree (phrase); + +CREATE INDEX ezsearch_word_obj_count ON ezsearch_word USING btree (object_count); + +CREATE INDEX ezsearch_word_word_i ON ezsearch_word USING btree (word); + +CREATE INDEX ezurl_url ON ezurl USING btree (url); + +CREATE INDEX ezurl_ol_coa_id ON ezurl_object_link USING btree (contentobject_attribute_id); + +CREATE INDEX ezurl_ol_coa_version ON ezurl_object_link USING btree (contentobject_attribute_version); + +CREATE INDEX ezurl_ol_url_id ON ezurl_object_link USING btree (url_id); + +CREATE INDEX ezurlalias_desturl ON ezurlalias USING btree (destination_url); + +CREATE INDEX ezurlalias_forward_to_id ON ezurlalias USING btree (forward_to_id); + +CREATE INDEX ezurlalias_imp_wcard_fwd ON ezurlalias USING btree (is_imported, is_wildcard, forward_to_id); + +CREATE INDEX ezurlalias_source_md5 ON ezurlalias USING btree (source_md5); + +CREATE INDEX ezurlalias_source_url ON ezurlalias USING btree (source_url); + +CREATE INDEX ezurlalias_wcard_fwd ON ezurlalias USING btree (is_wildcard, forward_to_id); + +CREATE INDEX ezurlalias_ml_act_org ON ezurlalias_ml USING btree ("action", is_original); + +CREATE INDEX ezurlalias_ml_action ON ezurlalias_ml USING btree ("action", id, link); + +CREATE INDEX ezurlalias_ml_actt ON ezurlalias_ml USING btree (action_type); + +CREATE INDEX ezurlalias_ml_actt_org_al ON ezurlalias_ml USING btree (action_type, is_original, is_alias); + +CREATE INDEX ezurlalias_ml_id ON ezurlalias_ml USING btree (id); + +CREATE INDEX ezurlalias_ml_par_act_id_lnk ON ezurlalias_ml USING btree (parent, "action", id, link); + +CREATE INDEX ezurlalias_ml_par_lnk_txt ON ezurlalias_ml USING btree (parent, link, text); + +CREATE INDEX ezurlalias_ml_par_txt ON ezurlalias_ml USING btree (parent, text); + +CREATE INDEX ezurlalias_ml_text ON ezurlalias_ml USING btree (text, id, link); + +CREATE INDEX ezurlalias_ml_text_lang ON ezurlalias_ml USING btree (text, lang_mask, parent); + +CREATE INDEX ezuser_role_contentobject_id ON ezuser_role USING btree (contentobject_id); + +CREATE INDEX ezuser_role_role_id ON ezuser_role USING btree (role_id); + +CREATE INDEX ezkeyword_keyword ON ezkeyword USING btree (keyword); +CREATE INDEX ezkeyword_id ON ezkeyword USING btree (keyword,id); + +CREATE INDEX ezkeyword_attr_link_keyword_id ON ezkeyword USING btree (keyword_id); +CREATE INDEX ezkeyword_attr_link_kid_oaid ON ezkeyword USING btree (keyword_id,objectattribute_id); +CREATE INDEX ezkeyword_attr_link_oaid ON ezkeyword USING btree (objectattribute_id); + +ALTER TABLE ONLY ezcobj_state + ADD CONSTRAINT ezcobj_state_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezimagefile + ADD CONSTRAINT ezimagefile_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezgmaplocation + ADD CONSTRAINT ezgmaplocation_pkey PRIMARY KEY (contentobject_attribute_id,contentobject_version); + +ALTER TABLE ONLY ezbinaryfile + ADD CONSTRAINT ezbinaryfile_pkey PRIMARY KEY (contentobject_attribute_id, "version"); + +ALTER TABLE ONLY ezmedia + ADD CONSTRAINT ezmedia_pkey PRIMARY KEY (contentobject_attribute_id, "version"); + +ALTER TABLE ONLY ezcobj_state_group + ADD CONSTRAINT ezcobj_state_group_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezcobj_state_group_language + ADD CONSTRAINT ezcobj_state_group_language_pkey PRIMARY KEY (contentobject_state_group_id, real_language_id); + +ALTER TABLE ONLY ezcobj_state_language + ADD CONSTRAINT ezcobj_state_language_pkey PRIMARY KEY (contentobject_state_id, language_id); + +ALTER TABLE ONLY ezcobj_state_link + ADD CONSTRAINT ezcobj_state_link_pkey PRIMARY KEY (contentobject_id,contentobject_state_id); + +ALTER TABLE ONLY ezcontent_language + ADD CONSTRAINT ezcontent_language_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezcontentclass + ADD CONSTRAINT ezcontentclass_pkey PRIMARY KEY (id, "version"); + +ALTER TABLE ONLY ezcontentclass_attribute + ADD CONSTRAINT ezcontentclass_attribute_pkey PRIMARY KEY (id, "version"); + +ALTER TABLE ONLY ezcontentclass_classgroup + ADD CONSTRAINT ezcontentclass_classgroup_pkey PRIMARY KEY (contentclass_id, contentclass_version, group_id); + +ALTER TABLE ONLY ezcontentclass_name + ADD CONSTRAINT ezcontentclass_name_pkey PRIMARY KEY (contentclass_id, contentclass_version, language_id); + +ALTER TABLE ONLY ezcontentclassgroup + ADD CONSTRAINT ezcontentclassgroup_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezcontentobject + ADD CONSTRAINT ezcontentobject_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezcontentobject_attribute + ADD CONSTRAINT ezcontentobject_attribute_pkey PRIMARY KEY (id, "version"); + +ALTER TABLE ONLY ezcontentobject_link + ADD CONSTRAINT ezcontentobject_link_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezcontentobject_name + ADD CONSTRAINT ezcontentobject_name_pkey PRIMARY KEY (contentobject_id, content_version, content_translation); + +ALTER TABLE ONLY ezcontentobject_trash + ADD CONSTRAINT ezcontentobject_trash_pkey PRIMARY KEY (node_id); + +ALTER TABLE ONLY ezcontentobject_tree + ADD CONSTRAINT ezcontentobject_tree_pkey PRIMARY KEY (node_id); + +ALTER TABLE ONLY ezcontentobject_version + ADD CONSTRAINT ezcontentobject_version_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY eznode_assignment + ADD CONSTRAINT eznode_assignment_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezpolicy + ADD CONSTRAINT ezpolicy_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezpolicy_limitation + ADD CONSTRAINT ezpolicy_limitation_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezpolicy_limitation_value + ADD CONSTRAINT ezpolicy_limitation_value_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezrole + ADD CONSTRAINT ezrole_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezsearch_object_word_link + ADD CONSTRAINT ezsearch_object_word_link_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezsearch_return_count + ADD CONSTRAINT ezsearch_return_count_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezsearch_search_phrase + ADD CONSTRAINT ezsearch_search_phrase_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezsearch_word + ADD CONSTRAINT ezsearch_word_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezsection + ADD CONSTRAINT ezsection_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezurl + ADD CONSTRAINT ezurl_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezurlalias + ADD CONSTRAINT ezurlalias_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezurlalias_ml + ADD CONSTRAINT ezurlalias_ml_pkey PRIMARY KEY (parent, text_md5); + +ALTER TABLE ONLY ezurlalias_ml_incr + ADD CONSTRAINT ezurlalias_ml_incr_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezurlwildcard + ADD CONSTRAINT ezurlwildcard_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezuser + ADD CONSTRAINT ezuser_pkey PRIMARY KEY (contentobject_id); + +ALTER TABLE ONLY ezuser_role + ADD CONSTRAINT ezuser_role_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezuser_setting + ADD CONSTRAINT ezuser_setting_pkey PRIMARY KEY (user_id); + +ALTER TABLE ONLY ezkeyword + ADD CONSTRAINT ezkeyword_pkey PRIMARY KEY (id); + +ALTER TABLE ONLY ezkeyword_attribute_link + ADD CONSTRAINT ezkeyword_attribute_link_pkey PRIMARY KEY (id); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.sqlite.sql b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.sqlite.sql new file mode 100644 index 0000000..9e1f19a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/schema.sqlite.sql @@ -0,0 +1,499 @@ +CREATE TABLE 'ezbinaryfile' ( + 'contentobject_attribute_id' integer NOT NULL DEFAULT 0, + 'download_count' integer NOT NULL DEFAULT 0, + 'filename' text(255) NOT NULL, + 'mime_type' text(255) NOT NULL, + 'original_filename' text(255) NOT NULL, + 'version' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezmedia' ( + 'contentobject_attribute_id' integer NOT NULL DEFAULT 0, + 'controls' text(50) DEFAULT NULL, + 'filename' text(255) NOT NULL DEFAULT '', + 'has_controller' integer DEFAULT 0, + 'height' integer DEFAULT NULL, + 'is_autoplay' integer DEFAULT 0, + 'is_loop' integer DEFAULT 0, + 'mime_type' text(50) NOT NULL DEFAULT '', + 'original_filename' text(255) NOT NULL DEFAULT '', + 'pluginspage' text(255) DEFAULT NULL, + 'quality' text(50) DEFAULT NULL, + 'version' integer NOT NULL DEFAULT 0, + 'width' integer DEFAULT NULL, + PRIMARY KEY ('contentobject_attribute_id','version') +); +CREATE TABLE 'ezimagefile' ( + 'contentobject_attribute_id' integer NOT NULL DEFAULT 0, + 'filepath' text NOT NULL, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE 'ezgmaplocation' ( + 'contentobject_attribute_id' integer NOT NULL DEFAULT 0, + 'contentobject_version' integer NOT NULL DEFAULT 0, + 'latitude' real NOT NULL DEFAULT 0, + 'longitude' real NOT NULL DEFAULT 0, + 'address' text(150) DEFAULT NULL, + PRIMARY KEY ('contentobject_attribute_id','contentobject_version') +); +CREATE TABLE 'ezcobj_state' ( + 'default_language_id' integer NOT NULL DEFAULT 0, + 'group_id' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'identifier' text(45) NOT NULL DEFAULT '', + 'language_mask' integer NOT NULL DEFAULT 0, + 'priority' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezcobj_state_group' ( + 'default_language_id' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'identifier' text(45) NOT NULL DEFAULT '', + 'language_mask' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezcobj_state_group_language' ( + 'contentobject_state_group_id' integer NOT NULL DEFAULT 0, + 'description' text NOT NULL, + 'language_id' integer NOT NULL DEFAULT 0, + 'real_language_id' integer NOT NULL DEFAULT 0, + 'name' text(45) NOT NULL DEFAULT '', + PRIMARY KEY ( contentobject_state_group_id, real_language_id ) +); +CREATE TABLE 'ezcobj_state_language' ( + 'contentobject_state_id' integer NOT NULL DEFAULT 0, + 'description' text NOT NULL, + 'language_id' integer NOT NULL DEFAULT 0, + 'name' text(45) NOT NULL DEFAULT '', + PRIMARY KEY ( contentobject_state_id, language_id ) +); +CREATE TABLE 'ezcobj_state_link' ( + 'contentobject_id' integer NOT NULL DEFAULT '0', + 'contentobject_state_id' integer NOT NULL DEFAULT '0', + PRIMARY KEY ( contentobject_id, contentobject_state_id ) +); +CREATE TABLE 'ezcontent_language' ( + 'disabled' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL DEFAULT 0, + 'locale' text(20) NOT NULL, + 'name' text(255) NOT NULL +); +CREATE TABLE 'ezcontentclass' ( + 'always_available' integer NOT NULL DEFAULT 0, + 'contentobject_name' text(255), + 'created' integer NOT NULL DEFAULT 0, + 'creator_id' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL DEFAULT 0, + 'identifier' text(50) NOT NULL, + 'initial_language_id' integer NOT NULL DEFAULT 0, + 'is_container' integer NOT NULL DEFAULT 0, + 'language_mask' integer NOT NULL DEFAULT 0, + 'modified' integer NOT NULL DEFAULT 0, + 'modifier_id' integer NOT NULL DEFAULT 0, + 'remote_id' text(100) NOT NULL, + 'serialized_description_list' clob, + 'serialized_name_list' clob, + 'sort_field' integer NOT NULL DEFAULT 1, + 'sort_order' integer NOT NULL DEFAULT 1, + 'url_alias_name' text(255), + 'version' integer NOT NULL DEFAULT 0, + PRIMARY KEY ( id, version ) +); +CREATE TABLE 'ezcontentclass_attribute' ( + 'can_translate' integer DEFAULT 1, + 'category' text(25) NOT NULL, + 'contentclass_id' integer NOT NULL DEFAULT 0, + 'data_float1' real, + 'data_float2' real, + 'data_float3' real, + 'data_float4' real, + 'data_int1' integer, + 'data_int2' integer, + 'data_int3' integer, + 'data_int4' integer, + 'data_text1' text(50), + 'data_text2' text(50), + 'data_text3' text(50), + 'data_text4' text(255), + 'data_text5' clob, + 'data_type_string' text(50) NOT NULL, + 'id' integer NOT NULL DEFAULT 0, + 'identifier' text(50) NOT NULL, + 'is_information_collector' integer NOT NULL DEFAULT 0, + 'is_required' integer NOT NULL DEFAULT 0, + 'is_searchable' integer NOT NULL DEFAULT 0, + 'placement' integer NOT NULL DEFAULT 0, + 'serialized_data_text' clob, + 'serialized_description_list' clob, + 'serialized_name_list' clob NOT NULL, + 'version' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezcontentclass_classgroup' ( + 'contentclass_id' integer NOT NULL DEFAULT 0, + 'contentclass_version' integer NOT NULL DEFAULT 0, + 'group_id' integer NOT NULL DEFAULT 0, + 'group_name' text(255) +); +CREATE TABLE 'ezcontentclass_name' ( + 'contentclass_id' integer NOT NULL DEFAULT 0, + 'contentclass_version' integer NOT NULL DEFAULT 0, + 'language_id' integer NOT NULL DEFAULT 0, + 'language_locale' text(20) NOT NULL, + 'name' text(255) NOT NULL +); +CREATE TABLE 'ezcontentclassgroup' ( + 'created' integer NOT NULL DEFAULT 0, + 'creator_id' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'modified' integer NOT NULL DEFAULT 0, + 'modifier_id' integer NOT NULL DEFAULT 0, + 'name' text(255) +); +CREATE TABLE 'ezcontentobject' ( + 'contentclass_id' integer NOT NULL DEFAULT 0, + 'current_version' integer, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'initial_language_id' integer NOT NULL DEFAULT 0, + 'language_mask' integer NOT NULL DEFAULT 0, + 'modified' integer NOT NULL DEFAULT 0, + 'name' text(255), + 'owner_id' integer NOT NULL DEFAULT 0, + 'published' integer NOT NULL DEFAULT 0, + 'remote_id' text(100), + 'section_id' integer NOT NULL DEFAULT 0, + 'status' integer DEFAULT 0 +); +CREATE TABLE 'ezcontentobject_attribute' ( + 'attribute_original_id' integer DEFAULT 0, + 'contentclassattribute_id' integer NOT NULL DEFAULT 0, + 'contentobject_id' integer NOT NULL DEFAULT 0, + 'data_float' real, + 'data_int' integer, + 'data_text' clob, + 'data_type_string' text(50), + 'id' integer NOT NULL DEFAULT 0, + 'language_code' text(20) NOT NULL, + 'language_id' integer NOT NULL DEFAULT 0, + 'sort_key_int' integer NOT NULL DEFAULT 0, + 'sort_key_string' text(255) NOT NULL COLLATE NOCASE, + 'version' integer NOT NULL DEFAULT 0, + PRIMARY KEY ( id, version ) +); +CREATE TABLE 'ezcontentobject_link' ( + 'contentclassattribute_id' integer NOT NULL DEFAULT 0, + 'from_contentobject_id' integer NOT NULL DEFAULT 0, + 'from_contentobject_version' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'op_code' integer NOT NULL DEFAULT 0, + 'relation_type' integer NOT NULL DEFAULT 1, + 'to_contentobject_id' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezcontentobject_name' ( + 'content_translation' text(20) NOT NULL, + 'content_version' integer NOT NULL DEFAULT 0, + 'contentobject_id' integer NOT NULL DEFAULT 0, + 'language_id' integer NOT NULL DEFAULT 0, + 'name' text(255), + 'real_translation' text(20) +); +CREATE TABLE 'ezcontentobject_trash' ( + 'contentobject_id' integer, + 'contentobject_version' integer, + 'depth' integer NOT NULL DEFAULT 0, + 'is_hidden' integer NOT NULL DEFAULT 0, + 'is_invisible' integer NOT NULL DEFAULT 0, + 'main_node_id' integer, + 'modified_subnode' integer DEFAULT 0, + 'node_id' integer NOT NULL DEFAULT 0, + 'parent_node_id' integer NOT NULL DEFAULT 0, + 'path_identification_string' clob, + 'path_string' text(255) NOT NULL, + 'priority' integer NOT NULL DEFAULT 0, + 'remote_id' text(100) NOT NULL, + 'sort_field' integer DEFAULT 1, + 'sort_order' integer DEFAULT 1 +); +CREATE TABLE 'ezcontentobject_tree' ( + 'contentobject_id' integer, + 'contentobject_is_published' integer, + 'contentobject_version' integer, + 'depth' integer NOT NULL DEFAULT 0, + 'is_hidden' integer NOT NULL DEFAULT 0, + 'is_invisible' integer NOT NULL DEFAULT 0, + 'main_node_id' integer, + 'modified_subnode' integer DEFAULT 0, + 'node_id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'parent_node_id' integer NOT NULL DEFAULT 0, + 'path_identification_string' clob, + 'path_string' text(255) NOT NULL, + 'priority' integer NOT NULL DEFAULT 0, + 'remote_id' text(100) NOT NULL, + 'sort_field' integer DEFAULT 1, + 'sort_order' integer DEFAULT 1 +); +CREATE TABLE 'ezcontentobject_version' ( + 'contentobject_id' integer, + 'created' integer NOT NULL DEFAULT 0, + 'creator_id' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'initial_language_id' integer NOT NULL DEFAULT 0, + 'language_mask' integer NOT NULL DEFAULT 0, + 'modified' integer NOT NULL DEFAULT 0, + 'status' integer NOT NULL DEFAULT 0, + 'user_id' integer NOT NULL DEFAULT 0, + 'version' integer NOT NULL DEFAULT 0, + 'workflow_event_pos' integer DEFAULT 0 +); +CREATE TABLE 'eznode_assignment' ( + 'contentobject_id' integer, + 'contentobject_version' integer, + 'from_node_id' integer DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'is_main' integer NOT NULL DEFAULT 0, + 'op_code' integer NOT NULL DEFAULT 0, + 'parent_node' integer, + 'parent_remote_id' text(100) NOT NULL, + 'remote_id' text(100) NOT NULL DEFAULT '0', + 'sort_field' integer DEFAULT 1, + 'sort_order' integer DEFAULT 1 +); +CREATE TABLE 'ezurl' ( + 'created' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'is_valid' integer NOT NULL DEFAULT 1, + 'last_checked' integer NOT NULL DEFAULT 0, + 'modified' integer NOT NULL DEFAULT 0, + 'original_url_md5' text(32) NOT NULL, + 'url' clob +); +CREATE TABLE 'ezurl_object_link' ( + 'contentobject_attribute_id' integer NOT NULL DEFAULT 0, + 'contentobject_attribute_version' integer NOT NULL DEFAULT 0, + 'url_id' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezurlalias' ( + 'destination_url' clob NOT NULL, + 'forward_to_id' integer NOT NULL DEFAULT 0, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'is_imported' integer NOT NULL DEFAULT 0, + 'is_internal' integer NOT NULL DEFAULT 1, + 'is_wildcard' integer NOT NULL DEFAULT 0, + 'source_md5' text(32), + 'source_url' clob NOT NULL +); +CREATE TABLE 'ezurlalias_ml' ( + 'action' clob NOT NULL, + 'action_type' text(32) NOT NULL, + 'alias_redirects' integer NOT NULL DEFAULT 1, + 'id' integer NOT NULL DEFAULT 0, + 'is_alias' integer NOT NULL DEFAULT 0, + 'is_original' integer NOT NULL DEFAULT 0, + 'lang_mask' integer NOT NULL DEFAULT 0, + 'link' integer NOT NULL DEFAULT 0, + 'parent' integer NOT NULL DEFAULT 0, + 'text' clob NOT NULL, + 'text_md5' text(32) NOT NULL +); +CREATE TABLE 'ezurlalias_ml_incr' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT +); +CREATE TABLE 'ezurlwildcard' ( + 'destination_url' clob NOT NULL, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'source_url' clob NOT NULL, + 'type' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezuser' ( + 'contentobject_id' integer NOT NULL DEFAULT 0, + 'email' text(150) NOT NULL, + 'login' text(150) NOT NULL, + 'password_hash' text(50), + 'password_hash_type' integer NOT NULL DEFAULT 1 +); +CREATE TABLE 'ezuser_role' ( + 'contentobject_id' integer, + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'limit_identifier' text(255), + 'limit_value' text(255), + 'role_id' integer +); +CREATE TABLE 'ezrole' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'is_new' integer NOT NULL DEFAULT 0, + 'name' text(255) NOT NULL, + 'value' text(1), + 'version' integer DEFAULT 0 +); +CREATE TABLE 'ezpolicy' ( + 'function_name' text(255), + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'module_name' text(255), + 'original_id' integer NOT NULL DEFAULT 0, + 'role_id' integer +); +CREATE TABLE 'ezpolicy_limitation' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'identifier' text(255) NOT NULL, + 'policy_id' integer +); +CREATE TABLE 'ezpolicy_limitation_value' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'limitation_id' integer, + 'value' text(255) +); +CREATE TABLE 'ezuser_setting' ( + 'is_enabled' integer NOT NULL DEFAULT 0, + 'max_login' integer, + 'user_id' integer NOT NULL DEFAULT 0 +); +CREATE TABLE 'ezsearch_object_word_link' ( + 'contentclass_attribute_id' integer NOT NULL DEFAULT '0', + 'contentclass_id' integer NOT NULL DEFAULT '0', + 'contentobject_id' integer NOT NULL DEFAULT '0', + 'frequency' float NOT NULL DEFAULT '0', + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'identifier' text(255) NOT NULL DEFAULT '', + 'integer_value' integer NOT NULL DEFAULT '0', + 'next_word_id' integer NOT NULL DEFAULT '0', + 'placement' integer NOT NULL DEFAULT '0', + 'prev_word_id' integer NOT NULL DEFAULT '0', + 'published' integer NOT NULL DEFAULT '0', + 'section_id' integer NOT NULL DEFAULT '0', + 'word_id' integer NOT NULL DEFAULT '0' +); +CREATE TABLE 'ezsearch_word' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'object_count' integer NOT NULL DEFAULT '0', + 'word' text(150) DEFAULT NULL COLLATE NOCASE +); +CREATE TABLE 'ezsection' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'identifier' text(255) DEFAULT NULL, + 'locale' text(255) DEFAULT NULL, + 'name' text(255) DEFAULT NULL, + 'navigation_part_identifier' text(100) DEFAULT 'ezcontentnavigationpart' +); +CREATE TABLE 'ezuservisit' ( + 'current_visit_timestamp' integer NOT NULL DEFAULT '0', + 'failed_login_attempts' integer NOT NULL DEFAULT '0', + 'last_visit_timestamp' integer NOT NULL DEFAULT '0', + 'login_count' integer NOT NULL DEFAULT '0', + 'user_id' integer NOT NULL DEFAULT '0' +); +CREATE TABLE 'ezuser_accountkey' ( + 'hash_key' text(255) NOT NULL DEFAULT '', + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'time' integer NOT NULL DEFAULT '0', + 'user_id' integer NOT NULL DEFAULT '0' +); + +CREATE TABLE 'ezkeyword' ( + 'class_id' integer NOT NULL DEFAULT '0', + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'keyword' text(255) DEFAULT NULL +); + +DROP TABLE IF EXISTS 'ezkeyword_attribute_link'; +CREATE TABLE 'ezkeyword_attribute_link' ( + 'id' integer NOT NULL PRIMARY KEY AUTOINCREMENT, + 'keyword_id' integer NOT NULL DEFAULT '0', + 'objectattribute_id' integer NOT NULL DEFAULT '0' +); + +CREATE UNIQUE INDEX 'ezbinaryfile_pri' ON 'ezbinaryfile' ( 'contentobject_attribute_id', 'version' ); +CREATE UNIQUE INDEX 'ezimagefile_pri' ON 'ezimagefile' ( 'id' ); +CREATE UNIQUE INDEX 'ezgmaplocation_pri' ON 'ezgmaplocation' ( 'contentobject_attribute_id','contentobject_version' ); +CREATE INDEX 'ezgmaplocation_latlon' ON 'ezgmaplocation' ( 'latitude','longitude' ); +CREATE INDEX 'ezimagefile_coid' ON 'ezimagefile' ( 'contentobject_attribute_id' ); +CREATE INDEX 'ezimagefile_file' ON 'ezimagefile' ( 'filepath' ); +CREATE UNIQUE INDEX 'ezcobj_state_identifier' ON 'ezcobj_state' ( 'group_id', 'identifier' ); +CREATE INDEX 'ezcobj_state_lmask' ON 'ezcobj_state' ( 'language_mask' ); +CREATE INDEX 'ezcobj_state_priority' ON 'ezcobj_state' ( 'priority' ); +CREATE UNIQUE INDEX 'ezcobj_state_group_identifier' ON 'ezcobj_state_group' ( 'identifier' ); +CREATE INDEX 'ezcobj_state_group_lmask' ON 'ezcobj_state_group' ( 'language_mask' ); +CREATE INDEX 'ezco_link_from' ON 'ezcontentobject_link' ( 'from_contentobject_id', 'from_contentobject_version', 'contentclassattribute_id' ); +CREATE INDEX 'ezco_link_to_co_id' ON 'ezcontentobject_link' ( 'to_contentobject_id' ); +CREATE INDEX 'ezcobj_trash_co_id' ON 'ezcontentobject_trash' ( 'contentobject_id' ); +CREATE INDEX 'ezcobj_trash_depth' ON 'ezcontentobject_trash' ( 'depth' ); +CREATE INDEX 'ezcobj_trash_modified_subnode' ON 'ezcontentobject_trash' ( 'modified_subnode' ); +CREATE INDEX 'ezcobj_trash_p_node_id' ON 'ezcontentobject_trash' ( 'parent_node_id' ); +CREATE INDEX 'ezcobj_trash_path' ON 'ezcontentobject_trash' ( 'path_string' ); +CREATE INDEX 'ezcobj_trash_path_ident' ON 'ezcontentobject_trash' ( 'path_identification_string' ); +CREATE INDEX 'ezcobj_version_creator_id' ON 'ezcontentobject_version' ( 'creator_id' ); +CREATE INDEX 'ezcobj_version_status' ON 'ezcontentobject_version' ( 'status' ); +CREATE INDEX 'ezcontent_language_name' ON 'ezcontent_language' ( 'name' ); +CREATE UNIQUE INDEX 'ezcontent_language_pri' ON 'ezcontent_language' ( 'id' ); +CREATE INDEX 'ezcontentclass_attr_ccid' ON 'ezcontentclass_attribute' ( 'contentclass_id' ); +CREATE UNIQUE INDEX 'ezcontentclass_classgroup_pri' ON 'ezcontentclass_classgroup' ( 'contentclass_id', 'contentclass_version', 'group_id' ); +CREATE UNIQUE INDEX 'ezcontentclass_name_pri' ON 'ezcontentclass_name' ( 'contentclass_id', 'contentclass_version', 'language_id' ); +CREATE INDEX 'ezcontentclass_version' ON 'ezcontentclass' ( 'version' ); +CREATE INDEX 'ezcontentobject_attr_id' ON 'ezcontentobject_attribute' ( 'id' ); +CREATE INDEX 'ezcontentobject_attribute_co_id_ver_lang_code' ON 'ezcontentobject_attribute' ( 'contentobject_id', 'version', 'language_code' ); +CREATE INDEX 'ezcontentobject_attribute_contentobject_id' ON 'ezcontentobject_attribute' ( 'contentobject_id' ); +CREATE INDEX 'ezcontentobject_attribute_language_code' ON 'ezcontentobject_attribute' ( 'language_code' ); +CREATE INDEX 'ezcontentobject_classid' ON 'ezcontentobject' ( 'contentclass_id' ); +CREATE INDEX 'ezcontentobject_currentversion' ON 'ezcontentobject' ( 'current_version' ); +CREATE INDEX 'ezcontentobject_lmask' ON 'ezcontentobject' ( 'language_mask' ); +CREATE INDEX 'ezcontentobject_name_co_id' ON 'ezcontentobject_name' ( 'contentobject_id' ); +CREATE INDEX 'ezcontentobject_name_cov_id' ON 'ezcontentobject_name' ( 'content_version' ); +CREATE INDEX 'ezcontentobject_name_lang_id' ON 'ezcontentobject_name' ( 'language_id' ); +CREATE INDEX 'ezcontentobject_name_name' ON 'ezcontentobject_name' ( 'name' ); +CREATE UNIQUE INDEX 'ezcontentobject_name_pri' ON 'ezcontentobject_name' ( 'contentobject_id', 'content_version', 'content_translation' ); +CREATE INDEX 'ezcontentobject_owner' ON 'ezcontentobject' ( 'owner_id' ); +CREATE INDEX 'ezcontentobject_pub' ON 'ezcontentobject' ( 'published' ); +CREATE UNIQUE INDEX 'ezcontentobject_remote_id' ON 'ezcontentobject' ( 'remote_id' ); +CREATE INDEX 'ezcontentobject_status' ON 'ezcontentobject' ( 'status' ); +CREATE UNIQUE INDEX 'ezcontentobject_trash_pri' ON 'ezcontentobject_trash' ( 'node_id' ); +CREATE INDEX 'ezcontentobject_tree_co_id' ON 'ezcontentobject_tree' ( 'contentobject_id' ); +CREATE INDEX 'ezcontentobject_tree_depth' ON 'ezcontentobject_tree' ( 'depth' ); +CREATE INDEX 'ezcontentobject_tree_p_node_id' ON 'ezcontentobject_tree' ( 'parent_node_id' ); +CREATE INDEX 'ezcontentobject_tree_path' ON 'ezcontentobject_tree' ( 'path_string' ); +CREATE INDEX 'ezcontentobject_tree_path_ident' ON 'ezcontentobject_tree' ( 'path_identification_string' ); +CREATE INDEX 'eznode_assignment_co_id' ON 'eznode_assignment' ( 'contentobject_id' ); +CREATE INDEX 'eznode_assignment_co_version' ON 'eznode_assignment' ( 'contentobject_version' ); +CREATE INDEX 'eznode_assignment_coid_cov' ON 'eznode_assignment' ( 'contentobject_id', 'contentobject_version' ); +CREATE INDEX 'eznode_assignment_is_main' ON 'eznode_assignment' ( 'is_main' ); +CREATE INDEX 'eznode_assignment_parent_node' ON 'eznode_assignment' ( 'parent_node' ); +CREATE INDEX 'ezpolicy_limitation_value_val' ON 'ezpolicy_limitation_value' ( 'value' ); +CREATE INDEX 'ezpolicy_original_id' ON 'ezpolicy' ( 'original_id' ); +CREATE INDEX 'ezurl_ol_coa_id' ON 'ezurl_object_link' ( 'contentobject_attribute_id' ); +CREATE INDEX 'ezurl_ol_coa_version' ON 'ezurl_object_link' ( 'contentobject_attribute_version' ); +CREATE INDEX 'ezurl_ol_url_id' ON 'ezurl_object_link' ( 'url_id' ); +CREATE INDEX 'ezurl_url' ON 'ezurl' ( 'url' ); +CREATE INDEX 'ezurlalias_desturl' ON 'ezurlalias' ( 'destination_url' ); +CREATE INDEX 'ezurlalias_forward_to_id' ON 'ezurlalias' ( 'forward_to_id' ); +CREATE INDEX 'ezurlalias_imp_wcard_fwd' ON 'ezurlalias' ( 'is_imported', 'is_wildcard', 'forward_to_id' ); +CREATE INDEX 'ezurlalias_ml_act_org' ON 'ezurlalias_ml' ( 'action', 'is_original' ); +CREATE INDEX 'ezurlalias_ml_action' ON 'ezurlalias_ml' ( 'action', 'id', 'link' ); +CREATE INDEX 'ezurlalias_ml_actt' ON 'ezurlalias_ml' ( 'action_type' ); +CREATE INDEX 'ezurlalias_ml_actt_org_al' ON 'ezurlalias_ml' ( 'action_type', 'is_original', 'is_alias' ); +CREATE INDEX 'ezurlalias_ml_id' ON 'ezurlalias_ml' ( 'id' ); +CREATE INDEX 'ezurlalias_ml_par_act_id_lnk' ON 'ezurlalias_ml' ( 'parent', 'action', 'id', 'link' ); +CREATE INDEX 'ezurlalias_ml_par_lnk_txt' ON 'ezurlalias_ml' ( 'parent', 'link', 'text' ); +CREATE INDEX 'ezurlalias_ml_par_txt' ON 'ezurlalias_ml' ( 'parent', 'text' ); +CREATE UNIQUE INDEX 'ezurlalias_ml_pri' ON 'ezurlalias_ml' ( 'parent', 'text_md5' ); +CREATE INDEX 'ezurlalias_ml_text' ON 'ezurlalias_ml' ( 'text', 'id', 'link' ); +CREATE INDEX 'ezurlalias_ml_text_lang' ON 'ezurlalias_ml' ( 'text', 'lang_mask', 'parent' ); +CREATE INDEX 'ezurlalias_source_md5' ON 'ezurlalias' ( 'source_md5' ); +CREATE INDEX 'ezurlalias_source_url' ON 'ezurlalias' ( 'source_url' ); +CREATE INDEX 'ezurlalias_wcard_fwd' ON 'ezurlalias' ( 'is_wildcard', 'forward_to_id' ); +CREATE UNIQUE INDEX 'ezuser_pri' ON 'ezuser' ( 'contentobject_id' ); +CREATE INDEX 'ezuser_role_contentobject_id' ON 'ezuser_role' ( 'contentobject_id' ); +CREATE INDEX 'ezuser_role_role_id' ON 'ezuser_role' ( 'role_id' ); +CREATE UNIQUE INDEX 'ezuser_setting_pri' ON 'ezuser_setting' ( 'user_id' ); +CREATE INDEX 'idx_object_version_objver' ON 'ezcontentobject_version' ( 'contentobject_id', 'version' ); +CREATE INDEX 'modified_subnode' ON 'ezcontentobject_tree' ( 'modified_subnode' ); +CREATE INDEX 'policy_id' ON 'ezpolicy_limitation' ( 'policy_id' ); +CREATE INDEX 'sort_key_int' ON 'ezcontentobject_attribute' ( 'sort_key_int' ); +CREATE INDEX 'sort_key_string' ON 'ezcontentobject_attribute' ( 'sort_key_string' ); +CREATE INDEX 'ezsearch_object_word_link_frequency' ON 'ezsearch_object_word_link' ( 'frequency' ); +CREATE INDEX 'ezsearch_object_word_link_identifier' ON 'ezsearch_object_word_link' ( 'identifier' ); +CREATE INDEX 'ezsearch_object_word_link_integer_value' ON 'ezsearch_object_word_link' ( 'integer_value' ); +CREATE INDEX 'ezsearch_object_word_link_object' ON 'ezsearch_object_word_link' ( 'contentobject_id' ); +CREATE INDEX 'ezsearch_object_word_link_word' ON 'ezsearch_object_word_link' ( 'word_id' ); +CREATE INDEX 'ezsearch_word_obj_count' ON 'ezsearch_word' ( 'object_count' ); +CREATE INDEX 'ezsearch_word_word_i' ON 'ezsearch_word' ( 'word' ); + +CREATE INDEX 'ezkeyword_keyword' ON 'ezkeyword' ( 'keyword' ); +CREATE INDEX 'ezkeyword_id' ON 'ezkeyword' ( 'keyword', 'id' ); + +CREATE INDEX 'ezkeyword_attr_link_keyword_id' ON 'ezkeyword_attribute_link' ( 'keyword_id' ); +CREATE INDEX 'ezkeyword_attr_link_kid_oaid' ON 'ezkeyword_attribute_link' ( 'keyword_id', 'objectattribute_id' ); +CREATE INDEX 'ezkeyword_attr_link_oaid' ON 'ezkeyword_attribute_link' ( 'objectattribute_id' ); diff --git a/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/setval.pgsql.sql b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/setval.pgsql.sql new file mode 100644 index 0000000..5e01e80 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/Tests/_fixtures/setval.pgsql.sql @@ -0,0 +1,22 @@ +SELECT setval('ezcontentclass_attribute_s',max(id)) FROM ezcontentclass_attribute; +SELECT setval('ezcontentclassgroup_s',max(id)) FROM ezcontentclassgroup; +SELECT setval('ezcontentclass_s',max(id)) FROM ezcontentclass; +SELECT setval('ezcontentobject_attribute_s',max(id)) FROM ezcontentobject_attribute; +SELECT setval('ezcontentobject_link_s',max(id)) FROM ezcontentobject_link; +SELECT setval('ezcontentobject_s',max(id)) FROM ezcontentobject; +SELECT setval('ezcontentobject_tree_s', max(node_id)) FROM ezcontentobject_tree; +SELECT setval('ezcontentobject_version_s',max(id)) FROM ezcontentobject_version; +SELECT setval('eznode_assignment_s',max(id)) FROM eznode_assignment; +SELECT setval('ezpolicy_limitation_s',max(id)) FROM ezpolicy_limitation; +SELECT setval('ezpolicy_limitation_value_s',max(id)) FROM ezpolicy_limitation_value; +SELECT setval('ezpolicy_s',max(id)) FROM ezpolicy; +SELECT setval('ezrole_s',max(id)) FROM ezrole; +SELECT setval('ezsearch_object_word_link_s',max(id)) FROM ezsearch_object_word_link; +SELECT setval('ezsearch_return_count_s',max(id)) FROM ezsearch_return_count; +SELECT setval('ezsearch_search_phrase_s',max(id)) FROM ezsearch_search_phrase; +SELECT setval('ezsearch_word_s',max(id)) FROM ezsearch_word; +SELECT setval('ezsection_s',max(id)) FROM ezsection; +SELECT setval('ezurlalias_s',max(id)) FROM ezurlalias; +SELECT setval('ezurl_s',max(id)) FROM ezurl; +SELECT setval('ezuser_role_s',max(id)) FROM ezuser_role; +SELECT setval('ezurlalias_ml_incr_s',max(id)) FROM ezurlalias_ml_incr; diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/User/Gateway.php new file mode 100644 index 0000000..c3d1212 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Gateway.php @@ -0,0 +1,77 @@ +<?php +/** + * File containing the User Gateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User; + +use eZ\Publish\SPI\Persistence\User; + +/** + * Base class for user gateways. + */ +abstract class Gateway +{ + /** + * Create user + * + * @param user $user + * + * @return mixed + */ + abstract public function createUser( User $user ); + + /** + * Delete user with the given ID. + * + * @param mixed $userId + */ + abstract public function deleteUser( $userId ); + + /** + * Loads user with user ID. + * + * @param mixed $userId + * + * @return array + */ + abstract public function load( $userId ); + + /** + * Loads user with user ID. + * + * @param string $login + * @param string|null $email + * + * @return array + */ + abstract public function loadByLoginOrMail( $login, $email = null ); + + /** + * Update the user information specified by the user struct + * + * @param User $user + */ + abstract public function updateUser( User $user ); + + /** + * Assigns role to user with given limitation + * + * @param mixed $contentId + * @param mixed $roleId + * @param array $limitation + */ + abstract public function assignRole( $contentId, $roleId, array $limitation ); + + /** + * Remove role from user + * + * @param mixed $contentId + * @param mixed $roleId + */ + abstract public function removeRole( $contentId, $roleId ); +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Gateway/ExceptionConversion.php b/eZ/Publish/Core/Persistence/Legacy/User/Gateway/ExceptionConversion.php new file mode 100644 index 0000000..a264e61 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Gateway/ExceptionConversion.php @@ -0,0 +1,193 @@ +<?php +/** + * File containing the User Gateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\User\Gateway; +use eZ\Publish\SPI\Persistence\User; + +/** + * Base class for user gateways. + */ +class ExceptionConversion extends Gateway +{ + /** + * The wrapped gateway + * + * @var Gateway + */ + protected $innerGateway; + + /** + * Creates a new exception conversion gateway around $innerGateway + * + * @param Gateway $innerGateway + */ + public function __construct( Gateway $innerGateway ) + { + $this->innerGateway = $innerGateway; + } + + /** + * Create user + * + * @param user $user + * + * @return mixed + */ + public function createUser( User $user ) + { + try + { + return $this->innerGateway->createUser( $user ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Delete user with the given ID. + * + * @param mixed $userId + */ + public function deleteUser( $userId ) + { + try + { + return $this->innerGateway->deleteUser( $userId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads user with user ID. + * + * @param mixed $userId + * + * @return array + */ + public function load( $userId ) + { + try + { + return $this->innerGateway->load( $userId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads user with user ID. + * + * @param string $login + * @param string|null $email + * + * @return array + */ + public function loadByLoginOrMail( $login, $email = null ) + { + try + { + return $this->innerGateway->loadByLoginOrMail( $login, $email ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Update the user information specified by the user struct + * + * @param User $user + */ + public function updateUser( User $user ) + { + try + { + return $this->innerGateway->updateUser( $user ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Assigns role to user with given limitation + * + * @param mixed $contentId + * @param mixed $roleId + * @param array $limitation + */ + public function assignRole( $contentId, $roleId, array $limitation ) + { + try + { + return $this->innerGateway->assignRole( $contentId, $roleId, $limitation ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Remove role from user + * + * @param mixed $contentId + * @param mixed $roleId + */ + public function removeRole( $contentId, $roleId ) + { + try + { + return $this->innerGateway->removeRole( $contentId, $roleId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/User/Gateway/EzcDatabase.php new file mode 100644 index 0000000..84849c7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Gateway/EzcDatabase.php @@ -0,0 +1,300 @@ +<?php +/** + * File containing the EzcDatabase location gateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\User\Gateway; +use eZ\Publish\Core\Persistence\Legacy\EzcDbHandler; +use eZ\Publish\SPI\Persistence\User; + +/** + * User gateway implementation using the zeta database component. + */ +class EzcDatabase extends Gateway +{ + /** + * Database handler + * + * @var EzcDbHandler + */ + protected $handler; + + /** + * Construct from database handler + * + * @param \EzcDbHandler $handler + */ + public function __construct( EzcDbHandler $handler ) + { + $this->handler = $handler; + } + + /** + * Create user + * + * @param user $user + * + * @return mixed + */ + public function createUser( User $user ) + { + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezuser' ) ) + ->set( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $user->id, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'login' ), + $query->bindValue( $user->login ) + )->set( + $this->handler->quoteColumn( 'email' ), + $query->bindValue( $user->email ) + )->set( + $this->handler->quoteColumn( 'password_hash' ), + $query->bindValue( $user->passwordHash ) + )->set( + $this->handler->quoteColumn( 'password_hash_type' ), + $query->bindValue( $user->hashAlgorithm, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezuser_setting' ) ) + ->set( + $this->handler->quoteColumn( 'user_id' ), + $query->bindValue( $user->id, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'is_enabled' ), + $query->bindValue( $user->isEnabled, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'max_login' ), + $query->bindValue( $user->maxLogin, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + } + + /** + * Delete user with the given ID. + * + * @param mixed $userId + */ + public function deleteUser( $userId ) + { + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( $this->handler->quoteTable( 'ezuser' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $userId, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Loads user with user ID. + * + * @param mixed $userId + * + * @return array + */ + public function load( $userId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->quoteColumn( 'contentobject_id', 'ezuser' ), + $this->handler->quoteColumn( 'login', 'ezuser' ), + $this->handler->quoteColumn( 'email', 'ezuser' ), + $this->handler->quoteColumn( 'password_hash', 'ezuser' ), + $this->handler->quoteColumn( 'password_hash_type', 'ezuser' ), + $this->handler->quoteColumn( 'is_enabled', 'ezuser_setting' ), + $this->handler->quoteColumn( 'max_login', 'ezuser_setting' ) + )->from( + $this->handler->quoteTable( 'ezuser' ) + )->leftJoin( + $this->handler->quoteTable( 'ezuser_setting' ), + $query->expr->eq( + $this->handler->quoteColumn( 'user_id', 'ezuser_setting' ), + $this->handler->quoteColumn( 'contentobject_id', 'ezuser' ) + ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id', 'ezuser' ), + $query->bindValue( $userId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads user with user ID. + * + * @param string $login + * @param string|null $email + * + * @return array + */ + public function loadByLoginOrMail( $login, $email = null ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->quoteColumn( 'contentobject_id', 'ezuser' ), + $this->handler->quoteColumn( 'login', 'ezuser' ), + $this->handler->quoteColumn( 'email', 'ezuser' ), + $this->handler->quoteColumn( 'password_hash', 'ezuser' ), + $this->handler->quoteColumn( 'password_hash_type', 'ezuser' ), + $this->handler->quoteColumn( 'is_enabled', 'ezuser_setting' ), + $this->handler->quoteColumn( 'max_login', 'ezuser_setting' ) + )->from( + $this->handler->quoteTable( 'ezuser' ) + )->leftJoin( + $this->handler->quoteTable( 'ezuser_setting' ), + $query->expr->eq( + $this->handler->quoteColumn( 'user_id', 'ezuser_setting' ), + $this->handler->quoteColumn( 'contentobject_id', 'ezuser' ) + ) + )->where( + empty( $email ) ? + $query->expr->eq( + $this->handler->quoteColumn( 'login', 'ezuser' ), + $query->bindValue( $login ) + ) : + $query->expr->lOr( + $query->expr->eq( + $this->handler->quoteColumn( 'login', 'ezuser' ), + $query->bindValue( $login ) + ), + $query->expr->eq( + $this->handler->quoteColumn( 'email', 'ezuser' ), + $query->bindValue( $email ) + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Update the user information specified by the user struct + * + * @param User $user + */ + public function updateUser( User $user ) + { + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezuser' ) ) + ->set( + $this->handler->quoteColumn( 'login' ), + $query->bindValue( $user->login ) + )->set( + $this->handler->quoteColumn( 'email' ), + $query->bindValue( $user->email ) + )->set( + $this->handler->quoteColumn( 'password_hash' ), + $query->bindValue( $user->passwordHash ) + )->set( + $this->handler->quoteColumn( 'password_hash_type' ), + $query->bindValue( $user->hashAlgorithm ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $user->id, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezuser_setting' ) ) + ->set( + $this->handler->quoteColumn( 'is_enabled' ), + $query->bindValue( $user->isEnabled, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'max_login' ), + $query->bindValue( $user->maxLogin, null, \PDO::PARAM_INT ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'user_id' ), + $query->bindValue( $user->id, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Assigns role to user with given limitation + * + * @param mixed $contentId + * @param mixed $roleId + * @param array $limitation + */ + public function assignRole( $contentId, $roleId, array $limitation ) + { + foreach ( $limitation as $identifier => $values ) + { + foreach ( $values as $value ) + { + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezuser_role' ) ) + ->set( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'role_id' ), + $query->bindValue( $roleId, null, \PDO::PARAM_INT ) + )->set( + $this->handler->quoteColumn( 'limit_identifier' ), + $query->bindValue( $identifier ) + )->set( + $this->handler->quoteColumn( 'limit_value' ), + $query->bindValue( $value ) + ); + $query->prepare()->execute(); + } + } + } + + /** + * Remove role from user + * + * @param mixed $contentId + * @param mixed $roleId + */ + public function removeRole( $contentId, $roleId ) + { + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( $this->handler->quoteTable( 'ezuser_role' ) ) + ->where( + $query->expr->lAnd( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $contentId, null, \PDO::PARAM_INT ) + ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id' ), + $query->bindValue( $roleId, null, \PDO::PARAM_INT ) + ) + ) + ); + $query->prepare()->execute(); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Handler.php b/eZ/Publish/Core/Persistence/Legacy/User/Handler.php new file mode 100644 index 0000000..4776655 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Handler.php @@ -0,0 +1,390 @@ +<?php +/** + * File containing the UserHandler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User; + +use eZ\Publish\SPI\Persistence\User; +use eZ\Publish\SPI\Persistence\User\Handler as BaseUserHandler; +use eZ\Publish\SPI\Persistence\User\Role; +use eZ\Publish\SPI\Persistence\User\RoleUpdateStruct; +use eZ\Publish\SPI\Persistence\User\Policy; +use eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway as RoleGateway; +use eZ\Publish\Core\Base\Exceptions\NotFoundException as NotFound; + +/** + * Storage Engine handler for user module + */ +class Handler implements BaseUserHandler +{ + /** + * Gateway for storing user data + * + * @var \eZ\Publish\Core\Persistence\Legacy\User\Gateway + */ + protected $userGateway; + + /** + * Gateway for storing role data + * + * @var \eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway + */ + protected $roleGateway; + + /** + * Mapper for user related objects + * + * @var \eZ\Publish\Core\Persistence\Legacy\User\Mapper + */ + protected $mapper; + + /** + * Construct from userGateway + * + * @param \eZ\Publish\Core\Persistence\Legacy\User\Gateway $userGateway + * @param \eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway $roleGateway + * @param \eZ\Publish\Core\Persistence\Legacy\User\Mapper $mapper + */ + public function __construct( Gateway $userGateway, RoleGateway $roleGateway, Mapper $mapper ) + { + $this->userGateway = $userGateway; + $this->roleGateway = $roleGateway; + $this->mapper = $mapper; + } + + /** + * Create a user + * + * The User struct used to create the user will contain an ID which is used + * to reference the user. + * + * @param \eZ\Publish\SPI\Persistence\User $user + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function create( User $user ) + { + $this->userGateway->createUser( $user ); + return $user; + } + + /** + * Loads user with user ID. + * + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function load( $userId ) + { + $data = $this->userGateway->load( $userId ); + + if ( empty( $data ) ) + { + throw new NotFound( 'user', $userId ); + } + + return $this->mapper->mapUser( reset( $data ) ); + } + + /** + * Loads user with user login / email. + * + * @param string $login + * @param boolean $alsoMatchEmail Also match user email, caller must verify that $login is a valid email address. + * + * @return \eZ\Publish\SPI\Persistence\User[] + */ + public function loadByLogin( $login, $alsoMatchEmail = false ) + { + $data = $this->userGateway->loadByLoginOrMail( $login, $alsoMatchEmail ? $login : null ); + + if ( empty( $data ) ) + { + throw new NotFound( 'user', $login ); + } + + return $this->mapper->mapUsers( $data ); + } + + /** + * Update the user information specified by the user struct + * + * @param \eZ\Publish\SPI\Persistence\User $user + */ + public function update( User $user ) + { + $this->userGateway->updateUser( $user ); + } + + /** + * Delete user with the given ID. + * + * @param mixed $userId + */ + public function delete( $userId ) + { + $this->userGateway->deleteUser( $userId ); + } + + /** + * Create new role + * + * @param \eZ\Publish\SPI\Persistence\User\Role $role + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function createRole( Role $role ) + { + $this->roleGateway->createRole( $role ); + + foreach ( $role->policies as $policy ) + { + $this->addPolicy( $role->id, $policy ); + } + + return $role; + } + + /** + * Loads a specified role by $roleId + * + * @param mixed $roleId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If role is not found + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function loadRole( $roleId ) + { + $data = $this->roleGateway->loadRole( $roleId ); + + if ( empty( $data ) ) + { + throw new NotFound( 'role', $roleId ); + } + + return $this->mapper->mapRole( $data ); + } + + /** + * Loads a specified role by $identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If role is not found + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function loadRoleByIdentifier( $identifier ) + { + $data = $this->roleGateway->loadRoleByIdentifier( $identifier ); + + if ( empty( $data ) ) + { + throw new NotFound( 'role', $identifier ); + } + + return $this->mapper->mapRole( $data ); + } + + /** + * Loads all roles + * + * @return \eZ\Publish\SPI\Persistence\User\Role[] + */ + public function loadRoles() + { + $data = $this->roleGateway->loadRoles(); + + return $this->mapper->mapRoles( $data ); + } + + /** + * Loads roles assigned to a user/group (not including inherited roles) + * + * @param mixed $groupId + * + * @return \eZ\Publish\SPI\Persistence\User\Role[] + */ + public function loadRolesByGroupId( $groupId ) + { + $data = $this->roleGateway->loadRolesForContentObjects( array( $groupId ) ); + + return $this->mapper->mapRoles( $data ); + } + + /** + * Update role + * + * @param \eZ\Publish\SPI\Persistence\User\RoleUpdateStruct $role + */ + public function updateRole( RoleUpdateStruct $role ) + { + $this->roleGateway->updateRole( $role ); + } + + /** + * Delete the specified role + * + * @param mixed $roleId + */ + public function deleteRole( $roleId ) + { + $role = $this->loadRole( $roleId ); + + foreach ( $role->policies as $policy ) + { + $this->roleGateway->removePolicy( $policy->id ); + } + + foreach ( $role->groupIds as $groupId ) + { + $this->userGateway->removeRole( $groupId, $role->id ); + } + + $this->roleGateway->deleteRole( $role->id ); + } + + /** + * Adds a policy to a role + * + * @param mixed $roleId + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * + * @return \eZ\Publish\SPI\Persistence\User\Policy + */ + public function addPolicy( $roleId, Policy $policy ) + { + $this->roleGateway->addPolicy( $roleId, $policy ); + + return $policy; + } + + /** + * Update a policy + * + * Replaces limitations values with new values. + * + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + */ + public function updatePolicy( Policy $policy ) + { + $this->roleGateway->removePolicyLimitations( $policy->id ); + $this->roleGateway->addPolicyLimitations( $policy->id, $policy->limitations ); + } + + /** + * Removes a policy from a role + * + * @param mixed $roleId + * @param mixed $policyId + * + * @return void + */ + public function removePolicy( $roleId, $policyId ) + { + // Each policy can only be associated to exactly one role. Thus it is + // sufficient to use the policyId for identification and just remove + // the policy completely. + $this->roleGateway->removePolicy( $policyId ); + } + + /** + * Returns the user policies associated with the user (including inherited policies from user groups) + * + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\User\Policy[] + */ + public function loadPoliciesByUserId( $userId ) + { + $data = $this->roleGateway->loadPoliciesByUserId( $userId ); + + return $this->mapper->mapPolicies( $data ); + } + + /** + * Assigns role to a user or user group with given limitations + * + * The limitation array looks like: + * <code> + * array( + * 'Subtree' => array( + * '/1/2/', + * '/1/4/', + * ), + * 'Foo' => array( 'Bar' ), + * … + * ) + * </code> + * + * Where the keys are the limitation identifiers, and the respective values + * are an array of limitation values. The limitation parameter is optional. + * + * @param mixed $contentId The groupId or userId to assign the role to. + * @param mixed $roleId + * @param array $limitation + */ + public function assignRole( $contentId, $roleId, array $limitation = null ) + { + $limitation = $limitation ?: array( '' => array( '' ) ); + $this->userGateway->assignRole( $contentId, $roleId, $limitation ); + } + + /** + * Un-assign a role + * + * @param mixed $contentId The user or user group Id to un-assign the role from. + * @param mixed $roleId + */ + public function unAssignRole( $contentId, $roleId ) + { + $this->userGateway->removeRole( $contentId, $roleId ); + } + + /** + * Loads roles assignments Role + * + * Role Assignments with same roleId and limitationIdentifier will be merged together into one. + * + * @param mixed $roleId + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function loadRoleAssignmentsByRoleId( $roleId ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Loads roles assignments to a user/group + * + * Role Assignments with same roleId and limitationIdentifier will be merged together into one. + * + * @param mixed $groupId In legacy storage engine this is the content object id roles are assigned to in ezuser_role. + * By the nature of legacy this can currently also be used to get by $userId. + * @param boolean $inherit If true also return inherited role assignments from user groups. + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function loadRoleAssignmentsByGroupId( $groupId, $inherit = false ) + { + $data = $this->roleGateway->loadRoleAssignmentsByGroupId( $groupId, $inherit ); + + if ( empty( $data ) ) + return array(); + + $contentIds = array(); + foreach ( $data as $item ) + $contentIds[] = $item['contentobject_id']; + + $roleData = $this->roleGateway->loadRolesForContentObjects( $contentIds ); + return $this->mapper->mapRoleAssignments( $data, $roleData ); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Mapper.php b/eZ/Publish/Core/Persistence/Legacy/User/Mapper.php new file mode 100644 index 0000000..4de3678 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Mapper.php @@ -0,0 +1,233 @@ +<?php +/** + * File containing the User mapper + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User; + +use eZ\Publish\SPI\Persistence\User; +use eZ\Publish\SPI\Persistence\User\Role; +use eZ\Publish\SPI\Persistence\User\Policy; +use eZ\Publish\SPI\Persistence\User\RoleAssignment; + +/** + * mapper for User related objects + */ +class Mapper +{ + /** + * Map user data into user object + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function mapUser( array $data ) + { + $user = new User(); + $user->id = $data['contentobject_id']; + $user->login = $data['login']; + $user->email = $data['email']; + $user->passwordHash = $data['password_hash']; + $user->hashAlgorithm = $data['password_hash_type']; + $user->isEnabled = (bool)$data['is_enabled']; + $user->maxLogin = $data['max_login']; + + return $user; + } + + /** + * Map data for a set of user data + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\User[] + */ + public function mapUsers( array $data ) + { + $users = array(); + foreach ( $data as $row ) + { + $users[] = $this->mapUser( $row ); + } + + return $users; + } + + /** + * Map policy data to an array of policies + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\User\Policy + */ + public function mapPolicies( array $data ) + { + /** + * @var \eZ\Publish\SPI\Persistence\User\Policy[] $policies + */ + $policies = array(); + foreach ( $data as $row ) + { + $policyId = $row['ezpolicy_id']; + if ( !isset( $policies[$policyId] ) && + ( $policyId !== null ) ) + { + $policies[$policyId] = new Policy( + array( + 'id' => $row['ezpolicy_id'], + 'roleId' => $row['ezrole_id'], + 'module' => $row['ezpolicy_module_name'], + 'function' => $row['ezpolicy_function_name'], + 'limitations' => '*' // limitations must be '*' if not a non empty array of limitations + ) + ); + } + + if ( !$row['ezpolicy_limitation_identifier'] ) + { + continue; + } + else if ( $policies[$policyId]->limitations === '*' ) + { + $policies[$policyId]->limitations = array(); + } + + if ( !isset( $policies[$policyId]->limitations[$row['ezpolicy_limitation_identifier']] ) ) + { + $policies[$policyId]->limitations[$row['ezpolicy_limitation_identifier']] = array( $row['ezpolicy_limitation_value_value'] ); + } + else if ( !in_array( $row['ezpolicy_limitation_value_value'], $policies[$policyId]->limitations[$row['ezpolicy_limitation_identifier']] ) ) + { + $policies[$policyId]->limitations[$row['ezpolicy_limitation_identifier']][] = $row['ezpolicy_limitation_value_value']; + } + } + + return array_values( $policies ); + } + + /** + * Map role data to a role + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function mapRole( array $data ) + { + $role = new Role(); + + foreach ( $data as $row ) + { + if ( empty( $role->id ) ) + { + $role->id = (int)$row['ezrole_id']; + $role->identifier = $row['ezrole_name']; + // skip name and description as they don't exist in legacy + } + + $role->groupIds[] = $row['ezuser_role_contentobject_id']; + } + + // Remove duplicates and sanitize arrays + $role->groupIds = array_values( array_unique( array_filter( $role->groupIds ) ) ); + $role->policies = $this->mapPolicies( $data ); + + return $role; + } + + /** + * Map data for a set of roles + * + * @param array $data + * @param boolean $indexById + * + * @return \eZ\Publish\SPI\Persistence\User\Role[] + */ + public function mapRoles( array $data, $indexById = false ) + { + $roleData = array(); + foreach ( $data as $row ) + { + $roleData[$row['ezrole_id']][] = $row; + } + + $roles = array(); + foreach ( $roleData as $id => $data ) + { + if ( $indexById ) + $roles[$id] = $this->mapRole( $data ); + else + $roles[] = $this->mapRole( $data ); + } + + return $roles; + } + + /** + * Map data for a set of role assignments + * + * @param array $data + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function mapRoleAssignments( array $data, array $roleData ) + { + $roles = $this->mapRoles( $roleData, true ); + + $roleAssignmentData = array(); + foreach ( $data as $row ) + { + $roleId = (int)$row['role_id']; + $contentId = (int)$row['contentobject_id']; + // if user already have full access to a role, continue + if ( isset( $roleAssignmentData[$roleId][$contentId] ) + && $roleAssignmentData[$roleId][$contentId] instanceof RoleAssignment ) + continue; + + $limitIdentifier = $row['limit_identifier']; + if ( !empty( $limitIdentifier ) ) + { + if ( !isset( $roleAssignmentData[$roleId][$contentId][$limitIdentifier] ) ) + { + $roleAssignmentData[$roleId][$contentId][$limitIdentifier] = new RoleAssignment( + array( + 'role' => $roles[$roleId], + 'contentId' => $contentId, + 'limitationIdentifier' => $limitIdentifier, + 'values' => array( $row['limit_value'] ) + ) + ); + } + else + { + $roleAssignmentData[$roleId][$contentId][$limitIdentifier]->values[] = $row['limit_value']; + } + } + else + { + $roleAssignmentData[$roleId][$contentId] = new RoleAssignment( + array( + 'role' => $roles[$roleId], + 'contentId' => $contentId + ) + ); + } + } + + $roleAssignments = array(); + array_walk_recursive( + $roleAssignmentData, + function( $roleAssignment ) use ( &$roleAssignments ) + { + $roleAssignments[] = $roleAssignment; + } + ); + + return $roleAssignments; + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway.php b/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway.php new file mode 100644 index 0000000..3cac02d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway.php @@ -0,0 +1,134 @@ +<?php +/** + * File containing the ContentTypeGateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User\Role; + +use eZ\Publish\SPI\Persistence\User\RoleUpdateStruct; +use eZ\Publish\SPI\Persistence\User\Policy; +use eZ\Publish\SPI\Persistence\User\Role; + +/** + * Base class for content type gateways. + */ +abstract class Gateway +{ + /** + * Create new role + * + * @param Role $role + * + * @return Role + */ + abstract public function createRole( Role $role ); + + /** + * Loads a specified role by $roleId + * + * @param mixed $roleId + * + * @return array + */ + abstract public function loadRole( $roleId ); + + /** + * Loads a specified role by $identifier + * + * @param string $identifier + * + * @return array + */ + abstract public function loadRoleByIdentifier( $identifier ); + + /** + * Loads all roles + * + * @return array + */ + abstract public function loadRoles(); + + /** + * Loads all roles associated with the given content objects + * + * @param array $contentIds + * + * @return array + */ + abstract public function loadRolesForContentObjects( $contentIds ); + + /** + * Loads role assignments for specified content ID + * + * @param mixed $groupId + * @param boolean $inherited + * + * @return array + */ + abstract public function loadRoleAssignmentsByGroupId( $groupId, $inherited = false ); + + /** + * Returns the user policies associated with the user + * + * @param mixed $userId + * + * @return UserPolicy[] + */ + abstract public function loadPoliciesByUserId( $userId ); + + /** + * Update role + * + * @param RoleUpdateStruct $role + */ + abstract public function updateRole( RoleUpdateStruct $role ); + + /** + * Delete the specified role + * + * @param mixed $roleId + */ + abstract public function deleteRole( $roleId ); + + /** + * Adds a policy to a role + * + * @param mixed $roleId + * @param Policy $policy + * + * @return void + */ + abstract public function addPolicy( $roleId, Policy $policy ); + + /** + * Adds limitations to an existing policy + * + * @param int $policyId + * @param array $limitations + * + * @return void + */ + abstract public function addPolicyLimitations( $policyId, array $limitations ); + + /** + * Removes a policy from a role + * + * @param mixed $policyId + * + * @return void + */ + abstract public function removePolicy( $policyId ); + + /** + * Removes a policy from a role + * + * @param mixed $policyId + * + * @return void + */ + abstract public function removePolicyLimitations( $policyId ); +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway/ExceptionConversion.php b/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway/ExceptionConversion.php new file mode 100644 index 0000000..d71989d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway/ExceptionConversion.php @@ -0,0 +1,334 @@ +<?php +/** + * File containing the ContentTypeGateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway; +use eZ\Publish\SPI\Persistence\User\Policy; +use eZ\Publish\SPI\Persistence\User\RoleUpdateStruct; +use eZ\Publish\SPI\Persistence\User\Role; + +/** + * Base class for content type gateways. + */ +class ExceptionConversion extends Gateway +{ + /** + * The wrapped gateway + * + * @var Gateway + */ + protected $innerGateway; + + /** + * Creates a new exception conversion gateway around $innerGateway + * + * @param Gateway $innerGateway + */ + public function __construct( Gateway $innerGateway ) + { + $this->innerGateway = $innerGateway; + } + + /** + * Create new role + * + * @param Role $role + * + * @return Role + */ + public function createRole( Role $role ) + { + try + { + return $this->innerGateway->createRole( $role ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads a specified role by $roleId + * + * @param mixed $roleId + * + * @return array + */ + public function loadRole( $roleId ) + { + try + { + return $this->innerGateway->loadRole( $roleId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads a specified role by $identifier + * + * @param string $identifier + * + * @return array + */ + public function loadRoleByIdentifier( $identifier ) + { + try + { + return $this->innerGateway->loadRoleByIdentifier( $identifier ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads all roles + * + * @return array + */ + public function loadRoles() + { + try + { + return $this->innerGateway->loadRoles(); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads all roles associated with the given content objects + * + * @param array $contentIds + * + * @return array + */ + public function loadRolesForContentObjects( $contentIds ) + { + try + { + return $this->innerGateway->loadRolesForContentObjects( $contentIds ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Loads role assignments for specified content ID + * + * @param mixed $groupId + * @param boolean $inherited + * + * @return array + */ + public function loadRoleAssignmentsByGroupId( $groupId, $inherited = false ) + { + try + { + return $this->innerGateway->loadRoleAssignmentsByGroupId( $groupId, $inherited ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Returns the user policies associated with the user + * + * @param mixed $userId + * + * @return UserPolicy[] + */ + public function loadPoliciesByUserId( $userId ) + { + try + { + return $this->innerGateway->loadPoliciesByUserId( $userId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Update role + * + * @param RoleUpdateStruct $role + */ + public function updateRole( RoleUpdateStruct $role ) + { + try + { + return $this->innerGateway->updateRole( $role ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Delete the specified role + * + * @param mixed $roleId + */ + public function deleteRole( $roleId ) + { + try + { + return $this->innerGateway->deleteRole( $roleId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Adds a policy to a role + * + * @param mixed $roleId + * @param Policy $policy + * + * @return void + */ + public function addPolicy( $roleId, Policy $policy ) + { + try + { + return $this->innerGateway->addPolicy( $roleId, $policy ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Adds limitations to an existing policy + * + * @param int $policyId + * @param array $limitations + * + * @return void + */ + public function addPolicyLimitations( $policyId, array $limitations ) + { + try + { + return $this->innerGateway->addPolicyLimitations( $policyId, $limitations ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Removes a policy from a role + * + * @param mixed $policyId + * + * @return void + */ + public function removePolicy( $policyId ) + { + try + { + return $this->innerGateway->removePolicy( $policyId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } + + /** + * Removes a policy from a role + * + * @param mixed $policyId + * + * @return void + */ + public function removePolicyLimitations( $policyId ) + { + try + { + return $this->innerGateway->removePolicyLimitations( $policyId ); + } + catch ( \ezcDbException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + catch ( \PDOException $e ) + { + throw new \RuntimeException( 'Database error', 0, $e ); + } + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway/EzcDatabase.php b/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway/EzcDatabase.php new file mode 100644 index 0000000..26047e2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/User/Role/Gateway/EzcDatabase.php @@ -0,0 +1,676 @@ +<?php +/** + * File containing the ContentTypeGateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway; + +use eZ\Publish\Core\Persistence\Legacy\User\Role\Gateway; +use eZ\Publish\Core\Persistence\Legacy\EzcDbHandler; +use eZ\Publish\SPI\Persistence\User\Policy; +use eZ\Publish\SPI\Persistence\User\RoleUpdateStruct; +use eZ\Publish\SPI\Persistence\User\Role; + +/** + * Base class for content type gateways. + */ +class EzcDatabase extends Gateway +{ + /** + * Database handler + * + * @var EzcDbHandler + */ + protected $handler; + + /** + * Internal type ID for user groups + */ + const GROUP_TYPE_ID = 3; + + /** + * Construct from database handler + * + * @param \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler $handler + * + * @return void + */ + public function __construct( EzcDbHandler $handler ) + { + $this->handler = $handler; + } + + /** + * Create new role + * + * @param \eZ\Publish\SPI\Persistence\User\Role $role + * + * @return Role + */ + public function createRole( Role $role ) + { + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezrole' ) ) + ->set( + $this->handler->quoteColumn( 'id' ), + $this->handler->getAutoIncrementValue( 'ezrole', 'id' ) + )->set( + $this->handler->quoteColumn( 'is_new' ), + 0 + )->set( + $this->handler->quoteColumn( 'name' ), + $query->bindValue( $role->identifier ) + )->set( + $this->handler->quoteColumn( 'value' ), + 0 + )->set( + $this->handler->quoteColumn( 'version' ), + 0 + ); + $query->prepare()->execute(); + + $role->id = $this->handler->lastInsertId( + $this->handler->getSequenceName( 'ezrole', 'id' ) + ); + } + + /** + * Loads a specified role by id + * + * @param mixed $roleId + * + * @return array + */ + public function loadRole( $roleId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->aliasedColumn( $query, 'id', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'name', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'contentobject_id', 'ezuser_role' ), + $this->handler->aliasedColumn( $query, 'id', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'function_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'module_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'identifier', 'ezpolicy_limitation' ), + $this->handler->aliasedColumn( $query, 'value', 'ezpolicy_limitation_value' ) + )->from( + $this->handler->quoteTable( 'ezrole' ) + )->leftJoin( + $this->handler->quoteTable( 'ezuser_role' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezuser_role' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezpolicy' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation' ), + $query->expr->eq( + $this->handler->quoteColumn( 'policy_id', 'ezpolicy_limitation' ), + $this->handler->quoteColumn( 'id', 'ezpolicy' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation_value' ), + $query->expr->eq( + $this->handler->quoteColumn( 'limitation_id', 'ezpolicy_limitation_value' ), + $this->handler->quoteColumn( 'id', 'ezpolicy_limitation' ) + ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'id', 'ezrole' ), + $query->bindValue( $roleId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads a specified role by $identifier + * + * @param string $identifier + * + * @return array + */ + public function loadRoleByIdentifier( $identifier ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->aliasedColumn( $query, 'id', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'name', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'contentobject_id', 'ezuser_role' ), + $this->handler->aliasedColumn( $query, 'id', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'function_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'module_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'identifier', 'ezpolicy_limitation' ), + $this->handler->aliasedColumn( $query, 'value', 'ezpolicy_limitation_value' ) + )->from( + $this->handler->quoteTable( 'ezrole' ) + )->leftJoin( + $this->handler->quoteTable( 'ezuser_role' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezuser_role' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezpolicy' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation' ), + $query->expr->eq( + $this->handler->quoteColumn( 'policy_id', 'ezpolicy_limitation' ), + $this->handler->quoteColumn( 'id', 'ezpolicy' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation_value' ), + $query->expr->eq( + $this->handler->quoteColumn( 'limitation_id', 'ezpolicy_limitation_value' ), + $this->handler->quoteColumn( 'id', 'ezpolicy_limitation' ) + ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'name', 'ezrole' ), + $query->bindValue( $identifier, null, \PDO::PARAM_STR ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads all roles + * + * @return array + */ + public function loadRoles() + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->aliasedColumn( $query, 'id', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'name', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'contentobject_id', 'ezuser_role' ), + $this->handler->aliasedColumn( $query, 'id', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'function_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'module_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'identifier', 'ezpolicy_limitation' ), + $this->handler->aliasedColumn( $query, 'value', 'ezpolicy_limitation_value' ) + )->from( + $this->handler->quoteTable( 'ezrole' ) + )->leftJoin( + $this->handler->quoteTable( 'ezuser_role' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezuser_role' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezpolicy' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation' ), + $query->expr->eq( + $this->handler->quoteColumn( 'policy_id', 'ezpolicy_limitation' ), + $this->handler->quoteColumn( 'id', 'ezpolicy' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation_value' ), + $query->expr->eq( + $this->handler->quoteColumn( 'limitation_id', 'ezpolicy_limitation_value' ), + $this->handler->quoteColumn( 'id', 'ezpolicy_limitation' ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads all roles associated with the given content objects + * + * @param array $contentIds + * + * @return array + */ + public function loadRolesForContentObjects( $contentIds ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->aliasedColumn( $query, 'contentobject_id', 'ezuser_role' ), + $this->handler->aliasedColumn( $query, 'id', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'name', 'ezrole' ), + $this->handler->aliasedColumn( $query, 'id', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'function_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'module_name', 'ezpolicy' ), + $this->handler->aliasedColumn( $query, 'identifier', 'ezpolicy_limitation' ), + $this->handler->aliasedColumn( $query, 'value', 'ezpolicy_limitation_value' ) + )->from( + $query->alias( + $this->handler->quoteTable( 'ezuser_role' ), + $this->handler->quoteIdentifier( 'ezuser_role_search' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezrole' ), + $query->expr->eq( + $this->handler->quoteColumn( 'id', 'ezrole' ), + $this->handler->quoteColumn( 'role_id', 'ezuser_role_search' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezuser_role' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezuser_role' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy' ), + $query->expr->eq( + $this->handler->quoteColumn( 'role_id', 'ezpolicy' ), + $this->handler->quoteColumn( 'id', 'ezrole' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation' ), + $query->expr->eq( + $this->handler->quoteColumn( 'policy_id', 'ezpolicy_limitation' ), + $this->handler->quoteColumn( 'id', 'ezpolicy' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation_value' ), + $query->expr->eq( + $this->handler->quoteColumn( 'limitation_id', 'ezpolicy_limitation_value' ), + $this->handler->quoteColumn( 'id', 'ezpolicy_limitation' ) + ) + )->where( + $query->expr->in( + $this->handler->quoteColumn( 'contentobject_id', 'ezuser_role_search' ), + $contentIds + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Loads role assignments for specified content ID + * + * @param mixed $groupId + * @param boolean $inherited + * + * @return array + */ + public function loadRoleAssignmentsByGroupId( $groupId, $inherited = false ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->quoteColumn( 'contentobject_id' ), + $this->handler->quoteColumn( 'limit_identifier' ), + $this->handler->quoteColumn( 'limit_value' ), + $this->handler->quoteColumn( 'role_id' ) + )->from( + $this->handler->quoteTable( 'ezuser_role' ) + ); + + if ( $inherited ) + { + $groupIds = $this->fetchUserGroups( $groupId ); + $groupIds[] = $groupId; + $query->where( + $query->expr->in( + $this->handler->quoteColumn( 'contentobject_id' ), + $groupIds + ) + ); + } + else + { + $query->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id' ), + $query->bindValue( $groupId, null, \PDO::PARAM_INT ) + ) + ); + } + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_ASSOC ); + } + + /** + * Returns the user policies associated with the user + * + * @param mixed $userId + * + * @return UserPolicy[] + */ + public function loadPoliciesByUserId( $userId ) + { + $groupIds = $this->fetchUserGroups( $userId ); + $groupIds[] = $userId; + + return $this->loadRolesForContentObjects( $groupIds ); + } + + /** + * Fetch all group IDs the user belongs to + * + * @param int $userId + * + * @return array + */ + protected function fetchUserGroups( $userId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->quoteColumn( 'path_string', 'ezcontentobject_tree' ) + )->from( + $this->handler->quoteTable( 'ezcontentobject_tree' ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'contentobject_id', 'ezcontentobject_tree' ), + $query->bindValue( $userId ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $paths = $statement->fetchAll( \PDO::FETCH_COLUMN ); + $nodeIDs = array_unique( + array_reduce( + array_map( + function ( $pathString ) + { + return array_filter( explode( '/', $pathString ) ); + }, + $paths + ), + 'array_merge_recursive', + array() + ) + ); + + if ( empty( $nodeIDs ) ) + return array(); + + // Limit nodes to groups only + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->quoteColumn( 'id', 'ezcontentobject' ) + )->from( + $this->handler->quoteTable( 'ezcontentobject_tree' ) + )->rightJoin( + $this->handler->quoteTable( 'ezcontentobject' ), + $query->expr->eq( + $this->handler->quoteColumn( 'id', 'ezcontentobject' ), + $this->handler->quoteColumn( 'contentobject_id', 'ezcontentobject_tree' ) + ) + )->where( + $query->expr->lAnd( + $query->expr->in( + $this->handler->quoteColumn( 'node_id', 'ezcontentobject_tree' ), + $nodeIDs + ), + $query->expr->eq( + $this->handler->quoteColumn( 'contentclass_id', 'ezcontentobject' ), + // We use the integer type ID here, to minimize joins and + // make use of existing keys. One might want to make this + // "injectable". + $query->bindValue( self::GROUP_TYPE_ID, null, \PDO::PARAM_INT )// @todo: Can not hard code group type id! + ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + return $statement->fetchAll( \PDO::FETCH_COLUMN ); + } + + /** + * Update role + * + * @param \eZ\Publish\SPI\Persistence\User\RoleUpdateStruct $role + */ + public function updateRole( RoleUpdateStruct $role ) + { + $query = $this->handler->createUpdateQuery(); + $query + ->update( $this->handler->quoteTable( 'ezrole' ) ) + ->set( + $this->handler->quoteColumn( 'name' ), + $query->bindValue( $role->identifier ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'id' ), + $query->bindValue( $role->id, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Delete the specified role + * + * @param mixed $roleId + */ + public function deleteRole( $roleId ) + { + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( $this->handler->quoteTable( 'ezrole' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'id' ), + $query->bindValue( $roleId, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Adds a policy to a role + * + * @param mixed $roleId + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * + * @return void + */ + public function addPolicy( $roleId, Policy $policy ) + { + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezpolicy' ) ) + ->set( + $this->handler->quoteColumn( 'id' ), + $this->handler->getAutoIncrementValue( 'ezpolicy', 'id' ) + )->set( + $this->handler->quoteColumn( 'function_name' ), + $query->bindValue( $policy->function ) + )->set( + $this->handler->quoteColumn( 'module_name' ), + $query->bindValue( $policy->module ) + )->set( + $this->handler->quoteColumn( 'original_id' ), + 0 + )->set( + $this->handler->quoteColumn( 'role_id' ), + $query->bindValue( $roleId, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + + $policy->id = $this->handler->lastInsertId( + $this->handler->getSequenceName( 'ezpolicy', 'id' ) + ); + + // Handle the only valid non-array value "*" by not inserting + // anything. Still has not been documented by eZ Systems. So we + // assume this is the right way to handle it. + if ( is_array( $policy->limitations ) ) + { + $this->addPolicyLimitations( $policy->id, $policy->limitations ); + } + + return $policy; + } + + /** + * Adds limitations to an existing policy + * + * @param int $policyId + * @param array $limitations + * + * @return void + */ + public function addPolicyLimitations( $policyId, array $limitations ) + { + foreach ( $limitations as $identifier => $values ) + { + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezpolicy_limitation' ) ) + ->set( + $this->handler->quoteColumn( 'id' ), + $this->handler->getAutoIncrementValue( 'ezpolicy_limitation', 'id' ) + )->set( + $this->handler->quoteColumn( 'identifier' ), + $query->bindValue( $identifier ) + )->set( + $this->handler->quoteColumn( 'policy_id' ), + $query->bindValue( $policyId, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + + $limitationId = $this->handler->lastInsertId( + $this->handler->getSequenceName( 'ezpolicy_limitation', 'id' ) + ); + + foreach ( $values as $value ) + { + $query = $this->handler->createInsertQuery(); + $query + ->insertInto( $this->handler->quoteTable( 'ezpolicy_limitation_value' ) ) + ->set( + $this->handler->quoteColumn( 'id' ), + $this->handler->getAutoIncrementValue( 'ezpolicy_limitation_value', 'id' ) + )->set( + $this->handler->quoteColumn( 'value' ), + $query->bindValue( $value ) + )->set( + $this->handler->quoteColumn( 'limitation_id' ), + $query->bindValue( $limitationId, null, \PDO::PARAM_INT ) + ); + $query->prepare()->execute(); + } + } + } + + /** + * Removes a policy from a role + * + * @param mixed $policyId + * + * @return void + */ + public function removePolicy( $policyId ) + { + $this->removePolicyLimitations( $policyId ); + + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( $this->handler->quoteTable( 'ezpolicy' ) ) + ->where( + $query->expr->eq( + $this->handler->quoteColumn( 'id' ), + $query->bindValue( $policyId, null, \PDO::PARAM_INT ) + ) + ); + $query->prepare()->execute(); + } + + /** + * Remove all limitations for a policy + * + * @param mixed $policyId + * + * @return void + */ + public function removePolicyLimitations( $policyId ) + { + $query = $this->handler->createSelectQuery(); + $query->select( + $this->handler->aliasedColumn( $query, 'id', 'ezpolicy_limitation' ), + $this->handler->aliasedColumn( $query, 'id', 'ezpolicy_limitation_value' ) + )->from( + $this->handler->quoteTable( 'ezpolicy' ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation' ), + $query->expr->eq( + $this->handler->quoteColumn( 'policy_id', 'ezpolicy_limitation' ), + $this->handler->quoteColumn( 'id', 'ezpolicy' ) + ) + )->leftJoin( + $this->handler->quoteTable( 'ezpolicy_limitation_value' ), + $query->expr->eq( + $this->handler->quoteColumn( 'limitation_id', 'ezpolicy_limitation_value' ), + $this->handler->quoteColumn( 'id', 'ezpolicy_limitation' ) + ) + )->where( + $query->expr->eq( + $this->handler->quoteColumn( 'id', 'ezpolicy' ), + $query->bindValue( $policyId, null, \PDO::PARAM_INT ) + ) + ); + + $statement = $query->prepare(); + $statement->execute(); + + $limitations = array(); + $values = array(); + while ( $row = $statement->fetch( \PDO::FETCH_ASSOC ) ) + { + $limitations[] = $row['ezpolicy_limitation_id']; + $values[] = $row['ezpolicy_limitation_value_id']; + } + + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( $this->handler->quoteTable( 'ezpolicy_limitation' ) ) + ->where( + $query->expr->in( $this->handler->quoteColumn( 'id' ), array_unique( $limitations ) ) + ); + $query->prepare()->execute(); + + $query = $this->handler->createDeleteQuery(); + $query + ->deleteFrom( $this->handler->quoteTable( 'ezpolicy_limitation_value' ) ) + ->where( + $query->expr->in( $this->handler->quoteColumn( 'id' ), array_unique( $values ) ) + ); + $query->prepare()->execute(); + } +} diff --git a/eZ/Publish/Core/Persistence/Legacy/docs/architecture.txt b/eZ/Publish/Core/Persistence/Legacy/docs/architecture.txt new file mode 100644 index 0000000..a057be8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Legacy/docs/architecture.txt @@ -0,0 +1,126 @@ +============================== +Architecture of Legacy Storage +============================== + +This documents intends to provide a rough overview on the architecture of the +legacy storage and why it has been build like this. This document should be +read before any (structural) changes are made to the existing code. + +Basic concept +============= + +Almost every handler uses the same set of classes, which are build to enable +proper database abstraction and sane handling of the sometimes complex queries +and conversions. Let's take the relatively simple ``User\Handler`` as an +example. The following classes are defined:: + + User/ + ├── Gateway + │ └── EzcDatabase.php + ├── Gateway.php + ├── Handler.php + └── Mapper.php + +The ``Handler`` itself implements the handler interface, which is defines the +public interface to work with user data. All ``Handler`` implementations +aggregate a ``Gateway`` and a ``Mapper`` implementation. + +Mapper +------ + +Mappers are used to transform data returned from the SQL queries into the value +objects used by the API. Those methods are mostly quite simple, but lengthy. +The usually expect a certain data format, which the gateway *must* follow. This +is usually not specified explicitely, because it is the natural array structure +returned by database functions. + +Gateway +------- + +The ``Gateway`` implementations are used to actually interact with a database. +The default implementation ``EzcDatabase`` uses the Zeta Components Database +component to abstract quries, so they can be executed against multiple +different Relation Database Management Systems (RDBMS). + +The gateway layer has been introduced to make it possible to write optimized +queries for certain databases or modify queries, so that they work with a +database, which does not understand the common SQL. + +It is also possible to make a gateway not use the Zeta Components Database +component at all, but entirely different methods for acccessing a database. For +example the Oracle-PDO extension has some stability problems, so it might be +sensible to use the native Oracle PHP extension here. + +EzcDbHandler +^^^^^^^^^^^^ + +The ``EzcDatabase`` gateway implementations do not receive the connection +handle for the data directly, but a wrapped connection handle ``EzcDbHandler``, +which provides some additional convinience methods: + +- ``aliasedColumn( \ezcQuerySelect $query, $columnName, $tableName = null )`` +- ``quoteColumn( $columnName, $tableName = null )`` +- ``quoteTable( $tableName )`` +- ``getAutoIncrementValue( $table, $column )`` +- ``getSequenceName( $table, $column )`` + +Especially the quote-methods are intended to be overloaded for databases which +have certain restrictions on table name length (Oracle). + +The methods ``getAutoIncrementValue`` and ``getSequenceName`` make sure the +auto-increment handling works across multiple databases, which all implement +different variations of auto increment. + +Search Handler +============== + +The search handler itself contains some special features and concepts, which +are described in this section. + +Searching involves filtering the content tree by the given recursive criterion +tree. The criterion filtered search result is then sorted based on a set of +given sort clauses. + +For both, criteria and sort clauses, a handler structure has been implemented, +which implements handlers for each criterion or search clause. Additional +handlers for those can be added in the repository handler. The handlers itself +are fairly trivial and self explanatory. + +Content-Type Handler +==================== + +In order to abstract updating of content types, the ``…\Legacy\Content\Type\Handler`` +uses a dedicated handler ``…\Type\Update\Handler``. One of the existing +implementations of these abstractions realize type update in a synchronous +way, the other one relies on legacy eZ Publish functionality to realize an +asynchronous update. + +The synchronous mechanism (``…\Type\Update\Handler\EzcDatabase``) makes also +use of the so-called Content-Updater, which takes care for updating existing +Content objects. + +Storages and Converter +====================== + +There are basically 2 extension points for the Legacy Storage, which are +necessary in order to support custom field types: + +- Converters (for fields and field definitions) +- Storages (for external storage of custom types) + +All of these are available through the configuration of the +``…\Legacy\RepositoryHandler`` (as requested by eZ) and through public methods of +it, to be used for proper dependency injection. The corresponding interfaces / +abstract base classes are: + +- ``…\Legacy\Content\FieldValue\Converter`` +- ``eZ\Publish\SPI\FieldType\FieldStorage`` + + + +.. + Local Variables: + mode: rst + fill-column: 79 + End: + vim: et syn=rst tw=79 diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor.php new file mode 100644 index 0000000..76570e7 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor.php @@ -0,0 +1,96 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the criterion tree into a Solr query + */ +abstract class CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + abstract public function canVisit( Criterion $criterion ); + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + abstract public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ); + + /** + * Get Solr range + * + * Start and end are optional, depending on the respective operator. Pass + * null in this case. The operator may be one of: + * + * - case Operator::GT: + * - case Operator::GTE: + * - case Operator::LT: + * - case Operator::LTE: + * - case Operator::BETWEEN: + * + * @param mixed $operator + * @param mixed $start + * @param mixed $end + * + * @return void + */ + protected function getRange( $operator, $start, $end ) + { + $startBrace = '['; + $startValue = '*'; + $endValue = '*'; + $endBrace = ']'; + + switch ( $operator ) + { + case Operator::GT: + $startBrace = '{'; + $endBrace = '}'; + // Intentionally omitted break + + case Operator::GTE: + $startValue = $start; + break; + + case Operator::LT: + $startBrace = '{'; + $endBrace = '}'; + // Intentionally omitted break + + case Operator::LTE: + $endValue = $end; + break; + + case Operator::BETWEEN: + $startValue = $start; + $endValue = $end; + break; + + default: + throw new \RuntimeException( "Unknown operator: $operator" ); + } + + return "$startBrace$startValue TO $endValue$endBrace"; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Aggregate.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Aggregate.php new file mode 100644 index 0000000..792238a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Aggregate.php @@ -0,0 +1,88 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Exceptions\NotImplementedException; + +/** + * Visits the criterion tree into a Solr query + */ +class Aggregate extends CriterionVisitor +{ + /** + * Array of available visitors + * + * @var array + */ + protected $visitors = array(); + + /** + * COnstruct from optional visitor array + * + * @param array $visitors + * + * @return void + */ + public function __construct( array $visitors = array() ) + { + foreach ( $visitors as $visitor ) + { + $this->addVisitor( $visitor ); + } + } + + /** + * Adds visitor + * + * @param FieldValueVisitor $visitor + * + * @return void + */ + public function addVisitor( CriterionVisitor $visitor ) + { + $this->visitors[] = $visitor; + } + + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return true; + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + foreach ( $this->visitors as $visitor ) + { + if ( $visitor->canVisit( $criterion ) ) + { + return $visitor->visit( $criterion, $this ); + } + } + + throw new NotImplementedException( "No visitor available for: " . get_class( $criterion ) . ' with operator ' . $criterion->operator ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentIdIn.php new file mode 100644 index 0000000..3058924 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the ContentId criterion + */ +class ContentIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\ContentId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php new file mode 100644 index 0000000..8fb8a1b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentTypeGroupIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the ContentTypeGroupId criterion + */ +class ContentTypeGroupIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\ContentTypeGroupId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'group_id:"' . $value . '"'; + }, + (array)$criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentTypeIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentTypeIdIn.php new file mode 100644 index 0000000..abf5e0c --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ContentTypeIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the ContentTypeId criterion + */ +class ContentTypeIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\ContentTypeId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'type_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata.php new file mode 100644 index 0000000..787dead --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +/** + * Visits the DateMetadata criterion + */ +abstract class DateMetadata extends CriterionVisitor +{ + /** + * Map value to a proper Solr date representation + * + * @param mixed $value + * + * @return string + */ + protected function getSolrTime( $value ) + { + if ( is_numeric( $value ) ) + { + $date = new \DateTime( "@{$value}" ); + } + else + { + try + { + $date = new \DateTime( $value ); + } + catch ( Exception $e ) + { + throw new \InvalidArgumentException( "Invalid date provided: " . $value ); + } + } + + return $date->format( "Y-m-d\\TH:i:s\\Z" ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/ModifiedBetween.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/ModifiedBetween.php new file mode 100644 index 0000000..d48b924 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/ModifiedBetween.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the DateMetadata criterion + */ +class ModifiedBetween extends DateMetadata +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\DateMetadata && + $criterion->target === "modified" && + ( $criterion->operator === Operator::LT || + $criterion->operator === Operator::LTE || + $criterion->operator === Operator::GT || + $criterion->operator === Operator::GTE || + $criterion->operator === Operator::BETWEEN ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + $start = $this->getSolrTime( $criterion->value[0] ); + $end = isset( $criterion->value[1] ) ? $this->getSolrTime( $criterion->value[1] ) : null; + + if ( ( $criterion->operator === Operator::LT ) || + ( $criterion->operator === Operator::LTE ) ) + { + $end = $start; + $start = null; + } + + return "modified_dt:" . $this->getRange( $criterion->operator, $start, $end ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php new file mode 100644 index 0000000..c891a11 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/ModifiedIn.php @@ -0,0 +1,62 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the DateMetadata criterion + */ +class ModifiedIn extends DateMetadata +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\DateMetadata && + $criterion->target === "modified" && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'modified_dt:"' . $this->getSolrTime( $value ) . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/PublishedBetween.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/PublishedBetween.php new file mode 100644 index 0000000..0b112e5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/PublishedBetween.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the DateMetadata criterion + */ +class PublishedBetween extends DateMetadata +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\DateMetadata && + $criterion->target === "created" && + ( $criterion->operator === Operator::LT || + $criterion->operator === Operator::LTE || + $criterion->operator === Operator::GT || + $criterion->operator === Operator::GTE || + $criterion->operator === Operator::BETWEEN ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + $start = $this->getSolrTime( $criterion->value[0] ); + $end = isset( $criterion->value[1] ) ? $this->getSolrTime( $criterion->value[1] ) : null; + + if ( ( $criterion->operator === Operator::LT ) || + ( $criterion->operator === Operator::LTE ) ) + { + $end = $start; + $start = null; + } + + return "published_dt:" . $this->getRange( $criterion->operator, $start, $end ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php new file mode 100644 index 0000000..fb851f1 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/DateMetadata/PublishedIn.php @@ -0,0 +1,62 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\DateMetadata; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the DateMetadata criterion + */ +class PublishedIn extends DateMetadata +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\DateMetadata && + $criterion->target === "created" && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'published_dt:"' . $this->getSolrTime( $value ) . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field.php new file mode 100644 index 0000000..379eeef --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field.php @@ -0,0 +1,99 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\SPI\Persistence\Content\Type\Handler as ContentTypeHandler; +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldNameGenerator; +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldRegistry; + +/** + * Visits the Field criterion + */ +abstract class Field extends CriterionVisitor +{ + /** + * Field registry + * + * @var \eZ\Publish\Core\Persistence\Solr\Content\Search\FieldRegistry + */ + protected $fieldRegistry; + + /** + * Content type handler + * + * @var \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + protected $contentTypeHandler; + + /** + * Field name generator + * + * @var FieldNameGenerator + */ + protected $nameGenerator; + + /** + * Available field types + * + * @var array + */ + protected $fieldTypes; + + /** + * Create from content type handler and field registry + * + * @param FieldRegistry $fieldRegistry + * @param ContentTypeHandler $contentTypeHandler + * + * @return void + */ + public function __construct( FieldRegistry $fieldRegistry, ContentTypeHandler $contentTypeHandler, FieldNameGenerator $nameGenerator ) + { + $this->fieldRegistry = $fieldRegistry; + $this->contentTypeHandler = $contentTypeHandler; + $this->nameGenerator = $nameGenerator; + } + + /** + * Get field type information + * + * @return void + */ + protected function getFieldTypes() + { + if ( $this->fieldTypes !== null ) + { + return $this->fieldTypes; + } + + foreach ( $this->contentTypeHandler->loadAllGroups() as $group ) + { + foreach ( $this->contentTypeHandler->loadContentTypes( $group->id ) as $contentType ) + { + foreach ( $contentType->fieldDefinitions as $fieldDefinition ) + { + $fieldType = $this->fieldRegistry->getType( $fieldDefinition->fieldType ); + foreach ( $fieldType->getIndexDefinition() as $name => $type ) + { + $this->fieldTypes[$fieldDefinition->identifier][] = + $this->nameGenerator->getTypedName( + $this->nameGenerator->getName( $name, $fieldDefinition->identifier, $contentType->identifier ), + $type + ); + } + } + } + } + + return $this->fieldTypes; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field/FieldIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field/FieldIn.php new file mode 100644 index 0000000..2c34cec --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field/FieldIn.php @@ -0,0 +1,67 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\Field; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\Field; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the Field criterion + */ +class FieldIn extends Field +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\Field && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + $fieldTypes = $this->getFieldTypes(); + $criterion->value = (array)$criterion->value; + + if ( !isset( $fieldTypes[$criterion->target] ) ) + { + throw new \OutOfBoundsException( "Content type field {$criterion->target} not found." ); + } + + $queries = array(); + foreach ( $criterion->value as $value ) + { + foreach ( $fieldTypes[$criterion->target] as $name ) + { + $queries[] = $name . ':"' . $value . '"'; + } + } + + return '(' . implode( ' OR ', $queries ) . ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field/FieldRange.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field/FieldRange.php new file mode 100644 index 0000000..d3c233d --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/Field/FieldRange.php @@ -0,0 +1,77 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\Field; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor\Field; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the Field criterion + */ +class FieldRange extends Field +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\Field && + ( $criterion->operator === Operator::LT || + $criterion->operator === Operator::LTE || + $criterion->operator === Operator::GT || + $criterion->operator === Operator::GTE || + $criterion->operator === Operator::BETWEEN ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + $start = $criterion->value[0]; + $end = isset( $criterion->value[1] ) ? $criterion->value[1] : null; + + if ( ( $criterion->operator === Operator::LT ) || + ( $criterion->operator === Operator::LTE ) ) + { + $end = $start; + $start = null; + } + + $fieldTypes = $this->getFieldTypes(); + $criterion->value = (array)$criterion->value; + + if ( !isset( $fieldTypes[$criterion->target] ) ) + { + throw new \OutOfBoundsException( "Content type field {$criterion->target} not found." ); + } + + $queries = array(); + foreach ( $fieldTypes[$criterion->target] as $name ) + { + $queries[] = $name . ':' . $this->getRange( $criterion->operator, $start, $end ); + } + + return '(' . implode( ' OR ', $queries ) . ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/FullText.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/FullText.php new file mode 100644 index 0000000..0d961da --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/FullText.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; + +/** + * Visits the FullText criterion + */ +class FullText extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return $criterion instanceof Criterion\FullText; + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return "text:" . $criterion->value; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LanguageCodeIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LanguageCodeIn.php new file mode 100644 index 0000000..9e3be45 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LanguageCodeIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the LanguageCodeIn visitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the LanguageCode criterion + */ +class LanguageCodeIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\LanguageCode && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'language_code_s:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LocationIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LocationIdIn.php new file mode 100644 index 0000000..15c1b80 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LocationIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the LocationId criterion + */ +class LocationIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\LocationId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'location_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LocationRemoteIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LocationRemoteIdIn.php new file mode 100644 index 0000000..a949d17 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LocationRemoteIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the LocationRemoteId criterion + */ +class LocationRemoteIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\LocationRemoteId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'location_remote_id_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalAnd.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalAnd.php new file mode 100644 index 0000000..438607e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalAnd.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; + +/** + * Visits the LogicalAnd criterion + */ +class LogicalAnd extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return $criterion instanceof Criterion\LogicalAnd; + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' AND ', + array_map( + function( $value ) use ( $subVisitor ) + { + return $subVisitor->visit( $value ); + }, + $criterion->criteria + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalNot.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalNot.php new file mode 100644 index 0000000..df28d93 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalNot.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; + +/** + * Visits the LogicalNot criterion + */ +class LogicalNot extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return $criterion instanceof Criterion\LogicalNot; + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + if ( !isset( $criterion->criteria[0] ) || + ( count( $criterion->criteria ) > 1 ) ) + { + throw new \RuntimeException( "Invalid aggregation in LogicalNot criterion." ); + } + + return 'NOT (' . $subVisitor->visit( $criterion->criteria[0] ) . ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalOr.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalOr.php new file mode 100644 index 0000000..abe3ae3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/LogicalOr.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; + +/** + * Visits the LogicalOr criterion + */ +class LogicalOr extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return $criterion instanceof Criterion\LogicalOr; + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) use ( $subVisitor ) + { + return $subVisitor->visit( $value ); + }, + $criterion->criteria + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ObjectStateIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ObjectStateIdIn.php new file mode 100644 index 0000000..29bbcfc --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ObjectStateIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the ObjectStateIdIn visitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the ObjectStateId criterion + */ +class ObjectStateIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\ObjectStateId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'object_state_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ParentLocationIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ParentLocationIdIn.php new file mode 100644 index 0000000..b81885f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/ParentLocationIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the ParentLocationId criterion + */ +class ParentLocationIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\ParentLocationId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'location_parent_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/RemoteIdIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/RemoteIdIn.php new file mode 100644 index 0000000..7ac1170 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/RemoteIdIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the RemoteId criterion + */ +class RemoteIdIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\RemoteId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'remote_id_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/SectionIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/SectionIn.php new file mode 100644 index 0000000..520a4d8 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/SectionIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the Section criterion + */ +class SectionIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\SectionId && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'section_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/StatusIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/StatusIn.php new file mode 100644 index 0000000..9bd1216 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/StatusIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the Status criterion + */ +class StatusIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\Status && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'status_id:"' . $value . '"'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/SubtreeIn.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/SubtreeIn.php new file mode 100644 index 0000000..05509f6 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/CriterionVisitor/SubtreeIn.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator; + +/** + * Visits the Subtree criterion + */ +class SubtreeIn extends CriterionVisitor +{ + /** + * CHeck if visitor is applicable to current criterion + * + * @param Criterion $criterion + * + * @return boolean + */ + public function canVisit( Criterion $criterion ) + { + return + $criterion instanceof Criterion\Subtree && + ( ( $criterion->operator ?: Operator::IN ) === Operator::IN || + $criterion->operator === Operator::EQ ); + } + + /** + * Map field value to a proper Solr representation + * + * @param Criterion $criterion + * @param CriterionVisitor $subVisitor + * + * @return void + */ + public function visit( Criterion $criterion, CriterionVisitor $subVisitor = null ) + { + return '(' . + implode( + ' OR ', + array_map( + function( $value ) + { + return 'path_id:' . $value . '*'; + }, + $criterion->value + ) + ) . + ')'; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor.php new file mode 100644 index 0000000..4ce6dfc --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor.php @@ -0,0 +1,76 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder; + +/** + * Visits the facet builder tree into a Solr query + */ +abstract class FacetBuilderVisitor +{ + /** + * CHeck if visitor is applicable to current facet result + * + * @param string $field + * + * @return boolean + */ + abstract public function canMap( $field ); + + /** + * Map Solr facet result back to facet objects + * + * @param string $field + * @param array $data + * + * @return Facet + */ + abstract public function map( $field, array $data ); + + /** + * CHeck if visitor is applicable to current facet builder + * + * @param FacetBuilder $facetBuilder + * + * @return boolean + */ + abstract public function canVisit( FacetBuilder $facetBuilder ); + + /** + * Map field value to a proper Solr representation + * + * @param FacetBuilder $facetBuilder + * + * @return void + */ + abstract public function visit( FacetBuilder $facetBuilder ); + + /** + * Map Solr return array into a sane hash map + * + * @param array $data + * + * @return array + */ + protected function mapData( array $data ) + { + $values = array(); + reset( $data ); + while ( $key = current( $data ) ) + { + $values[$key] = next( $data ); + next( $data ); + } + + return $values; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/Aggregate.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/Aggregate.php new file mode 100644 index 0000000..5825ff3 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/Aggregate.php @@ -0,0 +1,120 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder; +use eZ\Publish\API\Repository\Exceptions\NotImplementedException; + +/** + * Visits the facet builder tree into a Solr query + */ +class Aggregate extends FacetBuilderVisitor +{ + /** + * Array of available visitors + * + * @var array + */ + protected $visitors = array(); + + /** + * COnstruct from optional visitor array + * + * @param array $visitors + * + * @return void + */ + public function __construct( array $visitors = array() ) + { + foreach ( $visitors as $visitor ) + { + $this->addVisitor( $visitor ); + } + } + + /** + * Adds visitor + * + * @param FieldValueVisitor $visitor + * + * @return void + */ + public function addVisitor( FacetBuilderVisitor $visitor ) + { + $this->visitors[] = $visitor; + } + + /** + * CHeck if visitor is applicable to current facet result + * + * @param string $field + * + * @return boolean + */ + public function canMap( $field ) + { + return true; + } + + /** + * Map Solr facet result back to facet objects + * + * @param string $field + * @param array $data + * + * @return Facet + */ + public function map( $field, array $data ) + { + foreach ( $this->visitors as $visitor ) + { + if ( $visitor->canMap( $field ) ) + { + return $visitor->map( $field, $data ); + } + } + + throw new \OutOfRangeException( "No visitor available for: " . $field ); + } + + /** + * CHeck if visitor is applicable to current facet builder + * + * @param FacetBuilder $facetBuilder + * + * @return boolean + */ + public function canVisit( FacetBuilder $facetBuilder ) + { + return true; + } + + /** + * Map field value to a proper Solr representation + * + * @param FacetBuilder $facetBuilder + * + * @return void + */ + public function visit( FacetBuilder $facetBuilder ) + { + foreach ( $this->visitors as $visitor ) + { + if ( $visitor->canVisit( $facetBuilder ) ) + { + return $visitor->visit( $facetBuilder ); + } + } + + throw new NotImplementedException( "No visitor available for: " . get_class( $facetBuilder ) ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/ContentType.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/ContentType.php new file mode 100644 index 0000000..b003752 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/ContentType.php @@ -0,0 +1,81 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder; +use eZ\Publish\API\Repository\Values\Content\Search\Facet; + +/** + * Visits the ContentType facet builder + */ +class ContentType extends FacetBuilderVisitor +{ + /** + * CHeck if visitor is applicable to current facet result + * + * @param string $field + * + * @return boolean + */ + public function canMap( $field ) + { + return $field === 'type_id'; + } + + /** + * Map Solr facet result back to facet objects + * + * @param string $field + * @param array $data + * + * @return Facet + */ + public function map( $field, array $data ) + { + return new Facet\ContentTypeFacet( + array( + 'name' => 'type', + 'entries' => $this->mapData( $data ), + ) + ); + } + + /** + * Check if visitor is applicable to current facet builder + * + * @param FacetBuilder $facetBuilder + * + * @return boolean + */ + public function canVisit( FacetBuilder $facetBuilder ) + { + return $facetBuilder instanceof FacetBuilder\ContentTypeFacetBuilder; + } + + /** + * Map field value to a proper Solr representation + * + * @param FacetBuilder $facetBuilder; + * + * @return void + */ + public function visit( FacetBuilder $facetBuilder ) + { + return http_build_query( + array( + 'facet.field' => 'type_id', + 'f.type_id.facet.limit' => $facetBuilder->limit, + 'f.type_id.facet.mincount' => $facetBuilder->minCount, + ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/Section.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/Section.php new file mode 100644 index 0000000..5d0a829 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/Section.php @@ -0,0 +1,81 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder; +use eZ\Publish\API\Repository\Values\Content\Search\Facet; + +/** + * Visits the Section facet builder + */ +class Section extends FacetBuilderVisitor +{ + /** + * CHeck if visitor is applicable to current facet result + * + * @param string $field + * + * @return boolean + */ + public function canMap( $field ) + { + return $field === 'section_id'; + } + + /** + * Map Solr facet result back to facet objects + * + * @param string $field + * @param array $data + * + * @return Facet + */ + public function map( $field, array $data ) + { + return new Facet\SectionFacet( + array( + 'name' => 'section', + 'entries' => $this->mapData( $data ), + ) + ); + } + + /** + * Check if visitor is applicable to current facet builder + * + * @param FacetBuilder $facetBuilder + * + * @return boolean + */ + public function canVisit( FacetBuilder $facetBuilder ) + { + return $facetBuilder instanceof FacetBuilder\SectionFacetBuilder; + } + + /** + * Map field value to a proper Solr representation + * + * @param FacetBuilder $facetBuilder; + * + * @return void + */ + public function visit( FacetBuilder $facetBuilder ) + { + return http_build_query( + array( + 'facet.field' => 'section_id', + 'f.section_id.facet.limit' => $facetBuilder->limit, + 'f.section_id.facet.mincount' => $facetBuilder->minCount, + ) + ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/User.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/User.php new file mode 100644 index 0000000..d270f37 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FacetBuilderVisitor/User.php @@ -0,0 +1,80 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\FacetBuilder; +use eZ\Publish\API\Repository\Values\Content\Search\Facet; + +/** + * Visits the User facet builder + */ +class User extends FacetBuilderVisitor +{ + /** + * CHeck if visitor is applicable to current facet result + * + * @param string $field + * + * @return boolean + */ + public function canMap( $field ) + { + return $field === 'creator_id'; + } + + /** + * Map Solr facet result back to facet objects + * + * @param string $field + * @param array $data + * + * @return Facet + */ + public function map( $field, array $data ) + { + return new Facet\UserFacet( + array( + 'name' => 'creator', + 'entries' => $this->mapData( $data ), + ) + ); + } + + /** + * Check if visitor is applicable to current facet builder + * + * @param FacetBuilder $facetBuilder + * + * @return boolean + */ + public function canVisit( FacetBuilder $facetBuilder ) + { + return $facetBuilder instanceof FacetBuilder\UserFacetBuilder; + } + + /** + * Map field value to a proper Solr representation + * + * @param FacetBuilder $facetBuilder; + * + * @return void + */ + public function visit( FacetBuilder $facetBuilder ) + { + return http_build_query( + array( + 'facet.field' => 'creator_id', + 'f.creator_id.facet.limit' => $facetBuilder->limit, + 'f.creator_id.facet.mincount' => $facetBuilder->minCount, + ) + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldNameGenerator.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldNameGenerator.php new file mode 100644 index 0000000..dc9189a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldNameGenerator.php @@ -0,0 +1,90 @@ +<?php +/** + * File containing the Content Search FieldNameGenerator class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Generator for Solr field names + */ +class FieldNameGenerator +{ + /** + * Simple mapping for our internal field types + * + * We implement this mapping, because those dynamic fields are common to + * Solr configurations. + * + * @var array + */ + protected $fieldNameMapping = array( + "ez_integer" => "i", + "ez_id" => "id", + "ez_string" => "s", + "ez_long" => "l", + "ez_text" => "t", + "ez_html" => "h", + "ez_boolean" => "b", + "ez_float" => "f", + "ez_double" => "d", + "ez_date" => "dt", + "ez_point" => "p", + "ez_currency" => "c", + ); + + /** + * Get name for Solr document field + * + * Consists of a name, and optionally field anem and a content type name. + * + * @param string $name + * @param string $field + * @param string $type + * + * @return string + */ + public function getName( $name, $field = null, $type = null ) + { + return implode( '/', array_filter( array( $type, $field, $name ) ) ); + } + + /** + * Map field type + * + * For Solr indexing the following scheme will always be used for names: + * {name}_{type}. + * + * Using dynamic fields this allows to define fields either depending on + * types, or names. + * + * Only the field with the name ID remains untouched. + * + * @param string $name + * @param FieldType $type + * + * @return string + */ + public function getTypedName( $name, FieldType $type ) + { + if ( $name === "id" ) + { + return $name; + } + + $typeName = $type->type; + if ( isset( $this->fieldNameMapping[$typeName] ) ) + { + $typeName = $this->fieldNameMapping[$typeName]; + } + + return $name . '_' . $typeName; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldRegistry.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldRegistry.php new file mode 100644 index 0000000..e4e8301 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldRegistry.php @@ -0,0 +1,71 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\SPI\FieldType\Indexable; + +/** + * Visits the criterion tree into a Solr query + */ +class FieldRegistry +{ + /** + * Registered field types + * + * @var array(string => Indexable) + */ + protected $types = array(); + + /** + * COnstruct from optional Indexable type array + * + * @param array $types + * + * @return void + */ + public function __construct( array $types = array() ) + { + foreach ( $types as $name => $type ) + { + $this->registerType( $name, $type ); + } + } + + /** + * Register another indexable type + * + * @param string $name + * @param Indexable $type + * + * @return void + */ + public function registerType( $name, Indexable $type ) + { + $this->types[$name] = $type; + } + + /** + * Get indexable type + * + * @param string $name + * + * @return Indexable + */ + public function getType( $name ) + { + if ( !isset( $this->types[$name] ) ) + { + throw new \OutOfBoundsException( "No type registered for $name." ); + } + + return $this->types[$name]; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper.php new file mode 100644 index 0000000..7de2fa2 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\SPI\Persistence\Content\Search\Field; + +/** + * Maps raw document field values to something Solr can index. + */ +abstract class FieldValueMapper +{ + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + abstract public function canMap( Field $field ); + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + abstract public function map( Field $field ); +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/Aggregate.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/Aggregate.php new file mode 100644 index 0000000..78f81ca --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/Aggregate.php @@ -0,0 +1,87 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\API\Repository\Exceptions\NotImplementedException; + +/** + * Maps raw document field values to something Solr can index. + */ +class Aggregate extends FieldValueMapper +{ + /** + * Array of available mappers + * + * @var array + */ + protected $mappers = array(); + + /** + * COnstruct from optional mapper array + * + * @param array $mappers + * + * @return void + */ + public function __construct( array $mappers = array() ) + { + foreach ( $mappers as $mapper ) + { + $this->addMapper( $mapper ); + } + } + + /** + * Adds mapper + * + * @param FieldValueMapper $mapper + * + * @return void + */ + public function addMapper( FieldValueMapper $mapper ) + { + $this->mappers[] = $mapper; + } + + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + public function canMap( Field $field ) + { + return true; + } + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + public function map( Field $field ) + { + foreach ( $this->mappers as $mapper ) + { + if ( $mapper->canMap( $field ) ) + { + return $mapper->map( $field ); + } + } + + throw new NotImplementedException( "No mapper avialable for: " . get_class( $field->type ) ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/DateMapper.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/DateMapper.php new file mode 100644 index 0000000..37bcf82 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/DateMapper.php @@ -0,0 +1,61 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Maps raw document field values to something Solr can index. + */ +class DateMapper extends FieldValueMapper +{ + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + public function canMap( Field $field ) + { + return $field->type instanceof FieldType\DateField; + } + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + public function map( Field $field ) + { + if ( is_numeric( $field->value ) ) + { + $date = new \DateTime( "@{$field->value}" ); + } + else + { + try + { + $date = new \DateTime( $field->value ); + } + catch ( Exception $e ) + { + throw new \InvalidArgumentException( "Invalid date provided: " . $field->value ); + } + } + + return $date->format( "Y-m-d\\TH:i:s\\Z" ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/IdentifierMapper.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/IdentifierMapper.php new file mode 100644 index 0000000..9e3e9c9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/IdentifierMapper.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Maps raw document field values to something Solr can index. + */ +class IdentifierMapper extends FieldValueMapper +{ + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + public function canMap( Field $field ) + { + return $field->type instanceof FieldType\IdentifierField; + } + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + public function map( Field $field ) + { + // Remove non-printables + return preg_replace( '([^A-Za-z0-9/]+)', '', $field->value ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/IntegerMapper.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/IntegerMapper.php new file mode 100644 index 0000000..f984ade --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/IntegerMapper.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Maps raw document field values to something Solr can index. + */ +class IntegerMapper extends FieldValueMapper +{ + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + public function canMap( Field $field ) + { + return $field->type instanceof FieldType\IntegerField; + } + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + public function map( Field $field ) + { + return (int)$field->value; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/PriceMapper.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/PriceMapper.php new file mode 100644 index 0000000..6ee124a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/PriceMapper.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Maps raw document field values to something Solr can index. + */ +class PriceMapper extends FieldValueMapper +{ + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + public function canMap( Field $field ) + { + return $field->type instanceof FieldType\PriceField; + } + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + public function map( Field $field ) + { + return (double)$field->value; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/StringMapper.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/StringMapper.php new file mode 100644 index 0000000..8f42906 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/FieldValueMapper/StringMapper.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Maps raw document field values to something Solr can index. + */ +class StringMapper extends FieldValueMapper +{ + /** + * Check if field can be mapped + * + * @param Field $field + * + * @return void + */ + public function canMap( Field $field ) + { + return + $field->type instanceof FieldType\StringField || + $field->type instanceof FieldType\TextField || + $field->type instanceof FieldType\HtmlField; + } + + /** + * Map field value to a proper Solr representation + * + * @param Field $field + * + * @return void + */ + public function map( Field $field ) + { + // Remove non-printables + return preg_replace( '([\x00-\x09\x0B\x0C\x1E\x1F]+)', '', $field->value ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway.php new file mode 100644 index 0000000..48009d5 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the Content Search Gateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\API\Repository\Values\Content\Query; + +/** + * The Content Search Gateway provides the implementation for one database to + * retrieve the desired content objects. + */ +abstract class Gateway +{ + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + abstract public function findContent( Query $query, array $fieldFilters = array() ); + + /** + * Indexes a content object + * + * @param \eZ\Publish\SPI\Persistence\Content\Search\Field[] $document + * + * @return void + */ + abstract public function indexContent( array $document ); + + /** + * Purges all contents from the index + * + * @return void + */ + abstract public function purgeIndex(); +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient.php new file mode 100644 index 0000000..cbc656f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient.php @@ -0,0 +1,29 @@ +<?php +/** + * File containing the HttpClient interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway; + +/** + * Interface for Http Client implementations + */ +interface HttpClient +{ + /** + * Execute a HTTP request to the remote server + * + * Returns the result from the remote server. + * + * @param string $method + * @param string $path + * @param \eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway\Message $message + * + * @return \eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway\Message + */ + public function request( $method, $path, Message $message = null ); +} diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient/ConnectionException.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient/ConnectionException.php new file mode 100644 index 0000000..c56d749 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient/ConnectionException.php @@ -0,0 +1,23 @@ +<?php +/** + * File containing the ConnectionException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway\HttpClient; + +/** + * HTTPClient connection exception + */ +class ConnectionException extends \RuntimeException +{ + public function __construct( $server, $path, $method ) + { + parent::__construct( + "Could not connect to server $server." + ); + } +} diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient/Stream.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient/Stream.php new file mode 100644 index 0000000..830323a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/HttpClient/Stream.php @@ -0,0 +1,168 @@ +<?php +/** + * File containing the Stream HttpClient + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway\HttpClient; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway\HttpClient; +use eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway\Message; + +/** + * Simple PHP stream based HTTP client. + */ +class Stream implements HttpClient +{ + /** + * Optional default headers for each request. + * + * @var array + */ + private $headers = array(); + + /** + * The remote REST server location. + * + * @var string + */ + private $server; + + /** + * Constructs a new REST client instance for the given <b>$server</b>. + * + * @param string $server Remote server location. Must include the used protocol. + */ + public function __construct( $server ) + { + $url = parse_url( rtrim( $server, '/' ) ); + $url += array( + 'scheme' => 'http', + 'host' => null, + 'port' => null, + 'user' => null, + 'pass' => null, + 'path' => null, + ); + + if ( $url['user'] || $url['pass'] ) + { + $this->headers['Authorization'] = 'Basic ' . base64_encode( "{$url['user']}:{$url['pass']}" ); + } + + $this->server = $url['scheme'] . '://' . $url['host']; + if ( $url['port'] ) + { + $this->server .= ':' . $url['port']; + } + $this->server .= $url['path']; + } + + /** + * Execute a HTTP request to the remote server + * + * Returns the result from the remote server. + * + * @param string $method + * @param string $path + * @param Message $message + * + * @return Message + */ + public function request( $method, $path, Message $message = null ) + { + $message = $message ?: new Message(); + + $requestHeaders = $this->getRequestHeaders( $message->headers ); + + $url = $this->server . $path; + + $contextOptions = array( + 'http' => array( + 'method' => $method, + 'content' => $message->body, + 'ignore_errors' => true, + 'header' => $requestHeaders, + ), + ); + + $httpFilePointer = @fopen( + $url, + 'r', + false, + stream_context_create( $contextOptions ) + ); + + // Check if connection has been established successfully + if ( $httpFilePointer === false ) + { + throw new ConnectionException( $this->server, $path, $method ); + } + + // Read request body + $body = ''; + while ( !feof( $httpFilePointer ) ) + { + $body .= fgets( $httpFilePointer ); + } + + $metaData = stream_get_meta_data( $httpFilePointer ); + // This depends on PHP compiled with or without --curl-enable-streamwrappers + $rawHeaders = isset( $metaData['wrapper_data']['headers'] ) ? + $metaData['wrapper_data']['headers'] : + $metaData['wrapper_data']; + $headers = array(); + + foreach ( $rawHeaders as $lineContent ) + { + // Extract header values + if ( preg_match( '(^HTTP/(?P<version>\d+\.\d+)\s+(?P<status>\d+))S', $lineContent, $match ) ) + { + $headers['version'] = $match['version']; + $headers['status'] = (int)$match['status']; + } + else + { + list( $key, $value ) = explode( ':', $lineContent, 2 ); + $headers[$key] = ltrim( $value ); + } + } + + return new Message( + $headers, + $body + ); + } + + /** + * Get formatted request headers + * + * Merged with the default values. + * + * @param array $headers + * + * @return string + */ + protected function getRequestHeaders( array $headers ) + { + $requestHeaders = ''; + + foreach ( $this->headers as $name => $value ) + { + if ( !isset( $headers[$name] ) ) + { + $requestHeaders .= "$name: $value\r\n"; + } + } + + foreach ( $headers as $name => $value ) + { + $requestHeaders .= "$name: $value\r\n"; + } + + return $requestHeaders; + } +} diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/Message.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/Message.php new file mode 100644 index 0000000..bd46529 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/Message.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the Response class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway; + +/** + * Simple response struct + */ +class Message +{ + /** + * Response headers + * + * @var array + */ + public $headers; + + /** + * Response body + * + * @var string + */ + public $body; + + /** + * Construct from headers and body + * + * @param array $headers + * @param string $body + * + * @return void + */ + public function __construct( array $headers = array(), $body = '' ) + { + $this->headers = $headers; + $this->body = $body; + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/Native.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/Native.php new file mode 100644 index 0000000..ad0ef7a --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Gateway/Native.php @@ -0,0 +1,251 @@ +<?php +/** + * File containing the Content Search Gateway class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway; +use eZ\Publish\SPI\Persistence\Content\Handler as ContentHandler; +use eZ\Publish\API\Repository\Values\Content\Search\SearchResult; +use eZ\Publish\API\Repository\Values\Content\Search\SearchHit; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldNameGenerator; +use eZ\Publish\Core\Persistence\Solr\Content\Search\CriterionVisitor; +use eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; +use eZ\Publish\Core\Persistence\Solr\Content\Search\FacetBuilderVisitor; +use eZ\Publish\Core\Persistence\Solr\Content\Search\FieldValueMapper; + +/** + * The Content Search Gateway provides the implementation for one database to + * retrieve the desired content objects. + */ +class Native extends Gateway +{ + /** + * HTTP client to communicate with Solr server + * + * @var HttpClient + */ + protected $client; + + /** + * Query visitor + * + * @var CriterionVisitor + */ + protected $criterionVisitor; + + /** + * Sort cluase visitor + * + * @var SortClauseVisitor + */ + protected $sortClauseVisitor; + + /** + * Facet builder visitor + * + * @var FacetBuilderVisitor + */ + protected $facetBuilderVisitor; + + /** + * Field valu mapper + * + * @var FieldValueMapper + */ + protected $fieldValueMapper; + + /** + * Content Handler + * + * @var ContentHandler + */ + protected $contentHandler; + + /** + * Field name generator + * + * @var FieldNameGenerator + */ + protected $nameGenerator; + + /** + * Construct from HTTP client + * + * @param HttpClient $client + * @param CriterionVisitor $criterionVisitor + * @param SortClauseVisitor $sortClauseVisitor + * @param FacetBuilderVisitor $facetBuilderVisitor + * @param FieldValueMapper $fieldValueMapper + * @param ContentHandler $contentHandler + * + * @return void + */ + public function __construct( HttpClient $client, CriterionVisitor $criterionVisitor, SortClauseVisitor $sortClauseVisitor, FacetBuilderVisitor $facetBuilderVisitor, FieldValueMapper $fieldValueMapper, ContentHandler $contentHandler, FieldNameGenerator $nameGenerator ) + { + $this->client = $client; + $this->criterionVisitor = $criterionVisitor; + $this->sortClauseVisitor = $sortClauseVisitor; + $this->facetBuilderVisitor = $facetBuilderVisitor; + $this->fieldValueMapper = $fieldValueMapper; + $this->contentHandler = $contentHandler; + $this->nameGenerator = $nameGenerator; + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array() ) + { + // @todo: Extract method + $response = $this->client->request( + 'GET', + '/solr/select?' . + http_build_query( + array( + 'q' => $this->criterionVisitor->visit( $query->criterion ), + 'sort' => implode( + ', ', + array_map( + array( $this->sortClauseVisitor, 'visit' ), + $query->sortClauses + ) + ), + 'fl' => '*,score', + 'wt' => 'json', + ) + ) . + ( count( $query->facetBuilders ) ? '&facet=true&facet.sort=count&' : '' ) . + implode( + '&', + array_map( + array( $this->facetBuilderVisitor, 'visit' ), + $query->facetBuilders + ) + ) + ); + // @todo: Error handling? + $data = json_decode( $response->body ); + + // @todo: Extract method + $result = new SearchResult( + array( + 'time' => $data->responseHeader->QTime / 1000, + 'maxScore' => $data->response->maxScore, + 'totalCount' => $data->response->numFound, + ) + ); + + foreach ( $data->response->docs as $doc ) + { + $searchHit = new SearchHit( + array( + 'score' => $doc->score, + 'valueObject' => $this->contentHandler->load( $doc->id, $doc->version_id ) + ) + ); + $result->searchHits[] = $searchHit; + } + + if ( isset( $data->facet_counts ) ) + { + foreach ( $data->facet_counts->facet_fields as $field => $facet ) + { + $result->facets[] = $this->facetBuilderVisitor->map( $field, $facet ); + } + } + + return $result; + } + + /** + * Indexes a content object + * + * @param \eZ\Publish\SPI\Persistence\Content\Search\Field[] $document + * + * @return void + */ + public function indexContent( array $document ) + { + $update = $this->createUpdate( $document ); + $result = $this->client->request( + 'POST', + '/solr/update?commit=true&wt=json', + new Message( + array( + 'Content-Type: text/xml', + ), + $update + ) + ); + + // @todo: Add error handling + } + + /** + * Purges all contents from the index + * + * @return void + */ + public function purgeIndex() + { + $this->client->request( + 'POST', + '/solr/update?commit=true&wt=json', + new Message( + array( + 'Content-Type: text/xml', + ), + '<delete><query>*:*</query></delete>' + ) + ); + } + + /** + * Create document update XML + * + * @param array $document + * + * @return string + */ + protected function createUpdate( array $document ) + { + $xml = new \XmlWriter(); + $xml->openMemory(); + $xml->startElement( 'add' ); + $xml->startElement( 'doc' ); + + foreach ( $document as $field ) + { + foreach ( (array)$this->fieldValueMapper->map( $field ) as $value ) + { + $xml->startElement( 'field' ); + $xml->writeAttribute( + 'name', + $this->nameGenerator->getTypedName( $field->name, $field->type ) + ); + $xml->text( $value ); + $xml->endElement(); + } + } + + $xml->endElement(); + $xml->endElement(); + + return $xml->outputMemory( true ); + } +} diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/Handler.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/Handler.php new file mode 100644 index 0000000..7692960 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/Handler.php @@ -0,0 +1,341 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Type\Handler as ContentTypeHandler; +use eZ\Publish\SPI\Persistence\Content\ObjectState\Handler as ObjectStateHandler; +use eZ\Publish\SPI\Persistence\Content\Search\Handler as BaseSearchHandler; +use eZ\Publish\SPI\Persistence\Content\Search\Field; +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; + +/** + * The Content Search handler retrieves sets of of Content objects, based on a + * set of criteria. + * + * The basic idea of this class is to do the following: + * + * 1) The find methods retrieve a recursive set of filters, which define which + * content objects to retrieve from the database. Those may be combined using + * boolean operators. + * + * 2) This recursive criterion definition is visited into a query, which limits + * the content retrieved from the database. We might not be able to create + * sensible queries from all criterion definitions. + * + * 3) The query might be possible to optimize (remove empty statements), + * reduce singular and and or constructs… + * + * 4) Additionally we might need a post-query filtering step, which filters + * content objects based on criteria, which could not be converted in to + * database statements. + */ +class Handler extends BaseSearchHandler +{ + /** + * Content locator gateway. + * + * @var \eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway + */ + protected $gateway; + + /** + * Field registry + * + * @var \eZ\Publish\Core\Persistence\Solr\Content\Search\FieldRegistry + */ + protected $fieldRegistry; + + /** + * Content type handler + * + * @var \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + protected $contentTypeHandler; + + /** + * Object state handler + * + * @var \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler + */ + protected $objectStateHandler; + + /** + * Creates a new content handler. + * + * @param \eZ\Publish\Core\Persistence\Solr\Content\Search\Gateway $gateway + * @param \eZ\Publish\Core\Persistence\Solr\Content\Search\FieldRegistry $fieldRegistry + * @param \eZ\Publish\SPI\Persistence\Content\Type\Handler $contentTypeHandler + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler $objectStateHandler + */ + public function __construct( Gateway $gateway, FieldRegistry $fieldRegistry, ContentTypeHandler $contentTypeHandler, ObjectStateHandler $objectStateHandler ) + { + $this->gateway = $gateway; + $this->fieldRegistry = $fieldRegistry; + $this->contentTypeHandler = $contentTypeHandler; + $this->objectStateHandler = $objectStateHandler; + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array() ) + { + return $this->gateway->findContent( $query, $fieldFilters ); + } + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Criterion $criterion, array $fieldFilters = array() ) + { + $query = new Query(); + $query->criterion = $criterion; + $query->offset = 0; + $query->limit = 1; + $result = $this->findContent( $query, $fieldFilters ); + + if ( !$result->totalCount ) + throw new NotFoundException( 'Content', "findSingle() found no content for given \$criterion" ); + else if ( $result->totalCount > 1 ) + throw new InvalidArgumentException( "totalCount", "findSingle() found more then one item for given \$criterion" ); + + $first = reset( $result->searchHits ); + return $first->valueObject; + } + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldPaths + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ) + { + throw new \Exception( "@todo: Not implemented yet." ); + } + + /** + * Indexes a content object + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return void + */ + public function indexContent( Content $content ) + { + $document = $this->mapContent( $content ); + $this->gateway->indexContent( $document ); + } + + /** + * Map content to document. + * + * A document is an array of fields + * + * @param Content $content + * + * @return array + */ + protected function mapContent( Content $content ) + { + $document = array( + new Field( + 'id', + $content->contentInfo->id, + new FieldType\IdentifierField() + ), + new Field( + 'type', + $content->contentInfo->contentTypeId, + new FieldType\IdentifierField() + ), + new Field( + 'version', + $content->versionInfo->versionNo, + new FieldType\IdentifierField() + ), + new Field( + 'status', + $content->versionInfo->status, + new FieldType\IdentifierField() + ), + new Field( + 'name', + $content->contentInfo->name, + new FieldType\StringField() + ), + new Field( + 'creator', + $content->versionInfo->creatorId, + new FieldType\IdentifierField() + ), + new Field( + 'section', + $content->contentInfo->sectionId, + new FieldType\IdentifierField() + ), + new Field( + 'remote_id', + $content->contentInfo->remoteId, + new FieldType\IdentifierField() + ), + new Field( + 'modified', + $content->contentInfo->modificationDate, + new FieldType\DateField() + ), + new Field( + 'published', + $content->contentInfo->publicationDate, + new FieldType\DateField() + ), + new Field( + 'path', + array_map( + function ( $location ) + { + return $location->pathString; + }, + $content->locations + ), + new FieldType\IdentifierField() + ), + new Field( + 'location', + array_map( + function ( $location ) + { + return $location->id; + }, + $content->locations + ), + new FieldType\IdentifierField() + ), + new Field( + 'depth', + array_map( + function ( $location ) + { + return $location->depth; + }, + $content->locations + ), + new FieldType\IntegerField() + ), + new Field( + 'location_parent', + array_map( + function ( $location ) + { + return $location->parentId; + }, + $content->locations + ), + new FieldType\IdentifierField() + ), + new Field( + 'location_remote_id', + array_map( + function ( $location ) + { + return $location->remoteId; + }, + $content->locations + ), + new FieldType\IdentifierField() + ), + new Field( + 'language_code', + array_keys( $content->versionInfo->names ), + new FieldType\StringField() + ), + ); + + $contentType = $this->contentTypeHandler->load( $content->contentInfo->contentTypeId ); + $document[] = new Field( + 'group', + $contentType->groupIds, + new FieldType\IdentifierField() + ); + + foreach ( $content->fields as $field ) + { + foreach ( $contentType->fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->id !== $field->fieldDefinitionId ) + { + continue; + } + + $fieldType = $this->fieldRegistry->getType( $field->type ); + $prefix = $contentType->identifier . '/' . $fieldDefinition->identifier . '/'; + foreach ( $fieldType->getIndexData( $field ) as $indexField ) + { + $document[] = new Field( $prefix . $indexField->name, $indexField->value, $indexField->type ); + } + } + } + + $objectStateIds = array(); + foreach ( $this->objectStateHandler->loadAllGroups() as $objectStateGroup ) + { + $objectStateIds[] = $this->objectStateHandler->getContentState( + $content->contentInfo->id, + $objectStateGroup->id + )->id; + } + + $document[] = new Field( + 'object_state', + $objectStateIds, + new FieldType\IdentifierField() + ); + + return $document; + } + + /** + * Purges all contents from the index + * + * @todo: Make this public API? + * + * @return void + */ + public function purgeIndex() + { + $this->gateway->purgeIndex(); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor.php new file mode 100644 index 0000000..1085a93 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search; + +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; + +/** + * Visits the sort clause into a Solr query + */ +abstract class SortClauseVisitor +{ + /** + * CHeck if visitor is applicable to current sort clause + * + * @param SortClause $sortClause + * + * @return boolean + */ + abstract public function canVisit( SortClause $sortClause ); + + /** + * Map field value to a proper Solr representation + * + * @param SortClause $sortClause + * + * @return void + */ + abstract public function visit( SortClause $sortClause ); + + /** + * Get solr sort direction for sort clause + * + * @param SortClause $sortClause + * + * @return string + */ + protected function getDirection( SortClause $sortClause ) + { + return ' ' . ( $sortClause->direction === 'descending' ? 'desc' : 'asc' ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/Aggregate.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/Aggregate.php new file mode 100644 index 0000000..6dd368e --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/Aggregate.php @@ -0,0 +1,87 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; +use eZ\Publish\API\Repository\Exceptions\NotImplementedException; + +/** + * Visits the sortClause tree into a Solr query + */ +class Aggregate extends SortClauseVisitor +{ + /** + * Array of available visitors + * + * @var array + */ + protected $visitors = array(); + + /** + * COnstruct from optional visitor array + * + * @param array $visitors + * + * @return void + */ + public function __construct( array $visitors = array() ) + { + foreach ( $visitors as $visitor ) + { + $this->addVisitor( $visitor ); + } + } + + /** + * Adds visitor + * + * @param FieldValueVisitor $visitor + * + * @return void + */ + public function addVisitor( SortClauseVisitor $visitor ) + { + $this->visitors[] = $visitor; + } + + /** + * CHeck if visitor is applicable to current sortClause + * + * @param SortClause $sortClause + * + * @return boolean + */ + public function canVisit( SortClause $sortClause ) + { + return true; + } + + /** + * Map field value to a proper Solr representation + * + * @param SortClause $sortClause + * + * @return void + */ + public function visit( SortClause $sortClause ) + { + foreach ( $this->visitors as $visitor ) + { + if ( $visitor->canVisit( $sortClause ) ) + { + return $visitor->visit( $sortClause, $this ); + } + } + + throw new NotImplementedException( "No visitor avialable for: " . get_class( $sortClause ) ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/ContentId.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/ContentId.php new file mode 100644 index 0000000..0536c3b --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/ContentId.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; + +/** + * Visits the sortClause tree into a Solr query + */ +class ContentId extends SortClauseVisitor +{ + /** + * CHeck if visitor is applicable to current sortClause + * + * @param SortClause $sortClause + * + * @return boolean + */ + public function canVisit( SortClause $sortClause ) + { + return $sortClause instanceof SortClause\ContentId; + } + + /** + * Map field value to a proper Solr representation + * + * @param SortClause $sortClause + * + * @return void + */ + public function visit( SortClause $sortClause ) + { + return 'id' . $this->getDirection( $sortClause ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/LocationDepth.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/LocationDepth.php new file mode 100644 index 0000000..72191f9 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/LocationDepth.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; + +/** + * Visits the sortClause tree into a Solr query + */ +class LocationDepth extends SortClauseVisitor +{ + /** + * CHeck if visitor is applicable to current sortClause + * + * @param SortClause $sortClause + * + * @return boolean + */ + public function canVisit( SortClause $sortClause ) + { + return $sortClause instanceof SortClause\LocationDepth; + } + + /** + * Map field value to a proper Solr representation + * + * @param SortClause $sortClause + * + * @return void + */ + public function visit( SortClause $sortClause ) + { + return 'depth_i' . $this->getDirection( $sortClause ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/LocationPathString.php b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/LocationPathString.php new file mode 100644 index 0000000..e331f5f --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/SortClauseVisitor/LocationPathString.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; + +use eZ\Publish\Core\Persistence\Solr\Content\Search\SortClauseVisitor; +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; + +/** + * Visits the sortClause tree into a Solr query + */ +class LocationPathString extends SortClauseVisitor +{ + /** + * CHeck if visitor is applicable to current sortClause + * + * @param SortClause $sortClause + * + * @return boolean + */ + public function canVisit( SortClause $sortClause ) + { + return $sortClause instanceof SortClause\LocationPathString; + } + + /** + * Map field value to a proper Solr representation + * + * @param SortClause $sortClause + * + * @return void + */ + public function visit( SortClause $sortClause ) + { + return 'path_id' . $this->getDirection( $sortClause ); + } +} + diff --git a/eZ/Publish/Core/Persistence/Solr/Content/Search/schema.xml b/eZ/Publish/Core/Persistence/Solr/Content/Search/schema.xml new file mode 100644 index 0000000..d0c2b93 --- /dev/null +++ b/eZ/Publish/Core/Persistence/Solr/Content/Search/schema.xml @@ -0,0 +1,110 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<!-- +This is the Solr schema file. This file should be named "schema.xml" and should +be in the conf directory under the solr home (i.e. ./solr/conf/schema.xml by +default) or located where the classloader for the Solr webapp can find it. + +It provides the default types and definitions for a functional Solr based +search in eZ Publish 5. You may extend it with your own definitions, but you +should not remove or drastically change the existing definitions. +--> + +<schema name="eZ Publish 5 base schema" version="1.5"> + <types> + <!-- + Default types by Solr. Will be reused for dynamic fields. + --> + <fieldType name="string" class="solr.StrField" sortMissingLast="true" /> + <fieldType name="identifier" class="solr.StrField" sortMissingLast="true" /> + <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/> + <fieldtype name="binary" class="solr.BinaryField"/> + <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/> + <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" positionIncrementGap="0"/> + <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/> + <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/> + <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/> + + <fieldtype name="ignored" stored="false" indexed="false" multiValued="true" class="solr.StrField" /> + <fieldType name="point" class="solr.PointType" dimension="2" subFieldSuffix="_d"/> + <fieldType name="location" class="solr.LatLonType" subFieldSuffix="_coordinate"/> + + <fieldType name="currency" class="solr.CurrencyField" precisionStep="8" defaultCurrency="USD" currencyConfig="currency.xml" /> + + <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> + <analyzer type="index"> + <tokenizer class="solr.StandardTokenizerFactory"/> + <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + <analyzer type="query"> + <tokenizer class="solr.StandardTokenizerFactory"/> + <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> + <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + </fieldType> + + <fieldType name="html" class="solr.TextField" positionIncrementGap="100"> + <analyzer type="index"> + <charFilter class="solr.HTMLStripCharFilterFactory" escapedTags="a, title" /> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + <analyzer type="query"> + <charFilter class="solr.HTMLStripCharFilterFactory" escapedTags="a, title" /> + <tokenizer class="solr.WhitespaceTokenizerFactory"/> + <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" /> + <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> + <filter class="solr.LowerCaseFilterFactory"/> + </analyzer> + </fieldType> + </types> + + + <fields> + <!-- + Required ID field. + --> + <field name="id" type="string" indexed="true" stored="true" required="true"/> + + <!-- + Always contains the date a document was added to the index. Might be + useful. + --> + <field name="timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/> + + <!-- + Dynamic field definitions. If a field name is not found, dynamicFields + will be used if the name matches any of the patterns. RESTRICTION: the + glob-like pattern in the name attribute must have a "*" only at the start + or the end. EXAMPLE: name="*_i" will match any field ending in _i (like + myid_i, z_i) Longer patterns will be matched first. if equal size + patterns both match, the first appearing in the schema will be used. + --> + <dynamicField name="*_i" type="int" indexed="true" stored="true"/> + <dynamicField name="*_id" type="identifier" indexed="true" stored="true"/> + <dynamicField name="*_s" type="string" indexed="true" stored="true"/> + <dynamicField name="*_l" type="long" indexed="true" stored="true"/> + <dynamicField name="*_t" type="text" indexed="true" stored="true"/> + <dynamicField name="*_h" type="html" indexed="true" stored="false"/> + <dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> + <dynamicField name="*_f" type="float" indexed="true" stored="true"/> + <dynamicField name="*_d" type="double" indexed="true" stored="true"/> + <dynamicField name="*_dt" type="date" indexed="true" stored="true"/> + <dynamicField name="*_p" type="location" indexed="true" stored="true"/> + <dynamicField name="*_c" type="currency" indexed="true" stored="true"/> + + <field name="text" type="text" indexed="true" multiValued="true" stored="false"/> + + <!-- + Index all text, html and string fields in full text index + --> + <copyField source="*_t" dest="text" /> + <copyField source="*_s" dest="text" /> + <copyField source="*_h" dest="text" /> + </fields> + + <uniqueKey>id</uniqueKey> + <defaultSearchField>id</defaultSearchField> +</schema> diff --git a/eZ/Publish/Core/REST/Client/ContentService.php b/eZ/Publish/Core/REST/Client/ContentService.php new file mode 100644 index 0000000..072fd23 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/ContentService.php @@ -0,0 +1,763 @@ +<?php +/** + * File containing the ContentService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\ContentService as APIContentService; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\ContentCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\TranslationInfo; +use eZ\Publish\API\Repository\Values\Content\TranslationValues; +use eZ\Publish\API\Repository\Values\Content\VersionInfo; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\User\User; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Exceptions; + +use eZ\Publish\Core\REST\Client\Values; + +/** + * @example Examples/contenttype.php + */ +class ContentService implements APIContentService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + private $contentTypeService; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\Core\REST\Client\ContentTypeService $contentTypeService + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler, ContentTypeService $contentTypeService ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + $this->contentTypeService = $contentTypeService; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + * + * @private + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Loads a content info object. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given id does not exist + * + * @param int $contentId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfo( $contentId ) + { + $response = $this->client->request( + 'GET', + $contentId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ContentInfo' ) ) + ) + ); + + $restContentInfo = $this->inputDispatcher->parse( $response ); + return $this->completeContentInfo( $restContentInfo ); + } + + /** + * Loads a content info object for the given remoteId. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowd to create the content in the given location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given remote id does not exist + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfoByRemoteId( $remoteId ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'objectByRemote', array( 'object' => $remoteId ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ContentList' ) ) + ) + ); + $contentList = $this->inputDispatcher->parse( $response ); + + if ( empty( $contentList ) ) + { + throw new Exceptions\NotFoundException( "@todo: Error message." ); + } + + return $this->completeContentInfo( reset( $contentList ) ); + } + + /** + * Returns a complete ContentInfo based on $restContentInfo + * + * @param \eZ\Publish\Core\REST\Client\Values\RestContentInfo $restContentInfo + * + * @return \eZ\Publish\Core\REST\Client\Values\Content\ContentInfo + */ + protected function completeContentInfo( Values\RestContentInfo $restContentInfo ) + { + $versionUrlValues = $this->urlHandler->parse( + 'objectVersion', + $this->fetchCurrentVersionUrl( $restContentInfo->currentVersionReference ) + ); + + return new Values\Content\ContentInfo( + $this->contentTypeService, + array( + 'id' => $restContentInfo->id, + 'name' => $restContentInfo->name, + 'contentTypeId' => $restContentInfo->contentTypeId, + 'ownerId' => $restContentInfo->ownerId, + 'modificationDate' => $restContentInfo->modificationDate, + 'publishedDate' => $restContentInfo->publishedDate, + 'published' => $restContentInfo->published, + 'alwaysAvailable' => $restContentInfo->alwaysAvailable, + 'remoteId' => $restContentInfo->remoteId, + 'mainLanguageCode' => $restContentInfo->mainLanguageCode, + 'mainLocationId' => $restContentInfo->mainLocationId, + 'sectionId' => $restContentInfo->sectionId, + + 'currentVersionNo' => $versionUrlValues['version'], + ) + ); + } + + /** + * Returns the URL of the current version referenced by + * $currentVersionReference + * + * @param string $currentVersionReference + * + * @return string + */ + protected function fetchCurrentVersionUrl( $currentVersionReference ) + { + $versionResponse = $this->client->request( + 'GET', + $currentVersionReference + ); + + if ( $this->isErrorResponse( $versionResponse ) ) + { + return $this->inputDispatcher->parse( $versionResponse ); + } + + return $versionResponse->headers['Location']; + } + + /** + * Checks if the given response is an error + * + * @param Message $response + * + * @return boolean + */ + protected function isErrorResponse( Message $response ) + { + return ( + strpos( $response->headers['Content-Type'], 'application/vnd.ez.api.ErrorMessage' ) === 0 + ); + } + + /** + * Loads a version info of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfo( ContentInfo $contentInfo, $versionNo = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads a version info of the given content object id. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfoById( $contentId, $versionNo = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads content in a version for the given content info object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByContentInfo( ContentInfo $contentInfo, array $languages = null, $versionNo = null ) + { + return $this->loadContent( + $contentInfo->id, + $languages, + $versionNo + ); + } + + /** + * Loads content in the version given by version info. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByVersionInfo( VersionInfo $versionInfo, array $languages = null ) + { + $contentInfo = $versionInfo->getContentInfo(); + + return $this->loadContent( $contentInfo->id, $languages, $versionInfo->versionNo ); + } + + /** + * Loads content in a version of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content or version with the given id does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * @todo Handle $versionNo = null + * @todo Handle language filters + */ + public function loadContent( $contentId, array $languages = null, $versionNo = null ) + { + // $contentId should already be a URL! + $contentIdValues = $this->urlHandler->parse( 'object', $contentId ); + + $url = ''; + if ( $versionNo === null ) + { + $url = $this->fetchCurrentVersionUrl( + $this->urlHandler->generate( + 'objectCurrentVersion', + array( + 'object' => $contentIdValues['object'], + ) + ) + ); + } + else + { + $url = $this->urlHandler->generate( + 'objectVersion', + array( + 'object' => $contentIdValues['object'], + 'version' => $versionNo, + ) + ); + } + + $response = $this->client->request( + 'GET', + $url, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'Version' ) ) + ) + ); + + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads content in a version for the content object reference by the given remote id. + * + * If no version is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content or version with the given remote id does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param string $remoteId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByRemoteId( $remoteId, array $languages = null, $versionNo = null ) + { + $contentInfo = $this->loadContentInfoByRemoteId( $remoteId ); + + return $this->loadContentByContentInfo( $contentInfo, $languages, $versionNo ); + } + + /** + * Creates a new content draft assigned to the authenticated user. + * + * If a different userId is given in $contentCreateStruct it is assigned to the given user + * but this required special rights for the authenticated user + * (this is useful for content staging where the transfer process does not + * have to authenticate with the user which created the content object in the source server). + * The user has to publish the draft if it should be visible. + * In 4.x at least one location has to be provided in the location creation array. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the content in the given location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is a provided remoteId which exists in the system + * or (4.x) there is no location provided + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct $contentCreateStruct + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct[] $locationCreateStructs For each location parent under which a location should be created for the content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContent( ContentCreateStruct $contentCreateStruct, array $locationCreateStructs = array() ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Updates the metadata. + * + * (see {@link ContentMetadataUpdateStruct}) of a content object - to update fields use updateContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowd to update the content meta data + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the remoteId in $contentMetadataUpdateStruct is set but already existis + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct $contentMetadataUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content with the updated attributes + */ + public function updateContentMetadata( ContentInfo $contentInfo, ContentMetadataUpdateStruct $contentMetadataUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Deletes a content object including all its versions and locations including their subtrees. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowd to delete the content (in one of the locations of the given content object) + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + */ + public function deleteContent( ContentInfo $contentInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Creates a draft from a publshed or archived version. + * + * If no version is given, the current published version is used. + * 4.x: The draft is created with the initialLanguge code of the source version or if not present with the main language. + * It can be changed on updating the version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the draft + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\User\User $user if set given user is used to create the draft - otherwise the current user is used + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContentDraft( ContentInfo $contentInfo, VersionInfo $versionInfo = null, User $user = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads drafts for a user. + * + * If no user is given the drafts for the authenticated user a returned + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load the draft list + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo the drafts ({@link VersionInfo}) owned by the given user + */ + public function loadContentDrafts( User $user = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Updates the fields of a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct $contentUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the updated fields + */ + public function updateContent( VersionInfo $versionInfo, ContentUpdateStruct $contentUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Publishes a content version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + */ + public function publishVersion( VersionInfo $versionInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * removes the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is in state published + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + */ + public function deleteVersion( VersionInfo $versionInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads all versions for the given content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to list versions + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] Sorted by creation date + */ + public function loadVersions( ContentInfo $contentInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Copies the content to a new location. If no version is given, + * all versions are copied, otherwise only the given version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy the content to the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $destinationLocationCreateStruct the target location where the content is copied to + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function copyContent( ContentInfo $contentInfo, LocationCreateStruct $destinationLocationCreateStruct, VersionInfo $versionInfo = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\SearchResult + */ + public function findContent( Query $query, array $fieldFilters, $filterOnUserPermissions = true ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the query would return more than one result + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Query $query, array $fieldFilters, $filterOnUserPermissions = true ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads all outgoing relations for the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadRelations( VersionInfo $versionInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads all incoming relations for a content object. + * + * The relations come only + * from published versions of the source content objects + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadReverseRelations( ContentInfo $contentInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Adds a relation of type common. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * The source of the relation is the content and version + * referenced by $versionInfo. + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent the destination of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation the newly created relation + */ + public function addRelation( VersionInfo $sourceVersion, ContentInfo $destinationContent ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Removes a relation of type COMMON from a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is no relation of type COMMON for the given destination + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent + */ + public function deleteRelation( VersionInfo $sourceVersion, ContentInfo $destinationContent ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content create struct object + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param string $mainLanguageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ + public function newContentCreateStruct( ContentType $contentType, $mainLanguageCode ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content meta data update struct + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct + */ + public function newContentMetadataUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content update struct + * @return \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct + */ + public function newContentUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } + + // Ignore this eZ Publish 5 feature by now. + + // @codeCoverageIgnoreStart + + /** + * Translate a version + * + * updates the destination version given in $translationInfo with the provided translated fields in $translationValues + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the given destiantioon version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $translationValues is not valid + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * @param \eZ\Publish\API\Repository\Values\Content\TranslationValues $translationValues + * @param \eZ\Publish\API\Repository\Values\User\User $user If set, this user is taken as modifier of the version + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the translated fields + * + * @since 5.0 + */ + public function translateVersion( TranslationInfo $translationInfo, TranslationValues $translationValues, User $user = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Adds translation information to the content object + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed add a translation info + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * + * @since 5.0 + */ + public function addTranslationInfo( TranslationInfo $translationInfo ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * lists the translations done on this content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed read translation infos + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $filter + * + * @todo TBD - filter by sourceversion destination version and languages + * + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo[] + * + * @since 5.0 + */ + public function loadTranslationInfos( ContentInfo $contentInfo, array $filter = array() ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new TranslationInfo object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo + */ + public function newTranslationInfo() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a Translation object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationValues + */ + public function newTranslationValues() + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/ContentTypeService.php b/eZ/Publish/Core/REST/Client/ContentTypeService.php new file mode 100644 index 0000000..5d3354a --- /dev/null +++ b/eZ/Publish/Core/REST/Client/ContentTypeService.php @@ -0,0 +1,540 @@ +<?php +/** + * File containing the ContentTypeService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\ContentTypeService as APIContentTypeService; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; + +use eZ\Publish\Core\REST\Client\Values; + +/** + * @example Examples/contenttype.php + * + * @package eZ\Publish\API\Repository + */ +class ContentTypeService implements APIContentTypeService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + private $contentService; + + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed tringid + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Create a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a group with the same identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function createContentTypeGroup( ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get a Content Type Group object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param int $contentTypeGroupId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroup( $contentTypeGroupId ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get a Content Type Group object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param string $contentTypeGroupIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroupByIdentifier( $contentTypeGroupIdentifier ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get all Content Type Groups + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function loadContentTypeGroups() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Update a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier (if set) already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup the content type group to be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct + */ + public function updateContentTypeGroup( ContentTypeGroup $contentTypeGroup, ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Delete a Content Type Group. + * + * This method only deletes an content type group which has content types without any content instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a to be deleted content type has instances + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function deleteContentTypeGroup( ContentTypeGroup $contentTypeGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Create a Content Type object. + * + * The content type is created in the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the identifier or remoteId in the content type create struct already exists + * or there is a dublicate field identifier + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct $contentTypeCreateStruct + * @param array $contentTypeGroups Required array of {@link ContentTypeGroup} to link type with (must contain one) + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentType( ContentTypeCreateStruct $contentTypeCreateStruct, array $contentTypeGroups ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get a Content Type object draft by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the content type draft owned by the current user can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function loadContentTypeDraft( $contentTypeId ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Update a Content Type object + * + * Does not update fields (fieldDefinitions), use {@link updateFieldDefinition()} to update them. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier or remoteId already exists or there is no draft assigned to the authenticated user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct + */ + public function updateContentTypeDraft( ContentTypeDraft $contentTypeDraft, ContentTypeUpdateStruct $contentTypeUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Adds a new field definition to an existing content type. + * + * The content type must be in state DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the identifier in already exists in the content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + */ + public function addFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinitionCreateStruct $fieldDefinitionCreateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Remove a field definition from an existing Type. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given field definition does not belong to the given type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + */ + public function removeFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Update a field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the field id in the update struct is not found or does not belong to the content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier is used in an existing field of the given content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft the content type draft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition the field definition which should be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + */ + public function updateFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition, FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Publish the content type and update content objects. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If the content type has no draft + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish a content type + * + * This method updates content objects, depending on the changed field definitions. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + */ + public function publishContentTypeDraft( ContentTypeDraft $contentTypeDraft ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If a content type with the given id and status DEFINED can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentType( $contentTypeId ) + { + $response = $this->client->request( + 'GET', + $contentTypeId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ContentType' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads a single field definition by $fieldDefinitionId + * + * ATTENTION: This is not an API method and only meant for internal use in + * the REST Client implementation. + * + * @param string $fieldDefinitionId + * + * @access protected + * + * @return FieldDefinition + */ + public function loadFieldDefinition( $fieldDefinitionId ) + { + $response = $this->client->request( + 'GET', + $fieldDefinitionId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'FieldDefinition' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads the FieldDefinitionList stored at $fieldDefinitionListReference + * + * ATTENTION: This is not an API method and only meant for internal use in + * the REST Client implementation. + * + * @param mixed $fieldDefinitionListReference + * + * @return FieldDefinitionList + */ + public function loadFieldDefinitionList( $fieldDefinitionListReference ) + { + $response = $this->client->request( + 'GET', + $fieldDefinitionListReference, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'FieldDefinitionList' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Get a Content Type object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given identifier and status DEFINED can not be found + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByIdentifier( $identifier ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given remote id and status DEFINED can not be found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByRemoteId( $remoteId ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Get Content Type objects which belong to the given content type group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType[] Which have status DEFINED + */ + public function loadContentTypes( ContentTypeGroup $contentTypeGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Creates a draft from an existing content type. + * + * This is a complete copy of the content + * type wiich has the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there is already a draft assigned to another user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentTypeDraft( ContentType $contentType ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Delete a Content Type object. + * + * Deletes a content type if it has no instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there exist content objects of this type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + */ + public function deleteContentType( ContentType $contentType ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Copy Type incl fields and groupIds to a new Type object + * + * New Type will have $userId as creator / modifier, created / modified should be updated with current time, + * updated remoteId and identifier should be appended with '_' + unique string. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\User\User $user if null the current user is used + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function copyContentType( ContentType $contentType, User $user = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Assigns a content type to a content type group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to unlink a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is already assigned the given group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function assignContentTypeGroup( ContentType $contentType, ContentTypeGroup $contentTypeGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Unassign a content type from a group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to link a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is not assigned this the given group. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $contentTypeGroup is the last group assigned to the content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function unassignContentTypeGroup( ContentType $contentType, ContentTypeGroup $contentTypeGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content type group create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct + */ + public function newContentTypeGroupCreateStruct( $identifier ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content type create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct + */ + public function newContentTypeCreateStruct( $identifier ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct + */ + public function newContentTypeUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct + */ + public function newContentTypeGroupUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a field definition create struct + * + * @param string $fieldTypeIdentifier the required field type identifier + * @param string $identifier the required identifier for the field definition + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct + */ + public function newFieldDefinitionCreateStruct( $identifier, $fieldTypeIdentifier ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates a field definition update class + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct + */ + public function newFieldDefinitionUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Exceptions/BadStateException.php b/eZ/Publish/Core/REST/Client/Exceptions/BadStateException.php new file mode 100644 index 0000000..7f44780 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Exceptions/BadStateException.php @@ -0,0 +1,20 @@ +<?php +/** + * File containing the BadStateException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Exceptions; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Exceptions\BadStateException} + * interface. + * + * @see \eZ\Publish\API\Repository\Exceptions\BadStateException + */ +class BadStateException extends \eZ\Publish\API\Repository\Exceptions\BadStateException +{ +} diff --git a/eZ/Publish/Core/REST/Client/Exceptions/ContentValidationException.php b/eZ/Publish/Core/REST/Client/Exceptions/ContentValidationException.php new file mode 100644 index 0000000..4a67e2b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Exceptions/ContentValidationException.php @@ -0,0 +1,20 @@ +<?php +/** + * File containing the ContentValidationException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Exceptions; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Exceptions\ContentValidationException} + * interface. + * + * @see \eZ\Publish\API\Repository\Exceptions\ContentValidationException + */ +class ContentValidationException extends \eZ\Publish\API\Repository\Exceptions\ContentValidationException +{ +} diff --git a/eZ/Publish/Core/REST/Client/Exceptions/InvalidArgumentException.php b/eZ/Publish/Core/REST/Client/Exceptions/InvalidArgumentException.php new file mode 100644 index 0000000..02d3224 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Exceptions/InvalidArgumentException.php @@ -0,0 +1,17 @@ +<?php +/** + * File containing the InvalidArgumentException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Exceptions; + +/** + * This exception is thrown if a service method is called with an illegal or non appropriate value + */ +class InvalidArgumentException extends \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException +{ +} diff --git a/eZ/Publish/Core/REST/Client/Exceptions/MethodNotAllowedException.php b/eZ/Publish/Core/REST/Client/Exceptions/MethodNotAllowedException.php new file mode 100644 index 0000000..4b84105 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Exceptions/MethodNotAllowedException.php @@ -0,0 +1,17 @@ +<?php +/** + * File containing the MethodNotAllowedException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Exceptions; + +/** + * Exception thrown if an unsupported method is called. + */ +class MethodNotAllowedException extends \BadMethodCallException +{ +} diff --git a/eZ/Publish/Core/REST/Client/Exceptions/PropertyReadOnlyException.php b/eZ/Publish/Core/REST/Client/Exceptions/PropertyReadOnlyException.php new file mode 100644 index 0000000..f275171 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Exceptions/PropertyReadOnlyException.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the PropertyReadOnlyException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Exceptions; + +/** + * This Exception is thrown on a write attempt in a read only property in a value object. + * + * @package eZ\Publish\API\Repository\Exceptions + */ +class PropertyReadOnlyException extends \eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException +{ + public function __construct( $propertyName ) + { + parent::__construct( + sprintf( 'Property "%s" is read-only.', $propertyName ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Exceptions/UnauthorizedException.php b/eZ/Publish/Core/REST/Client/Exceptions/UnauthorizedException.php new file mode 100644 index 0000000..2ab7c46 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Exceptions/UnauthorizedException.php @@ -0,0 +1,20 @@ +<?php +/** + * File containing the UnauthorizedException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Exceptions; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Exceptions\UnauthorizedException} + * interface. + * + * @see \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ +class UnauthorizedException extends \eZ\Publish\API\Repository\Exceptions\UnauthorizedException +{ +} diff --git a/eZ/Publish/Core/REST/Client/FieldType.php b/eZ/Publish/Core/REST/Client/FieldType.php new file mode 100644 index 0000000..fe316d4 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/FieldType.php @@ -0,0 +1,210 @@ +<?php +/** + * File containing the FieldType class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\FieldType as APIFieldType; +use eZ\Publish\SPI; + +class FieldType implements APIFieldType +{ + /** + * Wrapped FieldType. + * + * @var \eZ\Publish\API\Repository\FieldType + */ + protected $innerFieldType; + + /** + * @param \eZ\Publish\SPI\FieldType\FieldType $innerFieldType + */ + public function __construct( SPI\FieldType\FieldType $innerFieldType ) + { + $this->innerFieldType = $innerFieldType; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return $this->innerFieldType->getFieldTypeIdentifier(); + } + + /** + * Returns a schema for the settings expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the settings of + * the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementor to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * @return mixed + */ + public function getSettingsSchema() + { + return $this->innerFieldType->getSettingsSchema(); + } + + /** + * Returns a schema for the validator configuration expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the validator + * configuration of the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementor to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * Best practice: + * + * It is considered best practice to return a hash map, which contains + * rudimentary settings structures, like e.g. for the "ezstring" FieldType + * + * <code> + * array( + * 'stringLength' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * </code> + * + * @return mixed + */ + public function getValidatorConfigurationSchema() + { + return $third->innerFieldType->getValidatorConfigurationSchema(); + } + + public function getName( $value ) + { + return $third->innerFieldType->getName( $value ); + } + + /** + * Indicates if the field type supports indexing and sort keys for searching + * + * @return boolean + */ + public function isSearchable() + { + return $this->innerFieldType->isSearchable(); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return mixed + */ + public function getEmptyValue() + { + return $this->innerFieldType->getEmptyValue(); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return mixed + */ + public function fromHash( $hash ) + { + return $this->innerFieldType->fromHash( $hash ); + } + + /** + * Converts a Value to a hash + * + * @param mixed $value + * + * @return mixed + */ + public function toHash( $value ) + { + return $this->innerFieldType->toHash( $value ); + } + + /** + * Converts the given $fieldSettings to a simple hash format + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ) + { + return $this->innerFieldType->fieldSettingsToHash( $fieldSettings ); + } + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ) + { + return $this->innerFieldType->fieldSettingsFromHash( $fieldSettingsHash ); + } + + /** + * Converts the given $validatorConfiguration to a simple hash format + * + * @param mixed $validatorConfiguration + * + * @return array|hash|scalar|null + */ + public function validatorConfigurationToHash( $validatorConfiguration ) + { + return $this->innerFieldType->validatorConfigurationToHash( $validatorConfiguration ); + } + + /** + * Converts the given $validatorConfigurationHash to a validator + * configuration of the type + * + * @param array|hash|scalar|null $validatorConfigurationHash + * + * @return mixed + */ + public function validatorConfigurationFromHash( $validatorConfigurationHash ) + { + return $this->innerFieldType->validatorConfigurationFromHash( $validatorConfigurationHash ); + } +} diff --git a/eZ/Publish/Core/REST/Client/FieldTypeService.php b/eZ/Publish/Core/REST/Client/FieldTypeService.php new file mode 100644 index 0000000..964f6f8 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/FieldTypeService.php @@ -0,0 +1,98 @@ +<?php +/** + * File containing the FieldTypeService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\FieldTypeService as APIFieldTypeService; +use eZ\Publish\Core\REST\Common\Exceptions; + +class FieldTypeService implements APIFieldTypeService +{ + /** + * FieldTypes by identifier + * + * @var \eZ\Publish\Core\REST\Client\FieldType[] + */ + protected $fieldTypes = array(); + + /** + * @param \eZ\Publish\Core\REST\Client\FieldType[] $fieldTypes + * + * @return void + */ + public function __construct( array $fieldTypes = array() ) + { + foreach ( $fieldTypes as $fieldType ) + { + $this->addFieldType( $fieldType ); + } + } + + /** + * Adds the given $fieldType + * + * Note, this is not an API method and not meant to be used directly! + * + * @param FieldType $fieldType + * + * @access protected + * + * @return void + */ + public function addFieldType( FieldType $fieldType ) + { + $this->fieldTypes[$fieldType->getFieldTypeIdentifier()] = $fieldType; + } + + /** + * Returns a list of all field types. + * + * @return \eZ\Publish\API\Repository\FieldType[] + */ + public function getFieldTypes() + { + return array_values( $this->fieldTypes ); + } + + /** + * Returns the FieldType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\FieldType + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * if there is no FieldType registered with $identifier + */ + public function getFieldType( $identifier ) + { + if ( $this->hasFieldType( $identifier ) ) + { + return $this->fieldTypes[$identifier]; + } + + throw new Exceptions\NotFoundException( + sprintf( + 'FieldType with identifier "%s" not found.', + $identifier + ) + ); + } + + /** + * Returns if there is a FieldType registered under $identifier + * + * @param string $identifier + * + * @return boolean + */ + public function hasFieldType( $identifier ) + { + return isset( $this->fieldTypes[$identifier] ); + } +} diff --git a/eZ/Publish/Core/REST/Client/HttpClient.php b/eZ/Publish/Core/REST/Client/HttpClient.php new file mode 100644 index 0000000..62bbb60 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/HttpClient.php @@ -0,0 +1,31 @@ +<?php +/** + * File containing the HttpClient interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\Core\REST\Common\Message; + +/** + * Interface for Http Client implementations + */ +interface HttpClient +{ + /** + * Execute a HTTP request to the remote server + * + * Returns the result from the remote server. + * + * @param string $method + * @param string $path + * @param Message $message + * + * @return Message + */ + public function request( $method, $path, Message $message = null ); +} diff --git a/eZ/Publish/Core/REST/Client/HttpClient/Authentication/BasicAuth.php b/eZ/Publish/Core/REST/Client/HttpClient/Authentication/BasicAuth.php new file mode 100644 index 0000000..681e15e --- /dev/null +++ b/eZ/Publish/Core/REST/Client/HttpClient/Authentication/BasicAuth.php @@ -0,0 +1,86 @@ +<?php +/** + * File containing the BasicAuth authentication HttpClient + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\HttpClient\Authentication; + +use eZ\Publish\Core\REST\Client\HttpClient; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Interface for Http Client implementations + */ +class BasicAuth implements HttpClient +{ + /** + * Inner HTTP client, performing the actual requests. + * + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + protected $innerClient; + + /** + * User name for Basic Auth + * + * @var string + */ + protected $username; + + /** + * Password for Basic Auth + * + * @var string + */ + protected $password; + + /** + * Creates a new Basic Auth HTTP client + * + * @param \eZ\Publish\Core\REST\Client\HttpClient $innerClient + * @param string $username + * @param string $password + */ + public function __construct( HttpClient $innerClient, $username, $password ) + { + $this->innerClient = $innerClient; + $this->username = $username; + $this->password = $password; + } + + /** + * Execute a HTTP request to the remote server + * + * Returns the result from the remote server. The client sets the correct + * headers for Basic Auth into the $message transmitted to the inner + * client. + * + * @param string $method + * @param string $path + * @param \eZ\Publish\Core\REST\Common\Message $message + * + * @return \eZ\Publish\Core\REST\Common\Message + */ + public function request( $method, $path, Message $message = null ) + { + if ( $message === null ) + { + $message = new Message(); + } + $message->headers['Authorization'] = sprintf( + 'Basic %s', + base64_encode( + sprintf( + '%s:%s', + $this->username, + $this->password + ) + ) + ); + return $this->innerClient->request( $method, $path, $message ); + } +} diff --git a/eZ/Publish/Core/REST/Client/HttpClient/Authentication/IntegrationTestAuthenticator.php b/eZ/Publish/Core/REST/Client/HttpClient/Authentication/IntegrationTestAuthenticator.php new file mode 100644 index 0000000..6ff29d7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/HttpClient/Authentication/IntegrationTestAuthenticator.php @@ -0,0 +1,102 @@ +<?php +/** + * File containing the IntegrationTestAuthenticator authentication HttpClient + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\HttpClient\Authentication; + +use eZ\Publish\Core\REST\Client\HttpClient; +use eZ\Publish\Core\REST\Client\Sessionable; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Authenticator used in integration tests. + * + * Note: DO NOT USE THIS IN PRODUCTION. + */ +class IntegrationTestAuthenticator implements HttpClient, Sessionable +{ + /** + * Inner HTTP client, performing the actual requests. + * + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + protected $innerClient; + + /** + * User ID to be sent to the server. + * + * @var mixed + */ + protected $userId; + + /** + * Session ID + * + * @var string + */ + protected $sessionId; + + /** + * Creates a new Integration Test Authenticator + * + * @param \eZ\Publish\Core\REST\Client\HttpClient $innerClient + * @param mixed $userId + */ + public function __construct( HttpClient $innerClient, $userId = 14 ) + { + $this->innerClient = $innerClient; + $this->userId = $userId; + } + + /** + * Execute a HTTP request to the remote server + * + * Returns the result from the remote server. The client sets the correct + * headers for Basic Auth into the $message transmitted to the inner + * client. + * + * @param string $method + * @param string $path + * @param \eZ\Publish\Core\REST\Common\Message $message + * + * @return \eZ\Publish\Core\REST\Common\Message + */ + public function request( $method, $path, Message $message = null ) + { + $message = $message ?: new Message(); + + $message->headers['X-Test-User'] = $this->userId; + + if ( $this->sessionId !== null && !isset( $message->headers['X-Test-Session'] ) ) + { + $message->headers['X-Test-Session'] = $this->sessionId; + } + + return $this->innerClient->request( $method, $path, $message ); + } + + /** + * Sets the user ID submitted to the server. + * + * @param mixed $userId + */ + public function setUserId( $userId ) + { + $this->userId = $userId; + } + + /** + * Set the session ID to use + * + * @param string $id + */ + public function setSession( $id ) + { + $this->sessionId = $id; + } +} diff --git a/eZ/Publish/Core/REST/Client/HttpClient/ConnectionException.php b/eZ/Publish/Core/REST/Client/HttpClient/ConnectionException.php new file mode 100644 index 0000000..27fe219 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/HttpClient/ConnectionException.php @@ -0,0 +1,30 @@ +<?php +/** + * File containing the ContentValidationException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\HttpClient; + +/** + * HTTPClient connection exception + */ +class ConnectionException extends \RuntimeException +{ + /** + * Constructor + * + * @param string $server + * @param string $path + * @param string $method + */ + public function __construct( $server, $path, $method ) + { + parent::__construct( + "Could not connect to server '$server' and retrieve '$path' with '$method'." + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/HttpClient/Stream.php b/eZ/Publish/Core/REST/Client/HttpClient/Stream.php new file mode 100644 index 0000000..251dc27 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/HttpClient/Stream.php @@ -0,0 +1,171 @@ +<?php +/** + * File containing the HttpClient interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\HttpClient; + +use eZ\Publish\Core\REST\Client\HttpClient; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Simple PHP stream based HTTP client. + */ +class Stream implements HttpClient +{ + /** + * Optional default headers for each request. + * + * @var array + */ + private $headers = array(); + + /** + * The remote REST server location. + * + * @var string + */ + private $server; + + /** + * Constructs a new REST client instance for the given <b>$server</b>. + * + * @param string $server Remote server location. Must include the used protocol. + */ + public function __construct( $server ) + { + $url = parse_url( rtrim( $server, '/' ) ); + $url += array( + 'scheme' => 'http', + 'host' => null, + 'port' => null, + 'user' => null, + 'pass' => null, + 'path' => null, + ); + + if ( $url['user'] || $url['pass'] ) + { + $this->headers['Authorization'] = 'Basic ' . base64_encode( "{$url['user']}:{$url['pass']}" ); + } + + $this->server = $url['scheme'] . '://' . $url['host']; + if ( $url['port'] ) + { + $this->server .= ':' . $url['port']; + } + $this->server .= $url['path']; + } + + /** + * Execute a HTTP request to the remote server + * + * Returns the result from the remote server. + * + * @param string $method + * @param string $path + * @param \eZ\Publish\Core\REST\Common\Message $message + * + * @return \eZ\Publish\Core\REST\Common\Message + */ + public function request( $method, $path, Message $message = null ) + { + $message = $message ?: new Message(); + + $requestHeaders = $this->getRequestHeaders( $message->headers ); + + $url = $this->server . $path; + + $contextOptions = array( + 'http' => array( + 'method' => $method, + 'content' => $message->body, + 'ignore_errors' => true, + 'header' => $requestHeaders, + // Do not follow redirects, since we want to handle them + // explicitly. + 'follow_location' => 0, + ), + ); + + $httpFilePointer = @fopen( + $url, + 'r', + false, + stream_context_create( $contextOptions ) + ); + + // Check if connection has been established successfully + if ( $httpFilePointer === false ) + { + throw new ConnectionException( $this->server, $path, $method ); + } + + // Read request body + $body = ''; + while ( !feof( $httpFilePointer ) ) + { + $body .= fgets( $httpFilePointer ); + } + + $metaData = stream_get_meta_data( $httpFilePointer ); + // This depends on PHP compiled with or without --curl-enable-streamwrappers + $rawHeaders = isset( $metaData['wrapper_data']['headers'] ) ? + $metaData['wrapper_data']['headers'] : + $metaData['wrapper_data']; + $headers = array(); + + foreach ( $rawHeaders as $lineContent ) + { + // Extract header values + if ( preg_match( '(^HTTP/(?P<version>\d+\.\d+)\s+(?P<status>\d+))S', $lineContent, $match ) ) + { + $headers['version'] = $match['version']; + $headers['status'] = (int)$match['status']; + } + else + { + list( $key, $value ) = explode( ':', $lineContent, 2 ); + $headers[$key] = ltrim( $value ); + } + } + + return new Message( + $headers, + $body + ); + } + + /** + * Get formatted request headers + * + * Merged with the default values. + * + * @param array $headers + * + * @return string + */ + protected function getRequestHeaders( array $headers ) + { + $requestHeaders = ''; + + foreach ( $this->headers as $name => $value ) + { + if ( !isset( $headers[$name] ) ) + { + $requestHeaders .= "$name: $value\r\n"; + } + } + + foreach ( $headers as $name => $value ) + { + $requestHeaders .= "$name: $value\r\n"; + } + + return $requestHeaders; + } +} diff --git a/eZ/Publish/Core/REST/Client/IOService.php b/eZ/Publish/Core/REST/Client/IOService.php new file mode 100644 index 0000000..28b592c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/IOService.php @@ -0,0 +1,167 @@ +<?php +/** + * File containing the IOService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\IOService as APIIOService; +use eZ\Publish\API\Repository\Values\IO\BinaryFile; +use eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Service used to handle io operations. + * + * @package eZ\Publish\API\Repository + */ +class IOService implements APIIOService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed tringid + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Creates a BinaryFileCreateStruct object from the uploaded file $uploadedFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException When given an invalid uploaded file + * + * @param array $uploadedFile The $_POST hash of an uploaded file + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct + */ + public function newBinaryCreateStructFromUploadedFile( array $uploadedFile ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Creates a BinaryFileCreateStruct object from $localFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException When given a non existing / unreadable file + * + * @param string $localFile Path to local file + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct + */ + public function newBinaryCreateStructFromLocalFile( $localFile ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Creates a binary file in the the repository + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct $binaryFileCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile The created BinaryFile object + */ + public function createBinaryFile( BinaryFileCreateStruct $binaryFileCreateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Deletes the BinaryFile with $path + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + */ + public function deleteBinaryFile( BinaryFile $binaryFile ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads the binary file with $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $binaryFileid + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile + */ + public function loadBinaryFile( $binaryFileId ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Returns a read (mode: rb) file resource to the binary file identified by $path + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + * + * @return resource + */ + public function getFileInputStream( BinaryFile $binaryFile ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Returns the content of the binary file + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + * + * @return string + */ + public function getFileContents( BinaryFile $binaryFile ) + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Content.php b/eZ/Publish/Core/REST/Client/Input/Parser/Content.php new file mode 100644 index 0000000..04a75b3 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Content.php @@ -0,0 +1,126 @@ +<?php +/** + * File containing the Content parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Client\ContentService; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client\Values; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Parser for Version + * + * @todo Integrate FieldType fromHash() + * @todo Caching for extracted embedded objects + */ +class Content extends Parser +{ + /** + * VersionInfo parser + * + * @var \eZ\Publish\Core\REST\Client\Input\Parser\VersionInfo + */ + protected $versionInfoParser; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + * @param \eZ\Publish\Core\REST\Client\ContentService $contentService + * @param \eZ\Publish\Core\REST\Client\Input\Parser\VersionInfo $versionInfoParser + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + */ + public function __construct( ParserTools $parserTools, ContentService $contentService, VersionInfo $versionInfoParser, FieldTypeParser $fieldTypeParser ) + { + $this->parserTools = $parserTools; + $this->contentService = $contentService; + $this->versionInfoParser = $versionInfoParser; + $this->fieldTypeParser = $fieldTypeParser; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $versionInfo = $this->versionInfoParser->parse( + $data['VersionInfo'], + $parsingDispatcher + ); + $fields = $this->parseFields( $data['Fields'], $versionInfo->contentInfoId ); + + return new Values\Content\Content( + $this->contentService, + array( + 'versionInfo' => $versionInfo, + 'internalFields' => $fields + ) + ); + } + + /** + * Parses the fields from the given $rawFieldsData + * + * @param array $rawFieldsData + * @param string $contentId + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected function parseFields( array $rawFieldsData, $contentId ) + { + $fields = array(); + + if ( isset( $rawFieldsData['Field'] ) ) + { + foreach ( $rawFieldsData['Field'] as $rawFieldData ) + { + $fields[] = new Field( + array( + 'id' => $rawFieldData['id'], + 'fieldDefIdentifier' => $rawFieldData['fieldDefinitionIdentifier'], + 'languageCode' => $rawFieldData['languageCode'], + 'value' => $this->fieldTypeParser->parseFieldValue( + $contentId, + $rawFieldData['fieldDefinitionIdentifier'], + $rawFieldData['fieldValue'] + ) + ) + ); + } + } + + return $fields; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ContentInfo.php b/eZ/Publish/Core/REST/Client/Input/Parser/ContentInfo.php new file mode 100644 index 0000000..d0a600a --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ContentInfo.php @@ -0,0 +1,98 @@ +<?php +/** + * File containing the ContentInfo parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Client\ContentTypeService; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client\Values; + +/** + * Parser for ContentInfo + */ +class ContentInfo extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + protected $contentTypeService; + + /** + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + * @param \eZ\Publish\Core\REST\Client\ContentTypeService $contentTypeService + */ + public function __construct( ParserTools $parserTools, ContentTypeService $contentTypeService ) + { + $this->parserTools = $parserTools; + $this->contentTypeService = $contentTypeService; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + * @todo Error handling + * @todo What about missing properties? Set them here, using the service to + * load? Or better set them in the service, since loading is really + * unsuitable here? + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contentTypeId = $this->parserTools->parseObjectElement( $data['ContentType'], $parsingDispatcher ); + $ownerId = $this->parserTools->parseObjectElement( $data['Owner'], $parsingDispatcher ); + $mainLocationId = $this->parserTools->parseObjectElement( $data['MainLocation'], $parsingDispatcher ); + $sectionId = $this->parserTools->parseObjectElement( $data['Section'], $parsingDispatcher ); + + $locationListReference = $this->parserTools->parseObjectElement( $data['Locations'], $parsingDispatcher ); + $versionListReference = $this->parserTools->parseObjectElement( $data['Versions'], $parsingDispatcher ); + $currentVersionReference = $this->parserTools->parseObjectElement( $data['CurrentVersion'], $parsingDispatcher ); + + if ( isset( $data['CurrentVersion']['Version'] ) ) + { + $this->parserTools->parseObjectElement( $data['CurrentVersion']['Version'], $parsingDispatcher ); + } + + return new Values\RestContentInfo( + array( + 'id' => $data['_href'], + 'name' => $data['Name'], + 'contentTypeId' => $contentTypeId, + 'ownerId' => $ownerId, + 'modificationDate' => new \DateTime( $data['lastModificationDate'] ), + + 'publishedDate' => ( $publishedDate = ( !empty( $data['publishedDate'] ) + ? new \DateTime( $data['publishedDate'] ) + : null ) ), + + 'published' => ( $publishedDate !== null ), + 'alwaysAvailable' => ( strtolower( $data['alwaysAvailable'] ) === 'true' ), + 'remoteId' => $data['_remoteId'], + 'mainLanguageCode' => $data['mainLanguageCode'], + 'mainLocationId' => $mainLocationId, + 'sectionId' => $sectionId, + + 'versionListReference' => $versionListReference, + 'locationListReference' => $locationListReference, + 'currentVersionReference' => $currentVersionReference, + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ContentList.php b/eZ/Publish/Core/REST/Client/Input/Parser/ContentList.php new file mode 100644 index 0000000..d9b2338 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ContentList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the ContentList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for ContentList + */ +class ContentList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contents = array(); + foreach ( $data['Content'] as $rawContentData ) + { + $contents[] = $parsingDispatcher->parse( + $rawContentData, + $rawContentData['_media-type'] + ); + } + return $contents; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ContentObjectStates.php b/eZ/Publish/Core/REST/Client/Input/Parser/ContentObjectStates.php new file mode 100644 index 0000000..8862fc4 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ContentObjectStates.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the ContentObjectStates parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for ContentObjectStates + */ +class ContentObjectStates extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $states = array(); + foreach ( $data['ObjectState'] as $rawStateData ) + { + $states[] = $parsingDispatcher->parse( + $rawStateData, + $rawStateData['_media-type'] + ); + } + return $states; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ContentType.php b/eZ/Publish/Core/REST/Client/Input/Parser/ContentType.php new file mode 100644 index 0000000..4fb8ba6 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ContentType.php @@ -0,0 +1,89 @@ +<?php +/** + * File containing the ContentType parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Client\ContentTypeService; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client\Values; + +/** + * Parser for ContentType + */ +class ContentType extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + protected $contentTypeService; + + /** + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + * @param \eZ\Publish\Core\REST\Client\ContentTypeService $contentTypeService + */ + public function __construct( ParserTools $parserTools, ContentTypeService $contentTypeService ) + { + $this->parserTools = $parserTools; + $this->contentTypeService = $contentTypeService; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + * @todo Error handling + * @todo What about missing properties? Set them here, using the service to + * load? Or better set them in the service, since loading is really + * unsuitable here? + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $creatorId = $this->parserTools->parseObjectElement( $data['Creator'], $parsingDispatcher ); + $modifierId = $this->parserTools->parseObjectElement( $data['Modifier'], $parsingDispatcher ); + + $fieldDefinitionListReference = $this->parserTools->parseObjectElement( $data['FieldDefinitions'], $parsingDispatcher ); + + return new Values\ContentType\ContentType( + $this->contentTypeService, + array( + 'id' => $data['_href'], + 'status' => $this->parserTools->parseStatus( $data['status'] ), + 'identifier' => $data['identifier'], + 'names' => $this->parserTools->parseTranslatableList( $data['names'] ), + 'descriptions' => $this->parserTools->parseTranslatableList( $data['descriptions'] ), + 'creationDate' => new \DateTime( $data['creationDate'] ), + 'modificationDate' => new \DateTime( $data['modificationDate'] ), + 'creatorId' => $creatorId, + 'modifierId' => $modifierId, + 'remoteId' => $data['remoteId'], + 'urlAliasSchema' => $data['urlAliasSchema'], + 'nameSchema' => $data['nameSchema'], + 'isContainer' => $this->parserTools->parseBooleanValue( $data['isContainer'] ), + 'mainLanguageCode' => $data['mainLanguageCode'], + 'defaultAlwaysAvailable' => $this->parserTools->parseBooleanValue( $data['defaultAlwaysAvailable'] ), + 'defaultSortOrder' => $this->parserTools->parseDefaultSortOrder( $data['defaultSortOrder'] ), + 'defaultSortField' => $this->parserTools->parseDefaultSortField( $data['defaultSortField'] ), + + 'fieldDefinitionListReference' => $fieldDefinitionListReference, + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ErrorMessage.php b/eZ/Publish/Core/REST/Client/Input/Parser/ErrorMessage.php new file mode 100644 index 0000000..0551ed7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ErrorMessage.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the ErrorMessage parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for ErrorMessage + */ +class ErrorMessage extends Parser +{ + /** + * Mapping of error codes to the respective exception classes + * + * @var array + */ + protected $errorCodeMapping = array( + 404 => '\\eZ\\Publish\\Core\\REST\\Common\\Exceptions\\NotFoundException', + 406 => '\\eZ\\Publish\\Core\\REST\\Client\\Exceptions\\InvalidArgumentException', + 409 => '\\eZ\\Publish\\Core\\REST\\Client\\Exceptions\\BadStateException', + ); + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \Exception + * + * @return void + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( isset( $this->errorCodeMapping[$data['errorCode']] ) ) + { + $exceptionClass = $this->errorCodeMapping[$data['errorCode']]; + } + else + { + $exceptionClass = '\\Exception'; + } + + throw new $exceptionClass( + $data['errorDescription'], + $data['errorCode'] + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/FieldDefinition.php b/eZ/Publish/Core/REST/Client/Input/Parser/FieldDefinition.php new file mode 100644 index 0000000..1a818f6 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/FieldDefinition.php @@ -0,0 +1,90 @@ +<?php +/** + * File containing the FieldDefinition parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Client\ContentTypeService; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + +use eZ\Publish\Core\REST\Client\Values; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Parser for Version + * + * @todo Caching for extracted embedded objects + */ +class FieldDefinition extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + */ + public function __construct( ParserTools $parserTools, FieldTypeParser $fieldTypeParser ) + { + $this->parserTools = $parserTools; + $this->fieldTypeParser = $fieldTypeParser; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + return new Values\ContentType\FieldDefinition( + array( + 'id' => $data['_href'], + 'identifier' => $data['identifier'], + 'fieldTypeIdentifier' => $data['fieldType'], + 'fieldGroup' => $data['fieldGroup'], + 'position' => (int)$data['position'], + 'isTranslatable' => $this->parserTools->parseBooleanValue( $data['isTranslatable'] ), + 'isRequired' => $this->parserTools->parseBooleanValue( $data['isRequired'] ), + 'isInfoCollector' => $this->parserTools->parseBooleanValue( $data['isInfoCollector'] ), + 'isSearchable' => $this->parserTools->parseBooleanValue( $data['isSearchable'] ), + 'names' => $this->parserTools->parseTranslatableList( $data['names'] ), + 'descriptions' => $this->parserTools->parseTranslatableList( $data['descriptions'] ), + + 'defaultValue' => $this->fieldTypeParser->parseValue( + $data['fieldType'], + $data['defaultValue'] + ), + 'fieldSettings' => $this->fieldTypeParser->parseFieldSettings( + $data['fieldType'], + $data['fieldSettings'] + ), + 'validators' => $this->fieldTypeParser->parseValidatorConfiguration( + $data['fieldType'], + $data['validatorConfiguration'] + ), + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/FieldDefinitionList.php b/eZ/Publish/Core/REST/Client/Input/Parser/FieldDefinitionList.php new file mode 100644 index 0000000..3d3c1bc --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/FieldDefinitionList.php @@ -0,0 +1,70 @@ +<?php +/** + * File containing the FieldDefinitionList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Client\ContentTypeService; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client\Values; + +/** + * Parser for FieldDefinitionList + */ +class FieldDefinitionList extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + protected $contentTypeService; + + /** + * @param ParserTools $parserTools + * @param ContentTypeService $contentTypeService + */ + public function __construct( ParserTools $parserTools, ContentTypeService $contentTypeService ) + { + $this->parserTools = $parserTools; + $this->contentTypeService = $contentTypeService; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Client\Values\FieldDefinitionList + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $fieldDefinitionReferences = array(); + + foreach ( $data['FieldDefinition'] as $fieldDefinitionData ) + { + $fieldDefinitionReferences[] = $this->parserTools->parseObjectElement( + $fieldDefinitionData, + $parsingDispatcher + ); + } + + return new Values\FieldDefinitionList( + $this->contentTypeService, + $fieldDefinitionReferences + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Limitation.php b/eZ/Publish/Core/REST/Client/Input/Parser/Limitation.php new file mode 100644 index 0000000..008656c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Limitation.php @@ -0,0 +1,105 @@ +<?php +/** + * File containing the Limitation parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\API\Repository\Values\User\Limitation as APILimitation; + +/** + * Parser for Limitation + */ +class Limitation extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $limitation = $this->getLimitationByIdentifier( $data['_identifier'] ); + + $limitationValues = array(); + foreach ( $data['values']['ref'] as $limitationValue ) + { + $limitationValues[] = $limitationValue['_href']; + } + + $limitation->limitationValues = $limitationValues; + + return $limitation; + } + + /** + * Instantiates Limitation object based on identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + * + * @todo Use dependency injection system + */ + protected function getLimitationByIdentifier( $identifier ) + { + switch ( $identifier ) + { + case APILimitation::CONTENTTYPE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + + case APILimitation::LANGUAGE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\LanguageLimitation(); + + case APILimitation::LOCATION: + return new \eZ\Publish\API\Repository\Values\User\Limitation\LocationLimitation(); + + case APILimitation::OWNER: + return new \eZ\Publish\API\Repository\Values\User\Limitation\OwnerLimitation(); + + case APILimitation::PARENTOWNER: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentOwnerLimitation(); + + case APILimitation::PARENTCONTENTTYPE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentContentTypeLimitation(); + + case APILimitation::PARENTDEPTH: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentDepthLimitation(); + + case APILimitation::SECTION: + return new \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation(); + + case APILimitation::SITEACCESS: + return new \eZ\Publish\API\Repository\Values\User\Limitation\SiteaccessLimitation(); + + case APILimitation::STATE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ObjectStateLimitation(); + + case APILimitation::SUBTREE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation(); + + case APILimitation::USERGROUP: + return new \eZ\Publish\API\Repository\Values\User\Limitation\UserGroupLimitation(); + + case APILimitation::PARENTUSERGROUP: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentUserGroupLimitation(); + + default: + throw new \eZ\Publish\Core\Base\Exceptions\NotFoundException( 'Limitation', $identifier ); + } + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Location.php b/eZ/Publish/Core/REST/Client/Input/Parser/Location.php new file mode 100644 index 0000000..a5e8396 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Location.php @@ -0,0 +1,67 @@ +<?php +/** + * File containing the Location parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\Input\ParserTools; + +use eZ\Publish\API\Repository\Values\Content\Content as APIContent; +use eZ\Publish\Core\Repository\Values; + +/** + * Parser for Location + */ +class Location extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( ParserTools $parserTools ) + { + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $content = $parsingDispatcher->parse( $data['Content'], 'Content' ); + + return new Values\Content\Location( + array( + 'contentInfo' => $content instanceof APIContent ? $content->getVersionInfo()->getContentInfo() : null, + 'id' => $data['_href'], + 'priority' => (int)$data['priority'], + 'hidden' => $data['hidden'] === 'true' ? true : false, + 'invisible' => $data['invisible'] === 'true' ? true : false, + 'remoteId' => $data['remoteId'], + 'parentLocationId' => $data['ParentLocation']['_href'], + 'pathString' => $data['pathString'], + 'depth' => (int)$data['depth'], + 'sortField' => $this->parserTools->parseDefaultSortField( $data['sortField'] ), + 'sortOrder' => $this->parserTools->parseDefaultSortOrder( $data['sortOrder'] ), + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/LocationList.php b/eZ/Publish/Core/REST/Client/Input/Parser/LocationList.php new file mode 100644 index 0000000..c19e602 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/LocationList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the LocationList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for LocationList + */ +class LocationList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $locations = array(); + foreach ( $data['Location'] as $rawLocationData ) + { + $locations[] = $parsingDispatcher->parse( + $rawLocationData, + $rawLocationData['_media-type'] + ); + } + return $locations; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ObjectState.php b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectState.php new file mode 100644 index 0000000..54324a3 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectState.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the ObjectState parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\Input\ParserTools; + +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState as CoreObjectState; + +/** + * Parser for ObjectState + */ +class ObjectState extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + public function __construct( ParserTools $parserTools ) + { + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $names = $this->parserTools->parseTranslatableList( $data['names'] ); + + $descriptions = isset( $data['descriptions'] ) + ? $this->parserTools->parseTranslatableList( $data['descriptions'] ) + : array(); + + return new CoreObjectState( + array( + 'id' => $data['_href'], + 'identifier' => $data['identifier'], + 'priority' => (int)$data['priority'], + 'defaultLanguageCode' => $data['defaultLanguageCode'], + 'languageCodes' => explode( ',', $data['languageCodes'] ), + 'names' => $names, + 'descriptions' => $descriptions + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateGroup.php b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateGroup.php new file mode 100644 index 0000000..e3909cc --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateGroup.php @@ -0,0 +1,61 @@ +<?php +/** + * File containing the ObjectStateGroup parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectStateGroup as CoreObjectStateGroup; + +/** + * Parser for ObjectStateGroup + */ +class ObjectStateGroup extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + public function __construct( ParserTools $parserTools ) + { + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $names = $this->parserTools->parseTranslatableList( $data['names'] ); + + $descriptions = isset( $data['descriptions'] ) + ? $this->parserTools->parseTranslatableList( $data['descriptions'] ) + : array(); + + return new CoreObjectStateGroup( + array( + 'id' => $data['_href'], + 'identifier' => $data['identifier'], + 'defaultLanguageCode' => $data['defaultLanguageCode'], + 'languageCodes' => explode( ',', $data['languageCodes'] ), + 'names' => $names, + 'descriptions' => $descriptions + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateGroupList.php b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateGroupList.php new file mode 100644 index 0000000..fa0536a --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateGroupList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the ObjectStateGroupList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for ObjectStateGroupList + */ +class ObjectStateGroupList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $groups = array(); + foreach ( $data['ObjectStateGroup'] as $rawGroupData ) + { + $groups[] = $parsingDispatcher->parse( + $rawGroupData, + $rawGroupData['_media-type'] + ); + } + return $groups; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateList.php b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateList.php new file mode 100644 index 0000000..01132f6 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/ObjectStateList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the ObjectStateList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for ObjectStateList + */ +class ObjectStateList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $states = array(); + foreach ( $data['ObjectState'] as $rawStateData ) + { + $states[] = $parsingDispatcher->parse( + $rawStateData, + $rawStateData['_media-type'] + ); + } + return $states; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Policy.php b/eZ/Publish/Core/REST/Client/Input/Parser/Policy.php new file mode 100644 index 0000000..821aed0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Policy.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the Policy parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client; + +/** + * Parser for Policy + */ +class Policy extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $limitations = array(); + + if ( array_key_exists( 'limitations', $data ) ) + { + foreach ( $data['limitations']['limitation'] as $limitation ) + { + $limitations[] = $parsingDispatcher->parse( + $limitation, + $limitation['_media-type'] + ); + } + } + + return new Client\Values\User\Policy( + array( + 'id' => $data['id'], + 'module' => $data['module'], + 'function' => $data['function'], + 'limitations' => $limitations + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/PolicyList.php b/eZ/Publish/Core/REST/Client/Input/Parser/PolicyList.php new file mode 100644 index 0000000..5e72a44 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/PolicyList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the PolicyList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for PolicyList + */ +class PolicyList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $policies = array(); + + if ( array_key_exists( 'Policy', $data ) && is_array( $data['Policy'] ) ) + { + foreach ( $data['Policy'] as $rawPolicyData ) + { + $policies[] = $parsingDispatcher->parse( + $rawPolicyData, + $rawPolicyData['_media-type'] + ); + } + } + + return $policies; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Relation.php b/eZ/Publish/Core/REST/Client/Input/Parser/Relation.php new file mode 100644 index 0000000..5a0d22b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Relation.php @@ -0,0 +1,90 @@ +<?php +/** + * File containing the Relation parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client\Values; +use eZ\Publish\Core\REST\Client\ContentService; + +/** + * Parser for Relation + */ +class Relation extends Parser +{ + /** + * Content Service + * + * @var \eZ\Publish\Core\REST\Input\ContentService + */ + protected $contentService; + + /** + * @param \eZ\Publish\Core\REST\Input\ContentService $contentService + */ + public function __construct( ContentService $contentService ) + { + $this->contentService = $contentService; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\Relation\Version + * @todo Error handling + * @todo Should the related ContentInfo structs really be loaded here or do + * we need lazy loading for this? + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + return new Values\Content\Relation( + array( + 'id' => $data['_href'], + 'sourceContentInfo' => $this->contentService->loadContentInfo( + $data['SourceContent']['_href'] + ), + 'destinationContentInfo' => $this->contentService->loadContentInfo( + $data['DestinationContent']['_href'] + ), + 'type' => $this->convertRelationType( $data['RelationType'] ), + // @todo: Handle SourceFieldDefinitionIdentifier + ) + ); + } + + /** + * Converts the string representation of the relation type to its constant + * + * @param string $stringType + * + * @return int + */ + protected function convertRelationType( $stringType ) + { + switch ( strtoupper( $stringType ) ) + { + case 'COMMON': + return Values\Content\Relation::COMMON; + case 'EMBED': + return Values\Content\Relation::EMBED; + case 'LINK': + return Values\Content\Relation::LINK; + case 'FIELD': + return Values\Content\Relation::FIELD; + } + throw new \RuntimeException( + sprintf( 'Unknown Relation type: "%s"', $stringType ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/RelationList.php b/eZ/Publish/Core/REST/Client/Input/Parser/RelationList.php new file mode 100644 index 0000000..81243a0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/RelationList.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the RelationList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for RelationList + */ +class RelationList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + // @todo: Implement + return; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Role.php b/eZ/Publish/Core/REST/Client/Input/Parser/Role.php new file mode 100644 index 0000000..c093b33 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Role.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the Role parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\Core\REST\Client; + +/** + * Parser for Role + */ +class Role extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + return new Client\Values\User\Role( + array( + 'id' => $data['_href'], + 'identifier' => $data['identifier'], + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/RoleAssignment.php b/eZ/Publish/Core/REST/Client/Input/Parser/RoleAssignment.php new file mode 100644 index 0000000..1ee1d6e --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/RoleAssignment.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the RoleAssignment parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\API\Repository\Values\User\Limitation as APILimitation; + +use eZ\Publish\Core\REST\Client; + +/** + * Parser for RoleAssignment + */ +class RoleAssignment extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment + * @todo Error handling + * @todo Use dependency injection system for Role Limitation lookup + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $roleLimitation = null; + if ( array_key_exists( 'limitation', $data ) ) + { + $limitation = $parsingDispatcher->parse( $data['limitation'], $data['limitation']['_media-type'] ); + switch ( $limitation->getIdentifier() ) + { + case APILimitation::SECTION: + $roleLimitation = new \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation(); + break; + + case APILimitation::SUBTREE: + $roleLimitation = new \eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation(); + break; + + default: + throw new \eZ\Publish\Core\Base\Exceptions\NotFoundException( 'RoleLimitation', $limitation->getIdentifier() ); + } + + $roleLimitation->limitationValues = $limitation->limitationValues; + } + + return new Client\Values\User\RoleAssignment( + array( + 'role' => $parsingDispatcher->parse( $data['Role'], $data['Role']['_media-type'] ), + 'limitation' => $roleLimitation + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/RoleAssignmentList.php b/eZ/Publish/Core/REST/Client/Input/Parser/RoleAssignmentList.php new file mode 100644 index 0000000..56e9f23 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/RoleAssignmentList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the RoleAssignmentList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for RoleAssignmentList + */ +class RoleAssignmentList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $roleAssignments = array(); + foreach ( $data['RoleAssignment'] as $rawRoleAssignmentData ) + { + $roleAssignments[] = $parsingDispatcher->parse( + $rawRoleAssignmentData, + $rawRoleAssignmentData['_media-type'] + ); + } + return $roleAssignments; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/RoleList.php b/eZ/Publish/Core/REST/Client/Input/Parser/RoleList.php new file mode 100644 index 0000000..4a66b93 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/RoleList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the RoleList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for RoleList + */ +class RoleList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\User\Role[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $roles = array(); + foreach ( $data['Role'] as $rawRoleData ) + { + $roles[] = $parsingDispatcher->parse( + $rawRoleData, + $rawRoleData['_media-type'] + ); + } + return $roles; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/Section.php b/eZ/Publish/Core/REST/Client/Input/Parser/Section.php new file mode 100644 index 0000000..9206363 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/Section.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the Section parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +use eZ\Publish\API\Repository\Values; + +/** + * Parser for Section + */ +class Section extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + return new Values\Content\Section( + array( + 'id' => $data['_href'], + 'identifier' => $data['identifier'], + 'name' => $data['name'], + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/SectionList.php b/eZ/Publish/Core/REST/Client/Input/Parser/SectionList.php new file mode 100644 index 0000000..c2ebde1 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/SectionList.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the SectionList parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; + +/** + * Parser for SectionList + */ +class SectionList extends Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\Section[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $sections = array(); + foreach ( $data['Section'] as $rawSectionData ) + { + $sections[] = $parsingDispatcher->parse( + $rawSectionData, + $rawSectionData['_media-type'] + ); + } + return $sections; + } +} diff --git a/eZ/Publish/Core/REST/Client/Input/Parser/VersionInfo.php b/eZ/Publish/Core/REST/Client/Input/Parser/VersionInfo.php new file mode 100644 index 0000000..0dd776b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Input/Parser/VersionInfo.php @@ -0,0 +1,99 @@ +<?php +/** + * File containing the VersionInfo parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\Input\ParserTools; + +use eZ\Publish\Core\REST\Client\Values; +use eZ\Publish\Core\REST\Client\ContentService; + +/** + * Parser for VersionInfo + */ +class VersionInfo extends Parser +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Content Service + * + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentService; + + /** + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + * @param \eZ\Publish\Core\REST\Client\ContentService $contentService + */ + public function __construct( ParserTools $parserTools, ContentService $contentService ) + { + $this->parserTools = $parserTools; + $this->contentService = $contentService; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @todo Error handling + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contentInfoId = $this->parserTools->parseObjectElement( $data['Content'], $parsingDispatcher ); + + return new Values\Content\VersionInfo( + $this->contentService, + array( + 'id' => $data['id'], + 'versionNo' => $data['versionNo'], + 'status' => $this->convertVersionStatus( $data['status'] ), + 'modificationDate' => new \DateTime( $data['modificationDate'] ), + 'creatorId' => $data['Creator']['_href'], + 'creationDate' => new \DateTime( $data['creationDate'] ), + 'initialLanguageCode' => $data['initialLanguageCode'], + 'languageCodes' => explode( ',', $data['languageCodes'] ), + 'names' => $this->parserTools->parseTranslatableList( $data['names'] ), + 'contentInfoId' => $contentInfoId, + ) + ); + } + + /** + * Converts the given $statusString to its constant representation + * + * @param string $statusString + * + * @return int + */ + protected function convertVersionStatus( $statusString ) + { + switch ( strtoupper( $statusString ) ) + { + case 'PUBLISHED': + return Values\Content\VersionInfo::STATUS_PUBLISHED; + case 'DRAFT': + return Values\Content\VersionInfo::STATUS_DRAFT; + case 'ARCHIVED': + return Values\Content\VersionInfo::STATUS_ARCHIVED; + } + throw new \RuntimeException( + sprintf( 'Unknown version status: "%s"', $statusString ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/IntegrationTestRepository.php b/eZ/Publish/Core/REST/Client/IntegrationTestRepository.php new file mode 100644 index 0000000..c499719 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/IntegrationTestRepository.php @@ -0,0 +1,113 @@ +<?php +/** + * File containing the IntegrationTestRepository class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\Values\User\User; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Client\HttpClient\Authentication\IntegrationTestAuthenticator; + +/** + * REST Client Repository to be used in integration tests + * + * Note: NEVER USE THIS IN PRODUCTION! + * + * @see \eZ\Publish\API\Repository\Repository + */ +class IntegrationTestRepository extends Repository implements Sessionable +{ + /** + * Optional session identifier + * + * @var string + */ + private $session; + + /** + * Integration test authenticator + * + * @var \eZ\Publish\Core\REST\Client\HttpClient\Authentication\IntegrationTestAuthentication + */ + private $authenticator; + + /** + * Client + * + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * Current user + * + * @var \eZ\Publish\API\Repository\Values\User\User + */ + private $currentUser; + + /** + * Instantiates the REST Client repository. + * + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\SPI\FieldType\FieldType[] $fieldTypes + * @param \eZ\Publish\Core\REST\Client\HttpClient\Authentication\IntegrationTestAuthentication $authenticator + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler, array $fieldTypes, IntegrationTestAuthenticator $authenticator ) + { + parent::__construct( $client, $inputDispatcher, $outputVisitor, $urlHandler, $fieldTypes ); + $this->client = $client; + $this->authenticator = $authenticator; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed tringid + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->client instanceof Sessionable ) + { + $this->client->setSession( $id ); + } + } + + /** + * Get current user + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getCurrentUser() + { + return $this->currentUser; + } + + /** + * Sets the current user to the given $user. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + */ + public function setCurrentUser( User $user ) + { + $this->currentUser = $user; + $this->authenticator->setUserId( $user->id ); + } +} diff --git a/eZ/Publish/Core/REST/Client/LanguageService.php b/eZ/Publish/Core/REST/Client/LanguageService.php new file mode 100644 index 0000000..757611b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/LanguageService.php @@ -0,0 +1,219 @@ +<?php +/** + * File containing the LanguageService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\LanguageService as APILanguageService; +use eZ\Publish\API\Repository\Values\Content\Language; +use eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\LanguageService} + * interface. + * + * @see \eZ\Publish\API\Repository\LanguageService + */ +class LanguageService implements APILanguageService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + private $contentService; + + /** + * @var string + */ + private $defaultLanguageCode; + + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( ContentService $contentService, $defaultLanguageCode, HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->contentService = $contentService; + $this->defaultLanguageCode = $defaultLanguageCode; + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed tringid + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Creates the a new Language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the languageCode already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct $languageCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function createLanguage( LanguageCreateStruct $languageCreateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Changes the name of the language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * @param string $newName + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function updateLanguageName( Language $language, $newName ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Enables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function enableLanguage( Language $language ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Disables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function disableLanguage( Language $language ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads a Language from its language code ($languageCode) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguage( $languageCode ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads all Languages + * + * @return \eZ\Publish\API\Repository\Values\Content\Language[] + */ + public function loadLanguages() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads a Language by its id ($languageId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param int $languageId + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguageById( $languageId ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Deletes a language from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if language can not be deleted + * because it is still assigned to some content / type / (...). + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function deleteLanguage( Language $language ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Returns a configured default language code + * + * @return string + */ + public function getDefaultLanguageCode() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiates an object to be used for creating languages + * + * @return \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct + */ + public function newLanguageCreateStruct() + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/LocationService.php b/eZ/Publish/Core/REST/Client/LocationService.php new file mode 100644 index 0000000..3ebc9bf --- /dev/null +++ b/eZ/Publish/Core/REST/Client/LocationService.php @@ -0,0 +1,363 @@ +<?php +/** + * File containing the LocationUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\LocationService as APILocationService; +use eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Location; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Location service, used for complex subtree operations + * + * @example Examples/location.php + * + * @package eZ\Publish\API\Repository + */ +class LocationService implements APILocationService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + * + * @private + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Instantiates a new location create class + * + * @param mixed $parentLocationId the parent under which the new location should be created + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct + */ + public function newLocationCreateStruct( $parentLocationId ) + { + return new LocationCreateStruct( + array( + 'parentLocationId' => $parentLocationId + ) + ); + } + + /** + * Creates the new $location in the content repository for the given content + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the content is already below the specified parent + * or the parent is a sub location of the location the content + * or if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $locationCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created Location + */ + public function createLocation( ContentInfo $contentInfo, LocationCreateStruct $locationCreateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $locationCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Location' ); + + $values = $this->urlHandler->parse( 'object', $contentInfo->id ); + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'objectLocations', array( 'object' => $values['object'] ) ), + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Loads a location object from its $locationId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param int $locationId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocation( $locationId ) + { + $response = $this->client->request( + 'GET', + $locationId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'Location' ) ) + ) + ); + + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads a location object from its $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocationByRemoteId( $remoteId ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'locationByRemote', array( 'location' => $remoteId ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'LocationList' ) ) + ) + ); + + return reset( $this->inputDispatcher->parse( $response ) ); + } + + /** + * Instantiates a new location update class + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct + */ + public function newLocationUpdateStruct() + { + return new LocationUpdateStruct(); + } + + /** + * Updates $location in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to update this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct $locationUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the updated Location + */ + public function updateLocation( Location $location, LocationUpdateStruct $locationUpdateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $locationUpdateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Location' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + $result = $this->client->request( + 'POST', + $location->id, + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Loads the locations for the given content object. + * + * If a $rootLocation is given, only locations that belong to this location are returned. + * The location list is also filtered by permissions on reading locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if there is no published version yet + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location $rootLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] + */ + public function loadLocations( ContentInfo $contentInfo, Location $rootLocation = null ) + { + $values = $this->urlHandler->parse( 'object', $contentInfo->id ); + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'objectLocations', array( 'object' => $values['object'] ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'LocationList' ) ) + ) + ); + + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads children which are readable by the current user of a location object sorted by sortField and sortOrder + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @param int $offset the start offset for paging + * @param int $limit the number of locations returned. If $limit = -1 all children starting at $offset are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationList + */ + public function loadLocationChildren( Location $location, $offset = 0, $limit = -1 ) + { + $values = $this->urlHandler->parse( 'location', $location->id ); + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'locationChildren', array( 'location' => $values['location'] ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'LocationList' ) ) + ) + ); + + return $this->inputDispatcher->parse( $response ); + } + + /** + * Returns the number of children which are readable by the current user of a location object + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return int + */ + public function getLocationChildCount( Location $location ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Swaps the contents hold by the $location1 and $location2 + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to swap content + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location1 + * @param \eZ\Publish\API\Repository\Values\Content\Location $location2 + */ + public function swapLocation( Location $location1, Location $location2 ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Hides the $location and marks invisible all descendants of $location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to hide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function hideLocation( Location $location ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Unhides the $location. + * + * This method and marks visible all descendants of $locations + * until a hidden location is found. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to unhide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function unhideLocation( Location $location ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Deletes $location and all its descendants. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user is not allowed to delete this location or a descendant + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + */ + public function deleteLocation( Location $location ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Copies the subtree starting from $subtree as a new subtree of $targetLocation + * + * Only the items on which the user has read access are copied. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed copy the subtree to the given parent location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the target location is a sub location of the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $subtree - the subtree denoted by the location to copy + * @param \eZ\Publish\API\Repository\Values\Content\Location $targetParentLocation - the target parent location for the copy operation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location The newly created location of the copied subtree + * + * @todo enhancement - this method should return a result structure containing the new location and a list + * of locations which are not copied due to permission denials. + */ + public function copySubtree( Location $subtree, Location $targetParentLocation ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Moves the subtree to $newParentLocation + * + * If a user has the permission to move the location to a target location + * he can do it regardless of an existing descendant on which the user has no permission. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to move this location to the target + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + */ + public function moveSubtree( Location $location, Location $newParentLocation ) + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/ObjectCache.php b/eZ/Publish/Core/REST/Client/ObjectCache.php new file mode 100644 index 0000000..719eda3 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/ObjectCache.php @@ -0,0 +1,76 @@ +<?php +/** + * File containing the SimpleObjectCache class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Simple cache for value objects during a single request + */ +class ObjectCache +{ + /** + * Map of cached objects by their key + * + * @var array + */ + protected $cachedObjects = array(); + + /** + * Stores $data under $key + * + * @param string $key + * @param ValueObject $data + * + * @return void + */ + public function store( $key, ValueObject $data ) + { + $this->cachedObjects[$key] = $data; + } + + /** + * Restores data stored under $key, returns null if $key is not found + * + * @param string $key + * + * @return ValueObject|null + */ + public function restore( $key ) + { + if ( isset( $this->cachedObjects[$key] ) ) + { + return $this->cachedObjects[$key]; + } + return null; + } + + /** + * Clears the data stored in $key + * + * @param string $key + * + * @return void + */ + public function clear( $key ) + { + unset( $this->cachedObjects[$key] ); + } + + /** + * Clears all cached items + * + * @return void + */ + public function clearAll() + { + $this->cachedObjects = array(); + } +} diff --git a/eZ/Publish/Core/REST/Client/ObjectStateService.php b/eZ/Publish/Core/REST/Client/ObjectStateService.php new file mode 100644 index 0000000..3549d06 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/ObjectStateService.php @@ -0,0 +1,464 @@ +<?php +/** + * File containing the ObjectStateService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\REST\Client + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; + +use eZ\Publish\API\Repository\ObjectStateService as APIObjectStateService; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectState; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct; +use eZ\Publish\Core\REST\Common\Values\ContentObjectStates; + +/** + * ObjectStateService service + */ +class ObjectStateService implements APIObjectStateService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + * + * @private + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Creates a new object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct $objectStateGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function createObjectStateGroup( ObjectStateGroupCreateStruct $objectStateGroupCreateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $objectStateGroupCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'ObjectStateGroup' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'objectstategroups' ), + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Loads a object state group + * + * @param mixed $objectStateGroupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function loadObjectStateGroup( $objectStateGroupId ) + { + $response = $this->client->request( + 'GET', + $objectStateGroupId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ObjectStateGroup' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @todo Implement offset & limit + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] + */ + public function loadObjectStateGroups( $offset = 0, $limit = -1 ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'objectstategroups' ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ObjectStateGroupList' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * This method returns the ordered list of object states of a group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public function loadObjectStates( ObjectStateGroup $objectStateGroup ) + { + $values = $this->urlHandler->parse( 'objectstategroup', $objectStateGroup->id ); + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'objectstates', array( 'objectstategroup' => $values['objectstategroup'] ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ObjectStateList' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Updates an object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function updateObjectStateGroup( ObjectStateGroup $objectStateGroup, ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $objectStateGroupUpdateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'ObjectStateGroup' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + // Should originally be PATCH, but PHP's shiny new internal web server + // dies with it. + $result = $this->client->request( + 'POST', + $objectStateGroup->id, + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Deletes a object state group including all states and links to content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + */ + public function deleteObjectStateGroup( ObjectStateGroup $objectStateGroup ) + { + $response = $this->client->request( + 'DELETE', + $objectStateGroup->id, + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "ObjectStateGroup" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'ObjectStateGroup' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Creates a new object state in the given group. + * + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct $objectStateCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function createObjectState( ObjectStateGroup $objectStateGroup, ObjectStateCreateStruct $objectStateCreateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $objectStateCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'ObjectState' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'objectstates', array( 'objectstategroup' => $objectStateGroup->id ) ), + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function loadObjectState( $stateId ) + { + $response = $this->client->request( + 'GET', + $stateId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ObjectState' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Updates an object state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct $objectStateUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function updateObjectState( ObjectState $objectState, ObjectStateUpdateStruct $objectStateUpdateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $objectStateUpdateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'ObjectState' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + // Should originally be PATCH, but PHP's shiny new internal web server + // dies with it. + $result = $this->client->request( + 'POST', + $objectState->id, + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Changes the priority of the state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change priority on an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param int $priority + */ + public function setPriorityOfObjectState( ObjectState $objectState, $priority ) + { + throw new \Exception( "@todo Implement" ); + } + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function deleteObjectState( ObjectState $objectState ) + { + $response = $this->client->request( + 'DELETE', + $objectState->id, + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "ObjectState" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'ObjectState' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Sets the object-state of a state group to $state for the given content. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state does not belong to the given group + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change the object state + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function setContentState( ContentInfo $contentInfo, ObjectStateGroup $objectStateGroup, ObjectState $objectState ) + { + $inputMessage = $this->outputVisitor->visit( new ContentObjectStates( array( $objectState ) ) ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'ContentObjectStates' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + // Should originally be PATCH, but PHP's shiny new internal web server + // dies with it. + $values = $this->urlHandler->parse( 'object', $contentInfo->id ); + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'objectObjectStates', array( 'object' => $values['object'] ) ), + $inputMessage + ); + + $this->inputDispatcher->parse( $result ); + } + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function getContentState( ContentInfo $contentInfo, ObjectStateGroup $objectStateGroup ) + { + $values = $this->urlHandler->parse( 'object', $contentInfo->id ); + $groupValues = $this->urlHandler->parse( 'objectstategroup', $objectStateGroup->id ); + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'objectObjectStates', array( 'object' => $values['object'] ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'ContentObjectStates' ) ) + ) + ); + + $objectStates = $this->inputDispatcher->parse( $response ); + foreach ( $objectStates as $state ) + { + $stateValues = $this->urlHandler->parse( 'objectstate', $state->id ); + if ( $stateValues['objectstategroup'] == $groupValues['objectstategroup'] ) + { + return $state; + } + } + } + + /** + * Returns the number of objects which are in this state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * + * @return int + */ + public function getContentCount( ObjectState $objectState ) + { + throw new \Exception( "@todo Implement" ); + } + + /** + * Instantiates a new Object State Group Create Struct and sets $identified in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct + */ + public function newObjectStateGroupCreateStruct( $identifier ) + { + return new ObjectStateGroupCreateStruct( + array( + 'identifier' => $identifier + ) + ); + } + + /** + * Instantiates a new Object State Group Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct + */ + public function newObjectStateGroupUpdateStruct() + { + return new ObjectStateGroupUpdateStruct(); + } + + /** + * Instantiates a new Object State Create Struct and sets $identifier in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct + */ + public function newObjectStateCreateStruct( $identifier ) + { + return new ObjectStateCreateStruct( + array( + 'identifier' => $identifier + ) + ); + } + + /** + * Instantiates a new Object State Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct + */ + public function newObjectStateUpdateStruct() + { + return new ObjectStateUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ContentObjectStates.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ContentObjectStates.php new file mode 100644 index 0000000..04dfe5d --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ContentObjectStates.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the ContentObjectStates visitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ContentObjectStates value object visitor + */ +class ContentObjectStates extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentObjectStates' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentObjectStates' ) ); + + $generator->startList( 'ObjectState' ); + + foreach ( $data->states as $state ) + { + $generator->startObjectElement( 'ObjectState' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'objectstate', + array( + 'objectstategroup' => $state->groupId, + 'objectstate' => $state->objectState->id + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ObjectState' ); + } + + $generator->endList( 'ObjectState' ); + + $generator->endObjectElement( 'ContentObjectStates' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/Limitation.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/Limitation.php new file mode 100644 index 0000000..b371350 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/Limitation.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the Limitation ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Limitation value object visitor + */ +class Limitation extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'limitation' ); + + $generator->startAttribute( 'identifier', $data->getIdentifier() ); + $generator->endAttribute( 'identifier' ); + + $generator->startObjectElement( 'values' ); + $generator->startList( 'values' ); + + foreach ( $data->limitationValues as $limitationValue ) + { + $generator->startObjectElement( 'ref' ); + $generator->startAttribute( 'href', $limitationValue ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ref' ); + } + + $generator->endList( 'values' ); + $generator->endObjectElement( 'values' ); + + $generator->endObjectElement( 'limitation' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/LocationCreateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/LocationCreateStruct.php new file mode 100644 index 0000000..2770229 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/LocationCreateStruct.php @@ -0,0 +1,75 @@ +<?php +/** + * File containing the LocationCreateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\API\Repository\Values\Content\Location; + +/** + * LocationCreateStruct value object visitor + */ +class LocationCreateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'LocationCreate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'LocationCreate' ) ); + + $generator->startObjectElement( 'ParentLocation', 'Location' ); + $generator->startAttribute( 'href', $data->parentLocationId ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ParentLocation' ); + + $generator->startValueElement( 'priority', $data->priority ); + $generator->endValueElement( 'priority' ); + + $generator->startValueElement( 'hidden', $data->hidden ? 'true' : 'false' ); + $generator->endValueElement( 'hidden' ); + + $generator->startValueElement( 'sortField', $this->getSortFieldName( $data->sortField ) ); + $generator->endValueElement( 'sortField' ); + + $generator->startValueElement( 'sortOrder', $data->sortOrder == Location::SORT_ORDER_ASC ? 'ASC' : 'DESC' ); + $generator->endValueElement( 'sortOrder' ); + + $generator->endObjectElement( 'LocationCreate' ); + } + + /** + * Returns the '*' part of SORT_FIELD_* constant name + * + * @param int $sortField + * + * @return string + */ + protected function getSortFieldName( $sortField ) + { + $class = new \ReflectionClass( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ); + foreach ( $class->getConstants() as $constantName => $constantValue ) + { + if ( $constantValue == $sortField && strpos( $constantName, 'SORT_FIELD_' ) >= 0 ) + { + return str_replace( 'SORT_FIELD_', '', $constantName ); + } + } + + return ''; + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/LocationUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/LocationUpdateStruct.php new file mode 100644 index 0000000..3e1bcb0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/LocationUpdateStruct.php @@ -0,0 +1,70 @@ +<?php +/** + * File containing the LocationUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\API\Repository\Values\Content\Location; + +/** + * LocationUpdateStruct value object visitor + */ +class LocationUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'LocationUpdate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'LocationUpdate' ) ); + + $generator->startValueElement( 'priority', $data->priority ); + $generator->endValueElement( 'priority' ); + + $generator->startValueElement( 'remoteId', $data->remoteId ); + $generator->endValueElement( 'remoteId' ); + + $generator->startValueElement( 'sortField', $this->getSortFieldName( $data->sortField ) ); + $generator->endValueElement( 'sortField' ); + + $generator->startValueElement( 'sortOrder', $data->sortOrder == Location::SORT_ORDER_ASC ? 'ASC' : 'DESC' ); + $generator->endValueElement( 'sortOrder' ); + + $generator->endObjectElement( 'LocationUpdate' ); + } + + /** + * Returns the '*' part of SORT_FIELD_* constant name + * + * @param int $sortField + * + * @return string + */ + protected function getSortFieldName( $sortField ) + { + $class = new \ReflectionClass( '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Location' ); + foreach ( $class->getConstants() as $constantName => $constantValue ) + { + if ( $constantValue == $sortField && strpos( $constantName, 'SORT_FIELD_' ) >= 0 ) + { + return str_replace( 'SORT_FIELD_', '', $constantName ); + } + } + + return ''; + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateCreateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateCreateStruct.php new file mode 100644 index 0000000..3799b34 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateCreateStruct.php @@ -0,0 +1,66 @@ +<?php +/** + * File containing the ObjectStateCreateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ObjectStateCreateStruct value object visitor + */ +class ObjectStateCreateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateCreate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateCreate' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'priority', $data->priority ); + $generator->endValueElement( 'priority' ); + + $generator->startValueElement( 'defaultLanguageCode', $data->defaultLanguageCode ); + $generator->endValueElement( 'defaultLanguageCode' ); + + $generator->startHashElement( 'names' ); + + $generator->startList( 'value' ); + foreach ( $data->names as $languageCode => $name ) + { + $generator->startValueElement( 'value', $name, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + $generator->endList( 'value' ); + + $generator->endHashElement( 'names' ); + + $generator->startHashElement( 'descriptions' ); + + foreach ( $data->descriptions as $languageCode => $description ) + { + $generator->startValueElement( 'value', $description, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + + $generator->endHashElement( 'descriptions' ); + + $generator->endObjectElement( 'ObjectStateCreate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateGroupCreateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateGroupCreateStruct.php new file mode 100644 index 0000000..1fb125c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateGroupCreateStruct.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the ObjectStateGroupCreateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ObjectStateGroupCreateStruct value object visitor + */ +class ObjectStateGroupCreateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateGroupCreate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateGroupCreate' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'defaultLanguageCode', $data->defaultLanguageCode ); + $generator->endValueElement( 'defaultLanguageCode' ); + + $generator->startHashElement( 'names' ); + + $generator->startList( 'value' ); + foreach ( $data->names as $languageCode => $name ) + { + $generator->startValueElement( 'value', $name, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + $generator->endList( 'value' ); + + $generator->endHashElement( 'names' ); + + $generator->startHashElement( 'descriptions' ); + + foreach ( $data->descriptions as $languageCode => $description ) + { + $generator->startValueElement( 'value', $description, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + + $generator->endHashElement( 'descriptions' ); + + $generator->endObjectElement( 'ObjectStateGroupCreate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateGroupUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateGroupUpdateStruct.php new file mode 100644 index 0000000..1c5020e --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateGroupUpdateStruct.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the ObjectStateGroupUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ObjectStateGroupUpdateStruct value object visitor + */ +class ObjectStateGroupUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateGroupUpdate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateGroupUpdate' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'defaultLanguageCode', $data->defaultLanguageCode ); + $generator->endValueElement( 'defaultLanguageCode' ); + + $generator->startHashElement( 'names' ); + + $generator->startList( 'value' ); + foreach ( $data->names as $languageCode => $name ) + { + $generator->startValueElement( 'value', $name, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + $generator->endList( 'value' ); + + $generator->endHashElement( 'names' ); + + $generator->startHashElement( 'descriptions' ); + + foreach ( $data->descriptions as $languageCode => $description ) + { + $generator->startValueElement( 'value', $description, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + + $generator->endHashElement( 'descriptions' ); + + $generator->endObjectElement( 'ObjectStateGroupUpdate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateUpdateStruct.php new file mode 100644 index 0000000..ddb4c87 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/ObjectStateUpdateStruct.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the ObjectStateUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ObjectStateUpdateStruct value object visitor + */ +class ObjectStateUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateUpdate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateUpdate' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'defaultLanguageCode', $data->defaultLanguageCode ); + $generator->endValueElement( 'defaultLanguageCode' ); + + $generator->startHashElement( 'names' ); + + $generator->startList( 'value' ); + foreach ( $data->names as $languageCode => $name ) + { + $generator->startValueElement( 'value', $name, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + $generator->endList( 'value' ); + + $generator->endHashElement( 'names' ); + + $generator->startHashElement( 'descriptions' ); + + foreach ( $data->descriptions as $languageCode => $description ) + { + $generator->startValueElement( 'value', $description, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + + $generator->endHashElement( 'descriptions' ); + + $generator->endObjectElement( 'ObjectStateUpdate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/PolicyCreateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/PolicyCreateStruct.php new file mode 100644 index 0000000..3e178b6 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/PolicyCreateStruct.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the PolicyCreateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * PolicyCreateStruct value object visitor + */ +class PolicyCreateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'PolicyCreate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'PolicyCreate' ) ); + + $generator->startValueElement( 'module', $data->module ); + $generator->endValueElement( 'module' ); + + $generator->startValueElement( 'function', $data->function ); + $generator->endValueElement( 'function' ); + + $limitations = $data->getLimitations(); + if ( !empty( $limitations ) ) + { + $generator->startObjectElement( 'limitations' ); + $generator->startList( 'limitations' ); + + foreach ( $limitations as $limitation ) + { + $visitor->visitValueObject( $limitation ); + } + + $generator->endList( 'limitations' ); + $generator->endObjectElement( 'limitations' ); + } + + $generator->endObjectElement( 'PolicyCreate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/PolicyUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/PolicyUpdateStruct.php new file mode 100644 index 0000000..c54b1d7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/PolicyUpdateStruct.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the PolicyUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * PolicyUpdateStruct value object visitor + */ +class PolicyUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'PolicyUpdate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'PolicyUpdate' ) ); + + $limitations = $data->getLimitations(); + if ( !empty( $limitations ) ) + { + $generator->startObjectElement( 'limitations' ); + $generator->startList( 'limitations' ); + + foreach ( $limitations as $limitation ) + { + $visitor->visitValueObject( $limitation ); + } + + $generator->endList( 'limitations' ); + $generator->endObjectElement( 'limitations' ); + } + + $generator->endObjectElement( 'PolicyUpdate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleAssignment.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleAssignment.php new file mode 100644 index 0000000..ac06175 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleAssignment.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the RoleAssignment ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RoleAssignment value object visitor + */ +class RoleAssignment extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleAssignInput' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleAssignInput' ) ); + + $generator->startObjectElement( 'Role' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'role', array( 'role' => $data->getRole()->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->endObjectElement( 'Role' ); + + $roleLimitation = $data->getRoleLimitation(); + if ( $roleLimitation !== null ) + { + $visitor->visitValueObject( $roleLimitation ); + } + + $generator->endObjectElement( 'RoleAssignInput' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleCreateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleCreateStruct.php new file mode 100644 index 0000000..6b6be73 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleCreateStruct.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the RoleCreateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RoleCreateStruct value object visitor + */ +class RoleCreateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleInput' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleInput' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->endObjectElement( 'RoleInput' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleUpdateStruct.php new file mode 100644 index 0000000..69686b3 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/RoleUpdateStruct.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the RoleUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RoleUpdateStruct value object visitor + */ +class RoleUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleInput' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleInput' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->endObjectElement( 'RoleInput' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionCreateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionCreateStruct.php new file mode 100644 index 0000000..f92d08e --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionCreateStruct.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the SectionCreateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * SectionCreateStruct value object visitor + */ +class SectionCreateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'SectionInput' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'SectionInput' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'name', $data->name ); + $generator->endValueElement( 'name' ); + + $generator->endObjectElement( 'SectionInput' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionIncludingContentMetadataUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionIncludingContentMetadataUpdateStruct.php new file mode 100644 index 0000000..b9bcfc5 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionIncludingContentMetadataUpdateStruct.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the SectionIncludingContentMetadataUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * SectionIncludingContentMetadataUpdateStruct value object visitor + */ +class SectionIncludingContentMetadataUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentUpdate' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentUpdate' ) ); + + $generator->startObjectElement( 'Section' ); + + if ( $data->sectionId !== null ) + { + $generator->startAttribute( + 'href', + $data->sectionId + ); + $generator->endAttribute( 'href' ); + } + $generator->endObjectElement( 'Section' ); + + $generator->startObjectElement( 'Owner', 'User' ); + if ( $data->ownerId !== null ) + { + $generator->startAttribute( + 'href', + $data->ownerId + ); + $generator->endAttribute( 'href' ); + } + $generator->endObjectElement( 'Owner' ); + + // @todo: Add missing elements + + $generator->endObjectElement( 'ContentUpdate' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionUpdateStruct.php b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionUpdateStruct.php new file mode 100644 index 0000000..47aed38 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Output/ValueObjectVisitor/SectionUpdateStruct.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the SectionUpdateStruct ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * SectionUpdateStruct value object visitor + */ +class SectionUpdateStruct extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'SectionInput' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'SectionInput' ) ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'name', $data->name ); + $generator->endValueElement( 'name' ); + + $generator->endObjectElement( 'SectionInput' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Repository.php b/eZ/Publish/Core/REST/Client/Repository.php new file mode 100644 index 0000000..b089d7c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Repository.php @@ -0,0 +1,499 @@ +<?php +/** + * File containing the Repository class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\Repository as APIRepository; +use eZ\Publish\API\Repository\Values\ValueObject; +use eZ\Publish\API\Repository\Values\User\User; + +use eZ\Publish\Core\REST\Common; + +/** + * REST Client Repository + * + * @see \eZ\Publish\API\Repository\Repository + */ +class Repository implements APIRepository +{ + /** + * @var int + */ + private $version; + + /** + * @var \eZ\Publish\API\Repository\Values\User\User + */ + private $currentUser; + + /** + * @var \eZ\Publish\Core\REST\Client\SectionService + */ + private $sectionService; + + /** + * @var \eZ\Publish\Core\REST\Client\LanguageService + */ + private $languageService; + + /** + * @var \eZ\Publish\Core\REST\Client\UserService + */ + private $userService; + + /** + * @var \eZ\Publish\Core\REST\Client\RoleService + */ + private $roleService; + + /** + * @var \eZ\Publish\Core\REST\Client\URLAliasService + */ + private $urlAliasService; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + private $contentService; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + private $contentTypeService; + + /** + * @var \eZ\Publish\Core\REST\Client\TrashService + */ + private $trashService; + + /** + * @var \eZ\Publish\Core\REST\Client\LocationService + */ + private $locationService; + + /** + * @var \eZ\Publish\Core\REST\Client\ObjectStateService + */ + private $objectStateService; + + /** + * @var \eZ\Publish\Core\REST\Client\IOService + */ + private $ioService; + + /** + * @var \eZ\Publish\Core\REST\Client\FieldTypeService + */ + private $fieldTypeService; + + /** + * Client + * + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * Input parsing dispatcher + * + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @var \eZ\Publish\SPI\FieldType\FieldType[] + */ + private $fieldTypes; + + /** + * Instantiates the REST Client repository. + * + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\SPI\FieldType\FieldType[] $fieldTypes + */ + public function __construct( HttpClient $client, Common\Input\Dispatcher $inputDispatcher, Common\Output\Visitor $outputVisitor, Common\UrlHandler $urlHandler, array $fieldTypes ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + $this->fieldTypes = $fieldTypes; + } + + /** + * Get current user + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getCurrentUser() + { + return null; + } + + /** + * Sets the current user to the given $user. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + */ + public function setCurrentUser( User $user ) + { + throw new Exceptions\MethodNotAllowedException( + 'It is not allowed to set a current user in this implementation. Please use a corresponding authenticating HttpClient instead.' + ); + } + + /** + * @param string $module + * @param string $function + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return boolean|\eZ\Publish\API\Repository\Values\User\Limitation[] if limitations are on this function an array of limitations is returned + */ + public function hasAccess( $module, $function, User $user = null ) + { + // @todo: Implement + } + + /** + * Indicates if the current user is allowed to perform an action given by the function on the given + * objects + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * + * @param string $module The module, aka controller identifier to check permissions on + * @param string $function The function, aka the controller action to check permissions on + * @param \eZ\Publish\API\Repository\Values\ValueObject $object The object to check if the user has access to + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function canUser( $module, $function, ValueObject $object, ValueObject $target = null ) + { + // @todo: Implement + } + + /** + * Get Content Service + * + * Get service object to perform operations on Content objects and it's aggregate members. + * + * @return \eZ\Publish\API\Repository\ContentService + */ + public function getContentService() + { + if ( null === $this->contentService ) + { + $this->contentService = new ContentService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler, + $this->getContentTypeService() + ); + } + return $this->contentService; + } + + /** + * Get Content Language Service + * + * Get service object to perform operations on Content language objects + * + * @return \eZ\Publish\API\Repository\LanguageService + */ + public function getContentLanguageService() + { + if ( null === $this->languageService ) + { + $this->languageService = new LanguageService( + $this->getContentService(), + 'eng-US', + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->languageService; + } + + /** + * Get Content Type Service + * + * Get service object to perform operations on Content Type objects and it's aggregate members. + * ( Group, Field & FieldCategory ) + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + public function getContentTypeService() + { + if ( null === $this->contentTypeService ) + { + $this->contentTypeService = new ContentTypeService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->contentTypeService; + } + + /** + * Get Content Location Service + * + * Get service object to perform operations on Location objects and subtrees + * + * @return \eZ\Publish\API\Repository\LocationService + */ + public function getLocationService() + { + if ( null === $this->locationService ) + { + $this->locationService = new LocationService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->locationService; + } + + /** + * Get Content Trash service + * + * Trash service allows to perform operations related to location trash + * (trash/untrash, load/list from trash...) + * + * @return \eZ\Publish\API\Repository\TrashService + */ + public function getTrashService() + { + if ( null === $this->trashService ) + { + $this->trashService = new TrashService( + $this->getLocationService(), + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->trashService; + } + + /** + * Get Content Section Service + * + * Get Section service that lets you manipulate section objects + * + * @return \eZ\Publish\API\Repository\SectionService + */ + public function getSectionService() + { + if ( null === $this->sectionService ) + { + $this->sectionService = new SectionService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->sectionService; + } + + /** + * Get Search Service + * + * Get search service that lets you find content objects + * + * @return \eZ\Publish\API\Repository\SearchService + */ + public function getSearchService() + { + throw new \RuntimeException( '@todo: Implememt.' ); + } + + /** + * Get User Service + * + * Get service object to perform operations on Users and UserGroup + * + * @return \eZ\Publish\API\Repository\UserService + */ + public function getUserService() + { + if ( null === $this->userService ) + { + $this->userService = new UserService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->userService; + } + + /** + * Get IO Service + * + * Get service object to perform operations on binary files + * + * @return \eZ\Publish\API\Repository\IOService + */ + public function getIOService() + { + if ( null === $this->ioService ) + { + $this->ioService = new IOService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->ioService; + } + + /** + * Get RoleService + * + * @return \eZ\Publish\API\Repository\RoleService + */ + public function getRoleService() + { + if ( null === $this->roleService ) + { + $this->roleService = new RoleService( + $this->getUserService(), + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->roleService; + } + + /** + * Get URLAliasService + * + * @return \eZ\Publish\API\Repository\URLAliasService + */ + public function getUrlAliasService() + { + if ( null === $this->urlAliasService ) + { + $this->urlAliasService = new URLAliasService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->urlAliasService; + } + + /** + * Get URLWildcardService + * + * @return \eZ\Publish\API\Repository\URLWildcardService + */ + public function getURLWildcardService() + { + throw new \RuntimeException( '@todo: Implement' ); + } + + /** + * Get ObjectStateService + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + public function getObjectStateService() + { + if ( null === $this->objectStateService ) + { + $this->objectStateService = new ObjectStateService( + $this->client, + $this->inputDispatcher, + $this->outputVisitor, + $this->urlHandler + ); + } + return $this->objectStateService; + } + + /** + * Get FieldTypeService + * + * @return \eZ\Publish\API\Repository\FieldTypeService + */ + public function getFieldTypeService() + { + if ( null === $this->fieldTypeService ) + { + $this->fieldTypeService = new FieldTypeService( $this->fieldTypes ); + } + return $this->fieldTypeService; + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + ++$this->transactionDepth; + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit() + { + // @todo: Implement / discuss + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback() + { + // @todo: Implement / discuss + } +} diff --git a/eZ/Publish/Core/REST/Client/RoleService.php b/eZ/Publish/Core/REST/Client/RoleService.php new file mode 100644 index 0000000..1cf7232 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/RoleService.php @@ -0,0 +1,730 @@ +<?php +/** + * File containing the RoleService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\RoleService as APIRoleService; +use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; +use eZ\Publish\API\Repository\Values\User\Policy as APIPolicy; +use eZ\Publish\API\Repository\Values\User\PolicyCreateStruct as APIPolicyCreateStruct; +use eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct as APIPolicyUpdateStruct; +use eZ\Publish\API\Repository\Values\User\Role as APIRole; +use eZ\Publish\API\Repository\Values\User\RoleCreateStruct as APIRoleCreateStruct; +use eZ\Publish\API\Repository\Values\User\RoleUpdateStruct; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\UserGroup; + +use eZ\Publish\Core\Repository\Values\User\UserRoleAssignment; +use eZ\Publish\Core\Repository\Values\User\UserGroupRoleAssignment; + +use eZ\Publish\Core\REST\Client\Values\User\PolicyCreateStruct; +use eZ\Publish\Core\REST\Client\Values\User\PolicyUpdateStruct; +use eZ\Publish\Core\REST\Client\Values\User\Role; +use eZ\Publish\Core\REST\Client\Values\User\Policy; +use eZ\Publish\Core\REST\Client\Values\User\RoleAssignment; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\RoleService} + * interface. + * + * @see \eZ\Publish\API\Repository\RoleService + */ +class RoleService implements APIRoleService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\UserService + */ + private $userService; + + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\UserService $userService + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( UserService $userService, HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->userService = $userService; + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Creates a new Role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\RoleCreateStruct $roleCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function createRole( APIRoleCreateStruct $roleCreateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $roleCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Role' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'roles' ), + $inputMessage + ); + + $createdRole = $this->inputDispatcher->parse( $result ); + $createdRoleValues = $this->urlHandler->parse( 'role', $createdRole->id ); + + $createdPolicies = array(); + foreach ( $roleCreateStruct->getPolicies() as $policyCreateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $policyCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Policy' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'policies', array( 'role' => $createdRoleValues['role'] ) ), + $inputMessage + ); + + $createdPolicy = $this->inputDispatcher->parse( $result ); + + // @todo Workaround for missing roleId in Policy XSD definition + $createdPolicyArray = array( + 'id' => $createdPolicy->id, + 'roleId' => $createdRole->id, + 'module' => $createdPolicy->module, + 'function' => $createdPolicy->function + ); + + $createdPolicy = new Policy( $createdPolicyArray ); + $createdPolicies[] = $createdPolicy; + } + + return new Role( + array( + 'id' => $createdRole->id, + 'identifier' => $createdRole->identifier + ), + $createdPolicies + ); + } + + /** + * Updates the name of the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct $roleUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function updateRole( APIRole $role, RoleUpdateStruct $roleUpdateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $roleUpdateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Role' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + $result = $this->client->request( + 'POST', + $role->id, + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Adds a new policy to the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to add a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function addPolicy( APIRole $role, APIPolicyCreateStruct $policyCreateStruct ) + { + $values = $this->urlHandler->parse( 'role', $role->id ); + $inputMessage = $this->outputVisitor->visit( $policyCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Policy' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'policies', array( 'role' => $values['role'] ) ), + $inputMessage + ); + + $createdPolicy = $this->inputDispatcher->parse( $result ); + + // @todo Workaround for missing roleId in Policy XSD definition + $createdPolicyArray = array( + 'id' => $createdPolicy->id, + 'roleId' => $role->id, + 'module' => $createdPolicy->module, + 'function' => $createdPolicy->function + ); + + $createdPolicy = new Policy( $createdPolicyArray ); + + $existingPolicies = $role->getPolicies(); + $existingPolicies[] = $createdPolicy; + + return new Role( + array( + 'id' => $role->id, + 'identifier' => $role->identifier + ), + $existingPolicies + ); + } + + /** + * removes a policy from the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy the policy to remove from the role + * + * @return \eZ\Publish\API\Repository\Values\User\Role the updated role + */ + public function removePolicy( APIRole $role, APIPolicy $policy ) + { + $values = $this->urlHandler->parse( 'role', $role->id ); + $response = $this->client->request( + 'DELETE', + $this->urlHandler->generate( + 'policy', + array( + 'role' => $values['role'], + 'policy' => $policy->id + ) + ), + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Section" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'Policy' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + + return $this->loadRole( $role->id ); + } + + /** + * Updates the limitations of a policy. The module and function cannot be changed and + * the limitations are replaced by the ones in $roleUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to u�date a policy + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct $policyUpdateStruct + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function updatePolicy( APIPolicy $policy, APIPolicyUpdateStruct $policyUpdateStruct ) + { + $values = $this->urlHandler->parse( 'role', $policy->roleId ); + $inputMessage = $this->outputVisitor->visit( $policyUpdateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Policy' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( + 'policy', + array( + 'role' => $values['role'], + 'policy' => $policy->id + ) + ), + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Loads a role for the given id + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRole( $id ) + { + $response = $this->client->request( + 'GET', + $id, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'Role' ) ) + ) + ); + + $loadedRole = $this->inputDispatcher->parse( $response ); + $loadedRoleValues = $this->urlHandler->parse( 'role', $loadedRole->id ); + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'policies', array( 'role' => $loadedRoleValues['role'] ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'PolicyList' ) ) + ) + ); + + $policies = $this->inputDispatcher->parse( $response ); + return new Role( + array( + 'id' => $loadedRole->id, + 'identifier' => $loadedRole->identifier + ), + $policies + ); + } + + /** + * Loads a role for the given name + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param string $name + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRoleByIdentifier( $name ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'roleByIdentifier', array( 'role' => $name ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'RoleList' ) ) + ) + ); + + $result = $this->inputDispatcher->parse( $response ); + return reset( $result ); + } + + /** + * Loads all roles + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the roles + * + * @return \eZ\Publish\API\Repository\Values\User\Role[] + */ + public function loadRoles() + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'roles' ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'RoleList' ) ) + ) + ); + + return $this->inputDispatcher->parse( $response ); + } + + /** + * Deletes the given role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete this role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + */ + public function deleteRole( APIRole $role ) + { + $response = $this->client->request( + 'DELETE', + $role->id, + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Section" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'Role' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Loads all policies from roles which are assigned to a user or to user groups to which the user belongs + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + * + * @param mixed $userId + * + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function loadPoliciesByUserId( $userId ) + { + $values = $this->urlHandler->parse( 'user', $userId ); + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'userPolicies', array( 'user' => $values['user'] ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'PolicyList' ) ) + ) + ); + + return $this->inputDispatcher->parse( $response ); + } + + /** + * Assigns a role to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUserGroup( APIRole $role, UserGroup $userGroup, RoleLimitation $roleLimitation = null ) + { + $roleAssignment = new RoleAssignment( + array( + 'role' => $role, + 'limitation' => $roleLimitation + ) + ); + + $inputMessage = $this->outputVisitor->visit( $roleAssignment ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'RoleAssignmentList' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'groupRoleAssignments', array( 'group' => $userGroup->id ) ), + $inputMessage + ); + + $this->inputDispatcher->parse( $result ); + } + + /** + * removes a role from the given user group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the given user group + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + */ + public function unassignRoleFromUserGroup( APIRole $role, UserGroup $userGroup ) + { + $values = $this->urlHandler->parse( 'group', $userGroup->id ); + $userGroupId = $values['group']; + + $values = $this->urlHandler->parse( 'role', $role->id ); + $roleId = $values['role']; + + $response = $this->client->request( + 'DELETE', + $this->urlHandler->generate( 'groupRoleAssignment', array( 'group' => $userGroupId, 'role' => $roleId ) ), + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Section" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'RoleAssignmentList' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Assigns a role to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @todo add limitations + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUser( APIRole $role, User $user, RoleLimitation $roleLimitation = null ) + { + $roleAssignment = new RoleAssignment( + array( + 'role' => $role, + 'limitation' => $roleLimitation + ) + ); + + $inputMessage = $this->outputVisitor->visit( $roleAssignment ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'RoleAssignmentList' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'userRoleAssignments', array( 'user' => $user->id ) ), + $inputMessage + ); + + $this->inputDispatcher->parse( $result ); + } + + /** + * removes a role from the given user. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the user + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + */ + public function unassignRoleFromUser( APIRole $role, User $user ) + { + $values = $this->urlHandler->parse( 'user', $user->id ); + $userId = $values['user']; + + $values = $this->urlHandler->parse( 'role', $role->id ); + $roleId = $values['role']; + + $response = $this->client->request( + 'DELETE', + $this->urlHandler->generate( 'userRoleAssignment', array( 'user' => $userId, 'role' => $roleId ) ), + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Section" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'RoleAssignmentList' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Returns the assigned user and user groups to this role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + public function getRoleAssignments( APIRole $role ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Returns the roles assigned to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\User\UserRoleAssignment[] + */ + public function getRoleAssignmentsForUser( User $user ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'userRoleAssignments' ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'RoleAssignmentList' ) ) + ) + ); + + $roleAssignments = $this->inputDispatcher->parse( $response ); + + $userRoleAssignments = array(); + foreach ( $roleAssignments as $roleAssignment ) + { + $userRoleAssignments[] = new UserRoleAssignment( + array( + 'limitation' => $roleAssignment->getRoleLimitation(), + 'role' => $roleAssignment->getRole(), + 'user' => $user + ) + ); + } + + return $userRoleAssignments; + } + + /** + * Returns the roles assigned to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment[] + */ + public function getRoleAssignmentsForUserGroup( UserGroup $userGroup ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'groupRoleAssignments' ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'RoleAssignmentList' ) ) + ) + ); + + $roleAssignments = $this->inputDispatcher->parse( $response ); + + $userGroupRoleAssignments = array(); + foreach ( $roleAssignments as $roleAssignment ) + { + $userGroupRoleAssignments[] = new UserGroupRoleAssignment( + array( + 'limitation' => $roleAssignment->getRoleLimitation(), + 'role' => $roleAssignment->getRole(), + 'userGroup' => $userGroup + ) + ); + } + + return $userGroupRoleAssignments; + } + + /** + * Instantiates a role create class + * + * @param string $name + * + * @return \eZ\Publish\API\Repository\Values\User\RoleCreateStruct + */ + public function newRoleCreateStruct( $name ) + { + return new Values\User\RoleCreateStruct( $name ); + } + + /** + * Instantiates a policy create class + * + * @param string $module + * @param string $function + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct + */ + public function newPolicyCreateStruct( $module, $function ) + { + return new PolicyCreateStruct( $module, $function ); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct + */ + public function newPolicyUpdateStruct() + { + return new PolicyUpdateStruct(); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct + */ + public function newRoleUpdateStruct() + { + return new RoleUpdateStruct(); + } + + /** + * Returns the LimitationType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\SPI\Limitation\Type + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if there is no LimitationType with $identifier + */ + public function getLimitationType( $identifier ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } + + /** + * Returns the LimitationType's assigned to a given module/function + * + * Typically used for: + * - Internal validation limitation value use on Policies + * - Role admin gui for editing policy limitations incl list limitation options via valueSchema() + * + * @param string $module Legacy name of "controller", it's a unique identifier like "content" + * @param string $function Legacy name of a controller "action", it's a unique within the controller like "read" + * + * @return \eZ\Publish\SPI\Limitation\Type[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If module/function to limitation type mapping + * refers to a non existing identifier. + */ + public function getLimitationTypesByModuleFunction( $module, $function ) + { + throw new \eZ\Publish\API\Repository\Exceptions\NotImplementedException( __METHOD__ ); + } +} diff --git a/eZ/Publish/Core/REST/Client/SectionService.php b/eZ/Publish/Core/REST/Client/SectionService.php new file mode 100644 index 0000000..0fd5fde --- /dev/null +++ b/eZ/Publish/Core/REST/Client/SectionService.php @@ -0,0 +1,296 @@ +<?php +/** + * File containing the SectionService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\SectionService as APISectionService; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Section; +use eZ\Publish\API\Repository\Values\Content\SectionCreateStruct; +use eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\SectionService} + * interface. + * + * @see \eZ\Publish\API\Repository\SectionService + */ +class SectionService implements APISectionService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->client instanceof Sessionable ) + { + $this->client->setSession( $id ); + } + } + + /** + * Creates the a new Section in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier in $sectionCreateStruct already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct $sectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section The newly create section + */ + public function createSection( SectionCreateStruct $sectionCreateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $sectionCreateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Section' ); + + $result = $this->client->request( + 'POST', + $this->urlHandler->generate( 'sections' ), + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Updates the given in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier already exists (if set in the update struct) + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * @param \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct $sectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function updateSection( Section $section, SectionUpdateStruct $sectionUpdateStruct ) + { + $inputMessage = $this->outputVisitor->visit( $sectionUpdateStruct ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Section' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + // Should originally be PATCH, but PHP's shiny new internal web server + // dies with it. + $result = $this->client->request( + 'POST', + $section->id, + $inputMessage + ); + + return $this->inputDispatcher->parse( $result ); + } + + /** + * Loads a Section from its id ($sectionId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param mixed $sectionId + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSection( $sectionId ) + { + $response = $this->client->request( + 'GET', + $sectionId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'Section' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads all sections + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @return array of {@link \eZ\Publish\API\Repository\Values\Content\Section} + */ + public function loadSections() + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'sections' ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'SectionList' ) ) + ) + ); + return $this->inputDispatcher->parse( $response ); + } + + /** + * Loads a Section from its identifier ($sectionIdentifier) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param string $sectionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSectionByIdentifier( $sectionIdentifier ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'sectionByIdentifier', array( 'section' => $sectionIdentifier ) ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'SectionList' ) ) + ) + ); + $result = $this->inputDispatcher->parse( $response ); + + return reset( $result ); + } + + /** + * Counts the contents which $section is assigned to + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * + * @return int + */ + public function countAssignedContents( Section $section ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Assigns the content to the given section + * this method overrides the current assigned section + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to view provided object + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * + * @todo In order to make the integration test for this method running, the + * countAssignedContents() method must be implemented. Otherwise this + * should work fine. + */ + public function assignSection( ContentInfo $contentInfo, Section $section ) + { + $inputMessage = $this->outputVisitor->visit( + new RestContentMetadataUpdateStruct( + array( 'sectionId' => $section->id ) + ) + ); + $inputMessage->headers['Accept'] = $this->outputVisitor->getMediaType( 'Content' ); + $inputMessage->headers['X-HTTP-Method-Override'] = 'PATCH'; + + $response = $this->client->request( + 'POST', + $contentInfo->id, + $inputMessage + ); + + // Will throw exception on error, no return value for method + // @todo: Deactivated due to missing implementation of visitor for + // content on the server side. + // $result = $this->inputDispatcher->parse( $response ); + } + + /** + * Deletes $section from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified section is not found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to delete a section + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if section can not be deleted + * because it is still assigned to some contents. + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function deleteSection( Section $section ) + { + $response = $this->client->request( + 'DELETE', + $section->id, + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Section" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'Section' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Instantiates a new SectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct + */ + public function newSectionCreateStruct() + { + return new SectionCreateStruct(); + } + + /** + * Instantiates a new SectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct + */ + public function newSectionUpdateStruct() + { + return new SectionUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Sessionable.php b/eZ/Publish/Core/REST/Client/Sessionable.php new file mode 100644 index 0000000..7c5f382 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Sessionable.php @@ -0,0 +1,33 @@ +<?php +/** + * File containing the Sessionable interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\SectionService} + * interface. + * + * @see \eZ\Publish\API\Repository\SectionService + */ +interface Sessionable +{ + /** + * Set session ID + * + * Only for testing + * + * @param mixed tringid + * + * @private + * + * @return void + */ + public function setSession( $id ); +} + diff --git a/eZ/Publish/Core/REST/Client/Tests/FieldTypeServiceTest.php b/eZ/Publish/Core/REST/Client/Tests/FieldTypeServiceTest.php new file mode 100644 index 0000000..4b5512b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/FieldTypeServiceTest.php @@ -0,0 +1,119 @@ +<?php +/** + * File containing the FieldTypeServiceTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests; + +use eZ\Publish\Core\REST\Client\FieldTypeService; + +class FieldTypeServiceTest extends \PHPUnit_Framework_TestCase +{ + public function testHasFieldType() + { + $fieldTypeService = $this->getFieldTypeService(); + + $this->assertFalse( + $fieldTypeService->hasFieldType( 'my-type' ) + ); + } + + public function testAddFieldType() + { + $fieldTypeMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldType', + array(), + array(), + '', + false + ); + $fieldTypeMock->expects( $this->once() ) + ->method( 'getFieldTypeIdentifier' ) + ->will( $this->returnValue( 'my-type' ) ); + + $fieldTypeService = $this->getFieldTypeService(); + + $fieldTypeService->addFieldType( $fieldTypeMock ); + + $this->assertTrue( + $fieldTypeService->hasFieldType( 'my-type' ) + ); + } + + public function testGetFieldType() + { + $fieldTypeMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldType', + array(), + array(), + '', + false + ); + $fieldTypeMock->expects( $this->once() ) + ->method( 'getFieldTypeIdentifier' ) + ->will( $this->returnValue( 'my-type' ) ); + + $fieldTypeService = $this->getFieldTypeService(); + + $fieldTypeService->addFieldType( $fieldTypeMock ); + + $this->assertSame( + $fieldTypeMock, + $fieldTypeService->getFieldType( 'my-type' ) + ); + } + + /** + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testGetFieldTypeThrowsNotFoundException() + { + $fieldTypeService = $this->getFieldTypeService(); + + $fieldTypeService->getFieldType( 'my-type' ); + } + + public function testGetFieldTypes() + { + $myFieldTypeMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldType', + array(), + array(), + '', + false + ); + $myFieldTypeMock->expects( $this->once() ) + ->method( 'getFieldTypeIdentifier' ) + ->will( $this->returnValue( 'my-type' ) ); + + $yourFieldTypeMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldType', + array(), + array(), + '', + false + ); + $yourFieldTypeMock->expects( $this->once() ) + ->method( 'getFieldTypeIdentifier' ) + ->will( $this->returnValue( 'your-type' ) ); + + $fieldTypeService = $this->getFieldTypeService(); + + $fieldTypeService->addFieldType( $myFieldTypeMock ); + $fieldTypeService->addFieldType( $yourFieldTypeMock ); + + $this->assertEquals( + 2, + count( $fieldTypeService->getFieldTypes() ) + ); + } + + public function getFieldTypeService() + { + return new FieldTypeService(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/HttpClient/Authentication/BasicAuthTest.php b/eZ/Publish/Core/REST/Client/Tests/HttpClient/Authentication/BasicAuthTest.php new file mode 100644 index 0000000..becedbf --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/HttpClient/Authentication/BasicAuthTest.php @@ -0,0 +1,113 @@ +<?php +/** + * File containing BasicAuthTest test class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\HttpClient\Authentication; + +use eZ\Publish\Core\REST\Client\HttpClient\Authentication\BasicAuth; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Test case for Basic Auth HTTP Client. + */ +class BasicAuthTest extends \PHPUnit_Framework_TestCase +{ + /** + * Mock for the inner HTTP client + * + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $innerHttpClientMock; + + /** + * Tests authentication without message + */ + public function testAuthWithoutMessage() + { + $innerClientMock = $this->getInnerHttpClientMock(); + + $client = new BasicAuth( $innerClientMock, 'sindelfingen', 's3cr3t' ); + + $innerClientMock->expects( $this->once() ) + ->method( 'request' ) + ->with( + 'GET', + '/some/path', + new Message( + array( 'Authorization' => 'Basic c2luZGVsZmluZ2VuOnMzY3IzdA==' ) + ) + )->will( $this->returnValue( new \stdClass() ) ); + + $result = $client->request( 'GET', '/some/path' ); + + $this->assertInstanceOf( + '\\stdClass', + $result + ); + } + + /** + * Tests authentication with message + */ + public function testAuthWithMessage() + { + $innerClientMock = $this->getInnerHttpClientMock(); + + $client = new BasicAuth( $innerClientMock, 'sindelfingen', 's3cr3t' ); + + $innerClientMock->expects( $this->once() ) + ->method( 'request' ) + ->with( + 'PUT', + '/some/path', + new Message( + array( + 'X-Some-Header' => 'foobar', + 'Authorization' => 'Basic c2luZGVsZmluZ2VuOnMzY3IzdA==' + ), + 'body content' + ) + )->will( $this->returnValue( new \stdClass() ) ); + + $result = $client->request( + 'PUT', + '/some/path', + new Message( + array( + 'X-Some-Header' => 'foobar', + ), + 'body content' + ) + ); + + $this->assertInstanceOf( + '\\stdClass', + $result + ); + } + + /** + * Gets the inner HTTP client mock + * + * @return \eZ\Publish\Core\REST\Client\HttpClient + */ + protected function getInnerHttpClientMock() + { + if ( !isset( $this->innerHttpClientMock ) ) + { + $this->innerHttpClientMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Client\\HttpClient', + array(), + array(), + '', + false + ); + } + return $this->innerHttpClientMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/HttpClient/StreamTest.php b/eZ/Publish/Core/REST/Client/Tests/HttpClient/StreamTest.php new file mode 100644 index 0000000..9efa0d0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/HttpClient/StreamTest.php @@ -0,0 +1,93 @@ +<?php +/** + * File containing the StreamTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\HttpClient; + +use eZ\Publish\Core\REST\Client\HttpClient\Stream; +use eZ\Publish\Core\REST\Client\HttpClient\ConnectionException; + +/** + * Test case for stream HTTP client. + */ +class StreamTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient\Stream + */ + protected $client; + + /** + * Sets up the testing environment + */ + public function setUp() + { + $this->client = new Stream( 'http://localhost:8042' ); + + try + { + $this->client->request( 'GET', '/' ); + } + catch ( ConnectionException $e ) + { + $this->markTestSkipped( 'No HTTP server at http://localhost:8042 found.' ); + } + } + + /** + * Tests the response status + */ + public function testResponseStatus() + { + $response = $this->client->request( 'GET', '/' ); + + $this->assertSame( 500, $response->headers['status'] ); + } + + /** + * Tests that the response body is not empty + */ + public function testResponseNonEmptyBody() + { + $response = $this->client->request( 'GET', '/' ); + + $this->assertFalse( empty( $response->body ) ); + } + + /** + * Tests presence of response headers + */ + public function testResponseHeadersArray() + { + $response = $this->client->request( 'GET', '/' ); + + $this->assertTrue( is_array( $response->headers ) ); + } + + /** + * Test presence of X-Powered-By header + */ + public function testResponseXPoweredByHeader() + { + $response = $this->client->request( 'GET', '/' ); + + $this->assertTrue( isset( $response->headers['X-Powered-By'] ) ); + $this->assertTrue( is_string( $response->headers['X-Powered-By'] ) ); + } + + /** + * Tests that ConnectionException is thrown + * + * @expectedException \eZ\Publish\Core\REST\Client\HttpClient\ConnectionException + */ + public function testConnectionException() + { + $client = new Stream( 'http://localhost:54321' ); + $client->request( 'GET', '/' ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/IdManager.php b/eZ/Publish/Core/REST/Client/Tests/IdManager.php new file mode 100644 index 0000000..22a98f0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/IdManager.php @@ -0,0 +1,73 @@ +<?php +/** + * File containing the IdManager base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests; + +use eZ\Publish\Core\REST\Common; + +/** + * Base class for ID manager used in the tests suite + */ +class IdManager +{ + /** + * URL handler + * + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + protected $urlHandler; + + /** + * Creates a new ID manager based on $urlHandler + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( Common\UrlHandler $urlHandler ) + { + $this->urlHandler = $urlHandler; + } + + /** + * Generates a repository specific ID. + * + * Generates a repository specific ID for an object of $type from the + * database ID $rawId. + * + * @param string $type + * @param mixed $rawId + * + * @return mixed + */ + public function generateId( $type, $rawId ) + { + return $this->urlHandler->generate( + $type, + array( + $type => $rawId, + ) + ); + } + + /** + * Parses the given $id for $type into its raw form. + * + * Takes a repository specific $id of $type and returns the raw database ID + * for the object. + * + * @param string $type + * @param mixed $id + * + * @return mixed + */ + public function parseId( $type, $id ) + { + $values = $this->urlHandler->parse( $type, $id ); + return $values[$type]; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/BadStateExceptionTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/BadStateExceptionTest.php new file mode 100644 index 0000000..4ed58a6 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/BadStateExceptionTest.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing a BadStateExceptionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class BadStateExceptionTest extends BaseTest +{ + /** + * Tests the parsing of BadStateException + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @expectedExceptionMessage Section with ID "23" not found. + */ + public function testParse() + { + $parser = $this->getParser(); + + $inputArray = array( + 'errorDescription' => 'Section with ID "23" not found.', + 'errorCode' => '409', + ); + + $parser->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Gets the error message parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ErrorMessage + */ + protected function getParser() + { + return new Parser\ErrorMessage(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/BaseTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/BaseTest.php new file mode 100644 index 0000000..c42a1b2 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/BaseTest.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing a BaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Tests; + +abstract class BaseTest extends Tests\BaseTest +{ + /** + * Mock for parsing dispatcher + * + * @var \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher + */ + protected $parsingDispatcherMock; + + /** + * Returns the parsing dispatcher mock + * + * @return \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher + */ + protected function getParsingDispatcherMock() + { + if ( !isset( $this->parsingDispatcherMock ) ) + { + $this->parsingDispatcherMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher', + array(), + array(), + '', + false + ); + } + return $this->parsingDispatcherMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentObjectStates.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentObjectStates.php new file mode 100644 index 0000000..6ba2894 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentObjectStates.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a ContentObjectStatesTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class ContentObjectStatesTest extends BaseTest +{ + /** + * Tests the parsing of ContentObjectStates + */ + public function testParse() + { + $contentStatesParser = $this->getParser(); + + $inputArray = array( + 'ObjectState' => array( + array( '_media-type' => 'application/vnd.ez.api.ObjectState+xml' ), + array( '_media-type' => 'application/vnd.ez.api.ObjectState+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.ObjectState+xml' ), + 'application/vnd.ez.api.ObjectState+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $contentStatesParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the ContentObjectStates parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ContentObjectStates; + */ + protected function getParser() + { + return new Parser\ContentObjectStates(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentTest.php new file mode 100644 index 0000000..4519f3e --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentTest.php @@ -0,0 +1,203 @@ +<?php +/** + * File containing a ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\Values; + +class ContentTest extends BaseTest +{ + /** + * @var \eZ\Publish\Core\REST\Client\Input\Parser\VersionInfo + */ + protected $versionInfoParserMock; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentServiceMock; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParserMock; + + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function testParse() + { + $relationParser = $this->getParser(); + + $inputArray = array( + '_media-type' => 'application/vnd.ez.api.Version+json', + '_href' => '/content/objects/10/versions/2', + 'VersionInfo' => array(), + 'Fields' => array( + 'Field' => array( + 0 => array( + 'id' => 19, + 'fieldDefinitionIdentifier' => 'first_name', + 'languageCode' => 'eng-US', + 'fieldValue' => 'Anonymous', + ), + 1 => array( + 'id' => 20, + 'fieldDefinitionIdentifier' => 'last_name', + 'languageCode' => 'eng-US', + 'fieldValue' => 'User', + ), + ), + ) + ); + + $versionInfoMock = new \stdClass(); + $versionInfoMock->contentInfoId = '/content/objects/10'; + + $this->getVersionInfoParserMock()->expects( $this->once() ) + ->method( 'parse' ) + ->with( + $this->equalTo( array() ), + $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher' ) + )->will( $this->returnValue( $versionInfoMock ) ); + + $this->getFieldTypeParserMock()->expects( $this->exactly( 2 ) ) + ->method( 'parseFieldValue' ) + ->will( $this->returnValue( 'MockedValue' ) ); + + $result = $relationParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @depends testParse + */ + public function testParsedVersionInfo( $parsedContent ) + { + $this->assertInstanceOf( + // Mocked result + 'stdClass', + $parsedContent->versionInfo + ); + } + + /** + * @depends testParse + */ + public function testParsedFirstNameField( $parsedContent ) + { + $this->assertEquals( + // Mocked result + new Values\Content\Field( + array( + 'id' => 19, + 'fieldDefIdentifier' => 'first_name', + 'languageCode' => 'eng-US', + 'value' => 'MockedValue', + ) + ), + $parsedContent->getField( 'first_name', 'eng-US' ) + ); + } + + /** + * @depends testParse + */ + public function testParsedLastNameField( $parsedContent ) + { + $this->assertEquals( + // Mocked result + new Values\Content\Field( + array( + 'id' => 20, + 'fieldDefIdentifier' => 'last_name', + 'languageCode' => 'eng-US', + 'value' => 'MockedValue', + ) + ), + $parsedContent->getField( 'last_name', 'eng-US' ) + ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Content + */ + protected function getParser() + { + return new Input\Parser\Content( + new ParserTools(), + $this->getContentServiceMock(), + $this->getVersionInfoParserMock(), + $this->getFieldTypeParserMock() + ); + } + + /** + * @return \eZ\Publish\Core\REST\Client\Input\Parser\VersionInfo + */ + protected function getVersionInfoParserMock() + { + if ( !isset( $this->versionInfoParserMock ) ) + { + $this->versionInfoParserMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\Input\\Parser\\VersionInfo', + array(), + array(), + '', + false + ); + } + return $this->versionInfoParserMock; + } + + /** + * @return \eZ\Publish\Core\REST\Client\ContentService + */ + protected function getContentServiceMock() + { + if ( !isset( $this->contentServiceMock ) ) + { + $this->contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentService', + array(), + array(), + '', + false + ); + } + return $this->contentServiceMock; + } + + /** + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected function getFieldTypeParserMock() + { + if ( !isset( $this->fieldTypeParserMock ) ) + { + $this->fieldTypeParserMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array(), + '', + false + ); + } + return $this->fieldTypeParserMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentTypeTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentTypeTest.php new file mode 100644 index 0000000..65d8ffb --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ContentTypeTest.php @@ -0,0 +1,209 @@ +<?php +/** + * File containing a ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\Values; + +class ContentTypeTest extends BaseTest +{ + /** + * @var \eZ\Publish\Core\REST\Client\Input\Parser\VersionInfo + */ + protected $versionInfoParserMock; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentTypeServiceMock; + + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function testParse() + { + $contentTypeParser = $this->getParser(); + + $inputArray = array( + '_media-type' => 'application/vnd.ez.api.ContentType+json', + '_href' => '/content/types/1', + 'id' => 1, + 'status' => 'DEFINED', + 'identifier' => 'folder', + 'names' => array( + 'value' => array( + 1 => array( + '_languageCode' => 'eng-US', + '#text' => 'Folder', + ), + ), + ), + 'descriptions' => array( + 'value' => array( + 1 => array( + '_languageCode' => 'eng-US', + '#text' => 'Bielefeld', + ), + ), + ), + 'creationDate' => '2002-06-18T11:21:38+02:00', + 'modificationDate' => '2004-04-20T11:54:35+02:00', + 'Creator' => array( + '_media-type' => 'application/vnd.ez.api.User+json', + '_href' => '/user/users/10', + ), + 'Modifier' => array( + '_media-type' => 'application/vnd.ez.api.User+json', + '_href' => '/user/users/14', + ), + 'remoteId' => 'a3d405b81be900468eb153d774f4f0d2', + 'urlAliasSchema' => '', + 'nameSchema' => '<short_name|name>', + 'isContainer' => 'true', + 'mainLanguageCode' => 'eng-US', + 'defaultAlwaysAvailable' => 'true', + 'defaultSortField' => 'PATH', + 'defaultSortOrder' => 'ASC', + // Only "mock" + 'FieldDefinitions' => array( + '_media-type' => 'application/vnd.ez.api.FieldDefinitionList+json', + '_href' => '/content/types/1/fieldDefinitions', + 'FieldDefinition' => array(), + ) + ); + + $result = $contentTypeParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @dataProvider provideExpectedContentTypeProperties + * @depends testParse + */ + public function testParsedProperties( $propertyName, $expectedValue, $parsedContentType ) + { + $this->assertEquals( + $expectedValue, + $parsedContentType->$propertyName, + "Property \${$propertyName} parsed incorrectly." + ); + } + + public function provideExpectedContentTypeProperties() + { + return array( + array( + 'id', + '/content/types/1', + ), + array( + 'status', + Values\ContentType\ContentType::STATUS_DEFINED, + ), + array( + 'identifier', + 'folder', + ), + array( + 'creationDate', + new \DateTime( '2002-06-18T11:21:38+02:00' ), + ), + array( + 'modificationDate', + new \DateTime( '2004-04-20T11:54:35+02:00' ), + ), + array( + 'creatorId', + '/user/users/10', + ), + array( + 'modifierId', + '/user/users/14', + ), + array( + 'remoteId', + 'a3d405b81be900468eb153d774f4f0d2', + ), + array( + 'urlAliasSchema', + '', + ), + array( + 'nameSchema', + '<short_name|name>', + ), + array( + 'isContainer', + true, + ), + array( + 'mainLanguageCode', + 'eng-US', + ), + array( + 'defaultAlwaysAvailable', + true, + ), + array( + 'defaultSortField', + Values\Content\Location::SORT_FIELD_PATH, + ), + array( + 'defaultSortOrder', + Values\Content\Location::SORT_ORDER_ASC, + ), + array( + 'names', + array( 'eng-US' => 'Folder' ), + ), + array( + 'descriptions', + array( 'eng-US' => 'Bielefeld' ), + ), + ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ContentType + */ + protected function getParser() + { + return new Input\Parser\ContentType( + new ParserTools(), + $this->getContentTypeServiceMock() + ); + } + + /** + * @return \eZ\Publish\Core\REST\Client\ContentService + */ + protected function getContentTypeServiceMock() + { + if ( !isset( $this->contentTypeServiceMock ) ) + { + $this->contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentTypeService', + array(), + array(), + '', + false + ); + } + return $this->contentTypeServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/FieldDefinitionListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/FieldDefinitionListTest.php new file mode 100644 index 0000000..c9d1f29 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/FieldDefinitionListTest.php @@ -0,0 +1,89 @@ +<?php +/** + * File containing a ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\Values; + +class FieldDefinitionListTest extends BaseTest +{ + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentTypeServiceMock; + + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function testParse() + { + $fieldDefinitionListParser = $this->getParser(); + + $inputArray = array( + '_media-type' => 'application/vnd.ez.api.FieldDefinitionList+json', + '_href' => '/content/types/1/fieldDefinitions', + // Only "mock" + 'FieldDefinition' => array( + 0 => array( + '_media-type' => 'application/vnd.ez.api.FieldDefinition+json', + '_href' => '/content/types/1/fieldDefinitions/23', + ), + 1 => array( + '_media-type' => 'application/vnd.ez.api.FieldDefinition+json', + '_href' => '/content/types/1/fieldDefinitions/42', + ), + ), + ); + + $this->contentTypeServiceMock->expects( $this->exactly( 2 ) ) + ->method( 'loadFieldDefinition' ) + ->with( $this->isType( 'string' ) ); + + $result = $fieldDefinitionListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $fieldDefinitionArray = $result->getFieldDefinitions(); + + $this->assertInternalType( 'array', $fieldDefinitionArray ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\FieldDefinitionList + */ + protected function getParser() + { + return new Input\Parser\FieldDefinitionList( + new ParserTools(), + $this->getContentTypeServiceMock() + ); + } + + /** + * @return \eZ\Publish\Core\REST\Client\ContentService + */ + protected function getContentTypeServiceMock() + { + if ( !isset( $this->contentTypeServiceMock ) ) + { + $this->contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentTypeService', + array(), + array(), + '', + false + ); + } + return $this->contentTypeServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/FieldDefinitionTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/FieldDefinitionTest.php new file mode 100644 index 0000000..c4a4156 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/FieldDefinitionTest.php @@ -0,0 +1,182 @@ +<?php +/** + * File containing a ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\Values; + +class FieldDefinitionTest extends BaseTest +{ + protected $fieldTypeParserMock; + + public function setUp() + { + parent::setUp(); + $this->fieldTypeParserMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array(), + '', + false + ); + } + + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function testParse() + { + $fieldDefinitionParser = $this->getParser(); + + $inputArray = array( + '_media-type' => 'application/vnd.ez.api.FieldDefinition+json', + '_href' => '/content/types/1/fieldDefinitions/292', + 'id' => 292, + 'identifier' => 'tags', + 'fieldType' => 'ezkeyword', + 'fieldGroup' => 'fancy-field-group', + 'position' => 7, + 'isTranslatable' => 'true', + 'isRequired' => 'false', + 'isInfoCollector' => 'false', + 'defaultValue' => array( 'ValueMock' ), + 'fieldSettings' => array( 'SettingsMock' ), + 'validatorConfiguration' => array( 'ValidatorMock' ), + 'isSearchable' => 'false', + 'names' => array( + 'value' => array( + 0 => array( + '_languageCode' => 'eng-US', + '#text' => 'Tags', + ), + ), + ), + 'descriptions' => array( + 'value' => array( + 0 => array( + '_languageCode' => 'eng-US', + '#text' => 'Sindelfingen', + ), + ), + ) + ); + + $this->fieldTypeParserMock->expects( $this->once() ) + ->method( 'parseValue' ) + ->with( + $this->equalTo( 'ezkeyword' ), + $this->equalTo( array( 'ValueMock' ) ) + ) + ->will( $this->returnValue( 'ParsedValueMock' ) ); + + $this->fieldTypeParserMock->expects( $this->once() ) + ->method( 'parseFieldSettings' ) + ->with( + $this->equalTo( 'ezkeyword' ), + $this->equalTo( array( 'SettingsMock' ) ) + )->will( $this->returnValue( 'ParsedSettingsMock' ) ); + + $this->fieldTypeParserMock->expects( $this->once() ) + ->method( 'parseValidatorConfiguration' ) + ->with( + $this->equalTo( 'ezkeyword' ), + $this->equalTo( array( 'ValidatorMock' ) ) + )->will( $this->returnValue( 'ParsedValidatorMock' ) ); + + $result = $fieldDefinitionParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @dataProvider provideExpectedFieldDefinitionProperties + * @depends testParse + */ + public function testParsedProperties( $propertyName, $expectedValue, $parsedFieldDefinition ) + { + $this->assertEquals( + $expectedValue, + $parsedFieldDefinition->$propertyName, + "Property \${$propertyName} parsed incorrectly." + ); + } + + public function provideExpectedFieldDefinitionProperties() + { + return array( + array( + 'id', + '/content/types/1/fieldDefinitions/292', + ), + array( + 'identifier', + 'tags', + ), + array( + 'fieldGroup', + 'fancy-field-group', + ), + array( + 'position', + 7, + ), + array( + 'fieldTypeIdentifier', + 'ezkeyword', + ), + array( + 'isTranslatable', + true, + ), + array( + 'isRequired', + false, + ), + array( + 'isSearchable', + false, + ), + array( + 'isInfoCollector', + false, + ), + array( + 'defaultValue', + 'ParsedValueMock', + ), + array( + 'names', + array( 'eng-US' => 'Tags' ), + ), + array( + 'descriptions', + array( 'eng-US' => 'Sindelfingen' ), + ) + ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\FieldDefinition + */ + protected function getParser() + { + return new Input\Parser\FieldDefinition( + new ParserTools(), + $this->fieldTypeParserMock + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/InvalidArgumentExceptionTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/InvalidArgumentExceptionTest.php new file mode 100644 index 0000000..93aba5f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/InvalidArgumentExceptionTest.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing a InvalidArgumentExceptionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class InvalidArgumentExceptionTest extends BaseTest +{ + /** + * Tests parsing of InvalidArgumentException error message + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Section with ID "23" not found. + */ + public function testParse() + { + $parser = $this->getParser(); + + $inputArray = array( + 'errorDescription' => 'Section with ID "23" not found.', + 'errorCode' => '406', + ); + + $parser->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Gets the error message parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ErrorMessage + */ + protected function getParser() + { + return new Parser\ErrorMessage(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LimitationTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LimitationTest.php new file mode 100644 index 0000000..577cbb2 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LimitationTest.php @@ -0,0 +1,103 @@ +<?php +/** + * File containing a LimitationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class LimitationTest extends BaseTest +{ + /** + * Tests the Limitation parser + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function testParse() + { + $limitationParser = $this->getParser(); + + $inputArray = array( + '_identifier' => 'Class', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ); + + $result = $limitationParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting policy is in fact an instance of Limitation class + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $result + * + * @depends testParse + */ + public function testResultIsLimitation( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Limitation', + $result + ); + } + + /** + * Tests that the resulting policy contains the identifier + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $result + * + * @depends testParse + */ + public function testResultContainsIdentifier( $result ) + { + $this->assertEquals( + 'Class', + $result->getIdentifier() + ); + } + + /** + * Tests that the resulting policy contains limitation values + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $result + * + * @depends testParse + */ + public function testResultContainsLimitationValues( $result ) + { + $this->assertEquals( + array( 1, 2, 3 ), + $result->limitationValues + ); + } + + /** + * Gets the parser for Limitation + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Limitation + */ + protected function getParser() + { + return new Parser\Limitation(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LocationListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LocationListTest.php new file mode 100644 index 0000000..0f9f139 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LocationListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a LocationListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class LocationListTest extends BaseTest +{ + /** + * Tests the parsing of location list + */ + public function testParse() + { + $locationListParser = $this->getParser(); + + $inputArray = array( + 'Location' => array( + array( '_media-type' => 'application/vnd.ez.api.Location+xml' ), + array( '_media-type' => 'application/vnd.ez.api.Location+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.Location+xml' ), + 'application/vnd.ez.api.Location+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $locationListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the location list parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\LocationList; + */ + protected function getParser() + { + return new Parser\LocationList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LocationTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LocationTest.php new file mode 100644 index 0000000..f758d60 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/LocationTest.php @@ -0,0 +1,226 @@ +<?php +/** + * File containing a LocationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\Values\Content\Location; + +class LocationTest extends BaseTest +{ + /** + * Tests the location parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function testParse() + { + $locationParser = $this->getParser(); + + $inputArray = array( + '_href' => '/content/locations/1/2/21/42', + 'priority' => '0', + 'hidden' => 'false', + 'invisible' => 'false', + 'remoteId' => 'remote-id', + 'ParentLocation' => array( + '_href' => '/content/locations/1/2/21' + ), + 'pathString' => '/1/2/21/42', + 'depth' => '3', + 'Content' => array( + '_href' => '/content/objects/42' + ), + 'sortField' => 'PATH', + 'sortOrder' => 'ASC', + ); + + $result = $locationParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting location is in fact an instance of Location class + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultIsLocation( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Location', + $result + ); + } + + /** + * Tests that the resulting location contains the ID + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsId( $result ) + { + $this->assertEquals( + '/content/locations/1/2/21/42', + $result->id + ); + } + + /** + * Tests that the resulting location contains the priority + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsPriority( $result ) + { + $this->assertEquals( + 0, + $result->priority + ); + } + + /** + * Tests that the resulting location contains hidden property + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsHidden( $result ) + { + $this->assertEquals( + false, + $result->hidden + ); + } + + /** + * Tests that the resulting location contains invisible property + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsInvisible( $result ) + { + $this->assertEquals( + false, + $result->invisible + ); + } + + /** + * Tests that the resulting location contains remote ID + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsRemoteId( $result ) + { + $this->assertEquals( + 'remote-id', + $result->remoteId + ); + } + + /** + * Tests that the resulting location contains parent location ID + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsParentLocationId( $result ) + { + $this->assertEquals( + '/content/locations/1/2/21', + $result->parentLocationId + ); + } + + /** + * Tests that the resulting location contains path string + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsPathString( $result ) + { + $this->assertEquals( + '/1/2/21/42', + $result->pathString + ); + } + + /** + * Tests that the resulting location contains depth + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsDepth( $result ) + { + $this->assertEquals( + 3, + $result->depth + ); + } + + /** + * Tests that the resulting location contains sort field + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsSortField( $result ) + { + $this->assertEquals( + Location::SORT_FIELD_PATH, + $result->sortField + ); + } + + /** + * Tests that the resulting location contains sort order + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $result + * + * @depends testParse + */ + public function testResultContainsSortOrder( $result ) + { + $this->assertEquals( + Location::SORT_ORDER_ASC, + $result->sortOrder + ); + } + + /** + * Gets the parser for location + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Location; + */ + protected function getParser() + { + return new Parser\Location( new ParserTools() ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/NotFoundExceptionTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/NotFoundExceptionTest.php new file mode 100644 index 0000000..5e845e3 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/NotFoundExceptionTest.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing a NotFoundExceptionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class NotFoundExceptionTest extends BaseTest +{ + /** + * Tests parsing of NotFoundException + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @expectedExceptionMessage Section with ID "23" not found. + */ + public function testParse() + { + $parser = $this->getParser(); + + $inputArray = array( + 'errorDescription' => 'Section with ID "23" not found.', + 'errorCode' => '404', + ); + + $parser->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Gets the parser for error message + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ErrorMessage; + */ + protected function getParser() + { + return new Parser\ErrorMessage(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateGroupListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateGroupListTest.php new file mode 100644 index 0000000..7b4ec1f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateGroupListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a ObjectStateGroupListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class ObjectStateGroupListTest extends BaseTest +{ + /** + * Tests the parsing of ObjectStateGroupList + */ + public function testParse() + { + $groupListParser = $this->getParser(); + + $inputArray = array( + 'ObjectStateGroup' => array( + array( '_media-type' => 'application/vnd.ez.api.ObjectStateGroup+xml' ), + array( '_media-type' => 'application/vnd.ez.api.ObjectStateGroup+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.ObjectStateGroup+xml' ), + 'application/vnd.ez.api.ObjectStateGroup+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $groupListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the ObjectStateGroupList parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ObjectStateGroupList; + */ + protected function getParser() + { + return new Parser\ObjectStateGroupList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateGroupTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateGroupTest.php new file mode 100644 index 0000000..348d15e --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateGroupTest.php @@ -0,0 +1,186 @@ +<?php +/** + * File containing a ObjectStateGroupTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParserTools; + +class ObjectStateGroupTest extends BaseTest +{ + /** + * Tests the ObjectStateGroup parser + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function testParse() + { + $objectStateGroupParser = $this->getParser(); + + $inputArray = array( + '_href' => '/content/objectstategroups/42', + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => 'eng-GB,eng-US', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group EN' + ), + array( + '_languageCode' => 'eng-US', + '#text' => 'Test group EN US' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description EN' + ), + array( + '_languageCode' => 'eng-US', + '#text' => 'Test group description EN US' + ) + ) + ) + ); + + $result = $objectStateGroupParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting ObjectStateGroup is in fact an instance of ObjectStateGroup class + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultIsObjectStateGroup( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $result + ); + } + + /** + * Tests that the resulting ObjectStateGroup contains the ID + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultContainsId( $result ) + { + $this->assertEquals( + '/content/objectstategroups/42', + $result->id + ); + } + + /** + * Tests that the resulting ObjectStateGroup contains identifier + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultContainsIdentifier( $result ) + { + $this->assertEquals( + 'test-group', + $result->identifier + ); + } + + /** + * Tests that the resulting ObjectStateGroup contains defaultLanguageCode + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultContainsDefaultLanguageCode( $result ) + { + $this->assertEquals( + 'eng-GB', + $result->defaultLanguageCode + ); + } + + /** + * Tests that the resulting ObjectStateGroup contains languageCodes + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultContainsDefaultLanguageCodes( $result ) + { + $this->assertEquals( + array( 'eng-GB', 'eng-US' ), + $result->languageCodes + ); + } + + /** + * Tests that the resulting ObjectStateGroup contains names + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultContainsNames( $result ) + { + $this->assertEquals( + array( + 'eng-GB' => 'Test group EN', + 'eng-US' => 'Test group EN US' + ), + $result->getNames() + ); + } + + /** + * Tests that the resulting ObjectStateGroup contains descriptions + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $result + * + * @depends testParse + */ + public function testResultContainsDescriptions( $result ) + { + $this->assertEquals( + array( + 'eng-GB' => 'Test group description EN', + 'eng-US' => 'Test group description EN US' + ), + $result->getDescriptions() + ); + } + + /** + * Gets the parser for ObjectStateGroup + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ObjectStateGroup; + */ + protected function getParser() + { + return new Parser\ObjectStateGroup( + new ParserTools() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateListTest.php new file mode 100644 index 0000000..cde830d --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a ObjectStateListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class ObjectStateListTest extends BaseTest +{ + /** + * Tests the parsing of ObjectStateList + */ + public function testParse() + { + $stateListParser = $this->getParser(); + + $inputArray = array( + 'ObjectState' => array( + array( '_media-type' => 'application/vnd.ez.api.ObjectState+xml' ), + array( '_media-type' => 'application/vnd.ez.api.ObjectState+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.ObjectState+xml' ), + 'application/vnd.ez.api.ObjectState+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $stateListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the ObjectStateList parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ObjectStateList; + */ + protected function getParser() + { + return new Parser\ObjectStateList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateTest.php new file mode 100644 index 0000000..a91a106 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/ObjectStateTest.php @@ -0,0 +1,202 @@ +<?php +/** + * File containing a ObjectStateTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; +use eZ\Publish\Core\REST\Common\Input\ParserTools; + +class ObjectStateTest extends BaseTest +{ + /** + * Tests the ObjectState parser + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function testParse() + { + $objectStateParser = $this->getParser(); + + $inputArray = array( + '_href' => '/content/objectstategroups/42/objectstates/21', + 'identifier' => 'test-state', + 'priority' => '0', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => 'eng-GB,eng-US', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state EN' + ), + array( + '_languageCode' => 'eng-US', + '#text' => 'Test state EN US' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state description EN' + ), + array( + '_languageCode' => 'eng-US', + '#text' => 'Test state description EN US' + ) + ) + ) + ); + + $result = $objectStateParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting ObjectState is in fact an instance of ObjectState class + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultIsObjectState( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $result + ); + } + + /** + * Tests that the resulting ObjectState contains the ID + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsId( $result ) + { + $this->assertEquals( + '/content/objectstategroups/42/objectstates/21', + $result->id + ); + } + + /** + * Tests that the resulting ObjectState contains identifier + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsIdentifier( $result ) + { + $this->assertEquals( + 'test-state', + $result->identifier + ); + } + + /** + * Tests that the resulting ObjectState contains priority + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsPriority( $result ) + { + $this->assertEquals( + 0, + $result->priority + ); + } + + /** + * Tests that the resulting ObjectState contains defaultLanguageCode + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsDefaultLanguageCode( $result ) + { + $this->assertEquals( + 'eng-GB', + $result->defaultLanguageCode + ); + } + + /** + * Tests that the resulting ObjectState contains languageCodes + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsDefaultLanguageCodes( $result ) + { + $this->assertEquals( + array( 'eng-GB', 'eng-US' ), + $result->languageCodes + ); + } + + /** + * Tests that the resulting ObjectState contains names + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsNames( $result ) + { + $this->assertEquals( + array( + 'eng-GB' => 'Test state EN', + 'eng-US' => 'Test state EN US' + ), + $result->getNames() + ); + } + + /** + * Tests that the resulting ObjectState contains descriptions + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $result + * + * @depends testParse + */ + public function testResultContainsDescriptions( $result ) + { + $this->assertEquals( + array( + 'eng-GB' => 'Test state description EN', + 'eng-US' => 'Test state description EN US' + ), + $result->getDescriptions() + ); + } + + /** + * Gets the parser for ObjectState + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\ObjectState; + */ + protected function getParser() + { + return new Parser\ObjectState( + new ParserTools() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/PolicyListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/PolicyListTest.php new file mode 100644 index 0000000..ca3d7aa --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/PolicyListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a PolicyListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class PolicyListTest extends BaseTest +{ + /** + * Tests the parsing of policy list + */ + public function testParse() + { + $policyListParser = $this->getParser(); + + $inputArray = array( + 'Policy' => array( + array( '_media-type' => 'application/vnd.ez.api.Policy+xml' ), + array( '_media-type' => 'application/vnd.ez.api.Policy+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.Policy+xml' ), + 'application/vnd.ez.api.Policy+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $policyListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the policy list parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\PolicyList; + */ + protected function getParser() + { + return new Parser\PolicyList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/PolicyTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/PolicyTest.php new file mode 100644 index 0000000..542feac --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/PolicyTest.php @@ -0,0 +1,107 @@ +<?php +/** + * File containing a PolicyTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class PolicyTest extends BaseTest +{ + /** + * Tests the policy parser + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function testParse() + { + $policyParser = $this->getParser(); + + $inputArray = array( + 'id' => '42', + 'module' => 'content', + 'function' => 'delete', + ); + + $result = $policyParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting policy is in fact an instance of Policy class + * + * @param \eZ\Publish\API\Repository\Values\User\Policy $result + * + * @depends testParse + */ + public function testResultIsPolicy( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Policy', + $result + ); + } + + /** + * Tests that the resulting policy contains the ID + * + * @param \eZ\Publish\API\Repository\Values\User\Policy $result + * + * @depends testParse + */ + public function testResultContainsId( $result ) + { + $this->assertEquals( + '42', + $result->id + ); + } + + /** + * Tests that the resulting policy contains module + * + * @param \eZ\Publish\API\Repository\Values\User\Policy $result + * + * @depends testParse + */ + public function testResultContainsModule( $result ) + { + $this->assertEquals( + 'content', + $result->module + ); + } + + /** + * Tests that the resulting policy contains function + * + * @param \eZ\Publish\API\Repository\Values\User\Policy $result + * + * @depends testParse + */ + public function testResultContainsFunction( $result ) + { + $this->assertEquals( + 'delete', + $result->function + ); + } + + /** + * Gets the parser for policy + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Policy; + */ + protected function getParser() + { + return new Parser\Policy(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RelationTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RelationTest.php new file mode 100644 index 0000000..b7ee9f7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RelationTest.php @@ -0,0 +1,104 @@ +<?php +/** + * File containing a RelationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; +use eZ\Publish\API\Repository\Values; + +class RelationTest extends BaseTest +{ + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentServiceMock; + + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation + */ + public function testParse() + { + $relationParser = $this->getParser(); + + $inputArray = array( + '_href' => '/content/objects/23/relations/32', + '_media-type' => 'application/vnd.ez.api.Relation+xml', + 'SourceContent' => array( + '_media-type' => 'application/vnd.ez.api.ContentInfo+xml', + '_href' => '/content/objects/23', + ), + 'DestinationContent' => array( + '_media-type' => 'application/vnd.ez.api.ContentInfo+xml', + '_href' => '/content/objects/45', + ), + 'RelationType' => 'COMMON', + ); + + $this->getContentServiceMock()->expects( $this->exactly( 2 ) ) + ->method( 'loadContentInfo' ); + + $result = $relationParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @depends testParse + */ + public function testParsedId( $parsedRelation ) + { + $this->assertEquals( + '/content/objects/23/relations/32', + $parsedRelation->id + ); + } + + /** + * @depends testParse + */ + public function testParsedType( $parsedRelation ) + { + $this->assertEquals( + Values\Content\Relation::COMMON, + $parsedRelation->type + ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Relation + */ + protected function getParser() + { + return new Parser\Relation( $this->getContentServiceMock() ); + } + + /** + * @return \eZ\Publish\Core\REST\Client\ContentService + */ + protected function getContentServiceMock() + { + if ( !isset( $this->contentServiceMock ) ) + { + $this->contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentService', + array(), + array(), + '', + false + ); + } + return $this->contentServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleAssignmentListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleAssignmentListTest.php new file mode 100644 index 0000000..7126737 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleAssignmentListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a RoleAssignmentListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class RoleAssignmentListTest extends BaseTest +{ + /** + * Tests the parsing of RoleAssignmentList + */ + public function testParse() + { + $roleAssignmentListParser = $this->getParser(); + + $inputArray = array( + 'RoleAssignment' => array( + array( '_media-type' => 'application/vnd.ez.api.RoleAssignment+xml' ), + array( '_media-type' => 'application/vnd.ez.api.RoleAssignment+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.RoleAssignment+xml' ), + 'application/vnd.ez.api.RoleAssignment+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $roleAssignmentListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the RoleAssignmentList parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\RoleAssignmentList; + */ + protected function getParser() + { + return new Parser\RoleAssignmentList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleAssignmentTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleAssignmentTest.php new file mode 100644 index 0000000..54f9a7b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleAssignmentTest.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing a RoleAssignmentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class RoleAssignmentTest extends BaseTest +{ + /** + * Tests the RoleAssignment parser + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment + */ + public function testParse() + { + $roleAssignmentParser = $this->getParser(); + + $inputArray = array( + '_href' => '/user/users/14/roles/42', + 'Role' => array( + '_href' => '/user/roles/42', + '_media-type' => 'application/vnd.ez.api.Role+xml' + ) + ); + + $result = $roleAssignmentParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting role is in fact an instance of RoleAssignment class + * + * @param \eZ\Publish\API\Repository\Values\User\RoleAssignment $result + * + * @depends testParse + */ + public function testResultIsRoleAssignment( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\RoleAssignment', + $result + ); + } + + /** + * Gets the parser for role assignment + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\RoleAssignment; + */ + protected function getParser() + { + return new Parser\RoleAssignment(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleListTest.php new file mode 100644 index 0000000..5d6d2af --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a RoleListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class RoleListTest extends BaseTest +{ + /** + * Tests the parsing of role list + */ + public function testParse() + { + $roleListParser = $this->getParser(); + + $inputArray = array( + 'Role' => array( + array( '_media-type' => 'application/vnd.ez.api.Role+xml' ), + array( '_media-type' => 'application/vnd.ez.api.Role+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.Role+xml' ), + 'application/vnd.ez.api.Role+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $roleListParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the role list parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\RoleList; + */ + protected function getParser() + { + return new Parser\RoleList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleTest.php new file mode 100644 index 0000000..a0a80fa --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/RoleTest.php @@ -0,0 +1,91 @@ +<?php +/** + * File containing a RoleTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class RoleTest extends BaseTest +{ + /** + * Tests the role parser + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function testParse() + { + $roleParser = $this->getParser(); + + $inputArray = array( + '_href' => '/user/roles/6', + 'identifier' => 'some-role' + ); + + $result = $roleParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting role is in fact an instance of Role class + * + * @param \eZ\Publish\API\Repository\Values\User\Role $result + * + * @depends testParse + */ + public function testResultIsRole( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Role', + $result + ); + } + + /** + * Tests that the resulting role contains the ID + * + * @param \eZ\Publish\API\Repository\Values\User\Role $result + * + * @depends testParse + */ + public function testResultContainsId( $result ) + { + $this->assertEquals( + '/user/roles/6', + $result->id + ); + } + + /** + * Tests that the resulting role contains identifier + * + * @param \eZ\Publish\API\Repository\Values\User\Role $result + * + * @depends testParse + */ + public function testResultContainsIdentifier( $result ) + { + $this->assertEquals( + 'some-role', + $result->identifier + ); + } + + /** + * Gets the parser for role + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Role; + */ + protected function getParser() + { + return new Parser\Role(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/SectionListTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/SectionListTest.php new file mode 100644 index 0000000..85d7bd7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/SectionListTest.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing a SectionListTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class SectionListTest extends BaseTest +{ + /** + * Tests the parsing of role list + */ + public function testParse() + { + $sectionParser = $this->getParser(); + + $inputArray = array( + 'Section' => array( + array( '_media-type' => 'application/vnd.ez.api.Section+xml' ), + array( '_media-type' => 'application/vnd.ez.api.Section+xml' ), + ), + ); + + $this->getParsingDispatcherMock() + ->expects( $this->exactly( 2 ) ) + ->method( 'parse' ) + ->with( + array( '_media-type' => 'application/vnd.ez.api.Section+xml' ), + 'application/vnd.ez.api.Section+xml' + ) + ->will( $this->returnValue( 'foo' ) ); + + $result = $sectionParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( 'foo', 'foo' ), + $result + ); + } + + /** + * Gets the section list parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\SectionList; + */ + protected function getParser() + { + return new Parser\SectionList(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/SectionTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/SectionTest.php new file mode 100644 index 0000000..b905693 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/SectionTest.php @@ -0,0 +1,107 @@ +<?php +/** + * File containing a SectionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input\Parser; + +class SectionTest extends BaseTest +{ + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function testParse() + { + $sectionParser = $this->getParser(); + + $inputArray = array( + '_href' => '/content/sections/23', + 'identifier' => 'some-section', + 'name' => 'Some Section', + ); + + $result = $sectionParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the resulting role is in fact an instance of Section class + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $result + * + * @depends testParse + */ + public function testResultIsSection( $result ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\Section', + $result + ); + } + + /** + * Tests if resulting section contains the ID + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $result + * + * @depends testParse + */ + public function testResultContainsId( $result ) + { + $this->assertEquals( + '/content/sections/23', + $result->id + ); + } + + /** + * Tests if resulting section contains the identifier + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $result + * + * @depends testParse + */ + public function testResultContainsIdentifier( $result ) + { + $this->assertEquals( + 'some-section', + $result->identifier + ); + } + + /** + * Tests if resulting section contains the name + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $result + * + * @depends testParse + */ + public function testResultContainsName( $result ) + { + $this->assertEquals( + 'Some Section', + $result->name + ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\Section; + */ + protected function getParser() + { + return new Parser\Section(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Input/Parser/VersionInfoTest.php b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/VersionInfoTest.php new file mode 100644 index 0000000..6dd13fe --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Input/Parser/VersionInfoTest.php @@ -0,0 +1,207 @@ +<?php +/** + * File containing a VersionInfoTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Client\Input; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\Values; + +class VersionInfoTest extends BaseTest +{ + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentServiceMock; + + /** + * Tests the section parser + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function testParse() + { + $relationParser = $this->getParser(); + + $inputArray = array( + 'id' => 474, + 'versionNo' => 2, + 'status' => 'PUBLISHED', + 'modificationDate' => '2003-12-23T12:53:25+01:00', + 'Creator' => array( + '_media-type' => 'application/vnd.ez.api.User+json', + '_href' => '/user/users/14', + ), + 'creationDate' => '2003-12-23T12:52:17+01:00', + 'initialLanguageCode' => 'eng-US', + 'languageCodes' => 'eng-US,ger-DE', + 'names' => array( + 'value' => array( + 0 => array( + '_languageCode' => 'eng-US', + '#text' => 'Anonymous User', + ), + ), + ), + 'Content' => array( + '_media-type' => 'application/vnd.ez.api.ContentInfo+json', + '_href' => '/content/objects/10', + ), + ); + + $result = $relationParser->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @depends testParse + */ + public function testParsedId( $parsedVersionInfo ) + { + $this->assertEquals( + 474, + $parsedVersionInfo->id + ); + } + + /** + * @depends testParse + */ + public function testParsedVersionNo( $parsedVersionInfo ) + { + $this->assertEquals( + 2, + $parsedVersionInfo->versionNo + ); + } + + /** + * @depends testParse + */ + public function testParsedStatus( $parsedVersionInfo ) + { + $this->assertEquals( + Values\Content\VersionInfo::STATUS_PUBLISHED, + $parsedVersionInfo->status + ); + } + + /** + * @depends testParse + */ + public function testParsedCreatorId( $parsedVersionInfo ) + { + $this->assertEquals( + '/user/users/14', + $parsedVersionInfo->creatorId + ); + } + + /** + * @depends testParse + */ + public function testParsedCreationDate( $parsedVersionInfo ) + { + $this->assertEquals( + new \DateTime( '2003-12-23T12:52:17+01:00' ), + $parsedVersionInfo->creationDate + ); + } + + /** + * @depends testParse + */ + public function testParsedModificationDate( $parsedVersionInfo ) + { + $this->assertEquals( + new \DateTime( '2003-12-23T12:53:25+01:00' ), + $parsedVersionInfo->modificationDate + ); + } + + /** + * @depends testParse + */ + public function testParsedInitialLanguageCode( $parsedVersionInfo ) + { + $this->assertEquals( + 'eng-US', + $parsedVersionInfo->initialLanguageCode + ); + } + + /** + * @depends testParse + */ + public function testParsedLanguageCodes( $parsedVersionInfo ) + { + $this->assertEquals( + array( 'eng-US', 'ger-DE' ), + $parsedVersionInfo->languageCodes + ); + } + + /** + * @depends testParse + */ + public function testParsedNames( $parsedVersionInfo ) + { + $this->assertEquals( + array( + 'eng-US' => 'Anonymous User', + ), + $parsedVersionInfo->names + ); + } + + /** + * @depends testParse + */ + public function testParsedContentInfoId( $parsedVersionInfo ) + { + $this->assertEquals( + '/content/objects/10', + $parsedVersionInfo->contentInfoId + ); + } + + /** + * Gets the section parser + * + * @return \eZ\Publish\Core\REST\Client\Input\Parser\VersionInfo + */ + protected function getParser() + { + return new Input\Parser\VersionInfo( + new ParserTools(), + $this->getContentServiceMock() + ); + } + + /** + * @return \eZ\Publish\Core\REST\Client\ContentService + */ + protected function getContentServiceMock() + { + if ( !isset( $this->contentServiceMock ) ) + { + $this->contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentService', + array(), + array(), + '', + false + ); + } + return $this->contentServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/ObjectCacheTest.php b/eZ/Publish/Core/REST/Client/Tests/ObjectCacheTest.php new file mode 100644 index 0000000..6bbf977 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/ObjectCacheTest.php @@ -0,0 +1,89 @@ +<?php +/** + * File containing the ObjectCacheTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests; + +use eZ\Publish\Core\REST\Client\ObjectCache; +use eZ\Publish\API\Repository\Values\ValueObject; + +class ObjectCacheTest extends \PHPUnit_Framework_TestCase +{ + public function testStoreRestore() + { + $cache = $this->getCache(); + + $object = new TestValueObject(); + + $cache->store( 'some-key', $object ); + + $this->assertSame( + $object, + $cache->restore( 'some-key' ) + ); + } + + public function testStoreOverwrite() + { + $cache = $this->getCache(); + + $firstObject = new TestValueObject(); + $secondObject = new TestValueObject(); + + $cache->store( 'some-key', $firstObject ); + $cache->store( 'some-key', $secondObject ); + + $this->assertSame( + $secondObject, + $cache->restore( 'some-key' ) + ); + $this->assertNotSame( + $firstObject, + $cache->restore( 'some-key' ) + ); + } + + public function testRestoreNotAvailable() + { + $cache = $this->getCache(); + + $this->assertNull( $cache->restore( 'non-existent' ) ); + } + + public function testClear() + { + $cache = $this->getCache(); + + $object = new TestValueObject(); + + $cache->store( 'some-key', $object ); + $cache->clear( 'some-key' ); + + $this->assertNull( $cache->restore( 'some-key' ) ); + } + + public function testClearAll() + { + $cache = $this->getCache(); + + $object = new TestValueObject(); + + $cache->store( 'some-key', $object ); + $cache->store( 'other-key', $object ); + + $cache->clearAll(); + + $this->assertNull( $cache->restore( 'some-key' ) ); + $this->assertNull( $cache->restore( 'other-key' ) ); + } + + protected function getCache() + { + return new ObjectCache(); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ContentObjectStatesTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ContentObjectStatesTest.php new file mode 100644 index 0000000..bc0b21f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ContentObjectStatesTest.php @@ -0,0 +1,99 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Values\ContentObjectStates; +use eZ\Publish\Core\REST\Common; + +class ContentObjectStatesTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentObjectStates visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentObjectStatesVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $stateList = new ContentObjectStates( array() ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $stateList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentObjectStates element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentObjectStatesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentObjectStates', + ), + $result, + 'Invalid <ContentObjectStates> element.', + false + ); + } + + /** + * Test if result contains ContentObjectStates element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentObjectStatesAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentObjectStates', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentObjectStates+xml', + ) + ), + $result, + 'Invalid <ContentObjectStates> attributes.', + false + ); + } + + /** + * Get the ContentObjectStates visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\ContentObjectStates + */ + protected function getContentObjectStatesVisitor() + { + return new ValueObjectVisitor\ContentObjectStates( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LimitationTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LimitationTest.php new file mode 100644 index 0000000..a919434 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LimitationTest.php @@ -0,0 +1,125 @@ +<?php +/** + * File containing a LimitationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common; + +class LimitationTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the Limitation visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getLimitationVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeLimitation = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $contentTypeLimitation->limitationValues = array( 1, 2, 3 ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeLimitation + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains limitation element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitation', + 'children' => array( + 'count' => 1 + ) + ), + $result, + 'Invalid <limitation> element.', + false + ); + } + + /** + * Tests that the result contains limitation attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitation', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.limitation+xml', + 'identifier' => 'Class', + ) + ), + $result, + 'Invalid <limitation> attributes.', + false + ); + } + + /** + * Tests that the result contains values element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsValuesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'values', + 'children' => array( + 'count' => 3 + ) + ), + $result, + 'Invalid or non-existing <limitation> values element.', + false + ); + } + + /** + * Gets the Limitation visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\Limitation + */ + protected function getLimitationVisitor() + { + return new ValueObjectVisitor\Limitation( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LocationCreateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LocationCreateStructTest.php new file mode 100644 index 0000000..c7d8c33 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LocationCreateStructTest.php @@ -0,0 +1,231 @@ +<?php +/** + * File containing a LocationCreateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common; + +class LocationCreateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the LocationCreateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getLocationCreateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $locationCreateStruct = new LocationCreateStruct(); + $locationCreateStruct->hidden = false; + $locationCreateStruct->parentLocationId = '/content/locations/1/2/42'; + $locationCreateStruct->priority = 0; + $locationCreateStruct->remoteId = 'remote-id'; + $locationCreateStruct->sortField = Location::SORT_FIELD_PATH; + $locationCreateStruct->sortOrder = Location::SORT_ORDER_ASC; + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $locationCreateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains LocationCreate element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationCreateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'LocationCreate', + 'children' => array( + 'count' => 5 + ) + ), + $result, + 'Invalid <LocationCreate> element.', + false + ); + } + + /** + * Tests that the result contains LocationCreate attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationCreateAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'LocationCreate', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.LocationCreate+xml', + ) + ), + $result, + 'Invalid <LocationCreate> attributes.', + false + ); + } + + /** + * Tests that the result contains ParentLocation element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsParentLocationElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ParentLocation' + ), + $result, + 'Invalid <ParentLocation> element.', + false + ); + } + + /** + * Tests that the result contains ParentLocation attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsParentLocationAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ParentLocation', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Location+xml', + 'href' => '/content/locations/1/2/42' + ) + ), + $result, + 'Invalid <ParentLocation> attributes.', + false + ); + } + + /** + * Tests that the result contains priority value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPriorityValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'priority', + 'content' => '0', + ), + $result, + 'Invalid or non-existing <LocationCreate> priority value element.', + false + ); + } + + /** + * Tests that the result contains hidden value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsHiddenValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'hidden', + 'content' => 'false', + ), + $result, + 'Invalid or non-existing <LocationCreate> hidden value element.', + false + ); + } + + /** + * Tests that the result contains sortField value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortFieldValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortField', + 'content' => 'PATH', + ), + $result, + 'Invalid or non-existing <LocationCreate> sortField value element.', + false + ); + } + + /** + * Tests that the result contains sortOrder value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortOrderValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortOrder', + 'content' => 'ASC', + ), + $result, + 'Invalid or non-existing <LocationCreate> sortOrder value element.', + false + ); + } + + /** + * Gets the LocationCreateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\LocationCreateStruct + */ + protected function getLocationCreateStructVisitor() + { + return new ValueObjectVisitor\LocationCreateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LocationUpdateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LocationUpdateStructTest.php new file mode 100644 index 0000000..5b3575b --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/LocationUpdateStructTest.php @@ -0,0 +1,187 @@ +<?php +/** + * File containing a LocationUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common; + +class LocationUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the LocationUpdateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getLocationUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $locationUpdateStruct = new LocationUpdateStruct(); + $locationUpdateStruct->priority = 0; + $locationUpdateStruct->remoteId = 'remote-id'; + $locationUpdateStruct->sortField = Location::SORT_FIELD_PATH; + $locationUpdateStruct->sortOrder = Location::SORT_ORDER_ASC; + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $locationUpdateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains LocationUpdate element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationUpdateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'LocationUpdate', + 'children' => array( + 'count' => 4 + ) + ), + $result, + 'Invalid <LocationUpdate> element.', + false + ); + } + + /** + * Tests that the result contains LocationUpdate attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationUpdateAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'LocationUpdate', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.LocationUpdate+xml', + ) + ), + $result, + 'Invalid <LocationUpdate> attributes.', + false + ); + } + + /** + * Tests that the result contains priority value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPriorityValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'priority', + 'content' => '0', + ), + $result, + 'Invalid or non-existing <LocationUpdate> priority value element.', + false + ); + } + + /** + * Tests that the result contains remoteId value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRemoteIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'remoteId', + 'content' => 'remote-id', + ), + $result, + 'Invalid or non-existing <LocationUpdate> hidden value element.', + false + ); + } + + /** + * Tests that the result contains sortField value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortFieldValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortField', + 'content' => 'PATH', + ), + $result, + 'Invalid or non-existing <LocationUpdate> sortField value element.', + false + ); + } + + /** + * Tests that the result contains sortOrder value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortOrderValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortOrder', + 'content' => 'ASC', + ), + $result, + 'Invalid or non-existing <LocationUpdate> sortOrder value element.', + false + ); + } + + /** + * Gets the LocationUpdateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\LocationUpdateStruct + */ + protected function getLocationUpdateStructVisitor() + { + return new ValueObjectVisitor\LocationUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateCreateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateCreateStructTest.php new file mode 100644 index 0000000..1e97cf0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateCreateStructTest.php @@ -0,0 +1,168 @@ +<?php +/** + * File containing a ObjectStateCreateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\API\Repository\Values\ObjectState; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common; + +class ObjectStateCreateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the ObjectStateCreateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateCreateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectStateCreateStruct = new ObjectState\ObjectStateCreateStruct(); + $objectStateCreateStruct->identifier = 'some-state'; + $objectStateCreateStruct->priority = 0; + $objectStateCreateStruct->defaultLanguageCode = 'eng-GB'; + $objectStateCreateStruct->names = array( 'eng-GB' => 'Some state EN', 'fre-FR' => 'Some state FR' ); + $objectStateCreateStruct->descriptions = array( 'eng-GB' => 'Description EN', 'fre-FR' => 'Description FR' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectStateCreateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Tests that the result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-state', + ), + $result, + 'Invalid or non-existing <ObjectStateCreate> identifier value element.', + false + ); + } + + /** + * Tests that the result contains priority value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPriorityValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'priority', + 'content' => '0', + ), + $result, + 'Invalid or non-existing <ObjectStateCreate> priority value element.', + false + ); + } + + /** + * Tests that the result contains defaultLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDefaultLanguageCodeValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'defaultLanguageCode', + 'content' => 'eng-GB', + ), + $result, + 'Invalid or non-existing <ObjectStateCreate> defaultLanguageCode value element.', + false + ); + } + + /** + * Gets the ObjectStateCreateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\ObjectStateCreateStruct + */ + protected function getObjectStateCreateStructVisitor() + { + return new ValueObjectVisitor\ObjectStateCreateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateGroupCreateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateGroupCreateStructTest.php new file mode 100644 index 0000000..9781088 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateGroupCreateStructTest.php @@ -0,0 +1,147 @@ +<?php +/** + * File containing a ObjectStateGroupCreateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\API\Repository\Values\ObjectState; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common; + +class ObjectStateGroupCreateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the ObjectStateGroupCreateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateGroupCreateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectStateGroupCreateStruct = new ObjectState\ObjectStateGroupCreateStruct(); + $objectStateGroupCreateStruct->identifier = 'some-group'; + $objectStateGroupCreateStruct->defaultLanguageCode = 'eng-GB'; + $objectStateGroupCreateStruct->names = array( 'eng-GB' => 'Some group EN', 'fre-FR' => 'Some group FR' ); + $objectStateGroupCreateStruct->descriptions = array( 'eng-GB' => 'Description EN', 'fre-FR' => 'Description FR' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectStateGroupCreateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Tests that the result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-group', + ), + $result, + 'Invalid or non-existing <ObjectStateGroupCreate> identifier value element.', + false + ); + } + + /** + * Tests that the result contains defaultLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDefaultLanguageCodeValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'defaultLanguageCode', + 'content' => 'eng-GB', + ), + $result, + 'Invalid or non-existing <ObjectStateGroupCreate> defaultLanguageCode value element.', + false + ); + } + + /** + * Gets the ObjectStateGroupCreateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\ObjectStateGroupCreateStruct + */ + protected function getObjectStateGroupCreateStructVisitor() + { + return new ValueObjectVisitor\ObjectStateGroupCreateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateGroupUpdateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateGroupUpdateStructTest.php new file mode 100644 index 0000000..e3e0f04 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateGroupUpdateStructTest.php @@ -0,0 +1,147 @@ +<?php +/** + * File containing a ObjectStateGroupUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\API\Repository\Values\ObjectState; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common; + +class ObjectStateGroupUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the ObjectStateGroupUpdateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateGroupUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectStateGroupUpdateStruct = new ObjectState\ObjectStateGroupUpdateStruct(); + $objectStateGroupUpdateStruct->identifier = 'some-group'; + $objectStateGroupUpdateStruct->defaultLanguageCode = 'eng-GB'; + $objectStateGroupUpdateStruct->names = array( 'eng-GB' => 'Some group EN', 'fre-FR' => 'Some group FR' ); + $objectStateGroupUpdateStruct->descriptions = array( 'eng-GB' => 'Description EN', 'fre-FR' => 'Description FR' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectStateGroupUpdateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Tests that the result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-group', + ), + $result, + 'Invalid or non-existing <ObjectStateGroupUpdate> identifier value element.', + false + ); + } + + /** + * Tests that the result contains defaultLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDefaultLanguageCodeValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'defaultLanguageCode', + 'content' => 'eng-GB', + ), + $result, + 'Invalid or non-existing <ObjectStateGroupUpdate> defaultLanguageCode value element.', + false + ); + } + + /** + * Gets the ObjectStateGroupUpdateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\ObjectStateGroupUpdateStruct + */ + protected function getObjectStateGroupUpdateStructVisitor() + { + return new ValueObjectVisitor\ObjectStateGroupUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateUpdateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateUpdateStructTest.php new file mode 100644 index 0000000..7195da7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/ObjectStateUpdateStructTest.php @@ -0,0 +1,147 @@ +<?php +/** + * File containing a ObjectStateUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\API\Repository\Values\ObjectState; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common; + +class ObjectStateUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the ObjectStateUpdateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectStateUpdateStruct = new ObjectState\ObjectStateUpdateStruct(); + $objectStateUpdateStruct->identifier = 'some-state'; + $objectStateUpdateStruct->defaultLanguageCode = 'eng-GB'; + $objectStateUpdateStruct->names = array( 'eng-GB' => 'Some state EN', 'fre-FR' => 'Some state FR' ); + $objectStateUpdateStruct->descriptions = array( 'eng-GB' => 'Description EN', 'fre-FR' => 'Description FR' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectStateUpdateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Tests that the result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-state', + ), + $result, + 'Invalid or non-existing <ObjectStateUpdate> identifier value element.', + false + ); + } + + /** + * Tests that the result contains defaultLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDefaultLanguageCodeValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'defaultLanguageCode', + 'content' => 'eng-GB', + ), + $result, + 'Invalid or non-existing <ObjectStateUpdate> defaultLanguageCode value element.', + false + ); + } + + /** + * Gets the ObjectStateUpdateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\ObjectStateUpdateStruct + */ + protected function getObjectStateUpdateStructVisitor() + { + return new ValueObjectVisitor\ObjectStateUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/PolicyCreateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/PolicyCreateStructTest.php new file mode 100644 index 0000000..b5b2f68 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/PolicyCreateStructTest.php @@ -0,0 +1,188 @@ +<?php +/** + * File containing a PolicyCreateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Client\Values\User; +use eZ\Publish\Core\REST\Common; + +class PolicyCreateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the PolicyCreateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getPolicyCreateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeLimitation = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $contentTypeLimitation->limitationValues = array( 1, 2, 3 ); + + $policyCreateStruct = new User\PolicyCreateStruct( 'content', 'delete' ); + $policyCreateStruct->addLimitation( $contentTypeLimitation ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $policyCreateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains PolicyCreate element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyCreateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'PolicyCreate', + 'children' => array( + 'less_than' => 4, + 'greater_than' => 1 + ) + ), + $result, + 'Invalid <PolicyCreate> element.', + false + ); + } + + /** + * Tests that the result contains PolicyCreate attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyCreateAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'PolicyCreate', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.PolicyCreate+xml', + ) + ), + $result, + 'Invalid <PolicyCreate> attributes.', + false + ); + } + + /** + * Tests that the result contains module value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsModuleValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'module', + 'content' => 'content', + ), + $result, + 'Invalid or non-existing <PolicyCreate> module value element.', + false + ); + } + + /** + * Tests that the result contains function value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsFunctionValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'function', + 'content' => 'delete', + ), + $result, + 'Invalid or non-existing <PolicyCreate> function value element.', + false + ); + } + + /** + * Tests that the result contains limitations element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitations' + ), + $result, + 'Invalid or non-existing <PolicyCreate> limitations element.', + false + ); + } + + /** + * Tests that the result contains limitations attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationsAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitations', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.limitations+xml', + ) + ), + $result, + 'Invalid <PolicyCreate> limitations attributes.', + false + ); + } + + /** + * Gets the PolicyCreateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\PolicyCreateStruct + */ + protected function getPolicyCreateStructVisitor() + { + return new ValueObjectVisitor\PolicyCreateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/PolicyUpdateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/PolicyUpdateStructTest.php new file mode 100644 index 0000000..502ac44 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/PolicyUpdateStructTest.php @@ -0,0 +1,147 @@ +<?php +/** + * File containing a PolicyUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Client\Values\User; +use eZ\Publish\Core\REST\Common; + +class PolicyUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the PolicyUpdateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getPolicyUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeLimitation = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $contentTypeLimitation->limitationValues = array( 1, 2, 3 ); + + $policyUpdateStruct = new User\PolicyUpdateStruct(); + $policyUpdateStruct->addLimitation( $contentTypeLimitation ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $policyUpdateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains PolicyUpdate element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyUpdateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'PolicyUpdate', + 'children' => array( + 'count' => 1 + ) + ), + $result, + 'Invalid <PolicyUpdate> element.', + false + ); + } + + /** + * Tests that the result contains PolicyUpdate attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyUpdateAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'PolicyUpdate', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.PolicyUpdate+xml', + ) + ), + $result, + 'Invalid <PolicyUpdate> attributes.', + false + ); + } + + /** + * Tests that the result contains limitations element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitations' + ), + $result, + 'Invalid or non-existing <PolicyUpdate> limitations element.', + false + ); + } + + /** + * Tests that the result contains limitations attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationsAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitations', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.limitations+xml', + ) + ), + $result, + 'Invalid <PolicyUpdate> limitations attributes.', + false + ); + } + + /** + * Gets the PolicyUpdateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\PolicyUpdateStruct + */ + protected function getPolicyUpdateStructVisitor() + { + return new ValueObjectVisitor\PolicyUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RestContentMetadataUpdateStruct.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RestContentMetadataUpdateStruct.php new file mode 100644 index 0000000..ccf441f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RestContentMetadataUpdateStruct.php @@ -0,0 +1,217 @@ +<?php +/** + * File containing a SectionIncludingContentMetadataUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct; +use eZ\Publish\Core\REST\Common; + +class RestContentMetadataUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the SectionIncludingContentMetadataUpdateStructTest visitor + * + * @return string + */ + public function testVisitComplete() + { + $visitor = $this->getSectionIncludingContentMetadataUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $sectionCreatestruct = new RestContentMetadataUpdateStruct( + $this->getValidValues() + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionCreatestruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that result contains ContentUpdate element + * + * @param string $result + * + * @depends testVisitComplete + */ + public function testResultContainsContentUpdateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentUpdate', + 'children' => array( + 'less_than' => 3, + 'greater_than' => 1, + ) + ), + $result, + 'Invalid <ContentUpdate> element.', + false + ); + } + + /** + * Tests that result contains Section element + * + * @param string $result + * + * @depends testVisitComplete + */ + public function testResultSectionElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Section', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Section+xml', + 'href' => '/content/sections/23' + ) + ), + $result, + 'Invalid attributes for <Section> element.', + false + ); + } + + /** + * Tests Owner element attributes + * + * @param string $result + * + * @depends testVisitComplete + */ + public function testResultOwnerElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Owner', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.User+xml', + 'href' => '/user/users/42' + ) + ), + $result, + 'Invalid attributes for <Owner> element.', + false + ); + } + + /** + * Tests attributes for Section element + */ + public function testVisitNoSectionUpdate() + { + $visitor = $this->getSectionIncludingContentMetadataUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $values = $this->getValidValues(); + unset( $values['sectionId'] ); + + $sectionCreatestruct = new RestContentMetadataUpdateStruct( + $values + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionCreatestruct + ); + + $result = $generator->endDocument( null ); + + $this->assertTag( + array( + 'tag' => 'Section', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Section+xml', + ) + ), + $result, + 'Invalid attributes for <Section> element.', + false + ); + } + + /** + * Tests the Owner element attributes + */ + public function testVisitNoOwnerUpdate() + { + $visitor = $this->getSectionIncludingContentMetadataUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $values = $this->getValidValues(); + unset( $values['ownerId'] ); + + $sectionCreatestruct = new RestContentMetadataUpdateStruct( + $values + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionCreatestruct + ); + + $result = $generator->endDocument( null ); + + $this->assertTag( + array( + 'tag' => 'Owner', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.User+xml', + ) + ), + $result, + 'Invalid attributes for <Owner> element.', + false + ); + } + + /** + * Returns a set of valid struct values. + * + * @return array + */ + protected function getValidValues() + { + return array( + 'sectionId' => '/content/sections/23', + 'ownerId' => '/user/users/42', + // @todo: Add missing properties + ); + } + + /** + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\SectionIncludingContentMetadataUpdateStruct + */ + protected function getSectionIncludingContentMetadataUpdateStructVisitor() + { + return new ValueObjectVisitor\SectionIncludingContentMetadataUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleAssignmentTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleAssignmentTest.php new file mode 100644 index 0000000..112b3d1 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleAssignmentTest.php @@ -0,0 +1,111 @@ +<?php +/** + * File containing a RoleAssignmentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Client\Values\User\RoleAssignment; +use eZ\Publish\Core\REST\Client\Values\User\Role; +use eZ\Publish\Core\REST\Common; + +class RoleAssignmentTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the RoleAssignment visitor + * + * @todo test with limitations + * + * @return \eZ\Publish\Core\REST\Client\Values\User\RoleAssignment + */ + public function testVisitComplete() + { + $visitor = $this->getRoleAssignmentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleAssignment = new RoleAssignment( + array( + 'role' => new Role( + array( + 'id' => 42 + ) + ) + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleAssignment + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests if result contains Role element + * + * @param string $result + * + * @depends testVisitComplete + */ + public function testResultContainsRoleElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role' + ), + $result, + 'Invalid <Role> element.', + false + ); + } + + /** + * Tests if result contains Role element attributes + * + * @param string $result + * + * @depends testVisitComplete + */ + public function testResultContainsRoleElementAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role', + 'attributes' => array( + 'href' => '/user/roles/42', + 'media-type' => 'application/vnd.ez.api.Role+xml', + ) + ), + $result, + 'Invalid <Role> element attributes.', + false + ); + } + + /** + * Returns the RoleAssignment visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\RoleAssignment + */ + protected function getRoleAssignmentVisitor() + { + return new ValueObjectVisitor\RoleAssignment( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleCreateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleCreateStructTest.php new file mode 100644 index 0000000..adad474 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleCreateStructTest.php @@ -0,0 +1,122 @@ +<?php +/** + * File containing a RoleCreateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Client\Values\User; +use eZ\Publish\Core\REST\Common; + +class RoleCreateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the RoleCreateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRoleCreateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleCreateStruct = new User\RoleCreateStruct( 'some-role' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleCreateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains RoleInput element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleInputElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleInput', + 'children' => array( + 'count' => 1 + ) + ), + $result, + 'Invalid <RoleInput> element.', + false + ); + } + + /** + * Tests that the result contains RoleInput attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleInputAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleInput', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RoleInput+xml', + ) + ), + $result, + 'Invalid <RoleInput> attributes.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-role', + ), + $result, + 'Invalid or non-existing <RoleInput> identifier value element.', + false + ); + } + + /** + * Gets the RoleCreateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\RoleCreateStruct + */ + protected function getRoleCreateStructVisitor() + { + return new ValueObjectVisitor\RoleCreateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleUpdateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleUpdateStructTest.php new file mode 100644 index 0000000..bb2c7a8 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/RoleUpdateStructTest.php @@ -0,0 +1,123 @@ +<?php +/** + * File containing a RoleUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\User; +use eZ\Publish\Core\REST\Common; + +class RoleUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the RoleUpdateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRoleUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleUpdateStruct = new User\RoleUpdateStruct(); + $roleUpdateStruct->identifier = 'some-role'; + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleUpdateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains RoleInput element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleInputElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleInput', + 'children' => array( + 'count' => 1 + ) + ), + $result, + 'Invalid <RoleInput> element.', + false + ); + } + + /** + * Tests that the result contains RoleInput attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleInputAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleInput', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RoleInput+xml', + ) + ), + $result, + 'Invalid <RoleInput> attributes.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-role', + ), + $result, + 'Invalid or non-existing <RoleInput> identifier value element.', + false + ); + } + + /** + * Gets the RoleUpdateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\RoleUpdateStruct + */ + protected function getRoleUpdateStructVisitor() + { + return new ValueObjectVisitor\RoleUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/SectionCreateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/SectionCreateStructTest.php new file mode 100644 index 0000000..f32d194 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/SectionCreateStructTest.php @@ -0,0 +1,148 @@ +<?php +/** + * File containing a SectionCreateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class SectionCreateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the SectionCreateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getSectionCreateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $sectionCreateStruct = new Content\SectionCreateStruct( + array( + 'identifier' => 'some-section', + 'name' => 'Some Section', + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionCreateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains SectionInput element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionInputElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'SectionInput', + 'children' => array( + 'less_than' => 3, + 'greater_than' => 1, + ) + ), + $result, + 'Invalid <SectionInput> element.', + false + ); + } + + /** + * Tests that the result contains SectionInput attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionInputAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'SectionInput', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.SectionInput+xml', + ) + ), + $result, + 'Invalid <SectionInput> attributes.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-section', + ), + $result, + 'Invalid or non-existing <SectionInput> identifier value element.', + false + ); + } + + /** + * Tests that the result contains name value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNameValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'name', + 'content' => 'Some Section', + ), + $result, + 'Invalid or non-existing <SectionInput> name value element.', + false + ); + } + + /** + * Gets the SectionCreateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\SectionCreateStruct + */ + protected function getSectionCreateStructVisitor() + { + return new ValueObjectVisitor\SectionCreateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/SectionUpdateStructTest.php b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/SectionUpdateStructTest.php new file mode 100644 index 0000000..f84fa7a --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Output/ValueObjectVisitor/SectionUpdateStructTest.php @@ -0,0 +1,148 @@ +<?php +/** + * File containing a SectionUpdateStructTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class SectionUpdateStructTest extends ValueObjectVisitorBaseTest +{ + /** + * Tests the SectionUpdateStruct visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getSectionUpdateStructVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $sectionUpdateStruct = new Content\SectionUpdateStruct( + array( + 'identifier' => 'some-section', + 'name' => 'Some Section', + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionUpdateStruct + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Tests that the result contains SectionInput element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionInputElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'SectionInput', + 'children' => array( + 'less_than' => 3, + 'greater_than' => 1, + ) + ), + $result, + 'Invalid <SectionInput> element.', + false + ); + } + + /** + * Tests that the result contains SectionInput attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionInputAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'SectionInput', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.SectionInput+xml', + ) + ), + $result, + 'Invalid <SectionInput> attributes.', + false + ); + } + + /** + * Tests that the result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-section', + ), + $result, + 'Invalid or non-existing <SectionInput> identifier value element.', + false + ); + } + + /** + * Tests that the result contains name value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNameValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'name', + 'content' => 'Some Section', + ), + $result, + 'Invalid or non-existing <SectionInput> name value element.', + false + ); + } + + /** + * Gets the SectionUpdateStruct visitor + * + * @return \eZ\Publish\Core\REST\Client\Output\ValueObjectVisitor\SectionUpdateStruct + */ + protected function getSectionUpdateStructVisitor() + { + return new ValueObjectVisitor\SectionUpdateStruct( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/SetupFactory.php b/eZ/Publish/Core/REST/Client/Tests/SetupFactory.php new file mode 100644 index 0000000..2f88988 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/SetupFactory.php @@ -0,0 +1,58 @@ +<?php +/** + * File containing the Test Setup Factory for the REST SDK + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests; + +use eZ\Publish\Core\REST\Common; +use eZ\Publish\API\Repository; + +/** + * A Test Factory is used to setup the infrastructure for a tests, based on a + * specific repository implementation to test. + */ +class SetupFactory extends Repository\Tests\SetupFactory +{ + /** + * Returns a configured repository for testing. + * + * @param boolean $initializeFromScratch + * + * @return \eZ\Publish\API\Repository\Repository + */ + public function getRepository( $initializeFromScratch = true ) + { + return require __DIR__ . '/../../common.php'; + } + + /** + * Returns a repository specific ID manager. + * + * @return \eZ\Publish\API\Repository\Tests\IdManager + */ + public function getIdManager() + { + return new IdManager( + new Common\UrlHandler\eZPublish() + ); + } + + /** + * Returns a config value for $configKey. + * + * @param string $configKey + * + * @throws \Exception if $configKey could not be found. + * + * @return mixed + */ + public function getConfigValue( $configKey ) + { + throw new \RuntimeException( "REST implementation does not support config." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Tests/TestValueObject.php b/eZ/Publish/Core/REST/Client/Tests/TestValueObject.php new file mode 100644 index 0000000..0295147 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/TestValueObject.php @@ -0,0 +1,16 @@ +<?php +/** + * File containing the TestValueObject class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests; + +use eZ\Publish\API\Repository\Values\ValueObject; + +class TestValueObject extends ValueObject +{ +} diff --git a/eZ/Publish/Core/REST/Client/Tests/Values/ContentType/ContentTypeTest.php b/eZ/Publish/Core/REST/Client/Tests/Values/ContentType/ContentTypeTest.php new file mode 100644 index 0000000..d25b5ae --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Tests/Values/ContentType/ContentTypeTest.php @@ -0,0 +1,166 @@ +<?php +/** + * File containing the ContentTypeTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Tests\Values\ContentType; + +use eZ\Publish\Core\REST\Client\Values\ContentType\ContentType; +use eZ\Publish\Core\REST\Client\Values\ContentType\FieldDefinition; + +class ContentTypeTest extends \PHPUnit_Framework_TestCase +{ + protected $contentTypeServiceMock; + + public function setUp() + { + $this->contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentTypeService', + array(), + array(), + '', + false + ); + } + + public function testGetName() + { + $contentType = new ContentType( + $this->contentTypeServiceMock, + array( + 'names' => array( 'eng-US' => 'Sindelfingen', 'eng-GB' => 'Bielefeld' ) + ) + ); + + $this->assertEquals( + 'Sindelfingen', + $contentType->getName( 'eng-US' ) + ); + $this->assertEquals( + 'Bielefeld', + $contentType->getName( 'eng-GB' ) + ); + } + + public function testGetDescription() + { + $contentType = new ContentType( + $this->contentTypeServiceMock, + array( + 'descriptions' => array( 'eng-US' => 'Sindelfingen', 'eng-GB' => 'Bielefeld' ) + ) + ); + + $this->assertEquals( + 'Sindelfingen', + $contentType->getDescription( 'eng-US' ) + ); + $this->assertEquals( + 'Bielefeld', + $contentType->getDescription( 'eng-GB' ) + ); + } + + public function testGetFieldDefinitions() + { + $contentType = new ContentType( + $this->contentTypeServiceMock, + array( + 'fieldDefinitionListReference' => '/content/types/23/fieldDefinitions', + ) + ); + + $contentTypeServiceMock = $this->contentTypeServiceMock; + + $contentTypeServiceMock->expects( $this->once() ) + ->method( 'loadFieldDefinitionList' ) + ->with( $this->equalTo( '/content/types/23/fieldDefinitions' ) ) + ->will( $this->returnValue( $this->getFieldDefinitionListMock() ) ); + + $this->assertEquals( + $this->getFieldDefinitions(), + $contentType->getFieldDefinitions() + ); + } + + public function testGetFieldDefinition() + { + $contentType = new ContentType( + $this->contentTypeServiceMock, + array( + 'fieldDefinitionListReference' => '/content/types/23/fieldDefinitions', + ) + ); + + $contentTypeServiceMock = $this->contentTypeServiceMock; + + $contentTypeServiceMock->expects( $this->once() ) + ->method( 'loadFieldDefinitionList' ) + ->with( $this->equalTo( '/content/types/23/fieldDefinitions' ) ) + ->will( $this->returnValue( $this->getFieldDefinitionListMock() ) ); + + $fieldDefinitions = $this->getFieldDefinitions(); + + $this->assertEquals( + $fieldDefinitions[1], + $contentType->getFieldDefinition( 'second-field' ) + ); + } + + public function testGetFieldDefinitionFailure() + { + $contentType = new ContentType( + $this->contentTypeServiceMock, + array( + 'fieldDefinitionListReference' => '/content/types/23/fieldDefinitions', + ) + ); + + $contentTypeServiceMock = $this->contentTypeServiceMock; + + $contentTypeServiceMock->expects( $this->once() ) + ->method( 'loadFieldDefinitionList' ) + ->with( $this->equalTo( '/content/types/23/fieldDefinitions' ) ) + ->will( $this->returnValue( $this->getFieldDefinitionListMock() ) ); + + $this->assertEquals( + null, + $contentType->getFieldDefinition( 'non-existent' ) + ); + } + + protected function getFieldDefinitionListMock() + { + $mock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\Values\\FieldDefinitionList', + array(), + array(), + '', + false + ); + $mock->expects( $this->any() ) + ->method( 'getFieldDefinitions' ) + ->will( $this->returnValue( $this->getFieldDefinitions() ) ); + return $mock; + } + + protected function getFieldDefinitions() + { + return array( + new FieldDefinition( + array( + 'identifier' => 'first-field', + ) + ), + new FieldDefinition( + array( + 'identifier' => 'second-field', + ) + ), + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/TrashService.php b/eZ/Publish/Core/REST/Client/TrashService.php new file mode 100644 index 0000000..66bbb49 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/TrashService.php @@ -0,0 +1,252 @@ +<?php +/** + * File containing the TrashService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\TrashService as APITrashService; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\TrashItem as APITrashItem; +use eZ\Publish\Core\Repository\Values\Content\TrashItem; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Message; + +/** + * Trash service used for content/location trash handling. + * + * @package eZ\Publish\API\Repository + */ +class TrashService implements APITrashService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\LocationService + */ + private $locationService; + + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\LocationService $locationService + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( LocationService $locationService, HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->locationService = $locationService; + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Loads a trashed location object from its $id. + * + * Note that $id is identical to original location, which has been previously trashed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the trashed location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the location with the given id does not exist + * + * @param int $trashItemId + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function loadTrashItem( $trashItemId ) + { + $response = $this->client->request( + 'GET', + $trashItemId, + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'Location' ) ) + ) + ); + + $location = $this->inputDispatcher->parse( $response ); + return $this->buildTrashItem( $location ); + } + + /** + * Sends $location and all its children to trash and returns the corresponding trash item. + * + * Content is left untouched. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to trash the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function trash( Location $location ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Recovers the $trashedLocation at its original place if possible. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to recover the trash item at the parent location location + * + * If $newParentLocation is provided, $trashedLocation will be restored under it. + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created or recovered location + */ + public function recover( APITrashItem $trashItem, Location $newParentLocation = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Empties trash. + * + * All locations contained in the trash will be removed. Content objects will be removed + * if all locations of the content are gone. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to empty the trash + */ + public function emptyTrash() + { + $response = $this->client->request( + 'DELETE', + $this->urlHandler->generate( 'trashItems' ), + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Location" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'Location' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Deletes a trash item. + * + * The corresponding content object will be removed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete this trash item + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + */ + public function deleteTrashItem( APITrashItem $trashItem ) + { + $response = $this->client->request( + 'DELETE', + $trashItem->id, + new Message( + // @todo: What media-type should we set here? Actually, it should be + // all expected exceptions + none? Or is "Location" correct, + // since this is what is to be expected by the resource + // identified by the URL? + array( 'Accept' => $this->outputVisitor->getMediaType( 'Location' ) ) + ) + ); + + if ( !empty( $response->body ) ) + $this->inputDispatcher->parse( $response ); + } + + /** + * Returns a collection of Trashed locations contained in the trash. + * + * $query allows to filter/sort the elements to be contained in the collection. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * + * @return \eZ\Publish\API\Repository\Values\Content\SearchResult + */ + public function findTrashItems( Query $query ) + { + $response = $this->client->request( + 'GET', + $this->urlHandler->generate( 'trashItems' ), + new Message( + array( 'Accept' => $this->outputVisitor->getMediaType( 'LocationList' ) ) + ) + ); + + $locations = $this->inputDispatcher->parse( $response ); + + $trashItems = array(); + foreach ( $locations as $location ) + { + $trashItems[] = $this->buildTrashItem( $location ); + } + return $trashItems; + } + + /** + * Converts the Location value object to TrashItem value object + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + protected function buildTrashItem( Location $location ) + { + return new TrashItem( + array( + 'contentInfo' => $location->contentInfo, + 'id' => $location->id, + 'priority' => $location->priority, + 'hidden' => $location->hidden, + 'invisible' => $location->invisible, + 'remoteId' => $location->remoteId, + 'parentLocationId' => $location->parentLocationId, + 'pathString' => $location->pathString, + 'depth' => (int)$location->depth, + 'sortField' => $location->sortField, + 'sortOrder' => $location->sortOrder, + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/URLAliasService.php b/eZ/Publish/Core/REST/Client/URLAliasService.php new file mode 100644 index 0000000..4559964 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/URLAliasService.php @@ -0,0 +1,216 @@ +<?php +/** + * File containing the URLAliasService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\URLAliasService as APIURLAliasService; +use eZ\Publish\API\Repository\Values\Content\Location; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\URLAliasService} + * interface. + * + * @see \eZ\Publish\API\Repository\URLAliasService + */ +class URLAliasService implements APIURLAliasService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed $id + * + * @private + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Create a user chosen $alias pointing to $location in $languageCode. + * + * This method runs URL filters and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * $alwaysAvailable makes the alias available in all languages. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $path + * @param string $languageCode the languageCode for which this alias is valid + * @param boolean $forwarding if true a redirect is performed + * @param boolean $alwaysAvailable + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createUrlAlias( Location $location, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * This method runs URL filters and and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * + * $alwaysAvailable makes the alias available in all languages. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given + * language or if resource is not valid + * + * @param string $resource + * @param string $path + * @param string $languageCode + * @param boolean $forwarding + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createGlobalUrlAlias( $resource, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * List of url aliases pointing to $location. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * @param string $languageCode filters those which are valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listLocationAliases( Location $location, $custom = true, $languageCode = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * List global aliases + * + * @param string $languageCode filters those which are valid for the given language + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listGlobalAliases( $languageCode = null, $offset = 0, $limit = -1 ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Removes urls aliases. + * + * This method does not remove autogenerated aliases for locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if alias list contains + * autogenerated alias + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias[] $aliasList + * + * @return void + */ + public function removeAliases( array $aliasList ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * looks up the URLAlias for the given url. + * + * @param string $url + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the path does not exist or is not valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function lookup( $url, $languageCode = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Returns the URL alias for the given location in the given language. + * + * If $languageCode is null the method returns the url alias in the most prioritized language. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if no url alias exist for the given language + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function reverseLookup( Location $location, $languageCode = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function load( $id ) + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/UserService.php b/eZ/Publish/Core/REST/Client/UserService.php new file mode 100644 index 0000000..9dce7b4 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/UserService.php @@ -0,0 +1,381 @@ +<?php +/** + * File containing the UserService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client; + +use eZ\Publish\API\Repository\UserService as APIUserService; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\UserCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserUpdateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroup; +use eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\UserService} + * interface. + * + * @see \eZ\Publish\API\Repository\UserService + */ +class UserService implements APIUserService, Sessionable +{ + /** + * @var \eZ\Publish\Core\REST\Client\HttpClient + */ + private $client; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + private $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + private $outputVisitor; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + private $urlHandler; + + /** + * @param \eZ\Publish\Core\REST\Client\HttpClient $client + * @param \eZ\Publish\Core\REST\Common\Input\Dispatcher $inputDispatcher + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $outputVisitor + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( HttpClient $client, Dispatcher $inputDispatcher, Visitor $outputVisitor, UrlHandler $urlHandler ) + { + $this->client = $client; + $this->inputDispatcher = $inputDispatcher; + $this->outputVisitor = $outputVisitor; + $this->urlHandler = $urlHandler; + } + + /** + * Set session ID + * + * Only for testing + * + * @param mixed tringid + * + * @private + * + * @return void + */ + public function setSession( $id ) + { + if ( $this->outputVisitor instanceof Sessionable ) + { + $this->outputVisitor->setSession( $id ); + } + } + + /** + * Creates a new user group using the data provided in the ContentCreateStruct parameter + * + * In 4.x in the content type parameter in the profile is ignored + * - the content type is determined via configuration and can be set to null. + * The returned version is published. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $userGroupCreateStruct a structure for setting all necessary data to create this user group + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $parentGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the input structure has invalid data + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing + */ + public function createUserGroup( UserGroupCreateStruct $userGroupCreateStruct, UserGroup $parentGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads a user group for the given id + * + * @param int $id + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the user group with the given id was not found + */ + public function loadUserGroup( $id ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads the sub groups of a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the user group + */ + public function loadSubUserGroups( UserGroup $userGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Removes a user group + * + * the users which are not assigned to other groups will be deleted. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + */ + public function deleteUserGroup( UserGroup $userGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Moves the user group to another parent + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $newParent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + */ + public function moveUserGroup( UserGroup $userGroup, UserGroup $newParent ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Updates the group profile with fields and meta data + * + * 4.x: If the versionUpdateStruct is set in $userGroupUpdateStruct, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explititely required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct $userGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + */ + public function updateUserGroup( UserGroup $userGroup, UserGroupUpdateStruct $userGroupUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Create a new user. The created user is published by this method + * + * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user + * @param array $parentGroups the groups of type {@link \eZ\Publish\API\Repository\Values\User\UserGroup} which are assigned to the user after creation + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user group was not found + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a user with provided login already exists + */ + public function createUser( UserCreateStruct $userCreateStruct, array $parentGroups ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads a user + * + * @param int $userId + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + */ + public function loadUser( $userId ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads anonymous user + * + * @uses loadUser() + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function loadAnonymousUser() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads a user for the given login and password + * + * @param string $login + * @param string $password the plain password + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given credentials was not found + */ + public function loadUserByCredentials( $login, $password ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * This method deletes a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete the user + */ + public function deleteUser( User $user ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Updates a user + * + * 4.x: If the versionUpdateStruct is set in the user update structure, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explititely required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserUpdateStruct $userUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update the user + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function updateUser( User $user, UserUpdateStruct $userUpdateStruct ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Assigns a new user group to the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign the user group to the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is already in the given user group + */ + public function assignUserToUserGroup( User $user, UserGroup $userGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Removes a user group from the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove the user group from the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is not in the given user group + */ + public function unAssignUserFromUserGroup( User $user, UserGroup $userGroup ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads the user groups ther user belongs to + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed read the user or user group + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + */ + public function loadUserGroupsOfUser( User $user) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Loads the users of a user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the users or user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\User\User[] + */ + public function loadUsersOfUserGroup( UserGroup $userGroup, $offset = 0, $limit = -1) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiate a user create class + * + * @param string $login the login of the new user + * @param string $email the email of the new user + * @param string $password the plain password of the new user + * @param string $mainLanguageCode the main language for the underlying content object + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserCreateStruct + */ + public function newUserCreateStruct( $login, $email, $password, $mainLanguageCode, $contentType = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiate a user group create class + * + * @param string $mainLanguageCode The main language for the underlying content object + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + */ + public function newUserGroupCreateStruct( $mainLanguageCode, $contentType = null ) + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiate a new user update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserUpdateStruct + */ + public function newUserUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } + + /** + * Instantiate a new user group update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct + */ + public function newUserGroupUpdateStruct() + { + throw new \Exception( "@todo: Implement." ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/Content.php b/eZ/Publish/Core/REST/Client/Values/Content/Content.php new file mode 100644 index 0000000..9ef1668 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/Content.php @@ -0,0 +1,170 @@ +<?php +/** + * File containing the Content class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +use eZ\Publish\Core\REST\Client\ContentService; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\Content} + * class. + * + * @see \eZ\Publish\API\Repository\Values\Content\Content + * @property-read \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo convenience getter for $versionInfo->contentInfo + * @property-read \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType convenience getter for $versionInfo->contentInfo->contentType + * @property-read mixed $id convenience getter for retrieving the contentId: $versionInfo->content->id + * @property-read \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo calls getVersionInfo() + * @property-read \eZ\Publish\API\Repository\Values\Content\Field[] $fields access fields, calls getFields() + * + * @todo Implement convenience property access! + */ +class Content extends \eZ\Publish\API\Repository\Values\Content\Content +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[][] Array of array of field values like $fields[$fieldDefIdentifier][$languageCode] + */ + protected $fields; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + protected $versionInfo; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + private $internalFields; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentService; + + /** + * Creates a new struct from the given $data array + * + * @param ContentService $contentService + * @param array $data + * + * @access protected + */ + function __construct( ContentService $contentService, array $data = array() ) + { + $this->contentService = $contentService; + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + foreach ( $this->internalFields as $field ) + { + $this->fields[$field->fieldDefIdentifier][$field->languageCode] = $field; + } + } + + /** + * Returns the VersionInfo for this version + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function getVersionInfo() + { + return $this->versionInfo; + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + if ( null === $languageCode ) + { + $languageCode = $this->versionInfo->contentInfo->mainLanguageCode; + } + + if ( isset( $this->fields[$fieldDefIdentifier][$languageCode] ) ) + { + return $this->fields[$fieldDefIdentifier][$languageCode]->value; + } + + return null; + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} + */ + public function getFields() + { + return $this->internalFields; + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If not set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} with field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + $fields = array(); + + if ( null === $languageCode ) + { + $languageCode = $this->versionInfo->contentInfo->mainLanguageCode; + } + + foreach ( $this->getFields() as $field ) + { + if ( $field->languageCode === $languageCode ) + { + $fields[$field->fieldDefIdentifier] = $field; + } + } + + return $fields; + } + + /** + * This method returns the field for a given field definition identifier and language + * + * If not set the initialLanguage of the content version is used. + * + * @param string $fieldDefIdentifier + * @param string|null $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field|null A {@link Field} or null if nothing is found + */ + public function getField( $fieldDefIdentifier, $languageCode = null ) + { + if ( null === $languageCode ) + { + $languageCode = $this->versionInfo->contentInfo->mainLanguageCode; + } + + if ( isset( $this->fields[$fieldDefIdentifier][$languageCode] ) ) + { + return $this->fields[$fieldDefIdentifier][$languageCode]; + } + + return null; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/ContentCreateStruct.php b/eZ/Publish/Core/REST/Client/Values/Content/ContentCreateStruct.php new file mode 100644 index 0000000..ad87466 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/ContentCreateStruct.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the ContentCreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ +class ContentCreateStruct extends \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected $fields = array(); + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( null === $language && $this->contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable ) + { + $language = $this->mainLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/ContentInfo.php b/eZ/Publish/Core/REST/Client/Values/Content/ContentInfo.php new file mode 100644 index 0000000..403718d --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/ContentInfo.php @@ -0,0 +1,69 @@ +<?php +/** + * File containing the ContentInfo class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +use eZ\Publish\Core\REST\Client\ContentTypeService; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\ContentInfo} + * class. + * + * @property-read eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType calls {@link getContentType()} + * @property-read mixed $id The unique id of the content object + * @property-read string $name the computed name (via name schema) in the main language of the content object + * @property-read mixed $sectionId the section to which the content is assigned + * @property-read int $currentVersionNo Current Version number is the version number of the published version or the version number of a newly created draft (which is 1). + * @property-read boolean $published true if there exists a published version false otherwise + * @property-read mixed $ownerId the user id of the owner of the content + * @property-read \DateTime $modificationDate Content modification date + * @property-read \DateTime $publishedDate date of the last publish operation + * @property-read boolean $alwaysAvailable Indicates if the content object is shown in the mainlanguage if its not present in an other requested language + * @property-read string $remoteId a global unique id of the content object + * @property-read string $mainLanguageCode The main language code of the content. If the available flag is set to true the content is shown in this language if the requested language does not exist. + * @property-read mixed $mainLocationId Identifier of the main location. + * @see \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ +class ContentInfo extends \eZ\Publish\API\Repository\Values\Content\ContentInfo +{ + /** + * @var int + */ + protected $contentTypeId; + + /** + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + protected $contentTypeService; + + public function __construct( ContentTypeService $contentTypeService, array $data = array() ) + { + parent::__construct( $data ); + $this->contentTypeService = $contentTypeService; + } + + /** + * The content type of this content object + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function getContentType() + { + return $this->contentTypeService->loadContentType( $this->contentTypeId ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentType': + return $this->getContentType(); + } + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/ContentUpdateStruct.php b/eZ/Publish/Core/REST/Client/Values/Content/ContentUpdateStruct.php new file mode 100644 index 0000000..8a66db9 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/ContentUpdateStruct.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the ContentUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct + */ +class ContentUpdateStruct extends \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected $fields = array(); + + /** + * Adds a field to the field collection. + * This method could also be implemented by ArrayAccess so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * @param mixed $value Either a plain value which is understandable by the field type or an instance of a Value class provided by the field type + * @param boolean|string $languageCode If not given on a translatable field the initial language is used, + */ + public function setField( $fieldDefIdentifier, $value, $languageCode = null ) + { + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $languageCode + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/Location.php b/eZ/Publish/Core/REST/Client/Values/Content/Location.php new file mode 100644 index 0000000..e365024 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/Location.php @@ -0,0 +1,36 @@ +<?php +/** + * File containing the Location class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\Location} + * class. + * + * @see \eZ\Publish\API\Repository\Values\Content\Location + */ +class Location extends \eZ\Publish\API\Repository\Values\Content\Location +{ + /** + * ContentInfo + * + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $contentInfo; + + /** + * Returns the content info of the content object of this location + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getContentInfo() + { + return $this->contentInfo; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/Relation.php b/eZ/Publish/Core/REST/Client/Values/Content/Relation.php new file mode 100644 index 0000000..419aec8 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/Relation.php @@ -0,0 +1,54 @@ +<?php +/** + * File containing the Relation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\Relation} + * class. + * + * @see \eZ\Publish\API\Repository\Values\Content\Relation + */ +class Relation extends \eZ\Publish\API\Repository\Values\Content\Relation +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $sourceContentInfo; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $destinationContentInfo; + + /** + * @var int + */ + protected $type; + + /** + * the content of the source content of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getSourceContentInfo() + { + return $this->sourceContentInfo; + } + + /** + * the content of the destination content of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getDestinationContentInfo() + { + return $this->destinationContentInfo; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/TrashItem.php b/eZ/Publish/Core/REST/Client/Values/Content/TrashItem.php new file mode 100644 index 0000000..f21159c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/TrashItem.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the TrashItem class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\Content\TrashItem} + * class. + * + * @see \eZ\Publish\API\Repository\Values\Content\TrashItem + */ +class TrashItem extends \eZ\Publish\API\Repository\Values\Content\TrashItem +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Location + */ + protected $location; + + /** + * Returns the content info of the content object of this location + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getContentInfo() + { + return $this->location->getContentInfo(); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'id': + return $this->getContentInfo()->id; + } + return parent::__get( $property ); + } + +} diff --git a/eZ/Publish/Core/REST/Client/Values/Content/VersionInfo.php b/eZ/Publish/Core/REST/Client/Values/Content/VersionInfo.php new file mode 100644 index 0000000..92be001 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/Content/VersionInfo.php @@ -0,0 +1,110 @@ +<?php +/** + * File containing the VersionInfo class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\Content; + +use eZ\Publish\Core\REST\Client\ContentService; + +/** + * This class holds version information data. It also contains the corresponding {@link Content} to + * which the version belongs to. + * + * @see \eZ\Publish\API\Repository\Values\Content\VersionInfo + * + * @property-read \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo calls getContentInfo() + * @property-read mixed $id the internal id of the version + * @property-read int $versionNo the version number of this version (which only increments in scope of a single Content object) + * @property-read \DateTime $modificationDate the last modified date of this version + * @property-read \DateTime $creationDate the creation date of this version + * @property-read mixed $creatorId the user id of the user which created this version + * @property-read int $status the status of this version. One of VersionInfo::STATUS_DRAFT, VersionInfo::STATUS_PUBLISHED, VersionInfo::STATUS_ARCHIVED + * @property-read string $initialLanguageCode the language code of the version. This value is used to flag a version as a translation to specific language + * @property-read array $languageCodes a collection of all languages which exist in this version. + */ +class VersionInfo extends \eZ\Publish\API\Repository\Values\Content\VersionInfo +{ + /** + * @var \eZ\Publish\Core\REST\Client\ContentService + */ + protected $contentService; + + /** + * @var string + */ + protected $contentInfoId; + + /** + * @var string[] + */ + protected $names; + + public function __construct( ContentService $contentService, array $data = array() ) + { + parent::__construct( $data ); + + $this->contentService = $contentService; + } + + /** + * Content of the content this version belongs to. + * + * @return ContentInfo + */ + public function getContentInfo() + { + return $this->contentService->loadContentInfo( $this->contentInfoId ); + } + + /** + * Returns the names computed from the name schema in the available languages. + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * Returns the name computed from the name schema in the given language. + * If no language is given the name in initial language of the version if present, otherwise null. + * + * @param string $languageCode + * + * @return string + */ + public function getName( $languageCode = null ) + { + if ( $languageCode === null ) + { + $languageCode = $this->initialLanguageCode; + } + return $this->names[$languageCode]; + } + + public function __get( $propertyName ) + { + switch( $propertyName ) + { + case 'contentInfo': + return $this->getContentInfo(); + } + return parent::__get( $propertyName ); + } + + public function __isset( $propertyName ) + { + switch( $propertyName ) + { + case 'contentInfo': + return true; + } + return parent::__isset( $propertyName ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/ContentType/ContentType.php b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentType.php new file mode 100644 index 0000000..add6e32 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentType.php @@ -0,0 +1,175 @@ +<?php + +namespace eZ\Publish\Core\REST\Client\Values\ContentType; + +use eZ\Publish\Core\REST\Client\ContentTypeService; + +/** + * this class represents a content type value + * + * @property-read array $names calls getNames() or on access getName($language) + * @property-read array $descriptions calls getDescriptions() or on access getDescription($language) + * @property-read array $contentTypeGroups calls getContentTypeGroups + * @property-read array $fieldDefinitions calls getFieldDefinitions() or on access getFieldDefinition($fieldDefIdentifier) + * @property-read int $id the id of the content type + * @property-read int $status the status of the content type. One of ContentType::STATUS_DEFINED|ContentType::STATUS_DRAFT|ContentType::STATUS_MODIFIED + * @property-read string $identifier the identifier of the content type + * @property-read \DateTime $creationDate the date of the creation of this content type + * @property-read \DateTime $modificationDate the date of the last modification of this content type + * @property-read int $creatorId the user id of the creator of this content type + * @property-read int $modifierId the user id of the user which has last modified this content type + * @property-read string $remoteId a global unique id of the content object + * @property-read string $urlAliasSchema URL alias schema. If nothing is provided, $nameSchema will be used instead. + * @property-read string $nameSchema The name schema. + * @property-read boolean $isContainer Determines if the type is allowd to have children + * @property-read string $mainLanguageCode the main language of the content type names and description used for fallback. + * @property-read boolean $defaultAlwaysAvailable if an instance of acontent type is created the always available flag is set by default this this value. + * @property-read int $defaultSortField Specifies which property the child locations should be sorted on by default when created. Valid values are found at {@link Location::SORT_FIELD_*} + * @property-read int $defaultSortOrder Specifies whether the sort order should be ascending or descending by default when created. Valid values are {@link Location::SORT_ORDER_*} + * + * @todo Implement access to field definitions (array and by identifier) + * @todo Implement fetching of content type groups + */ +class ContentType extends \eZ\Publish\API\Repository\Values\ContentType\ContentType +{ + /** + * Content type service to fetch additional information from + * + * @var \eZ\Publish\Core\REST\Client\ContentTypeService + */ + protected $contentTypeService; + + /** + * Contains the human readable name in all provided languages of the + * content type + * + * @var string[] + */ + protected $names; + + /** + * Contains the human readable description of the content type + * + * @var string[] + */ + protected $descriptions; + + /** + * Carries the URL for the list of FieldDefinitions for the type + * + * @var string + */ + protected $fieldDefinitionListReference; + + /** + * @param ContentTypeService $contentTypeService + * @param array $data + */ + public function __construct( ContentTypeService $contentTypeService, array $data = array() ) + { + $this->contentTypeService = $contentTypeService; + + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none existis. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none existis. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function getContentTypeGroups() + { + // @todo: Implement! + } + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public function getFieldDefinitions() + { + $fieldDefinitionList = $this->contentTypeService->loadFieldDefinitionList( + $this->fieldDefinitionListReference + ); + return $fieldDefinitionList->getFieldDefinitions(); + } + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return FieldDefinition + */ + public function getFieldDefinition( $fieldDefinitionIdentifier ) + { + $fieldDefinitions = $this->getFieldDefinitions(); + foreach ( $fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier === $fieldDefinitionIdentifier ) + { + return $fieldDefinition; + } + } + return null; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeCreateStruct.php b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeCreateStruct.php new file mode 100644 index 0000000..781cb3f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeCreateStruct.php @@ -0,0 +1,27 @@ +<?php +namespace eZ\Publish\Core\REST\Client\Values\ContentType; + +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; + +class ContentTypeCreateStruct extends \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct +{ + protected $fieldDefinitions = array(); + + function __construct( array $data = array() ) + { + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * Adds a new field definition + * + * @param FieldDefinitionCreate $fieldDef + */ + public function addFieldDefinition( FieldDefinitionCreateStruct $fieldDef ) + { + $this->fieldDefinitions[] = $fieldDef; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeDraft.php b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeDraft.php new file mode 100644 index 0000000..2ccfd2f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeDraft.php @@ -0,0 +1,144 @@ +<?php + +namespace eZ\Publish\Core\REST\Client\Values\ContentType; + +use eZ\Publish\API\Repository\Values; + +/** + * + * This class represents a draft of a content type + * + */ +class ContentTypeDraft extends \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft +{ + /** + * ContentType encapsulated in the draft + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected $innerContentType; + + /** + * Creates a new draft with $innerContentType + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $innerContentType + */ + public function __construct( Values\ContentType\ContentType $innerContentType ) + { + $this->innerContentType = $innerContentType; + } + + /** + * Returns the inner content type. + * + * ONLY FOR INTERNAL USE IN THE INTEGRATION TEST SUITE. + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function getInnerContentType() + { + return $this->innerContentType; + } + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->innerContentType->getNames(); + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none existis. + */ + public function getName( $languageCode ) + { + return $this->innerContentType->getName( $languageCode ); + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->innerContentType->getDescriptions(); + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none existis. + */ + public function getDescription( $languageCode ) + { + return $this->innerContentType->getDescription( $languageCode ); + } + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function getContentTypeGroups() + { + return $this->innerContentType->getContentTypeGroups(); + } + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public function getFieldDefinitions() + { + return $this->innerContentType->getFieldDefinitions(); + } + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinition( $fieldDefinitionIdentifier ) + { + return $this->innerContentType->getFieldDefinition( $fieldDefinitionIdentifier ); + } + + public function __get( $propertyName ) + { + return $this->innerContentType->$propertyName; + } + + public function __set( $propertyName, $propertyValue ) + { + $this->innerContentType->$propertyName = $propertyValue; + } + + public function __isset( $propertyName ) + { + return isset( $this->innerContentType->$propertyName ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeGroup.php b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeGroup.php new file mode 100644 index 0000000..704e33d --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/ContentType/ContentTypeGroup.php @@ -0,0 +1,83 @@ +<?php +/** + * File containing the ContentTypeGroup class + * + * @copyright Copyright (C) 1999-2011 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\ContentType; + +class ContentTypeGroup extends \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup +{ + protected $names; + + protected $descriptions; + + function __construct( array $data = array() ) + { + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * 5.x only + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * 5.x only + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none existis. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * 5.x only + * This method returns the human readable description of the content type + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * 5.x only + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none existis. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/ContentType/FieldDefinition.php b/eZ/Publish/Core/REST/Client/Values/ContentType/FieldDefinition.php new file mode 100644 index 0000000..52336e0 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/ContentType/FieldDefinition.php @@ -0,0 +1,136 @@ +<?php + +namespace eZ\Publish\Core\REST\Client\Values\ContentType; + +/** + * + * This class represents a field definition + * @property-read $names calls getNames() or on access getName($language) + * @property-read $descriptions calls getDescriptions() or on access getDescription($language) + * @property-read $fieldSettings calls getFieldSettings() + * @property-read mixed $validators calls getValidatorConfiguration() + * @property-read int $id the id of the field definition + * @property-read string $identifier the identifier of the field definition + * @property-read string $fieldGroup the field group name + * @property-read int $position the position of the field definition in the content typr + * @property-read string $fieldType String identifier of the field type + * @property-read boolean $isTranslatable indicatats if fields of this definition are translatable + * @property-read boolean $isRequired indicates if this field is required in the content object + * @property-read boolean $isSearchable indicates if the field is searchable + * @property-read boolean $isInfoCollector indicates if this field is used for information collection + * @property-read $defaultValue the default value of the field + */ +class FieldDefinition extends \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition +{ + /** + * Contains the human readable name of this field in all provided languages + * of the content type + * + * @var string[] + */ + protected $names; + + /** + * Contains the human readable description of the field + * + * @var string[] + */ + protected $descriptions; + + /** + * Contains the validators of this field definition supported by the field type# + * + * @var \eZ\Publish\Core\FieldType\Validator[] + */ + protected $validators; + + /** + * Contains settings for the field definition supported by the field type + * + * @var array + */ + protected $fieldSettings; + + function __construct( array $data = array() ) + { + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + } + + /** + * This method returns the human readable name of this field in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none existis. + */ + public function getName( $languageCode ) + { + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the field + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none existis. + */ + public function getDescription( $languageCode ) + { + return $this->descriptions[$languageCode]; + } + + /** + * This method returns the validators of this field definition supported by the field type + * + * @return \eZ\Publish\Core\FieldType\Validator[] + */ + public function getValidatorConfiguration() + { + return $this->validators; + } + + /** + * This method returns settings for the field definition supported by the field type + * + * @return array + */ + public function getFieldSettings() + { + return $this->fieldSettings; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/FieldDefinitionList.php b/eZ/Publish/Core/REST/Client/Values/FieldDefinitionList.php new file mode 100644 index 0000000..7202852 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/FieldDefinitionList.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the FieldDefinitionList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values; + +use eZ\Publish\Core\REST\Client\ContentTypeService; + +/** + * FieldDefinitonList + */ +class FieldDefinitionList +{ + /** + * References to contained field references + * + * @var string[] + */ + protected $fieldDefinitionReferences; + + /** + * Content type service + * + * @var ContentTypeService + */ + protected $contentTypeService; + + /** + * @param \eZ\Publish\Core\REST\ContentTypeService $contentTypeService + * @param string[] $fieldDefinitionReferences + */ + public function __construct( ContentTypeService $contentTypeService, array $fieldDefinitionReferences ) + { + $this->contentTypeService = $contentTypeService; + $this->fieldDefinitionReferences = $fieldDefinitionReferences; + } + + /** + * Fetches and returnd the field definitions contained in the list + * + * @return FieldDefinition[] + */ + public function getFieldDefinitions() + { + $fieldDefinitions = array(); + foreach ( $this->fieldDefinitionReferences as $reference ) + { + $fieldDefinitions[] = $this->contentTypeService->loadFieldDefinition( $reference ); + } + return $fieldDefinitions; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/RestContentInfo.php b/eZ/Publish/Core/REST/Client/Values/RestContentInfo.php new file mode 100644 index 0000000..0d2ab8f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/RestContentInfo.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the RestContentInfo class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Subset of ContentInfo submitted by REST + some info submitted in addition + */ +class RestContentInfo extends ValueObject +{ + protected $id; + protected $name; + protected $contentTypeId; + protected $ownerId; + protected $modificationDate; + protected $publishedDate; + protected $published; + protected $alwaysAvailable; + protected $remoteId; + protected $mainLanguageCode; + protected $mainLocationId; + protected $sectionId; + + protected $versionListReference; + protected $currentVersionReference; + protected $locationListReference; +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/Policy.php b/eZ/Publish/Core/REST/Client/Values/User/Policy.php new file mode 100644 index 0000000..51d46ba --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/Policy.php @@ -0,0 +1,32 @@ +<?php +/** + * File containing the Policy class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\Policy} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\Policy + */ +class Policy extends \eZ\Publish\API\Repository\Values\User\Policy +{ + /** + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + protected $limitations = array(); + + /** + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/PolicyCreateStruct.php b/eZ/Publish/Core/REST/Client/Values/User/PolicyCreateStruct.php new file mode 100644 index 0000000..408248c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/PolicyCreateStruct.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing the PolicyCreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +use eZ\Publish\API\Repository\Values\User\Limitation; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct + */ +class PolicyCreateStruct extends \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct +{ + /** + * List of limitations added to policy + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + protected $limitations = array(); + + /** + * Instantiates a policy create struct. + * + * @param string $module + * @param string $function + */ + public function __construct( $module, $function ) + { + parent::__construct( + array( + 'module' => $module, + 'function' => $function + ) + ); + } + + /** + * Returns list of limitations added to policy + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } + + /** + * Adds a limitation with the given identifier and list of values + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + * + * @return void + */ + public function addLimitation( Limitation $limitation ) + { + $limitationIdentifier = $limitation->getIdentifier(); + $this->limitations[$limitationIdentifier] = $limitation; + } + +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/PolicyUpdateStruct.php b/eZ/Publish/Core/REST/Client/Values/User/PolicyUpdateStruct.php new file mode 100644 index 0000000..745ad95 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/PolicyUpdateStruct.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the PolicyUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +use eZ\Publish\API\Repository\Values\User\Limitation; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct + */ +class PolicyUpdateStruct extends \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct +{ + /** + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + private $limitations; + + /** + * Returns list of limitations added to policy + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } + + /** + * Adds a limitation to the policy - if a Limitation exists with the same identifier + * the existing limitation is replaced + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + * + * @return void + */ + public function addLimitation( Limitation $limitation ) + { + $this->limitations[] = $limitation; + } + +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/Role.php b/eZ/Publish/Core/REST/Client/Values/User/Role.php new file mode 100644 index 0000000..a0c9917 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/Role.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the Role class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\Role} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\Role + */ +class Role extends \eZ\Publish\API\Repository\Values\User\Role +{ + /** + * @var \eZ\Publish\API\Repository\Values\User\Policy[] + */ + protected $policies; + + /** + * Instantiates a role stub instance. + * + * @param array $properties + * @param \eZ\Publish\API\Repository\Values\User\Policy[] $policies + */ + public function __construct( array $properties = array(), array $policies = array() ) + { + parent::__construct( $properties ); + + $this->policies = $policies; + } + + /** + * Returns the list of policies of this role + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function getPolicies() + { + return $this->policies; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/RoleAssignment.php b/eZ/Publish/Core/REST/Client/Values/User/RoleAssignment.php new file mode 100644 index 0000000..efb3de7 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/RoleAssignment.php @@ -0,0 +1,55 @@ +<?php +/** + * File containing the Role class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +use eZ\Publish\API\Repository\Values; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\RoleAssignment} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\RoleAssignment + */ +class RoleAssignment extends Values\User\RoleAssignment +{ + /** + * the limitation of this role assignment + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + protected $limitation; + + /** + * the role which is assigned to the user + * + * @var \eZ\Publish\API\Repository\Values\User\Role + */ + protected $role; + + /** + * Returns the limitation of the user role assignment + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + public function getRoleLimitation() + { + return $this->limitation; + } + + /** + * Returns the role to which the user is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/RoleCreateStruct.php b/eZ/Publish/Core/REST/Client/Values/User/RoleCreateStruct.php new file mode 100644 index 0000000..61bebd6 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/RoleCreateStruct.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the RoleCreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +use eZ\Publish\API\Repository\Values; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\RoleCreateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\RoleCreateStruct + */ +class RoleCreateStruct extends \eZ\Publish\API\Repository\Values\User\RoleCreateStruct +{ + /** + * @var \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct[] + */ + private $policies = array(); + + /** + * Instantiates a role create class + * + * @param string $name + */ + public function __construct( $name ) + { + parent::__construct( array( 'identifier' => $name ) ); + } + + /** + * Returns policies associated with the role + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct[] + */ + public function getPolicies() + { + return $this->policies; + } + + /** + * Adds a policy to this role + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreateStruct + */ + public function addPolicy( Values\User\PolicyCreateStruct $policyCreateStruct ) + { + $this->policies[] = $policyCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/User.php b/eZ/Publish/Core/REST/Client/Values/User/User.php new file mode 100644 index 0000000..40d740c --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/User.php @@ -0,0 +1,98 @@ +<?php +/** + * File containing the User class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\User} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\User + */ +class User extends \eZ\Publish\API\Repository\Values\User\User +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + protected $content; + + /** + * Returns the VersionInfo for this version + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function getVersionInfo() + { + return $this->content->getVersionInfo(); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + return $this->content->getFieldValue( $fieldDefIdentifier, $languageCode ); + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public function getFields() + { + return $this->content->getFields(); + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] With field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + return $this->content->getFieldsByLanguage( $languageCode ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->content->contentInfo; + + case 'contentType': + return $this->content->contentType; + + case 'id': + return $this->content->id; + + case 'versionInfo': + return $this->getVersionInfo(); + + case 'fields': + return $this->getFields(); + } + + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/UserCreateStruct.php b/eZ/Publish/Core/REST/Client/Values/User/UserCreateStruct.php new file mode 100644 index 0000000..0b60fd5 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/UserCreateStruct.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the UserCreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\UserCreateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\UserCreateStruct + */ +class UserCreateStruct extends \eZ\Publish\API\Repository\Values\User\UserCreateStruct +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected $fields = array(); + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( null === $language && $this->contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable ) + { + $language = $this->mainLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/UserGroup.php b/eZ/Publish/Core/REST/Client/Values/User/UserGroup.php new file mode 100644 index 0000000..174da80 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/UserGroup.php @@ -0,0 +1,98 @@ +<?php +/** + * File containing the UserGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\UserGroup} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\UserGroup + */ +class UserGroup extends \eZ\Publish\API\Repository\Values\User\UserGroup +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + protected $content; + + /** + * Returns the VersionInfo for this version + * + * @return VersionInfo + */ + public function getVersionInfo() + { + return $this->content->getVersionInfo(); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + return $this->content->getFieldValue( $fieldDefIdentifier, $languageCode ); + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public function getFields() + { + return $this->content->getFields(); + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] With field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + return $this->content->getFieldsByLanguage( $languageCode ); + } + + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->content->contentInfo; + + case 'contentType': + return $this->content->contentType; + + case 'id': + return $this->content->id; + + case 'versionInfo': + return $this->getVersionInfo(); + + case 'fields': + return $this->getFields(); + } + + return parent::__get( $property ); + } +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/UserGroupCreateStruct.php b/eZ/Publish/Core/REST/Client/Values/User/UserGroupCreateStruct.php new file mode 100644 index 0000000..ed1d273 --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/UserGroupCreateStruct.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the UserGroupCreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + */ +class UserGroupCreateStruct extends \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected $fields = array(); + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( null === $language && $this->contentType->getFieldDefinition( $fieldDefIdentifier )->isTranslatable ) + { + $language = $this->mainLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } + +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/UserGroupRoleAssignment.php b/eZ/Publish/Core/REST/Client/Values/User/UserGroupRoleAssignment.php new file mode 100644 index 0000000..be5cf4a --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/UserGroupRoleAssignment.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing the UserGroupRoleAssignment class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment + */ +class UserGroupRoleAssignment extends \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment +{ + /** + * @var \eZ\Publish\API\Repository\Values\User\Role + */ + protected $role; + + /** + * @var \eZ\Publish\API\Repository\Values\User\UserGroup + */ + protected $userGroup; + + /** + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + protected $limitation; + + /** + * Returns the limitation of the role assignment + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + public function getRoleLimitation() + { + return $this->limitation; + } + + /** + * Returns the role to which the user or user group is assigned to + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Returns the user group to which the role is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + function getUserGroup() + { + return $this->userGroup; + } + +} diff --git a/eZ/Publish/Core/REST/Client/Values/User/UserRoleAssignment.php b/eZ/Publish/Core/REST/Client/Values/User/UserRoleAssignment.php new file mode 100644 index 0000000..4e9033f --- /dev/null +++ b/eZ/Publish/Core/REST/Client/Values/User/UserRoleAssignment.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing the UserRoleAssignment class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Client\Values\User; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Values\User\UserRoleAssignment} + * class. + * + * @see \eZ\Publish\API\Repository\Values\User\UserRoleAssignment + */ +class UserRoleAssignment extends \eZ\Publish\API\Repository\Values\User\UserRoleAssignment +{ + /** + * @var \eZ\Publish\API\Repository\Values\User\Role + */ + protected $role; + + /** + * @var \eZ\Publish\API\Repository\Values\User\User + */ + protected $user; + + /** + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + protected $limitation; + + /** + * Returns the limitation of the role assignment + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + public function getRoleLimitation() + { + return $this->limitation; + } + + /** + * Returns the role to which the user or user group is assigned to + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Returns the user to which the role is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + function getUser() + { + return $this->user; + } + +} diff --git a/eZ/Publish/Core/REST/Common/Exceptions/InvalidArgumentException.php b/eZ/Publish/Core/REST/Common/Exceptions/InvalidArgumentException.php new file mode 100644 index 0000000..d8e4df3 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Exceptions/InvalidArgumentException.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the InvalidArgumentException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Exceptions; + +/** + * + * This exception is thrown if a service method is called with an illegal or non appropriate value + * + */ +class InvalidArgumentException extends \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException +{ +} diff --git a/eZ/Publish/Core/REST/Common/Exceptions/NotFoundException.php b/eZ/Publish/Core/REST/Common/Exceptions/NotFoundException.php new file mode 100644 index 0000000..78cce3b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Exceptions/NotFoundException.php @@ -0,0 +1,20 @@ +<?php +/** + * File containing the NotFoundException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Implementation of the {@link \eZ\Publish\API\Repository\Exceptions\NotFoundException} + * interface. + * + * @see \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ +class NotFoundException extends \eZ\Publish\API\Repository\Exceptions\NotFoundException +{ +} diff --git a/eZ/Publish/Core/REST/Common/Exceptions/Parser.php b/eZ/Publish/Core/REST/Common/Exceptions/Parser.php new file mode 100644 index 0000000..fa1c881 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Exceptions/Parser.php @@ -0,0 +1,17 @@ +<?php +/** + * File containing the Parser Exception class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Exception thrown if a parser discovers an error. + */ +class Parser extends \InvalidArgumentException +{ +} diff --git a/eZ/Publish/Core/REST/Common/FieldTypeProcessor.php b/eZ/Publish/Core/REST/Common/FieldTypeProcessor.php new file mode 100644 index 0000000..6e8b2c3 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/FieldTypeProcessor.php @@ -0,0 +1,48 @@ +<?php +/** + * File containing the FieldTypeProcessor interface. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common; + +/** + * FieldTypeProcessor + */ +interface FieldTypeProcessor +{ + /** + * Perform manipulations on an a generated $outgoingValueHash + * + * This method is called by the REST server to allow a field type to post + * process the given $outgoingValueHash, which was previously generated + * using {@link eZ\Publish\SPI\FieldType\FieldType::toHash()}, before it is + * sent to the client. The return value of this method replaces + * $outgoingValueHash and must obey to the same rules as the original + * $outgoingValueHash. + * + * @param mixed $outgoingValueHash + * + * @return mixed Post processed hash + */ + public function postProcessHash( $outgoingValueHash ); + + /** + * Perform manipulations on a received $incomingValueHash + * + * This method is called by the REST server to allow a field type to pre + * process the given $incomingValueHash before it is handled by {@link + * eZ\Publish\SPI\FieldType\FieldType::fromHash()}. The $incomingValueHash + * can be expected to conform to the rules that need to apply to hashes + * accepted by fromHash(). The return value of this method replaces the + * $incomingValueHash. + * + * @param mixed $incomingValueHash + * + * @return mixed Pre processed hash + */ + public function preProcessHash( $incomingValueHash ); +} diff --git a/eZ/Publish/Core/REST/Common/FieldTypeProcessorRegistry.php b/eZ/Publish/Core/REST/Common/FieldTypeProcessorRegistry.php new file mode 100644 index 0000000..fefc098 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/FieldTypeProcessorRegistry.php @@ -0,0 +1,77 @@ +<?php +/** + * File containing the FieldTypeProcessorRegistry class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common; + +/** + * FieldTypeProcessorRegistry + */ +class FieldTypeProcessorRegistry +{ + /** + * Registered processors + * + * @var \eZ\Publish\Core\REST\Common\FieldTypeProcessor[] + */ + private $processors = array(); + + /** + * @param \eZ\Publish\Core\REST\Common\FieldTypeProcessor[] $processors + */ + public function __construct( array $processors = array() ) + { + foreach ( $processors as $fieldTypeIdentifier => $processor ) + { + $this->registerProcessor( $fieldTypeIdentifier, $processor ); + } + } + + /** + * Registers $processor for $fieldTypeIdentifier + * + * @param string $fieldTypeIdentifier + * @param \eZ\Publish\Core\REST\Common\FieldTypeProcessor $processor + */ + public function registerProcessor( $fieldTypeIdentifier, FieldTypeProcessor $processor ) + { + $this->processors[$fieldTypeIdentifier] = $processor; + } + + /** + * Returns if a processor is registered for $fieldTypeIdentifier + * + * @param string $fieldTypeIdentifier + * + * @return boolean + */ + public function hasProcessor( $fieldTypeIdentifier ) + { + return ( isset( $this->processors[$fieldTypeIdentifier] ) ); + } + + /** + * Returns the processor for $fieldTypeIdentifier + * + * @param string $fieldTypeIdentifier + * + * @throws \RuntimeException if not processor is registered for $fieldTypeIdentifier + * + * @return \eZ\Publish\Core\REST\Common\FieldTypeProcessor + */ + public function getProcessor( $fieldTypeIdentifier ) + { + if ( !$this->hasProcessor( $fieldTypeIdentifier ) ) + { + throw new \RuntimeException( + "No field type processor for '{$fieldTypeIdentifier}' found." + ); + } + return $this->processors[$fieldTypeIdentifier]; + } +} diff --git a/eZ/Publish/Core/REST/Common/Input/Dispatcher.php b/eZ/Publish/Core/REST/Common/Input/Dispatcher.php new file mode 100644 index 0000000..35535d7 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/Dispatcher.php @@ -0,0 +1,111 @@ +<?php +/** + * File containing the Input Dispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input; + +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Input dispatcher + */ +class Dispatcher +{ + /** + * Array of handlers + * + * Structure: + * + * <code> + * array( + * <type> => <handler>, + * … + * ) + * </code> + * + * @var array + */ + protected $handlers = array(); + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher + */ + protected $parsingDispatcher; + + /** + * Construct from optional parsers array + * + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * @param array $handlers + */ + public function __construct( ParsingDispatcher $parsingDispatcher, array $handlers = array() ) + { + $this->parsingDispatcher = $parsingDispatcher; + foreach ( $handlers as $type => $handler ) + { + $this->addHandler( $type, $handler ); + } + } + + /** + * Adds another handler for the given Content Type + * + * @param string $type + * @param \eZ\Publish\Core\REST\Common\Input\Handler $handler + */ + public function addHandler( $type, Handler $handler ) + { + $this->handlers[$type] = $handler; + } + + /** + * Parse provided request + * + * @param \eZ\Publish\Core\REST\Common\Message $message + * + * @return mixed + */ + public function parse( Message $message ) + { + if ( !isset( $message->headers['Content-Type'] ) ) + { + throw new Exceptions\Parser( 'Missing Content-Type header in message.' ); + } + + $contentTypeParts = explode( '+', $message->headers['Content-Type'] ); + if ( count( $contentTypeParts ) !== 2 ) + { + throw new Exceptions\Parser( "No format specification in content type. Missing '+(json|xml|…)' in '{$message->headers['Content-Type']}'." ); + } + + $media = $contentTypeParts[0]; + $format = $contentTypeParts[1]; + + if ( !isset( $this->handlers[$format] ) ) + { + throw new Exceptions\Parser( "Unknown format specification: '{$format}'." ); + } + + $rawArray = $this->handlers[$format]->convert( $message->body ); + + // Only 1 XML root node + $rootNodeArray = reset( $rawArray ); + + // @todo: This needs to be refactored in order to make the called URL + // available to parsers in the server in a sane way + if ( isset( $message->headers['Url'] ) ) + { + $rootNodeArray['__url'] = $message->headers['Url']; + } + + return $this->parsingDispatcher->parse( + $rootNodeArray, $media + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Input/FieldTypeParser.php b/eZ/Publish/Core/REST/Common/Input/FieldTypeParser.php new file mode 100644 index 0000000..c84dbe6 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/FieldTypeParser.php @@ -0,0 +1,129 @@ +<?php +/** + * File containing the Input FieldTypeParser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input; + +use eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry; + +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\API\Repository\FieldTypeService; + +class FieldTypeParser +{ + /** + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * @var \eZ\Publish\API\Repository\FieldTypeService + */ + protected $fieldTypeService; + + /** + * @var \eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry + */ + protected $fieldTypeProcessorRegistry; + + /** + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\API\Repository\FieldTypeService $fieldTypeService + * @param \eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry $fieldTypeProcessorRegistry + */ + public function __construct( + ContentService $contentService, + ContentTypeService $contentTypeService, + FieldTypeService $fieldTypeService, + FieldTypeProcessorRegistry $fieldTypeProcessorRegistry ) + { + $this->contentService = $contentService; + $this->contentTypeService = $contentTypeService; + $this->fieldTypeService = $fieldTypeService; + $this->fieldTypeProcessorRegistry = $fieldTypeProcessorRegistry; + } + + /** + * Parses the given $value for the field $fieldDefIdentifier in the content + * identified by $contentInfoId + * + * @param string $contentInfoId + * @param string $fieldDefIdentifier + * @param mixed $value + * + * @return mixed + */ + public function parseFieldValue( $contentInfoId, $fieldDefIdentifier, $value ) + { + $contentInfo = $this->contentService->loadContentInfo( $contentInfoId ); + $contentType = $this->contentTypeService->loadContentType( $contentInfo->getContentType()->id ); + + $fieldDefinition = $contentType->getFieldDefinition( $fieldDefIdentifier ); + + return $this->parseValue( $fieldDefinition->fieldTypeIdentifier, $value ); + } + + /** + * Parses the given $value using the FieldType identified by + * $fieldTypeIdentifier + * + * @param mixed $fieldTypeIdentifier + * @param mixed $value + * + * @return mixed + */ + public function parseValue( $fieldTypeIdentifier, $value ) + { + $fieldType = $this->fieldTypeService->getFieldType( $fieldTypeIdentifier ); + + if ( $this->fieldTypeProcessorRegistry->hasProcessor( $fieldTypeIdentifier ) ) + { + $fieldTypeProcessor = $this->fieldTypeProcessorRegistry->getProcessor( $fieldTypeIdentifier ); + $value = $fieldTypeProcessor->preProcessHash( $value ); + } + + return $fieldType->fromHash( $value ); + } + + /** + * Parses the given $settingsHash using the FieldType identified by + * $fieldTypeIdentifier + * + * @param string $fieldTypeIdentifier + * @param mixed $settingsHash + * + * @return mixed + */ + public function parseFieldSettings( $fieldTypeIdentifier, $settingsHash ) + { + $fieldType = $this->fieldTypeService->getFieldType( $fieldTypeIdentifier ); + return $fieldType->fieldSettingsFromHash( $settingsHash ); + } + + /** + * Parses the given $configurationHash using the FieldType identified by + * $fieldTypeIdentifier + * + * @param string $fieldTypeIdentifier + * @param mixed $configurationHash + * + * @return mixed + */ + public function parseValidatorConfiguration( $fieldTypeIdentifier, $configurationHash ) + { + $fieldType = $this->fieldTypeService->getFieldType( $fieldTypeIdentifier ); + return $fieldType->validatorConfigurationFromHash( $configurationHash ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Input/Handler.php b/eZ/Publish/Core/REST/Common/Input/Handler.php new file mode 100644 index 0000000..be54d1b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/Handler.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the Handler base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input; + +/** + * Input format handler base class + */ +abstract class Handler +{ + /** + * Converts the given string to an array structure + * + * @param string $string + * + * @return array + */ + abstract public function convert( $string ); +} diff --git a/eZ/Publish/Core/REST/Common/Input/Handler/Json.php b/eZ/Publish/Core/REST/Common/Input/Handler/Json.php new file mode 100644 index 0000000..7d4a608 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/Handler/Json.php @@ -0,0 +1,30 @@ +<?php +/** + * File containing the Json handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input\Handler; + +use eZ\Publish\Core\REST\Common\Input\Handler; + +/** + * Input format handler base class + */ +class Json extends Handler +{ + /** + * Converts the given string to an array structure + * + * @param string $string + * + * @return array + */ + public function convert( $string ) + { + return json_decode( $string, true ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Input/Handler/Xml.php b/eZ/Publish/Core/REST/Common/Input/Handler/Xml.php new file mode 100644 index 0000000..3742676 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/Handler/Xml.php @@ -0,0 +1,301 @@ +<?php +/** + * File containing the Xml handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input\Handler; + +use eZ\Publish\Core\REST\Common\Input\Handler; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Input format handler base class + */ +class Xml extends Handler +{ + /** + * Force list for those items + * + * The key defines the item in which a list is formed. A list is then + * formed for every value in the value array. + * + * @var array + */ + protected $forceList = array( + 'ContentList' => array( + 'Content', + ), + 'SectionList' => array( + 'Section', + ), + 'RoleList' => array( + 'Role', + ), + 'PolicyList' => array( + 'Policy', + ), + 'LocationList' => array( + 'Location' + ), + 'ContentObjectStates' => array( + 'ObjectState' + ), + 'FieldDefinitions' => array( + 'FieldDefinition' + ), + 'names' => array( + 'value' + ), + 'descriptions' => array( + 'value' + ), + 'fields' => array( + 'field' + ), + 'limitations' => array( + 'limitation' + ), + 'values' => array( + 'ref' + ) + ); + + protected $fieldTypeHashElements = array( + 'fieldValue', + ); + + /** + * Converts the given string to an array structure + * + * @param string $string + * + * @return array + */ + public function convert( $string ) + { + $oldXmlErrorHandling = libxml_use_internal_errors( true ); + libxml_clear_errors(); + + $dom = new \DOMDocument(); + $dom->loadXml( $string ); + + $errors = libxml_get_errors(); + + libxml_clear_errors(); + libxml_use_internal_errors( $oldXmlErrorHandling ); + + if ( $errors ) + { + $message = "Detected errors in input XML:\n"; + foreach ( $errors as $error ) + { + $message .= sprintf( + " - In line %d character %d: %s\n", + $error->line, + $error->column, + $error->message + ); + } + $message .= "\nIn XML: \n\n" . $string; + + throw new Exceptions\Parser( $message ); + } + + return $this->convertDom( $dom ); + } + + /** + * Converts DOM nodes to array structures + * + * @param \DOMNode $node + * + * @return array + */ + protected function convertDom( \DOMNode $node ) + { + $isArray = false; + $current = array(); + $text = ''; + + if ( $node instanceof \DOMElement ) + { + foreach ( $node->attributes as $name => $attribute ) + { + $current["_{$name}"] = $attribute->value; + } + } + + $parentTagName = $node instanceof \DOMElement ? $node->tagName : false; + foreach ( $node->childNodes as $childNode ) + { + switch ( $childNode->nodeType ) + { + case XML_ELEMENT_NODE: + $tagName = $childNode->tagName; + + if ( in_array( $tagName, $this->fieldTypeHashElements ) ) + { + $current[$tagName] = $this->parseFieldTypeHash( $childNode ); + } + else if ( !isset( $current[$tagName] ) ) + { + if ( isset( $this->forceList[$parentTagName] ) && + in_array( $tagName, $this->forceList[$parentTagName], true ) ) + { + $isArray = true; + $current[$tagName] = array( + $this->convertDom( $childNode ) + ); + } + else + { + $current[$tagName] = $this->convertDom( $childNode ); + } + } + else if ( !$isArray ) + { + $current[$tagName] = array( + $current[$tagName], + $this->convertDom( $childNode ) + ); + $isArray = true; + } + else + { + $current[$tagName][] = $this->convertDom( $childNode ); + } + + break; + + case XML_TEXT_NODE: + $text .= $childNode->wholeText; + break; + + case XML_CDATA_SECTION_NODE: + $text .= $childNode->data; + break; + } + } + + $text = trim( $text ); + + if ( $text !== '' && count( $current ) ) + { + $current["#text"] = $text; + } + else if ( $text !== '' ) + { + $current = $text; + } + else if ( !count( $current ) ) + { + return null; + } + + return $current; + } + + /** + * @param \DOMElement $domElement + * + * @return array|string|null + */ + protected function parseFieldTypeHash( \DOMElement $domElement ) + { + $result = $this->parseFieldTypeValues( $domElement->childNodes ); + + if ( is_array( $result ) && empty( $result ) ) + { + // No child values means null + return null; + } + + return $result; + } + + /** + * Parses a node list of <value> elements + * + * @param \DOMNodeList $valueNodes + * + * @return array|string + */ + protected function parseFieldTypeValues( \DOMNodeList $valueNodes ) + { + $resultValues = array(); + $resultString = ''; + + foreach ( $valueNodes as $valueNode ) + { + switch ( $valueNode->nodeType ) + { + case XML_ELEMENT_NODE: + if ( $valueNode->tagName !== 'value' ) + { + throw new \RuntimeException( + sprintf( + 'Invalid value tag: <%s>.', + $valueNode->tagName + ) + ); + } + + $parsedValue = $this->parseFieldTypeValues( $valueNode->childNodes ); + if ( $valueNode->hasAttribute( 'key' ) ) + { + $resultValues[$valueNode->getAttribute( 'key' )] = $parsedValue; + } + else + { + $resultValues[] = $parsedValue; + } + break; + + case XML_TEXT_NODE: + $resultString .= $valueNode->wholeText; + break; + + case XML_CDATA_SECTION_NODE: + $resultString .= $valueNode->data; + break; + } + } + + $resultString = trim( $resultString ); + if ( $resultString !== '' ) + { + return $this->castScalarValue( $resultString ); + } + return $resultValues; + } + + /** + * Attempts to cast the given $stringValue into a sensible scalar type + * + * @param string $stringValue + * + * @return mixed + */ + protected function castScalarValue( $stringValue ) + { + switch ( true ) + { + case ( ctype_digit( $stringValue ) ): + return (int)$stringValue; + + case ( preg_match( '(^[0-9\.]+$)', $stringValue ) === 1 ): + return (float)$stringValue; + + case ( strtolower( $stringValue ) === 'true' ): + return true; + + case ( strtolower( $stringValue ) === 'false' ): + return false; + } + return $stringValue; + } +} diff --git a/eZ/Publish/Core/REST/Common/Input/Parser.php b/eZ/Publish/Core/REST/Common/Input/Parser.php new file mode 100644 index 0000000..cc0d858 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/Parser.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the Parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input; + +/** + * Base class for input parser + */ +abstract class Parser +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ValueObject + */ + abstract public function parse( array $data, ParsingDispatcher $parsingDispatcher ); +} diff --git a/eZ/Publish/Core/REST/Common/Input/ParserTools.php b/eZ/Publish/Core/REST/Common/Input/ParserTools.php new file mode 100644 index 0000000..a3a8b49 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/ParserTools.php @@ -0,0 +1,276 @@ +<?php +/** + * File containing the ParserTools class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\API\Repository\Values; +use eZ\Publish\Core\REST\Common\Exceptions; +use RuntimeException; + +/** + * Tools object to be used in Input Parsers + */ +class ParserTools +{ + /** + * Parses the given $objectElement, if it contains embedded data + * + * @param array $objectElement + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return mixed + */ + public function parseObjectElement( array $objectElement, ParsingDispatcher $parsingDispatcher ) + { + if ( $this->isEmbeddedObject( $objectElement ) ) + { + $parsingDispatcher->parse( + $objectElement, + $objectElement['_media-type'] + ); + } + return $objectElement['_href']; + } + + /** + * Returns if the given $objectElement has embedded object data or is only + * a reference + * + * @param array $objectElement + * + * @return boolean + */ + public function isEmbeddedObject( array $objectElement ) + { + foreach ( $objectElement as $childKey => $childValue ) + { + $childKeyIndicator = substr( $childKey, 0, 1 ); + if ( $childKeyIndicator !== '#' && $childKeyIndicator !== '_' ) + { + return true; + } + } + return false; + } + + /** + * Parses a translatable list, like names or descriptions + * + * @param array $listElement + * + * @return array + */ + public function parseTranslatableList( array $listElement ) + { + $listItems = array(); + foreach ( $listElement['value'] as $valueRow ) + { + $listItems[$valueRow['_languageCode']] = $valueRow['#text']; + } + return $listItems; + } + + /** + * Parses a boolean from $stringValue + * + * @param string $stringValue + * + * @return boolean + */ + public function parseBooleanValue( $stringValue ) + { + switch ( strtolower( $stringValue ) ) + { + case 'true': + return true; + case 'false': + return false; + } + + throw new RuntimeException( "Unknown boolean value '{$stringValue}'." ); + } + + /** + * Parses the content types status from $contentTypeStatus + * + * @param string $contentTypeStatus + * + * @return int + */ + public function parseStatus( $contentTypeStatus ) + { + switch ( strtoupper( $contentTypeStatus ) ) + { + case 'DEFINED': + return Values\ContentType\ContentType::STATUS_DEFINED; + case 'DRAFT': + return Values\ContentType\ContentType::STATUS_DRAFT; + case 'MODIFIED': + return Values\ContentType\ContentType::STATUS_MODIFIED; + } + + throw new \RuntimeException( "Unknown ContentType status '{$contentTypeStatus}.'" ); + } + + /** + * Parses the default sort field from the given $defaultSortFieldString + * + * @param string $defaultSortFieldString + * + * @return int + */ + public function parseDefaultSortField( $defaultSortFieldString ) + { + switch ( $defaultSortFieldString ) + { + case 'PATH': + return Values\Content\Location::SORT_FIELD_PATH; + case 'PUBLISHED': + return Values\Content\Location::SORT_FIELD_PUBLISHED; + case 'MODIFIED': + return Values\Content\Location::SORT_FIELD_MODIFIED; + case 'SECTION': + return Values\Content\Location::SORT_FIELD_SECTION; + case 'DEPTH': + return Values\Content\Location::SORT_FIELD_DEPTH; + case 'CLASS_IDENTIFIER': + return Values\Content\Location::SORT_FIELD_CLASS_IDENTIFIER; + case 'CLASS_NAME': + return Values\Content\Location::SORT_FIELD_CLASS_NAME; + case 'PRIORITY': + return Values\Content\Location::SORT_FIELD_PRIORITY; + case 'NAME': + return Values\Content\Location::SORT_FIELD_NAME; + case 'MODIFIED_SUBNODE': + return Values\Content\Location::SORT_FIELD_MODIFIED_SUBNODE; + case 'NODE_ID': + return Values\Content\Location::SORT_FIELD_NODE_ID; + case 'CONTENTOBJECT_ID': + return Values\Content\Location::SORT_FIELD_CONTENTOBJECT_ID; + } + + throw new \RuntimeException( "Unknown default sort field: '{$defaultSortFieldString}'." ); + } + + /** + * Parses the default sort order from the given $defaultSortOrderString + * + * @param string $defaultSortOrderString + * + * @return int + */ + public function parseDefaultSortOrder( $defaultSortOrderString ) + { + switch ( strtoupper( $defaultSortOrderString ) ) + { + case 'ASC': + return Values\Content\Location::SORT_ORDER_ASC; + case 'DESC': + return Values\Content\Location::SORT_ORDER_DESC; + } + + throw new \RuntimeException( "Unknown default sort order: '{$defaultSortOrderString}'." ); + } + + /** + * Parses the input structure to Limitation object + * + * @param array $limitation + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function parseLimitation( array $limitation ) + { + if ( !array_key_exists( '_identifier', $limitation ) ) + { + throw new Exceptions\Parser( "Missing '_identifier' attribute for Limitation." ); + } + + $limitationObject = $this->getLimitationByIdentifier( $limitation['_identifier'] ); + + if ( !isset( $limitation['values']['ref'] ) || !is_array( $limitation['values']['ref'] ) ) + { + throw new Exceptions\Parser( "Invalid format for limitation values in Limitation." ); + } + + $limitationValues = array(); + foreach ( $limitation['values']['ref'] as $limitationValue ) + { + if ( !array_key_exists( '_href', $limitationValue ) ) + { + throw new Exceptions\Parser( "Invalid format for limitation values in Limitation." ); + } + + $limitationValues[] = $limitationValue['_href']; + } + + $limitationObject->limitationValues = $limitationValues; + return $limitationObject; + } + + /** + * Instantiates Limitation object based on identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + * + * @todo Use dependency injection system + */ + protected function getLimitationByIdentifier( $identifier ) + { + switch ( $identifier ) + { + case Values\User\Limitation::CONTENTTYPE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + + case Values\User\Limitation::LANGUAGE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\LanguageLimitation(); + + case Values\User\Limitation::LOCATION: + return new \eZ\Publish\API\Repository\Values\User\Limitation\LocationLimitation(); + + case Values\User\Limitation::OWNER: + return new \eZ\Publish\API\Repository\Values\User\Limitation\OwnerLimitation(); + + case Values\User\Limitation::PARENTOWNER: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentOwnerLimitation(); + + case Values\User\Limitation::PARENTCONTENTTYPE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentContentTypeLimitation(); + + case Values\User\Limitation::PARENTDEPTH: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentDepthLimitation(); + + case Values\User\Limitation::SECTION: + return new \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation(); + + case Values\User\Limitation::SITEACCESS: + return new \eZ\Publish\API\Repository\Values\User\Limitation\SiteaccessLimitation(); + + case Values\User\Limitation::STATE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ObjectStateLimitation(); + + case Values\User\Limitation::SUBTREE: + return new \eZ\Publish\API\Repository\Values\User\Limitation\SubtreeLimitation(); + + case Values\User\Limitation::USERGROUP: + return new \eZ\Publish\API\Repository\Values\User\Limitation\UserGroupLimitation(); + + case Values\User\Limitation::PARENTUSERGROUP: + return new \eZ\Publish\API\Repository\Values\User\Limitation\ParentUserGroupLimitation(); + + default: + throw new \eZ\Publish\Core\Base\Exceptions\NotFoundException( 'Limitation', $identifier ); + } + } +} diff --git a/eZ/Publish/Core/REST/Common/Input/ParsingDispatcher.php b/eZ/Publish/Core/REST/Common/Input/ParsingDispatcher.php new file mode 100644 index 0000000..50fd97b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Input/ParsingDispatcher.php @@ -0,0 +1,81 @@ +<?php +/** + * File containing the Parsing Dispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Input; + +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parsing dispatcher + */ +class ParsingDispatcher +{ + /** + * Array of parsers + * + * Structure: + * + * <code> + * array( + * <contentType> => <parser>, + * … + * ) + * </code> + * + * @var array + */ + protected $parsers = array(); + + /** + * Construct from optional parsers array + * + * @param array $parsers + */ + public function __construct( array $parsers = array() ) + { + foreach ( $parsers as $contentType => $parser ) + { + $this->addParser( $contentType, $parser ); + } + } + + /** + * Adds another parser for the given Content Type + * + * @param string $contentType + * @param \eZ\Publish\Core\REST\Common\Input\Parser $parser + */ + public function addParser( $contentType, Parser $parser ) + { + $this->parsers[$contentType] = $parser; + } + + /** + * Parses the given $data according to $mediaType + * + * @param array $data + * @param string $mediaType + * + * @return \eZ\Publish\API\Repository\Values\ValueObject + */ + public function parse( array $data, $mediaType ) + { + // Remove encoding type + if ( ( $plusPos = strrpos( $mediaType, '+' ) ) !== false ) + { + $mediaType = substr( $mediaType, 0, $plusPos ); + } + + if ( !isset( $this->parsers[$mediaType] ) ) + { + throw new Exceptions\Parser( "Unknown content type specification: '{$mediaType}'." ); + } + return $this->parsers[$mediaType]->parse( $data, $this ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Message.php b/eZ/Publish/Core/REST/Common/Message.php new file mode 100644 index 0000000..9c0769e --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Message.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the Message class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common; + +/** + * Simple response struct + */ +class Message +{ + /** + * Response headers + * + * @var array + */ + public $headers; + + /** + * Response body + * + * @var string + */ + public $body; + + /** + * HTTP status code + * @var int + */ + public $statusCode; + + /** + * Construct from headers and body + * + * @param array $headers + * @param string $body + * @param int $statusCode + */ + public function __construct( array $headers = array(), $body = '', $statusCode = 200 ) + { + $this->headers = $headers; + $this->body = $body; + $this->statusCode = $statusCode; + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Exceptions/InvalidTypeException.php b/eZ/Publish/Core/REST/Common/Output/Exceptions/InvalidTypeException.php new file mode 100644 index 0000000..864a3ab --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Exceptions/InvalidTypeException.php @@ -0,0 +1,28 @@ +<?php +/** + * File containing the InvalidTypeException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Exceptions; + +/** + * Output visiting invalid type exception + */ +class InvalidTypeException extends \RuntimeException +{ + /** + * Construct from invalid data + * + * @param mixed $data + */ + public function __construct( $data ) + { + parent::__construct( + 'You must provide a ValueObject for visiting, "' . gettype( $data ) . '" provided.' + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Exceptions/NoVisitorFoundException.php b/eZ/Publish/Core/REST/Common/Output/Exceptions/NoVisitorFoundException.php new file mode 100644 index 0000000..5cc49c8 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Exceptions/NoVisitorFoundException.php @@ -0,0 +1,31 @@ +<?php +/** + * File containing the NoVisitorFoundException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Exceptions; + +/** + * No output visitor found exception + */ +class NoVisitorFoundException extends \RuntimeException +{ + /** + * Construct from tested classes + * + * @param array $classes + */ + public function __construct( array $classes ) + { + parent::__construct( + sprintf( + "No visitor found for %s!", + implode( ', ', $classes ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Exceptions/OutputGeneratorException.php b/eZ/Publish/Core/REST/Common/Output/Exceptions/OutputGeneratorException.php new file mode 100644 index 0000000..6d67283 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Exceptions/OutputGeneratorException.php @@ -0,0 +1,28 @@ +<?php +/** + * File containing the OutputGeneratorException class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Exceptions; + +/** + * Invalid output generation + */ +class OutputGeneratorException extends \RuntimeException +{ + /** + * Construct from error message + * + * @param string $message + */ + public function __construct( $message ) + { + parent::__construct( + 'Output visiting failed: ' . $message + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/FieldTypeSerializer.php b/eZ/Publish/Core/REST/Common/Output/FieldTypeSerializer.php new file mode 100644 index 0000000..6e7a636 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/FieldTypeSerializer.php @@ -0,0 +1,168 @@ +<?php +/** + * File containing the Generator base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output; + +use eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry; + +use eZ\Publish\API\Repository\FieldTypeService; +use eZ\Publish\API\Repository\FieldType; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Serializes FieldType related data for REST output. + */ +class FieldTypeSerializer +{ + /** + * FieldTypeService + * + * @var \eZ\Publish\API\Repository\FieldTypeService + */ + protected $fieldTypeService; + + /** + * @var \eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry + */ + protected $fieldTypeProcessorRegistry; + + /** + * @param \eZ\Publish\API\Repository\FieldTypeService $fieldTypeService + * @param \eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry $fieldTypeProcessorRegistry + */ + public function __construct( FieldTypeService $fieldTypeService, FieldTypeProcessorRegistry $fieldTypeProcessorRegistry ) + { + $this->fieldTypeService = $fieldTypeService; + $this->fieldTypeProcessorRegistry = $fieldTypeProcessorRegistry; + } + + /** + * Serializes the field value of $field through $generator + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + */ + public function serializeFieldValue( Generator $generator, ContentType $contentType, Field $field ) + { + $this->serializeValue( + 'fieldValue', + $generator, + $this->fieldTypeService->getFieldType( + $contentType->getFieldDefinition( $field->fieldDefIdentifier )->fieldTypeIdentifier + ), + $field->value + ); + } + + /** + * Serializes the $defaultValue for $fieldDefIdentifier through $generator + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param mixed $defaultValue + */ + public function serializeFieldDefaultValue( Generator $generator, FieldDefinition $fieldDefinition, $defaultValue ) + { + $this->serializeValue( + 'defaultValue', + $generator, + $this->getFieldType( $fieldDefinition->fieldTypeIdentifier ), + $defaultValue + ); + } + + /** + * Serializes $settings as fieldSettings for $fieldDefinition using + * $generator + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param mixed $settings + */ + public function serializeFieldSettings( Generator $generator, FieldDefinition $fieldDefinition, $settings ) + { + $this->serializeHash( + 'fieldSettings', + $generator, + $this->getFieldType( + $fieldDefinition->fieldTypeIdentifier + )->fieldSettingsToHash( $settings ) + ); + } + + /** + * Serializes $validatorConfiguration for $fieldDefinition using $generator + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * @param mixed $validatorConfiguration + */ + public function serializeValidatorConfiguration( Generator $generator, FieldDefinition $fieldDefinition, $validatorConfiguration ) + { + $this->serializeHash( + 'validatorConfiguration', + $generator, + $this->getFieldType( + $fieldDefinition->fieldTypeIdentifier + )->validatorConfigurationToHash( $validatorConfiguration ) + ); + } + + /** + * Returns the field type with $fieldTypeIdentifier + * + * @param string $fieldTypeIdentifier + * + * @return \eZ\Publish\API\Repository\FieldType + */ + protected function getFieldType( $fieldTypeIdentifier ) + { + return $this->fieldTypeService->getFieldType( + $fieldTypeIdentifier + ); + } + + /** + * Serializes the given $value for $fieldType with $generator into + * $elementName + * + * @param string $elementName + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\FieldType $fieldType + * @param mixed $value + */ + protected function serializeValue( $elementName, Generator $generator, FieldType $fieldType, $value ) + { + $hash = $fieldType->toHash( $value ); + + $fieldTypeIdentifier = $fieldType->getFieldTypeIdentifier(); + if ( $this->fieldTypeProcessorRegistry->hasProcessor( $fieldTypeIdentifier ) ) + { + $processor = $this->fieldTypeProcessorRegistry->getProcessor( $fieldTypeIdentifier ); + $hash = $processor->postProcessHash( $hash ); + } + + $this->serializeHash( $elementName, $generator, $hash ); + } + + /** + * Serializes the given $hash with $generator into $elementName + * + * @param string $elementName + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $hash + */ + protected function serializeHash( $elementName, Generator $generator, $hash ) + { + $generator->generateFieldTypeHash( $elementName, $hash ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator.php b/eZ/Publish/Core/REST/Common/Output/Generator.php new file mode 100644 index 0000000..05a98bd --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator.php @@ -0,0 +1,386 @@ +<?php +/** + * File containing the Generator base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output; + +/** + * Output generator + */ +abstract class Generator +{ + /** + * Generator creation stack + * + * Use to check if it is OK to start / close the requested element in the + * current state. + * + * @var array + */ + protected $stack = array(); + + /** + * Reset output visitor to a virgin state + */ + public function reset() + { + $this->stack = array(); + $this->isEmpty = true; + } + + /** + * Start document + * + * @param mixed $data + */ + abstract public function startDocument( $data ); + + /** + * Returns if the document is empty or already contains data + * + * @return boolean + */ + abstract public function isEmpty(); + + /** + * Check start document + * + * @param mixed $data + */ + protected function checkStartDocument( $data ) + { + if ( count( $this->stack ) ) + { + throw new Exceptions\OutputGeneratorException( + "Starting a document may only be the very first operation." + ); + } + + $this->stack[] = array( 'document', $data, array() ); + } + + /** + * End document + * + * Returns the generated document as a string. + * + * @param mixed $data + * + * @return string + */ + abstract public function endDocument( $data ); + + /** + * Check end document + * + * @param mixed $data + */ + protected function checkEndDocument( $data ) + { + $this->checkEnd( 'document', $data ); + } + + /** + * Start object element + * + * @param string $name + * @param string $mediaTypeName + */ + abstract public function startObjectElement( $name, $mediaTypeName = null ); + + /** + * Check start object element + * + * @param mixed $data + */ + protected function checkStartObjectElement( $data ) + { + $this->checkStart( 'objectElement', $data, array( 'document', 'objectElement', 'hashElement', 'list' ) ); + + $last = count( $this->stack ) - 2; + if ( $this->stack[$last][0] !== 'list' ) + { + // Ensure object element type only occurs once outside of lists + if ( isset( $this->stack[$last][2][$data] ) ) + { + throw new Exceptions\OutputGeneratorException( + "Element {$data} may only occur once inside of {$this->stack[$last][0]}." + ); + } + } + $this->stack[$last][2][$data] = true; + } + + /** + * End object element + * + * @param string $name + */ + abstract public function endObjectElement( $name ); + + /** + * Check end object element + * + * @param mixed $data + */ + protected function checkEndObjectElement( $data ) + { + $this->checkEnd( 'objectElement', $data ); + } + + /** + * Start hash element + * + * @param string $name + */ + abstract public function startHashElement( $name ); + + /** + * Check start hash element + * + * @param mixed $data + */ + protected function checkStartHashElement( $data ) + { + $this->checkStart( 'hashElement', $data, array( 'document', 'objectElement', 'hashElement', 'list' ) ); + + $last = count( $this->stack ) - 2; + if ( $this->stack[$last][0] !== 'list' ) + { + // Ensure hash element type only occurs once outside of lists + if ( isset( $this->stack[$last][2][$data] ) ) + { + throw new Exceptions\OutputGeneratorException( + "Element {$data} may only occur once inside of {$this->stack[$last][0]}." + ); + } + } + $this->stack[$last][2][$data] = true; + } + + /** + * End hash element + * + * @param string $name + */ + abstract public function endHashElement( $name ); + + /** + * Check end hash element + * + * @param mixed $data + */ + protected function checkEndHashElement( $data ) + { + $this->checkEnd( 'hashElement', $data ); + } + + /** + * Start value element + * + * @param string $name + * @param string $value + */ + abstract public function startValueElement( $name, $value ); + + /** + * Check start value element + * + * @param mixed $data + */ + protected function checkStartValueElement( $data ) + { + $this->checkStart( 'valueElement', $data, array( 'objectElement', 'hashElement', 'list' ) ); + } + + /** + * End value element + * + * @param string $name + */ + abstract public function endValueElement( $name ); + + /** + * Check end value element + * + * @param mixed $data + */ + protected function checkEndValueElement( $data ) + { + $this->checkEnd( 'valueElement', $data ); + } + + /** + * Start list + * + * @param string $name + */ + abstract public function startList( $name ); + + /** + * Check start list + * + * @param mixed $data + */ + protected function checkStartList( $data ) + { + $this->checkStart( 'list', $data, array( 'objectElement', 'hashElement' ) ); + } + + /** + * End list + * + * @param string $name + */ + abstract public function endList( $name ); + + /** + * Check end list + * + * @param mixed $data + */ + protected function checkEndList( $data ) + { + $this->checkEnd( 'list', $data ); + } + + /** + * Start attribute + * + * @param string $name + * @param string $value + */ + abstract public function startAttribute( $name, $value ); + + /** + * Check start attribute + * + * @param mixed $data + */ + protected function checkStartAttribute( $data ) + { + $this->checkStart( 'attribute', $data, array( 'objectElement', 'hashElement' ) ); + } + + /** + * End attribute + * + * @param string $name + */ + abstract public function endAttribute( $name ); + + /** + * Check end attribute + * + * @param mixed $data + */ + protected function checkEndAttribute( $data ) + { + $this->checkEnd( 'attribute', $data ); + } + + /** + * Get media type + * + * @param string $name + * + * @return string + */ + abstract public function getMediaType( $name ); + + /** + * Generates a media type from $name and $type + * + * @param string $name + * @param string $type + * + * @return string + */ + protected function generateMediaType( $name, $type ) + { + return "application/vnd.ez.api.{$name}+{$type}"; + } + + /** + * Generates a generic representation of the scalar, hash or list given in + * $hashValue into the document, using an element of $hashElementName as + * its parent + * + * @param string $hashElementName + * @param mixed $hashValue + */ + abstract public function generateFieldTypeHash( $hashElementName, $hashValue ); + + /** + * Check close / end operation + * + * @param string $type + * @param mixed $data + * @param array $validParents + */ + protected function checkStart( $type, $data, array $validParents ) + { + $lastTag = end( $this->stack ); + + if ( !is_array( $lastTag ) ) + { + throw new Exceptions\OutputGeneratorException( + sprintf( + "Invalid start: Trying to open outside of a document." + ) + ); + } + + if ( !in_array( $lastTag[0], $validParents ) ) + { + throw new Exceptions\OutputGeneratorException( + sprintf( + "Invalid start: Trying to open %s inside %s, valid parent nodes are: %s.", + $type, + $lastTag[0], + implode( ', ', $validParents ) + ) + ); + } + + $this->stack[] = array( $type, $data, array() ); + } + + /** + * Check close / end operation + * + * @param string $type + * @param mixed $data + */ + protected function checkEnd( $type, $data ) + { + $lastTag = array_pop( $this->stack ); + + if ( !is_array( $lastTag ) ) + { + throw new Exceptions\OutputGeneratorException( + sprintf( + "Invalid close: Trying to close on empty stack." + ) + ); + } + + if ( array( $lastTag[0], $lastTag[1] ) !== array( $type, $data ) ) + { + throw new Exceptions\OutputGeneratorException( + sprintf( + "Invalid close: Trying to close %s:%s, while last element was %s:%s.", + $type, + $data, + $lastTag[0], + $lastTag[1] + ) + ); + } + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator/Json.php b/eZ/Publish/Core/REST/Common/Output/Generator/Json.php new file mode 100644 index 0000000..6c61bd5 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator/Json.php @@ -0,0 +1,327 @@ +<?php +/** + * File containing the Json generator class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Generator; + +use eZ\Publish\Core\REST\Common\Output\Generator; + +/** + * Json generator + */ +class Json extends Generator +{ + /** + * Data structure which is build during visiting; + * + * @var array + */ + protected $json; + + /** + * Generator for field type hash values + * + * @var \eZ\Publish\Core\REST\Common\Output\Generator\Json\FieldTypeHashGenerator + */ + protected $fieldTypeHashGenerator; + + /** + * Keeps track if the document is still empty + * + * @var boolean + */ + protected $isEmpty = true; + + /** + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Json\FieldTypeHashGenerator $fieldTypeHashGenerator + */ + public function __construct( Json\FieldTypeHashGenerator $fieldTypeHashGenerator ) + { + $this->fieldTypeHashGenerator = $fieldTypeHashGenerator; + } + + /** + * Start document + * + * @param mixed $data + */ + public function startDocument( $data ) + { + $this->checkStartDocument( $data ); + + $this->isEmpty = true; + + $this->json = new Json\Object(); + } + + /** + * Returns if the document is empty or already contains data + * + * @return boolean + */ + public function isEmpty() + { + return $this->isEmpty; + } + + /** + * End document + * + * Returns the generated document as a string. + * + * @param mixed $data + * + * @return string + */ + public function endDocument( $data ) + { + $this->checkEndDocument( $data ); + + $this->json = $this->convertArrayObjects( $this->json ); + return json_encode( $this->json ); + } + + /** + * Convert ArrayObjects to arrays + * + * Recursively convert all ArrayObjects into arrays in the full data + * structure. + * + * @param mixed $data + * + * @return mixed + */ + protected function convertArrayObjects( $data ) + { + if ( $data instanceof Json\ArrayObject ) + { + // @todo: Check if we need to convert arrays with only one single + // element into non-arrays /cc cba + $data = $data->getArrayCopy(); + foreach ( $data as $key => $value ) + { + $data[$key] = $this->convertArrayObjects( $value ); + } + } + else if ( $data instanceof Json\Object ) + { + foreach ( $data as $key => $value ) + { + $data->$key = $this->convertArrayObjects( $value ); + } + } + + return $data; + } + + /** + * Start object element + * + * @param string $name + * @param string $mediaTypeName + */ + public function startObjectElement( $name, $mediaTypeName = null ) + { + $this->checkStartObjectElement( $name ); + + $this->isEmpty = false; + + $mediaTypeName = $mediaTypeName ?: $name; + + $object = new Json\Object( $this->json ); + + if ( $this->json instanceof Json\ArrayObject ) + { + $this->json[] = $object; + $this->json = $object; + } + else + { + $this->json->$name = $object; + $this->json = $object; + } + + $this->startAttribute( "media-type", $this->getMediaType( $mediaTypeName ) ); + $this->endAttribute( "media-type" ); + } + + /** + * End object element + * + * @param string $name + */ + public function endObjectElement( $name ) + { + $this->checkEndObjectElement( $name ); + + $this->json = $this->json->getParent(); + } + + /** + * Start hash element + * + * @param string $name + */ + public function startHashElement( $name ) + { + $this->checkStartHashElement( $name ); + + $this->isEmpty = false; + + $object = new Json\Object( $this->json ); + + if ( $this->json instanceof Json\ArrayObject ) + { + $this->json[] = $object; + $this->json = $object; + } + else + { + $this->json->$name = $object; + $this->json = $object; + } + } + + /** + * End hash element + * + * @param string $name + */ + public function endHashElement( $name ) + { + $this->checkEndHashElement( $name ); + + $this->json = $this->json->getParent(); + } + + /** + * Start value element + * + * @param string $name + * @param string $value + * @param array $attributes + */ + public function startValueElement( $name, $value, $attributes = array() ) + { + $this->checkStartValueElement( $name ); + + $jsonValue = null; + + if ( empty( $attributes ) ) + { + $jsonValue = $value; + } + else + { + $jsonValue = new Json\Object( $this->json ); + foreach ( $attributes as $attributeName => $attributeValue ) + { + $jsonValue->{'_' . $attributeName} = $attributeValue; + } + $jsonValue->{'#text'} = $value; + } + + if ( $this->json instanceof Json\ArrayObject ) + { + $this->json[] = $jsonValue; + } + else + { + $this->json->$name = $jsonValue; + } + } + + /** + * End value element + * + * @param string $name + */ + public function endValueElement( $name ) + { + $this->checkEndValueElement( $name ); + } + + /** + * Start list + * + * @param string $name + */ + public function startList( $name ) + { + $this->checkStartList( $name ); + + $array = new Json\ArrayObject( $this->json ); + + $this->json->$name = $array; + $this->json = $array; + } + + /** + * End list + * + * @param string $name + */ + public function endList( $name ) + { + $this->checkEndList( $name ); + + $this->json = $this->json->getParent(); + } + + /** + * Start attribute + * + * @param string $name + * @param string $value + */ + public function startAttribute( $name, $value ) + { + $this->checkStartAttribute( $name ); + + $this->json->{'_' . $name} = $value; + } + + /** + * End attribute + * + * @param string $name + */ + public function endAttribute( $name ) + { + $this->checkEndAttribute( $name ); + } + + /** + * Get media type + * + * @param string $name + * + * @return string + */ + public function getMediaType( $name ) + { + return $this->generateMediaType( $name, 'json' ); + } + + /** + * Generates a generic representation of the scalar, hash or list given in + * $hashValue into the document, using an element of $hashElementName as + * its parent + * + * @param string $hashElementName + * @param mixed $hashValue + */ + public function generateFieldTypeHash( $hashElementName, $hashValue ) + { + $this->fieldTypeHashGenerator->generateHashValue( + $this->json, + $hashElementName, + $hashValue + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator/Json/ArrayObject.php b/eZ/Publish/Core/REST/Common/Output/Generator/Json/ArrayObject.php new file mode 100644 index 0000000..724e486 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator/Json/ArrayObject.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the Json ArrayObject class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Generator\Json; + +/** + * Json array object + * + * Special JSON array object implementation, which allows to access the + * parent object it is assigned to again. + */ +class ArrayObject extends \ArrayObject +{ + /** + * Reference to the parent node + * + * @var \eZ\Publish\Core\REST\Common\Output\Generator\Json\Object + */ + protected $_ref_parent; + + /** + * Construct from optional parent node + * + * @param mixed $_ref_parent + */ + public function __construct( $_ref_parent ) + { + $this->_ref_parent = $_ref_parent; + } + + /** + * Get Parent of current node + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Json\Object + */ + public function getParent() + { + return $this->_ref_parent; + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator/Json/FieldTypeHashGenerator.php b/eZ/Publish/Core/REST/Common/Output/Generator/Json/FieldTypeHashGenerator.php new file mode 100644 index 0000000..9bd2450 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator/Json/FieldTypeHashGenerator.php @@ -0,0 +1,137 @@ +<?php +/** + * File containing the Json FieldTypeHashGenerator class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Generator\Json; + +class FieldTypeHashGenerator +{ + /** + * Generates the field type value $hashValue as a child of the given Object + * using $hashElementName as the property name + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject|\eZ\Publish\Core\REST\Common\Output\Generator\Json\Object $parent + * @param string $hashElementName + * @param mixed $hashValue + */ + public function generateHashValue( $parent, $hashElementName, $hashValue ) + { + $parent->$hashElementName = $this->generateValue( $parent, $hashValue ); + } + + /** + * Generates and returns a value based on $hashValue type, with $parent ( + * if the type of $hashValue supports it) + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject|\eZ\Publish\Core\REST\Common\Output\Generator\Json\Object $parent + * @param mixed $value + * + * @return mixed + */ + protected function generateValue( $parent, $value ) + { + switch( ( $hashValueType = gettype( $value ) ) ) + { + case 'NULL': + case 'boolean': + case 'integer': + case 'double': + case 'string': + + // Will be handled accordingly on serialization + return $value; + break; + + case 'array': + return $this->generateArrayValue( $parent, $value ); + break; + + default: + throw new \Exception( 'Invalid type in field value hash: ' . $hashValueType ); + } + } + + /** + * Generates and returns a JSON structure (array or object) depending on $value type + * with $parent + * + * If $type only contains numeric keys, the resulting structure will be an + * JSON array, otherwise a JSON object + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject|\eZ\Publish\Core\REST\Common\Output\Generator\Json\Object $parent + * @param array $value + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject|\eZ\Publish\Core\REST\Common\Output\Generator\Json\Object + */ + protected function generateArrayValue( $parent, array $value ) + { + if ( $this->isNumericArray( $value ) ) + { + return $this->generateListArray( $parent, $value ); + } + else + { + return $this->generateHashArray( $parent, $value ); + } + } + + /** + * Generates a JSON array from the given $hashArray with $parent + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject|\eZ\Publish\Core\REST\Common\Output\Generator\Json\Object $parent + * @param array $listArray + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject + */ + protected function generateListArray( $parent, array $listArray ) + { + $arrayObject = new ArrayObject( $parent ); + foreach ( $listArray as $listItem ) + { + $arrayObject[] = $this->generateValue( $arrayObject, $listItem ); + } + return $arrayObject; + } + + /** + * Generates a JSON object from the given $hashArray with $parent + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Json\ArrayObject|\eZ\Publish\Core\REST\Common\Output\Generator\Json\Object $parent + * @param array $hashArray + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Json\Object + */ + protected function generateHashArray( $parent, array $hashArray ) + { + $object = new Object( $parent ); + foreach ( $hashArray as $hashKey => $hashItem ) + { + $object->$hashKey = $this->generateValue( $object, $hashItem ); + } + return $object; + } + + /** + * Checks if the given $value is a purely numeric array + * + * @param array $value + * + * @return boolean + */ + protected function isNumericArray( array $value ) + { + foreach ( array_keys( $value ) as $key ) + { + if ( is_string( $key ) ) + { + return false; + } + } + return true; + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator/Json/Object.php b/eZ/Publish/Core/REST/Common/Output/Generator/Json/Object.php new file mode 100644 index 0000000..30a9718 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator/Json/Object.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the Json Object class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Generator\Json; + +/** + * Json object + * + * Special JSON object (\stdClass) implementation, which allows to access the + * parent object it is assigned to again. + */ +class Object +{ + /** + * Reference to the parent node + * + * @var \eZ\Publish\Core\REST\Common\Output\Generator\Json\Object + */ + protected $_ref_parent; + + /** + * Construct from optional parent node + * + * @param mixed $_ref_parent + */ + public function __construct( $_ref_parent = null ) + { + $this->_ref_parent = $_ref_parent; + } + + /** + * Get Parent of current node + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Json\Object + */ + public function getParent() + { + return $this->_ref_parent; + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator/Xml.php b/eZ/Publish/Core/REST/Common/Output/Generator/Xml.php new file mode 100644 index 0000000..7eeb5a5 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator/Xml.php @@ -0,0 +1,255 @@ +<?php +/** + * File containing the XML generator class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Generator; + +use eZ\Publish\Core\REST\Common\Output\Generator; + +/** + * Xml generator + */ +class Xml extends Generator +{ + /** + * XMLWriter + * + * @var \XMLWriter + */ + protected $xmlWriter; + + /** + * Generator for field type hash values + * + * @var \eZ\Publish\Core\REST\Common\Output\Generator\Xml\FieldTypeHashGenerator + */ + protected $hashGenerator; + + /** + * Keeps track if the document received some content + * + * @var boolean + */ + protected $isEmpty = true; + + /** + * @param \eZ\Publish\Core\REST\Common\Output\Generator\Xml\FieldTypeHashGenerator $hashGenerator + */ + public function __construct( Xml\FieldTypeHashGenerator $hashGenerator ) + { + $this->hashGenerator = $hashGenerator; + } + + /** + * Start document + * + * @param mixed $data + */ + public function startDocument( $data ) + { + $this->checkStartDocument( $data ); + + $this->isEmpty = true; + + $this->xmlWriter = new \XMLWriter(); + $this->xmlWriter->openMemory(); + $this->xmlWriter->setIndent( true ); + $this->xmlWriter->startDocument( '1.0', 'UTF-8' ); + } + + /** + * Returns if the document is empty or already contains data + * + * @return boolean + */ + public function isEmpty() + { + return $this->isEmpty; + } + + /** + * End document + * + * Returns the generated document as a string. + * + * @param mixed $data + * + * @return string + */ + public function endDocument( $data ) + { + $this->checkEndDocument( $data ); + + $this->xmlWriter->endDocument(); + return $this->xmlWriter->outputMemory(); + } + + /** + * Start object element + * + * @param string $name + * @param string $mediaTypeName + */ + public function startObjectElement( $name, $mediaTypeName = null ) + { + $this->checkStartObjectElement( $name ); + + $this->isEmpty = false; + + $mediaTypeName = $mediaTypeName ?: $name; + + $this->xmlWriter->startElement( $name ); + + $this->startAttribute( "media-type", $this->getMediaType( $mediaTypeName ) ); + $this->endAttribute( "media-type" ); + } + + /** + * End object element + * + * @param string $name + */ + public function endObjectElement( $name ) + { + $this->checkEndObjectElement( $name ); + + $this->xmlWriter->endElement(); + } + + /** + * Start hash element + * + * @param string $name + */ + public function startHashElement( $name ) + { + $this->checkStartHashElement( $name ); + + $this->isEmpty = false; + + $this->xmlWriter->startElement( $name ); + } + + /** + * End hash element + * + * @param string $name + */ + public function endHashElement( $name ) + { + $this->checkEndHashElement( $name ); + + $this->xmlWriter->endElement(); + } + + /** + * Start value element + * + * @param string $name + * @param string $value + * @param array $attributes + */ + public function startValueElement( $name, $value, $attributes = array() ) + { + $this->checkStartValueElement( $name ); + + $this->xmlWriter->startElement( $name ); + + foreach ( $attributes as $attributeName => $attributeValue ) + { + $this->xmlWriter->startAttribute( $attributeName ); + $this->xmlWriter->text( $attributeValue ); + $this->xmlWriter->endAttribute(); + } + + $this->xmlWriter->text( $value ); + } + + /** + * End value element + * + * @param string $name + */ + public function endValueElement( $name ) + { + $this->checkEndValueElement( $name ); + + $this->xmlWriter->endElement(); + } + + /** + * Start list + * + * @param string $name + */ + public function startList( $name ) + { + $this->checkStartList( $name ); + } + + /** + * End list + * + * @param string $name + */ + public function endList( $name ) + { + $this->checkEndList( $name ); + } + + /** + * Start attribute + * + * @param string $name + * @param string $value + */ + public function startAttribute( $name, $value ) + { + $this->checkStartAttribute( $name ); + + $this->xmlWriter->startAttribute( $name ); + $this->xmlWriter->text( $value ); + } + + /** + * End attribute + * + * @param string $name + */ + public function endAttribute( $name ) + { + $this->checkEndAttribute( $name ); + + $this->xmlWriter->endAttribute(); + } + + /** + * Get media type + * + * @param string $name + * + * @return string + */ + public function getMediaType( $name ) + { + return $this->generateMediaType( $name, 'xml' ); + } + + /** + * Generates a generic representation of the scalar, hash or list given in + * $hashValue into the document, using an element of $hashElementName as + * its parent + * + * @param string $hashElementName + * @param mixed $hashValue + */ + public function generateFieldTypeHash( $hashElementName, $hashValue ) + { + $this->hashGenerator->generateHashValue( $this->xmlWriter, $hashElementName, $hashValue ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Generator/Xml/FieldTypeHashGenerator.php b/eZ/Publish/Core/REST/Common/Output/Generator/Xml/FieldTypeHashGenerator.php new file mode 100644 index 0000000..229a3d2 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Generator/Xml/FieldTypeHashGenerator.php @@ -0,0 +1,245 @@ +<?php +/** + * File containing the FieldTypeSerializer base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output\Generator\Xml; + +use eZ\Publish\Core\REST\Common\Output\Generator\Xml as XmlWriter; + +class FieldTypeHashGenerator +{ + /** + * Generates the field type value $hashValue into the $writer creating an + * element with $hashElementName as its parent + * + * @param \XmlWriter $writer + * @param string $hashElementName + * @param mixed $hashValue + */ + public function generateHashValue( \XMLWriter $writer, $hashElementName, $hashValue ) + { + $this->generateValue( $writer, $hashValue, null, $hashElementName ); + } + + /** + * Generates $value into a serialized representation + * + * @param \XmlWriter $writer + * @param mixed $value + * @param string|null $key + * @param string $elementName + */ + protected function generateValue( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + switch( ( $hashValueType = gettype( $value ) ) ) + { + case 'NULL': + $this->generateNullValue( $writer, $key, $elementName ); + break; + + case 'boolean': + $this->generateBooleanValue( $writer, $value, $key, $elementName ); + break; + + case 'integer': + $this->generateIntegerValue( $writer, $value, $key, $elementName ); + break; + + case 'double': + $this->generateFloatValue( $writer, $value, $key, $elementName ); + break; + + case 'string': + $this->generateStringValue( $writer, $value, $key, $elementName ); + break; + + case 'array': + $this->generateArrayValue( $writer, $value, $key, $elementName ); + break; + + default: + throw new \Exception( 'Invalid type in field value hash: ' . $hashValueType ); + } + } + + /** + * Generates an array value from $value + * + * @param \XmlWriter $writer + * @param array $value + * @param string|null $key + * @param string $elementName + */ + protected function generateArrayValue( \XmlWriter $writer, $value, $key, $elementName = 'value' ) + { + if ( $this->isNumericArray( $value ) ) + { + $this->generateListArray( $writer, $value, $key, $elementName ); + } + else + { + $this->generateHashArray( $writer, $value, $key, $elementName ); + } + } + + /** + * Generates $value as a hash of value items + * + * @param \XmlWriter $writer + * @param array $value + * @param string|null $key + * @param string $elementName + */ + protected function generateHashArray( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + + foreach ( $value as $hashKey => $hashItemValue ) + { + $this->generateValue( $writer, $hashItemValue, $hashKey ); + } + + $writer->endElement(); + } + + /** + * Generates $value as a list of value items + * + * @param \XmlWriter $writer + * @param array $value + * @param string|null $key + * @param string $elementName + */ + protected function generateListArray( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + + foreach ( $value as $listItemValue ) + { + $this->generateValue( $writer, $listItemValue ); + } + + $writer->endElement(); + } + + /** + * Checks if the given $value is a purely numeric array + * + * @param array $value + * + * @return boolean + */ + protected function isNumericArray( array $value ) + { + foreach ( array_keys( $value ) as $key ) + { + if ( is_string( $key ) ) + { + return false; + } + } + return true; + } + + /** + * Generates a null value + * + * @param \XmlWriter $writer + * @param string|null $key + * @param string $elementName + */ + protected function generateNullValue( \XmlWriter $writer, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + // @todo: xsi:type? + $writer->endElement(); + } + + /** + * Generates a boolean value + * + * @param \XmlWriter $writer + * @param boolean $value + * @param string|null $key + * @param string $elementName + */ + protected function generateBooleanValue( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + $writer->text( $value ? 'true' : 'false' ); + $writer->endElement(); + } + + /** + * Generates a integer value + * + * @param \XmlWriter $writer + * @param int $value + * @param string|null $key + * @param string $elementName + */ + protected function generateIntegerValue( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + $writer->text( $value ); + $writer->endElement(); + } + + /** + * Generates a float value + * + * @param \XmlWriter $writer + * @param float $value + * @param string|null $key + * @param string $elementName + */ + protected function generateFloatValue( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + $writer->text( sprintf( '%F', $value ) ); + $writer->endElement(); + } + + /** + * Generates a string value + * + * @param \XmlWriter $writer + * @param string $value + * @param string|null $key + * @param string $elementName + */ + protected function generateStringValue( \XmlWriter $writer, $value, $key = null, $elementName = 'value' ) + { + $writer->startElement( $elementName ); + $this->generateKeyAttribute( $writer, $key ); + $writer->text( $value ); + $writer->endElement(); + } + + /** + * Generates a key attribute with $key as the value, if $key is not null + * + * @param \XmlWriter $writer + * @param string|null $key + */ + protected function generateKeyAttribute( \XmlWriter $writer, $key = null ) + { + if ( $key !== null ) + { + $writer->startAttribute( 'key' ); + $writer->text( $key ); + $writer->endAttribute(); + } + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor.php b/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor.php new file mode 100644 index 0000000..e5b14ef --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/ValueObjectVisitor.php @@ -0,0 +1,190 @@ +<?php +/** + * File containing the ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\API\Repository\Values\User\Limitation; +use eZ\Publish\API\Repository\Values\Content\Location; + +/** + * Basic ValueObjectVisitor + */ +abstract class ValueObjectVisitor +{ + /** + * URL handler for URL generation + * + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + protected $urlHandler; + + /** + * Construct from used URL handler + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( UrlHandler $urlHandler ) + { + $this->urlHandler = $urlHandler; + } + + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param mixed $data + */ + abstract public function visit( Visitor $visitor, Generator $generator, $data ); + + /** + * Returns a string representation for the given $boolValue + * + * @param boolean $boolValue + * + * @return string + */ + protected function serializeBool( $boolValue ) + { + return ( $boolValue ? 'true' : 'false' ); + } + + /** + * Visits the given list of $names + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param array $names + */ + protected function visitNamesList( Generator $generator, array $names ) + { + $this->visitTranslatedList( $generator, $names, 'names' ); + } + + /** + * Visits the given list of $descriptions + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param array $descriptions + */ + protected function visitDescriptionsList( Generator $generator, array $descriptions ) + { + $this->visitTranslatedList( $generator, $descriptions, 'descriptions' ); + } + + /** + * Visits a list of translated elements + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param array $translatedElements + * @param mixed $listName + */ + protected function visitTranslatedList( Generator $generator, array $translatedElements, $listName ) + { + $generator->startHashElement( $listName ); + $generator->startList( 'value' ); + foreach ( $translatedElements as $languageCode => $element ) + { + $generator->startValueElement( 'value', $element, array( 'languageCode' => $languageCode ) ); + $generator->endValueElement( 'value' ); + } + $generator->endList( 'value' ); + $generator->endHashElement( $listName ); + } + + /** + * Visits a limitation + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + */ + protected function visitLimitation( Generator $generator, Limitation $limitation ) + { + $generator->startHashElement( 'limitation' ); + + $generator->startAttribute( 'identifier', $limitation->getIdentifier() ); + $generator->endAttribute( 'identifier' ); + + $generator->startHashElement( 'values' ); + $generator->startList( 'ref' ); + + foreach ( $limitation->limitationValues as $limitationValue ) + { + $generator->startObjectElement( 'ref' ); + $generator->startAttribute( 'href', $limitationValue ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ref' ); + } + + $generator->endList( 'ref' ); + $generator->endHashElement( 'values' ); + + $generator->endHashElement( 'limitation' ); + } + + /** + * Serializes the given $sortField to a string representation + * + * @param int $sortField + * + * @return string + */ + protected function serializeSortField( $sortField ) + { + switch ( $sortField ) + { + case Location::SORT_FIELD_PATH: + return 'PATH'; + case Location::SORT_FIELD_PUBLISHED: + return 'PUBLISHED'; + case Location::SORT_FIELD_MODIFIED: + return 'MODIFIED'; + case Location::SORT_FIELD_SECTION: + return 'SECTION'; + case Location::SORT_FIELD_DEPTH: + return 'DEPTH'; + case Location::SORT_FIELD_CLASS_IDENTIFIER: + return 'CLASS_IDENTIFIER'; + case Location::SORT_FIELD_CLASS_NAME: + return 'CLASS_NAME'; + case Location::SORT_FIELD_PRIORITY: + return 'PRIORITY'; + case Location::SORT_FIELD_NAME: + return 'NAME'; + case Location::SORT_FIELD_MODIFIED_SUBNODE: + return 'MODIFIED_SUBNODE'; + case Location::SORT_FIELD_NODE_ID: + return 'NODE_ID'; + case Location::SORT_FIELD_CONTENTOBJECT_ID: + return 'CONTENTOBJECT_ID'; + } + + throw new \RuntimeException( "Unknown default sort field: '{$sortField}'." ); + } + + /** + * Serializes the given $sortOrder to a string representation + * + * @param int $sortOrder + * + * @return string + */ + protected function serializeSortOrder( $sortOrder ) + { + switch ( $sortOrder ) + { + case Location::SORT_ORDER_ASC: + return 'ASC'; + case Location::SORT_ORDER_DESC: + return 'DESC'; + } + + throw new \RuntimeException( "Unknown default sort order: '{$sortOrder}'." ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Output/Visitor.php b/eZ/Publish/Core/REST/Common/Output/Visitor.php new file mode 100644 index 0000000..badc15c --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Output/Visitor.php @@ -0,0 +1,266 @@ +<?php +/** + * File containing the Visitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Output; + +use eZ\Publish\Core\REST\Common\Message; + +/** + * Visitor for view models + */ +class Visitor +{ + /** + * Visitors for value objects + * + * Structure: + * <code> + * array( + * <class> => <ValueObjectVisitor>, + * … + * ) + * + * @var array + */ + protected $visitors = array(); + + /** + * Generator + * + * @var \eZ\Publish\Core\REST\Common\Output\Generator + */ + protected $generator; + + /** + * HTTP Response Headers + * + * @var array + */ + protected $headers = array(); + /** + * Mapping of status codes. + * + * @var array(int=>string) + */ + public static $statusMap = array( + 100 => 'Continue', + 101 => 'Switching Protocols', + 102 => 'Processing', + 118 => 'Connection timed out', + 200 => 'OK', + 201 => 'Created', + 202 => 'Accepted', + 203 => 'Non-Authoritative Information', + 204 => 'No Content', + 205 => 'Reset Content', + 206 => 'Partial Content', + 207 => 'Multi-Status', + 300 => 'Multiple Choices', + 301 => 'Moved Permanently', + 302 => 'Found', + 303 => 'See Other', + 304 => 'Not Modified', + 305 => 'Use Proxy', + 306 => '(reserviert)', + 307 => 'Temporary Redirect', + 400 => 'Bad Request', + 401 => 'Unauthorized', + 402 => 'Payment Required', + 403 => 'Forbidden', + 404 => 'Not Found', + 405 => 'Method Not Allowed', + 406 => 'Not Acceptable', + 407 => 'Proxy Authentication Required', + 408 => 'Request Time-out', + 409 => 'Conflict', + 410 => 'Gone', + 411 => 'Length Required', + 412 => 'Precondition Failed', + 413 => 'Request Entity Too Large', + 414 => 'Request-URL Too Long', + 415 => 'Unsupported Media Type', + 416 => 'Requested range not satisfiable', + 417 => 'Expectation Failed', + 418 => 'I\'m a teapot', + 421 => 'There are too many connections from your internet address', + 422 => 'Unprocessable Entity', + 423 => 'Locked', + 424 => 'Failed Dependency', + 425 => 'Unordered Collection', + 426 => 'Upgrade Required', + 500 => 'Internal Server Error', + 501 => 'Not Implemented', + 502 => 'Bad Gateway', + 503 => 'Service Unavailable', + 504 => 'Gateway Time-out', + 505 => 'HTTP Version not supported', + 506 => 'Variant Also Negotiates', + 507 => 'Insufficient Storage', + 509 => 'Bandwidth Limit Exceeded', + 510 => 'Not Extended', + ); + + /** + * Construct from Generator and an array of concrete view model visitors + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param array $visitors + */ + public function __construct( Generator $generator, array $visitors ) + { + $this->generator = $generator; + foreach ( $visitors as $class => $visitor ) + { + $this->addVisitor( $class, $visitor ); + } + } + + /** + * Adds a new visitor for the given class + * + * @param string $class + * @param \eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor $visitor + */ + public function addVisitor( $class, ValueObjectVisitor $visitor ) + { + if ( $class[0] === '\\' ) + { + $class = substr( $class, 1 ); + } + + $this->visitors[$class] = $visitor; + } + + /** + * Set HTTP response header + * + * Does not allow overwriting of response headers. The first definition of + * a header will be used. + * + * @param string $name + * @param string $value + */ + public function setHeader( $name, $value ) + { + if ( !isset( $this->headers[$name] ) ) + { + $this->headers[$name] = $value; + } + } + + /** + * Sets the given status code in the corresponding header. + * + * Note that headers are generally not overwritten! + * + * @param int $statusCode + */ + public function setStatus( $statusCode ) + { + $status = sprintf( + '%s %s', + $statusCode, + ( isset( self::$statusMap[$statusCode] ) + ? self::$statusMap[$statusCode] + : 'Unknown' ) + ); + + $this->setHeader( 'Status', $status ); + } + + /** + * Visit struct returned by controllers + * + * @param mixed $data + * + * @return \eZ\Publish\Core\REST\Common\Message + */ + public function visit( $data ) + { + $this->generator->reset(); + $this->generator->startDocument( $data ); + $this->visitValueObject( $data ); + + //@todo Needs refactoring! + // A hackish solution to enable outer visitors to disable setting + // of certain headers in inner visitors, for example Accept-Patch header + // which is valid in GET/POST/PATCH for a resource, but must not appear + // in the list of resources + $filteredHeaders = array(); + foreach ( $this->headers as $headerName => $headerValue ) + { + if ( $headerValue !== false ) + { + $filteredHeaders[$headerName] = $headerValue; + } + } + + $statusCode = 200; + if ( isset( $this->headers['Status'] ) ) + { + $statusCode = sscanf( $this->headers['Status'], '%s %s' ); + $statusCode = (int)$statusCode[0]; + } + + $result = new Message( + $filteredHeaders, + ( $this->generator->isEmpty() + ? null + : $this->generator->endDocument( $data ) ), + $statusCode + ); + + $this->headers = array(); + + return $result; + } + + /** + * Visit struct returned by controllers + * + * Should be called from sub-visitors to visit nested objects. + * + * @param mixed $data + */ + public function visitValueObject( $data ) + { + if ( !is_object( $data ) ) + { + throw new Exceptions\InvalidTypeException( $data ); + } + $checkedClassNames = array(); + + $classname = get_class( $data ); + do + { + $checkedClassNames[] = $classname; + if ( isset( $this->visitors[$classname] ) ) + { + return $this->visitors[$classname]->visit( $this, $this->generator, $data ); + } + } + while ( $classname = get_parent_class( $classname ) ); + + throw new Exceptions\NoVisitorFoundException( $checkedClassNames ); + } + + /** + * Generates a media type for $type based on the used generator. + * + * @param string $type + * + * @see \eZ\Publish\Core\REST\Common\Generator::getMediaType() + * + * @return string + */ + public function getMediaType( $type ) + { + return $this->generator->getMediaType( $type ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/FieldTypeProcessorRegistryTest.php b/eZ/Publish/Core/REST/Common/Tests/FieldTypeProcessorRegistryTest.php new file mode 100644 index 0000000..9c74a2f --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/FieldTypeProcessorRegistryTest.php @@ -0,0 +1,103 @@ +<?php +/** + * File containing the FieldTypeProcessorRegistryTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests; + +use eZ\Publish\Core\REST\Common\FieldTypeProcessorRegistry; + +class FieldTypeProcessorRegistryTest extends BaseTest +{ + public function testRegisterProcessor() + { + $registry = new FieldTypeProcessorRegistry(); + + $processor = $this->getAProcessorMock(); + + $registry->registerProcessor( 'my-type', $processor ); + + $this->assertTrue( $registry->hasProcessor( 'my-type' ) ); + } + + public function testRegisterMultipleProcessors() + { + $registry = new FieldTypeProcessorRegistry(); + + $processorA = $this->getAProcessorMock(); + $processorB = $this->getAProcessorMock(); + + $registry->registerProcessor( 'my-type', $processorA ); + $registry->registerProcessor( 'your-type', $processorB ); + + $this->assertTrue( $registry->hasProcessor( 'my-type' ) ); + $this->assertTrue( $registry->hasProcessor( 'your-type' ) ); + } + + public function testHasProcessorFailure() + { + $registry = new FieldTypeProcessorRegistry(); + + $this->assertFalse( $registry->hasProcessor( 'my-type' ) ); + } + + public function testGetProcessor() + { + $registry = new FieldTypeProcessorRegistry(); + + $processor = $this->getAProcessorMock(); + + $registry->registerProcessor( 'my-type', $processor ); + + $this->assertSame( + $processor, + $registry->getProcessor( 'my-type' ) + ); + } + + /** + * @expectedException \RuntimeException + */ + public function testGetProcessorNotFoundException() + { + $registry = new FieldTypeProcessorRegistry(); + + $registry->getProcessor( 'my-type' ); + } + + public function testRegisterProcessorsOverwrite() + { + $registry = new FieldTypeProcessorRegistry(); + + $processorA = $this->getAProcessorMock(); + $processorB = $this->getAProcessorMock(); + + $registry->registerProcessor( 'my-type', $processorA ); + $registry->registerProcessor( 'my-type', $processorB ); + + $this->assertSame( + $processorB, + $registry->getProcessor( 'my-type' ) + ); + } + + /** + * Get FieldTypeProcessor mock object + * + * @return \eZ\Publish\Core\REST\Common\FieldTypeProcessor + */ + protected function getAProcessorMock() + { + return $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\FieldTypeProcessor', + array(), + array(), + '', + false + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/DispatcherTest.php b/eZ/Publish/Core/REST/Common/Tests/Input/DispatcherTest.php new file mode 100644 index 0000000..99e812f --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/DispatcherTest.php @@ -0,0 +1,141 @@ +<?php +/** + * File containing the DispatcherTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Input; + +use eZ\Publish\Core\REST\Common; + +/** + * Dispatcher test class + */ +class DispatcherTest extends \PHPUnit_Framework_TestCase +{ + /** + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + */ + public function testParseMissingContentType() + { + $message = new Common\Message(); + + $parsingDispatcher = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher' ); + $dispatcher = new Common\Input\Dispatcher( $parsingDispatcher ); + + $dispatcher->parse( $message ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + */ + public function testParseInvalidContentType() + { + $message = new Common\Message( + array( + 'Content-Type' => 'text/html', + ) + ); + + $parsingDispatcher = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher' ); + $dispatcher = new Common\Input\Dispatcher( $parsingDispatcher ); + + $dispatcher->parse( $message ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + */ + public function testParseMissingFormatHandler() + { + $message = new Common\Message( + array( + 'Content-Type' => 'text/html+unknown', + ) + ); + + $parsingDispatcher = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher' ); + $dispatcher = new Common\Input\Dispatcher( $parsingDispatcher ); + + $dispatcher->parse( $message ); + } + + public function testParse() + { + $message = new Common\Message( + array( + 'Content-Type' => 'text/html+format', + ), + 'Hello world!' + ); + + $parsingDispatcher = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher' ); + $parsingDispatcher + ->expects( $this->at( 0 ) ) + ->method( 'parse' ) + ->with( array( 42 ), 'text/html' ) + ->will( $this->returnValue( 23 ) ); + + $handler = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\Handler' ); + $handler + ->expects( $this->at( 0 ) ) + ->method( 'convert' ) + ->with( 'Hello world!' ) + ->will( $this->returnValue( array( array( 42 ) ) ) ); + + $dispatcher = new Common\Input\Dispatcher( $parsingDispatcher, array( 'format' => $handler ) ); + + $this->assertSame( + 23, + $dispatcher->parse( $message ) + ); + } + + /** + * @todo This is a test for a feature that needs refactoring. There must be + * a sensible way to submit the called URL to the parser. + */ + public function testParseSpecialUrlHeader() + { + $message = new Common\Message( + array( + 'Content-Type' => 'text/html+format', + 'Url' => '/foo/bar', + ), + 'Hello world!' + ); + + $parsingDispatcher = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher' ); + $parsingDispatcher + ->expects( $this->at( 0 ) ) + ->method( 'parse' ) + ->with( array( 'someKey' => 'someValue', '__url' => '/foo/bar' ), 'text/html' ) + ->will( $this->returnValue( 23 ) ); + + $handler = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\Handler' ); + $handler + ->expects( $this->at( 0 ) ) + ->method( 'convert' ) + ->with( 'Hello world!' ) + ->will( + $this->returnValue( + array( + array( + 'someKey' => 'someValue', + ) + ) + ) + ); + + $dispatcher = new Common\Input\Dispatcher( $parsingDispatcher, array( 'format' => $handler ) ); + + $this->assertSame( + 23, + $dispatcher->parse( $message ) + ); + + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/FieldTypeParserTest.php b/eZ/Publish/Core/REST/Common/Tests/Input/FieldTypeParserTest.php new file mode 100644 index 0000000..b0b0750 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/FieldTypeParserTest.php @@ -0,0 +1,337 @@ +<?php +/** + * File containing the FieldTypeParserTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Input; + +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; + +/** + * FieldTypeParser test class + */ +class FieldTypeParserTest extends \PHPUnit_Framework_TestCase +{ + protected $contentServiceMock; + + protected $contentTypeServiceMock; + + protected $fieldTypeServiceMock; + + protected $contentTypeMock; + + protected $fieldTypeMock; + + protected $fieldTypeProcessorRegistryMock; + + protected $fieldTypeProcessorMock; + + public function setUp() + { + $this->contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentService', + array(), + array(), + '', + false + ); + $this->contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + $this->fieldTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\FieldTypeService', + array(), + array(), + '', + false + ); + $this->contentTypeMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\Values\\ContentType\\ContentType', + array(), + array(), + '', + false + ); + $this->fieldTypeMock = $this->getMock( + 'eZ\\Publish\\SPI\\FieldType\\FieldType', + array(), + array(), + '', + false + ); + $this->fieldTypeProcessorRegistryMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\FieldTypeProcessorRegistry', + array(), + array(), + '', + false + ); + $this->fieldTypeProcessorMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\FieldTypeProcessor', + array(), + array(), + '', + false + ); + } + + public function testParseFieldValue() + { + $fieldTypeParser = $this->getFieldTypeParser(); + + $this->contentServiceMock->expects( $this->once() ) + ->method( 'loadContentInfo' ) + ->with( '23' ) + ->will( + $this->returnValue( + new ContentInfo( + array( + 'contentType' => new ContentType( + array( + 'id' => '42', + 'fieldDefinitions' => array() + ) + ) + ) + ) + ) + ); + + $contentTypeMock = $this->contentTypeMock; + $this->contentTypeServiceMock->expects( $this->once() ) + ->method( 'loadContentType' ) + ->with( '42' ) + ->will( + $this->returnCallback( + // Avoid PHPUnit cloning + function () use ( $contentTypeMock ) + { + return $contentTypeMock; + } + ) + ); + + $contentTypeMock->expects( $this->once() ) + ->method( 'getFieldDefinition' ) + ->with( $this->equalTo( 'my-field-definition' ) ) + ->will( + $this->returnValue( + new FieldDefinition( + array( + 'fieldTypeIdentifier' => 'some-fancy-field-type' + ) + ) + ) + ); + + $this->fieldTypeProcessorRegistryMock->expects( $this->once() ) + ->method( 'hasProcessor' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( $this->returnValue( false ) ); + + $fieldTypeMock = $this->fieldTypeMock; + $this->fieldTypeServiceMock->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( + $this->returnCallback( + // Avoid PHPUnit cloning + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'fromHash' ) + ->with( $this->equalTo( array( 1, 2, 3 ) ) ) + ->will( $this->returnValue( array( 'foo', 'bar' ) ) ); + + $this->assertEquals( + array( 'foo', 'bar' ), + $fieldTypeParser->parseFieldValue( + '23', + 'my-field-definition', + array( 1, 2, 3 ) + ) + ); + } + + public function testParseValue() + { + $fieldTypeParser = $this->getFieldTypeParser(); + + $this->fieldTypeProcessorRegistryMock->expects( $this->once() ) + ->method( 'hasProcessor' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( $this->returnValue( false ) ); + + $fieldTypeMock = $this->fieldTypeMock; + $this->fieldTypeServiceMock->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( + $this->returnCallback( + // Avoid PHPUnit cloning + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'fromHash' ) + ->with( $this->equalTo( array( 1, 2, 3 ) ) ) + ->will( $this->returnValue( array( 'foo', 'bar' ) ) ); + + $this->assertEquals( + array( 'foo', 'bar' ), + $fieldTypeParser->parseValue( + 'some-fancy-field-type', + array( 1, 2, 3 ) + ) + ); + } + + public function testParseValueWithPreProcessing() + { + $fieldTypeParser = $this->getFieldTypeParser(); + + $this->fieldTypeProcessorRegistryMock->expects( $this->once() ) + ->method( 'hasProcessor' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( $this->returnValue( true ) ); + + $processor = $this->fieldTypeProcessorMock; + $this->fieldTypeProcessorRegistryMock->expects( $this->once() ) + ->method( 'getProcessor' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( + $this->returnCallback( + function () use ( $processor ) + { + return $processor; + } + ) + ); + + $processor->expects( $this->once() ) + ->method( 'preProcessHash' ) + ->with( array( 1, 2, 3 ) ) + ->will( $this->returnValue( array( 4, 5, 6 ) ) ); + + $fieldTypeMock = $this->fieldTypeMock; + $this->fieldTypeServiceMock->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( + $this->returnCallback( + // Avoid PHPUnit cloning + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'fromHash' ) + ->with( $this->equalTo( array( 4, 5, 6 ) ) ) + ->will( $this->returnValue( array( 'foo', 'bar' ) ) ); + + $this->assertEquals( + array( 'foo', 'bar' ), + $fieldTypeParser->parseValue( + 'some-fancy-field-type', + array( 1, 2, 3 ) + ) + ); + } + + public function testParseFieldSettings() + { + $fieldTypeParser = $this->getFieldTypeParser(); + + $fieldTypeMock = $this->fieldTypeMock; + $this->fieldTypeServiceMock->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( + $this->returnCallback( + // Avoid PHPUnit cloning + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'fieldSettingsFromHash' ) + ->with( $this->equalTo( array( 1, 2, 3 ) ) ) + ->will( $this->returnValue( array( 'foo', 'bar' ) ) ); + + $this->assertEquals( + array( 'foo', 'bar' ), + $fieldTypeParser->parseFieldSettings( + 'some-fancy-field-type', + array( 1, 2, 3 ) + ) + ); + } + + public function testParseValidatorConfiguration() + { + $fieldTypeParser = $this->getFieldTypeParser(); + + $fieldTypeMock = $this->fieldTypeMock; + $this->fieldTypeServiceMock->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'some-fancy-field-type' ) ) + ->will( + $this->returnCallback( + // Avoid PHPUnit cloning + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'validatorConfigurationFromHash' ) + ->with( $this->equalTo( array( 1, 2, 3 ) ) ) + ->will( $this->returnValue( array( 'foo', 'bar' ) ) ); + + $this->assertEquals( + array( 'foo', 'bar' ), + $fieldTypeParser->parseValidatorConfiguration( + 'some-fancy-field-type', + array( 1, 2, 3 ) + ) + ); + } + + protected function getFieldTypeParser() + { + return new FieldTypeParser( + $this->contentServiceMock, + $this->contentTypeServiceMock, + $this->fieldTypeServiceMock, + $this->fieldTypeProcessorRegistryMock + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/JsonTest.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/JsonTest.php new file mode 100644 index 0000000..e284df3 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/JsonTest.php @@ -0,0 +1,65 @@ +<?php +/** + * File containing the JsonTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Input\Handler; + +use eZ\Publish\Core\REST\Common; + +/** + * Json input handler test + */ +class JsonTest extends \PHPUnit_Framework_TestCase +{ + /** + * Tests conversion of array to JSON + */ + public function testConvertJson() + { + $handler = $this->getHandler(); + + $this->assertSame( + array( + 'text' => 'Hello world!', + ), + $handler->convert( '{"text":"Hello world!"}' ) + ); + } + + public function testConvertFieldValue() + { + $handler = $this->getHandler(); + + $this->assertSame( + array( + 'Field' => array( + 'fieldValue' => array( + array( + 'id' => 1, + 'name' => 'Joe Sindelfingen', + 'email' => 'sindelfingen@example.com', + ), + array( + 'id' => 2, + 'name' => 'Joe Bielefeld', + 'email' => 'bielefeld@example.com', + ), + ) + ) + ), + $handler->convert( + '{"Field":{"fieldValue":[{"id":1,"name":"Joe Sindelfingen","email":"sindelfingen@example.com"},{"id":2,"name":"Joe Bielefeld","email":"bielefeld@example.com"}]}}' + ) + ); + } + + protected function getHandler() + { + return new Common\Input\Handler\Json(); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/XmlTest.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/XmlTest.php new file mode 100644 index 0000000..d64f00c --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/XmlTest.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the XmlTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Input\Handler; + +use eZ\Publish\Core\REST\Common; + +/** + * Xml input handler test class + */ +class XmlTest extends \PHPUnit_Framework_TestCase +{ + /** + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + */ + public function testConvertInvalidXml() + { + $handler = new Common\Input\Handler\Xml(); + + $this->assertSame( + array( + 'text' => 'Hello world!', + ), + $handler->convert( '{"text":"Hello world!"}' ) + ); + } + + public static function getXmlFixtures() + { + $fixtures = array(); + foreach ( glob( __DIR__ . '/_fixtures/*.xml' ) as $xmlFile ) + { + $fixtures[] = array( + file_get_contents( $xmlFile ), + is_file( $xmlFile . '.php' ) ? include $xmlFile . '.php' : null, + ); + } + + return $fixtures; + } + + /** + * @dataProvider getXmlFixtures + */ + public function testConvertXml( $xml, $expectation ) + { + $handler = new Common\Input\Handler\Xml(); + + $this->assertSame( + $expectation, + $handler->convert( $xml ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceList.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceList.xml new file mode 100644 index 0000000..1715704 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceList.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ContentList media-type="application/vnd.ez.api.ContentList+xml" href="/content/objects"> + <Content media-type="application/vnd.ez.api.ContentInfo+xml" href="/content/contents/94" id="94"> + <ContentType media-type="application/vnd.ez.api.ContentType+xml" href="/content/types/23"/> + <name>Support</name> + </Content> +</ContentList> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceList.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceList.xml.php new file mode 100644 index 0000000..573eaca --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceList.xml.php @@ -0,0 +1,25 @@ +<?php + +return array ( + 'ContentList' => + array ( + '_media-type' => 'application/vnd.ez.api.ContentList+xml', + '_href' => '/content/objects', + 'Content' => + array ( + 0 => + array ( + '_media-type' => 'application/vnd.ez.api.ContentInfo+xml', + '_href' => '/content/contents/94', + '_id' => '94', + 'ContentType' => + array ( + '_media-type' => 'application/vnd.ez.api.ContentType+xml', + '_href' => '/content/types/23', + ), + 'name' => 'Support', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceListDouble.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceListDouble.xml new file mode 100644 index 0000000..20ec6c2 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceListDouble.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ContentList media-type="application/vnd.ez.api.ContentList+xml" href="/content/objects"> + <ContentInfo media-type="application/vnd.ez.api.ContentInfo+xml" href="/content/contents/94" id="94"> + <ContentType media-type="application/vnd.ez.api.ContentType+xml" href="/content/types/23"/> + <name>Support</name> + </ContentInfo> + <ContentInfo media-type="application/vnd.ez.api.ContentInfo+xml" href="/content/contents/94" id="95"> + <ContentType media-type="application/vnd.ez.api.ContentType+xml" href="/content/types/23"/> + <name>Support 2</name> + </ContentInfo> +</ContentList> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceListDouble.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceListDouble.xml.php new file mode 100644 index 0000000..37f227b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/forceListDouble.xml.php @@ -0,0 +1,37 @@ +<?php + +return array ( + 'ContentList' => + array ( + '_media-type' => 'application/vnd.ez.api.ContentList+xml', + '_href' => '/content/objects', + 'ContentInfo' => + array ( + 0 => + array ( + '_media-type' => 'application/vnd.ez.api.ContentInfo+xml', + '_href' => '/content/contents/94', + '_id' => '94', + 'ContentType' => + array ( + '_media-type' => 'application/vnd.ez.api.ContentType+xml', + '_href' => '/content/types/23', + ), + 'name' => 'Support', + ), + 1 => + array ( + '_media-type' => 'application/vnd.ez.api.ContentInfo+xml', + '_href' => '/content/contents/94', + '_id' => '95', + 'ContentType' => + array ( + '_media-type' => 'application/vnd.ez.api.ContentType+xml', + '_href' => '/content/types/23', + ), + 'name' => 'Support 2', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorAttribute.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorAttribute.xml new file mode 100644 index 0000000..ba25d71 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorAttribute.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml" attribute="value"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorAttribute.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorAttribute.xml.php new file mode 100644 index 0000000..02b82ce --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorAttribute.xml.php @@ -0,0 +1,10 @@ +<?php + +return array ( + 'element' => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + '_attribute' => 'value', + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElement.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElement.xml new file mode 100644 index 0000000..011ebe7 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElement.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElement.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElement.xml.php new file mode 100644 index 0000000..34363ba --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElement.xml.php @@ -0,0 +1,9 @@ +<?php + +return array ( + 'element' => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElementList.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElementList.xml new file mode 100644 index 0000000..5f413ac --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElementList.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<elementList media-type="application/vnd.ez.api.elementList+xml"><element media-type="application/vnd.ez.api.element+xml"/><element media-type="application/vnd.ez.api.element+xml"/></elementList> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElementList.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElementList.xml.php new file mode 100644 index 0000000..0204f98 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorElementList.xml.php @@ -0,0 +1,20 @@ +<?php + +return array ( + 'elementList' => + array ( + '_media-type' => 'application/vnd.ez.api.elementList+xml', + 'element' => + array ( + 0 => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + ), + 1 => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorEmptyValueElement.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorEmptyValueElement.xml new file mode 100644 index 0000000..a77ea3e --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorEmptyValueElement.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"><value></value></element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorEmptyValueElement.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorEmptyValueElement.xml.php new file mode 100644 index 0000000..7e92eff --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorEmptyValueElement.xml.php @@ -0,0 +1,10 @@ +<?php + +return array ( + 'element' => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + 'value' => null, + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolFalse.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolFalse.xml new file mode 100644 index 0000000..9c58cdd --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolFalse.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue>false</fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolFalse.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolFalse.xml.php new file mode 100644 index 0000000..6bab6ca --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolFalse.xml.php @@ -0,0 +1,12 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => false, + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolTrue.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolTrue.xml new file mode 100644 index 0000000..0a48c01 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolTrue.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue>true</fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolTrue.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolTrue.xml.php new file mode 100644 index 0000000..a9b6935 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueBoolTrue.xml.php @@ -0,0 +1,12 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => true, + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueComplexAuthor.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueComplexAuthor.xml new file mode 100644 index 0000000..8c793dc --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueComplexAuthor.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue> + <value> + <value key="id">1</value> + <value key="name">Joe Sindelfingen</value> + <value key="email">sindelfingen@example.com</value> + </value> + <value> + <value key="id">2</value> + <value key="name">Joe Bielefeld</value> + <value key="email">bielefeld@example.com</value> + </value> + </fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueComplexAuthor.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueComplexAuthor.xml.php new file mode 100644 index 0000000..42e59d4 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueComplexAuthor.xml.php @@ -0,0 +1,23 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => array( + array( + 'id' => 1, + 'name' => 'Joe Sindelfingen', + 'email' => 'sindelfingen@example.com', + ), + array( + 'id' => 2, + 'name' => 'Joe Bielefeld', + 'email' => 'bielefeld@example.com', + ), + ) + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueFloat.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueFloat.xml new file mode 100644 index 0000000..5a7463a --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueFloat.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue>23.42</fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueFloat.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueFloat.xml.php new file mode 100644 index 0000000..0d10b1c --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueFloat.xml.php @@ -0,0 +1,12 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => 23.42, + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueHash.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueHash.xml new file mode 100644 index 0000000..392980e --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueHash.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue> + <value key="first">Sindelfingen</value> + <value key="second">Bielefeld</value> + </fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueHash.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueHash.xml.php new file mode 100644 index 0000000..ad97173 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueHash.xml.php @@ -0,0 +1,15 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => array( + 'first' => 'Sindelfingen', + 'second' => 'Bielefeld', + ) + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueInteger.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueInteger.xml new file mode 100644 index 0000000..3e18e31 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueInteger.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue>23</fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueInteger.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueInteger.xml.php new file mode 100644 index 0000000..bbdf991 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueInteger.xml.php @@ -0,0 +1,12 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => 23, + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueList.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueList.xml new file mode 100644 index 0000000..6ea6302 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueList.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue> + <value>Sindelfingen</value> + <value>Bielefeld</value> + <value>Skien</value> + <value>Dinslaken</value> + </fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueList.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueList.xml.php new file mode 100644 index 0000000..9ce9110 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueList.xml.php @@ -0,0 +1,17 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => array( + 'Sindelfingen', + 'Bielefeld', + 'Skien', + 'Dinslaken', + ) + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueNull.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueNull.xml new file mode 100644 index 0000000..cecbd03 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueNull.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue/> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueNull.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueNull.xml.php new file mode 100644 index 0000000..e3cb91b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueNull.xml.php @@ -0,0 +1,12 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => null, + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueString.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueString.xml new file mode 100644 index 0000000..4320244 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueString.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Version media-type="application/vnd.ez.api.Version+xml"> + <Field> + <fieldValue>Sindelfingen</fieldValue> + </Field> +</Version> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueString.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueString.xml.php new file mode 100644 index 0000000..ced06a1 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorFieldTypeValueString.xml.php @@ -0,0 +1,12 @@ +<?php + +return array ( + 'Version' => + array ( + '_media-type' => 'application/vnd.ez.api.Version+xml', + 'Field' => array( + 'fieldValue' => 'Sindelfingen', + ) + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorHashElement.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorHashElement.xml new file mode 100644 index 0000000..f311bdd --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorHashElement.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element> + <value attribute="attribute value 1" >value 1</value> + <value attribute="attribute value 2" >value 2</value> +</element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorHashElement.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorHashElement.xml.php new file mode 100644 index 0000000..66b8c04 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorHashElement.xml.php @@ -0,0 +1,18 @@ +<?php + +return array ( + 'element' => + array ( + 'value' => array( + array( + '_attribute' => 'attribute value 1', + '#text' => 'value 1', + ), + array( + '_attribute' => 'attribute value 2', + '#text' => 'value 2', + ) + ), + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorMultipleAttributes.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorMultipleAttributes.xml new file mode 100644 index 0000000..afdbcb4 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorMultipleAttributes.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml" attribute1="value" attribute2="value"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorMultipleAttributes.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorMultipleAttributes.xml.php new file mode 100644 index 0000000..fc2486b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorMultipleAttributes.xml.php @@ -0,0 +1,11 @@ +<?php + +return array ( + 'element' => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + '_attribute1' => 'value', + '_attribute2' => 'value', + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorStackedElement.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorStackedElement.xml new file mode 100644 index 0000000..6463081 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorStackedElement.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"><stacked media-type="application/vnd.ez.api.stacked+xml"/></element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorStackedElement.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorStackedElement.xml.php new file mode 100644 index 0000000..369bd90 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorStackedElement.xml.php @@ -0,0 +1,13 @@ +<?php + +return array ( + 'element' => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + 'stacked' => + array ( + '_media-type' => 'application/vnd.ez.api.stacked+xml', + ), + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorTripleElementList.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorTripleElementList.xml new file mode 100644 index 0000000..ee800df --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorTripleElementList.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<elementList media-type="application/vnd.ez.api.elementList+xml"><element media-type="application/vnd.ez.api.element+xml"/><element media-type="application/vnd.ez.api.element+xml"/><element media-type="application/vnd.ez.api.element+xml"/></elementList> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorTripleElementList.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorTripleElementList.xml.php new file mode 100644 index 0000000..32bc866 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorTripleElementList.xml.php @@ -0,0 +1,24 @@ +<?php + +return array ( + 'elementList' => + array ( + '_media-type' => 'application/vnd.ez.api.elementList+xml', + 'element' => + array ( + 0 => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + ), + 1 => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + ), + 2 => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + ), + ), + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorValueElement.xml b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorValueElement.xml new file mode 100644 index 0000000..25f26e0 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorValueElement.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"><value>42</value></element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorValueElement.xml.php b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorValueElement.xml.php new file mode 100644 index 0000000..ddbdbdb --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/Handler/_fixtures/testGeneratorValueElement.xml.php @@ -0,0 +1,10 @@ +<?php + +return array ( + 'element' => + array ( + '_media-type' => 'application/vnd.ez.api.element+xml', + 'value' => '42', + ), +); + diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/ParserToolsTest.php b/eZ/Publish/Core/REST/Common/Tests/Input/ParserToolsTest.php new file mode 100644 index 0000000..cdaba70 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/ParserToolsTest.php @@ -0,0 +1,106 @@ +<?php +/** + * File containing a ParserToolsTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Input; + +use eZ\Publish\Core\REST\Common\Input\ParserTools; + +class ParserToolsTest extends \PHPUnit_Framework_TestCase +{ + + public function testIsEmbeddedObjectReturnsTrue() + { + $parserTools = $this->getParserTools(); + + $this->assertTrue( + $parserTools->isEmbeddedObject( + array( + '_href' => '/foo/bar', + '_media-type' => 'application/some-type', + 'id' => 23, + ) + ) + ); + } + + public function testIsEmbeddedObjectReturnsFalse() + { + $parserTools = $this->getParserTools(); + + $this->assertFalse( + $parserTools->isEmbeddedObject( + array( + '_href' => '/foo/bar', + '_media-type' => 'application/some-type', + ) + ) + ); + } + + public function testParseObjectElementEmbedded() + { + $parserTools = $this->getParserTools(); + + $dispatcherMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher', + array(), + array(), + '', + false + ); + $dispatcherMock->expects( $this->once() ) + ->method( 'parse' ) + ->with( + $this->isType( 'array' ), + $this->equalTo( 'application/my-type' ) + ); + + $parsingInput = array( + '_href' => '/foo/bar', + '_media-type' => 'application/my-type', + 'someContent' => array(), + ); + + $this->assertEquals( + '/foo/bar', + $parserTools->parseObjectElement( $parsingInput, $dispatcherMock ) + ); + } + + public function testParseObjectElementNotEmbedded() + { + $parserTools = $this->getParserTools(); + + $dispatcherMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher', + array(), + array(), + '', + false + ); + $dispatcherMock->expects( $this->never() ) + ->method( 'parse' ); + + $parsingInput = array( + '_href' => '/foo/bar', + '_media-type' => 'application/my-type', + '#someTextContent' => 'foo', + ); + + $this->assertEquals( + '/foo/bar', + $parserTools->parseObjectElement( $parsingInput, $dispatcherMock ) + ); + } + + protected function getParserTools() + { + return new ParserTools(); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Input/ParsingDispatcherTest.php b/eZ/Publish/Core/REST/Common/Tests/Input/ParsingDispatcherTest.php new file mode 100644 index 0000000..39f24b8 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Input/ParsingDispatcherTest.php @@ -0,0 +1,70 @@ +<?php +/** + * File containing the ParsingDispatcherTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Input; + +use eZ\Publish\Core\REST\Common; + +/** + * ParsingDispatcher test class + */ +class ParsingDispatcherTest extends \PHPUnit_Framework_TestCase +{ + /** + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + */ + public function testParseMissingContentType() + { + $dispatcher = new Common\Input\ParsingDispatcher(); + + $dispatcher->parse( array(), 'text/unknown' ); + } + + public function testParse() + { + $parser = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\Parser' ); + $dispatcher = new Common\Input\ParsingDispatcher( + array( + 'text/html' => $parser, + ) + ); + + $parser + ->expects( $this->at( 0 ) ) + ->method( 'parse' ) + ->with( array( 42 ), $dispatcher ) + ->will( $this->returnValue( 23 ) ); + + $this->assertSame( + 23, + $dispatcher->parse( array( 42 ), 'text/html' ) + ); + } + + public function testParseStripFormat() + { + $parser = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Input\\Parser' ); + $dispatcher = new Common\Input\ParsingDispatcher( + array( + 'text/html' => $parser, + ) + ); + + $parser + ->expects( $this->at( 0 ) ) + ->method( 'parse' ) + ->with( array( 42 ), $dispatcher ) + ->will( $this->returnValue( 23 ) ); + + $this->assertSame( + 23, + $dispatcher->parse( array( 42 ), 'text/html+json' ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/MessageTest.php b/eZ/Publish/Core/REST/Common/Tests/MessageTest.php new file mode 100644 index 0000000..ab85931 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/MessageTest.php @@ -0,0 +1,65 @@ +<?php +/** + * File containing the MessageTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests; + +use eZ\Publish\Core\REST\Common; + +/** + * Tests for Message class + */ +class MessageTest extends \PHPUnit_Framework_TestCase +{ + /** + * Tests creating the message with default headers + */ + public function testCreateMessageDefaultHeaders() + { + $message = new Common\Message(); + + $this->assertSame( array(), $message->headers ); + } + + /** + * Tests creating the message with default body + */ + public function testCreateMessageDefaultBody() + { + $message = new Common\Message(); + + $this->assertSame( '', $message->body ); + } + + /** + * Tests creating message with headers set through constructor + */ + public function testCreateMessageConstructorHeaders() + { + $message = new Common\Message( + $headers = array( + 'Content-Type' => 'text/xml', + ) + ); + + $this->assertSame( $headers, $message->headers ); + } + + /** + * Tests creating message with body set through constructor + */ + public function testCreateMessageConstructorBody() + { + $message = new Common\Message( + array(), + 'Hello world!' + ); + + $this->assertSame( 'Hello world!', $message->body ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/FieldTypeSerializerTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/FieldTypeSerializerTest.php new file mode 100644 index 0000000..e0ab561 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/FieldTypeSerializerTest.php @@ -0,0 +1,392 @@ +<?php +/** + * File containing the FieldTypeSerializerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output; + +use eZ\Publish\Core\REST\Common; +use eZ\Publish\API\Repository\Values\Content\Field; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; + +/** + * FieldTypeSerializer test + */ +class FieldTypeSerializerTest extends \PHPUnit_Framework_TestCase +{ + protected $fieldTypeServiceMock; + + protected $fieldTypeProcessorRegistryMock; + + protected $fieldTypeProcessorMock; + + protected $contentTypeMock; + + protected $fieldTypeMock; + + protected $generatorMock; + + public function testSerializeFieldValue() + { + $serializer = $this->getFieldTypeSerializer(); + + $this->getGeneratorMock()->expects( $this->once() ) + ->method( 'generateFieldTypeHash' ) + ->with( + $this->equalTo( 'fieldValue' ), + $this->equalTo( array( 23, 42 ) ) + ); + + $this->getContentTypeMock()->expects( $this->once() ) + ->method( 'getFieldDefinition' ) + ->with( + $this->equalTo( 'some-field' ) + )->will( + $this->returnValue( + new FieldDefinition( + array( + 'fieldTypeIdentifier' => 'myFancyFieldType', + ) + ) + ) + ); + + $fieldTypeMock = $this->getFieldTypeMock(); + $this->getFieldTypeServiceMock()->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'myFancyFieldType' ) ) + ->will( + $this->returnCallback( + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'toHash' ) + ->with( $this->equalTo( 'my-field-value' ) ) + ->will( $this->returnValue( array( 23, 42 ) ) ); + + $serializer->serializeFieldValue( + $this->getGeneratorMock(), + $this->getContentTypeMock(), + new Field( + array( + 'fieldDefIdentifier' => 'some-field', + 'value' => 'my-field-value' + ) + ) + ); + } + + public function testSerializeFieldValueWithProcessor() + { + $serializer = $this->getFieldTypeSerializer(); + + $this->getGeneratorMock()->expects( $this->once() ) + ->method( 'generateFieldTypeHash' ) + ->with( + $this->equalTo( 'fieldValue' ), + $this->equalTo( array( 'post-processed' ) ) + ); + + $this->getContentTypeMock()->expects( $this->once() ) + ->method( 'getFieldDefinition' ) + ->with( + $this->equalTo( 'some-field' ) + )->will( + $this->returnValue( + new FieldDefinition( + array( + 'fieldTypeIdentifier' => 'myFancyFieldType', + ) + ) + ) + ); + + $processorMock = $this->getFieldTypeProcessorMock(); + $this->getFieldTypeProcessorRegistryMock() + ->expects( $this->once() ) + ->method( 'hasProcessor' ) + ->with( 'myFancyFieldType' ) + ->will( $this->returnValue( true ) ); + $this->getFieldTypeProcessorRegistryMock() + ->expects( $this->once() ) + ->method( 'getProcessor' ) + ->with( 'myFancyFieldType' ) + ->will( + $this->returnCallback( + function () use ( $processorMock ) + { + return $processorMock; + } + ) + ); + $processorMock->expects( $this->once() ) + ->method( 'postProcessHash' ) + ->with( $this->equalTo( array( 23, 42 ) ) ) + ->will( $this->returnValue( array( 'post-processed' ) ) ); + + $fieldTypeMock = $this->getFieldTypeMock(); + $this->getFieldTypeServiceMock()->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'myFancyFieldType' ) ) + ->will( + $this->returnCallback( + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'getFieldTypeIdentifier' ) + ->will( $this->returnValue( 'myFancyFieldType' ) ); + $fieldTypeMock->expects( $this->once() ) + ->method( 'toHash' ) + ->with( $this->equalTo( 'my-field-value' ) ) + ->will( $this->returnValue( array( 23, 42 ) ) ); + + $serializer->serializeFieldValue( + $this->getGeneratorMock(), + $this->getContentTypeMock(), + new Field( + array( + 'fieldDefIdentifier' => 'some-field', + 'value' => 'my-field-value' + ) + ) + ); + } + + public function testSerializeFieldDefaultValue() + { + $serializer = $this->getFieldTypeSerializer(); + + $this->getGeneratorMock()->expects( $this->once() ) + ->method( 'generateFieldTypeHash' ) + ->with( + $this->equalTo( 'defaultValue' ), + $this->equalTo( array( 23, 42 ) ) + ); + + $fieldTypeMock = $this->getFieldTypeMock(); + $this->getFieldTypeServiceMock()->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'myFancyFieldType' ) ) + ->will( + $this->returnCallback( + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'toHash' ) + ->with( $this->equalTo( 'my-field-value' ) ) + ->will( $this->returnValue( array( 23, 42 ) ) ); + + $fieldDefinition = new FieldDefinition( + array( + 'fieldTypeIdentifier' => 'myFancyFieldType', + ) + ); + + $serializer->serializeFieldDefaultValue( + $this->getGeneratorMock(), + $fieldDefinition, + 'my-field-value' + ); + } + + public function testSerializeFieldSettings() + { + $serializer = $this->getFieldTypeSerializer(); + + $this->getGeneratorMock()->expects( $this->once() ) + ->method( 'generateFieldTypeHash' ) + ->with( + $this->equalTo( 'fieldSettings' ), + $this->equalTo( array( 'foo' => 'bar' ) ) + ); + + $fieldTypeMock = $this->getFieldTypeMock(); + $this->getFieldTypeServiceMock()->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'myFancyFieldType' ) ) + ->will( + $this->returnCallback( + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'fieldSettingsToHash' ) + ->with( $this->equalTo( 'my-field-settings' ) ) + ->will( $this->returnValue( array( 'foo' => 'bar' ) ) ); + + $fieldDefinition = new FieldDefinition( + array( + 'fieldTypeIdentifier' => 'myFancyFieldType', + ) + ); + + $serializer->serializeFieldSettings( + $this->getGeneratorMock(), + $fieldDefinition, + 'my-field-settings' + ); + } + + public function testSerializeValidatorConfiguration() + { + $serializer = $this->getFieldTypeSerializer(); + + $this->getGeneratorMock()->expects( $this->once() ) + ->method( 'generateFieldTypeHash' ) + ->with( + $this->equalTo( 'validatorConfiguration' ), + $this->equalTo( array( 'bar' => 'foo' ) ) + ); + + $fieldTypeMock = $this->getFieldTypeMock(); + $this->getFieldTypeServiceMock()->expects( $this->once() ) + ->method( 'getFieldType' ) + ->with( $this->equalTo( 'myFancyFieldType' ) ) + ->will( + $this->returnCallback( + function () use ( $fieldTypeMock ) + { + return $fieldTypeMock; + } + ) + ); + + $fieldTypeMock->expects( $this->once() ) + ->method( 'validatorConfigurationToHash' ) + ->with( $this->equalTo( 'validator-config' ) ) + ->will( $this->returnValue( array( 'bar' => 'foo' ) ) ); + + $fieldDefinition = new FieldDefinition( + array( + 'fieldTypeIdentifier' => 'myFancyFieldType', + ) + ); + + $serializer->serializeValidatorConfiguration( + $this->getGeneratorMock(), + $fieldDefinition, + 'validator-config' + ); + } + + protected function getFieldTypeSerializer() + { + return new Common\Output\FieldTypeSerializer( + $this->getFieldTypeServiceMock(), + $this->getFieldTypeProcessorRegistryMock() + ); + } + + protected function getFieldTypeServiceMock() + { + if ( !isset( $this->fieldTypeServiceMock ) ) + { + $this->fieldTypeServiceMock = $this->getMock( + 'eZ\\Publish\\API\\Repository\\FieldTypeService', + array(), + array(), + '', + false + ); + } + return $this->fieldTypeServiceMock; + } + + protected function getFieldTypeProcessorRegistryMock() + { + if ( !isset( $this->fieldTypeProcessorRegistryMock ) ) + { + $this->fieldTypeProcessorRegistryMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\FieldTypeProcessorRegistry', + array(), + array(), + '', + false + ); + } + return $this->fieldTypeProcessorRegistryMock; + } + + protected function getFieldTypeProcessorMock() + { + if ( !isset( $this->fieldTypeProcessorMock ) ) + { + $this->fieldTypeProcessorMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\FieldTypeProcessor', + array(), + array(), + '', + false + ); + } + return $this->fieldTypeProcessorMock; + } + + protected function getContentTypeMock() + { + if ( !isset( $this->contentTypeMock ) ) + { + $this->contentTypeMock = $this->getMock( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + array(), + array(), + '', + false + ); + } + return $this->contentTypeMock; + } + + protected function getFieldTypeMock() + { + if ( !isset( $this->fieldTypeMock ) ) + { + $this->fieldTypeMock = $this->getMock( + 'eZ\\Publish\\API\\Repository\\FieldType', + array(), + array(), + '', + false + ); + } + return $this->fieldTypeMock; + } + + protected function getGeneratorMock() + { + if ( !isset( $this->generatorMock ) ) + { + $this->generatorMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Output\\Generator', + array(), + array(), + '', + false + ); + } + return $this->generatorMock; + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/FieldTypeHashGeneratorBaseTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/FieldTypeHashGeneratorBaseTest.php new file mode 100644 index 0000000..a0e89a5 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/FieldTypeHashGeneratorBaseTest.php @@ -0,0 +1,222 @@ +<?php +/** + * File containing the class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output\Generator; + +use eZ\Publish\Core\REST\Common; + +abstract class FieldTypeHashGeneratorBaseTest extends \PHPUnit_Framework_TestCase +{ + private $generator; + + private $fieldTypeHashGenerator; + + /** + * Initializes the field type hash generator + */ + abstract protected function initializeFieldTypeHashGenerator(); + + /** + * Initializes the generator + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator + */ + abstract protected function initializeGenerator(); + + public function testGenerateNull() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + null + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateBoolValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + true + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateIntegerValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + 23 + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateFloatValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + 23.424242424242424242 + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateStringValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + 'Sindelfingen' + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateEmptyStringValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + '' + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateStringValueWithSpecialChars() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + '<?xml version="1.0" encoding="UTF-8"?><ezxml>Sindelfingen</ezxml>' + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateListArrayValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + array( + 23, + true, + 'Sindelfingen', + null + ) + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateHashArrayValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + array( + 'age' => 23, + 'married' => true, + 'city' => 'Sindelfingen', + 'cause' => null + ) + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateHashArrayMixedValue() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + array( + 23, + 'married' => true, + 'Sindelfingen', + 'cause' => null + ) + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + public function testGenerateComplexValueAuthor() + { + $this->getGenerator()->generateFieldTypeHash( + 'fieldValue', + array( + array( 'id' => 1, 'name' => 'Joe Sindelfingen', 'email' => 'sindelfingen@example.com' ), + array( 'id' => 2, 'name' => 'Joe Bielefeld', 'email' => 'bielefeld@example.com' ), + ) + ); + + $this->assertSerializationSame( __FUNCTION__ ); + } + + protected function getFieldTypeHashGenerator() + { + if ( !isset( $this->fieldTypeHashGenerator ) ) + { + $this->fieldTypeHashGenerator = $this->initializeFieldTypeHashGenerator(); + } + return $this->fieldTypeHashGenerator; + } + + protected function getGenerator() + { + if ( !isset( $this->generator ) ) + { + $this->generator = $this->initializeGenerator(); + $this->generator->startDocument( 'Version' ); + $this->generator->startHashElement( 'Field' ); + } + return $this->generator; + } + + private function getGeneratorOutput() + { + $this->getGenerator()->endHashElement( 'Field' ); + return $this->getGenerator()->endDocument( 'Version' ); + } + + private function assertSerializationSame( $functionName ) + { + $fixtureFile = $this->getFixtureFile( $functionName ); + $actualResult = $this->getGeneratorOutput(); + + // file_put_contents( $fixtureFile, $actualResult ); + // $this->markTestIncomplete( "Wrote fixture to '{$fixtureFile}'." ); + + $this->assertSame( + file_get_contents( $this->getFixtureFile( $functionName ) ), + $actualResult + ); + } + + private function getFixtureFile( $functionName ) + { + return sprintf( + '%s/_fixtures/%s__%s.out', + __DIR__, + $this->getRelativeClassIdentifier(), + $functionName + ); + } + + private function getRelativeClassIdentifier() + { + $fqClassName = get_called_class(); + + return strtr( + substr( + $fqClassName, + strlen( __NAMESPACE__ ) + 1 + ), + array( '\\' => '_' ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/Json/FieldTypeHashGeneratorTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/Json/FieldTypeHashGeneratorTest.php new file mode 100644 index 0000000..81820c7 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/Json/FieldTypeHashGeneratorTest.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output\Generator\Json; + +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\REST\Common\Tests\Output\Generator\FieldTypeHashGeneratorBaseTest; + +class FieldTypeHashGeneratorTest extends FieldTypeHashGeneratorBaseTest +{ + /** + * Initializes the field type hash generator + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Json\FieldTypeHashGenerator + */ + protected function initializeFieldTypeHashGenerator() + { + return new Common\Output\Generator\Json\FieldTypeHashGenerator(); + } + + /** + * Initializes the generator + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator + */ + protected function initializeGenerator() + { + return new Common\Output\Generator\Json( + $this->getFieldTypeHashGenerator() + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/JsonTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/JsonTest.php new file mode 100644 index 0000000..6d35dbe --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/JsonTest.php @@ -0,0 +1,271 @@ +<?php +/** + * File containing the JsonTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output\Generator; + +use eZ\Publish\Core\REST\Common\Tests\Output\GeneratorTest; + +use eZ\Publish\Core\REST\Common; + +require_once __DIR__ . '/../GeneratorTest.php'; + +/** + * Json output generator test class + */ +class JsonTest extends GeneratorTest +{ + protected $generator; + + public function testGeneratorDocument() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $this->assertSame( + '{}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.element+json"}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorElementMediaTypeOverwrite() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element', 'User' ); + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.User+json"}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorStackedElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startObjectElement( 'stacked' ); + $generator->endObjectElement( 'stacked' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.element+json","stacked":{"_media-type":"application\/vnd.ez.api.stacked+json"}}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorAttribute() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startAttribute( 'attribute', 'value' ); + $generator->endAttribute( 'attribute' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.element+json","_attribute":"value"}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorMultipleAttributes() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startAttribute( 'attribute1', 'value' ); + $generator->endAttribute( 'attribute1' ); + + $generator->startAttribute( 'attribute2', 'value' ); + $generator->endAttribute( 'attribute2' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.element+json","_attribute1":"value","_attribute2":"value"}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorValueElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startValueElement( 'value', '42' ); + $generator->endValueElement( 'value' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.element+json","value":"42"}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorElementList() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'elementList' ); + + $generator->startList( 'elements' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $generator->endList( 'elements' ); + + $generator->endObjectElement( 'elementList' ); + + $this->assertSame( + '{"elementList":{"_media-type":"application\/vnd.ez.api.elementList+json","elements":[{"_media-type":"application\/vnd.ez.api.element+json"},{"_media-type":"application\/vnd.ez.api.element+json"}]}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorHashElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startHashElement( 'elements' ); + + $generator->startValueElement( 'element', 'element value 1', array( 'attribute' => 'attribute value 1' ) ); + $generator->endValueElement( 'element' ); + + $generator->endHashElement( 'elements' ); + + $this->assertSame( + '{"elements":{"element":{"_attribute":"attribute value 1","#text":"element value 1"}}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorValueList() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + $generator->startList( 'simpleValue' ); + + $generator->startValueElement( 'simpleValue', 'value1' ); + $generator->endValueElement( 'simpleValue' ); + $generator->startValueElement( 'simpleValue', 'value2' ); + $generator->endValueElement( 'simpleValue' ); + + $generator->endList( 'simpleValue' ); + $generator->endObjectElement( 'element' ); + + $this->assertSame( + '{"element":{"_media-type":"application\/vnd.ez.api.element+json","simpleValue":["value1","value2"]}}', + $generator->endDocument( 'test' ) + ); + } + + public function testGetMediaType() + { + $generator = $this->getGenerator(); + + $this->assertEquals( + 'application/vnd.ez.api.Section+json', + $generator->getMediaType( 'Section' ) + ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testGeneratorMultipleElements() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $generator->startObjectElement( 'element' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testGeneratorMultipleStackedElements() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startObjectElement( 'stacked' ); + $generator->endObjectElement( 'stacked' ); + + $generator->startObjectElement( 'stacked' ); + } + + protected function getGenerator() + { + if ( !isset( $this->generator ) ) + { + $this->generator = new Common\Output\Generator\Json( + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Output\\Generator\\Json\\FieldTypeHashGenerator', + array(), + array(), + '', + false + ) + ); + } + return $this->generator; + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/Xml/FieldTypeHashGeneratorTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/Xml/FieldTypeHashGeneratorTest.php new file mode 100644 index 0000000..5332faa --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/Xml/FieldTypeHashGeneratorTest.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output\Generator\Xml; + +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\REST\Common\Tests\Output\Generator\FieldTypeHashGeneratorBaseTest; + +class FieldTypeHashGeneratorTest extends FieldTypeHashGeneratorBaseTest +{ + /** + * Initializes the field type hash generator + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Xml\FieldTypeHashGenerator + */ + protected function initializeFieldTypeHashGenerator() + { + return new Common\Output\Generator\Xml\FieldTypeHashGenerator(); + } + + /** + * Initializes the generator + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator + */ + protected function initializeGenerator() + { + return new Common\Output\Generator\Xml( + $this->getFieldTypeHashGenerator() + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/XmlTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/XmlTest.php new file mode 100644 index 0000000..6b25e70 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/XmlTest.php @@ -0,0 +1,240 @@ +<?php +/** + * File containing the XmlTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output\Generator; + +use eZ\Publish\Core\REST\Common\Tests\Output\GeneratorTest; + +use eZ\Publish\Core\REST\Common; + +require_once __DIR__ . '/../GeneratorTest.php'; + +/** + * Xml generator test class + */ +class XmlTest extends GeneratorTest +{ + public function testGeneratorDocument() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorElementMediaTypeOverwrite() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element', 'User' ); + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorStackedElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startObjectElement( 'stacked' ); + $generator->endObjectElement( 'stacked' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorAttribute() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startAttribute( 'attribute', 'value' ); + $generator->endAttribute( 'attribute' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorMultipleAttributes() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startAttribute( 'attribute1', 'value' ); + $generator->endAttribute( 'attribute1' ); + + $generator->startAttribute( 'attribute2', 'value' ); + $generator->endAttribute( 'attribute2' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorValueElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'element' ); + + $generator->startValueElement( 'value', '42' ); + $generator->endValueElement( 'value' ); + + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorElementList() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startObjectElement( 'elementList' ); + + $generator->startList( 'elements' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'element' ); + + $generator->endList( 'elements' ); + + $generator->endObjectElement( 'elementList' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorHashElement() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $generator->startHashElement( 'elements' ); + + $generator->startValueElement( 'element', 'element value 1', array( 'attribute' => 'attribute value 1' ) ); + $generator->endValueElement( 'element' ); + + $generator->startValueElement( 'element', 'element value 2', array( 'attribute' => 'attribute value 2' ) ); + $generator->endValueElement( 'element' ); + + $generator->endHashElement( 'elements' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGeneratorValueList() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + $generator->startList( 'simpleValue' ); + + $generator->startValueElement( 'simpleValue', 'value1' ); + $generator->endValueElement( 'simpleValue' ); + $generator->startValueElement( 'simpleValue', 'value2' ); + $generator->endValueElement( 'simpleValue' ); + + $generator->endList( 'simpleValue' ); + $generator->endObjectElement( 'element' ); + + $this->assertSame( + file_get_contents( __DIR__ . '/_fixtures/' . __FUNCTION__ . '.xml' ), + $generator->endDocument( 'test' ) + ); + } + + public function testGetMediaType() + { + $generator = $this->getGenerator(); + + $this->assertEquals( + 'application/vnd.ez.api.Section+xml', + $generator->getMediaType( 'Section' ) + ); + } + + protected function getGenerator() + { + if ( !isset( $this->generator ) ) + { + $this->generator = new Common\Output\Generator\Xml( + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Output\\Generator\\Xml\\FieldTypeHashGenerator', + array(), + array(), + '', + false + ) + ); + } + return $this->generator; + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateBoolValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateBoolValue.out new file mode 100644 index 0000000..18eae10 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateBoolValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":true}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateComplexValueAuthor.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateComplexValueAuthor.out new file mode 100644 index 0000000..36c6b6b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateComplexValueAuthor.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":[{"id":1,"name":"Joe Sindelfingen","email":"sindelfingen@example.com"},{"id":2,"name":"Joe Bielefeld","email":"bielefeld@example.com"}]}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateEmptyStringValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateEmptyStringValue.out new file mode 100644 index 0000000..268eac6 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateEmptyStringValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":""}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateFloatValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateFloatValue.out new file mode 100644 index 0000000..814b913 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateFloatValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":23.424242424242}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateHashArrayMixedValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateHashArrayMixedValue.out new file mode 100644 index 0000000..9b6efdd --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateHashArrayMixedValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":{"0":23,"married":true,"1":"Sindelfingen","cause":null}}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateHashArrayValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateHashArrayValue.out new file mode 100644 index 0000000..a5b2ee9 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateHashArrayValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":{"age":23,"married":true,"city":"Sindelfingen","cause":null}}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateIntegerValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateIntegerValue.out new file mode 100644 index 0000000..bc48e71 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateIntegerValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":23}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateListArrayValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateListArrayValue.out new file mode 100644 index 0000000..b2eb4fc --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateListArrayValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":[23,true,"Sindelfingen",null]}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateNull.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateNull.out new file mode 100644 index 0000000..1ebe625 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateNull.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":null}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateStringValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateStringValue.out new file mode 100644 index 0000000..76e6756 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateStringValue.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":"Sindelfingen"}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateStringValueWithSpecialChars.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateStringValueWithSpecialChars.out new file mode 100644 index 0000000..e4dcd5c --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Json_FieldTypeHashGeneratorTest__testGenerateStringValueWithSpecialChars.out @@ -0,0 +1 @@ +{"Field":{"fieldValue":"<?xml version=\"1.0\" encoding=\"UTF-8\"?><ezxml>Sindelfingen<\/ezxml>"}} \ No newline at end of file diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateBoolValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateBoolValue.out new file mode 100644 index 0000000..ca195a0 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateBoolValue.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue>true</fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateComplexValueAuthor.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateComplexValueAuthor.out new file mode 100644 index 0000000..f390ad9 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateComplexValueAuthor.out @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue> + <value> + <value key="id">1</value> + <value key="name">Joe Sindelfingen</value> + <value key="email">sindelfingen@example.com</value> + </value> + <value> + <value key="id">2</value> + <value key="name">Joe Bielefeld</value> + <value key="email">bielefeld@example.com</value> + </value> + </fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateEmptyStringValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateEmptyStringValue.out new file mode 100644 index 0000000..3306767 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateEmptyStringValue.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue></fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateFloatValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateFloatValue.out new file mode 100644 index 0000000..f6a405b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateFloatValue.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue>23.424242</fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateHashArrayMixedValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateHashArrayMixedValue.out new file mode 100644 index 0000000..aba5a4d --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateHashArrayMixedValue.out @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue> + <value key="0">23</value> + <value key="married">true</value> + <value key="1">Sindelfingen</value> + <value key="cause"/> + </fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateHashArrayValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateHashArrayValue.out new file mode 100644 index 0000000..82f83d2 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateHashArrayValue.out @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue> + <value key="age">23</value> + <value key="married">true</value> + <value key="city">Sindelfingen</value> + <value key="cause"/> + </fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateIntegerValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateIntegerValue.out new file mode 100644 index 0000000..a5a9ec4 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateIntegerValue.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue>23</fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateListArrayValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateListArrayValue.out new file mode 100644 index 0000000..0bd769c --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateListArrayValue.out @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue> + <value>23</value> + <value>true</value> + <value>Sindelfingen</value> + <value/> + </fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateNull.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateNull.out new file mode 100644 index 0000000..40d692a --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateNull.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue/> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateStringValue.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateStringValue.out new file mode 100644 index 0000000..a14540b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateStringValue.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue>Sindelfingen</fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateStringValueWithSpecialChars.out b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateStringValueWithSpecialChars.out new file mode 100644 index 0000000..19f700c --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/Xml_FieldTypeHashGeneratorTest__testGenerateStringValueWithSpecialChars.out @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Field> + <fieldValue><?xml version="1.0" encoding="UTF-8"?><ezxml>Sindelfingen</ezxml></fieldValue> +</Field> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorAttribute.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorAttribute.xml new file mode 100644 index 0000000..ba25d71 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorAttribute.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml" attribute="value"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorDocument.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorDocument.xml new file mode 100644 index 0000000..12bbf74 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorDocument.xml @@ -0,0 +1 @@ +<?xml version="1.0" encoding="UTF-8"?> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElement.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElement.xml new file mode 100644 index 0000000..011ebe7 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElement.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElementList.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElementList.xml new file mode 100644 index 0000000..19ccd10 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElementList.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<elementList media-type="application/vnd.ez.api.elementList+xml"> + <element media-type="application/vnd.ez.api.element+xml"/> + <element media-type="application/vnd.ez.api.element+xml"/> +</elementList> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElementMediaTypeOverwrite.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElementMediaTypeOverwrite.xml new file mode 100644 index 0000000..c8cbe29 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorElementMediaTypeOverwrite.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.User+xml"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorHashElement.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorHashElement.xml new file mode 100644 index 0000000..1157d56 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorHashElement.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<elements> + <element attribute="attribute value 1">element value 1</element> + <element attribute="attribute value 2">element value 2</element> +</elements> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorMultipleAttributes.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorMultipleAttributes.xml new file mode 100644 index 0000000..afdbcb4 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorMultipleAttributes.xml @@ -0,0 +1,2 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml" attribute1="value" attribute2="value"/> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorStackedElement.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorStackedElement.xml new file mode 100644 index 0000000..c9b12cb --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorStackedElement.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"> + <stacked media-type="application/vnd.ez.api.stacked+xml"/> +</element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorValueElement.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorValueElement.xml new file mode 100644 index 0000000..40a19c0 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorValueElement.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"> + <value>42</value> +</element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorValueList.xml b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorValueList.xml new file mode 100644 index 0000000..6295fd1 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/Generator/_fixtures/testGeneratorValueList.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<element media-type="application/vnd.ez.api.element+xml"> + <simpleValue>value1</simpleValue> + <simpleValue>value2</simpleValue> +</element> diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php new file mode 100644 index 0000000..ca836f0 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/GeneratorTest.php @@ -0,0 +1,203 @@ +<?php +/** + * File containing the GeneratorTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output; + +use eZ\Publish\Core\REST\Common; + +/** + * Output generator test class + */ +abstract class GeneratorTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \eZ\Publish\Core\REST\Common\Output\Generator + */ + protected $generator; + + /** + * @return \eZ\Publish\Core\REST\Common\Output\Generator + */ + abstract protected function getGenerator(); + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidDocumentStart() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startDocument( 'test' ); + } + + public function testValidDocumentStartAfterReset() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->reset(); + $generator->startDocument( 'test' ); + + $this->assertNotNull( $generator->endDocument( 'test' ) ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidDocumentNameEnd() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->endDocument( 'invalid' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidOuterElementStart() + { + $generator = $this->getGenerator(); + + $generator->startObjectElement( 'element' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidElementEnd() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + $generator->endObjectElement( 'invalid' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidDocumentEnd() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + $generator->endDocument( 'test' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidAttributeOuterStart() + { + $generator = $this->getGenerator(); + + $generator->startAttribute( 'attribute', 'value' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidAttributeDocumentStart() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startAttribute( 'attribute', 'value' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidAttributeListStart() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + $generator->startList( 'list' ); + $generator->startAttribute( 'attribute', 'value' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidValueElementOuterStart() + { + $generator = $this->getGenerator(); + + $generator->startValueElement( 'element', 'value' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidValueElementDocumentStart() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startValueElement( 'element', 'value' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidListOuterStart() + { + $generator = $this->getGenerator(); + + $generator->startList( 'list' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidListDocumentStart() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startList( 'list' ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\OutputGeneratorException + */ + public function testInvalidListListStart() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + $generator->startList( 'list' ); + $generator->startList( 'attribute', 'value' ); + } + + public function testEmptyDocument() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + + $this->assertTrue( $generator->isEmpty() ); + } + + public function testNonEmptyDocument() + { + $generator = $this->getGenerator(); + + $generator->startDocument( 'test' ); + $generator->startObjectElement( 'element' ); + + $this->assertFalse( $generator->isEmpty() ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/ValueObject.php b/eZ/Publish/Core/REST/Common/Tests/Output/ValueObject.php new file mode 100644 index 0000000..24f789b --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/ValueObject.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the ValueObject dummy class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output; + +use stdClass; + +/** + * Test dummy class + */ +class ValueObject extends stdClass +{ +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php new file mode 100644 index 0000000..9f68a14 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/ValueObjectVisitorBaseTest.php @@ -0,0 +1,92 @@ +<?php +/** + * File containing ValueObjectVisitorBaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output; + +use eZ\Publish\Core\REST\Server\Tests; + +use eZ\Publish\Core\REST\Common\Output\Generator; + +abstract class ValueObjectVisitorBaseTest extends Tests\BaseTest +{ + /** + * Visitor mock + * + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + protected $visitorMock; + + /** + * Output generator + * + * @var \eZ\Publish\Core\REST\Common\Output\Generator\Xml + */ + protected $generator; + + /** + * Gets the visitor mock + * + * @return \eZ\Publish\Core\REST\Common\Output\Visitor + */ + protected function getVisitorMock() + { + if ( !isset( $this->visitorMock ) ) + { + $this->visitorMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array(), + array(), + '', + false + ); + } + return $this->visitorMock; + } + + /** + * Gets the output generator + * + * @return \eZ\Publish\Core\REST\Common\Output\Generator\Xml + */ + protected function getGenerator() + { + if ( !isset( $this->generator ) ) + { + $this->generator = new Generator\Xml( + new Generator\Xml\FieldTypeHashGenerator() + ); + } + return $this->generator; + } + + /** + * Asserts that the given $xpathExpression returns a non empty node set + * with $domNode as its context. + * + * This method asserts that $xpathExpression results in a non-empty node + * set in context of $domNode, by wrapping the "boolean()" function around + * it and evaluating it on the document owning $domNode. + * + * @param \DOMNode $domNode + * @param string $xpathExpression + */ + protected function assertXPath( \DOMNode $domNode, $xpathExpression ) + { + $ownerDocument = ( $domNode instanceof \DOMDOcument + ? $domNode + : $domNode->ownerDocument ); + + $xpath = new \DOMXPath( $ownerDocument ); + + $this->assertTrue( + $xpath->evaluate( "boolean({$xpathExpression})", $domNode ), + "XPath expression '{$xpathExpression}' resulted in an empty node set." + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/Output/VisitorTest.php b/eZ/Publish/Core/REST/Common/Tests/Output/VisitorTest.php new file mode 100644 index 0000000..ab1c472 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/Output/VisitorTest.php @@ -0,0 +1,375 @@ +<?php +/** + * File containing the VisitorTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\Output; + +use eZ\Publish\Core\REST\Common; +use stdClass; +use PHPUnit_Framework_TestCase; + +/** + * Visitor test + */ +class VisitorTest extends PHPUnit_Framework_TestCase +{ + public function testVisitDocument() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $generator + ->expects( $this->at( 1 ) ) + ->method( 'startDocument' ) + ->with( $data ); + + $generator + ->expects( $this->at( 2 ) ) + ->method( 'isEmpty' ) + ->will( $this->returnValue( false ) ); + + $generator + ->expects( $this->at( 3 ) ) + ->method( 'endDocument' ) + ->with( $data ) + ->will( $this->returnValue( 'Hello world!' ) ); + + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $this->assertEquals( + new Common\Message( array(), 'Hello world!' ), + $visitor->visit( $data ) + ); + } + + public function testVisitEmptyDocument() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $generator + ->expects( $this->at( 1 ) ) + ->method( 'startDocument' ) + ->with( $data ); + + $generator + ->expects( $this->at( 2 ) ) + ->method( 'isEmpty' ) + ->will( $this->returnValue( true ) ); + + $generator + ->expects( $this->never() ) + ->method( 'endDocument' ); + + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $this->assertEquals( + new Common\Message( array() ), + $visitor->visit( $data ) + ); + } + + public function testVisitValueObject() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + $visitor + ->expects( $this->at( 0 ) ) + ->method( 'visitValueObject' ) + ->with( $data ); + + $this->assertEquals( + new Common\Message( array(), null ), + $visitor->visit( $data ) + ); + } + + public function testSetHeaders() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setHeader( 'Content-Type', 'text/xml' ); + $this->assertEquals( + new Common\Message( + array( + 'Content-Type' => 'text/xml', + ), + null + ), + $visitor->visit( $data ) + ); + } + + /** + * @todo This is a test for a feature that needs refactoring. + * @see \eZ\Publish\Core\REST\Common\Output\Visitor::visit + */ + public function testSetFilteredHeaders() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setHeader( 'Content-Type', 'text/xml' ); + $visitor->setHeader( 'Accept-Patch', false ); + $this->assertEquals( + new Common\Message( + array( + 'Content-Type' => 'text/xml', + ), + null + ), + $visitor->visit( $data ) + ); + } + + public function testSetHeadersNoOverwrite() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setHeader( 'Content-Type', 'text/xml' ); + $visitor->setHeader( 'Content-Type', 'text/html' ); + $this->assertEquals( + new Common\Message( + array( + 'Content-Type' => 'text/xml', + ), + null + ), + $visitor->visit( $data ) + ); + } + + public function testSetHeaderResetAfterVisit() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setHeader( 'Content-Type', 'text/xml' ); + + $visitor->visit( $data ); + $result = $visitor->visit( $data ); + + $this->assertEquals( + new Common\Message( + array(), + null + ), + $result + ); + } + + public function testSetStatusCode() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setStatus( 201 ); + $this->assertEquals( + new Common\Message( + array( + 'Status' => '201 Created', + ), + null, + 201 + ), + $visitor->visit( $data ) + ); + } + + public function testSetUnknownStatusCode() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setStatus( 2342 ); + $this->assertEquals( + new Common\Message( + array( + 'Status' => '2342 Unknown', + ), + null, + 2342 + ), + $visitor->visit( $data ) + ); + } + + public function testSetStatusCodeNoOverride() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array( 'visitValueObject' ), + array( $generator, array() ) + ); + + $visitor->setStatus( 201 ); + $visitor->setStatus( 404 ); + + $this->assertEquals( + new Common\Message( + array( + 'Status' => '201 Created', + ), + null, + 201 + ), + $visitor->visit( $data ) + ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\InvalidTypeException + */ + public function testVisitValueObjectInvalidType() + { + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = new Common\Output\Visitor( $generator, array() ); + + $visitor->visitValueObject( 42 ); + } + + /** + * @expectedException \eZ\Publish\Core\REST\Common\Output\Exceptions\NoVisitorFoundException + */ + public function testVisitValueObjectNoMatch() + { + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $visitor = new Common\Output\Visitor( $generator, array() ); + + $data = new stdClass(); + $visitor->visitValueObject( $data ); + } + + public function testVisitValueObjectDirectMatch() + { + $data = new stdClass(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $valueObjectVisitor = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\ValueObjectVisitor', array(), array(), '', false ); + + $visitor = new Common\Output\Visitor( + $generator, + array( + '\\stdClass' => $valueObjectVisitor, + ) + ); + + $valueObjectVisitor + ->expects( $this->at( 0 ) ) + ->method( 'visit' ) + ->with( $visitor, $generator, $data ); + + $visitor->visitValueObject( $data ); + } + + public function testVisitValueObjectParentMatch() + { + $data = new ValueObject(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $valueObjectVisitor = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\ValueObjectVisitor', array(), array(), '', false ); + + $visitor = new Common\Output\Visitor( + $generator, + array( + '\\stdClass' => $valueObjectVisitor, + ) + ); + + $valueObjectVisitor + ->expects( $this->at( 0 ) ) + ->method( 'visit' ) + ->with( $visitor, $generator, $data ); + + $visitor->visitValueObject( $data ); + } + + public function testVisitValueObjectSecondRuleParentMatch() + { + $data = new ValueObject(); + + $generator = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ); + $valueObjectVisitor1 = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\ValueObjectVisitor', array(), array(), '', false ); + $valueObjectVisitor2 = $this->getMock( '\\eZ\\Publish\\Core\\REST\\Common\\Output\\ValueObjectVisitor', array(), array(), '', false ); + + $visitor = new Common\Output\Visitor( + $generator, + array( + '\\WontMatch' => $valueObjectVisitor1, + '\\stdClass' => $valueObjectVisitor2, + ) + ); + + $valueObjectVisitor1 + ->expects( $this->never() ) + ->method( 'visit' ); + + $valueObjectVisitor2 + ->expects( $this->at( 0 ) ) + ->method( 'visit' ) + ->with( $visitor, $generator, $data ); + + $visitor->visitValueObject( $data ); + } +} diff --git a/eZ/Publish/Core/REST/Common/Tests/UrlHandler/PatternTest.php b/eZ/Publish/Core/REST/Common/Tests/UrlHandler/PatternTest.php new file mode 100644 index 0000000..0fb5575 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Tests/UrlHandler/PatternTest.php @@ -0,0 +1,215 @@ +<?php +/** + * File containing the PatternTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Tests\UrlHandler; + +use eZ\Publish\Core\REST\Common; + +/** + * Test for Pattern based url handler + */ +class PatternTest extends \PHPUnit_Framework_TestCase +{ + /** + * Tests parsing unknown URL type + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage No URL for type 'unknown' available. + */ + public function testParseUnknownUrlType() + { + $urlHandler = new Common\UrlHandler\Pattern(); + $urlHandler->parse( 'unknown', '/foo' ); + } + + /** + * Tests parsing invalid pattern + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Invalid pattern part: '{broken'. + */ + public function testParseInvalidPattern() + { + $urlHandler = new Common\UrlHandler\Pattern( + array( + 'invalid' => '/foo/{broken', + ) + ); + $urlHandler->parse( 'invalid', '/foo' ); + } + + /** + * Tests parsing when pattern does not match + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage URL '/bar' did not match (^/foo/(?P<foo>[^/]+)$)S. + */ + public function testPatternDoesNotMatch() + { + $urlHandler = new Common\UrlHandler\Pattern( + array( + 'pattern' => '/foo/{foo}', + ) + ); + $urlHandler->parse( 'pattern', '/bar' ); + } + + /** + * Test parsing when pattern does not match the end of the URL + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage URL '/foo/23/bar' did not match (^/foo/(?P<foo>[^/]+)$)S. + */ + public function testPatternDoesNotMatchTrailing() + { + $urlHandler = new Common\UrlHandler\Pattern( + array( + 'pattern' => '/foo/{foo}', + ) + ); + $urlHandler->parse( 'pattern', '/foo/23/bar' ); + } + + /** + * Data provider + * + * @return array + */ + public static function getParseValues() + { + return array( + array( + 'section', + '/content/section/42', + array( + 'section' => '42', + ) + ), + array( + 'objectversion', + '/content/object/42/23', + array( + 'object' => '42', + 'version' => '23', + ) + ), + array( + 'location', + '/content/locations/23/42/100', + array( + 'location' => '23/42/100', + ) + ), + array( + 'locationChildren', + '/content/locations/23/42/100/children', + array( + 'location' => '23/42/100', + ) + ) + ); + } + + /** + * Test parsing URL + * + * @dataProvider getParseValues + */ + public function testParseUrl( $type, $url, $values ) + { + $urlHandler = $this->getWorkingUrlHandler(); + + $this->assertSame( + $values, + $urlHandler->parse( $type, $url ) + ); + } + + /** + * Test generating unknown URL type + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage No URL for type 'unknown' available. + */ + public function testGenerateUnknownUrlType() + { + $urlHandler = new Common\UrlHandler\Pattern(); + $urlHandler->generate( 'unknown', array() ); + } + + /** + * Test generating URL with missing value + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage No value provided for 'unknown'. + */ + public function testGenerateMissingValue() + { + $urlHandler = new Common\UrlHandler\Pattern( + array( + 'pattern' => '/foo/{unknown}', + ) + ); + $urlHandler->generate( 'pattern', array() ); + } + + /** + * Test generating URL with extra value + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Unused values in values array: 'bar'. + */ + public function testGenerateSuperfluousValue() + { + $urlHandler = new Common\UrlHandler\Pattern( + array( + 'pattern' => '/foo/{foo}', + ) + ); + $urlHandler->generate( + 'pattern', + array( + 'foo' => 23, + 'bar' => 42, + ) + ); + } + + /** + * Data provider + * + * @dataProvider getParseValues + */ + public function testGenerateUrl( $type, $url, $values ) + { + $urlHandler = $this->getWorkingUrlHandler(); + + $this->assertSame( + $url, + $urlHandler->generate( $type, $values ) + ); + } + + /** + * Returns the URL handler + * + * @return \eZ\Publish\Core\REST\Common\UrlHandler\Pattern + */ + protected function getWorkingUrlHandler() + { + return new Common\UrlHandler\Pattern( + array( + 'section' => '/content/section/{section}', + 'objectversion' => '/content/object/{object}/{version}', + 'locationChildren' => '/content/locations/{&location}/children', + 'location' => '/content/locations/{&location}', + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Common/UrlHandler.php b/eZ/Publish/Core/REST/Common/UrlHandler.php new file mode 100644 index 0000000..4056c29 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/UrlHandler.php @@ -0,0 +1,36 @@ +<?php +/** + * File containing the UrlHandler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common; + +/** + * Interface for URL handlers + */ +interface UrlHandler +{ + /** + * Parse URL and return the IDs contained in the URL + * + * @param string $type + * @param string $url + * + * @return array + */ + public function parse( $type, $url ); + + /** + * Generate a URL of the given type from the specified values + * + * @param string $type + * @param array $values + * + * @return string + */ + public function generate( $type, array $values = array() ); +} diff --git a/eZ/Publish/Core/REST/Common/UrlHandler/Pattern.php b/eZ/Publish/Core/REST/Common/UrlHandler/Pattern.php new file mode 100644 index 0000000..0326807 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/UrlHandler/Pattern.php @@ -0,0 +1,196 @@ +<?php +/** + * File containing the Pattern UrlHandler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\UrlHandler; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Pattern based URL Handler + * + * Handles 2 types of patterns to be used in an URL: + * + * - {foo} matches anything but a slash and is used to match the typical URL + * variable (e.g. an ID) + * - {&foo} matches the slash, too, and is used to match only those URL + * variables, which may have a slash + */ +class Pattern implements UrlHandler +{ + /** + * Map of URL types to their URL patterns + * + * @var array + */ + protected $map = array(); + + /** + * Cache for compiled expressions + * + * @var array + */ + protected $compileCache = array(); + + /** + * Pattern regular sub-expression + */ + const STANDARD_VARIABLE_REGEX = '\{([A-Za-z-_]+)\}'; + + /** + * Pattern regular sub-expression that might contain slashes + */ + const SLASHES_VARIABLE_REGEX = '\{(?:\&\s*)([A-Za-z-_]+)\}'; + + /** + * Construct from optional initial map + * + * @param array $map + */ + public function __construct( array $map = array() ) + { + foreach ( $map as $type => $pattern ) + { + $this->addPattern( $type, $pattern ); + } + } + + /** + * Adds a pattern for a type + * + * @param string $type + * @param string $pattern + */ + public function addPattern( $type, $pattern ) + { + $this->map[$type] = $pattern; + unset( $this->compileCache[$type] ); + } + + /** + * Parse URL and return the IDs contained in the URL + * + * @param string $type + * @param string $url + * + * @return array + */ + public function parse( $type, $url ) + { + if ( !isset( $this->map[$type] ) ) + { + throw new Exceptions\InvalidArgumentException( "No URL for type '$type' available." ); + } + + $pattern = $this->compile( $this->map[$type] ); + + if ( !preg_match( $pattern, $url, $match ) ) + { + throw new Exceptions\InvalidArgumentException( "URL '$url' did not match $pattern." ); + } + + foreach ( $match as $key => $value ) + { + if ( is_numeric( $key ) ) + { + unset( $match[$key] ); + } + } + return $match; + } + + /** + * Compiles a given pattern to a PCRE regular expression + * + * @param string $pattern + * + * @return string + */ + protected function compile( $pattern ) + { + if ( isset( $this->compileCache[$pattern] ) ) + { + return $this->compileCache[$pattern]; + } + + $pcre = '(^'; + + do + { + switch ( true ) + { + case preg_match( '(^[^{]+)', $pattern, $match ): + $pattern = substr( $pattern, strlen( $match[0] ) ); + $pcre .= preg_quote( $match[0] ); + break; + + case preg_match( '(^' . self::STANDARD_VARIABLE_REGEX . ')', $pattern, $match ): + $pattern = substr( $pattern, strlen( $match[0] ) ); + $pcre .= "(?P<" . $match[1] . ">[^/]+)"; + break; + + case preg_match( '(^' . self::SLASHES_VARIABLE_REGEX . ')', $pattern, $match ): + $pattern = substr( $pattern, strlen( $match[0] ) ); + $pcre .= "(?P<" . $match[1] . ">.+)"; + break; + + default: + throw new Exceptions\InvalidArgumentException( "Invalid pattern part: '$pattern'." ); + } + } + while ( $pattern ); + + $pcre .= '$)S'; + + $this->compileCache[$pattern] = $pcre; + return $pcre; + } + + /** + * Generate a URL of the given type from the specified values + * + * @param string $type + * @param array $values + * + * @return string + */ + public function generate( $type, array $values = array() ) + { + if ( !isset( $this->map[$type] ) ) + { + throw new Exceptions\InvalidArgumentException( "No URL for type '$type' available." ); + } + + $url = $this->map[$type]; + preg_match_all( + '(' . self::STANDARD_VARIABLE_REGEX . '|' . self::SLASHES_VARIABLE_REGEX . ')', + $url, + $matches, + PREG_SET_ORDER + ); + foreach ( $matches as $matchSet ) + { + $variableName = empty( $matchSet[1] ) ? $matchSet[2] : $matchSet[1]; + if ( !isset( $values[$variableName] ) ) + { + throw new Exceptions\InvalidArgumentException( "No value provided for '{$variableName}'." ); + } + + $url = str_replace( $matchSet[0], $values[$variableName], $url ); + unset( $values[$variableName] ); + } + + if ( count( $values ) ) + { + throw new Exceptions\InvalidArgumentException( "Unused values in values array: '" . implode( "', '", array_keys( $values ) ) . "'." ); + } + + return $url; + } +} diff --git a/eZ/Publish/Core/REST/Common/UrlHandler/Prefixed.php b/eZ/Publish/Core/REST/Common/UrlHandler/Prefixed.php new file mode 100644 index 0000000..51847e4 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/UrlHandler/Prefixed.php @@ -0,0 +1,40 @@ +<?php +/** + * File containing the Prefixed class. + * + * @copyright Copyright (C) 2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Common\UrlHandler; + +use eZ\Publish\Core\REST\Common\UrlHandler\eZPublish as EzPublishUrlHandler; + +class Prefixed extends EzPublishUrlHandler +{ + /** + * @var string + */ + protected $prefix; + + public function __construct( $prefix = '', array $map = array() ) + { + $this->prefix = $prefix; + parent::__construct( $map ); + } + + public function generate( $type, array $values = array() ) + { + return $this->prefix . parent::generate( $type, $values ); + } + + public function parse( $type, $url ) + { + if ( strpos( $url, $this->prefix ) === 0 ) + { + $url = substr( $url, strlen( $this->prefix ) ); + } + return parent::parse( $type, $url ); + } + +} diff --git a/eZ/Publish/Core/REST/Common/UrlHandler/eZPublish.php b/eZ/Publish/Core/REST/Common/UrlHandler/eZPublish.php new file mode 100644 index 0000000..4695737 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/UrlHandler/eZPublish.php @@ -0,0 +1,97 @@ +<?php +/** + * File containing the eZPublish UrlHandler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\UrlHandler; + +/** + * Pattern based URL Handler pre-configured for eZ Publish + */ +class eZPublish extends Pattern +{ + /** + * Map of URL types to their URL patterns + * + * @var array + * @todo: Add sensible missing names + */ + protected $map = array( + 'root' => '/', + 'locations' => '/content/locations', + 'locationByRemote' => '/content/locations?remoteId={location}', + 'locationById' => '/content/locations?id={location}', + 'locationChildren' => '/content/locations{&location}/children', + 'locationUrlAliases' => '/content/locations{&location}/urlaliases', + 'location' => '/content/locations{&location}', + 'objects' => '/content/objects', + 'objectByRemote' => '/content/objects?remoteId={object}', + 'object' => '/content/objects/{object}', + 'objectByLangCode' => '/content/objects/{object}/{lang_code}', + 'objectLocations' => '/content/objects/{object}/locations', + 'objectObjectStates' => '/content/objects/{object}/objectstates', + 'objectVersions' => '/content/objects/{object}/versions', + 'objectVersion' => '/content/objects/{object}/versions/{version}', + 'objectVersionRelations' => '/content/objects/{object}/versions/{version}/relations', + 'objectVersionRelation' => '/content/objects/{object}/versions/{version}/relations/{relation}', + 'objectCurrentVersion' => '/content/objects/{object}/currentversion', + 'objectrelations' => '/content/objects/{object}/relations', + 'objectrelation' => '/content/objects/{object}/relations/{relation}', + 'objectstategroups' => '/content/objectstategroups', + 'objectstategroup' => '/content/objectstategroups/{objectstategroup}', + 'objectstates' => '/content/objectstategroups/{objectstategroup}/objectstates', + 'objectstate' => '/content/objectstategroups/{objectstategroup}/objectstates/{objectstate}', + 'sections' => '/content/sections', + 'section' => '/content/sections/{section}', + 'sectionByIdentifier' => '/content/sections?identifier={section}', + 'trashItems' => '/content/trash', + 'trash' => '/content/trash/{trash}', + 'typegroups' => '/content/typegroups', + 'typegroup' => '/content/typegroups/{typegroup}', + 'grouptypes' => '/content/typegroups/{typegroup}/types', + 'types' => '/content/types', + 'typeByIdentifier' => '/content/types?identifier={type}', + 'typeByRemoteId' => '/content/types?remoteId={type}', + 'type' => '/content/types/{type}', + 'typeFieldDefinitions' => '/content/types/{type}/fieldDefinitions', + 'typeFieldDefinition' => '/content/types/{type}/fieldDefinitions/{fieldDefinition}', + 'typeDraft' => '/content/types/{type}/draft', + 'typeFieldDefinitionsDraft' => '/content/types/{type}/draft/fieldDefinitions', + 'typeFieldDefinitionDraft' => '/content/types/{type}/draft/fieldDefinitions/{fieldDefinition}', + 'groupsOfType' => '/content/types/{type}/groups', + 'groupOfType' => '/content/types/{type}/groups/{group}', + 'urlWildcards' => '/content/urlwildcards', + 'urlWildcard' => '/content/urlwildcards/{urlwildcard}', + 'urlAliases' => '/content/urlaliases', + 'urlAlias' => '/content/urlaliases/{urlalias}', + 'views' => '/content/views', + 'view' => '/content/views/{view}', + 'viewResults' => '/content/views/{view}/results', + 'groups' => '/user/groups', + 'group' => '/user/groups{&group}', + 'groupRoleAssignments' => '/user/groups{&group}/roles', + 'groupRoleAssignment' => '/user/groups{&group}/roles/{role}', + 'groupSubgroups' => '/user/groups{&group}/subgroups', + 'groupUsers' => '/user/groups{&group}/users', + 'rootUserGroup' => '/user/groups/root', + 'rootUserGroupSubGroups' => '/user/groups/subgroups', + 'roles' => '/user/roles', + 'role' => '/user/roles/{role}', + 'roleByIdentifier' => '/user/roles?identifier={role}', + 'policies' => '/user/roles/{role}/policies', + 'policy' => '/user/roles/{role}/policies/{policy}', + 'users' => '/user/users', + 'user' => '/user/users/{user}', + 'userDrafts' => '/user/users/{user}/drafts', + 'userGroups' => '/user/users/{user}/groups', + 'userGroupAssign' => '/user/users/{user}/groups?group={&group}', + 'userGroup' => '/user/users/{user}/groups{&group}', + 'userRoleAssignments' => '/user/users/{user}/roles', + 'userRoleAssignment' => '/user/users/{user}/roles/{role}', + 'userPolicies' => '/user/policies?userId={user}', + ); +} diff --git a/eZ/Publish/Core/REST/Common/Value.php b/eZ/Publish/Core/REST/Common/Value.php new file mode 100644 index 0000000..a60c6b6 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Value.php @@ -0,0 +1,16 @@ +<?php +/** + * File containing the Value class. + * + * @copyright Copyright (C) 2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Common; + +/** + */ +abstract class Value +{ + +} diff --git a/eZ/Publish/Core/REST/Common/Values/ContentObjectStates.php b/eZ/Publish/Core/REST/Common/Values/ContentObjectStates.php new file mode 100644 index 0000000..bf27c8f --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Values/ContentObjectStates.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the ContentObjectStates class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ContentObjectStates view model + */ +class ContentObjectStates extends RestValue +{ + /** + * Object states + * + * @var array + */ + public $states; + + /** + * Construct + * + * @param array $states + */ + public function __construct( array $states ) + { + $this->states = $states; + } +} diff --git a/eZ/Publish/Core/REST/Common/Values/RestContentMetadataUpdateStruct.php b/eZ/Publish/Core/REST/Common/Values/RestContentMetadataUpdateStruct.php new file mode 100644 index 0000000..1ede201 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Values/RestContentMetadataUpdateStruct.php @@ -0,0 +1,27 @@ +<?php +/** + * File containing the RestContentMetadataUpdateStruct + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Values; + +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; + +/** + * Extended ContentMetadataUpdateStruct that includes section information. + */ +class RestContentMetadataUpdateStruct extends ContentMetadataUpdateStruct +{ + /** + * ID of the section to assign. + * + * Leave null to not change section assignment. + * + * @var mixed + */ + public $sectionId; +} diff --git a/eZ/Publish/Core/REST/Common/Values/RestObjectState.php b/eZ/Publish/Core/REST/Common/Values/RestObjectState.php new file mode 100644 index 0000000..9b6e0ed --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Values/RestObjectState.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the RestObjectState class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Values; + +use eZ\Publish\API\Repository\Values\ObjectState\ObjectState; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * This class wraps the object state with added groupId property + */ +class RestObjectState extends RestValue +{ + /** + * Wrapped object state + * + * @var \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public $objectState; + + /** + * Group ID to which wrapped state belongs + * + * @var mixed + */ + public $groupId; + + /** + * Constructor + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param mixed $groupId + */ + public function __construct( ObjectState $objectState, $groupId ) + { + $this->objectState = $objectState; + $this->groupId = $groupId; + } +} diff --git a/eZ/Publish/Core/REST/Common/Values/Root.php b/eZ/Publish/Core/REST/Common/Values/Root.php new file mode 100644 index 0000000..a6f5d59 --- /dev/null +++ b/eZ/Publish/Core/REST/Common/Values/Root.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the Root class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Common\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * This class represents the root resource + */ +class Root extends RestValue +{ +} diff --git a/eZ/Publish/Core/REST/Server/AuthenticatingDispatcher.php b/eZ/Publish/Core/REST/Server/AuthenticatingDispatcher.php new file mode 100644 index 0000000..dc40c79 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/AuthenticatingDispatcher.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing the authenticating dispatcher class + * + * ATTENTION: This is a test setup for the REST server. DO NOT USE IT IN + * PRODUCTION! + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server; + +use Qafoo\RMF; + +/** + * MVC dispatcher with integrated authentication + */ +class AuthenticatingDispatcher extends RMF\Dispatcher\Simple +{ + /** + * Authenticator + * + * @var \eZ\Publish\Core\REST\Server\Authenticator + */ + protected $authenticator; + + /** + * Creates a new authenticating dispatcher + * + * @param RMF\Router $router + * @param RMF\View $view + * @param \eZ\Publish\Core\REST\Server\Authenticator $authenticator + */ + public function __construct( RMF\Router $router, RMF\View $view, Authenticator $authenticator ) + { + parent::__construct( $router, $view ); + $this->authenticator = $authenticator; + } + + /** + * Performs authentication and dispatches the request + * + * @param RMF\Request $request + */ + public function dispatch( RMF\Request $request ) + { + try + { + $this->authenticator->authenticate( $request ); + } + catch ( \Exception $e ) + { + $this->view->display( $request, $e ); + } + parent::dispatch( $request ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Authenticator.php b/eZ/Publish/Core/REST/Server/Authenticator.php new file mode 100644 index 0000000..b0c25b6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Authenticator.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Authenticator base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server; + +use eZ\Publish\API\Repository\Repository; + +use Qafoo\RMF; + +/** + * Authenticator base class + */ +abstract class Authenticator +{ + /** + * Creates an new Authenticator to $repository + * + * @param \eZ\Publish\API\Repository\Repository $repository + */ + public function __construct( Repository $repository ) + { + $this->repository = $repository; + } + + /** + * Authenticates the user based on the given request. + * + * Performs an authentication based on the given $request and sets the + * authenticated user into the $repository. Returns true on success, false + * of authentication was not possible or did not succeed. + * + * @param RMF\Request $request + * + * @return boolean + */ + abstract public function authenticate( RMF\Request $request ); +} diff --git a/eZ/Publish/Core/REST/Server/Authenticator/BasicAuth.php b/eZ/Publish/Core/REST/Server/Authenticator/BasicAuth.php new file mode 100644 index 0000000..998a6df --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Authenticator/BasicAuth.php @@ -0,0 +1,70 @@ +<?php +/** + * File containing the Authenticator used for integration tests + * + * ATTENTION: This is a only meant for the test setup for the REST server. DO + * NOT USE IT IN PRODUCTION! + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Authenticator; + +use eZ\Publish\Core\REST\Server\Authenticator; +use eZ\Publish\Core\REST\Server\Exceptions; +use eZ\Publish\API\Repository\Repository; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +use Qafoo\RMF; + +/** + * Authenticator for integration tests + * + * This is, by now, just an untested stub. + * @todo Test + */ +class BasicAuth extends Authenticator +{ + /** + * Creates an new Authenticator to $repository + * + * @param \eZ\Publish\API\Repository\Repository $repository + */ + public function __construct( Repository $repository ) + { + $this->repository = $repository; + } + + /** + * Authenticates the user based on the given request. + * + * Performs an authentication based on the given $request and sets the + * authenticated user into the $repository. Returns true on success, false + * of authentication was not possible or did not succeed. + * + * @param RMF\Request $request + * + * @return boolean + */ + public function authenticate( RMF\Request $request ) + { + try + { + $this->repository->setCurrentUser( + $this->repository->getUserService()->loadUserByCredentials( + $request->username, $request->password + ) + ); + } + catch ( \InvalidArgumentException $e ) + { + return false; + } + catch ( NotFoundException $e ) + { + throw new Exceptions\AuthenticationFailedException(); + } + } +} diff --git a/eZ/Publish/Core/REST/Server/Authenticator/IntegrationTest.php b/eZ/Publish/Core/REST/Server/Authenticator/IntegrationTest.php new file mode 100644 index 0000000..352ec93 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Authenticator/IntegrationTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing the Authenticator used for integration tests + * + * ATTENTION: This is a only meant for the test setup for the REST server. DO + * NOT USE IT IN PRODUCTION! + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Authenticator; + +use eZ\Publish\Core\REST\Server\Authenticator; +use eZ\Publish\API\Repository\Repository; + +use Qafoo\RMF; + +/** + * Authenticator for integration tests + */ +class IntegrationTest extends Authenticator +{ + /** + * Creates an new Authenticator to $repository + * + * @param \eZ\Publish\API\Repository\Repository $repository + */ + public function __construct( Repository $repository ) + { + $this->repository = $repository; + } + + /** + * Authenticates the user based on the given request. + * + * Performs an authentication based on the given $request and sets the + * authenticated user into the $repository. Returns true on success, false + * of authentication was not possible or did not succeed. + * + * @param RMF\Request $request + * + * @return boolean + */ + public function authenticate( RMF\Request $request ) + { + try + { + $this->repository->setCurrentUser( + $this->repository->getUserService()->loadUser( $request->testUser ) + ); + } + catch ( \InvalidArgumentException $e ) + { + throw new \RuntimeException( "The Integration Test Authenticator requires a test user ID to be set using the HTTP Header X-Test-User." ); + } + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller.php b/eZ/Publish/Core/REST/Server/Controller.php new file mode 100644 index 0000000..b93960e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller.php @@ -0,0 +1,58 @@ +<?php +/** + * File containing the REST Server Controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server; + +use eZ\Publish\Core\REST\Common\UrlHandler\eZPublish as UrlHandler; +use eZ\Publish\Core\REST\Common\Input\Dispatcher as InputDispatcher; +use eZ\Publish\Core\REST\Server\Request as HttpRequest; +use Symfony\Component\DependencyInjection\ContainerInterface as Container; + +abstract class Controller +{ + /** + * @var \eZ\Publish\Core\REST\Server\Request + */ + protected $request; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\Dispatcher + */ + protected $inputDispatcher; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler\eZPublish + */ + protected $urlHandler; + + /** + * @var \Symfony\Component\DependencyInjection\ContainerInterface + */ + protected $container; + + public function setInputDispatcher( InputDispatcher $inputDispatcher ) + { + $this->inputDispatcher = $inputDispatcher; + } + + public function setUrlHandler( UrlHandler $urlHandler ) + { + $this->urlHandler = $urlHandler; + } + + public function setRequest( HttpRequest $request ) + { + $this->request = $request; + } + + public function setContainer( Container $container ) + { + $this->container = $container; + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/Content.php b/eZ/Publish/Core/REST/Server/Controller/Content.php new file mode 100644 index 0000000..426ef17 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/Content.php @@ -0,0 +1,717 @@ +<?php +/** + * File containing the Content controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Input; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\Values\Content\Relation; +use eZ\Publish\API\Repository\Values\Content\VersionInfo; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; + +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\LocationService; +use eZ\Publish\API\Repository\SectionService; +use eZ\Publish\API\Repository\SearchService; + +/** + * Content controller + */ +class Content extends RestController +{ + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + /** + * Search service + * + * @var \eZ\Publish\API\Repository\SearchService + */ + protected $searchService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\LocationService $locationService + * @param \eZ\Publish\API\Repository\SectionService $sectionService + * @param \eZ\Publish\API\Repository\SearchService $searchService + */ + public function __construct( ContentService $contentService, LocationService $locationService, SectionService $sectionService, SearchService $searchService ) + { + $this->contentService = $contentService; + $this->locationService = $locationService; + $this->sectionService = $sectionService; + $this->searchService = $searchService; + } + + /** + * Loads a content info by remote ID + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentList + */ + public function loadContentInfoByRemoteId() + { + $contentInfo = $this->contentService->loadContentInfoByRemoteId( + // GET variable + $this->request->variables['remoteId'] + ); + + return new Values\ContentList( + array( + new Values\RestContent( + $contentInfo, + $this->locationService->loadLocation( $contentInfo->mainLocationId ) + ) + ) + ); + } + + /** + * Loads a content info, potentially with the current version embedded + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContent + */ + public function loadContent() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $urlValues = $this->urlHandler->parse( 'object', $requestPath ); + + $contentInfo = $this->contentService->loadContentInfo( $urlValues['object'] ); + $mainLocation = $this->locationService->loadLocation( $contentInfo->mainLocationId ); + + $contentVersion = null; + $relations = null; + if ( $this->getMediaType( $this->request ) === 'application/vnd.ez.api.content' ) + { + $languages = null; + if ( isset( $this->request->variables['languages'] ) ) + { + $languages = explode( ',', $this->request->variables['languages'] ); + } + + $contentVersion = $this->contentService->loadContent( $urlValues['object'], $languages ); + $relations = $this->contentService->loadRelations( $contentVersion->getVersionInfo() ); + } + + return new Values\RestContent( $contentInfo, $mainLocation, $contentVersion, $relations, $this->request->path ); + } + + /** + * Updates a content's metadata + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContent + */ + public function updateContentMetadata() + { + $updateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $values = $this->urlHandler->parse( 'object', $this->request->path ); + $contentId = (int)$values['object']; + $contentInfo = $this->contentService->loadContentInfo( $contentId ); + + // update section + if ( $updateStruct->sectionId !== null ) + { + $section = $this->sectionService->loadSection( $updateStruct->sectionId ); + $this->sectionService->assignSection( $contentInfo, $section ); + $updateStruct->sectionId = null; + } + + // @todo Consider refactoring! ContentService::updateContentMetadata throws the same exception + // in case the updateStruct is empty and if remoteId already exists. Since REST version of update struct + // includes section ID in addition to other fields, we cannot throw exception if only sectionId property + // is set, so we must skip updating content in that case instead of allowing propagation of the exception. + foreach ( $updateStruct as $propertyName => $propertyValue ) + { + if ( $propertyName !== 'sectionId' && $propertyValue !== null ) + { + // update content + $this->contentService->updateContentMetadata( $contentInfo, $updateStruct ); + $contentInfo = $this->contentService->loadContentInfo( $contentId ); + break; + } + } + + try + { + $locationInfo = $this->locationService->loadLocation( $contentInfo->mainLocationId ); + } + catch ( NotFoundException $e ) + { + $locationInfo = null; + } + + return new Values\RestContent( + $contentInfo, + $locationInfo + ); + } + + /** + * Loads a specific version of a given content object + * + * @return \eZ\Publish\Core\REST\Server\Values\TemporaryRedirect + */ + public function redirectCurrentVersion() + { + $urlValues = $this->urlHandler->parse( 'objectCurrentVersion', $this->request->path ); + + $versionInfo = $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ) + ); + + return new Values\TemporaryRedirect( + $this->urlHandler->generate( + 'objectVersion', + array( + 'object' => $urlValues['object'], + 'version' => $versionInfo->versionNo + ) + ) + ); + } + + /** + * Loads a specific version of a given content object + * + * @return \eZ\Publish\Core\REST\Server\Values\Version + */ + public function loadContentInVersion() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $urlValues = $this->urlHandler->parse( 'objectVersion', $requestPath ); + + $languages = null; + if ( isset( $this->request->variables['languages'] ) ) + { + $languages = explode( ',', $this->request->variables['languages'] ); + } + + $content = $this->contentService->loadContent( + $urlValues['object'], + $languages, + $urlValues['version'] + ); + return new Values\Version( + $content, + $this->contentService->loadRelations( $content->getVersionInfo() ), + $this->request->path + ); + } + + /** + * Creates a new content draft assigned to the authenticated user. + * If a different userId is given in the input it is assigned to the + * given user but this required special rights for the authenticated + * user (this is useful for content staging where the transfer process + * does not have to authenticate with the user which created the content + * object in the source server). The user has to publish the content if + * it should be visible. + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedContent + */ + public function createContent() + { + $contentCreate = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $content = $this->contentService->createContent( + $contentCreate->contentCreateStruct, + array( $contentCreate->locationCreateStruct ) + ); + + $contentValue = null; + $relations = null; + if ( $this->getMediaType( $this->request ) === 'application/vnd.ez.api.content' ) + { + $contentValue = $content; + $relations = $this->contentService->loadRelations( $contentValue->getVersionInfo() ); + } + + return new Values\CreatedContent( + array( + 'content' => new Values\RestContent( + $content->contentInfo, + null, + $contentValue, + $relations + ) + ) + ); + } + + /** + * The content is deleted. If the content has locations (which is required in 4.x) + * on delete all locations assigned the content object are deleted via delete subtree. + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteContent() + { + $urlValues = $this->urlHandler->parse( 'object', $this->request->path ); + + $this->contentService->deleteContent( + $this->contentService->loadContentInfo( $urlValues['object'] ) + ); + + return new Values\NoContent(); + } + + /** + * Creates a new content object as copy under the given parent location given in the destination header. + * + * @return \eZ\Publish\Core\REST\Server\Values\ResourceCreated + */ + public function copyContent() + { + $urlValues = $this->urlHandler->parse( 'object', $this->request->path ); + $destinationValues = $this->urlHandler->parse( 'location', $this->request->destination ); + + $parentLocationParts = explode( '/', $destinationValues['location'] ); + $copiedContent = $this->contentService->copyContent( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $this->locationService->newLocationCreateStruct( array_pop( $parentLocationParts ) ) + ); + + return new Values\ResourceCreated( + $this->urlHandler->generate( + 'object', + array( 'object' => $copiedContent->id ) + ) + ); + } + + /** + * Returns a list of all versions of the content. This method does not + * include fields and relations in the Version elements of the response. + * + * @return \eZ\Publish\Core\REST\Server\Values\VersionList + */ + public function loadContentVersions() + { + $urlValues = $this->urlHandler->parse( 'objectVersions', $this->request->path ); + + return new Values\VersionList( + $this->contentService->loadVersions( + $this->contentService->loadContentInfo( $urlValues['object'] ) + ), + $this->request->path + ); + } + + /** + * The version is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteContentVersion() + { + $urlValues = $this->urlHandler->parse( 'objectVersion', $this->request->path ); + + $versionInfo = $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $urlValues['version'] + ); + + if ( $versionInfo->status === VersionInfo::STATUS_PUBLISHED ) + { + throw new ForbiddenException( 'Version in status PUBLISHED cannot be deleted' ); + } + + $this->contentService->deleteVersion( + $versionInfo + ); + + return new Values\NoContent(); + } + + /** + * The system creates a new draft version as a copy from the given version + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedVersion + */ + public function createDraftFromVersion() + { + $urlValues = $this->urlHandler->parse( 'objectVersion', $this->request->path ); + + $contentInfo = $this->contentService->loadContentInfo( $urlValues['object'] ); + $contentDraft = $this->contentService->createContentDraft( + $contentInfo, + $this->contentService->loadVersionInfo( + $contentInfo, $urlValues['version'] + ) + ); + + return new Values\CreatedVersion( + array( + 'version' => new Values\Version( + $contentDraft, + $this->contentService->loadRelations( $contentDraft->getVersionInfo() ) + ) + ) + ); + } + + /** + * The system creates a new draft version as a copy from the current version + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedVersion + */ + public function createDraftFromCurrentVersion() + { + $urlValues = $this->urlHandler->parse( 'objectCurrentVersion', $this->request->path ); + + $contentInfo = $this->contentService->loadContentInfo( $urlValues['object'] ); + $versionInfo = $this->contentService->loadVersionInfo( + $contentInfo + ); + + if ( $versionInfo->status === VersionInfo::STATUS_DRAFT ) + { + throw new ForbiddenException( 'Current version is already in status DRAFT' ); + } + + $contentDraft = $this->contentService->createContentDraft( $contentInfo ); + + return new Values\CreatedVersion( + array( + 'version' => new Values\Version( + $contentDraft, + $this->contentService->loadRelations( $contentDraft->getVersionInfo() ) + ) + ) + ); + } + + /** + * A specific draft is updated. + * + * @return \eZ\Publish\Core\REST\Server\Values\Version + */ + public function updateVersion() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $urlValues = $this->urlHandler->parse( 'objectVersion', $requestPath ); + + $contentUpdateStruct = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + // @todo Needs refactoring! Temporary solution so parser has access to URL + 'Url' => $requestPath + ), + $this->request->body + ) + ); + + $versionInfo = $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $urlValues['version'] + ); + + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + throw new ForbiddenException( 'Only version in status DRAFT can be updated' ); + } + + $this->contentService->updateContent( $versionInfo, $contentUpdateStruct ); + + $languages = null; + if ( isset( $this->request->variables['languages'] ) ) + { + $languages = explode( ',', $this->request->variables['languages'] ); + } + + // Reload the content to handle languages GET parameter + $content = $this->contentService->loadContent( + $urlValues['object'], + $languages, + $versionInfo->versionNo + ); + + return new Values\Version( + $content, + $this->contentService->loadRelations( $content->getVersionInfo() ), + $this->request->path + ); + } + + /** + * The content version is published + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function publishVersion() + { + $urlValues = $this->urlHandler->parse( 'objectVersion', $this->request->path ); + + $versionInfo = $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $urlValues['version'] + ); + + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + throw new ForbiddenException( 'Only version in status DRAFT can be published' ); + } + + $this->contentService->publishVersion( + $versionInfo + ); + + return new Values\NoContent(); + } + + /** + * Redirects to the relations of the current version + * + * @return \eZ\Publish\Core\REST\Server\Values\TemporaryRedirect + */ + public function redirectCurrentVersionRelations() + { + $urlValues = $this->urlHandler->parse( 'objectrelations', $this->request->path ); + + $contentInfo = $this->contentService->loadContentInfo( $urlValues['object'] ); + return new Values\TemporaryRedirect( + $this->urlHandler->generate( + 'objectVersionRelations', + array( + 'object' => $urlValues['object'], + 'version' => $contentInfo->currentVersionNo + ) + ) + ); + } + + /** + * Loads the relations of the given version + * + * @return \eZ\Publish\Core\REST\Server\Values\RelationList + */ + public function loadVersionRelations() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $urlValues = $this->urlHandler->parse( 'objectVersionRelations', $requestPath ); + + $offset = isset( $this->request->variables['offset'] ) ? (int)$this->request->variables['offset'] : 0; + $limit = isset( $this->request->variables['limit'] ) ? (int)$this->request->variables['limit'] : -1; + + $relationList = $this->contentService->loadRelations( + $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $urlValues['version'] + ) + ); + + $relationList = array_slice( + $relationList, + $offset >= 0 ? $offset : 0, + $limit >= 0 ? $limit : null + ); + + return new Values\RelationList( + $relationList, + $urlValues['object'], + $urlValues['version'], + $this->request->path + ); + } + + /** + * Loads a relation for the given content object and version + * + * @return \eZ\Publish\Core\REST\Server\Values\RestRelation + */ + public function loadVersionRelation() + { + $urlValues = $this->urlHandler->parse( 'objectVersionRelation', $this->request->path ); + + $relationList = $this->contentService->loadRelations( + $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $urlValues['version'] + ) + ); + + foreach ( $relationList as $relation ) + { + if ( $relation->id == $urlValues['relation'] ) + { + return new Values\RestRelation( $relation, $urlValues['object'], $urlValues['version'] ); + } + } + + throw new Exceptions\NotFoundException( "Relation not found: '{$this->request->path}'." ); + } + + /** + * Deletes a relation of the given draft. + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function removeRelation() + { + $urlValues = $this->urlHandler->parse( 'objectVersionRelation', $this->request->path ); + + $versionInfo = $this->contentService->loadVersionInfo( + $this->contentService->loadContentInfo( $urlValues['object'] ), + $urlValues['version'] + ); + + $versionRelations = $this->contentService->loadRelations( $versionInfo ); + foreach ( $versionRelations as $relation ) + { + if ( $relation->id == $urlValues['relation'] ) + { + if ( $relation->type !== Relation::COMMON ) + { + throw new ForbiddenException( "Relation is not of type COMMON" ); + } + + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + throw new ForbiddenException( "Relation of type COMMON can only be removed from drafts" ); + } + + $this->contentService->deleteRelation( $versionInfo, $relation->getDestinationContentInfo() ); + return new Values\NoContent(); + } + } + + throw new Exceptions\NotFoundException( "Relation not found: '{$this->request->path}'." ); + } + + /** + * Creates a new relation of type COMMON for the given draft. + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedRelation + */ + public function createRelation() + { + $urlValues = $this->urlHandler->parse( 'objectVersionRelations', $this->request->path ); + $destinationContentId = $updateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $contentInfo = $this->contentService->loadContentInfo( $urlValues['object'] ); + $versionInfo = $this->contentService->loadVersionInfo( $contentInfo, $urlValues['version'] ); + if ( $versionInfo->status !== VersionInfo::STATUS_DRAFT ) + { + throw new ForbiddenException( "Relation of type COMMON can only be added to drafts" ); + } + + try + { + $destinationContentInfo = $this->contentService->loadContentInfo( $destinationContentId ); + } + catch ( NotFoundException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + $existingRelations = $this->contentService->loadRelations( $versionInfo ); + foreach ( $existingRelations as $existingRelation ) + { + if ( $existingRelation->getDestinationContentInfo()->id == $destinationContentId ) + { + throw new ForbiddenException( "Relation of type COMMON to selected destination content ID already exists" ); + } + } + + $relation = $this->contentService->addRelation( $versionInfo, $destinationContentInfo ); + return new Values\CreatedRelation( + array( + 'relation' => new Values\RestRelation( $relation, $urlValues['object'], $urlValues['version'] ) + ) + ); + } + + /** + * Creates and executes a content view + * + * @return \eZ\Publish\Core\REST\Server\Values\RestExecutedView + */ + public function createView() + { + $viewInput = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + return new Values\RestExecutedView( + array( + 'identifier' => $viewInput->identifier, + 'searchResults' => $this->searchService->findContent( $viewInput->query ), + ) + ); + } + + /** + * Extracts the requested media type from $request + * + * @return string + */ + protected function getMediaType() + { + foreach ( $this->request->mimetype as $mimeType ) + { + if ( preg_match( '(^([a-z0-9-/.]+)\+.*$)', $mimeType['value'], $matches ) ) + { + return $matches[1]; + } + } + return 'unknown/unknown'; + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/ContentType.php b/eZ/Publish/Core/REST/Server/Controller/ContentType.php new file mode 100644 index 0000000..d5c36e6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/ContentType.php @@ -0,0 +1,876 @@ +<?php +/** + * File containing the ContentType controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Server\Exceptions\BadRequestException; +use eZ\Publish\API\Repository\Exceptions\BadStateException; +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct; + +/** + * ContentType controller + */ +class ContentType extends RestController +{ + /** + * Content type service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + */ + public function __construct( ContentTypeService $contentTypeService ) + { + $this->contentTypeService = $contentTypeService; + } + + /** + * Creates a new content type group + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedContentTypeGroup + */ + public function createContentTypeGroup() + { + $createStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + try + { + return new Values\CreatedContentTypeGroup( + array( + 'contentTypeGroup' => $this->contentTypeService->createContentTypeGroup( $createStruct ) + ) + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + /** + * Updates a content type group + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function updateContentTypeGroup() + { + $urlValues = $this->urlHandler->parse( 'typegroup', $this->request->path ); + + $createStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + try + { + $this->contentTypeService->updateContentTypeGroup( + $this->contentTypeService->loadContentTypeGroup( $urlValues['typegroup'] ), + $this->mapToGroupUpdateStruct( $createStruct ) + ); + + return $this->contentTypeService->loadContentTypeGroup( $urlValues['typegroup'] ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + /** + * The given content type group is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteContentTypeGroup() + { + $urlValues = $this->urlHandler->parse( 'typegroup', $this->request->path ); + + $contentTypeGroup = $this->contentTypeService->loadContentTypeGroup( $urlValues['typegroup'] ); + + $contentTypes = $this->contentTypeService->loadContentTypes( $contentTypeGroup ); + if ( !empty( $contentTypes ) ) + { + throw new ForbiddenException( 'Only empty content type groups can be deleted' ); + } + + $this->contentTypeService->deleteContentTypeGroup( $contentTypeGroup ); + + return new Values\NoContent(); + } + + /** + * Returns a list of content types of the group + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentTypeList|\eZ\Publish\Core\REST\Server\Values\ContentTypeInfoList + */ + public function listContentTypesForGroup() + { + $urlValues = $this->urlHandler->parse( 'grouptypes', $this->request->path ); + + $contentTypes = $this->contentTypeService->loadContentTypes( + $this->contentTypeService->loadContentTypeGroup( $urlValues['typegroup'] ) + ); + + if ( $this->getMediaType( $this->request ) == 'application/vnd.ez.api.contenttypelist' ) + { + return new Values\ContentTypeList( $contentTypes, $this->request->path ); + } + + return new Values\ContentTypeInfoList( $contentTypes, $this->request->path ); + } + + /** + * Returns a list of all content type groups + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentTypeGroupList + */ + public function loadContentTypeGroupList() + { + return new Values\ContentTypeGroupList( + $this->contentTypeService->loadContentTypeGroups() + ); + } + + /** + * Returns the content type group given by id + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroup() + { + $urlValues = $this->urlHandler->parse( 'typegroup', $this->request->path ); + + return $this->contentTypeService->loadContentTypeGroup( $urlValues['typegroup'] ); + } + + /** + * Loads a content type + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContentType + */ + public function loadContentType() + { + $urlValues = $this->urlHandler->parse( 'type', $this->request->path ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + + return new Values\RestContentType( + $contentType, + $contentType->getFieldDefinitions() + ); + } + + /** + * Returns a list of content types + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentTypeList|\eZ\Publish\Core\REST\Server\Values\ContentTypeInfoList + */ + public function listContentTypes() + { + $contentTypes = array(); + + if ( isset( $this->request->variables['identifier'] ) ) + { + $contentTypes = array( + $this->loadContentTypeByIdentifier() + ); + } + else if ( isset( $this->request->variables['remoteId'] ) ) + { + $contentTypes = array( + $this->loadContentTypeByRemoteId() + ); + } + + if ( $this->getMediaType( $this->request ) == 'application/vnd.ez.api.contenttypelist' ) + { + return new Values\ContentTypeList( $contentTypes, $this->request->path ); + } + + return new Values\ContentTypeInfoList( $contentTypes, $this->request->path ); + } + + /** + * Loads a content type by its identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByIdentifier() + { + return $this->contentTypeService->loadContentTypeByIdentifier( + $this->request->variables['identifier'] + ); + } + + /** + * Loads a content type by its remote ID + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByRemoteId() + { + return $this->contentTypeService->loadContentTypeByRemoteId( + $this->request->variables['remoteId'] + ); + } + + /** + * Creates a new content type draft in the given content type group + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedContentType + */ + public function createContentType() + { + $questionMarkPosition = strpos( $this->request->path, '?' ); + $urlValues = $this->urlHandler->parse( + 'grouptypes', + $questionMarkPosition !== false ? substr( $this->request->path, 0, $questionMarkPosition ) : $this->request->path + ); + + $contentTypeGroup = $this->contentTypeService->loadContentTypeGroup( $urlValues['typegroup'] ); + + try + { + $contentTypeDraft = $this->contentTypeService->createContentType( + $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + ), + $this->request->body + ) + ), + array( $contentTypeGroup ) + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + if ( isset( $this->request->variables['publish'] ) && $this->request->variables['publish'] === 'true' ) + { + $this->contentTypeService->publishContentTypeDraft( $contentTypeDraft, 'bla' ); + + $contentType = $this->contentTypeService->loadContentType( $contentTypeDraft->id ); + return new Values\CreatedContentType( + array( + 'contentType' => new Values\RestContentType( + $contentType, + $contentType->getFieldDefinitions() + ) + ) + ); + } + + return new Values\CreatedContentType( + array( + 'contentType' => new Values\RestContentType( + $contentTypeDraft, + $contentTypeDraft->getFieldDefinitions() + ) + ) + ); + } + + /** + * Copies a content type. The identifier of the copy + * is changed to copy_of_<identifier> and a new remoteId is generated. + * + * @return \eZ\Publish\Core\REST\Server\Values\ResourceCreated + */ + public function copyContentType() + { + $urlValues = $this->urlHandler->parse( 'type', $this->request->path ); + + $copiedContentType = $this->contentTypeService->copyContentType( + $this->contentTypeService->loadContentType( $urlValues['type'] ) + ); + + return new Values\ResourceCreated( + $this->urlHandler->generate( 'type', array( 'type' => $copiedContentType->id ) ) + ); + } + + /** + * Creates a draft and updates it with the given data + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedContentType + */ + public function createContentTypeDraft() + { + $urlValues = $this->urlHandler->parse( 'type', $this->request->path ); + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + + try + { + $contentTypeDraft = $this->contentTypeService->createContentTypeDraft( + $contentType + ); + } + catch ( BadStateException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + $contentTypeUpdateStruct = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + ), + $this->request->body + ) + ); + + try + { + $this->contentTypeService->updateContentTypeDraft( + $contentTypeDraft, + $contentTypeUpdateStruct + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\CreatedContentType( + array( + 'contentType' => new Values\RestContentType( + // Reload the content type draft to get the updated values + $this->contentTypeService->loadContentTypeDraft( + $contentTypeDraft->id + ) + ) + ) + ); + } + + /** + * Loads a content type draft + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContentType + */ + public function loadContentTypeDraft() + { + $urlValues = $this->urlHandler->parse( 'typeDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + + return new Values\RestContentType( + $contentTypeDraft, + $contentTypeDraft->getFieldDefinitions() + ); + } + + /** + * Updates meta data of a draft. This method does not handle field definitions + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContentType + */ + public function updateContentTypeDraft() + { + $urlValues = $this->urlHandler->parse( 'typeDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + $contentTypeUpdateStruct = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + ), + $this->request->body + ) + ); + + try + { + $this->contentTypeService->updateContentTypeDraft( + $contentTypeDraft, + $contentTypeUpdateStruct + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\RestContentType( + // Reload the content type draft to get the updated values + $this->contentTypeService->loadContentTypeDraft( + $contentTypeDraft->id + ) + ); + } + + /** + * Creates a new field definition for the given content type + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedFieldDefinition + */ + public function addFieldDefinition() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinitionsDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + $fieldDefinitionCreate = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + ), + $this->request->body + ) + ); + + try + { + $this->contentTypeService->addFieldDefinition( + $contentTypeDraft, + $fieldDefinitionCreate + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + $updatedDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + foreach ( $updatedDraft->getFieldDefinitions() as $fieldDefinition ) + { + if ( $fieldDefinition->identifier == $fieldDefinitionCreate->identifier ) + { + return new Values\CreatedFieldDefinition( + array( + 'fieldDefinition' => new Values\RestFieldDefinition( + $updatedDraft, $fieldDefinition + ) + ) + ); + } + } + + throw new Exceptions\NotFoundException( "Field definition not found: '{$this->request->path}'." ); + } + + /** + * Loads field definitions for a given content type + * + * @return \eZ\Publish\Core\REST\Server\Values\FieldDefinitionList + */ + public function loadFieldDefinitionList() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinitions', $this->request->path ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + + return new Values\FieldDefinitionList( + $contentType, + $contentType->getFieldDefinitions() + ); + } + + /** + * Returns the field definition given by id + * + * @return \eZ\Publish\Core\REST\Server\Values\RestFieldDefinition + */ + public function loadFieldDefinition() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinition', $this->request->path ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + + foreach ( $contentType->getFieldDefinitions() as $fieldDefinition ) + { + if ( $fieldDefinition->id == $urlValues['fieldDefinition'] ) + { + return new Values\RestFieldDefinition( + $contentType, + $fieldDefinition + ); + } + } + + throw new Exceptions\NotFoundException( "Field definition not found: '{$this->request->path}'." ); + } + + /** + * Loads field definitions for a given content type draft + * + * @return \eZ\Publish\Core\REST\Server\Values\FieldDefinitionList + */ + public function loadDraftFieldDefinitionList() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinitionsDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + + return new Values\FieldDefinitionList( + $contentTypeDraft, + $contentTypeDraft->getFieldDefinitions() + ); + } + + /** + * Returns the draft field definition given by id + * + * @return \eZ\Publish\Core\REST\Server\Values\RestFieldDefinition + */ + public function loadDraftFieldDefinition() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinitionDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + + foreach ( $contentTypeDraft->getFieldDefinitions() as $fieldDefinition ) + { + if ( $fieldDefinition->id == $urlValues['fieldDefinition'] ) + { + return new Values\RestFieldDefinition( + $contentTypeDraft, + $fieldDefinition + ); + } + } + + throw new Exceptions\NotFoundException( "Field definition not found: '{$this->request->path}'." ); + } + + /** + * Updates the attributes of a field definition + * + * @return \eZ\Publish\Core\REST\Server\Values\FieldDefinitionList + */ + public function updateFieldDefinition() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinitionDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + $fieldDefinitionUpdate = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + ), + $this->request->body + ) + ); + + $fieldDefinition = null; + foreach ( $contentTypeDraft->getFieldDefinitions() as $fieldDef ) + { + if ( $fieldDef->id == $urlValues['fieldDefinition'] ) + { + $fieldDefinition = $fieldDef; + } + } + + if ( $fieldDefinition === null ) + { + throw new Exceptions\NotFoundException( "Field definition not found: '{$this->request->path}'." ); + } + + try + { + $this->contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $fieldDefinition, + $fieldDefinitionUpdate + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + $updatedDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + foreach ( $updatedDraft->getFieldDefinitions() as $fieldDef ) + { + if ( $fieldDef->id == $urlValues['fieldDefinition'] ) + { + return new Values\RestFieldDefinition( + $updatedDraft, $fieldDef + ); + } + } + + throw new Exceptions\NotFoundException( "Field definition not found: '{$this->request->path}'." ); + } + + /** + * The given field definition is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function removeFieldDefinition() + { + $urlValues = $this->urlHandler->parse( 'typeFieldDefinitionDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + + $fieldDefinition = null; + foreach ( $contentTypeDraft->getFieldDefinitions() as $fieldDef ) + { + if ( $fieldDef->id == $urlValues['fieldDefinition'] ) + { + $fieldDefinition = $fieldDef; + } + } + + if ( $fieldDefinition === null ) + { + throw new Exceptions\NotFoundException( "Field definition not found: '{$this->request->path}'." ); + } + + $this->contentTypeService->removeFieldDefinition( + $contentTypeDraft, + $fieldDefinition + ); + + return new Values\NoContent(); + } + + /** + * Publishes a content type draft + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContentType + */ + public function publishContentTypeDraft() + { + $urlValues = $this->urlHandler->parse( 'typeDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + + $fieldDefinitions = $contentTypeDraft->getFieldDefinitions(); + if ( empty( $fieldDefinitions ) ) + { + throw new ForbiddenException( 'Empty content type draft cannot be published' ); + } + + $this->contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + + $publishedContentType = $this->contentTypeService->loadContentType( $contentTypeDraft->id ); + return new Values\RestContentType( + $publishedContentType, + $publishedContentType->getFieldDefinitions() + ); + } + + /** + * The given content type is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteContentType() + { + $urlValues = $this->urlHandler->parse( 'type', $this->request->path ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + + try + { + $this->contentTypeService->deleteContentType( $contentType ); + } + catch ( BadStateException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\NoContent(); + } + + /** + * The given content type draft is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteContentTypeDraft() + { + $urlValues = $this->urlHandler->parse( 'typeDraft', $this->request->path ); + + $contentTypeDraft = $this->contentTypeService->loadContentTypeDraft( $urlValues['type'] ); + $this->contentTypeService->deleteContentType( $contentTypeDraft ); + + return new Values\NoContent(); + } + + /** + * Returns the content type groups the content type belongs to + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentTypeGroupRefList + */ + public function loadGroupsOfContentType() + { + $urlValues = $this->urlHandler->parse( 'groupsOfType', $this->request->path ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + return new Values\ContentTypeGroupRefList( + $contentType, + $contentType->getContentTypeGroups() + ); + } + + /** + * Links a content type group to the content type and returns the updated group list + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentTypeGroupRefList + */ + public function linkContentTypeToGroup() + { + $questionMarkPosition = strpos( $this->request->path, '?' ); + $urlValues = $this->urlHandler->parse( + 'groupsOfType', + $questionMarkPosition !== false ? substr( $this->request->path, 0, $questionMarkPosition ) : $this->request->path + ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + + try + { + $groupValues = $this->urlHandler->parse( 'typegroup', $this->request->variables['group'] ); + } + catch ( Exceptions\InvalidArgumentException $e ) + { + // Group URI does not match the required value + throw new BadRequestException( $e->getMessage() ); + } + + $contentTypeGroup = $this->contentTypeService->loadContentTypeGroup( $groupValues['typegroup'] ); + + $existingContentTypeGroups = $contentType->getContentTypeGroups(); + $contentTypeInGroup = false; + foreach ( $existingContentTypeGroups as $existingGroup ) + { + if ( $existingGroup->id == $contentTypeGroup->id ) + { + $contentTypeInGroup = true; + break; + } + } + + if ( $contentTypeInGroup ) + { + throw new ForbiddenException( 'Content type is already linked to provided group' ); + } + + $this->contentTypeService->assignContentTypeGroup( + $contentType, + $contentTypeGroup + ); + + $existingContentTypeGroups[] = $contentTypeGroup; + return new Values\ContentTypeGroupRefList( + $contentType, + $existingContentTypeGroups + ); + } + + /** + * Removes the given group from the content type and returns the updated group list + * + * @return \eZ\Publish\Core\REST\Server\Values\ContentTypeGroupRefList + */ + public function unlinkContentTypeFromGroup() + { + $urlValues = $this->urlHandler->parse( 'groupOfType', $this->request->path ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + $contentTypeGroup = $this->contentTypeService->loadContentTypeGroup( $urlValues['group'] ); + + $existingContentTypeGroups = $contentType->getContentTypeGroups(); + $contentTypeInGroup = false; + foreach ( $existingContentTypeGroups as $existingGroup ) + { + if ( $existingGroup->id == $contentTypeGroup->id ) + { + $contentTypeInGroup = true; + break; + } + } + + if ( !$contentTypeInGroup ) + { + throw new Exceptions\NotFoundException( 'Content type is not in the given group' ); + } + + if ( count( $existingContentTypeGroups ) == 1 ) + { + throw new ForbiddenException( 'Content type cannot be unlinked from the only remaining group' ); + } + + $this->contentTypeService->unassignContentTypeGroup( + $contentType, + $contentTypeGroup + ); + + $contentType = $this->contentTypeService->loadContentType( $urlValues['type'] ); + return new Values\ContentTypeGroupRefList( + $contentType, + $contentType->getContentTypeGroups() + ); + } + + /** + * Converts the provided ContentTypeGroupCreateStruct to ContentTypeGroupUpdateStruct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct $createStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct + */ + private function mapToGroupUpdateStruct( ContentTypeGroupCreateStruct $createStruct ) + { + return new ContentTypeGroupUpdateStruct( + array( + 'identifier' => $createStruct->identifier, + 'modifierId' => $createStruct->creatorId, + 'modificationDate' => $createStruct->creationDate, + 'mainLanguageCode' => $createStruct->mainLanguageCode, + 'names' => $createStruct->names, + 'descriptions' => $createStruct->descriptions + ) + ); + } + + /** + * Extracts the requested media type from $request + * + * @return string + */ + private function getMediaType() + { + foreach ( $this->request->mimetype as $mimeType ) + { + if ( preg_match( '(^([a-z0-9-/.]+)\+.*$)', $mimeType['value'], $matches ) ) + { + return $matches[1]; + } + } + return 'unknown/unknown'; + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/Location.php b/eZ/Publish/Core/REST/Server/Controller/Location.php new file mode 100644 index 0000000..d7e9ae7 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/Location.php @@ -0,0 +1,391 @@ +<?php +/** + * File containing the Role controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\LocationService; +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\TrashService; + +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\REST\Server\Exceptions\BadRequestException; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; + +/** + * Location controller + */ +class Location extends RestController +{ + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Trash service + * + * @var \eZ\Publish\API\Repository\TrashService + */ + protected $trashService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\LocationService $locationService + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\TrashService $trashService + */ + public function __construct( LocationService $locationService, ContentService $contentService, TrashService $trashService ) + { + $this->locationService = $locationService; + $this->contentService = $contentService; + $this->trashService = $trashService; + } + + /** + * Loads the location for a given ID (x)or remote ID + * + * @return \eZ\Publish\Core\REST\Server\Values\TemporaryRedirect + */ + public function redirectLocation() + { + if ( !isset( $this->request->variables['id'] ) && !isset( $this->request->variables['remoteId'] ) ) + { + throw new BadRequestException( "At least one of 'id' or 'remoteId' parameters is required." ); + } + + if ( isset( $this->request->variables['id'] ) ) + { + $location = $this->locationService->loadLocation( $this->request->variables['id'] ); + } + else + { + $location = $this->locationService->loadLocationByRemoteId( $this->request->variables['remoteId'] ); + } + + return new Values\TemporaryRedirect( + $this->urlHandler->generate( + 'location', + array( + 'location' => rtrim( $location->pathString, '/' ) + ) + ) + ); + } + + /** + * Creates a new location for the given content object + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedLocation + */ + public function createLocation() + { + $values = $this->urlHandler->parse( 'objectLocations', $this->request->path ); + + $locationCreateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $contentInfo = $this->contentService->loadContentInfo( $values['object'] ); + + try + { + $createdLocation = $this->locationService->createLocation( $contentInfo, $locationCreateStruct ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\CreatedLocation( array( "restLocation" => new Values\RestLocation( $createdLocation, 0 ) ) ); + } + + /** + * Loads a location + * + * @return \eZ\Publish\Core\REST\Server\Values\RestLocation + */ + public function loadLocation() + { + $values = $this->urlHandler->parse( 'location', $this->request->path ); + return new Values\RestLocation( + $location = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $values['location'] ) + ), + $this->locationService->getLocationChildCount( $location ) + ); + } + + /** + * Deletes a location + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteSubtree() + { + $values = $this->urlHandler->parse( 'location', $this->request->path ); + $location = $this->locationService->loadLocation( $this->extractLocationIdFromPath( $values['location'] ) ); + $this->locationService->deleteLocation( $location ); + + return new Values\NoContent(); + } + + /** + * Copies a subtree to a new destination + * + * @return \eZ\Publish\Core\REST\Server\Values\ResourceCreated + */ + public function copySubtree() + { + $values = $this->urlHandler->parse( 'location', $this->request->path ); + $location = $this->locationService->loadLocation( $this->extractLocationIdFromPath( $values['location'] ) ); + + $destinationValues = $this->urlHandler->parse( 'location', $this->request->destination ); + $destinationLocation = $this->locationService->loadLocation( $this->extractLocationIdFromPath( $destinationValues['location'] ) ); + + $newLocation = $this->locationService->copySubtree( $location, $destinationLocation ); + + return new Values\ResourceCreated( + $this->urlHandler->generate( + 'location', + array( + 'location' => rtrim( $newLocation->pathString, '/' ), + ) + ) + ); + } + + /** + * Moves a subtree to a new location + * + * @throws \eZ\Publish\Core\REST\Server\Exceptions\BadRequestException if the Destination header cannot be parsed as location or trash + * + * @return \eZ\Publish\Core\REST\Server\Values\ResourceCreated + */ + public function moveSubtree() + { + $values = $this->urlHandler->parse( 'location', $this->request->path ); + + $locationToMove = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $values['location'] ) + ); + + $destinationLocationId = null; + try + { + // First check to see if the destination is for moving within another subtree + $destinationValues = $this->urlHandler->parse( 'location', $this->request->destination ); + $destinationLocationId = $this->extractLocationIdFromPath( $destinationValues['location'] ); + } + catch ( Exceptions\InvalidArgumentException $e ) + { + try + { + // If parsing of destination fails, let's try to see if destination is trash + $this->urlHandler->parse( 'trashItems', $this->request->destination ); + } + catch ( Exceptions\InvalidArgumentException $e ) + { + // If that fails, the Destination header is not formatted right + // so just throw the BadRequestException + throw new BadRequestException( "{$this->request->destination} is not formatted correctly" ); + } + } + + if ( $destinationLocationId !== null ) + { + // We're moving the subtree + $destinationLocation = $this->locationService->loadLocation( $destinationLocationId ); + $this->locationService->moveSubtree( $locationToMove, $destinationLocation ); + + // Reload the location to get the new position is subtree + $locationToMove = $this->locationService->loadLocation( $locationToMove->id ); + return new Values\ResourceCreated( + $this->urlHandler->generate( + 'location', + array( + 'location' => rtrim( $locationToMove->pathString, '/' ), + ) + ) + ); + } + + // We're trashing the subtree + $trashItem = $this->trashService->trash( $locationToMove ); + return new Values\ResourceCreated( + $this->urlHandler->generate( 'trash', array( 'trash' => $trashItem->id ) ) + ); + } + + /** + * Swaps a location with another one + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function swapLocation() + { + $values = $this->urlHandler->parse( 'location', $this->request->path ); + + $locationId = $this->extractLocationIdFromPath( $values['location'] ); + $location = $this->locationService->loadLocation( $locationId ); + + $destinationValues = $this->urlHandler->parse( 'location', $this->request->destination ); + $destinationLocation = $this->locationService->loadLocation( $this->extractLocationIdFromPath( $destinationValues['location'] ) ); + + $this->locationService->swapLocation( $location, $destinationLocation ); + + return new Values\NoContent(); + } + + /** + * Loads a location by remote ID + * + * @return \eZ\Publish\Core\REST\Server\Values\LocationList + */ + public function loadLocationByRemoteId() + { + return new Values\LocationList( + array( + new Values\RestLocation( + $location = $this->locationService->loadLocationByRemoteId( + $this->request->variables['remoteId'] + ), + $this->locationService->getLocationChildCount( $location ) + ) + ), + $this->request->path + ); + } + + /** + * Loads all locations for content object + * + * @return \eZ\Publish\Core\REST\Server\Values\LocationList + */ + public function loadLocationsForContent() + { + $values = $this->urlHandler->parse( 'objectLocations', $this->request->path ); + $restLocations = array(); + foreach ( + $this->locationService->loadLocations( + $this->contentService->loadContentInfo( $values['object'] ) + ) as $location + ) + { + $restLocations[] = new Values\RestLocation( + $location, + $this->locationService->getLocationChildCount( $location ) + ); + } + + return new Values\LocationList( $restLocations, $this->request->path ); + } + + /** + * Loads child locations of a location + * + * @return \eZ\Publish\Core\REST\Server\Values\LocationList + */ + public function loadLocationChildren() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $values = $this->urlHandler->parse( 'locationChildren', $requestPath ); + + $offset = isset( $this->request->variables['offset'] ) ? (int)$this->request->variables['offset'] : 0; + $limit = isset( $this->request->variables['limit'] ) ? (int)$this->request->variables['limit'] : -1; + + $restLocations = array(); + foreach ( + $this->locationService->loadLocationChildren( + $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $values['location'] ) + ), + $offset >= 0 ? $offset : 0, + $limit >= 0 ? $limit : -1 + )->locations as $location + ) + { + $restLocations[] = new Values\RestLocation( + $location, + $this->locationService->getLocationChildCount( $location ) + ); + } + + return new Values\LocationList( $restLocations, $this->request->path ); + } + + /** + * Updates a location + * + * @return \eZ\Publish\Core\REST\Server\Values\RestLocation + */ + public function updateLocation() + { + $values = $this->urlHandler->parse( 'location', $this->request->path ); + + $locationUpdate = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $location = $this->locationService->loadLocation( $this->extractLocationIdFromPath( $values['location'] ) ); + + // First handle hiding/unhiding so that updating location afterwards + // will return updated location with hidden/visible status correctly updated + // Exact check for true/false is needed as null signals that no hiding/unhiding + // is to be performed + if ( $locationUpdate->hidden === true ) + { + $this->locationService->hideLocation( $location ); + } + else if ( $locationUpdate->hidden === false ) + { + $this->locationService->unhideLocation( $location ); + } + + return new Values\RestLocation( + $location = $this->locationService->updateLocation( $location, $locationUpdate->locationUpdateStruct ), + $this->locationService->getLocationChildCount( $location ) + ); + } + + /** + * Extracts and returns an item id from a path, e.g. /1/2/58 => 58 + * + * @param string $path + * + * @return mixed + */ + private function extractLocationIdFromPath( $path ) + { + $pathParts = explode( '/', $path ); + return array_pop( $pathParts ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/ObjectState.php b/eZ/Publish/Core/REST/Server/Controller/ObjectState.php new file mode 100644 index 0000000..6fe06ab --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/ObjectState.php @@ -0,0 +1,342 @@ +<?php +/** + * File containing the ObjectState controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Common\Values\RestObjectState; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\ObjectStateService; +use eZ\Publish\API\Repository\ContentService; + +use eZ\Publish\Core\REST\Common\Values\ContentObjectStates; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; + +/** + * ObjectState controller + */ +class ObjectState extends RestController +{ + /** + * ObjectState service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\ObjectStateService $objectStateService + * @param \eZ\Publish\API\Repository\ContentService $contentService + */ + public function __construct( ObjectStateService $objectStateService, ContentService $contentService ) + { + $this->objectStateService = $objectStateService; + $this->contentService = $contentService; + } + + /** + * Creates a new object state group + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedObjectStateGroup + */ + public function createObjectStateGroup() + { + try + { + $createdStateGroup = $this->objectStateService->createObjectStateGroup( + $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ) + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\CreatedObjectStateGroup( + array( + 'objectStateGroup' => $createdStateGroup + ) + ); + } + + /** + * Creates a new object state + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedObjectState + */ + public function createObjectState() + { + $values = $this->urlHandler->parse( 'objectstates', $this->request->path ); + + $objectStateGroup = $this->objectStateService->loadObjectStateGroup( $values['objectstategroup'] ); + + try + { + $createdObjectState = $this->objectStateService->createObjectState( + $objectStateGroup, + $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ) + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\CreatedObjectState( + array( + 'objectState' => new RestObjectState( + $createdObjectState, + $objectStateGroup->id + ) + ) + ); + } + + /** + * Loads an object state group + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function loadObjectStateGroup() + { + $values = $this->urlHandler->parse( 'objectstategroup', $this->request->path ); + return $this->objectStateService->loadObjectStateGroup( $values['objectstategroup'] ); + } + + /** + * Loads an object state + * + * @return \eZ\Publish\Core\REST\Common\Values\RestObjectState + */ + public function loadObjectState() + { + $values = $this->urlHandler->parse( 'objectstate', $this->request->path ); + return new RestObjectState( + $this->objectStateService->loadObjectState( $values['objectstate'] ), + $values['objectstategroup'] + ); + } + + /** + * Returns a list of all object state groups + * + * @return \eZ\Publish\Core\REST\Server\Values\ObjectStateGroupList + */ + public function loadObjectStateGroups() + { + return new Values\ObjectStateGroupList( + $this->objectStateService->loadObjectStateGroups() + ); + } + + /** + * Returns a list of all object states of the given group + * + * @return \eZ\Publish\Core\REST\Server\Values\ObjectStateList + */ + public function loadObjectStates() + { + $values = $this->urlHandler->parse( 'objectstates', $this->request->path ); + + $objectStateGroup = $this->objectStateService->loadObjectStateGroup( $values['objectstategroup'] ); + return new Values\ObjectStateList( + $this->objectStateService->loadObjectStates( $objectStateGroup ), + $objectStateGroup->id + ); + } + + /** + * The given object state group including the object states is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteObjectStateGroup() + { + $values = $this->urlHandler->parse( 'objectstategroup', $this->request->path ); + $this->objectStateService->deleteObjectStateGroup( + $this->objectStateService->loadObjectStateGroup( $values['objectstategroup'] ) + ); + + return new Values\NoContent(); + } + + /** + * The given object state is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteObjectState() + { + $values = $this->urlHandler->parse( 'objectstate', $this->request->path ); + $this->objectStateService->deleteObjectState( + $this->objectStateService->loadObjectState( $values['objectstate'] ) + ); + + return new Values\NoContent(); + } + + /** + * Updates an object state group + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function updateObjectStateGroup() + { + $values = $this->urlHandler->parse( 'objectstategroup', $this->request->path ); + $updateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $objectStateGroup = $this->objectStateService->loadObjectStateGroup( $values['objectstategroup'] ); + + try + { + $updatedStateGroup = $this->objectStateService->updateObjectStateGroup( $objectStateGroup, $updateStruct ); + return $updatedStateGroup; + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + /** + * Updates an object state + * + * @return \eZ\Publish\Core\REST\Common\Values\RestObjectState + */ + public function updateObjectState() + { + $values = $this->urlHandler->parse( 'objectstate', $this->request->path ); + $updateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $objectState = $this->objectStateService->loadObjectState( $values['objectstate'] ); + + try + { + $updatedObjectState = $this->objectStateService->updateObjectState( $objectState, $updateStruct ); + return new RestObjectState( $updatedObjectState, $values['objectstategroup'] ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + /** + * Returns the object states of content + * + * @return \eZ\Publish\Core\REST\Common\Values\ContentObjectStates + */ + public function getObjectStatesForContent() + { + $values = $this->urlHandler->parse( 'objectObjectStates', $this->request->path ); + $groups = $this->objectStateService->loadObjectStateGroups(); + $contentInfo = $this->contentService->loadContentInfo( $values['object'] ); + + $contentObjectStates = array(); + + foreach ( $groups as $group ) + { + try + { + $state = $this->objectStateService->getContentState( $contentInfo, $group ); + $contentObjectStates[] = new RestObjectState( $state, $group->id ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + return new ContentObjectStates( $contentObjectStates ); + } + + /** + * Updates object states of content + * An object state in the input overrides the state of the object state group + * + * @return \eZ\Publish\Core\REST\Common\Values\ContentObjectStates + */ + public function setObjectStatesForContent() + { + $values = $this->urlHandler->parse( 'objectObjectStates', $this->request->path ); + $newObjectStates = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $countByGroups = array(); + foreach ( $newObjectStates as $newObjectState ) + { + $groupId = (int)$newObjectState->groupId; + if ( array_key_exists( $groupId, $countByGroups ) ) + { + $countByGroups[$groupId]++; + } + else + { + $countByGroups[$groupId] = 1; + } + } + + foreach ( $countByGroups as $groupId => $count ) + { + if ( $count > 1 ) + { + throw new ForbiddenException( "Multiple object states provided for group with ID $groupId" ); + } + } + + $contentInfo = $this->contentService->loadContentInfo( $values['object'] ); + + $contentObjectStates = array(); + foreach ( $newObjectStates as $newObjectState ) + { + $objectStateGroup = $this->objectStateService->loadObjectStateGroup( $newObjectState->groupId ); + $this->objectStateService->setContentState( $contentInfo, $objectStateGroup, $newObjectState->objectState ); + $contentObjectStates[(int)$objectStateGroup->id] = $newObjectState; + } + + return new ContentObjectStates( $contentObjectStates ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/Role.php b/eZ/Publish/Core/REST/Server/Controller/Role.php new file mode 100644 index 0000000..67c7f34 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/Role.php @@ -0,0 +1,519 @@ +<?php +/** + * File containing the Role controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\RoleService; +use eZ\Publish\API\Repository\UserService; +use eZ\Publish\API\Repository\LocationService; +use eZ\Publish\API\Repository\Values\User\RoleCreateStruct; +use eZ\Publish\API\Repository\Values\User\RoleUpdateStruct; + +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; + +/** + * Role controller + */ +class Role extends RestController +{ + /** + * Role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * User service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\RoleService $roleService + * @param \eZ\Publish\API\Repository\UserService $userService + * @param \eZ\Publish\API\Repository\LocationService $locationService + */ + public function __construct( RoleService $roleService, UserService $userService, + LocationService $locationService ) + { + $this->roleService = $roleService; + $this->userService = $userService; + $this->locationService = $locationService; + } + + /** + * Create new role + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedRole + */ + public function createRole() + { + return new Values\CreatedRole( + array( + 'role' => $this->roleService->createRole( + $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ) + ) + ) + ); + } + + /** + * Loads list of roles + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleList + */ + public function listRoles() + { + $roles = array(); + if ( isset( $this->request->variables['identifier'] ) ) + { + try + { + $role = $this->roleService->loadRoleByIdentifier( $this->request->variables['identifier'] ); + $roles[] = $role; + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + else + { + $offset = isset( $this->request->variables['offset'] ) ? (int)$this->request->variables['offset'] : 0; + $limit = isset( $this->request->variables['limit'] ) ? (int)$this->request->variables['limit'] : -1; + + $roles = array_slice( + $this->roleService->loadRoles(), + $offset >= 0 ? $offset : 0, + $limit >= 0 ? $limit : null + ); + } + + return new Values\RoleList( $roles, $this->request->path ); + } + + /** + * Loads role + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRole() + { + $values = $this->urlHandler->parse( 'role', $this->request->path ); + return $this->roleService->loadRole( $values['role'] ); + } + + /** + * Updates a role + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function updateRole() + { + $values = $this->urlHandler->parse( 'role', $this->request->path ); + $createStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + return $this->roleService->updateRole( + $this->roleService->loadRole( $values['role'] ), + $this->mapToUpdateStruct( $createStruct ) + ); + } + + /** + * Delete a role by ID + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteRole() + { + $values = $this->urlHandler->parse( 'role', $this->request->path ); + $this->roleService->deleteRole( + $this->roleService->loadRole( $values['role'] ) + ); + + return new Values\NoContent(); + } + + /** + * Loads the policies for the role + * + * @return \eZ\Publish\Core\REST\Server\Values\PolicyList + */ + public function loadPolicies() + { + $values = $this->urlHandler->parse( 'policies', $this->request->path ); + + $loadedRole = $this->roleService->loadRole( $values['role'] ); + + return new Values\PolicyList( $loadedRole->getPolicies(), $this->request->path ); + } + + /** + * Deletes all policies from a role + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deletePolicies() + { + $values = $this->urlHandler->parse( 'policies', $this->request->path ); + + $loadedRole = $this->roleService->loadRole( $values['role'] ); + + foreach ( $loadedRole->getPolicies() as $rolePolicy ) + { + $this->roleService->removePolicy( $loadedRole, $rolePolicy ); + } + + return new Values\NoContent(); + } + + /** + * Loads a policy + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function loadPolicy() + { + $values = $this->urlHandler->parse( 'policy', $this->request->path ); + + $loadedRole = $this->roleService->loadRole( $values['role'] ); + foreach ( $loadedRole->getPolicies() as $policy ) + { + if ( $policy->id == $values['policy'] ) + return $policy; + } + + throw new Exceptions\NotFoundException( "Policy not found: '{$this->request->path}'." ); + } + + /** + * Adds a policy to role + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedPolicy + */ + public function addPolicy() + { + $values = $this->urlHandler->parse( 'policies', $this->request->path ); + $createStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $role = $this->roleService->addPolicy( + $this->roleService->loadRole( $values['role'] ), + $createStruct + ); + + $policies = $role->getPolicies(); + + $policyToReturn = $policies[0]; + for ( $i = 1, $count = count( $policies ); $i < $count; $i++ ) + { + if ( $policies[$i]->id > $policyToReturn->id ) + $policyToReturn = $policies[$i]; + } + + return new Values\CreatedPolicy( + array( + 'policy' => $policyToReturn + ) + ); + } + + /** + * Updates a policy + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function updatePolicy() + { + $values = $this->urlHandler->parse( 'policy', $this->request->path ); + $updateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $role = $this->roleService->loadRole( $values['role'] ); + foreach ( $role->getPolicies() as $policy ) + { + if ( $policy->id == $values['policy'] ) + { + return $this->roleService->updatePolicy( + $policy, + $updateStruct + ); + } + } + + throw new Exceptions\NotFoundException( "Policy not found: '{$this->request->path}'." ); + } + + /** + * Delete a policy from role + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deletePolicy() + { + $values = $this->urlHandler->parse( 'policy', $this->request->path ); + + $role = $this->roleService->loadRole( $values['role'] ); + + $policy = null; + foreach ( $role->getPolicies() as $rolePolicy ) + { + if ( $rolePolicy->id == $values['policy'] ) + { + $policy = $rolePolicy; + break; + } + } + + if ( $policy !== null ) + { + $this->roleService->removePolicy( $role, $policy ); + return new Values\NoContent(); + } + + throw new Exceptions\NotFoundException( "Policy not found: '{$this->request->path}'." ); + } + + /** + * Assigns role to user + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList + */ + public function assignRoleToUser() + { + $values = $this->urlHandler->parse( 'userRoleAssignments', $this->request->path ); + + $roleAssignment = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $user = $this->userService->loadUser( $values['user'] ); + $role = $this->roleService->loadRole( $roleAssignment->roleId ); + + $this->roleService->assignRoleToUser( $role, $user, $roleAssignment->limitation ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUser( $user ); + return new Values\RoleAssignmentList( $roleAssignments, $user->id ); + } + + /** + * Assigns role to user group + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList + */ + public function assignRoleToUserGroup() + { + $values = $this->urlHandler->parse( 'groupRoleAssignments', $this->request->path ); + + $roleAssignment = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + $groupLocationParts = explode( '/', $values['group'] ); + $groupLocation = $this->locationService->loadLocation( array_pop( $groupLocationParts ) ); + $userGroup = $this->userService->loadUserGroup( $groupLocation->contentId ); + + $role = $this->roleService->loadRole( $roleAssignment->roleId ); + $this->roleService->assignRoleToUserGroup( $role, $userGroup, $roleAssignment->limitation ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUserGroup( $userGroup ); + return new Values\RoleAssignmentList( $roleAssignments, $values['group'], true ); + } + + /** + * Un-assigns role from user + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList + */ + public function unassignRoleFromUser() + { + $values = $this->urlHandler->parse( 'userRoleAssignment', $this->request->path ); + + $user = $this->userService->loadUser( $values['user'] ); + $role = $this->roleService->loadRole( $values['role'] ); + + $this->roleService->unassignRoleFromUser( $role, $user ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUser( $user ); + return new Values\RoleAssignmentList( $roleAssignments, $user->id ); + } + + /** + * Un-assigns role from user group + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList + */ + public function unassignRoleFromUserGroup() + { + $values = $this->urlHandler->parse( 'groupRoleAssignment', $this->request->path ); + + $groupLocationParts = explode( '/', $values['group'] ); + $groupLocation = $this->locationService->loadLocation( array_pop( $groupLocationParts ) ); + $userGroup = $this->userService->loadUserGroup( $groupLocation->contentId ); + + $role = $this->roleService->loadRole( $values['role'] ); + $this->roleService->unassignRoleFromUserGroup( $role, $userGroup ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUserGroup( $userGroup ); + return new Values\RoleAssignmentList( $roleAssignments, $values['group'], true ); + } + + /** + * Loads role assignments for user + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList + */ + public function loadRoleAssignmentsForUser() + { + $values = $this->urlHandler->parse( 'userRoleAssignments', $this->request->path ); + + $user = $this->userService->loadUser( $values['user'] ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUser( $user ); + return new Values\RoleAssignmentList( $roleAssignments, $user->id ); + } + + /** + * Loads role assignments for user group + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList + */ + public function loadRoleAssignmentsForUserGroup() + { + $values = $this->urlHandler->parse( 'groupRoleAssignments', $this->request->path ); + + $groupLocationParts = explode( '/', $values['group'] ); + $groupLocation = $this->locationService->loadLocation( array_pop( $groupLocationParts ) ); + $userGroup = $this->userService->loadUserGroup( $groupLocation->contentId ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUserGroup( $userGroup ); + + return new Values\RoleAssignmentList( $roleAssignments, $values['group'], true ); + } + + /** + * Returns a role assignment to the given user + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserRoleAssignment + */ + public function loadRoleAssignmentForUser() + { + $values = $this->urlHandler->parse( 'userRoleAssignment', $this->request->path ); + + $user = $this->userService->loadUser( $values['user'] ); + $roleAssignments = $this->roleService->getRoleAssignmentsForUser( $user ); + + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment->getRole()->id == $values['role'] ) + { + return new Values\RestUserRoleAssignment( $roleAssignment, $values['user'] ); + } + } + + throw new Exceptions\NotFoundException( "Role assignment not found: '{$this->request->path}'." ); + } + + /** + * Returns a role assignment to the given user group + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserGroupRoleAssignment + */ + public function loadRoleAssignmentForUserGroup() + { + $values = $this->urlHandler->parse( 'groupRoleAssignment', $this->request->path ); + + $groupLocationParts = explode( '/', $values['group'] ); + $groupLocation = $this->locationService->loadLocation( array_pop( $groupLocationParts ) ); + $userGroup = $this->userService->loadUserGroup( $groupLocation->contentId ); + + $roleAssignments = $this->roleService->getRoleAssignmentsForUserGroup( $userGroup ); + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment->getRole()->id == $values['role'] ) + { + return new Values\RestUserGroupRoleAssignment( $roleAssignment, $values['group'] ); + } + } + + throw new Exceptions\NotFoundException( "Role assignment not found: '{$this->request->path}'." ); + } + + /** + * Search all policies which are applied to a given user + * + * @return \eZ\Publish\Core\REST\Server\Values\PolicyList + */ + public function listPoliciesForUser() + { + return new Values\PolicyList( + $this->roleService->loadPoliciesByUserId( + $this->request->variables['userId'] + ), + $this->request->path + ); + } + + /** + * Maps a RoleCreateStruct to a RoleUpdateStruct. + * + * Needed since both structs are encoded into the same media type on input. + * + * @param \eZ\Publish\API\Repository\Values\User\RoleCreateStruct $createStruct + * + * @return \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct + */ + protected function mapToUpdateStruct( RoleCreateStruct $createStruct ) + { + return new RoleUpdateStruct( + array( + 'identifier' => $createStruct->identifier + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/Root.php b/eZ/Publish/Core/REST/Server/Controller/Root.php new file mode 100644 index 0000000..ed83d16 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/Root.php @@ -0,0 +1,29 @@ +<?php +/** + * File containing the Root controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +/** + * Root controller + */ +class Root extends RestController +{ + /** + * List the root resources of the eZ Publish installation + * + * @return \eZ\Publish\Core\REST\Common\Values\Root + */ + public function loadRootResource() + { + return new Values\Root(); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/Section.php b/eZ/Publish/Core/REST/Server/Controller/Section.php new file mode 100644 index 0000000..fb6ce22 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/Section.php @@ -0,0 +1,182 @@ +<?php +/** + * File containing the Section controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\SectionService; +use eZ\Publish\API\Repository\Values\Content\SectionCreateStruct; +use eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct; +use eZ\Publish\Core\REST\Server\Values\NoContent; + +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; + +/** + * Section controller + */ +class Section extends RestController +{ + /** + * Section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\SectionService $sectionService + */ + public function __construct( SectionService $sectionService ) + { + $this->sectionService = $sectionService; + } + + /** + * List sections + * + * @return \eZ\Publish\Core\REST\Server\Values\SectionList + */ + public function listSections() + { + if ( isset( $this->request->variables['identifier'] ) ) + { + $sections = array( + $this->loadSectionByIdentifier() + ); + } + else + { + $sections = $this->sectionService->loadSections(); + } + + return new Values\SectionList( $sections, $this->request->path ); + } + + /** + * Loads section by identifier + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSectionByIdentifier() + { + return $this->sectionService->loadSectionByIdentifier( + // GET variable + $this->request->variables['identifier'] + ); + } + + /** + * Create new section + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedSection + */ + public function createSection() + { + try + { + $createdSection = $this->sectionService->createSection( + $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ) + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\CreatedSection( + array( + 'section' => $createdSection + ) + ); + } + + /** + * Loads a section + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSection() + { + $values = $this->urlHandler->parse( 'section', $this->request->path ); + return $this->sectionService->loadSection( $values['section'] ); + } + + /** + * Updates a section + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function updateSection() + { + $values = $this->urlHandler->parse( 'section', $this->request->path ); + $createStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + try + { + return $this->sectionService->updateSection( + $this->sectionService->loadSection( $values['section'] ), + $this->mapToUpdateStruct( $createStruct ) + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + /** + * Delete a section by ID + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteSection() + { + $values = $this->urlHandler->parse( 'section', $this->request->path ); + $this->sectionService->deleteSection( + $this->sectionService->loadSection( $values['section'] ) + ); + + return new NoContent(); + } + + /** + * Maps a SectionCreateStruct to a SectionUpdateStruct. + * + * Needed since both structs are encoded into the same media type on input. + * + * @param \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct $createStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct + */ + protected function mapToUpdateStruct( SectionCreateStruct $createStruct ) + { + return new SectionUpdateStruct( + array( + 'name' => $createStruct->name, + 'identifier' => $createStruct->identifier, + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/Trash.php b/eZ/Publish/Core/REST/Server/Controller/Trash.php new file mode 100644 index 0000000..3c5689d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/Trash.php @@ -0,0 +1,194 @@ +<?php +/** + * File containing the Trash controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\TrashService; +use eZ\Publish\API\Repository\LocationService; + +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; + +use InvalidArgumentException; + +/** + * Trash controller + */ +class Trash extends RestController +{ + /** + * Trash service + * + * @var \eZ\Publish\API\Repository\TrashService + */ + protected $trashService; + + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\TrashService $trashService + * @param \eZ\Publish\API\Repository\LocationService $locationService + */ + public function __construct( TrashService $trashService, LocationService $locationService ) + { + $this->trashService = $trashService; + $this->locationService = $locationService; + } + + /** + * Returns a list of all trash items + * + * @return \eZ\Publish\Core\REST\Server\Values\Trash + */ + public function loadTrashItems() + { + $offset = isset( $this->request->variables['offset'] ) ? (int)$this->request->variables['offset'] : 0; + $limit = isset( $this->request->variables['limit'] ) ? (int)$this->request->variables['limit'] : -1; + + $query = new Query(); + $query->offset = $offset >= 0 ? $offset : null; + $query->limit = $limit >= 0 ? $limit : null; + + $trashItems = array(); + + foreach ( + $this->trashService->findTrashItems( + $query + )->items as $trashItem + ) + { + $trashItems[] = new Values\RestTrashItem( + $trashItem, + $this->locationService->getLocationChildCount( $trashItem ) + ); + } + + return new Values\Trash( + $trashItems, + $this->request->path + ); + } + + /** + * Returns the trash item given by id + * + * @return \eZ\Publish\Core\REST\Server\Values\RestTrashItem + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function loadTrashItem() + { + $values = $this->urlHandler->parse( 'trash', $this->request->path ); + return new Values\RestTrashItem( + $trashItem = $this->trashService->loadTrashItem( $values['trash'] ), + $this->locationService->getLocationChildCount( $trashItem ) + ); + } + + /** + * Empties the trash + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function emptyTrash() + { + $this->trashService->emptyTrash(); + + return new Values\NoContent(); + } + + /** + * Deletes the given trash item + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteTrashItem() + { + $values = $this->urlHandler->parse( 'trash', $this->request->path ); + $this->trashService->deleteTrashItem( + $this->trashService->loadTrashItem( $values['trash'] ) + ); + + return new Values\NoContent(); + } + + /** + * Restores a trashItem + * + * @return \eZ\Publish\Core\REST\Server\Values\ResourceCreated + */ + public function restoreTrashItem() + { + $requestDestination = null; + try + { + $requestDestination = $this->request->destination; + } + catch ( InvalidArgumentException $e ) + { + // No Destination header + } + + $parentLocation = null; + if ( $requestDestination !== null ) + { + $destinationValues = $this->urlHandler->parse( 'location', $requestDestination ); + + $locationPath = $destinationValues['location']; + $locationPathParts = explode( '/', $locationPath ); + + try + { + $parentLocation = $this->locationService->loadLocation( array_pop( $locationPathParts ) ); + } + catch ( NotFoundException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + $values = $this->urlHandler->parse( 'trash', $this->request->path ); + $trashItem = $this->trashService->loadTrashItem( $values['trash'] ); + + if ( $requestDestination === null ) + { + // If we're recovering under the original location + // check if it exists, to return "403 Forbidden" in case it does not + try + { + $this->locationService->loadLocation( $trashItem->parentLocationId ); + } + catch ( NotFoundException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + $location = $this->trashService->recover( $trashItem, $parentLocation ); + return new Values\ResourceCreated( + $this->urlHandler->generate( + 'location', + array( + 'location' => rtrim( $location->pathString, '/' ), + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/URLAlias.php b/eZ/Publish/Core/REST/Server/Controller/URLAlias.php new file mode 100644 index 0000000..65693de --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/URLAlias.php @@ -0,0 +1,181 @@ +<?php +/** + * File containing the URLAlias controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\URLAliasService; +use eZ\Publish\API\Repository\LocationService; + +/** + * URLAlias controller + */ +class URLAlias extends RestController +{ + /** + * URLAlias service + * + * @var \eZ\Publish\API\Repository\URLAliasService + */ + protected $urlAliasService; + + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\URLAliasService $urlAliasService + * @param \eZ\Publish\API\Repository\LocationService $locationService + */ + public function __construct( URLAliasService $urlAliasService, LocationService $locationService ) + { + $this->urlAliasService = $urlAliasService; + $this->locationService = $locationService; + } + + /** + * Returns the URL alias with the given ID + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function loadURLAlias() + { + $urlValues = $this->urlHandler->parse( 'urlAlias', $this->request->path ); + return $this->urlAliasService->load( $urlValues['urlalias'] ); + } + + /** + * Returns the list of global URL aliases + * + * @return \eZ\Publish\Core\REST\Server\Values\URLAliasRefList + */ + public function listGlobalURLAliases() + { + return new Values\URLAliasRefList( + $this->urlAliasService->listGlobalAliases(), + $this->urlHandler->generate( 'urlAliases' ) + ); + } + + /** + * Returns the list of URL aliases for a location + * + * @return \eZ\Publish\Core\REST\Server\Values\URLAliasRefList + */ + public function listLocationURLAliases() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $urlValues = $this->urlHandler->parse( 'locationUrlAliases', $requestPath ); + $locationPathParts = explode( '/', $urlValues['location'] ); + + $location = $this->locationService->loadLocation( + array_pop( $locationPathParts ) + ); + + $custom = isset( $this->request->variables['custom'] ) && $this->request->variables['custom'] === 'false' ? false : true; + + return new Values\URLAliasRefList( + $this->urlAliasService->listLocationAliases( $location, $custom ), + $this->request->path + ); + } + + /** + * Creates a new URL alias + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedURLAlias + */ + public function createURLAlias() + { + $urlAliasCreate = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + if ( $urlAliasCreate['_type'] === 'LOCATION' ) + { + $locationUrlValues = $this->urlHandler->parse( 'location', $urlAliasCreate['location']['_href'] ); + $locationPathParts = explode( '/', $locationUrlValues['location'] ); + + $location = $this->locationService->loadLocation( + array_pop( $locationPathParts ) + ); + + try + { + $createdURLAlias = $this->urlAliasService->createUrlAlias( + $location, + $urlAliasCreate['path'], + $urlAliasCreate['languageCode'], + $urlAliasCreate['forward'], + $urlAliasCreate['alwaysAvailable'] + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + else + { + try + { + $createdURLAlias = $this->urlAliasService->createGlobalUrlAlias( + $urlAliasCreate['resource'], + $urlAliasCreate['path'], + $urlAliasCreate['languageCode'], + $urlAliasCreate['forward'], + $urlAliasCreate['alwaysAvailable'] + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + } + + return new Values\CreatedURLAlias( + array( + 'urlAlias' => $createdURLAlias + ) + ); + } + + /** + * The given URL alias is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteURLAlias() + { + $urlValues = $this->urlHandler->parse( 'urlAlias', $this->request->path ); + + $this->urlAliasService->removeAliases( + array( + $this->urlAliasService->load( $urlValues['urlalias'] ) + ) + ); + + return new Values\NoContent(); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/URLWildcard.php b/eZ/Publish/Core/REST/Server/Controller/URLWildcard.php new file mode 100644 index 0000000..cbedeb4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/URLWildcard.php @@ -0,0 +1,113 @@ +<?php +/** + * File containing the URLWildcard controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\URLWildcardService; + +/** + * URLWildcard controller + */ +class URLWildcard extends RestController +{ + /** + * URLWildcard service + * + * @var \eZ\Publish\API\Repository\URLWildcardService + */ + protected $urlWildcardService; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\URLWildcardService $urlWildcardService + */ + public function __construct( URLWildcardService $urlWildcardService ) + { + $this->urlWildcardService = $urlWildcardService; + } + + /** + * Returns the URL wildcard with the given id + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcard + */ + public function loadURLWildcard() + { + $values = $this->urlHandler->parse( 'urlWildcard', $this->request->path ); + return $this->urlWildcardService->load( $values['urlwildcard'] ); + } + + /** + * Returns the list of URL wildcards + * + * @return \eZ\Publish\Core\REST\Server\Values\URLWildcardList + */ + public function listURLWildcards() + { + return new Values\URLWildcardList( + $this->urlWildcardService->loadAll() + ); + } + + /** + * Creates a new URL wildcard + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedURLWildcard + */ + public function createURLWildcard() + { + $urlWildcardCreate = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + try + { + $createdURLWildcard = $this->urlWildcardService->create( + $urlWildcardCreate['sourceUrl'], + $urlWildcardCreate['destinationUrl'], + $urlWildcardCreate['forward'] + ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + return new Values\CreatedURLWildcard( + array( + 'urlWildcard' => $createdURLWildcard + ) + ); + } + + /** + * The given URL wildcard is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteURLWildcard() + { + $values = $this->urlHandler->parse( 'urlWildcard', $this->request->path ); + $this->urlWildcardService->remove( + $this->urlWildcardService->load( $values['urlwildcard'] ) + ); + + return new Values\NoContent(); + } +} diff --git a/eZ/Publish/Core/REST/Server/Controller/User.php b/eZ/Publish/Core/REST/Server/Controller/User.php new file mode 100644 index 0000000..c025928 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Controller/User.php @@ -0,0 +1,912 @@ +<?php +/** + * File containing the User controller class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Controller; + +use eZ\Publish\Core\REST\Common\Message; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Server\Exceptions; +use eZ\Publish\Core\REST\Server\Controller as RestController; + +use eZ\Publish\API\Repository\UserService; +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\RoleService; +use eZ\Publish\API\Repository\LocationService; +use eZ\Publish\API\Repository\SectionService; +use eZ\Publish\API\Repository\Repository; + +use eZ\Publish\API\Repository\Values\User\UserRoleAssignment; +use eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment; + +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\API\Repository\Exceptions\InvalidArgumentException; + +use eZ\Publish\Core\REST\Common\Exceptions\InvalidArgumentException AS RestInvalidArgumentException; +use eZ\Publish\Core\REST\Server\Exceptions\ForbiddenException; + +/** + * User controller + */ +class User extends RestController +{ + /** + * User service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * Role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + /** + * Repository + * + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * Construct controller + * + * @param \eZ\Publish\API\Repository\UserService $userService + * @param \eZ\Publish\API\Repository\RoleService $roleService + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\LocationService $locationService + * @param \eZ\Publish\API\Repository\SectionService $sectionService + * @param \eZ\Publish\API\Repository\Repository $repository + */ + public function __construct( + UserService $userService, + RoleService $roleService, + ContentService $contentService, + LocationService $locationService, + SectionService $sectionService, + Repository $repository ) + { + $this->userService = $userService; + $this->roleService = $roleService; + $this->contentService = $contentService; + $this->locationService = $locationService; + $this->sectionService = $sectionService; + $this->repository = $repository; + } + + /** + * Redirects to the root user group + * + * @return \eZ\Publish\Core\REST\Server\Values\PermanentRedirect + */ + public function loadRootUserGroup() + { + //@todo Replace hardcoded value with one loaded from settings + return new Values\PermanentRedirect( + $this->urlHandler->generate( 'group', array( 'group' => '/1/5' ) ) + ); + } + + /** + * Loads a user group for the given path + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserGroup + */ + public function loadUserGroup() + { + $urlValues = $this->urlHandler->parse( 'group', $this->request->path ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + return new Values\RestUserGroup( + $userGroup, + $userGroup->getVersionInfo()->getContentInfo(), + $userGroupLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ); + } + + /** + * Loads a user for the given ID + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUser + */ + public function loadUser() + { + $urlValues = $this->urlHandler->parse( 'user', $this->request->path ); + + $user = $this->userService->loadUser( + $urlValues['user'] + ); + + $userContentInfo = $user->getVersionInfo()->getContentInfo(); + $userMainLocation = $this->locationService->loadLocation( $userContentInfo->mainLocationId ); + + return new Values\RestUser( + $user, + $userContentInfo, + $userMainLocation, + $this->contentService->loadRelations( $user->getVersionInfo() ) + ); + } + + /** + * Create a new user group under the given parent + * To create a top level group use /user/groups/subgroups + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedUserGroup + */ + public function createUserGroup() + { + try + { + $urlValues = $this->urlHandler->parse( 'groupSubgroups', $this->request->path ); + $userGroupPath = $urlValues['group']; + } + catch ( RestInvalidArgumentException $e ) + { + try + { + $this->urlHandler->parse( 'rootUserGroupSubGroups', $this->request->path ); + //@todo Load from settings instead of using hardcoded value + $userGroupPath = '/1/5'; + } + catch ( RestInvalidArgumentException $e ) + { + throw new Exceptions\BadRequestException( 'Unrecognized user group resource' ); + } + } + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $userGroupPath ) + ); + + $createdUserGroup = $this->userService->createUserGroup( + $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ), + $this->userService->loadUserGroup( + $userGroupLocation->contentId + ) + ); + + $createdContentInfo = $createdUserGroup->getVersionInfo()->getContentInfo(); + $createdLocation = $this->locationService->loadLocation( $createdContentInfo->mainLocationId ); + return new Values\CreatedUserGroup( + array( + 'userGroup' => new Values\RestUserGroup( + $createdUserGroup, + $createdContentInfo, + $createdLocation, + $this->contentService->loadRelations( $createdUserGroup->getVersionInfo() ) + ) + ) + ); + } + + /** + * Create a new user group in the given group + * + * @return \eZ\Publish\Core\REST\Server\Values\CreatedUser + */ + public function createUser() + { + $urlValues = $this->urlHandler->parse( 'groupUsers', $this->request->path ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + $userGroup = $this->userService->loadUserGroup( $userGroupLocation->contentId ); + + $userCreateStruct = $this->inputDispatcher->parse( + new Message( + array( 'Content-Type' => $this->request->contentType ), + $this->request->body + ) + ); + + try + { + $createdUser = $this->userService->createUser( $userCreateStruct, array( $userGroup ) ); + } + catch ( InvalidArgumentException $e ) + { + throw new ForbiddenException( $e->getMessage() ); + } + + $createdContentInfo = $createdUser->getVersionInfo()->getContentInfo(); + $createdLocation = $this->locationService->loadLocation( $createdContentInfo->mainLocationId ); + return new Values\CreatedUser( + array( + 'user' => new Values\RestUser( + $createdUser, + $createdContentInfo, + $createdLocation, + $this->contentService->loadRelations( $createdUser->getVersionInfo() ) + ) + ) + ); + } + + /** + * Updates a user group + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserGroup + */ + public function updateUserGroup() + { + $urlValues = $this->urlHandler->parse( 'group', $this->request->path ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + $updateStruct = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + // @todo Needs refactoring! Temporary solution so parser has access to URL + 'Url' => $this->request->path + ), + $this->request->body + ) + ); + + if ( $updateStruct->sectionId !== null ) + { + $section = $this->sectionService->loadSection( $updateStruct->sectionId ); + $this->sectionService->assignSection( + $userGroup->getVersionInfo()->getContentInfo(), + $section + ); + } + + $updatedGroup = $this->userService->updateUserGroup( $userGroup, $updateStruct->userGroupUpdateStruct ); + + return new Values\RestUserGroup( + $updatedGroup, + $updatedGroup->getVersionInfo()->getContentInfo(), + $userGroupLocation, + $this->contentService->loadRelations( $updatedGroup->getVersionInfo() ) + ); + } + + /** + * Updates a user + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUser + */ + public function updateUser() + { + $urlValues = $this->urlHandler->parse( 'user', $this->request->path ); + + $user = $this->userService->loadUser( $urlValues['user'] ); + + $updateStruct = $this->inputDispatcher->parse( + new Message( + array( + 'Content-Type' => $this->request->contentType, + // @todo Needs refactoring! Temporary solution so parser has access to URL + 'Url' => $this->request->path + ), + $this->request->body + ) + ); + + if ( $updateStruct->sectionId !== null ) + { + $section = $this->sectionService->loadSection( $updateStruct->sectionId ); + $this->sectionService->assignSection( + $user->getVersionInfo()->getContentInfo(), + $section + ); + } + + $updatedUser = $this->userService->updateUser( $user, $updateStruct->userUpdateStruct ); + $updatedContentInfo = $updatedUser->getVersionInfo()->getContentInfo(); + $mainLocation = $this->locationService->loadLocation( $updatedContentInfo->mainLocationId ); + + return new Values\RestUser( + $updatedUser, + $updatedContentInfo, + $mainLocation, + $this->contentService->loadRelations( $updatedUser->getVersionInfo() ) + ); + } + + /** + * Given user group is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteUserGroup() + { + $urlValues = $this->urlHandler->parse( 'group', $this->request->path ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + // Load one user to see if user group is empty or not + $users = $this->userService->loadUsersOfUserGroup( $userGroup, 0, 1 ); + if ( !empty( $users ) ) + { + throw new Exceptions\ForbiddenException( "Non-empty user groups cannot be deleted" ); + } + + $this->userService->deleteUserGroup( $userGroup ); + + return new Values\NoContent(); + } + + /** + * Given user is deleted + * + * @return \eZ\Publish\Core\REST\Server\Values\NoContent + */ + public function deleteUser() + { + $urlValues = $this->urlHandler->parse( 'user', $this->request->path ); + + $user = $this->userService->loadUser( + $urlValues['user'] + ); + + if ( $user->id == $this->repository->getCurrentUser()->id ) + { + throw new Exceptions\ForbiddenException( "Currently authenticated user cannot be deleted" ); + } + + $this->userService->deleteUser( $user ); + + return new Values\NoContent(); + } + + /** + * Loads users + * + * @return \eZ\Publish\Core\REST\Server\Values\UserList|\eZ\Publish\Core\REST\Server\Values\UserRefList + */ + public function loadUsers() + { + $restUsers = array(); + if ( isset( $this->request->variables['roleId'] ) ) + { + $restUsers = $this->loadUsersAssignedToRole(); + } + else if ( isset( $this->request->variables['remoteId'] ) ) + { + $restUsers = array( + $this->loadUserByRemoteId() + ); + } + + if ( $this->getMediaType( $this->request ) === 'application/vnd.ez.api.userlist' ) + { + return new Values\UserList( $restUsers, $this->request->path ); + } + + return new Values\UserRefList( $restUsers, $this->request->path ); + } + + /** + * Loads a user by its remote ID + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUser + */ + public function loadUserByRemoteId() + { + $contentInfo = $this->contentService->loadContentInfoByRemoteId( $this->request->variables['remoteId'] ); + $user = $this->userService->loadUser( $contentInfo->id ); + $userLocation = $this->locationService->loadLocation( $contentInfo->mainLocationId ); + + return new Values\RestUser( + $user, + $contentInfo, + $userLocation, + $this->contentService->loadRelations( $user->getVersionInfo() ) + ); + } + + /** + * Loads a list of users assigned to role + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUser[] + */ + public function loadUsersAssignedToRole() + { + $roleValues = $this->urlHandler->parse( 'role', $this->request->variables['roleId'] ); + + $role = $this->roleService->loadRole( $roleValues['role'] ); + $roleAssignments = $this->roleService->getRoleAssignments( $role ); + + $restUsers = array(); + + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment instanceof UserRoleAssignment ) + { + $user = $roleAssignment->getUser(); + $userContentInfo = $user->getVersionInfo()->getContentInfo(); + $userLocation = $this->locationService->loadLocation( $userContentInfo->mainLocationId ); + + $restUsers[] = new Values\RestUser( + $user, + $userContentInfo, + $userLocation, + $this->contentService->loadRelations( $user->getVersionInfo() ) + ); + } + } + + return $restUsers; + } + + /** + * Loads user groups + * + * @return \eZ\Publish\Core\REST\Server\Values\UserGroupList|\eZ\Publish\Core\REST\Server\Values\UserGroupRefList + */ + public function loadUserGroups() + { + $restUserGroups = array(); + if ( isset( $this->request->variables['id'] ) ) + { + $userGroup = $this->userService->loadUserGroup( $this->request->variables['id'] ); + $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); + $userGroupMainLocation = $this->locationService->loadLocation( $userGroupContentInfo->mainLocationId ); + + $restUserGroups = array( + new Values\RestUserGroup( + $userGroup, + $userGroupContentInfo, + $userGroupMainLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ) + ); + } + else if ( isset( $this->request->variables['roleId'] ) ) + { + $restUserGroups = $this->loadUserGroupsAssignedToRole(); + } + else if ( isset( $this->request->variables['remoteId'] ) ) + { + $restUserGroups = array( + $this->loadUserGroupByRemoteId() + ); + } + + if ( $this->getMediaType( $this->request ) === 'application/vnd.ez.api.usergrouplist' ) + { + return new Values\UserGroupList( $restUserGroups, $this->request->path ); + } + + return new Values\UserGroupRefList( $restUserGroups, $this->request->path ); + } + + /** + * Loads a user group by its remote ID + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserGroup + */ + public function loadUserGroupByRemoteId() + { + $contentInfo = $this->contentService->loadContentInfoByRemoteId( $this->request->variables['remoteId'] ); + $userGroup = $this->userService->loadUserGroup( $contentInfo->id ); + $userGroupLocation = $this->locationService->loadLocation( $contentInfo->mainLocationId ); + + return new Values\RestUserGroup( + $userGroup, + $contentInfo, + $userGroupLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ); + } + + /** + * Loads a list of user groups assigned to role + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserGroup[] + */ + public function loadUserGroupsAssignedToRole() + { + $roleValues = $this->urlHandler->parse( 'role', $this->request->variables['roleId'] ); + + $role = $this->roleService->loadRole( $roleValues['role'] ); + $roleAssignments = $this->roleService->getRoleAssignments( $role ); + + $restUserGroups = array(); + + foreach ( $roleAssignments as $roleAssignment ) + { + if ( $roleAssignment instanceof UserGroupRoleAssignment ) + { + $userGroup = $roleAssignment->getUserGroup(); + $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); + $userGroupLocation = $this->locationService->loadLocation( $userGroupContentInfo->mainLocationId ); + + $restUserGroups[] = new Values\RestUserGroup( + $userGroup, + $userGroupContentInfo, + $userGroupLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ); + } + } + + return $restUserGroups; + } + + /** + * Loads drafts assigned to user + * + * @return \eZ\Publish\Core\REST\Server\Values\VersionList + */ + public function loadUserDrafts() + { + $urlValues = $this->urlHandler->parse( 'userDrafts', $this->request->path ); + + $contentDrafts = $this->contentService->loadContentDrafts( + $this->userService->loadUser( $urlValues['user'] ) + ); + + return new Values\VersionList( $contentDrafts, $this->request->path ); + } + + /** + * Moves the user group to another parent + * + * @return \eZ\Publish\Core\REST\Server\Values\ResourceCreated + */ + public function moveUserGroup() + { + $urlValues = $this->urlHandler->parse( 'group', $this->request->path ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + $destinationParts = $this->urlHandler->parse( 'group', $this->request->destination ); + + try + { + $destinationGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $destinationParts['group'] ) + ); + } + catch ( NotFoundException $e ) + { + throw new Exceptions\ForbiddenException( $e->getMessage() ); + } + + try + { + $destinationGroup = $this->userService->loadUserGroup( $destinationGroupLocation->contentId ); + } + catch ( NotFoundException $e ) + { + throw new Exceptions\ForbiddenException( $e->getMessage() ); + } + + $this->userService->moveUserGroup( $userGroup, $destinationGroup ); + + return new Values\ResourceCreated( + $this->urlHandler->generate( + 'group', + array( + 'group' => $destinationGroupLocation->pathString . $userGroupLocation->id + ) + ) + ); + } + + /** + * Returns a list of the sub groups + * + * @return \eZ\Publish\Core\REST\Server\Values\UserGroupList|\eZ\Publish\Core\REST\Server\Values\UserGroupRefList + */ + public function loadSubUserGroups() + { + $urlValues = $this->urlHandler->parse( 'groupSubgroups', $this->request->path ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + $subGroups = $this->userService->loadSubUserGroups( $userGroup ); + + $restUserGroups = array(); + foreach ( $subGroups as $subGroup ) + { + $subGroupContentInfo = $subGroup->getVersionInfo()->getContentInfo(); + $subGroupLocation = $this->locationService->loadLocation( $subGroupContentInfo->mainLocationId ); + $restUserGroups[] = new Values\RestUserGroup( + $subGroup, + $subGroupContentInfo, + $subGroupLocation, + $this->contentService->loadRelations( $subGroup->getVersionInfo() ) + ); + } + + if ( $this->getMediaType( $this->request ) === 'application/vnd.ez.api.usergrouplist' ) + { + return new Values\UserGroupList( $restUserGroups, $this->request->path ); + } + + return new Values\UserGroupRefList( $restUserGroups, $this->request->path ); + } + + /** + * Returns a list of user groups the user belongs to. + * The returned list includes the resources for unassigning + * a user group if the user is in multiple groups. + * + * @return \eZ\Publish\Core\REST\Server\Values\UserGroupRefList + */ + public function loadUserGroupsOfUser() + { + $urlValues = $this->urlHandler->parse( 'userGroups', $this->request->path ); + + $user = $this->userService->loadUser( $urlValues['user'] ); + $userGroups = $this->userService->loadUserGroupsOfUser( $user ); + + $restUserGroups = array(); + foreach ( $userGroups as $userGroup ) + { + $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); + $userGroupLocation = $this->locationService->loadLocation( $userGroupContentInfo->mainLocationId ); + $restUserGroups[] = new Values\RestUserGroup( + $userGroup, + $userGroupContentInfo, + $userGroupLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ); + } + + return new Values\UserGroupRefList( $restUserGroups, $this->request->path, $urlValues['user'] ); + } + + /** + * Loads the users of the group with the given path + * + * @return \eZ\Publish\Core\REST\Server\Values\UserList|\eZ\Publish\Core\REST\Server\Values\UserRefList + */ + public function loadUsersFromGroup() + { + $questionMark = strpos( $this->request->path, '?' ); + $requestPath = $questionMark !== false ? substr( $this->request->path, 0, $questionMark ) : $this->request->path; + + $urlValues = $this->urlHandler->parse( 'groupUsers', $requestPath ); + + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $urlValues['group'] ) + ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + $offset = isset( $this->request->variables['offset'] ) ? (int)$this->request->variables['offset'] : 0; + $limit = isset( $this->request->variables['limit'] ) ? (int)$this->request->variables['limit'] : -1; + + $users = $this->userService->loadUsersOfUserGroup( + $userGroup, + $offset >= 0 ? $offset : 0, + $limit >= 0 ? $limit : -1 + ); + + $restUsers = array(); + foreach ( $users as $user ) + { + $userContentInfo = $user->getVersionInfo()->getContentInfo(); + $userLocation = $this->locationService->loadLocation( $userContentInfo->mainLocationId ); + $restUsers[] = new Values\RestUser( + $user, + $userContentInfo, + $userLocation, + $this->contentService->loadRelations( $user->getVersionInfo() ) + ); + } + + if ( $this->getMediaType( $this->request ) === 'application/vnd.ez.api.userlist' ) + { + return new Values\UserList( $restUsers, $this->request->path ); + } + + return new Values\UserRefList( $restUsers, $this->request->path ); + } + + /** + * Unassigns the user from a user group + * + * @return \eZ\Publish\Core\REST\Server\Values\UserGroupRefList + */ + public function unassignUserFromUserGroup() + { + $urlValues = $this->urlHandler->parse( 'userGroup', $this->request->path ); + + $user = $this->userService->loadUser( $urlValues['user'] ); + $userGroupLocation = $this->locationService->loadLocation( trim( $urlValues['group'], '/' ) ); + + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + + try + { + $this->userService->unAssignUserFromUserGroup( $user, $userGroup ); + } + catch ( InvalidArgumentException $e ) + { + // User is not in the group + throw new Exceptions\ForbiddenException( $e->getMessage() ); + } + + $userGroups = $this->userService->loadUserGroupsOfUser( $user ); + $restUserGroups = array(); + foreach ( $userGroups as $userGroup ) + { + $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); + $userGroupLocation = $this->locationService->loadLocation( $userGroupContentInfo->mainLocationId ); + $restUserGroups[] = new Values\RestUserGroup( + $userGroup, + $userGroupContentInfo, + $userGroupLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ); + } + + return new Values\UserGroupRefList( + $restUserGroups, + $this->urlHandler->generate( 'userGroups', array( 'user' => $urlValues['user'] ) ), + $urlValues['user'] + ); + } + + /** + * Assigns the user to a user group + * + * @return \eZ\Publish\Core\REST\Server\Values\UserGroupRefList + */ + public function assignUserToUserGroup() + { + $urlValues = $this->urlHandler->parse( 'userGroupAssign', $this->request->path ); + + $user = $this->userService->loadUser( $urlValues['user'] ); + + try + { + $userGroupLocation = $this->locationService->loadLocation( + $this->extractLocationIdFromPath( $this->request->variables['group'] ) + ); + } + catch ( NotFoundException $e ) + { + throw new Exceptions\ForbiddenException( $e->getMessage() ); + } + + try + { + $userGroup = $this->userService->loadUserGroup( + $userGroupLocation->contentId + ); + } + catch ( NotFoundException $e ) + { + throw new Exceptions\ForbiddenException( $e->getMessage() ); + } + + try + { + $this->userService->assignUserToUserGroup( $user, $userGroup ); + } + catch ( InvalidArgumentException $e ) + { + throw new Exceptions\ForbiddenException( $e->getMessage() ); + } + + $userGroups = $this->userService->loadUserGroupsOfUser( $user ); + $restUserGroups = array(); + foreach ( $userGroups as $userGroup ) + { + $userGroupContentInfo = $userGroup->getVersionInfo()->getContentInfo(); + $userGroupLocation = $this->locationService->loadLocation( $userGroupContentInfo->mainLocationId ); + $restUserGroups[] = new Values\RestUserGroup( + $userGroup, + $userGroupContentInfo, + $userGroupLocation, + $this->contentService->loadRelations( $userGroup->getVersionInfo() ) + ); + } + + return new Values\UserGroupRefList( + $restUserGroups, + $this->urlHandler->generate( 'userGroups', array( 'user' => $urlValues['user'] ) ), + $urlValues['user'] + ); + } + + /** + * Extracts and returns an item id from a path, e.g. /1/2/58 => 58 + * + * @param string $path + * + * @return mixed + */ + private function extractLocationIdFromPath( $path ) + { + $pathParts = explode( '/', $path ); + return array_pop( $pathParts ); + } + + /** + * Extracts the requested media type from $request + * + * @return string + */ + protected function getMediaType() + { + foreach ( $this->request->mimetype as $mimeType ) + { + if ( preg_match( '(^([a-z0-9-/.]+)\+.*$)', $mimeType['value'], $matches ) ) + { + return $matches[1]; + } + } + return 'unknown/unknown'; + } +} diff --git a/eZ/Publish/Core/REST/Server/Exceptions/AuthenticationFailedException.php b/eZ/Publish/Core/REST/Server/Exceptions/AuthenticationFailedException.php new file mode 100644 index 0000000..ed55636 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Exceptions/AuthenticationFailedException.php @@ -0,0 +1,18 @@ +<?php +/** + * File containing the AuthenticationFailedException tests + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Exceptions; + +/** + * Exception thrown if authentication credentials were provided by the + * authentication failed. + */ +class AuthenticationFailedException extends \InvalidArgumentException +{ +} diff --git a/eZ/Publish/Core/REST/Server/Exceptions/BadRequestException.php b/eZ/Publish/Core/REST/Server/Exceptions/BadRequestException.php new file mode 100644 index 0000000..a0d326f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Exceptions/BadRequestException.php @@ -0,0 +1,17 @@ +<?php +/** + * File containing the BadRequestException tests + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Exceptions; + +/** + * Exception thrown if the request is not formatted correctly + */ +class BadRequestException extends \InvalidArgumentException +{ +} diff --git a/eZ/Publish/Core/REST/Server/Exceptions/ForbiddenException.php b/eZ/Publish/Core/REST/Server/Exceptions/ForbiddenException.php new file mode 100644 index 0000000..b4ac83b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Exceptions/ForbiddenException.php @@ -0,0 +1,17 @@ +<?php +/** + * File containing the ForbiddenException tests + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Exceptions; + +/** + * Exception thrown if the request is forbidden + */ +class ForbiddenException extends \InvalidArgumentException +{ +} diff --git a/eZ/Publish/Core/REST/Server/FieldTypeProcessor/BinaryInputProcessor.php b/eZ/Publish/Core/REST/Server/FieldTypeProcessor/BinaryInputProcessor.php new file mode 100644 index 0000000..43dc20a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/FieldTypeProcessor/BinaryInputProcessor.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing the BinaryInputProcessor class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\FieldTypeProcessor; + +use eZ\Publish\Core\REST\Common\FieldTypeProcessor; + +abstract class BinaryInputProcessor implements FieldTypeProcessor +{ + /** + * @var string + */ + protected $temporaryDirectory; + + /** + * @param string $temporaryDirectory + */ + public function __construct( $temporaryDirectory ) + { + $this->temporaryDirectory = $temporaryDirectory; + } + + /** + * Processes uploaded binary file data in $incomingValueHash + * + * This method checks the 'data' key in $incomingValueHash, which must + * contain base64 encoded binary data to be stored as a binary file. It + * stores the decoded data in a temporary file in {@link + * $temporaryDirectory} and sets the 'path' key in the returned hash + * accordingly. + * + * @param array $incomingValueHash + * + * @return array + */ + public function preProcessHash( $incomingValueHash ) + { + if ( isset( $incomingValueHash['data'] ) ) + { + $tempFile = tempnam( $this->temporaryDirectory, 'eZ_REST_BinaryFile' ); + + file_put_contents( + $tempFile, + $binaryContent = base64_decode( $incomingValueHash['data'] ) + ); + + unset( $incomingValueHash['data'] ); + $incomingValueHash['path'] = $tempFile; + } + + return $incomingValueHash; + } +} diff --git a/eZ/Publish/Core/REST/Server/FieldTypeProcessor/BinaryProcessor.php b/eZ/Publish/Core/REST/Server/FieldTypeProcessor/BinaryProcessor.php new file mode 100644 index 0000000..b34c2a6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/FieldTypeProcessor/BinaryProcessor.php @@ -0,0 +1,81 @@ +<?php +/** + * File containing the ImageProcessor class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\FieldTypeProcessor; + +class BinaryProcessor extends BinaryInputProcessor +{ + /** + * Template for binary URLs + * + * The template may contain a "{path}" variable, which is replaced by the + * MD5 file name part of the binary path. + * + * @var string + */ + protected $urlTemplate; + + /** + * @param string $temporaryDirectory + * @param string $urlTemplate + */ + public function __construct( $temporaryDirectory, $urlTemplate ) + { + parent::__construct( $temporaryDirectory ); + $this->urlTemplate = $urlTemplate; + } + + /** + * Perform manipulations on an a generated $outgoingValueHash + * + * This method is called by the REST server to allow a field type to post + * process the given $outgoingValueHash, which was previously generated + * using {@link eZ\Publish\SPI\FieldType\FieldType::toHash()}, before it is + * sent to the client. The return value of this method replaces + * $outgoingValueHash and must obey to the same rules as the original + * $outgoingValueHash. + * + * @param mixed $outgoingValueHash + * + * @return mixed Post processed hash + */ + public function postProcessHash( $outgoingValueHash ) + { + if ( !is_array( $outgoingValueHash ) ) + { + return $outgoingValueHash; + } + + $outgoingValueHash['url'] = $this->generateUrl( + $outgoingValueHash['path'] + ); + return $outgoingValueHash; + } + + /** + * Generates a URL for $path + * + * @param string $path + * + * @return string + */ + protected function generateUrl( $path ) + { + if ( preg_match( '((?:^|/)([0-9a-f]+)(?:\.[a-z0-9]+)?)', $path, $matches ) ) + { + $path = $matches[1]; + } + + return str_replace( + '{path}', + $path, + $this->urlTemplate + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/FieldTypeProcessor/ImageProcessor.php b/eZ/Publish/Core/REST/Server/FieldTypeProcessor/ImageProcessor.php new file mode 100644 index 0000000..88abde2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/FieldTypeProcessor/ImageProcessor.php @@ -0,0 +1,117 @@ +<?php +/** + * File containing the ImageProcessor class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\FieldTypeProcessor; + +class ImageProcessor extends BinaryInputProcessor +{ + /** + * Template for image URLs + * + * @var string + */ + protected $urlTemplate; + + /** + * Array of variant names and content types + * + * <code> + * array( + * 'small' => 'image/jpeg', + * 'thumbnail' => 'image/png', + * ) + * </code> + * + * @var string[][] + */ + protected $variants; + + /** + * @param string $temporaryDirectory + * @param string $urlTemplate + * @param array $variants + */ + public function __construct( $temporaryDirectory, $urlTemplate, array $variants ) + { + parent::__construct( $temporaryDirectory ); + $this->urlTemplate = $urlTemplate; + $this->variants = $variants; + } + + /** + * Perform manipulations on an a generated $outgoingValueHash + * + * This method is called by the REST server to allow a field type to post + * process the given $outgoingValueHash, which was previously generated + * using {@link eZ\Publish\SPI\FieldType\FieldType::toHash()}, before it is + * sent to the client. The return value of this method replaces + * $outgoingValueHash and must obey to the same rules as the original + * $outgoingValueHash. + * + * @param mixed $outgoingValueHash + * + * @return mixed Post processed hash + */ + public function postProcessHash( $outgoingValueHash ) + { + if ( !is_array( $outgoingValueHash ) ) + { + return $outgoingValueHash; + } + + $outgoingValueHash['variants'] = array(); + foreach ( $this->variants as $variant => $mimeType ) + { + $outgoingValueHash['variants'][] = array( + 'variant' => $variant, + 'contentType' => $mimeType, + 'url' => $this->generateUrl( + $outgoingValueHash['path'], + $variant + ), + ); + } + return $outgoingValueHash; + } + + /** + * Generates a URL for $path in $variant + * + * @param string $path + * @param string $variant + * + * @return string + */ + protected function generateUrl( $path, $variant ) + { + $fieldId = ''; + $versionNo = ''; + + // 223-1-eng-US/Cool-File.jpg + if ( preg_match( '((?<id>[0-9]+)-(?<version>[0-9]+)-[^/]+/[^/]+$)', $path, $matches ) ) + { + $fieldId = $matches['id']; + $versionNo = $matches['version']; + } + + return str_replace( + array( + '{variant}', + '{fieldId}', + '{versionNo}', + ), + array( + $variant, + $fieldId, + $versionNo + ), + $this->urlTemplate + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Base.php b/eZ/Publish/Core/REST/Server/Input/Parser/Base.php new file mode 100644 index 0000000..b1cb103 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Base.php @@ -0,0 +1,33 @@ +<?php +/** + * File containing the Base parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\Parser; +use eZ\Publish\Core\REST\Common\UrlHandler; + +abstract class Base extends Parser +{ + /** + * URL handler + * + * @var \eZ\Publish\Core\REST\Common\UrlHandler + */ + protected $urlHandler; + + /** + * Creates a new parser. + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( UrlHandler $urlHandler ) + { + $this->urlHandler = $urlHandler; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ContentCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ContentCreate.php new file mode 100644 index 0000000..05cb3d1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ContentCreate.php @@ -0,0 +1,201 @@ +<?php +/** + * File containing the ContentCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\Core\REST\Server\Values\RestContentCreateStruct; +use DateTime; + +/** + * Parser for ContentCreate + */ +class ContentCreate extends Base +{ + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * FieldType parser + * + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * LocationCreate parser + * + * @var \eZ\Publish\Core\REST\Server\Input\Parser\LocationCreate + */ + protected $locationCreateParser; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + * @param \eZ\Publish\Core\REST\Server\Input\Parser\LocationCreate $locationCreateParser + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, + ContentService $contentService, + ContentTypeService $contentTypeService, + FieldTypeParser $fieldTypeParser, + LocationCreate $locationCreateParser, + ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->contentService = $contentService; + $this->contentTypeService = $contentTypeService; + $this->fieldTypeParser = $fieldTypeParser; + $this->locationCreateParser = $locationCreateParser; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Server\Values\RestContentCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'LocationCreate', $data ) || !is_array( $data['LocationCreate'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'LocationCreate' element for ContentCreate." ); + } + + $locationCreateStruct = $this->locationCreateParser->parse( $data['LocationCreate'], $parsingDispatcher ); + + if ( !array_key_exists( 'ContentType', $data ) || !is_array( $data['ContentType'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'ContentType' element for ContentCreate." ); + } + + if ( !array_key_exists( '_href', $data['ContentType'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for ContentType element in ContentCreate." ); + } + + if ( !array_key_exists( 'mainLanguageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'mainLanguageCode' element for ContentCreate." ); + } + + $contentTypeValues = $this->urlHandler->parse( 'type', $data['ContentType']['_href'] ); + $contentType = $this->contentTypeService->loadContentType( + $contentTypeValues['type'] + ); + + $contentCreateStruct = $this->contentService->newContentCreateStruct( $contentType, $data['mainLanguageCode'] ); + + if ( array_key_exists( 'Section', $data ) && is_array( $data['Section'] ) ) + { + if ( !array_key_exists( '_href', $data['Section'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for Section element in ContentCreate." ); + } + + $sectionValues = $this->urlHandler->parse( 'section', $data['Section']['_href'] ); + $contentCreateStruct->sectionId = $sectionValues['section']; + } + + if ( array_key_exists( 'alwaysAvailable', $data ) ) + { + $contentCreateStruct->alwaysAvailable = $this->parserTools->parseBooleanValue( $data['alwaysAvailable'] ); + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $contentCreateStruct->remoteId = $data['remoteId']; + } + + if ( array_key_exists( 'modificationDate', $data ) ) + { + $contentCreateStruct->modificationDate = new DateTime( $data['modificationDate'] ); + } + + if ( array_key_exists( 'User', $data ) && is_array( $data['User'] ) ) + { + if ( !array_key_exists( '_href', $data['User'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for User element in ContentCreate." ); + } + + $userValues = $this->urlHandler->parse( 'user', $data['User']['_href'] ); + $contentCreateStruct->ownerId = $userValues['user']; + } + + if ( !array_key_exists( 'fields', $data ) || !is_array( $data['fields'] ) || !is_array( $data['fields']['field'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'fields' element for ContentCreate." ); + } + + foreach ( $data['fields']['field'] as $fieldData ) + { + if ( !array_key_exists( 'fieldDefinitionIdentifier', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldDefinitionIdentifier' element in field data for ContentCreate." ); + } + + $fieldDefinition = $contentType->getFieldDefinition( $fieldData['fieldDefinitionIdentifier'] ); + if ( !$fieldDefinition ) + { + throw new Exceptions\Parser( + "'{$fieldData['fieldDefinitionIdentifier']}' is invalid field definition identifier for '{$contentType->identifier}' content type in ContentCreate." + ); + } + + if ( !array_key_exists( 'fieldValue', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldValue' element for '{$fieldData['fieldDefinitionIdentifier']}' identifier in ContentCreate." ); + } + + $fieldValue = $this->fieldTypeParser->parseValue( $fieldDefinition->fieldTypeIdentifier, $fieldData['fieldValue'] ); + + $languageCode = null; + if ( array_key_exists( 'languageCode', $fieldData ) ) + { + $languageCode = $fieldData['languageCode']; + } + + $contentCreateStruct->setField( $fieldData['fieldDefinitionIdentifier'], $fieldValue, $languageCode ); + } + + return new RestContentCreateStruct( $contentCreateStruct, $locationCreateStruct ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ContentObjectStates.php b/eZ/Publish/Core/REST/Server/Input/Parser/ContentObjectStates.php new file mode 100644 index 0000000..49b5937 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ContentObjectStates.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the ContentObjectStates parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; + +use eZ\Publish\Core\REST\Common\Values\RestObjectState; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState; + +/** + * Parser for ContentObjectStates + */ +class ContentObjectStates extends Base +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Common\Values\RestObjectState[] + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + // @todo XSD says that no ObjectState elements is valid, + // but we should at least have one if setting new states to content? + if ( !array_key_exists( 'ObjectState', $data ) || !is_array( $data['ObjectState'] ) || empty( $data['ObjectState'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'ObjectState' elements for ContentObjectStates." ); + } + + $states = array(); + foreach ( $data['ObjectState'] as $rawStateData ) + { + if ( !array_key_exists( '_href', $rawStateData ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for ObjectState." ); + } + + $values = $this->urlHandler->parse( 'objectstate', $rawStateData['_href'] ); + + $states[] = new RestObjectState( + new ObjectState( + array( + 'id' => $values['objectstate'] + ) + ), + $values['objectstategroup'] + ); + } + + return $states; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeCreate.php new file mode 100644 index 0000000..0f3fa29 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeCreate.php @@ -0,0 +1,184 @@ +<?php +/** + * File containing the ContentTypeCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ContentTypeService; +use DateTime; + +/** + * Parser for ContentTypeCreate + */ +class ContentTypeCreate extends Base +{ + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * FieldDefinitionCreate parser + * + * @var \eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionCreate + */ + protected $fieldDefinitionCreateParser; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionCreate $fieldDefinitionCreateParser + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, + ContentTypeService $contentTypeService, + FieldDefinitionCreate $fieldDefinitionCreateParser, + ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->contentTypeService = $contentTypeService; + $this->fieldDefinitionCreateParser = $fieldDefinitionCreateParser; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + // @todo XSD says that minOccurs = 0 for identifier, but identifier is required + if ( !array_key_exists( 'identifier', $data ) ) + { + throw new Exceptions\Parser( "Missing 'identifier' element for ContentTypeCreate." ); + } + + $contentTypeCreateStruct = $this->contentTypeService->newContentTypeCreateStruct( $data['identifier'] ); + + if ( !array_key_exists( 'mainLanguageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'mainLanguageCode' element for ContentTypeCreate." ); + } + + $contentTypeCreateStruct->mainLanguageCode = $data['mainLanguageCode']; + + if ( array_key_exists( 'remoteId', $data ) ) + { + $contentTypeCreateStruct->remoteId = $data['remoteId']; + } + + if ( array_key_exists( 'urlAliasSchema', $data ) ) + { + $contentTypeCreateStruct->urlAliasSchema = $data['urlAliasSchema']; + } + + // @todo XSD says that nameSchema is mandatory, but it is not in create struct + if ( array_key_exists( 'nameSchema', $data ) ) + { + $contentTypeCreateStruct->nameSchema = $data['nameSchema']; + } + + // @todo XSD says that isContainer is mandatory, but it is not in create struct + if ( array_key_exists( 'isContainer', $data ) ) + { + $contentTypeCreateStruct->isContainer = $this->parserTools->parseBooleanValue( $data['isContainer'] ); + } + + // @todo XSD says that defaultSortField is mandatory, but it is not in create struct + if ( array_key_exists( 'defaultSortField', $data ) ) + { + $contentTypeCreateStruct->defaultSortField = $this->parserTools->parseDefaultSortField( $data['defaultSortField'] ); + } + + // @todo XSD says that defaultSortOrder is mandatory, but it is not in create struct + if ( array_key_exists( 'defaultSortOrder', $data ) ) + { + $contentTypeCreateStruct->defaultSortOrder = $this->parserTools->parseDefaultSortOrder( $data['defaultSortOrder'] ); + } + + // @todo XSD says that defaultAlwaysAvailable is mandatory, but it is not in create struct + if ( array_key_exists( 'defaultAlwaysAvailable', $data ) ) + { + $contentTypeCreateStruct->defaultAlwaysAvailable = $this->parserTools->parseBooleanValue( $data['defaultAlwaysAvailable'] ); + } + + // @todo XSD says that names is mandatory, but content type can be created without names + if ( array_key_exists( 'names', $data ) ) + { + if ( !is_array( $data['names'] ) || !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'names' element for ContentTypeCreate." ); + } + + $contentTypeCreateStruct->names = $this->parserTools->parseTranslatableList( $data['names'] ); + } + + // @todo XSD says that descriptions is mandatory, but content type can be created without descriptions + if ( array_key_exists( 'descriptions', $data ) ) + { + if ( !is_array( $data['descriptions'] ) || !array_key_exists( 'value', $data['descriptions'] ) || !is_array( $data['descriptions']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'descriptions' element for ContentTypeCreate." ); + } + + $contentTypeCreateStruct->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + // @todo 1: XSD says that modificationDate is mandatory, but it is not in create struct + // @todo 2: mismatch between XSD naming and create struct naming + if ( array_key_exists( 'modificationDate', $data ) ) + { + $contentTypeCreateStruct->creationDate = new DateTime( $data['modificationDate'] ); + } + + if ( array_key_exists( 'User', $data ) ) + { + if ( !array_key_exists( '_href', $data['User'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for User element in ContentTypeCreate." ); + } + + $userValues = $this->urlHandler->parse( 'user', $data['User']['_href'] ); + $contentTypeCreateStruct->creatorId = $userValues['user']; + } + + if ( !array_key_exists( 'FieldDefinitions', $data ) || !is_array( $data['FieldDefinitions'] ) || + !array_key_exists( 'FieldDefinition', $data['FieldDefinitions'] ) || !is_array( $data['FieldDefinitions']['FieldDefinition'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'FieldDefinitions' element for ContentTypeCreate." ); + } + + foreach ( $data['FieldDefinitions']['FieldDefinition'] as $fieldDefinitionData ) + { + $contentTypeCreateStruct->addFieldDefinition( + $this->fieldDefinitionCreateParser->parse( $fieldDefinitionData, $parsingDispatcher ) + ); + } + + return $contentTypeCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeGroupInput.php b/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeGroupInput.php new file mode 100644 index 0000000..1e0a2be --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeGroupInput.php @@ -0,0 +1,94 @@ +<?php +/** + * File containing the ContentTypeGroupInput parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ContentTypeService; +use DateTime; + +/** + * Parser for ContentTypeGroupInput + */ +class ContentTypeGroupInput extends Base +{ + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ContentTypeService $contentTypeService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->contentTypeService = $contentTypeService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + // Since ContentTypeGroupInput is used both for creating and updating ContentTypeGroup and identifier is not + // required when updating ContentTypeGroup, we need to rely on PAPI to throw the exception on missing + // identifier when creating a ContentTypeGroup + // @todo Bring in line with XSD which says that identifier is required always + + $contentTypeGroupIdentifier = null; + if ( array_key_exists( 'identifier', $data ) ) + { + $contentTypeGroupIdentifier = $data['identifier']; + } + + $contentTypeGroupCreateStruct = $this->contentTypeService->newContentTypeGroupCreateStruct( $contentTypeGroupIdentifier ); + + // @todo mismatch between modificationDate in XSD & creationDate in struct + if ( array_key_exists( 'modificationDate', $data ) ) + { + $contentTypeGroupCreateStruct->creationDate = new DateTime( $data['modificationDate'] ); + } + + // @todo mainLanguageCode, names, descriptions? + + if ( array_key_exists( 'User', $data ) && is_array( $data['User'] ) ) + { + if ( !array_key_exists( '_href', $data['User'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for User element in ContentTypeGroupInput." ); + } + + $userValues = $this->urlHandler->parse( 'user', $data['User']['_href'] ); + $contentTypeGroupCreateStruct->creatorId = $userValues['user']; + } + + return $contentTypeGroupCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeUpdate.php new file mode 100644 index 0000000..360454d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ContentTypeUpdate.php @@ -0,0 +1,147 @@ +<?php +/** + * File containing the ContentTypeUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ContentTypeService; +use DateTime; + +/** + * Parser for ContentTypeUpdate + */ +class ContentTypeUpdate extends Base +{ + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ContentTypeService $contentTypeService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->contentTypeService = $contentTypeService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contentTypeUpdateStruct = $this->contentTypeService->newContentTypeUpdateStruct(); + + if ( array_key_exists( 'identifier', $data ) ) + { + $contentTypeUpdateStruct->identifier = $data['identifier']; + } + + if ( array_key_exists( 'mainLanguageCode', $data ) ) + { + $contentTypeUpdateStruct->mainLanguageCode = $data['mainLanguageCode']; + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $contentTypeUpdateStruct->remoteId = $data['remoteId']; + } + + if ( array_key_exists( 'urlAliasSchema', $data ) ) + { + $contentTypeUpdateStruct->urlAliasSchema = $data['urlAliasSchema']; + } + + if ( array_key_exists( 'nameSchema', $data ) ) + { + $contentTypeUpdateStruct->nameSchema = $data['nameSchema']; + } + + if ( array_key_exists( 'isContainer', $data ) ) + { + $contentTypeUpdateStruct->isContainer = $this->parserTools->parseBooleanValue( $data['isContainer'] ); + } + + if ( array_key_exists( 'defaultSortField', $data ) ) + { + $contentTypeUpdateStruct->defaultSortField = $this->parserTools->parseDefaultSortField( $data['defaultSortField'] ); + } + + if ( array_key_exists( 'defaultSortOrder', $data ) ) + { + $contentTypeUpdateStruct->defaultSortOrder = $this->parserTools->parseDefaultSortOrder( $data['defaultSortOrder'] ); + } + + if ( array_key_exists( 'defaultAlwaysAvailable', $data ) ) + { + $contentTypeUpdateStruct->defaultAlwaysAvailable = $this->parserTools->parseBooleanValue( $data['defaultAlwaysAvailable'] ); + } + + if ( array_key_exists( 'names', $data ) ) + { + if ( !is_array( $data['names'] ) || !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'names' element for ContentTypeUpdate." ); + } + + $contentTypeUpdateStruct->names = $this->parserTools->parseTranslatableList( $data['names'] ); + } + + if ( array_key_exists( 'descriptions', $data ) ) + { + if ( !is_array( $data['descriptions'] ) || !array_key_exists( 'value', $data['descriptions'] ) || !is_array( $data['descriptions']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'descriptions' element for ContentTypeUpdate." ); + } + + $contentTypeUpdateStruct->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + if ( array_key_exists( 'modificationDate', $data ) ) + { + $contentTypeUpdateStruct->modificationDate = new DateTime( $data['modificationDate'] ); + } + + if ( array_key_exists( 'User', $data ) ) + { + if ( !array_key_exists( '_href', $data['User'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for User element in ContentTypeUpdate." ); + } + + $userValues = $this->urlHandler->parse( 'user', $data['User']['_href'] ); + $contentTypeUpdateStruct->modifierId = $userValues['user']; + } + + return $contentTypeUpdateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ContentUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ContentUpdate.php new file mode 100644 index 0000000..52df85a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ContentUpdate.php @@ -0,0 +1,122 @@ +<?php +/** + * File containing the ContentUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct; +use DateTime; +use Exception; + +/** + * Parser for ContentUpdate + */ +class ContentUpdate extends Base +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser if $data is invalid + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $parsedData = array(); + + if ( array_key_exists( 'Section', $data ) && is_array( $data['Section'] ) && isset( $data['Section']['_href'] ) ) + { + try + { + $matches = $this->urlHandler->parse( 'section', $data['Section']['_href'] ); + } + catch ( Exceptions\InvalidArgumentException $e ) + { + throw new Exceptions\Parser( 'Invalid format for <Section> reference in <ContentUpdate>.' ); + } + $parsedData['sectionId'] = $matches['section']; + } + + if ( array_key_exists( 'Owner', $data ) && is_array( $data['Owner'] ) && isset( $data['Owner']['_href'] ) ) + { + if ( !preg_match( '(/user/users/(?P<value>[^/]+)$)', $data['Owner']['_href'], $matches ) ) + { + throw new Exceptions\Parser( 'Invalid format for <Owner> reference in <ContentUpdate>.' ); + } + $parsedData['ownerId'] = $matches['value']; + } + + if ( array_key_exists( 'mainLanguageCode', $data ) ) + { + $parsedData['mainLanguageCode'] = $data['mainLanguageCode']; + } + + if ( array_key_exists( 'MainLocation', $data ) ) + { + if ( !preg_match( '(/content/locations(?P<value>/[0-9/]+)$)', $data['MainLocation']['_href'], $matches ) ) + { + throw new Exceptions\Parser( 'Invalid format for <MainLocation> reference in <ContentUpdate>.' ); + } + $parsedData['mainLocationId'] = $matches['value']; + } + + if ( array_key_exists( 'alwaysAvailable', $data ) ) + { + if ( $data['alwaysAvailable'] === 'true' ) + { + $parsedData['alwaysAvailable'] = true; + } + else if ( $data['alwaysAvailable'] === 'false' ) + { + $parsedData['alwaysAvailable'] = false; + } + else + { + throw new Exceptions\Parser( 'Invalid format for <alwaysAvailable> in <ContentUpdate>.' ); + } + } + + // remoteId + if ( array_key_exists( 'remoteId', $data ) ) + { + $parsedData['remoteId'] = $data['remoteId']; + } + + // modificationDate + if ( array_key_exists( 'modificationDate', $data ) ) + { + try + { + $parsedData['modificationDate'] = new DateTime( $data['modificationDate'] ); + } + catch ( Exception $e ) + { + throw new Exceptions\Parser( 'Invalid format for <modificationDate> in <ContentUpdate>', 0, $e ); + } + } + + // publishDate + if ( array_key_exists( 'publishDate', $data ) ) + { + try + { + $parsedData['publishedDate'] = new DateTime( $data['publishDate'] ); + } + catch ( Exception $e ) + { + throw new Exceptions\Parser( 'Invalid format for <publishDate> in <ContentUpdate>', 0, $e ); + } + } + + return new RestContentMetadataUpdateStruct( $parsedData ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion.php new file mode 100644 index 0000000..175f382 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing the ContentIdCriterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion as APICriterion; + +/** + * Parser for ViewInput + */ +abstract class Criterion extends Base +{ + /** + * @var array + */ + protected static $criterionIdMap = array( + 'AND' => 'LogicalAnd', + 'OR' => 'LogicalOr', + 'NOT' => 'LogicalNot', + ); + + /** + * Dispatches parsing of a criterion name + data to its own parser + * @param string $criterionName + * @param mixed $criterionData + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion + */ + public function dispatchCriterion( $criterionName, $criterionData, ParsingDispatcher $parsingDispatcher ) + { + $mediaType = $this->getCriterionMediaType( $criterionName ); + try + { + return $parsingDispatcher->parse( array( $criterionName => $criterionData ), $mediaType ); + } + catch ( Exceptions\Parser $e ) + { + throw new Exceptions\Parser( "Invalid Criterion id <$criterionName> in <AND>", 0, $e ); + } + } + + protected function getCriterionMediaType( $criterionName ) + { + $criterionName = str_replace( 'Criterion', '', $criterionName ); + if ( isset( self::$criterionIdMap[$criterionName] ) ) + { + $criterionName = self::$criterionIdMap[$criterionName]; + } + return 'application/vnd.ez.api.internal.criterion.' . $criterionName; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentId.php new file mode 100644 index 0000000..f46f2e7 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentId.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the ContentIdCriterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentId as ContentIdCriterion; + +/** + * Parser for ViewInput + */ +class ContentId extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ContentIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ContentIdCriterion> format" ); + } + return new ContentIdCriterion( explode( ',', $data["ContentIdCriterion"] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentRemoteId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentRemoteId.php new file mode 100644 index 0000000..57f12d4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentRemoteId.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the RemoteId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\RemoteId as ContentRemoteIdCriterion; + +/** + * Parser for RemoteId Criterion + */ +class ContentRemoteId extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\RemoteId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ContentRemoteIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ContentRemoteIdCriterion> format" ); + } + return new ContentRemoteIdCriterion( explode( ',', $data["ContentRemoteIdCriterion"] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeGroupId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeGroupId.php new file mode 100644 index 0000000..ba9fd03 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeGroupId.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the ContentTypeGroupId parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeGroupId as ContentTypeGroupIdCriterion; + +/** + * Parser for ContentTypeGroupId Criterion + */ +class ContentTypeGroupId extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeGroupId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ContentTypeGroupIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ContentTypeGroupIdCriterion> format" ); + } + return new ContentTypeGroupIdCriterion( $data["ContentTypeGroupIdCriterion"] ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeId.php new file mode 100644 index 0000000..a2e4cf9 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeId.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the ContentTypeId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeId as ContentTypeIdCriterion; + +/** + * Parser for ViewInput + */ +class ContentTypeId extends Base +{ + public function __construct( UrlHandler $urlHandler ) + { + parent::__construct( $urlHandler ); + } + + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ContentTypeIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ContentTypeIdCriterion> format" ); + } + return new ContentTypeIdCriterion( $data["ContentTypeIdCriterion"] ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeIdentifier.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeIdentifier.php new file mode 100644 index 0000000..140e76e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ContentTypeIdentifier.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the ContentTypeIdentifier Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeId as ContentTypeIdCriterion; + +/** + * Parser for ViewInput + */ +class ContentTypeIdentifier extends Base +{ + /** + * Content type service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + public function __construct( UrlHandler $urlHandler, ContentTypeService $contentTypeService ) + { + $this->contentTypeService = $contentTypeService; + parent::__construct( $urlHandler ); + } + + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ContentTypeIdentifierCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ContentTypeIdCriterion> format" ); + } + $contentType = $this->contentTypeService->loadContentTypeByIdentifier( $data["ContentTypeIdentifierCriterion"] ); + return new ContentTypeIdCriterion( $contentType->id ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/DateMetadata.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/DateMetadata.php new file mode 100644 index 0000000..eefe470 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/DateMetadata.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the ViewInput Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\DateMetadata as DateMetadataCriterion; + +/** + * Parser for ViewInput Criterion + */ +class DateMetadata extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\DateMetadata + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Field.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Field.php new file mode 100644 index 0000000..b79e415 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Field.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the Field Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Field as FieldCriterion; + +/** + * Parser for Field Criterion + */ +class Field extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Field + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/FullText.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/FullText.php new file mode 100644 index 0000000..bac74b3 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/FullText.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the FullText Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\FullText as FullTextCriterion; + +/** + * Parser for FullText Criterion + */ +class FullText extends Base +{ + /** + * Parses input structure to a FullText criterion + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\FullText + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "FullTextCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <FullTextCriterion> format" ); + } + + return new FullTextCriterion( $data["FullTextCriterion"] ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LanguageCode.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LanguageCode.php new file mode 100644 index 0000000..d51c4ac --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LanguageCode.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the LanguageCode Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LanguageCode as LanguageCodeCriterion; + +/** + * Parser for LanguageCode Criterion + */ +class LanguageCode extends Base +{ + /** + * Parses input structure to a LanguageCode Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LanguageCode + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "LanguageCodeCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <LanguageCodeCriterion> format" ); + } + + return new LanguageCodeCriterion( explode( ',', $data['LanguageCodeCriterion'] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LocationId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LocationId.php new file mode 100644 index 0000000..57c7b63 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LocationId.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the LocationId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LocationId as LocationIdCriterion; + +/** + * Parser for LocationId Criterion + */ +class LocationId extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LocationId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "LocationIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <LocationIdCriterion> format" ); + } + + return new LocationIdCriterion( explode( ',', $data['LocationIdCriterion'] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LocationRemoteId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LocationRemoteId.php new file mode 100644 index 0000000..9b41380 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LocationRemoteId.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the LocationRemoteId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LocationRemoteId as LocationRemoteIdCriterion; + +/** + * Parser for LocationRemoteId Criterion + */ +class LocationRemoteId extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LocationRemoteId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "LocationRemoteIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <LocationRemoteIdCriterion> format" ); + } + + return new LocationRemoteIdCriterion( explode( ',', $data['LocationRemoteIdCriterion'] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalAnd.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalAnd.php new file mode 100644 index 0000000..4035d8e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalAnd.php @@ -0,0 +1,48 @@ +<?php +/** + * File containing the LogicalAnd Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Criterion as CriterionParser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalAnd as LogicalAndCriterion; + +/** + * Parser for LogicalAnd Criterion + */ +class LogicalAnd extends CriterionParser +{ + /** + * Parses input structure to a LogicalAnd Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalAnd + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "AND", $data ) && !is_array( $data['AND'] ) ) + { + throw new Exceptions\Parser( "Invalid <AND> format" ); + } + + $criteria = array(); + foreach ( $data["AND"] as $criterionName => $criterionData ) + { + $criteria[] = $this->dispatchCriterion( $criterionName, $criterionData, $parsingDispatcher ); + } + + return new LogicalAndCriterion( $criteria ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalNot.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalNot.php new file mode 100644 index 0000000..725f7aa --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalNot.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the LogicalNot Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Criterion as CriterionParser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalNot as LogicalNotCriterion; + +/** + * Parser for LogicalNot Criterion + */ +class LogicalNot extends CriterionParser +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalNot + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "NOT", $data ) && !is_array( $data["NOT"] ) ) + { + throw new Exceptions\Parser( "Invalid <NOT> format" ); + } + + if ( count( $data['NOT'] ) > 1 ) + { + throw new Exceptions\Parser( "NOT element can only contain one subitem" ); + } + list( $criterionName, $criterionData ) = each( $data['NOT'] ); + $criteria = $this->dispatchCriterion( $criterionName, $criterionData, $parsingDispatcher ); + + return new LogicalNotCriterion( $criteria ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalOperator.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalOperator.php new file mode 100644 index 0000000..6500960 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalOperator.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the LogicalOperator Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator as LogicalOperatorCriterion; + +/** + * Parser for LogicalOperator Criterion + */ +class LogicalOperator extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOperator + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalOr.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalOr.php new file mode 100644 index 0000000..37ec29c --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/LogicalOr.php @@ -0,0 +1,48 @@ +<?php +/** + * File containing the LogicalOr Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Criterion as CriterionParser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOr as LogicalOrCriterion; + +/** + * Parser for LogicalOr Criterion + */ +class LogicalOr extends CriterionParser +{ + /** + * Parses input structure to a LogicalAnd Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalOr + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "OR", $data ) && !is_array( $data["OR"] ) ) + { + throw new Exceptions\Parser( "Invalid <OR> format" ); + } + + $criteria = array(); + foreach ( $data["OR"] as $criterionName => $criterionData ) + { + $criteria[] = $this->dispatchCriterion( $criterionName, $criterionData, $parsingDispatcher ); + } + + return new LogicalOrCriterion( $criteria ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/MoreLikeThis.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/MoreLikeThis.php new file mode 100644 index 0000000..ec10c42 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/MoreLikeThis.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the MoreLikeThis Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\MoreLikeThis as MoreLikeThisCriterion; + +/** + * Parser for MoreLikeThis Criterion + */ +class MoreLikeThis extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\MoreLikeThis + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ObjectStateId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ObjectStateId.php new file mode 100644 index 0000000..eae4559 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ObjectStateId.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the ObjectStateId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ObjectStateId as ObjectStateIdCriterion; + +/** + * Parser for ObjectStateId Criterion + */ +class ObjectStateId extends Base +{ + /** + * Parses input structure to a ObjectStateId Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ObjectStateId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ObjectStateIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ObjectStateIdCriterion> format" ); + } + + return new ObjectStateIdCriterion( explode( ',', $data['ObjectStateIdCriterion'] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Operator.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Operator.php new file mode 100644 index 0000000..2db8061 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Operator.php @@ -0,0 +1,37 @@ +<?php +/** + * + * File containing the Operator Criterion parser class + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator as OperatorCriterion; + +/** + * Parser for Operator Criterion + */ +class Operator extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Operator + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ParentLocationId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ParentLocationId.php new file mode 100644 index 0000000..bbb98ee --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ParentLocationId.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the LocationId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ParentLocationId as ParentLocationIdCriterion; + +/** + * Parser for LocationId Criterion + */ +class ParentLocationId extends Base +{ + /** + * Parses input structure to a ParentLocationId Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ParentLocationId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ParentLocationIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ParentLocationIdCriterion> format" ); + } + + return new ParentLocationIdCriterion( explode( ',', $data['ParentLocationIdCriterion'] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ParentLocationRemoteId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ParentLocationRemoteId.php new file mode 100644 index 0000000..3e1ff02 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/ParentLocationRemoteId.php @@ -0,0 +1,62 @@ +<?php +/** + * File containing the ParentLocationRemoteId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\LocationService; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ParentLocationId as ParentLocationIdCriterion; + +/** + * Parser for ParentLocationId Criterion + */ +class ParentLocationRemoteId extends Base +{ + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + public function __construct( UrlHandler $urlHandler, LocationService $locationService ) + { + $this->locationService = $locationService; + parent::__construct( $urlHandler ); + } + + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\ParentLocationId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "ParentLocationRemoteIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <ParentLocationRemoteIdCriterion> format" ); + } + $contentIdArray = array(); + foreach ( explode( ',', $data['ParentLocationRemoteIdCriterion'] ) as $parentRemoteId ) + { + $location = $this->locationService->loadLocationByRemoteId( $parentRemoteId ); + $contentIdArray[] = $location->id; + } + + return new ParentLocationIdCriterion( $contentIdArray ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/SectionId.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/SectionId.php new file mode 100644 index 0000000..b1c19e3 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/SectionId.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the SectionId Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\SectionId as SectionIdCriterion; + +/** + * Parser for SectionId Criterion + */ +class SectionId extends Base +{ + /** + * Parses input structure to a SectionId Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\SectionId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "SectionIdCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <SectionIdCriterion> format" ); + } + return new SectionIdCriterion( $data["SectionIdCriterion"] ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/SectionIdentifier.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/SectionIdentifier.php new file mode 100644 index 0000000..878c56b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/SectionIdentifier.php @@ -0,0 +1,56 @@ +<?php +/** + * File containing the SectionIdentifier Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\SectionService; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\SectionId as SectionIdCriterion; + +/** + * Parser for SectionIdentifier Criterion + */ +class SectionIdentifier extends Base +{ + /** + * Section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + public function __construct( UrlHandler $urlHandler, SectionService $sectionService ) + { + $this->sectionService = $sectionService; + parent::__construct( $urlHandler ); + } + + /** + * Parses input structure to a SectionIdentifier Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\SectionId + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "SectionIdentifierCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <SectionIdentifierCriterion> format" ); + } + $section = $this->sectionService->loadSectionByIdentifier( $data["SectionIdentifierCriterion"] ); + return new SectionIdCriterion( $section->id ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Status.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Status.php new file mode 100644 index 0000000..02de42e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Status.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the Status Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Status as StatusCriterion; + +/** + * Parser for ViewInput + */ +class Status extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Status + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Subtree.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Subtree.php new file mode 100644 index 0000000..a7802a8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Subtree.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the Subtree parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Subtree as SubtreeCriterion; + +/** + * Parser for Subtree Criterion + */ +class Subtree extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Subtree + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "SubtreeCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <SubtreeCriterion> format" ); + } + return new SubtreeCriterion( explode( ',', $data["SubtreeCriterion"] ) ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/UrlAlias.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/UrlAlias.php new file mode 100644 index 0000000..5b4c971 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/UrlAlias.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the ContentIdCriterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\UrlAlias as UrlAliasCriterion; + +/** + * Parser for ViewInput + */ +class UrlAlias extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\UrlAlias + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/UserMetadata.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/UserMetadata.php new file mode 100644 index 0000000..fa7391b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/UserMetadata.php @@ -0,0 +1,37 @@ +<?php +/** + * File containing the ContentIdCriterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\UserMetadata as UserMetadataCriterion; + +/** + * Parser for ViewInput + */ +class UserMetadata extends Base +{ + /** + * Parses input structure to a Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\UserMetadata + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + throw new \Exception( '@todo implement' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Visibility.php b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Visibility.php new file mode 100644 index 0000000..4b6fdbe --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/Criterion/Visibility.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the Visibility Criterion parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser\Criterion; + +use eZ\Publish\Core\REST\Server\Input\Parser\Base; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Visibility as VisibilityCriterion; + +/** + * Parser for Visibility Criterion + */ +class Visibility extends Base +{ + /** + * Parses input structure to a Visibility Criterion object + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\Criterion\Visibility + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( "VisibilityCriterion", $data ) ) + { + throw new Exceptions\Parser( "Invalid <VisibilityCriterion> format" ); + } + + if ( $data['VisibilityCriterion'] != VisibilityCriterion::VISIBLE && $data['VisibilityCriterion'] != VisibilityCriterion::HIDDEN ) + { + throw new Exceptions\Parser( "Invalid <VisibilityCriterion> format" ); + } + + return new VisibilityCriterion( (int)$data['VisibilityCriterion'] ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/FieldDefinitionCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/FieldDefinitionCreate.php new file mode 100644 index 0000000..b3ccc19 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/FieldDefinitionCreate.php @@ -0,0 +1,145 @@ +<?php +/** + * File containing the FieldDefinitionCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parser for FieldDefinitionCreate + */ +class FieldDefinitionCreate extends Base +{ + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ContentTypeService $contentTypeService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->contentTypeService = $contentTypeService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'identifier', $data ) ) + { + throw new Exceptions\Parser( "Missing 'identifier' element for FieldDefinitionCreate." ); + } + + if ( !array_key_exists( 'fieldType', $data ) ) + { + throw new Exceptions\Parser( "Missing 'fieldType' element for FieldDefinitionCreate." ); + } + + $fieldDefinitionCreate = $this->contentTypeService->newFieldDefinitionCreateStruct( + $data['identifier'], + $data['fieldType'] + ); + + // @todo XSD says that descriptions is mandatory, but content type can be created without it + if ( array_key_exists( 'names', $data ) ) + { + if ( !is_array( $data['names'] ) || !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'names' element for FieldDefinitionCreate." ); + } + + $fieldDefinitionCreate->names = $this->parserTools->parseTranslatableList( $data['names'] ); + } + + // @todo XSD says that descriptions is mandatory, but content type can be created without it + if ( array_key_exists( 'descriptions', $data ) ) + { + if ( !is_array( $data['descriptions'] ) || !array_key_exists( 'value', $data['descriptions'] ) || !is_array( $data['descriptions']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'descriptions' element for FieldDefinitionCreate." ); + } + + $fieldDefinitionCreate->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + // @todo XSD says that fieldGroup is mandatory, but content type can be created without it + if ( array_key_exists( 'fieldGroup', $data ) ) + { + $fieldDefinitionCreate->fieldGroup = $data['fieldGroup']; + } + + // @todo XSD says that position is mandatory, but content type can be created without it + if ( array_key_exists( 'position', $data ) ) + { + $fieldDefinitionCreate->position = (int)$data['position']; + } + + // @todo XSD says that isTranslatable is mandatory, but content type can be created without it + if ( array_key_exists( 'isTranslatable', $data ) ) + { + $fieldDefinitionCreate->isTranslatable = $this->parserTools->parseBooleanValue( $data['isTranslatable'] ); + } + + // @todo XSD says that isRequired is mandatory, but content type can be created without it + if ( array_key_exists( 'isRequired', $data ) ) + { + $fieldDefinitionCreate->isRequired = $this->parserTools->parseBooleanValue( $data['isRequired'] ); + } + + // @todo XSD says that isInfoCollector is mandatory, but content type can be created without it + if ( array_key_exists( 'isInfoCollector', $data ) ) + { + $fieldDefinitionCreate->isInfoCollector = $this->parserTools->parseBooleanValue( $data['isInfoCollector'] ); + } + + // @todo XSD says that isSearchable is mandatory, but content type can be created without it + if ( array_key_exists( 'isSearchable', $data ) ) + { + $fieldDefinitionCreate->isSearchable = $this->parserTools->parseBooleanValue( $data['isSearchable'] ); + } + + // @todo XSD says that defaultValue is mandatory, but content type can be created without it + if ( array_key_exists( 'defaultValue', $data ) ) + { + $fieldDefinitionCreate->defaultValue = $data['defaultValue']; + } + + //@todo fieldSettings - Not specified + //@todo validatorConfiguration - Not specified + + return $fieldDefinitionCreate; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/FieldDefinitionUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/FieldDefinitionUpdate.php new file mode 100644 index 0000000..c0d1d2e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/FieldDefinitionUpdate.php @@ -0,0 +1,137 @@ +<?php +/** + * File containing the FieldDefinitionUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\API\Repository\ContentTypeService; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parser for FieldDefinitionUpdate + */ +class FieldDefinitionUpdate extends Base +{ + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ContentTypeService $contentTypeService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->contentTypeService = $contentTypeService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $fieldDefinitionUpdate = $this->contentTypeService->newFieldDefinitionUpdateStruct(); + + if ( array_key_exists( 'identifier', $data ) ) + { + $fieldDefinitionUpdate->identifier = $data['identifier']; + } + + // @todo XSD says that descriptions is mandatory, but field definition can be updated without it + if ( array_key_exists( 'names', $data ) ) + { + if ( !is_array( $data['names'] ) || !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'names' element for FieldDefinitionUpdate." ); + } + + $fieldDefinitionUpdate->names = $this->parserTools->parseTranslatableList( $data['names'] ); + } + + // @todo XSD says that descriptions is mandatory, but field definition can be updated without it + if ( array_key_exists( 'descriptions', $data ) ) + { + if ( !is_array( $data['descriptions'] ) || !array_key_exists( 'value', $data['descriptions'] ) || !is_array( $data['descriptions']['value'] ) ) + { + throw new Exceptions\Parser( "Invalid 'descriptions' element for FieldDefinitionUpdate." ); + } + + $fieldDefinitionUpdate->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + // @todo XSD says that fieldGroup is mandatory, but field definition can be updated without it + if ( array_key_exists( 'fieldGroup', $data ) ) + { + $fieldDefinitionUpdate->fieldGroup = $data['fieldGroup']; + } + + // @todo XSD says that position is mandatory, but field definition can be updated without it + if ( array_key_exists( 'position', $data ) ) + { + $fieldDefinitionUpdate->position = (int)$data['position']; + } + + // @todo XSD says that isTranslatable is mandatory, but field definition can be updated without it + if ( array_key_exists( 'isTranslatable', $data ) ) + { + $fieldDefinitionUpdate->isTranslatable = $this->parserTools->parseBooleanValue( $data['isTranslatable'] ); + } + + // @todo XSD says that isRequired is mandatory, but field definition can be updated without it + if ( array_key_exists( 'isRequired', $data ) ) + { + $fieldDefinitionUpdate->isRequired = $this->parserTools->parseBooleanValue( $data['isRequired'] ); + } + + // @todo XSD says that isInfoCollector is mandatory, but field definition can be updated without it + if ( array_key_exists( 'isInfoCollector', $data ) ) + { + $fieldDefinitionUpdate->isInfoCollector = $this->parserTools->parseBooleanValue( $data['isInfoCollector'] ); + } + + // @todo XSD says that isSearchable is mandatory, but field definition can be updated without it + if ( array_key_exists( 'isSearchable', $data ) ) + { + $fieldDefinitionUpdate->isSearchable = $this->parserTools->parseBooleanValue( $data['isSearchable'] ); + } + + // @todo XSD says that defaultValue is mandatory, but field definition can be updated without it + if ( array_key_exists( 'defaultValue', $data ) ) + { + $fieldDefinitionUpdate->defaultValue = $data['defaultValue']; + } + + //@todo fieldSettings - Not specified + //@todo validatorConfiguration - Not specified + + return $fieldDefinitionUpdate; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/LocationCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/LocationCreate.php new file mode 100644 index 0000000..772254f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/LocationCreate.php @@ -0,0 +1,109 @@ +<?php +/** + * File containing the LocationCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\LocationService; + +/** + * Parser for LocationCreate + */ +class LocationCreate extends Base +{ + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\LocationService $locationService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, LocationService $locationService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->locationService = $locationService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'ParentLocation', $data ) || !is_array( $data['ParentLocation'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'ParentLocation' element for LocationCreate." ); + } + + if ( !array_key_exists( '_href', $data['ParentLocation'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for ParentLocation element in LocationCreate." ); + } + + $locationHref = $this->urlHandler->parse( 'location', $data['ParentLocation']['_href'] ); + $locationHrefParts = explode( '/', $locationHref['location'] ); + + $locationCreateStruct = $this->locationService->newLocationCreateStruct( + array_pop( $locationHrefParts ) + ); + + if ( array_key_exists( 'priority', $data ) ) + { + $locationCreateStruct->priority = (int)$data['priority']; + } + + if ( array_key_exists( 'hidden', $data ) ) + { + $locationCreateStruct->hidden = $this->parserTools->parseBooleanValue( $data['hidden'] ); + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $locationCreateStruct->remoteId = $data['remoteId']; + } + + if ( !array_key_exists( 'sortField', $data ) ) + { + throw new Exceptions\Parser( "Missing 'sortField' element for LocationCreate." ); + } + + $locationCreateStruct->sortField = $this->parserTools->parseDefaultSortField( $data['sortField'] ); + + if ( !array_key_exists( 'sortOrder', $data ) ) + { + throw new Exceptions\Parser( "Missing 'sortOrder' element for LocationCreate." ); + } + + $locationCreateStruct->sortOrder = $this->parserTools->parseDefaultSortOrder( $data['sortOrder'] ); + + return $locationCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/LocationUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/LocationUpdate.php new file mode 100644 index 0000000..b85a147 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/LocationUpdate.php @@ -0,0 +1,97 @@ +<?php +/** + * File containing the LocationUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\LocationService; + +use eZ\Publish\Core\REST\Server\Values\RestLocationUpdateStruct; + +/** + * Parser for LocationUpdate + */ +class LocationUpdate extends Base +{ + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\LocationService $locationService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, LocationService $locationService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->locationService = $locationService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Server\Values\RestLocationUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $locationUpdateStruct = $this->locationService->newLocationUpdateStruct(); + + if ( array_key_exists( 'priority', $data ) ) + { + $locationUpdateStruct->priority = (int)$data['priority']; + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $locationUpdateStruct->remoteId = $data['remoteId']; + } + + $hidden = null; + if ( array_key_exists( 'hidden', $data ) ) + { + $hidden = $this->parserTools->parseBooleanValue( $data['hidden'] ); + } + + if ( !array_key_exists( 'sortField', $data ) ) + { + throw new Exceptions\Parser( "Missing 'sortField' element for LocationUpdate." ); + } + + $locationUpdateStruct->sortField = $this->parserTools->parseDefaultSortField( $data['sortField'] ); + + if ( !array_key_exists( 'sortOrder', $data ) ) + { + throw new Exceptions\Parser( "Missing 'sortOrder' element for LocationUpdate." ); + } + + $locationUpdateStruct->sortOrder = $this->parserTools->parseDefaultSortOrder( $data['sortOrder'] ); + + return new RestLocationUpdateStruct( $locationUpdateStruct, $hidden ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateCreate.php new file mode 100644 index 0000000..7a89db1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateCreate.php @@ -0,0 +1,100 @@ +<?php +/** + * File containing the ObjectStateCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ObjectStateService; + +/** + * Parser for ObjectStateCreate + */ +class ObjectStateCreate extends Base +{ + /** + * Object state service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ObjectStateService $objectStateService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ObjectStateService $objectStateService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->objectStateService = $objectStateService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'identifier', $data ) ) + { + throw new Exceptions\Parser( "Missing 'identifier' attribute for ObjectStateCreate." ); + } + + $objectStateCreateStruct = $this->objectStateService->newObjectStateCreateStruct( $data['identifier'] ); + + if ( !array_key_exists( 'priority', $data ) ) + { + throw new Exceptions\Parser( "Missing 'priority' attribute for ObjectStateCreate." ); + } + + $objectStateCreateStruct->priority = (int)$data['priority']; + + if ( !array_key_exists( 'defaultLanguageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'defaultLanguageCode' attribute for ObjectStateCreate." ); + } + + $objectStateCreateStruct->defaultLanguageCode = $data['defaultLanguageCode']; + + if ( !array_key_exists( 'names', $data ) || !is_array( $data['names'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateCreate." ); + } + + if ( !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateCreate." ); + } + + $objectStateCreateStruct->names = $this->parserTools->parseTranslatableList( $data['names'] ); + + // @todo XSD says that descriptions field is mandatory. Does that make sense? + if ( array_key_exists( 'descriptions', $data ) && is_array( $data['descriptions'] ) ) + { + $objectStateCreateStruct->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + return $objectStateCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateGroupCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateGroupCreate.php new file mode 100644 index 0000000..a923aba --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateGroupCreate.php @@ -0,0 +1,92 @@ +<?php +/** + * File containing the ObjectStateGroupCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ObjectStateService; + +/** + * Parser for ObjectStateGroupCreate + */ +class ObjectStateGroupCreate extends Base +{ + /** + * Object state service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ObjectStateService $objectStateService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ObjectStateService $objectStateService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->objectStateService = $objectStateService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'identifier', $data ) ) + { + throw new Exceptions\Parser( "Missing 'identifier' attribute for ObjectStateGroupCreate." ); + } + + $objectStateGroupCreateStruct = $this->objectStateService->newObjectStateGroupCreateStruct( $data['identifier'] ); + + if ( !array_key_exists( 'defaultLanguageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'defaultLanguageCode' attribute for ObjectStateGroupCreate." ); + } + + $objectStateGroupCreateStruct->defaultLanguageCode = $data['defaultLanguageCode']; + + if ( !array_key_exists( 'names', $data ) || !is_array( $data['names'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateGroupCreate." ); + } + + if ( !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateGroupCreate." ); + } + + $objectStateGroupCreateStruct->names = $this->parserTools->parseTranslatableList( $data['names'] ); + + if ( array_key_exists( 'descriptions', $data ) && is_array( $data['descriptions'] ) ) + { + $objectStateGroupCreateStruct->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + return $objectStateGroupCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateGroupUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateGroupUpdate.php new file mode 100644 index 0000000..f4ba8fb --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateGroupUpdate.php @@ -0,0 +1,93 @@ +<?php +/** + * File containing the ObjectStateGroupUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ObjectStateService; + +/** + * Parser for ObjectStateGroupUpdate + */ +class ObjectStateGroupUpdate extends Base +{ + /** + * Object state service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ObjectStateService $objectStateService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ObjectStateService $objectStateService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->objectStateService = $objectStateService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $objectStateGroupUpdateStruct = $this->objectStateService->newObjectStateGroupUpdateStruct(); + + if ( array_key_exists( 'identifier', $data ) ) + { + $objectStateGroupUpdateStruct->identifier = $data['identifier']; + } + + if ( array_key_exists( 'defaultLanguageCode', $data ) ) + { + $objectStateGroupUpdateStruct->defaultLanguageCode = $data['defaultLanguageCode']; + } + + if ( array_key_exists( 'names', $data ) ) + { + if ( !is_array( $data['names'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateGroupUpdate." ); + } + + if ( !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateGroupUpdate." ); + } + + $objectStateGroupUpdateStruct->names = $this->parserTools->parseTranslatableList( $data['names'] ); + } + + if ( array_key_exists( 'descriptions', $data ) && is_array( $data['descriptions'] ) ) + { + $objectStateGroupUpdateStruct->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + return $objectStateGroupUpdateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateUpdate.php new file mode 100644 index 0000000..d166eb3 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ObjectStateUpdate.php @@ -0,0 +1,93 @@ +<?php +/** + * File containing the ObjectStateUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ObjectStateService; + +/** + * Parser for ObjectStateUpdate + */ +class ObjectStateUpdate extends Base +{ + /** + * Object state service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ObjectStateService $objectStateService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ObjectStateService $objectStateService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->objectStateService = $objectStateService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $objectStateUpdateStruct = $this->objectStateService->newObjectStateUpdateStruct(); + + if ( array_key_exists( 'identifier', $data ) ) + { + $objectStateUpdateStruct->identifier = $data['identifier']; + } + + if ( array_key_exists( 'defaultLanguageCode', $data ) ) + { + $objectStateUpdateStruct->defaultLanguageCode = $data['defaultLanguageCode']; + } + + if ( array_key_exists( 'names', $data ) ) + { + if ( !is_array( $data['names'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateUpdate." ); + } + + if ( !array_key_exists( 'value', $data['names'] ) || !is_array( $data['names']['value'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'names' element for ObjectStateUpdate." ); + } + + $objectStateUpdateStruct->names = $this->parserTools->parseTranslatableList( $data['names'] ); + } + + if ( array_key_exists( 'descriptions', $data ) && is_array( $data['descriptions'] ) ) + { + $objectStateUpdateStruct->descriptions = $this->parserTools->parseTranslatableList( $data['descriptions'] ); + } + + return $objectStateUpdateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/PolicyCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/PolicyCreate.php new file mode 100644 index 0000000..8a77fa7 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/PolicyCreate.php @@ -0,0 +1,97 @@ +<?php +/** + * File containing the PolicyCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\RoleService; + +/** + * Parser for PolicyCreate + */ +class PolicyCreate extends Base +{ + /** + * Role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\RoleService $roleService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, RoleService $roleService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->roleService = $roleService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'module', $data ) ) + { + throw new Exceptions\Parser( "Missing 'module' attribute for PolicyCreate." ); + } + + if ( !array_key_exists( 'function', $data ) ) + { + throw new Exceptions\Parser( "Missing 'function' attribute for PolicyCreate." ); + } + + $policyCreate = $this->roleService->newPolicyCreateStruct( $data['module'], $data['function'] ); + + // @todo XSD says that limitations is mandatory, + // but polices can be created without limitations + if ( array_key_exists( 'limitations', $data ) ) + { + if ( !is_array( $data['limitations'] ) ) + { + throw new Exceptions\Parser( "Invalid format for 'limitations' in PolicyCreate." ); + } + + if ( !isset( $data['limitations']['limitation'] ) || !is_array( $data['limitations']['limitation'] ) ) + { + throw new Exceptions\Parser( "Invalid format for 'limitations' in PolicyCreate." ); + } + + foreach ( $data['limitations']['limitation'] as $limitationData ) + { + $policyCreate->addLimitation( + $this->parserTools->parseLimitation( $limitationData ) + ); + } + } + + return $policyCreate; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/PolicyUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/PolicyUpdate.php new file mode 100644 index 0000000..bd86596 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/PolicyUpdate.php @@ -0,0 +1,87 @@ +<?php +/** + * File containing the PolicyUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\RoleService; + +/** + * Parser for PolicyUpdate + */ +class PolicyUpdate extends Base +{ + /** + * Role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\RoleService $roleService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, RoleService $roleService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->roleService = $roleService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $policyUpdate = $this->roleService->newPolicyUpdateStruct(); + + // @todo XSD says that limitations field is mandatory, but + // it needs to be possible to remove limitations from policy + if ( array_key_exists( 'limitations', $data ) ) + { + if ( !is_array( $data['limitations'] ) ) + { + throw new Exceptions\Parser( "Invalid format for 'limitations' in PolicyUpdate." ); + } + + if ( !isset( $data['limitations']['limitation'] ) || !is_array( $data['limitations']['limitation'] ) ) + { + throw new Exceptions\Parser( "Invalid format for 'limitations' in PolicyUpdate." ); + } + + foreach ( $data['limitations']['limitation'] as $limitationData ) + { + $policyUpdate->addLimitation( + $this->parserTools->parseLimitation( $limitationData ) + ); + } + } + + return $policyUpdate; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/RelationCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/RelationCreate.php new file mode 100644 index 0000000..883142b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/RelationCreate.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the RelationCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parser for RelationCreate + */ +class RelationCreate extends Base +{ + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return mixed + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'Destination', $data ) || !is_array( $data['Destination'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'Destination' element for RelationCreate." ); + } + + if ( !array_key_exists( '_href', $data['Destination'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for Destination element in RelationCreate." ); + } + + $destinationParts = $this->urlHandler->parse( 'object', $data['Destination']['_href'] ); + return $destinationParts['object']; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/RoleAssignInput.php b/eZ/Publish/Core/REST/Server/Input/Parser/RoleAssignInput.php new file mode 100644 index 0000000..d57132a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/RoleAssignInput.php @@ -0,0 +1,81 @@ +<?php +/** + * File containing the RoleAssignInput parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; + +use eZ\Publish\Core\REST\Server\Values\RoleAssignment; + +/** + * Parser for RoleAssignInput + */ +class RoleAssignInput extends Base +{ + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Server\Values\RoleAssignment + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'Role', $data ) ) + { + throw new Exceptions\Parser( "Missing 'Role' element for RoleAssignInput." ); + } + + if ( !is_array( $data['Role'] ) || !array_key_exists( '_href', $data['Role'] ) ) + { + throw new Exceptions\Parser( "Invalid 'Role' element for RoleAssignInput." ); + } + + try + { + $matches = $this->urlHandler->parse( 'role', $data['Role']['_href'] ); + } + catch ( Exceptions\InvalidArgumentException $e ) + { + throw new Exceptions\Parser( 'Invalid format for <Role> reference in <RoleAssignInput>.' ); + } + + // @todo XSD says that limitation is mandatory, but roles can be assigned without limitations + $limitation = null; + if ( array_key_exists( 'limitation', $data ) && is_array( $data['limitation'] ) ) + { + $limitation = $this->parserTools->parseLimitation( $data['limitation'] ); + } + + return new RoleAssignment( $matches['role'], $limitation ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/RoleInput.php b/eZ/Publish/Core/REST/Server/Input/Parser/RoleInput.php new file mode 100644 index 0000000..a857322 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/RoleInput.php @@ -0,0 +1,74 @@ +<?php +/** + * File containing the RoleInput parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\RoleService; + +/** + * Parser for RoleInput + */ +class RoleInput extends Base +{ + /** + * Role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\RoleService $roleService + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, RoleService $roleService, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->roleService = $roleService; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\User\RoleCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + // Since RoleInput is used both for creating and updating role and identifier is not + // required when updating role, we need to rely on PAPI to throw the exception on missing + // identifier when creating a role + // @todo Bring in line with XSD which says that identifier is required always + + $roleIdentifier = null; + if ( array_key_exists( 'identifier', $data ) ) + { + $roleIdentifier = $data['identifier']; + } + + $roleCreateStruct = $this->roleService->newRoleCreateStruct( $roleIdentifier ); + + return $roleCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/SectionInput.php b/eZ/Publish/Core/REST/Server/Input/Parser/SectionInput.php new file mode 100644 index 0000000..4ac9e99 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/SectionInput.php @@ -0,0 +1,71 @@ +<?php +/** + * File containing the SectionInput parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\API\Repository\SectionService; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parser for SectionInput + */ +class SectionInput extends Base +{ + /** + * Section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\SectionService $sectionService + */ + public function __construct( UrlHandler $urlHandler, SectionService $sectionService ) + { + parent::__construct( $urlHandler ); + $this->sectionService = $sectionService; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $sectionCreate = $this->sectionService->newSectionCreateStruct(); + + //@todo XSD says that name is not mandatory? Does that make sense? + if ( !array_key_exists( 'name', $data ) ) + { + throw new Exceptions\Parser( "Missing 'name' attribute for SectionInput." ); + } + + $sectionCreate->name = $data['name']; + + //@todo XSD says that identifier is not mandatory? Does that make sense? + if ( !array_key_exists( 'identifier', $data ) ) + { + throw new Exceptions\Parser( "Missing 'identifier' attribute for SectionInput." ); + } + + $sectionCreate->identifier = $data['identifier']; + + return $sectionCreate; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/URLAliasCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/URLAliasCreate.php new file mode 100644 index 0000000..7c37801 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/URLAliasCreate.php @@ -0,0 +1,106 @@ +<?php +/** + * File containing the URLAliasCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parser for URLAliasCreate + */ +class URLAliasCreate extends Base +{ + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return array + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( '_type', $data ) ) + { + throw new Exceptions\Parser( "Missing '_type' value for URLAliasCreate." ); + } + + if ( $data['_type'] == 'LOCATION' ) + { + if ( !array_key_exists( 'location', $data ) ) + { + throw new Exceptions\Parser( "Missing 'location' value for URLAliasCreate." ); + } + + if ( !is_array( $data['location'] ) || !array_key_exists( '_href', $data['location'] ) ) + { + throw new Exceptions\Parser( "Missing 'location' > '_href' attribute for URLAliasCreate." ); + } + } + else + { + if ( !array_key_exists( 'resource', $data ) ) + { + throw new Exceptions\Parser( "Missing 'resource' value for URLAliasCreate." ); + } + } + + if ( !array_key_exists( 'path', $data ) ) + { + throw new Exceptions\Parser( "Missing 'path' value for URLAliasCreate." ); + } + + if ( !array_key_exists( 'languageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'languageCode' value for URLAliasCreate." ); + } + + if ( array_key_exists( 'alwaysAvailable', $data ) ) + { + $data['alwaysAvailable'] = $this->parserTools->parseBooleanValue( $data['alwaysAvailable'] ); + } + else + { + $data['alwaysAvailable'] = false; + } + + if ( array_key_exists( 'forward', $data ) ) + { + $data['forward'] = $this->parserTools->parseBooleanValue( $data['forward'] ); + } + else + { + $data['forward'] = false; + } + + return $data; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/URLWildcardCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/URLWildcardCreate.php new file mode 100644 index 0000000..7ccbf0f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/URLWildcardCreate.php @@ -0,0 +1,70 @@ +<?php +/** + * File containing the URLWildcardCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; + +/** + * Parser for URLWildcardCreate + */ +class URLWildcardCreate extends Base +{ + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return array + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + if ( !array_key_exists( 'sourceUrl', $data ) ) + { + throw new Exceptions\Parser( "Missing 'sourceUrl' value for URLWildcardCreate." ); + } + + if ( !array_key_exists( 'destinationUrl', $data ) ) + { + throw new Exceptions\Parser( "Missing 'destinationUrl' value for URLWildcardCreate." ); + } + + if ( !array_key_exists( 'forward', $data ) ) + { + throw new Exceptions\Parser( "Missing 'forward' value for URLWildcardCreate." ); + } + + $data['forward'] = $this->parserTools->parseBooleanValue( $data['forward'] ); + + return $data; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/UserCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/UserCreate.php new file mode 100644 index 0000000..264fd71 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/UserCreate.php @@ -0,0 +1,182 @@ +<?php +/** + * File containing the UserCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\UserService; +use eZ\Publish\API\Repository\ContentTypeService; + +/** + * Parser for UserCreate + */ +class UserCreate extends Base +{ + /** + * User service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * FieldType parser + * + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\UserService $userService + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, UserService $userService, ContentTypeService $contentTypeService, FieldTypeParser $fieldTypeParser, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->userService = $userService; + $this->contentTypeService = $contentTypeService; + $this->fieldTypeParser = $fieldTypeParser; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\User\UserCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contentType = null; + if ( array_key_exists( 'ContentType', $data ) && is_array( $data['ContentType'] ) ) + { + if ( !array_key_exists( '_href', $data['ContentType'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for ContentType element in UserCreate." ); + } + + $contentTypeValues = $this->urlHandler->parse( 'type', $data['ContentType']['_href'] ); + $contentType = $this->contentTypeService->loadContentType( + $contentTypeValues['type'] + ); + } + + if ( !array_key_exists( 'mainLanguageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'mainLanguageCode' element for UserCreate." ); + } + + if ( !array_key_exists( 'login', $data ) ) + { + throw new Exceptions\Parser( "Missing 'login' element for UserCreate." ); + } + + if ( !array_key_exists( 'email', $data ) ) + { + throw new Exceptions\Parser( "Missing 'email' element for UserCreate." ); + } + + if ( !array_key_exists( 'password', $data ) ) + { + throw new Exceptions\Parser( "Missing 'password' element for UserCreate." ); + } + + $userCreateStruct = $this->userService->newUserCreateStruct( + $data['login'], + $data['email'], + $data['password'], + $data['mainLanguageCode'], + $contentType + ); + + if ( array_key_exists( 'Section', $data ) && is_array( $data['Section'] ) ) + { + if ( !array_key_exists( '_href', $data['Section'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for Section element in UserCreate." ); + } + + $sectionValues = $this->urlHandler->parse( 'section', $data['Section']['_href'] ); + $userCreateStruct->sectionId = $sectionValues['section']; + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $userCreateStruct->remoteId = $data['remoteId']; + } + + if ( array_key_exists( 'enabled', $data ) ) + { + $userCreateStruct->enabled = $this->parserTools->parseBooleanValue( $data['enabled'] ); + } + + if ( !array_key_exists( 'fields', $data ) || !is_array( $data['fields'] ) || !is_array( $data['fields']['field'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'fields' element for UserCreate." ); + } + + foreach ( $data['fields']['field'] as $fieldData ) + { + if ( !array_key_exists( 'fieldDefinitionIdentifier', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldDefinitionIdentifier' element in field data for UserCreate." ); + } + + $fieldDefinition = $userCreateStruct->contentType->getFieldDefinition( $fieldData['fieldDefinitionIdentifier'] ); + if ( !$fieldDefinition ) + { + throw new Exceptions\Parser( + "'{$fieldData['fieldDefinitionIdentifier']}' is invalid field definition identifier for '{$userCreateStruct->contentType->identifier}' content type in UserCreate." + ); + } + + if ( !array_key_exists( 'fieldValue', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldValue' element for '{$fieldData['fieldDefinitionIdentifier']}' identifier in UserCreate." ); + } + + $fieldValue = $this->fieldTypeParser->parseValue( $fieldDefinition->fieldTypeIdentifier, $fieldData['fieldValue'] ); + + $languageCode = null; + if ( array_key_exists( 'languageCode', $fieldData ) ) + { + $languageCode = $fieldData['languageCode']; + } + + $userCreateStruct->setField( $fieldData['fieldDefinitionIdentifier'], $fieldValue, $languageCode ); + } + + return $userCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/UserGroupCreate.php b/eZ/Publish/Core/REST/Server/Input/Parser/UserGroupCreate.php new file mode 100644 index 0000000..92f9cea --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/UserGroupCreate.php @@ -0,0 +1,146 @@ +<?php +/** + * File containing the UserGroupCreate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\UserService; +use eZ\Publish\API\Repository\ContentTypeService; + +/** + * Parser for UserGroupCreate + */ +class UserGroupCreate extends Base +{ + /** + * User service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * ContentType service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * FieldType parser + * + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\UserService $userService + * @param \eZ\Publish\API\Repository\ContentTypeService $contentTypeService + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + */ + public function __construct( UrlHandler $urlHandler, UserService $userService, ContentTypeService $contentTypeService, FieldTypeParser $fieldTypeParser ) + { + parent::__construct( $urlHandler ); + $this->userService = $userService; + $this->contentTypeService = $contentTypeService; + $this->fieldTypeParser = $fieldTypeParser; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contentType = null; + if ( array_key_exists( 'ContentType', $data ) && is_array( $data['ContentType'] ) ) + { + if ( !array_key_exists( '_href', $data['ContentType'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for ContentType element in UserGroupCreate." ); + } + + $contentTypeValues = $this->urlHandler->parse( 'type', $data['ContentType']['_href'] ); + $contentType = $this->contentTypeService->loadContentType( + $contentTypeValues['type'] + ); + } + + if ( !array_key_exists( 'mainLanguageCode', $data ) ) + { + throw new Exceptions\Parser( "Missing 'mainLanguageCode' element for UserGroupCreate." ); + } + + $userGroupCreateStruct = $this->userService->newUserGroupCreateStruct( $data['mainLanguageCode'], $contentType ); + + if ( array_key_exists( 'Section', $data ) && is_array( $data['Section'] ) ) + { + if ( !array_key_exists( '_href', $data['Section'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for Section element in UserGroupCreate." ); + } + + $sectionValues = $this->urlHandler->parse( 'section', $data['Section']['_href'] ); + $userGroupCreateStruct->sectionId = $sectionValues['section']; + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $userGroupCreateStruct->remoteId = $data['remoteId']; + } + + if ( !array_key_exists( 'fields', $data ) || !is_array( $data['fields'] ) || !is_array( $data['fields']['field'] ) ) + { + throw new Exceptions\Parser( "Missing or invalid 'fields' element for UserGroupCreate." ); + } + + foreach ( $data['fields']['field'] as $fieldData ) + { + if ( !array_key_exists( 'fieldDefinitionIdentifier', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldDefinitionIdentifier' element in field data for UserGroupCreate." ); + } + + $fieldDefinition = $userGroupCreateStruct->contentType->getFieldDefinition( $fieldData['fieldDefinitionIdentifier'] ); + if ( !$fieldDefinition ) + { + throw new Exceptions\Parser( + "'{$fieldData['fieldDefinitionIdentifier']}' is invalid field definition identifier for '{$userGroupCreateStruct->contentType->identifier}' content type in UserGroupCreate." + ); + } + + if ( !array_key_exists( 'fieldValue', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldValue' element for '{$fieldData['fieldDefinitionIdentifier']}' identifier in UserGroupCreate." ); + } + + $fieldValue = $this->fieldTypeParser->parseValue( $fieldDefinition->fieldTypeIdentifier, $fieldData['fieldValue'] ); + + $languageCode = null; + if ( array_key_exists( 'languageCode', $fieldData ) ) + { + $languageCode = $fieldData['languageCode']; + } + + $userGroupCreateStruct->setField( $fieldData['fieldDefinitionIdentifier'], $fieldValue, $languageCode ); + } + + return $userGroupCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/UserGroupUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/UserGroupUpdate.php new file mode 100644 index 0000000..f66719c --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/UserGroupUpdate.php @@ -0,0 +1,184 @@ +<?php +/** + * File containing the UserGroupUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Server\Values\RestUserGroupUpdateStruct; +use eZ\Publish\API\Repository\UserService; +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\LocationService; + +/** + * Parser for UserGroupUpdate + */ +class UserGroupUpdate extends Base +{ + /** + * User service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * FieldType parser + * + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\UserService $userService + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\API\Repository\LocationService $locationService + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + */ + public function __construct( UrlHandler $urlHandler, UserService $userService, ContentService $contentService, LocationService $locationService, FieldTypeParser $fieldTypeParser ) + { + parent::__construct( $urlHandler ); + $this->userService = $userService; + $this->contentService = $contentService; + $this->locationService = $locationService; + $this->fieldTypeParser = $fieldTypeParser; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserGroupUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $parsedData = array(); + + if ( array_key_exists( 'mainLanguageCode', $data ) ) + { + $parsedData['mainLanguageCode'] = $data['mainLanguageCode']; + } + + if ( array_key_exists( 'Section', $data ) && is_array( $data['Section'] ) ) + { + if ( !array_key_exists( '_href', $data['Section'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for Section element in UserGroupUpdate." ); + } + + $sectionValues = $this->urlHandler->parse( 'section', $data['Section']['_href'] ); + $parsedData['sectionId'] = $sectionValues['section']; + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $parsedData['remoteId'] = $data['remoteId']; + } + + if ( array_key_exists( 'fields', $data ) ) + { + $urlValues = $this->urlHandler->parse( 'group', $data['__url'] ); + $groupLocationParts = explode( '/', $urlValues['group'] ); + + $groupLocation = $this->locationService->loadLocation( array_pop( $groupLocationParts ) ); + + if ( !is_array( $data['fields'] ) || !array_key_exists( 'field', $data['fields'] ) || !is_array( $data['fields']['field'] ) ) + { + throw new Exceptions\Parser( "Invalid 'fields' element for UserGroupUpdate." ); + } + + $parsedData['fields'] = array(); + foreach ( $data['fields']['field'] as $fieldData ) + { + if ( !array_key_exists( 'fieldDefinitionIdentifier', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldDefinitionIdentifier' element in field data for UserGroupUpdate." ); + } + + if ( !array_key_exists( 'fieldValue', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldValue' element for '{$fieldData['fieldDefinitionIdentifier']}' identifier in UserGroupUpdate." ); + } + + $fieldValue = $this->fieldTypeParser->parseFieldValue( $groupLocation->contentId, $fieldData['fieldDefinitionIdentifier'], $fieldData['fieldValue'] ); + + $languageCode = null; + if ( array_key_exists( 'languageCode', $fieldData ) ) + { + $languageCode = $fieldData['languageCode']; + } + + $parsedData['fields'][$fieldData['fieldDefinitionIdentifier']] = array( + 'fieldValue' => $fieldValue, + 'languageCode' => $languageCode + ); + } + } + + $userGroupUpdateStruct = $this->userService->newUserGroupUpdateStruct(); + + if ( !empty( $parsedData ) ) + { + if ( array_key_exists( 'mainLanguageCode', $parsedData ) || array_key_exists( 'remoteId', $parsedData ) ) + { + $userGroupUpdateStruct->contentMetadataUpdateStruct = $this->contentService->newContentMetadataUpdateStruct(); + + if ( array_key_exists( 'mainLanguageCode', $parsedData ) ) + { + $userGroupUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = $parsedData['mainLanguageCode']; + } + + if ( array_key_exists( 'remoteId', $parsedData ) ) + { + $userGroupUpdateStruct->contentMetadataUpdateStruct->remoteId = $parsedData['remoteId']; + } + } + + if ( array_key_exists( 'fields', $parsedData ) ) + { + $userGroupUpdateStruct->contentUpdateStruct = $this->contentService->newContentUpdateStruct(); + + foreach ( $parsedData['fields'] as $fieldDefinitionIdentifier => $fieldValue ) + { + $userGroupUpdateStruct->contentUpdateStruct->setField( + $fieldDefinitionIdentifier, + $fieldValue['fieldValue'], + $fieldValue['languageCode'] + ); + } + } + } + + return new RestUserGroupUpdateStruct( + $userGroupUpdateStruct, + array_key_exists( 'sectionId', $parsedData ) ? $parsedData['sectionId'] : null + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/UserUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/UserUpdate.php new file mode 100644 index 0000000..9d5d4e9 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/UserUpdate.php @@ -0,0 +1,213 @@ +<?php +/** + * File containing the UserUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Input\ParserTools; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Server\Values\RestUserUpdateStruct; +use eZ\Publish\API\Repository\UserService; +use eZ\Publish\API\Repository\ContentService; + +/** + * Parser for UserUpdate + */ +class UserUpdate extends Base +{ + /** + * User service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * FieldType parser + * + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * Parser tools + * + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\UserService $userService + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + * @param \eZ\Publish\Core\REST\Common\Input\ParserTools $parserTools + */ + public function __construct( UrlHandler $urlHandler, UserService $userService, ContentService $contentService, FieldTypeParser $fieldTypeParser, ParserTools $parserTools ) + { + parent::__construct( $urlHandler ); + $this->userService = $userService; + $this->contentService = $contentService; + $this->fieldTypeParser = $fieldTypeParser; + $this->parserTools = $parserTools; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\Core\REST\Server\Values\RestUserUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $parsedData = array(); + + //@todo XSD has a login element, but it's not possible to update login + + if ( array_key_exists( 'email', $data ) ) + { + $parsedData['email'] = $data['email']; + } + + if ( array_key_exists( 'password', $data ) ) + { + $parsedData['password'] = $data['password']; + } + + if ( array_key_exists( 'enabled', $data ) ) + { + $parsedData['enabled'] = $this->parserTools->parseBooleanValue( $data['enabled'] ); + } + + if ( array_key_exists( 'mainLanguageCode', $data ) ) + { + $parsedData['mainLanguageCode'] = $data['mainLanguageCode']; + } + + if ( array_key_exists( 'Section', $data ) && is_array( $data['Section'] ) ) + { + if ( !array_key_exists( '_href', $data['Section'] ) ) + { + throw new Exceptions\Parser( "Missing '_href' attribute for Section element in UserUpdate." ); + } + + $sectionValues = $this->urlHandler->parse( 'section', $data['Section']['_href'] ); + $parsedData['sectionId'] = $sectionValues['section']; + } + + if ( array_key_exists( 'remoteId', $data ) ) + { + $parsedData['remoteId'] = $data['remoteId']; + } + + if ( array_key_exists( 'fields', $data ) ) + { + $urlValues = $this->urlHandler->parse( 'user', $data['__url'] ); + + if ( !is_array( $data['fields'] ) || !array_key_exists( 'field', $data['fields'] ) || !is_array( $data['fields']['field'] ) ) + { + throw new Exceptions\Parser( "Invalid 'fields' element for UserUpdate." ); + } + + $parsedData['fields'] = array(); + foreach ( $data['fields']['field'] as $fieldData ) + { + if ( !array_key_exists( 'fieldDefinitionIdentifier', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldDefinitionIdentifier' element in field data for UserUpdate." ); + } + + if ( !array_key_exists( 'fieldValue', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldValue' element for '{$fieldData['fieldDefinitionIdentifier']}' identifier in UserUpdate." ); + } + + $fieldValue = $this->fieldTypeParser->parseFieldValue( $urlValues['user'], $fieldData['fieldDefinitionIdentifier'], $fieldData['fieldValue'] ); + + $languageCode = null; + if ( array_key_exists( 'languageCode', $fieldData ) ) + { + $languageCode = $fieldData['languageCode']; + } + + $parsedData['fields'][$fieldData['fieldDefinitionIdentifier']] = array( + 'fieldValue' => $fieldValue, + 'languageCode' => $languageCode + ); + } + } + + $userUpdateStruct = $this->userService->newUserUpdateStruct(); + + if ( !empty( $parsedData ) ) + { + if ( array_key_exists( 'email', $parsedData ) ) + { + $userUpdateStruct->email = $parsedData['email']; + } + + if ( array_key_exists( 'password', $parsedData ) ) + { + $userUpdateStruct->password = $parsedData['password']; + } + + if ( array_key_exists( 'enabled', $parsedData ) ) + { + $userUpdateStruct->enabled = $parsedData['enabled']; + } + + if ( array_key_exists( 'mainLanguageCode', $parsedData ) || array_key_exists( 'remoteId', $parsedData ) ) + { + $userUpdateStruct->contentMetadataUpdateStruct = $this->contentService->newContentMetadataUpdateStruct(); + + if ( array_key_exists( 'mainLanguageCode', $parsedData ) ) + { + $userUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode = $parsedData['mainLanguageCode']; + } + + if ( array_key_exists( 'remoteId', $parsedData ) ) + { + $userUpdateStruct->contentMetadataUpdateStruct->remoteId = $parsedData['remoteId']; + } + } + + if ( array_key_exists( 'fields', $parsedData ) ) + { + $userUpdateStruct->contentUpdateStruct = $this->contentService->newContentUpdateStruct(); + + foreach ( $parsedData['fields'] as $fieldDefinitionIdentifier => $fieldValue ) + { + $userUpdateStruct->contentUpdateStruct->setField( + $fieldDefinitionIdentifier, + $fieldValue['fieldValue'], + $fieldValue['languageCode'] + ); + } + } + } + + return new RestUserUpdateStruct( + $userUpdateStruct, + array_key_exists( 'sectionId', $parsedData ) ? $parsedData['sectionId'] : null + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/VersionUpdate.php b/eZ/Publish/Core/REST/Server/Input/Parser/VersionUpdate.php new file mode 100644 index 0000000..f048539 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/VersionUpdate.php @@ -0,0 +1,108 @@ +<?php +/** + * File containing the VersionUpdate parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input\FieldTypeParser; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\ContentService; + +/** + * Parser for VersionUpdate + */ +class VersionUpdate extends Base +{ + /** + * Content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * FieldType parser + * + * @var \eZ\Publish\Core\REST\Common\Input\FieldTypeParser + */ + protected $fieldTypeParser; + + /** + * Construct from content service + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\API\Repository\ContentService $contentService + * @param \eZ\Publish\Core\REST\Common\Input\FieldTypeParser $fieldTypeParser + */ + public function __construct( UrlHandler $urlHandler, ContentService $contentService, FieldTypeParser $fieldTypeParser ) + { + parent::__construct( $urlHandler ); + $this->contentService = $contentService; + $this->fieldTypeParser = $fieldTypeParser; + } + + /** + * Parse input structure + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $contentUpdateStruct = $this->contentService->newContentUpdateStruct(); + + // Missing initial language code + + if ( array_key_exists( 'initialLanguageCode', $data ) ) + { + $contentUpdateStruct->initialLanguageCode = $data['initialLanguageCode']; + } + + // @todo Where to set the user? + // @todo Where to set modification date? + + if ( array_key_exists( 'fields', $data ) ) + { + if ( !is_array( $data['fields'] ) || !array_key_exists( 'field', $data['fields'] ) || !is_array( $data['fields']['field'] ) ) + { + throw new Exceptions\Parser( "Invalid 'fields' element for VersionUpdate." ); + } + + $urlValues = $this->urlHandler->parse( 'objectVersion', $data['__url'] ); + + foreach ( $data['fields']['field'] as $fieldData ) + { + if ( !array_key_exists( 'fieldDefinitionIdentifier', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldDefinitionIdentifier' element in field data for VersionUpdate." ); + } + + if ( !array_key_exists( 'fieldValue', $fieldData ) ) + { + throw new Exceptions\Parser( "Missing 'fieldValue' element for '{$fieldData['fieldDefinitionIdentifier']}' identifier in VersionUpdate." ); + } + + $fieldValue = $this->fieldTypeParser->parseFieldValue( $urlValues['object'], $fieldData['fieldDefinitionIdentifier'], $fieldData['fieldValue'] ); + + $languageCode = null; + if ( array_key_exists( 'languageCode', $fieldData ) ) + { + $languageCode = $fieldData['languageCode']; + } + + $contentUpdateStruct->setField( $fieldData['fieldDefinitionIdentifier'], $fieldValue, $languageCode ); + } + } + + return $contentUpdateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Input/Parser/ViewInput.php b/eZ/Publish/Core/REST/Server/Input/Parser/ViewInput.php new file mode 100644 index 0000000..0136841 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Input/Parser/ViewInput.php @@ -0,0 +1,114 @@ +<?php +/** + * File containing the ViewInput parser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\Criterion as CriterionParser; +use eZ\Publish\Core\REST\Common\Input\ParsingDispatcher; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\Core\REST\Server\Values\RestViewInput; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalAnd as LogicalAndCriterion; + +/** + * Parser for ViewInput + */ +class ViewInput extends CriterionParser +{ + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + */ + public function __construct( UrlHandler $urlHandler ) + { + parent::__construct( $urlHandler ); + } + + /** + * Parses input structure to a RestViewInput struct + * + * @param array $data + * @param \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher $parsingDispatcher + * + * @throws \eZ\Publish\Core\REST\Common\Exceptions\Parser + * + * @return \eZ\Publish\Core\REST\Server\Values\RestViewInput + */ + public function parse( array $data, ParsingDispatcher $parsingDispatcher ) + { + $restViewInput = new RestViewInput(); + + // identifier + if ( !array_key_exists( 'identifier', $data ) ) + { + throw new Exceptions\Parser( "Missing <identifier> attribute for <ViewInput>." ); + } + $restViewInput->identifier = $data['identifier']; + + // query + if ( !array_key_exists( 'Query', $data ) || !is_array( $data['Query'] ) ) + { + throw new Exceptions\Parser( "Missing <Query> attribute for <ViewInput>." ); + } + + $query = new Query(); + $queryData = $data['Query']; + + // Criteria + // -- FullTextCriterion + if ( array_key_exists( 'Criteria', $queryData ) && is_array( $queryData['Criteria'] ) ) + { + $criteria = array(); + foreach ( $queryData['Criteria'] as $criterionName => $criterionData ) + { + $criteria[] = $this->dispatchCriterion( $criterionName, $criterionData, $parsingDispatcher ); + } + + if ( count( $criteria ) === 1 ) + { + $query->criterion = $criteria[0]; + } + else + { + $query->criterion = new LogicalAndCriterion( $criteria ); + } + } + + // limit + if ( array_key_exists( 'limit', $queryData ) ) + { + $query->limit = (int)$queryData['limit']; + } + + // offset + if ( array_key_exists( 'offset', $queryData ) ) + { + $query->offset = (int)$queryData['offset']; + } + + // SortClauses + // -- SortClause + // ---- SortField + if ( array_key_exists( 'SortClauses', $queryData ) ) + { + } + + // FacetBuilders + // -- contentTypeFacetBuilder + if ( array_key_exists( 'FacetBuilders', $queryData ) ) + { + } + + $restViewInput->query = $query; + + return $restViewInput; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/BadRequestException.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/BadRequestException.php new file mode 100644 index 0000000..bbef4f7 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/BadRequestException.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the BadRequestException ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +/** + * BadRequestException value object visitor + */ +class BadRequestException extends Exception +{ + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 400; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/BadStateException.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/BadStateException.php new file mode 100644 index 0000000..5bf424e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/BadStateException.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the BadStateException ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +/** + * BadStateException value object visitor + */ +class BadStateException extends Exception +{ + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 409; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentList.php new file mode 100644 index 0000000..cdda085 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentList.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the ContentList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ContentList value object visitor + */ +class ContentList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ContentList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'objects' ) + ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'ContentInfo' ); + foreach ( $data->contents as $content ) + { + $visitor->visitValueObject( $content ); + } + $generator->endList( 'ContentInfo' ); + + $generator->endObjectElement( 'ContentList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentObjectStates.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentObjectStates.php new file mode 100644 index 0000000..14e8c42 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentObjectStates.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the ContentObjectStates ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ContentObjectStates value object visitor + */ +class ContentObjectStates extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Common\Values\ContentObjectStates $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentObjectStates' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentObjectStates' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'ContentObjectStates' ) ); + + $generator->startList( 'ObjectState' ); + + foreach ( $data->states as $state ) + { + $generator->startObjectElement( 'ObjectState' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'objectstate', + array( + 'objectstategroup' => $state->groupId, + 'objectstate' => $state->objectState->id + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ObjectState' ); + } + + $generator->endList( 'ObjectState' ); + + $generator->endObjectElement( 'ContentObjectStates' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php new file mode 100644 index 0000000..227bc41 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroup.php @@ -0,0 +1,78 @@ +<?php +/** + * File containing the ContentTypeGroup ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ContentTypeGroup value object visitor + */ +class ContentTypeGroup extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentTypeGroup' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentTypeGroup' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'ContentTypeGroupInput' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'typegroup', array( 'typegroup' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $data->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'created', $data->creationDate->format( 'c' ) ); + $generator->endValueElement( 'created' ); + + $generator->startValueElement( 'modified', $data->modificationDate->format( 'c' ) ); + $generator->endValueElement( 'modified' ); + + $generator->startObjectElement( 'Creator', 'User' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'user', array( 'user' => $data->creatorId ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Creator' ); + + $generator->startObjectElement( 'Modifier', 'User' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'user', array( 'user' => $data->modifierId ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Modifier' ); + + $generator->startObjectElement( 'ContentTypes', 'ContentTypeInfoList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'grouptypes', array( 'typegroup' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ContentTypes' ); + + $generator->endObjectElement( 'ContentTypeGroup' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupList.php new file mode 100644 index 0000000..3d56ebd --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupList.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the ContentTypeGroupList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ContentTypeGroupList value object visitor + */ +class ContentTypeGroupList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ContentTypeGroupList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentTypeGroupList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentTypeGroupList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'typegroups' ) + ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'ContentTypeGroup' ); + foreach ( $data->contentTypeGroups as $contentTypeGroup ) + { + $visitor->visitValueObject( $contentTypeGroup ); + } + $generator->endList( 'ContentTypeGroup' ); + + $generator->endObjectElement( 'ContentTypeGroupList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php new file mode 100644 index 0000000..458d7ca --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeGroupRefList.php @@ -0,0 +1,90 @@ +<?php +/** + * File containing the ContentTypeGroupRefList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ContentTypeGroupRefList value object visitor + */ +class ContentTypeGroupRefList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ContentTypeGroupRefList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentTypeGroupRefList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentTypeGroupRefList' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'groupsOfType', + array( + 'type' => $data->contentType->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + $groupCount = count( $data->contentTypeGroups ); + + $generator->startList( 'ContentTypeGroupRef' ); + foreach ( $data->contentTypeGroups as $contentTypeGroup ) + { + $generator->startObjectElement( 'ContentTypeGroupRef', 'ContentTypeGroup' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'typegroup', + array( + 'typegroup' => $contentTypeGroup->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + if ( $groupCount > 1 ) + { + $generator->startHashElement( 'unlink' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'groupOfType', + array( + 'type' => $data->contentType->id, + 'group' => $contentTypeGroup->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'method', 'DELETE' ); + $generator->endAttribute( 'method' ); + + $generator->endHashElement( 'unlink' ); + } + + $generator->endObjectElement( 'ContentTypeGroupRef' ); + } + $generator->endList( 'ContentTypeGroupRef' ); + + $generator->endObjectElement( 'ContentTypeGroupRefList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeInfoList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeInfoList.php new file mode 100644 index 0000000..de96d01 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeInfoList.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the ContentTypeInfoList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\Core\REST\Server\Values; + +/** + * ContentTypeInfoList value object visitor + */ +class ContentTypeInfoList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ContentTypeInfoList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentTypeInfoList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentTypeInfoList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'ContentType' ); + foreach ( $data->contentTypes as $contentType ) + { + $visitor->visitValueObject( + new Values\RestContentType( $contentType ) + ); + } + $generator->endList( 'ContentType' ); + + $generator->endObjectElement( 'ContentTypeInfoList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeList.php new file mode 100644 index 0000000..7f4da6e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ContentTypeList.php @@ -0,0 +1,54 @@ +<?php +/** + * File containing the ContentTypeList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\Core\REST\Server\Values; + +/** + * ContentTypeList value object visitor + */ +class ContentTypeList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ContentTypeList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ContentTypeList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ContentTypeList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'ContentType' ); + foreach ( $data->contentTypes as $contentType ) + { + $visitor->visitValueObject( + new Values\RestContentType( + $contentType, + $contentType->getFieldDefinitions() + ) + ); + } + $generator->endList( 'ContentType' ); + + $generator->endObjectElement( 'ContentTypeList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContent.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContent.php new file mode 100644 index 0000000..f94b70d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContent.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedContent ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedContent value object visitor + */ +class CreatedContent extends RestContent +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedContent $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->content ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'object', + array( 'object' => $data->content->contentInfo->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContentType.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContentType.php new file mode 100644 index 0000000..5978a09 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContentType.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the CreatedContentType ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedContentType value object visitor + */ +class CreatedContentType extends RestContentType +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedContentType $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $restContentType = $data->contentType; + + parent::visit( $visitor, $generator, $restContentType ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'type' . $this->getUrlTypeSuffix( $restContentType->contentType->status ), + array( + 'type' => $restContentType->contentType->id, + ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContentTypeGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContentTypeGroup.php new file mode 100644 index 0000000..2cd2cec --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedContentTypeGroup.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedContentTypeGroup ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedContentTypeGroup value object visitor + */ +class CreatedContentTypeGroup extends ContentTypeGroup +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedContentTypeGroup $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->contentTypeGroup ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'typegroup', + array( 'typegroup' => $data->contentTypeGroup->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedFieldDefinition.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedFieldDefinition.php new file mode 100644 index 0000000..8dca428 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedFieldDefinition.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the CreatedFieldDefinition ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedFieldDefinition value object visitor + */ +class CreatedFieldDefinition extends RestFieldDefinition +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedFieldDefinition $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $restFieldDefinition = $data->fieldDefinition; + + parent::visit( $visitor, $generator, $restFieldDefinition ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'typeFieldDefinition' . $this->getUrlTypeSuffix( $restFieldDefinition->contentType->status ), + array( + 'type' => $restFieldDefinition->contentType->id, + 'fieldDefinition' => $restFieldDefinition->fieldDefinition->id + ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedLocation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedLocation.php new file mode 100644 index 0000000..cc86f1d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedLocation.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedLocation ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedLocation value object visitor + */ +class CreatedLocation extends RestLocation +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedLocation $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->restLocation ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'location', + array( 'location' => rtrim( $data->restLocation->location->pathString, '/' ) ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedObjectState.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedObjectState.php new file mode 100644 index 0000000..b66f1f8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedObjectState.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the CreatedObjectState ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedObjectState value object visitor + */ +class CreatedObjectState extends RestObjectState +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedObjectState $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->objectState ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'objectstate', + array( + 'objectstategroup' => $data->objectState->groupId, + 'objectstate' => $data->objectState->objectState->id + ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedObjectStateGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedObjectStateGroup.php new file mode 100644 index 0000000..cb29786 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedObjectStateGroup.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedObjectStateGroup ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedObjectStateGroup value object visitor + */ +class CreatedObjectStateGroup extends ObjectStateGroup +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedObjectStateGroup $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->objectStateGroup ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'objectstategroup', + array( 'objectstategroup' => $data->objectStateGroup->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedPolicy.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedPolicy.php new file mode 100644 index 0000000..1e0513d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedPolicy.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the CreatedPolicy ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedPolicy value object visitor + */ +class CreatedPolicy extends Policy +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedPolicy $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->policy ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'policy', + array( + 'role' => $data->policy->roleId, + 'policy' => $data->policy->id + ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedRelation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedRelation.php new file mode 100644 index 0000000..dc0216f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedRelation.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the CreatedRelation ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedRelation value object visitor + */ +class CreatedRelation extends RestRelation +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedRelation $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->relation ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'objectVersionRelation', + array( + 'object' => $data->relation->contentId, + 'version' => $data->relation->versionNo, + 'relation' => $data->relation->relation->id + ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedRole.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedRole.php new file mode 100644 index 0000000..b1b2f15 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedRole.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedRole ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedRole value object visitor + */ +class CreatedRole extends Role +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedRole $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->role ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'role', + array( 'role' => $data->role->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedSection.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedSection.php new file mode 100644 index 0000000..d9ff273 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedSection.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedSection ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedSection value object visitor + */ +class CreatedSection extends Section +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedSection $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->section ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'section', + array( 'section' => $data->section->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedURLAlias.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedURLAlias.php new file mode 100644 index 0000000..896d98a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedURLAlias.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedURLAlias ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedURLAlias value object visitor + */ +class CreatedURLAlias extends URLAlias +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedURLAlias $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->urlAlias ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'urlAlias', + array( 'urlalias' => $data->urlAlias->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedURLWildcard.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedURLWildcard.php new file mode 100644 index 0000000..dac7d86 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedURLWildcard.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedURLWildcard ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedURLWildcard value object visitor + */ +class CreatedURLWildcard extends URLWildcard +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedURLWildcard $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->urlWildcard ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'urlWildcard', + array( 'urlwildcard' => $data->urlWildcard->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedUser.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedUser.php new file mode 100644 index 0000000..05571e4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedUser.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedUser ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedUser value object visitor + */ +class CreatedUser extends RestUser +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedUser $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->user ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'user', + array( 'user' => $data->user->contentInfo->id ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedUserGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedUserGroup.php new file mode 100644 index 0000000..becaffd --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedUserGroup.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the CreatedUserGroup ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedUserGroup value object visitor + */ +class CreatedUserGroup extends RestUserGroup +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedUserGroup $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->userGroup ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'group', + array( 'group' => rtrim( $data->userGroup->mainLocation->pathString, '/' ) ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedVersion.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedVersion.php new file mode 100644 index 0000000..32bcee6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/CreatedVersion.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the CreatedVersion ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * CreatedVersion value object visitor + */ +class CreatedVersion extends Version +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\CreatedVersion $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + parent::visit( $visitor, $generator, $data->version ); + $visitor->setHeader( + 'Location', + $this->urlHandler->generate( + 'objectVersion', + array( + 'object' => $data->version->content->id, + 'version' => $data->version->content->getVersionInfo()->versionNo + ) + ) + ); + $visitor->setStatus( 201 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Exception.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Exception.php new file mode 100644 index 0000000..08391b3 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Exception.php @@ -0,0 +1,133 @@ +<?php +/** + * File containing the Exception ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\UrlHandler; + +/** + * Exception value object visitor + */ +class Exception extends ValueObjectVisitor +{ + /** + * Is debug mode enabled? + * + * @var boolean + */ + protected $debug = false; + + /** + * Mapping of HTTP status codes to their respective error messages + * + * @var array + */ + protected $httpStatusCodes = array( + 400 => "Bad Request", + 401 => "Unauthorized", + 402 => "Payment Required", + 403 => "Forbidden", + 404 => "Not Found", + 405 => "Method Not Allowed", + 406 => "Not Acceptable", + 407 => "Proxy Authentication Required", + 408 => "Request Time-out", + 409 => "Conflict", + 410 => "Gone", + 411 => "Length Required", + 412 => "Precondition Failed", + 413 => "Request Entity Too Large", + 414 => "Request-URI Too Long", + 415 => "Unsupported Media Type", + 416 => "Requested range not satisfiable", + 417 => "Expectation Failed", + 418 => "I'm a teapot", + 421 => "There are too many connections from your internet address", + 422 => "Unprocessable Entity", + 423 => "Locked", + 424 => "Failed Dependency", + 425 => "Unordered Collection", + 426 => "Upgrade Required", + 500 => "Internal Server Error", + 501 => "Not Implemented", + 502 => "Bad Gateway", + 503 => "Service Unavailable", + 504 => "Gateway Time-out", + 505 => "HTTP Version not supported", + 506 => "Variant Also Negotiates", + 507 => "Insufficient Storage", + 509 => "Bandwidth Limit Exceeded", + 510 => "Not Extended", + ); + + /** + * Construct from debug flag + * + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param boolean $debug + */ + public function __construct( UrlHandler $urlHandler, $debug = false ) + { + parent::__construct( $urlHandler ); + $this->debug = (bool)$debug; + } + + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 500; + } + + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \Exception $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ErrorMessage' ); + + $statusCode = $this->getStatus(); + $visitor->setStatus( $statusCode ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ErrorMessage' ) ); + + $generator->startValueElement( 'errorCode', $statusCode ); + $generator->endValueElement( 'errorCode' ); + + $generator->startValueElement( 'errorMessage', $this->httpStatusCodes[$statusCode] ); + $generator->endValueElement( 'errorMessage' ); + + $generator->startValueElement( 'errorDescription', $data->getMessage() ); + $generator->endValueElement( 'errorDescription' ); + + if ( $this->debug ) + { + $generator->startValueElement( 'trace', $data->getTraceAsString() ); + $generator->endValueElement( 'trace' ); + + $generator->startValueElement( 'file', $data->getFile() ); + $generator->endValueElement( 'file' ); + + $generator->startValueElement( 'line', $data->getLine() ); + $generator->endValueElement( 'line' ); + } + + $generator->endObjectElement( 'ErrorMessage' ); + } +} + diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/FieldDefinitionList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/FieldDefinitionList.php new file mode 100644 index 0000000..6d388df --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/FieldDefinitionList.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing the FieldDefinitionList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\Core\REST\Server\Values\RestFieldDefinition as ValuesRestFieldDefinition; + +/** + * FieldDefinitionList value object visitor + */ +class FieldDefinitionList extends RestContentTypeBase +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\FieldDefinitionList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $fieldDefinitionList = $data; + $contentType = $fieldDefinitionList->contentType; + + $urlTypeSuffix = $this->getUrlTypeSuffix( $contentType->status ); + + $generator->startObjectElement( 'FieldDefinitions', 'FieldDefinitionList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'FieldDefinitionList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'typeFieldDefinitions' . $urlTypeSuffix, + array( + 'type' => $contentType->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'FieldDefinition' ); + foreach ( $fieldDefinitionList->fieldDefinitions as $fieldDefinition ) + { + $visitor->visitValueObject( + new ValuesRestFieldDefinition( $contentType, $fieldDefinition ) + ); + } + $generator->endList( 'FieldDefinition' ); + + $generator->endObjectElement( 'FieldDefinitions' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ForbiddenException.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ForbiddenException.php new file mode 100644 index 0000000..8bdf03c --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ForbiddenException.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the ForbiddenException ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +/** + * ForbiddenException value object visitor + */ +class ForbiddenException extends Exception +{ + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 403; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/InvalidArgumentException.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/InvalidArgumentException.php new file mode 100644 index 0000000..5e8c2eb --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/InvalidArgumentException.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the InvalidArgumentException ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +/** + * InvalidArgumentException value object visitor + */ +class InvalidArgumentException extends Exception +{ + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 406; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php new file mode 100644 index 0000000..aeccf2f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/LocationList.php @@ -0,0 +1,53 @@ +<?php +/** + * File containing the LocationList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * LocationList value object visitor + */ +class LocationList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\LocationList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'LocationList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'LocationList' ) ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'Location' ); + + foreach ( $data->locations as $restLocation ) + { + $generator->startObjectElement( 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'location', array( 'location' => rtrim( $restLocation->location->pathString, '/' ) ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Location' ); + } + + $generator->endList( 'Location' ); + + $generator->endObjectElement( 'LocationList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/NoContent.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/NoContent.php new file mode 100644 index 0000000..029b81f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/NoContent.php @@ -0,0 +1,32 @@ +<?php +/** + * File containing the NoContent ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * NoContent Value object visitor + */ +class NoContent extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\NoContent $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $visitor->setStatus( 204 ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/NotFoundException.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/NotFoundException.php new file mode 100644 index 0000000..15a3e7f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/NotFoundException.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the NotFoundException ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +/** + * NotFoundException value object visitor + */ +class NotFoundException extends Exception +{ + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 404; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php new file mode 100644 index 0000000..992aa92 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroup.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the ObjectStateGroup ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ObjectStateGroup value object visitor + */ +class ObjectStateGroup extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateGroup' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateGroup' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'ObjectStateGroupUpdate' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'objectstategroup', array( 'objectstategroup' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $data->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'defaultLanguageCode', $data->defaultLanguageCode ); + $generator->endValueElement( 'defaultLanguageCode' ); + + $generator->startValueElement( 'languageCodes', implode( ',', $data->languageCodes ) ); + $generator->endValueElement( 'languageCodes' ); + + $this->visitNamesList( $generator, $data->getNames() ); + $this->visitDescriptionsList( $generator, $data->getDescriptions() ); + + $generator->endObjectElement( 'ObjectStateGroup' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroupList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroupList.php new file mode 100644 index 0000000..8fabf77 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateGroupList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the ObjectStateGroupList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ObjectStateGroupList value object visitor + */ +class ObjectStateGroupList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ObjectStateGroupList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateGroupList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateGroupList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objectstategroups' ) ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'ObjectStateGroup' ); + foreach ( $data->groups as $group ) + { + $visitor->visitValueObject( $group ); + } + $generator->endList( 'ObjectStateGroup' ); + + $generator->endObjectElement( 'ObjectStateGroupList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateList.php new file mode 100644 index 0000000..418cc24 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ObjectStateList.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the ObjectStateList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\Core\REST\Common\Values\RestObjectState as RestObjectStateValue; + +/** + * ObjectStateList value object visitor + */ +class ObjectStateList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ObjectStateList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectStateList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectStateList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objectstates', array( 'objectstategroup' => $data->groupId ) ) ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'ObjectState' ); + foreach ( $data->states as $state ) + { + $visitor->visitValueObject( + new RestObjectStateValue( $state, $data->groupId ) + ); + } + $generator->endList( 'ObjectState' ); + + $generator->endObjectElement( 'ObjectStateList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/PermanentRedirect.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/PermanentRedirect.php new file mode 100644 index 0000000..f092eb0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/PermanentRedirect.php @@ -0,0 +1,33 @@ +<?php +/** + * File containing the PermanentRedirect ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * PermanentRedirect value object visitor + */ +class PermanentRedirect extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\PermanentRedirect $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $visitor->setStatus( 301 ); + $visitor->setHeader( 'Location', $data->redirectUri ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Policy.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Policy.php new file mode 100644 index 0000000..0022507 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Policy.php @@ -0,0 +1,66 @@ +<?php +/** + * File containing the Policy ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Policy value object visitor + */ +class Policy extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\User\Policy $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Policy' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Policy' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'PolicyUpdate' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'policy', array( 'role' => $data->roleId, 'policy' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $data->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'module', $data->module ); + $generator->endValueElement( 'module' ); + + $generator->startValueElement( 'function', $data->function ); + $generator->endValueElement( 'function' ); + + $limitations = $data->getLimitations(); + if ( !empty( $limitations ) ) + { + $generator->startHashElement( 'limitations' ); + $generator->startList( 'limitation' ); + + foreach ( $limitations as $limitation ) + { + $this->visitLimitation( $generator, $limitation ); + } + + $generator->endList( 'limitation' ); + $generator->endHashElement( 'limitations' ); + } + + $generator->endObjectElement( 'Policy' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/PolicyList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/PolicyList.php new file mode 100644 index 0000000..614502b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/PolicyList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the PolicyList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * PolicyList value object visitor + */ +class PolicyList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\PolicyList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'PolicyList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'PolicyList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'Policy' ); + foreach ( $data->policies as $policy ) + { + $visitor->visitValueObject( $policy ); + } + $generator->endList( 'Policy' ); + + $generator->endObjectElement( 'PolicyList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RelationList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RelationList.php new file mode 100644 index 0000000..f410412 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RelationList.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing the RelationList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\Core\REST\Server\Values\RestRelation as ValuesRestRelation; + +/** + * RelationList value object visitor + */ +class RelationList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RelationList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Relations', 'RelationList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RelationList' ) ); + + $path = $data->path; + if ( $path === null ) + { + $path = $this->urlHandler->generate( + 'objectVersionRelations', + array( + 'object' => $data->contentId, + 'version' => $data->versionNo + ) + ); + } + + $generator->startAttribute( 'href', $path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'Relation' ); + foreach ( $data->relations as $relation ) + { + $visitor->visitValueObject( new ValuesRestRelation( $relation, $data->contentId, $data->versionNo ) ); + } + $generator->endList( 'Relation' ); + + $generator->endObjectElement( 'Relations' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceCreated.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceCreated.php new file mode 100644 index 0000000..188bc15 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/ResourceCreated.php @@ -0,0 +1,33 @@ +<?php +/** + * File containing the ResourceCreated ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * ResourceCreated Value object visitor + */ +class ResourceCreated extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\ResourceCreated $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $visitor->setStatus( 201 ); + $visitor->setHeader( 'Location', $data->redirectUri ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php new file mode 100644 index 0000000..edc3789 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContent.php @@ -0,0 +1,174 @@ +<?php +/** + * File containing the RestContent ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\Core\REST\Server\Values\Version as VersionValue; + +/** + * RestContent value object visitor + */ +class RestContent extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestContent $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $restContent = $data; + $contentInfo = $restContent->contentInfo; + $mainLocation = $restContent->mainLocation; + $currentVersion = $restContent->currentVersion; + + $mediaType = ( $restContent->currentVersion === null ? 'ContentInfo' : 'Content' ); + + $generator->startObjectElement( 'Content', $mediaType ); + + $visitor->setHeader( 'Content-Type', $generator->getMediaType( $mediaType ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'ContentUpdate' ) ); + + $generator->startAttribute( + 'href', + $data->path === null ? + $this->urlHandler->generate( 'object', array( 'object' => $contentInfo->id ) ) : + $data->path + ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'remoteId', $contentInfo->remoteId ); + $generator->endAttribute( 'remoteId' ); + $generator->startAttribute( 'id', $contentInfo->id ); + $generator->endAttribute( 'id' ); + + $generator->startObjectElement( 'ContentType' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'type', + array( 'type' => $contentInfo->getContentType()->id ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ContentType' ); + + $generator->startValueElement( 'Name', $contentInfo->name ); + $generator->endValueElement( 'Name' ); + + $generator->startObjectElement( 'Versions', 'VersionList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'objectVersions', array( 'object' => $contentInfo->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Versions' ); + + $generator->startObjectElement( 'CurrentVersion', 'Version' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'objectCurrentVersion', + array( 'object' => $contentInfo->id ) + ) + ); + $generator->endAttribute( 'href' ); + + // Embed current version, if available + if ( $currentVersion !== null ) + { + $visitor->visitValueObject( + new VersionValue( + $currentVersion, + $restContent->relations + ) + ); + } + + $generator->endObjectElement( 'CurrentVersion' ); + + $generator->startObjectElement( 'Section' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'section', array( 'section' => $contentInfo->sectionId ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Section' ); + + // Main location will not exist if we're visiting the content draft + if ( $data->mainLocation !== null ) + { + $generator->startObjectElement( 'MainLocation', 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'location', array( 'location' => rtrim( $mainLocation->pathString, '/' ) ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'MainLocation' ); + } + + $generator->startObjectElement( 'Locations', 'LocationList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'objectLocations', array( 'object' => $contentInfo->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Locations' ); + + $generator->startObjectElement( 'Owner', 'User' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'user', array( 'user' => $contentInfo->ownerId ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Owner' ); + + // Modification date will not exist if we're visiting the content draft + if ( $contentInfo->modificationDate !== null ) + { + $generator->startValueElement( + 'lastModificationDate', + $contentInfo->modificationDate->format( 'c' ) + ); + $generator->endValueElement( 'lastModificationDate' ); + } + + // Published date will not exist if we're visiting the content draft + if ( $contentInfo->publishedDate !== null ) + { + $generator->startValueElement( + 'publishedDate', + ( $contentInfo->publishedDate !== null + ? $contentInfo->publishedDate->format( 'c' ) + : null ) + ); + $generator->endValueElement( 'publishedDate' ); + } + + $generator->startValueElement( + 'mainLanguageCode', + $contentInfo->mainLanguageCode + ); + $generator->endValueElement( 'mainLanguageCode' ); + + $generator->startValueElement( + 'alwaysAvailable', + ( $contentInfo->alwaysAvailable ? 'true' : 'false' ) + ); + $generator->endValueElement( 'alwaysAvailable' ); + + $generator->endObjectElement( 'Content' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php new file mode 100644 index 0000000..38512c5 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentType.php @@ -0,0 +1,137 @@ +<?php +/** + * File containing the RestContentType ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\API\Repository\Values\ContentType\ContentType as APIContentType; +use eZ\Publish\Core\REST\Server\Values; + +/** + * RestContentType value object visitor + */ +class RestContentType extends RestContentTypeBase +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestContentType $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $contentType = $data->contentType; + + $urlTypeSuffix = $this->getUrlTypeSuffix( $contentType->status ); + $mediaType = $data->fieldDefinitions !== null ? 'ContentType' : 'ContentTypeInfo'; + + $generator->startObjectElement( $mediaType ); + + $visitor->setHeader( 'Content-Type', $generator->getMediaType( $mediaType ) ); + + if ( $contentType->status === APIContentType::STATUS_DRAFT ) + { + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'ContentTypeUpdate' ) ); + } + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'type' . $urlTypeSuffix, + array( + 'type' => $contentType->id, + ) + ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $contentType->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'status', $this->serializeStatus( $contentType->status ) ); + $generator->endValueElement( 'status' ); + + $generator->startValueElement( 'identifier', $contentType->identifier ); + $generator->endValueElement( 'identifier' ); + + $this->visitNamesList( $generator, $contentType->getNames() ); + + $descriptions = $contentType->getDescriptions(); + if ( is_array( $descriptions ) ) + { + $this->visitDescriptionsList( $generator, $descriptions ); + } + + $generator->startValueElement( 'creationDate', $contentType->creationDate->format( 'c' ) ); + $generator->endValueElement( 'creationDate' ); + + $generator->startValueElement( 'modificationDate', $contentType->modificationDate->format( 'c' ) ); + $generator->endValueElement( 'modificationDate' ); + + $generator->startObjectElement( 'Creator', 'User' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'user', + array( 'user' => $contentType->creatorId ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Creator' ); + + $generator->startObjectElement( 'Modifier', 'User' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'user', + array( 'user' => $contentType->modifierId ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Modifier' ); + + $generator->startValueElement( 'remoteId', $contentType->remoteId ); + $generator->endValueElement( 'remoteId' ); + + $generator->startValueElement( 'urlAliasSchema', $contentType->urlAliasSchema ); + $generator->endValueElement( 'urlAliasSchema' ); + + $generator->startValueElement( 'nameSchema', $contentType->nameSchema ); + $generator->endValueElement( 'nameSchema' ); + + $generator->startValueElement( 'isContainer', ( $contentType->isContainer ? 'true' : 'false' ) ); + $generator->endValueElement( 'isContainer' ); + + $generator->startValueElement( 'mainLanguageCode', $contentType->mainLanguageCode ); + $generator->endValueElement( 'mainLanguageCode' ); + + $generator->startValueElement( 'defaultAlwaysAvailable', ( $contentType->defaultAlwaysAvailable ? 'true' : 'false' ) ); + $generator->endValueElement( 'defaultAlwaysAvailable' ); + + $generator->startValueElement( 'defaultSortField', $this->serializeSortField( $contentType->defaultSortField ) ); + $generator->endValueElement( 'defaultSortField' ); + + $generator->startValueElement( 'defaultSortOrder', $this->serializeSortOrder( $contentType->defaultSortOrder ) ); + $generator->endValueElement( 'defaultSortOrder' ); + + if ( $data->fieldDefinitions !== null ) + { + $visitor->visitValueObject( + new Values\FieldDefinitionList( + $contentType, + $data->fieldDefinitions + ) + ); + } + + $generator->endObjectElement( $mediaType ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentTypeBase.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentTypeBase.php new file mode 100644 index 0000000..3e61c5e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestContentTypeBase.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing the RestContentTypeBase ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values; + +/** + * Base for RestContentType related value object visitors + */ +abstract class RestContentTypeBase extends ValueObjectVisitor +{ + /** + * Returns a suffix for the URL type to generate on basis of the given + * $contentTypeStatus. + * + * @param int $contentTypeStatus + * + * @return string + */ + protected function getUrlTypeSuffix( $contentTypeStatus ) + { + switch ( $contentTypeStatus ) + { + case Values\ContentType\ContentType::STATUS_DEFINED: + return ''; + + case Values\ContentType\ContentType::STATUS_DRAFT: + return 'Draft'; + + case Values\ContentType\ContentType::STATUS_MODIFIED: + return 'Modified'; + } + + return ''; + } + + /** + * Serializes the given $contentTypeStatus to a string representation + * + * @param int $contentTypeStatus + * + * @return string + */ + protected function serializeStatus( $contentTypeStatus ) + { + switch ( $contentTypeStatus ) + { + case Values\ContentType\ContentType::STATUS_DEFINED: + return 'DEFINED'; + + case Values\ContentType\ContentType::STATUS_DRAFT: + return 'DRAFT'; + + case Values\ContentType\ContentType::STATUS_MODIFIED: + return 'MODIFIED'; + } + + throw new \RuntimeException( "Unknown content type status: '{$contentTypeStatus}'." ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php new file mode 100644 index 0000000..9cd1315 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestExecutedView.php @@ -0,0 +1,114 @@ +<?php +/** + * File containing the Section ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\RestContent as RestContentValue; +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\API\Repository\ContentService; +use eZ\Publish\API\Repository\LocationService; + +/** + * Section value object visitor + */ +class RestExecutedView extends ValueObjectVisitor +{ + /** + * Location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $contentService; + + protected $locationService; + + public function __construct( UrlHandler $urlHandler, LocationService $locationService, ContentService $contentService ) + { + $this->locationService = $locationService; + $this->contentService = $contentService; + parent::__construct( $urlHandler ); + } + + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestExecutedView $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'View' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'View' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'view', array( 'view' => $data->identifier ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + // BEGIN Query + $generator->startObjectElement( 'Query' ); + $generator->endObjectElement( 'Query' ); + // END Query + + // BEGIN Result + $generator->startObjectElement( 'Result', $generator->getMediaType( 'ViewResult' ) ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'viewResults', array( 'view' => $data->identifier ) ) + ); + $generator->endAttribute( 'href' ); + + // BEGIN searchHits + $generator->startHashElement( 'searchHits' ); + $generator->startList( 'searchHit' ); + + foreach ( $data->searchResults->searchHits as $searchHit ) + { + $generator->startObjectElement( 'searchHit' ); + + $generator->startAttribute( 'score', 0 ); + $generator->endAttribute( 'score' ); + + $generator->startAttribute( 'index', 0 ); + $generator->endAttribute( 'index' ); + + $generator->startObjectElement( 'value' ); + + $contentInfo = $searchHit->valueObject->contentInfo; + $restContent = new RestContentValue( + $contentInfo, + $this->locationService->loadLocation( $contentInfo->mainLocationId ), + $searchHit->valueObject, + $this->contentService->loadRelations( $searchHit->valueObject->getVersionInfo() ) + ); + $visitor->visitValueObject( $restContent ); + $generator->endObjectElement( 'value' ); + $generator->endObjectElement( 'searchHit' ); + } + + $generator->endList( 'searchHit' ); + + $generator->endHashElement( 'searchHits' ); + // END searchHits + + $generator->endObjectElement( 'Result' ); + // END Result + + $generator->endObjectElement( 'View' ); + } +} + diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestFieldDefinition.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestFieldDefinition.php new file mode 100644 index 0000000..1990277 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestFieldDefinition.php @@ -0,0 +1,131 @@ +<?php +/** + * File containing the RestFieldDefinition ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Output\FieldTypeSerializer; + +use eZ\Publish\API\Repository\Values\ContentType\ContentType as APIContentType; + +/** + * RestFieldDefinition value object visitor + * + * @todo $fieldSettings & $validatorConfiguration (missing from spec) + */ +class RestFieldDefinition extends RestContentTypeBase +{ + /** + * @var \eZ\Publish\Core\REST\Common\Output\FieldTypeSerializer + */ + protected $fieldTypeSerializer; + + /** + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\Core\REST\Common\Output\FieldTypeSerializer $fieldTypeSerializer + */ + public function __construct( UrlHandler $urlHandler, FieldTypeSerializer $fieldTypeSerializer ) + { + parent::__construct( $urlHandler ); + $this->fieldTypeSerializer = $fieldTypeSerializer; + } + + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestFieldDefinition $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $restFieldDefinition = $data; + $fieldDefinition = $restFieldDefinition->fieldDefinition; + $contentType = $restFieldDefinition->contentType; + + $urlTypeSuffix = $this->getUrlTypeSuffix( $contentType->status ); + + $generator->startObjectElement( 'FieldDefinition' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'FieldDefinition' ) ); + + if ( $contentType->status === APIContentType::STATUS_DRAFT ) + { + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'FieldDefinitionUpdate' ) ); + } + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'typeFieldDefinition' . $urlTypeSuffix, + array( + 'type' => $contentType->id, + 'fieldDefinition' => $fieldDefinition->id, + ) + ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $fieldDefinition->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'identifier', $fieldDefinition->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'fieldType', $fieldDefinition->fieldTypeIdentifier ); + $generator->endValueElement( 'fieldType' ); + + $generator->startValueElement( 'fieldGroup', $fieldDefinition->fieldGroup ); + $generator->endValueElement( 'fieldGroup' ); + + $generator->startValueElement( 'position', $fieldDefinition->position ); + $generator->endValueElement( 'position' ); + + $generator->startValueElement( 'isTranslatable', $this->serializeBool( $fieldDefinition->isTranslatable ) ); + $generator->endValueElement( 'isTranslatable' ); + + $generator->startValueElement( 'isRequired', $this->serializeBool( $fieldDefinition->isRequired ) ); + $generator->endValueElement( 'isRequired' ); + + $generator->startValueElement( 'isInfoCollector', $this->serializeBool( $fieldDefinition->isInfoCollector ) ); + $generator->endValueElement( 'isInfoCollector' ); + + $this->fieldTypeSerializer->serializeFieldDefaultValue( + $generator, + $fieldDefinition, + $fieldDefinition->defaultValue + ); + + $generator->startValueElement( 'isSearchable', $this->serializeBool( $fieldDefinition->isSearchable ) ); + $generator->endValueElement( 'isSearchable' ); + + $this->visitNamesList( $generator, $fieldDefinition->getNames() ); + + $descriptions = $fieldDefinition->getDescriptions(); + if ( is_array( $descriptions ) ) + { + $this->visitDescriptionsList( $generator, $descriptions ); + } + + $this->fieldTypeSerializer->serializeFieldSettings( + $generator, + $fieldDefinition, + $fieldDefinition->getFieldSettings() + ); + + $this->fieldTypeSerializer->serializeValidatorConfiguration( + $generator, + $fieldDefinition, + $fieldDefinition->getValidatorConfiguration() + ); + + $generator->endObjectElement( 'FieldDefinition' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php new file mode 100644 index 0000000..1342316 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestLocation.php @@ -0,0 +1,103 @@ +<?php +/** + * File containing the RestLocation ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RestLocation value object visitor + */ +class RestLocation extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestLocation $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Location' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Location' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'LocationUpdate' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'location', array( 'location' => rtrim( $data->location->pathString, '/' ) ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $data->location->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'priority', $data->location->priority ); + $generator->endValueElement( 'priority' ); + + $generator->startValueElement( 'hidden', $data->location->hidden ? 'true' : 'false' ); + $generator->endValueElement( 'hidden' ); + + $generator->startValueElement( 'invisible', $data->location->invisible ? 'true' : 'false' ); + $generator->endValueElement( 'invisible' ); + + $generator->startObjectElement( 'ParentLocation', 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'location', + array( + 'location' => '/' . implode( '/', array_slice( $data->location->path, 0, count( $data->location->path ) - 1 ) ) + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ParentLocation' ); + + $generator->startValueElement( 'pathString', $data->location->pathString ); + $generator->endValueElement( 'pathString' ); + + $generator->startValueElement( 'depth', $data->location->depth ); + $generator->endValueElement( 'depth' ); + + $generator->startValueElement( 'childCount', $data->childCount ); + $generator->endValueElement( 'childCount' ); + + $generator->startValueElement( 'remoteId', $data->location->remoteId ); + $generator->endValueElement( 'remoteId' ); + + $generator->startObjectElement( 'Children', 'LocationList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'locationChildren', + array( + 'location' => rtrim( $data->location->pathString, '/' ) + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Children' ); + + $generator->startObjectElement( 'Content' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'object', array( 'object' => $data->location->contentId ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Content' ); + + $generator->startValueElement( 'sortField', $this->serializeSortField( $data->location->sortField ) ); + $generator->endValueElement( 'sortField' ); + + $generator->startValueElement( 'sortOrder', $this->serializeSortOrder( $data->location->sortOrder ) ); + $generator->endValueElement( 'sortOrder' ); + + $generator->endObjectElement( 'Location' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php new file mode 100644 index 0000000..9d12dec --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestObjectState.php @@ -0,0 +1,70 @@ +<?php +/** + * File containing the RestObjectState ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RestObjectState value object visitor + */ +class RestObjectState extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Common\Values\RestObjectState $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'ObjectState' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'ObjectState' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'ObjectStateUpdate' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'objectstate', array( 'objectstategroup' => $data->groupId, 'objectstate' => $data->objectState->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $data->objectState->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'identifier', $data->objectState->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'priority', $data->objectState->priority ); + $generator->endValueElement( 'priority' ); + + $generator->startObjectElement( 'ObjectStateGroup' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'objectstategroup', array( 'objectstategroup' => $data->groupId ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->endObjectElement( 'ObjectStateGroup' ); + + $generator->startValueElement( 'defaultLanguageCode', $data->objectState->defaultLanguageCode ); + $generator->endValueElement( 'defaultLanguageCode' ); + + $generator->startValueElement( 'languageCodes', implode( ',', $data->objectState->languageCodes ) ); + $generator->endValueElement( 'languageCodes' ); + + $this->visitNamesList( $generator, $data->objectState->getNames() ); + $this->visitDescriptionsList( $generator, $data->objectState->getDescriptions() ); + + $generator->endObjectElement( 'ObjectState' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php new file mode 100644 index 0000000..a894388 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestRelation.php @@ -0,0 +1,109 @@ +<?php +/** + * File containing the RestRelation ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\API\Repository\Values\Content\Relation as RelationValue; + +/** + * RestRelation value object visitor + */ +class RestRelation extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestRelation $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Relation' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Relation' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'objectVersionRelation', + array( + 'object' => $data->contentId, + 'version' => $data->versionNo, + 'relation' => $data->relation->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + $generator->startObjectElement( 'SourceContent', 'ContentInfo' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'object', + array( + 'object' => $data->contentId, + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'SourceContent' ); + + $generator->startObjectElement( 'DestinationContent', 'ContentInfo' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'object', + array( + 'object' => $data->relation->getDestinationContentInfo()->id, + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'DestinationContent' ); + + if ( $data->relation->sourceFieldDefinitionIdentifier !== null ) + { + $generator->startValueElement( 'SourceFieldDefinitionIdentifier', $data->relation->sourceFieldDefinitionIdentifier ); + $generator->endValueElement( 'SourceFieldDefinitionIdentifier' ); + } + + $generator->startValueElement( 'RelationType', $this->getRelationTypeString( $data->relation->type ) ); + $generator->endValueElement( 'RelationType' ); + + $generator->endObjectElement( 'Relation' ); + } + + /** + * Returns $relationType as a readable string + * + * @param int $relationType + * + * @return string + */ + protected function getRelationTypeString( $relationType ) + { + switch ( $relationType ) + { + case RelationValue::COMMON: + return 'COMMON'; + case RelationValue::EMBED: + return 'EMBED'; + case RelationValue::LINK: + return 'LINK'; + case RelationValue::FIELD: + return 'ATTRIBUTE'; + } + + throw new \Exception( 'Unknown relation type ' . $relationType . '.' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php new file mode 100644 index 0000000..be57658 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestTrashItem.php @@ -0,0 +1,92 @@ +<?php +/** + * File containing the RestTrashItem ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RestTrashItem value object visitor + */ +class RestTrashItem extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestTrashItem $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'TrashItem' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'TrashItem' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'trash', array( 'trash' => $data->trashItem->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'id', $data->trashItem->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'priority', $data->trashItem->priority ); + $generator->endValueElement( 'priority' ); + + $generator->startValueElement( 'hidden', $data->trashItem->hidden ? 'true' : 'false' ); + $generator->endValueElement( 'hidden' ); + + $generator->startValueElement( 'invisible', $data->trashItem->invisible ? 'true' : 'false' ); + $generator->endValueElement( 'invisible' ); + + $pathStringParts = explode( '/', trim( $data->trashItem->pathString, '/' ) ); + $pathStringParts = array_slice( $pathStringParts, 0, count( $pathStringParts ) - 1 ); + + $generator->startObjectElement( 'ParentLocation', 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'location', + array( + 'location' => '/' . implode( '/', $pathStringParts ) + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ParentLocation' ); + + $generator->startValueElement( 'pathString', $data->trashItem->pathString ); + $generator->endValueElement( 'pathString' ); + + $generator->startValueElement( 'depth', $data->trashItem->depth ); + $generator->endValueElement( 'depth' ); + + $generator->startValueElement( 'childCount', $data->childCount ); + $generator->endValueElement( 'childCount' ); + + $generator->startValueElement( 'remoteId', $data->trashItem->remoteId ); + $generator->endValueElement( 'remoteId' ); + + $generator->startObjectElement( 'Content' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'object', array( 'object' => $data->trashItem->contentId ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Content' ); + + $generator->startValueElement( 'sortField', $this->serializeSortField( $data->trashItem->sortField ) ); + $generator->endValueElement( 'sortField' ); + + $generator->startValueElement( 'sortOrder', $this->serializeSortOrder( $data->trashItem->sortOrder ) ); + $generator->endValueElement( 'sortOrder' ); + + $generator->endObjectElement( 'TrashItem' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php new file mode 100644 index 0000000..96dd826 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUser.php @@ -0,0 +1,142 @@ +<?php +/** + * File containing the RestUser ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\Version as VersionValue; + +/** + * RestUser value object visitor + */ +class RestUser extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestUser $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $contentInfo = $data->contentInfo; + + $generator->startObjectElement( 'User' ); + + $generator->startAttribute( 'href', $this->urlHandler->generate( 'user', array( 'user' => $contentInfo->id ) ) ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'id', $contentInfo->id ); + $generator->endAttribute( 'id' ); + + $generator->startAttribute( 'remoteId', $contentInfo->remoteId ); + $generator->endAttribute( 'remoteId' ); + + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'User' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'UserUpdate' ) ); + + $generator->startObjectElement( 'ContentType' ); + + $contentType = $contentInfo->getContentType(); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'type', array( 'type' => $contentType->id ) ) ); + $generator->endAttribute( 'href' ); + + $generator->endObjectElement( 'ContentType' ); + + $generator->startValueElement( 'name', $contentInfo->name ); + $generator->endValueElement( 'name' ); + + $generator->startObjectElement( 'Versions', 'VersionList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objectVersions', array( 'object' => $contentInfo->id ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Versions' ); + + $generator->startObjectElement( 'Section' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'section', array( 'section' => $contentInfo->sectionId ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Section' ); + + $generator->startObjectElement( 'MainLocation', 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'location', + array( + 'location' => rtrim( $data->mainLocation->pathString, '/' ) + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'MainLocation' ); + + $generator->startObjectElement( 'Locations', 'LocationList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objectLocations', array( 'object' => $contentInfo->id ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Locations' ); + + $generator->startObjectElement( 'Owner', 'User' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'user', array( 'user' => $contentInfo->ownerId ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Owner' ); + + $generator->startValueElement( 'publishDate', $contentInfo->publishedDate->format( 'c' ) ); + $generator->endValueElement( 'publishDate' ); + + $generator->startValueElement( 'lastModificationDate', $contentInfo->modificationDate->format( 'c' ) ); + $generator->endValueElement( 'lastModificationDate' ); + + $generator->startValueElement( 'mainLanguageCode', $contentInfo->mainLanguageCode ); + $generator->endValueElement( 'mainLanguageCode' ); + + $generator->startValueElement( 'alwaysAvailable', $contentInfo->alwaysAvailable ? 'true' : 'false' ); + $generator->endValueElement( 'alwaysAvailable' ); + + $visitor->visitValueObject( new VersionValue( $data->content, $data->relations ) ); + + $generator->startValueElement( 'login', $data->content->login ); + $generator->endValueElement( 'login' ); + + $generator->startValueElement( 'email', $data->content->email ); + $generator->endValueElement( 'email' ); + + $generator->startValueElement( 'enabled', $data->content->enabled ? 'true' : 'false' ); + $generator->endValueElement( 'enabled' ); + + $generator->startObjectElement( 'UserGroups', 'UserGroupList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'userGroups', + array( + 'user' => $contentInfo->id + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'UserGroups' ); + + $generator->startObjectElement( 'Roles', 'RoleAssignmentList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'userRoleAssignments', + array( + 'user' => $contentInfo->id + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Roles' ); + + $generator->endObjectElement( 'User' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php new file mode 100644 index 0000000..100f149 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroup.php @@ -0,0 +1,161 @@ +<?php +/** + * File containing the RestUserGroup ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values\Version as VersionValue; + +/** + * RestUserGroup value object visitor + */ +class RestUserGroup extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestUserGroup $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $contentInfo = $data->contentInfo; + $mainLocation = $data->mainLocation; + $mainLocationPath = rtrim( $mainLocation->pathString, '/' ); + + $generator->startObjectElement( 'UserGroup' ); + + $generator->startAttribute( 'href', $this->urlHandler->generate( 'group', array( 'group' => $mainLocationPath ) ) ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'id', $contentInfo->id ); + $generator->endAttribute( 'id' ); + + $generator->startAttribute( 'remoteId', $contentInfo->remoteId ); + $generator->endAttribute( 'remoteId' ); + + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UserGroup' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'UserGroupUpdate' ) ); + + $generator->startObjectElement( 'ContentType' ); + + $contentType = $contentInfo->getContentType(); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'type', array( 'type' => $contentType->id ) ) ); + $generator->endAttribute( 'href' ); + + $generator->endObjectElement( 'ContentType' ); + + $generator->startValueElement( 'name', $contentInfo->name ); + $generator->endValueElement( 'name' ); + + $generator->startObjectElement( 'Versions', 'VersionList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objectVersions', array( 'object' => $contentInfo->id ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Versions' ); + + $generator->startObjectElement( 'Section' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'section', array( 'section' => $contentInfo->sectionId ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Section' ); + + $generator->startObjectElement( 'MainLocation', 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'location', + array( + 'location' => $mainLocationPath + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'MainLocation' ); + + $generator->startObjectElement( 'Locations', 'LocationList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objectLocations', array( 'object' => $contentInfo->id ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Locations' ); + + $generator->startObjectElement( 'Owner', 'User' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'user', array( 'user' => $contentInfo->ownerId ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Owner' ); + + $generator->startValueElement( 'publishDate', $contentInfo->publishedDate->format( 'c' ) ); + $generator->endValueElement( 'publishDate' ); + + $generator->startValueElement( 'lastModificationDate', $contentInfo->modificationDate->format( 'c' ) ); + $generator->endValueElement( 'lastModificationDate' ); + + $generator->startValueElement( 'mainLanguageCode', $contentInfo->mainLanguageCode ); + $generator->endValueElement( 'mainLanguageCode' ); + + $generator->startValueElement( 'alwaysAvailable', $contentInfo->alwaysAvailable ? 'true' : 'false' ); + $generator->endValueElement( 'alwaysAvailable' ); + + $visitor->visitValueObject( new VersionValue( $data->content, $data->relations ) ); + + $generator->startObjectElement( 'ParentUserGroup', 'UserGroup' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'group', + array( + 'group' => '/' . implode( '/', array_slice( $mainLocation->path, 0, count( $mainLocation->path ) - 1 ) ) + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'ParentUserGroup' ); + + $generator->startObjectElement( 'Subgroups', 'UserGroupList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'groupSubgroups', + array( + 'group' => $mainLocationPath + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Subgroups' ); + + $generator->startObjectElement( 'Users', 'UserList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'groupUsers', + array( + 'group' => $mainLocationPath + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Users' ); + + $generator->startObjectElement( 'Roles', 'RoleAssignmentList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'groupRoleAssignments', + array( + 'group' => $mainLocationPath + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Roles' ); + + $generator->endObjectElement( 'UserGroup' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php new file mode 100644 index 0000000..4e2ec5f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserGroupRoleAssignment.php @@ -0,0 +1,65 @@ +<?php +/** + * File containing the RestUserGroupRoleAssignment ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; + +/** + * RestUserGroupRoleAssignment value object visitor + */ +class RestUserGroupRoleAssignment extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestUserGroupRoleAssignment $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleAssignment' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleAssignment' ) ); + + $roleAssignment = $data->roleAssignment; + $role = $roleAssignment->getRole(); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'groupRoleAssignment', array( + 'group' => $data->id, + 'role' => $role->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + $roleLimitation = $roleAssignment->getRoleLimitation(); + if ( $roleLimitation instanceof RoleLimitation ) + { + $this->visitLimitation( $generator, $roleLimitation ); + } + + $generator->startObjectElement( 'Role' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'role', array( 'role' => $role->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Role' ); + + $generator->endObjectElement( 'RoleAssignment' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php new file mode 100644 index 0000000..f354817 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RestUserRoleAssignment.php @@ -0,0 +1,65 @@ +<?php +/** + * File containing the RestUserRoleAssignment ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; + +/** + * RestUserRoleAssignment value object visitor + */ +class RestUserRoleAssignment extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RestUserRoleAssignment $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleAssignment' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleAssignment' ) ); + + $roleAssignment = $data->roleAssignment; + $role = $roleAssignment->getRole(); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'userRoleAssignment', array( + 'user' => $data->id, + 'role' => $role->id + ) + ) + ); + $generator->endAttribute( 'href' ); + + $roleLimitation = $roleAssignment->getRoleLimitation(); + if ( $roleLimitation instanceof RoleLimitation ) + { + $this->visitLimitation( $generator, $roleLimitation ); + } + + $generator->startObjectElement( 'Role' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'role', array( 'role' => $role->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Role' ); + + $generator->endObjectElement( 'RoleAssignment' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php new file mode 100644 index 0000000..b3a0e5e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Role.php @@ -0,0 +1,53 @@ +<?php +/** + * File containing the Role ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Role value object visitor + */ +class Role extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\User\Role $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Role' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Role' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'RoleInput' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'role', array( 'role' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startObjectElement( 'Policies', 'PolicyList' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'policies', array( 'role' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Policies' ); + + $generator->endObjectElement( 'Role' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RoleAssignmentList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RoleAssignmentList.php new file mode 100644 index 0000000..0748aea --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RoleAssignmentList.php @@ -0,0 +1,55 @@ +<?php +/** + * File containing the RoleAssignmentList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Server\Values; + +/** + * RoleAssignmentList value object visitor + */ +class RoleAssignmentList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RoleAssignmentList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleAssignmentList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleAssignmentList' ) ); + + $generator->startAttribute( + 'href', + $data->isGroupAssignment ? + $this->urlHandler->generate( 'groupRoleAssignments', array( 'group' => $data->id ) ) : + $this->urlHandler->generate( 'userRoleAssignments', array( 'user' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'RoleAssignment' ); + foreach ( $data->roleAssignments as $roleAssignment ) + { + $visitor->visitValueObject( + $data->isGroupAssignment ? + new Values\RestUserGroupRoleAssignment( $roleAssignment, $data->id ) : + new Values\RestUserRoleAssignment( $roleAssignment, $data->id ) + ); + } + $generator->endList( 'RoleAssignment' ); + + $generator->endObjectElement( 'RoleAssignmentList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RoleList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RoleList.php new file mode 100644 index 0000000..fc2fd50 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/RoleList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the RoleList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * RoleList value object visitor + */ +class RoleList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\RoleList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'RoleList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'RoleList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'Role' ); + foreach ( $data->roles as $role ) + { + $visitor->visitValueObject( $role ); + } + $generator->endList( 'Role' ); + + $generator->endObjectElement( 'RoleList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Root.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Root.php new file mode 100644 index 0000000..8c20050 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Root.php @@ -0,0 +1,96 @@ +<?php +/** + * File containing the Root ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Root value object visitor + */ +class Root extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Common\Values\Root $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Root' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Root' ) ); + + // Uses hashElement instead of objectElement as a workaround to be able to have + // an empty media-type, since there is no media type for list of content yet + $generator->startHashElement( 'content' ); + $generator->startAttribute( 'media-type', '' ); + $generator->endAttribute( 'media-type' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'objects' ) ); + $generator->endAttribute( 'href' ); + $generator->endHashElement( 'content' ); + + $generator->startObjectElement( 'contentTypes', 'ContentTypeInfoList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'types' ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'contentTypes' ); + + $generator->startObjectElement( 'users', 'UserRefList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'users' ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'users' ); + + $generator->startObjectElement( 'roles', 'RoleList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'roles' ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'roles' ); + + // @todo Load the locations of the following three items from settings + $generator->startObjectElement( 'rootLocation', 'Location' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'location', array( 'location' => '/1/2' ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'rootLocation' ); + + $generator->startObjectElement( 'rootUserGroup', 'UserGroup' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'group', array( 'group' => '/1/5' ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'rootUserGroup' ); + + $generator->startObjectElement( 'rootMediaFolder', 'Location' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'location', array( 'location' => '/1/43' ) ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'rootMediaFolder' ); + + $generator->startObjectElement( 'trash', 'Trash' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'trashItems' ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'trash' ); + + $generator->startObjectElement( 'sections', 'SectionList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'sections' ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'sections' ); + + $generator->startObjectElement( 'views', 'RefList' ); + $generator->startAttribute( 'href', $this->urlHandler->generate( 'views' ) ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'views' ); + + // @todo object states? + // @todo url aliases? + // @todo url wildcards? + // @todo content type groups? + // @todo user policies? + + $generator->endObjectElement( 'Root' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Section.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Section.php new file mode 100644 index 0000000..328c835 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Section.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the Section ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Section value object visitor + */ +class Section extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\Content\Section $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Section' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Section' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'SectionInput' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'section', array( 'section' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startValueElement( 'sectionId', $data->id ); + $generator->endValueElement( 'sectionId' ); + + $generator->startValueElement( 'identifier', $data->identifier ); + $generator->endValueElement( 'identifier' ); + + $generator->startValueElement( 'name', $data->name ); + $generator->endValueElement( 'name' ); + + $generator->endObjectElement( 'Section' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/SectionList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/SectionList.php new file mode 100644 index 0000000..4306baa --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/SectionList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the SectionList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * SectionList value object visitor + */ +class SectionList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\SectionList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'SectionList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'SectionList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'Section' ); + foreach ( $data->sections as $section ) + { + $visitor->visitValueObject( $section ); + } + $generator->endList( 'Section' ); + + $generator->endObjectElement( 'SectionList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/TemporaryRedirect.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/TemporaryRedirect.php new file mode 100644 index 0000000..fde824f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/TemporaryRedirect.php @@ -0,0 +1,33 @@ +<?php +/** + * File containing the TemporaryRedirect ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * TemporaryRedirect value object visitor + */ +class TemporaryRedirect extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\TemporaryRedirect $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $visitor->setStatus( 307 ); + $visitor->setHeader( 'Location', $data->redirectUri ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Trash.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Trash.php new file mode 100644 index 0000000..e612c0e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Trash.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the Trash ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * Trash value object visitor + */ +class Trash extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\Trash $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'Trash' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Trash' ) ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'TrashItem' ); + + foreach ( $data->trashItems as $trashItem ) + { + $visitor->visitValueObject( $trashItem ); + } + + $generator->endList( 'TrashItem' ); + + $generator->endObjectElement( 'Trash' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php new file mode 100644 index 0000000..5935f62 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAlias.php @@ -0,0 +1,106 @@ +<?php +/** + * File containing the URLAlias ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\API\Repository\Values; + +/** + * URLAlias value object visitor + */ +class URLAlias extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UrlAlias' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UrlAlias' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'urlAlias', array( 'urlalias' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'id', $data->id ); + $generator->endAttribute( 'id' ); + + $generator->startAttribute( 'type', $this->serializeType( $data->type ) ); + $generator->endAttribute( 'type' ); + + if ( $data->type === Values\Content\URLAlias::LOCATION ) + { + $generator->startObjectElement( 'location', 'Location' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'locationById', array( 'location' => $data->destination ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'location' ); + } + else + { + $generator->startValueElement( 'resource', $data->destination ); + $generator->endValueElement( 'resource' ); + } + + $generator->startValueElement( 'path', $data->path ); + $generator->endValueElement( 'path' ); + + $generator->startValueElement( 'languageCodes', implode( ',', $data->languageCodes ) ); + $generator->endValueElement( 'languageCodes' ); + + $generator->startValueElement( 'alwaysAvailable', $this->serializeBool( $data->alwaysAvailable ) ); + $generator->endValueElement( 'alwaysAvailable' ); + + $generator->startValueElement( 'isHistory', $this->serializeBool( $data->isHistory ) ); + $generator->endValueElement( 'isHistory' ); + + $generator->startValueElement( 'forward', $this->serializeBool( $data->forward ) ); + $generator->endValueElement( 'forward' ); + + $generator->startValueElement( 'custom', $this->serializeBool( $data->isCustom ) ); + $generator->endValueElement( 'custom' ); + + $generator->endObjectElement( 'UrlAlias' ); + } + + /** + * Serializes the given $urlAliasType to a string representation + * + * @param int $urlAliasType + * + * @return string + */ + protected function serializeType( $urlAliasType ) + { + switch ( $urlAliasType ) + { + case Values\Content\URLAlias::LOCATION: + return 'LOCATION'; + + case Values\Content\URLAlias::RESOURCE: + return 'RESOURCE'; + + case Values\Content\URLAlias::VIRTUAL: + return 'VIRTUAL'; + } + + throw new \RuntimeException( "Unknown URL alias type: '{$urlAliasType}'." ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAliasList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAliasList.php new file mode 100644 index 0000000..7ae2909 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAliasList.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the URLAliasList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * URLAliasList value object visitor + */ +class URLAliasList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\URLAliasList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UrlAliasList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UrlAliasList' ) ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'UrlAlias' ); + foreach ( $data->urlAliases as $urlAlias ) + { + $visitor->visitValueObject( $urlAlias ); + } + $generator->endList( 'UrlAlias' ); + + $generator->endObjectElement( 'UrlAliasList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAliasRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAliasRefList.php new file mode 100644 index 0000000..1f4d6ac --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLAliasRefList.php @@ -0,0 +1,53 @@ +<?php +/** + * File containing the URLAliasRefList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * URLAliasRefList value object visitor + */ +class URLAliasRefList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\URLAliasRefList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UrlAliasRefList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UrlAliasRefList' ) ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'UrlAlias' ); + foreach ( $data->urlAliases as $urlAlias ) + { + $generator->startObjectElement( 'UrlAlias' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'urlAlias', array( 'urlalias' => $urlAlias->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->endObjectElement( 'UrlAlias' ); + } + $generator->endList( 'UrlAlias' ); + + $generator->endObjectElement( 'UrlAliasRefList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLWildcard.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLWildcard.php new file mode 100644 index 0000000..1ecb7bb --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLWildcard.php @@ -0,0 +1,53 @@ +<?php +/** + * File containing the URLWildcard ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * URLWildcard value object visitor + */ +class URLWildcard extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UrlWildcard' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UrlWildcard' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'urlWildcard', array( 'urlwildcard' => $data->id ) ) + ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'id', $data->id ); + $generator->endAttribute( 'id' ); + + $generator->startValueElement( 'sourceUrl', $data->sourceUrl ); + $generator->endValueElement( 'sourceUrl' ); + + $generator->startValueElement( 'destinationUrl', $data->destinationUrl ); + $generator->endValueElement( 'destinationUrl' ); + + $generator->startValueElement( 'forward', $data->forward ? 'true' : 'false' ); + $generator->endValueElement( 'forward' ); + + $generator->endObjectElement( 'UrlWildcard' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLWildcardList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLWildcardList.php new file mode 100644 index 0000000..8a85f54 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/URLWildcardList.php @@ -0,0 +1,48 @@ +<?php +/** + * File containing the URLWildcardList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * URLWildcardList value object visitor + */ +class URLWildcardList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\URLWildcardList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UrlWildcardList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UrlWildcardList' ) ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'urlWildcards' ) + ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'UrlWildcard' ); + foreach ( $data->urlWildcards as $urlWildcard ) + { + $visitor->visitValueObject( $urlWildcard ); + } + $generator->endList( 'UrlWildcard' ); + + $generator->endObjectElement( 'UrlWildcardList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UnauthorizedException.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UnauthorizedException.php new file mode 100644 index 0000000..bcff363 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UnauthorizedException.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the UnauthorizedException ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +/** + * UnauthorizedException value object visitor + */ +class UnauthorizedException extends Exception +{ + /** + * Returns HTTP status code + * + * @return int + */ + protected function getStatus() + { + return 401; + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupList.php new file mode 100644 index 0000000..1b3327e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the UserGroupList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * UserGroupList value object visitor + */ +class UserGroupList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\UserGroupList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UserGroupList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UserGroupList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'UserGroup' ); + foreach ( $data->userGroups as $userGroup ) + { + $visitor->visitValueObject( $userGroup ); + } + $generator->endList( 'UserGroup' ); + + $generator->endObjectElement( 'UserGroupList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php new file mode 100644 index 0000000..84a6ea9 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserGroupRefList.php @@ -0,0 +1,84 @@ +<?php +/** + * File containing the UserGroupRefList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * UserGroupRefList value object visitor + */ +class UserGroupRefList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\UserGroupRefList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UserGroupRefList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UserGroupRefList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $groupCount = count( $data->userGroups ); + + $generator->startList( 'UserGroup' ); + foreach ( $data->userGroups as $userGroup ) + { + $generator->startObjectElement( 'UserGroup' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'group', + array( + 'group' => rtrim( $userGroup->mainLocation->pathString, '/' ) + ) + ) + ); + $generator->endAttribute( 'href' ); + + if ( $data->userId !== null && $groupCount > 1 ) + { + $generator->startHashElement( 'unassign' ); + + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'userGroup', + array( + 'user' => $data->userId, + 'group' => '/' . $userGroup->mainLocation->path[count( $userGroup->mainLocation->path ) - 1] + ) + ) + ); + $generator->endAttribute( 'href' ); + + $generator->startAttribute( 'method', 'DELETE' ); + $generator->endAttribute( 'method' ); + + $generator->endHashElement( 'unassign' ); + } + + $generator->endObjectElement( 'UserGroup' ); + } + $generator->endList( 'UserGroup' ); + + $generator->endObjectElement( 'UserGroupRefList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserList.php new file mode 100644 index 0000000..a397be7 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserList.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the UserList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * UserList value object visitor + */ +class UserList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\UserList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UserList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UserList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'User' ); + foreach ( $data->users as $user ) + { + $visitor->visitValueObject( $user ); + } + $generator->endList( 'User' ); + + $generator->endObjectElement( 'UserList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php new file mode 100644 index 0000000..4e9ea55 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/UserRefList.php @@ -0,0 +1,52 @@ +<?php +/** + * File containing the UserRefList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * UserRefList value object visitor + */ +class UserRefList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\UserRefList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'UserRefList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'UserRefList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'User' ); + foreach ( $data->users as $user ) + { + $generator->startObjectElement( 'User' ); + + $generator->startAttribute( 'href', $this->urlHandler->generate( 'user', array( 'user' => $user->contentInfo->id ) ) ); + $generator->endAttribute( 'href' ); + + $generator->endObjectElement( 'User' ); + } + $generator->endList( 'User' ); + + $generator->endObjectElement( 'UserRefList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Version.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Version.php new file mode 100644 index 0000000..16f03b7 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/Version.php @@ -0,0 +1,126 @@ +<?php +/** + * File containing the Version ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\Core\REST\Common\Output\FieldTypeSerializer; +use eZ\Publish\Core\REST\Server\Values\RelationList as RelationListValue; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * Version value object visitor + */ +class Version extends ValueObjectVisitor +{ + /** + * @var \eZ\Publish\Core\REST\Common\Output\FieldTypeSerializer + */ + protected $fieldTypeSerializer; + + /** + * @param \eZ\Publish\Core\REST\Common\UrlHandler $urlHandler + * @param \eZ\Publish\Core\REST\Common\Output\FieldTypeSerializer $fieldTypeSerializer + */ + public function __construct( UrlHandler $urlHandler, FieldTypeSerializer $fieldTypeSerializer ) + { + parent::__construct( $urlHandler ); + $this->fieldTypeSerializer = $fieldTypeSerializer; + } + + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\Version $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $content = $data->content; + + $versionInfo = $content->getVersionInfo(); + $contentInfo = $versionInfo->getContentInfo(); + $contentType = $contentInfo->getContentType(); + + $generator->startObjectElement( 'Version' ); + + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'Version' ) ); + $visitor->setHeader( 'Accept-Patch', $generator->getMediaType( 'VersionUpdate' ) ); + + $path = $data->path; + if ( $path == null ) + { + $path = $this->urlHandler->generate( + 'objectVersion', + array( + 'object' => $content->id, + 'version' => $versionInfo->versionNo, + ) + ); + } + + $generator->startAttribute( 'href', $path ); + $generator->endAttribute( 'href' ); + + $visitor->visitValueObject( $versionInfo ); + + $generator->startHashElement( 'Fields' ); + $generator->startList( 'field' ); + foreach ( $content->getFields() as $field ) + { + $this->visitField( $generator, $contentType, $field ); + } + $generator->endList( 'field' ); + $generator->endHashElement( 'Fields' ); + + $visitor->visitValueObject( + new RelationListValue( + $data->relations, + $content->id, + $versionInfo->versionNo + ) + ); + + $generator->endObjectElement( 'Version' ); + } + + /** + * Visits a single content field and generates its content + * + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + */ + public function visitField( Generator $generator, ContentType $contentType, Field $field ) + { + $generator->startHashElement( 'field' ); + + $generator->startValueElement( 'id', $field->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'fieldDefinitionIdentifier', $field->fieldDefIdentifier ); + $generator->endValueElement( 'fieldDefinitionIdentifier' ); + + $generator->startValueElement( 'languageCode', $field->languageCode ); + $generator->endValueElement( 'languageCode' ); + + $this->fieldTypeSerializer->serializeFieldValue( + $generator, + $contentType, + $field + ); + + $generator->endHashElement( 'field' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php new file mode 100644 index 0000000..4170c7b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionInfo.php @@ -0,0 +1,115 @@ +<?php +/** + * File containing the VersionInfo ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; +use eZ\Publish\API\Repository\Values; + +/** + * VersionInfo value object visitor + */ +class VersionInfo extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $versionInfo = $data; + + $generator->startHashElement( 'VersionInfo' ); + + $generator->startValueElement( 'id', $versionInfo->id ); + $generator->endValueElement( 'id' ); + + $generator->startValueElement( 'versionNo', $versionInfo->versionNo ); + $generator->endValueElement( 'versionNo' ); + + $generator->startValueElement( + 'status', + $this->getStatusString( $versionInfo->status ) + ); + $generator->endValueElement( 'status' ); + + $generator->startValueElement( + 'modificationDate', + $versionInfo->modificationDate->format( 'c' ) + ); + $generator->endValueElement( 'modificationDate' ); + + $generator->startObjectElement( 'Creator', 'User' ); + $generator->startAttribute( + 'href', $this->urlHandler->generate( 'user', array( 'user' => $versionInfo->creatorId ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Creator' ); + + $generator->startValueElement( + 'creationDate', + $versionInfo->creationDate->format( 'c' ) + ); + $generator->endValueElement( 'creationDate' ); + + $generator->startValueElement( + 'initialLanguageCode', + $versionInfo->initialLanguageCode + ); + $generator->endValueElement( 'initialLanguageCode' ); + + $generator->startValueElement( + 'languageCodes', + implode( ',', $versionInfo->languageCodes ) + ); + $generator->endValueElement( 'languageCodes' ); + + $this->visitNamesList( $generator, $versionInfo->names ); + + $generator->startObjectElement( 'Content', 'ContentInfo' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( 'object', array( 'object' => $versionInfo->getContentInfo()->id ) ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Content' ); + + $generator->endHashElement( 'VersionInfo' ); + } + + /** + * Maps the given version $status to a representative string + * + * @param int $status + * + * @return string + */ + protected function getStatusString( $status ) + { + switch ( $status ) + { + case Values\Content\VersionInfo::STATUS_DRAFT: + return 'DRAFT'; + + case Values\Content\VersionInfo::STATUS_PUBLISHED: + return 'PUBLISHED'; + + case Values\Content\VersionInfo::STATUS_ARCHIVED: + return 'ARCHIVED'; + } + + // @todo FIXME: What exception to use? + throw new \Exception( 'Undefined version status: ' . $status ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionList.php b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionList.php new file mode 100644 index 0000000..5ae1857 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Output/ValueObjectVisitor/VersionList.php @@ -0,0 +1,65 @@ +<?php +/** + * File containing the VersionList ValueObjectVisitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Output\Generator; +use eZ\Publish\Core\REST\Common\Output\Visitor; + +/** + * VersionList value object visitor + */ +class VersionList extends ValueObjectVisitor +{ + /** + * Visit struct returned by controllers + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + * @param \eZ\Publish\Core\REST\Common\Output\Generator $generator + * @param \eZ\Publish\Core\REST\Server\Values\VersionList $data + */ + public function visit( Visitor $visitor, Generator $generator, $data ) + { + $generator->startObjectElement( 'VersionList' ); + $visitor->setHeader( 'Content-Type', $generator->getMediaType( 'VersionList' ) ); + //@todo Needs refactoring, disabling certain headers should not be done this way + $visitor->setHeader( 'Accept-Patch', false ); + + $generator->startAttribute( 'href', $data->path ); + $generator->endAttribute( 'href' ); + + $generator->startList( 'VersionItem' ); + foreach ( $data->versions as $version ) + { + $generator->startHashElement( 'VersionItem' ); + + $generator->startObjectElement( 'Version' ); + $generator->startAttribute( + 'href', + $this->urlHandler->generate( + 'objectVersion', + array( + 'object' => $version->getContentInfo()->id, + 'version' => $version->versionNo + ) + ) + ); + $generator->endAttribute( 'href' ); + $generator->endObjectElement( 'Version' ); + + $visitor->visitValueObject( $version ); + + $generator->endHashElement( 'VersionItem' ); + } + $generator->endList( 'VersionItem' ); + + $generator->endObjectElement( 'VersionList' ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Request.php b/eZ/Publish/Core/REST/Server/Request.php new file mode 100644 index 0000000..79edac8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Request.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the Request class. + * + * @copyright Copyright (C) 2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\Core\REST\Server; + +use Qafoo\RMF\Request\HTTP as RMFRequest; +use Qafoo\RMF\Request\PropertyHandler; + +/** + * Encapsulated RMF HTTP Request for REST server + */ +class Request extends RMFRequest +{ + /** + * Construct request from a set of handlers + * + * @param array $handlers + * + * @return \eZ\Publish\Core\REST\Server\Request + */ + public function __construct( array $handlers = array() ) + { + $this->addHandler( 'body', new PropertyHandler\RawBody() ); + + $this->addHandler( + 'contentType', + new PropertyHandler\Override( + array( + new PropertyHandler\Server( 'CONTENT_TYPE' ), + new PropertyHandler\Server( 'HTTP_CONTENT_TYPE' ), + ) + ) + ); + + $this->addHandler( + 'method', + new PropertyHandler\Override( + array( + new PropertyHandler\Server( 'HTTP_X_HTTP_METHOD_OVERRIDE' ), + new PropertyHandler\Server( 'REQUEST_METHOD' ), + ) + ) + ); + + $this->addHandler( 'destination', new PropertyHandler\Server( 'HTTP_DESTINATION' ) ); + + // @todo: ATTENTION, only used for test setup + $this->addHandler( 'testUser', new PropertyHandler\Server( 'HTTP_X_TEST_USER' ) ); + + parent::__construct( $handlers ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Authenticator/IntegrationTestTest.php b/eZ/Publish/Core/REST/Server/Tests/Authenticator/IntegrationTestTest.php new file mode 100644 index 0000000..857cbed --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Authenticator/IntegrationTestTest.php @@ -0,0 +1,106 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Authenticator; + +use eZ\Publish\Core\REST\Server\Tests\BaseTest; + +use eZ\Publish\Core\REST\Server\Authenticator\IntegrationTest; + +use Qafoo\RMF; + +/** + * IntegrationTestTest + */ +class IntegrationTestTest extends BaseTest +{ + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $repositoryMock; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $userServiceMock; + + public function testAuthenticate() + { + $auth = new IntegrationTest( $this->getRepositoryMock() ); + + $this->getUserServiceMock() + ->expects( $this->once() ) + ->method( 'loadUser' ) + ->with( 23 ) + ->will( + $this->returnValue( + $user = $this->getMock( 'eZ\\Publish\\API\\Repository\\Values\\User\\User' ) + ) + ); + + $this->getRepositoryMock() + ->expects( $this->once() ) + ->method( 'setCurrentUser' ) + ->with( $user ); + + $request = new RMF\Request(); + $request->testUser = 23; + + $auth->authenticate( $request ); + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepositoryMock() + { + if ( !isset( $this->repositoryMock ) ) + { + $this->repositoryMock = $this->getMock( + '\\eZ\\Publish\\API\\Repository\\Repository', + array(), + array(), + '', + false + ); + + $userServiceMock = $this->getUserServiceMock(); + + $this->repositoryMock->expects( $this->any() ) + ->method( 'getUserService' ) + ->will( + $this->returnCallback( + function () use ( $userServiceMock ) + { + return $userServiceMock; + } + ) + ); + } + return $this->repositoryMock; + } + + /** + * @return \eZ\Publish\API\Repository\UserService + */ + protected function getUserServiceMock() + { + if ( !isset( $this->userServiceMock ) ) + { + $this->userServiceMock = $this->getMock( + '\\eZ\\Publish\\API\\Repository\\UserService', + array(), + array(), + '', + false + ); + } + return $this->userServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/BaseTest.php b/eZ/Publish/Core/REST/Server/Tests/BaseTest.php new file mode 100644 index 0000000..05a905e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/BaseTest.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the BaseTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests; + +use PHPUnit_Framework_TestCase; + +/** + * Base test class. + */ +abstract class BaseTest extends PHPUnit_Framework_TestCase +{ +} diff --git a/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/BinaryInputProcessorTest.php b/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/BinaryInputProcessorTest.php new file mode 100644 index 0000000..e8f87be --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/BinaryInputProcessorTest.php @@ -0,0 +1,95 @@ +<?php +/** + * File containing the BinaryInputProcessorTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\FieldTypeProcessor; + +use eZ\Publish\Core\REST\Server\Tests\BaseTest; + +abstract class BinaryInputProcessorTest extends BaseTest +{ + private $tempDir; + + public function tearDown() + { + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator( + $this->getTempDir(), + \FileSystemIterator::KEY_AS_PATHNAME | \FileSystemIterator::SKIP_DOTS | \ FilesystemIterator::CURRENT_AS_FILEINFO + ), + \RecursiveIteratorIterator::CHILD_FIRST + ); + + parent::tearDown(); + } + + /** + * Returns a temp directory path and creates it, if necessary + * + * @return string The directory path + */ + protected function getTempDir() + { + if ( !isset( $this->tempDir ) ) + { + $tempFile = tempnam( + sys_get_temp_dir(), + 'eZ_REST_BinaryInput' + ); + + unlink( $tempFile ); + + $this->tempDir = $tempFile; + + mkdir( $this->tempDir ); + } + + return $this->tempDir; + } + + public function testPreProcessHashMissingKey() + { + $processor = $this->getProcessor(); + + $inputHash = array( 'foo' => 'bar' ); + + $outputHash = $processor->preProcessHash( $inputHash ); + + $this->assertEquals( $inputHash, $outputHash ); + } + + public function testPreProcessHash() + { + $processor = $this->getProcessor(); + + $fileContent = '42'; + + $inputHash = array( 'data' => base64_encode( $fileContent ) ); + + $outputHash = $processor->preProcessHash( $inputHash ); + + $this->assertFalse( isset( $outputHash['data'] ) ); + $this->assertTrue( isset( $outputHash['path'] ) ); + + $this->assertTrue( + file_exists( $outputHash['path'] ) + ); + + $this->assertEquals( + $fileContent, + file_get_contents( $outputHash['path'] ) + ); + } + + /** + * Returns the processor under test + * + * @return \eZ\Publish\Core\REST\Server\FieldTypeProcessor\BinaryInputProcessor + */ + abstract protected function getProcessor(); +} diff --git a/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/BinaryProcessorTest.php b/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/BinaryProcessorTest.php new file mode 100644 index 0000000..739d2e5 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/BinaryProcessorTest.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the BinaryProcessorTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\FieldTypeProcessor; + +use eZ\Publish\Core\REST\Server\FieldTypeProcessor\BinaryProcessor; + +class BinaryProcessorTest extends BinaryInputProcessorTest +{ + public function testPostProcessHash() + { + $processor = $this->getProcessor(); + + $inputHash = array( + 'path' => 'var/some_site/12ace8436c64ceb907536640b58788f0.pdf', + ); + + $outputHash = $processor->postProcessHash( $inputHash ); + + $this->assertEquals( + array( + 'path' => 'var/some_site/12ace8436c64ceb907536640b58788f0.pdf', + 'url' => 'http://example.com/binaries/12ace8436c64ceb907536640b58788f0', + ), + $outputHash + ); + } + + /** + * Returns the processor under test + * + * @return \eZ\Publish\Core\REST\Server\FieldTypeProcessor\BinaryInputProcessor + */ + protected function getProcessor() + { + return new BinaryProcessor( + $this->getTempDir(), + 'http://example.com/binaries/{path}' + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/ImageProcessorTest.php b/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/ImageProcessorTest.php new file mode 100644 index 0000000..dd8377b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/FieldTypeProcessor/ImageProcessorTest.php @@ -0,0 +1,62 @@ +<?php +/** + * File containing the ImageProcessorTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\FieldTypeProcessor; + +use eZ\Publish\Core\REST\Server\FieldTypeProcessor\ImageProcessor; + +class ImageProcessorTest extends BinaryInputProcessorTest +{ + public function testPostProcessHash() + { + $processor = $this->getProcessor(); + + $inputHash = array( + 'path' => 'var/some_site/223-1-eng-US/Cool-File.jpg', + ); + + $outputHash = $processor->postProcessHash( $inputHash ); + + $this->assertEquals( + array( + 'path' => 'var/some_site/223-1-eng-US/Cool-File.jpg', + 'variants' => array( + array( + 'variant' => 'original', + 'contentType' => 'image/jpeg', + 'url' => 'http://example.com/images/223-1/original', + ), + array( + 'variant' => 'thumbnail', + 'contentType' => 'image/png', + 'url' => 'http://example.com/images/223-1/thumbnail', + ), + ), + ), + $outputHash + ); + } + + /** + * Returns the processor under test + * + * @return \eZ\Publish\Core\REST\Server\FieldTypeProcessor\BinaryInputProcessor + */ + protected function getProcessor() + { + return new ImageProcessor( + $this->getTempDir(), + 'http://example.com/images/{fieldId}-{versionNo}/{variant}', + array( + 'original' => 'image/jpeg', + 'thumbnail' => 'image/png', + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/BaseTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/BaseTest.php new file mode 100644 index 0000000..bf239f1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/BaseTest.php @@ -0,0 +1,82 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Common\UrlHandler; +use eZ\Publish\Core\REST\Common\Input; + +/** + * Base test for input parsers. + */ +abstract class BaseTest extends \eZ\Publish\Core\REST\Server\Tests\BaseTest +{ + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher + */ + protected $parsingDispatcherMock; + + /** + * @var \eZ\Publish\Core\REST\Common\UrlHandler\eZPublish + */ + protected $urlHandler; + + /** + * @var \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected $parserTools; + + /** + * Get the parsing dispatcher + * + * @return \eZ\Publish\Core\REST\Common\Input\ParsingDispatcher + */ + protected function getParsingDispatcherMock() + { + if ( !isset( $this->parsingDispatcherMock ) ) + { + $this->parsingDispatcherMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\ParsingDispatcher', + array(), + array(), + '', + false + ); + } + return $this->parsingDispatcherMock; + } + + /** + * Get the URL handler + * + * @return \eZ\Publish\Core\REST\Common\UrlHandler\eZPublish + */ + protected function getUrlHandler() + { + if ( !isset( $this->urlHandler ) ) + { + $this->urlHandler = new UrlHandler\eZPublish; + } + return $this->urlHandler; + } + + /** + * Get the parser tools + * + * @return \eZ\Publish\Core\REST\Common\Input\ParserTools + */ + protected function getParserTools() + { + if ( !isset( $this->parserTools ) ) + { + $this->parserTools = new Input\ParserTools; + } + return $this->parserTools; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentCreateTest.php new file mode 100644 index 0000000..0435b0c --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentCreateTest.php @@ -0,0 +1,664 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\Core\Repository\Values\Content\ContentCreateStruct; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\REST\Server\Input\Parser\ContentCreate; +use eZ\Publish\Core\REST\Server\Input\Parser\LocationCreate; + +class ContentCreateTest extends BaseTest +{ + /** + * Tests the ContentCreate parser + */ + public function testParse() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $result = $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestContentCreateStruct', + $result, + 'ContentCreate not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentCreateStruct', + $result->contentCreateStruct, + 'contentCreateStruct not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $result->contentCreateStruct->contentType, + 'contentType not created correctly.' + ); + + $this->assertEquals( + 13, + $result->contentCreateStruct->contentType->id, + 'contentType not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->contentCreateStruct->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationCreateStruct', + $result->locationCreateStruct, + 'locationCreateStruct not created correctly.' + ); + + $this->assertEquals( + 4, + $result->contentCreateStruct->sectionId, + 'sectionId not created correctly' + ); + + $this->assertEquals( + true, + $result->contentCreateStruct->alwaysAvailable, + 'alwaysAvailable not created correctly' + ); + + $this->assertEquals( + 'remoteId12345678', + $result->contentCreateStruct->remoteId, + 'remoteId not created correctly' + ); + + $this->assertEquals( + 14, + $result->contentCreateStruct->ownerId, + 'ownerId not created correctly' + ); + + foreach ( $result->contentCreateStruct->fields as $field ) + { + $this->assertEquals( + 'foo', + $field->value, + 'field value not created correctly' + ); + } + } + + /** + * Test ContentCreate parser throwing exception on missing LocationCreate + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'LocationCreate' element for ContentCreate. + */ + public function testParseExceptionOnMissingLocationCreate() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on missing ContentType + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'ContentType' element for ContentCreate. + */ + public function testParseExceptionOnMissingContentType() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on invalid ContentType + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for ContentType element in ContentCreate. + */ + public function testParseExceptionOnInvalidContentType() + { + $inputArray = array( + 'ContentType' => array(), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on missing mainLanguageCode + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'mainLanguageCode' element for ContentCreate. + */ + public function testParseExceptionOnMissingMainLanguageCode() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on invalid Section + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for Section element in ContentCreate. + */ + public function testParseExceptionOnInvalidSection() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array(), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on invalid User + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for User element in ContentCreate. + */ + public function testParseExceptionOnInvalidUser() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array(), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on invalid fields data + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'fields' element for ContentCreate. + */ + public function testParseExceptionOnInvalidFields() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on missing field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldDefinitionIdentifier' element in field data for ContentCreate. + */ + public function testParseExceptionOnMissingFieldDefinitionIdentifier() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on invalid field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage 'unknown' is invalid field definition identifier for 'some_class' content type in ContentCreate. + */ + public function testParseExceptionOnInvalidFieldDefinitionIdentifier() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'unknown', + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentCreate parser throwing exception on missing field value + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldValue' element for 'subject' identifier in ContentCreate. + */ + public function testParseExceptionOnMissingFieldValue() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/13' + ), + 'mainLanguageCode' => 'eng-US', + 'LocationCreate' => array(), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'alwaysAvailable' => 'true', + 'remoteId' => 'remoteId12345678', + 'User' => array( + '_href' => '/user/users/14' + ), + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject' + ), + array( + 'fieldDefinitionIdentifier' => 'author', + 'fieldValue' => array() + ) + ) + ) + ); + + $contentCreate = $this->getContentCreate(); + $contentCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ContentCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ContentCreate + */ + protected function getContentCreate() + { + return new ContentCreate( + $this->getUrlHandler(), + $this->getContentServiceMock(), + $this->getContentTypeServiceMock(), + $this->getFieldTypeParserMock(), + $this->getLocationCreateParserMock(), + $this->getParserTools() + ); + } + + /** + * Get the field type parser mock object + * + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + */ + private function getFieldTypeParserMock() + { + $fieldTypeParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array( + $this->getContentServiceMock(), + $this->getContentTypeServiceMock(), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldTypeService', + array(), + array(), + '', + false + ) + ), + '', + false + ); + + $fieldTypeParserMock->expects( $this->any() ) + ->method( 'parseValue' ) + ->with( 'ezstring', array() ) + ->will( $this->returnValue( 'foo' ) ); + + return $fieldTypeParserMock; + } + + /** + * Returns the LocationCreate parser mock object + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\LocationCreate + */ + private function getLocationCreateParserMock() + { + $locationCreateParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Server\\Input\\Parser\\LocationCreate', + array(), + array(), + '', + false + ); + + $locationCreateParserMock->expects( $this->any() ) + ->method( 'parse' ) + ->with( array(), $this->getParsingDispatcherMock() ) + ->will( $this->returnValue( new LocationCreateStruct() ) ); + + return $locationCreateParserMock; + } + + /** + * Get the content service mock object + * + * @return \eZ\Publish\API\Repository\ContentService + */ + protected function getContentServiceMock() + { + $contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentService', + array(), + array(), + '', + false + ); + + $contentType = $this->getContentType(); + $contentServiceMock->expects( $this->any() ) + ->method( 'newContentCreateStruct' ) + ->with( + $this->equalTo( $contentType ), + $this->equalTo( 'eng-US' ) + ) + ->will( + $this->returnValue( + new ContentCreateStruct( + array( + 'contentType' => $contentType, + 'mainLanguageCode' => 'eng-US' + ) + ) + ) + ); + + return $contentServiceMock; + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'loadContentType' ) + ->with( $this->equalTo( 13 ) ) + ->will( $this->returnValue( $this->getContentType() ) ); + + return $contentTypeServiceMock; + } + + /** + * Get the content type used in ContentCreate parser + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected function getContentType() + { + return new ContentType( + array( + 'id' => 13, + 'identifier' => 'some_class', + 'fieldDefinitions' => array( + new FieldDefinition( + array( + 'id' => 42, + 'identifier' => 'subject', + 'fieldTypeIdentifier' => 'ezstring' + ) + ), + new FieldDefinition( + array( + 'id' => 43, + 'identifier' => 'author', + 'fieldTypeIdentifier' => 'ezstring' + ) + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentObjectStatesTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentObjectStatesTest.php new file mode 100644 index 0000000..22fe205 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentObjectStatesTest.php @@ -0,0 +1,98 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser; + +class ContentObjectStatesTest extends BaseTest +{ + /** + * Tests the ContentObjectStates parser + */ + public function testParse() + { + $inputArray = array( + 'ObjectState' => array( + array( + '_href' => '/content/objectstategroups/42/objectstates/21' + ) + ) + ); + + $objectState = $this->getParser(); + $result = $objectState->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInternalType( + 'array', + $result, + 'ContentObjectStates not parsed correctly' + ); + + $this->assertNotEmpty( + $result, + 'ContentObjectStates has no ObjectState elements' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\Core\\REST\\Common\\Values\\RestObjectState', + $result[0], + 'ObjectState not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $result[0]->objectState, + 'Inner ObjectState not created correctly.' + ); + + $this->assertEquals( + 21, + $result[0]->objectState->id, + 'Inner ObjectState id property not created correctly.' + ); + + $this->assertEquals( + 42, + $result[0]->groupId, + 'groupId property not created correctly.' + ); + } + + /** + * Test ContentObjectStates parser throwing exception on missing href + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for ObjectState. + */ + public function testParseExceptionOnMissingHref() + { + $inputArray = array( + 'ObjectState' => array( + array( + '_href' => '/content/objectstategroups/42/objectstates/21' + ), + array() + ) + ); + + $objectState = $this->getParser(); + $objectState->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Gets the ContentObjectStates parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ContentObjectStates; + */ + protected function getParser() + { + return new Parser\ContentObjectStates( $this->getUrlHandler() ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeCreateTest.php new file mode 100644 index 0000000..b6dcd1f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeCreateTest.php @@ -0,0 +1,330 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; +use eZ\Publish\Core\Repository\Values\ContentType\ContentTypeCreateStruct; +use eZ\Publish\Core\REST\Server\Input\Parser\ContentTypeCreate; +use eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionCreate; + +class ContentTypeCreateTest extends BaseTest +{ + /** + * Tests the ContentTypeCreate parser + */ + public function testParse() + { + $inputArray = $this->getInputArray(); + + $contentTypeCreate = $this->getContentTypeCreate(); + $result = $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeCreateStruct', + $result, + 'ContentTypeCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'new_content_type', + $result->identifier, + 'identifier not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertEquals( + 'remote123456', + $result->remoteId, + 'remoteId not created correctly' + ); + + $this->assertEquals( + '<title>', + $result->urlAliasSchema, + 'urlAliasSchema not created correctly' + ); + + $this->assertEquals( + '<title>', + $result->nameSchema, + 'nameSchema not created correctly' + ); + + $this->assertEquals( + true, + $result->isContainer, + 'isContainer not created correctly' + ); + + $this->assertEquals( + Location::SORT_FIELD_PATH, + $result->defaultSortField, + 'defaultSortField not created correctly' + ); + + $this->assertEquals( + Location::SORT_ORDER_ASC, + $result->defaultSortOrder, + 'defaultSortOrder not created correctly' + ); + + $this->assertEquals( + true, + $result->defaultAlwaysAvailable, + 'defaultAlwaysAvailable not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'New content type' ), + $result->names, + 'names not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'New content type description' ), + $result->descriptions, + 'descriptions not created correctly' + ); + + $this->assertEquals( + new \DateTime( '2012-12-31T12:30:00' ), + $result->creationDate, + 'creationDate not created correctly' + ); + + $this->assertEquals( + 14, + $result->creatorId, + 'creatorId not created correctly' + ); + + foreach ( $result->fieldDefinitions as $fieldDefinition ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionCreateStruct', + $fieldDefinition, + 'ContentTypeCreateStruct field definition not created correctly.' + ); + } + } + + /** + * Test ContentTypeCreate parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'identifier' element for ContentTypeCreate. + */ + public function testParseExceptionOnMissingIdentifier() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['identifier'] ); + + $contentTypeCreate = $this->getContentTypeCreate(); + $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeCreate parser throwing exception on missing mainLanguageCode + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'mainLanguageCode' element for ContentTypeCreate. + */ + public function testParseExceptionOnMissingMainLanguageCode() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['mainLanguageCode'] ); + + $contentTypeCreate = $this->getContentTypeCreate(); + $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeCreate parser throwing exception on invalid names + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'names' element for ContentTypeCreate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['names']['value'] ); + + $contentTypeCreate = $this->getContentTypeCreate(); + $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeCreate parser throwing exception on invalid descriptions + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'descriptions' element for ContentTypeCreate. + */ + public function testParseExceptionOnInvalidDescriptions() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['descriptions']['value'] ); + + $contentTypeCreate = $this->getContentTypeCreate(); + $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeCreate parser throwing exception on invalid User + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for User element in ContentTypeCreate. + */ + public function testParseExceptionOnInvalidUser() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['User']['_href'] ); + + $contentTypeCreate = $this->getContentTypeCreate(); + $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeCreate parser throwing exception on invalid FieldDefinitions + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'FieldDefinitions' element for ContentTypeCreate. + */ + public function testParseExceptionOnInvalidFieldDefinitions() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['FieldDefinitions']['FieldDefinition'] ); + + $contentTypeCreate = $this->getContentTypeCreate(); + $contentTypeCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ContentTypeCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ContentTypeCreate + */ + protected function getContentTypeCreate() + { + return new ContentTypeCreate( + $this->getUrlHandler(), + $this->getContentTypeServiceMock(), + $this->getFieldDefinitionCreateParserMock(), + $this->getParserTools() + ); + } + + /** + * Returns the FieldDefinitionCreate parser mock object + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionCreate + */ + private function getFieldDefinitionCreateParserMock() + { + $fieldDefinitionCreateParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Server\\Input\\Parser\\FieldDefinitionCreate', + array(), + array(), + '', + false + ); + + $fieldDefinitionCreateParserMock->expects( $this->any() ) + ->method( 'parse' ) + ->with( array(), $this->getParsingDispatcherMock() ) + ->will( $this->returnValue( new FieldDefinitionCreateStruct() ) ); + + return $fieldDefinitionCreateParserMock; + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'newContentTypeCreateStruct' ) + ->with( $this->equalTo( 'new_content_type' ) ) + ->will( + $this->returnValue( + new ContentTypeCreateStruct( + array( + 'identifier' => 'new_content_type' + ) + ) + ) + ); + + return $contentTypeServiceMock; + } + + /** + * Returns the array under test + * + * @return array + */ + protected function getInputArray() + { + return array( + 'identifier' => 'new_content_type', + 'mainLanguageCode' => 'eng-US', + 'remoteId' => 'remote123456', + 'urlAliasSchema' => '<title>', + 'nameSchema' => '<title>', + 'isContainer' => 'true', + 'defaultSortField' => 'PATH', + 'defaultSortOrder' => 'ASC', + 'defaultAlwaysAvailable' => 'true', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'New content type' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'New content type description' + ) + ) + ), + 'modificationDate' => '2012-12-31T12:30:00', + 'User' => array( + '_href' => '/user/users/14' + ), + + // mocked + 'FieldDefinitions' => array( + 'FieldDefinition' => array( + array(), + array() + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeGroupInputTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeGroupInputTest.php new file mode 100644 index 0000000..7c86951 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeGroupInputTest.php @@ -0,0 +1,114 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\ContentTypeGroupInput; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct; + +class ContentTypeGroupInputTest extends BaseTest +{ + /** + * Tests the ContentTypeGroupInput parser + */ + public function testParse() + { + $inputArray = array( + 'identifier' => 'Identifier Bar', + 'User' => array( + '_href' => '/user/users/14' + ), + 'modificationDate' => '2012-12-31T12:00:00' + ); + + $contentTypeGroupInput = $this->getContentTypeGroupInput(); + $result = $contentTypeGroupInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupCreateStruct', + $result, + 'ContentTypeGroupCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'Identifier Bar', + $result->identifier, + 'ContentTypeGroupCreateStruct identifier property not created correctly.' + ); + + $this->assertEquals( + 14, + $result->creatorId, + 'ContentTypeGroupCreateStruct creatorId property not created correctly.' + ); + + $this->assertEquals( + new \DateTime( '2012-12-31T12:00:00' ), + $result->creationDate, + 'ContentTypeGroupCreateStruct creationDate property not created correctly.' + ); + } + + /** + * Test ContentTypeGroupInput parser throwing exception on invalid User + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for User element in ContentTypeGroupInput. + */ + public function testParseExceptionOnInvalidUser() + { + $inputArray = array( + 'identifier' => 'Identifier Bar', + 'User' => array(), + 'modificationDate' => '2012-12-31T12:00:00' + ); + + $contentTypeGroupInput = $this->getContentTypeGroupInput(); + $contentTypeGroupInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the content type group input parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ContentTypeGroupInput + */ + protected function getContentTypeGroupInput() + { + return new ContentTypeGroupInput( + $this->getUrlHandler(), + $this->getContentTypeServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'newContentTypeGroupCreateStruct' ) + ->with( $this->equalTo( 'Identifier Bar' ) ) + ->will( + $this->returnValue( new ContentTypeGroupCreateStruct( array( 'identifier' => 'Identifier Bar' ) ) ) + ); + + return $contentTypeServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeUpdateTest.php new file mode 100644 index 0000000..bc066ac --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentTypeUpdateTest.php @@ -0,0 +1,233 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct; +use eZ\Publish\Core\REST\Server\Input\Parser\ContentTypeUpdate; + +class ContentTypeUpdateTest extends BaseTest +{ + /** + * Tests the ContentTypeUpdate parser + */ + public function testParse() + { + $inputArray = $this->getInputArray(); + + $contentTypeUpdate = $this->getContentTypeUpdate(); + $result = $contentTypeUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeUpdateStruct', + $result, + 'ContentTypeUpdateStruct not created correctly.' + ); + + $this->assertEquals( + 'updated_content_type', + $result->identifier, + 'identifier not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertEquals( + 'remote123456', + $result->remoteId, + 'remoteId not created correctly' + ); + + $this->assertEquals( + '<title>', + $result->urlAliasSchema, + 'urlAliasSchema not created correctly' + ); + + $this->assertEquals( + '<title>', + $result->nameSchema, + 'nameSchema not created correctly' + ); + + $this->assertEquals( + true, + $result->isContainer, + 'isContainer not created correctly' + ); + + $this->assertEquals( + Location::SORT_FIELD_PATH, + $result->defaultSortField, + 'defaultSortField not created correctly' + ); + + $this->assertEquals( + Location::SORT_ORDER_ASC, + $result->defaultSortOrder, + 'defaultSortOrder not created correctly' + ); + + $this->assertEquals( + true, + $result->defaultAlwaysAvailable, + 'defaultAlwaysAvailable not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'Updated content type' ), + $result->names, + 'names not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'Updated content type description' ), + $result->descriptions, + 'descriptions not created correctly' + ); + + $this->assertEquals( + new \DateTime( '2012-12-31T12:30:00' ), + $result->modificationDate, + 'creationDate not created correctly' + ); + + $this->assertEquals( + 14, + $result->modifierId, + 'creatorId not created correctly' + ); + } + + /** + * Test ContentTypeUpdate parser throwing exception on invalid names + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'names' element for ContentTypeUpdate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['names']['value'] ); + + $contentTypeUpdate = $this->getContentTypeUpdate(); + $contentTypeUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeUpdate parser throwing exception on invalid descriptions + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'descriptions' element for ContentTypeUpdate. + */ + public function testParseExceptionOnInvalidDescriptions() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['descriptions']['value'] ); + + $contentTypeUpdate = $this->getContentTypeUpdate(); + $contentTypeUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ContentTypeUpdate parser throwing exception on invalid User + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for User element in ContentTypeUpdate. + */ + public function testParseExceptionOnInvalidUser() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['User']['_href'] ); + + $contentTypeUpdate = $this->getContentTypeUpdate(); + $contentTypeUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ContentTypeUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ContentTypeUpdate + */ + protected function getContentTypeUpdate() + { + return new ContentTypeUpdate( + $this->getUrlHandler(), + $this->getContentTypeServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'newContentTypeUpdateStruct' ) + ->will( $this->returnValue( new ContentTypeUpdateStruct() ) ); + + return $contentTypeServiceMock; + } + + /** + * Returns the array under test + * + * @return array + */ + protected function getInputArray() + { + return array( + 'identifier' => 'updated_content_type', + 'mainLanguageCode' => 'eng-US', + 'remoteId' => 'remote123456', + 'urlAliasSchema' => '<title>', + 'nameSchema' => '<title>', + 'isContainer' => 'true', + 'defaultSortField' => 'PATH', + 'defaultSortOrder' => 'ASC', + 'defaultAlwaysAvailable' => 'true', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'Updated content type' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'Updated content type description' + ) + ) + ), + 'modificationDate' => '2012-12-31T12:30:00', + 'User' => array( + '_href' => '/user/users/14' + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentUpdateTest.php new file mode 100644 index 0000000..6d9b6fe --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ContentUpdateTest.php @@ -0,0 +1,189 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\ContentUpdate as ContentUpdateParser; +use eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct; +use DateTime; + +class ContentUpdateTest extends BaseTest +{ + /** + * Tests the ContentUpdate parser + * + * @return \eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct + */ + public function testParseValid() + { + $inputArray = $this->getValidInputData(); + + $contentUpdateParser = $this->getContentUpdate(); + $result = $contentUpdateParser->parse( + $inputArray, + $this->getParsingDispatcherMock() + ); + + self::assertEquals( + $this->getContentUpdateStruct(), + $result + ); + + return $result; + } + + /** + * Test for valid owner ID value in result + * + * @param \eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct $result + * + * @depends testParseValid + */ + public function testParserResultOwner( RestContentMetadataUpdateStruct $result ) + { + $this->assertEquals( + '42', + $result->ownerId + ); + } + + /** + * Tests that invalid _href attribute throw the appropriate exception + * + * @dataProvider providerForTestParseFailureInvalidHref + */ + public function testParseFailureInvalidHref( $element, $exceptionMessage ) + { + $inputArray = $this->getValidInputData(); + $inputArray[$element]['_href'] = '/invalid/section/uri'; + + $contentUpdateParser = $this->getContentUpdate(); + + try + { + $contentUpdateParser->parse( + $inputArray, + $this->getParsingDispatcherMock() + ); + } + catch ( \eZ\Publish\Core\REST\Common\Exceptions\Parser $e ) + { + if ( $e->getMessage() != $exceptionMessage ) + { + self::fail( "Failed asserting that exception message '" . $e->getMessage() . "' contains '$exceptionMessage'." ); + } + $exceptionThrown = true; + } + + if ( !isset( $exceptionThrown ) ) + { + self::fail( "Failed asserting that exception of type \"\\eZ\\Publish\\Core\\REST\\Common\\Exceptions\\Parser\" is thrown." ); + } + } + + public function providerForTestParseFailureInvalidHref() + { + return array( + array( 'Section', 'Invalid format for <Section> reference in <ContentUpdate>.' ), + array( 'MainLocation', "Invalid format for <MainLocation> reference in <ContentUpdate>." ), + array( 'Owner', "Invalid format for <Owner> reference in <ContentUpdate>." ) + ); + } + + /** + * Tests that invalid dates will fail at parsing + * @dataProvider providerForTestParseFailureInvalidDate + */ + public function testParseFailureInvalidDate( $element, $exceptionMessage ) + { + $inputArray = $this->getValidInputData(); + $inputArray[$element] = 42; + + $contentUpdateParser = $this->getContentUpdate(); + + try + { + $contentUpdateParser->parse( + $inputArray, + $this->getParsingDispatcherMock() + ); + } + catch ( \eZ\Publish\Core\REST\Common\Exceptions\Parser $e ) + { + if ( $e->getMessage() != $exceptionMessage ) + { + self::fail( "Failed asserting that exception message '" . $e->getMessage() . "' contains '$exceptionMessage'." ); + } + $exceptionThrown = true; + } + + if ( !isset( $exceptionThrown ) ) + { + self::fail( "Failed asserting that exception of type \"\\eZ\\Publish\\Core\\REST\\Common\\Exceptions\\Parser\" is thrown." ); + } + } + + public function providerForTestParseFailureInvalidDate() + { + return array( + array( 'publishDate', "Invalid format for <publishDate> in <ContentUpdate>" ), + array( 'modificationDate', "Invalid format for <modificationDate> in <ContentUpdate>" ) + ); + } + + /** + * Returns the ContentUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ContentUpdate + */ + protected function getContentUpdate() + { + return new ContentUpdateParser( $this->getUrlHandler() ); + } + + /** + * Returns a valid RestContentMetadataUpdateStruct that matches the structure from getValidInputData() + * + * @return \eZ\Publish\Core\REST\Common\Values\RestContentMetadataUpdateStruct + */ + protected function getContentUpdateStruct() + { + return new RestContentMetadataUpdateStruct( + array( + 'mainLanguageCode' => 'eng-GB', + 'sectionId' => '23', + 'mainLocationId' => '/1/2/55', + 'ownerId' => '42', + 'alwaysAvailable' => false, + 'remoteId' => '7e7afb135e50490a281dafc0aafb6dac', + 'modificationDate' => new DateTime( '19/Sept/2012:14:05:00 +0200' ), + 'publishedDate' => new DateTime( '19/Sept/2012:14:05:00 +0200' ) + ) + ); + } + + /** + * Returns an array of valid input data for the parser. + * + * @return array + */ + protected function getValidInputData() + { + return array( + 'mainLanguageCode' => 'eng-GB', + 'Section' => array( '_href' => '/content/sections/23' ), + 'MainLocation' => array( '_href' => '/content/locations/1/2/55' ), + 'Owner' => array( '_href' => '/user/users/42' ), + 'alwaysAvailable' => 'false', + 'remoteId' => '7e7afb135e50490a281dafc0aafb6dac', + 'modificationDate' => '19/Sept/2012:14:05:00 +0200', + 'publishDate' => '19/Sept/2012:14:05:00 +0200' + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/FieldDefinitionCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/FieldDefinitionCreateTest.php new file mode 100644 index 0000000..ea68dd5 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/FieldDefinitionCreateTest.php @@ -0,0 +1,244 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; +use eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionCreate; + +/** + * @todo Test with fieldSettings and validatorConfiguration when specified + */ +class FieldDefinitionCreateTest extends BaseTest +{ + /** + * Tests the FieldDefinitionCreate parser + */ + public function testParse() + { + $inputArray = $this->getInputArray(); + + $fieldDefinitionCreate = $this->getFieldDefinitionCreate(); + $result = $fieldDefinitionCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionCreateStruct', + $result, + 'FieldDefinitionCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'title', + $result->identifier, + 'identifier not created correctly' + ); + + $this->assertEquals( + 'ezstring', + $result->fieldTypeIdentifier, + 'fieldTypeIdentifier not created correctly' + ); + + $this->assertEquals( + 'content', + $result->fieldGroup, + 'fieldGroup not created correctly' + ); + + $this->assertEquals( + 1, + $result->position, + 'position not created correctly' + ); + + $this->assertEquals( + true, + $result->isTranslatable, + 'isTranslatable not created correctly' + ); + + $this->assertEquals( + true, + $result->isRequired, + 'isRequired not created correctly' + ); + + $this->assertEquals( + true, + $result->isInfoCollector, + 'isInfoCollector not created correctly' + ); + + $this->assertEquals( + true, + $result->isSearchable, + 'isSearchable not created correctly' + ); + + $this->assertEquals( + 'New title', + $result->defaultValue, + 'defaultValue not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'Title' ), + $result->names, + 'names not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'This is the title' ), + $result->descriptions, + 'descriptions not created correctly' + ); + } + + /** + * Test FieldDefinitionCreate parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'identifier' element for FieldDefinitionCreate. + */ + public function testParseExceptionOnMissingIdentifier() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['identifier'] ); + + $fieldDefinitionCreate = $this->getFieldDefinitionCreate(); + $fieldDefinitionCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test FieldDefinitionCreate parser throwing exception on missing fieldType + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldType' element for FieldDefinitionCreate. + */ + public function testParseExceptionOnMissingFieldType() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['fieldType'] ); + + $fieldDefinitionCreate = $this->getFieldDefinitionCreate(); + $fieldDefinitionCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test FieldDefinitionCreate parser throwing exception on invalid names + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'names' element for FieldDefinitionCreate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['names']['value'] ); + + $fieldDefinitionCreate = $this->getFieldDefinitionCreate(); + $fieldDefinitionCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test FieldDefinitionCreate parser throwing exception on invalid descriptions + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'descriptions' element for FieldDefinitionCreate. + */ + public function testParseExceptionOnInvalidDescriptions() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['descriptions']['value'] ); + + $fieldDefinitionCreate = $this->getFieldDefinitionCreate(); + $fieldDefinitionCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the FieldDefinitionCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionCreate + */ + protected function getFieldDefinitionCreate() + { + return new FieldDefinitionCreate( + $this->getUrlHandler(), + $this->getContentTypeServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'newFieldDefinitionCreateStruct' ) + ->with( $this->equalTo( 'title' ), $this->equalTo( 'ezstring' ) ) + ->will( + $this->returnValue( + new FieldDefinitionCreateStruct( + array( + 'identifier' => 'title', + 'fieldTypeIdentifier' => 'ezstring' + ) + ) + ) + ); + + return $contentTypeServiceMock; + } + + /** + * Returns the array under test + * + * @return array + */ + protected function getInputArray() + { + return array( + 'identifier' => 'title', + 'fieldType' => 'ezstring', + 'fieldGroup' => 'content', + 'position' => '1', + 'isTranslatable' => 'true', + 'isRequired' => 'true', + 'isInfoCollector' => 'true', + 'isSearchable' => 'true', + 'defaultValue' => 'New title', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'Title' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'This is the title' + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/FieldDefinitionUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/FieldDefinitionUpdateTest.php new file mode 100644 index 0000000..d165ff1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/FieldDefinitionUpdateTest.php @@ -0,0 +1,201 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct; +use eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionUpdate; + +/** + * @todo Test with fieldSettings and validatorConfiguration when specified + */ +class FieldDefinitionUpdateTest extends BaseTest +{ + /** + * Tests the FieldDefinitionUpdate parser + */ + public function testParse() + { + $inputArray = $this->getInputArray(); + + $fieldDefinitionUpdate = $this->getFieldDefinitionUpdate(); + $result = $fieldDefinitionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionUpdateStruct', + $result, + 'FieldDefinitionUpdateStruct not created correctly.' + ); + + $this->assertEquals( + 'title', + $result->identifier, + 'identifier not created correctly' + ); + + $this->assertEquals( + 'content', + $result->fieldGroup, + 'fieldGroup not created correctly' + ); + + $this->assertEquals( + 1, + $result->position, + 'position not created correctly' + ); + + $this->assertEquals( + true, + $result->isTranslatable, + 'isTranslatable not created correctly' + ); + + $this->assertEquals( + true, + $result->isRequired, + 'isRequired not created correctly' + ); + + $this->assertEquals( + true, + $result->isInfoCollector, + 'isInfoCollector not created correctly' + ); + + $this->assertEquals( + true, + $result->isSearchable, + 'isSearchable not created correctly' + ); + + $this->assertEquals( + 'New title', + $result->defaultValue, + 'defaultValue not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'Title' ), + $result->names, + 'names not created correctly' + ); + + $this->assertEquals( + array( 'eng-US' => 'This is the title' ), + $result->descriptions, + 'descriptions not created correctly' + ); + } + + /** + * Test FieldDefinitionUpdate parser throwing exception on invalid names + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'names' element for FieldDefinitionUpdate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['names']['value'] ); + + $fieldDefinitionUpdate = $this->getFieldDefinitionUpdate(); + $fieldDefinitionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test FieldDefinitionUpdate parser throwing exception on invalid descriptions + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'descriptions' element for FieldDefinitionUpdate. + */ + public function testParseExceptionOnInvalidDescriptions() + { + $inputArray = $this->getInputArray(); + unset( $inputArray['descriptions']['value'] ); + + $fieldDefinitionUpdate = $this->getFieldDefinitionUpdate(); + $fieldDefinitionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the FieldDefinitionUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\FieldDefinitionUpdate + */ + protected function getFieldDefinitionUpdate() + { + return new FieldDefinitionUpdate( + $this->getUrlHandler(), + $this->getContentTypeServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'newFieldDefinitionUpdateStruct' ) + ->will( + $this->returnValue( + new FieldDefinitionUpdateStruct() + ) + ); + + return $contentTypeServiceMock; + } + + /** + * Returns the array under test + * + * @return array + */ + protected function getInputArray() + { + return array( + 'identifier' => 'title', + 'fieldGroup' => 'content', + 'position' => '1', + 'isTranslatable' => 'true', + 'isRequired' => 'true', + 'isInfoCollector' => 'true', + 'isSearchable' => 'true', + 'defaultValue' => 'New title', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'Title' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-US', + '#text' => 'This is the title' + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/LocationCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/LocationCreateTest.php new file mode 100644 index 0000000..385931e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/LocationCreateTest.php @@ -0,0 +1,203 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\LocationCreate; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Location; + +class LocationCreateTest extends BaseTest +{ + /** + * Tests the LocationCreate parser + */ + public function testParse() + { + $inputArray = array( + 'ParentLocation' => array( + '_href' => '/content/locations/1/2/42' + ), + 'priority' => '2', + 'hidden' => 'true', + 'remoteId' => 'remoteId12345678', + 'sortField' => 'PATH', + 'sortOrder' => 'ASC' + ); + + $locationCreate = $this->getLocationCreate(); + $result = $locationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationCreateStruct', + $result, + 'LocationCreateStruct not created correctly.' + ); + + $this->assertEquals( + 42, + $result->parentLocationId, + 'LocationCreateStruct parentLocationId property not created correctly.' + ); + + $this->assertEquals( + 2, + $result->priority, + 'LocationCreateStruct priority property not created correctly.' + ); + + $this->assertEquals( + true, + $result->hidden, + 'LocationCreateStruct hidden property not created correctly.' + ); + + $this->assertEquals( + 'remoteId12345678', + $result->remoteId, + 'LocationCreateStruct remoteId property not created correctly.' + ); + + $this->assertEquals( + Location::SORT_FIELD_PATH, + $result->sortField, + 'LocationCreateStruct sortField property not created correctly.' + ); + + $this->assertEquals( + Location::SORT_ORDER_ASC, + $result->sortOrder, + 'LocationCreateStruct sortOrder property not created correctly.' + ); + } + + /** + * Test LocationCreate parser throwing exception on missing ParentLocation + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'ParentLocation' element for LocationCreate. + */ + public function testParseExceptionOnMissingParentLocation() + { + $inputArray = array( + 'priority' => '0', + 'hidden' => 'false', + 'remoteId' => 'remoteId12345678', + 'sortField' => 'PATH', + 'sortOrder' => 'ASC' + ); + + $locationCreate = $this->getLocationCreate(); + $locationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test LocationCreate parser throwing exception on missing _href attribute for ParentLocation + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for ParentLocation element in LocationCreate. + */ + public function testParseExceptionOnMissingHrefAttribute() + { + $inputArray = array( + 'ParentLocation' => array(), + 'priority' => '0', + 'hidden' => 'false', + 'remoteId' => 'remoteId12345678', + 'sortField' => 'PATH', + 'sortOrder' => 'ASC' + ); + + $locationCreate = $this->getLocationCreate(); + $locationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test LocationCreate parser throwing exception on missing sort field + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'sortField' element for LocationCreate. + */ + public function testParseExceptionOnMissingSortField() + { + $inputArray = array( + 'ParentLocation' => array( + '_href' => '/content/locations/1/2/42' + ), + 'priority' => '0', + 'hidden' => 'false', + 'remoteId' => 'remoteId12345678', + 'sortOrder' => 'ASC' + ); + + $locationCreate = $this->getLocationCreate(); + $locationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test LocationCreate parser throwing exception on missing sort order + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'sortOrder' element for LocationCreate. + */ + public function testParseExceptionOnMissingSortOrder() + { + $inputArray = array( + 'ParentLocation' => array( + '_href' => '/content/locations/1/2/42' + ), + 'priority' => '0', + 'hidden' => 'false', + 'remoteId' => 'remoteId12345678', + 'sortField' => 'PATH' + ); + + $locationCreate = $this->getLocationCreate(); + $locationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the LocationCreateStruct parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\LocationCreate + */ + protected function getLocationCreate() + { + return new LocationCreate( + $this->getUrlHandler(), + $this->getLocationServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the location service mock object + * + * @return \eZ\Publish\API\Repository\LocationService + */ + protected function getLocationServiceMock() + { + $locationServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\LocationService', + array(), + array(), + '', + false + ); + + $locationServiceMock->expects( $this->any() ) + ->method( 'newLocationCreateStruct' ) + ->with( $this->equalTo( 42 ) ) + ->will( + $this->returnValue( new LocationCreateStruct( array( 'parentLocationId' => 42 ) ) ) + ); + + return $locationServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/LocationUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/LocationUpdateTest.php new file mode 100644 index 0000000..70cffa6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/LocationUpdateTest.php @@ -0,0 +1,150 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\LocationUpdate; +use eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\Location; + +class LocationUpdateTest extends BaseTest +{ + /** + * Tests the LocationUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'priority' => 0, + 'remoteId' => 'remote-id', + 'hidden' => 'true', + 'sortField' => 'PATH', + 'sortOrder' => 'ASC' + ); + + $locationUpdate = $this->getLocationUpdate(); + $result = $locationUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestLocationUpdateStruct', + $result, + 'LocationUpdateStruct not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationUpdateStruct', + $result->locationUpdateStruct, + 'LocationUpdateStruct not created correctly.' + ); + + $this->assertEquals( + 0, + $result->locationUpdateStruct->priority, + 'LocationUpdateStruct priority property not created correctly.' + ); + + $this->assertEquals( + 'remote-id', + $result->locationUpdateStruct->remoteId, + 'LocationUpdateStruct remoteId property not created correctly.' + ); + + $this->assertEquals( + true, + $result->hidden, + 'hidden property not created correctly.' + ); + + $this->assertEquals( + Location::SORT_FIELD_PATH, + $result->locationUpdateStruct->sortField, + 'LocationUpdateStruct sortField property not created correctly.' + ); + + $this->assertEquals( + Location::SORT_ORDER_ASC, + $result->locationUpdateStruct->sortOrder, + 'LocationUpdateStruct sortOrder property not created correctly.' + ); + } + + /** + * Test LocationUpdate parser throwing exception on missing sort field + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'sortField' element for LocationUpdate. + */ + public function testParseExceptionOnMissingSortField() + { + $inputArray = array( + 'priority' => 0, + 'remoteId' => 'remote-id', + 'sortOrder' => 'ASC' + ); + + $locationUpdate = $this->getLocationUpdate(); + $locationUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test LocationUpdate parser throwing exception on missing sort order + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'sortOrder' element for LocationUpdate. + */ + public function testParseExceptionOnMissingSortOrder() + { + $inputArray = array( + 'priority' => 0, + 'remoteId' => 'remote-id', + 'sortField' => 'PATH' + ); + + $locationUpdate = $this->getLocationUpdate(); + $locationUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the LocationUpdateStruct parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\LocationUpdate + */ + protected function getLocationUpdate() + { + return new LocationUpdate( + $this->getUrlHandler(), + $this->getLocationServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the location service mock object + * + * @return \eZ\Publish\API\Repository\LocationService + */ + protected function getLocationServiceMock() + { + $locationServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\LocationService', + array(), + array(), + '', + false + ); + + $locationServiceMock->expects( $this->any() ) + ->method( 'newLocationUpdateStruct' ) + ->will( + $this->returnValue( new LocationUpdateStruct() ) + ); + + return $locationServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateCreateTest.php new file mode 100644 index 0000000..39553c9 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateCreateTest.php @@ -0,0 +1,274 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateCreate; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct; + +class ObjectStateCreateTest extends BaseTest +{ + /** + * Tests the ObjectStateCreate parser + */ + public function testParse() + { + $inputArray = array( + 'identifier' => 'test-state', + 'priority' => '0', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateCreate = $this->getObjectStateCreate(); + $result = $objectStateCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateCreateStruct', + $result, + 'ObjectStateCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'test-state', + $result->identifier, + 'ObjectStateCreateStruct identifier property not created correctly.' + ); + + $this->assertEquals( + 0, + $result->priority, + 'ObjectStateCreateStruct priority property not created correctly.' + ); + + $this->assertEquals( + 'eng-GB', + $result->defaultLanguageCode, + 'ObjectStateCreateStruct defaultLanguageCode property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test state' ), + $result->names, + 'ObjectStateCreateStruct names property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test description' ), + $result->descriptions, + 'ObjectStateCreateStruct descriptions property not created correctly.' + ); + } + + /** + * Test ObjectStateCreate parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'identifier' attribute for ObjectStateCreate. + */ + public function testParseExceptionOnMissingIdentifier() + { + $inputArray = array( + 'priority' => '0', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateCreate = $this->getObjectStateCreate(); + $objectStateCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateCreate parser throwing exception on missing priority + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'priority' attribute for ObjectStateCreate. + */ + public function testParseExceptionOnMissingPriority() + { + $inputArray = array( + 'identifier' => 'test-state', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateCreate = $this->getObjectStateCreate(); + $objectStateCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateCreate parser throwing exception on missing defaultLanguageCode + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'defaultLanguageCode' attribute for ObjectStateCreate. + */ + public function testParseExceptionOnMissingDefaultLanguageCode() + { + $inputArray = array( + 'identifier' => 'test-state', + 'priority' => '0', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateCreate = $this->getObjectStateCreate(); + $objectStateCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateCreate parser throwing exception on missing names + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'names' element for ObjectStateCreate. + */ + public function testParseExceptionOnMissingNames() + { + $inputArray = array( + 'identifier' => 'test-state', + 'priority' => '0', + 'defaultLanguageCode' => 'eng-GB', + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateCreate = $this->getObjectStateCreate(); + $objectStateCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateCreate parser throwing exception on invalid names structure + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'names' element for ObjectStateCreate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = array( + 'identifier' => 'test-state', + 'priority' => '0', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array(), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateCreate = $this->getObjectStateCreate(); + $objectStateCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ObjectStateCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateCreate + */ + protected function getObjectStateCreate() + { + return new ObjectStateCreate( + $this->getUrlHandler(), + $this->getObjectStateServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the object state service mock object + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + protected function getObjectStateServiceMock() + { + $objectStateServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ObjectStateService', + array(), + array(), + '', + false + ); + + $objectStateServiceMock->expects( $this->any() ) + ->method( 'newObjectStateCreateStruct' ) + ->with( $this->equalTo( 'test-state' ) ) + ->will( + $this->returnValue( new ObjectStateCreateStruct( array( 'identifier' => 'test-state' ) ) ) + ); + + return $objectStateServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateGroupCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateGroupCreateTest.php new file mode 100644 index 0000000..8e96ba1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateGroupCreateTest.php @@ -0,0 +1,230 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateGroupCreate; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct; + +class ObjectStateGroupCreateTest extends BaseTest +{ + /** + * Tests the ObjectStateGroupCreate parser + */ + public function testParse() + { + $inputArray = array( + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupCreate = $this->getObjectStateGroupCreate(); + $result = $objectStateGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupCreateStruct', + $result, + 'ObjectStateGroupCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'test-group', + $result->identifier, + 'ObjectStateGroupCreateStruct identifier property not created correctly.' + ); + + $this->assertEquals( + 'eng-GB', + $result->defaultLanguageCode, + 'ObjectStateGroupCreateStruct defaultLanguageCode property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test group' ), + $result->names, + 'ObjectStateGroupCreateStruct names property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test group description' ), + $result->descriptions, + 'ObjectStateGroupCreateStruct descriptions property not created correctly.' + ); + } + + /** + * Test ObjectStateGroupCreate parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'identifier' attribute for ObjectStateGroupCreate. + */ + public function testParseExceptionOnMissingIdentifier() + { + $inputArray = array( + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupCreate = $this->getObjectStateGroupCreate(); + $objectStateGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateGroupCreate parser throwing exception on missing defaultLanguageCode + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'defaultLanguageCode' attribute for ObjectStateGroupCreate. + */ + public function testParseExceptionOnMissingDefaultLanguageCode() + { + $inputArray = array( + 'identifier' => 'test-group', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupCreate = $this->getObjectStateGroupCreate(); + $objectStateGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateGroupCreate parser throwing exception on missing names + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'names' element for ObjectStateGroupCreate. + */ + public function testParseExceptionOnMissingNames() + { + $inputArray = array( + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupCreate = $this->getObjectStateGroupCreate(); + $objectStateGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test ObjectStateGroupCreate parser throwing exception on invalid names structure + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'names' element for ObjectStateGroupCreate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = array( + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array(), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupCreate = $this->getObjectStateGroupCreate(); + $objectStateGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ObjectStateGroupCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateGroupCreate + */ + protected function getObjectStateGroupCreate() + { + return new ObjectStateGroupCreate( + $this->getUrlHandler(), + $this->getObjectStateServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the object state service mock object + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + protected function getObjectStateServiceMock() + { + $objectStateServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ObjectStateService', + array(), + array(), + '', + false + ); + + $objectStateServiceMock->expects( $this->any() ) + ->method( 'newObjectStateGroupCreateStruct' ) + ->with( $this->equalTo( 'test-group' ) ) + ->will( + $this->returnValue( new ObjectStateGroupCreateStruct( array( 'identifier' => 'test-group' ) ) ) + ); + + return $objectStateServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateGroupUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateGroupUpdateTest.php new file mode 100644 index 0000000..366ae5d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateGroupUpdateTest.php @@ -0,0 +1,140 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateGroupUpdate; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct; + +class ObjectStateGroupUpdateTest extends BaseTest +{ + /** + * Tests the ObjectStateGroupUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupUpdate = $this->getObjectStateGroupUpdate(); + $result = $objectStateGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupUpdateStruct', + $result, + 'ObjectStateGroupUpdateStruct not created correctly.' + ); + + $this->assertEquals( + 'test-group', + $result->identifier, + 'ObjectStateGroupUpdateStruct identifier property not created correctly.' + ); + + $this->assertEquals( + 'eng-GB', + $result->defaultLanguageCode, + 'ObjectStateGroupUpdateStruct defaultLanguageCode property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test group' ), + $result->names, + 'ObjectStateGroupUpdateStruct names property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test group description' ), + $result->descriptions, + 'ObjectStateGroupUpdateStruct descriptions property not created correctly.' + ); + } + + /** + * Test ObjectStateGroupUpdate parser throwing exception on invalid names structure + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'names' element for ObjectStateGroupUpdate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = array( + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array(), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test group description' + ) + ) + ) + ); + + $objectStateGroupUpdate = $this->getObjectStateGroupUpdate(); + $objectStateGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ObjectStateGroupUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateGroupUpdate + */ + protected function getObjectStateGroupUpdate() + { + return new ObjectStateGroupUpdate( + $this->getUrlHandler(), + $this->getObjectStateServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the object state service mock object + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + protected function getObjectStateServiceMock() + { + $objectStateServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ObjectStateService', + array(), + array(), + '', + false + ); + + $objectStateServiceMock->expects( $this->any() ) + ->method( 'newObjectStateGroupUpdateStruct' ) + ->will( + $this->returnValue( new ObjectStateGroupUpdateStruct() ) + ); + + return $objectStateServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateUpdateTest.php new file mode 100644 index 0000000..2d35ece --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/ObjectStateUpdateTest.php @@ -0,0 +1,140 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateUpdate; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct; + +class ObjectStateUpdateTest extends BaseTest +{ + /** + * Tests the ObjectStateUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'identifier' => 'test-state', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test state' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateUpdate = $this->getObjectStateUpdate(); + $result = $objectStateUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateUpdateStruct', + $result, + 'ObjectStateUpdateStruct not created correctly.' + ); + + $this->assertEquals( + 'test-state', + $result->identifier, + 'ObjectStateUpdateStruct identifier property not created correctly.' + ); + + $this->assertEquals( + 'eng-GB', + $result->defaultLanguageCode, + 'ObjectStateUpdateStruct defaultLanguageCode property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test state' ), + $result->names, + 'ObjectStateUpdateStruct names property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test description' ), + $result->descriptions, + 'ObjectStateUpdateStruct descriptions property not created correctly.' + ); + } + + /** + * Test ObjectStateUpdate parser throwing exception on invalid names structure + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'names' element for ObjectStateUpdate. + */ + public function testParseExceptionOnInvalidNames() + { + $inputArray = array( + 'identifier' => 'test-state', + 'defaultLanguageCode' => 'eng-GB', + 'names' => array(), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test description' + ) + ) + ) + ); + + $objectStateUpdate = $this->getObjectStateUpdate(); + $objectStateUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the ObjectStateUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\ObjectStateUpdate + */ + protected function getObjectStateUpdate() + { + return new ObjectStateUpdate( + $this->getUrlHandler(), + $this->getObjectStateServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the object state service mock object + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + protected function getObjectStateServiceMock() + { + $objectStateServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ObjectStateService', + array(), + array(), + '', + false + ); + + $objectStateServiceMock->expects( $this->any() ) + ->method( 'newObjectStateUpdateStruct' ) + ->will( + $this->returnValue( new ObjectStateUpdateStruct() ) + ); + + return $objectStateServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/PolicyCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/PolicyCreateTest.php new file mode 100644 index 0000000..4fc1e92 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/PolicyCreateTest.php @@ -0,0 +1,281 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\PolicyCreate; +use eZ\Publish\Core\Repository\Values\User\PolicyCreateStruct; + +class PolicyCreateTest extends BaseTest +{ + /** + * Tests the PolicyCreate parser + */ + public function testParse() + { + $inputArray = array( + 'module' => 'content', + 'function' => 'delete', + 'limitations' => array( + 'limitation' => array( + array( + '_identifier' => 'Class', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ) + ) + ); + + $policyCreate = $this->getPolicyCreate(); + $result = $policyCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\PolicyCreateStruct', + $result, + 'PolicyCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'content', + $result->module, + 'PolicyCreateStruct module property not created correctly.' + ); + + $this->assertEquals( + 'delete', + $result->function, + 'PolicyCreateStruct function property not created correctly.' + ); + + $parsedLimitations = $result->getLimitations(); + + $this->assertInternalType( + 'array', + $parsedLimitations, + 'PolicyCreateStruct limitations not created correctly' + ); + + $this->assertCount( + 1, + $parsedLimitations, + 'PolicyCreateStruct limitations not created correctly' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Limitation', + $parsedLimitations['Class'], + 'Limitation not created correctly.' + ); + + $this->assertEquals( + 'Class', + $parsedLimitations['Class']->getIdentifier(), + 'Limitation identifier not created correctly.' + ); + + $this->assertEquals( + array( 1, 2, 3 ), + $parsedLimitations['Class']->limitationValues, + 'Limitation values not created correctly.' + ); + } + + /** + * Test PolicyCreate parser throwing exception on missing module + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'module' attribute for PolicyCreate. + */ + public function testParseExceptionOnMissingModule() + { + $inputArray = array( + 'function' => 'delete', + 'limitations' => array( + 'limitation' => array( + array( + '_identifier' => 'Class', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ) + ) + ); + + $policyCreate = $this->getPolicyCreate(); + $policyCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test PolicyCreate parser throwing exception on missing function + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'function' attribute for PolicyCreate. + */ + public function testParseExceptionOnMissingFunction() + { + $inputArray = array( + 'module' => 'content', + 'limitations' => array( + 'limitation' => array( + array( + '_identifier' => 'Class', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ) + ) + ); + + $policyCreate = $this->getPolicyCreate(); + $policyCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test PolicyCreate parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_identifier' attribute for Limitation. + */ + public function testParseExceptionOnMissingLimitationIdentifier() + { + $inputArray = array( + 'module' => 'content', + 'function' => 'delete', + 'limitations' => array( + 'limitation' => array( + array( + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ) + ) + ); + + $policyCreate = $this->getPolicyCreate(); + $policyCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test PolicyCreate parser throwing exception on missing values + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid format for limitation values in Limitation. + */ + public function testParseExceptionOnMissingLimitationValues() + { + $inputArray = array( + 'module' => 'content', + 'function' => 'delete', + 'limitations' => array( + 'limitation' => array( + array( + '_identifier' => 'Class' + ) + ) + ) + ); + + $policyCreate = $this->getPolicyCreate(); + $policyCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the PolicyCreateStruct parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\PolicyCreate + */ + protected function getPolicyCreate() + { + return new PolicyCreate( + $this->getUrlHandler(), + $this->getRoleServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the role service mock object + * + * @return \eZ\Publish\API\Repository\RoleService + */ + protected function getRoleServiceMock() + { + $roleServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\RoleService', + array(), + array(), + '', + false + ); + + $roleServiceMock->expects( $this->any() ) + ->method( 'newPolicyCreateStruct' ) + ->with( + $this->equalTo( 'content' ), + $this->equalTo( 'delete' ) + ) + ->will( + $this->returnValue( + new PolicyCreateStruct( + array( + 'module' => 'content', + 'function' => 'delete' + ) + ) + ) + ); + + return $roleServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/PolicyUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/PolicyUpdateTest.php new file mode 100644 index 0000000..d81d3bd --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/PolicyUpdateTest.php @@ -0,0 +1,180 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\PolicyUpdate; +use eZ\Publish\Core\Repository\Values\User\PolicyUpdateStruct; + +class PolicyUpdateTest extends BaseTest +{ + /** + * Tests the PolicyUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'limitations' => array( + 'limitation' => array( + array( + '_identifier' => 'Class', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ) + ) + ); + + $policyUpdate = $this->getPolicyUpdate(); + $result = $policyUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\PolicyUpdateStruct', + $result, + 'PolicyUpdateStruct not created correctly.' + ); + + $parsedLimitations = $result->getLimitations(); + + $this->assertInternalType( + 'array', + $parsedLimitations, + 'PolicyUpdateStruct limitations not created correctly' + ); + + $this->assertCount( + 1, + $parsedLimitations, + 'PolicyUpdateStruct limitations not created correctly' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Limitation', + $parsedLimitations['Class'], + 'Limitation not created correctly.' + ); + + $this->assertEquals( + 'Class', + $parsedLimitations['Class']->getIdentifier(), + 'Limitation identifier not created correctly.' + ); + + $this->assertEquals( + array( 1, 2, 3 ), + $parsedLimitations['Class']->limitationValues, + 'Limitation values not created correctly.' + ); + } + + /** + * Test PolicyUpdate parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_identifier' attribute for Limitation. + */ + public function testParseExceptionOnMissingLimitationIdentifier() + { + $inputArray = array( + 'limitations' => array( + 'limitation' => array( + array( + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ) + ) + ); + + $policyUpdate = $this->getPolicyUpdate(); + $policyUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test PolicyUpdate parser throwing exception on missing values + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid format for limitation values in Limitation. + */ + public function testParseExceptionOnMissingLimitationValues() + { + $inputArray = array( + 'limitations' => array( + 'limitation' => array( + array( + '_identifier' => 'Class' + ) + ) + ) + ); + + $policyUpdate = $this->getPolicyUpdate(); + $policyUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the PolicyUpdateStruct parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\PolicyUpdate + */ + protected function getPolicyUpdate() + { + return new PolicyUpdate( + $this->getUrlHandler(), + $this->getRoleServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the role service mock object + * + * @return \eZ\Publish\API\Repository\RoleService + */ + protected function getRoleServiceMock() + { + $roleServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\RoleService', + array(), + array(), + '', + false + ); + + $roleServiceMock->expects( $this->any() ) + ->method( 'newPolicyUpdateStruct' ) + ->will( + $this->returnValue( new PolicyUpdateStruct() ) + ); + + return $roleServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RelationCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RelationCreateTest.php new file mode 100644 index 0000000..3b6693d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RelationCreateTest.php @@ -0,0 +1,76 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\RelationCreate; + +class RelationCreateTest extends BaseTest +{ + /** + * Tests the RelationCreate parser + */ + public function testParse() + { + $inputArray = array( + 'Destination' => array( + '_href' => '/content/objects/42' + ), + ); + + $relationCreate = $this->getRelationCreate(); + $result = $relationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + 42, + $result, + 'RelationCreate struct not parsed correctly.' + ); + } + + /** + * Test RelationCreate parser throwing exception on missing Destination + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'Destination' element for RelationCreate. + */ + public function testParseExceptionOnMissingDestination() + { + $inputArray = array(); + + $relationCreate = $this->getRelationCreate(); + $relationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test RelationCreate parser throwing exception on missing Destination href + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for Destination element in RelationCreate. + */ + public function testParseExceptionOnMissingDestinationHref() + { + $inputArray = array( + 'Destination' => array() + ); + + $relationCreate = $this->getRelationCreate(); + $relationCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the RelationCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\RelationCreate + */ + protected function getRelationCreate() + { + return new RelationCreate( $this->getUrlHandler() ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RoleAssignInputTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RoleAssignInputTest.php new file mode 100644 index 0000000..7454832 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RoleAssignInputTest.php @@ -0,0 +1,206 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\RoleAssignInput; + +class RoleAssignInputTest extends BaseTest +{ + /** + * Tests the RoleAssignInput parser + */ + public function testParse() + { + $inputArray = array( + 'Role' => array( + '_href' => '/user/roles/42' + ), + 'limitation' => array( + '_identifier' => 'Section', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ); + + $roleAssignInput = $this->getRoleAssignInput(); + $result = $roleAssignInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RoleAssignment', + $result, + 'RoleAssignment not created correctly.' + ); + + $this->assertEquals( + '42', + $result->roleId, + 'RoleAssignment roleId property not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Limitation\\RoleLimitation', + $result->limitation, + 'Limitation not created correctly.' + ); + + $this->assertEquals( + 'Section', + $result->limitation->getIdentifier(), + 'Limitation identifier not created correctly.' + ); + + $this->assertEquals( + array( 1, 2, 3 ), + $result->limitation->limitationValues, + 'Limitation values not created correctly.' + ); + } + + /** + * Test RoleAssignInput parser throwing exception on missing Role + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'Role' element for RoleAssignInput. + */ + public function testParseExceptionOnMissingRole() + { + $inputArray = array( + 'limitation' => array( + '_identifier' => 'Section', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ); + + $roleAssignInput = $this->getRoleAssignInput(); + $roleAssignInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test RoleAssignInput parser throwing exception on invalid Role + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'Role' element for RoleAssignInput. + */ + public function testParseExceptionOnInvalidRole() + { + $inputArray = array( + 'Role' => array(), + 'limitation' => array( + '_identifier' => 'Section', + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ); + + $roleAssignInput = $this->getRoleAssignInput(); + $roleAssignInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test Limitation parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_identifier' attribute for Limitation. + */ + public function testParseExceptionOnMissingLimitationIdentifier() + { + $inputArray = array( + 'Role' => array( + '_href' => '/user/roles/42' + ), + 'limitation' => array( + 'values' => array( + 'ref' => array( + array( + '_href' => 1 + ), + array( + '_href' => 2 + ), + array( + '_href' => 3 + ) + ) + ) + ) + ); + + $roleAssignInput = $this->getRoleAssignInput(); + $roleAssignInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test Limitation parser throwing exception on missing values + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid format for limitation values in Limitation. + */ + public function testParseExceptionOnMissingLimitationValues() + { + $inputArray = array( + 'Role' => array( + '_href' => '/user/roles/42' + ), + 'limitation' => array( + '_identifier' => 'Section' + ) + ); + + $roleAssignInput = $this->getRoleAssignInput(); + $roleAssignInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the role assign input parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\RoleAssignInput + */ + protected function getRoleAssignInput() + { + return new RoleAssignInput( + $this->getUrlHandler(), + $this->getParserTools() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RoleInputTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RoleInputTest.php new file mode 100644 index 0000000..ef7d1f6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/RoleInputTest.php @@ -0,0 +1,113 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\RoleInput; +use eZ\Publish\Core\Repository\Values\User\RoleCreateStruct; + +class RoleInputTest extends BaseTest +{ + /** + * Tests the RoleInput parser + */ + public function testParse() + { + $inputArray = array( + 'identifier' => 'Identifier Bar', + /* @todo uncomment when support for multilingual names and descriptions is added + 'mainLanguageCode' => 'eng-GB', + 'names' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test role' + ) + ) + ), + 'descriptions' => array( + 'value' => array( + array( + '_languageCode' => 'eng-GB', + '#text' => 'Test role description' + ) + ) + ) + */ + ); + + $roleInput = $this->getRoleInput(); + $result = $roleInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\RoleCreateStruct', + $result, + 'RoleCreateStruct not created correctly.' + ); + + $this->assertEquals( + 'Identifier Bar', + $result->identifier, + 'RoleCreateStruct identifier property not created correctly.' + ); + + /* @todo uncomment when support for multilingual names and descriptions is added + $this->assertEquals( + array( 'eng-GB' => 'Test role' ), + $result->names, + 'RoleCreateStruct names property not created correctly.' + ); + + $this->assertEquals( + array( 'eng-GB' => 'Test role description' ), + $result->descriptions, + 'RoleCreateStruct descriptions property not created correctly.' + ); + */ + } + + /** + * Returns the role input parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\RoleInput + */ + protected function getRoleInput() + { + return new RoleInput( + $this->getUrlHandler(), + $this->getRoleServiceMock(), + $this->getParserTools() + ); + } + + /** + * Get the role service mock object + * + * @return \eZ\Publish\API\Repository\RoleService + */ + protected function getRoleServiceMock() + { + $roleServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\RoleService', + array(), + array(), + '', + false + ); + + $roleServiceMock->expects( $this->any() ) + ->method( 'newRoleCreateStruct' ) + ->with( $this->equalTo( 'Identifier Bar' ) ) + ->will( + $this->returnValue( new RoleCreateStruct( array( 'identifier' => 'Identifier Bar' ) ) ) + ); + + return $roleServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/SectionInputTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/SectionInputTest.php new file mode 100644 index 0000000..de32aec --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/SectionInputTest.php @@ -0,0 +1,102 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\SectionInput; +use eZ\Publish\API\Repository\Values\Content\SectionCreateStruct; + +class SectionInputTest extends BaseTest +{ + /** + * Tests the SectionInput parser + */ + public function testParse() + { + $inputArray = array( + 'name' => 'Name Foo', + 'identifier' => 'Identifier Bar', + ); + + $sectionInput = $this->getSectionInput(); + $result = $sectionInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + new SectionCreateStruct( $inputArray ), + $result, + 'SectionCreateStruct not created correctly.' + ); + } + + /** + * Test SectionInput parser throwing exception on missing identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'identifier' attribute for SectionInput. + */ + public function testParseExceptionOnMissingIdentifier() + { + $inputArray = array( + 'name' => 'Name Foo', + ); + + $sectionInput = $this->getSectionInput(); + $sectionInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test SectionInput parser throwing exception on missing name + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'name' attribute for SectionInput. + */ + public function testParseExceptionOnMissingName() + { + $inputArray = array( + 'identifier' => 'Identifier Bar', + ); + + $sectionInput = $this->getSectionInput(); + $sectionInput->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the section input parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\SectionInput + */ + protected function getSectionInput() + { + return new SectionInput( $this->getUrlHandler(), $this->getSectionServiceMock() ); + } + + /** + * Get the section service mock object + * + * @return \eZ\Publish\API\Repository\SectionService + */ + protected function getSectionServiceMock() + { + $sectionServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\SectionService', + array(), + array(), + '', + false + ); + + $sectionServiceMock->expects( $this->any() ) + ->method( 'newSectionCreateStruct' ) + ->will( + $this->returnValue( new SectionCreateStruct() ) + ); + + return $sectionServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/URLWildcardCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/URLWildcardCreateTest.php new file mode 100644 index 0000000..2ea970b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/URLWildcardCreateTest.php @@ -0,0 +1,101 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\URLWildcardCreate; + +class URLWildcardCreateTest extends BaseTest +{ + /** + * Tests the URLWildcardCreate parser + */ + public function testParse() + { + $inputArray = array( + 'sourceUrl' => '/source/url', + 'destinationUrl' => '/destination/url', + 'forward' => 'true' + ); + + $urlWildcardCreate = $this->getURLWildcardCreate(); + $result = $urlWildcardCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertEquals( + array( + 'sourceUrl' => '/source/url', + 'destinationUrl' => '/destination/url', + 'forward' => true + ), + $result, + 'URLWildcardCreate not parsed correctly.' + ); + } + + /** + * Test URLWildcardCreate parser throwing exception on missing sourceUrl + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'sourceUrl' value for URLWildcardCreate. + */ + public function testParseExceptionOnMissingSourceUrl() + { + $inputArray = array( + 'destinationUrl' => '/destination/url', + 'forward' => 'true' + ); + + $urlWildcardCreate = $this->getURLWildcardCreate(); + $urlWildcardCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test URLWildcardCreate parser throwing exception on missing destinationUrl + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'destinationUrl' value for URLWildcardCreate. + */ + public function testParseExceptionOnMissingDestinationUrl() + { + $inputArray = array( + 'sourceUrl' => '/source/url', + 'forward' => 'true' + ); + + $urlWildcardCreate = $this->getURLWildcardCreate(); + $urlWildcardCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test URLWildcardCreate parser throwing exception on missing forward + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'forward' value for URLWildcardCreate. + */ + public function testParseExceptionOnMissingForward() + { + $inputArray = array( + 'sourceUrl' => '/source/url', + 'destinationUrl' => '/destination/url' + ); + + $urlWildcardCreate = $this->getURLWildcardCreate(); + $urlWildcardCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the URLWildcard input parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\URLWildcardCreate + */ + protected function getURLWildcardCreate() + { + return new URLWildcardCreate( $this->getUrlHandler(), $this->getParserTools() ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserCreateTest.php new file mode 100644 index 0000000..56fef4b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserCreateTest.php @@ -0,0 +1,572 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\UserCreate; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\Repository\Values\User\UserCreateStruct; + +class UserCreateTest extends BaseTest +{ + /** + * Tests the UserCreate parser + */ + public function testParse() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $result = $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserCreateStruct', + $result, + 'UserCreateStruct not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $result->contentType, + 'contentType not created correctly.' + ); + + $this->assertEquals( + 4, + $result->contentType->id, + 'contentType not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertEquals( + 4, + $result->sectionId, + 'sectionId not created correctly' + ); + + $this->assertEquals( + 'remoteId12345678', + $result->remoteId, + 'remoteId not created correctly' + ); + + foreach ( $result->fields as $field ) + { + $this->assertEquals( + 'foo', + $field->value, + 'field value not created correctly' + ); + } + } + + /** + * Test UserCreate parser throwing exception on invalid ContentType + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for ContentType element in UserCreate. + */ + public function testParseExceptionOnInvalidContentType() + { + $inputArray = array( + 'ContentType' => array(), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on missing mainLanguageCode + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'mainLanguageCode' element for UserCreate. + */ + public function testParseExceptionOnMissingMainLanguageCode() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on missing login + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'login' element for UserCreate. + */ + public function testParseExceptionOnMissingLogin() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on missing email + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'email' element for UserCreate. + */ + public function testParseExceptionOnMissingEmail() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on missing password + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'password' element for UserCreate. + */ + public function testParseExceptionOnMissingPassword() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on invalid Section + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for Section element in UserCreate. + */ + public function testParseExceptionOnInvalidSection() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array(), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on invalid fields data + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'fields' element for UserCreate. + */ + public function testParseExceptionOnInvalidFields() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on missing field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldDefinitionIdentifier' element in field data for UserCreate. + */ + public function testParseExceptionOnMissingFieldDefinitionIdentifier() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on invalid field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage 'unknown' is invalid field definition identifier for 'some_class' content type in UserCreate. + */ + public function testParseExceptionOnInvalidFieldDefinitionIdentifier() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'unknown', + 'fieldValue' => array() + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserCreate parser throwing exception on missing field value + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldValue' element for 'name' identifier in UserCreate. + */ + public function testParseExceptionOnMissingFieldValue() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/4' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'login' => 'login', + 'email' => 'nospam@ez.no', + 'password' => 'password', + 'enabled' => 'true', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name' + ) + ) + ) + ); + + $userCreate = $this->getUserCreate(); + $userCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the UserCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\UserCreate + */ + protected function getUserCreate() + { + return new UserCreate( + $this->getUrlHandler(), + $this->getUserServiceMock(), + $this->getContentTypeServiceMock(), + $this->getFieldTypeParserMock(), + $this->getParserTools() + ); + } + + /** + * Get the field type parser mock object + * + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + */ + private function getFieldTypeParserMock() + { + $fieldTypeParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array( + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentService', + array(), + array(), + '', + false + ), + $this->getContentTypeServiceMock(), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldTypeService', + array(), + array(), + '', + false + ) + ), + '', + false + ); + + $fieldTypeParserMock->expects( $this->any() ) + ->method( 'parseValue' ) + ->with( 'ezstring', array() ) + ->will( $this->returnValue( 'foo' ) ); + + return $fieldTypeParserMock; + } + + /** + * Get the user service mock object + * + * @return \eZ\Publish\API\Repository\UserService + */ + protected function getUserServiceMock() + { + $userServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\UserService', + array(), + array(), + '', + false + ); + + $contentType = $this->getContentType(); + $userServiceMock->expects( $this->any() ) + ->method( 'newUserCreateStruct' ) + ->with( + $this->equalTo( 'login' ), + $this->equalTo( 'nospam@ez.no' ), + $this->equalTo( 'password' ), + $this->equalTo( 'eng-US' ), + $this->equalTo( $contentType ) + ) + ->will( + $this->returnValue( + new UserCreateStruct( + array( + 'contentType' => $contentType, + 'mainLanguageCode' => 'eng-US' + ) + ) + ) + ); + + return $userServiceMock; + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'loadContentType' ) + ->with( $this->equalTo( 4 ) ) + ->will( $this->returnValue( $this->getContentType() ) ); + + return $contentTypeServiceMock; + } + + /** + * Get the content type used in UserCreate parser + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected function getContentType() + { + return new ContentType( + array( + 'id' => 4, + 'identifier' => 'some_class', + 'fieldDefinitions' => array( + new FieldDefinition( + array( + 'id' => 42, + 'identifier' => 'name', + 'fieldTypeIdentifier' => 'ezstring' + ) + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserGroupCreateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserGroupCreateTest.php new file mode 100644 index 0000000..9a80466 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserGroupCreateTest.php @@ -0,0 +1,434 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\UserGroupCreate; +use eZ\Publish\Core\Repository\Values\User\UserGroupCreateStruct; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; + +class UserGroupCreateTest extends BaseTest +{ + /** + * Tests the UserGroupCreate parser + */ + public function testParse() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $result = $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroupCreateStruct', + $result, + 'UserGroupCreateStruct not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $result->contentType, + 'contentType not created correctly.' + ); + + $this->assertEquals( + 3, + $result->contentType->id, + 'contentType not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertEquals( + 4, + $result->sectionId, + 'sectionId not created correctly' + ); + + $this->assertEquals( + 'remoteId12345678', + $result->remoteId, + 'remoteId not created correctly' + ); + + foreach ( $result->fields as $field ) + { + $this->assertEquals( + 'foo', + $field->value, + 'field value not created correctly' + ); + } + } + + /** + * Test UserGroupCreate parser throwing exception on invalid ContentType + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for ContentType element in UserGroupCreate. + */ + public function testParseExceptionOnInvalidContentType() + { + $inputArray = array( + 'ContentType' => array(), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupCreate parser throwing exception on missing mainLanguageCode + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'mainLanguageCode' element for UserGroupCreate. + */ + public function testParseExceptionOnMissingMainLanguageCode() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupCreate parser throwing exception on invalid Section + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for Section element in UserGroupCreate. + */ + public function testParseExceptionOnInvalidSection() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array(), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupCreate parser throwing exception on invalid fields data + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing or invalid 'fields' element for UserGroupCreate. + */ + public function testParseExceptionOnInvalidFields() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupCreate parser throwing exception on missing field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldDefinitionIdentifier' element in field data for UserGroupCreate. + */ + public function testParseExceptionOnMissingFieldDefinitionIdentifier() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldValue' => array() + ), + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupCreate parser throwing exception on invalid field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage 'unknown' is invalid field definition identifier for 'some_class' content type in UserGroupCreate. + */ + public function testParseExceptionOnInvalidFieldDefinitionIdentifier() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'unknown', + 'fieldValue' => array() + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupCreate parser throwing exception on missing field value + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldValue' element for 'name' identifier in UserGroupCreate. + */ + public function testParseExceptionOnMissingFieldValue() + { + $inputArray = array( + 'ContentType' => array( + '_href' => '/content/types/3' + ), + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/4' + ), + 'remoteId' => 'remoteId12345678', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name' + ) + ) + ) + ); + + $userGroupCreate = $this->getUserGroupCreate(); + $userGroupCreate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the UserGroupCreate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\UserGroupCreate + */ + protected function getUserGroupCreate() + { + return new UserGroupCreate( + $this->getUrlHandler(), + $this->getUserServiceMock(), + $this->getContentTypeServiceMock(), + $this->getFieldTypeParserMock() + ); + } + + /** + * Get the field type parser mock object + * + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + */ + private function getFieldTypeParserMock() + { + $fieldTypeParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array( + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentService', + array(), + array(), + '', + false + ), + $this->getContentTypeServiceMock(), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldTypeService', + array(), + array(), + '', + false + ) + ), + '', + false + ); + + $fieldTypeParserMock->expects( $this->any() ) + ->method( 'parseValue' ) + ->with( 'ezstring', array() ) + ->will( $this->returnValue( 'foo' ) ); + + return $fieldTypeParserMock; + } + + /** + * Get the user service mock object + * + * @return \eZ\Publish\API\Repository\UserService + */ + protected function getUserServiceMock() + { + $userServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\UserService', + array(), + array(), + '', + false + ); + + $contentType = $this->getContentType(); + $userServiceMock->expects( $this->any() ) + ->method( 'newUserGroupCreateStruct' ) + ->with( + $this->equalTo( 'eng-US' ), + $this->equalTo( $contentType ) + ) + ->will( + $this->returnValue( + new UserGroupCreateStruct( + array( + 'contentType' => $contentType, + 'mainLanguageCode' => 'eng-US' + ) + ) + ) + ); + + return $userServiceMock; + } + + /** + * Get the content type service mock object + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + protected function getContentTypeServiceMock() + { + $contentTypeServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ); + + $contentTypeServiceMock->expects( $this->any() ) + ->method( 'loadContentType' ) + ->with( $this->equalTo( 3 ) ) + ->will( $this->returnValue( $this->getContentType() ) ); + + return $contentTypeServiceMock; + } + + /** + * Get the content type used in UserGroupCreate parser + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected function getContentType() + { + return new ContentType( + array( + 'id' => 3, + 'identifier' => 'some_class', + 'fieldDefinitions' => array( + new FieldDefinition( + array( + 'id' => 42, + 'identifier' => 'name', + 'fieldTypeIdentifier' => 'ezstring' + ) + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserGroupUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserGroupUpdateTest.php new file mode 100644 index 0000000..082c03c --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserGroupUpdateTest.php @@ -0,0 +1,340 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\UserGroupUpdate; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct; +use eZ\Publish\Core\Repository\Values\Content\ContentUpdateStruct; + +class UserGroupUpdateTest extends BaseTest +{ + /** + * Tests the UserGroupUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ), + '__url' => '/user/groups/1/5' + ); + + $userGroupUpdate = $this->getUserGroupUpdate(); + $result = $userGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserGroupUpdateStruct', + $result, + 'UserGroupUpdate not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentUpdateStruct', + $result->userGroupUpdateStruct->contentUpdateStruct, + 'UserGroupUpdate not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentMetadataUpdateStruct', + $result->userGroupUpdateStruct->contentMetadataUpdateStruct, + 'UserGroupUpdate not created correctly.' + ); + + $this->assertEquals( + 1, + $result->sectionId, + 'sectionId not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->userGroupUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertEquals( + 'remoteId123456', + $result->userGroupUpdateStruct->contentMetadataUpdateStruct->remoteId, + 'remoteId not created correctly' + ); + + foreach ( $result->userGroupUpdateStruct->contentUpdateStruct->fields as $field ) + { + $this->assertEquals( + 'foo', + $field->value, + 'field value not created correctly' + ); + } + } + + /** + * Test UserGroupUpdate parser throwing exception on missing Section href + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for Section element in UserGroupUpdate. + */ + public function testParseExceptionOnMissingSectionHref() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array(), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + 'fieldValue' => array() + ) + ) + ), + '__url' => '/user/groups/1/5' + ); + + $userGroupUpdate = $this->getUserGroupUpdate(); + $userGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupUpdate parser throwing exception on invalid fields data + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'fields' element for UserGroupUpdate. + */ + public function testParseExceptionOnInvalidFields() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array(), + '__url' => '/user/groups/1/5' + ); + + $userGroupUpdate = $this->getUserGroupUpdate(); + $userGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupUpdate parser throwing exception on missing field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldDefinitionIdentifier' element in field data for UserGroupUpdate. + */ + public function testParseExceptionOnMissingFieldDefinitionIdentifier() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldValue' => array() + ) + ) + ), + '__url' => '/user/groups/1/5' + ); + + $userGroupUpdate = $this->getUserGroupUpdate(); + $userGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserGroupUpdate parser throwing exception on missing field value + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldValue' element for 'name' identifier in UserGroupUpdate. + */ + public function testParseExceptionOnMissingFieldValue() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'name', + ) + ) + ), + '__url' => '/user/groups/1/5' + ); + + $userGroupUpdate = $this->getUserGroupUpdate(); + $userGroupUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the UserGroupUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\UserGroupUpdate + */ + protected function getUserGroupUpdate() + { + return new UserGroupUpdate( + $this->getUrlHandler(), + $this->getUserServiceMock(), + $this->getContentServiceMock(), + $this->getLocationServiceMock(), + $this->getFieldTypeParserMock() + ); + } + + /** + * Get the field type parser mock object + * + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + */ + private function getFieldTypeParserMock() + { + $fieldTypeParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array( + $this->getContentServiceMock(), + $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentTypeService', + array(), + array(), + '', + false + ), + $this->getMock( + 'eZ\\Publish\\Core\\Repository\\FieldTypeService', + array(), + array(), + '', + false + ) + ), + '', + false + ); + + $fieldTypeParserMock->expects( $this->any() ) + ->method( 'parseFieldValue' ) + ->with( 4, 'name', array() ) + ->will( $this->returnValue( 'foo' ) ); + + return $fieldTypeParserMock; + } + + /** + * Get the user service mock object + * + * @return \eZ\Publish\API\Repository\UserService + */ + protected function getUserServiceMock() + { + $userServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\UserService', + array(), + array(), + '', + false + ); + + $userServiceMock->expects( $this->any() ) + ->method( 'newUserGroupUpdateStruct' ) + ->will( + $this->returnValue( new UserGroupUpdateStruct() ) + ); + + return $userServiceMock; + } + + /** + * Get the location service mock object + * + * @return \eZ\Publish\API\Repository\LocationService + */ + protected function getLocationServiceMock() + { + $userServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\LocationService', + array(), + array(), + '', + false + ); + + $userServiceMock->expects( $this->any() ) + ->method( 'loadLocation' ) + ->with( $this->equalTo( 5 ) ) + ->will( + $this->returnValue( + new Location( + array( + 'contentInfo' => new ContentInfo( + array( + 'id' => 4 + ) + ) + ) + ) + ) + ); + + return $userServiceMock; + } + + /** + * Get the content service mock object + * + * @return \eZ\Publish\API\Repository\ContentService + */ + protected function getContentServiceMock() + { + $contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentService', + array(), + array(), + '', + false + ); + + $contentServiceMock->expects( $this->any() ) + ->method( 'newContentUpdateStruct' ) + ->will( + $this->returnValue( new ContentUpdateStruct() ) + ); + + $contentServiceMock->expects( $this->any() ) + ->method( 'newContentMetadataUpdateStruct' ) + ->will( + $this->returnValue( new ContentMetadataUpdateStruct() ) + ); + + return $contentServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserUpdateTest.php new file mode 100644 index 0000000..979fcc0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/UserUpdateTest.php @@ -0,0 +1,336 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\UserUpdate; +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; +use eZ\Publish\API\Repository\Values\User\UserUpdateStruct; +use eZ\Publish\Core\Repository\Values\Content\ContentUpdateStruct; + +class UserUpdateTest extends BaseTest +{ + /** + * Tests the UserUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'first_name', + 'fieldValue' => array() + ) + ) + ), + 'email' => 'nospam@ez.no', + 'password' => 'somePassword', + 'enabled' => 'true', + '__url' => '/user/users/14' + ); + + $userUpdate = $this->getUserUpdate(); + $result = $userUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserUpdateStruct', + $result, + 'UserUpdate not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentUpdateStruct', + $result->userUpdateStruct->contentUpdateStruct, + 'UserUpdate not created correctly.' + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentMetadataUpdateStruct', + $result->userUpdateStruct->contentMetadataUpdateStruct, + 'UserUpdate not created correctly.' + ); + + $this->assertEquals( + 1, + $result->sectionId, + 'sectionId not created correctly' + ); + + $this->assertEquals( + 'eng-US', + $result->userUpdateStruct->contentMetadataUpdateStruct->mainLanguageCode, + 'mainLanguageCode not created correctly' + ); + + $this->assertEquals( + 'remoteId123456', + $result->userUpdateStruct->contentMetadataUpdateStruct->remoteId, + 'remoteId not created correctly' + ); + + $this->assertEquals( + 'nospam@ez.no', + $result->userUpdateStruct->email, + 'email not created correctly' + ); + + $this->assertEquals( + 'somePassword', + $result->userUpdateStruct->password, + 'password not created correctly' + ); + + $this->assertEquals( + true, + $result->userUpdateStruct->enabled, + 'enabled not created correctly' + ); + + foreach ( $result->userUpdateStruct->contentUpdateStruct->fields as $field ) + { + $this->assertEquals( + 'foo', + $field->value, + 'field value not created correctly' + ); + } + } + + /** + * Test UserUpdate parser throwing exception on missing Section href + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing '_href' attribute for Section element in UserUpdate. + */ + public function testParseExceptionOnMissingSectionHref() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array(), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'first_name', + 'fieldValue' => array() + ) + ) + ), + 'email' => 'nospam@ez.no', + 'password' => 'somePassword', + 'enabled' => 'true', + '__url' => '/user/users/14' + ); + + $userUpdate = $this->getUserUpdate(); + $userUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserUpdate parser throwing exception on invalid fields data + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'fields' element for UserUpdate. + */ + public function testParseExceptionOnInvalidFields() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array(), + 'email' => 'nospam@ez.no', + 'password' => 'somePassword', + 'enabled' => 'true', + '__url' => '/user/users/14' + ); + + $userUpdate = $this->getUserUpdate(); + $userUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserUpdate parser throwing exception on missing field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldDefinitionIdentifier' element in field data for UserUpdate. + */ + public function testParseExceptionOnMissingFieldDefinitionIdentifier() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldValue' => array() + ) + ) + ), + 'email' => 'nospam@ez.no', + 'password' => 'somePassword', + 'enabled' => 'true', + '__url' => '/user/users/14' + ); + + $userUpdate = $this->getUserUpdate(); + $userUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test UserUpdate parser throwing exception on missing field value + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldValue' element for 'first_name' identifier in UserUpdate. + */ + public function testParseExceptionOnMissingFieldValue() + { + $inputArray = array( + 'mainLanguageCode' => 'eng-US', + 'Section' => array( + '_href' => '/content/sections/1' + ), + 'remoteId' => 'remoteId123456', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'first_name', + ) + ) + ), + 'email' => 'nospam@ez.no', + 'password' => 'somePassword', + 'enabled' => 'true', + '__url' => '/user/users/14' + ); + + $userUpdate = $this->getUserUpdate(); + $userUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the UserUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\UserUpdate + */ + protected function getUserUpdate() + { + return new UserUpdate( + $this->getUrlHandler(), + $this->getUserServiceMock(), + $this->getContentServiceMock(), + $this->getFieldTypeParserMock(), + $this->getParserTools() + ); + } + + /** + * Get the field type parser mock object + * + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + */ + private function getFieldTypeParserMock() + { + $fieldTypeParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array( + $this->getContentServiceMock(), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentTypeService', + array(), + array(), + '', + false + ), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldTypeService', + array(), + array(), + '', + false + ) + ), + '', + false + ); + + $fieldTypeParserMock->expects( $this->any() ) + ->method( 'parseFieldValue' ) + ->with( 14, 'first_name', array() ) + ->will( $this->returnValue( 'foo' ) ); + + return $fieldTypeParserMock; + } + + /** + * Get the user service mock object + * + * @return \eZ\Publish\API\Repository\UserService + */ + protected function getUserServiceMock() + { + $userServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\UserService', + array(), + array(), + '', + false + ); + + $userServiceMock->expects( $this->any() ) + ->method( 'newUserUpdateStruct' ) + ->will( + $this->returnValue( new UserUpdateStruct() ) + ); + + return $userServiceMock; + } + + /** + * Get the Content service mock object + * + * @return \eZ\Publish\API\Repository\ContentService + */ + protected function getContentServiceMock() + { + $contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentService', + array(), + array(), + '', + false + ); + + $contentServiceMock->expects( $this->any() ) + ->method( 'newContentUpdateStruct' ) + ->will( + $this->returnValue( new ContentUpdateStruct() ) + ); + + $contentServiceMock->expects( $this->any() ) + ->method( 'newContentMetadataUpdateStruct' ) + ->will( + $this->returnValue( new ContentMetadataUpdateStruct() ) + ); + + return $contentServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Input/Parser/VersionUpdateTest.php b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/VersionUpdateTest.php new file mode 100644 index 0000000..28bf162 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Input/Parser/VersionUpdateTest.php @@ -0,0 +1,202 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Input\Parser; + +use eZ\Publish\Core\REST\Server\Input\Parser\VersionUpdate; +use eZ\Publish\Core\Repository\Values\Content\ContentUpdateStruct; + +class VersionUpdateTest extends BaseTest +{ + /** + * Tests the VersionUpdate parser + */ + public function testParse() + { + $inputArray = array( + 'initialLanguageCode' => 'eng-US', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject', + 'fieldValue' => array() + ) + ) + ), + '__url' => '/content/objects/42/versions/1' + ); + + $VersionUpdate = $this->getVersionUpdate(); + $result = $VersionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\ContentUpdateStruct', + $result, + 'VersionUpdate not created correctly.' + ); + + $this->assertEquals( + 'eng-US', + $result->initialLanguageCode, + 'initialLanguageCode not created correctly' + ); + + foreach ( $result->fields as $field ) + { + $this->assertEquals( + 'foo', + $field->value, + 'field value not created correctly' + ); + } + } + + /** + * Test VersionUpdate parser throwing exception on invalid fields data + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Invalid 'fields' element for VersionUpdate. + */ + public function testParseExceptionOnInvalidFields() + { + $inputArray = array( + 'initialLanguageCode' => 'eng-US', + 'fields' => array(), + '__url' => '/content/objects/42/versions/1' + ); + + $VersionUpdate = $this->getVersionUpdate(); + $VersionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test VersionUpdate parser throwing exception on missing field definition identifier + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldDefinitionIdentifier' element in field data for VersionUpdate. + */ + public function testParseExceptionOnMissingFieldDefinitionIdentifier() + { + $inputArray = array( + 'initialLanguageCode' => 'eng-US', + 'fields' => array( + 'field' => array( + array( + 'fieldValue' => array() + ) + ) + ), + '__url' => '/content/objects/42/versions/1' + ); + + $VersionUpdate = $this->getVersionUpdate(); + $VersionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Test VersionUpdate parser throwing exception on missing field value + * + * @expectedException \eZ\Publish\Core\REST\Common\Exceptions\Parser + * @expectedExceptionMessage Missing 'fieldValue' element for 'subject' identifier in VersionUpdate. + */ + public function testParseExceptionOnMissingFieldValue() + { + $inputArray = array( + 'initialLanguageCode' => 'eng-US', + 'fields' => array( + 'field' => array( + array( + 'fieldDefinitionIdentifier' => 'subject' + ) + ) + ), + '__url' => '/content/objects/42/versions/1' + ); + + $VersionUpdate = $this->getVersionUpdate(); + $VersionUpdate->parse( $inputArray, $this->getParsingDispatcherMock() ); + } + + /** + * Returns the VersionUpdate parser + * + * @return \eZ\Publish\Core\REST\Server\Input\Parser\VersionUpdate + */ + protected function getVersionUpdate() + { + return new VersionUpdate( + $this->getUrlHandler(), + $this->getContentServiceMock(), + $this->getFieldTypeParserMock() + ); + } + + /** + * Get the field type parser mock object + * + * @return \eZ\Publish\Core\REST\Common\Input\FieldTypeParser; + */ + private function getFieldTypeParserMock() + { + $fieldTypeParserMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Input\\FieldTypeParser', + array(), + array( + $this->getContentServiceMock(), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\ContentTypeService', + array(), + array(), + '', + false + ), + $this->getMock( + 'eZ\\Publish\\Core\\REST\\Client\\FieldTypeService', + array(), + array(), + '', + false + ) + ), + '', + false + ); + + $fieldTypeParserMock->expects( $this->any() ) + ->method( 'parseFieldValue' ) + ->with( 42, 'subject', array() ) + ->will( $this->returnValue( 'foo' ) ); + + return $fieldTypeParserMock; + } + + /** + * Get the Content service mock object + * + * @return \eZ\Publish\API\Repository\ContentService + */ + protected function getContentServiceMock() + { + $contentServiceMock = $this->getMock( + 'eZ\\Publish\\Core\\Repository\\ContentService', + array(), + array(), + '', + false + ); + + $contentServiceMock->expects( $this->any() ) + ->method( 'newContentUpdateStruct' ) + ->will( + $this->returnValue( new ContentUpdateStruct() ) + ); + + return $contentServiceMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/BadRequestExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/BadRequestExceptionTest.php new file mode 100644 index 0000000..e28b50d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/BadRequestExceptionTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Exceptions; +use eZ\Publish\Core\REST\Common; + +class BadRequestExceptionTest extends ExceptionTest +{ + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 400; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Bad Request"; + } + + /** + * Gets the exception + * + * @return \Exception + */ + protected function getException() + { + return new Exceptions\BadRequestException( "Test" ); + } + + /** + * Gets the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\BadRequestException + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\BadRequestException( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/BadStateExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/BadStateExceptionTest.php new file mode 100644 index 0000000..2eeb7a4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/BadStateExceptionTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Tests\Stubs\Exceptions; +use eZ\Publish\Core\REST\Common; + +class BadStateExceptionTest extends ExceptionTest +{ + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 409; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Conflict"; + } + + /** + * Gets the exception + * + * @return \Exception + */ + protected function getException() + { + return new Exceptions\BadStateExceptionStub( "Test" ); + } + + /** + * Gets the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Exception + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\BadStateException( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentListTest.php new file mode 100644 index 0000000..df3c034 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ContentList; +use eZ\Publish\Core\REST\Server\Values\RestContent; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\REST\Common; + +class ContentListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentList = new ContentList( array() ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentList', + ), + $result, + 'Invalid <ContentList> element.', + false + ); + } + + /** + * Test if result contains ContentList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentList+xml', + 'href' => '/content/objects', + ) + ), + $result, + 'Invalid <ContentList> attributes.', + false + ); + } + + /** + * Test if ContentList visitor visits the children + */ + public function testContentListVisitsChildren() + { + $visitor = $this->getContentListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentList = new ContentList( + array( + new RestContent( new ContentInfo() ), + new RestContent( new ContentInfo() ), + ) + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\Rest\\Server\\Values\\RestContent' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentList + ); + } + + /** + * Get the ContentList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentList + */ + protected function getContentListVisitor() + { + return new ValueObjectVisitor\ContentList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentObjectStatesTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentObjectStatesTest.php new file mode 100644 index 0000000..f6ca4d2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentObjectStatesTest.php @@ -0,0 +1,99 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Values\ContentObjectStates; +use eZ\Publish\Core\REST\Common; + +class ContentObjectStatesTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentObjectStates visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentObjectStatesVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $stateList = new ContentObjectStates( array() ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $stateList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentObjectStates element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentObjectStatesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentObjectStates', + ), + $result, + 'Invalid <ContentObjectStates> element.', + false + ); + } + + /** + * Test if result contains ContentObjectStates element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentObjectStatesAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentObjectStates', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentObjectStates+xml', + ) + ), + $result, + 'Invalid <ContentObjectStates> attributes.', + false + ); + } + + /** + * Get the ContentObjectStates visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentObjectStates + */ + protected function getContentObjectStatesVisitor() + { + return new ValueObjectVisitor\ContentObjectStates( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupListTest.php new file mode 100644 index 0000000..3ce9b02 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupListTest.php @@ -0,0 +1,129 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ContentTypeGroupList; +use eZ\Publish\Core\Repository\Values\ContentType; +use eZ\Publish\Core\REST\Common; + +class ContentTypeGroupListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentTypeGroupList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentTypeGroupListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeGroupList = new ContentTypeGroupList( array() ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeGroupList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentTypeGroupList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeGroupListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeGroupList', + ), + $result, + 'Invalid <ContentTypeGroupList> element.', + false + ); + } + + /** + * Test if result contains ContentTypeGroupList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeGroupListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeGroupList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentTypeGroupList+xml', + 'href' => '/content/typegroups', + ) + ), + $result, + 'Invalid <ContentTypeGroupList> attributes.', + false + ); + } + + /** + * Test if ContentTypeGroupList visitor visits the children + */ + public function testContentTypeGroupListVisitsChildren() + { + $visitor = $this->getContentTypeGroupListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeGroupList = new ContentTypeGroupList( + array( + new ContentType\ContentTypeGroup(), + new ContentType\ContentTypeGroup(), + ) + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeGroupList + ); + } + + /** + * Get the ContentTypeGroupList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentTypeGroupList + */ + protected function getContentTypeGroupListVisitor() + { + return new ValueObjectVisitor\ContentTypeGroupList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php new file mode 100644 index 0000000..4899c18 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupRefListTest.php @@ -0,0 +1,182 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\Repository\Values\ContentType\ContentTypeGroup; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ContentTypeGroupRefList; +use eZ\Publish\Core\REST\Common; + +class ContentTypeGroupRefListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentTypeGroupRefList visitor + * + * @return \DOMDocument + */ + public function testVisit() + { + $visitor = $this->getContentTypeGroupRefListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeGroupRefList = new ContentTypeGroupRefList( + new ContentType( + array( + 'id' => 42, + 'fieldDefinitions' => array() + ) + ), + array( + new ContentTypeGroup( + array( + 'id' => 1 + ) + ), + new ContentTypeGroup( + array( + 'id' => 2 + ) + ) + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeGroupRefList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testContentTypeGroupRefListHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList[@href="/content/types/42/groups"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testContentTypeGroupRefListMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList[@media-type="application/vnd.ez.api.ContentTypeGroupRefList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstContentTypeGroupRefHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[1][@href="/content/typegroups/1"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstContentTypeGroupRefMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[1][@media-type="application/vnd.ez.api.ContentTypeGroup+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstContentTypeGroupRefUnlinkHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[1]/unlink[@href="/content/types/42/groups/1"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstContentTypeGroupRefUnlinkMethodCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[1]/unlink[@method="DELETE"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondContentTypeGroupRefHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[2][@href="/content/typegroups/2"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondContentTypeGroupRefMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[2][@media-type="application/vnd.ez.api.ContentTypeGroup+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondContentTypeGroupRefUnlinkHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[2]/unlink[@href="/content/types/42/groups/2"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondContentTypeGroupRefUnlinkMethodCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentTypeGroupRefList/ContentTypeGroupRef[2]/unlink[@method="DELETE"]' ); + } + + /** + * Get the ContentTypeGroupRefList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentTypeGroupRefList + */ + protected function getContentTypeGroupRefListVisitor() + { + return new ValueObjectVisitor\ContentTypeGroupRefList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php new file mode 100644 index 0000000..5e19aba --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeGroupTest.php @@ -0,0 +1,329 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\ContentType; +use eZ\Publish\Core\REST\Common; + +class ContentTypeGroupTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentTypeGroup visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentTypeGroupVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeGroup = new ContentType\ContentTypeGroup( + array( + 'id' => 42, + 'identifier' => 'some-group', + 'creationDate' => new \DateTime( '2012-12-31 19:30 Europe/Zagreb' ), + 'modificationDate' => new \DateTime( '2012-12-31 19:35 Europe/Zagreb' ), + 'creatorId' => 14, + 'modifierId' => 13, + /* @todo uncomment when support for multilingual names and descriptions is added + 'names' => array( + 'eng-GB' => 'Group name EN', + 'eng-US' => 'Group name EN US', + ), + 'descriptions' => array( + 'eng-GB' => 'Group description EN', + 'eng-US' => 'Group description EN US', + ), + 'mainLanguageCode' => 'eng-GB' + */ + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeGroup + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentTypeGroup element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeGroupElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeGroup', + 'children' => array( + 'count' => 7 + ) + ), + $result, + 'Invalid <ContentTypeGroup> element.', + false + ); + } + + /** + * Test if result contains ContentTypeGroup element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeGroupAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeGroup', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentTypeGroup+xml', + 'href' => '/content/typegroups/42', + ) + ), + $result, + 'Invalid <ContentTypeGroup> attributes.', + false + ); + } + + /** + * Test if result contains id value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '42' + ), + $result, + 'Invalid or non-existing <ContentTypeGroup> id value element.', + false + ); + } + + /** + * Test if result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-group' + ), + $result, + 'Invalid or non-existing <ContentTypeGroup> identifier value element.', + false + ); + } + + /** + * Test if result contains created value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsCreatedValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'created', + 'content' => '2012-12-31T19:30:00+01:00' + ), + $result, + 'Invalid or non-existing <ContentTypeGroup> created value element.', + false + ); + } + + /** + * Test if result contains modified value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsModifiedValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'modified', + 'content' => '2012-12-31T19:35:00+01:00' + ), + $result, + 'Invalid or non-existing <ContentTypeGroup> modified value element.', + false + ); + } + + /** + * Test if result contains Creator element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsCreatorElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Creator' + ), + $result, + 'Invalid <Creator> element.', + false + ); + } + + /** + * Test if result contains Creator element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsCreatorAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Creator', + 'attributes' => array( + 'href' => '/user/users/14', + 'media-type' => 'application/vnd.ez.api.User+xml' + ) + ), + $result, + 'Invalid <Creator> element attributes.', + false + ); + } + + /** + * Test if result contains Modifier element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsModifierElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Modifier' + ), + $result, + 'Invalid <Modifier> element.', + false + ); + } + + /** + * Test if result contains Modifier element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsModifierAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Modifier', + 'attributes' => array( + 'href' => '/user/users/13', + 'media-type' => 'application/vnd.ez.api.User+xml' + ) + ), + $result, + 'Invalid <Modifier> element attributes.', + false + ); + } + + /** + * Test if result contains ContentTypes element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypes' + ), + $result, + 'Invalid <ContentTypes> element.', + false + ); + } + + /** + * Test if result contains ContentTypes element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypesAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypes', + 'attributes' => array( + 'href' => '/content/typegroups/42/types', + 'media-type' => 'application/vnd.ez.api.ContentTypeInfoList+xml', + ) + ), + $result, + 'Invalid <ContentTypes> attributes.', + false + ); + } + + /** + * Get the ContentTypeGroup visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentTypeGroup + */ + protected function getContentTypeGroupVisitor() + { + return new ValueObjectVisitor\ContentTypeGroup( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeInfoListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeInfoListTest.php new file mode 100644 index 0000000..002b1fd --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeInfoListTest.php @@ -0,0 +1,138 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ContentTypeInfoList; +use eZ\Publish\Core\Repository\Values\ContentType; +use eZ\Publish\Core\REST\Common; + +class ContentTypeInfoListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentTypeInfoList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentTypeInfoListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeInfoList = new ContentTypeInfoList( array(), '/content/typegroups/2/types' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeInfoList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentTypeInfoList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeInfoListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeInfoList', + ), + $result, + 'Invalid <ContentTypeInfoList> element.', + false + ); + } + + /** + * Test if result contains ContentTypeInfoList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeInfoListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeInfoList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentTypeInfoList+xml', + 'href' => '/content/typegroups/2/types', + ) + ), + $result, + 'Invalid <ContentTypeInfoList> attributes.', + false + ); + } + + /** + * Test if ContentTypeInfoList visitor visits the children + */ + public function testContentTypeInfoListVisitsChildren() + { + $visitor = $this->getContentTypeInfoListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeInfoList = new ContentTypeInfoList( + array( + new ContentType\ContentType( + array( + 'fieldDefinitions' => array() + ) + ), + new ContentType\ContentType( + array( + 'fieldDefinitions' => array() + ) + ), + ), + '/content/typegroups/2/types' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestContentType' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeInfoList + ); + } + + /** + * Get the ContentTypeInfoList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentTypeInfoList + */ + protected function getContentTypeInfoListVisitor() + { + return new ValueObjectVisitor\ContentTypeInfoList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeListTest.php new file mode 100644 index 0000000..28188c6 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ContentTypeListTest.php @@ -0,0 +1,138 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ContentTypeList; +use eZ\Publish\Core\Repository\Values\ContentType; +use eZ\Publish\Core\REST\Common; + +class ContentTypeListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ContentTypeList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getContentTypeListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeList = new ContentTypeList( array(), '/content/typegroups/2/types' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ContentTypeList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeList', + ), + $result, + 'Invalid <ContentTypeList> element.', + false + ); + } + + /** + * Test if result contains ContentTypeList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentTypeListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ContentTypeList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentTypeList+xml', + 'href' => '/content/typegroups/2/types', + ) + ), + $result, + 'Invalid <ContentTypeList> attributes.', + false + ); + } + + /** + * Test if ContentTypeList visitor visits the children + */ + public function testContentTypeListVisitsChildren() + { + $visitor = $this->getContentTypeListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeList = new ContentTypeList( + array( + new ContentType\ContentType( + array( + 'fieldDefinitions' => array() + ) + ), + new ContentType\ContentType( + array( + 'fieldDefinitions' => array() + ) + ), + ), + '/content/typegroups/2/types' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestContentType' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $contentTypeList + ); + } + + /** + * Get the ContentTypeList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ContentTypeList + */ + protected function getContentTypeListVisitor() + { + return new ValueObjectVisitor\ContentTypeList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ExceptionTest.php new file mode 100644 index 0000000..f503001 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ExceptionTest.php @@ -0,0 +1,185 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common; + +class ExceptionTest extends ValueObjectVisitorBaseTest +{ + /** + * @var \PHPUnit_Framework_MockObject_MockObject + * + * @todo: This and its creation could be moved to common base test class + * for input parsers. + */ + protected $visitor; + + /** + * Test the Exception visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getExceptionVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $exception = $this->getException(); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $exception + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ErrorMessage element and error code + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsErrorCode( $result ) + { + $this->assertTag( + array( + 'tag' => 'ErrorMessage', + 'descendant' => array( + 'tag' => 'errorCode', + 'content' => (string)$this->getExpectedStatusCode(), + ) + ), + $result, + 'Invalid <ErrorMessage> element.', + false + ); + } + + /** + * Test if result contains ErrorMessage element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsErrorMessage( $result ) + { + $this->assertTag( + array( + 'tag' => 'ErrorMessage', + 'descendant' => array( + 'tag' => 'errorMessage', + 'content' => $this->getExpectedMessage(), + ) + ), + $result, + 'Invalid <ErrorMessage> element.', + false + ); + } + + /** + * Test if result contains ErrorMessage element and description + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsErrorDescription( $result ) + { + $this->assertTag( + array( + 'tag' => 'ErrorMessage', + 'descendant' => array( + 'tag' => 'errorDescription', + ) + ), + $result, + 'Invalid <ErrorMessage> element.', + false + ); + } + + /** + * Test if ErrorMessage element contains required attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsExceptionAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ErrorMessage', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ErrorMessage+xml', + ) + ), + $result, + 'Invalid <ErrorMessage> attributes.', + false + ); + } + + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 500; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Internal Server Error"; + } + + /** + * Gets the exception + * + * @return \Exception + */ + protected function getException() + { + return new \Exception( "Test" ); + } + + /** + * Gets the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Exception + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\Exception( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/FieldDefinitionListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/FieldDefinitionListTest.php new file mode 100644 index 0000000..8c792e0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/FieldDefinitionListTest.php @@ -0,0 +1,111 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\FieldDefinitionList; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server; +use eZ\Publish\Core\REST\Common; + +use eZ\Publish\Core\Repository\Values; + +class FieldDefinitionListTest extends ValueObjectVisitorBaseTest +{ + /** + * @return \DOMDocument + */ + public function testVisitFieldDefinitionList() + { + $visitor = $this->getContentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restContent = $this->getBasicFieldDefinitionList(); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestFieldDefinition' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restContent + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + protected function getBasicFieldDefinitionList() + { + return new Server\Values\FieldDefinitionList( + new Values\ContentType\ContentType( + array( + 'id' => 'contentTypeId', + 'status' => Values\ContentType\ContentType::STATUS_DEFINED, + 'fieldDefinitions' => array(), + ) + ), + array( + new Values\ContentType\FieldDefinition( + array( 'id' => 'fieldDefinitionId_1' ) + ), + new Values\ContentType\FieldDefinition( + array( 'id' => 'fieldDefinitionId_2' ) + ) + ) + ); + } + + public function provideXpathAssertions() + { + return array( + array( + '/FieldDefinitions[@href="/content/types/contentTypeId/fieldDefinitions"]' + ), + array( + '/FieldDefinitions[@media-type="application/vnd.ez.api.FieldDefinitionList+xml"]' + ), + ); + } + + /** + * @param string $xpath + * @param \DOMDocument $dom + * + * @depends testVisitFieldDefinitionList + * @dataProvider provideXpathAssertions + */ + public function testGeneratedXml( $xpath, \DOMDocument $dom ) + { + $this->assertXPath( $dom, $xpath ); + } + + /** + * Get the Content visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\FieldDefinitionList + */ + protected function getContentVisitor() + { + return new ValueObjectVisitor\FieldDefinitionList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ForbiddenExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ForbiddenExceptionTest.php new file mode 100644 index 0000000..6393dfd --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ForbiddenExceptionTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Exceptions; +use eZ\Publish\Core\REST\Common; + +class ForbiddenExceptionTest extends ExceptionTest +{ + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 403; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Forbidden"; + } + + /** + * Gets the exception + * + * @return \Exception + */ + protected function getException() + { + return new Exceptions\ForbiddenException( "Test" ); + } + + /** + * Gets the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ForbiddenException + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\ForbiddenException( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/InvalidArgumentExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/InvalidArgumentExceptionTest.php new file mode 100644 index 0000000..bbe44bc --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/InvalidArgumentExceptionTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Common\Exceptions; +use eZ\Publish\Core\REST\Common; + +class InvalidArgumentExceptionTest extends ExceptionTest +{ + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 406; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Not Acceptable"; + } + + /** + * Gets the exception + * + * @return \Exception + */ + protected function getException() + { + return new Exceptions\InvalidArgumentException( "Test" ); + } + + /** + * Gets the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\InvalidArgumentException + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\InvalidArgumentException( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/LocationListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/LocationListTest.php new file mode 100644 index 0000000..29d2e28 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/LocationListTest.php @@ -0,0 +1,100 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\LocationList; +use eZ\Publish\Core\REST\Common; + +class LocationListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the LocationList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getLocationListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $locationList = new LocationList( array(), '/content/objects/42/locations' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $locationList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains LocationList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'LocationList', + ), + $result, + 'Invalid <LocationList> element.', + false + ); + } + + /** + * Test if result contains LocationList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'LocationList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.LocationList+xml', + 'href' => '/content/objects/42/locations', + ) + ), + $result, + 'Invalid <LocationList> attributes.', + false + ); + } + + /** + * Get the LocationList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\LocationList + */ + protected function getLocationListVisitor() + { + return new ValueObjectVisitor\LocationList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/NoContentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/NoContentTest.php new file mode 100644 index 0000000..f3908b8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/NoContentTest.php @@ -0,0 +1,58 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Common; + +class NoContentTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the NoContent visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getNoContentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $noContent = new Values\NoContent(); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setStatus' ) + ->with( $this->equalTo( 204 ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $noContent + ); + + $this->assertTrue( $generator->isEmpty() ); + } + + /** + * Get the NoContent visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\NoContent + */ + protected function getNoContentVisitor() + { + return new ValueObjectVisitor\NoContent( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/NotFoundExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/NotFoundExceptionTest.php new file mode 100644 index 0000000..b4696c2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/NotFoundExceptionTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Tests\Stubs\Exceptions; +use eZ\Publish\Core\REST\Common; + +class NotFoundExceptionTest extends ExceptionTest +{ + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 404; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Not Found"; + } + + /** + * Get the exception + * + * @return \Exception + */ + protected function getException() + { + return new Exceptions\NotFoundExceptionStub( "Test" ); + } + + /** + * Get the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Exception + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\NotFoundException( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupListTest.php new file mode 100644 index 0000000..d700b46 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupListTest.php @@ -0,0 +1,129 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ObjectStateGroupList; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectStateGroup; +use eZ\Publish\Core\REST\Common; + +class ObjectStateGroupListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ObjectStateGroupList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateGroupListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $groupList = new ObjectStateGroupList( array() ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $groupList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ObjectStateGroupList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateGroupListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateGroupList', + ), + $result, + 'Invalid <ObjectStateGroupList> element.', + false + ); + } + + /** + * Test if result contains ObjectStateGroupList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateGroupListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateGroupList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ObjectStateGroupList+xml', + 'href' => '/content/objectstategroups', + ) + ), + $result, + 'Invalid <ObjectStateGroupList> attributes.', + false + ); + } + + /** + * Test if ObjectStateGroupList visitor visits the children + */ + public function testObjectStateGroupListVisitsChildren() + { + $visitor = $this->getObjectStateGroupListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $groupList = new ObjectStateGroupList( + array( + new ObjectStateGroup(), + new ObjectStateGroup(), + ) + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $groupList + ); + } + + /** + * Get the ObjectStateGroupList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ObjectStateGroupList + */ + protected function getObjectStateGroupListVisitor() + { + return new ValueObjectVisitor\ObjectStateGroupList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php new file mode 100644 index 0000000..e5a3b58 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateGroupTest.php @@ -0,0 +1,242 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\ObjectState; +use eZ\Publish\Core\REST\Common; + +class ObjectStateGroupTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ObjectStateGroup visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateGroupVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectStateGroup = new ObjectState\ObjectStateGroup( + array( + 'id' => 42, + 'identifier' => 'test-group', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB', 'eng-US' ), + 'names' => array( + 'eng-GB' => 'Group name EN', + 'eng-US' => 'Group name EN US', + ), + 'descriptions' => array( + 'eng-GB' => 'Group description EN', + 'eng-US' => 'Group description EN US', + ) + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectStateGroup + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ObjectStateGroup element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateGroupElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateGroup', + 'children' => array( + 'count' => 6 + ) + ), + $result, + 'Invalid <ObjectStateGroup> element.', + false + ); + } + + /** + * Test if result contains ObjectStateGroup element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateGroupAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateGroup', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ObjectStateGroup+xml', + 'href' => '/content/objectstategroups/42', + ) + ), + $result, + 'Invalid <ObjectStateGroup> attributes.', + false + ); + } + + /** + * Test if result contains id value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '42' + ), + $result, + 'Invalid or non-existing <ObjectStateGroup> id value element.', + false + ); + } + + /** + * Test if result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'test-group' + ), + $result, + 'Invalid or non-existing <ObjectStateGroup> identifier value element.', + false + ); + } + + /** + * Test if result contains defaultLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDefaultLanguageCodeValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'defaultLanguageCode', + 'content' => 'eng-GB' + ), + $result, + 'Invalid or non-existing <ObjectStateGroup> defaultLanguageCode value element.', + false + ); + } + + /** + * Test if result contains languageCodes value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLanguageCodesValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'languageCodes', + 'content' => 'eng-GB,eng-US' + ), + $result, + 'Invalid or non-existing <ObjectStateGroup> languageCodes value element.', + false + ); + } + + /** + * Test if result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Test if result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Get the ObjectStateGroup visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ObjectStateGroup + */ + protected function getObjectStateGroupVisitor() + { + return new ValueObjectVisitor\ObjectStateGroup( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateListTest.php new file mode 100644 index 0000000..dec4429 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ObjectStateListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\ObjectStateList; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState; +use eZ\Publish\Core\REST\Common; + +class ObjectStateListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ObjectStateList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $stateList = new ObjectStateList( array(), 42 ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $stateList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ObjectStateList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateList', + ), + $result, + 'Invalid <ObjectStateList> element.', + false + ); + } + + /** + * Test if result contains ObjectStateList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ObjectStateList+xml', + 'href' => '/content/objectstategroups/42/objectstates', + ) + ), + $result, + 'Invalid <ObjectStateList> attributes.', + false + ); + } + + /** + * Test if ObjectStateList visitor visits the children + */ + public function testObjectStateListVisitsChildren() + { + $visitor = $this->getObjectStateListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectStateList = new ObjectStateList( + array( + new ObjectState(), + new ObjectState(), + ), + 42 + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Common\\Values\\RestObjectState' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectStateList + ); + } + + /** + * Get the ObjectStateList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ObjectStateList + */ + protected function getObjectStateListVisitor() + { + return new ValueObjectVisitor\ObjectStateList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PermanentRedirectTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PermanentRedirectTest.php new file mode 100644 index 0000000..ca78823 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PermanentRedirectTest.php @@ -0,0 +1,61 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Common; + +class PermanentRedirectTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the PermanentRedirect visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getPermanentRedirectVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $redirect = new Values\PermanentRedirect( '/some/redirect/uri' ); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setStatus' ) + ->with( $this->equalTo( 301 ) ); + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setHeader' ) + ->with( $this->equalTo( 'Location' ), $this->equalTo( '/some/redirect/uri' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $redirect + ); + + $this->assertTrue( $generator->isEmpty() ); + } + + /** + * Get the PermanentRedirect visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\PermanentRedirect + */ + protected function getPermanentRedirectVisitor() + { + return new ValueObjectVisitor\PermanentRedirect( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PolicyListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PolicyListTest.php new file mode 100644 index 0000000..cf667df --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PolicyListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\PolicyList; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; + +class PolicyListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the PolicyList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getPolicyListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $policyList = new PolicyList( array(), '/user/roles/42/policies' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $policyList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains PolicyList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'PolicyList', + ), + $result, + 'Invalid <PolicyList> element.', + false + ); + } + + /** + * Test if result contains PolicyList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'PolicyList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.PolicyList+xml', + 'href' => '/user/roles/42/policies', + ) + ), + $result, + 'Invalid <PolicyList> attributes.', + false + ); + } + + /** + * Test if PolicyList visitor visits the children + */ + public function testPolicyListVisitsChildren() + { + $visitor = $this->getPolicyListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $policyList = new PolicyList( + array( + new User\Policy(), + new User\Policy(), + ), + 42 + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\User\\Policy' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $policyList + ); + } + + /** + * Get the PolicyList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\PolicyList + */ + protected function getPolicyListVisitor() + { + return new ValueObjectVisitor\PolicyList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PolicyTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PolicyTest.php new file mode 100644 index 0000000..d3a03c0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/PolicyTest.php @@ -0,0 +1,215 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; + +class PolicyTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the Policy visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getPolicyVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $contentTypeLimitation = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $contentTypeLimitation->limitationValues = array( 1, 2, 3 ); + + $policy = new User\Policy( + array( + 'id' => 42, + 'roleId' => '84', + 'module' => 'content', + 'function' => 'delete', + 'limitations' => array( + 'Class' => $contentTypeLimitation + ) + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $policy + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Policy element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Policy', + 'children' => array( + 'less_than' => 5, + 'greater_than' => 2 + ) + ), + $result, + 'Invalid <Policy> element.', + false + ); + } + + /** + * Test if result contains Policy element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPolicyAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Policy', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Policy+xml', + 'href' => '/user/roles/84/policies/42', + ) + ), + $result, + 'Invalid <Policy> attributes.', + false + ); + } + + /** + * Test if result contains id value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '42' + ), + $result, + 'Invalid or non-existing <Policy> id value element.', + false + ); + } + + /** + * Test if result contains module value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsModuleValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'module', + 'content' => 'content' + ), + $result, + 'Invalid or non-existing <Policy> module value element.', + false + ); + } + + /** + * Test if result contains function value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsFunctionValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'function', + 'content' => 'delete' + ), + $result, + 'Invalid or non-existing <Policy> function value element.', + false + ); + } + + /** + * Test if result contains limitations element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitations' + ), + $result, + 'Invalid <limitations> element.', + false + ); + } + + /** + * Test if result contains limitations attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLimitationsAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'limitations' + ), + $result, + 'Invalid <limitations> attributes.', + false + ); + } + + /** + * Get the Policy visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Policy + */ + protected function getPolicyVisitor() + { + return new ValueObjectVisitor\Policy( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RelationListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RelationListTest.php new file mode 100644 index 0000000..4c9507a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RelationListTest.php @@ -0,0 +1,131 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\RelationList; +use eZ\Publish\Core\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class RelationListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RelationList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRelationListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $relationList = new RelationList( array(), 42, 21 ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $relationList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Relations element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRelationsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Relations', + ), + $result, + 'Invalid <Relations> element.', + false + ); + } + + /** + * Test if result contains Relations element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRelationsAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Relations', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RelationList+xml', + 'href' => '/content/objects/42/versions/21/relations', + ) + ), + $result, + 'Invalid <Relations> attributes.', + false + ); + } + + /** + * Test if RelationList visitor visits the children + */ + public function testRelationListVisitsChildren() + { + $visitor = $this->getRelationListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $relationList = new RelationList( + array( + new Content\Relation(), + new Content\Relation(), + ), + 23, + 1 + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestRelation' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $relationList + ); + } + + /** + * Get the RelationList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RelationList + */ + protected function getRelationListVisitor() + { + return new ValueObjectVisitor\RelationList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceCreatedTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceCreatedTest.php new file mode 100644 index 0000000..4ff0d66 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/ResourceCreatedTest.php @@ -0,0 +1,63 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Common; + +class ResourceCreatedTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the ResourceCreated visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getResourceCreatedVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $resourceCreated = new Values\ResourceCreated( + '/some/redirect/uri' + ); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setStatus' ) + ->with( $this->equalTo( 201 ) ); + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setHeader' ) + ->with( $this->equalTo( 'Location' ), $this->equalTo( '/some/redirect/uri' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $resourceCreated + ); + + $this->assertTrue( $generator->isEmpty() ); + } + + /** + * Get the ResourceCreated visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\ResourceCreated + */ + protected function getResourceCreatedVisitor() + { + return new ValueObjectVisitor\ResourceCreated( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php new file mode 100644 index 0000000..306eee4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTest.php @@ -0,0 +1,385 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\RestContent; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values; +use eZ\Publish\Core\REST\Common; + +class RestContentTest extends ValueObjectVisitorBaseTest +{ + /** + * @return \DOMDocument + */ + public function testVisitWithoutEmbeddedVersion() + { + $visitor = $this->getContentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restContent = $this->getBasicRestContent(); + + $this->getVisitorMock()->expects( $this->never() ) + ->method( 'visitValueObject' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restContent + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + protected function getBasicRestContent() + { + return new RestContent( + new Values\Content\ContentInfo( + array( + 'id' => 'content23', + 'name' => 'Sindelfingen', + 'sectionId' => 'section23', + 'currentVersionNo' => 5, + 'published' => true, + 'ownerId' => 'user23', + 'modificationDate' => new \DateTime( '2012-09-05 15:27 Europe/Berlin' ), + 'publishedDate' => null, + 'alwaysAvailable' => true, + 'remoteId' => 'abc123', + 'mainLanguageCode' => 'eng-US', + 'mainLocationId' => 'location23', + 'contentType' => new Values\ContentType\ContentType( + array( + 'id' => 'contentType23', + 'fieldDefinitions' => array(), + ) + ) + ) + ), + new Values\Content\Location( + array( + 'pathString' => '/1/2/23', + ) + ), + null + ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testContentHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content[@href="/content/objects/content23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testContentIdCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content[@id="content23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testContentMediaTypeWithoutVersionCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content[@media-type="application/vnd.ez.api.ContentInfo+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testContentRemoteIdCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content[@remoteId="abc123"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testContentTypeHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/ContentType[@href="/content/types/contentType23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testContentTypeMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/ContentType[@media-type="application/vnd.ez.api.ContentType+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testNameCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Name[text()="Sindelfingen"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testVersionsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Versions[@href="/content/objects/content23/versions"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testVersionsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Versions[@media-type="application/vnd.ez.api.VersionList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testCurrentVersionHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/CurrentVersion[@href="/content/objects/content23/currentversion"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testCurrentVersionMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/CurrentVersion[@media-type="application/vnd.ez.api.Version+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSectionHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Section[@href="/content/sections/section23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSectionMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Section[@media-type="application/vnd.ez.api.Section+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLocationHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/MainLocation[@href="/content/locations/1/2/23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLocationMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/MainLocation[@media-type="application/vnd.ez.api.Location+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLocationsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Locations[@href="/content/objects/content23/locations"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLocationsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Locations[@media-type="application/vnd.ez.api.LocationList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testOwnerHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Owner[@href="/user/users/user23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testOwnerMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/Owner[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLastModificationDateCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/lastModificationDate[text()="2012-09-05T15:27:00+02:00"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLanguageCodeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/mainLanguageCode[text()="eng-US"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testAlwaysAvailableCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/alwaysAvailable[text()="true"]' ); + } + + /** + * @return \DOMDocument + */ + public function testVisitWithEmbeddedVersion() + { + $visitor = $this->getContentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restContent = $this->getBasicRestContent(); + $restContent->currentVersion = new Values\Content\Content( + array( + 'internalFields' => array() + ) + ); + $restContent->relations = array(); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\Version' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restContent + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithEmbeddedVersion + */ + public function testContentMediaTypeWithVersionCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content[@media-type="application/vnd.ez.api.Content+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithEmbeddedVersion + */ + public function testEmbeddedCurrentVersionHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/CurrentVersion[@href="/content/objects/content23/currentversion"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithEmbeddedVersion + */ + public function testEmbeddedCurrentVersionMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/Content/CurrentVersion[@media-type="application/vnd.ez.api.Version+xml"]' ); + } + + /** + * Get the Content visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestContent + */ + protected function getContentVisitor() + { + return new ValueObjectVisitor\RestContent( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php new file mode 100644 index 0000000..e1e9b71 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestContentTypeTest.php @@ -0,0 +1,326 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values; +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\REST\Server\Values\RestContentType; + +class RestContentTypeTest extends ValueObjectVisitorBaseTest +{ + /** + * @return \DOMDocument + */ + public function testVisitDefinedType() + { + $visitor = $this->getRestContentTypeVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restContentType = $this->getBasicContentType(); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\FieldDefinitionList' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restContentType + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + protected function getBasicContentType() + { + return new RestContentType( + new Values\ContentType\ContentType( + array( + 'id' => 'contentTypeId', + 'status' => Values\ContentType\ContentType::STATUS_DEFINED, + 'identifier' => 'contentTypeIdentifier', + 'creationDate' => new \DateTime( '2012-09-06 19:30 Europe/Berlin' ), + 'modificationDate' => new \DateTime( '2012-09-06 19:32 Europe/Berlin' ), + 'creatorId' => 'creatorId', + 'modifierId' => 'modifierId', + 'remoteId' => 'remoteId', + 'urlAliasSchema' => 'urlAliasSchema', + 'nameSchema' => 'nameSchema', + 'isContainer' => true, + 'mainLanguageCode' => 'eng-US', + 'defaultAlwaysAvailable' => false, + 'defaultSortField' => Values\Content\Location::SORT_FIELD_SECTION, + 'defaultSortOrder' => Values\Content\Location::SORT_ORDER_DESC, + + 'names' => array( 'eng-US' => 'Sindelfingen', 'eng-GB' => 'Bielefeld' ), + 'descriptions' => array( 'eng-GB' => 'Sindelfingen', 'eng-US' => 'Bielefeld' ), + + // "Mock" + 'fieldDefinitions' => array(), + ) + ), + array() + ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testContentTypeHref( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType[@href="/content/types/contentTypeId"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testContentTypeMediaTyp( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType[@media-type="application/vnd.ez.api.ContentType+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testId( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/id[text()="contentTypeId"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testStatus( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/status[text()="DEFINED"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testIdentifier( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/identifier[text()="contentTypeIdentifier"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testFirstName( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/names/value[@languageCode="eng-US" and text()="Sindelfingen"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testSecondName( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/names/value[@languageCode="eng-GB" and text()="Bielefeld"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testFirstDescription( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/descriptions/value[@languageCode="eng-GB" and text()="Sindelfingen"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testSecondDescription( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/descriptions/value[@languageCode="eng-US" and text()="Bielefeld"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testCreationDate( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/creationDate[text()="2012-09-06T19:30:00+02:00"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testModificationDate( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/modificationDate[text()="2012-09-06T19:32:00+02:00"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testCreatorHref( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/Creator[@href="/user/users/creatorId"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testCreatorMediaType( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/Creator[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testModifierHref( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/Modifier[@href="/user/users/modifierId"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testModifierMediaType( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/Modifier[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testRemoteId( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/remoteId[text()="remoteId"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testUrlAliasSchema( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/urlAliasSchema[text()="urlAliasSchema"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testNameSchema( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/nameSchema[text()="nameSchema"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testIsContainer( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/isContainer[text()="true"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testMainLanguageCode( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/mainLanguageCode[text()="eng-US"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testDefaultAlwaysAvailable( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/defaultAlwaysAvailable[text()="false"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testDefaultSortField( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/defaultSortField[text()="SECTION"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitDefinedType + */ + public function testDefaultSortOrder( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/ContentType/defaultSortOrder[text()="DESC"]' ); + } + + /** + * Get the RestContentType visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestContentType + */ + protected function getRestContentTypeVisitor() + { + return new ValueObjectVisitor\RestContentType( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestFieldDefinitionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestFieldDefinitionTest.php new file mode 100644 index 0000000..8cf384d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestFieldDefinitionTest.php @@ -0,0 +1,157 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\RestFieldDefinition; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server; +use eZ\Publish\Core\REST\Common; + +use eZ\Publish\Core\Repository\Values; + +class RestFieldDefinitionTest extends ValueObjectVisitorBaseTest +{ + protected $fieldTypeSerializerMock; + + public function setUp() + { + $this->fieldTypeSerializerMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Output\\FieldTypeSerializer', + array(), + array(), + '', + false + ); + } + + /** + * @return \DOMDocument + */ + public function testVisitRestFieldDefinition() + { + $visitor = $this->getContentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restFieldDefinition = $this->getBasicRestFieldDefinition(); + + $this->fieldTypeSerializerMock->expects( $this->once() ) + ->method( 'serializeFieldDefaultValue' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ), + $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition' ), + $this->equalTo( + 'my default value text' + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restFieldDefinition + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + protected function getBasicRestFieldDefinition() + { + return new Server\Values\RestFieldDefinition( + new Values\ContentType\ContentType( + array( + 'id' => 'contentTypeId', + 'status' => Values\ContentType\ContentType::STATUS_DEFINED, + 'fieldDefinitions' => array(), + ) + ), + new Values\ContentType\FieldDefinition( + array( + 'id' => 'fieldDefinitionId_23', + 'fieldSettings' => array( 'setting' => 'foo' ), + 'validatorConfiguration' => array( 'validator' => 'bar' ), + 'identifier' => 'title', + 'fieldGroup' => 'abstract-field-group', + 'position' => 2, + 'fieldTypeIdentifier' => 'my-field-type', + 'isTranslatable' => true, + 'isRequired' => false, + 'isSearchable' => true, + 'isInfoCollector' => false, + 'defaultValue' => 'my default value text', + 'names' => array( 'eng-US' => 'Sindelfingen' ), + 'descriptions' => array( 'eng-GB' => 'Bielefeld' ), + ) + ) + ); + } + + public function provideXpathAssertions() + { + $xpathAssertions = array( + '/FieldDefinition[@href="/content/types/contentTypeId/fieldDefinitions/fieldDefinitionId_23"]', + '/FieldDefinition[@media-type="application/vnd.ez.api.FieldDefinition+xml"]', + '/FieldDefinition/id[text()="fieldDefinitionId_23"]', + '/FieldDefinition/identifier[text()="title"]', + '/FieldDefinition/fieldType[text()="my-field-type"]', + '/FieldDefinition/fieldGroup[text()="abstract-field-group"]', + '/FieldDefinition/position[text()="2"]', + '/FieldDefinition/isTranslatable[text()="true"]', + '/FieldDefinition/isRequired[text()="false"]', + '/FieldDefinition/isInfoCollector[text()="false"]', + '/FieldDefinition/isSearchable[text()="true"]', + '/FieldDefinition/names', + '/FieldDefinition/names/value[@languageCode="eng-US" and text()="Sindelfingen"]', + '/FieldDefinition/descriptions/value[@languageCode="eng-GB" and text()="Bielefeld"]', + ); + + return array_map( + function ( $xpath ) + { + return array( $xpath ); + }, + $xpathAssertions + ); + } + + /** + * @param string $xpath + * @param \DOMDocument $dom + * + * @depends testVisitRestFieldDefinition + * @dataProvider provideXpathAssertions + */ + public function testGeneratedXml( $xpath, \DOMDocument $dom ) + { + $this->assertXPath( $dom, $xpath ); + } + + /** + * Get the Content visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestFieldDefinition + */ + protected function getContentVisitor() + { + return new ValueObjectVisitor\RestFieldDefinition( + new Common\UrlHandler\eZPublish(), + $this->fieldTypeSerializerMock + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php new file mode 100644 index 0000000..b1a16cf --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestLocationTest.php @@ -0,0 +1,453 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\RestLocation; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\REST\Common; + +class RestLocationTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the Location visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getLocationVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $location = new RestLocation( + new Location( + array( + 'id' => 42, + 'priority' => 0, + 'hidden' => false, + 'invisible' => true, + 'remoteId' => 'remote-id', + 'parentLocationId' => 21, + 'pathString' => '/1/2/21/42/', + 'depth' => 3, + 'sortField' => Location::SORT_FIELD_PATH, + 'sortOrder' => Location::SORT_ORDER_ASC, + 'contentInfo' => new ContentInfo( + array( + 'id' => 42 + ) + ) + ) + ), + // Dummy value for ChildCount + 0 + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $location + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Location element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Location', + 'children' => array( + 'count' => 13 + ) + ), + $result, + 'Invalid <Location> element.', + false + ); + } + + /** + * Test if result contains Location element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLocationAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Location', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Location+xml', + 'href' => '/content/locations/1/2/21/42', + ) + ), + $result, + 'Invalid <Location> attributes.', + false + ); + } + + /** + * Test if result contains id value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '42' + ), + $result, + 'Invalid or non-existing <Location> id value element.', + false + ); + } + + /** + * Test if result contains priority value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPriorityValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'priority', + 'content' => '0' + ), + $result, + 'Invalid or non-existing <Location> priority value element.', + false + ); + } + + /** + * Test if result contains hidden value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsHiddenValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'hidden', + 'content' => 'false' + ), + $result, + 'Invalid or non-existing <Location> hidden value element.', + false + ); + } + + /** + * Test if result contains invisible value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsInvisibleValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'invisible', + 'content' => 'true' + ), + $result, + 'Invalid or non-existing <Location> invisible value element.', + false + ); + } + + /** + * Test if result contains remoteId value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRemoteIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'remoteId', + 'content' => 'remote-id' + ), + $result, + 'Invalid or non-existing <Location> remoteId value element.', + false + ); + } + + /** + * Test if result contains Children element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsChildrenElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Children' + ), + $result, + 'Invalid <Children> element.', + false + ); + } + + /** + * Test if result contains Children element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsChildrenAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Children', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.LocationList+xml', + 'href' => '/content/locations/1/2/21/42/children', + ) + ), + $result, + 'Invalid <Children> attributes.', + false + ); + } + + /** + * Test if result contains ParentLocation element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsParentLocationElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ParentLocation' + ), + $result, + 'Invalid <ParentLocation> element.', + false + ); + } + + /** + * Test if result contains ParentLocation element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsParentLocationAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ParentLocation', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Location+xml', + 'href' => '/content/locations/1/2/21', + ) + ), + $result, + 'Invalid <ParentLocation> attributes.', + false + ); + } + + /** + * Test if result contains Content element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Content' + ), + $result, + 'Invalid <Content> element.', + false + ); + } + + /** + * Test if result contains Content element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Content', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Content+xml', + 'href' => '/content/objects/42', + ) + ), + $result, + 'Invalid <Content> attributes.', + false + ); + } + + /** + * Test if result contains pathString value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPathStringValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'pathString', + 'content' => '/1/2/21/42/' + ), + $result, + 'Invalid or non-existing <Location> pathString value element.', + false + ); + } + + /** + * Test if result contains depth value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDepthValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'depth', + 'content' => '3' + ), + $result, + 'Invalid or non-existing <Location> depth value element.', + false + ); + } + + /** + * Test if result contains sortField value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortFieldValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortField', + 'content' => 'PATH' + ), + $result, + 'Invalid or non-existing <Location> sortField value element.', + false + ); + } + + /** + * Test if result contains sortOrder value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortOrderValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortOrder', + 'content' => 'ASC' + ), + $result, + 'Invalid or non-existing <Location> sortOrder value element.', + false + ); + } + + /** + * Test if result contains childCount value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsChildCountValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'childCount', + 'content' => '0' + ), + $result, + 'Invalid or non-existing <Location> childCount value element.', + false + ); + } + + /** + * Get the Location visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestLocation + */ + protected function getLocationVisitor() + { + return new ValueObjectVisitor\RestLocation( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php new file mode 100644 index 0000000..e860608 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestObjectStateTest.php @@ -0,0 +1,309 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState; +use eZ\Publish\Core\REST\Common\Values; +use eZ\Publish\Core\REST\Common; + +class RestObjectStateTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RestObjectState visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getObjectStateVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $objectState = new Values\RestObjectState( + new ObjectState( + array( + 'id' => 42, + 'identifier' => 'test-state', + 'priority' => '0', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB', 'eng-US' ), + 'names' => array( + 'eng-GB' => 'State name EN', + 'eng-US' => 'State name EN US', + ), + 'descriptions' => array( + 'eng-GB' => 'State description EN', + 'eng-US' => 'State description EN US', + ) + ) + ), + 21 + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $objectState + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains ObjectState element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectState', + 'children' => array( + 'count' => 8 + ) + ), + $result, + 'Invalid <ObjectState> element.', + false + ); + } + + /** + * Test if result contains ObjectState element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectState', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ObjectState+xml', + 'href' => '/content/objectstategroups/21/objectstates/42', + ) + ), + $result, + 'Invalid <ObjectState> attributes.', + false + ); + } + + /** + * Test if result contains ObjectStateGroup element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateGroupElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateGroup', + ), + $result, + 'Invalid <ObjectStateGroup> element.', + false + ); + } + + /** + * Test if result contains ObjectStateGroup element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsObjectStateGroupAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ObjectStateGroup', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ObjectStateGroup+xml', + 'href' => '/content/objectstategroups/21', + ) + ), + $result, + 'Invalid <ObjectStateGroup> attributes.', + false + ); + } + + /** + * Test if result contains id value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '42' + ), + $result, + 'Invalid or non-existing <ObjectState> id value element.', + false + ); + } + + /** + * Test if result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'test-state' + ), + $result, + 'Invalid or non-existing <ObjectState> identifier value element.', + false + ); + } + + /** + * Test if result contains priority value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPriorityValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'priority', + 'content' => '0' + ), + $result, + 'Invalid or non-existing <ObjectState> priority value element.', + false + ); + } + + /** + * Test if result contains defaultLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDefaultLanguageCodeValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'defaultLanguageCode', + 'content' => 'eng-GB' + ), + $result, + 'Invalid or non-existing <ObjectState> defaultLanguageCode value element.', + false + ); + } + + /** + * Test if result contains languageCodes value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLanguageCodesValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'languageCodes', + 'content' => 'eng-GB,eng-US' + ), + $result, + 'Invalid or non-existing <ObjectState> languageCodes value element.', + false + ); + } + + /** + * Test if result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Test if result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Get the ObjectState visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestObjectState + */ + protected function getObjectStateVisitor() + { + return new ValueObjectVisitor\RestObjectState( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php new file mode 100644 index 0000000..56473dc --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestRelationTest.php @@ -0,0 +1,203 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\REST\Server\Values\RestRelation; + +class RestRelationTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RestRelation visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRelationVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $relation = new RestRelation( + new Content\Relation( + array( + 'id' => 42, + 'sourceContentInfo' => new Content\ContentInfo( + array( + 'id' => 1, + ) + ), + 'destinationContentInfo' => new Content\ContentInfo( + array( + 'id' => 2, + ) + ), + 'type' => Content\Relation::FIELD, + 'sourceFieldDefinitionIdentifier' => 'relation_field' + ) + ), + 1, + 1 + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $relation + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Relation element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRelationElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Relation', + 'children' => array( + 'less_than' => 5, + 'greater_than' => 3, + ) + ), + $result, + 'Invalid <Relation> element.', + false + ); + } + + /** + * Test if result contains Relation element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRelationAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Relation', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Relation+xml', + 'href' => '/content/objects/1/versions/1/relations/42', + ) + ), + $result, + 'Invalid <Relation> attributes.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSourceContentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'SourceContent', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', + 'href' => '/content/objects/1', + ) + ), + $result, + 'Invalid or non-existing <Relation> SourceContent element.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDestinationContentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'DestinationContent', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', + 'href' => '/content/objects/2', + ) + ), + $result, + 'Invalid or non-existing <Relation> DestinationContent element.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSourceFieldDefinitionIdentifierElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'SourceFieldDefinitionIdentifier', + 'content' => 'relation_field', + ), + $result, + 'Invalid or non-existing <Relation> SourceFieldDefinitionIdentifier value element.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRelationTypeElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RelationType', + 'content' => 'ATTRIBUTE', + ), + $result, + 'Invalid or non-existing <Relation> RelationType value element.', + false + ); + } + + /** + * Get the Relation visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestRelation + */ + protected function getRelationVisitor() + { + return new ValueObjectVisitor\RestRelation( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php new file mode 100644 index 0000000..7fc7bc9 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestTrashItemTest.php @@ -0,0 +1,411 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\RestTrashItem; +use eZ\Publish\Core\Repository\Values\Content\TrashItem; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\REST\Common; + +class RestTrashItemTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the TrashItem visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getTrashItemVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $trashItem = new RestTrashItem( + new TrashItem( + array( + 'id' => 42, + 'priority' => 0, + 'hidden' => false, + 'invisible' => true, + 'remoteId' => 'remote-id', + 'parentLocationId' => 21, + 'pathString' => '/1/2/21/42/', + 'depth' => 3, + 'contentInfo' => new ContentInfo( + array( + 'id' => 84 + ) + ), + 'sortField' => TrashItem::SORT_FIELD_NAME, + 'sortOrder' => TrashItem::SORT_ORDER_DESC + ) + ), + // Dummy value for ChildCount + 0 + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $trashItem + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains TrashItem element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsTrashItemElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'TrashItem', + 'children' => array( + 'count' => 12 + ) + ), + $result, + 'Invalid <TrashItem> element.', + false + ); + } + + /** + * Test if result contains TrashItem element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsTrashItemAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'TrashItem', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.TrashItem+xml', + 'href' => '/content/trash/42', + ) + ), + $result, + 'Invalid <TrashItem> attributes.', + false + ); + } + + /** + * Test if result contains id value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '42' + ), + $result, + 'Invalid or non-existing <TrashItem> id value element.', + false + ); + } + + /** + * Test if result contains priority value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPriorityValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'priority', + 'content' => '0' + ), + $result, + 'Invalid or non-existing <TrashItem> priority value element.', + false + ); + } + + /** + * Test if result contains hidden value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsHiddenValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'hidden', + 'content' => 'false' + ), + $result, + 'Invalid or non-existing <TrashItem> hidden value element.', + false + ); + } + + /** + * Test if result contains invisible value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsInvisibleValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'invisible', + 'content' => 'true' + ), + $result, + 'Invalid or non-existing <TrashItem> invisible value element.', + false + ); + } + + /** + * Test if result contains remoteId value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRemoteIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'remoteId', + 'content' => 'remote-id' + ), + $result, + 'Invalid or non-existing <TrashItem> remoteId value element.', + false + ); + } + + /** + * Test if result contains ParentLocation element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsParentLocationElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'ParentLocation' + ), + $result, + 'Invalid <ParentLocation> element.', + false + ); + } + + /** + * Test if result contains ParentLocation element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsParentLocationAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'ParentLocation', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Location+xml', + 'href' => '/content/locations/1/2/21', + ) + ), + $result, + 'Invalid <ParentLocation> attributes.', + false + ); + } + + /** + * Test if result contains pathString value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPathStringValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'pathString', + 'content' => '/1/2/21/42/' + ), + $result, + 'Invalid or non-existing <TrashItem> pathString value element.', + false + ); + } + + /** + * Test if result contains depth value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDepthValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'depth', + 'content' => '3' + ), + $result, + 'Invalid or non-existing <TrashItem> depth value element.', + false + ); + } + + /** + * Test if result contains childCount value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsChildCountValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'childCount', + 'content' => '0' + ), + $result, + 'Invalid or non-existing <TrashItem> childCount value element.', + false + ); + } + + /** + * Test if result contains Content element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Content' + ), + $result, + 'Invalid <Content> element.', + false + ); + } + + /** + * Test if result contains Content element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsContentAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Content', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Content+xml', + 'href' => '/content/objects/84', + ) + ), + $result, + 'Invalid <Content> attributes.', + false + ); + } + + /** + * Test if result contains sortField value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortFieldValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortField', + 'content' => 'NAME' + ), + $result, + 'Invalid or non-existing <TrashItem> sortField value element.', + false + ); + } + + /** + * Test if result contains sortOrder value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSortOrderValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sortOrder', + 'content' => 'DESC' + ), + $result, + 'Invalid or non-existing <TrashItem> sortOrder value element.', + false + ); + } + + /** + * Get the TrashItem visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestTrashItem + */ + protected function getTrashItemVisitor() + { + return new ValueObjectVisitor\RestTrashItem( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php new file mode 100644 index 0000000..168d4fe --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupRoleAssignmentTest.php @@ -0,0 +1,158 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\REST\Server\Values; + +class RestUserGroupRoleAssignmentTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RestUserGroupRoleAssignment visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRestUserGroupRoleAssignmentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $userGroupRoleAssignment = new Values\RestUserGroupRoleAssignment( + new User\UserGroupRoleAssignment( + array( + 'role' => new User\Role( + array( + 'id' => 42, + 'identifier' => 'some-role' + ) + ) + ) + ), + '/1/5/14' + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $userGroupRoleAssignment + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains RoleAssignment element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAssignmentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleAssignment', + 'children' => array( + 'count' => 1 + ) + ), + $result, + 'Invalid <RoleAssignment> element.', + false + ); + } + + /** + * Test if result contains RoleAssignment element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAssignmentAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleAssignment', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RoleAssignment+xml', + 'href' => '/user/groups/1/5/14/roles/42', + ) + ), + $result, + 'Invalid <RoleAssignment> attributes.', + false + ); + } + + /** + * Test if result contains Role element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role' + ), + $result, + 'Invalid <Role> element.', + false + ); + } + + /** + * Test if result contains Role element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Role+xml', + 'href' => '/user/roles/42', + ) + ), + $result, + 'Invalid <Role> attributes.', + false + ); + } + + /** + * Get the RestUserGroupRoleAssignment visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestUserGroupRoleAssignment + */ + protected function getRestUserGroupRoleAssignmentVisitor() + { + return new ValueObjectVisitor\RestUserGroupRoleAssignment( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php new file mode 100644 index 0000000..9130e0e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserGroupTest.php @@ -0,0 +1,379 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\RestUserGroup; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values; +use eZ\Publish\Core\REST\Common; + +class RestUserGroupTest extends ValueObjectVisitorBaseTest +{ + /** + * @return \DOMDocument + */ + public function testVisitWithoutEmbeddedVersion() + { + $visitor = $this->getUserGroupVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restUserGroup = $this->getBasicRestUserGroup(); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'visitValueObject' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restUserGroup + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + protected function getBasicRestUserGroup() + { + return new RestUserGroup( + new Values\User\UserGroup(), + new Values\Content\ContentInfo( + array( + 'id' => 'content23', + 'name' => 'Sindelfingen', + 'sectionId' => 'section23', + 'currentVersionNo' => 5, + 'published' => true, + 'ownerId' => 'user23', + 'modificationDate' => new \DateTime( '2012-09-05 15:27 Europe/Berlin' ), + 'publishedDate' => new \DateTime( '2012-09-05 15:27 Europe/Berlin' ), + 'alwaysAvailable' => true, + 'remoteId' => 'abc123', + 'mainLanguageCode' => 'eng-US', + 'mainLocationId' => 'location23', + 'contentType' => new Values\ContentType\ContentType( + array( + 'id' => 'contentType23', + 'fieldDefinitions' => array(), + ) + ) + ) + ), + new Values\Content\Location( + array( + 'pathString' => '/1/2/23', + 'path' => array( 1, 2, 23 ) + ) + ), + array() + ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup[@href="/user/groups/1/2/23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupIdCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup[@id="content23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupMediaTypeWithoutVersionCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup[@media-type="application/vnd.ez.api.UserGroup+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupRemoteIdCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup[@remoteId="abc123"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupTypeHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/ContentType[@href="/content/types/contentType23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupTypeMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/ContentType[@media-type="application/vnd.ez.api.ContentType+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testNameCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/name[text()="Sindelfingen"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testVersionsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Versions[@href="/content/objects/content23/versions"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testVersionsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Versions[@media-type="application/vnd.ez.api.VersionList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSectionHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Section[@href="/content/sections/section23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSectionMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Section[@media-type="application/vnd.ez.api.Section+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLocationHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/MainLocation[@href="/content/locations/1/2/23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLocationMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/MainLocation[@media-type="application/vnd.ez.api.Location+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLocationsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Locations[@href="/content/objects/content23/locations"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLocationsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Locations[@media-type="application/vnd.ez.api.LocationList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testOwnerHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Owner[@href="/user/users/user23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testOwnerMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Owner[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLastModificationDateCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/lastModificationDate[text()="2012-09-05T15:27:00+02:00"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLanguageCodeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/mainLanguageCode[text()="eng-US"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testAlwaysAvailableCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/alwaysAvailable[text()="true"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testParentUserGroupHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/ParentUserGroup[@href="/user/groups/1/2"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSubgroupsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Subgroups[@href="/user/groups/1/2/23/subgroups"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUsersHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Users[@href="/user/groups/1/2/23/users"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testRolesHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Roles[@href="/user/groups/1/2/23/roles"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testParentUserGroupMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/ParentUserGroup[@media-type="application/vnd.ez.api.UserGroup+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSubgroupsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Subgroups[@media-type="application/vnd.ez.api.UserGroupList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUsersMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Users[@media-type="application/vnd.ez.api.UserList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testRolesMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroup/Roles[@media-type="application/vnd.ez.api.RoleAssignmentList+xml"]' ); + } + + /** + * Get the UserGroup visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestUserGroup + */ + protected function getUserGroupVisitor() + { + return new ValueObjectVisitor\RestUserGroup( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php new file mode 100644 index 0000000..3412d16 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserRoleAssignmentTest.php @@ -0,0 +1,158 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\REST\Server\Values; + +class RestUserRoleAssignmentTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RestUserRoleAssignment visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRestUserRoleAssignmentVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $userRoleAssignment = new Values\RestUserRoleAssignment( + new User\UserRoleAssignment( + array( + 'role' => new User\Role( + array( + 'id' => 42, + 'identifier' => 'some-role' + ) + ) + ) + ), + 14 + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $userRoleAssignment + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains RoleAssignment element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAssignmentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleAssignment', + 'children' => array( + 'count' => 1 + ) + ), + $result, + 'Invalid <RoleAssignment> element.', + false + ); + } + + /** + * Test if result contains RoleAssignment element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAssignmentAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleAssignment', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RoleAssignment+xml', + 'href' => '/user/users/14/roles/42', + ) + ), + $result, + 'Invalid <RoleAssignment> attributes.', + false + ); + } + + /** + * Test if result contains Role element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role' + ), + $result, + 'Invalid <Role> element.', + false + ); + } + + /** + * Test if result contains Role element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Role+xml', + 'href' => '/user/roles/42', + ) + ), + $result, + 'Invalid <Role> attributes.', + false + ); + } + + /** + * Get the UserRoleAssignment visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestUserRoleAssignment + */ + protected function getRestUserRoleAssignmentVisitor() + { + return new ValueObjectVisitor\RestUserRoleAssignment( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php new file mode 100644 index 0000000..68ef16e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RestUserTest.php @@ -0,0 +1,339 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Values\RestUser; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values; +use eZ\Publish\Core\REST\Common; + +class RestUserTest extends ValueObjectVisitorBaseTest +{ + /** + * @return \DOMDocument + */ + public function testVisitWithoutEmbeddedVersion() + { + $visitor = $this->getUserVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $restUser = $this->getBasicRestUser(); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'visitValueObject' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $restUser + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + protected function getBasicRestUser() + { + return new RestUser( + new Values\User\User(), + new Values\Content\ContentInfo( + array( + 'id' => 'content23', + 'name' => 'Sindelfingen', + 'sectionId' => 'section23', + 'currentVersionNo' => 5, + 'published' => true, + 'ownerId' => 'user23', + 'modificationDate' => new \DateTime( '2012-09-05 15:27 Europe/Berlin' ), + 'publishedDate' => new \DateTime( '2012-09-05 15:27 Europe/Berlin' ), + 'alwaysAvailable' => true, + 'remoteId' => 'abc123', + 'mainLanguageCode' => 'eng-US', + 'mainLocationId' => 'location23', + 'contentType' => new Values\ContentType\ContentType( + array( + 'id' => 'contentType23', + 'fieldDefinitions' => array(), + ) + ) + ) + ), + new Values\Content\Location( + array( + 'pathString' => '/1/2/23', + 'path' => array( 1, 2, 23 ) + ) + ), + array() + ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User[@href="/user/users/content23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserIdCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User[@id="content23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserMediaTypeWithoutVersionCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserRemoteIdCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User[@remoteId="abc123"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserTypeHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/ContentType[@href="/content/types/contentType23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserTypeMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/ContentType[@media-type="application/vnd.ez.api.ContentType+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testNameCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/name[text()="Sindelfingen"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testVersionsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Versions[@href="/content/objects/content23/versions"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testVersionsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Versions[@media-type="application/vnd.ez.api.VersionList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSectionHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Section[@href="/content/sections/section23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testSectionMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Section[@media-type="application/vnd.ez.api.Section+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLocationHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/MainLocation[@href="/content/locations/1/2/23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLocationMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/MainLocation[@media-type="application/vnd.ez.api.Location+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLocationsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Locations[@href="/content/objects/content23/locations"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLocationsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Locations[@media-type="application/vnd.ez.api.LocationList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testOwnerHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Owner[@href="/user/users/user23"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testOwnerMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Owner[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testLastModificationDateCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/lastModificationDate[text()="2012-09-05T15:27:00+02:00"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testMainLanguageCodeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/mainLanguageCode[text()="eng-US"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testAlwaysAvailableCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/alwaysAvailable[text()="true"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupsHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/UserGroups[@href="/user/users/content23/groups"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testUserGroupsMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/UserGroups[@media-type="application/vnd.ez.api.UserGroupList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testRolesHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Roles[@href="/user/users/content23/roles"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisitWithoutEmbeddedVersion + */ + public function testRolesMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/User/Roles[@media-type="application/vnd.ez.api.RoleAssignmentList+xml"]' ); + } + + /** + * Get the User visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RestUser + */ + protected function getUserVisitor() + { + return new ValueObjectVisitor\RestUser( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleAssignmentListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleAssignmentListTest.php new file mode 100644 index 0000000..f003cad --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleAssignmentListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\RoleAssignmentList; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; + +class RoleAssignmentListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RoleAssignmentList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRoleAssignmentListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleAssignmentList = new RoleAssignmentList( array(), '42' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleAssignmentList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains RoleAssignmentList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleAssignmentList', + ), + $result, + 'Invalid <RoleAssignmentList> element.', + false + ); + } + + /** + * Test if result contains RoleAssignmentList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAssignmentListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleAssignmentList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RoleAssignmentList+xml', + 'href' => '/user/users/42/roles', + ) + ), + $result, + 'Invalid <RoleAssignmentList> attributes.', + false + ); + } + + /** + * Test if RoleAssignmentList visitor visits the children + */ + public function testRoleAssignmentListVisitsChildren() + { + $visitor = $this->getRoleAssignmentListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleAssignmentList = new RoleAssignmentList( + array( + new User\UserRoleAssignment(), + new User\UserRoleAssignment() + ), + 42 + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserRoleAssignment' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleAssignmentList + ); + } + + /** + * Get the RoleAssignmentList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RoleAssignmentList + */ + protected function getRoleAssignmentListVisitor() + { + return new ValueObjectVisitor\RoleAssignmentList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleListTest.php new file mode 100644 index 0000000..33dfa44 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\RoleList; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; + +class RoleListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the RoleList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRoleListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleList = new RoleList( array(), '/user/roles' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains RoleList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleList', + ), + $result, + 'Invalid <RoleList> element.', + false + ); + } + + /** + * Test if result contains RoleList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'RoleList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.RoleList+xml', + 'href' => '/user/roles', + ) + ), + $result, + 'Invalid <RoleList> attributes.', + false + ); + } + + /** + * Test if RoleList visitor visits the children + */ + public function testRoleListVisitsChildren() + { + $visitor = $this->getRoleListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $roleList = new RoleList( + array( + new User\Role(), + new User\Role(), + ), + '/user/roles' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\User\\Role' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $roleList + ); + } + + /** + * Get the RoleList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\RoleList + */ + protected function getRoleListVisitor() + { + return new ValueObjectVisitor\RoleList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php new file mode 100644 index 0000000..3f5d8c9 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/RoleTest.php @@ -0,0 +1,248 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\User; +use eZ\Publish\Core\REST\Common; + +class RoleTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the Role visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getRoleVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $role = new User\Role( + array( + 'id' => 42, + 'identifier' => 'some-role', + /* @todo uncomment when support for multilingual names and descriptions is added + 'mainLanguageCode' => 'eng-GB', + 'names' => array( + 'eng-GB' => 'Role name EN', + 'eng-US' => 'Role name EN US', + ), + 'descriptions' => array( + 'eng-GB' => 'Role description EN', + 'eng-US' => 'Role description EN US', + ) + */ + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $role + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Role element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <Role> element.', + false + ); + } + + /** + * Test if result contains Role element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsRoleAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Role', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Role+xml', + 'href' => '/user/roles/42', + ) + ), + $result, + 'Invalid <Role> attributes.', + false + ); + } + + /** + * Test if result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-role' + ), + $result, + 'Invalid or non-existing <Role> identifier value element.', + false + ); + } + + /** + * Test if result contains mainLanguageCode value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsMainLanguageCodeValueElement( $result ) + { + $this->markTestSkipped( '@todo uncomment when support for multilingual names and descriptions is added' ); + $this->assertTag( + array( + 'tag' => 'mainLanguageCode', + 'content' => 'eng-GB' + ), + $result, + 'Invalid or non-existing <Role> mainLanguageCode value element.', + false + ); + } + + /** + * Test if result contains names element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNamesElement( $result ) + { + $this->markTestSkipped( '@todo uncomment when support for multilingual names and descriptions is added' ); + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <names> element.', + false + ); + } + + /** + * Test if result contains descriptions element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDescriptionsElement( $result ) + { + $this->markTestSkipped( '@todo uncomment when support for multilingual names and descriptions is added' ); + $this->assertTag( + array( + 'tag' => 'descriptions', + 'children' => array( + 'count' => 2 + ) + ), + $result, + 'Invalid <descriptions> element.', + false + ); + } + + /** + * Test if result contains Policies element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPoliciesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Policies' + ), + $result, + 'Invalid <Policies> element.', + false + ); + } + + /** + * Test if result contains Policies element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPoliciesAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Policies', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.PolicyList+xml', + 'href' => '/user/roles/42/policies', + ) + ), + $result, + 'Invalid <Policies> attributes.', + false + ); + } + + /** + * Get the Role visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Role + */ + protected function getRoleVisitor() + { + return new ValueObjectVisitor\Role( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/SectionListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/SectionListTest.php new file mode 100644 index 0000000..b3bc3e2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/SectionListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\SectionList; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class SectionListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the SectionList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getSectionListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $sectionList = new SectionList( array(), '/content/sections' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains SectionList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'SectionList', + ), + $result, + 'Invalid <SectionList> element.', + false + ); + } + + /** + * Test if result contains SectionList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'SectionList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.SectionList+xml', + 'href' => '/content/sections', + ) + ), + $result, + 'Invalid <SectionList> attributes.', + false + ); + } + + /** + * Test if SectionList visitor visits the children + */ + public function testSectionListVisitsChildren() + { + $visitor = $this->getSectionListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $sectionList = new SectionList( + array( + new Content\Section(), + new Content\Section(), + ), + '/content/sections' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Section' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $sectionList + ); + } + + /** + * Get the SectionList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\SectionList + */ + protected function getSectionListVisitor() + { + return new ValueObjectVisitor\SectionList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/SectionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/SectionTest.php new file mode 100644 index 0000000..7eefa88 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/SectionTest.php @@ -0,0 +1,170 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class SectionTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the Section visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getSectionVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $section = new Content\Section( + array( + 'id' => 23, + 'identifier' => 'some-section', + 'name' => 'Some Section', + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $section + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Section element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Section', + 'children' => array( + 'less_than' => 4, + 'greater_than' => 2, + ) + ), + $result, + 'Invalid <Section> element.', + false + ); + } + + /** + * Test if result contains Section element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Section', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Section+xml', + 'href' => '/content/sections/23', + ) + ), + $result, + 'Invalid <Section> attributes.', + false + ); + } + + /** + * Test if result contains sectionId value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSectionIdValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sectionId', + 'content' => '23', + ), + $result, + 'Invalid or non-existing <Section> sectionId value element.', + false + ); + } + + /** + * Test if result contains identifier value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIdentifierValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'identifier', + 'content' => 'some-section', + ), + $result, + 'Invalid or non-existing <Section> identifier value element.', + false + ); + } + + /** + * Test if result contains name value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsNameValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'name', + 'content' => 'Some Section', + ), + $result, + 'Invalid or non-existing <Section> name value element.', + false + ); + } + + /** + * Get the Section visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Section + */ + protected function getSectionVisitor() + { + return new ValueObjectVisitor\Section( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/TemporaryRedirectTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/TemporaryRedirectTest.php new file mode 100644 index 0000000..b7a82e2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/TemporaryRedirectTest.php @@ -0,0 +1,61 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Common; + +class TemporaryRedirectTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the TemporaryRedirect visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getTemporaryRedirectVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $redirect = new Values\TemporaryRedirect( '/some/redirect/uri' ); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setStatus' ) + ->with( $this->equalTo( 307 ) ); + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'setHeader' ) + ->with( $this->equalTo( 'Location' ), $this->equalTo( '/some/redirect/uri' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $redirect + ); + + $this->assertTrue( $generator->isEmpty() ); + } + + /** + * Get the TemporaryRedirect visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\TemporaryRedirect + */ + protected function getTemporaryRedirectVisitor() + { + return new ValueObjectVisitor\TemporaryRedirect( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/TrashTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/TrashTest.php new file mode 100644 index 0000000..fc5d789 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/TrashTest.php @@ -0,0 +1,139 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\Trash; +use eZ\Publish\Core\REST\Server\Values\RestTrashItem; +use eZ\Publish\Core\REST\Common; +use eZ\Publish\Core\Repository\Values\Content; + +class TrashTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the Trash visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getTrashVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $trash = new Trash( array(), '/content/trash' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $trash + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains Trash element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsTrashElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Trash', + ), + $result, + 'Invalid <Trash> element.', + false + ); + } + + /** + * Test if result contains Trash element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsTrashAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Trash', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Trash+xml', + 'href' => '/content/trash', + ) + ), + $result, + 'Invalid <Trash> attributes.', + false + ); + } + + /** + * Test if Trash visitor visits the children + */ + public function testTrashVisitsChildren() + { + $visitor = $this->getTrashVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $trashList = new Trash( + array( + new RestTrashItem( + new Content\TrashItem(), + // Dummy value for ChildCount + 0 + ), + new RestTrashItem( + new Content\TrashItem(), + // Dummy value for ChildCount + 0 + ), + ), + '/content/trash' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestTrashItem' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $trashList + ); + } + + /** + * Get the Trash visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Trash + */ + protected function getTrashVisitor() + { + return new ValueObjectVisitor\Trash( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasListTest.php new file mode 100644 index 0000000..4f46d41 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasListTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\URLAliasList; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class URLAliasListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the URLAliasList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getURLAliasListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlAliasList = new URLAliasList( array(), '/content/urlaliases' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlAliasList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains UrlAliasList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlAliasListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlAliasList', + ), + $result, + 'Invalid <UrlAliasList> element.', + false + ); + } + + /** + * Test if result contains UrlAliasList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlAliasListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlAliasList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.UrlAliasList+xml', + 'href' => '/content/urlaliases', + ) + ), + $result, + 'Invalid <UrlAliasList> attributes.', + false + ); + } + + /** + * Test if URLAliasList visitor visits the children + */ + public function testURLAliasListVisitsChildren() + { + $visitor = $this->getURLAliasListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlAliasList = new URLAliasList( + array( + new Content\URLAlias(), + new Content\URLAlias(), + ), + '/content/urlaliases' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlAliasList + ); + } + + /** + * Get the URLAliasList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\URLAliasList + */ + protected function getURLAliasListVisitor() + { + return new ValueObjectVisitor\URLAliasList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasRefListTest.php new file mode 100644 index 0000000..2dcfa1d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasRefListTest.php @@ -0,0 +1,110 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\URLAliasRefList; +use eZ\Publish\API\Repository\Values\Content\URLAlias; +use eZ\Publish\Core\REST\Common; + +class URLAliasRefListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the URLAliasRefList visitor + * + * @return \DOMDocument + */ + public function testVisit() + { + $visitor = $this->getURLAliasRefListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlAliasRefList = new URLAliasRefList( + array( + new URLAlias( + array( + 'id' => 'some-id' + ) + ) + ), + '/some/path' + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlAliasRefList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUrlAliasRefListHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UrlAliasRefList[@href="/some/path"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUrlAliasRefListMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UrlAliasRefList[@media-type="application/vnd.ez.api.UrlAliasRefList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUrlAliasHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UrlAliasRefList/UrlAlias[@href="/content/urlaliases/some-id"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUrlAliasMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UrlAliasRefList/UrlAlias[@media-type="application/vnd.ez.api.UrlAlias+xml"]' ); + } + + /** + * Get the URLAliasRefList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\URLAliasRefList + */ + protected function getURLAliasRefListVisitor() + { + return new ValueObjectVisitor\URLAliasRefList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasTest.php new file mode 100644 index 0000000..e72b41b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLAliasTest.php @@ -0,0 +1,258 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class URLAliasTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the URLAlias visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getURLAliasVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlAlias = new Content\URLAlias( + array( + 'id' => 'some-id', + 'type' => 1, + 'destination' => '/destination/url', + 'path' => '/some/path', + 'languageCodes' => array( 'eng-GB', 'eng-US' ), + 'alwaysAvailable' => true, + 'isHistory' => true, + 'isCustom' => false, + 'forward' => false + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlAlias + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains UrlAlias element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlAliasElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlAlias', + 'children' => array( + 'less_than' => 8, + 'greater_than' => 6, + ) + ), + $result, + 'Invalid <UrlAlias> element.', + false + ); + } + + /** + * Test if result contains UrlAlias element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlAliasAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlAlias', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.UrlAlias+xml', + 'href' => '/content/urlaliases/some-id', + 'id' => 'some-id', + 'type' => 'RESOURCE' + ) + ), + $result, + 'Invalid <UrlAlias> attributes.', + false + ); + } + + /** + * Test if result contains url value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'resource', + 'content' => '/destination/url', + ), + $result, + 'Invalid or non-existing <UrlAlias> url value element.', + false + ); + } + + /** + * Test if result contains path value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsPathValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'path', + 'content' => '/some/path', + ), + $result, + 'Invalid or non-existing <UrlAlias> path value element.', + false + ); + } + + /** + * Test if result contains languageCodes value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsLanguageCodesValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'languageCodes', + 'content' => 'eng-GB,eng-US', + ), + $result, + 'Invalid or non-existing <UrlAlias> languageCodes value element.', + false + ); + } + + /** + * Test if result contains alwaysAvailable value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsAlwaysAvailableValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'alwaysAvailable', + 'content' => 'true', + ), + $result, + 'Invalid or non-existing <UrlAlias> alwaysAvailable value element.', + false + ); + } + + /** + * Test if result contains isHistory value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsIsHistoryValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'isHistory', + 'content' => 'true', + ), + $result, + 'Invalid or non-existing <UrlAlias> isHistory value element.', + false + ); + } + + /** + * Test if result contains forward value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsForwardValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'forward', + 'content' => 'false', + ), + $result, + 'Invalid or non-existing <UrlAlias> forward value element.', + false + ); + } + + /** + * Test if result contains custom value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsCustomValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'custom', + 'content' => 'false', + ), + $result, + 'Invalid or non-existing <UrlAlias> custom value element.', + false + ); + } + + /** + * Get the URLAlias visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\URLAlias + */ + protected function getURLAliasVisitor() + { + return new ValueObjectVisitor\URLAlias( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLWildcardListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLWildcardListTest.php new file mode 100644 index 0000000..983a254 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLWildcardListTest.php @@ -0,0 +1,129 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\URLWildcardList; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class URLWildcardListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the URLWildcardList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getURLWildcardListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlWildcardList = new URLWildcardList( array() ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlWildcardList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains UrlWildcardList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlWildcardListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlWildcardList', + ), + $result, + 'Invalid <UrlWildcardList> element.', + false + ); + } + + /** + * Test if result contains UrlWildcardList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlWildcardListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlWildcardList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.UrlWildcardList+xml', + 'href' => '/content/urlwildcards', + ) + ), + $result, + 'Invalid <UrlWildcardList> attributes.', + false + ); + } + + /** + * Test if URLWildcardList visitor visits the children + */ + public function testURLWildcardListVisitsChildren() + { + $visitor = $this->getURLWildcardListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlWildcardList = new URLWildcardList( + array( + new Content\URLWildcard(), + new Content\URLWildcard(), + ) + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\URLWildcard' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlWildcardList + ); + } + + /** + * Get the URLWildcardList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\URLWildcardList + */ + protected function getURLWildcardListVisitor() + { + return new ValueObjectVisitor\URLWildcardList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLWildcardTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLWildcardTest.php new file mode 100644 index 0000000..8051378 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/URLWildcardTest.php @@ -0,0 +1,172 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class URLWildcardTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the URLWildcard visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getURLWildcardVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $urlWildcard = new Content\URLWildcard( + array( + 'id' => 42, + 'sourceUrl' => '/source/url', + 'destinationUrl' => '/destination/url', + 'forward' => true + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $urlWildcard + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains UrlWildcard element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlWildcardElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlWildcard', + 'children' => array( + 'less_than' => 4, + 'greater_than' => 2, + ) + ), + $result, + 'Invalid <UrlWildcard> element.', + false + ); + } + + /** + * Test if result contains UrlWildcard element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUrlWildcardAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'UrlWildcard', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.UrlWildcard+xml', + 'href' => '/content/urlwildcards/42', + 'id' => '42', + ) + ), + $result, + 'Invalid <UrlWildcard> attributes.', + false + ); + } + + /** + * Test if result contains sourceUrl value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsSourceUrlValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'sourceUrl', + 'content' => '/source/url', + ), + $result, + 'Invalid or non-existing <UrlWildcard> sourceUrl value element.', + false + ); + } + + /** + * Test if result contains destinationUrl value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsDestinationUrlValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'destinationUrl', + 'content' => '/destination/url', + ), + $result, + 'Invalid or non-existing <UrlWildcard> destinationUrl value element.', + false + ); + } + + /** + * Test if result contains forward value element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsForwardValueElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'forward', + 'content' => 'true', + ), + $result, + 'Invalid or non-existing <UrlWildcard> forward value element.', + false + ); + } + + /** + * Get the URLWildcard visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\URLWildcard + */ + protected function getURLWildcardVisitor() + { + return new ValueObjectVisitor\URLWildcard( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UnauthorizedExceptionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UnauthorizedExceptionTest.php new file mode 100644 index 0000000..60358bc --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UnauthorizedExceptionTest.php @@ -0,0 +1,59 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\API\Repository\Tests\Stubs\Exceptions; +use eZ\Publish\Core\REST\Common; + +class UnauthorizedExceptionTest extends ExceptionTest +{ + /** + * Get expected status code + * + * @return int + */ + protected function getExpectedStatusCode() + { + return 401; + } + + /** + * Get expected message + * + * @return string + */ + protected function getExpectedMessage() + { + return "Unauthorized"; + } + + /** + * Gets the exception + * + * @return \Exception + */ + protected function getException() + { + return new Exceptions\UnauthorizedExceptionStub( "Test" ); + } + + /** + * Gets the exception visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\UnauthorizedException + */ + protected function getExceptionVisitor() + { + return new ValueObjectVisitor\UnauthorizedException( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupListTest.php new file mode 100644 index 0000000..8e63840 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupListTest.php @@ -0,0 +1,151 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\UserGroupList; +use eZ\Publish\Core\REST\Server\Values\RestUserGroup; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common; + +class UserGroupListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the UserGroupList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getUserGroupListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $userGroupList = new UserGroupList( array(), '/some/path' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $userGroupList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains UserGroupList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUserGroupListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'UserGroupList', + ), + $result, + 'Invalid <UserGroupList> element.', + false + ); + } + + /** + * Test if result contains UserGroupList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUserGroupListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'UserGroupList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.UserGroupList+xml', + 'href' => '/some/path', + ) + ), + $result, + 'Invalid <UserGroupList> attributes.', + false + ); + } + + /** + * Test if UserGroupList visitor visits the children + */ + public function testUserGroupListVisitsChildren() + { + $visitor = $this->getUserGroupListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $userGroupList = new UserGroupList( + array( + new RestUserGroup( + new Content( + array( + 'internalFields' => array() + ) + ), + new ContentInfo(), + new Location(), + array() + ), + new RestUserGroup( + new Content( + array( + 'internalFields' => array() + ) + ), + new ContentInfo(), + new Location(), + array() + ), + ), + '/some/path' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestUserGroup' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $userGroupList + ); + } + + /** + * Get the UserGroupList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\UserGroupList + */ + protected function getUserGroupListVisitor() + { + return new ValueObjectVisitor\UserGroupList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php new file mode 100644 index 0000000..fa1183b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserGroupRefListTest.php @@ -0,0 +1,192 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\Repository\Values\User\UserGroup; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\UserGroupRefList; +use eZ\Publish\Core\REST\Server\Values\RestUserGroup; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common; + +class UserGroupRefListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the UserGroupRefList visitor + * + * @return \DOMDocument + */ + public function testVisit() + { + $visitor = $this->getUserGroupRefListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $UserGroupRefList = new UserGroupRefList( + array( + new RestUserGroup( + new UserGroup(), + new ContentInfo(), + new Location( + array( + 'pathString' => '/1/5/14', + 'path' => array( 1, 5, 14 ) + ) + ), + array() + ), + new RestUserGroup( + new UserGroup(), + new ContentInfo(), + new Location( + array( + 'pathString' => '/1/5/13', + 'path' => array( 1, 5, 13 ) + ) + ), + array() + ) + ), + '/some/path', + 14 + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $UserGroupRefList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUserGroupRefListHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList[@href="/some/path"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUserGroupRefListMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList[@media-type="application/vnd.ez.api.UserGroupRefList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstUserGroupHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[1][@href="/user/groups/1/5/14"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstUserGroupMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[1][@media-type="application/vnd.ez.api.UserGroup+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstUserGroupUnassignHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[1]/unassign[@href="/user/users/14/groups/14"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testFirstUserGroupUnassignMethodCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[1]/unassign[@method="DELETE"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondUserGroupHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[2][@href="/user/groups/1/5/13"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondUserGroupMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[2][@media-type="application/vnd.ez.api.UserGroup+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondUserGroupUnassignHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[2]/unassign[@href="/user/users/14/groups/13"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testSecondUserGroupUnassignMethodCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserGroupRefList/UserGroup[2]/unassign[@method="DELETE"]' ); + } + + /** + * Get the UserGroupRefList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\UserGroupRefList + */ + protected function getUserGroupRefListVisitor() + { + return new ValueObjectVisitor\UserGroupRefList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserListTest.php new file mode 100644 index 0000000..5d3cedb --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserListTest.php @@ -0,0 +1,151 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\UserList; +use eZ\Publish\Core\REST\Server\Values\RestUser; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common; + +class UserListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the UserList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getUserListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $userList = new UserList( array(), '/some/path' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $userList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains UserList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUserListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'UserList', + ), + $result, + 'Invalid <UserList> element.', + false + ); + } + + /** + * Test if result contains UserList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsUserListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'UserList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.UserList+xml', + 'href' => '/some/path', + ) + ), + $result, + 'Invalid <UserList> attributes.', + false + ); + } + + /** + * Test if UserList visitor visits the children + */ + public function testUserListVisitsChildren() + { + $visitor = $this->getUserListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $userList = new UserList( + array( + new RestUser( + new Content( + array( + 'internalFields' => array() + ) + ), + new ContentInfo(), + new Location(), + array() + ), + new RestUser( + new Content( + array( + 'internalFields' => array() + ) + ), + new ContentInfo(), + new Location(), + array() + ), + ), + '/some/path' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Server\\Values\\RestUser' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $userList + ); + } + + /** + * Get the UserList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\UserList + */ + protected function getUserListVisitor() + { + return new ValueObjectVisitor\UserList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php new file mode 100644 index 0000000..4f9353c --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/UserRefListTest.php @@ -0,0 +1,119 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; +use eZ\Publish\Core\Repository\Values\User\User; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\UserRefList; +use eZ\Publish\Core\REST\Server\Values\RestUser; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common; + +class UserRefListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the UserRefList visitor + * + * @return \DOMDocument + */ + public function testVisit() + { + $visitor = $this->getUserRefListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $UserRefList = new UserRefList( + array( + new RestUser( + new User(), + new ContentInfo( + array( + 'id' => 14 + ) + ), + new Location(), + array() + ) + ), + '/some/path' + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $UserRefList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + $dom = new \DOMDocument(); + $dom->loadXml( $result ); + + return $dom; + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUserRefListHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserRefList[@href="/some/path"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUserRefListMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserRefList[@media-type="application/vnd.ez.api.UserRefList+xml"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUserHrefCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserRefList/User[@href="/user/users/14"]' ); + } + + /** + * @param \DOMDocument $dom + * + * @depends testVisit + */ + public function testUserMediaTypeCorrect( \DOMDocument $dom ) + { + $this->assertXPath( $dom, '/UserRefList/User[@media-type="application/vnd.ez.api.User+xml"]' ); + } + + /** + * Get the UserRefList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\UserRefList + */ + protected function getUserRefListVisitor() + { + return new ValueObjectVisitor\UserRefList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php new file mode 100644 index 0000000..bca53fc --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionInfoTest.php @@ -0,0 +1,279 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values\Content; +use eZ\Publish\Core\REST\Common; + +class VersionInfoTest extends ValueObjectVisitorBaseTest +{ + /** + * @var \DateTime + */ + protected $creationDate; + + /** + * @var \DateTime + */ + protected $modificationDate; + + public function setUp() + { + $this->creationDate = new \DateTime( '2012-05-19 12:23 Europe/Berlin' ); + $this->modificationDate = new \DateTime( '2012-08-31 23:42 Europe/Berlin' ); + } + + /** + * Test the VersionInfo visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getVersionInfoVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $section = new Content\VersionInfo( + array( + 'id' => 23, + 'versionNo' => 5, + 'status' => Content\VersionInfo::STATUS_PUBLISHED, + 'creationDate' => $this->creationDate, + 'creatorId' => 14, + 'modificationDate' => $this->modificationDate, + 'initialLanguageCode' => 'eng-US', + 'languageCodes' => array( 'eng-US', 'ger-DE' ), + 'names' => array( + 'eng-US' => 'Sindelfingen', + 'eng-GB' => 'Bielefeld', + ), + 'contentInfo' => new Content\ContentInfo( array( 'id' => 42 ) ), + ) + ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $section + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsVersionInfoChildren( $result ) + { + $this->assertTag( + array( + 'tag' => 'VersionInfo', + 'children' => array( + 'less_than' => 11, + 'greater_than' => 9, + ) + ), + $result, + 'Invalid <VersionInfo> element.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoIdElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'id', + 'content' => '23', + ), + $result, + 'Invalid <id> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoVersionNoElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'versionNo', + 'content' => '5', + ), + $result, + 'Invalid <versionNo> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoStatusElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'status', + 'content' => 'PUBLISHED', + ), + $result, + 'Invalid <status> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoCreationDateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'creationDate', + 'content' => $this->creationDate->format( 'c' ), + ), + $result, + 'Invalid <creationDate> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoModificationDateElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'modificationDate', + 'content' => $this->modificationDate->format( 'c' ), + ), + $result, + 'Invalid <modificationDate> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoInitialLanguageCodeElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'initialLanguageCode', + 'content' => 'eng-US', + ), + $result, + 'Invalid <initialLanguageCode> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoLanguageCodesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'languageCodes', + 'content' => 'eng-US,ger-DE', + ), + $result, + 'Invalid <languageCodes> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoNamesElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'names', + 'children' => array( + 'less_than' => 3, + 'greater_than' => 1, + ) + ), + $result, + 'Invalid <names> value.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testVersionInfoContentElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'Content', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.ContentInfo+xml', + 'href' => '/content/objects/42' + ) + ), + $result, + 'Invalid <initialLanguageCode> value.', + false + ); + } + + /** + * Get the VersionInfo visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\VersionInfo + */ + protected function getVersionInfoVisitor() + { + return new ValueObjectVisitor\VersionInfo( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionListTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionListTest.php new file mode 100644 index 0000000..cc83ce5 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionListTest.php @@ -0,0 +1,149 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\REST\Server\Values\VersionList; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\REST\Common; + +class VersionListTest extends ValueObjectVisitorBaseTest +{ + /** + * Test the VersionList visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getVersionListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $versionList = new VersionList( array(), '/some/path' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $versionList + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * Test if result contains VersionList element + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsVersionListElement( $result ) + { + $this->assertTag( + array( + 'tag' => 'VersionList', + ), + $result, + 'Invalid <VersionList> element.', + false + ); + } + + /** + * Test if result contains VersionList element attributes + * + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsVersionListAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'VersionList', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.VersionList+xml', + 'href' => '/some/path', + ) + ), + $result, + 'Invalid <VersionList> attributes.', + false + ); + } + + /** + * Test if VersionList visitor visits the children + */ + public function testVersionListVisitsChildren() + { + $visitor = $this->getVersionListVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $versionList = new VersionList( + array( + new VersionInfo( + array( + 'contentInfo' => new ContentInfo( + array( + 'id' => 42 + ) + ), + 'versionNo' => 1 + ) + ), + new VersionInfo( + array( + 'contentInfo' => new ContentInfo( + array( + 'id' => 42 + ) + ), + 'versionNo' => 2 + ) + ) + ), + '/some/path' + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ) + ->with( $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo' ) ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $versionList + ); + } + + /** + * Get the VersionList visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\VersionList + */ + protected function getVersionListVisitor() + { + return new ValueObjectVisitor\VersionList( + new Common\UrlHandler\eZPublish() + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionTest.php b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionTest.php new file mode 100644 index 0000000..db0aa1d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/Output/ValueObjectVisitor/VersionTest.php @@ -0,0 +1,186 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\Output\ValueObjectVisitor; + +use eZ\Publish\Core\REST\Common\Tests\Output\ValueObjectVisitorBaseTest; + +use eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor; +use eZ\Publish\Core\Repository\Values; +use eZ\Publish\Core\REST\Server\Values\Version; +use eZ\Publish\Core\REST\Common; +use eZ\Publish\API\Repository\Values\Content\Field; + +class VersionTest extends ValueObjectVisitorBaseTest +{ + protected $fieldTypeSerializerMock; + + public function setUp() + { + $this->fieldTypeSerializerMock = $this->getMock( + 'eZ\\Publish\\Core\\REST\\Common\\Output\\FieldTypeSerializer', + array(), + array(), + '', + false + ); + } + + /** + * Test the Version visitor + * + * @return string + */ + public function testVisit() + { + $visitor = $this->getVersionVisitor(); + $generator = $this->getGenerator(); + + $generator->startDocument( null ); + + $version = new Version( + new Values\Content\Content( + array( + 'versionInfo' => new Values\Content\VersionInfo( + array( + 'versionNo' => 5, + 'contentInfo' => new Values\Content\ContentInfo( + array( + 'id' => 23, + 'contentType' => new Values\ContentType\ContentType( + array( + 'id' => 42, + 'fieldDefinitions' => array(), + ) + ), + ) + ), + ) + ), + 'internalFields' => array( + new Field( + array( + 'id' => 1, + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'ezauthor', + ) + ), + new Field( + array( + 'id' => 2, + 'languageCode' => 'eng-US', + 'fieldDefIdentifier' => 'ezimage', + ) + ), + ) + ) + ), + array() + ); + + $this->fieldTypeSerializerMock->expects( $this->exactly( 2 ) ) + ->method( 'serializeFieldValue' ) + ->with( + $this->isInstanceOf( 'eZ\\Publish\\Core\\REST\\Common\\Output\\Generator' ), + $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType' ), + $this->isInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Field' ) + ); + + $this->getVisitorMock()->expects( $this->exactly( 2 ) ) + ->method( 'visitValueObject' ); + + $visitor->visit( + $this->getVisitorMock(), + $generator, + $version + ); + + $result = $generator->endDocument( null ); + + $this->assertNotNull( $result ); + + return $result; + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsVersionChildren( $result ) + { + $this->assertTag( + array( + 'tag' => 'Version', + 'children' => array( + 'less_than' => 2, + 'greater_than' => 0, + ) + ), + $result, + 'Invalid <Version> element.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultVersionAttributes( $result ) + { + $this->assertTag( + array( + 'tag' => 'Version', + 'attributes' => array( + 'media-type' => 'application/vnd.ez.api.Version+xml', + 'href' => '/content/objects/23/versions/5' + ) + ), + $result, + 'Invalid <Version> attributes.', + false + ); + } + + /** + * @param string $result + * + * @depends testVisit + */ + public function testResultContainsFieldsChildren( $result ) + { + $this->assertTag( + array( + 'tag' => 'Fields', + 'children' => array( + 'less_than' => 3, + 'greater_than' => 1, + ) + ), + $result, + 'Invalid <Fields> element.', + false + ); + } + + /** + * Get the Version visitor + * + * @return \eZ\Publish\Core\REST\Server\Output\ValueObjectVisitor\Version + */ + protected function getVersionVisitor() + { + return new ValueObjectVisitor\Version( + new Common\UrlHandler\eZPublish(), + $this->fieldTypeSerializerMock + ); + } +} diff --git a/eZ/Publish/Core/REST/Server/Tests/View/VisitorTest.php b/eZ/Publish/Core/REST/Server/Tests/View/VisitorTest.php new file mode 100644 index 0000000..77916d2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Tests/View/VisitorTest.php @@ -0,0 +1,74 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Tests\View; + +use eZ\Publish\Core\REST\Server\Tests\BaseTest; + +use eZ\Publish\Core\REST\Server\View; +use eZ\Publish\Core\REST\Server\Values; +use eZ\Publish\Core\REST\Common\Message; + +use Qafoo\RMF; + +class VisitorTest extends BaseTest +{ + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $visitorMock; + + /** + * testVisit + */ + public function testVisit() + { + $viewVisitor = new View\Visitor( $this->getVisitorMock() ); + + $request = new RMF\Request(); + $result = new Values\SectionList( array(), '/content/sections' ); + + $this->getVisitorMock()->expects( $this->once() ) + ->method( 'visit' ) + ->with( $result ) + ->will( + $this->returnValue( + new Message( array(), 'Foo Bar' ) + ) + ); + + ob_start(); + + $viewVisitor->display( $request, $result ); + + $this->assertEquals( + 'Foo Bar', + ob_get_clean(), + 'Output not rendered correctly.' + ); + } + + /** + * @return \eZ\Publish\Core\REST\Common\Output\Visitor + */ + protected function getVisitorMock() + { + if ( !isset( $this->visitorMock ) ) + { + $this->visitorMock = $this->getMock( + '\\eZ\\Publish\\Core\\REST\\Common\\Output\\Visitor', + array(), + array(), + '', + false + ); + } + return $this->visitorMock; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ContentList.php b/eZ/Publish/Core/REST/Server/Values/ContentList.php new file mode 100644 index 0000000..e586056 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ContentList.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the ContentList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Content list view model + */ +class ContentList extends RestValue +{ + /** + * Contents + * + * @var \eZ\Publish\Core\REST\Server\Values\RestContent[] + */ + public $contents; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestContent[] $contents + */ + public function __construct( array $contents ) + { + $this->contents = $contents; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ContentTypeGroupList.php b/eZ/Publish/Core/REST/Server/Values/ContentTypeGroupList.php new file mode 100644 index 0000000..c34cd53 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ContentTypeGroupList.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the ContentTypeGroupList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ContentTypeGroup list view model + */ +class ContentTypeGroupList extends RestValue +{ + /** + * Content type groups + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public $contentTypeGroups; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $contentTypeGroups + */ + public function __construct( array $contentTypeGroups ) + { + $this->contentTypeGroups = $contentTypeGroups; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ContentTypeGroupRefList.php b/eZ/Publish/Core/REST/Server/Values/ContentTypeGroupRefList.php new file mode 100644 index 0000000..989c143 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ContentTypeGroupRefList.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the ContentTypeGroupRefList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ContentTypeGroup list view model + */ +class ContentTypeGroupRefList extends RestValue +{ + /** + * Content type + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public $contentType; + + /** + * Content type groups of the content type + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public $contentTypeGroups; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $contentTypeGroups + */ + public function __construct( ContentType $contentType, array $contentTypeGroups ) + { + $this->contentType = $contentType; + $this->contentTypeGroups = $contentTypeGroups; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ContentTypeInfoList.php b/eZ/Publish/Core/REST/Server/Values/ContentTypeInfoList.php new file mode 100644 index 0000000..cec0bdf --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ContentTypeInfoList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the ContentTypeInfoList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ContentType list view model + */ +class ContentTypeInfoList extends RestValue +{ + /** + * Content types + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType[] + */ + public $contentTypes; + + /** + * Path which was used to fetch the list of content types + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType[] $contentTypes + * @param string $path + */ + public function __construct( array $contentTypes, $path ) + { + $this->contentTypes = $contentTypes; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ContentTypeList.php b/eZ/Publish/Core/REST/Server/Values/ContentTypeList.php new file mode 100644 index 0000000..cccd977 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ContentTypeList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the ContentTypeList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ContentType list view model + */ +class ContentTypeList extends RestValue +{ + /** + * Content types + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType[] + */ + public $contentTypes; + + /** + * Path which was used to fetch the list of content types + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType[] $contentTypes + * @param string $path + */ + public function __construct( array $contentTypes, $path ) + { + $this->contentTypes = $contentTypes; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedContent.php b/eZ/Publish/Core/REST/Server/Values/CreatedContent.php new file mode 100644 index 0000000..3a73fa8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedContent.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedContent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created Content. + */ +class CreatedContent extends ValueObject +{ + /** + * The created content + * + * @var \eZ\Publish\Core\REST\Server\Values\RestContent + */ + public $content; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedContentType.php b/eZ/Publish/Core/REST/Server/Values/CreatedContentType.php new file mode 100644 index 0000000..1aff919 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedContentType.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedContentType class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created ContentType. + */ +class CreatedContentType extends ValueObject +{ + /** + * The created content type + * + * @var \eZ\Publish\Core\REST\Server\Values\RestContentType + */ + public $contentType; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedContentTypeGroup.php b/eZ/Publish/Core/REST/Server/Values/CreatedContentTypeGroup.php new file mode 100644 index 0000000..2d35d71 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedContentTypeGroup.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedContentTypeGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created ContentTypeGroup. + */ +class CreatedContentTypeGroup extends ValueObject +{ + /** + * The created content type group + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public $contentTypeGroup; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedFieldDefinition.php b/eZ/Publish/Core/REST/Server/Values/CreatedFieldDefinition.php new file mode 100644 index 0000000..d147780 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedFieldDefinition.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedFieldDefinition class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created field definition. + */ +class CreatedFieldDefinition extends ValueObject +{ + /** + * The created field definition + * + * @var \eZ\Publish\Core\REST\Server\Values\RestFieldDefinition + */ + public $fieldDefinition; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedLocation.php b/eZ/Publish/Core/REST/Server/Values/CreatedLocation.php new file mode 100644 index 0000000..5a5dafe --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedLocation.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedLocation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created location. + */ +class CreatedLocation extends ValueObject +{ + /** + * The created location + * + * @var \eZ\Publish\Core\REST\Server\Values\RestLocation + */ + public $restLocation; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedObjectState.php b/eZ/Publish/Core/REST/Server/Values/CreatedObjectState.php new file mode 100644 index 0000000..d9ab83d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedObjectState.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedObjectState class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created object state. + */ +class CreatedObjectState extends ValueObject +{ + /** + * The created object state + * + * @var \eZ\Publish\Core\REST\Common\Values\RestObjectState + */ + public $objectState; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedObjectStateGroup.php b/eZ/Publish/Core/REST/Server/Values/CreatedObjectStateGroup.php new file mode 100644 index 0000000..1918507 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedObjectStateGroup.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedObjectStateGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created object state group. + */ +class CreatedObjectStateGroup extends ValueObject +{ + /** + * The created object state group + * + * @var \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public $objectStateGroup; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedPolicy.php b/eZ/Publish/Core/REST/Server/Values/CreatedPolicy.php new file mode 100644 index 0000000..23144e1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedPolicy.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedPolicy class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created policy. + */ +class CreatedPolicy extends ValueObject +{ + /** + * The created policy + * + * @var \eZ\Publish\API\Repository\Values\User\Policy + */ + public $policy; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedRelation.php b/eZ/Publish/Core/REST/Server/Values/CreatedRelation.php new file mode 100644 index 0000000..cd06950 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedRelation.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedRelation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created relation. + */ +class CreatedRelation extends ValueObject +{ + /** + * The created relation + * + * @var \eZ\Publish\Core\REST\Server\Values\RestRelation + */ + public $relation; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedRole.php b/eZ/Publish/Core/REST/Server/Values/CreatedRole.php new file mode 100644 index 0000000..1ea6ebe --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedRole.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedRole class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created role. + */ +class CreatedRole extends ValueObject +{ + /** + * The created role + * + * @var \eZ\Publish\API\Repository\Values\User\Role + */ + public $role; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedSection.php b/eZ/Publish/Core/REST/Server/Values/CreatedSection.php new file mode 100644 index 0000000..816ca94 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedSection.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedSection class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created section. + */ +class CreatedSection extends ValueObject +{ + /** + * The created section + * + * @var \eZ\Publish\API\Repository\Values\Content\Section + */ + public $section; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedURLAlias.php b/eZ/Publish/Core/REST/Server/Values/CreatedURLAlias.php new file mode 100644 index 0000000..72053d5 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedURLAlias.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedURLAlias class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created URLAlias. + */ +class CreatedURLAlias extends ValueObject +{ + /** + * The created URL alias + * + * @var \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public $urlAlias; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedURLWildcard.php b/eZ/Publish/Core/REST/Server/Values/CreatedURLWildcard.php new file mode 100644 index 0000000..6191923 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedURLWildcard.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedURLWildcard class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created URLWildcard. + */ +class CreatedURLWildcard extends ValueObject +{ + /** + * The created URL wildcard + * + * @var \eZ\Publish\API\Repository\Values\Content\URLWildcard + */ + public $urlWildcard; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedUser.php b/eZ/Publish/Core/REST/Server/Values/CreatedUser.php new file mode 100644 index 0000000..77e4e4e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedUser.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedUser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created User. + */ +class CreatedUser extends ValueObject +{ + /** + * The created user + * + * @var \eZ\Publish\Core\REST\Server\Values\RestUser + */ + public $user; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedUserGroup.php b/eZ/Publish/Core/REST/Server/Values/CreatedUserGroup.php new file mode 100644 index 0000000..ae20319 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedUserGroup.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedUserGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created UserGroup. + */ +class CreatedUserGroup extends ValueObject +{ + /** + * The created user group + * + * @var \eZ\Publish\Core\REST\Server\Values\RestUserGroup + */ + public $userGroup; +} diff --git a/eZ/Publish/Core/REST/Server/Values/CreatedVersion.php b/eZ/Publish/Core/REST/Server/Values/CreatedVersion.php new file mode 100644 index 0000000..4de5fe5 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/CreatedVersion.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the CreatedVersion class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Struct representing a freshly created version. + */ +class CreatedVersion extends ValueObject +{ + /** + * The created version + * + * @var \eZ\Publish\Core\REST\Server\Values\Version + */ + public $version; +} diff --git a/eZ/Publish/Core/REST/Server/Values/FieldDefinitionList.php b/eZ/Publish/Core/REST/Server/Values/FieldDefinitionList.php new file mode 100644 index 0000000..01476d4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/FieldDefinitionList.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the FieldDefinitionList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * FieldDefinition list view model + */ +class FieldDefinitionList extends RestValue +{ + /** + * ContentType the field definitions belong to + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public $contentType; + + /** + * Field definitions + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public $fieldDefinitions; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] $fieldDefinitions + */ + public function __construct( ContentType $contentType, array $fieldDefinitions ) + { + $this->contentType = $contentType; + $this->fieldDefinitions = $fieldDefinitions; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/LocationList.php b/eZ/Publish/Core/REST/Server/Values/LocationList.php new file mode 100644 index 0000000..91d435f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/LocationList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the LocationList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Location list view model + */ +class LocationList extends RestValue +{ + /** + * Locations + * + * @var \eZ\Publish\Core\REST\Server\Values\RestLocation[] + */ + public $locations; + + /** + * Path used to load this list of locations + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestLocation[] $locations + * @param string $path + */ + public function __construct( array $locations, $path ) + { + $this->locations = $locations; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/NoContent.php b/eZ/Publish/Core/REST/Server/Values/NoContent.php new file mode 100644 index 0000000..de2bb68 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/NoContent.php @@ -0,0 +1,16 @@ +<?php +/** + * File containing the NoContent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +class NoContent extends RestValue +{ +} diff --git a/eZ/Publish/Core/REST/Server/Values/ObjectStateGroupList.php b/eZ/Publish/Core/REST/Server/Values/ObjectStateGroupList.php new file mode 100644 index 0000000..1bf1d18 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ObjectStateGroupList.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the ObjectStateGroupList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ObjectStateGroup list view model + */ +class ObjectStateGroupList extends RestValue +{ + /** + * Object state groups + * + * @var \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] + */ + public $groups; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] $groups + */ + public function __construct( array $groups ) + { + $this->groups = $groups; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ObjectStateList.php b/eZ/Publish/Core/REST/Server/Values/ObjectStateList.php new file mode 100644 index 0000000..5791405 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ObjectStateList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the ObjectStateList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * ObjectState list view model + */ +class ObjectStateList extends RestValue +{ + /** + * Object states + * + * @var \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public $states; + + /** + * ID of the group that the states belong to + * + * @var mixed + */ + public $groupId; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] $states + * @param mixed $groupId + */ + public function __construct( array $states, $groupId ) + { + $this->states = $states; + $this->groupId = $groupId; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/PermanentRedirect.php b/eZ/Publish/Core/REST/Server/Values/PermanentRedirect.php new file mode 100644 index 0000000..b602d54 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/PermanentRedirect.php @@ -0,0 +1,32 @@ +<?php +/** + * File containing the PermanentRedirect class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +class PermanentRedirect extends RestValue +{ + /** + * Redirect URI + * + * @var string + */ + public $redirectUri; + + /** + * Construct + * + * @param string $redirectUri + */ + public function __construct( $redirectUri ) + { + $this->redirectUri = $redirectUri; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/PolicyList.php b/eZ/Publish/Core/REST/Server/Values/PolicyList.php new file mode 100644 index 0000000..460537b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/PolicyList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the PolicyList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Policy list view model + */ +class PolicyList extends RestValue +{ + /** + * Policies + * + * @var \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public $policies; + + /** + * Path which was used to fetch the list of policies + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\Policy[] $policies + * @param string $path + */ + public function __construct( array $policies, $path ) + { + $this->policies = $policies; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RelationList.php b/eZ/Publish/Core/REST/Server/Values/RelationList.php new file mode 100644 index 0000000..3ca526e --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RelationList.php @@ -0,0 +1,62 @@ +<?php +/** + * File containing the RelationList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Relation list view model + */ +class RelationList extends RestValue +{ + /** + * Relations + * + * @var \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public $relations; + + /** + * Content ID to which this relation belongs to + * + * @var mixed + */ + public $contentId; + + /** + * Version number to which this relation belongs to + * + * @var mixed + */ + public $versionNo; + + /** + * Path used to load the list of relations + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\Relation[] $relations + * @param mixed $contentId + * @param mixed $versionNo + * @param string $path + */ + public function __construct( array $relations, $contentId, $versionNo, $path = null ) + { + $this->relations = $relations; + $this->contentId = $contentId; + $this->versionNo = $versionNo; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/ResourceCreated.php b/eZ/Publish/Core/REST/Server/Values/ResourceCreated.php new file mode 100644 index 0000000..ea7c15b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/ResourceCreated.php @@ -0,0 +1,20 @@ +<?php +/** + * File containing the ResourceCreated class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +class ResourceCreated extends RestValue +{ + public function __construct( $redirectUri ) + { + $this->redirectUri = $redirectUri; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestContent.php b/eZ/Publish/Core/REST/Server/Values/RestContent.php new file mode 100644 index 0000000..ec7ca81 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestContent.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing the RestContent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * REST Content, as received by /content/objects/<ID> + * + * Might have a "Version" (aka Content in the Public API) embedded + */ +class RestContent extends RestValue +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public $contentInfo; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Location + */ + public $mainLocation; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + public $currentVersion; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public $relations; + + /** + * Path that was used to load this content + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location|null $mainLocation + * @param \eZ\Publish\API\Repository\Values\Content\Content|null $currentVersion + * @param \eZ\Publish\API\Repository\Values\Content\Relation[]|null $relations Can only be null if $currentVersion is + * @param string $path + */ + public function __construct( ContentInfo $contentInfo, Location $mainLocation = null, Content $currentVersion = null, array $relations = null, $path = null ) + { + $this->contentInfo = $contentInfo; + $this->currentVersion = $currentVersion; + $this->mainLocation = $mainLocation; + $this->relations = $relations; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestContentCreateStruct.php b/eZ/Publish/Core/REST/Server/Values/RestContentCreateStruct.php new file mode 100644 index 0000000..438930d --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestContentCreateStruct.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the RestContentCreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\ContentCreateStruct; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestContentCreateStruct view model + */ +class RestContentCreateStruct extends RestValue +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ + public $contentCreateStruct; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct + */ + public $locationCreateStruct; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct $contentCreateStruct + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $locationCreateStruct + */ + public function __construct( ContentCreateStruct $contentCreateStruct, LocationCreateStruct $locationCreateStruct ) + { + $this->contentCreateStruct = $contentCreateStruct; + $this->locationCreateStruct = $locationCreateStruct; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestContentType.php b/eZ/Publish/Core/REST/Server/Values/RestContentType.php new file mode 100644 index 0000000..0a7c9a1 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestContentType.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the RestContentType class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * REST Content type, as received by /content/types/<ID> + * + * Might have a "FieldDefinitionList" embedded + */ +class RestContentType extends RestValue +{ + /** + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public $contentType; + + /** + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public $fieldDefinitions; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] $fieldDefinitions + */ + public function __construct( ContentType $contentType, array $fieldDefinitions = null ) + { + $this->contentType = $contentType; + $this->fieldDefinitions = $fieldDefinitions; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestExecutedView.php b/eZ/Publish/Core/REST/Server/Values/RestExecutedView.php new file mode 100644 index 0000000..fe13338 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestExecutedView.php @@ -0,0 +1,32 @@ +<?php +/** + * File containing the RestViewInput class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * RestContentCreateStruct view model + */ +class RestExecutedView extends ValueObject +{ + /** + * The search results + * + * @var \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public $searchResults; + + /** + * The view identifier + * + * @var mixed + */ + public $identifier; +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestFieldDefinition.php b/eZ/Publish/Core/REST/Server/Values/RestFieldDefinition.php new file mode 100644 index 0000000..446f726 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestFieldDefinition.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the RestFieldDefinition class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestFieldDefinition view model + */ +class RestFieldDefinition extends RestValue +{ + /** + * ContentType the field definitions belong to + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public $contentType; + + /** + * Field definition + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public $fieldDefinition; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + */ + public function __construct( ContentType $contentType, FieldDefinition $fieldDefinition ) + { + $this->contentType = $contentType; + $this->fieldDefinition = $fieldDefinition; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestLocation.php b/eZ/Publish/Core/REST/Server/Values/RestLocation.php new file mode 100644 index 0000000..5825d31 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestLocation.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the RestLocation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestLocation view model + */ +class RestLocation extends RestValue +{ + /** + * A location + * + * @var \eZ\Publish\API\Repository\Values\Content\Location + */ + public $location; + + /** + * Number of children of the location + * + * @var int + */ + public $childCount; + + /** + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param int $childCount + */ + public function __construct( Location $location, $childCount ) + { + $this->location = $location; + $this->childCount = $childCount; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestLocationUpdateStruct.php b/eZ/Publish/Core/REST/Server/Values/RestLocationUpdateStruct.php new file mode 100644 index 0000000..2324c87 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestLocationUpdateStruct.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RestLocationUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestLocationUpdateStruct view model + */ +class RestLocationUpdateStruct extends RestValue +{ + /** + * Location update struct + * + * @var \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct + */ + public $locationUpdateStruct; + + /** + * If set, the location is hidden ( == true ) or unhidden ( == false ) + * + * @var boolean + */ + public $hidden; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct $locationUpdateStruct + * @param boolean $hidden + */ + public function __construct( LocationUpdateStruct $locationUpdateStruct, $hidden = null ) + { + $this->locationUpdateStruct = $locationUpdateStruct; + $this->hidden = $hidden; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestRelation.php b/eZ/Publish/Core/REST/Server/Values/RestRelation.php new file mode 100644 index 0000000..f227010 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestRelation.php @@ -0,0 +1,52 @@ +<?php +/** + * File containing the RestRelation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\Relation; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestRelation view model + */ +class RestRelation extends RestValue +{ + /** + * A relation + * + * @var \eZ\Publish\API\Repository\Values\Content\Relation + */ + public $relation; + + /** + * Content ID to which this relation belongs to + * + * @var mixed + */ + public $contentId; + + /** + * Version number to which this relation belongs to + * + * @var mixed + */ + public $versionNo; + + /** + * @param \eZ\Publish\API\Repository\Values\Content\Relation $relation + * @param mixed $contentId + * @param mixed $versionNo + */ + public function __construct( Relation $relation, $contentId, $versionNo ) + { + $this->relation = $relation; + $this->contentId = $contentId; + $this->versionNo = $versionNo; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestTrashItem.php b/eZ/Publish/Core/REST/Server/Values/RestTrashItem.php new file mode 100644 index 0000000..1b4d9e0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestTrashItem.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the RestTrashItem class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\TrashItem; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestTrashItem view model + */ +class RestTrashItem extends RestValue +{ + /** + * A trash item + * + * @var \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public $trashItem; + + /** + * Number of children of the trash item + * + * @var int + */ + public $childCount; + + /** + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + * @param int $childCount + */ + public function __construct( TrashItem $trashItem, $childCount ) + { + $this->trashItem = $trashItem; + $this->childCount = $childCount; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestUser.php b/eZ/Publish/Core/REST/Server/Values/RestUser.php new file mode 100644 index 0000000..646fd42 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestUser.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the RestUser class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * REST User, as received by /user/users/<ID> + */ +class RestUser extends RestValue +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + public $content; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public $contentInfo; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public $relations; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Location + */ + public $mainLocation; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location $mainLocation + * @param \eZ\Publish\API\Repository\Values\Content\Relation[] $relations + */ + public function __construct( Content $content, ContentInfo $contentInfo, Location $mainLocation, array $relations ) + { + $this->content = $content; + $this->contentInfo = $contentInfo; + $this->mainLocation = $mainLocation; + $this->relations = $relations; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestUserGroup.php b/eZ/Publish/Core/REST/Server/Values/RestUserGroup.php new file mode 100644 index 0000000..61a702b --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestUserGroup.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the RestUserGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * REST UserGroup, as received by /user/groups/<path> + */ +class RestUserGroup extends RestValue +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + public $content; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public $contentInfo; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public $relations; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Location + */ + public $mainLocation; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location $mainLocation + * @param \eZ\Publish\API\Repository\Values\Content\Relation[] $relations + */ + public function __construct( Content $content, ContentInfo $contentInfo, Location $mainLocation, array $relations ) + { + $this->content = $content; + $this->contentInfo = $contentInfo; + $this->mainLocation = $mainLocation; + $this->relations = $relations; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestUserGroupRoleAssignment.php b/eZ/Publish/Core/REST/Server/Values/RestUserGroupRoleAssignment.php new file mode 100644 index 0000000..87a84ad --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestUserGroupRoleAssignment.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RestUserGroupRoleAssignment class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestUserGroupRoleAssignment view model + */ +class RestUserGroupRoleAssignment extends RestValue +{ + /** + * Role assignment + * + * @var \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment + */ + public $roleAssignment; + + /** + * User group ID to which the role is assigned + * + * @var mixed + */ + public $id; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment $roleAssignment + * @param mixed $id + */ + public function __construct( UserGroupRoleAssignment $roleAssignment, $id ) + { + $this->roleAssignment = $roleAssignment; + $this->id = $id; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestUserGroupUpdateStruct.php b/eZ/Publish/Core/REST/Server/Values/RestUserGroupUpdateStruct.php new file mode 100644 index 0000000..9ed0ffb --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestUserGroupUpdateStruct.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RestUserGroupUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestUserGroupUpdateStruct view model + */ +class RestUserGroupUpdateStruct extends RestValue +{ + /** + * UserGroup update struct + * + * @var \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct + */ + public $userGroupUpdateStruct; + + /** + * If set, section of the UserGroup will be updated + * + * @var mixed + */ + public $sectionId; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct $userGroupUpdateStruct + * @param mixed $sectionId + */ + public function __construct( UserGroupUpdateStruct $userGroupUpdateStruct, $sectionId = null ) + { + $this->userGroupUpdateStruct = $userGroupUpdateStruct; + $this->sectionId = $sectionId; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestUserRoleAssignment.php b/eZ/Publish/Core/REST/Server/Values/RestUserRoleAssignment.php new file mode 100644 index 0000000..263b515 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestUserRoleAssignment.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RestUserRoleAssignment class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\User\UserRoleAssignment; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestUserRoleAssignment view model + */ +class RestUserRoleAssignment extends RestValue +{ + /** + * Role assignment + * + * @var \eZ\Publish\API\Repository\Values\User\UserRoleAssignment + */ + public $roleAssignment; + + /** + * User ID to which the role is assigned + * + * @var mixed + */ + public $id; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\UserRoleAssignment $roleAssignment + * @param mixed $id + */ + public function __construct( UserRoleAssignment $roleAssignment, $id ) + { + $this->roleAssignment = $roleAssignment; + $this->id = $id; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestUserUpdateStruct.php b/eZ/Publish/Core/REST/Server/Values/RestUserUpdateStruct.php new file mode 100644 index 0000000..52d9bc4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestUserUpdateStruct.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RestUserUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\User\UserUpdateStruct; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestUserUpdateStruct view model + */ +class RestUserUpdateStruct extends RestValue +{ + /** + * User update struct + * + * @var \eZ\Publish\API\Repository\Values\User\UserUpdateStruct + */ + public $userUpdateStruct; + + /** + * If set, section of the User will be updated + * + * @var mixed + */ + public $sectionId; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\UserUpdateStruct $userUpdateStruct + * @param mixed $sectionId + */ + public function __construct( UserUpdateStruct $userUpdateStruct, $sectionId = null ) + { + $this->userUpdateStruct = $userUpdateStruct; + $this->sectionId = $sectionId; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RestViewInput.php b/eZ/Publish/Core/REST/Server/Values/RestViewInput.php new file mode 100644 index 0000000..80e9eb0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RestViewInput.php @@ -0,0 +1,30 @@ +<?php +/** + * File containing the RestViewInput class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RestContentCreateStruct view model + */ +class RestViewInput extends RestValue +{ + /** + * The search query + * @var \eZ\Publish\API\Repository\Values\Content\Query + */ + public $query; + + /** + * View identifier + * @var string + */ + public $identifier; +} diff --git a/eZ/Publish/Core/REST/Server/Values/RoleAssignment.php b/eZ/Publish/Core/REST/Server/Values/RoleAssignment.php new file mode 100644 index 0000000..9546b51 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RoleAssignment.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RoleAssignment class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RoleAssignment view model + */ +class RoleAssignment extends RestValue +{ + /** + * Role ID + * + * @var mixed + */ + public $roleId; + + /** + * Role limitation + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + public $limitation; + + /** + * Construct + * + * @param mixed $roleId + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $limitation + */ + public function __construct( $roleId, RoleLimitation $limitation = null ) + { + $this->roleId = $roleId; + $this->limitation = $limitation; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RoleAssignmentList.php b/eZ/Publish/Core/REST/Server/Values/RoleAssignmentList.php new file mode 100644 index 0000000..d245044 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RoleAssignmentList.php @@ -0,0 +1,53 @@ +<?php +/** + * File containing the RoleAssignmentList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * RoleAssignment list view model + */ +class RoleAssignmentList extends RestValue +{ + /** + * Role assignments + * + * @var \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + public $roleAssignments; + + /** + * User or user group ID to which the roles are assigned + * + * @var mixed + */ + public $id; + + /** + * Indicator if the role assignment is for user group + * + * @var boolean + */ + public $isGroupAssignment; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\RoleAssignment[] $roleAssignments + * @param mixed $id + * @param boolean $isGroupAssignment + */ + public function __construct( array $roleAssignments, $id, $isGroupAssignment = false ) + { + $this->roleAssignments = $roleAssignments; + $this->id = $id; + $this->isGroupAssignment = $isGroupAssignment; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/RoleList.php b/eZ/Publish/Core/REST/Server/Values/RoleList.php new file mode 100644 index 0000000..0cb7728 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/RoleList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the RoleList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Role list view model + */ +class RoleList extends RestValue +{ + /** + * Roles + * + * @var \eZ\Publish\API\Repository\Values\User\Role[] + */ + public $roles; + + /** + * Path used to load the list of roles + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\User\Role[] $roles + * @param string $path + */ + public function __construct( array $roles, $path ) + { + $this->roles = $roles; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/SectionList.php b/eZ/Publish/Core/REST/Server/Values/SectionList.php new file mode 100644 index 0000000..48c8286 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/SectionList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the SectionList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Section list view model + */ +class SectionList extends RestValue +{ + /** + * Sections + * + * @var \eZ\Publish\API\Repository\Values\Content\Section[] + */ + public $sections; + + /** + * Path used to load the list of sections + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\Section[] $sections + * @param string $path + */ + public function __construct( array $sections, $path ) + { + $this->sections = $sections; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/TemporaryRedirect.php b/eZ/Publish/Core/REST/Server/Values/TemporaryRedirect.php new file mode 100644 index 0000000..2578d79 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/TemporaryRedirect.php @@ -0,0 +1,32 @@ +<?php +/** + * File containing the TemporaryRedirect class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +class TemporaryRedirect extends RestValue +{ + /** + * Redirect URI + * + * @var string + */ + public $redirectUri; + + /** + * Construct + * + * @param string $redirectUri + */ + public function __construct( $redirectUri ) + { + $this->redirectUri = $redirectUri; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/Trash.php b/eZ/Publish/Core/REST/Server/Values/Trash.php new file mode 100644 index 0000000..34639ea --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/Trash.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the Trash class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Trash view model + */ +class Trash extends RestValue +{ + /** + * Trash items + * + * @var \eZ\Publish\Core\REST\Server\Values\RestTrashItem[] + */ + public $trashItems; + + /** + * Path used to load the list of the trash items + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestTrashItem[] $trashItems + * @param string $path + */ + public function __construct( array $trashItems, $path ) + { + $this->trashItems = $trashItems; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/URLAliasList.php b/eZ/Publish/Core/REST/Server/Values/URLAliasList.php new file mode 100644 index 0000000..3007cbf --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/URLAliasList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the URLAliasList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * URLAlias list view model + */ +class URLAliasList extends RestValue +{ + /** + * URL aliases + * + * @var \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public $urlAliases; + + /** + * Path used to load the list of URL aliases + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias[] $urlAliases + * @param string $path + */ + public function __construct( array $urlAliases, $path ) + { + $this->urlAliases = $urlAliases; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/URLAliasRefList.php b/eZ/Publish/Core/REST/Server/Values/URLAliasRefList.php new file mode 100644 index 0000000..34b529a --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/URLAliasRefList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the URLAliasRefList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * URLAlias ref list view model + */ +class URLAliasRefList extends RestValue +{ + /** + * URL aliases + * + * @var \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public $urlAliases; + + /** + * Path that was used to fetch the list of URL aliases + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias[] $urlAliases + * @param string $path + */ + public function __construct( array $urlAliases, $path ) + { + $this->urlAliases = $urlAliases; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/URLWildcardList.php b/eZ/Publish/Core/REST/Server/Values/URLWildcardList.php new file mode 100644 index 0000000..fe61eba --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/URLWildcardList.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the URLWildcardList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * URLWildcard list view model + */ +class URLWildcardList extends RestValue +{ + /** + * URL wildcards + * + * @var \eZ\Publish\API\Repository\Values\Content\URLWildcard[] + */ + public $urlWildcards; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard[] $urlWildcards + */ + public function __construct( array $urlWildcards ) + { + $this->urlWildcards = $urlWildcards; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/UserGroupList.php b/eZ/Publish/Core/REST/Server/Values/UserGroupList.php new file mode 100644 index 0000000..83c874f --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/UserGroupList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the UserGroupList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * User group list view model + */ +class UserGroupList extends RestValue +{ + /** + * User groups + * + * @var \eZ\Publish\Core\REST\Server\Values\RestUserGroup[] + */ + public $userGroups; + + /** + * Path which was used to fetch the list of user groups + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestUserGroup[] $userGroups + * @param string $path + */ + public function __construct( array $userGroups, $path ) + { + $this->userGroups = $userGroups; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/UserGroupRefList.php b/eZ/Publish/Core/REST/Server/Values/UserGroupRefList.php new file mode 100644 index 0000000..2f2c7a2 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/UserGroupRefList.php @@ -0,0 +1,53 @@ +<?php +/** + * File containing the UserGroupRefList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * User group list view model + */ +class UserGroupRefList extends RestValue +{ + /** + * User groups + * + * @var \eZ\Publish\Core\REST\Server\Values\RestUserGroup[] + */ + public $userGroups; + + /** + * Path which was used to fetch the list of user groups + * + * @var string + */ + public $path; + + /** + * User ID whose groups are the ones in the list + * + * @var mixed + */ + public $userId; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestUserGroup[] $userGroups + * @param string $path + * @param mixed $userId + */ + public function __construct( array $userGroups, $path, $userId = null ) + { + $this->userGroups = $userGroups; + $this->path = $path; + $this->userId = $userId; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/UserList.php b/eZ/Publish/Core/REST/Server/Values/UserList.php new file mode 100644 index 0000000..8ceded8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/UserList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the UserList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * User list view model + */ +class UserList extends RestValue +{ + /** + * Users + * + * @var \eZ\Publish\Core\REST\Server\Values\RestUser[] + */ + public $users; + + /** + * Path which was used to fetch the list of users + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestUser[] $users + * @param string $path + */ + public function __construct( array $users, $path ) + { + $this->users = $users; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/UserRefList.php b/eZ/Publish/Core/REST/Server/Values/UserRefList.php new file mode 100644 index 0000000..1973def --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/UserRefList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the UserRefList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * User list view model + */ +class UserRefList extends RestValue +{ + /** + * Users + * + * @var \eZ\Publish\Core\REST\Server\Values\RestUser[] + */ + public $users; + + /** + * Path which was used to fetch the list of users + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Server\Values\RestUser[] $users + * @param string $path + */ + public function __construct( array $users, $path ) + { + $this->users = $users; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/Version.php b/eZ/Publish/Core/REST/Server/Values/Version.php new file mode 100644 index 0000000..97b9226 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/Version.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the Version class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Version view model + */ +class Version extends RestValue +{ + /** + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + public $content; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public $relations; + + /** + * Path used to load this content + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param \eZ\Publish\API\Repository\Values\Content\Relation[] $relations + * @param string $path + */ + public function __construct( Content $content, array $relations, $path = null ) + { + $this->content = $content; + $this->relations = $relations; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/Values/VersionList.php b/eZ/Publish/Core/REST/Server/Values/VersionList.php new file mode 100644 index 0000000..0125aaa --- /dev/null +++ b/eZ/Publish/Core/REST/Server/Values/VersionList.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the VersionList class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\Values; + +use eZ\Publish\Core\REST\Common\Value as RestValue; + +/** + * Version list view model + */ +class VersionList extends RestValue +{ + /** + * Versions + * + * @var \eZ\Publish\API\Repository\Values\Content\VersionInfo[] + */ + public $versions; + + /** + * Path used to retrieve this version list + * + * @var string + */ + public $path; + + /** + * Construct + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo[] $versions + * @param string $path + */ + public function __construct( array $versions, $path ) + { + $this->versions = $versions; + $this->path = $path; + } +} diff --git a/eZ/Publish/Core/REST/Server/View/AcceptHeaderVisitorDispatcher.php b/eZ/Publish/Core/REST/Server/View/AcceptHeaderVisitorDispatcher.php new file mode 100644 index 0000000..230a4d0 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/View/AcceptHeaderVisitorDispatcher.php @@ -0,0 +1,77 @@ +<?php +/** + * This file contains the AcceptHeaderVisitorDispatcher class + * + * @version $Revision$ + * @copyright Copyright (c) 2011 Qafoo GmbH + * @license Dual licensed under the MIT and GPL licenses. + */ + +namespace eZ\Publish\Core\REST\Server\View; + +use eZ\Publish\Core\REST\Server\Request; +use eZ\Publish\Core\REST\Common\Output\Visitor as OutputVisitor; +use Qafoo\RMF\View\NowViewFoundException; + +/** + * Dispatcher for various visitors depending on the mime-type accept header + */ +class AcceptHeaderVisitorDispatcher +{ + /** + * Mapping of regular expressions matching the mime type accept headers to + * view handlers. + * + * @var array + */ + protected $mapping = array(); + + /** + * Construct from view handler mapping + * + * @param array $mapping + */ + public function __construct( array $mapping ) + { + foreach ( $mapping as $regexp => $visitor ) + { + $this->addVisitor( $regexp, $visitor ); + } + } + + /** + * Adds view handler + * + * @param string $regexp + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + */ + public function addVisitor( $regexp, OutputVisitor $visitor ) + { + $this->mapping[$regexp] = $visitor; + } + + /** + * Dispatches a visitable result to the mapped visitor + * + * @param \eZ\Publish\Core\REST\Server\Request $request + * @param mixed $result + * + * @return \eZ\Publish\Core\REST\Common\Message + */ + public function dispatch( Request $request, $result ) + { + foreach ( $request->mimetype as $mimeType ) + { + foreach ( $this->mapping as $regexp => $visitor ) + { + if ( preg_match( $regexp, $mimeType['value'] ) ) + { + /** @var \eZ\Publish\Core\REST\Common\Output\Visitor $visitor */ + return $visitor->visit( $result ); + } + } + } + + throw new NowViewFoundException( "No view mapping found." ); + } +} diff --git a/eZ/Publish/Core/REST/Server/View/InvalidApiUse.php b/eZ/Publish/Core/REST/Server/View/InvalidApiUse.php new file mode 100644 index 0000000..d8ecbb4 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/View/InvalidApiUse.php @@ -0,0 +1,30 @@ +<?php +/** + * File containing the InvalidApiUse view class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\View; + +use Qafoo\RMF; + +/** + * Simple view handler used when the API is called with wrong media types + */ +class InvalidApiUse extends RMF\View +{ + /** + * Display the controller result + * + * @param RMF\Request $request + * @param mixed $result + */ + public function display( RMF\Request $request, $result ) + { + header( "Status: 415 Unsupported Media Type" ); + echo "<h1>Unsupported Media Type</h1>"; + } +} diff --git a/eZ/Publish/Core/REST/Server/View/Visitor.php b/eZ/Publish/Core/REST/Server/View/Visitor.php new file mode 100644 index 0000000..d73ece8 --- /dev/null +++ b/eZ/Publish/Core/REST/Server/View/Visitor.php @@ -0,0 +1,69 @@ +<?php +/** + * File containing the Visitor class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST\Server\View; + +use eZ\Publish\Core\REST\Common; + +use Qafoo\RMF; + +/** + * RMF visitor view + */ +class Visitor extends RMF\View +{ + /** + * Output visitor + * + * @var \eZ\Publish\Core\REST\Common\Output\Visitor + */ + protected $visitor; + + /** + * Construct + * + * @param \eZ\Publish\Core\REST\Common\Output\Visitor $visitor + */ + public function __construct( Common\Output\Visitor $visitor ) + { + $this->visitor = $visitor; + } + + /** + * Display the controller result + * + * @param RMF\Request $request + * @param mixed $result + */ + public function display( RMF\Request $request, $result ) + { + if ( $result === null ) + { + $message = new Common\Message( + array( 'Status' => '200 No content', ) + ); + } + else + { + $message = $this->visitor->visit( $result ); + } + + foreach ( $message->headers as $name => $value ) + { + if ( $name === 'Status' ) + { + // Special handling for PHP running as an Apache module + header( $_SERVER['SERVER_PROTOCOL'] . ' ' . $value ); + } + + header( "{$name}: {$value}" ); + } + echo $message->body; + } +} diff --git a/eZ/Publish/Core/REST/common.php b/eZ/Publish/Core/REST/common.php new file mode 100644 index 0000000..3a107bc --- /dev/null +++ b/eZ/Publish/Core/REST/common.php @@ -0,0 +1,213 @@ +<?php +/** + * File containing the configuration of the REST SDK client + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\REST; + +use eZ\Publish\Core\FieldType; + +if ( !defined( 'HTTP_BASE_URL' ) ) +{ + define( 'HTTP_BASE_URL', 'http://localhost:8042/' ); +} + +/** + * This file includes the configuration of the REST SDK client. + * + * This is a client configuration for testing purposes only. + */ + +// Set communication encoding depending on environment defined in the +// phpunit.xml files. This defines what encoding will be generated and thus send +// to the server. +$generator = getenv( 'backendEncoding' ) === 'xml' ? + new Common\Output\Generator\Xml( + new Common\Output\Generator\Xml\FieldTypeHashGenerator() + ) : + new Common\Output\Generator\Json( + new Common\Output\Generator\Json\FieldTypeHashGenerator() + ); + +// The URL Handler is responsible for URL parsing and generation. It will be +// used in the output generators and in some parsing handlers. +$urlHandler = new Common\UrlHandler\eZPublish(); + +// FieldTypes to be used in integration tests. The field types are only used +// in terms of conversions from and to hash values. +$fieldTypes = array( + new Client\FieldType( new FieldType\Author\Type() ), + new Client\FieldType( new FieldType\Checkbox\Type() ), + new Client\FieldType( new FieldType\DateAndTime\Type() ), + new Client\FieldType( new FieldType\Float\Type() ), + new Client\FieldType( new FieldType\Integer\Type() ), + new Client\FieldType( new FieldType\Keyword\Type() ), + new Client\FieldType( new FieldType\MapLocation\Type() ), + new Client\FieldType( new FieldType\Relation\Type() ), + new Client\FieldType( new FieldType\RelationList\Type() ), + new Client\FieldType( new FieldType\Selection\Type() ), + new Client\FieldType( new FieldType\TextBlock\Type() ), + new Client\FieldType( new FieldType\TextLine\Type() ), + new Client\FieldType( new FieldType\Url\Type() ), + new Client\FieldType( new FieldType\User\Type() ), + new Client\FieldType( new FieldType\Null\Type( 'ezxmltext' ) ), // @todo FIXME: Add correct type + new Client\FieldType( new FieldType\Null\Type( 'ezpage' ) ), // @todo FIXME: Add correct type +); + +// The IntegrationTestRepository is only meant for integration tests. It +// handles sessions which run throughout a single test case run and submission +// of user information to the server, which needs a corresponding +// authenticator. +$repository = new Client\IntegrationTestRepository( + // The HTTP Client. Needs to implement the Client\HttpClient interface. + // + // We are using a test client here, so that we maintain a consistent session during each test case + // and submit user information to the server. + $authenticator = new Client\HttpClient\Authentication\IntegrationTestAuthenticator( + new Client\HttpClient\Stream( + // Server address to communicate with. You might want to make this + // configurable using environment variables, or something alike. + HTTP_BASE_URL + ) + ), + new Common\Input\Dispatcher( + // The parsing dispatcher is configured after the repository has been + // created due to circular references + $parsingDispatcher = new Common\Input\ParsingDispatcher(), + array( + // Defines the available data format encoding handlers. used to + // process the input data and convert it into an array structure + // usable by the parsers. + // + // More generators should not be necessary to configure, unless new transport + // encoding formats need to be supported. + 'json' => new Common\Input\Handler\Json(), + 'xml' => new Common\Input\Handler\Xml(), + ) + ), + new Common\Output\Visitor( + // The generator defines what transport encoding format will be used. + // This should either be the XML or JSON generator. In this case we use + // a generator depending on an environment variable, as defined above. + $generator, + // The defined output visitors for the available value objects. + // + // If there is new data available, which should be visited and send to + // the server extend this array. It always maps the class name of the + // value object (or its parent class(es)) to the respective visitor + // implementation instance. + array( + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\SectionCreateStruct' => new Client\Output\ValueObjectVisitor\SectionCreateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\SectionUpdateStruct' => new Client\Output\ValueObjectVisitor\SectionUpdateStruct( $urlHandler ), + '\\eZ\\Publish\\Core\\REST\\Common\\Values\\SectionIncludingContentMetadataUpdateStruct' => new Client\Output\ValueObjectVisitor\SectionIncludingContentMetadataUpdateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\RoleCreateStruct' => new Client\Output\ValueObjectVisitor\RoleCreateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\RoleUpdateStruct' => new Client\Output\ValueObjectVisitor\RoleUpdateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\PolicyCreateStruct' => new Client\Output\ValueObjectVisitor\PolicyCreateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\Limitation' => new Client\Output\ValueObjectVisitor\Limitation( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\User\\PolicyUpdateStruct' => new Client\Output\ValueObjectVisitor\PolicyUpdateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationCreateStruct' => new Client\Output\ValueObjectVisitor\LocationCreateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupCreateStruct' => new Client\Output\ValueObjectVisitor\ObjectStateGroupCreateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupUpdateStruct' => new Client\Output\ValueObjectVisitor\ObjectStateGroupUpdateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateCreateStruct' => new Client\Output\ValueObjectVisitor\ObjectStateCreateStruct( $urlHandler ), + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateUpdateStruct' => new Client\Output\ValueObjectVisitor\ObjectStateUpdateStruct( $urlHandler ), + ) + ), + $urlHandler, + $fieldTypes, + $authenticator +); + +// Object with convenience methods for parsers +$parserTools = new Common\Input\ParserTools(); + +// Parser for field values (using FieldTypes for toHash()/fromHash() operations) +$fieldTypeParser = new Common\Input\FieldTypeParser( + $repository->getContentService(), + $repository->getContentTypeService(), + $repository->getFieldTypeService(), + new Common\FieldTypeProcessorRegistry() +); + +// The parsing dispatcher configures which parsers are used for which +// mime type. The mime types (content types) are provided *WITHOUT* an +// encoding type (+json / +xml). +// +// For each mime type you specify an instance of the parser which +// should be used to process the given mime type. +$inputParsers = array( + 'application/vnd.ez.api.Version' => new Client\Input\Parser\Content( + $parserTools, + $repository->getContentService(), + // Circular reference, since REST does not transmit content info when + // loading the VersionInfo (which is included in the content) + new Client\Input\Parser\VersionInfo( $parserTools, $repository->getContentService() ), + $fieldTypeParser + ), + 'application/vnd.ez.api.ContentList' => new Client\Input\Parser\ContentList(), + 'application/vnd.ez.api.ContentInfo' => new Client\Input\Parser\ContentInfo( + $parserTools, + $repository->getContentTypeService() + ), + 'application/vnd.ez.api.ContentType' => new Client\Input\Parser\ContentType( + $parserTools, + $repository->getContentTypeService() + ), + 'application/vnd.ez.api.FieldDefinitionList' => new Client\Input\Parser\FieldDefinitionList( + $parserTools, + $repository->getContentTypeService() + ), + 'application/vnd.ez.api.FieldDefinition' => new Client\Input\Parser\FieldDefinition( + $parserTools, + $fieldTypeParser + ), + 'application/vnd.ez.api.SectionList' => new Client\Input\Parser\SectionList(), + 'application/vnd.ez.api.Section' => new Client\Input\Parser\Section(), + 'application/vnd.ez.api.ErrorMessage' => new Client\Input\Parser\ErrorMessage(), + 'application/vnd.ez.api.RoleList' => new Client\Input\Parser\RoleList(), + 'application/vnd.ez.api.Role' => new Client\Input\Parser\Role(), + 'application/vnd.ez.api.Policy' => new Client\Input\Parser\Policy(), + 'application/vnd.ez.api.limitation' => new Client\Input\Parser\Limitation(), + 'application/vnd.ez.api.PolicyList' => new Client\Input\Parser\PolicyList(), + 'application/vnd.ez.api.RelationList' => new Client\Input\Parser\RelationList(), + 'application/vnd.ez.api.Relation' => new Client\Input\Parser\Relation( + $repository->getContentService() + ), + 'application/vnd.ez.api.RoleAssignmentList' => new Client\Input\Parser\RoleAssignmentList(), + 'application/vnd.ez.api.RoleAssignment' => new Client\Input\Parser\RoleAssignment(), + 'application/vnd.ez.api.Location' => new Client\Input\Parser\Location( + $parserTools + ), + 'application/vnd.ez.api.LocationList' => new Client\Input\Parser\LocationList(), + 'application/vnd.ez.api.ObjectStateGroup' => new Client\Input\Parser\ObjectStateGroup( + $parserTools + ), + 'application/vnd.ez.api.ObjectStateGroupList' => new Client\Input\Parser\ObjectStateGroupList(), + 'application/vnd.ez.api.ObjectState' => new Client\Input\Parser\ObjectState( + $parserTools + ), + 'application/vnd.ez.api.ObjectStateList' => new Client\Input\Parser\ObjectStateList(), +); +foreach ( $inputParsers as $mimeType => $parser ) +{ + $parsingDispatcher->addParser( $mimeType, $parser ); +} + +// Force sets the used user. This will be refactored most likely, since this is +// not really valid for a REST client. +$repository->setCurrentUser( + new \eZ\Publish\API\Repository\Tests\Stubs\Values\User\UserStub( + array( + 'content' => new \eZ\Publish\API\Repository\Tests\Stubs\Values\Content\ContentStub( + array( + 'id' => 14 + ) + ) + ) + ) +); + +return $repository; diff --git a/eZ/Publish/Core/Repository/ContentService.php b/eZ/Publish/Core/Repository/ContentService.php new file mode 100644 index 0000000..e5fe3fc --- /dev/null +++ b/eZ/Publish/Core/Repository/ContentService.php @@ -0,0 +1,1928 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\ContentService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\ContentService as ContentServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Handler; +use eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct as APIContentUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\Content\TranslationInfo; +use eZ\Publish\API\Repository\Values\Content\TranslationValues as APITranslationValues; +use eZ\Publish\API\Repository\Values\Content\ContentCreateStruct as APIContentCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\Content as APIContent; +use eZ\Publish\API\Repository\Values\Content\VersionInfo as APIVersionInfo; +use eZ\Publish\API\Repository\Values\Content\ContentInfo as APIContentInfo; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Field; +use eZ\Publish\API\Repository\Values\Content\Relation as APIRelation; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\RemoteId as CriterionRemoteId; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\BadStateException; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\ContentValidationException; +use eZ\Publish\Core\Base\Exceptions\ContentFieldValidationException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\Content\ContentCreateStruct; +use eZ\Publish\Core\Repository\Values\Content\ContentUpdateStruct; +use eZ\Publish\Core\Repository\Values\Content\Relation; +use eZ\Publish\Core\Repository\Values\Content\TranslationValues; +use eZ\Publish\SPI\Persistence\Content\VersionInfo as SPIVersionInfo; +use eZ\Publish\SPI\Persistence\Content\ContentInfo as SPIContentInfo; +use eZ\Publish\SPI\Persistence\Content as SPIContent; +use eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct as SPIMetadataUpdateStruct; +use eZ\Publish\SPI\Persistence\Content\CreateStruct as SPIContentCreateStruct; +use eZ\Publish\SPI\Persistence\Content\UpdateStruct as SPIContentUpdateStruct; +use eZ\Publish\SPI\Persistence\Content\Field as SPIField; +use eZ\Publish\SPI\Persistence\Content\Location\CreateStruct as SPILocationCreateStruct; +use eZ\Publish\SPI\Persistence\Content\Relation as SPIRelation; +use eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct as SPIRelationCreateStruct; +use DateTime; +use Exception; + +/** + * This class provides service methods for managing content + * + * @example Examples/content.php + * + * @package eZ\Publish\Core\Repository + */ +class ContentService implements ContentServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Handler + */ + protected $persistenceHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Handler $handler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $handler, array $settings = array() ) + { + $this->repository = $repository; + $this->persistenceHandler = $handler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Loads a content info object. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given id does not exist + * + * @param int $contentId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfo( $contentId ) + { + $contentInfo = $this->internalLoadContentInfo( $contentId ); + if ( !$this->repository->canUser( 'content', 'read', $contentInfo ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $contentInfo; + } + + /** + * Loads a content info object. + * + * To load fields use loadContent + * + * @access private This is only available to services that needs access to Content w/o permissions checks + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given id does not exist + * + * @param int $contentId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function internalLoadContentInfo( $contentId ) + { + try + { + $spiContentInfo = $this->persistenceHandler->contentHandler()->loadContentInfo( $contentId ); + } + catch ( APINotFoundException $e ) + { + throw new NotFoundException( + "Content", + $contentId, + $e + ); + } + + return $this->buildContentInfoDomainObject( $spiContentInfo ); + } + + /** + * Loads a content info object for the given remoteId. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given remote id does not exist + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfoByRemoteId( $remoteId ) + { + $content = $this->repository->getSearchService()->findSingle( new CriterionRemoteId( $remoteId ), array(), false ); + + if ( !$this->repository->canUser( 'content', 'read', $content ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $content->contentInfo; + } + + /** + * Loads a version info of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfo( APIContentInfo $contentInfo, $versionNo = null ) + { + return $this->loadVersionInfoById( $contentInfo->id, $versionNo ); + } + + /** + * Loads a version info of the given content object id. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfoById( $contentId, $versionNo = null ) + { + if ( $versionNo === null ) + { + $versionNo = $this->loadContentInfo( $contentId )->currentVersionNo; + } + + try + { + $spiVersionInfo = $this->persistenceHandler->contentHandler()->loadVersionInfo( + $contentId, + $versionNo + ); + } + catch ( APINotFoundException $e ) + { + throw new NotFoundException( + "VersionInfo", + array( + "contentId" => $contentId, + "versionNo" => $versionNo + ), + $e + ); + } + + $versionInfo = $this->buildVersionInfoDomainObject( $spiVersionInfo ); + if ( !$this->repository->canUser( 'content', 'versionread', $versionInfo ) ) + throw new UnauthorizedException( 'content', 'versionread' ); + + return $versionInfo; + } + + /** + * Loads content in a version for the given content info object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByContentInfo( APIContentInfo $contentInfo, array $languages = null, $versionNo = null ) + { + return $this->loadContent( + $contentInfo->id, + $languages, + $versionNo + ); + } + + /** + * Loads content in the version given by version info. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByVersionInfo( APIVersionInfo $versionInfo, array $languages = null ) + { + return $this->loadContent( + $versionInfo->getContentInfo()->id, + $languages, + $versionInfo->versionNo + ); + } + + /** + * Loads content in a version of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content or version with the given id and languages does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param array|null $languages A language filter for fields. If not given all languages are returned + * @param int|null $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContent( $contentId, array $languages = null, $versionNo = null ) + { + $content = $this->internalLoadContent( $contentId, $languages, $versionNo ); + + if ( !$this->repository->canUser( 'content', 'read', $content ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $content; + } + + /** + * Loads content in a version of the given content object. + * + * If no version number is given, the method returns the current version + * + * @access private This is only available to services that needs access to Content w/o permissions checks + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content or version with the given id and languages does not exist + * + * @param int $contentId + * @param array|null $languages A language filter for fields. If not given all languages are returned + * @param int|null $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function internalLoadContent( $contentId, array $languages = null, $versionNo = null ) + { + try + { + if ( $versionNo === null ) + { + $versionNo = $this->persistenceHandler->contentHandler()->loadContentInfo( + $contentId + )->currentVersionNo; + } + + $spiContent = $this->persistenceHandler->contentHandler()->load( + $contentId, + $versionNo, + $languages + ); + } + catch ( APINotFoundException $e ) + { + throw new NotFoundException( + "Content", + array( + "id" => $contentId, + "languages" => $languages, + "versionNo" => $versionNo + ), + $e + ); + } + + if ( !empty( $languages ) ) + { + foreach ( $languages as $languageCode ) + { + if ( + !in_array( + $this->persistenceHandler->contentLanguageHandler()->loadByLanguageCode( $languageCode )->id, + $spiContent->versionInfo->languageIds + ) + ) + { + throw new NotFoundException( + "Content", + array( + "id" => $contentId, + "languages" => $languages, + "versionNo" => $versionNo + ) + ); + } + } + } + + return $this->buildContentDomainObject( $spiContent ); + } + + /** + * Loads content in a version for the content object reference by the given remote id. + * + * If no version is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content or version with the given remote id does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param string $remoteId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByRemoteId( $remoteId, array $languages = null, $versionNo = null ) + { + $content = $this->repository->getSearchService()->findSingle( new CriterionRemoteId( $remoteId ), array(), false ); + if ( !empty( $languages ) || $versionNo !== null ) + { + $content = $this->internalLoadContent( $content->id, $languages, $versionNo ); + } + + if ( !$this->repository->canUser( 'content', 'read', $content ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $content; + } + + /** + * Creates a new content draft assigned to the authenticated user. + * + * If a different userId is given in $contentCreateStruct it is assigned to the given user + * but this required special rights for the authenticated user + * (this is useful for content staging where the transfer process does not + * have to authenticate with the user which created the content object in the source server). + * The user has to publish the draft if it should be visible. + * In 4.x at least one location has to be provided in the location creation array. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the content in the given location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is a provided remoteId which exists in the system + * or there is no location provided (4.x) or multiple locations + * are under the same parent + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or is set to an empty value + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct $contentCreateStruct + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct[] $locationCreateStructs For each location parent under which a location should be created for the content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContent( APIContentCreateStruct $contentCreateStruct, array $locationCreateStructs = array() ) + { + $contentCreateStruct = clone $contentCreateStruct; + + if ( $contentCreateStruct->ownerId === null ) + { + $contentCreateStruct->ownerId = $this->repository->getCurrentUser()->id; + } + + if ( $contentCreateStruct->alwaysAvailable === null ) + { + $contentCreateStruct->alwaysAvailable = false; + } + + // @todo: Add support for structs in Limitations + foreach ( $locationCreateStructs as $locationCreateStruct ) + { + if ( !$this->repository->canUser( 'content', 'create', $contentCreateStruct, $locationCreateStruct ) ) + throw new UnauthorizedException( 'content', 'create' ); + } + + if ( empty( $locationCreateStructs ) && + !$this->repository->canUser( 'content', 'create', $contentCreateStruct ) ) + throw new UnauthorizedException( 'content', 'create' ); + + if ( !empty( $contentCreateStruct->remoteId ) ) + { + try + { + $this->loadContentByRemoteId( $contentCreateStruct->remoteId ); + + throw new InvalidArgumentException( + "\$contentCreateStruct", + "Another content with remoteId '{$contentCreateStruct->remoteId}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + else + { + $contentCreateStruct->remoteId = md5( uniqid( get_class( $contentCreateStruct ), true ) ); + } + + // If location create structs are not valid throw exception early + $spiLocationCreateStructs = $this->buildSPILocationCreateStructs( $locationCreateStructs ); + + if ( empty( $contentCreateStruct->sectionId ) ) + { + $contentCreateStruct->sectionId = 1; + } + + $fields = array(); + $languageCodes = array( $contentCreateStruct->mainLanguageCode ); + + // Map fields to array $fields[$field->fieldDefIdentifier][$field->languageCode] + // Check for inconsistencies along the way and throw exceptions where needed + foreach ( $contentCreateStruct->fields as $field ) + { + $fieldDefinition = $contentCreateStruct->contentType->getFieldDefinition( $field->fieldDefIdentifier ); + + if ( $fieldDefinition === null ) + { + throw new ContentValidationException( + "Field definition '{$field->fieldDefIdentifier}' does not exist in given ContentType" + ); + } + + if ( $fieldDefinition->isTranslatable ) + { + $fields[$field->fieldDefIdentifier][$field->languageCode] = $field; + } + else + { + if ( $field->languageCode != $contentCreateStruct->mainLanguageCode ) + { + throw new ContentValidationException( + "A translation is set for non translatable field definition '{$field->fieldDefIdentifier}'" + ); + } + + $fields[$field->fieldDefIdentifier][$contentCreateStruct->mainLanguageCode] = $field; + } + + $languageCodes[] = $field->languageCode; + } + + $languageCodes = array_unique( $languageCodes ); + + $fieldValues = array(); + $spiFields = array(); + $allFieldErrors = array(); + foreach ( $contentCreateStruct->contentType->getFieldDefinitions() as $fieldDefinition ) + { + /** @var $fieldType \eZ\Publish\Core\FieldType\FieldType */ + $fieldType = $this->repository->getFieldTypeService()->buildFieldType( + $fieldDefinition->fieldTypeIdentifier + ); + + foreach ( $languageCodes as $languageCode ) + { + $valueLanguageCode = $fieldDefinition->isTranslatable ? $languageCode : $contentCreateStruct->mainLanguageCode; + if ( isset( $fields[$fieldDefinition->identifier][$valueLanguageCode] ) ) + { + $fieldValue = $fieldType->acceptValue( + $fields[$fieldDefinition->identifier][$valueLanguageCode]->value + ); + } + else + { + $fieldValue = $fieldType->acceptValue( $fieldDefinition->defaultValue ); + } + + if ( $fieldType->isEmptyValue( $fieldValue ) ) + { + if ( $fieldDefinition->isRequired ) + { + throw new ContentValidationException( "Required field '{$fieldDefinition->identifier}' value is empty" ); + } + } + else + { + $fieldErrors = $fieldType->validate( + $fieldDefinition, + $fieldValue + ); + if ( !empty( $fieldErrors ) ) + { + $allFieldErrors[$fieldDefinition->id][$languageCode] = $fieldErrors; + } + } + + if ( !empty( $allFieldErrors ) ) + { + continue; + } + + $fieldValues[$fieldDefinition->identifier][$languageCode] = $fieldValue; + $spiFields[] = new SPIField( + array( + "id" => null, + "fieldDefinitionId" => $fieldDefinition->id, + "type" => $fieldDefinition->fieldTypeIdentifier, + "value" => $fieldType->toPersistenceValue( $fieldValue ), + "languageCode" => $languageCode, + "versionNo" => null + ) + ); + } + } + + if ( !empty( $allFieldErrors ) ) + { + throw new ContentFieldValidationException( $allFieldErrors ); + } + + $spiContentCreateStruct = new SPIContentCreateStruct( + array( + "name" => $this->repository->getNameSchemaService()->resolve( + $contentCreateStruct->contentType->nameSchema, + $contentCreateStruct->contentType, + $fieldValues, + $languageCodes + ), + "typeId" => $contentCreateStruct->contentType->id, + "sectionId" => $contentCreateStruct->sectionId, + "ownerId" => $contentCreateStruct->ownerId, + "locations" => $spiLocationCreateStructs, + "fields" => $spiFields, + "alwaysAvailable" => $contentCreateStruct->alwaysAvailable, + "remoteId" => $contentCreateStruct->remoteId, + "modified" => isset( $contentCreateStruct->modificationDate ) ? + $contentCreateStruct->modificationDate->getTimestamp() : + time(), + "initialLanguageId" => $this->persistenceHandler->contentLanguageHandler()->loadByLanguageCode( + $contentCreateStruct->mainLanguageCode + )->id + ) + ); + + $this->repository->beginTransaction(); + try + { + $spiContent = $this->persistenceHandler->contentHandler()->create( $spiContentCreateStruct ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildContentDomainObject( $spiContent ); + } + + /** + * Creates an array of SPI location create structs from given array of API location create structs + * + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct[] $locationCreateStructs + * + * @return \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct[] + */ + protected function buildSPILocationCreateStructs( array $locationCreateStructs ) + { + $spiLocationCreateStructs = array(); + + $parentLocationIdCache = array(); + foreach ( $locationCreateStructs as $index => $locationCreateStruct ) + { + $parentLocation = $this->repository->getLocationService()->loadLocation( $locationCreateStruct->parentLocationId ); + if ( in_array( $parentLocation->id, $parentLocationIdCache ) ) + { + throw new InvalidArgumentException( + "\$locationCreateStructs", + "Multiple LocationCreateStructs with parent Location '{$parentLocation->id}' exist" + ); + } + $parentLocationIdCache[] = $parentLocation->id; + + if ( $locationCreateStruct->priority !== null && !is_numeric( $locationCreateStruct->priority ) ) + { + throw new InvalidArgumentValue( "priority", $locationCreateStruct->priority, "LocationCreateStruct" ); + } + + if ( !is_bool( $locationCreateStruct->hidden ) ) + { + throw new InvalidArgumentValue( "hidden", $locationCreateStruct->hidden, "LocationCreateStruct" ); + } + + if ( $locationCreateStruct->remoteId !== null && ( !is_string( $locationCreateStruct->remoteId ) || empty( $locationCreateStruct->remoteId ) ) ) + { + throw new InvalidArgumentValue( "remoteId", $locationCreateStruct->remoteId, "LocationCreateStruct" ); + } + + if ( $locationCreateStruct->sortField !== null && !is_numeric( $locationCreateStruct->sortField ) ) + { + throw new InvalidArgumentValue( "sortField", $locationCreateStruct->sortField, "LocationCreateStruct" ); + } + + if ( $locationCreateStruct->sortOrder !== null && !is_numeric( $locationCreateStruct->sortOrder ) ) + { + throw new InvalidArgumentValue( "sortOrder", $locationCreateStruct->sortOrder, "LocationCreateStruct" ); + } + + if ( null === $locationCreateStruct->remoteId ) + { + $locationCreateStruct->remoteId = md5( uniqid( get_class( $locationCreateStruct ), true ) ); + } + else + { + try + { + $this->repository->getLocationService()->loadLocationByRemoteId( $locationCreateStruct->remoteId ); + throw new InvalidArgumentException( + "\$locationCreateStructs", + "Another Location with remoteId '{$locationCreateStruct->remoteId}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $spiLocationCreateStructs[] = new SPILocationCreateStruct( + array( + "priority" => $locationCreateStruct->priority, + "hidden" => $locationCreateStruct->hidden, + "invisible" => ( $locationCreateStruct->hidden === true || $parentLocation->hidden || $parentLocation->invisible ), + "remoteId" => $locationCreateStruct->remoteId, + // contentId and contentVersion are set in ContentHandler upon draft creation + "contentId" => null, + "contentVersion" => null, + "pathIdentificationString" => null, + "mainLocationId" => ( $index === 0 ), + "sortField" => $locationCreateStruct->sortField, + "sortOrder" => $locationCreateStruct->sortOrder, + "parentId" => $locationCreateStruct->parentLocationId + ) + ); + } + + return $spiLocationCreateStructs; + } + + /** + * Updates the metadata. + * + * (see {@link ContentMetadataUpdateStruct}) of a content object - to update fields use updateContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update the content meta data + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the remoteId in $contentMetadataUpdateStruct is set but already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct $contentMetadataUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content with the updated attributes + */ + public function updateContentMetadata( APIContentInfo $contentInfo, ContentMetadataUpdateStruct $contentMetadataUpdateStruct ) + { + $propertyCount = 0; + foreach ( $contentMetadataUpdateStruct as $propertyName => $propertyValue ) + { + if ( isset( $contentMetadataUpdateStruct->$propertyName ) ) + { + $propertyCount += 1; + } + } + if ( $propertyCount === 0 ) + { + throw new InvalidArgumentException( + "\$contentMetadataUpdateStruct", + "At least one property must be set" + ); + } + + $loadedContentInfo = $this->loadContentInfo( $contentInfo->id ); + + if ( !$this->repository->canUser( 'content', 'edit', $loadedContentInfo ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + if ( isset( $contentMetadataUpdateStruct->remoteId ) ) + { + try + { + $existingContentInfo = $this->loadContentInfoByRemoteId( $contentMetadataUpdateStruct->remoteId ); + + if ( $existingContentInfo->id !== $loadedContentInfo->id ) + throw new InvalidArgumentException( + "\$contentMetadataUpdateStruct", + "Another content with remoteId '{$contentMetadataUpdateStruct->remoteId}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $this->repository->beginTransaction(); + try + { + if ( $propertyCount > 1 || !isset( $contentMetadataUpdateStruct->mainLocationId ) ) + { + $this->persistenceHandler->contentHandler()->updateMetadata( + $loadedContentInfo->id, + new SPIMetadataUpdateStruct( + array( + "ownerId" => $contentMetadataUpdateStruct->ownerId, + "publicationDate" => isset( $contentMetadataUpdateStruct->publishedDate ) ? + $contentMetadataUpdateStruct->publishedDate->getTimestamp() : + null, + "modificationDate" => isset( $contentMetadataUpdateStruct->modificationDate ) ? + $contentMetadataUpdateStruct->modificationDate->getTimestamp() : + null, + "mainLanguageId" => isset( $contentMetadataUpdateStruct->mainLanguageCode ) ? + $this->repository->getContentLanguageService()->loadLanguage( + $contentMetadataUpdateStruct->mainLanguageCode + )->id : + null, + "alwaysAvailable" => $contentMetadataUpdateStruct->alwaysAvailable, + "remoteId" => $contentMetadataUpdateStruct->remoteId + ) + ) + ); + } + + // Change main location + if ( isset( $contentMetadataUpdateStruct->mainLocationId ) + && $loadedContentInfo->mainLocationId !== $contentMetadataUpdateStruct->mainLocationId ) + { + $this->persistenceHandler->locationHandler()->changeMainLocation( + $loadedContentInfo->id, + $contentMetadataUpdateStruct->mainLocationId + ); + } + + // Republish URL aliases to update always-available flag + if ( isset( $contentMetadataUpdateStruct->alwaysAvailable ) + && $loadedContentInfo->alwaysAvailable !== $contentMetadataUpdateStruct->alwaysAvailable ) + { + $content = $this->loadContent( $loadedContentInfo->id ); + $this->publishUrlAliasesForContent( $content ); + } + // @todo: this is legacy storage specific for updating ezcontentobject_tree.path_identification_string, to be removed + else if ( isset( $contentMetadataUpdateStruct->mainLanguageCode ) + && ( $loadedContentInfo->mainLanguageCode !== $contentMetadataUpdateStruct->mainLanguageCode ) ) + { + $content = $this->loadContent( $loadedContentInfo->id ); + $this->publishUrlAliasesForContent( $content, true ); + } + + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return isset( $content ) ? $content : $this->loadContent( $loadedContentInfo->id ); + } + + /** + * Publishes URL aliases for all locations of a given content. + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param boolean $onlyMain @todo: this is legacy storage specific for updating ezcontentobject_tree.path_identification_string, to be removed + * + * @return void + */ + protected function publishUrlAliasesForContent( APIContent $content, $onlyMain = false ) + { + $urlAliasNames = $this->repository->getNameSchemaService()->resolveUrlAliasSchema( $content ); + $locations = $this->repository->getLocationService()->loadLocations( + $content->getVersionInfo()->getContentInfo() + ); + foreach ( $locations as $location ) + { + foreach ( $urlAliasNames as $languageCode => $name ) + { + if ( $onlyMain && $languageCode != $content->contentInfo->mainLanguageCode ) + { + continue; + } + + $this->persistenceHandler->urlAliasHandler()->publishUrlAliasForLocation( + $location->id, + $location->parentLocationId, + $name, + $languageCode, + $content->contentInfo->alwaysAvailable, + // @todo: this is legacy storage specific for updating ezcontentobject_tree.path_identification_string, to be removed + $languageCode === $content->contentInfo->mainLanguageCode + ); + } + } + } + + /** + * Deletes a content object including all its versions and locations including their subtrees. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete the content (in one of the locations of the given content object) + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + */ + public function deleteContent( APIContentInfo $contentInfo ) + { + if ( !$this->repository->canUser( 'content', 'remove', $contentInfo ) ) + throw new UnauthorizedException( 'content', 'remove' ); + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->contentHandler()->deleteContent( $contentInfo->id ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Creates a draft from a published or archived version. + * + * If no version is given, the current published version is used. + * 4.x: The draft is created with the initialLanguage code of the source version or if not present with the main language. + * It can be changed on updating the version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the draft + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\User\User $user if set given user is used to create the draft - otherwise the current user is used + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContentDraft( APIContentInfo $contentInfo, APIVersionInfo $versionInfo = null, User $user = null ) + { + $contentInfo = $this->loadContentInfo( $contentInfo->id ); + + if ( $versionInfo !== null ) + { + // Check that given $contentInfo and $versionInfo belong to the same content + if ( $versionInfo->getContentInfo()->id != $contentInfo->id ) + { + throw new InvalidArgumentException( + "\$versionInfo", + "VersionInfo does not belong to the same content as given ContentInfo" + ); + } + + $versionInfo = $this->loadVersionInfoById( $contentInfo->id, $versionInfo->versionNo ); + + switch ( $versionInfo->status ) + { + case VersionInfo::STATUS_PUBLISHED: + case VersionInfo::STATUS_ARCHIVED: + break; + + default: + // @todo: throw an exception here, to be defined + throw new BadStateException( + "\$versionInfo", + "Draft can not be created from a draft version" + ); + } + + $versionNo = $versionInfo->versionNo; + } + else if ( $contentInfo->published ) + { + $versionNo = $contentInfo->currentVersionNo; + } + else + { + // @todo: throw an exception here, to be defined + throw new BadStateException( + "\$contentInfo", + "Content is not published, draft can be created only from published or archived version" + ); + } + + if ( $user === null ) + { + $user = $this->repository->getCurrentUser(); + } + else + { + $user = $this->repository->getUserService()->loadUser( $user->id ); + } + + if ( !$this->repository->canUser( 'content', 'edit', $contentInfo ) ) + throw new UnauthorizedException( 'content', 'edit', array( 'name' => $contentInfo->name ) ); + + $this->repository->beginTransaction(); + try + { + $spiContent = $this->persistenceHandler->contentHandler()->createDraftFromVersion( + $contentInfo->id, + $versionNo, + $user->id + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildContentDomainObject( $spiContent ); + } + + /** + * Loads drafts for a user. + * + * If no user is given the drafts for the authenticated user a returned + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load the draft list + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo the drafts ({@link VersionInfo}) owned by the given user + */ + public function loadContentDrafts( User $user = null ) + { + if ( $user === null ) + { + $user = $this->repository->getCurrentUser(); + } + + // throw early if user has absolutely no access to versionread + if ( $this->repository->hasAccess( 'content', 'versionread' ) === false ) + throw new UnauthorizedException( 'content', 'versionread' ); + + $spiVersionInfoList = $this->persistenceHandler->contentHandler()->loadDraftsForUser( $user->id ); + + $versionInfoList = array(); + foreach ( $spiVersionInfoList as $spiVersionInfo ) + { + $versionInfo = $this->buildVersionInfoDomainObject( $spiVersionInfo ); + if ( !$this->repository->canUser( 'content', 'versionread', $versionInfo ) ) + throw new UnauthorizedException( 'content', 'versionread' ); + + $versionInfoList[] = $versionInfo; + } + + return $versionInfoList; + } + + /** + * Translate a version + * + * updates the destination version given in $translationInfo with the provided translated fields in $translationValues + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the given destination version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $translationValues is not valid + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * @param \eZ\Publish\API\Repository\Values\Content\TranslationValues $translationValues + * @param \eZ\Publish\API\Repository\Values\User\User $user If set, this user is taken as modifier of the version + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the translated fields + * + * @since 5.0 + */ + public function translateVersion( TranslationInfo $translationInfo, APITranslationValues $translationValues, User $user = null ) + { + + } + + /** + * Updates the fields of a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct $contentUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the updated fields + */ + public function updateContent( APIVersionInfo $versionInfo, APIContentUpdateStruct $contentUpdateStruct ) + { + /** @var $content \eZ\Publish\Core\Repository\Values\Content\Content */ + $content = $this->loadContent( + $versionInfo->getContentInfo()->id, + null, + $versionInfo->versionNo + ); + if ( $content->versionInfo->status !== APIVersionInfo::STATUS_DRAFT ) + { + throw new BadStateException( + "\$versionInfo", + "Version is not a draft and can not be updated" + ); + } + + if ( !$this->repository->canUser( 'content', 'edit', $content ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + /** @var \eZ\Publish\API\Repository\Values\Content\Field[] $fields */ + $fields = array(); + $languageCodes = $content->versionInfo->languageCodes; + $initialLanguageCode = $contentUpdateStruct->initialLanguageCode ?: $content->contentInfo->mainLanguageCode; + + foreach ( $contentUpdateStruct->fields as $field ) + { + $fieldDefinition = $content->contentType->getFieldDefinition( $field->fieldDefIdentifier ); + if ( $fieldDefinition === null ) + { + throw new ContentValidationException( + "Field definition '{$field->fieldDefIdentifier}' does not exist in given ContentType" + ); + } + + $fieldLanguageCode = $field->languageCode ?: $initialLanguageCode; + + if ( $fieldDefinition->isTranslatable ) + { + $fields[$field->fieldDefIdentifier][$fieldLanguageCode] = $field; + } + else + { + if ( $fieldLanguageCode != $initialLanguageCode ) + { + throw new ContentValidationException( + "A translation '{$fieldLanguageCode}' is set for non translatable field definition '{$field->fieldDefIdentifier}'" + ); + } + + $fields[$field->fieldDefIdentifier][$initialLanguageCode] = $field; + } + + $languageCodes[] = $fieldLanguageCode; + } + + $languageCodes = array_unique( $languageCodes ); + $fieldValues = array(); + $spiFields = array(); + $allFieldErrors = array(); + + foreach ( $content->contentType->getFieldDefinitions() as $fieldDefinition ) + { + /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */ + $fieldType = $this->repository->getFieldTypeService()->buildFieldType( + $fieldDefinition->fieldTypeIdentifier + ); + + foreach ( $languageCodes as $languageCode ) + { + $isLanguageNew = !in_array( $languageCode, $content->versionInfo->languageCodes ); + $valueLanguageCode = $fieldDefinition->isTranslatable ? $languageCode : $initialLanguageCode; + $isFieldUpdated = isset( $fields[$fieldDefinition->identifier][$valueLanguageCode] ); + + if ( !$isFieldUpdated && !$isLanguageNew ) + { + continue; + } + + if ( !$isFieldUpdated && $isLanguageNew && !$fieldDefinition->isTranslatable ) + { + $fieldValue = $fieldType->acceptValue( + $content->getField( + $fieldDefinition->identifier, + $fieldDefinition->isTranslatable ? + $languageCode : + $content->contentInfo->mainLanguageCode + )->value + ); + } + else if ( $isFieldUpdated ) + { + $fieldValue = $fieldType->acceptValue( + $fields[$fieldDefinition->identifier][$valueLanguageCode]->value + ); + } + else + { + $fieldValue = $fieldType->acceptValue( $fieldDefinition->defaultValue ); + } + + if ( $fieldType->isEmptyValue( $fieldValue ) ) + { + if ( $fieldDefinition->isRequired ) + { + throw new ContentValidationException( "Required field '{$fieldDefinition->identifier}' value is empty" ); + } + } + else + { + $fieldErrors = $fieldType->validate( + $fieldDefinition, + $fieldValue + ); + if ( !empty( $fieldErrors ) ) + { + $allFieldErrors[$fieldDefinition->id][$languageCode] = $fieldErrors; + } + } + + if ( !empty( $allFieldErrors ) ) + { + continue; + } + + $fieldValues[$fieldDefinition->identifier][$languageCode] = $fieldValue; + $spiFields[] = new SPIField( + array( + "id" => $isLanguageNew ? + null : + $content->getField( $fieldDefinition->identifier, $languageCode )->id, + "fieldDefinitionId" => $fieldDefinition->id, + "type" => $fieldDefinition->fieldTypeIdentifier, + "value" => $fieldType->toPersistenceValue( $fieldValue ), + "languageCode" => $languageCode, + "versionNo" => $versionInfo->versionNo + ) + ); + } + } + + if ( !empty( $allFieldErrors ) ) + { + throw new ContentFieldValidationException( $allFieldErrors ); + } + + $spiContentUpdateStruct = new SPIContentUpdateStruct( + array( + "name" => $this->repository->getNameSchemaService()->resolveNameSchema( $content, $fieldValues, $languageCodes ), + "creatorId" => $this->repository->getCurrentUser()->id, + "fields" => $spiFields, + "modificationDate" => time(), + "initialLanguageId" => $this->persistenceHandler->contentLanguageHandler()->loadByLanguageCode( + $initialLanguageCode + )->id + ) + ); + + $this->repository->beginTransaction(); + try + { + $spiContent = $this->persistenceHandler->contentHandler()->updateContent( + $versionInfo->getContentInfo()->id, + $versionInfo->versionNo, + $spiContentUpdateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildContentDomainObject( $spiContent ); + } + + /** + * Publishes a content version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function publishVersion( APIVersionInfo $versionInfo ) + { + $content = $this->loadContent( + $versionInfo->contentInfo->id, + null, + $versionInfo->versionNo + ); + + if ( !$this->repository->canUser( 'content', 'edit', $content ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $this->repository->beginTransaction(); + try + { + $content = $this->internalPublishVersion( $content->getVersionInfo() ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $content; + } + + /** + * Publishes a content version + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param int|null $publicationDate + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function internalPublishVersion( APIVersionInfo $versionInfo, $publicationDate = null ) + { + if ( $versionInfo->status !== APIVersionInfo::STATUS_DRAFT ) + { + throw new BadStateException( "versionInfo", "only versions in draft status can be published" ); + } + + $metadataUpdateStruct = new SPIMetadataUpdateStruct(); + $metadataUpdateStruct->publicationDate = isset( $publicationDate ) ? $publicationDate : time(); + $metadataUpdateStruct->modificationDate = $metadataUpdateStruct->publicationDate; + + $spiContent = $this->persistenceHandler->contentHandler()->publish( + $versionInfo->getContentInfo()->id, + $versionInfo->versionNo, + $metadataUpdateStruct + ); + $content = $this->buildContentDomainObject( $spiContent ); + + $this->publishUrlAliasesForContent( $content ); + + return $content; + } + + /** + * removes the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is in state published + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + */ + public function deleteVersion( APIVersionInfo $versionInfo ) + { + if ( $versionInfo->status === APIVersionInfo::STATUS_PUBLISHED ) + { + throw new BadStateException( + "\$versionInfo", + "Version is published and can not be removed" + ); + } + + if ( !$this->repository->canUser( 'content', 'versionremove', $versionInfo ) ) + throw new UnauthorizedException( 'content', 'versionremove' ); + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->contentHandler()->deleteVersion( + $versionInfo->getContentInfo()->id, + $versionInfo->versionNo + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Loads all versions for the given content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to list versions + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] Sorted by creation date + */ + public function loadVersions( APIContentInfo $contentInfo ) + { + if ( !$this->repository->canUser( 'content', 'versionread', $contentInfo ) ) + throw new UnauthorizedException( 'content', 'versionread' ); + + $spiVersionInfoList = $this->persistenceHandler->contentHandler()->listVersions( $contentInfo->id ); + + $versions = array(); + foreach ( $spiVersionInfoList as $spiVersionInfo ) + { + $versionInfo = $this->buildVersionInfoDomainObject( $spiVersionInfo ); + if ( !$this->repository->canUser( 'content', 'versionread', $versionInfo ) ) + throw new UnauthorizedException( 'content', 'versionread' ); + + $versions[] = $versionInfo; + } + + usort( + $versions, + function( $a, $b ) + { + if ( $a->creationDate->getTimestamp() === $b->creationDate->getTimestamp() ) return 0; + return ( $a->creationDate->getTimestamp() < $b->creationDate->getTimestamp() ) ? -1 : 1; + } + ); + + return $versions; + } + + /** + * Copies the content to a new location. If no version is given, + * all versions are copied, otherwise only the given version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy the content to the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $destinationLocationCreateStruct the target location where the content is copied to + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function copyContent( APIContentInfo $contentInfo, LocationCreateStruct $destinationLocationCreateStruct, APIVersionInfo $versionInfo = null) + { + if ( $destinationLocationCreateStruct->remoteId !== null ) + { + try + { + $this->repository->getLocationService()->loadLocationByRemoteId( + $destinationLocationCreateStruct->remoteId + ); + + throw new InvalidArgumentException( + "\$destinationLocationCreateStruct", + "Location with remoteId '{$destinationLocationCreateStruct->remoteId}' already exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + else + { + $destinationLocationCreateStruct->remoteId = md5( uniqid( get_class( $this ), true ) ); + } + + if ( !$this->repository->canUser( 'content', 'create', $contentInfo, $destinationLocationCreateStruct ) ) + throw new UnauthorizedException( 'content', 'create' ); + + $this->repository->beginTransaction(); + try + { + $spiContent = $this->persistenceHandler->contentHandler()->copy( + $contentInfo->id, + $versionInfo ? $versionInfo->versionNo : null + ); + + $content = $this->internalPublishVersion( + $this->buildVersionInfoDomainObject( $spiContent->versionInfo ), + $spiContent->versionInfo->creationDate + ); + + $this->repository->getLocationService()->createLocation( + $content->getVersionInfo()->getContentInfo(), + $destinationLocationCreateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $content; + } + + /** + * Loads all outgoing relations for the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadRelations( APIVersionInfo $versionInfo ) + { + if ( !$this->repository->canUser( 'content', 'versionread', $versionInfo ) ) + throw new UnauthorizedException( 'content', 'versionread' ); + + $contentInfo = $versionInfo->getContentInfo(); + $spiRelations = $this->persistenceHandler->contentHandler()->loadRelations( + $contentInfo->id, + $versionInfo->versionNo + ); + + $relations = array(); + foreach ( $spiRelations as $spiRelation ) + { + $relations[] = $this->buildRelationDomainObject( + $spiRelation, + $contentInfo + ); + } + foreach ( $relations as $relation ) + { + if ( !$this->repository->canUser( 'content', 'read', $relation->getDestinationContentInfo() ) ) + throw new UnauthorizedException( 'content', 'read' ); + } + + return $relations; + } + + /** + * Loads all incoming relations for a content object. + * + * The relations come only from published versions of the source content objects + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadReverseRelations( APIContentInfo $contentInfo ) + { + if ( $this->repository->hasAccess( 'content', 'reverserelatedlist' ) !== true ) + throw new UnauthorizedException( 'content', 'reverserelatedlist' ); + + $spiRelations = $this->persistenceHandler->contentHandler()->loadReverseRelations( + $contentInfo->id + ); + + $returnArray = array(); + foreach ( $spiRelations as $spiRelation ) + { + $relation = $this->buildRelationDomainObject( + $spiRelation, + null, + $contentInfo + ); + if ( !$this->repository->canUser( 'content', 'read', $relation->getSourceContentInfo() ) ) + throw new UnauthorizedException( 'content', 'read' ); + + $returnArray[] = $relation; + } + + return $returnArray; + } + + /** + * Adds a relation of type common. + * + * The source of the relation is the content and version + * referenced by $versionInfo. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent the destination of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation the newly created relation + */ + public function addRelation( APIVersionInfo $sourceVersion, APIContentInfo $destinationContent ) + { + $sourceVersion = $this->loadVersionInfoById( + $sourceVersion->contentInfo->id, + $sourceVersion->versionNo + ); + + if ( $sourceVersion->status !== APIVersionInfo::STATUS_DRAFT ) + { + throw new BadStateException( + "\$sourceVersion", + "Relations of type common can only be added to versions of status draft" + ); + } + + if ( !$this->repository->canUser( 'content', 'edit', $sourceVersion ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $sourceContentInfo = $sourceVersion->getContentInfo(); + + $this->repository->beginTransaction(); + try + { + $spiRelation = $this->persistenceHandler->contentHandler()->addRelation( + new SPIRelationCreateStruct( + array( + 'sourceContentId' => $sourceContentInfo->id, + 'sourceContentVersionNo' => $sourceVersion->versionNo, + 'sourceFieldDefinitionId' => null, + 'destinationContentId' => $destinationContent->id, + 'type' => APIRelation::COMMON + ) + ) + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildRelationDomainObject( $spiRelation, $sourceContentInfo, $destinationContent ); + } + + /** + * Removes a relation of type COMMON from a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is no relation of type COMMON for the given destination + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent + */ + public function deleteRelation( APIVersionInfo $sourceVersion, APIContentInfo $destinationContent ) + { + $sourceVersion = $this->loadVersionInfoById( + $sourceVersion->contentInfo->id, + $sourceVersion->versionNo + ); + + if ( $sourceVersion->status !== APIVersionInfo::STATUS_DRAFT ) + { + throw new BadStateException( + "\$sourceVersion", + "Relations of type common can only be removed from versions of status draft" + ); + } + + if ( !$this->repository->canUser( 'content', 'edit', $sourceVersion ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $spiRelations = $this->persistenceHandler->contentHandler()->loadRelations( + $sourceVersion->getContentInfo()->id, + $sourceVersion->versionNo, + APIRelation::COMMON + ); + + if ( empty( $spiRelations ) ) + { + throw new InvalidArgumentException( + "\$sourceVersion", + "There are no relations of type COMMON for the given destination" + ); + } + + // there should be only one relation of type COMMON for each destination, + // but in case there were ever more then one, we will remove them all + // @todo: alternatively, throw BadStateException? + $this->repository->beginTransaction(); + try + { + foreach ( $spiRelations as $spiRelation ) + { + if ( $spiRelation->destinationContentId == $destinationContent->id ) + { + $this->persistenceHandler->contentHandler()->removeRelation( $spiRelation->id ); + } + } + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Adds translation information to the content object + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed add a translation info + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * + * @since 5.0 + */ + public function addTranslationInfo( TranslationInfo $translationInfo ) + { + + } + + /** + * lists the translations done on this content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed read translation infos + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $filter + * + * @todo TBD - filter by source version destination version and languages + * + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo[] + * + * @since 5.0 + */ + public function loadTranslationInfos( APIContentInfo $contentInfo, array $filter = array() ) + { + + } + + /** + * Instantiates a new content create struct object + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param string $mainLanguageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ + public function newContentCreateStruct( ContentType $contentType, $mainLanguageCode ) + { + return new ContentCreateStruct( + array( + "contentType" => $contentType, + "mainLanguageCode" => $mainLanguageCode + ) + ); + } + + /** + * Instantiates a new content meta data update struct + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct + */ + public function newContentMetadataUpdateStruct() + { + return new ContentMetadataUpdateStruct(); + } + + /** + * Instantiates a new content update struct + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct + */ + public function newContentUpdateStruct() + { + return new ContentUpdateStruct(); + } + + /** + * Instantiates a new TranslationInfo object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo + */ + public function newTranslationInfo() + { + return new TranslationInfo(); + } + + /** + * Instantiates a Translation object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationValues + */ + public function newTranslationValues() + { + return new TranslationValues(); + } + + /** + * Builds a Content domain object from value object returned from persistence + * + * @todo: Made public, since the search service also needs access to this + * method. Should be refactored into its own class together with the other + * build* methods. + * + * @param \eZ\Publish\SPI\Persistence\Content $spiContent + * + * @return \eZ\Publish\Core\Repository\Values\Content\Content + */ + public function buildContentDomainObject( SPIContent $spiContent ) + { + $versionInfo = $this->buildVersionInfoDomainObject( $spiContent->versionInfo ); + return new Content( + array( + "internalFields" => $this->buildDomainFields( $spiContent->fields ), + "versionInfo" => $versionInfo, + ) + ); + } + + /** + * Returns an array of domain fields created from given array of SPI fields + * + * @param \eZ\Publish\SPI\Persistence\Content\Field[] $spiFields + * + * @return array + */ + protected function buildDomainFields( array $spiFields ) + { + $fields = array(); + + foreach ( $spiFields as $spiField ) + { + $fields[] = new Field( + array( + "id" => $spiField->id, + "value" => $this->repository->getFieldTypeService()->buildFieldType( + $spiField->type + )->fromPersistenceValue( $spiField->value ), + "languageCode" => $spiField->languageCode, + "fieldDefIdentifier" => $this->persistenceHandler->contentTypeHandler()->getFieldDefinition( + $spiField->fieldDefinitionId, + ContentType::STATUS_DEFINED + )->identifier + ) + ); + } + + return $fields; + } + + /** + * Builds a ContentInfo domain object from value object returned from persistence + * + * @todo: Made public, since the search service also needs access to this + * method. Should be refactored into its own class together with the other + * build* methods. + * + * @param \eZ\Publish\SPI\Persistence\Content\ContentInfo $spiContentInfo + * + * @return \eZ\Publish\Core\Repository\Values\Content\ContentInfo + */ + public function buildContentInfoDomainObject( SPIContentInfo $spiContentInfo ) + { + return new ContentInfo( + array( + "id" => $spiContentInfo->id, + "name" => $spiContentInfo->name, + "sectionId" => $spiContentInfo->sectionId, + "currentVersionNo" => $spiContentInfo->currentVersionNo, + "published" => $spiContentInfo->isPublished, + "ownerId" => $spiContentInfo->ownerId, + "modificationDate" => $spiContentInfo->modificationDate == 0 ? + null : + $this->getDateTime( $spiContentInfo->modificationDate ), + "publishedDate" => $spiContentInfo->publicationDate == 0 ? + null : + $this->getDateTime( $spiContentInfo->publicationDate ), + "alwaysAvailable" => $spiContentInfo->alwaysAvailable, + "remoteId" => $spiContentInfo->remoteId, + "mainLanguageCode" => $spiContentInfo->mainLanguageCode, + "mainLocationId" => $spiContentInfo->mainLocationId, + "contentType" => $this->repository->getContentTypeService()->loadContentType( + $spiContentInfo->contentTypeId + ) + ) + ); + } + + /** + * Builds a VersionInfo domain object from value object returned from persistence + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $spiVersionInfo + * + * @return VersionInfo + */ + protected function buildVersionInfoDomainObject( SPIVersionInfo $spiVersionInfo ) + { + $languageCodes = array(); + foreach ( $spiVersionInfo->languageIds as $languageId ) + { + $languageCodes[] = $this->persistenceHandler->contentLanguageHandler()->load( + $languageId + )->languageCode; + } + + return new VersionInfo( + array( + "id" => $spiVersionInfo->id, + "versionNo" => $spiVersionInfo->versionNo, + "modificationDate" => $this->getDateTime( $spiVersionInfo->modificationDate ), + "creatorId" => $spiVersionInfo->creatorId, + "creationDate" => $this->getDateTime( $spiVersionInfo->creationDate ), + "status" => $this->getDomainVersionStatus( $spiVersionInfo->status ), + "initialLanguageCode" => $spiVersionInfo->initialLanguageCode, + "languageCodes" => $languageCodes, + "names" => $spiVersionInfo->names, + "contentInfo" => $this->buildContentInfoDomainObject( $spiVersionInfo->contentInfo ) + ) + ); + } + + /** + * @param int $spiStatus + * + * @return int|null + */ + protected function getDomainVersionStatus( $spiStatus ) + { + $status = null; + switch ( $spiStatus ) + { + case SPIVersionInfo::STATUS_DRAFT: + $status = VersionInfo::STATUS_DRAFT; + break; + case SPIVersionInfo::STATUS_PUBLISHED: + $status = VersionInfo::STATUS_PUBLISHED; + break; + case SPIVersionInfo::STATUS_ARCHIVED: + $status = VersionInfo::STATUS_ARCHIVED; + break; + } + return $status; + } + + /** + * @param int|null $timestamp + * + * @return \DateTime|null + */ + protected function getDateTime( $timestamp ) + { + $dateTime = new DateTime(); + $dateTime->setTimestamp( $timestamp ); + return $dateTime; + } + + /** + * Builds API Relation object from provided SPI Relation object + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation $spiRelation + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo|null $sourceContentInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo|null $destinationContentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation + */ + protected function buildRelationDomainObject( SPIRelation $spiRelation, APIContentInfo $sourceContentInfo = null, APIContentInfo $destinationContentInfo = null ) + { + // @todo Should relations really be loaded w/o checking permissions just because User needs to be accessible?? + if ( $sourceContentInfo === null ) + $sourceContentInfo = $this->internalLoadContentInfo( $spiRelation->sourceContentId ); + + if ( $destinationContentInfo === null ) + $destinationContentInfo = $this->internalLoadContentInfo( $spiRelation->destinationContentId ); + + $sourceFieldDefinition = null; + if ( $spiRelation->sourceFieldDefinitionId !== null ) + { + $sourceFieldDefinition = $sourceContentInfo->getContentType()->getFieldDefinitionById( + $spiRelation->sourceFieldDefinitionId + ); + } + + return new Relation( + array( + "id" => $spiRelation->id, + "sourceFieldDefinitionIdentifier" => $sourceFieldDefinition !== null ? $sourceFieldDefinition->identifier : null, + "type" => $spiRelation->type, + "sourceContentInfo" => $sourceContentInfo, + "destinationContentInfo" => $destinationContentInfo + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/ContentTypeService.php b/eZ/Publish/Core/Repository/ContentTypeService.php new file mode 100644 index 0000000..87d480e --- /dev/null +++ b/eZ/Publish/Core/Repository/ContentTypeService.php @@ -0,0 +1,1618 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\ContentTypeService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\ContentTypeService as ContentTypeServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Content\Type\Handler; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; +use eZ\Publish\API\Repository\Exceptions\BadStateException as APIBadStateException; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition as APIFieldDefinition; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentType as APIContentType; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft as APIContentTypeDraft; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup as APIContentTypeGroup; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct as APIContentTypeCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct; +use eZ\Publish\Core\Repository\Values\ContentType\ContentTypeGroup; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\Repository\Values\ContentType\ContentTypeDraft; +use eZ\Publish\Core\Repository\Values\ContentType\ContentTypeCreateStruct; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\SPI\Persistence\Content\Type as SPIContentType; +use eZ\Publish\SPI\Persistence\Content\Type\CreateStruct as SPIContentTypeCreateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct as SPIContentTypeUpdateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition as SPIFieldDefinition; +use eZ\Publish\SPI\Persistence\Content\Type\Group as SPIContentTypeGroup; +use eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct as SPIContentTypeGroupCreateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct as SPIContentTypeGroupUpdateStruct; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\BadStateException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\ContentTypeFieldDefinitionValidationException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use DateTime; +use Exception; + +/** + * @example Examples/contenttype.php + * + * @package eZ\Publish\Core\Repository + */ +class ContentTypeService implements ContentTypeServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + protected $contentTypeHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\Type\Handler $contentTypeHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $contentTypeHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->contentTypeHandler = $contentTypeHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Create a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a group with the same identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function createContentTypeGroup( ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct ) + { + if ( $this->repository->hasAccess( 'class', 'create' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'create' ); + + try + { + $this->loadContentTypeGroupByIdentifier( $contentTypeGroupCreateStruct->identifier ); + + throw new InvalidArgumentException( + "\$contentTypeGroupCreateStruct", + "A group with the identifier '{$contentTypeGroupCreateStruct->identifier}' already exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + if ( $contentTypeGroupCreateStruct->creationDate === null ) + { + $timestamp = time(); + } + else + { + $timestamp = $contentTypeGroupCreateStruct->creationDate->getTimestamp(); + } + + if ( $contentTypeGroupCreateStruct->creatorId === null ) + { + $userId = $this->repository->getCurrentUser()->id; + } + else + { + $userId = $contentTypeGroupCreateStruct->creatorId; + } + + $spiGroupCreateStruct = new SPIContentTypeGroupCreateStruct( + array( + "identifier" => $contentTypeGroupCreateStruct->identifier, + "created" => $timestamp, + "modified" => $timestamp, + "creatorId" => $userId, + "modifierId" => $userId + ) + ); + + $this->repository->beginTransaction(); + try + { + $spiContentTypeGroup = $this->contentTypeHandler->createGroup( + $spiGroupCreateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildContentTypeGroupDomainObject( $spiContentTypeGroup ); + } + + /** + * Get a Content Type Group object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param int $contentTypeGroupId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroup( $contentTypeGroupId ) + { + if ( !is_numeric( $contentTypeGroupId ) ) + { + throw new InvalidArgumentValue( '$contentTypeGroupId', $contentTypeGroupId ); + } + + $spiGroup = $this->contentTypeHandler->loadGroup( + $contentTypeGroupId + ); + + return $this->buildContentTypeGroupDomainObject( $spiGroup ); + } + + /** + * Get a Content Type Group object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param string $contentTypeGroupIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroupByIdentifier( $contentTypeGroupIdentifier ) + { + $groups = $this->loadContentTypeGroups(); + + foreach ( $groups as $group ) + { + if ( $group->identifier === $contentTypeGroupIdentifier ) + { + return $group; + } + } + + throw new NotFoundException( 'ContentTypeGroup', $contentTypeGroupIdentifier ); + } + + /** + * Get all Content Type Groups + * + * @return \eZ\Publish\Core\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function loadContentTypeGroups() + { + $spiGroups = $this->contentTypeHandler->loadAllGroups(); + + $groups = array(); + foreach ( $spiGroups as $spiGroup ) + { + $groups[] = $this->buildContentTypeGroupDomainObject( $spiGroup ); + } + + return $groups; + } + + /** + * Update a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier (if set) already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup the content type group to be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct + */ + public function updateContentTypeGroup( APIContentTypeGroup $contentTypeGroup, ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'update' ); + + $loadedContentTypeGroup = $this->loadContentTypeGroup( $contentTypeGroup->id ); + + if ( $contentTypeGroupUpdateStruct->identifier !== null + && $contentTypeGroupUpdateStruct->identifier !== $loadedContentTypeGroup->identifier ) + { + try + { + $this->loadContentTypeGroupByIdentifier( $contentTypeGroupUpdateStruct->identifier ); + + throw new InvalidArgumentException( + '$contentTypeGroupUpdateStruct->identifier', + "given identifier already exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + if ( $contentTypeGroupUpdateStruct->modificationDate !== null ) + { + $modifiedTimestamp = $contentTypeGroupUpdateStruct->modificationDate->getTimestamp(); + } + else + { + $modifiedTimestamp = time(); + } + + $spiGroupUpdateStruct = new SPIContentTypeGroupUpdateStruct( + array( + "id" => $loadedContentTypeGroup->id, + "identifier" => $contentTypeGroupUpdateStruct->identifier === null ? + $loadedContentTypeGroup->identifier : + $contentTypeGroupUpdateStruct->identifier, + "modified" => $modifiedTimestamp, + "modifierId" => $contentTypeGroupUpdateStruct->modifierId === null ? + $this->repository->getCurrentUser()->id : + $contentTypeGroupUpdateStruct->modifierId + ) + ); + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->updateGroup( + $spiGroupUpdateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Delete a Content Type Group. + * + * This method only deletes an content type group which has content types without any content instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a to be deleted content type has instances + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function deleteContentTypeGroup( APIContentTypeGroup $contentTypeGroup ) + { + if ( $this->repository->hasAccess( 'class', 'delete' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'delete' ); + + $loadedContentTypeGroup = $this->loadContentTypeGroup( $contentTypeGroup->id ); + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->deleteGroup( + $loadedContentTypeGroup->id + ); + $this->repository->commit(); + } + catch ( APIBadStateException $e ) + { + $this->repository->rollback(); + throw new InvalidArgumentException( + "\$contentTypeGroup", + "Content type group has content type instances", + $e + ); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Builds a ContentTypeGroup domain object from value object returned by persistence + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group $spiGroup + * + * @return \eZ\Publish\Core\Repository\Values\ContentType\ContentTypeGroup + */ + protected function buildContentTypeGroupDomainObject( SPIContentTypeGroup $spiGroup ) + { + return new ContentTypeGroup( + array( + "id" => $spiGroup->id, + "identifier" => $spiGroup->identifier, + "creationDate" => $this->getDateTime( $spiGroup->created ), + "modificationDate" => $this->getDateTime( $spiGroup->modified ), + "creatorId" => $spiGroup->creatorId, + "modifierId" => $spiGroup->modifierId, + "names" => $spiGroup->name, + "descriptions" => $spiGroup->description + ) + ); + } + + /** + * @param int|null $timestamp + * + * @return \DateTime|null + */ + protected function getDateTime( $timestamp ) + { + $dateTime = new DateTime(); + $dateTime->setTimestamp( $timestamp ); + return $dateTime; + } + + /** + * Create a Content Type object. + * + * The content type is created in the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException In case when + * - array of content type groups does not contain at least one content type group + * - identifier or remoteId in the content type create struct already exists + * - there is a duplicate field identifier in the content type create struct + * - content type create struct does not contain at least one field definition create struct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct $contentTypeCreateStruct + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $contentTypeGroups Required array of {@link ContentTypeGroup} to link type with (must contain one) + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentType( APIContentTypeCreateStruct $contentTypeCreateStruct, array $contentTypeGroups ) + { + if ( empty( $contentTypeGroups ) ) + { + throw new InvalidArgumentException( + "\$contentTypeGroups", + "Argument must contain at least one ContentTypeGroup" + ); + } + + try + { + $this->contentTypeHandler->loadByIdentifier( + $contentTypeCreateStruct->identifier + ); + + throw new InvalidArgumentException( + "\$contentTypeCreateStruct", + "Another ContentType with identifier '{$contentTypeCreateStruct->identifier}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + try + { + $this->contentTypeHandler->loadByRemoteId( + $contentTypeCreateStruct->remoteId + ); + + throw new InvalidArgumentException( + "\$contentTypeCreateStruct", + "Another ContentType with remoteId '{$contentTypeCreateStruct->remoteId}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + if ( empty( $contentTypeCreateStruct->fieldDefinitions ) ) + { + throw new InvalidArgumentException( + "\$contentTypeCreateStruct", + "Argument must contain at least one FieldDefinitionCreateStruct" + ); + } + + $fieldDefinitionIdentifierSet = array(); + $fieldDefinitionPositionSet = array(); + foreach ( $contentTypeCreateStruct->fieldDefinitions as $fieldDefinitionCreateStruct ) + { + // Check for duplicate identifiers + if ( !isset( $fieldDefinitionIdentifierSet[$fieldDefinitionCreateStruct->identifier] ) ) + { + $fieldDefinitionIdentifierSet[$fieldDefinitionCreateStruct->identifier] = true; + } + else + { + throw new InvalidArgumentException( + "\$contentTypeCreateStruct", + "Argument contains duplicate field definition identifier '{$fieldDefinitionCreateStruct->identifier}'" + ); + } + + // Check for duplicate positions + if ( !isset( $fieldDefinitionPositionSet[$fieldDefinitionCreateStruct->position] ) ) + { + $fieldDefinitionPositionSet[$fieldDefinitionCreateStruct->position] = true; + } + else + { + throw new InvalidArgumentException( + "\$contentTypeCreateStruct", + "Argument contains duplicate field definition position '{$fieldDefinitionCreateStruct->position}'" + ); + } + } + + if ( $contentTypeCreateStruct->creatorId === null ) + { + $userId = $this->repository->getCurrentUser()->id; + } + else + { + $userId = $contentTypeCreateStruct->creatorId; + } + + if ( $contentTypeCreateStruct->creationDate === null ) + { + $timestamp = time(); + } + else + { + $timestamp = $contentTypeCreateStruct->creationDate->getTimestamp(); + } + + if ( $contentTypeCreateStruct->remoteId === null ) + { + $contentTypeCreateStruct->remoteId = md5( uniqid( get_class( $contentTypeCreateStruct ), true ) ); + } + + $initialLanguageId = $this->repository->getContentLanguageService()->loadLanguage( + $contentTypeCreateStruct->mainLanguageCode + )->id; + $groupIds = array_map( + function ( $contentTypeGroup ) + { + return $contentTypeGroup->id; + }, + $contentTypeGroups + ); + $fieldDefinitions = array(); + foreach ( $contentTypeCreateStruct->fieldDefinitions as $fieldDefinitionCreateStruct ) + { + $fieldDefinitions[] = $this->buildSPIFieldDefinitionCreate( $fieldDefinitionCreateStruct ); + } + + $spiContentTypeCreateStruct = new SPIContentTypeCreateStruct( + array( + "name" => $contentTypeCreateStruct->names, + "status" => APIContentType::STATUS_DRAFT, + "description" => $contentTypeCreateStruct->descriptions, + "identifier" => $contentTypeCreateStruct->identifier, + "created" => $timestamp, + "modified" => $timestamp, + "creatorId" => $userId, + "modifierId" => $userId, + "remoteId" => $contentTypeCreateStruct->remoteId, + "urlAliasSchema" => $contentTypeCreateStruct->urlAliasSchema, + "nameSchema" => $contentTypeCreateStruct->nameSchema, + "isContainer" => $contentTypeCreateStruct->isContainer, + "initialLanguageId" => $initialLanguageId, + "sortField" => $contentTypeCreateStruct->defaultSortField, + "sortOrder" => $contentTypeCreateStruct->defaultSortOrder, + "groupIds" => $groupIds, + "fieldDefinitions" => $fieldDefinitions, + "defaultAlwaysAvailable" => $contentTypeCreateStruct->defaultAlwaysAvailable + ) + ); + + $this->repository->beginTransaction(); + try + { + $spiContentType = $this->contentTypeHandler->create( + $spiContentTypeCreateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildContentTypeDraftDomainObject( $spiContentType ); + } + + /** + * Builds SPIFieldDefinition object using API FieldDefinitionCreateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\ContentTypeFieldDefinitionValidationException if validator configuration or + * field setting do not validate + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + protected function buildSPIFieldDefinitionCreate( FieldDefinitionCreateStruct $fieldDefinitionCreateStruct ) + { + $spiFieldDefinition = new SPIFieldDefinition( + array( + "id" => null, + "name" => $fieldDefinitionCreateStruct->names, + "description" => $fieldDefinitionCreateStruct->descriptions, + "identifier" => $fieldDefinitionCreateStruct->identifier, + "fieldGroup" => (string)$fieldDefinitionCreateStruct->fieldGroup, + "position" => (int)$fieldDefinitionCreateStruct->position, + "fieldType" => $fieldDefinitionCreateStruct->fieldTypeIdentifier, + "isTranslatable" => $fieldDefinitionCreateStruct->isTranslatable, + "isRequired" => $fieldDefinitionCreateStruct->isRequired, + "isInfoCollector" => $fieldDefinitionCreateStruct->isInfoCollector, + "isSearchable" => $fieldDefinitionCreateStruct->isSearchable + // These properties are precreated in constructor + //"fieldTypeConstraints" + //"defaultValue" + ) + ); + /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */ + $fieldType = $this->repository->getFieldTypeService()->buildFieldType( + $fieldDefinitionCreateStruct->fieldTypeIdentifier + ); + + $validationErrors = $fieldType->validateValidatorConfiguration( + $fieldDefinitionCreateStruct->validatorConfiguration + ); + if ( !empty( $validationErrors ) ) + { + throw new ContentTypeFieldDefinitionValidationException( $validationErrors ); + } + + $validationErrors = $fieldType->validateFieldSettings( + $fieldDefinitionCreateStruct->fieldSettings + ); + if ( !empty( $validationErrors ) ) + { + throw new ContentTypeFieldDefinitionValidationException( $validationErrors ); + } + + $spiFieldDefinition->fieldTypeConstraints->validators = $fieldDefinitionCreateStruct->validatorConfiguration; + $spiFieldDefinition->fieldTypeConstraints->fieldSettings = $fieldDefinitionCreateStruct->fieldSettings; + $spiFieldDefinition->defaultValue = $fieldType->toPersistenceValue( + $fieldType->acceptValue( $fieldDefinitionCreateStruct->defaultValue ) + ); + + return $spiFieldDefinition; + } + + /** + * Builds SPIFieldDefinition object using API FieldDefinitionUpdateStruct + * and API FieldDefinition + * + * @throws \eZ\Publish\API\Repository\Exceptions\ContentTypeFieldDefinitionValidationException if validator configuration or + * field setting do not validate + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + protected function buildSPIFieldDefinitionUpdate( FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct, APIFieldDefinition $fieldDefinition ) + { + /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */ + $fieldType = $this->repository->getFieldTypeService()->buildFieldType( + $fieldDefinition->fieldTypeIdentifier + ); + + $validatorConfiguration = $fieldDefinitionUpdateStruct->validatorConfiguration === null + ? $fieldDefinition->validatorConfiguration + : $fieldDefinitionUpdateStruct->validatorConfiguration; + $fieldSettings = $fieldDefinitionUpdateStruct->fieldSettings === null + ? $fieldDefinition->fieldSettings + : $fieldDefinitionUpdateStruct->fieldSettings; + + $validationErrors = $fieldType->validateValidatorConfiguration( $validatorConfiguration ); + if ( !empty( $validationErrors ) ) + { + throw new ContentTypeFieldDefinitionValidationException( $validationErrors ); + } + + $validationErrors = $fieldType->validateFieldSettings( $fieldSettings ); + if ( !empty( $validationErrors ) ) + { + throw new ContentTypeFieldDefinitionValidationException( $validationErrors ); + } + + $spiFieldDefinition = new SPIFieldDefinition( + array( + "id" => $fieldDefinition->id, + "fieldType" => $fieldDefinition->fieldTypeIdentifier, + "name" => $fieldDefinitionUpdateStruct->names === null ? + $fieldDefinition->getNames() : + $fieldDefinitionUpdateStruct->names, + "description" => $fieldDefinitionUpdateStruct->descriptions === null ? + $fieldDefinition->getDescriptions() : + $fieldDefinitionUpdateStruct->descriptions, + "identifier" => $fieldDefinitionUpdateStruct->identifier === null ? + $fieldDefinition->identifier : + $fieldDefinitionUpdateStruct->identifier, + "fieldGroup" => $fieldDefinitionUpdateStruct->fieldGroup === null ? + $fieldDefinition->fieldGroup : + $fieldDefinitionUpdateStruct->fieldGroup, + "position" => $fieldDefinitionUpdateStruct->position === null ? + $fieldDefinition->position : + $fieldDefinitionUpdateStruct->position, + "isTranslatable" => $fieldDefinitionUpdateStruct->isTranslatable === null ? + $fieldDefinition->isTranslatable : + $fieldDefinitionUpdateStruct->isTranslatable, + "isRequired" => $fieldDefinitionUpdateStruct->isRequired === null ? + $fieldDefinition->isRequired : + $fieldDefinitionUpdateStruct->isRequired, + "isInfoCollector" => $fieldDefinitionUpdateStruct->isInfoCollector === null ? + $fieldDefinition->isInfoCollector : + $fieldDefinitionUpdateStruct->isInfoCollector, + "isSearchable" => $fieldDefinitionUpdateStruct->isSearchable === null ? + $fieldDefinition->isSearchable : + $fieldDefinitionUpdateStruct->isSearchable, + // These properties are precreated in constructor + //"fieldTypeConstraints" + //"defaultValue" + ) + ); + + $spiFieldDefinition->fieldTypeConstraints->validators = $validatorConfiguration; + $spiFieldDefinition->fieldTypeConstraints->fieldSettings = $fieldSettings; + $spiFieldDefinition->defaultValue = $fieldType->toPersistenceValue( + $fieldType->acceptValue( $fieldDefinitionUpdateStruct->defaultValue ) + ); + + return $spiFieldDefinition; + } + + /** + * Builds a ContentType domain object from value object returned by persistence + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $spiContentType + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected function buildContentTypeDomainObject( SPIContentType $spiContentType ) + { + $mainLanguageCode = $this->repository->getContentLanguageService()->loadLanguageById( + $spiContentType->initialLanguageId + )->languageCode; + + $contentTypeGroups = array(); + foreach ( $spiContentType->groupIds as $groupId ) + { + $contentTypeGroups[] = $this->loadContentTypeGroup( $groupId ); + } + + $fieldDefinitions = array(); + foreach ( $spiContentType->fieldDefinitions as $spiFieldDefinition ) + { + $fieldDefinitions[] = $this->buildFieldDefinitionDomainObject( $spiFieldDefinition ); + } + + return new ContentType( + array( + "names" => $spiContentType->name, + "descriptions" => $spiContentType->description, + "contentTypeGroups" => $contentTypeGroups, + "fieldDefinitions" => $fieldDefinitions, + "id" => $spiContentType->id, + "status" => $spiContentType->status, + "identifier" => $spiContentType->identifier, + "creationDate" => $this->getDateTime( $spiContentType->created ), + "modificationDate" => $this->getDateTime( $spiContentType->modified ), + "creatorId" => $spiContentType->creatorId, + "modifierId" => $spiContentType->modifierId, + "remoteId" => $spiContentType->remoteId, + "urlAliasSchema" => $spiContentType->urlAliasSchema, + "nameSchema" => $spiContentType->nameSchema, + "isContainer" => $spiContentType->isContainer, + "mainLanguageCode" => $mainLanguageCode, + "defaultAlwaysAvailable" => $spiContentType->defaultAlwaysAvailable, + "defaultSortField" => $spiContentType->sortField, + "defaultSortOrder" => $spiContentType->sortOrder + ) + ); + } + + /** + * Builds a FieldDefinition domain object from value object returned by persistence + * + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $spiFieldDefinition + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + protected function buildFieldDefinitionDomainObject( SPIFieldDefinition $spiFieldDefinition ) + { + /** @var $fieldType \eZ\Publish\SPI\FieldType\FieldType */ + $fieldType = $this->repository->getFieldTypeService()->buildFieldType( $spiFieldDefinition->fieldType ); + $fieldDefinition = new FieldDefinition( + array( + "names" => $spiFieldDefinition->name, + "descriptions" => $spiFieldDefinition->description, + "id" => $spiFieldDefinition->id, + "identifier" => $spiFieldDefinition->identifier, + "fieldGroup" => $spiFieldDefinition->fieldGroup, + "position" => $spiFieldDefinition->position, + "fieldTypeIdentifier" => $spiFieldDefinition->fieldType, + "isTranslatable" => $spiFieldDefinition->isTranslatable, + "isRequired" => $spiFieldDefinition->isRequired, + "isInfoCollector" => $spiFieldDefinition->isInfoCollector, + "defaultValue" => $fieldType->fromPersistenceValue( $spiFieldDefinition->defaultValue ), + "isSearchable" => $spiFieldDefinition->isSearchable, + "fieldSettings" => (array)$spiFieldDefinition->fieldTypeConstraints->fieldSettings, + "validatorConfiguration" => (array)$spiFieldDefinition->fieldTypeConstraints->validators, + ) + ); + + return $fieldDefinition; + } + + /** + * Builds a ContentTypeDraft domain object from value object returned by persistence + * Decorates ContentType + * + * @param \eZ\Publish\SPI\Persistence\Content\Type $spiContentType + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + protected function buildContentTypeDraftDomainObject( SPIContentType $spiContentType ) + { + return new ContentTypeDraft( + array( + "innerContentType" => $this->buildContentTypeDomainObject( $spiContentType ) + ) + ); + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If a content type with the given id and status DEFINED can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentType( $contentTypeId ) + { + if ( !is_numeric( $contentTypeId ) ) + { + throw new InvalidArgumentValue( '$contentTypeId', $contentTypeId ); + } + + $spiContentType = $this->contentTypeHandler->load( + $contentTypeId, + SPIContentType::STATUS_DEFINED + ); + + return $this->buildContentTypeDomainObject( + $spiContentType + ); + } + + /** + * Get a Content Type object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given identifier and status DEFINED can not be found + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByIdentifier( $identifier ) + { + if ( !is_string( $identifier ) ) + { + throw new InvalidArgumentValue( '$identifier', $identifier ); + } + + $spiContentType = $this->contentTypeHandler->loadByIdentifier( + $identifier + ); + + return $this->buildContentTypeDomainObject( + $spiContentType + ); + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given remote id and status DEFINED can not be found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByRemoteId( $remoteId ) + { + $spiContentType = $this->contentTypeHandler->loadByRemoteId( $remoteId ); + + return $this->buildContentTypeDomainObject( + $spiContentType + ); + } + + /** + * Get a Content Type object draft by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the content type draft owned by the current user can not be found + * + * @param int $contentTypeId + * + * @todo Use another exception when user of draft is someone else + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function loadContentTypeDraft( $contentTypeId ) + { + if ( !is_numeric( $contentTypeId ) ) + { + throw new InvalidArgumentValue( '$contentTypeId', $contentTypeId ); + } + + $spiContentType = $this->contentTypeHandler->load( + $contentTypeId, + SPIContentType::STATUS_DRAFT + ); + + if ( $spiContentType->modifierId != $this->repository->getCurrentUser()->id ) + { + throw new NotFoundException( "ContentType owned by someone else", $contentTypeId ); + } + + return $this->buildContentTypeDraftDomainObject( + $spiContentType + ); + } + + /** + * Get Content Type objects which belong to the given content type group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType[] Which have status DEFINED + */ + public function loadContentTypes( APIContentTypeGroup $contentTypeGroup ) + { + $spiContentTypes = $this->contentTypeHandler->loadContentTypes( + $contentTypeGroup->id, + SPIContentType::STATUS_DEFINED + ); + $contentTypes = array(); + + foreach ( $spiContentTypes as $spiContentType ) + { + $contentTypes[] = $this->buildContentTypeDomainObject( $spiContentType ); + } + + return $contentTypes; + } + + /** + * Creates a draft from an existing content type. + * + * This is a complete copy of the content + * type which has the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there is already a draft assigned to another user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentTypeDraft( APIContentType $contentType ) + { + if ( $this->repository->hasAccess( 'class', 'create' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'create' ); + + try + { + $this->contentTypeHandler->load( + $contentType->id, + SPIContentType::STATUS_DRAFT + ); + + throw new BadStateException( + "\$contentType", + "Draft of the ContentType already exists" + ); + } + catch ( APINotFoundException $e ) + { + $this->repository->beginTransaction(); + try + { + $spiContentType = $this->contentTypeHandler->createDraft( + $this->repository->getCurrentUser()->id, + $contentType->id + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + return $this->buildContentTypeDraftDomainObject( + $spiContentType + ); + } + + /** + * Update a Content Type object + * + * Does not update fields (fieldDefinitions), use {@link updateFieldDefinition()} to update them. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier or remoteId already exists + * or there is no draft assigned to the authenticated user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct + */ + public function updateContentTypeDraft( APIContentTypeDraft $contentTypeDraft, ContentTypeUpdateStruct $contentTypeUpdateStruct ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + { + throw new UnauthorizedException( 'ContentType', 'update' ); + } + + try + { + $loadedContentTypeDraft = $this->loadContentTypeDraft( $contentTypeDraft->id ); + } + catch ( APINotFoundException $e ) + { + throw new InvalidArgumentException( + "\$contentTypeDraft", + "There is no ContentType draft assigned to the authenticated user", + $e + ); + } + + if ( $contentTypeUpdateStruct->identifier !== null + && $contentTypeUpdateStruct->identifier != $loadedContentTypeDraft->identifier ) + { + try + { + $this->loadContentTypeByIdentifier( $contentTypeUpdateStruct->identifier ); + + throw new InvalidArgumentException( + "\$contentTypeUpdateStruct", + "Another ContentType with identifier '{$contentTypeUpdateStruct->identifier}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + if ( $contentTypeUpdateStruct->remoteId !== null + && $contentTypeUpdateStruct->remoteId != $loadedContentTypeDraft->remoteId ) + { + try + { + $this->loadContentTypeByRemoteId( $contentTypeUpdateStruct->remoteId ); + + throw new InvalidArgumentException( + "\$contentTypeUpdateStruct", + "Another ContentType with remoteId '{$contentTypeUpdateStruct->remoteId}' exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->update( + $contentTypeDraft->id, + $contentTypeDraft->status, + $this->buildSPIContentTypeUpdateStruct( + $loadedContentTypeDraft, + $contentTypeUpdateStruct + ) + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Builds ContentType update struct for storage layer + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct + */ + protected function buildSPIContentTypeUpdateStruct( APIContentTypeDraft $contentTypeDraft, ContentTypeUpdateStruct $contentTypeUpdateStruct ) + { + $updateStruct = new SPIContentTypeUpdateStruct(); + + $updateStruct->identifier = $contentTypeUpdateStruct->identifier !== null ? + $contentTypeUpdateStruct->identifier : + $contentTypeDraft->identifier; + $updateStruct->remoteId = $contentTypeUpdateStruct->remoteId !== null ? + $contentTypeUpdateStruct->remoteId : + $contentTypeDraft->remoteId; + + $updateStruct->name = $contentTypeUpdateStruct->names !== null ? + $contentTypeUpdateStruct->names : + $contentTypeDraft->names; + $updateStruct->description = $contentTypeUpdateStruct->descriptions !== null ? + $contentTypeUpdateStruct->descriptions : + $contentTypeDraft->descriptions; + + $updateStruct->modified = $contentTypeUpdateStruct->modificationDate !== null ? + $contentTypeUpdateStruct->modificationDate->getTimestamp() : + time(); + $updateStruct->modifierId = $contentTypeUpdateStruct->modifierId !== null ? + $contentTypeUpdateStruct->modifierId : + $this->repository->getCurrentUser()->id; + + $updateStruct->urlAliasSchema = $contentTypeUpdateStruct->urlAliasSchema !== null ? + $contentTypeUpdateStruct->urlAliasSchema : + $contentTypeDraft->urlAliasSchema; + $updateStruct->nameSchema = $contentTypeUpdateStruct->nameSchema !== null ? + $contentTypeUpdateStruct->nameSchema : + $contentTypeDraft->nameSchema; + + $updateStruct->isContainer = $contentTypeUpdateStruct->isContainer !== null ? + $contentTypeUpdateStruct->isContainer : + $contentTypeDraft->isContainer; + $updateStruct->sortField = $contentTypeUpdateStruct->defaultSortField !== null ? + $contentTypeUpdateStruct->defaultSortField : + $contentTypeDraft->defaultSortField; + $updateStruct->sortOrder = $contentTypeUpdateStruct->defaultSortOrder !== null ? + (int)$contentTypeUpdateStruct->defaultSortOrder : + $contentTypeDraft->defaultSortOrder; + + $updateStruct->defaultAlwaysAvailable = $contentTypeUpdateStruct->defaultAlwaysAvailable !== null ? + $contentTypeUpdateStruct->defaultAlwaysAvailable : + $contentTypeDraft->defaultAlwaysAvailable; + $updateStruct->initialLanguageId = $this->repository->getContentLanguageService()->loadLanguage( + $contentTypeUpdateStruct->mainLanguageCode !== null ? + $contentTypeUpdateStruct->mainLanguageCode : + $contentTypeDraft->mainLanguageCode + )->id; + + return $updateStruct; + } + + /** + * Delete a Content Type object. + * + * Deletes a content type if it has no instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there exist content objects of this type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + */ + public function deleteContentType( APIContentType $contentType ) + { + if ( $this->repository->hasAccess( 'class', 'delete' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'delete' ); + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->delete( + $contentType->id, + $contentType->status + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Copy Type incl fields and groupIds to a new Type object + * + * New Type will have $userId as creator / modifier, created / modified should be updated with current time, + * updated remoteId and identifier should be appended with '_' + unique string. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\User\User $user if null the current user is used + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function copyContentType( APIContentType $contentType, User $user = null ) + { + if ( $this->repository->hasAccess( 'class', 'create' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'create' ); + + if ( empty( $user ) ) + { + $user = $this->repository->getCurrentUser(); + } + + $this->repository->beginTransaction(); + try + { + $spiContentType = $this->contentTypeHandler->copy( + $user->id, + $contentType->id, + SPIContentType::STATUS_DEFINED + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadContentType( $spiContentType->id ); + } + + /** + * Assigns a content type to a content type group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to unlink a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is already assigned the given group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function assignContentTypeGroup( APIContentType $contentType, APIContentTypeGroup $contentTypeGroup ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'update' ); + + $spiContentType = $this->contentTypeHandler->load( + $contentType->id, + $contentType->status + ); + + if ( in_array( $contentTypeGroup->id, $spiContentType->groupIds ) ) + { + throw new InvalidArgumentException( + "\$contentTypeGroup", + "The given ContentType is already assigned to the ContentTypeGroup" + ); + } + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->link( + $contentTypeGroup->id, + $contentType->id, + $contentType->status + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Unassign a content type from a group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to link a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is not assigned this the given group. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $contentTypeGroup is the last group assigned to the content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function unassignContentTypeGroup( APIContentType $contentType, APIContentTypeGroup $contentTypeGroup ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'update' ); + + $spiContentType = $this->contentTypeHandler->load( + $contentType->id, + $contentType->status + ); + + if ( !in_array( $contentTypeGroup->id, $spiContentType->groupIds ) ) + { + throw new InvalidArgumentException( + "\$contentTypeGroup", + "The given ContentType is not assigned the ContentTypeGroup" + ); + } + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->unlink( + $contentTypeGroup->id, + $contentType->id, + $contentType->status + ); + $this->repository->commit(); + } + catch ( APIBadStateException $e ) + { + $this->repository->rollback(); + throw new BadStateException( + "\$contentType", + "The given ContentTypeGroup is the last group assigned to the ContentType", + $e + ); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Adds a new field definition to an existing content type. + * + * The content type must be in state DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the identifier in already exists in the content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + */ + public function addFieldDefinition( APIContentTypeDraft $contentTypeDraft, FieldDefinitionCreateStruct $fieldDefinitionCreateStruct ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'update' ); + + $loadedContentTypeDraft = $this->loadContentTypeDraft( $contentTypeDraft->id ); + + if ( $loadedContentTypeDraft->getFieldDefinition( $fieldDefinitionCreateStruct->identifier ) !== null ) + { + throw new InvalidArgumentException( + "\$fieldDefinitionCreateStruct", + "Another FieldDefinition with identifier '{$fieldDefinitionCreateStruct->identifier}' exists in the ContentType" + ); + } + + $spiFieldDefinitionCreateStruct = $this->buildSPIFieldDefinitionCreate( + $fieldDefinitionCreateStruct + ); + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->addFieldDefinition( + $contentTypeDraft->id, + $contentTypeDraft->status, + $spiFieldDefinitionCreateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Remove a field definition from an existing Type. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given field definition does not belong to the given type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + */ + public function removeFieldDefinition( APIContentTypeDraft $contentTypeDraft, APIFieldDefinition $fieldDefinition ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'update' ); + + $loadedFieldDefinition = $this->loadContentTypeDraft( + $contentTypeDraft->id + )->getFieldDefinition( + $fieldDefinition->identifier + ); + + if ( empty( $loadedFieldDefinition ) || $loadedFieldDefinition->id != $fieldDefinition->id ) + { + throw new InvalidArgumentException( + "\$fieldDefinition", + "The given FieldDefinition does not belong to the ContentType" + ); + } + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->removeFieldDefinition( + $contentTypeDraft->id, + SPIContentType::STATUS_DRAFT, + $fieldDefinition->id + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Update a field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the field id in the update struct is not found or does not belong to the content type + * If the given identifier is used in an existing field of the given content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft the content type draft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition the field definition which should be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + */ + public function updateFieldDefinition( APIContentTypeDraft $contentTypeDraft, APIFieldDefinition $fieldDefinition, FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + throw new UnauthorizedException( 'ContentType', 'update' ); + + $loadedContentTypeDraft = $this->loadContentTypeDraft( $contentTypeDraft->id ); + $foundFieldId = false; + foreach ( $loadedContentTypeDraft->fieldDefinitions as $existingFieldDefinition ) + { + if ( $existingFieldDefinition->id == $fieldDefinition->id ) + { + $foundFieldId = true; + } + else if ( $existingFieldDefinition->identifier == $fieldDefinitionUpdateStruct->identifier ) + { + throw new InvalidArgumentException( + "\$fieldDefinitionUpdateStruct", + "Another FieldDefinition with identifier '{$fieldDefinitionUpdateStruct->identifier}' exists in the ContentType" + ); + } + } + if ( !$foundFieldId ) + { + throw new InvalidArgumentException( + "\$fieldDefinition", + "The given FieldDefinition does not belong to the ContentType" + ); + } + + $spiFieldDefinitionUpdateStruct = $this->buildSPIFieldDefinitionUpdate( + $fieldDefinitionUpdateStruct, + $fieldDefinition + ); + + $this->repository->beginTransaction(); + try + { + $this->contentTypeHandler->updateFieldDefinition( + $contentTypeDraft->id, + SPIContentType::STATUS_DRAFT, + $spiFieldDefinitionUpdateStruct + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Publish the content type and update content objects. + * + * This method updates content objects, depending on the changed field definitions. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If the content type has no draft + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type has no field definitions + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + */ + public function publishContentTypeDraft( APIContentTypeDraft $contentTypeDraft ) + { + if ( $this->repository->hasAccess( 'class', 'update' ) !== true ) + { + throw new UnauthorizedException( 'ContentType', 'update' ); + } + + try + { + $loadedContentTypeDraft = $this->loadContentTypeDraft( $contentTypeDraft->id ); + } + catch ( APINotFoundException $e ) + { + throw new BadStateException( + "\$contentTypeDraft", + "The content type does not have a draft.", + $e + ); + } + + if ( count( $loadedContentTypeDraft->getFieldDefinitions() ) === 0 ) + { + throw new InvalidArgumentException( + "\$contentTypeDraft", + "The content type draft should have at least one field definition." + ); + } + + $this->repository->beginTransaction(); + try + { + if ( empty( $loadedContentTypeDraft->nameSchema ) ) + { + $fieldDefinitions = $loadedContentTypeDraft->getFieldDefinitions(); + $this->contentTypeHandler->update( + $contentTypeDraft->id, + $contentTypeDraft->status, + $this->buildSPIContentTypeUpdateStruct( + $loadedContentTypeDraft, + new ContentTypeUpdateStruct( + array( + "nameSchema" => "<" . $fieldDefinitions[0]->identifier . ">" + ) + ) + ) + ); + } + + $this->contentTypeHandler->publish( + $loadedContentTypeDraft->id + ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Instantiates a new content type group create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct + */ + public function newContentTypeGroupCreateStruct( $identifier ) + { + if ( !is_string( $identifier ) ) + { + throw new InvalidArgumentValue( '$identifier', $identifier ); + } + + return new ContentTypeGroupCreateStruct( + array( + "identifier" => $identifier + ) + ); + } + + /** + * Instantiates a new content type create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct + */ + public function newContentTypeCreateStruct( $identifier ) + { + if ( !is_string( $identifier ) ) + { + throw new InvalidArgumentValue( '$identifier', $identifier ); + } + + return new ContentTypeCreateStruct( + array( + "identifier" => $identifier + ) + ); + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct + */ + public function newContentTypeUpdateStruct() + { + return new ContentTypeUpdateStruct; + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct + */ + public function newContentTypeGroupUpdateStruct() + { + return new ContentTypeGroupUpdateStruct; + } + + /** + * Instantiates a field definition create struct + * + * @param string $fieldTypeIdentifier the required field type identifier + * @param string $identifier the required identifier for the field definition + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct + */ + public function newFieldDefinitionCreateStruct( $identifier, $fieldTypeIdentifier ) + { + if ( !is_string( $identifier ) ) + { + throw new InvalidArgumentValue( '$identifier', $identifier ); + } + + if ( !is_string( $fieldTypeIdentifier ) ) + { + throw new InvalidArgumentValue( '$fieldTypeIdentifier', $fieldTypeIdentifier ); + } + + return new FieldDefinitionCreateStruct( + array( + "identifier" => $identifier, + "fieldTypeIdentifier" => $fieldTypeIdentifier + ) + ); + } + + /** + * Instantiates a field definition update class + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct + */ + public function newFieldDefinitionUpdateStruct() + { + return new FieldDefinitionUpdateStruct; + } +} diff --git a/eZ/Publish/Core/Repository/FieldTypeService.php b/eZ/Publish/Core/Repository/FieldTypeService.php new file mode 100644 index 0000000..09035c5 --- /dev/null +++ b/eZ/Publish/Core/Repository/FieldTypeService.php @@ -0,0 +1,150 @@ +<?php +/** + * File containing the eZ\Publish\API\Repository\FieldTypeService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\FieldTypeService as FieldTypeServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Handler; +use eZ\Publish\SPI\FieldType\FieldType as SPIFieldType; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Repository\Values\ContentType\FieldType; + +/** + * An implementation of this class provides access to FieldTypes + * + * @package eZ\Publish\API\Repository + * @see eZ\Publish\API\Repository\FieldType + */ +class FieldTypeService implements FieldTypeServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Handler + */ + protected $persistenceHandler; + + /** + * @var array Hash of SPI FieldTypes or callable callbacks to generate one. + */ + protected $settings; + + /** + * Holds an array of FieldType objects + * + * @var \eZ\Publish\API\Repository\FieldType[] + */ + protected $fieldTypes = array(); + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Handler $handler + * @param array $settings Hash of SPI FieldTypes or callable callbacks to generate one. + */ + public function __construct( RepositoryInterface $repository, Handler $handler, array $settings = array() ) + { + $this->repository = $repository; + $this->persistenceHandler = $handler; + $this->settings = $settings; + } + + /** + * Returns a list of all field types. + * + * @return \eZ\Publish\API\Repository\FieldType[] + */ + public function getFieldTypes() + { + foreach ( array_keys( $this->settings ) as $identifier ) + { + if ( isset( $this->fieldTypes[$identifier] ) ) + continue; + + $this->fieldTypes[$identifier] = $this->getFieldType( $identifier ); + } + + return $this->fieldTypes; + } + + /** + * Returns the FieldType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\FieldType + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * if there is no FieldType registered with $identifier + */ + public function getFieldType( $identifier ) + { + if ( isset( $this->fieldTypes[$identifier] ) ) + { + return $this->fieldTypes[$identifier]; + } + + return ( $this->fieldTypes[$identifier] = new FieldType( $this->buildFieldType( $identifier ) ) ); + } + + /** + * Returns if there is a FieldType registered under $identifier + * + * @param string $identifier + * + * @return boolean + */ + public function hasFieldType( $identifier ) + { + return isset( $this->settings[$identifier] ); + } + + /** + * Instantiates a FieldType\Type object + * + * @todo Move this to a internal service provided to services that needs this (including this) + * + * @access private This function is for internal use only. + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If $type not properly setup + * with settings injected to service + * + * @param string $identifier + * + * @return \eZ\Publish\SPI\FieldType\FieldType + */ + public function buildFieldType( $identifier ) + { + if ( !isset( $this->settings[$identifier] ) ) + { + throw new NotFoundException( + "FieldType", + "Provided \$identifier is unknown: '{$identifier}', has: " . var_export( array_keys( $this->settings ), true ) + ); + } + + if ( $this->settings[$identifier] instanceof SPIFieldType ) + { + return $this->settings[$identifier]; + } + else if ( !is_callable( $this->settings[$identifier] ) ) + { + throw new InvalidArgumentException( "\$settings[$identifier]", 'must be instance of SPI\\FieldType\\FieldType or callback to generate it' ); + } + + /** @var $closure \Closure */ + $closure = $this->settings[$identifier]; + return $closure(); + } +} diff --git a/eZ/Publish/Core/Repository/FieldTypeTools.php b/eZ/Publish/Core/Repository/FieldTypeTools.php new file mode 100644 index 0000000..d40090f --- /dev/null +++ b/eZ/Publish/Core/Repository/FieldTypeTools.php @@ -0,0 +1,58 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\FieldTypeTools class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\FieldTypeTools as FieldTypeToolsInterface; +use eZ\Publish\API\Repository\Values\Content\VersionInfo; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\API\Repository\Exceptions\NotImplementedException; + +/** + * This class provides service methods available to FieldTypes + * + * This interface cannot be retrieved through the Public API and is not meant to be + * used by its users. It is only available to {@link + * eZ\Publish\SPI\FieldType\EventListener} implementers through the {@link + * eZ\Publish\SPI\FieldType\EventListener::handleEvent()} method. + * + * @package eZ\Publish\API\Repository + * @todo Change this to be able to handle relations for FieldTypes in an effective manner (incl op_code handling in SPI) + */ +class FieldTypeTools implements FieldTypeToolsInterface +{ + /** + * Adds a relation + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If $relationType has an unsupported value + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If there is a mismatch between $relationType and provided values. + * + * The source of the relation is the content and version + * referenced by $sourceVersion. + * + * @param int $relationType One of Relation::COMMON, Relation::EMBED, Relation::LINK or Relation::FIELD + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param mixed $destinationContentId + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition|null $fieldDefinition + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation The newly created relation + */ + public function addRelation( $relationType, + VersionInfo $sourceVersion, + $destinationContentId, + FieldDefinition $fieldDefinition = null ) + { + // @todo Figure out if this is needed or not, there is a need for it in xmltext and relation field types to avoid using db directly for this + throw new NotImplementedException( + __METHOD__ . + " not implemented, & unclear if it should as relation handing is done in gateways in relation field types" + ); + } +} diff --git a/eZ/Publish/Core/Repository/IOService.php b/eZ/Publish/Core/Repository/IOService.php new file mode 100644 index 0000000..ce6f789 --- /dev/null +++ b/eZ/Publish/Core/Repository/IOService.php @@ -0,0 +1,291 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\IOService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\IOService as IOServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\IO\Handler; +use eZ\Publish\API\Repository\Values\IO\BinaryFile; +use eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct; +use eZ\Publish\SPI\IO\BinaryFile as SPIBinaryFile; +use eZ\Publish\SPI\IO\BinaryFileCreateStruct as SPIBinaryFileCreateStruct; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\MVC\Legacy\LegacyKernelAware; +use eZ\Publish\Core\MVC\Legacy\Kernel as LegacyKernel; + +/** + * The io service for managing binary files + * + * @package eZ\Publish\Core\Repository + */ +class IOService implements IOServiceInterface, LegacyKernelAware +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\IO\Handler + */ + protected $ioHandler; + + /** + * @var array + */ + protected $settings; + + /** + * @var \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected $legacyKernel; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\IO\Handler $handler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $handler, array $settings = array() ) + { + $this->repository = $repository; + $this->ioHandler = $handler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Injects the legacy kernel instance. + * + * @param \eZ\Publish\Core\MVC\Legacy\Kernel $legacyKernel + * + * @return void + */ + public function setLegacyKernel( LegacyKernel $legacyKernel ) + { + $this->legacyKernel = $legacyKernel; + } + + /** + * Gets the legacy kernel instance. + * + * @return \eZ\Publish\Core\MVC\Legacy\Kernel + */ + protected function getLegacyKernel() + { + return $this->legacyKernel; + } + + /** + * Creates a BinaryFileCreateStruct object from the uploaded file $uploadedFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException When given an invalid uploaded file + * + * @param array $uploadedFile The $_POST hash of an uploaded file + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct + */ + public function newBinaryCreateStructFromUploadedFile( array $uploadedFile ) + { + if ( !is_string( $uploadedFile['tmp_name'] ) || empty( $uploadedFile['tmp_name'] ) ) + throw new InvalidArgumentException( "uploadedFile", "uploadedFile['tmp_name'] does not exist or has invalid value" ); + + if ( !is_uploaded_file( $uploadedFile['tmp_name'] ) || !is_readable( $uploadedFile['tmp_name'] ) ) + throw new InvalidArgumentException( "uploadedFile", "file was not uploaded or is unreadable" ); + + $fileHandle = fopen( $uploadedFile['tmp_name'], 'rb' ); + if ( $fileHandle === false ) + throw new InvalidArgumentException( "uploadedFile", "failed to get file resource" ); + + $binaryCreateStruct = new BinaryFileCreateStruct(); + $binaryCreateStruct->mimeType = $uploadedFile['type']; + $binaryCreateStruct->uri = $uploadedFile['tmp_name']; + $binaryCreateStruct->originalFileName = $uploadedFile['name']; + $binaryCreateStruct->size = $uploadedFile['size']; + $binaryCreateStruct->inputStream = $fileHandle; + + return $binaryCreateStruct; + } + + /** + * Creates a BinaryFileCreateStruct object from $localFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException When given a non existing / unreadable file + * + * @param string $localFile Path to local file + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct + */ + public function newBinaryCreateStructFromLocalFile( $localFile ) + { + if ( empty( $localFile ) || !is_string( $localFile ) ) + throw new InvalidArgumentException( "localFile", "localFile has an invalid value" ); + + if ( !is_file( $localFile ) || !is_readable( $localFile ) ) + throw new InvalidArgumentException( "localFile", "file does not exist or is unreadable: {$localFile}" ); + + $fileHandle = fopen( $localFile, 'rb' ); + if ( $fileHandle === false ) + throw new InvalidArgumentException( "localFile", "failed to get file resource" ); + + $binaryCreateStruct = new BinaryFileCreateStruct(); + $binaryCreateStruct->mimeType = mime_content_type( $localFile ); + $binaryCreateStruct->uri = $localFile; + $binaryCreateStruct->originalFileName = basename( $localFile ); + $binaryCreateStruct->size = filesize( $localFile ); + $binaryCreateStruct->inputStream = $fileHandle; + + return $binaryCreateStruct; + } + + /** + * Creates a binary file in the repository + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct $binaryFileCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile The created BinaryFile object + */ + public function createBinaryFile( BinaryFileCreateStruct $binaryFileCreateStruct ) + { + if ( empty( $binaryFileCreateStruct->mimeType ) || !is_string( $binaryFileCreateStruct->mimeType ) ) + throw new InvalidArgumentValue( "mimeType", "invalid mimeType value", "BinaryFileCreateStruct" ); + + if ( empty( $binaryFileCreateStruct->uri ) || !is_string( $binaryFileCreateStruct->uri ) ) + throw new InvalidArgumentValue( "uri", $binaryFileCreateStruct->uri, "BinaryFileCreateStruct" ); + + if ( empty( $binaryFileCreateStruct->originalFileName ) || !is_string( $binaryFileCreateStruct->originalFileName ) ) + throw new InvalidArgumentValue( "originalFileName", $binaryFileCreateStruct->originalFileName, "BinaryFileCreateStruct" ); + + if ( !is_int( $binaryFileCreateStruct->size ) || $binaryFileCreateStruct->size < 0 ) + throw new InvalidArgumentValue( "size", $binaryFileCreateStruct->size, "BinaryFileCreateStruct" ); + + if ( !is_resource( $binaryFileCreateStruct->inputStream ) ) + throw new InvalidArgumentValue( "inputStream", "property is not a file resource", "BinaryFileCreateStruct" ); + + $spiBinaryCreateStruct = $this->buildSPIBinaryFileCreateStructObject( $binaryFileCreateStruct ); + + $spiBinaryFile = $this->ioHandler->create( $spiBinaryCreateStruct ); + + return $this->buildDomainBinaryFileObject( $spiBinaryFile ); + } + + /** + * Deletes the BinaryFile with $path + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + */ + public function deleteBinaryFile( BinaryFile $binaryFile ) + { + //@todo: is $binaryFile->id equal to file path? + if ( empty( $binaryFile->id ) || !is_string( $binaryFile->id ) ) + throw new InvalidArgumentValue( "id", $binaryFile->id, "BinaryFile" ); + + $this->ioHandler->delete( $binaryFile->id ); + } + + /** + * Loads the binary file with $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $binaryFileid + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile + */ + public function loadBinaryFile( $binaryFileid ) + { + if ( empty( $binaryFileid ) || !is_string( $binaryFileid ) ) + throw new InvalidArgumentValue( "binaryFileid", $binaryFileid ); + + //@todo: is binaryFileid equal to path? + $spiBinaryFile = $this->ioHandler->load( $binaryFileid ); + + return $this->buildDomainBinaryFileObject( $spiBinaryFile ); + } + + /** + * Returns a read (mode: rb) file resource to the binary file identified by $path + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + * + * @return resource + */ + public function getFileInputStream( BinaryFile $binaryFile ) + { + if ( empty( $binaryFile->id ) || !is_string( $binaryFile->id ) ) + throw new InvalidArgumentValue( "id", $binaryFile->id, "BinaryFile" ); + + //@todo: is binary file ID equal to file path? + return $this->ioHandler->getFileResource( $binaryFile->id ); + } + + /** + * Returns the content of the binary file + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFile $binaryFile + * + * @return string + */ + public function getFileContents( BinaryFile $binaryFile ) + { + if ( empty( $binaryFile->id ) || !is_string( $binaryFile->id ) ) + throw new InvalidArgumentValue( "id", $binaryFile->id, "BinaryFile" ); + + //@todo: is binary file ID equal to file path? + return $this->ioHandler->getFileContents( $binaryFile->id ); + } + + /** + * Generates SPI BinaryFileCreateStruct object from provided API BinaryFileCreateStruct object + * + * @param \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct $binaryFileCreateStruct + * + * @return \eZ\Publish\SPI\IO\BinaryFileCreateStruct + */ + protected function buildSPIBinaryFileCreateStructObject( BinaryFileCreateStruct $binaryFileCreateStruct ) + { + $spiBinaryCreateStruct = new SPIBinaryFileCreateStruct(); + + $spiBinaryCreateStruct->path = $binaryFileCreateStruct->uri; + $spiBinaryCreateStruct->size = $binaryFileCreateStruct->size; + $spiBinaryCreateStruct->mimeType = $binaryFileCreateStruct->mimeType; + $spiBinaryCreateStruct->originalFile = $binaryFileCreateStruct->originalFileName; + $spiBinaryCreateStruct->setInputStream( $binaryFileCreateStruct->inputStream ); + + return $spiBinaryCreateStruct; + } + + /** + * Generates API BinaryFile object from provided SPI BinaryFile object + * + * @param \eZ\Publish\SPI\IO\BinaryFile $spiBinaryFile + * + * @return \eZ\Publish\API\Repository\Values\IO\BinaryFile + */ + protected function buildDomainBinaryFileObject( SPIBinaryFile $spiBinaryFile ) + { + return new BinaryFile( + array( + //@todo is setting the id of file to path correct? + 'id' => $spiBinaryFile->path, + 'size' => (int)$spiBinaryFile->size, + 'mtime' => $spiBinaryFile->mtime, + 'ctime' => $spiBinaryFile->ctime, + 'mimeType' => $spiBinaryFile->mimeType, + 'uri' => $spiBinaryFile->uri, + 'originalFile' => $spiBinaryFile->originalFile + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/LanguageService.php b/eZ/Publish/Core/Repository/LanguageService.php new file mode 100644 index 0000000..4feab48 --- /dev/null +++ b/eZ/Publish/Core/Repository/LanguageService.php @@ -0,0 +1,404 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\LanguageService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\LanguageService as LanguageServiceInterface; +use eZ\Publish\SPI\Persistence\Content\Language\Handler; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct; +use eZ\Publish\SPI\Persistence\Content\Language as SPILanguage; +use eZ\Publish\SPI\Persistence\Content\Language\CreateStruct; +use eZ\Publish\API\Repository\Values\Content\Language; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use LogicException; + +/** + * Language service, used for language operations + * + * @package eZ\Publish\Core\Repository + */ +class LanguageService implements LanguageServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\Language\Handler + */ + protected $languageHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\Language\Handler $languageHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $languageHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->languageHandler = $languageHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + 'languages' => array( 'eng-GB' ), + ); + } + + /** + * Creates the a new Language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the languageCode already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct $languageCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function createLanguage( LanguageCreateStruct $languageCreateStruct ) + { + if ( !is_string( $languageCreateStruct->name ) || empty( $languageCreateStruct->name ) ) + throw new InvalidArgumentValue( "name", $languageCreateStruct->name, "LanguageCreateStruct" ); + + if ( !is_string( $languageCreateStruct->languageCode ) || empty( $languageCreateStruct->languageCode ) ) + throw new InvalidArgumentValue( "languageCode", $languageCreateStruct->languageCode, "LanguageCreateStruct" ); + + if ( !is_bool( $languageCreateStruct->enabled ) ) + throw new InvalidArgumentValue( "enabled", $languageCreateStruct->enabled, "LanguageCreateStruct" ); + + if ( $this->repository->hasAccess( 'content', 'translations' ) !== true ) + throw new UnauthorizedException( 'content', 'translations' ); + + try + { + if ( $this->loadLanguage( $languageCreateStruct->languageCode ) !== null ) + throw new InvalidArgumentException( "languageCreateStruct", "language with specified language code already exists" ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + $createStruct = new CreateStruct( + array( + 'languageCode' => $languageCreateStruct->languageCode, + 'name' => $languageCreateStruct->name, + 'isEnabled' => $languageCreateStruct->enabled + ) + ); + + $this->repository->beginTransaction(); + try + { + $createdLanguage = $this->languageHandler->create( $createStruct ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainObject( $createdLanguage ); + } + + /** + * Changes the name of the language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if languageCode argument + * is not string + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * @param string $newName + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function updateLanguageName( Language $language, $newName ) + { + if ( !is_numeric( $language->id ) ) + throw new InvalidArgumentValue( "id", $language->id, "Language" ); + + if ( !is_string( $newName ) || empty( $newName ) ) + throw new InvalidArgumentValue( "newName", $newName ); + + if ( $this->repository->hasAccess( 'content', 'translations' ) !== true ) + throw new UnauthorizedException( 'content', 'translations' ); + + $loadedLanguage = $this->loadLanguageById( $language->id ); + + $updateLanguageStruct = new SPILanguage( + array( + 'id' => $loadedLanguage->id, + 'languageCode' => $loadedLanguage->languageCode, + 'name' => $newName, + 'isEnabled' => $loadedLanguage->enabled + ) + ); + + $this->repository->beginTransaction(); + try + { + $this->languageHandler->update( $updateLanguageStruct ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadLanguageById( $loadedLanguage->id ); + } + + /** + * Enables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function enableLanguage( Language $language ) + { + if ( !is_numeric( $language->id ) ) + throw new InvalidArgumentValue( "id", $language->id ); + + if ( $this->repository->hasAccess( 'content', 'translations' ) !== true ) + throw new UnauthorizedException( 'content', 'translations' ); + + $loadedLanguage = $this->loadLanguageById( $language->id ); + + $updateLanguageStruct = new SPILanguage( + array( + 'id' => $loadedLanguage->id, + 'languageCode' => $loadedLanguage->languageCode, + 'name' => $loadedLanguage->name, + 'isEnabled' => true + ) + ); + + $this->repository->beginTransaction(); + try + { + $this->languageHandler->update( $updateLanguageStruct ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadLanguageById( $loadedLanguage->id ); + } + + /** + * Disables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function disableLanguage( Language $language ) + { + if ( !is_numeric( $language->id ) ) + throw new InvalidArgumentValue( "id", $language->id ); + + if ( $this->repository->hasAccess( 'content', 'translations' ) !== true ) + throw new UnauthorizedException( 'content', 'translations' ); + + $loadedLanguage = $this->loadLanguageById( $language->id ); + + $updateLanguageStruct = new SPILanguage( + array( + 'id' => $loadedLanguage->id, + 'languageCode' => $loadedLanguage->languageCode, + 'name' => $loadedLanguage->name, + 'isEnabled' => false + ) + ); + + $this->repository->beginTransaction(); + try + { + $this->languageHandler->update( $updateLanguageStruct ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadLanguageById( $loadedLanguage->id ); + } + + /** + * Loads a Language from its language code ($languageCode) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if languageCode argument + * is not string + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguage( $languageCode ) + { + if ( !is_string( $languageCode ) || empty( $languageCode ) ) + throw new InvalidArgumentException( "languageCode", "language code has an invalid value" ); + + $language = $this->languageHandler->loadByLanguageCode( $languageCode ); + return $this->buildDomainObject( $language ); + } + + /** + * Loads all Languages + * + * @return \eZ\Publish\API\Repository\Values\Content\Language[] + */ + public function loadLanguages() + { + $languages = $this->languageHandler->loadAll(); + + $returnArray = array(); + foreach ( $languages as $language ) + { + $returnArray[] = $this->buildDomainObject( $language ); + } + + return $returnArray; + } + + /** + * Loads a Language by its id ($languageId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if languageId argument + * is not integer + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param int $languageId + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguageById( $languageId ) + { + if ( !is_numeric( $languageId ) ) + throw new InvalidArgumentValue( "languageId", $languageId ); + + $language = $this->languageHandler->load( (int)$languageId ); + + return $this->buildDomainObject( $language ); + } + + /** + * Deletes a language from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if language can not be deleted + * because it is still assigned to some content / type / (...). + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function deleteLanguage( Language $language ) + { + if ( !is_numeric( $language->id ) ) + throw new InvalidArgumentValue( "id", $language->id, "Language" ); + + if ( $this->repository->hasAccess( 'content', 'translations' ) !== true ) + throw new UnauthorizedException( 'content', 'translations' ); + + $loadedLanguage = $this->loadLanguageById( $language->id ); + + $this->repository->beginTransaction(); + try + { + $this->languageHandler->delete( $loadedLanguage->id ); + $this->repository->commit(); + } + catch ( LogicException $e ) + { + $this->repository->rollback(); + throw new InvalidArgumentException( "language", $e->getMessage(), $e ); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Returns a configured default language code + * + * @return string + */ + public function getDefaultLanguageCode() + { + return $this->settings['languages'][0]; + } + + /** + * Returns a configured list of prioritized languageCodes + * + * @access private This is currently only for internal use in Services + * + * @return string[] + */ + public function getPrioritizedLanguageCodeList() + { + return $this->settings['languages']; + } + + /** + * Instantiates an object to be used for creating languages + * + * @return \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct + */ + public function newLanguageCreateStruct() + { + return new LanguageCreateStruct(); + } + + /** + * Builds Language domain object from ValueObject returned by Persistence API + * + * @param \eZ\Publish\SPI\Persistence\Content\Language $spiLanguage + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + protected function buildDomainObject( SPILanguage $spiLanguage ) + { + return new Language( + array( + 'id' => $spiLanguage->id, + 'languageCode' => $spiLanguage->languageCode, + 'name' => $spiLanguage->name, + 'enabled' => $spiLanguage->isEnabled + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/LocationService.php b/eZ/Publish/Core/Repository/LocationService.php new file mode 100644 index 0000000..f877763 --- /dev/null +++ b/eZ/Publish/Core/Repository/LocationService.php @@ -0,0 +1,974 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\LocationService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentInfo as APIContentInfo; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\Content\Location as APILocation; +use eZ\Publish\API\Repository\Values\Content\LocationList; +use eZ\Publish\SPI\Persistence\Content\Location as SPILocation; +use eZ\Publish\SPI\Persistence\Content\Location\CreateStruct; +use eZ\Publish\SPI\Persistence\Content\Location\UpdateStruct; +use eZ\Publish\API\Repository\LocationService as LocationServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Handler; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalAnd as CriterionLogicalAnd; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalNot as CriterionLogicalNot; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Subtree as CriterionSubtree; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Status as CriterionStatus; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ParentLocationId as CriterionParentLocationId; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\BadStateException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use DateTime; + +/** + * Location service, used for complex subtree operations + * + * @example Examples/location.php + * + * @package eZ\Publish\Core\Repository + */ +class LocationService implements LocationServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Handler + */ + protected $persistenceHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Handler $handler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $handler, array $settings = array() ) + { + $this->repository = $repository; + $this->persistenceHandler = $handler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Copies the subtree starting from $subtree as a new subtree of $targetLocation + * + * Only the items on which the user has read access are copied. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed copy the subtree to the given parent location + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user does not have read access to the whole source subtree + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the target location is a sub location of the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $subtree - the subtree denoted by the location to copy + * @param \eZ\Publish\API\Repository\Values\Content\Location $targetParentLocation - the target parent location for the copy operation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location The newly created location of the copied subtree + */ + public function copySubtree( APILocation $subtree, APILocation $targetParentLocation ) + { + if ( !is_numeric( $subtree->id ) ) + throw new InvalidArgumentValue( "id", $subtree->id, "Location" ); + + if ( !is_numeric( $targetParentLocation->id ) ) + throw new InvalidArgumentValue( "id", $targetParentLocation->id, "Location" ); + + $loadedSubtree = $this->loadLocation( $subtree->id ); + $loadedTargetLocation = $this->loadLocation( $targetParentLocation->id ); + + if ( stripos( $loadedTargetLocation->pathString, $loadedSubtree->pathString ) !== false ) + throw new InvalidArgumentException( "targetParentLocation", "target parent location is a sub location of the given subtree" ); + + // check create permission on target + if ( !$this->repository->canUser( 'content', 'create', $loadedSubtree->getContentInfo(), $loadedTargetLocation ) ) + throw new UnauthorizedException( 'content', 'create' ); + + /** Check read access to whole source subtree + * @var boolean|\eZ\Publish\API\Repository\Values\Content\Query\Criterion $contentReadCriterion + */ + $contentReadCriterion = $this->repository->getSearchService()->getPermissionsCriterion(); + if ( $contentReadCriterion === false ) + { + throw new UnauthorizedException( 'content', 'read' ); + } + else if ( $contentReadCriterion !== true ) + { + // Query if there are any content in subtree current user don't have access to + $query = new Query( + array( + 'limit' => 0, + 'criterion' => new CriterionLogicalAnd( + new CriterionSubtree( $loadedSubtree->pathString ), + new CriterionLogicalNot( $contentReadCriterion ) + ) + ) + ); + $result = $this->repository->getSearchService()->findContent( $query, array(), false ); + if ( $result->totalCount > 0 ) + { + throw new UnauthorizedException( 'content', 'read' ); + } + } + + $this->repository->beginTransaction(); + try + { + $newLocation = $this->persistenceHandler->locationHandler()->copySubtree( + $loadedSubtree->id, + $loadedTargetLocation->id + ); + + $content = $this->repository->getContentService()->loadContent( $newLocation->contentId ); + $urlAliasNames = $this->repository->getNameSchemaService()->resolveUrlAliasSchema( $content ); + foreach ( $urlAliasNames as $languageCode => $name ) + { + $this->persistenceHandler->urlAliasHandler()->publishUrlAliasForLocation( + $newLocation->id, + $loadedTargetLocation->id, + $name, + $languageCode, + $content->contentInfo->alwaysAvailable + ); + } + + $this->persistenceHandler->urlAliasHandler()->locationCopied( + $newLocation->id, + $loadedSubtree->parentLocationId, + $loadedTargetLocation->id + ); + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainLocationObject( $newLocation ); + } + + /** + * Loads a location object from its $locationId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param int $locationId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocation( $locationId ) + { + if ( !is_numeric( $locationId ) ) + throw new InvalidArgumentValue( "locationId", $locationId ); + + $spiLocation = $this->persistenceHandler->locationHandler()->load( $locationId ); + $location = $this->buildDomainLocationObject( $spiLocation ); + if ( !$this->repository->canUser( 'content', 'read', $location->getContentInfo(), $location ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $location; + } + + /** + * Loads a location object from its $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If more than one location with same remote ID was found + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocationByRemoteId( $remoteId ) + { + if ( !is_string( $remoteId ) ) + throw new InvalidArgumentValue( "remoteId", $remoteId ); + + $spiLocation = $this->persistenceHandler->locationHandler()->loadByRemoteId( $remoteId ); + $location = $this->buildDomainLocationObject( $spiLocation ); + if ( !$this->repository->canUser( 'content', 'read', $location->getContentInfo(), $location ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $location; + } + + /** + * Loads the locations for the given content object. + * + * If a $rootLocation is given, only locations that belong to this location are returned. + * The location list is also filtered by permissions on reading locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if there is no published version yet + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location $rootLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] An array of {@link Location} + */ + public function loadLocations( APIContentInfo $contentInfo, APILocation $rootLocation = null ) + { + if ( !is_numeric( $contentInfo->id ) ) + { + throw new InvalidArgumentValue( "id", $contentInfo->id, "ContentInfo" ); + } + + if ( $rootLocation !== null && !is_numeric( $rootLocation->id ) ) + { + throw new InvalidArgumentValue( "pathString", $rootLocation->pathString, "Location" ); + } + + if ( !$contentInfo->published ) + { + throw new BadStateException( "\$contentInfo", "ContentInfo has no published versions" ); + } + + $spiLocations = $this->persistenceHandler->locationHandler()->loadLocationsByContent( + $contentInfo->id, + isset( $rootLocation ) ? $rootLocation->id : null + ); + + $locations = array(); + foreach ( $spiLocations as $spiLocation ) + { + $locations[] = $this->buildDomainLocationObject( $spiLocation ); + } + + return $locations; + } + + /** + * Loads children which are readable by the current user of a location object sorted by sortField and sortOrder + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @param int $offset the start offset for paging + * @param int $limit the number of locations returned. If $limit = -1 all children starting at $offset are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationList + */ + public function loadLocationChildren( APILocation $location, $offset = 0, $limit = -1 ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( !is_numeric( $location->sortField ) ) + throw new InvalidArgumentValue( "sortField", $location->sortField, "Location" ); + + if ( !is_numeric( $location->sortOrder ) ) + throw new InvalidArgumentValue( "sortOrder", $location->sortOrder, "Location" ); + + if ( !is_numeric( $offset ) ) + throw new InvalidArgumentValue( "offset", $offset ); + + if ( !is_numeric( $limit ) ) + throw new InvalidArgumentValue( "limit", $limit ); + + $searchResult = $this->searchChildrenLocations( + $location->id, + $location->sortField, + $location->sortOrder, + $offset, + $limit + ); + + $childLocations = array(); + foreach ( $searchResult->searchHits as $spiSearchHit ) + { + $spiContentLocations = $this->persistenceHandler->locationHandler()->loadLocationsByContent( + $spiSearchHit->valueObject->versionInfo->contentInfo->id, + $location->id + ); + foreach ( $spiContentLocations as $spiLocation ) + { + if ( $spiLocation->parentId == $location->id ) + { + $childLocation = $this->buildDomainLocationObject( $spiLocation ); + if ( $this->repository->canUser( 'content', 'read', $childLocation->getContentInfo(), $childLocation ) ) + { + $childLocations[] = $childLocation; + } + } + } + } + + return new LocationList( + array( + "locations" => $childLocations, + "totalCount" => (int)$searchResult->totalCount + ) + ); + } + + /** + * Returns the number of children which are readable by the current user of a location object + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return int + */ + public function getLocationChildCount( APILocation $location ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + return $this->searchChildrenLocations( + $location->id, + null, + APILocation::SORT_ORDER_ASC, + 0, + 0 + )->totalCount; + } + + /** + * Searches children locations of the provided parent location id + * + * @param int $parentLocationId + * @param int $sortField + * @param int $sortOrder + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + protected function searchChildrenLocations( $parentLocationId, $sortField = null, $sortOrder = APILocation::SORT_ORDER_ASC, $offset = 0, $limit = -1 ) + { + $query = new Query( + array( + 'criterion' => new CriterionLogicalAnd( + array( + new CriterionParentLocationId( $parentLocationId ), + new CriterionStatus( CriterionStatus::STATUS_PUBLISHED ), + ) + ), + 'offset' => ( $offset >= 0 ? (int)$offset : 0 ), + 'limit' => ( $limit >= 0 ? (int)$limit : null ) + ) + ); + + if ( $sortField !== null ) + $query->sortClauses = array( $this->getSortClauseBySortField( $sortField, $sortOrder ) ); + + if ( !$this->repository->getSearchService()->addPermissionsCriterion( $query->criterion ) ) + { + return array(); + } + + return $this->persistenceHandler->searchHandler()->findContent( $query ); + } + + /** + * Creates the new $location in the content repository for the given content + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the content is already below the specified parent + * or the parent is a sub location of the location of the content + * or if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $locationCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created Location + * + */ + public function createLocation( APIContentInfo $contentInfo, LocationCreateStruct $locationCreateStruct ) + { + if ( !is_numeric( $contentInfo->id ) ) + throw new InvalidArgumentValue( "id", $contentInfo->id, "ContentInfo" ); + + if ( !is_numeric( $contentInfo->currentVersionNo ) ) + throw new InvalidArgumentValue( "currentVersionNo", $contentInfo->currentVersionNo, "ContentInfo" ); + + if ( !is_numeric( $locationCreateStruct->parentLocationId ) ) + throw new InvalidArgumentValue( "parentLocationId", $locationCreateStruct->parentLocationId, "LocationCreateStruct" ); + + if ( $locationCreateStruct->priority !== null && !is_numeric( $locationCreateStruct->priority ) ) + throw new InvalidArgumentValue( "priority", $locationCreateStruct->priority, "LocationCreateStruct" ); + + if ( !is_bool( $locationCreateStruct->hidden ) ) + throw new InvalidArgumentValue( "hidden", $locationCreateStruct->hidden, "LocationCreateStruct" ); + + if ( $locationCreateStruct->remoteId !== null && ( !is_string( $locationCreateStruct->remoteId ) || empty( $locationCreateStruct->remoteId ) ) ) + throw new InvalidArgumentValue( "remoteId", $locationCreateStruct->remoteId, "LocationCreateStruct" ); + + if ( $locationCreateStruct->sortField !== null && !is_numeric( $locationCreateStruct->sortField ) ) + throw new InvalidArgumentValue( "sortField", $locationCreateStruct->sortField, "LocationCreateStruct" ); + + if ( $locationCreateStruct->sortOrder !== null && !is_numeric( $locationCreateStruct->sortOrder ) ) + throw new InvalidArgumentValue( "sortOrder", $locationCreateStruct->sortOrder, "LocationCreateStruct" ); + + // check for existence of location with provided remote ID + if ( $locationCreateStruct->remoteId !== null ) + { + try + { + $existingLocation = $this->loadLocationByRemoteId( $locationCreateStruct->remoteId ); + if ( $existingLocation !== null ) + throw new InvalidArgumentException( "locationCreateStruct", "location with provided remote ID already exists" ); + } + catch ( APINotFoundException $e ) + { + } + } + else + { + $locationCreateStruct->remoteId = md5( uniqid( get_class( $this ), true ) ); + } + + $loadedParentLocation = $this->loadLocation( $locationCreateStruct->parentLocationId ); + + // Check if the parent is a sub location of one of the existing content locations (this also solves the + // situation where parent location actually one of the content locations), + // or if the content already has location below given location create struct parent + $existingContentLocations = $this->loadLocations( $contentInfo ); + if ( !empty( $existingContentLocations ) ) + { + foreach ( $existingContentLocations as $existingContentLocation ) + { + if ( stripos( $loadedParentLocation->pathString, $existingContentLocation->pathString ) !== false ) + throw new InvalidArgumentException( "locationCreateStruct", "specified parent is a sub location of one of the existing content locations" ); + if ( $loadedParentLocation->id == $existingContentLocation->parentLocationId ) + throw new InvalidArgumentException( "locationCreateStruct", "content is already below the specified parent" ); + } + } + + if ( !$this->repository->canUser( 'content', 'create', $contentInfo, $loadedParentLocation ) ) + throw new UnauthorizedException( 'content', 'create' ); + + $createStruct = new CreateStruct(); + $createStruct->priority = $locationCreateStruct->priority !== null ? (int)$locationCreateStruct->priority : null; + + // if we declare the new location as hidden, it is automatically invisible + // otherwise, it remains unhidden, and picks up visibility from parent + if ( $locationCreateStruct->hidden === true ) + { + $createStruct->hidden = true; + $createStruct->invisible = true; + } + else if ( $loadedParentLocation->hidden || $loadedParentLocation->invisible ) + { + $createStruct->invisible = true; + } + + $createStruct->remoteId = trim( $locationCreateStruct->remoteId ); + $createStruct->contentId = (int)$contentInfo->id; + $createStruct->contentVersion = (int)$contentInfo->currentVersionNo; + + if ( $contentInfo->mainLocationId !== null ) + $createStruct->mainLocationId = $contentInfo->mainLocationId; + + $createStruct->sortField = $locationCreateStruct->sortField !== null ? (int)$locationCreateStruct->sortField : APILocation::SORT_FIELD_NAME; + $createStruct->sortOrder = $locationCreateStruct->sortOrder !== null ? (int)$locationCreateStruct->sortOrder : APILocation::SORT_ORDER_ASC; + $createStruct->parentId = $loadedParentLocation->id; + + $this->repository->beginTransaction(); + try + { + $newLocation = $this->persistenceHandler->locationHandler()->create( $createStruct ); + $content = $this->repository->getContentService()->loadContent( $newLocation->contentId ); + + $urlAliasNames = $this->repository->getNameSchemaService()->resolveUrlAliasSchema( $content ); + foreach ( $urlAliasNames as $languageCode => $name ) + { + $this->persistenceHandler->urlAliasHandler()->publishUrlAliasForLocation( + $newLocation->id, + $newLocation->parentId, + $name, + $languageCode, + $content->contentInfo->alwaysAvailable, + // @todo: this is legacy storage specific for updating ezcontentobject_tree.path_identification_string, to be removed + $languageCode === $content->contentInfo->mainLanguageCode + ); + } + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainLocationObject( $newLocation ); + } + + /** + * Updates $location in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to update this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct $locationUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the updated Location + */ + public function updateLocation( APILocation $location, LocationUpdateStruct $locationUpdateStruct ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( $locationUpdateStruct->priority !== null && !is_numeric( $locationUpdateStruct->priority ) ) + throw new InvalidArgumentValue( "priority", $locationUpdateStruct->priority, "LocationUpdateStruct" ); + + if ( $locationUpdateStruct->remoteId !== null && ( !is_string( $locationUpdateStruct->remoteId ) || empty( $locationUpdateStruct->remoteId ) ) ) + throw new InvalidArgumentValue( "remoteId", $locationUpdateStruct->remoteId, "LocationUpdateStruct" ); + + if ( $locationUpdateStruct->sortField !== null && !is_numeric( $locationUpdateStruct->sortField ) ) + throw new InvalidArgumentValue( "sortField", $locationUpdateStruct->sortField, "LocationUpdateStruct" ); + + if ( $locationUpdateStruct->sortOrder !== null && !is_numeric( $locationUpdateStruct->sortOrder ) ) + throw new InvalidArgumentValue( "sortOrder", $locationUpdateStruct->sortOrder, "LocationUpdateStruct" ); + + $loadedLocation = $this->loadLocation( $location->id ); + + if ( $locationUpdateStruct->remoteId !== null ) + { + try + { + $existingLocation = $this->loadLocationByRemoteId( $locationUpdateStruct->remoteId ); + if ( $existingLocation !== null ) + throw new InvalidArgumentException( "locationUpdateStruct", "location with provided remote ID already exists" ); + } + catch ( APINotFoundException $e ) + { + } + } + + if ( !$this->repository->canUser( 'content', 'edit', $loadedLocation->getContentInfo(), $loadedLocation ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $updateStruct = new UpdateStruct(); + $updateStruct->priority = $locationUpdateStruct->priority !== null ? (int)$locationUpdateStruct->priority : $loadedLocation->priority; + $updateStruct->remoteId = $locationUpdateStruct->remoteId !== null ? trim( $locationUpdateStruct->remoteId ) : $loadedLocation->remoteId; + $updateStruct->sortField = $locationUpdateStruct->sortField !== null ? (int)$locationUpdateStruct->sortField : $loadedLocation->sortField; + $updateStruct->sortOrder = $locationUpdateStruct->sortOrder !== null ? (int)$locationUpdateStruct->sortOrder : $loadedLocation->sortOrder; + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->locationHandler()->update( $updateStruct, $loadedLocation->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadLocation( $loadedLocation->id ); + } + + /** + * Swaps the contents held by $location1 and $location2 + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to swap content + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location1 + * @param \eZ\Publish\API\Repository\Values\Content\Location $location2 + */ + public function swapLocation( APILocation $location1, APILocation $location2 ) + { + if ( !is_numeric( $location1->id ) ) + throw new InvalidArgumentValue( "id", $location1->id, "Location" ); + + if ( !is_numeric( $location2->id ) ) + throw new InvalidArgumentValue( "id", $location2->id, "Location" ); + + $loadedLocation1 = $this->loadLocation( $location1->id ); + $loadedLocation2 = $this->loadLocation( $location2->id ); + + if ( !$this->repository->canUser( 'content', 'edit', $loadedLocation1->getContentInfo(), $loadedLocation1 ) ) + throw new UnauthorizedException( 'content', 'edit' ); + if ( !$this->repository->canUser( 'content', 'edit', $loadedLocation2->getContentInfo(), $loadedLocation2 ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->locationHandler()->swap( $loadedLocation1->id, $loadedLocation2->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Hides the $location and marks invisible all descendants of $location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to hide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function hideLocation( APILocation $location ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( !$this->repository->canUser( 'content', 'hide', $location->getContentInfo(), $location ) ) + throw new UnauthorizedException( 'content', 'hide' ); + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->locationHandler()->hide( $location->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadLocation( $location->id ); + } + + /** + * Unhides the $location. + * + * This method and marks visible all descendants of $locations + * until a hidden location is found. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to unhide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function unhideLocation( APILocation $location ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( !$this->repository->canUser( 'content', 'hide', $location->getContentInfo(), $location ) ) + throw new UnauthorizedException( 'content', 'hide' ); + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->locationHandler()->unHide( $location->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadLocation( $location->id ); + } + + /** + * Moves the subtree to $newParentLocation + * + * If a user has the permission to move the location to a target location + * he can do it regardless of an existing descendant on which the user has no permission. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to move this location to the target + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user does not have read access to the whole source subtree + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + */ + public function moveSubtree( APILocation $location, APILocation $newParentLocation ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( !is_numeric( $newParentLocation->id ) ) + throw new InvalidArgumentValue( "id", $newParentLocation->id, "Location" ); + + // check create permission on target location + if ( !$this->repository->canUser( 'content', 'create', $location->getContentInfo(), $newParentLocation ) ) + throw new UnauthorizedException( 'content', 'create' ); + + /** Check read access to whole source subtree + * @var boolean|\eZ\Publish\API\Repository\Values\Content\Query\Criterion $contentReadCriterion + */ + $contentReadCriterion = $this->repository->getSearchService()->getPermissionsCriterion(); + if ( $contentReadCriterion === false ) + { + throw new UnauthorizedException( 'content', 'read' ); + } + else if ( $contentReadCriterion !== true ) + { + // Query if there are any content in subtree current user don't have access to + $query = new Query( + array( + 'limit' => 0, + 'criterion' => new CriterionLogicalAnd( + new CriterionSubtree( $location->pathString ), + new CriterionLogicalNot( $contentReadCriterion ) + ) + ) + ); + $result = $this->repository->getSearchService()->findContent( $query, array(), false ); + if ( $result->totalCount > 0 ) + { + throw new UnauthorizedException( 'content', 'read' ); + } + } + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->locationHandler()->move( $location->id, $newParentLocation->id ); + + $content = $this->repository->getContentService()->loadContent( $location->contentId ); + $urlAliasNames = $this->repository->getNameSchemaService()->resolveUrlAliasSchema( $content ); + foreach ( $urlAliasNames as $languageCode => $name ) + { + $this->persistenceHandler->urlAliasHandler()->publishUrlAliasForLocation( + $location->id, + $newParentLocation->id, + $name, + $languageCode, + $content->contentInfo->alwaysAvailable + ); + } + + $this->persistenceHandler->urlAliasHandler()->locationMoved( + $location->id, + $location->parentLocationId, + $newParentLocation->id + ); + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Deletes $location and all its descendants. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user is not allowed to delete this location or a descendant + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + */ + public function deleteLocation( APILocation $location ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( !$this->repository->canUser( 'content', 'manage_locations', $location->getContentInfo() ) ) + throw new UnauthorizedException( 'content', 'manage_locations' ); + if ( !$this->repository->canUser( 'content', 'remove', $location->getContentInfo(), $location ) ) + throw new UnauthorizedException( 'content', 'remove' ); + + /** Check remove access to descendants + * @var boolean|\eZ\Publish\API\Repository\Values\Content\Query\Criterion $contentReadCriterion + */ + $contentReadCriterion = $this->repository->getSearchService()->getPermissionsCriterion( 'content', 'remove' ); + if ( $contentReadCriterion === false ) + { + throw new UnauthorizedException( 'content', 'remove' ); + } + else if ( $contentReadCriterion !== true ) + { + // Query if there are any content in subtree current user don't have access to + $query = new Query( + array( + 'limit' => 0, + 'criterion' => new CriterionLogicalAnd( + new CriterionSubtree( $location->pathString ), + new CriterionLogicalNot( $contentReadCriterion ) + ) + ) + ); + $result = $this->repository->getSearchService()->findContent( $query, array(), false ); + if ( $result->totalCount > 0 ) + { + throw new UnauthorizedException( 'content', 'remove' ); + } + } + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->locationHandler()->removeSubtree( $location->id ); + $this->persistenceHandler->urlAliasHandler()->locationDeleted( $location->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Instantiates a new location create class + * + * @param mixed $parentLocationId the parent under which the new location should be created + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct + */ + public function newLocationCreateStruct( $parentLocationId ) + { + return new LocationCreateStruct( + array( + 'parentLocationId' => (int)$parentLocationId + ) + ); + } + + /** + * Instantiates a new location update class + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct + */ + public function newLocationUpdateStruct() + { + return new LocationUpdateStruct(); + } + + /** + * Builds domain location object from provided persistence location + * + * @param \eZ\Publish\SPI\Persistence\Content\Location $spiLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + protected function buildDomainLocationObject( SPILocation $spiLocation ) + { + if ( $spiLocation->id == 1 )// Workaround for missing ContentInfo on root location + $contentInfo = new ContentInfo( + array( + 'id' => 0, + 'name' => 'Top Level Nodes', + 'sectionId' => 1, + 'mainLocationId' => 1, + 'contentType' => new ContentType( + array( + 'identifier' => 'folder', + 'isContainer' => true, + 'fieldDefinitions' => array() + ) + ) + ) + ); + else // @todo This should not be loaded separately, SPI need to change to fix this. + $contentInfo = $this->repository->getContentService()->internalLoadContentInfo( $spiLocation->contentId ); + + return new Location( + array( + 'contentInfo' => $contentInfo, + 'id' => (int)$spiLocation->id, + 'priority' => (int)$spiLocation->priority, + 'hidden' => (bool)$spiLocation->hidden, + 'invisible' => (bool)$spiLocation->invisible, + 'remoteId' => $spiLocation->remoteId, + 'parentLocationId' => (int)$spiLocation->parentId, + 'pathString' => $spiLocation->pathString, + 'depth' => (int)$spiLocation->depth, + 'sortField' => (int)$spiLocation->sortField, + 'sortOrder' => (int)$spiLocation->sortOrder, + ) + ); + } + + /** + * @param int|null $timestamp + * + * @return \DateTime|null + */ + protected function getDateTime( $timestamp ) + { + $dateTime = new DateTime(); + $dateTime->setTimestamp( $timestamp ); + return $dateTime; + } + + /** + * Instantiates a correct sort clause object based on provided location sort field and sort order + * + * @param int $sortField + * @param int $sortOrder + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\SortClause + */ + protected function getSortClauseBySortField( $sortField, $sortOrder = APILocation::SORT_ORDER_ASC ) + { + $sortOrder = $sortOrder == APILocation::SORT_ORDER_DESC ? Query::SORT_DESC : Query::SORT_ASC; + switch ( $sortField ) + { + case APILocation::SORT_FIELD_PATH: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationPathString( $sortOrder ); + + case APILocation::SORT_FIELD_PUBLISHED: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\DatePublished( $sortOrder ); + + case APILocation::SORT_FIELD_MODIFIED: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\DateModified( $sortOrder ); + + case APILocation::SORT_FIELD_SECTION: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\SectionIdentifier( $sortOrder ); + + case APILocation::SORT_FIELD_DEPTH: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationDepth( $sortOrder ); + + //@todo: enable + // case APILocation::SORT_FIELD_CLASS_IDENTIFIER: + + //@todo: enable + // case APILocation::SORT_FIELD_CLASS_NAME: + + case APILocation::SORT_FIELD_PRIORITY: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationPriority( $sortOrder ); + + case APILocation::SORT_FIELD_NAME: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\ContentName( $sortOrder ); + + //@todo: enable + // case APILocation::SORT_FIELD_MODIFIED_SUBNODE: + + //@todo: enable + // case APILocation::SORT_FIELD_NODE_ID: + + //@todo: enable + // case APILocation::SORT_FIELD_CONTENTOBJECT_ID: + + default: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationPathString( $sortOrder ); + } + } +} diff --git a/eZ/Publish/Core/Repository/NameSchemaService.php b/eZ/Publish/Core/Repository/NameSchemaService.php new file mode 100644 index 0000000..a362084 --- /dev/null +++ b/eZ/Publish/Core/Repository/NameSchemaService.php @@ -0,0 +1,423 @@ +<?php +/** + * File containing the NameSchemaService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\API\Repository\Values\Content\Content; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; + +/** + * NameSchemaService is internal service for resolving content name and url alias patterns. + * This code supports content name pattern groups. + * + * Syntax: + * <code> + * <attribute_identifier> + * <attribute_identifier> <2nd-identifier> + * User text <attribute_identifier>|(<2nd-identifier><3rd-identifier>) + * </code> + * + * Example: + * <code> + * <nickname|(<firstname> <lastname>)> + * </code> + * + * Tokens are looked up from left to right. If a match is found for the + * leftmost token, the 2nd token will not be used. Tokens are representations + * of fields. So a match means that that the current field has data. + * + * Tokens are the field definition identifiers which are used in the class edit-interface. + * + * @internal + */ +class NameSchemaService +{ + /** + * The string to use to signify group tokens. + * + * @var string + */ + const META_STRING = 'EZMETAGROUP_'; + + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var array + */ + protected $settings; + + /** + * Constructs a object to resolve $nameSchema with $contentVersion fields values + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param array $settings + * + * @return \eZ\Publish\Core\Repository\NameSchemaService + */ + public function __construct( RepositoryInterface $repository, array $settings = array() ) + { + $this->repository = $repository; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + 'limit' => 150, + 'sequence' => '...', + ); + } + + /** + * Convenience method for resolving URL alias schema + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return array + */ + public function resolveUrlAliasSchema( Content $content ) + { + return $this->resolve( + strlen( $content->contentType->urlAliasSchema ) === 0 ? + $content->contentType->nameSchema : + $content->contentType->urlAliasSchema, + $content->contentType, + $content->fields, + $content->versionInfo->languageCodes + ); + } + + /** + * Convenience method for resolving name schema + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param array $fieldMap + * @param array $languageCodes + * + * @return array + */ + public function resolveNameSchema( Content $content, array $fieldMap = array(), array $languageCodes = array() ) + { + $languageCodes = $languageCodes ?: $content->versionInfo->languageCodes; + return $this->resolve( + $content->contentType->nameSchema, + $content->contentType, + $this->mergeFieldMap( + $content, + $fieldMap, + $languageCodes + ), + $languageCodes + ); + } + + /** + * Convenience method for resolving name schema + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param array $fieldMap + * @param array $languageCodes + * + * @return array + */ + protected function mergeFieldMap( Content $content, array $fieldMap, array $languageCodes ) + { + if ( empty( $fieldMap ) ) + { + return $content->fields; + } + + $mergedFieldMap = array(); + + foreach ( $content->fields as $fieldIdentifier => $fieldLanguageMap ) + { + foreach ( $languageCodes as $languageCode ) + { + $mergedFieldMap[$fieldIdentifier][$languageCode] = isset( $fieldMap[$fieldIdentifier][$languageCode] ) + ? $fieldMap[$fieldIdentifier][$languageCode] + : $fieldLanguageMap[$languageCode]; + } + } + + return $mergedFieldMap; + } + + /** + * Returns the real name for a content name pattern + * + * @param string $nameSchema + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param array $fieldMap + * @param array $languageCodes + * + * @return string + */ + public function resolve( $nameSchema, ContentType $contentType, array $fieldMap, array $languageCodes ) + { + list( $filteredNameSchema, $groupLookupTable ) = $this->filterNameSchema( $nameSchema ); + $tokens = $this->extractTokens( $filteredNameSchema ); + $schemaIdentifiers = $this->getIdentifiers( $nameSchema ); + + $names = array(); + + foreach ( $languageCodes as $languageCode ) + { + // Fetch titles for language code + $titles = $this->getFieldTitles( $schemaIdentifiers, $contentType, $fieldMap, $languageCode ); + $name = $filteredNameSchema; + + // Replace tokens with real values + foreach ( $tokens as $token ) + { + $string = $this->resolveToken( $token, $titles, $groupLookupTable ); + $name = str_replace( $token, $string, $name ); + } + + // Make sure length is not longer then $limit unless it's 0 + if ( $this->settings["limit"] && strlen( $name ) > $this->settings["limit"] ) + { + $name = rtrim( substr( $name, 0, $this->settings["limit"] - strlen( $this->settings["sequence"] ) ) ) . $this->settings["sequence"]; + } + + $names[$languageCode] = $name; + } + + return $names; + } + + /** + * Fetches the list of available Field identifiers in the token and returns + * an array of their current title value. + * + * @see \eZ\Publish\Core\Repository\FieldType::getName() + * + * @param string[] $schemaIdentifiers + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType $fieldDefinitions + * @param array $fieldMap + * @param string $languageCode + * + * @return string[] Key is the field identifier, value is the title value + */ + protected function getFieldTitles( array $schemaIdentifiers, ContentType $contentType, array $fieldMap, $languageCode ) + { + $fieldTitles = array(); + + foreach ( $schemaIdentifiers as $fieldDefinitionIdentifier ) + { + if ( isset( $fieldMap[$fieldDefinitionIdentifier][$languageCode] ) ) + { + $fieldDefinition = $contentType->getFieldDefinition( $fieldDefinitionIdentifier ); + $fieldType = $this->repository->getFieldTypeService()->getFieldType( + $fieldDefinition->fieldTypeIdentifier + ); + $fieldTitles[$fieldDefinitionIdentifier] = $fieldType->getName( + $fieldMap[$fieldDefinitionIdentifier][$languageCode] + ); + } + } + + return $fieldTitles; + } + + /** + * Extract all tokens from $namePattern + * + * Example: + * <code> + * Text <token> more text ==> <token> + * </code> + * + * @param string $nameSchema + * + * @return array + */ + protected function extractTokens( $nameSchema ) + { + preg_match_all( + "|<([^>]+)>|U", + $nameSchema, + $tokenArray + ); + + return $tokenArray[0]; + } + + /** + * Looks up the value $token should be replaced with and returns this as + * a string. Meta strings denoting token groups are automatically + * inferred. + * + * @param string $token + * @param array $titles + * + * @param array $groupLookupTable + * + * @return string + */ + protected function resolveToken( $token, $titles, $groupLookupTable ) + { + $replaceString = ""; + $tokenParts = $this->tokenParts( $token ); + + foreach ( $tokenParts as $tokenPart ) + { + if ( $this->isTokenGroup( $tokenPart ) ) + { + $replaceString = $groupLookupTable[$tokenPart]; + $groupTokenArray = $this->extractTokens( $replaceString ); + + foreach ( $groupTokenArray as $groupToken ) + { + $replaceString = str_replace( + $groupToken, + $this->resolveToken( + $groupToken, + $titles, + $groupLookupTable + ), + $replaceString + ); + } + + // We want to stop after the first matching token part / identifier is found + // <id1|id2> if id1 has a value, id2 will not be used. + // In this case id1 or id1 is a token group. + break; + } + else + { + if ( array_key_exists( $tokenPart, $titles ) && $titles[$tokenPart] !== '' && $titles[$tokenPart] !== null ) + { + $replaceString = $titles[$tokenPart]; + // We want to stop after the first matching token part / identifier is found + // <id1|id2> if id1 has a value, id2 will not be used. + break; + } + } + } + + return $replaceString; + } + + /** + * Checks whether $identifier is a placeholder for a token group. + * + * @param string $identifier + * + * @return boolean + */ + protected function isTokenGroup( $identifier ) + { + if ( strpos( $identifier, self::META_STRING ) === false ) + { + return false; + } + + return true; + } + + /** + * Returns the different constituents of $token in an array. + * The normal case here is that the different identifiers within one token + * will be tokenized and returned. + * + * Example: + * <code> + * "<title|text>" ==> array( 'title', 'text' ) + * </code> + * + * @param string $token + * + * @return array + */ + protected function tokenParts( $token ) + { + return preg_split( '#\\W#', $token, -1, PREG_SPLIT_NO_EMPTY ); + } + + /** + * Builds a lookup / translation table for groups in the $namePattern. + * The groups are referenced with a generated meta-token in the original + * name pattern. + * + * Returns intermediate name pattern where groups are replaced with meta- + * tokens. + * + * @param string $nameSchema + * + * @return string + */ + protected function filterNameSchema( $nameSchema ) + { + $retNamePattern = ""; + $foundGroups = preg_match_all( "/[<|\\|](\\(.+\\))[\\||>]/U", $nameSchema, $groupArray ); + $groupLookupTable = array(); + + if ( $foundGroups ) + { + $i = 0; + foreach ( $groupArray[1] as $group ) + { + // Create meta-token for group + $metaToken = self::META_STRING . $i; + + // Insert the group with its placeholder token + $retNamePattern = str_replace( $group, $metaToken, $nameSchema ); + + // Remove the pattern "(" ")" from the tokens + $group = str_replace( array( '(', ')' ), '', $group ); + + $groupLookupTable[$metaToken] = $group; + ++$i; + } + $nameSchema = $retNamePattern; + } + + return array( $nameSchema, $groupLookupTable ); + } + + /** + * Returns all identifiers from all tokens in the name schema. + * + * @param string $schemaString + * + * @return array + */ + protected function getIdentifiers( $schemaString ) + { + $allTokens = '#<(.*)>#U'; + $identifiers = '#\\W#'; + + $tmpArray = array(); + preg_match_all( $allTokens, $schemaString, $matches ); + + foreach ( $matches[1] as $match ) + { + $tmpArray[] = preg_split( $identifiers, $match, -1, PREG_SPLIT_NO_EMPTY ); + } + + $retArray = array(); + foreach ( $tmpArray as $matchGroup ) + { + if ( is_array( $matchGroup ) ) + { + foreach ( $matchGroup as $item ) + { + $retArray[] = $item; + } + } + else + { + $retArray[] = $matchGroup; + } + } + + return $retArray; + } +} diff --git a/eZ/Publish/Core/Repository/ObjectStateService.php b/eZ/Publish/Core/Repository/ObjectStateService.php new file mode 100644 index 0000000..bfceb14 --- /dev/null +++ b/eZ/Publish/Core/Repository/ObjectStateService.php @@ -0,0 +1,886 @@ +<?php +/** + * File containing the eZ\Publish\API\Repository\ObjectStateService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\ObjectStateService as ObjectStateServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Content\ObjectState\Handler; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectState as APIObjectState; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup as APIObjectStateGroup; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectStateGroup; +use eZ\Publish\SPI\Persistence\Content\ObjectState as SPIObjectState; +use eZ\Publish\SPI\Persistence\Content\ObjectState\Group as SPIObjectStateGroup; +use eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; + +/** + * ObjectStateService service + * + * @example Examples/objectstates.php tbd. + * + * @package eZ\Publish\Core\Repository + */ +class ObjectStateService implements ObjectStateServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler + */ + protected $objectStateHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler $objectStateHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $objectStateHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->objectStateHandler = $objectStateHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Creates a new object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct $objectStateGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function createObjectStateGroup( ObjectStateGroupCreateStruct $objectStateGroupCreateStruct ) + { + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $inputStruct = $this->buildCreateInputStruct( + $objectStateGroupCreateStruct->identifier, + $objectStateGroupCreateStruct->defaultLanguageCode, + $objectStateGroupCreateStruct->names, + $objectStateGroupCreateStruct->descriptions + ); + + try + { + $this->objectStateHandler->loadGroupByIdentifier( $inputStruct->identifier ); + throw new InvalidArgumentException( + "objectStateGroupCreateStruct", + "Object state group with provided identifier already exists" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + $this->repository->beginTransaction(); + try + { + $spiObjectStateGroup = $this->objectStateHandler->createGroup( $inputStruct ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainObjectStateGroupObject( $spiObjectStateGroup ); + } + + /** + * Loads a object state group + * + * @param mixed $objectStateGroupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function loadObjectStateGroup( $objectStateGroupId ) + { + if ( !is_numeric( $objectStateGroupId ) ) + throw new InvalidArgumentValue( "objectStateGroupId", $objectStateGroupId ); + + $spiObjectStateGroup = $this->objectStateHandler->loadGroup( $objectStateGroupId ); + + return $this->buildDomainObjectStateGroupObject( $spiObjectStateGroup ); + } + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] + */ + public function loadObjectStateGroups( $offset = 0, $limit = -1 ) + { + $spiObjectStateGroups = $this->objectStateHandler->loadAllGroups( $offset, $limit ); + + $objectStateGroups = array(); + foreach ( $spiObjectStateGroups as $spiObjectStateGroup ) + { + $objectStateGroups[] = $this->buildDomainObjectStateGroupObject( $spiObjectStateGroup ); + } + + return $objectStateGroups; + } + + /** + * This method returns the ordered list of object states of a group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public function loadObjectStates( APIObjectStateGroup $objectStateGroup ) + { + if ( !is_numeric( $objectStateGroup->id ) ) + throw new InvalidArgumentValue( "id", $objectStateGroup->id, "ObjectStateGroup" ); + + $spiObjectStates = $this->objectStateHandler->loadObjectStates( $objectStateGroup->id ); + + $objectStates = array(); + foreach ( $spiObjectStates as $spiObjectState ) + { + $objectStates[] = $this->buildDomainObjectStateObject( $spiObjectState, $objectStateGroup ); + } + + return $objectStates; + } + + /** + * Updates an object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function updateObjectStateGroup( APIObjectStateGroup $objectStateGroup, ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct ) + { + if ( !is_numeric( $objectStateGroup->id ) ) + throw new InvalidArgumentValue( "id", $objectStateGroup->id, "ObjectStateGroup" ); + + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $loadedObjectStateGroup = $this->loadObjectStateGroup( $objectStateGroup->id ); + + $inputStruct = $this->buildObjectStateGroupUpdateInputStruct( + $loadedObjectStateGroup, + $objectStateGroupUpdateStruct->identifier, + $objectStateGroupUpdateStruct->defaultLanguageCode, + $objectStateGroupUpdateStruct->names, + $objectStateGroupUpdateStruct->descriptions + ); + + if ( $objectStateGroupUpdateStruct->identifier !== null ) + { + try + { + $existingObjectStateGroup = $this->objectStateHandler->loadGroupByIdentifier( $inputStruct->identifier ); + if ( $existingObjectStateGroup->id != $objectStateGroup->id ) + { + throw new InvalidArgumentException( + "objectStateGroupUpdateStruct", + "Object state group with provided identifier already exists" + ); + } + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $this->repository->beginTransaction(); + try + { + $spiObjectStateGroup = $this->objectStateHandler->updateGroup( + $loadedObjectStateGroup->id, + $inputStruct + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainObjectStateGroupObject( $spiObjectStateGroup ); + } + + /** + * Deletes a object state group including all states and links to content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + */ + public function deleteObjectStateGroup( APIObjectStateGroup $objectStateGroup ) + { + if ( !is_numeric( $objectStateGroup->id ) ) + throw new InvalidArgumentValue( "id", $objectStateGroup->id, "ObjectStateGroup" ); + + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $loadedObjectStateGroup = $this->loadObjectStateGroup( $objectStateGroup->id ); + + $this->repository->beginTransaction(); + try + { + $this->objectStateHandler->deleteGroup( $loadedObjectStateGroup->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Creates a new object state in the given group. + * + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct $objectStateCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function createObjectState( APIObjectStateGroup $objectStateGroup, ObjectStateCreateStruct $objectStateCreateStruct ) + { + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $inputStruct = $this->buildCreateInputStruct( + $objectStateCreateStruct->identifier, + $objectStateCreateStruct->defaultLanguageCode, + $objectStateCreateStruct->names, + $objectStateCreateStruct->descriptions + ); + + try + { + $this->objectStateHandler->loadByIdentifier( $inputStruct->identifier, $objectStateGroup->id ); + throw new InvalidArgumentException( + "objectStateCreateStruct", + "Object state with provided identifier already exists in provided object state group" + ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + $this->repository->beginTransaction(); + try + { + $spiObjectState = $this->objectStateHandler->create( $objectStateGroup->id, $inputStruct ); + + if ( is_numeric( $objectStateCreateStruct->priority ) ) + { + $this->objectStateHandler->setPriority( + $spiObjectState->id, + (int)$objectStateCreateStruct->priority + ); + + // Reload the object state to have the updated priority, + // considering that priorities are always incremental within a group + $spiObjectState = $this->objectStateHandler->load( $spiObjectState->id ); + } + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainObjectStateObject( $spiObjectState ); + } + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function loadObjectState( $stateId ) + { + if ( !is_numeric( $stateId ) ) + throw new InvalidArgumentValue( "stateId", $stateId ); + + $spiObjectState = $this->objectStateHandler->load( $stateId ); + + return $this->buildDomainObjectStateObject( $spiObjectState ); + } + + /** + * Updates an object state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct $objectStateUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function updateObjectState( APIObjectState $objectState, ObjectStateUpdateStruct $objectStateUpdateStruct ) + { + if ( !is_numeric( $objectState->id ) ) + throw new InvalidArgumentValue( "id", $objectState->id, "ObjectState" ); + + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $loadedObjectState = $this->loadObjectState( $objectState->id ); + + $inputStruct = $this->buildObjectStateUpdateInputStruct( + $loadedObjectState, + $objectStateUpdateStruct->identifier, + $objectStateUpdateStruct->defaultLanguageCode, + $objectStateUpdateStruct->names, + $objectStateUpdateStruct->descriptions + ); + + if ( $objectStateUpdateStruct->identifier !== null ) + { + try + { + $existingObjectState = $this->objectStateHandler->loadByIdentifier( + $inputStruct->identifier, + $loadedObjectState->getObjectStateGroup()->id + ); + + if ( $existingObjectState->id != $objectState->id ) + { + throw new InvalidArgumentException( + "objectStateUpdateStruct", + "Object state with provided identifier already exists in provided object state group" + ); + } + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $this->repository->beginTransaction(); + try + { + $spiObjectState = $this->objectStateHandler->update( + $loadedObjectState->id, + $inputStruct + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainObjectStateObject( $spiObjectState ); + } + + /** + * Changes the priority of the state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change priority on an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param int $priority + */ + public function setPriorityOfObjectState( APIObjectState $objectState, $priority ) + { + if ( !is_numeric( $objectState->id ) ) + throw new InvalidArgumentValue( "id", $objectState->id, "ObjectState" ); + + if ( !is_numeric( $priority ) ) + throw new InvalidArgumentValue( "priority", $priority ); + + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $loadedObjectState = $this->loadObjectState( $objectState->id ); + + $this->repository->beginTransaction(); + try + { + $this->objectStateHandler->setPriority( + $loadedObjectState->id, + (int)$priority + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function deleteObjectState( APIObjectState $objectState ) + { + if ( !is_numeric( $objectState->id ) ) + throw new InvalidArgumentValue( "id", $objectState->id, "ObjectState" ); + + if ( $this->repository->hasAccess( 'state', 'administrate' ) !== true ) + throw new UnauthorizedException( 'state', 'administrate' ); + + $loadedObjectState = $this->loadObjectState( $objectState->id ); + + $this->repository->beginTransaction(); + try + { + $this->objectStateHandler->delete( $loadedObjectState->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Sets the object-state of a state group to $state for the given content. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state does not belong to the given group + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change the object state + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function setContentState( ContentInfo $contentInfo, APIObjectStateGroup $objectStateGroup, APIObjectState $objectState ) + { + if ( !is_numeric( $contentInfo->id ) ) + throw new InvalidArgumentValue( "id", $contentInfo->id, "ContentInfo" ); + + if ( !is_numeric( $objectStateGroup->id ) ) + throw new InvalidArgumentValue( "id", $objectStateGroup->id, "ObjectStateGroup" ); + + if ( !is_numeric( $objectState->id ) ) + throw new InvalidArgumentValue( "id", $objectState->id, "ObjectState" ); + + if ( $this->repository->canUser( 'state', 'assign', $contentInfo, $objectState ) !== true ) + throw new UnauthorizedException( 'state', 'assign' ); + + $loadedObjectState = $this->loadObjectState( $objectState->id ); + + if ( $loadedObjectState->getObjectStateGroup()->id != $objectStateGroup->id ) + throw new InvalidArgumentException( "objectState", "Object state does not belong to the given group" ); + + $this->repository->beginTransaction(); + try + { + $this->objectStateHandler->setContentState( + $contentInfo->id, + $objectStateGroup->id, + $loadedObjectState->id + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function getContentState( ContentInfo $contentInfo, APIObjectStateGroup $objectStateGroup ) + { + if ( !is_numeric( $contentInfo->id ) ) + throw new InvalidArgumentValue( "id", $contentInfo->id, "ContentInfo" ); + + if ( !is_numeric( $objectStateGroup->id ) ) + throw new InvalidArgumentValue( "id", $objectStateGroup->id, "ObjectStateGroup" ); + + $spiObjectState = $this->objectStateHandler->getContentState( + $contentInfo->id, + $objectStateGroup->id + ); + + return $this->buildDomainObjectStateObject( $spiObjectState ); + } + + /** + * Returns the number of objects which are in this state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * + * @return int + */ + public function getContentCount( APIObjectState $objectState ) + { + if ( !is_numeric( $objectState->id ) ) + throw new InvalidArgumentValue( "id", $objectState->id, "ObjectState" ); + + return $this->objectStateHandler->getContentCount( + $objectState->id + ); + } + + /** + * Instantiates a new Object State Group Create Struct and sets $identified in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct + */ + public function newObjectStateGroupCreateStruct( $identifier ) + { + $objectStateGroupCreateStruct = new ObjectStateGroupCreateStruct(); + $objectStateGroupCreateStruct->identifier = $identifier; + + return $objectStateGroupCreateStruct; + } + + /** + * Instantiates a new Object State Group Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct + */ + public function newObjectStateGroupUpdateStruct() + { + return new ObjectStateGroupUpdateStruct(); + } + + /** + * Instantiates a new Object State Create Struct and sets $identifier in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct + */ + public function newObjectStateCreateStruct( $identifier ) + { + $objectStateCreateStruct = new ObjectStateCreateStruct(); + $objectStateCreateStruct->identifier = $identifier; + + return $objectStateCreateStruct; + } + + /** + * Instantiates a new Object State Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct + */ + public function newObjectStateUpdateStruct() + { + return new ObjectStateUpdateStruct(); + } + + /** + * Converts the object state SPI value object to API value object + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState $spiObjectState + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + protected function buildDomainObjectStateObject( SPIObjectState $spiObjectState, APIObjectStateGroup $objectStateGroup = null ) + { + $objectStateGroup = $objectStateGroup ?: $this->loadObjectStateGroup( $spiObjectState->groupId ); + + return new ObjectState( + array( + 'id' => (int)$spiObjectState->id, + 'identifier' => $spiObjectState->identifier, + 'priority' => (int)$spiObjectState->priority, + 'defaultLanguageCode' => $spiObjectState->defaultLanguage, + 'languageCodes' => $spiObjectState->languageCodes, + 'names' => $spiObjectState->name, + 'descriptions' => $spiObjectState->description, + 'objectStateGroup' => $objectStateGroup + ) + ); + } + + /** + * Converts the object state group SPI value object to API value object + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\Group $spiObjectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + protected function buildDomainObjectStateGroupObject( SPIObjectStateGroup $spiObjectStateGroup ) + { + return new ObjectStateGroup( + array( + 'id' => (int)$spiObjectStateGroup->id, + 'identifier' => $spiObjectStateGroup->identifier, + 'defaultLanguageCode' => $spiObjectStateGroup->defaultLanguage, + 'languageCodes' => $spiObjectStateGroup->languageCodes, + 'names' => $spiObjectStateGroup->name, + 'descriptions' => $spiObjectStateGroup->description + ) + ); + } + + /** + * Validates input for creating object states/groups and builds the InputStruct object + * + * @param string $identifier + * @param string $defaultLanguageCode + * @param string[] $names + * @param string[] $descriptions + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function buildCreateInputStruct( $identifier, $defaultLanguageCode, $names, $descriptions ) + { + if ( !is_string( $identifier ) || empty( $identifier ) ) + throw new InvalidArgumentValue( "identifier", $identifier ); + + if ( !is_string( $defaultLanguageCode ) || empty( $defaultLanguageCode ) ) + throw new InvalidArgumentValue( "defaultLanguageCode", $defaultLanguageCode ); + + if ( !is_array( $names ) || empty( $names ) ) + throw new InvalidArgumentValue( "names", $names ); + + if ( !isset( $names[$defaultLanguageCode] ) ) + throw new InvalidArgumentValue( "names", $names ); + + foreach ( $names as $languageCode => $name ) + { + try + { + $this->repository->getContentLanguageService()->loadLanguage( $languageCode ); + } + catch ( NotFoundException $e ) + { + throw new InvalidArgumentValue( "names", $names ); + } + + if ( !is_string( $name ) || empty( $name ) ) + throw new InvalidArgumentValue( "names", $names ); + } + + if ( $descriptions !== null && !is_array( $descriptions ) ) + throw new InvalidArgumentValue( "descriptions", $descriptions ); + + $descriptions = $descriptions !== null ? $descriptions : array(); + + $inputStruct = new InputStruct(); + $inputStruct->identifier = $identifier; + $inputStruct->defaultLanguage = $defaultLanguageCode; + $inputStruct->name = $names; + + $inputStruct->description = array(); + foreach ( $names as $languageCode => $name ) + { + if ( isset( $descriptions[$languageCode] ) && !empty( $descriptions[$languageCode] ) ) + $inputStruct->description[$languageCode] = $descriptions[$languageCode]; + else + $inputStruct->description[$languageCode] = ""; + } + + return $inputStruct; + } + + /** + * Validates input for updating object states and builds the InputStruct object + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param string $identifier + * @param string $defaultLanguageCode + * @param string[] $names + * @param string[] $descriptions + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function buildObjectStateUpdateInputStruct( APIObjectState $objectState, $identifier, $defaultLanguageCode, $names, $descriptions ) + { + $inputStruct = new InputStruct(); + + if ( $identifier !== null && ( !is_string( $identifier ) || empty( $identifier ) ) ) + throw new InvalidArgumentValue( "identifier", $identifier ); + + $inputStruct->identifier = $identifier !== null ? $identifier : $objectState->identifier; + + if ( $defaultLanguageCode !== null && ( !is_string( $defaultLanguageCode ) || empty( $defaultLanguageCode ) ) ) + throw new InvalidArgumentValue( "defaultLanguageCode", $defaultLanguageCode ); + + $inputStruct->defaultLanguage = $defaultLanguageCode !== null ? $defaultLanguageCode : $objectState->defaultLanguageCode; + + if ( $names !== null && ( !is_array( $names ) || empty( $names ) ) ) + throw new InvalidArgumentValue( "names", $names ); + + $inputStruct->name = $names !== null ? $names : $objectState->getNames(); + + if ( !isset( $inputStruct->name[$inputStruct->defaultLanguage] ) ) + throw new InvalidArgumentValue( "names", $inputStruct->name ); + + foreach ( $inputStruct->name as $languageCode => $name ) + { + try + { + $this->repository->getContentLanguageService()->loadLanguage( $languageCode ); + } + catch ( NotFoundException $e ) + { + throw new InvalidArgumentValue( "names", $inputStruct->name ); + } + + if ( !is_string( $name ) || empty( $name ) ) + throw new InvalidArgumentValue( "names", $inputStruct->name ); + } + + if ( $descriptions !== null && !is_array( $descriptions ) ) + throw new InvalidArgumentValue( "descriptions", $descriptions ); + + $descriptions = $descriptions !== null ? $descriptions : $objectState->getDescriptions(); + $descriptions = $descriptions !== null ? $descriptions : array(); + + $inputStruct->description = array(); + foreach ( $inputStruct->name as $languageCode => $name ) + { + if ( isset( $descriptions[$languageCode] ) && !empty( $descriptions[$languageCode] ) ) + $inputStruct->description[$languageCode] = $descriptions[$languageCode]; + else + $inputStruct->description[$languageCode] = ""; + } + + return $inputStruct; + } + + /** + * Validates input for updating object state groups and builds the InputStruct object + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param string $identifier + * @param string $defaultLanguageCode + * @param string[] $names + * @param string[] $descriptions + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct + */ + protected function buildObjectStateGroupUpdateInputStruct( APIObjectStateGroup $objectStateGroup, $identifier, $defaultLanguageCode, $names, $descriptions ) + { + $inputStruct = new InputStruct(); + + if ( $identifier !== null && ( !is_string( $identifier ) || empty( $identifier ) ) ) + throw new InvalidArgumentValue( "identifier", $identifier ); + + $inputStruct->identifier = $identifier !== null ? $identifier : $objectStateGroup->identifier; + + if ( $defaultLanguageCode !== null && ( !is_string( $defaultLanguageCode ) || empty( $defaultLanguageCode ) ) ) + throw new InvalidArgumentValue( "defaultLanguageCode", $defaultLanguageCode ); + + $inputStruct->defaultLanguage = $defaultLanguageCode !== null ? $defaultLanguageCode : $objectStateGroup->defaultLanguageCode; + + if ( $names !== null && ( !is_array( $names ) || empty( $names ) ) ) + throw new InvalidArgumentValue( "names", $names ); + + $inputStruct->name = $names !== null ? $names : $objectStateGroup->getNames(); + + if ( !isset( $inputStruct->name[$inputStruct->defaultLanguage] ) ) + throw new InvalidArgumentValue( "names", $inputStruct->name ); + + foreach ( $inputStruct->name as $languageCode => $name ) + { + try + { + $this->repository->getContentLanguageService()->loadLanguage( $languageCode ); + } + catch ( NotFoundException $e ) + { + throw new InvalidArgumentValue( "names", $inputStruct->name ); + } + + if ( !is_string( $name ) || empty( $name ) ) + throw new InvalidArgumentValue( "names", $inputStruct->name ); + } + + if ( $descriptions !== null && !is_array( $descriptions ) ) + throw new InvalidArgumentValue( "descriptions", $descriptions ); + + $descriptions = $descriptions !== null ? $descriptions : $objectStateGroup->getDescriptions(); + $descriptions = $descriptions !== null ? $descriptions : array(); + + $inputStruct->description = array(); + foreach ( $inputStruct->name as $languageCode => $name ) + { + if ( isset( $descriptions[$languageCode] ) && !empty( $descriptions[$languageCode] ) ) + $inputStruct->description[$languageCode] = $descriptions[$languageCode]; + else + $inputStruct->description[$languageCode] = ""; + } + + return $inputStruct; + } +} diff --git a/eZ/Publish/Core/Repository/Repository.php b/eZ/Publish/Core/Repository/Repository.php new file mode 100644 index 0000000..6c88f67 --- /dev/null +++ b/eZ/Publish/Core/Repository/Repository.php @@ -0,0 +1,696 @@ +<?php +/** + * Repository class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\SPI\IO\Handler as IoHandler; +use eZ\Publish\SPI\Persistence\Handler as PersistenceHandler; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\API\Repository\Values\ValueObject; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\Limitation; +use Exception; +use RuntimeException; + +/** + * Repository class + * @package eZ\Publish\Core\Repository + */ +class Repository implements RepositoryInterface +{ + /** + * Repository Handler object + * + * @var \eZ\Publish\SPI\Persistence\Handler + */ + protected $persistenceHandler; + + /** + * Io Handler object + * + * @var \eZ\Publish\SPI\IO\Handler + */ + protected $ioHandler; + + /** + * Currently logged in user object for permission purposes + * + * @var \eZ\Publish\API\Repository\Values\User\User + */ + protected $user; + + /** + * Instance of content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Instance of section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + /** + * Instance of role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * Instance of search service + * + * @var \eZ\Publish\API\Repository\SearchService + */ + protected $searchService; + + /** + * Instance of user service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * Instance of language service + * + * @var \eZ\Publish\API\Repository\LanguageService + */ + protected $languageService; + + /** + * Instance of location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Instance of Trash service + * + * @var \eZ\Publish\API\Repository\TrashService + */ + protected $trashService; + + /** + * Instance of content type service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * Instance of IO service + * + * @var \eZ\Publish\API\Repository\IOService + */ + protected $ioService; + + /** + * Instance of object state service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * Instance of field type service + * + * @var \eZ\Publish\API\Repository\FieldTypeService + */ + protected $fieldTypeService; + + /** + * Instance of name schema resolver service + * + * @var \eZ\Publish\Core\Repository\NameSchemaService + */ + protected $nameSchemaService; + + /** + * Instance of URL alias service + * + * @var \eZ\Publish\Core\Repository\URLAliasService + */ + protected $urlAliasService; + + /** + * Instance of URL wildcard service + * + * @var \eZ\Publish\Core\Repository\URLWildcardService + */ + protected $urlWildcardService; + + /** + * Service settings, first level key is service name + * + * @var array + */ + protected $serviceSettings; + + /** + * Constructor + * + * Construct repository object with provided storage engine + * + * @param \eZ\Publish\SPI\Persistence\Handler $persistenceHandler + * @param \eZ\Publish\SPI\IO\Handler $ioHandler + * @param array $serviceSettings + * @param \eZ\Publish\API\Repository\Values\User\User|null $user + */ + public function __construct( PersistenceHandler $persistenceHandler, IoHandler $ioHandler, array $serviceSettings = array(), User $user = null ) + { + $this->persistenceHandler = $persistenceHandler; + $this->ioHandler = $ioHandler; + $this->serviceSettings = $serviceSettings + array( + 'content' => array(), + 'contentType' => array(), + 'location' => array(), + 'section' => array(), + 'role' => array(), + 'user' => array(), + 'language' => array(), + 'trash' => array(), + 'io' => array(), + 'objectState' => array(), + 'search' => array(), + 'fieldType' => array(), + 'urlAlias' => array(), + 'urlWildcard' => array(), + 'nameSchema' => array( + 'limit' => 0, + 'sequence' => '' + ), + 'languages' => array() + ); + + if ( !empty( $this->serviceSettings['languages'] ) ) + { + $this->serviceSettings['language']['languages'] = $this->serviceSettings['languages']; + } + + if ( $user !== null ) + $this->setCurrentUser( $user ); + } + + /** + * Get current user + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getCurrentUser() + { + if ( !$this->user instanceof User ) + { + $this->user = $this->getUserService()->loadAnonymousUser(); + } + + return $this->user; + } + + /** + * Sets the current user to the given $user. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + */ + public function setCurrentUser( User $user ) + { + if ( !$user->id ) + throw new InvalidArgumentValue( '$user->id', $user->id ); + + $this->user = $user; + } + + /** + * Check if user has access to a given module / function + * + * Low level function, use canUser instead if you have objects to check against. + * + * @param string $module + * @param string $function + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return boolean|array Bool if user has full or no access, array if limitations if not + */ + public function hasAccess( $module, $function, User $user = null ) + { + if ( $user === null ) + $user = $this->getCurrentUser(); + + // Uses SPI to avoid triggering permission checks in Role/User service + $permissionSets = array(); + $roleService = $this->getRoleService(); + $spiRoleAssignments = $this->persistenceHandler->userHandler()->loadRoleAssignmentsByGroupId( $user->id, true ); + foreach ( $spiRoleAssignments as $spiRoleAssignment ) + { + $permissionSet = array( 'limitation' => null, 'policies' => array() ); + foreach ( $spiRoleAssignment->role->policies as $spiPolicy ) + { + if ( $spiPolicy->module === '*' && $spiRoleAssignment->limitationIdentifier === null ) + return true; + + if ( $spiPolicy->module !== $module && $spiPolicy->module !== '*' ) + continue; + + if ( $spiPolicy->function === '*' && $spiRoleAssignment->limitationIdentifier === null ) + return true; + + if ( $spiPolicy->function !== $function && $spiPolicy->function !== '*' ) + continue; + + if ( $spiPolicy->limitations === '*' && $spiRoleAssignment->limitationIdentifier === null ) + return true; + + $permissionSet['policies'][] = $roleService->buildDomainPolicyObject( $spiPolicy ); + } + + if ( !empty( $permissionSet['policies'] ) ) + { + if ( $spiRoleAssignment->limitationIdentifier !== null ) + $permissionSet['limitation'] = $roleService + ->getLimitationType( $spiRoleAssignment->limitationIdentifier ) + ->buildValue( $spiRoleAssignment->values ); + + $permissionSets[] = $permissionSet; + } + } + + if ( !empty( $permissionSets ) ) + return $permissionSets; + + return false;// No policies matching $module and $function, or they contained limitations + } + + /** + * Check if user has access to a given action on a given value object + * + * Indicates if the current user is allowed to perform an action given by the function on the given + * objects. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * + * @param string $module The module, aka controller identifier to check permissions on + * @param string $function The function, aka the controller action to check permissions on + * @param \eZ\Publish\API\Repository\Values\ValueObject $object The object to check if the user has access to + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function canUser( $module, $function, ValueObject $object, ValueObject $target = null ) + { + $permissionSets = $this->hasAccess( $module, $function ); + if ( $permissionSets === false || $permissionSets === true ) + { + return $permissionSets; + } + + $roleService = $this->getRoleService(); + $currentUser = $this->getCurrentUser(); + foreach ( $permissionSets as $permissionSet ) + { + /** + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] $permissionSet + */ + if ( $permissionSet['limitation'] instanceof Limitation ) + { + $type = $roleService->getLimitationType( $permissionSet['limitation']->getIdentifier() ); + if ( !$type->evaluate( $permissionSet['limitation'], $currentUser, $object, $target ) ) + continue; + } + + /** + * @var \eZ\Publish\API\Repository\Values\User\Policy $policy + */ + foreach ( $permissionSet['policies'] as $policy ) + { + $limitations = $policy->getLimitations(); + if ( $limitations === '*' ) + return true; + + $limitationsPass = true; + foreach ( $limitations as $limitation ) + { + $type = $roleService->getLimitationType( $limitation->getIdentifier() ); + if ( !$type->evaluate( $limitation, $currentUser, $object, $target ) ) + { + $limitationsPass = false; + break;// Break to next policy, all limitations must pass + } + } + if ( $limitationsPass ) + return true; + } + } + return false;// None of the limitation sets wanted to let you in, sorry! + } + + /** + * Get Content Service + * + * Get service object to perform operations on Content objects and it's aggregate members. + * + * @return \eZ\Publish\API\Repository\ContentService + */ + public function getContentService() + { + if ( $this->contentService !== null ) + return $this->contentService; + + $this->contentService = new ContentService( $this, $this->persistenceHandler, $this->serviceSettings['content'] ); + return $this->contentService; + } + + /** + * Get Content Language Service + * + * Get service object to perform operations on Content language objects + * + * @return \eZ\Publish\API\Repository\LanguageService + */ + public function getContentLanguageService() + { + if ( $this->languageService !== null ) + return $this->languageService; + + $this->languageService = new LanguageService( + $this, + $this->persistenceHandler->contentLanguageHandler(), + $this->serviceSettings['language'] + ); + return $this->languageService; + } + + /** + * Get Content Type Service + * + * Get service object to perform operations on Content Type objects and it's aggregate members. + * ( Group, Field & FieldCategory ) + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + public function getContentTypeService() + { + if ( $this->contentTypeService !== null ) + return $this->contentTypeService; + + $this->contentTypeService = new ContentTypeService( + $this, + $this->persistenceHandler->contentTypeHandler(), + $this->serviceSettings['contentType'] + ); + return $this->contentTypeService; + } + + /** + * Get Content Location Service + * + * Get service object to perform operations on Location objects and subtrees + * + * @return \eZ\Publish\API\Repository\LocationService + */ + public function getLocationService() + { + if ( $this->locationService !== null ) + return $this->locationService; + + $this->locationService = new LocationService( $this, $this->persistenceHandler, $this->serviceSettings['location'] ); + return $this->locationService; + } + + /** + * Get Content Trash service + * + * Trash service allows to perform operations related to location trash + * (trash/untrash, load/list from trash...) + * + * @return \eZ\Publish\API\Repository\TrashService + */ + public function getTrashService() + { + if ( $this->trashService !== null ) + return $this->trashService; + + $this->trashService = new TrashService( $this, $this->persistenceHandler, $this->serviceSettings['trash'] ); + return $this->trashService; + } + + /** + * Get Content Section Service + * + * Get Section service that lets you manipulate section objects + * + * @return \eZ\Publish\API\Repository\SectionService + */ + public function getSectionService() + { + if ( $this->sectionService !== null ) + return $this->sectionService; + + $this->sectionService = new SectionService( + $this, + $this->persistenceHandler->sectionHandler(), + $this->serviceSettings['section'] + ); + return $this->sectionService; + } + + /** + * Get User Service + * + * Get service object to perform operations on Users and UserGroup + * + * @return \eZ\Publish\API\Repository\UserService + */ + public function getUserService() + { + if ( $this->userService !== null ) + return $this->userService; + + $this->userService = new UserService( + $this, + $this->persistenceHandler->userHandler(), + $this->serviceSettings['user'] + ); + return $this->userService; + } + + /** + * Get URLAliasService + * + * @return \eZ\Publish\API\Repository\URLAliasService + */ + public function getURLAliasService() + { + if ( $this->urlAliasService !== null ) + return $this->urlAliasService; + + $this->urlAliasService = new URLAliasService( + $this, + $this->persistenceHandler->urlAliasHandler(), + $this->serviceSettings['urlAlias'] + ); + return $this->urlAliasService; + } + + /** + * Get URLWildcardService + * + * @return \eZ\Publish\API\Repository\URLWildcardService + */ + public function getURLWildcardService() + { + if ( $this->urlWildcardService !== null ) + return $this->urlWildcardService; + + $this->urlWildcardService = new URLWildcardService( + $this, + $this->persistenceHandler->urlWildcardHandler(), + $this->serviceSettings['urlWildcard'] + ); + return $this->urlWildcardService; + } + + /** + * Get ObjectStateService + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + public function getObjectStateService() + { + if ( $this->objectStateService !== null ) + return $this->objectStateService; + + $this->objectStateService = new ObjectStateService( + $this, $this->persistenceHandler->objectStateHandler(), + $this->serviceSettings['objectState'] + ); + return $this->objectStateService; + } + + /** + * Get IO Service + * + * Get service object to perform operations on binary files + * + * @deprecated Will be removed in the future! + * + * @return \eZ\Publish\API\Repository\IOService + */ + public function getIOService() + { + if ( $this->ioService !== null ) + return $this->ioService; + + $this->ioService = new IOService( $this, $this->ioHandler, $this->serviceSettings['io'] ); + return $this->ioService; + } + + /** + * Get RoleService + * + * @return \eZ\Publish\API\Repository\RoleService + */ + public function getRoleService() + { + if ( $this->roleService !== null ) + return $this->roleService; + + $this->roleService = new RoleService( + $this, + $this->persistenceHandler->userHandler(), + $this->serviceSettings['role'] + ); + return $this->roleService; + } + + /** + * Get SearchService + * + * @return \eZ\Publish\API\Repository\SearchService + */ + public function getSearchService() + { + if ( $this->searchService !== null ) + return $this->searchService; + + $this->searchService = new SearchService( + $this, + $this->persistenceHandler->searchHandler(), + $this->serviceSettings['search'] + ); + return $this->searchService; + } + + /** + * Get FieldTypeService + * + * @return \eZ\Publish\API\Repository\FieldTypeService + */ + public function getFieldTypeService() + { + if ( $this->fieldTypeService !== null ) + return $this->fieldTypeService; + + $this->fieldTypeService = new FieldTypeService( $this, $this->persistenceHandler, $this->serviceSettings['fieldType'] ); + return $this->fieldTypeService; + } + + /** + * Get NameSchemaResolverService + * + * @access private Internal service for the Core Services + * + * @todo Move out from this & other repo instances when services becomes proper services in DIC terms using factory. + * + * @return \eZ\Publish\Core\Repository\NameSchemaService + */ + public function getNameSchemaService() + { + if ( $this->nameSchemaService !== null ) + return $this->nameSchemaService; + + $this->nameSchemaService = new NameSchemaService( $this, $this->serviceSettings['nameSchema'] ); + return $this->nameSchemaService; + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + $this->persistenceHandler->beginTransaction(); + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws RuntimeException If no transaction has been started + */ + public function commit() + { + try + { + $this->persistenceHandler->commit(); + } + catch ( Exception $e ) + { + throw new RuntimeException( $e->getMessage(), 0, $e ); + } + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws RuntimeException If no transaction has been started + */ + public function rollback() + { + try + { + $this->persistenceHandler->rollback(); + } + catch ( Exception $e ) + { + throw new RuntimeException( $e->getMessage(), 0, $e ); + } + } + + /** + * Only for internal use. + * + * Creates a \DateTime object for $timestamp in the current time zone + * + * @param int $timestamp + * + * @return \DateTime + */ + public function createDateTime( $timestamp = null ) + { + $dateTime = new \DateTime(); + if ( $timestamp !== null ) + { + $dateTime->setTimestamp( $timestamp ); + } + return $dateTime; + } +} diff --git a/eZ/Publish/Core/Repository/RoleService.php b/eZ/Publish/Core/Repository/RoleService.php new file mode 100644 index 0000000..78f4b0c --- /dev/null +++ b/eZ/Publish/Core/Repository/RoleService.php @@ -0,0 +1,1028 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\RoleService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\Core\Repository\Values\User\PolicyUpdateStruct; +use eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct as APIPolicyUpdateStruct; +use eZ\Publish\Core\Repository\Values\User\Policy; +use eZ\Publish\API\Repository\Values\User\Policy as APIPolicy; +use eZ\Publish\API\Repository\Values\User\RoleUpdateStruct; +use eZ\Publish\Core\Repository\Values\User\PolicyCreateStruct; +use eZ\Publish\API\Repository\Values\User\PolicyCreateStruct as APIPolicyCreateStruct; +use eZ\Publish\Core\Repository\Values\User\Role; +use eZ\Publish\API\Repository\Values\User\Role as APIRole; +use eZ\Publish\Core\Repository\Values\User\RoleCreateStruct; +use eZ\Publish\API\Repository\Values\User\RoleCreateStruct as APIRoleCreateStruct; +use eZ\Publish\Core\Repository\Values\User\UserRoleAssignment; +use eZ\Publish\Core\Repository\Values\User\UserGroupRoleAssignment; +use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\UserGroup; +use eZ\Publish\SPI\Persistence\User\Policy as SPIPolicy; +use eZ\Publish\SPI\Persistence\User\RoleAssignment as SPIRoleAssignment; +use eZ\Publish\SPI\Persistence\User\Role as SPIRole; +use eZ\Publish\SPI\Persistence\User\RoleUpdateStruct as SPIRoleUpdateStruct; +use eZ\Publish\API\Repository\RoleService as RoleServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\User\Handler; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; + +/** + * This service provides methods for managing Roles and Policies + * + * @package eZ\Publish\Core\Repository + */ +class RoleService implements RoleServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\User\Handler + */ + protected $userHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\User\Handler $userHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $userHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->userHandler = $userHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + 'limitationTypes' => array(), + 'limitationMap' => array(), + ); + } + + /** + * Creates a new Role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\RoleCreateStruct $roleCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function createRole( APIRoleCreateStruct $roleCreateStruct ) + { + if ( !is_string( $roleCreateStruct->identifier ) || empty( $roleCreateStruct->identifier ) ) + throw new InvalidArgumentValue( "identifier", $roleCreateStruct->identifier, "RoleCreateStruct" ); + + if ( $this->repository->hasAccess( 'role', 'create' ) !== true ) + throw new UnauthorizedException( 'role', 'create' ); + + try + { + $existingRole = $this->loadRoleByIdentifier( $roleCreateStruct->identifier ); + if ( $existingRole !== null ) + throw new InvalidArgumentException( "roleCreateStruct", "role with specified identifier already exists" ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + $spiRole = $this->buildPersistenceRoleObject( $roleCreateStruct ); + + $this->repository->beginTransaction(); + try + { + $createdRole = $this->userHandler->createRole( $spiRole ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainRoleObject( $createdRole ); + } + + /** + * Updates the name of the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct $roleUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function updateRole( APIRole $role, RoleUpdateStruct $roleUpdateStruct ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( $roleUpdateStruct->identifier !== null && !is_string( $roleUpdateStruct->identifier ) ) + throw new InvalidArgumentValue( "identifier", $roleUpdateStruct->identifier, "RoleUpdateStruct" ); + + if ( $this->repository->hasAccess( 'role', 'update' ) !== true ) + throw new UnauthorizedException( 'role', 'update' ); + + if ( $roleUpdateStruct->identifier !== null ) + { + try + { + $existingRole = $this->loadRoleByIdentifier( $roleUpdateStruct->identifier ); + if ( $existingRole !== null ) + throw new InvalidArgumentException( "roleUpdateStruct", "role with specified identifier already exists" ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $loadedRole = $this->loadRole( $role->id ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->updateRole( + new SPIRoleUpdateStruct( + array( + 'id' => $loadedRole->id, + 'identifier' => $roleUpdateStruct->identifier ?: $role->identifier + ) + ) + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadRole( $loadedRole->id ); + } + + /** + * Adds a new policy to the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to add a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function addPolicy( APIRole $role, APIPolicyCreateStruct $policyCreateStruct ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( !is_string( $policyCreateStruct->module ) || empty( $policyCreateStruct->module ) ) + throw new InvalidArgumentValue( "module", $policyCreateStruct->module, "PolicyCreateStruct" ); + + if ( !is_string( $policyCreateStruct->function ) || empty( $policyCreateStruct->function ) ) + throw new InvalidArgumentValue( "function", $policyCreateStruct->function, "PolicyCreateStruct" ); + + if ( $policyCreateStruct->module === '*' && $policyCreateStruct->function !== '*' ) + throw new InvalidArgumentValue( "module", $policyCreateStruct->module, "PolicyCreateStruct" ); + + if ( $this->repository->hasAccess( 'role', 'update' ) !== true ) + throw new UnauthorizedException( 'role', 'update' ); + + $loadedRole = $this->loadRole( $role->id ); + + $spiPolicy = $this->buildPersistencePolicyObject( + $policyCreateStruct->module, + $policyCreateStruct->function, + $policyCreateStruct->getLimitations() + ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->addPolicy( $loadedRole->id, $spiPolicy ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadRole( $loadedRole->id ); + } + + /** + * removes a policy from the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy the policy to remove from the role + * + * @return \eZ\Publish\API\Repository\Values\User\Role the updated role + */ + public function removePolicy( APIRole $role, APIPolicy $policy ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( !is_numeric( $policy->id ) ) + throw new InvalidArgumentValue( "id", $policy->id, "Policy" ); + + if ( $this->repository->hasAccess( 'role', 'update' ) !== true ) + throw new UnauthorizedException( 'role', 'update' ); + + $loadedRole = $this->loadRole( $role->id ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->removePolicy( $loadedRole->id, $policy->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadRole( $loadedRole->id ); + } + + /** + * Updates the limitations of a policy. The module and function cannot be changed and + * the limitations are replaced by the ones in $roleUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update a policy + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct $policyUpdateStruct + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function updatePolicy( APIPolicy $policy, APIPolicyUpdateStruct $policyUpdateStruct ) + { + if ( !is_numeric( $policy->id ) ) + throw new InvalidArgumentValue( "id", $policy->id, "Policy" ); + + if ( !is_numeric( $policy->roleId ) ) + throw new InvalidArgumentValue( "roleId", $policy->roleId, "Policy" ); + + if ( !is_string( $policy->module ) ) + throw new InvalidArgumentValue( "module", $policy->module, "Policy" ); + + if ( !is_string( $policy->function ) ) + throw new InvalidArgumentValue( "function", $policy->function, "Policy" ); + + if ( $this->repository->hasAccess( 'role', 'update' ) !== true ) + throw new UnauthorizedException( 'role', 'update' ); + + $spiPolicy = $this->buildPersistencePolicyObject( + $policy->module, + $policy->function, + $policyUpdateStruct->getLimitations() + ); + + $spiPolicy->id = $policy->id; + $spiPolicy->roleId = $policy->roleId; + + $this->repository->beginTransaction(); + try + { + $this->userHandler->updatePolicy( $spiPolicy ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainPolicyObject( $spiPolicy ); + } + + /** + * Loads a role for the given id + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given id was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRole( $id ) + { + if ( !is_numeric( $id ) ) + throw new InvalidArgumentValue( "id", $id ); + + if ( $this->repository->hasAccess( 'role', 'read' ) !== true ) + throw new UnauthorizedException( 'role', 'read' ); + + $spiRole = $this->userHandler->loadRole( $id ); + return $this->buildDomainRoleObject( $spiRole ); + } + + /** + * Loads a role for the given identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRoleByIdentifier( $identifier ) + { + if ( !is_string( $identifier ) ) + throw new InvalidArgumentValue( "identifier", $identifier ); + + if ( $this->repository->hasAccess( 'role', 'read' ) !== true ) + throw new UnauthorizedException( 'role', 'read' ); + + $spiRole = $this->userHandler->loadRoleByIdentifier( $identifier ); + return $this->buildDomainRoleObject( $spiRole ); + } + + /** + * Loads all roles + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the roles + * + * @return \eZ\Publish\API\Repository\Values\User\Role[] + */ + public function loadRoles() + { + if ( $this->repository->hasAccess( 'role', 'read' ) !== true ) + throw new UnauthorizedException( 'role', 'read' ); + + $spiRoles = $this->userHandler->loadRoles(); + + $roles = array(); + foreach ( $spiRoles as $spiRole ) + { + $roles[] = $this->buildDomainRoleObject( $spiRole ); + } + + return $roles; + } + + /** + * Deletes the given role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete this role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + */ + public function deleteRole( APIRole $role ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( $this->repository->hasAccess( 'role', 'delete' ) !== true ) + throw new UnauthorizedException( 'role', 'delete' ); + + $loadedRole = $this->loadRole( $role->id ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->deleteRole( $loadedRole->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Loads all policies from roles which are assigned to a user or to user groups to which the user belongs + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + * + * @param int $userId + * + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function loadPoliciesByUserId( $userId ) + { + if ( !is_numeric( $userId ) ) + throw new InvalidArgumentValue( "userId", $userId ); + + $spiPolicies = $this->userHandler->loadPoliciesByUserId( $userId ); + + $policies = array(); + foreach ( $spiPolicies as $spiPolicy ) + { + $policies[] = $this->buildDomainPolicyObject( $spiPolicy ); + } + + if ( empty( $policies ) ) + $this->userHandler->load( $userId );// For NotFoundException in case userId is invalid + + return $policies; + } + + /** + * Assigns a role to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUserGroup( APIRole $role, UserGroup $userGroup, RoleLimitation $roleLimitation = null ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + if ( $this->repository->canUser( 'role', 'assign', $userGroup, $role ) !== true ) + throw new UnauthorizedException( 'role', 'assign' ); + + $loadedRole = $this->loadRole( $role->id ); + $loadedUserGroup = $this->repository->getUserService()->loadUserGroup( $userGroup->id ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->assignRole( + $loadedUserGroup->id, + $loadedRole->id, + $roleLimitation ? array( $roleLimitation->getIdentifier() => $roleLimitation->limitationValues ) : null + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * removes a role from the given user group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the given user group + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + */ + public function unassignRoleFromUserGroup( APIRole $role, UserGroup $userGroup ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + if ( $this->repository->canUser( 'role', 'assign', $userGroup, $role ) !== true ) + throw new UnauthorizedException( 'role', 'assign' ); + + $spiRole = $this->userHandler->loadRole( $role->id ); + + if ( !in_array( $userGroup->id, $spiRole->groupIds ) ) + throw new InvalidArgumentException( "userGroup", "role is not assigned to the user group" ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->unAssignRole( $userGroup->id, $role->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Assigns a role to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUser( APIRole $role, User $user, RoleLimitation $roleLimitation = null ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + if ( $this->repository->canUser( 'role', 'assign', $user, $role ) !== true ) + throw new UnauthorizedException( 'role', 'assign' ); + + $loadedRole = $this->loadRole( $role->id ); + $loadedUser = $this->repository->getUserService()->loadUser( $user->id ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->assignRole( + $loadedUser->id, + $loadedRole->id, + $roleLimitation ? array( $roleLimitation->getIdentifier() => $roleLimitation->limitationValues ) : null + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * removes a role from the given user. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the user + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + */ + public function unassignRoleFromUser( APIRole $role, User $user ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + if ( $this->repository->canUser( 'role', 'assign', $user, $role ) !== true ) + throw new UnauthorizedException( 'role', 'assign' ); + + $spiRole = $this->userHandler->loadRole( $role->id ); + + if ( !in_array( $user->id, $spiRole->groupIds ) ) + throw new InvalidArgumentException( "user", "role is not assigned to the user" ); + + $this->repository->beginTransaction(); + try + { + $this->userHandler->unAssignRole( $user->id, $role->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Returns the assigned user and user groups to this role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + public function getRoleAssignments( APIRole $role ) + { + if ( !is_numeric( $role->id ) ) + throw new InvalidArgumentValue( "id", $role->id, "Role" ); + + if ( $this->repository->hasAccess( 'role', 'read' ) !== true ) + throw new UnauthorizedException( 'role', 'read' ); + + $userHandler = $this->userHandler; + $spiRole = $userHandler->loadRole( $role->id ); + + $userService = $this->repository->getUserService(); + + $roleAssignments = array(); + foreach ( $spiRole->groupIds as $groupId ) + { + // $spiRole->groupIds can contain both group and user IDs + // We'll check if the ID belongs to group, if not, see if it belongs to user + try + { + $userGroup = $userService->loadUserGroup( $groupId ); + + $spiRoleAssignments = $userHandler->loadRoleAssignmentsByGroupId( $userGroup->id ); + foreach ( $spiRoleAssignments as $spiRoleAssignment ) + { + if ( $spiRoleAssignment->role->id == $role->id ) + { + $roleAssignments[] = $this->buildDomainUserGroupRoleAssignmentObject( + $spiRoleAssignment, + $userGroup, + $role + ); + } + } + } + catch ( APINotFoundException $e ) + { + try + { + $user = $userService->loadUser( $groupId ); + + $spiRoleAssignments = $userHandler->loadRoleAssignmentsByGroupId( $user->id ); + foreach ( $spiRoleAssignments as $spiRoleAssignment ) + { + if ( $spiRoleAssignment->role->id == $role->id ) + { + $roleAssignments[] = $this->buildDomainUserRoleAssignmentObject( + $spiRoleAssignment, + $user, + $role + ); + } + } + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + } + + return $roleAssignments; + } + + /** + * Returns the roles assigned to the given user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param boolean $inherited + * + * @throws \eZ\Publish\Core\Base\Exceptions\UnauthorizedException If the current user is not allowed to read a role + * @throws \eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue On invalid User object + * + * @return \eZ\Publish\API\Repository\Values\User\UserRoleAssignment[] + */ + public function getRoleAssignmentsForUser( User $user, $inherited = false ) + { + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + if ( $this->repository->hasAccess( 'role', 'read' ) !== true ) + throw new UnauthorizedException( 'role', 'read' ); + + $roleAssignments = array(); + $spiRoleAssignments = $this->userHandler->loadRoleAssignmentsByGroupId( $user->id, $inherited ); + foreach ( $spiRoleAssignments as $spiRoleAssignment ) + { + if ( !$inherited || $spiRoleAssignment->contentId == $user->id ) + $roleAssignments[] = $this->buildDomainUserRoleAssignmentObject( $spiRoleAssignment, $user ); + else + $roleAssignments[] = $this->buildDomainUserGroupRoleAssignmentObject( $spiRoleAssignment ); + } + + return $roleAssignments; + } + + /** + * Returns the roles assigned to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a role + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment[] + */ + public function getRoleAssignmentsForUserGroup( UserGroup $userGroup ) + { + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + if ( $this->repository->hasAccess( 'role', 'read' ) !== true ) + throw new UnauthorizedException( 'role', 'read' ); + + $roleAssignments = array(); + $spiRoleAssignments = $this->userHandler->loadRoleAssignmentsByGroupId( $userGroup->id ); + foreach ( $spiRoleAssignments as $spiRoleAssignment ) + { + $roleAssignments[] = $this->buildDomainUserGroupRoleAssignmentObject( $spiRoleAssignment, $userGroup ); + } + + return $roleAssignments; + } + + /** + * Instantiates a role create class + * + * @param string $name + * + * @return \eZ\Publish\API\Repository\Values\User\RoleCreateStruct + */ + public function newRoleCreateStruct( $name ) + { + return new RoleCreateStruct( + array( + 'identifier' => $name, + 'policies' => array() + ) + ); + } + + /** + * Instantiates a policy create class + * + * @param string $module + * @param string $function + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct + */ + public function newPolicyCreateStruct( $module, $function ) + { + return new PolicyCreateStruct( + array( + 'module' => $module, + 'function' => $function, + 'limitations' => array() + ) + ); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct + */ + public function newPolicyUpdateStruct() + { + return new PolicyUpdateStruct( + array( + 'limitations' => array() + ) + ); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct + */ + public function newRoleUpdateStruct() + { + return new RoleUpdateStruct(); + } + + /** + * Maps provided SPI Role value object to API Role value object + * + * @param \eZ\Publish\SPI\Persistence\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + protected function buildDomainRoleObject( SPIRole $role ) + { + $rolePolicies = array(); + foreach ( $role->policies as $spiPolicy ) + { + $rolePolicies[] = $this->buildDomainPolicyObject( $spiPolicy, $role ); + } + + return new Role( + array( + 'id' => (int)$role->id, + 'identifier' => $role->identifier, + 'policies' => $rolePolicies + ) + ); + } + + /** + * Maps provided SPI Policy value object to API Policy value object + * + * @access private Only accessible for other services and the internals of the repository + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * @param \eZ\Publish\SPI\Persistence\User\Role|null $role + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function buildDomainPolicyObject( SPIPolicy $policy, SPIRole $role = null ) + { + $policyLimitations = array(); + if ( $policy->module !== '*' && $policy->function !== '*' && $policy->limitations !== '*' ) + { + foreach ( $policy->limitations as $identifier => $values ) + { + $policyLimitations[] = $this->getLimitationType( $identifier )->buildValue( $values ); + } + } + + return new Policy( + array( + 'id' => (int)$policy->id, + 'roleId' => $role !== null ? (int)$role->id : (int)$policy->roleId, + 'module' => $policy->module, + 'function' => $policy->function, + 'limitations' => $policyLimitations + ) + ); + } + + /** + * Builds the API UserRoleAssignment object from provided SPI RoleAssignment object + * + * @param \eZ\Publish\SPI\Persistence\User\RoleAssignment $spiRoleAssignment + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\UserRoleAssignment + */ + public function buildDomainUserRoleAssignmentObject( SPIRoleAssignment $spiRoleAssignment, User $user = null, APIRole $role = null ) + { + $limitation = null; + if ( !empty( $spiRoleAssignment->limitationIdentifier ) ) + { + $limitation = $this + ->getLimitationType( $spiRoleAssignment->limitationIdentifier ) + ->buildValue( $spiRoleAssignment->values ); + } + + $user = $user ?: $this->repository->getUserService()->loadUser( $spiRoleAssignment->contentId ); + $role = $role ?: $this->buildDomainRoleObject( $spiRoleAssignment->role ); + + return new UserRoleAssignment( + array( + 'limitation' => $limitation, + 'role' => $role, + 'user' => $user + ) + ); + } + + /** + * Builds the API UserGroupRoleAssignment object from provided SPI RoleAssignment object + * + * @param \eZ\Publish\SPI\Persistence\User\RoleAssignment $spiRoleAssignment + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment + */ + public function buildDomainUserGroupRoleAssignmentObject( SPIRoleAssignment $spiRoleAssignment, UserGroup $userGroup = null, APIRole $role = null ) + { + $limitation = null; + if ( !empty( $spiRoleAssignment->limitationIdentifier ) ) + { + $limitation = $this + ->getLimitationType( $spiRoleAssignment->limitationIdentifier ) + ->buildValue( $spiRoleAssignment->values ); + } + + $userGroup = $userGroup ?: $this->repository->getUserService()->loadUserGroup( $spiRoleAssignment->contentId ); + $role = $role ?: $this->buildDomainRoleObject( $spiRoleAssignment->role ); + + return new UserGroupRoleAssignment( + array( + 'limitation' => $limitation, + 'role' => $role, + 'userGroup' => $userGroup + ) + ); + } + + /** + * Returns the LimitationType registered with the given identifier + * + * Returns the correct implementation of API Limitation value object + * based on provided identifier + * + * @param string $identifier + * + * @return \eZ\Publish\SPI\Limitation\Type + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if there is no LimitationType with $identifier + */ + public function getLimitationType( $identifier ) + { + if ( !isset( $this->settings['limitationTypes'][$identifier] ) ) + throw new NotFoundException( 'Limitation', $identifier ); + + return $this->settings['limitationTypes'][$identifier]; + } + + /** + * Returns the LimitationType's assigned to a given module/function + * + * Typically used for: + * - Internal validation limitation value use on Policies + * - Role admin gui for editing policy limitations incl list limitation options via valueSchema() + * + * @param string $module Legacy name of "controller", it's a unique identifier like "content" + * @param string $function Legacy name of a controller "action", it's a unique within the controller like "read" + * + * @return \eZ\Publish\SPI\Limitation\Type[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If module/function to limitation type mapping + * refers to a non existing identifier. + */ + public function getLimitationTypesByModuleFunction( $module, $function ) + { + if ( empty( $this->settings['limitationMap'][$module][$function] ) ) + return array(); + + $types = array(); + foreach ( $this->settings['limitationMap'][$module][$function] as $identifier ) + { + if ( !isset( $this->settings['limitationTypes'][$identifier] ) ) + { + throw new \eZ\Publish\Core\Base\Exceptions\BadStateException( + '$identifier', + "'{$identifier}' does not exists but was configured as limitation on {$module}/{$function}" + ); + } + $types[$identifier] = $this->settings['limitationTypes'][$identifier]; + } + return $types; + } + + /** + * Creates SPI Role value object from provided API role create struct + * + * @param \eZ\Publish\API\Repository\Values\User\RoleCreateStruct $roleCreateStruct + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + protected function buildPersistenceRoleObject( APIRoleCreateStruct $roleCreateStruct ) + { + $policiesToCreate = array(); + foreach ( $roleCreateStruct->getPolicies() as $policyCreateStruct ) + { + $policiesToCreate[] = $this->buildPersistencePolicyObject( + $policyCreateStruct->module, + $policyCreateStruct->function, + $policyCreateStruct->getLimitations() + ); + } + + return new SPIRole( + array( + 'identifier' => $roleCreateStruct->identifier, + 'policies' => $policiesToCreate + ) + ); + } + + /** + * Creates SPI Policy value object from provided module, function and limitations + * + * @param string $module + * @param string $function + * @param \eZ\Publish\API\Repository\Values\User\Limitation[] $limitations + * + * @return \eZ\Publish\SPI\Persistence\User\Policy + */ + protected function buildPersistencePolicyObject( $module, $function, array $limitations ) + { + $limitationsToCreate = '*'; + if ( $module !== '*' && $function !== '*' && !empty( $limitations ) ) + { + $limitationsToCreate = array(); + foreach ( $limitations as $limitation ) + { + $limitationsToCreate[$limitation->getIdentifier()] = $limitation->limitationValues; + } + } + + return new SPIPolicy( + array( + 'module' => $module, + 'function' => $function, + 'limitations' => $limitationsToCreate + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/SearchService.php b/eZ/Publish/Core/Repository/SearchService.php new file mode 100644 index 0000000..0f39ec9 --- /dev/null +++ b/eZ/Publish/Core/Repository/SearchService.php @@ -0,0 +1,247 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\SearchService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\SearchService as SearchServiceInterface; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\User\Limitation; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\API\Repository\Values\Content\Search\SearchResult; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\SPI\Persistence\Content\Search\Handler; + +/** + * Search service + * + * @package eZ\Publish\Core\Repository + */ +class SearchService implements SearchServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\Search\Handler + */ + protected $searchHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\Search\Handler $searchHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $searchHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->searchHandler = $searchHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array(), $filterOnUserPermissions = true ) + { + if ( $filterOnUserPermissions && !$this->addPermissionsCriterion( $query->criterion ) ) + { + return new SearchResult( array( 'time' => 0, 'totalCount' => 0 ) ); + } + + $result = $this->searchHandler->findContent( $query, $fieldFilters ); + foreach ( $result->searchHits as $hit ) + { + $hit->valueObject = $this->repository->getContentService()->buildContentDomainObject( + $hit->valueObject + ); + } + + return $result; + } + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Criterion $criterion, array $fieldFilters = array(), $filterOnUserPermissions = true ) + { + if ( $filterOnUserPermissions && !$this->addPermissionsCriterion( $criterion ) ) + { + throw new NotFoundException( 'Content', '*' ); + } + + return $this->repository->getContentService()->buildContentDomainObject( + $this->searchHandler->findSingle( $criterion, $fieldFilters ) + ); + } + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldPaths + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ) + { + + } + + /** + * Adds content, read Permission criteria if needed and return false if no access at all + * + * @access private Temporarily made accessible until Location service stops using searchHandler() + * @uses getPermissionsCriterion() + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * + * @return boolean|\eZ\Publish\API\Repository\Values\Content\Query\Criterion + */ + public function addPermissionsCriterion( Criterion &$criterion ) + { + $permissionCriterion = $this->getPermissionsCriterion(); + if ( $permissionCriterion === true || $permissionCriterion === false ) + { + return $permissionCriterion; + } + + // Merge with original $criterion + if ( $criterion instanceof Criterion\LogicalAnd ) + { + $criterion->criteria[] = $permissionCriterion; + } + else + { + $criterion = new Criterion\LogicalAnd( + array( + $criterion, + $permissionCriterion + ) + ); + } + return true; + } + + /** + * Get content-read Permission criteria if needed and return false if no access at all + * + * @access private Temporarily made accessible until Location service stops using searchHandler() + * + * @uses \eZ\Publish\API\Repository::hasAccess() + * @throws \RuntimeException If empty array of limitations are provided from hasAccess() + * + * @return boolean|\eZ\Publish\API\Repository\Values\Content\Query\Criterion + */ + public function getPermissionsCriterion( $module = 'content', $function = 'read' ) + { + $permissionSets = $this->repository->hasAccess( $module, $function ); + if ( $permissionSets === false || $permissionSets === true ) + { + return $permissionSets; + } + + if ( empty( $permissionSets ) ) + throw new \RuntimeException( "Got an empty array of limitations from hasAccess( '{$module}', '{$function}' )" ); + + /** + * RoleAssignment is a OR condition, so is policy, while limitations is a AND condition + * + * If RoleAssignment has limitation then policy OR conditions are wrapped in a AND condition with the + * role limitation, otherwise it will be merged into RoleAssignment's OR condition. + */ + $currentUser = $this->repository->getCurrentUser(); + $roleAssignmentOrCriteria = array(); + $roleService = $this->repository->getRoleService(); + foreach ( $permissionSets as $permissionSet ) + { + $policyOrCriteria = array(); + /** + * @var \eZ\Publish\API\Repository\Values\User\Policy $policy + */ + foreach ( $permissionSet['policies'] as $policy ) + { + $limitations = $policy->getLimitations(); + if ( $limitations === '*' ) + continue; + + $limitationsAndCriteria = array(); + foreach ( $limitations as $limitation ) + { + $type = $roleService->getLimitationType( $limitation->getIdentifier() ); + $limitationsAndCriteria[] = $type->getCriterion( $limitation, $currentUser ); + } + $policyOrCriteria[] = isset( $limitationsAndCriteria[1] ) ? + new Criterion\LogicalAnd( $limitationsAndCriteria ) : + $limitationsAndCriteria[0]; + } + + if ( empty( $policyOrCriteria ) ) + continue; + + /** + * Apply role limitations if there is one + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] $permissionSet + */ + if ( $permissionSet['limitation'] instanceof Limitation ) + { + $type = $roleService->getLimitationType( $permissionSet['limitation']->getIdentifier() ); + $roleAssignmentOrCriteria[] = new Criterion\LogicalAnd( + array( + $type->getCriterion( $permissionSet['limitation'], $currentUser ), + isset( $policyOrCriteria[1] ) ? new Criterion\LogicalOr( $policyOrCriteria ) : $policyOrCriteria[0] + ) + ); + } + // Otherwise merge $policyOrCriteria into $roleAssignmentOrCriteria + else + { + $roleAssignmentOrCriteria = empty( $roleAssignmentOrCriteria ) ? + $policyOrCriteria : + array_merge( $roleAssignmentOrCriteria, $policyOrCriteria ); + } + } + + return isset( $roleAssignmentOrCriteria[1] ) ? + new Criterion\LogicalOr( $roleAssignmentOrCriteria ) : + $roleAssignmentOrCriteria[0]; + } +} diff --git a/eZ/Publish/Core/Repository/SectionService.php b/eZ/Publish/Core/Repository/SectionService.php new file mode 100644 index 0000000..6021efb --- /dev/null +++ b/eZ/Publish/Core/Repository/SectionService.php @@ -0,0 +1,378 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\SectionService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\Values\Content\SectionCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\Section; +use eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct; +use eZ\Publish\API\Repository\SectionService as SectionServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Content\Section\Handler; +use eZ\Publish\SPI\Persistence\Content\Section as SPISection; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\BadStateException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException as APINotFoundException; + +/** + * Section service, used for section operations + * + * @package eZ\Publish\Core\Repository + */ +class SectionService implements SectionServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + protected $sectionHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\Section\Handler $sectionHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $sectionHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->sectionHandler = $sectionHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Creates a new Section in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier in $sectionCreateStruct already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct $sectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section The newly created section + */ + public function createSection( SectionCreateStruct $sectionCreateStruct ) + { + if ( !is_string( $sectionCreateStruct->name ) || empty( $sectionCreateStruct->name ) ) + throw new InvalidArgumentValue( "name", $sectionCreateStruct->name, "SectionCreateStruct" ); + + if ( !is_string( $sectionCreateStruct->identifier ) || empty( $sectionCreateStruct->identifier ) ) + throw new InvalidArgumentValue( "identifier", $sectionCreateStruct->identifier, "SectionCreateStruct" ); + + if ( $this->repository->hasAccess( 'section', 'edit' ) !== true ) + throw new UnauthorizedException( 'section', 'edit' ); + + try + { + $existingSection = $this->loadSectionByIdentifier( $sectionCreateStruct->identifier ); + if ( $existingSection !== null ) + throw new InvalidArgumentException( "sectionCreateStruct", "section with specified identifier already exists" ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + + $this->repository->beginTransaction(); + try + { + $spiSection = $this->sectionHandler->create( + $sectionCreateStruct->name, + $sectionCreateStruct->identifier + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainSectionObject( $spiSection ); + } + + /** + * Updates the given section in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier already exists (if set in the update struct) + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * @param \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct $sectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function updateSection( Section $section, SectionUpdateStruct $sectionUpdateStruct ) + { + if ( !is_numeric( $section->id ) ) + throw new InvalidArgumentValue( "id", $section->id, "Section" ); + + if ( $sectionUpdateStruct->name !== null && !is_string( $sectionUpdateStruct->name ) ) + throw new InvalidArgumentValue( "name", $section->name, "Section" ); + + if ( $sectionUpdateStruct->identifier !== null && !is_string( $sectionUpdateStruct->identifier ) ) + throw new InvalidArgumentValue( "identifier", $section->identifier, "Section" ); + + if ( $this->repository->canUser( 'section', 'edit', $section ) !== true ) + throw new UnauthorizedException( 'section', 'edit' ); + + if ( $sectionUpdateStruct->identifier !== null ) + { + try + { + $existingSection = $this->loadSectionByIdentifier( $sectionUpdateStruct->identifier ); + if ( $existingSection !== null ) + throw new InvalidArgumentException( "sectionUpdateStruct", "section with specified identifier already exists" ); + } + catch ( APINotFoundException $e ) + { + // Do nothing + } + } + + $loadedSection = $this->loadSection( $section->id ); + + $this->repository->beginTransaction(); + try + { + $spiSection = $this->sectionHandler->update( + $loadedSection->id, + $sectionUpdateStruct->name ?: $loadedSection->name, + $sectionUpdateStruct->identifier ?: $loadedSection->identifier + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainSectionObject( $spiSection ); + } + + /** + * Loads a Section from its id ($sectionId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param int $sectionId + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSection( $sectionId ) + { + if ( !is_numeric( $sectionId ) ) + throw new InvalidArgumentValue( "sectionId", $sectionId ); + + if ( $this->repository->hasAccess( 'section', 'view' ) !== true ) + throw new UnauthorizedException( 'section', 'view' ); + + $spiSection = $this->sectionHandler->load( $sectionId ); + return $this->buildDomainSectionObject( $spiSection ); + } + + /** + * Loads all sections + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @return \eZ\Publish\API\Repository\Values\Content\Section[] + */ + public function loadSections() + { + if ( $this->repository->hasAccess( 'section', 'view' ) !== true ) + throw new UnauthorizedException( 'section', 'view' ); + + $spiSections = $this->sectionHandler->loadAll(); + + $sections = array(); + foreach ( $spiSections as $spiSection ) + { + $sections[] = $this->buildDomainSectionObject( $spiSection ); + } + + return $sections; + } + + /** + * Loads a Section from its identifier ($sectionIdentifier) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param string $sectionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSectionByIdentifier( $sectionIdentifier ) + { + if ( !is_string( $sectionIdentifier ) || empty( $sectionIdentifier ) ) + throw new InvalidArgumentValue( "sectionIdentifier", $sectionIdentifier ); + + if ( $this->repository->hasAccess( 'section', 'view' ) !== true ) + throw new UnauthorizedException( 'section', 'view' ); + + $spiSection = $this->sectionHandler->loadByIdentifier( $sectionIdentifier ); + return $this->buildDomainSectionObject( $spiSection ); + } + + /** + * Counts the contents which $section is assigned to + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * + * @return int + */ + public function countAssignedContents( Section $section ) + { + if ( !is_numeric( $section->id ) ) + throw new InvalidArgumentValue( "id", $section->id, "Section" ); + + return $this->sectionHandler->assignmentsCount( $section->id ); + } + + /** + * Assigns the content to the given section + * this method overrides the current assigned section + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to view provided object + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function assignSection( ContentInfo $contentInfo, Section $section ) + { + if ( !is_numeric( $contentInfo->id ) ) + throw new InvalidArgumentValue( "id", $contentInfo->id, "ContentInfo" ); + + if ( !is_numeric( $section->id ) ) + throw new InvalidArgumentValue( "id", $section->id, "Section" ); + + $loadedContentInfo = $this->repository->getContentService()->loadContentInfo( $contentInfo->id ); + $loadedSection = $this->loadSection( $section->id ); + + if ( $this->repository->canUser( 'section', 'assign', $loadedContentInfo, $loadedSection ) !== true ) + { + throw new UnauthorizedException( + 'section', 'assign', + array( + 'name' => $loadedSection->name, + 'content-name' => $loadedContentInfo->name + ) + ); + } + + $this->repository->beginTransaction(); + try + { + $this->sectionHandler->assign( + $loadedSection->id, + $loadedContentInfo->id + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Deletes $section from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified section is not found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user is not allowed to delete a section + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If section can not be deleted + * because it is still assigned to some contents. + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function deleteSection( Section $section ) + { + if ( !is_numeric( $section->id ) ) + throw new InvalidArgumentValue( "id", $section->id, "Section" ); + + $loadedSection = $this->loadSection( $section->id ); + + if ( $this->repository->canUser( 'section', 'edit', $loadedSection ) !== true ) + throw new UnauthorizedException( 'section', 'edit', array( 'name' => $loadedSection->name ) ); + + if ( $this->countAssignedContents( $loadedSection ) > 0 ) + throw new BadStateException( "section", 'section is still assigned to content' ); + + $this->repository->beginTransaction(); + try + { + $this->sectionHandler->delete( $loadedSection->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Instantiates a new SectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct + */ + public function newSectionCreateStruct() + { + return new SectionCreateStruct(); + } + + /** + * Instantiates a new SectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct + */ + public function newSectionUpdateStruct() + { + return new SectionUpdateStruct(); + } + + /** + * Builds API Section object from provided SPI Section object + * + * @param \eZ\Publish\SPI\Persistence\Content\Section $spiSection + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + protected function buildDomainSectionObject( SPISection $spiSection ) + { + return new Section( + array( + 'id' => (int)$spiSection->id, + 'identifier' => $spiSection->identifier, + 'name' => $spiSection->name + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Base.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Base.php new file mode 100644 index 0000000..98eae23 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Base.php @@ -0,0 +1,212 @@ +<?php +/** + * File contains: Abstract Base service test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use PHPUnit_Framework_TestCase; +use eZ\Publish\API\Repository\Values\ValueObject; +use eZ\Publish\Core\Repository\Values\User\User; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; + +/** + * Base test case for tests on services + * Initializes repository + */ +abstract class Base extends PHPUnit_Framework_TestCase +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * Setup test + */ + protected function setUp() + { + parent::setUp(); + $this->repository = static::getRepository(); + $this->repository->setCurrentUser( $this->getStubbedUser( 14 ) ); + } + + /** + * Returns User stub with $id as User/Content id + * + * @param int $id + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + protected function getStubbedUser( $id ) + { + return new User( + array( + 'content' => new Content( + array( + 'versionInfo' => new VersionInfo( + array( + 'contentInfo' => new ContentInfo( array( 'id' => $id ) ) + ) + ), + 'internalFields' => array() + ) + ) + ) + ); + } + + /** + * @return \eZ\Publish\Core\Repository\Values\User\User + */ + protected function createUserVersion1() + { + $repository = $this->repository; + + /* BEGIN: Inline */ + // ID of the "Editors" user group in an eZ Publish demo installation + $editorsGroupId = 13; + + $userService = $repository->getUserService(); + + // Instantiate a create struct with mandatory properties + $userCreate = $userService->newUserCreateStruct( + 'user', + 'user@example.com', + 'secret', + 'eng-US' + ); + $userCreate->enabled = true; + + // Set some fields required by the user ContentType + $userCreate->setField( 'first_name', 'Example' ); + $userCreate->setField( 'last_name', 'User' ); + + // Load parent group for the user + $group = $userService->loadUserGroup( $editorsGroupId ); + + // Create a new user instance. + $user = $userService->createUser( $userCreate, array( $group ) ); + /* END: Inline */ + + return $user; + } + + /** + * Tear down test (properties) + */ + protected function tearDown() + { + unset( $this->repository ); + parent::tearDown(); + } + + /** + * Generate \eZ\Publish\API\Repository\Repository + * + * Makes it possible to inject different Io / Persistence handlers + * + * @return \eZ\Publish\API\Repository\Repository + */ + abstract protected function getRepository(); + + /** + * Asserts that properties given in $expectedValues are correctly set in + * $actualObject. + * + * @param mixed[] $expectedValues + * @param \eZ\Publish\API\Repository\Values\ValueObject $actualObject + * @param array $skipProperties + * + * @return void + */ + protected function assertPropertiesCorrect( array $expectedValues, ValueObject $actualObject, array $skipProperties = array() ) + { + foreach ( $expectedValues as $propertyName => $propertyValue ) + { + if ( in_array( $propertyName, $skipProperties ) ) continue; + + $this->assertProperty( + $propertyName, $propertyValue, $actualObject->$propertyName + ); + } + } + + protected function assertSameClassPropertiesCorrect( + array $propertiesNames, + ValueObject $expectedValues, + ValueObject $actualObject, + array $skipProperties = array(), + $equal = true + ) + { + foreach ( $propertiesNames as $propertyName ) + { + if ( in_array( $propertyName, $skipProperties ) ) continue; + + $this->assertProperty( + $propertyName, $expectedValues->$propertyName, $actualObject->$propertyName, $equal + ); + } + } + + /** + * Asserts all properties from $expectedValues are correctly set in + * $actualObject. + * + * @param \eZ\Publish\API\Repository\Values\ValueObject $expectedValues + * @param \eZ\Publish\API\Repository\Values\ValueObject $actualObject + * @param array $skipProperties + * + * @return void + */ + protected function assertStructPropertiesCorrect( ValueObject $expectedValues, ValueObject $actualObject, array $skipProperties = array() ) + { + foreach ( $expectedValues as $propertyName => $propertyValue ) + { + if ( in_array( $propertyName, $skipProperties ) ) continue; + + $this->assertProperty( + $propertyName, $propertyValue, $actualObject->$propertyName + ); + } + } + + private function assertProperty( $propertyName, $expectedValue, $actualValue, $equal = true ) + { + if ( $expectedValue instanceof \ArrayObject ) + { + $expectedValue = $expectedValue->getArrayCopy(); + } + if ( $actualValue instanceof \ArrayObject ) + { + $actualValue = $actualValue->getArrayCopy(); + } + + if ( $equal ) + $this->assertEquals( + $expectedValue, + $actualValue, + sprintf( 'Object property "%s" incorrect.', $propertyName ) + ); + else + $this->assertNotEquals( + $expectedValue, + $actualValue, + sprintf( 'Object property "%s" incorrect.', $propertyName ) + ); + } + + protected function getDateTime( $timestamp ) + { + $dateTime = new \DateTime(); + $dateTime->setTimestamp( $timestamp ); + return $dateTime; + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/ContentBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/ContentBase.php new file mode 100644 index 0000000..4825c8d --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/ContentBase.php @@ -0,0 +1,2860 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\ContentBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Content as APIContent; +use eZ\Publish\API\Repository\Values\Content\Relation; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for Content service + */ +abstract class ContentBase extends BaseServiceTest +{ + protected $testContentType; + + protected function getContentInfoExpectedValues() + { + // Legacy fixture content ID=4 values + return array( + "id" => 4, + "name" => "Users", + "sectionId" => 2, + "currentVersionNo" => 1, + "published" => true, + "ownerId" => 14, + "modificationDate" => $this->getDateTime( 1033917596 ), + "publishedDate" => $this->getDateTime( 1033917596 ), + "alwaysAvailable" => true, + "remoteId" => "f5c88a2209584891056f987fd965b0ba", + "mainLanguageCode" => "eng-US", + "mainLocationId" => 5 + ); + } + + /** + * @param boolean $draft + * + * @return array + */ + protected function getVersionInfoExpectedValues( $draft = false ) + { + // Legacy fixture content 4 current version (1) values + $values = array( + //"id" => 4, + "versionNo" => 1, + "modificationDate" => $this->getDateTime( 0 ), + "creatorId" => 14, + "creationDate" => $this->getDateTime( 0 ), + "status" => VersionInfo::STATUS_PUBLISHED, + "initialLanguageCode" => "eng-US", + "languageCodes" => array( "eng-US" ), + // Implementation properties + "names" => array( "eng-US" => "Users" ) + ); + + if ( $draft ) + { + //$values["id"] = 675; + $values["creatorId"] = $this->repository->getCurrentUser()->id; + $values["versionNo"] = 2; + $values["status"] = VersionInfo::STATUS_DRAFT; + unset( $values["modificationDate"] ); + unset( $values["creationDate"] ); + } + + return $values; + } + + /** + * @param array $languages + * + * @return mixed + */ + protected function getFieldValuesExpectedValues( array $languages = null ) + { + // Legacy fixture content ID=4 field values + $fieldValues = array( + "eng-US" => array( + "name" => array( "eng-US" => "Users" ), + "description" => array( "eng-US" => "Main group" ) + ) + ); + + $returnArray = array(); + foreach ( $fieldValues as $languageCode => $languageFieldValues ) + { + if ( !empty( $languages ) && !in_array( $languageCode, $languages ) ) continue; + $returnArray = array_merge_recursive( $returnArray, $languageFieldValues ); + } + return $returnArray; + } + + protected function getExpectedContentType() + { + + } + + /** + * Test for the loadContentInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function testLoadContentInfo() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\ContentInfo', + $contentInfo + ); + + return $contentInfo; + } + + /** + * Test for the loadContentInfo() method. + * + * @depends testLoadContentInfo + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfo + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return void + */ + public function testLoadContentInfoValues( $contentInfo ) + { + $this->assertPropertiesCorrect( + $this->getContentInfoExpectedValues(), + $contentInfo + ); + } + + /** + * Test for the loadContentInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfo + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return void + */ + public function testLoadContentInfoThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because given contentId does not exist + $contentInfo = $contentService->loadContentInfo( PHP_INT_MAX ); + /* END: Use Case */ + } + + /** + * Test for the loadContentInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfo + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * + * @return void + */ + public function testLoadContentInfoThrowsUnauthorizedException() + { + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->loadContentInfo( 4 ); + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfoByRemoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function testLoadContentInfoByRemoteId() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfoByRemoteId( "f5c88a2209584891056f987fd965b0ba" ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\ContentInfo', + $contentInfo + ); + + return $contentInfo; + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @depends testLoadContentInfoByRemoteId + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfoByRemoteId + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return void + */ + public function testLoadContentInfoByRemoteIdValues( $contentInfo ) + { + $this->assertPropertiesCorrect( + $this->getContentInfoExpectedValues(), + $contentInfo + ); + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfoByRemoteId + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return void + */ + public function testLoadContentInfoByRemoteIdThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because remoteId does not exist + $contentInfo = $contentService->loadContentInfoByRemoteId( "this-remote-id-does-not-exist" ); + /* END: Use Case */ + } + + /** + * Test for the loadContentInfoByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentInfoByRemoteId + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * + * @return void + */ + public function testLoadContentInfoByRemoteIdThrowsUnauthorizedException() + { + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->loadContentInfoByRemoteId( "f5c88a2209584891056f987fd965b0ba" ); + } + + /** + * Test for the loadVersionInfoById() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfoById + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function testLoadVersionInfoById() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( 4 ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo', + $versionInfo + ); + + return $versionInfo; + } + + /** + * Test for the loadVersionInfoById() method. + * + * @depends testLoadVersionInfoById + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfoById + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return void + */ + public function testLoadVersionInfoByIdValues( $versionInfo ) + { + $this->assertPropertiesCorrect( + $this->getVersionInfoExpectedValues(), + $versionInfo + ); + } + + /** + * Test for the loadVersionInfoById() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfoById + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function testLoadVersionInfoByIdWithSecondParameter() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( 4, 1 ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\VersionInfo', + $versionInfo + ); + + return $versionInfo; + } + + /** + * Test for the loadVersionInfoById() method. + * + * @depends testLoadVersionInfoByIdWithSecondParameter + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfoById + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return void + */ + public function testLoadVersionInfoByIdWithSecondParameterValues( $versionInfo ) + { + $this->assertPropertiesCorrect( + $this->getVersionInfoExpectedValues(), + $versionInfo + ); + } + + /** + * Test for the loadVersionInfoById() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfoById + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return void + */ + public function testLoadVersionInfoByIdThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because version with given number does not exists + $versionInfo = $contentService->loadVersionInfoById( 4, PHP_INT_MAX ); + /* END: Use Case */ + } + + /** + * Test for the loadVersionInfoById() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfoById + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * + * @return void + */ + public function testLoadVersionInfoByIdThrowsUnauthorizedException() + { + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->loadVersionInfoById( 4 ); + } + + /** + * Data provider for testLoadContent() + * + * @return array + */ + public function testLoadContentArgumentsProvider() + { + return array( + array( 4, null, null ), + array( 4, array( "eng-US" ), null ), + array( 4, null, 1 ), + array( 4, array( "eng-US" ), 1 ) + ); + } + + /** + * Test for the loadContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContent + * @dataProvider testLoadContentArgumentsProvider + * + * @param int $contentId + * @param array $languages + * @param int $versionNo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function testLoadContent( $contentId, array $languages = null, $versionNo = null ) + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $content = $contentService->loadContent( $contentId, $languages, $versionNo ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $content + ); + + $this->assertContentValues( $content, $languages ); + } + + /** + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * @param array $languages + * @param boolean $draft + * + * @return void + */ + protected function assertContentValues( APIContent $content, array $languages = null, $draft = false ) + { + $versionInfoValues = $this->getVersionInfoExpectedValues( $draft ); + $contentInfoValues = $this->getContentInfoExpectedValues(); + $fieldValuesValues = $this->getFieldValuesExpectedValues( $languages ); + + $this->assertPropertiesCorrect( + $versionInfoValues, + $content->getVersionInfo() + ); + + $this->assertPropertiesCorrect( + $contentInfoValues, + $content->contentInfo + ); + + $this->assertEquals( + $fieldValuesValues, + $content->fields + ); + + // @todo assert relations + + $this->assertEquals( $content->id, $content->contentInfo->id ); + } + + /** + * Test for the loadContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadContentThrowsUnauthorizedException() + { + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->loadContent( 4 ); + } + + /** + * Test for the loadContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentThrowsNotFoundExceptionContentNotFound() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because content with id PHP_INT_MAX does not exist + $content = $contentService->loadContent( PHP_INT_MAX ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentThrowsNotFoundExceptionVersionNotFound() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because version number PHP_INT_MAX for content with id 4 does not exist + $content = $contentService->loadContent( 4, null, PHP_INT_MAX ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentThrowsNotFoundExceptionLanguageNotFound() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because content does not exists in "eng-GB" language + $content = $contentService->loadContent( 4, array( "eng-GB" ) ); + /* END: Use Case */ + } + + /** + * Test for the loadContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentThrowsNotFoundExceptionLanguageNotFoundVariation() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because content does not exists in "eng-GB" language + $content = $contentService->loadContent( 4, array( "eng-US", "eng-GB" ) ); + /* END: Use Case */ + } + + /** + * Data provider for testLoadContentByRemoteId() + * + * @return array + */ + public function testLoadContentByRemoteIdArgumentsProvider() + { + return array( + array( "f5c88a2209584891056f987fd965b0ba", null, null ), + array( "f5c88a2209584891056f987fd965b0ba", array( "eng-US" ), null ), + array( "f5c88a2209584891056f987fd965b0ba", null, 1 ), + array( "f5c88a2209584891056f987fd965b0ba", array( "eng-US" ), 1 ) + ); + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentByRemoteId + * @dataProvider testLoadContentByRemoteIdArgumentsProvider + * + * @param string $remoteId + * @param array|null $languages + * @param int $versionNo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function testLoadContentByRemoteId( $remoteId, $languages, $versionNo ) + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $content = $contentService->loadContentByRemoteId( $remoteId, $languages, $versionNo ); + /* END: Use Case */ + + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\Content", + $content + ); + + $this->assertContentValues( $content, $languages ); + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentByRemoteId + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadContentByRemoteIdThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + // Throws an exception because given remoteId does not exist + $content = $contentService->loadContentByRemoteId( "non-existent-remote-id" ); + /* END: Use Case */ + } + + /** + * Test for the loadContentByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentByRemoteId + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadContentByRemoteIdThrowsUnauthorizedException() + { + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->loadContentByRemoteId( "f5c88a2209584891056f987fd965b0ba" ); + } + + /** + * Test for the newContentCreateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::newContentCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ + public function testNewContentCreateStruct() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $contentTypeService = $this->repository->getContentTypeService(); + + $folderContentType = $contentTypeService->loadContentType( 1 ); + + $contentCreateStruct = $contentService->newContentCreateStruct( + $folderContentType, + "eng-GB" + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\ContentCreateStruct', + $contentCreateStruct + ); + + return array( + "contentType" => $folderContentType, + "contentCreateStruct" => $contentCreateStruct + ); + } + + /** + * Test for the newContentCreateStruct() method. + * + * @depends testNewContentCreateStruct + * @covers \eZ\Publish\Core\Repository\ContentService::newContentCreateStruct + * + * @param array $data + * + * @return void + */ + public function testNewContentCreateStructValues( array $data ) + { + $contentType = $data["contentType"]; + $contentCreateStruct = $data["contentCreateStruct"]; + + $expectedValues = array( + "fields" => array(), + "contentType" => $contentType, + "sectionId" => null, + "ownerId" => null, + "alwaysAvailable" => null, + "remoteId" => null, + "mainLanguageCode" => "eng-GB", + "modificationDate" => null + ); + + $this->assertPropertiesCorrect( + $expectedValues, + $contentCreateStruct + ); + } + + /** + * Test for the createContent() method. + * + * @depends testNewContentCreateStruct + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * + * @return array + */ + public function testCreateContent() + { + $time = time(); + $testContentType = $this->createTestContentType(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "value for field definition with empty default value" ); + $contentCreate->setField( "test_translatable", "and thumbs opposable", "eng-US" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = $this->repository->getCurrentUser()->id; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + $locationCreates = array( + new LocationCreateStruct( + array( + //priority = 0 + //hidden = false + "remoteId" => "db787a9143f57828dd4331573466a013", + //sortField = Location::SORT_FIELD_NAME + //sortOrder = Location::SORT_ORDER_ASC + "parentLocationId" => 2 + ) + ), + new LocationCreateStruct( + array( + //priority = 0 + //hidden = false + "remoteId" => "a3dd7c1c9e04c89e446a70f647286e6b", + //sortField = Location::SORT_FIELD_NAME + //sortOrder = Location::SORT_ORDER_ASC + "parentLocationId" => 5 + ) + ), + ); + + $contentDraft = $contentService->createContent( $contentCreate, $locationCreates ); + /* END: Use Case */ + + $this->assertInstanceOf( 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content', $contentDraft ); + + return array( + "expected" => $contentCreate, + "actual" => $contentDraft, + "loadedActual" => $contentService->loadContent( $contentDraft->id, null, 1 ), + "time" => $time + ); + } + + /** + * Test for the createContent() method. + * + * @depends testCreateContent + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * + * @param array $data + */ + public function testCreateContentStructValues( array $data ) + { + $this->assertCreateContentStructValues( $data ); + } + + /** + * Test for the createContent() method. + * + * Because of the way ContentHandler::create() is implemented and tested in legacy storage it is also necessary to + * test loaded content object, not only the one returned by ContentService::createContent + * + * @depends testCreateContent + * @depends testLoadContent + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * + * @param array $data + */ + public function testCreateContentStructValuesLoaded( array $data ) + { + $data["actual"] = $data['loadedActual']; + + $this->assertCreateContentStructValues( $data ); + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * + * @param array $data + */ + protected function assertCreateContentStructValues( array $data ) + { + $this->assertCreateContentStructValuesContentInfo( $data ); + $this->assertCreateContentStructValuesVersionInfo( $data ); + $this->assertCreateContentStructValuesRelations( $data ); + $this->assertCreateContentStructValuesFields( $data ); + } + + /** + * Asserts that ContentInfo is valid after Content creation + * + * @param array $data + */ + protected function assertCreateContentStructValuesContentInfo( array $data ) + { + /** @var $contentDraft \eZ\Publish\API\Repository\Values\Content\Content */ + $contentDraft = $data['actual']; + /** @var $contentCreate \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct */ + $contentCreate = $data['expected']; + + $this->assertPropertiesCorrect( + array( + "id" => $contentDraft->id, + "name" => $contentCreate->fields[0]->value, + "sectionId" => $contentCreate->sectionId, + "currentVersionNo" => 1, + "published" => false, + "ownerId" => $contentCreate->ownerId, + "modificationDate" => null, + "publishedDate" => null, + "alwaysAvailable" => $contentCreate->alwaysAvailable, + "remoteId" => $contentCreate->remoteId, + "mainLanguageCode" => $contentCreate->mainLanguageCode, + // @todo: should be null, InMemory skips creating node assignments and creates locations right away + //"mainLocationId" => null, + //"contentType" + ), + $contentDraft->versionInfo->contentInfo + ); + $this->assertNotNull( $contentDraft->id ); + $this->assertEquals( + $contentCreate->contentType->id, + $contentDraft->versionInfo->contentInfo->contentType->id + ); + } + + /** + * Asserts that VersionInfo is valid after Content creation + * + * @param array $data + */ + protected function assertCreateContentStructValuesVersionInfo( array $data ) + { + /** @var $contentDraft \eZ\Publish\API\Repository\Values\Content\Content */ + $contentDraft = $data['actual']; + /** @var $contentCreate \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct */ + $contentCreate = $data['expected']; + $time = $data['time']; + + $this->assertPropertiesCorrect( + array( + //"id" + "versionNo" => 1, + //"creationDate" + //"modificationDate" + "creatorId" => $contentCreate->ownerId, + "status" => VersionInfo::STATUS_DRAFT, + "initialLanguageCode" => $contentCreate->mainLanguageCode, + //"languageCodes" + "names" => array( + "eng-GB" => "value for field definition with empty default value", + "eng-US" => "value for field definition with empty default value" + ) + ), + $contentDraft->versionInfo + ); + + $languageCodes = $this->getLanguageCodesFromFields( $contentCreate->fields, $contentCreate->mainLanguageCode ); + + $this->assertCount( count( $languageCodes ), $contentDraft->versionInfo->languageCodes ); + foreach ( $contentDraft->versionInfo->languageCodes as $languageCode ) + { + $this->assertTrue( in_array( $languageCode, $languageCodes ) ); + } + $this->assertNotNull( $contentDraft->versionInfo->id ); + $this->assertGreaterThanOrEqual( $this->getDateTime( $time ), $contentDraft->versionInfo->creationDate ); + $this->assertGreaterThanOrEqual( $this->getDateTime( $time ), $contentDraft->versionInfo->modificationDate ); + } + + /** + * @param array $data + */ + protected function assertCreateContentStructValuesRelations( array $data ) + { + // @todo: relations not implemented yet + } + + /** + * Asserts that fields are valid after Content creation + * + * @param array $data + */ + protected function assertCreateContentStructValuesFields( array $data ) + { + /** @var $contentDraft \eZ\Publish\API\Repository\Values\Content\Content */ + $contentDraft = $data['actual']; + /** @var $contentCreate \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct */ + $contentCreate = $data['expected']; + + $createdFields = $contentDraft->getFields(); + $createdInLanguageCodes = $this->getLanguageCodesFromFields( + $contentCreate->fields, + $contentCreate->mainLanguageCode + ); + + $this->assertCount( + count( $contentDraft->contentType->fieldDefinitions ) * count( $createdInLanguageCodes ), + $createdFields, + "Number of created fields does not match number of content type field definitions multiplied by number of languages the content is created in" + ); + + // Check field values + $structFields = array(); + foreach ( $contentCreate->fields as $field ) + $structFields[$field->fieldDefIdentifier][$field->languageCode] = $field; + foreach ( $contentDraft->contentType->fieldDefinitions as $fieldDefinition ) + { + $this->assertArrayHasKey( + $fieldDefinition->identifier, + $contentDraft->fields, + "Field values are missing for field definition '{$fieldDefinition->identifier}'" + ); + + foreach ( $createdInLanguageCodes as $languageCode ) + { + $this->assertArrayHasKey( + $languageCode, + $contentDraft->fields[$fieldDefinition->identifier], + "Field value is missing for field definition '{$fieldDefinition->identifier}' in language '{$languageCode}'" + ); + + // If field is not set in create struct, it should have default value + $valueLanguageCode = $fieldDefinition->isTranslatable ? $languageCode : $contentCreate->mainLanguageCode; + if ( isset( $structFields[$fieldDefinition->identifier][$valueLanguageCode] ) ) + { + $this->assertEquals( + $structFields[$fieldDefinition->identifier][$valueLanguageCode]->value, + $contentDraft->fields[$fieldDefinition->identifier][$languageCode], + "Field value for field definition '{$fieldDefinition->identifier}' in language '{$languageCode}' is not equal to given struct field value" + ); + } + else + { + $this->assertEquals( + $fieldDefinition->defaultValue, + $contentDraft->fields[$fieldDefinition->identifier][$languageCode], + "Field value for field definition '{$fieldDefinition->identifier}' in language '{$languageCode}' is not equal to default value" + ); + } + } + } + } + + /** + * Gathers language codes from an array of fields + * + * @param \eZ\Publish\API\Repository\Values\Content\Field[] $fields + * @param string $mainLanguageCode + * + * @return array an array of language code strings + */ + protected function getLanguageCodesFromFields( array $fields, $mainLanguageCode ) + { + $languageCodes = array( $mainLanguageCode ); + foreach ( $fields as $field ) $languageCodes[] = $field->languageCode; + return array_unique( $languageCodes ); + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testCreateContentThrowsUnauthorizedException() + { + $testContentType = $this->createTestContentType(); + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "value for field definition with empty default value" ); + $contentCreate->setField( "test_translatable", "and thumbs opposable", "eng-US" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = $this->repository->getCurrentUser()->id; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + $locationCreates = array( + new LocationCreateStruct( + array( + "remoteId" => "db787a9143f57828dd4331573466a013", + "parentLocationId" => 2 + ) + ), + ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->createContent( $contentCreate, $locationCreates ); + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testCreateContentWithoutLocationsThrowsUnauthorizedException() + { + $testContentType = $this->createTestContentType(); + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "value for field definition with empty default value" ); + $contentCreate->setField( "test_translatable", "and thumbs opposable", "eng-US" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = $this->repository->getCurrentUser()->id; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->createContent( $contentCreate, array() ); + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateContentThrowsInvalidArgumentException() + { + $testContentType = $this->createTestContentType(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "value for field definition with empty default value" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = 'f5c88a2209584891056f987fd965b0ba'; + $contentCreate->alwaysAvailable = true; + + // Throws an exception because remoteId "f5c88a2209584891056f987fd965b0ba" already exists + $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * + * @return array + */ + public function testCreateContentThrowsContentValidationExceptionFieldDefinitionUnexisting() + { + $testContentType = $this->createTestContentType(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "value for field definition with empty default value" ); + $contentCreate->setField( "humpty_dumpty", "no such field definition" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Throws an exception because field definition with identifier "humpty_dumpty" does not exist + $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * + * @return array + */ + public function testCreateContentThrowsContentValidationExceptionUntranslatableField() + { + $testContentType = $this->createTestContentType(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "value for field definition with empty default value" ); + $contentCreate->setField( "test_untranslatable", "Bandersnatch", "eng-US" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Throws an exception because translation was given for a untranslatable field + // Note that it is still permissible to set untranslatable field with main language + $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * + * @return array + */ + public function testCreateContentThrowsContentValidationRequiredFieldDefaultValueEmpty() + { + $testContentType = $this->createTestContentType(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_translatable", "Jabberwock" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Throws an exception because required field is not set and its default value is empty + $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the createContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException + */ + public function testCreateContentThrowsContentFieldValidationException() + { + $testContentType = $this->createTestContentType(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( + "test_required_empty", + "a string that is too long and will not validate 12345678901234567890123456789012345678901234567890" + ); + $contentCreate->setField( "test_translatable", "and thumbs opposable", "eng-US" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + // Throws an exception because "test_required_empty" field value is too long and fails + // field definition's string length validator + $contentService->createContent( $contentCreate ); + /* END: Use Case */ + } + + /** + * Test for the newContentMetadataUpdateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::newContentMetadataUpdateStruct + */ + public function testNewContentMetadataUpdateStruct() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\ContentMetadataUpdateStruct', + $contentMetadataUpdateStruct + ); + + foreach ( $contentMetadataUpdateStruct as $propertyName => $propertyValue ) + $this->assertNull( $propertyValue, "Property '{$propertyName}' initial value should be null'" ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContentMetadata + * @depends testNewContentMetadataUpdateStruct + * + * @return array + */ + public function testUpdateContentMetadata() + { + // Create one additional location for content to be set as main location + $locationService = $this->repository->getLocationService(); + $contentInfo = $this->repository->getContentService()->loadContentInfo( 12 ); + $locationCreateStruct = $locationService->newLocationCreateStruct( 44 ); + $locationCreateStruct->remoteId = "test-location-remote-id-1234"; + $newLocation = $locationService->createLocation( + $contentInfo, + $locationCreateStruct + ); + $newSectionId = $this->repository->getContentService()->loadContentInfo( + $locationService->loadLocation( $newLocation->parentLocationId )->contentId + )->sectionId; + // Change content section to be different from new main location parent location content + $sectionService = $this->repository->getSectionService(); + $sectionService->assignSection( + $contentInfo, + $sectionService->loadSection( $newSectionId === 1 ? $newSectionId + 1 : $newSectionId - 1 ) + ); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 12 ); + + $newMainLocationId = $newLocation->id; + $time = time(); + $contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct(); + $contentMetadataUpdateStruct->ownerId = 10; + $contentMetadataUpdateStruct->publishedDate = $this->getDateTime( $time ); + $contentMetadataUpdateStruct->modificationDate = $this->getDateTime( $time ); + $contentMetadataUpdateStruct->mainLanguageCode = "eng-GB"; + $contentMetadataUpdateStruct->alwaysAvailable = false; + $contentMetadataUpdateStruct->remoteId = "the-all-new-remoteid"; + $contentMetadataUpdateStruct->mainLocationId = $newMainLocationId; + + $content = $contentService->updateContentMetadata( $contentInfo, $contentMetadataUpdateStruct ); + /* END: Use Case */ + + $this->assertInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Content", $content ); + + return array( + "expected" => $contentMetadataUpdateStruct, + "actual" => $content, + "newSectionId" => $newSectionId + ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContentMetadata + * @depends testUpdateContentMetadata + * + * @param array $data + */ + public function testUpdateContentMetadataStructValues( array $data ) + { + /** @var $updateStruct \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct */ + $updateStruct = $data['expected']; + /** @var $content \eZ\Publish\API\Repository\Values\Content\Content */ + $content = $data['actual']; + + $this->assertPropertiesCorrect( + array( + "ownerId" => $updateStruct->ownerId, + // not changeable through MetadataUpdateStruct + //"name" + "publishedDate" => $updateStruct->publishedDate, + "modificationDate" => $updateStruct->modificationDate, + "mainLanguageCode" => $updateStruct->mainLanguageCode, + "alwaysAvailable" => $updateStruct->alwaysAvailable, + "remoteId" => $updateStruct->remoteId, + "mainLocationId" => $updateStruct->mainLocationId, + "sectionId" => $data["newSectionId"] + ), + $content->contentInfo + ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContentMetadata + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testUpdateContentMetadataThrowsUnauthorizedException() + { + $contentInfo = $this->repository->getContentService()->loadContentInfo( 12 ); + $contentMetadataUpdateStruct = $this->repository->getContentService()->newContentMetadataUpdateStruct(); + $contentMetadataUpdateStruct->remoteId = "the-all-new-remoteid"; + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->updateContentMetadata( $contentInfo, $contentMetadataUpdateStruct ); + } + + /** + * Test for the updateContentMetadata() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContentMetadata + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends testNewContentMetadataUpdateStruct + */ + public function testUpdateContentMetadataThrowsInvalidArgumentExceptionDuplicateRemoteId() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $contentInfo = $contentService->loadContentInfo( 4 ); + $contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct(); + $contentMetadataUpdateStruct->remoteId = "9b47a45624b023b1a76c73b74d704acf"; + + // Throws an exception because remoteId "9b47a45624b023b1a76c73b74d704acf" is already in use + $contentService->updateContentMetadata( $contentInfo, $contentMetadataUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the updateContentMetadata() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContentMetadata + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @depends testNewContentMetadataUpdateStruct + */ + public function testUpdateContentMetadataThrowsInvalidArgumentExceptionNoMetadataPropertiesSet() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $contentInfo = $contentService->loadContentInfo( 4 ); + $contentMetadataUpdateStruct = $contentService->newContentMetadataUpdateStruct(); + + // Throws an exception because no properties are set in $contentMetadataUpdateStruct + $contentService->updateContentMetadata( $contentInfo, $contentMetadataUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the newContentUpdateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::newContentUpdateStruct + */ + public function testNewContentUpdateStruct() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\ContentUpdateStruct', + $contentUpdateStruct + ); + + $this->assertPropertiesCorrect( + array( + "initialLanguageCode" => null, + "fields" => array() + ), + $contentUpdateStruct + ); + } + + /** + * Test for the updateContent() method. + * + * @depends testCreateContent + * @depends testNewContentUpdateStruct + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * + * @return array + */ + public function testUpdateContent() + { + $content = $this->createTestContent(); + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $content->id, + $content->getVersionInfo()->versionNo + ); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-US"; + + $contentUpdateStruct->setField( "test_required_empty", "new value for test_required_empty" ); + $contentUpdateStruct->setField( "test_translatable", "new eng-US value for test_translatable" ); + $contentUpdateStruct->setField( "test_untranslatable", "new value for test_untranslatable" ); + $contentUpdateStruct->setField( "test_translatable", "new eng-GB value for test_translatable", "eng-GB" ); + + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + + $this->assertInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Content", $updatedContent ); + + return array( + "actual" => $updatedContent, + "expected" => $contentUpdateStruct, + "previous" => $content, + "time" => $time + ); + } + + /** + * Test for the updateContent() method. + * + * @depends testUpdateContent + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * + * @param array $data + */ + public function testUpdateContentStructValues( array $data ) + { + /** @var $updatedContentDraft \eZ\Publish\API\Repository\Values\Content\Content */ + $updatedContentDraft = $data['actual']; + /** @var $contentUpdate \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct */ + $contentUpdate = $data['expected']; + /** @var $contentDraft \eZ\Publish\API\Repository\Values\Content\Content */ + $contentDraft = $data['previous']; + + $this->assertCount( 8, $updatedContentDraft->getFields() ); + + // Check field values + $structFields = array(); + foreach ( $contentUpdate->fields as $field ) + { + $structFields[$field->fieldDefIdentifier][$field->languageCode] = $field; + } + + foreach ( $updatedContentDraft->contentType->fieldDefinitions as $fieldDefinition ) + { + $this->assertArrayHasKey( + $fieldDefinition->identifier, + $updatedContentDraft->fields, + "Field values are missing for field definition '{$fieldDefinition->identifier}'" + ); + + foreach ( $updatedContentDraft->getVersionInfo()->languageCodes as $languageCode ) + { + $this->assertArrayHasKey( + $languageCode, + $updatedContentDraft->fields[$fieldDefinition->identifier], + "Field value is missing for field definition '{$fieldDefinition->identifier}' in language '{$languageCode}'" + ); + + // If field is not set in update struct, it should retain its previous value + $valueLanguageCode = $fieldDefinition->isTranslatable ? $languageCode : $contentUpdate->initialLanguageCode; + if ( isset( $structFields[$fieldDefinition->identifier][$valueLanguageCode] ) ) + { + $this->assertEquals( + $structFields[$fieldDefinition->identifier][$valueLanguageCode]->value, + $updatedContentDraft->fields[$fieldDefinition->identifier][$languageCode], + "Field value for field definition '{$fieldDefinition->identifier}' in language '{$languageCode}' is not equal to update struct field value" + ); + } + else + { + $this->assertEquals( + $contentDraft->fields[$fieldDefinition->identifier][$languageCode], + $updatedContentDraft->fields[$fieldDefinition->identifier][$languageCode], + "Non-updated field value for field definition '{$fieldDefinition->identifier}' in language '{$languageCode}' did not retain its previous value" + ); + } + } + } + + $this->assertEquals( + $contentUpdate->initialLanguageCode, + $updatedContentDraft->versionInfo->initialLanguageCode + ); + $this->assertGreaterThanOrEqual( + $data["time"], + $updatedContentDraft->versionInfo->modificationDate->getTimestamp() + ); + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + */ + public function testUpdateContentWithNewLanguage() + { + $content = $this->createTestContent(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $content->id, + $content->getVersionInfo()->versionNo + ); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-GB"; + $contentUpdateStruct->setField( "test_required_empty", "new value for untranslatable field", "eng-GB" ); + $contentUpdateStruct->setField( "test_translatable", "Französisch frites", "ger-DE" ); + + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + + $fields = $updatedContent->fields; + + $this->assertCount( 3, $updatedContent->versionInfo->languageCodes ); + $this->assertCount( 12, $updatedContent->getFields() ); + $this->assertCount( 4, $updatedContent->fields ); + foreach ( $fields as $langFields ) + { + $this->assertCount( 3, $langFields ); + } + $this->assertEquals( "new value for untranslatable field", $fields["test_required_empty"]["eng-GB"] ); + $this->assertEquals( "new value for untranslatable field", $fields["test_required_empty"]["eng-US"] ); + $this->assertEquals( "new value for untranslatable field", $fields["test_required_empty"]["ger-DE"] ); + $this->assertEquals( $fields["test_required_not_empty"]["eng-GB"], $fields["test_required_not_empty"]["ger-DE"] ); + $this->assertEquals( "Französisch frites", $fields["test_translatable"]["ger-DE"] ); + $this->assertEquals( $fields["test_untranslatable"]["eng-GB"], $fields["test_untranslatable"]["ger-DE"] ); + + $this->assertEquals( + array( + "eng-GB" => "new value for untranslatable field", + "eng-US" => "new value for untranslatable field", + "ger-DE" => "new value for untranslatable field", + ), + $updatedContent->versionInfo->getNames() + ); + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testUpdateContentThrowsUnauthorizedException() + { + $content = $this->createTestContent(); + + $contentUpdateStruct = $this->repository->getContentService()->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-US"; + $contentUpdateStruct->setField( "test_required_empty", "new value for test_required_empty" ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->updateContent( + $content->versionInfo, + $contentUpdateStruct + ); + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testUpdateContentThrowsBadStateException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( 4 ); + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + + // Throws an exception because version is not a draft + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException + */ + public function testUpdateContentThrowsContentFieldValidationException() + { + $content = $this->createTestContent(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $content->id, + $content->getVersionInfo()->versionNo + ); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-US"; + $contentUpdateStruct->setField( + "test_required_empty", + "a string that is too long and will not validate 12345678901234567890123456789012345678901234567890" + ); + + // Throws an exception because "test_required_empty" field value is too long and fails + // field definition's string length validator + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + */ + public function testUpdateContentThrowsContentValidationExceptionRequiredFieldEmpty() + { + $content = $this->createTestContent(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $content->id, + $content->getVersionInfo()->versionNo + ); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-GB"; + $contentUpdateStruct->setField( "test_required_empty", "" ); + + // Throws an exception because required field is being updated with empty value + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + */ + public function testUpdateContentThrowsContentValidationExceptionFieldDefinitionNonexistent() + { + $content = $this->createTestContent(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $content->id, + $content->getVersionInfo()->versionNo + ); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-GB"; + $contentUpdateStruct->setField( "nonexistent_field_definition_identifier", "eng-GB" ); + + // Throws an exception because field definition with identifier "nonexistent_field_definition_identifier" + // does not exist in content draft content type + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the updateContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::updateContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * + * @return array + */ + public function testUpdateContentThrowsContentValidationExceptionUntranslatableField() + { + $content = $this->createTestContent(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $content->id, + $content->getVersionInfo()->versionNo + ); + + $contentUpdateStruct = $contentService->newContentUpdateStruct(); + $contentUpdateStruct->initialLanguageCode = "eng-GB"; + $contentUpdateStruct->setField( "test_untranslatable", "Jabberwock", "eng-US" ); + + // Throws an exception because translation was given for a untranslatable field + // Note that it is still permissible to set untranslatable field with main language + $updatedContent = $contentService->updateContent( $versionInfo, $contentUpdateStruct ); + /* END: Use Case */ + } + + /** + * Test for the publishVersion() method. + * + * @depends testCreateContent + * @covers \eZ\Publish\Core\Repository\ContentService::publishVersion + */ + public function testPublishVersion() + { + $time = time(); + $draftContent = $this->createTestContent(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( + $draftContent->id, + $draftContent->getVersionInfo()->versionNo + ); + + $publishedContent = $contentService->publishVersion( $versionInfo ); + /* END: Use Case */ + + $this->assertInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Content", $publishedContent ); + $this->assertTrue( $publishedContent->contentInfo->published ); + $this->assertEquals( VersionInfo::STATUS_PUBLISHED, $publishedContent->versionInfo->status ); + $this->assertGreaterThanOrEqual( $time, $publishedContent->contentInfo->publishedDate->getTimestamp() ); + $this->assertGreaterThanOrEqual( $time, $publishedContent->contentInfo->modificationDate->getTimestamp() ); + } + + /** + * Test for the publishVersion() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::publishVersion + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testPublishVersionThrowsBadStateException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( 4 ); + + // Throws an exception because version is already published + $publishedContent = $contentService->publishVersion( $versionInfo ); + /* END: Use Case */ + } + + /** + * Test for the publishVersion() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::publishVersion + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testPublishVersionThrowsUnauthorizedException() + { + $draftContent = $this->createTestContent(); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentService()->publishVersion( $draftContent->versionInfo ); + } + + /** + * Test for the createContentDraft() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * + * @return array + */ + public function testCreateContentDraft() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + $draftContent = $contentService->createContentDraft( $contentInfo ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $draftContent + ); + + return array( + "draftContent" => $draftContent, + "time" => $time + ); + } + + /** + * @param array $data + */ + protected function assertDraftContentValues( array $data ) + { + /** @var $draftContent \eZ\Publish\API\Repository\Values\Content\Content */ + $draftContent = $data["draftContent"]; + $time = $data["time"]; + + $this->assertContentValues( $data["draftContent"], null, true ); + $this->assertGreaterThanOrEqual( + $this->getDateTime( $time ), + $draftContent->getVersionInfo()->creationDate + ); + $this->assertGreaterThanOrEqual( + $this->getDateTime( $time ), + $draftContent->getVersionInfo()->modificationDate + ); + } + + /** + * Test for the createContentDraft() method. + * + * @depends testCreateContentDraft + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * + * @param array $data + */ + public function testCreateContentDraftValues( array $data ) + { + $this->assertDraftContentValues( $data ); + } + + /** + * Test for the createContentDraft() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * + * @return array + */ + public function testCreateContentDraftWithSecondArgument() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $content = $contentService->loadContent( 4 ); + + $draftContent = $contentService->createContentDraft( + $content->contentInfo, + $content->getVersionInfo() + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $draftContent + ); + + return array( + "draftContent" => $draftContent, + "time" => $time + ); + } + + /** + * Test for the createContentDraft() method. + * + * @depends testCreateContentDraftWithSecondArgument + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * + * @param array $data + */ + public function testCreateContentDraftWithSecondArgumentValues( array $data ) + { + $this->assertDraftContentValues( $data ); + } + + /** + * Test for the createContentDraft() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * + * @return array + */ + public function testCreateContentDraftWithThirdArgument() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $content = $contentService->loadContent( 4 ); + + $draftContent = $contentService->createContentDraft( + $content->contentInfo, + $content->getVersionInfo(), + $this->repository->getCurrentUser() + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\Content', + $draftContent + ); + + return array( + "draftContent" => $draftContent, + "time" => $time + ); + } + + /** + * Test for the createContentDraft() method. + * + * @depends testCreateContentDraftWithThirdArgument + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * + * @param array $data + */ + public function testCreateContentDraftWithThirdArgumentValues( array $data ) + { + $this->assertDraftContentValues( $data ); + } + + /** + * Test for the createContentDraft() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testCreateContentDraftThrowsBadStateException() + { + $contentService = $this->repository->getContentService(); + $contentInfo = $contentService->loadContentInfo( 4 ); + $draftContent = $contentService->createContentDraft( $contentInfo ); + + // Throws an exception because version status is not + // VersionInfo::STATUS_PUBLISHED nor VersionInfo::STATUS_ARCHIVED + $draftContent = $contentService->createContentDraft( + $draftContent->contentInfo, + $draftContent->getVersionInfo() + ); + } + + /** + * Test for the createContentDraft() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::createContentDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testCreateContentDraftThrowsUnauthorizedException() + { + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->createContentDraft( $contentInfo ); + } + + /** + * Test for the loadContentDrafts() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentDrafts + */ + public function testLoadContentDrafts() + { + $contentService = $this->repository->getContentService(); + + // delete existing drafts before we begin + $draftedVersions = $contentService->loadContentDrafts(); + foreach ( $draftedVersions as $draftedVersion ) + $contentService->deleteVersion( $draftedVersion ); + + /* BEGIN: Use Case */ + // Remote ids of the "Users" user group of a eZ Publish demo installation. + $usersUserGroupRemoteId = 'f5c88a2209584891056f987fd965b0ba'; + $membersUserGroupRemoteId = '5f7f0bdb3381d6a461d8c29ff53d908f'; + + // "Users" user group content object + $usersUserGroupContentInfo = $contentService->loadContentInfoByRemoteId( $usersUserGroupRemoteId ); + $membersUserGroupContentInfo = $contentService->loadContentInfoByRemoteId( $membersUserGroupRemoteId ); + + // Create some drafts + $contentService->createContentDraft( $usersUserGroupContentInfo ); + $contentService->createContentDraft( $membersUserGroupContentInfo ); + + // Now $contentDrafts should contain two drafted versions + $draftedVersions = $contentService->loadContentDrafts(); + /* END: Use Case */ + + $actual = array( + $draftedVersions[0]->status, + $draftedVersions[1]->status, + count( $draftedVersions ), + $draftedVersions[0]->getContentInfo()->remoteId, + $draftedVersions[1]->getContentInfo()->remoteId, + ); + + $this->assertEquals( + array( + VersionInfo::STATUS_DRAFT, + VersionInfo::STATUS_DRAFT, + 2, + $usersUserGroupRemoteId, + $membersUserGroupRemoteId + ), + $actual + ); + } + + /** + * Test for the loadContentDrafts() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentDrafts + */ + public function testLoadContentDraftsWithFirstArgument() + { + + } + + /** + * Test for the loadContentDrafts() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentDrafts + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadContentDraftsThrowsUnauthorizedException() + { + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + // Now $contentDrafts should contain two drafted versions + $this->repository->getContentService()->loadContentDrafts(); + } + + /** + * Test for the loadVersions() method. + * + * @depends testLoadContentInfo + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersions + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] + */ + public function testLoadVersions() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + $versions = $contentService->loadVersions( $contentInfo ); + /* END: Use Case */ + + return $versions; + } + + /** + * Test for the loadVersions() method. + * + * @depends testLoadVersions + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersions + * + * @param array $versions + */ + public function testLoadVersionsValues( array $versions ) + { + $versionInfoValues = $this->getVersionInfoExpectedValues(); + + $this->assertPropertiesCorrect( + $versionInfoValues, + $versions[0] + ); + } + + /** + * Test for the loadVersions() method. + * + * @depends testLoadContentInfo + * @depends testCreateContentDraft + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersions + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] + */ + public function testLoadVersionsMultiple() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + // Create one additional version + $draftContent = $contentService->createContentDraft( $contentInfo ); + $versions = $contentService->loadVersions( $contentInfo ); + /* END: Use Case */ + + return array( + "versions" => $versions, + "time" => $time + ); + } + + /** + * Test for the loadVersions() method. + * + * @depends testLoadVersionsMultiple + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersions + * + * @param array $data + */ + public function testLoadVersionsMultipleValues( array $data ) + { + $versions = $data["versions"]; + $time = $data["time"]; + + $versionInfoValues = $this->getVersionInfoExpectedValues(); + $this->assertPropertiesCorrect( + $versionInfoValues, + $versions[0] + ); + + $versionInfoValues = $this->getVersionInfoExpectedValues( true ); + $this->assertPropertiesCorrect( + $versionInfoValues, + $versions[1] + ); + $this->assertGreaterThanOrEqual( + $this->getDateTime( $time ), + $versions[1]->creationDate + ); + $this->assertGreaterThanOrEqual( + $this->getDateTime( $time ), + $versions[1]->modificationDate + ); + } + + /** + * Test for the loadVersions() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersions + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadVersionsThrowsUnauthorizedException() + { + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->loadVersions( $contentInfo ); + } + + /** + * Test for the deleteVersion() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteVersion + */ + public function testDeleteVersion() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + // Create a version to delete + $draftContent = $contentService->createContentDraft( $contentInfo ); + + $contentService->deleteVersion( $draftContent->versionInfo ); + /* END: Use Case */ + + try + { + $contentService->loadVersionInfo( + $draftContent->contentInfo, + $draftContent->versionInfo->versionNo + ); + + $this->fail( "Version was not successfully deleted!" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test for the deleteVersion() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteVersion + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testDeleteVersionThrowsBadStateException() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $versionInfo = $contentService->loadVersionInfoById( 4 ); + + // Throws an exception because version is published + $contentService->deleteVersion( $versionInfo ); + /* END: Use Case */ + } + + /** + * Test for the deleteVersion() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteVersion + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testDeleteVersionThrowsUnauthorizedException() + { + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + // Create a version to delete + $draftContent = $contentService->createContentDraft( $contentInfo ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->deleteVersion( $draftContent->versionInfo ); + } + + /** + * Test for the deleteContent() method. + * + * @depends testLoadContent + * @covers \eZ\Publish\Core\Repository\ContentService::deleteContent + */ + public function testDeleteContent() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + $contentService->deleteContent( $contentInfo ); + /* END: Use Case */ + + try + { + $contentService->loadContent( $contentInfo->id ); + + $this->fail( "Content was not successfully deleted!" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test for the deleteContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testDeleteContentThrowsUnauthorizedException() + { + $contentService = $this->repository->getContentService(); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->deleteContent( $contentInfo ); + } + + /** + * Test for the copyContent() method. + * + * @dep_ends testCreate + * @dep_ends testLoadContentInfo + * @dep_ends testLoadVersionInfoById + * @covers \eZ\Publish\Core\Repository\ContentService::copyContent + */ + public function testCopyContentSingleVersion() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + + $contentInfo = $contentService->loadContentInfo( 11 ); + $versionInfo = $contentService->loadVersionInfoById( 11, 1 ); + $destinationLocationCreateStruct = $locationService->newLocationCreateStruct( 5 ); + + $copiedContent = $contentService->copyContent( + $contentInfo, + $destinationLocationCreateStruct, + $versionInfo + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "eZ\\Publish\\Core\\Repository\\Values\\Content\\Content", + $copiedContent + ); + + $this->assertEquals( 1, $copiedContent->contentInfo->currentVersionNo ); + $this->assertGreaterThanOrEqual( $time, $copiedContent->contentInfo->modificationDate->getTimestamp() ); + $this->assertGreaterThanOrEqual( $time, $copiedContent->contentInfo->publishedDate->getTimestamp() ); + $this->assertCopyContentValues( + $contentService->loadContent( 11, null, 1 ), + $copiedContent + ); + } + + /** + * Test for the copyContent() method. + * + * @dep_ends testLoadVersions + * @covers \eZ\Publish\Core\Repository\ContentService::copyContent + */ + public function testCopyContentAllVersions() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + + $contentInfo = $contentService->loadContentInfo( 11 ); + $destinationLocationCreateStruct = $locationService->newLocationCreateStruct( 5 ); + + $copiedContent = $contentService->copyContent( + $contentInfo, + $destinationLocationCreateStruct + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "eZ\\Publish\\Core\\Repository\\Values\\Content\\Content", + $copiedContent + ); + + $this->assertGreaterThanOrEqual( $time, $copiedContent->contentInfo->modificationDate->getTimestamp() ); + $this->assertGreaterThanOrEqual( $time, $copiedContent->contentInfo->publishedDate->getTimestamp() ); + + $originalVersionInfos = $contentService->loadVersions( $contentInfo ); + $copiedVersionInfos = $contentService->loadVersions( $copiedContent->contentInfo ); + $sorter = + function( $a, $b ) + { + return strcmp( $a->versionNo, $b->versionNo ); + }; + usort( $originalVersionInfos, $sorter ); + usort( $copiedVersionInfos, $sorter ); + $this->assertCount( + count( $originalVersionInfos ), + $copiedVersionInfos, + "Count of versions copied does not match the count of original versions" + ); + $this->assertEquals( $contentInfo->currentVersionNo, $copiedContent->contentInfo->currentVersionNo ); + foreach ( $originalVersionInfos as $index => $versionInfo ) + { + $this->assertEquals( $versionInfo->versionNo, $copiedVersionInfos[$index]->versionNo ); + $this->assertCopyContentValues( + $contentService->loadContent( + $contentInfo->id, + null, + $versionInfo->versionNo + ), + $contentService->loadContent( + $copiedContent->id, + null, + $copiedVersionInfos[$index]->versionNo + ) + ); + } + } + + /** + * Asserts that $copiedContent is valid copy of $originalContent + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $originalContent + * @param \eZ\Publish\API\Repository\Values\Content\Content $copiedContent + */ + protected function assertCopyContentValues( APIContent $originalContent, APIContent $copiedContent ) + { + $this->assertEquals( + $originalContent->contentType, + $copiedContent->contentType, + "Content type of content copy does not match the content type of original content" + ); + $this->assertNotEquals( + $originalContent->id, + $copiedContent->id, + "Id of content copy is equal to id od original content" + ); + + $this->assertSameClassPropertiesCorrect( + array( + //"name", + "sectionId", + //"currentVersionNo", + "published", + "ownerId", + "alwaysAvailable", + "mainLanguageCode", + //"mainLocationId" + ), + $originalContent->contentInfo, + $copiedContent->contentInfo + ); + $this->assertNotEquals( $originalContent->contentInfo->id, $copiedContent->contentInfo->id ); + $this->assertNotEquals( $originalContent->contentInfo->remoteId, $copiedContent->contentInfo->remoteId ); + + $this->assertSameClassPropertiesCorrect( + array( + "versionNo", + //"contentId", + "names", + //"creationDate", + //"modificationDate", + "creatorId", + //"status", + "initialLanguageCode", + "languageCodes" + ), + $originalContent->versionInfo, + $copiedContent->versionInfo + ); + $this->assertNotEquals( $originalContent->versionInfo->id, $copiedContent->versionInfo->id ); + + $originalFields = $originalContent->getFields(); + $copiedFields = $copiedContent->getFields(); + $this->assertCount( + count( $originalFields ), + $copiedFields, + "Count of fields copied does not match the count of original fields" + ); + foreach ( $originalFields as $fieldIndex => $originalField ) + { + $this->assertSameClassPropertiesCorrect( + array( + "fieldDefIdentifier", + "value", + "languageCode" + ), + $originalField, + $copiedFields[$fieldIndex] + ); + $this->assertNotEquals( + $originalField->id, + $copiedFields[$fieldIndex]->id + ); + } + } + + /** + * Test for the copyContent() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::copyContent + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testCopyContentThrowsUnauthorizedException() + { + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + + $contentInfo = $contentService->loadContentInfo( 11 ); + $destinationLocationCreateStruct = $locationService->newLocationCreateStruct( 5 ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->copyContent( $contentInfo, $destinationLocationCreateStruct ); + } + + /** + * Test for the newTranslationInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::newTranslationInfo + */ + public function testNewTranslationInfo() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $translationInfo = $contentService->newTranslationInfo(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\TranslationInfo', + $translationInfo + ); + + foreach ( $translationInfo as $propertyName => $propertyValue ) + $this->assertNull( $propertyValue, "Property '{$propertyName}' initial value should be null'" ); + } + + /** + * Test for the newTranslationValues() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::newTranslationValues + */ + public function testNewTranslationValues() + { + /* BEGIN: Use Case */ + $contentService = $this->repository->getContentService(); + + $translationValues = $contentService->newTranslationValues(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\Content\\TranslationValues', + $translationValues + ); + + foreach ( $translationValues as $propertyName => $propertyValue ) + $this->assertNull( $propertyValue, "Property '{$propertyName}' initial value should be null'" ); + } + + /** + * Test for the loadRelations() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadRelations + * @covers \eZ\Publish\Core\Repository\ContentService::addRelation + */ + public function testLoadRelations() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + $relations = $contentService->loadRelations( $contentDraft->versionInfo ); + + $this->assertRelations( $relations, $contentDraft->contentInfo, $mediaContentInfo ); + } + + protected function assertRelations( $relations, $sourceContentInfo, $destinationContentInfo ) + { + self::assertInternalType( "array", $relations ); + self::assertCount( 1, $relations ); + self::assertInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Relation", $relations[0] ); + self::assertNotNull( $relations[0]->id ); + self::assertEquals( Relation::COMMON, $relations[0]->type ); + self::assertNull( $relations[0]->sourceFieldDefinitionIdentifier ); + self::assertEquals( $sourceContentInfo, $relations[0]->sourceContentInfo ); + self::assertEquals( $destinationContentInfo, $relations[0]->destinationContentInfo ); + } + + /** + * Test for the loadRelations() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadRelations + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadRelationsThrowsUnauthorizedException() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->loadRelations( $contentDraft->versionInfo ); + } + + /** + * Test for the loadReverseRelations() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadReverseRelations + */ + public function testLoadReverseRelations() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + $relations = $contentService->loadReverseRelations( $mediaContentInfo ); + + $this->assertRelations( $relations, $contentDraft->contentInfo, $mediaContentInfo ); + } + + /** + * Test for the loadReverseRelations() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadReverseRelations + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testLoadReverseRelationsThrowsUnauthorizedException() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->loadReverseRelations( $mediaContentInfo ); + } + + /** + * Test for the addRelation() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::addRelation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testAddRelationThrowsUnauthorizedException() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + } + + /** + * Test for the addRelation() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::addRelation + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testAddRelationThrowsBadStateException() + { + $contentService = $this->repository->getContentService(); + $contentDraft = $this->createTestContent(); + $publishedContent = $contentService->publishVersion( $contentDraft->versionInfo ); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $publishedContent->getVersionInfo(), + $mediaContentInfo + ); + } + + /** + * Test for the deleteRelation() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteRelation + */ + public function testDeleteRelation() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + $contentService->deleteRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + $relations = $contentService->loadRelations( $contentDraft->versionInfo ); + + self::assertCount( 0, $relations ); + } + + /** + * Test for the deleteRelation() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteRelation + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testDeleteRelationThrowsUnauthorizedException() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentService->deleteRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + } + + /** + * Test for the deleteRelation() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteRelation + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + */ + public function testDeleteRelationThrowsBadStateException() + { + $contentService = $this->repository->getContentService(); + $contentDraft = $this->createTestContent(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->addRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + + $publishedContent = $contentService->publishVersion( $contentDraft->versionInfo ); + + $contentService->deleteRelation( + $publishedContent->getVersionInfo(), + $mediaContentInfo + ); + } + + /** + * Test for the deleteRelation() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::deleteRelation + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testDeleteRelationThrowsInvalidArgumentException() + { + $contentDraft = $this->createTestContent(); + $contentService = $this->repository->getContentService(); + + $mediaContentInfo = $contentService->loadContentInfoByRemoteId( 'a6e35cbcb7cd6ae4b691f3eee30cd262' ); + + $contentService->deleteRelation( + $contentDraft->getVersionInfo(), + $mediaContentInfo + ); + } + + /** + * Creates and returns content draft used in testing + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createTestContent() + { + $contentService = $this->repository->getContentService(); + $testContentType = $this->createTestContentType(); + + $contentCreate = $contentService->newContentCreateStruct( $testContentType, 'eng-GB' ); + $contentCreate->setField( "test_required_empty", "val-11" ); + $contentCreate->setField( "test_required_not_empty", "val-12" ); + $contentCreate->setField( "test_translatable", "val-13" ); + $contentCreate->setField( "test_untranslatable", "val-14" ); + $contentCreate->setField( "test_translatable", "val-23", "eng-US" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = 'abcdef0123456789abcdef0123456789'; + $contentCreate->alwaysAvailable = true; + + $locationCreates = array( + new LocationCreateStruct( + array( + //priority = 0 + //hidden = false + "remoteId" => "db787a9143f57828dd4331573466a013", + //sortField = Location::SORT_FIELD_NAME + //sortOrder = Location::SORT_ORDER_ASC + "parentLocationId" => 2 + ) + ), + new LocationCreateStruct( + array( + //priority = 0 + //hidden = false + "remoteId" => "a3dd7c1c9e04c89e446a70f647286e6b", + //sortField = Location::SORT_FIELD_NAME + //sortOrder = Location::SORT_ORDER_ASC + "parentLocationId" => 5 + ) + ), + ); + + return $contentService->createContent( $contentCreate, $locationCreates ); + } + + /** + * Returns ContentType used in testing + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected function createTestContentType() + { + $contentTypeService = $this->repository->getContentTypeService(); + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + "test-type" + ); + $typeCreateStruct->names = array( "eng-US" => "Test type name" ); + $typeCreateStruct->descriptions = array( "eng-GB" => "Test type description" ); + $typeCreateStruct->remoteId = "test-type-remoteid"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = $this->getDateTime( 0 ); + $typeCreateStruct->mainLanguageCode = "eng-GB"; + $typeCreateStruct->nameSchema = "<test_required_empty>"; + $typeCreateStruct->urlAliasSchema = "<test_required_empty>"; + + $fieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( "test_required_empty", "ezstring" ); + $fieldCreate->names = array( "eng-GB" => "Test required empty" ); + $fieldCreate->descriptions = array( "eng-GB" => "Required field with empty default value" ); + $fieldCreate->fieldGroup = "test-field-group"; + $fieldCreate->position = 1; + $fieldCreate->isTranslatable = false; + $fieldCreate->isRequired = true; + $fieldCreate->isInfoCollector = false; + $fieldCreate->isSearchable = true; + $fieldCreate->defaultValue = ""; + //$validator = new StringLengthValidator(); + //$validator->maxStringLength = 64; + //$fieldCreate->validatorConfiguration = array( $validator ); + $fieldCreate->validatorConfiguration = array( + "StringLengthValidator" => array( + "maxStringLength" => 64 + ) + ); + //$fieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $fieldCreate ); + + $fieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( "test_required_not_empty", "ezstring" ); + $fieldCreate->names = array( "eng-GB" => "Test required not empty" ); + $fieldCreate->descriptions = array( "eng-GB" => "Required field with default value not empty" ); + $fieldCreate->fieldGroup = "test-field-group"; + $fieldCreate->position = 2; + $fieldCreate->isTranslatable = false; + $fieldCreate->isRequired = true; + $fieldCreate->isInfoCollector = false; + $fieldCreate->isSearchable = true; + $fieldCreate->defaultValue = "dummy default data"; + //$fieldCreate->validators + //$fieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $fieldCreate ); + + $fieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( "test_translatable", "ezstring" ); + $fieldCreate->names = array( "eng-GB" => "Test translatable" ); + $fieldCreate->descriptions = array( "eng-GB" => "Translatable field" ); + $fieldCreate->fieldGroup = "test-field-group"; + $fieldCreate->position = 3; + $fieldCreate->isTranslatable = true; + $fieldCreate->isRequired = false; + $fieldCreate->isInfoCollector = false; + $fieldCreate->isSearchable = true; + $fieldCreate->defaultValue = ""; + //$fieldCreate->validators + //$fieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $fieldCreate ); + + $fieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( "test_untranslatable", "ezstring" ); + $fieldCreate->names = array( "eng-GB" => "Test not translatable" ); + $fieldCreate->descriptions = array( "eng-GB" => "Untranslatable field" ); + $fieldCreate->fieldGroup = "test-field-group"; + $fieldCreate->position = 4; + $fieldCreate->isTranslatable = false; + $fieldCreate->isRequired = false; + $fieldCreate->isInfoCollector = false; + $fieldCreate->isSearchable = true; + $fieldCreate->defaultValue = ""; + //$fieldCreate->validators + //$fieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $fieldCreate ); + + $contentTypeDraft = $contentTypeService->createContentType( + $typeCreateStruct, + array( $contentTypeService->loadContentTypeGroup( 1 ) ) + ); + $contentTypeId = $contentTypeDraft->id; + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + + return $contentTypeService->loadContentType( $contentTypeId ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/ContentTypeBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/ContentTypeBase.php new file mode 100644 index 0000000..c218c8d --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/ContentTypeBase.php @@ -0,0 +1,3611 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\ContentTypeBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Exceptions; +use eZ\Publish\Core\FieldType\XmlText\Value as XmlValue; + +/** + * Test case for ContentType service + */ +abstract class ContentTypeBase extends BaseServiceTest +{ + protected $contentTypeGroups = array(); + + /** + * Test for the newContentTypeGroupCreateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct + */ + public function testNewContentTypeGroupCreateStruct() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupCreateStruct', + $groupCreate + ); + return $groupCreate; + } + + /** + * Test for the newContentTypeGroupCreateStruct() method. + * + * @depends testNewContentTypeGroupCreateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeGroupCreateStruct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct $createStruct + * + * @return void + */ + public function testNewContentTypeGroupCreateStructValues( $createStruct ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'new-group', + 'creatorId' => null, + 'creationDate' => null, + // @todo uncomment when support for multilingual names and descriptions is added + //'mainLanguageCode' => null, + //'names' => null, + //'descriptions' => null + ), + $createStruct + ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return array + */ + public function testCreateContentTypeGroup() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + $groupCreate->creationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->mainLanguageCode = 'eng-GB'; + //$groupCreate->names = array( 'eng-US' => 'A name.' ); + //$groupCreate->descriptions = array( 'eng-US' => 'A description.' ); + + $group = $contentTypeService->createContentTypeGroup( $groupCreate ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup', + $group + ); + + return array( + 'expected' => $groupCreate, + 'actual' => $group, + ); + } + + /** + * Test for the newContentTypeGroupCreateStruct() method. + * + * @depends testCreateContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeGroupCreateStruct + * + * @param array $data + * + * @todo remove $notImplemented when implemented + * + * @return void + */ + public function testCreateContentTypeGroupStructValues( array $data ) + { + $notImplemented = array( + 'names', + 'descriptions', + 'mainLanguageCode' + ); + + $this->assertStructPropertiesCorrect( + $data['expected'], + $data['actual'], + $notImplemented + ); + + $this->assertNotNull( + $data['actual']->id + ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return void + */ + public function testCreateContentTypeGroupThrowsUnauthorizedException() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + $groupCreate->creationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + // $groupCreate->mainLanguageCode = 'eng-GB'; + // $groupCreate->names = array( 'eng-US' => 'A name.' ); + // $groupCreate->descriptions = array( 'eng-US' => 'A description.' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->createContentTypeGroup( $groupCreate ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return void + */ + public function testCreateContentTypeGroupThrowsInvalidArgumentException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->names = array( 'eng-GB'=> 'NewGroup' ); + //$groupCreate->descriptions = array(); + $contentTypeService->createContentTypeGroup( $groupCreate ); + + $secondGroupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + // @todo uncomment when support for multilingual names and descriptions is added + //$secondGroupCreate->names = array( 'eng-GB'=> 'NewGroup' ); + //$secondGroupCreate->descriptions = array(); + + // Throws an exception because group with identifier "new-group" already exists + $contentTypeService->createContentTypeGroup( $secondGroupCreate ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeGroup() method. + * + * @depends testCreateContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroup + * + * @return array + */ + public function testLoadContentTypeGroup() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + $groupCreate->creationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->mainLanguageCode = 'eng-GB'; + //$groupCreate->names = array( 'eng-US' => 'A name.' ); + //$groupCreate->descriptions = array( 'eng-US' => 'A description.' ); + + $storedGroup = $contentTypeService->createContentTypeGroup( $groupCreate ); + + /* BEGIN: Use Case */ + $loadedGroup = $contentTypeService->loadContentTypeGroup( + $storedGroup->id + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup', + $loadedGroup + ); + + return array( + 'expected' => $storedGroup, + 'actual' => $loadedGroup, + ); + } + + /** + * Test for the loadContentTypeGroup() method. + * + * @depends testLoadContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroup + * + * @param array $data + * + * @return void + */ + public function testLoadContentTypeGroupValues( array $data ) + { + $this->assertContentTypeGroupsEqual( $data ); + } + + /** + * Test for the loadContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroup + * + * @return void + */ + public function testLoadContentTypeGroupThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + // Throws exception + $loadedGroup = $contentTypeService->loadContentTypeGroup( PHP_INT_MAX ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeGroupByIdentifier() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroupByIdentifier + * + * @return array + */ + public function testLoadContentTypeGroupByIdentifier() + { + /* BEGIN: Use Case */ + $storedGroup = $this->createContentTypeGroup(); + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( + $storedGroup->identifier + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroup', + $loadedGroup + ); + + return array( + 'expected' => $storedGroup, + 'actual' => $loadedGroup, + ); + } + + /** + * Test for the loadContentTypeGroupByIdentifier() method. + * + * @depends testLoadContentTypeGroupByIdentifier + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroupByIdentifier + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $data + * + * @return void + */ + public function testLoadContentTypeGroupByIdentifierValues( array $data ) + { + $this->assertContentTypeGroupsEqual( $data ); + } + + /** + * Asserts that two given ContentTypeGroup objects contain the same group data + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $data + * + * @return void + * + * @todo remove $notImplemented when implemented + */ + protected function assertContentTypeGroupsEqual( array $data ) + { + $storedGroup = $data['expected']; + $loadedGroup = $data['actual']; + $notImplemented = array( + "mainLanguageCode", + "names", + "descriptions" + ); + + $this->assertSameClassPropertiesCorrect( + array( + "id", + "identifier", + "creationDate", + "modificationDate", + "creatorId", + "modifierId", + "mainLanguageCode", + "names", + "descriptions" + ), + $storedGroup, + $loadedGroup, + $notImplemented + ); + } + + /** + * Test for the loadContentTypeGroupByIdentifier() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroupByIdentifier + * + * @return void + */ + public function testLoadContentTypeGroupByIdentifierThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + // Throws an exception + $loadedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( + 'the-no-identifier-like-this' + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeGroups() method. + * + * @depends testLoadContentTypeGroup + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroups + * + * @return array + */ + public function testLoadContentTypeGroups() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedGroups = $contentTypeService->loadContentTypeGroups(); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedGroups + ); + + foreach ( $loadedGroups as $loadedGroup ) + { + $this->assertContentTypeGroupsEqual( + array( + "expected" => $contentTypeService->loadContentTypeGroup( $loadedGroup->id ), + "actual" => $loadedGroup + ) + ); + } + + return $loadedGroups; + } + + /** + * Test for the loadContentTypeGroups() method. + * + * @depends testLoadContentTypeGroups + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeGroups + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $groups + * + * @return void + */ + public function testLoadContentTypeGroupsIdentifiers( array $groups ) + { + $expectedIdentifiers = array( + 'Content' => true, + 'Users' => true, + 'Media' => true, + 'Setup' => true + ); + + $this->assertEquals( + count( $expectedIdentifiers ), + count( $groups ) + ); + + $actualIdentifiers = array( + 'Content' => false, + 'Users' => false, + 'Media' => false, + 'Setup' => false + ); + + foreach ( $groups as $group ) + { + $actualIdentifiers[$group->identifier] = true; + } + + $this->assertEquals( + $expectedIdentifiers, + $actualIdentifiers, + 'Identifier mismatch in loaded and actual groups.' + ); + } + + /** + * Test for the newContentTypeGroupUpdateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeGroupUpdateStruct + * + * @return void + */ + public function testNewContentTypeGroupUpdateStruct() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupUpdateStruct', + $groupUpdate + ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @depends testLoadContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeGroup + * + * @return array + */ + public function testUpdateContentTypeGroup() + { + $this->createContentTypeGroup(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + $groupUpdate->identifier = 'updated-group'; + $groupUpdate->modifierId = 42; + $groupUpdate->modificationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupUpdate->mainLanguageCode = 'en_US'; + //$groupUpdate->names = array( + // 'en_US' => 'A name', + // 'en_GB' => 'A name', + //); + //$groupUpdate->descriptions = array( + // 'en_US' => 'A description', + // 'en_GB' => 'A description', + //); + + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + /* END: Use Case */ + + $updatedGroup = $contentTypeService->loadContentTypeGroup( $group->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeGroupUpdateStruct', + $groupUpdate + ); + + return array( + 'originalGroup' => $group, + 'updateStruct' => $groupUpdate, + 'updatedGroup' => $updatedGroup, + ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @depends testUpdateContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeGroup + * + * @param array $data + * + * @todo remove $notImplemented when implemented + * + * @return void + */ + public function testUpdateContentTypeGroupStructValues( array $data ) + { + $originalGroup = $data['originalGroup']; + $updateStruct = $data['updateStruct']; + $updatedGroup = $data['updatedGroup']; + + $notImplemented = array( + "mainLanguageCode", + "names", + "descriptions" + ); + + $expectedValues = array( + 'identifier' => $updateStruct->identifier, + 'creationDate' => $originalGroup->creationDate, + 'modificationDate' => $updateStruct->modificationDate, + 'creatorId' => $originalGroup->creatorId, + 'modifierId' => $updateStruct->modifierId, + // @todo uncomment when support for multilingual names and descriptions is added + //'mainLanguageCode' => $updateStruct->mainLanguageCode, + //'names' => $updateStruct->names, + //'descriptions' => $updateStruct->descriptions, + ); + + $this->assertPropertiesCorrect( + $expectedValues, + $updatedGroup, + $notImplemented + ); + } + + /** + * Creates a group with identifier "new-group" + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + protected function createContentTypeGroup() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'new-group' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + $groupCreate->creationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->mainLanguageCode = 'eng-US'; + //$groupCreate->names = array( 'eng-US' => 'Name' ); + //$groupCreate->descriptions = array( 'eng-US' => 'Description' ); + + return $contentTypeService->createContentTypeGroup( $groupCreate ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeGroup + * + * @return void + */ + public function testUpdateContentTypeGroupThrowsUnauthorizedException() + { + $this->createContentTypeGroup(); + $contentTypeService = $this->repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + $groupUpdate->identifier = 'updated-group'; + $groupUpdate->modifierId = 42; + $groupUpdate->modificationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + /* + $groupUpdate->mainLanguageCode = 'en_US'; + $groupUpdate->names = array( + 'en_US' => 'A name', + 'en_GB' => 'A name', + ); + $groupUpdate->descriptions = array( + 'en_US' => 'A description', + 'en_GB' => 'A description', + ); + */ + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + } + + /** + * Test for the updateContentTypeGroup() method. + * + * @depends testUpdateContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeGroup + * + * @return void + */ + public function testUpdateContentTypeGroupThrowsInvalidArgumentException() + { + // Creates ContentTypeGroup with identifier "new-group" + $this->createContentTypeGroup(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'updated-group' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->names = array( 'eng-US' => 'Name' ); + //$groupCreate->descriptions = array( 'eng-US' => 'Description' ); + $groupToOverwrite = $contentTypeService->createContentTypeGroup( $groupCreate ); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + $groupUpdate = $contentTypeService->newContentTypeGroupUpdateStruct(); + $groupUpdate->identifier = 'updated-group'; + + // Exception, because group with identifier "updated-group" exists + $contentTypeService->updateContentTypeGroup( $group, $groupUpdate ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @depends testCreateContentTypeGroup + * @depends testLoadContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::deleteContentTypeGroup + * + * @return void + */ + public function testDeleteContentTypeGroup() + { + // Creates ContentTypeGroup with identifier "new-group" + $this->createContentTypeGroup(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + $contentTypeService->deleteContentTypeGroup( $group ); + /* END: Use Case */ + + try + { + $contentTypeService->loadContentTypeGroup( $group->id ); + $this->fail( 'Content type group not deleted.' ); + } + catch ( Exceptions\NotFoundException $e ) + { + // All fine + } + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::deleteContentTypeGroup + * + * @return void + */ + public function testDeleteContentTypeGroupThrowsInvalidArgumentException() + { + $this->createContentTypeGroup(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + // "Content" group + $contentGroup = $contentTypeService->loadContentTypeGroup( 1 ); + + // Throws exception because group content type has instances + $contentTypeService->deleteContentTypeGroup( $contentGroup ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::deleteContentTypeGroup + * + * @return void + */ + public function testDeleteContentTypeGroupThrowsUnauthorizedException() + { + $this->createContentTypeGroup(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $group = $contentTypeService->loadContentTypeGroupByIdentifier( 'new-group' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->deleteContentTypeGroup( $group ); + } + + /** + * Creates a number of ContentTypeGroup objects and returns them + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + protected function createGroups() + { + if ( empty( $this->contentTypeGroups ) ) + { + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'first-group' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + $groupCreate->creationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->mainLanguageCode = 'de_DE'; + //$groupCreate->names = array( 'en_US' => 'A name.' ); + //$groupCreate->descriptions = array( 'en_US' => 'A description.' ); + $this->contentTypeGroups[] = $contentTypeService->createContentTypeGroup( $groupCreate ); + + $groupCreate->identifier = 'second-group'; + $this->contentTypeGroups[] = $contentTypeService->createContentTypeGroup( $groupCreate ); + } + + return $this->contentTypeGroups; + } + + /** + * Test for the newContentTypeUpdateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct + */ + public function testNewContentTypeUpdateStruct() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeUpdateStruct = $contentTypeService->newContentTypeUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeUpdateStruct', + $contentTypeUpdateStruct + ); + + return $contentTypeUpdateStruct; + } + + /** + * Test for the newContentTypeUpdateStruct() method. + * + * @depends testNewContentTypeUpdateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeUpdateStruct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct + * + * @return void + */ + public function testNewContentTypeUpdateStructValues( $contentTypeUpdateStruct ) + { + foreach ( $contentTypeUpdateStruct as $propertyName => $propertyValue ) + { + $this->assertNull( + $propertyValue, + "Property '$propertyName' is not null." + ); + } + } + + /** + * Test for the newContentTypeCreateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct + */ + public function testNewContentTypeCreateStruct() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeCreateStruct', + $contentTypeCreateStruct + ); + + return $contentTypeCreateStruct; + } + + /** + * Test for the newContentTypeCreateStruct() method. + * + * @depends testNewContentTypeCreateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeCreateStruct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct $contentTypeCreateStruct + * + * @return void + */ + public function testNewContentTypeCreateStructValues( $contentTypeCreateStruct ) + { + $this->assertPropertiesCorrect( + array( + 'identifier' => 'new-type', + "mainLanguageCode" => null, + "remoteId" => null, + "urlAliasSchema" => null, + "nameSchema" => null, + "isContainer" => false, + "defaultSortField" => Location::SORT_FIELD_PUBLISHED, + "defaultSortOrder" => Location::SORT_ORDER_DESC, + "defaultAlwaysAvailable" => true, + "names" => null, + "descriptions" => null, + "creatorId" => null, + "creationDate" => null, + "fieldDefinitions" => array() + ), + $contentTypeCreateStruct + ); + } + + /** + * Test for the newContentTypeCreateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newFieldDefinitionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct + */ + public function testNewFieldDefinitionCreateStruct() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $fieldDefinitionCreateStruct = $contentTypeService->newFieldDefinitionCreateStruct( + "new-identifier", + "new-fieldtype-identifier" + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionCreateStruct', + $fieldDefinitionCreateStruct + ); + + return $fieldDefinitionCreateStruct; + } + + /** + * Test for the newContentTypeCreateStruct() method. + * + * @depends testNewFieldDefinitionCreateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newFieldDefinitionCreateStruct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + * + * @return void + */ + public function testNewFieldDefinitionCreateStructValues( $fieldDefinitionCreateStruct ) + { + $this->assertPropertiesCorrect( + array( + "fieldTypeIdentifier" => "new-fieldtype-identifier", + "identifier" => "new-identifier", + "names" => null, + "descriptions" => null, + "fieldGroup" => null, + "position" => null, + "isTranslatable" => null, + "isRequired" => null, + "isInfoCollector" => null, + "validatorConfiguration" => null, + "fieldSettings" => null, + "defaultValue" => null, + "isSearchable" => null + ), + $fieldDefinitionCreateStruct + ); + } + + /** + * Test for the newFieldDefinitionUpdateStruct() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newFieldDefinitionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct + */ + public function testNewFieldDefinitionUpdateStruct() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $fieldDefinitionUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinitionUpdateStruct', + $fieldDefinitionUpdateStruct + ); + + return $fieldDefinitionUpdateStruct; + } + + /** + * Test for the newFieldDefinitionUpdateStruct() method. + * + * @depends testNewFieldDefinitionUpdateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeUpdateStruct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + * + * @return void + */ + public function testNewFieldDefinitionUpdateStructValues( $fieldDefinitionUpdateStruct ) + { + foreach ( $fieldDefinitionUpdateStruct as $propertyName => $propertyValue ) + { + $this->assertNull( + $propertyValue, + "Property '$propertyName' is not null." + ); + } + } + + /** + * Creates a ContentType with identifier "new-type" and remoteId "new-remoteid" + * + * @param boolean $publish + * @param int $creatorId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType|\eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + protected function createContentType( $publish = true, $creatorId = null ) + { + $contentTypeService = $this->repository->getContentTypeService(); + if ( !isset( $creatorId ) ) $creatorId = $this->repository->getCurrentUser()->id; + + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + $typeCreateStruct->names = array( + 'eng-US' => 'American type title', + 'eng-GB' => 'British type title' + ); + $typeCreateStruct->descriptions = array( + 'eng-US' => 'American type description', + 'eng-GB' => 'British type description' + ); + $typeCreateStruct->remoteId = "new-remoteid"; + $typeCreateStruct->creatorId = $creatorId; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->nameSchema = "<title>"; + $typeCreateStruct->urlAliasSchema = "<title>"; + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', + 'ezstring' + ); + $titleFieldCreate->names = array( + 'eng-US' => 'American title field name', + 'eng-GB' => 'British title field name', + ); + $titleFieldCreate->descriptions = array( + 'eng-US' => 'American title field description', + 'eng-GB' => 'British title field description', + ); + $titleFieldCreate->fieldGroup = 'blog-content'; + $titleFieldCreate->position = 1; + $titleFieldCreate->isTranslatable = true; + $titleFieldCreate->isRequired = true; + $titleFieldCreate->isInfoCollector = false; + $titleFieldCreate->isSearchable = true; + $titleFieldCreate->defaultValue = "New text line"; + $titleFieldCreate->validatorConfiguration = array( + "StringLengthValidator" => array( + "maxStringLength" => 255, + "minStringLength" => 128 + ) + ); + //$titleFieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $titleFieldCreate ); + + $bodyFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'body', + 'eztext' + ); + $bodyFieldCreate->names = array( + 'eng-US' => 'American body field name', + 'eng-GB' => 'British body field name', + ); + $bodyFieldCreate->descriptions = array( + 'eng-US' => 'American body field description', + 'eng-GB' => 'British body field description', + ); + $bodyFieldCreate->fieldGroup = 'blog-content'; + $bodyFieldCreate->position = 2; + $bodyFieldCreate->isTranslatable = true; + $bodyFieldCreate->isRequired = false; + $bodyFieldCreate->isInfoCollector = false; + $bodyFieldCreate->isSearchable = true; + $bodyFieldCreate->defaultValue = ""; + //$bodyFieldCreate->validatorConfiguration + $bodyFieldCreate->fieldSettings = array( + "textRows" => 80 + ); + $typeCreateStruct->addFieldDefinition( $bodyFieldCreate ); + + $groups = $this->createGroups(); + + $type = $contentTypeService->createContentType( + $typeCreateStruct, + $groups + ); + + if ( $publish !== true ) + { + return $type; + } + + $contentTypeService->publishContentTypeDraft( $type ); + + return $contentTypeService->loadContentType( $type->id ); + } + + /** + * Creates a ContentTypeDraft with identifier "new-type" and remoteId "new-remoteid" + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + protected function createDraftContentType() + { + return $this->createContentType( false ); + } + + /** + * Creates a ContentType with identifier "new-type" and remoteId "new-remoteid" + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected function createPublishedContentType() + { + return $this->createContentType( true ); + } + + /** + * Test for the createContentTypeGroup() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return array + */ + public function testCreateContentType() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + $typeCreateStruct->names = array( + 'eng-US' => 'American type title', + 'eng-GB' => 'British type title' + ); + $typeCreateStruct->descriptions = array( + 'eng-US' => 'American type description', + 'eng-GB' => 'British type description' + ); + $typeCreateStruct->remoteId = "new-remoteid"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->nameSchema = "<name>"; + $typeCreateStruct->urlAliasSchema = "<name>"; + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', + 'ezstring' + ); + $titleFieldCreate->names = array( + 'eng-US' => 'American title field name', + 'eng-GB' => 'British title field name', + ); + $titleFieldCreate->descriptions = array( + 'eng-US' => 'American title field description', + 'eng-GB' => 'British title field description', + ); + $titleFieldCreate->fieldGroup = 'blog-content'; + $titleFieldCreate->position = 1; + $titleFieldCreate->isTranslatable = true; + $titleFieldCreate->isRequired = true; + $titleFieldCreate->isInfoCollector = false; + $titleFieldCreate->isSearchable = true; + $titleFieldCreate->defaultValue = "New text line"; + $titleFieldCreate->validatorConfiguration = array( + "StringLengthValidator" => array( + "maxStringLength" => 128 + ) + ); + //$titleFieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $titleFieldCreate ); + + $bodyFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'body', + 'eztext' + ); + $bodyFieldCreate->names = array( + 'eng-US' => 'American body field name', + 'eng-GB' => 'British body field name', + ); + $bodyFieldCreate->descriptions = array( + 'eng-US' => 'American body field description', + 'eng-GB' => 'British body field description', + ); + $bodyFieldCreate->fieldGroup = 'blog-content'; + $bodyFieldCreate->position = 2; + $bodyFieldCreate->isTranslatable = true; + $bodyFieldCreate->isRequired = false; + $bodyFieldCreate->isInfoCollector = false; + $bodyFieldCreate->isSearchable = true; + $bodyFieldCreate->defaultValue = ""; + //$bodyFieldCreate->validatorConfiguration + $bodyFieldCreate->fieldSettings = array( + "textRows" => 20 + ); + $typeCreateStruct->addFieldDefinition( $bodyFieldCreate ); + + $groups = $this->createGroups(); + + $type = $contentTypeService->createContentType( + $typeCreateStruct, + $groups + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $type + ); + + return array( + 'expected' => $typeCreateStruct, + 'actual' => $type, + 'groups' => $groups + ); + } + + /** + * Test for the newContentTypeGroupCreateStruct() method. + * + * @depends testCreateContentType + * @covers \eZ\Publish\Core\Repository\ContentTypeService::newContentTypeGroupCreateStruct + * + * @param array $data + * + * @return void + */ + public function testCreateContentTypeStructValues( array $data ) + { + /** @var $typeCreate \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct */ + $typeCreate = $data['expected']; + /** @var $contentType \eZ\Publish\Core\Repository\Values\ContentType\ContentType */ + $contentType = $data['actual']; + /** @var $groups \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] */ + $groups = $data['groups']; + + foreach ( $typeCreate as $propertyName => $propertyValue ) + { + switch ( $propertyName ) + { + case 'fieldDefinitions': + $this->assertCreatedFieldDefinitionsCorrect( + $typeCreate->fieldDefinitions, + $contentType->fieldDefinitions + ); + break; + + case 'contentTypeGroups': + $this->assertContentTypeGroupsCorrect( + $groups, + $contentType->contentTypeGroups + ); + break; + + default: + $this->assertEquals( + $typeCreate->$propertyName, + $contentType->$propertyName + ); + break; + } + } + + $this->assertContentTypeGroupsCorrect( + $groups, + $contentType->contentTypeGroups + ); + + $this->assertNotNull( + $contentType->id + ); + } + + /** + * Asserts field definition creation + * + * Asserts that all field definitions defined through created structs in + * $expectedDefinitionCreates have been correctly created in + * $actualDefinitions. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct[] $expectedDefinitionCreates + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] $actualDefinitions + * + * @return void + */ + protected function assertCreatedFieldDefinitionsCorrect( array $expectedDefinitionCreates, array $actualDefinitions ) + { + $this->assertEquals( + count( $expectedDefinitionCreates ), + count( $actualDefinitions ), + 'Count of field definition creates did not match count of field definitions.' + ); + + $sorter = function( $a, $b ) + { + return strcmp( $a->identifier, $b->identifier ); + }; + + usort( $expectedDefinitionCreates, $sorter ); + usort( $actualDefinitions, $sorter ); + + foreach ( $expectedDefinitionCreates as $key => $expectedCreate ) + { + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition', + $actualDefinitions[$key] + ); + $this->assertCreatedFieldDefinitionCorrect( + $expectedCreate, + $actualDefinitions[$key] + ); + } + } + + /** + * Asserts that a field definition has been correctly created. + * + * Asserts that the given $fieldDefinition is correctly created from the + * create struct in $fieldDefinitionCreateStruct. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + * + * @return void + */ + protected function assertCreatedFieldDefinitionCorrect( $fieldDefinitionCreateStruct, $fieldDefinition ) + { + foreach ( $fieldDefinitionCreateStruct as $propertyName => $propertyValue ) + { + switch ( $propertyName ) + { + case "fieldSettings": + $defaultSettings = $this->repository->getFieldTypeService()->getFieldType( + $fieldDefinitionCreateStruct->fieldTypeIdentifier + )->getSettingsSchema(); + $fieldDefinitionPropertyValue = (array)$fieldDefinition->$propertyName + $defaultSettings; + $propertyValue = (array)$propertyValue + $defaultSettings; + ksort( $fieldDefinitionPropertyValue ); + ksort( $propertyValue ); + break; + case "validatorConfiguration": + $fieldDefinitionPropertyValue = (array)$fieldDefinition->$propertyName; + $propertyValue = (array)$propertyValue; + $sorter = function ( $a, $b ) + { + if ( $a->identifier == $b->identifier ) + { + return 0; + } + return ( $a->identifier < $b->identifier ) ? -1 : 1; + }; + usort( $fieldDefinitionPropertyValue, $sorter ); + usort( $propertyValue, $sorter ); + break; + default: + $fieldDefinitionPropertyValue = $fieldDefinition->$propertyName; + } + + $this->assertEquals( + $propertyValue, + $fieldDefinitionPropertyValue, + "Field definition property '{$propertyName}' is not correctly created" + ); + } + } + + /** + * Asserts that two sets of ContentTypeGroups are equal. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $expectedGroups + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $actualGroups + * + * @return void + */ + protected function assertContentTypeGroupsCorrect( array $expectedGroups, array $actualGroups ) + { + $sorter = function ( $a, $b ) + { + if ( $a->id == $b->id ) + { + return 0; + } + return ( $a->id < $b->id ) ? -1 : 1; + }; + + usort( $expectedGroups, $sorter ); + usort( $actualGroups, $sorter ); + + foreach ( $expectedGroups as $index => $expectedGroup ) + { + $this->assertContentTypeGroupsEqual( + array( + "expected" => $expectedGroup, + "actual" => $actualGroups[$index] + ) + ); + } + } + + /** + * Test for the createContentTypeGroup() method. + * + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return void + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionGroupsEmpty() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + + // Thrown an exception because array of content type groups is empty + $type = $contentTypeService->createContentType( $typeCreateStruct, array() ); + /* END: Use Case */ + } + + /** + * Test for the createContentTypeGroup() method. + * + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Another ContentType with identifier 'new-type' exists + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return void + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionContentTypeExistsWithIdentifier() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + // Creates published content type with identifier "new-type" + $this->createPublishedContentType(); + + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + $typeCreateStruct->remoteId = "other-remoteid"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->names = array( 'eng-US' => 'A name.' ); + $typeCreateStruct->descriptions = array( 'eng-US' => 'A description.' ); + + // Throws an exception because content type with identifier "new-type" already exists + $type = $contentTypeService->createContentType( + $typeCreateStruct, + array( + // "Content" group + $contentTypeService->loadContentTypeGroup( 1 ) + ) + ); + /* END: Use Case */ + } + + /** + * Test for the createContentTypeGroup() method. + * + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Another ContentType with remoteId 'new-remoteid' exists + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return void + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionContentTypeExistsWithRemoteId() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + // Creates published content type with remoteId "new-remoteid" + $this->createPublishedContentType(); + + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'other-type' + ); + $typeCreateStruct->remoteId = "new-remoteid"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->names = array( 'eng-US' => 'A name.' ); + $typeCreateStruct->descriptions = array( 'eng-US' => 'A description.' ); + + // Throws an exception because content type with remoteId "new-remoteid" already exists + $type = $contentTypeService->createContentType( + $typeCreateStruct, + array( + // "Content" group + $contentTypeService->loadContentTypeGroup( 1 ) + ) + ); + /* END: Use Case */ + } + + /** + * Test for the createContentTypeGroup() method. + * + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Argument must contain at least one FieldDefinitionCreateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return array + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionNoFieldDefinitions() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + // Creates published content type with remoteId "new-remoteid" + $this->createPublishedContentType(); + + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'other-type' + ); + $typeCreateStruct->remoteId = "new-unique-remoteid"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->names = array( 'eng-US' => 'A name.' ); + $typeCreateStruct->descriptions = array( 'eng-US' => 'A description.' ); + + // Throws an exception because content type create struct does not have any field definition create structs set + $type = $contentTypeService->createContentType( + $typeCreateStruct, + array( + // "Content" group + $contentTypeService->loadContentTypeGroup( 1 ) + ) + ); + /* END: Use Case */ + } + + /** + * Test for the createContentTypeGroup() method. + * + * @depends testCreateContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @expectedExceptionMessage Argument contains duplicate field definition identifier 'title' + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeGroup + * + * @return array + */ + public function testCreateContentTypeThrowsInvalidArgumentExceptionDuplicateFieldDefinitionIdentifier() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + $typeCreateStruct->names = array( + 'eng-US' => 'American type title', + 'eng-GB' => 'British type title' + ); + $typeCreateStruct->descriptions = array( + 'eng-US' => 'American type description', + 'eng-GB' => 'British type description' + ); + $typeCreateStruct->remoteId = "new-remoteid"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->nameSchema = "<name>"; + $typeCreateStruct->urlAliasSchema = "<name>"; + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', + 'ezstring' + ); + $titleFieldCreate->names = array( + 'eng-US' => 'American title field name', + 'eng-GB' => 'British title field name', + ); + $titleFieldCreate->descriptions = array( + 'eng-US' => 'American title field description', + 'eng-GB' => 'British title field description', + ); + $titleFieldCreate->fieldGroup = 'blog-content'; + $titleFieldCreate->position = 1; + $titleFieldCreate->isTranslatable = true; + $titleFieldCreate->isRequired = true; + $titleFieldCreate->isInfoCollector = false; + $titleFieldCreate->isSearchable = true; + $titleFieldCreate->defaultValue = "New text line"; + $titleFieldCreate->validatorConfiguration = array( + "StringLengthValidator" => array( + "maxStringLength" => 128 + ) + ); + //$titleFieldCreate->fieldSettings + + $typeCreateStruct->addFieldDefinition( $titleFieldCreate ); + $typeCreateStruct->addFieldDefinition( clone $titleFieldCreate ); + + $groups = $this->createGroups(); + + // Throws an exception because two field definition create structs have the same identifier + $type = $contentTypeService->createContentType( + $typeCreateStruct, + $groups + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentType() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentType + * + * @return array + */ + public function testLoadContentType() + { + $storedContentType = $this->createPublishedContentType(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentType( + $storedContentType->id + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $loadedContentType + ); + + $this->assertNotInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedContentType + ); + + return array( + 'expected' => $storedContentType, + 'actual' => $loadedContentType, + ); + } + + /** + * Test for the loadContentType() method. + * + * @depends testLoadContentType + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentType + * + * @param array $data + * + * @return void + */ + public function testLoadContentTypeValues( array $data ) + { + $this->compareContentTypes( $data ); + } + + /** + * Compares two given ContentType objects + * + * @param array $data + * @param array $properties + * @param array $fieldProperties + * + * @return void + */ + protected function compareContentTypes( array $data, array $properties = array(), array $fieldProperties = array() ) + { + /** @var $storedContentType \eZ\Publish\Core\Repository\Values\ContentType\ContentType */ + $storedContentType = $data['expected']; + /** @var $loadedContentType \eZ\Publish\Core\Repository\Values\ContentType\ContentType */ + $loadedContentType = $data['actual']; + + $propertiesNames = array( + // Virtual properties + "names", + "descriptions", + "contentTypeGroups", + //"fieldDefinitions", + // Standard properties + "id", + "status", + "identifier", + "creationDate", + "modificationDate", + "creatorId", + "modifierId", + "remoteId", + "urlAliasSchema", + "nameSchema", + "isContainer", + "mainLanguageCode", + "defaultAlwaysAvailable", + "defaultSortField", + "defaultSortOrder" + ); + + $this->assertSameClassPropertiesCorrect( + array_diff( + $propertiesNames, + isset( $properties["notEqual"] ) ? $properties["notEqual"] : array() + ), + $storedContentType, + $loadedContentType, + isset( $properties["skip"] ) ? $properties["skip"] : array() + ); + + $this->assertSameClassPropertiesCorrect( + isset( $properties["notEqual"] ) ? $properties["notEqual"] : array(), + $storedContentType, + $loadedContentType, + isset( $properties["skip"] ) ? $properties["skip"] : array(), + false + ); + + $this->assertEquals( + count( $storedContentType->fieldDefinitions ), + count( $loadedContentType->fieldDefinitions ), + "Field count in stored and loaded content type groups does not match" + ); + + foreach ( $storedContentType->fieldDefinitions as $index => $expectedFieldDefinition ) + { + $actualFieldDefinition = $loadedContentType->fieldDefinitions[$index]; + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition', + $actualFieldDefinition + ); + $this->compareFieldDefinitions( + $expectedFieldDefinition, + $actualFieldDefinition, + $fieldProperties + ); + } + } + + /** + * Compares two FieldDefinition objects + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $expectedFieldDefinition + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $actualFieldDefinition + * @param array $properties Array of field names to skip or compare as not equal + * + * @return void + */ + protected function compareFieldDefinitions( $expectedFieldDefinition, $actualFieldDefinition, $properties = array() ) + { + $propertiesNames = array( + "names", + "descriptions", + "fieldSettings", + "validatorConfiguration", + "id", + "identifier", + "fieldGroup", + "position", + "fieldTypeIdentifier", + "isTranslatable", + "isRequired", + "isInfoCollector", + // Do not compare defaultValue as they may have different representations + //"defaultValue", + "isSearchable" + ); + + $this->assertSameClassPropertiesCorrect( + array_diff( + $propertiesNames, + isset( $properties["notEqual"] ) ? $properties["notEqual"] : array() + ), + $expectedFieldDefinition, + $actualFieldDefinition, + isset( $properties["skip"] ) ? $properties["skip"] : array() + ); + + $this->assertSameClassPropertiesCorrect( + isset( $properties["notEqual"] ) ? $properties["notEqual"] : array(), + $expectedFieldDefinition, + $actualFieldDefinition, + isset( $properties["skip"] ) ? $properties["skip"] : array(), + false + ); + } + + /** + * Test for the loadContentType() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentType + * + * @return void + */ + public function testLoadContentTypeThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentType( + PHP_INT_MAX + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeByIdentifier() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeByIdentifier + * + * @return array + */ + public function testLoadContentTypeByIdentifier() + { + $storedContentType = $this->createPublishedContentType(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentTypeByIdentifier( + $storedContentType->identifier + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $loadedContentType + ); + + return array( + 'expected' => $storedContentType, + 'actual' => $loadedContentType, + ); + } + + /** + * Test for the loadContentTypeByIdentifier() method. + * + * @depends testLoadContentTypeByIdentifier + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeByIdentifier + * + * @param array $data + * + * @return void + */ + public function testLoadContentTypeByIdentifierValues( array $data ) + { + $this->compareContentTypes( $data ); + } + + /** + * Test for the loadContentTypeByIdentifier() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeByIdentifier + * + * @return void + */ + public function testLoadContentTypeByIdentifierThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentTypeByIdentifier( + "non-existing-identifier" + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeByRemoteId() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeByRemoteId + * + * @return array + */ + public function testLoadContentTypeByRemoteId() + { + $storedContentType = $this->createPublishedContentType(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentTypeByRemoteId( + $storedContentType->remoteId + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $loadedContentType + ); + + return array( + 'expected' => $storedContentType, + 'actual' => $loadedContentType + ); + } + + /** + * Test for the loadContentTypeByRemoteId() method. + * + * @depends testLoadContentTypeByRemoteId + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeByRemoteId + * + * @param array $data + * + * @return void + */ + public function testLoadContentTypeByRemoteIdValues( array $data ) + { + $this->compareContentTypes( $data ); + } + + /** + * Test for the loadContentTypeByRemoteId() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeByRemoteId + * + * @return void + */ + public function testLoadContentTypeByRemoteIdThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentTypeByRemoteId( + "non-existing-remoteid" + ); + /* END: Use Case */ + } + + /** + * Test for the loadContentTypeDraft() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeDraft + * + * @return array + */ + public function testLoadContentTypeDraft() + { + $storedContentTypeDraft = $this->createDraftContentType(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentTypeDraft = $contentTypeService->loadContentTypeDraft( + $storedContentTypeDraft->id + ); + /* END: Use Case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedContentTypeDraft + ); + + return array( + 'expected' => $storedContentTypeDraft, + 'actual' => $loadedContentTypeDraft, + ); + } + + /** + * Test for the loadContentTypeDraft() method. + * + * @depends testLoadContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeDraft + * + * @param array $data + * + * @return array + */ + public function testLoadContentTypeDraftValues( array $data ) + { + $this->compareContentTypes( $data ); + } + + /** + * Test for the loadContentTypeDraft() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypeDraft + * + * @return array + */ + public function testLoadContentTypeDraftThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $loadedContentType = $contentTypeService->loadContentTypeDraft( + PHP_INT_MAX + ); + /* END: Use Case */ + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @depends testCreateContentType + * @depends testLoadContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::publishContentTypeDraft + * + * @return void + */ + public function testPublishContentTypeDraft() + { + $contentTypeDraft = $this->createDraftContentType(); + $draftId = $contentTypeDraft->id; + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + /* END: Use Case */ + + $publishedType = $contentTypeService->loadContentType( $draftId ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentType', + $publishedType + ); + $this->assertNotInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $publishedType + ); + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @depends testPublishContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::publishContentTypeDraft + * + * @return void + */ + public function testPublishContentTypeDraftThrowsBadStateException() + { + $contentTypeDraft = $this->createDraftContentType(); + $draftId = $contentTypeDraft->id; + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + + // Throws exception, since no draft exists anymore + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + /* END: Use Case */ + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @depends testPublishContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::publishContentTypeDraft + * + * @return void + */ + public function testPublishContentTypeDraftThrowsInvalidArgumentException() + { + $contentTypeService = $this->repository->getContentTypeService(); + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( 'new-type' ); + $typeCreateStruct->names = array( 'eng-GB' => 'Type title' ); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $type = $contentTypeService->createContentType( + $typeCreateStruct, + $this->createGroups() + ); + + // Throws an exception because type has no field definitions + $contentTypeService->publishContentTypeDraft( $type ); + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @depends testPublishContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::publishContentTypeDraft + * + * @return void + */ + public function testPublishContentTypeDraftSetsNameSchema() + { + $contentTypeService = $this->repository->getContentTypeService(); + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'new-type' + ); + $typeCreateStruct->names = array( + 'eng-GB' => 'Type title' + ); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( 'title', 'ezstring' ); + $titleFieldCreate->position = 1; + $typeCreateStruct->addFieldDefinition( $titleFieldCreate ); + + $type = $contentTypeService->createContentType( + $typeCreateStruct, + $this->createGroups() + ); + + $contentTypeService->publishContentTypeDraft( $type ); + + $loadedContentType = $contentTypeService->loadContentType( $type->id ); + + $this->assertEquals( "<title>", $loadedContentType->nameSchema ); + } + + /** + * Test for the publishContentTypeDraft() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::publishContentTypeDraft + * + * @return void + */ + public function testPublishContentTypeDraftThrowsUnauthorizedException() + { + $contentTypeDraft = $this->createDraftContentType(); + $draftId = $contentTypeDraft->id; + + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->publishContentTypeDraft( $contentTypeDraft ); + } + + /** + * Test for the loadContentTypes() method. + * + * @depends testNewContentTypeGroupCreateStruct + * @depends testNewContentTypeCreateStruct + * @depends testNewFieldDefinitionCreateStruct + * @depends testCreateContentTypeGroup + * @depends testCreateContentType + * @depends testPublishContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypes + * + * @todo when all fieldTypes are functional revisit this and simplify by testing against fixtures + * + * @return array + */ + public function testLoadContentTypes() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $groupCreate = $contentTypeService->newContentTypeGroupCreateStruct( + 'test-group-1' + ); + $groupCreate->creatorId = $this->repository->getCurrentUser()->id; + $groupCreate->creationDate = new \DateTime(); + // @todo uncomment when support for multilingual names and descriptions is added + //$groupCreate->mainLanguageCode = 'ger-DE'; + //$groupCreate->names = array( 'eng-US' => 'A name.' ); + //$groupCreate->descriptions = array( 'eng-US' => 'A description.' ); + $group = $contentTypeService->createContentTypeGroup( $groupCreate ); + + $typeCreateStruct = $contentTypeService->newContentTypeCreateStruct( + 'test-type-1' + ); + $typeCreateStruct->names = array( + 'eng-US' => 'American type title', + 'eng-GB' => 'British type title' + ); + $typeCreateStruct->descriptions = array( + 'eng-US' => 'American type description', + 'eng-GB' => 'British type description' + ); + $typeCreateStruct->remoteId = "test-remoteid-1"; + $typeCreateStruct->creatorId = $this->repository->getCurrentUser()->id; + $typeCreateStruct->creationDate = new \DateTime(); + $typeCreateStruct->mainLanguageCode = 'eng-GB'; + $typeCreateStruct->nameSchema = "<name>"; + $typeCreateStruct->urlAliasSchema = "<name>"; + + $titleFieldCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', + 'ezstring' + ); + $titleFieldCreate->names = array( + 'eng-US' => 'American title field name', + 'eng-GB' => 'British title field name', + ); + $titleFieldCreate->descriptions = array( + 'eng-US' => 'American title field description', + 'eng-GB' => 'British title field description', + ); + $titleFieldCreate->fieldGroup = 'blog-content'; + $titleFieldCreate->position = 1; + $titleFieldCreate->isTranslatable = true; + $titleFieldCreate->isRequired = true; + $titleFieldCreate->isInfoCollector = false; + $titleFieldCreate->isSearchable = true; + $titleFieldCreate->defaultValue = "New text line"; + //$titleFieldCreate->validators + //$titleFieldCreate->fieldSettings + $typeCreateStruct->addFieldDefinition( $titleFieldCreate ); + + $type1 = $contentTypeService->createContentType( + $typeCreateStruct, + array( $group ) + ); + $contentTypeService->publishContentTypeDraft( $type1 ); + + $typeCreateStruct->identifier = "test-type-2"; + $typeCreateStruct->remoteId = "test-remoteid-2"; + $type2 = $contentTypeService->createContentType( + $typeCreateStruct, + array( $group ) + ); + $contentTypeService->publishContentTypeDraft( $type2 ); + + /* BEGIN: Use Case */ + $loadedTypes = $contentTypeService->loadContentTypes( $group ); + /* END: Use Case */ + + $this->assertInternalType( + 'array', + $loadedTypes + ); + + return $loadedTypes; + } + + /** + * Test for the loadContentTypeGroups() method. + * + * @depends testLoadContentTypes + * @covers \eZ\Publish\Core\Repository\ContentTypeService::loadContentTypes + * + * @param array $types + * + * @return void + */ + public function testLoadContentTypesIdentifiers( array $types ) + { + $expectedIdentifiers = array( 'test-type-1' => true, 'test-type-2' => true ); + + $this->assertEquals( count( $expectedIdentifiers ), count( $types ) ); + + $actualIdentifiers = array( 'test-type-1' => false, 'test-type-2' => false ); + + foreach ( $types as $type ) + { + $actualIdentifiers[$type->identifier] = true; + } + + $this->assertEquals( + $expectedIdentifiers, + $actualIdentifiers, + 'Identifier mismatch in loaded types.' + ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @depends testCreateContentType + * @depends testPublishContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeDraft + * + * @return array + */ + public function testCreateContentTypeDraft() + { + $publishedType = $this->createPublishedContentType(); + + /* BEGIN: Use case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $draftType = $contentTypeService->createContentTypeDraft( $publishedType ); + /* END: Use case */ + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $draftType + ); + + return array( + "expected" => $publishedType, + "actual" => $draftType + ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @depends testCreateContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeDraft + * + * @param array $data + */ + public function testCreateContentTypeDraftValues( array $data ) + { + /** @var $publishedType \eZ\Publish\Core\Repository\Values\ContentType\ContentType */ + $publishedType = $data['expected']; + /** @var $draftType \eZ\Publish\Core\Repository\Values\ContentType\ContentTypeDraft */ + $draftType = $data['actual']; + + $typeProperties = array( + "skip" => array( + "id", + "status", + "modificationDate" + ) + ); + $this->compareContentTypes( + $data, + $typeProperties + ); + + $this->assertEquals( + $publishedType->id, + $draftType->id + ); + + $this->assertEquals( + $draftType->status, + ContentType::STATUS_DRAFT + ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeDraft + * + * @return void + */ + public function testCreateContentTypeDraftThrowsUnauthorizedException() + { + $publishedType = $this->createPublishedContentType(); + + $contentTypeService = $this->repository->getContentTypeService(); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->createContentTypeDraft( $publishedType ); + } + + /** + * Test for the createContentTypeDraft() method. + * + * @depends testCreateContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::createContentTypeDraft + * + * @return void + */ + public function testCreateContentTypeDraftThrowsBadStateException() + { + $publishedType = $this->createPublishedContentType(); + // Create draft for current user + $this->repository->getContentTypeService()->createContentTypeDraft( $publishedType ); + + /* BEGIN: Use case */ + // $publishedType contains a ContentType object + $contentTypeService = $this->repository->getContentTypeService(); + + // Throws an exception because ContentType has an existing draft belonging to another user + $draft = $contentTypeService->createContentTypeDraft( $publishedType ); + /* END: Use case */ + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @depends testCreateContentType + * @depends testLoadContentTypeDraft + * @depends testNewContentTypeUpdateStruct + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeDraft + * + * @return array + */ + public function testUpdateContentTypeDraft() + { + $contentTypeDraft = $this->createDraftContentType(); + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft + + $contentTypeService = $this->repository->getContentTypeService(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->identifier = 'news-article'; + $typeUpdate->remoteId = '4cf35f5166fd31bf0cda859dc837e095daee9833'; + $typeUpdate->urlAliasSchema = 'url@alias|scheme'; + $typeUpdate->nameSchema = '@name@scheme@'; + $typeUpdate->isContainer = true; + $typeUpdate->mainLanguageCode = 'eng-US'; + $typeUpdate->defaultAlwaysAvailable = false; + $typeUpdate->modifierId = $this->repository->getCurrentUser()->id; + $typeUpdate->modificationDate = new \DateTime(); + $typeUpdate->defaultSortField = Location::SORT_FIELD_PUBLISHED; + $typeUpdate->defaultSortOrder = Location::SORT_ORDER_ASC; + $typeUpdate->names = array( + 'eng-US' => 'News article', + 'eng-GB' => 'Nachrichten-Artikel', + ); + $typeUpdate->descriptions = array( + 'eng-US' => 'A news article', + 'eng-GB' => 'Ein Nachrichten-Artikel', + ); + + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + + $updatedType = $contentTypeService->loadContentTypeDraft( + $contentTypeDraft->id + ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $updatedType + ); + + return array( + 'originalType' => $contentTypeDraft, + 'updateStruct' => $typeUpdate, + 'updatedType' => $updatedType, + ); + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @depends testUpdateContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeDraft + * + * @param array $data + * + * @return void + */ + public function testUpdateContentTypeDraftStructValues( array $data ) + { + $originalType = $data['originalType']; + $updateStruct = $data['updateStruct']; + $updatedType = $data['updatedType']; + + $this->assertPropertiesCorrect( + array( + 'id' => $originalType->id, + 'names' => $updateStruct->names, + 'descriptions' => $updateStruct->descriptions, + 'identifier' => $updateStruct->identifier, + 'creationDate' => $originalType->creationDate, + 'modificationDate' => $updateStruct->modificationDate, + 'creatorId' => $originalType->creatorId, + 'modifierId' => $updateStruct->modifierId, + 'urlAliasSchema' => $updateStruct->urlAliasSchema, + 'nameSchema' => $updateStruct->nameSchema, + 'isContainer' => $updateStruct->isContainer, + 'mainLanguageCode' => $updateStruct->mainLanguageCode, + 'contentTypeGroups' => $originalType->contentTypeGroups, + //'fieldDefinitions' => $originalType->fieldDefinitions, + ), + $updatedType + ); + + $this->assertEquals( + count( $originalType->fieldDefinitions ), + count( $updatedType->fieldDefinitions ), + "Field count in stored and loaded content type groups does not match" + ); + + foreach ( $originalType->fieldDefinitions as $index => $expectedFieldDefinition ) + { + $actualFieldDefinition = $updatedType->fieldDefinitions[$index]; + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition', + $actualFieldDefinition + ); + $this->compareFieldDefinitions( + $expectedFieldDefinition, + $actualFieldDefinition + ); + } + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeDraft + * + * @return void + */ + public function testUpdateContentTypeDraftThrowsUnauthorizedException() + { + $contentTypeDraft = $this->createDraftContentType(); + $contentTypeService = $this->repository->getContentTypeService(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->identifier = 'news-article'; + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @depends testUpdateContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeDraft + * + * @return void + */ + public function testUpdateContentTypeDraftThrowsInvalidArgumentExceptionDuplicateIdentifier() + { + $contentTypeDraft = $this->createDraftContentType(); + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft with identifier 'blog-post' + + $contentTypeService = $this->repository->getContentTypeService(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->identifier = 'folder'; + + // Throws exception, since type "folder" already exists + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @depends testUpdateContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeDraft + * + * @return void + */ + public function testUpdateContentTypeDraftThrowsInvalidArgumentExceptionDuplicateRemoteId() + { + $contentTypeDraft = $this->createDraftContentType(); + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft with identifier 'blog-post' + + $contentTypeService = $this->repository->getContentTypeService(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + $typeUpdate->remoteId = 'a3d405b81be900468eb153d774f4f0d2'; + + // Throws exception, since remote ID of type "folder" is used + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + } + + /** + * Test for the updateContentTypeDraft() method. + * + * @depends testUpdateContentTypeDraft + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateContentTypeDraft + * + * @return void + */ + public function testUpdateContentTypeDraftThrowsInvalidArgumentExceptionNoDraftForAuthenticatedUser() + { + $contentTypeDraft = $this->createContentType( false, $this->getStubbedUser( 28 )->id ); + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft with identifier 'blog-post', belonging to the user with id=28 + + $contentTypeService = $this->repository->getContentTypeService(); + + $typeUpdate = $contentTypeService->newContentTypeUpdateStruct(); + + // Throws exception, since draft belongs to another user + $contentTypeService->updateContentTypeDraft( $contentTypeDraft, $typeUpdate ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentType() method. + * + * @depends testLoadContentTypeByIdentifier + * @depends testLoadContentType + * @covers \eZ\Publish\Core\Repository\ContentTypeService::deleteContentType + * + * @return void + */ + public function testDeleteContentType() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + $contentTypeService->deleteContentType( $commentType ); + /* END: Use Case */ + + try + { + $contentTypeService->loadContentType( $commentType->id ); + $this->fail( 'Content type could be loaded after delete.' ); + } + catch ( Exceptions\NotFoundException $e ) + { + // All fine + } + } + + /** + * Test for the deleteContentType() method. + * + * @depends testDeleteContentType + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::deleteContentType + * + * @return void + */ + public function testDeleteContentTypeThrowsBadStateException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( "folder" ); + + // Throws an exception because folder type still has content instances + $contentTypeService->deleteContentType( $commentType ); + /* END: Use Case */ + } + + /** + * Test for the deleteContentType() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::deleteContentType + * + * @return void + */ + public function testDeleteContentTypeThrowsUnauthorizedException() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->deleteContentType( $commentType ); + } + + /** + * Test for the copyContentType() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::copyContentType + * + * @return array + */ + public function testCopyContentType() + { + $time = time(); + + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + $copiedCommentType = $contentTypeService->copyContentType( $commentType ); + /* END: Use Case */ + + return array( + 'originalType' => $commentType, + 'copiedType' => $copiedCommentType, + "time" => $time, + "userId" => $this->repository->getCurrentUser()->id + ); + } + + /** + * Test for the copyContentType() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::copyContentType + * + * @return array + */ + public function testCopyContentTypeWithSecondArgument() + { + $time = time(); + + /* BEGIN: Use Case */ + $user = $this->getStubbedUser( 14 ); + $this->repository->setCurrentUser( $user ); + $contentTypeService = $this->repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( "comment" ); + + $copiedCommentType = $contentTypeService->copyContentType( $commentType, $user ); + /* END: Use Case */ + + return array( + "originalType" => $commentType, + "copiedType" => $copiedCommentType, + "time" => $time, + "userId" => $user->id + ); + } + + /** + * Asserts that copied content type is valid copy of original content type + * + * @param array $data + */ + protected function assertCopyContentTypeValues( array $data ) + { + /** @var $originalType \eZ\Publish\Core\Repository\Values\ContentType\ContentType */ + $originalType = $data["originalType"]; + /** @var $copiedType \eZ\Publish\Core\Repository\Values\ContentType\ContentType */ + $copiedType = $data["copiedType"]; + $userId = $data["userId"]; + $time = $data["time"]; + + $this->compareContentTypes( + array( + "expected" => $originalType, + "actual" => $copiedType + ), + array( + "notEqual" => array( + "id", + "identifier", + "creationDate", + "modificationDate", + "remoteId" + ), + "skip" => array( + "creatorId", + "modifierId", + "status" + ) + ), + array( + "notEqual" => array( + "id" + ) + ) + ); + + $this->assertGreaterThanOrEqual( $time, $copiedType->creationDate->getTimestamp() ); + $this->assertGreaterThanOrEqual( $time, $copiedType->modificationDate->getTimestamp() ); + $this->assertEquals( $userId, $copiedType->creatorId ); + $this->assertEquals( $userId, $copiedType->modifierId ); + $this->assertEquals( ContentType::STATUS_DEFINED, $copiedType->status ); + } + + /** + * Test for the copyContentType() method. + * + * @depends testCopyContentType + * @covers \eZ\Publish\Core\Repository\ContentTypeService::copyContentType + * + * @param array $data + * + * @return void + */ + public function testCopyContentTypeValues( array $data ) + { + $this->assertCopyContentTypeValues( $data ); + } + + /** + * Test for the copyContentType() method. + * + * @depends testCopyContentTypeWithSecondArgument + * @covers \eZ\Publish\Core\Repository\ContentTypeService::copyContentType + * + * @param array $data + * + * @return void + */ + public function testCopyContentTypeWithSecondArgumentValues( array $data ) + { + $this->assertCopyContentTypeValues( $data ); + } + + /** + * Test for the copyContentType() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::copyContentType + * + * @return void + */ + public function testCopyContentTypeThrowsUnauthorizedException() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $commentType = $contentTypeService->loadContentTypeByIdentifier( 'comment' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->copyContentType( $commentType ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @depends testLoadContentTypeGroupByIdentifier + * @depends testLoadContentTypeByIdentifier + * @depends testLoadContentType + * @covers \eZ\Publish\Core\Repository\ContentTypeService::assignContentTypeGroup + * + * @return void + */ + public function testAssignContentTypeGroup() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentType( $folderType->id ); + + foreach ( $loadedType->contentTypeGroups as $loadedGroup ) + { + if ( $mediaGroup->id == $loadedGroup->id ) + { + return; + } + } + $this->fail( + sprintf( + 'Group with ID "%s" not assigned to content type.', + $mediaGroup->id + ) + ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::assignContentTypeGroup + * + * @return void + */ + public function testAssignContentTypeGroupThrowsUnauthorizedException() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + } + + /** + * Test for the assignContentTypeGroup() method. + * + * @depends testAssignContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::assignContentTypeGroup + * + * @return void + */ + public function testAssignContentTypeGroupThrowsInvalidArgumentException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $assignedGroups = $folderType->contentTypeGroups; + + foreach ( $assignedGroups as $assignedGroup ) + { + // Throws an exception, since group is already assigned + $contentTypeService->assignContentTypeGroup( $folderType, $assignedGroup ); + } + /* END: Use Case */ + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @depends testLoadContentTypeGroupByIdentifier + * @depends testLoadContentTypeByIdentifier + * @depends testLoadContentType + * @depends testAssignContentTypeGroup + * @covers \eZ\Publish\Core\Repository\ContentTypeService::unassignContentTypeGroup + * + * @return void + */ + public function testUnassignContentTypeGroup() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ); + + // May not unassign last group + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + + $contentTypeService->unassignContentTypeGroup( $folderType, $contentGroup ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentType( $folderType->id ); + + foreach ( $loadedType->contentTypeGroups as $assignedGroup ) + { + if ( $assignedGroup->id == $contentGroup->id ) + { + $this->fail( + sprintf( + 'Group with ID "%s" not unassigned.', + $contentGroup->id + ) + ); + } + } + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::unassignContentTypeGroup + * + * @return void + */ + public function testUnassignContentTypeGroupThrowsUnauthorizedException() + { + $contentTypeService = $this->repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + + $mediaGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + $contentGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Content' ); + + // May not unassign last group + $contentTypeService->assignContentTypeGroup( $folderType, $mediaGroup ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->unassignContentTypeGroup( $folderType, $contentGroup ); + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @depends testUnassignContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::unassignContentTypeGroup + * + * @return void + */ + public function testUnassignContentTypeGroupThrowsInvalidArgumentException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $notAssignedGroup = $contentTypeService->loadContentTypeGroupByIdentifier( 'Media' ); + + // Throws an exception, since "Media" group is not assigned to "folder" + $contentTypeService->unassignContentTypeGroup( $folderType, $notAssignedGroup ); + /* END: Use Case */ + } + + /** + * Test for the unassignContentTypeGroup() method. + * + * @depends testUnassignContentTypeGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::unassignContentTypeGroup + * + * @return void + */ + public function testUnassignContentTypeGroupThrowsBadStateException() + { + /* BEGIN: Use Case */ + $contentTypeService = $this->repository->getContentTypeService(); + + $folderType = $contentTypeService->loadContentTypeByIdentifier( 'folder' ); + $assignedGroups = $folderType->contentTypeGroups; + + foreach ( $assignedGroups as $assignedGroup ) + { + // Throws an exception, when last group is to be removed + $contentTypeService->unassignContentTypeGroup( $folderType, $assignedGroup ); + } + /* END: Use Case */ + } + + /** + * Test for the addFieldDefinition() method. + * + * @dep_ends testCreateContentType + * @dep_ends testLoadContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::addFieldDefinition + * + * @return array + */ + public function testAddFieldDefinitionWithValidators() + { + $contentTypeDraft = $this->createDraftContentType(); + $contentTypeService = $this->repository->getContentTypeService(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'tags', 'ezstring' + ); + $fieldDefCreate->names = array( + 'eng-US' => 'Tags', + 'ger-DE' => 'Schlagworte', + ); + $fieldDefCreate->descriptions = array( + 'eng-US' => 'Tags of the blog post', + 'ger-DE' => 'Schlagworte des Blog-Eintrages', + ); + $fieldDefCreate->fieldGroup = 'blog-meta'; + $fieldDefCreate->position = 1; + $fieldDefCreate->isTranslatable = true; + $fieldDefCreate->isRequired = true; + $fieldDefCreate->isInfoCollector = false; + $fieldDefCreate->defaultValue = "New tags text line"; + $fieldDefCreate->validatorConfiguration = array( + "StringLengthValidator" => array( + "maxStringLength" => 255, + "minStringLength" => 128 + ) + ); + $fieldDefCreate->fieldSettings = null; + $fieldDefCreate->isSearchable = true; + + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + + $loadedType = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedType + ); + + $this->assertAddFieldDefinitionStructValues( $loadedType, $fieldDefCreate ); + } + + /** + * Test for the addFieldDefinition() method. + * + * @depends testCreateContentType + * @depends testLoadContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::addFieldDefinition + * + * @return array + */ + public function testAddFieldDefinitionWithSettings() + { + $contentTypeDraft = $this->createDraftContentType(); + $contentTypeService = $this->repository->getContentTypeService(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'body2', 'ezxmltext' + ); + $fieldDefCreate->names = array( + 'eng-US' => 'Body', + 'ger-DE' => 'Körper', + ); + $fieldDefCreate->descriptions = array( + 'eng-US' => 'Body of the blog post', + 'ger-DE' => 'Körper der den Blog-Post', + ); + $fieldDefCreate->fieldGroup = 'blog-content'; + $fieldDefCreate->position = 1; + $fieldDefCreate->isTranslatable = true; + $fieldDefCreate->isRequired = false; + $fieldDefCreate->isInfoCollector = false; + $fieldDefCreate->defaultValue = new XmlValue; + $fieldDefCreate->validatorConfiguration = array(); + $fieldDefCreate->fieldSettings = array( + 'numRows' => 10, + 'tagPreset' => \eZ\Publish\Core\FieldType\XmlText\Type::TAG_PRESET_SIMPLE_FORMATTING, + ); + $fieldDefCreate->isSearchable = true; + + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + + $loadedType = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedType + ); + + $this->assertAddFieldDefinitionStructValues( $loadedType, $fieldDefCreate ); + } + + public function assertAddFieldDefinitionStructValues( $loadedType, $fieldDefCreate ) + { + foreach ( $loadedType->fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier == $fieldDefCreate->identifier ) + { + $this->assertCreatedFieldDefinitionCorrect( $fieldDefCreate, $fieldDefinition ); + return; + } + } + + $this->fail( + sprintf( + 'Field definition with identifier "%s" not created.', + $fieldDefCreate->identifier + ) + ); + } + + /** + * Test for the addFieldDefinition() method. + * + * @dep_ends testAddFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::addFieldDefinition + * + * @return void + */ + public function testAddFieldDefinitionThrowsInvalidArgumentExceptionDuplicateFieldIdentifier() + { + $contentTypeDraft = $this->createDraftContentType(); + + /* BEGIN: Use Case */ + // $contentTypeDraft contains a ContentTypeDraft + // $contentTypeDraft has a field "title" + + $contentTypeService = $this->repository->getContentTypeService(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( + 'title', 'string' + ); + + // Throws an exception + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + /* END: Use Case */ + } + + /** + * Test for the addFieldDefinition() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::addFieldDefinition + * + * @return void + */ + public function testAddFieldDefinitionThrowsUnauthorizedException() + { + $contentTypeDraft = $this->createDraftContentType(); + $contentTypeService = $this->repository->getContentTypeService(); + + $fieldDefCreate = $contentTypeService->newFieldDefinitionCreateStruct( 'tags', 'ezstring' ); + $fieldDefCreate->names = array( 'eng-US' => 'Tags' ); + $fieldDefCreate->descriptions = array( 'eng-US' => 'Tags of the blog post' ); + $fieldDefCreate->fieldGroup = 'blog-meta'; + $fieldDefCreate->position = 1; + $fieldDefCreate->isTranslatable = true; + $fieldDefCreate->isRequired = true; + $fieldDefCreate->isInfoCollector = false; + $fieldDefCreate->defaultValue = "New tags text line"; + $fieldDefCreate->fieldSettings = null; + $fieldDefCreate->isSearchable = true; + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->addFieldDefinition( $contentTypeDraft, $fieldDefCreate ); + } + + /** + * Test for the removeFieldDefinition() method. + * + * @depends testCreateContentType + * @depends testLoadContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::removeFieldDefinition + * + * @return array + */ + public function testRemoveFieldDefinition() + { + $contentTypeDraft = $this->createDraftContentType(); + $draftId = $contentTypeDraft->id; + + /* BEGIN: Use Case */ + // $draftId contains the ID of a content type draft + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + /* END: Use Case */ + + $loadedType = $contentTypeService->loadContentTypeDraft( $contentTypeDraft->id ); + + $this->assertInstanceOf( + 'eZ\\Publish\\API\\Repository\\Values\\ContentType\\ContentTypeDraft', + $loadedType + ); + + return array( + 'removedFieldDefinition' => $bodyField, + 'loadedType' => $loadedType, + ); + } + + /** + * Test for the removeFieldDefinition() method. + * + * @depends testRemoveFieldDefinition + * @covers \eZ\Publish\Core\Repository\ContentTypeService::removeFieldDefinition + * + * @param array $data + * + * @return void + */ + public function testRemoveFieldDefinitionRemoved( array $data ) + { + $removedFieldDefinition = $data['removedFieldDefinition']; + $loadedType = $data['loadedType']; + + foreach ( $loadedType->fieldDefinitions as $fieldDefinition ) + { + if ( $fieldDefinition->identifier == $removedFieldDefinition->identifier ) + { + $this->fail( + sprintf( + 'Field definition with identifier "%s" not removed.', + $removedFieldDefinition->identifier + ) + ); + } + } + } + + /** + * Test for the removeFieldDefinition() method. + * + * @depends testRemoveFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::removeFieldDefinition + * + * @return void + */ + public function testRemoveFieldDefinitionThrowsInvalidArgumentException() + { + $draftId = $this->createDraftContentType()->id; + + /* BEGIN: Use Case */ + // $draftId contains the ID of a content type draft + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + + // Throws an exception because "body" has already been removed + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + /* END: Use Case */ + } + + /** + * Test for the removeFieldDefinition() method. + * + * @depends testRemoveFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::removeFieldDefinition + * + * @return void + */ + public function testRemoveFieldDefinitionThrowsInvalidArgumentExceptionVariation() + { + $draftId = $this->createDraftContentType()->id; + $secondDraftId = $this->createDraftContentType()->id; + + /* BEGIN: Use Case */ + // $draftId and $secondDraftId contain the ids of a different content type drafts that both have "body" field + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $secondContentTypeDraft = $contentTypeService->loadContentTypeDraft( $secondDraftId ); + + $bodyField = $secondContentTypeDraft->getFieldDefinition( 'body' ); + + // Throws an exception because $bodyField field belongs to another draft + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + /* END: Use Case */ + } + + /** + * Test for the removeFieldDefinition() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::removeFieldDefinition + * + * @return void + */ + public function testRemoveFieldDefinitionThrowsUnauthorizedException() + { + $contentTypeDraft = $this->createDraftContentType(); + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $this->repository->getContentTypeService()->removeFieldDefinition( $contentTypeDraft, $bodyField ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @depends testCreateContentType + * @depends testLoadContentTypeDraft + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateFieldDefinition + * + * @return array + */ + public function testUpdateFieldDefinition() + { + $draftId = $this->createDraftContentType()->id; + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $fieldDefinition = $contentTypeDraft->getFieldDefinition( "body" ); + + $fieldDefinitionUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $fieldDefinitionUpdateStruct->identifier = $fieldDefinition->identifier . "changed"; + $fieldDefinitionUpdateStruct->names = array( + "eng-US" => $fieldDefinition->getName( "eng-US" ) . "changed", + "ger-DE" => $fieldDefinition->getName( "ger-DE" ) . "changed" + ); + $fieldDefinitionUpdateStruct->descriptions = array( + "eng-US" => $fieldDefinition->getDescription( "eng-US" ) . "changed", + "ger-DE" => $fieldDefinition->getDescription( "ger-DE" ) . "changed" + ); + $fieldDefinitionUpdateStruct->fieldGroup = $fieldDefinition->fieldGroup . "changed"; + $fieldDefinitionUpdateStruct->position = $fieldDefinition->position + 1; + $fieldDefinitionUpdateStruct->isTranslatable = !$fieldDefinition->isTranslatable; + $fieldDefinitionUpdateStruct->isRequired = !$fieldDefinition->isRequired; + $fieldDefinitionUpdateStruct->isInfoCollector = !$fieldDefinition->isInfoCollector; + $fieldDefinitionUpdateStruct->defaultValue = (string)$fieldDefinition->defaultValue . "changed"; + //$fieldDefinitionUpdateStruct->validators + $fieldDefinitionUpdateStruct->fieldSettings = array( + "textRows" => $fieldDefinition->fieldSettings["textRows"] + 1 + ); + $fieldDefinitionUpdateStruct->isSearchable = !$fieldDefinition->isSearchable; + + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $fieldDefinition, + $fieldDefinitionUpdateStruct + ); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $updatedFieldDefinition = $contentTypeDraft->getFieldDefinition( $fieldDefinitionUpdateStruct->identifier ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition", + $updatedFieldDefinition + ); + + $this->assertUpdateFieldDefinitionStructValues( + $fieldDefinition, + $updatedFieldDefinition, + $fieldDefinitionUpdateStruct + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @depends testUpdateFieldDefinition + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateFieldDefinition + * + * @return array + */ + public function testUpdateFieldDefinitionWithValidatorConfiguration() + { + $draftId = $this->createDraftContentType()->id; + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $fieldDefinition = $contentTypeDraft->getFieldDefinition( "title" ); + + $fieldDefinitionUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $fieldDefinitionUpdateStruct->validatorConfiguration = array( + "StringLengthValidator" => array( + "minStringLength" => + (int)$fieldDefinition->validatorConfiguration["StringLengthValidator"]["minStringLength"] + 1, + "maxStringLength" => + (int)$fieldDefinition->validatorConfiguration["StringLengthValidator"]["maxStringLength"] + 1 + ) + ); + + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $fieldDefinition, + $fieldDefinitionUpdateStruct + ); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $updatedFieldDefinition = $contentTypeDraft->getFieldDefinition( "title" ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\ContentType\\FieldDefinition", + $updatedFieldDefinition + ); + + $this->assertUpdateFieldDefinitionStructValues( + $fieldDefinition, + $updatedFieldDefinition, + $fieldDefinitionUpdateStruct + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateFieldDefinition + */ + public function testUpdateFieldDefinitionWithEmptyStruct() + { + $draftId = $this->createDraftContentType()->id; + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $fieldDefinition = $contentTypeDraft->getFieldDefinition( 'body' ); + $fieldDefinitionUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $fieldDefinition, + $fieldDefinitionUpdateStruct + ); + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + $updatedFieldDefinition = $contentTypeDraft->getFieldDefinition( 'body' ); + + self::assertEquals( + $fieldDefinition, + $updatedFieldDefinition + ); + } + + protected function assertUpdateFieldDefinitionStructValues( $originalField, $updatedField, $updateStruct ) + { + $this->assertPropertiesCorrect( + array( + 'id' => $originalField->id, + 'fieldTypeIdentifier' => $originalField->fieldTypeIdentifier, + 'identifier' => $updateStruct->identifier === null ? + $originalField->identifier : + $updateStruct->identifier, + 'names' => $updateStruct->names === null ? + $originalField->names : + $updateStruct->names, + 'descriptions' => $updateStruct->descriptions === null ? + $originalField->descriptions : + $updateStruct->descriptions, + 'fieldGroup' => $updateStruct->fieldGroup === null ? + $originalField->fieldGroup : + $updateStruct->fieldGroup, + 'position' => $updateStruct->position === null ? + $originalField->position : + $updateStruct->position, + 'isTranslatable' => $updateStruct->isTranslatable === null ? + $originalField->isTranslatable : + $updateStruct->isTranslatable, + 'isRequired' => $updateStruct->isRequired === null ? + $originalField->isRequired : + $updateStruct->isRequired, + 'isInfoCollector' => $updateStruct->isInfoCollector === null ? + $originalField->isInfoCollector : + $updateStruct->isInfoCollector, + 'defaultValue' => $originalField->defaultValue === null ? + $originalField->defaultValue : + $updateStruct->defaultValue, + 'isSearchable' => $updateStruct->isSearchable === null ? + $originalField->isSearchable : + $updateStruct->isSearchable, + ), + $updatedField, + // Do not compare defaultValue as they may have different representations + array( "defaultValue" ) + ); + + $expectedFieldSettings = (array)$updateStruct->fieldSettings; + $actualFieldSettings = (array)$updatedField->fieldSettings; + ksort( $expectedFieldSettings ); + ksort( $actualFieldSettings ); + $this->assertEquals( + $expectedFieldSettings, + $actualFieldSettings, + "Field definition property 'fieldSettings' is not correctly updated" + ); + + $expectedValidators = (array)$updateStruct->validatorConfiguration; + $actualValidators = (array)$updatedField->validatorConfiguration; + $sorter = function ( $a, $b ) + { + if ( $a->identifier == $b->identifier ) return 0; + return ( $a->identifier < $b->identifier ) ? -1 : 1; + }; + usort( $expectedValidators, $sorter ); + usort( $actualValidators, $sorter ); + $this->assertEquals( + $expectedValidators, + $actualValidators, + "Field definition property 'validatorConfiguration' is not correctly updated" + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @depends testUpdateFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateFieldDefinition + * + * @return void + */ + public function testUpdateFieldDefinitionThrowsInvalidArgumentExceptionFieldIdentifierExists() + { + $contentTypeDraft = $this->createDraftContentType(); + $draftId = $contentTypeDraft->id; + + /* BEGIN: Use Case */ + // $draftId contains the ID of a content type draft + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + $titleField = $contentTypeDraft->getFieldDefinition( 'title' ); + + $bodyUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $bodyUpdateStruct->identifier = 'title'; + + // Throws exception, since "title" field already exists + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $bodyField, + $bodyUpdateStruct + ); + /* END: Use Case */ + } + + /** + * Test for the updateFieldDefinition() method. + * + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateFieldDefinition + * + * @return void + */ + public function testUpdateFieldDefinitionThrowsUnauthorizedException() + { + $contentTypeService = $this->repository->getContentTypeService(); + $contentTypeDraft = $this->createDraftContentType(); + $fieldDefinition = $contentTypeDraft->getFieldDefinition( "body" ); + + $fieldDefinitionUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + $fieldDefinitionUpdateStruct->identifier = $fieldDefinition->identifier . "changed"; + + // Set anonymous as current user + $this->repository->setCurrentUser( $this->getStubbedUser( 10 ) ); + + $contentTypeService->updateFieldDefinition( + $contentTypeDraft, + $fieldDefinition, + $fieldDefinitionUpdateStruct + ); + } + + /** + * Test for the updateFieldDefinition() method. + * + * @depends testUpdateFieldDefinition + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\ContentTypeService::updateFieldDefinition + * + * @return void + */ + public function testUpdateFieldDefinitionThrowsInvalidArgumentExceptionFieldIdNotFound() + { + $contentTypeDraft = $this->createDraftContentType(); + $draftId = $contentTypeDraft->id; + + /* BEGIN: Use Case */ + // $draftId contains the ID of a content type draft + $contentTypeService = $this->repository->getContentTypeService(); + + $contentTypeDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $bodyField = $contentTypeDraft->getFieldDefinition( 'body' ); + $contentTypeService->removeFieldDefinition( $contentTypeDraft, $bodyField ); + + $loadedDraft = $contentTypeService->loadContentTypeDraft( $draftId ); + + $bodyUpdateStruct = $contentTypeService->newFieldDefinitionUpdateStruct(); + + // Throws exception, since field "body" is already deleted + $contentTypeService->updateFieldDefinition( + $loadedDraft, + $bodyField, + $bodyUpdateStruct + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/FieldTypeBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/FieldTypeBase.php new file mode 100644 index 0000000..61aa210 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/FieldTypeBase.php @@ -0,0 +1,190 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\FieldTypeBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; + +/** + * Test case for FieldType service + */ +abstract class FieldTypeBase extends BaseServiceTest +{ + protected $fieldIdentifiersData; + + /** + * Test for the getFieldTypes() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::getFieldTypes + */ + public function testGetFieldTypes() + { + $fieldTypeService = $this->repository->getFieldTypeService(); + $refObject = new \ReflectionObject( $fieldTypeService ); + $refProperty = $refObject->getProperty( 'settings' ); + $refProperty->setAccessible( true ); + $fieldTypeSettings = $refProperty->getValue( $fieldTypeService ); + + $fieldTypes = $fieldTypeService->getFieldTypes(); + + self::assertEquals( count( $fieldTypeSettings ), count( $fieldTypes ) ); + foreach ( $fieldTypes as $fieldType ) + { + self::assertInstanceOf( "eZ\\Publish\\API\\Repository\\FieldType", $fieldType ); + self::assertInternalType( "string", $fieldType->getFieldTypeIdentifier() ); + self::assertArrayHasKey( $fieldType->getFieldTypeIdentifier(), $fieldTypeSettings ); + } + } + + protected function getFieldIdentifiersData() + { + if ( !isset( $this->fieldIdentifiersData ) ) + { + $fieldTypeService = $this->getRepository()->getFieldTypeService(); + $refObject = new \ReflectionObject( $fieldTypeService ); + $refProperty = $refObject->getProperty( 'settings' ); + $refProperty->setAccessible( true ); + $fieldTypeIdentifiers = array_keys( $refProperty->getValue( $fieldTypeService ) ); + + $this->fieldIdentifiersData = array_map( + function ( $identifier ) + { + return array( $identifier ); + }, + $fieldTypeIdentifiers + ); + } + + return $this->fieldIdentifiersData; + } + + public function providerForTestGetFieldType() + { + return $this->getFieldIdentifiersData(); + } + + /** + * Test for the getFieldType() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::getFieldType + * @dataProvider providerForTestGetFieldType + */ + public function testGetFieldType( $identifier ) + { + $fieldTypeService = $this->repository->getFieldTypeService(); + $fieldType = $fieldTypeService->getFieldType( $identifier ); + + self::assertInstanceOf( "eZ\\Publish\\API\\Repository\\FieldType", $fieldType ); + self::assertInternalType( "string", $fieldType->getFieldTypeIdentifier() ); + self::assertEquals( $identifier, $fieldType->getFieldTypeIdentifier() ); + } + + public function providerForTestGetFieldTypeThrowsNotFoundException() + { + return array( + array( "EZSTRING" ), + array( "thingamajigger" ) + ); + } + + /** + * Test for the getFieldType() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::getFieldType + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @dataProvider providerForTestGetFieldTypeThrowsNotFoundException + */ + public function testGetFieldTypeThrowsNotFoundException( $identifier ) + { + $fieldTypeService = $this->repository->getFieldTypeService(); + $fieldTypeService->getFieldType( $identifier ); + } + + public function providerForTestHasFieldTypeTrue() + { + return $this->getFieldIdentifiersData(); + } + + /** + * Test for the hasFieldType() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::hasFieldType + * @dataProvider providerForTestHasFieldTypeTrue + */ + public function testHasFieldTypeTrue( $identifier ) + { + self::assertTrue( + $this->repository->getFieldTypeService()->hasFieldType( $identifier ) + ); + } + + public function providerForTestHasFieldTypeFalse() + { + return array( + array( "EZSTRING" ), + array( "thingamajigger" ) + ); + } + + /** + * Test for the hasFieldType() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::hasFieldType + * @dataProvider providerForTestHasFieldTypeFalse + */ + public function testHasFieldTypeFalse( $identifier ) + { + self::assertFalse( + $this->repository->getFieldTypeService()->hasFieldType( $identifier ) + ); + } + + public function providerForTestBuildFieldType() + { + return $this->getFieldIdentifiersData(); + } + + /** + * Test for the buildFieldType() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::buildFieldType + * @dataProvider providerForTestBuildFieldType + */ + public function testBuildFieldType( $identifier ) + { + $fieldTypeService = $this->repository->getFieldTypeService(); + $fieldType = $fieldTypeService->buildFieldType( $identifier ); + + self::assertInstanceOf( "eZ\\Publish\\Core\\FieldType\\FieldType", $fieldType ); + $fieldTypeIdentifier = $fieldType->getFieldTypeIdentifier(); + self::assertInternalType( "string", $fieldType->getFieldTypeIdentifier() ); + self::assertEquals( $identifier, $fieldType->getFieldTypeIdentifier() ); + } + + public function providerForTestBuildFieldTypeThrowsNotFoundException() + { + return array( + array( "EZSTRING" ), + array( "thingamajigger" ) + ); + } + + /** + * Test for the buildFieldType() method. + * + * @covers \eZ\Publish\Core\Repository\FieldTypeService::buildFieldType + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @dataProvider providerForTestBuildFieldTypeThrowsNotFoundException + */ + public function testBuildFieldTypeThrowsNotFoundException( $identifier ) + { + $fieldTypeService = $this->repository->getFieldTypeService(); + $fieldTypeService->getFieldType( $identifier ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/IOBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/IOBase.php new file mode 100644 index 0000000..17402bb --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/IOBase.php @@ -0,0 +1,391 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\IOBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\IO\BinaryFile; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for IO Service + */ +abstract class IOBase extends BaseServiceTest +{ + /** + * @return \PHPUnit_Extensions_PhptTestCase + */ + abstract protected function getFileUploadTest(); + + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\IO\BinaryFile::__construct + */ + public function testNewClass() + { + $binaryFile = new BinaryFile(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'size' => null, + 'mtime' => null, + 'ctime' => null, + 'mimeType' => null, + 'uri' => null, + 'originalFile' => null + ), + $binaryFile + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\IO\BinaryFile::__get + */ + public function testMissingProperty() + { + try + { + $binaryFile = new BinaryFile(); + $value = $binaryFile->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\IO\BinaryFile::__set + */ + public function testReadOnlyProperty() + { + try + { + $binaryFile = new BinaryFile(); + $binaryFile->id = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\IO\BinaryFile::__isset + */ + public function testIsPropertySet() + { + $binaryFile = new BinaryFile(); + $value = isset( $binaryFile->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $binaryFile->id ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\IO\BinaryFile::__unset + */ + public function testUnsetProperty() + { + $binaryFile = new BinaryFile( array( "id" => "file-id" ) ); + try + { + unset( $binaryFile->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test creating new BinaryCreateStruct from uploaded file + * @covers \eZ\Publish\API\Repository\IOService::newBinaryCreateStructFromUploadedFile + */ + public function testNewBinaryCreateStructFromUploadedFile() + { + self::markTestSkipped( 'Test skipped as it seems to depend on php-cgi' ); + $uploadTest = $this->getFileUploadTest(); + $result = $uploadTest->run();// Fails because of unset cgi param and missing php-cgi exe + // Params bellow makes the code execute but fails: + //->run( null, array( 'cgi' => 'php' ) ); + + if ( $result->failureCount() > 0 ) + { + self::fail( + "Failed file upload test, failureCount() > 0: " . + $this->expandFailureMessages( $result->failures() ) + ); + } + + if ( $result->errorCount() > 0 ) + { + self::fail( + "Failed file upload test, errorCount() > 0: " . + $this->expandFailureMessages( $result->errors() ) + ); + } + + if ( $result->skippedCount() > 0 ) + { + self::fail( + "Failed file upload test, skippedCount() > 0: " . + $this->expandFailureMessages( $result->skipped() ) + ); + } + } + + /** + * @param array $failures + * @param string $delimiter + * + * @return string + */ + private function expandFailureMessages( array $failures, $delimiter = ', ' ) + { + $messages = array(); + /** + * @var \PHPUnit_Framework_TestFailure $failure + */ + foreach ( $failures as $failure ) + { + $e = $failure->thrownException(); + $text = "\n\nException " . get_class( $e ) . ' in file ' . $e->getFile() . ':' . $e->getLine() . "\n"; + $text .= $e->toString(); + $text .= "\n" . $e->getTraceAsString(); + $messages[] = $text; + } + return implode( $delimiter, $messages ); + + } + + /** + * Test creating new BinaryCreateStruct from uploaded file throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\IOService::newBinaryCreateStructFromUploadedFile + */ + public function testNewBinaryCreateStructFromUploadedFileThrowsInvalidArgumentException() + { + $ioService = $this->repository->getIOService(); + + $postArray = array( + 'name' => 'ezplogo.png', + 'type' => 'image/png', + 'tmp_name' => __DIR__ . '/ezplogo.png', + 'size' => 7329, + 'error' => 0 + ); + + $ioService->newBinaryCreateStructFromUploadedFile( $postArray ); + } + + /** + * Test creating new BinaryCreateStruct from local file + * @covers \eZ\Publish\API\Repository\IOService::newBinaryCreateStructFromLocalFile + */ + public function testNewBinaryCreateStructFromLocalFile() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo.png'; + + $binaryCreateStruct = $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct', $binaryCreateStruct ); + + $fileHandle = fopen( $filePath, 'rb' ); + + $this->assertPropertiesCorrect( + array( + 'mimeType' => 'image/png', + 'uri' => $filePath, + 'originalFileName' => 'ezplogo.png', + 'size' => 7329 + ), + $binaryCreateStruct + ); + + $expectedStreamMetaData = stream_get_meta_data( $fileHandle ); + $actualStreamMetaData = stream_get_meta_data( $binaryCreateStruct->inputStream ); + + self::assertEquals( $expectedStreamMetaData, $actualStreamMetaData ); + + fclose( $fileHandle ); + fclose( $binaryCreateStruct->inputStream ); + } + + /** + * Test creating new BinaryCreateStruct from local file throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\IOService::newBinaryCreateStructFromLocalFile + */ + public function testNewBinaryCreateStructFromLocalFileThrowsInvalidArgumentException() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo-invalid.png'; + + $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + } + + /** + * Test creating new BinaryFile in the repository + * @covers \eZ\Publish\API\Repository\IOService::createBinaryFile + */ + public function testCreateBinaryFile() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo.png'; + + $binaryCreateStruct = $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + $binaryCreateStruct->uri = 'var/test/ezplogo.png'; + + $binaryFile = $ioService->createBinaryFile( $binaryCreateStruct ); + + $this->assertPropertiesCorrect( + array( + //@todo: is binary file ID equal to path? + 'id' => $binaryCreateStruct->uri, + 'size' => $binaryCreateStruct->size, + 'mimeType' => $binaryCreateStruct->mimeType, + 'uri' => $binaryCreateStruct->uri, + 'originalFile' => $binaryCreateStruct->originalFileName + ), + $binaryFile, + array( + 'mtime', + 'ctime' + ) + ); + } + + /** + * Test deleting BinaryFile from the repository + * @covers \eZ\Publish\API\Repository\IOService::deleteBinaryFile + */ + public function testDeleteBinaryFileThrowsNotFoundException() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo.png'; + + $binaryCreateStruct = $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + $binaryCreateStruct->uri = 'var/test/ezplogo.png'; + + $binaryFile = $ioService->createBinaryFile( $binaryCreateStruct ); + + $loadedBinaryFile = $ioService->loadBinaryFile( $binaryFile->id ); + + $ioService->deleteBinaryFile( $loadedBinaryFile ); + + try + { + $ioService->loadBinaryFile( $loadedBinaryFile->id ); + self::fail( "succeeded loading deleted file" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test loading BinaryFile from the repository + * @covers \eZ\Publish\API\Repository\IOService::loadBinaryFile + */ + public function testLoadBinaryFile() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo.png'; + + $binaryCreateStruct = $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + $binaryCreateStruct->uri = 'var/test/ezplogo.png'; + + $binaryFile = $ioService->createBinaryFile( $binaryCreateStruct ); + + $loadedBinaryFile = $ioService->loadBinaryFile( $binaryFile->id ); + + $this->assertSameClassPropertiesCorrect( + array( + 'id', + 'size', + 'mtime', + 'ctime', + 'mimeType', + 'uri', + 'originalFile' + ), + $binaryFile, + $loadedBinaryFile + ); + } + + /** + * Test loading BinaryFile from the repository throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\IOService::loadBinaryFile + */ + public function testLoadBinaryFileThrowsNotFoundException() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo-invalid.png'; + $ioService->loadBinaryFile( $filePath ); + } + + /** + * Test getting file input stream + * @covers \eZ\Publish\API\Repository\IOService::getFileInputStream + */ + public function testGetFileInputStream() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo.png'; + + $binaryCreateStruct = $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + $binaryCreateStruct->uri = 'var/test/ezplogo.png'; + + $binaryFile = $ioService->createBinaryFile( $binaryCreateStruct ); + + $loadedInputStream = $ioService->getFileInputStream( $binaryFile ); + + self::assertEquals( true, is_resource( $loadedInputStream ) ); + } + + /** + * Test getting file contents + * @covers \eZ\Publish\API\Repository\IOService::getFileContents + */ + public function testGetFileContents() + { + $ioService = $this->repository->getIOService(); + + $filePath = __DIR__ . '/ezplogo.png'; + + $binaryCreateStruct = $ioService->newBinaryCreateStructFromLocalFile( $filePath ); + $binaryCreateStruct->uri = 'var/test/ezplogo.png'; + + $binaryFile = $ioService->createBinaryFile( $binaryCreateStruct ); + + $expectedFileContents = file_get_contents( $filePath ); + $loadedFileContents = $ioService->getFileContents( $binaryFile ); + + self::assertEquals( base64_encode( $expectedFileContents ), base64_encode( $loadedFileContents ) ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ContentTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ContentTest.php new file mode 100644 index 0000000..ac7f4cb --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ContentTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\ContentBase as BaseContentServiceTest; + +/** + * Test case for Content Service using InMemory storage class + */ +class ContentTest extends BaseContentServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ContentTypeTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ContentTypeTest.php new file mode 100644 index 0000000..fee374c --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ContentTypeTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\ContentTypeTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\ContentTypeBase as BaseContentTypeServiceTest; + +/** + * Test case for ContentType Service using InMemory storage class + */ +class ContentTypeTest extends BaseContentTypeServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/FieldTypeTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/FieldTypeTest.php new file mode 100644 index 0000000..396f6c5 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/FieldTypeTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\FieldTypeTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\FieldTypeBase as BaseFieldTypeTest; + +/** + * Test case for FieldType Service using InMemory storage class + */ +class FieldTypeTest extends BaseFieldTypeTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/IOTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/IOTest.php new file mode 100644 index 0000000..4161ca3 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/IOTest.php @@ -0,0 +1,31 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\IOTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\IOBase as BaseIOServiceTest; + +/** + * Test case for IO Service using InMemory storage class + */ +class IOTest extends BaseIOServiceTest +{ + /** + * @return \PHPUnit_Extensions_PhptTestCase + */ + protected function getFileUploadTest() + { + return new IOUploadPHPT(); + } + + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/IOUploadPHPT.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/IOUploadPHPT.php new file mode 100644 index 0000000..b479aea --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/IOUploadPHPT.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\IOUploadTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use PHPUnit_Extensions_PhptTestCase; + +/** + * Test case for IO file upload using InMemory storage class + */ +class IOUploadPHPT extends PHPUnit_Extensions_PhptTestCase +{ + public function __construct() + { + parent::__construct( __DIR__ . '/upload.phpt' ); + } + + // this method needs to be public static so upload.phpt test + // can get ahold of Repository object + public static function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/LanguageTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/LanguageTest.php new file mode 100644 index 0000000..2654c41 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/LanguageTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\LanguageTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\LanguageBase as BaseLanguageServiceTest; + +/** + * Test case for Language Service using InMemory storage class + */ +class LanguageTest extends BaseLanguageServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/LocationTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/LocationTest.php new file mode 100644 index 0000000..0d0847d --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/LocationTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\LocationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\LocationBase as BaseLocationServiceTest; + +/** + * Test case for Location Service using InMemory storage class + */ +class LocationTest extends BaseLocationServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/NameSchemaTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/NameSchemaTest.php new file mode 100644 index 0000000..60539a0 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/NameSchemaTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\NameSchemaTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\NameSchemaBase as BaseNameSchemaTest; + +/** + * Test case for NameSchema Service using InMemory storage class + */ +class NameSchemaTest extends BaseNameSchemaTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ObjectStateTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ObjectStateTest.php new file mode 100644 index 0000000..e0fe8fc --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/ObjectStateTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\ObjectStateTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\ObjectStateBase as BaseObjectStateServiceTest; + +/** + * Test case for object state Service using InMemory storage class + */ +class ObjectStateTest extends BaseObjectStateServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/RepositoryTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/RepositoryTest.php new file mode 100644 index 0000000..a1ed632 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/RepositoryTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\RepositoryTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\RepositoryTest as BaseRepositoryTest; + +/** + * Test case for Repository Service using InMemory storage class + */ +class RepositoryTest extends BaseRepositoryTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/RoleTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/RoleTest.php new file mode 100644 index 0000000..75aca6f --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/RoleTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\RoleTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\RoleBase as BaseRoleServiceTest; + +/** + * Test case for Role Service using InMemory storage class + */ +class RoleTest extends BaseRoleServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/SearchTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/SearchTest.php new file mode 100644 index 0000000..2286536 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/SearchTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\SearchTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\SearchBase as BaseSearchServiceTest; + +/** + * Test case for Section Service using InMemory storage class + */ +class SearchTest extends BaseSearchServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/SectionTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/SectionTest.php new file mode 100644 index 0000000..7cf67a7 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/SectionTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\SectionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\SectionBase as BaseSectionServiceTest; + +/** + * Test case for Section Service using InMemory storage class + */ +class SectionTest extends BaseSectionServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/TrashTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/TrashTest.php new file mode 100644 index 0000000..87e65de --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/TrashTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\TrashTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\TrashBase as BaseTrashServiceTest; + +/** + * Test case for Trash Service using InMemory storage class + */ +class TrashTest extends BaseTrashServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UrlAliasTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UrlAliasTest.php new file mode 100644 index 0000000..b40fbe3 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UrlAliasTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\UrlAliasTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\UrlAliasBase as BaseUrlAliasTest; + +/** + * Test case for UrlAlias Service using InMemory storage class + */ +class UrlAliasTest extends BaseUrlAliasTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UrlWildcardTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UrlWildcardTest.php new file mode 100644 index 0000000..15c9625 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UrlWildcardTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\UrlWildcardTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\UrlWildcardBase as BaseUrlWildcardTest; + +/** + * Test case for UrlWildcard Service using InMemory storage class + */ +class UrlWildcardTest extends BaseUrlWildcardTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UserTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UserTest.php new file mode 100644 index 0000000..0a035ac --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/UserTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\UserTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\UserBase as BaseUserServiceTest; + +/** + * Test case for User Service using InMemory storage class + */ +class UserTest extends BaseUserServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/Utils.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/Utils.php new file mode 100644 index 0000000..b12405c --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/Utils.php @@ -0,0 +1,57 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\Utils class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory; + +use RuntimeException; + +/** + * Utils class for InMemory test + */ +abstract class Utils +{ + /** + * @param string $persistenceHandler + * @param string $ioHandler + * @param string $dsn + * + * @throws \RuntimeException + * + * @return \eZ\Publish\Core\Base\ServiceContainer + */ + protected static function getServiceContainer( + $persistenceHandler = 'persistence_handler_inmemory', + $ioHandler = 'io_handler_inmemory', + $dsn = 'sqlite://:memory:' + ) + { + // Get configuration config + if ( !( $settings = include ( 'config.php' ) ) ) + { + throw new RuntimeException( 'Could not find config.php, please copy config.php-DEVELOPMENT to config.php customize to your needs!' ); + } + + $settings['base']['Configuration']['UseCache'] = false; + $settings['persistence_handler']['alias'] = $persistenceHandler; + $settings['io_handler']['alias'] = $ioHandler; + $settings['service']['parameters']['legacy_dsn'] = $dsn; + + // Return Service Container + return require 'container.php'; + + } + + /** + * @return \eZ\Publish\API\Repository\Repository + */ + public static function getRepository() + { + return self::getServiceContainer()->get( 'inner_repository' ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/upload.phpt b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/upload.phpt new file mode 100644 index 0000000..887e65d --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/InMemory/upload.phpt @@ -0,0 +1,39 @@ +--TEST-- +Test file upload for IOService with InMemory persistence handler +--POST_RAW-- +Content-Type: multipart/form-data; boundary=---------------------------2921238217421 + +-----------------------------2921238217421 +Content-Disposition: form-data; name="file"; filename="stairway_to_heaven.txt" +Content-Type: text/plain + +There's a lady who's sure +All that glitters is gold +And she's buying a stairway to heaven. + +When she gets there she knows +If the stores are all closed +With a word she can get what she came for. + +-----------------------------2921238217421 +Content-Disposition: form-data; name="submit" + +Upload +-----------------------------2921238217421-- +--FILE-- +<?php + +chdir( __DIR__ . '/../../../../../../../' ); + +require_once 'bootstrap.php'; +require_once 'PHPUnit/Autoload.php'; + +$repository = \eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\IOUploadPHPT::getRepository( array() ); + +$binaryCreateStruct = $repository->getIOService()->newBinaryCreateStructFromUploadedFile( $_FILES['file'] ); + +var_dump( $binaryCreateStruct instanceof \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct ); + +?> +--EXPECT-- +bool(true) diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/LanguageBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/LanguageBase.php new file mode 100644 index 0000000..12e8c1a --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/LanguageBase.php @@ -0,0 +1,423 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\LanguageBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\Content\Language; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for Language Service + */ +abstract class LanguageBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\Content\Language::__construct + */ + public function testNewClass() + { + $language = new Language(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'languageCode' => null, + 'name' => null, + 'enabled' => null + ), + $language + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\Content\Language::__get + */ + public function testMissingProperty() + { + try + { + $language = new Language(); + $value = $language->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\Content\Language::__set + */ + public function testReadOnlyProperty() + { + try + { + $language = new Language(); + $language->id = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\Content\Language::__isset + */ + public function testIsPropertySet() + { + $language = new Language(); + $value = isset( $language->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $language->id ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\Content\Language::__unset + */ + public function testUnsetProperty() + { + $language = new Language( array( "id" => 2 ) ); + try + { + unset( $language->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test service method for creating language + * @covers \eZ\Publish\API\Repository\LanguageService::createLanguage + */ + public function testCreateLanguage() + { + $service = $this->repository->getContentLanguageService(); + + $languageCreateStruct = $service->newLanguageCreateStruct(); + $languageCreateStruct->languageCode = 'test-TEST'; + $languageCreateStruct->name = 'test'; + + $newLanguage = $service->createLanguage( $languageCreateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $newLanguage ); + + self::assertGreaterThan( 0, $newLanguage->id ); + + $this->assertPropertiesCorrect( + array( + 'languageCode' => $languageCreateStruct->languageCode, + 'name' => $languageCreateStruct->name, + 'enabled' => $languageCreateStruct->enabled + ), + $newLanguage + ); + } + + /** + * Test service method for creating language throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LanguageService::createLanguage + */ + public function testCreateLanguageThrowsInvalidArgumentException() + { + $service = $this->repository->getContentLanguageService(); + + $languageCreateStruct = $service->newLanguageCreateStruct(); + $languageCreateStruct->languageCode = 'eng-GB'; + $languageCreateStruct->name = 'English'; + + $service->createLanguage( $languageCreateStruct ); + } + + /** + * Test service method for updating language name + * @covers \eZ\Publish\API\Repository\LanguageService::updateLanguageName + */ + public function testUpdateLanguageName() + { + $languageService = $this->repository->getContentLanguageService(); + + $language = $languageService->loadLanguage( 'eng-GB' ); + self::assertEquals( 'English (United Kingdom)', $language->name ); + + $updatedLanguage = $languageService->updateLanguageName( $language, 'English' ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $updatedLanguage ); + + $this->assertPropertiesCorrect( + array( + 'id' => $language->id, + 'languageCode' => $language->languageCode, + 'name' => 'English', + 'enabled' => $language->enabled + ), + $updatedLanguage + ); + } + + /** + * Test service method for updating language name throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LanguageService::updateLanguageName + */ + public function testUpdateLanguageNameThrowsInvalidArgumentException() + { + $languageService = $this->repository->getContentLanguageService(); + + $language = $languageService->loadLanguage( 'eng-GB' ); + $languageService->updateLanguageName( $language, 1 ); + } + + /** + * Test service method for enabling language + * @covers \eZ\Publish\API\Repository\LanguageService::enableLanguage + */ + public function testEnableLanguage() + { + $languageService = $this->repository->getContentLanguageService(); + + $language = $languageService->loadLanguage( 'eng-GB' ); + self::assertEquals( true, $language->enabled ); + + $updatedLanguage = $languageService->disableLanguage( $language ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $updatedLanguage ); + + $this->assertPropertiesCorrect( + array( + 'id' => $language->id, + 'languageCode' => $language->languageCode, + 'name' => $language->name, + 'enabled' => false + ), + $updatedLanguage + ); + + $finalLanguage = $languageService->enableLanguage( $updatedLanguage ); + + $this->assertPropertiesCorrect( + array( + 'id' => $updatedLanguage->id, + 'languageCode' => $updatedLanguage->languageCode, + 'name' => $updatedLanguage->name, + 'enabled' => true + ), + $finalLanguage + ); + } + + /** + * Test service method for disabling language + * @covers \eZ\Publish\API\Repository\LanguageService::disableLanguage + */ + public function testDisableLanguage() + { + $languageService = $this->repository->getContentLanguageService(); + + $language = $languageService->loadLanguage( 'eng-GB' ); + self::assertEquals( true, $language->enabled ); + + $updatedLanguage = $languageService->disableLanguage( $language ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $updatedLanguage ); + + $this->assertPropertiesCorrect( + array( + 'id' => $language->id, + 'languageCode' => $language->languageCode, + 'name' => $language->name, + 'enabled' => false + ), + $updatedLanguage + ); + } + + /** + * Test service method for loading language + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguage + */ + public function testLoadLanguage() + { + $language = $this->repository->getContentLanguageService()->loadLanguage( 'eng-GB' ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $language ); + self::assertGreaterThan( 0, $language->id ); + + $this->assertPropertiesCorrect( + array( + 'languageCode' => 'eng-GB', + 'name' => 'English (United Kingdom)', + 'enabled' => true + ), + $language + ); + } + + /** + * Test service method for loading language throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguage + */ + public function testLoadLanguageThrowsInvalidArgumentException() + { + $this->repository->getContentLanguageService()->loadLanguage( PHP_INT_MAX ); + } + + /** + * Test service function for loading language throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguage + */ + public function testLoadLanguageThrowsNotFoundException() + { + $this->repository->getContentLanguageService()->loadLanguage( 'ita-FR' ); + } + + /** + * Test service method for loading all languages + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguages + */ + public function testLoadLanguages() + { + $languageService = $this->repository->getContentLanguageService(); + + $languages = $languageService->loadLanguages(); + + self::assertInternalType( "array", $languages ); + self::assertNotEmpty( $languages ); + + foreach ( $languages as $language ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $language ); + } + } + + /** + * Test service method for loading language by ID + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguageById + */ + public function testLoadLanguageById() + { + $language = $this->repository->getContentLanguageService()->loadLanguageById( 2 ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Language', $language ); + + $this->assertPropertiesCorrect( + array( + 'id' => 2, + 'languageCode' => 'eng-US', + 'name' => 'English (American)', + 'enabled' => true + ), + $language + ); + } + + /** + * Test service method for loading language by ID throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguageById + */ + public function testLoadLanguageByIdThrowsInvalidArgumentException() + { + $this->repository->getContentLanguageService()->loadLanguageById( 'test' ); + } + + /** + * Test service method for loading language by ID throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\LanguageService::loadLanguageById + */ + public function testLoadLanguageByIdThrowsNotFoundException() + { + $this->repository->getContentLanguageService()->loadLanguageById( PHP_INT_MAX ); + } + + /** + * Test service method for deleting language + * @covers \eZ\Publish\API\Repository\LanguageService::deleteLanguage + */ + public function testDeleteLanguage() + { + $languageService = $this->repository->getContentLanguageService(); + + $languageCreateStruct = $languageService->newLanguageCreateStruct(); + $languageCreateStruct->name = 'test'; + $languageCreateStruct->languageCode = 'test-TEST'; + + $newLanguage = $languageService->createLanguage( $languageCreateStruct ); + $languageService->deleteLanguage( $newLanguage ); + + try + { + $languageService->loadLanguage( $languageCreateStruct->languageCode ); + self::fail( 'Language is still returned after being deleted' ); + } + catch ( NotFoundException $e ) + { + } + } + + /** + * Test service method for deleting language throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LanguageService::deleteLanguage + */ + public function testDeleteLanguageThrowsInvalidArgumentException() + { + $languageService = $this->repository->getContentLanguageService(); + + $language = $languageService->loadLanguage( 'eng-GB' ); + $languageService->deleteLanguage( $language ); + } + + /** + * Test service method for fetching the default language code + * @covers \eZ\Publish\API\Repository\LanguageService::getDefaultLanguageCode + */ + public function testGetDefaultLanguageCode() + { + $defaultLanguageCode = $this->repository->getContentLanguageService()->getDefaultLanguageCode(); + + self::assertEquals( 'eng-GB', $defaultLanguageCode ); + } + + /** + * Test service method for creating a new language create struct object + * @covers \eZ\Publish\API\Repository\LanguageService::newLanguageCreateStruct + */ + public function testNewLanguageCreateStruct() + { + $languageCreateStruct = $this->repository->getContentLanguageService()->newLanguageCreateStruct(); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct', $languageCreateStruct ); + + $this->assertPropertiesCorrect( + array( + 'languageCode' => null, + 'name' => null, + 'enabled' => true + ), + $languageCreateStruct + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ContentTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ContentTest.php new file mode 100644 index 0000000..3d5f3e4 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ContentTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\ContentBase as BaseContentServiceTest; + +/** + * Test case for Content Service using Legacy storage class + */ +class ContentTest extends BaseContentServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ContentTypeTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ContentTypeTest.php new file mode 100644 index 0000000..bbfdda0 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ContentTypeTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\ContentTypeTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\ContentTypeBase as BaseContentTypeServiceTest; + +/** + * Test case for ContentType Service using Legacy storage class + */ +class ContentTypeTest extends BaseContentTypeServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/FieldTypeTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/FieldTypeTest.php new file mode 100644 index 0000000..f65a868 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/FieldTypeTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\FieldTypeTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\FieldTypeBase as BaseFieldTypeTest; + +/** + * Test case for FieldType Service using Legacy storage class + */ +class FieldTypeTest extends BaseFieldTypeTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/IOTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/IOTest.php new file mode 100644 index 0000000..fa45378 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/IOTest.php @@ -0,0 +1,57 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\IOTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\IOBase as BaseIOServiceTest; + +/** + * Test case for IO Service using Legacy storage class + */ +class IOTest extends BaseIOServiceTest +{ + protected function tearDown() + { + $legacyKernel = $_ENV['legacyKernel']; + $legacyKernel->enterLegacyRootDir(); + if ( file_exists( 'var/test' ) ) + { + \ezcBaseFile::removeRecursive( 'var/test' ); + } + $legacyKernel->leaveLegacyRootDir(); + parent::tearDown(); + } + + /** + * @return \PHPUnit_Extensions_PhptTestCase + */ + protected function getFileUploadTest() + { + return new IOUploadPHPT(); + } + + protected function getRepository() + { + try + { + if ( !isset( $_ENV['legacyKernel'] ) ) + { + self::markTestSkipped( + 'Legacy kernel is needed to run these tests. Please ensure that "legacyKernel" environment variable is properly set with a eZ\\Publish\\Core\\MVC\\Legacy\\Kernel instance' + ); + } + + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/IOUploadPHPT.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/IOUploadPHPT.php new file mode 100644 index 0000000..6868988 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/IOUploadPHPT.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\IOUploadTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use PHPUnit_Extensions_PhptTestCase; + +/** + * Test case for IO file upload using Legacy storage class + */ +class IOUploadPHPT extends PHPUnit_Extensions_PhptTestCase +{ + public function __construct() + { + parent::__construct( __DIR__ . '/upload.phpt' ); + } + + // this method needs to be public static so upload.phpt test + // can get ahold of Repository object + public static function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/LanguageTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/LanguageTest.php new file mode 100644 index 0000000..1e4eb4d --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/LanguageTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\LanguageTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\LanguageBase as BaseLanguageServiceTest; + +/** + * Test case for Language Service using Legacy storage class + */ +class LanguageTest extends BaseLanguageServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/LocationTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/LocationTest.php new file mode 100644 index 0000000..cd88642 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/LocationTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\LocationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\LocationBase as BaseLocationServiceTest; + +/** + * Test case for Location Service using Legacy storage class + */ +class LocationTest extends BaseLocationServiceTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/NameSchemaTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/NameSchemaTest.php new file mode 100644 index 0000000..fbb445d --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/NameSchemaTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\NameSchemaTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\NameSchemaBase as BaseNameSchemaTest; + +/** + * Test case for NameSchema Service using Legacy storage class + */ +class NameSchemaTest extends BaseNameSchemaTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ObjectStateTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ObjectStateTest.php new file mode 100644 index 0000000..e821217 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/ObjectStateTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\ObjectStateTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\ObjectStateBase as BaseObjectStateServiceTest; + +/** + * Test case for object state Service using Legacy storage class + */ +class ObjectStateTest extends BaseObjectStateServiceTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/RepositoryTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/RepositoryTest.php new file mode 100644 index 0000000..d99ee70 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/RepositoryTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\RepositoryTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\RepositoryTest as BaseRepositoryTest; + +/** + * Test case for Repository Service using Legacy storage class + */ +class RepositoryTest extends BaseRepositoryTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/RoleTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/RoleTest.php new file mode 100644 index 0000000..d43eb64 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/RoleTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\RoleTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\RoleBase as BaseRoleServiceTest; + +/** + * Test case for Role Service using Legacy storage class + */ +class RoleTest extends BaseRoleServiceTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/SearchTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/SearchTest.php new file mode 100644 index 0000000..7927b67 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/SearchTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\SearchTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\SearchBase as BaseSearchServiceTest; + +/** + * Test case for Search Service using Legacy storage class + */ +class SearchTest extends BaseSearchServiceTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/SectionTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/SectionTest.php new file mode 100644 index 0000000..65041d1 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/SectionTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\SectionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\SectionBase as BaseSectionServiceTest; + +/** + * Test case for Section Service using Legacy storage class + */ +class SectionTest extends BaseSectionServiceTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/TrashTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/TrashTest.php new file mode 100644 index 0000000..4f9e933 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/TrashTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\TrashTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\TrashBase as BaseTrashServiceTest; + +/** + * Test case for Trash Service using Legacy storage class + */ +class TrashTest extends BaseTrashServiceTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UrlAliasTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UrlAliasTest.php new file mode 100644 index 0000000..f33f2bd --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UrlAliasTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\UrlAliasTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\UrlAliasBase as BaseUrlAliasTest; + +/** + * Test case for UrlAlias Service using Legacy storage class + */ +class UrlAliasTest extends BaseUrlAliasTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UrlWildcardTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UrlWildcardTest.php new file mode 100644 index 0000000..ed37270 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UrlWildcardTest.php @@ -0,0 +1,23 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\UrlWildcardTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\UrlWildcardBase as BaseUrlWildcardTest; + +/** + * Test case for UrlWildcard Service using Legacy storage class + */ +class UrlWildcardTest extends BaseUrlWildcardTest +{ + protected function getRepository() + { + return Utils::getRepository(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UserTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UserTest.php new file mode 100644 index 0000000..5d398b5 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/UserTest.php @@ -0,0 +1,30 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\UserTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\UserBase as BaseUserServiceTest; + +/** + * Test case for User Service using Legacy storage class + */ +class UserTest extends BaseUserServiceTest +{ + protected function getRepository() + { + try + { + return Utils::getRepository(); + } + catch ( \Exception $e ) + { + $this->markTestIncomplete( $e->getMessage() ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/Utils.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/Utils.php new file mode 100644 index 0000000..31c832e --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/Utils.php @@ -0,0 +1,120 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\Utils class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\InMemory\Utils as InMemoryUtils; +use eZ\Publish\Core\Persistence\Legacy\EzcDbHandler; + +/** + * Utils class for InMemory test + */ +abstract class Utils extends InMemoryUtils +{ + /** + * @return \eZ\Publish\API\Repository\Repository + */ + public static function getRepository() + { + // Override to set legacy handlers + $sc = self::getServiceContainer( + 'persistence_handler_legacy', + 'io_handler_legacy', + ( $dsn = getenv( "DATABASE" ) ) ? $dsn : "sqlite://:memory:" + ); + + // And inject data + self::insertLegacyData( $sc->get( 'legacy_db_handler' ) ); + + // Return repository + return $sc->get( 'inner_repository' ); + } + + /** + * @param \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler $handler + * + * @throws \Exception + */ + protected static function insertLegacyData( EzcDbHandler $handler ) + { + $dsn = getenv( "DATABASE" ); + if ( !$dsn ) + $dsn = "sqlite://:memory:"; + $db = preg_replace( '(^([a-z]+).*)', '\\1', $dsn ); + $legacyHandlerDir = "eZ/Publish/Core/Persistence"; + + // Insert Schema + $schema = $legacyHandlerDir . '/Legacy/Tests/_fixtures/schema.' . $db . '.sql'; + $queries = array_filter( preg_split( '(;\\s*$)m', file_get_contents( $schema ) ) ); + foreach ( $queries as $query ) + { + $handler->exec( $query ); + } + + // Insert some default data + $data = require __DIR__ . '/_fixtures/clean_ezflow_dump.php'; + foreach ( $data as $table => $rows ) + { + // Check that at least one row exists + if ( !isset( $rows[0] ) ) + { + continue; + } + + $q = $handler->createInsertQuery(); + $q->insertInto( $handler->quoteIdentifier( $table ) ); + + // Contains the bound parameters + $values = array(); + + // Binding the parameters + foreach ( $rows[0] as $col => $val ) + { + $q->set( + $handler->quoteIdentifier( $col ), + $q->bindParam( $values[$col] ) + ); + } + + $stmt = $q->prepare(); + + foreach ( $rows as $row ) + { + try + { + // This CANNOT be replaced by: + // $values = $row + // each $values[$col] is a PHP reference which should be + // kept for parameters binding to work + foreach ( $row as $col => $val ) + { + $values[$col] = $val; + } + + $stmt->execute(); + } + catch ( \Exception $e ) + { + echo "$table ( ", implode( ', ', $row ), " )\n"; + throw $e; + } + } + } + + if ( $db === 'pgsql' ) + { + // Update PostgreSQL sequences + $queries = array_filter( preg_split( '(;\\s*$)m', file_get_contents( $legacyHandlerDir . '/Legacy/Tests/_fixtures/setval.pgsql.sql' ) ) ); + foreach ( $queries as $query ) + { + $handler->exec( $query ); + } + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php new file mode 100644 index 0000000..4b7f71e --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php @@ -0,0 +1,23593 @@ +<?php +/** + * This is dump of ezdemo w/o demo content on eZ Publish 4.7 + */ + +return array ( +/* 'ezapprove_items' => +array ( +), +'ezbasket' => +array ( +), */ +'ezbinaryfile' => +array ( +), +'ezcobj_state' => +array ( + 0 => + array ( + 'default_language_id' => '2', + 'group_id' => '2', + 'id' => '1', + 'identifier' => 'not_locked', + 'language_mask' => '3', + 'priority' => '0', + ), + 1 => + array ( + 'default_language_id' => '2', + 'group_id' => '2', + 'id' => '2', + 'identifier' => 'locked', + 'language_mask' => '3', + 'priority' => '1', + ), +), +'ezcobj_state_group' => +array ( + 0 => + array ( + 'default_language_id' => '2', + 'id' => '2', + 'identifier' => 'ez_lock', + 'language_mask' => '3', + ), +), +'ezcobj_state_group_language' => +array ( + 0 => + array ( + 'contentobject_state_group_id' => '2', + 'description' => '', + 'language_id' => '3', + 'name' => 'Lock', + 'real_language_id' => '2', + ), +), +'ezcobj_state_language' => +array ( + 0 => + array ( + 'contentobject_state_id' => '1', + 'description' => '', + 'language_id' => '3', + 'name' => 'Not locked', + ), + 1 => + array ( + 'contentobject_state_id' => '2', + 'description' => '', + 'language_id' => '3', + 'name' => 'Locked', + ), +), +'ezcobj_state_link' => +array ( + 0 => + array ( + 'contentobject_id' => '4', + 'contentobject_state_id' => '1', + ), + 1 => + array ( + 'contentobject_id' => '10', + 'contentobject_state_id' => '1', + ), + 2 => + array ( + 'contentobject_id' => '11', + 'contentobject_state_id' => '1', + ), + 3 => + array ( + 'contentobject_id' => '12', + 'contentobject_state_id' => '1', + ), + 4 => + array ( + 'contentobject_id' => '13', + 'contentobject_state_id' => '1', + ), + 5 => + array ( + 'contentobject_id' => '14', + 'contentobject_state_id' => '1', + ), + 6 => + array ( + 'contentobject_id' => '41', + 'contentobject_state_id' => '1', + ), + 7 => + array ( + 'contentobject_id' => '42', + 'contentobject_state_id' => '1', + ), + 8 => + array ( + 'contentobject_id' => '45', + 'contentobject_state_id' => '1', + ), + 9 => + array ( + 'contentobject_id' => '49', + 'contentobject_state_id' => '1', + ), + 10 => + array ( + 'contentobject_id' => '50', + 'contentobject_state_id' => '1', + ), + 11 => + array ( + 'contentobject_id' => '51', + 'contentobject_state_id' => '1', + ), + 12 => + array ( + 'contentobject_id' => '52', + 'contentobject_state_id' => '1', + ), + 13 => + array ( + 'contentobject_id' => '54', + 'contentobject_state_id' => '1', + ), + 14 => + array ( + 'contentobject_id' => '56', + 'contentobject_state_id' => '1', + ), + 15 => + array ( + 'contentobject_id' => '57', + 'contentobject_state_id' => '1', + ), + 16 => + array ( + 'contentobject_id' => '58', + 'contentobject_state_id' => '1', + ), + 17 => + array ( + 'contentobject_id' => '59', + 'contentobject_state_id' => '1', + ), +), +/* 'ezcollab_group' => +array ( +), +'ezcollab_item' => +array ( +), +'ezcollab_item_group_link' => +array ( +), +'ezcollab_item_message_link' => +array ( +), +'ezcollab_item_participant_link' => +array ( +), +'ezcollab_item_status' => +array ( +), +'ezcollab_notification_rule' => +array ( +), +'ezcollab_profile' => +array ( +), +'ezcollab_simple_message' => +array ( +), +'ezcomment' => +array ( +), +'ezcomment_notification' => +array ( +), +'ezcomment_subscriber' => +array ( +), +'ezcomment_subscription' => +array ( +), */ +'ezcontent_language' => +array ( + 0 => + array ( + 'disabled' => '0', + 'id' => '2', + 'locale' => 'eng-US', + 'name' => 'English (American)', + ), + 1 => + array ( + 'disabled' => '0', + 'id' => '4', + 'locale' => 'ger-DE', + 'name' => 'German', + ), + 2 => + array ( + 'disabled' => '0', + 'id' => '8', + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)', + ), +), +/* 'ezcontentbrowsebookmark' => +array ( +), +'ezcontentbrowserecent' => +array ( + 0 => + array ( + 'created' => '1343140539', + 'id' => '1', + 'name' => 'eZ Publish', + 'node_id' => '2', + 'user_id' => '14', + ), + 1 => + array ( + 'created' => '1343140541', + 'id' => '2', + 'name' => 'Users', + 'node_id' => '5', + 'user_id' => '14', + ), +), */ +'ezcontentclass' => +array ( + 0 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<short_name|name>', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '1', + 'identifier' => 'folder', + 'initial_language_id' => '2', + 'is_container' => '1', + 'language_mask' => '3', + 'modified' => '1082454875', + 'modifier_id' => '14', + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 1 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<name>', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '3', + 'identifier' => 'user_group', + 'initial_language_id' => '2', + 'is_container' => '1', + 'language_mask' => '3', + 'modified' => '1048494743', + 'modifier_id' => '14', + 'remote_id' => '25b4268cdcd01921b808a0d854b877ef', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"User group";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 2 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<first_name> <last_name>', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '4', + 'identifier' => 'user', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1082018364', + 'modifier_id' => '14', + 'remote_id' => '40faa822edc579b02c25f6bb7beec3ad', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"User";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 3 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1052385685', + 'creator_id' => '14', + 'id' => '13', + 'identifier' => 'comment', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1082455144', + 'modifier_id' => '14', + 'remote_id' => '000c14f4f475e9f2955dedab72799941', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Comment";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 4 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<name>', + 'created' => '1081858024', + 'creator_id' => '14', + 'id' => '14', + 'identifier' => 'common_ini_settings', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1081858024', + 'modifier_id' => '14', + 'remote_id' => 'ffedf2e73b1ea0c3e630e42e2db9c900', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:19:"Common ini settings";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 5 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<title>', + 'created' => '1081858045', + 'creator_id' => '14', + 'id' => '15', + 'identifier' => 'template_look', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1081858045', + 'modifier_id' => '14', + 'remote_id' => '59b43cd9feaaf0e45ac974fb4bbd3f92', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Template look";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 6 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343140534', + 'creator_id' => '14', + 'id' => '16', + 'identifier' => 'article', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140534', + 'modifier_id' => '14', + 'remote_id' => 'c15b600eb9198b1924063b5a68758232', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Article";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 7 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '17', + 'identifier' => 'blog', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => '3a6f9c1f075b3bf49d7345576b196fe8', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Blog";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 8 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '18', + 'identifier' => 'blog_post', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => '7ecb961056b7cbb30f22a91357e0a007', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Blog post";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 9 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '19', + 'identifier' => 'product', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => '77f3ede996a3a39c7159cc69189c5307', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Product";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 10 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '20', + 'identifier' => 'feedback_form', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => 'df0257b8fc55f6b8ab179d6fb915455e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Feedback form";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 11 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '21', + 'identifier' => 'landing_page', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => 'e36c458e3e4a81298a0945f53a2c81f4', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Landing Page";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 12 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '22', + 'identifier' => 'wiki_page', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => 'd4a05eed0402e4d70fedfda2023f1aa2', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Wiki Page";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 13 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '23', + 'identifier' => 'poll', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => '232937a3a2eacbbf24e2601aebe16522', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Poll";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 14 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140535', + 'creator_id' => '14', + 'id' => '24', + 'identifier' => 'file', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140535', + 'modifier_id' => '14', + 'remote_id' => '637d58bfddf164627bdfd265733280a0', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 15 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '25', + 'identifier' => 'image', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => 'f6df12aa74e36230eb675f364fccd25a', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 16 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '26', + 'identifier' => 'link', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '74ec6507063150bc813549b22534ad48', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Link";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 17 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '27', + 'identifier' => 'gallery', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '6a320cdc3e274841b82fcd63a86f80d1', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Gallery";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 18 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '28', + 'identifier' => 'forum', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => 'b241f924b96b267153f5f55904e0675a', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Forum";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 19 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '29', + 'identifier' => 'forum_topic', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '71f99c516743a33562c3893ef98c9b60', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Forum topic";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 20 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '30', + 'identifier' => 'forum_reply', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '80ee42a66b2b8b6ee15f5c5f4b361562', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Forum reply";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 21 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '31', + 'identifier' => 'event', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '563cb5edc2adfd2b240efa456c81525f', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Event";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 22 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '32', + 'identifier' => 'event_calendar', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '020cbeb6382c8c89dcec2cd406fb47a8', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Event calendar";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 23 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '33', + 'identifier' => 'banner', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '9cb558e25fd946246bbb32950c00228e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Banner";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 24 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '34', + 'identifier' => 'forums', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => '60a921e54c1efbb9456bd2283d9e66cb', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Forums";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 25 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343140536', + 'creator_id' => '14', + 'id' => '35', + 'identifier' => 'video', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343140536', + 'modifier_id' => '14', + 'remote_id' => 'b38417e8194fb8f893ca918d297b4fa8', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Video";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), +), +'ezcontentclass_attribute' => +array ( + 0 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'Folder', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '4', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 1 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '3', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '6', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 2 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '3', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => '0', + ), + 3 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'identifier' => 'first_name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"First name";}', + 'version' => '0', + ), + 4 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '9', + 'identifier' => 'last_name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Last name";}', + 'version' => '0', + ), + 5 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezuser', + 'id' => '12', + 'identifier' => 'user_account', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"User account";}', + 'version' => '0', + ), + 6 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '119', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Summary";}', + 'version' => '0', + ), + 7 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '100', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '149', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Subject";}', + 'version' => '0', + ), + 8 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '150', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Author";}', + 'version' => '0', + ), + 9 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '151', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Message";}', + 'version' => '0', + ), + 10 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '100', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '155', + 'identifier' => 'short_name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Short name";}', + 'version' => '0', + ), + 11 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '156', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => '0', + ), + 12 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '1', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '158', + 'identifier' => 'show_children', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Display sub items";}', + 'version' => '0', + ), + 13 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '159', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 14 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'IndexPage', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'identifier' => 'indexpage', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Index Page";}', + 'version' => '0', + ), + 15 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'DefaultPage', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'identifier' => 'defaultpage', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Default Page";}', + 'version' => '0', + ), + 16 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugOutput', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'identifier' => 'debugoutput', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Debug Output";}', + 'version' => '0', + ), + 17 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugByIP', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'identifier' => 'debugbyip', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Debug By IP";}', + 'version' => '0', + ), + 18 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugIPList', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'identifier' => 'debugiplist', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Debug IP List";}', + 'version' => '0', + ), + 19 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugRedirection', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'identifier' => 'debugredirection', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Debug Redirection";}', + 'version' => '0', + ), + 20 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'ContentSettings', + 'data_text3' => 'ViewCaching', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'identifier' => 'viewcaching', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '8', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"View Caching";}', + 'version' => '0', + ), + 21 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'TemplateSettings', + 'data_text3' => 'TemplateCache', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'identifier' => 'templatecache', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:14:"Template Cache";}', + 'version' => '0', + ), + 22 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'TemplateSettings', + 'data_text3' => 'TemplateCompile', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'identifier' => 'templatecompile', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '10', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Template Compile";}', + 'version' => '0', + ), + 23 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'small', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'identifier' => 'imagesmall', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '11', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Image Small Size";}', + 'version' => '0', + ), + 24 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'medium', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'identifier' => 'imagemedium', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Image Medium Size";}', + 'version' => '0', + ), + 25 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'large', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'identifier' => 'imagelarge', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '13', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Image Large Size";}', + 'version' => '0', + ), + 26 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'SiteName', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '172', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Title";}', + 'version' => '0', + ), + 27 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'MetaDataArray', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '173', + 'identifier' => 'meta_data', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Meta data";}', + 'version' => '0', + ), + 28 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '174', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Image";}', + 'version' => '0', + ), + 29 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'sitestyle', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpackage', + 'id' => '175', + 'identifier' => 'sitestyle', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Sitestyle";}', + 'version' => '0', + ), + 30 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'MailSettings', + 'data_text3' => 'AdminEmail', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '177', + 'identifier' => 'email', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Email";}', + 'version' => '0', + ), + 31 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'SiteURL', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '178', + 'identifier' => 'siteurl', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:8:"Site URL";}', + 'version' => '0', + ), + 32 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '179', + 'identifier' => 'signature', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Signature";}', + 'version' => '0', + ), + 33 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Image";}', + 'version' => '0', + ), + 34 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New article', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '181', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 35 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '182', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 36 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '183', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 37 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '184', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 38 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '185', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 39 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '186', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 40 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '187', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 41 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '188', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 42 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '189', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 43 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '190', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 44 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezgmaplocation', + 'id' => '191', + 'identifier' => 'location', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Location";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 45 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezcomcomments', + 'id' => '192', + 'identifier' => 'comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 46 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '193', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 47 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '194', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 48 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '195', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 49 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '196', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 50 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '25', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '197', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 51 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '198', + 'identifier' => 'publication_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:16:"Publication date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 52 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '199', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 53 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezcomcomments', + 'id' => '200', + 'identifier' => 'comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 54 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '201', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 55 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '202', + 'identifier' => 'product_number', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Product number";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 56 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '203', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Short description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 57 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '204', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 58 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '1', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezprice', + 'id' => '205', + 'identifier' => 'price', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Price";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 59 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '206', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 60 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '207', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 61 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmultioption', + 'id' => '208', + 'identifier' => 'additional_options', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Additional options";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 62 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '209', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 63 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '210', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 64 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezcomcomments', + 'id' => '211', + 'identifier' => 'comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 65 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '212', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 66 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '213', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 67 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '214', + 'identifier' => 'sender_name', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Sender name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 68 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '215', + 'identifier' => 'subject', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 69 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '216', + 'identifier' => 'message', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 70 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezemail', + 'id' => '217', + 'identifier' => 'email', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Email";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 71 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezemail', + 'id' => '218', + 'identifier' => 'recipient', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Recipient";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 72 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '219', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 73 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpage', + 'id' => '220', + 'identifier' => 'page', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Layout";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 74 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '221', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 75 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '222', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 76 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '223', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 77 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '224', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 78 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezcomcomments', + 'id' => '225', + 'identifier' => 'comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 79 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '226', + 'identifier' => 'show_children', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Display sub items";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 80 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '227', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 81 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '228', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 82 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezoption', + 'id' => '229', + 'identifier' => 'question', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Question";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 83 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New file', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '230', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 84 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '231', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 85 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezbinaryfile', + 'id' => '232', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 86 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '233', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 87 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '234', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 88 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezcomcomments', + 'id' => '235', + 'identifier' => 'comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 89 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '150', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '236', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 90 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '237', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Caption";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 91 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '238', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 92 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '239', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 93 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '240', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 94 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '241', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 95 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '242', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 96 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '243', + 'identifier' => 'location', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Location";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 97 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '1', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '244', + 'identifier' => 'open_in_new_window', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Open in new window";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 98 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '245', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 99 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '246', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Short description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 100 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '247', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 101 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '248', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 102 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '249', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 103 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '250', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 104 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '251', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 105 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '252', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 106 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '253', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 107 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '254', + 'identifier' => 'sticky', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Sticky";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 108 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '255', + 'identifier' => 'notify_me', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:23:"Notify me about updates";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 109 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '256', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 110 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '257', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 111 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '55', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '258', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Full title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 112 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '19', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '259', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 113 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '260', + 'identifier' => 'text', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Text";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 114 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '261', + 'identifier' => 'category', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Category";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 115 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '262', + 'identifier' => 'from_time', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"From Time";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 116 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '263', + 'identifier' => 'to_time', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"To Time";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 117 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '264', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 118 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '65', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '265', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 119 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '<?xml version="1.0" encoding="utf-8"?> +<ezselection><options><option id="0" name="Calendar"/><option id="1" name="Program"/></options></ezselection> +', + 'data_type_string' => 'ezselection', + 'id' => '266', + 'identifier' => 'view', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:1:{s:6:"eng-GB";s:0:"";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"View";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 120 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '267', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 121 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '268', + 'identifier' => 'url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:3:"URL";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 122 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '269', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 123 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '270', + 'identifier' => 'image_map', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Image map";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 124 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '271', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 125 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '272', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 126 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '273', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 127 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '274', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 128 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '275', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Caption";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 129 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezbinaryfile', + 'id' => '276', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 130 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '277', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 131 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezcomcomments', + 'id' => '278', + 'identifier' => 'comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 132 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '279', + 'identifier' => 'site_map_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '8', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:12:"Site map URL";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 133 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '280', + 'identifier' => 'tag_cloud_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:13:"Tag Cloud URL";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 134 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '281', + 'identifier' => 'login_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '10', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:13:"Login (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 135 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '282', + 'identifier' => 'logout_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '11', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:14:"Logout (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 136 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '283', + 'identifier' => 'my_profile_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:18:"My profile (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 137 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '284', + 'identifier' => 'register_user_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '13', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:25:"Register new user (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 138 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '285', + 'identifier' => 'rss_feed', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '14', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:8:"RSS feed";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 139 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '286', + 'identifier' => 'shopping_basket_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '15', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:23:"Shopping basket (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 140 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '287', + 'identifier' => 'site_settings_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '16', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:21:"Site settings (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 141 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '288', + 'identifier' => 'footer_text', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '17', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:11:"Footer text";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 142 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '289', + 'identifier' => 'hide_powered_by', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '18', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:17:"Hide "Powered by"";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 143 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '290', + 'identifier' => 'footer_script', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '19', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:17:"Footer Javascript";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 144 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpage', + 'id' => '291', + 'identifier' => 'call_for_action', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:15:"Call For Action";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 145 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '292', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:4:"Tags";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), +), +'ezcontentclass_classgroup' => +array ( + 0 => + array ( + 'contentclass_id' => '1', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 1 => + array ( + 'contentclass_id' => '3', + 'contentclass_version' => '0', + 'group_id' => '2', + 'group_name' => 'Users', + ), + 2 => + array ( + 'contentclass_id' => '4', + 'contentclass_version' => '0', + 'group_id' => '2', + 'group_name' => 'Users', + ), + 3 => + array ( + 'contentclass_id' => '13', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 4 => + array ( + 'contentclass_id' => '14', + 'contentclass_version' => '0', + 'group_id' => '4', + 'group_name' => 'Setup', + ), + 5 => + array ( + 'contentclass_id' => '15', + 'contentclass_version' => '0', + 'group_id' => '4', + 'group_name' => 'Setup', + ), + 6 => + array ( + 'contentclass_id' => '16', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 7 => + array ( + 'contentclass_id' => '17', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 8 => + array ( + 'contentclass_id' => '18', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 9 => + array ( + 'contentclass_id' => '19', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 10 => + array ( + 'contentclass_id' => '20', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 11 => + array ( + 'contentclass_id' => '21', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 12 => + array ( + 'contentclass_id' => '22', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 13 => + array ( + 'contentclass_id' => '23', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 14 => + array ( + 'contentclass_id' => '24', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 15 => + array ( + 'contentclass_id' => '25', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 16 => + array ( + 'contentclass_id' => '26', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 17 => + array ( + 'contentclass_id' => '27', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 18 => + array ( + 'contentclass_id' => '28', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 19 => + array ( + 'contentclass_id' => '29', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 20 => + array ( + 'contentclass_id' => '30', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 21 => + array ( + 'contentclass_id' => '31', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 22 => + array ( + 'contentclass_id' => '32', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 23 => + array ( + 'contentclass_id' => '33', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 24 => + array ( + 'contentclass_id' => '34', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 25 => + array ( + 'contentclass_id' => '35', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), +), +'ezcontentclass_name' => +array ( + 0 => + array ( + 'contentclass_id' => '1', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Folder', + ), + 1 => + array ( + 'contentclass_id' => '3', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'User group', + ), + 2 => + array ( + 'contentclass_id' => '4', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'User', + ), + 3 => + array ( + 'contentclass_id' => '13', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Comment', + ), + 4 => + array ( + 'contentclass_id' => '14', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Common ini settings', + ), + 5 => + array ( + 'contentclass_id' => '15', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Template look', + ), + 6 => + array ( + 'contentclass_id' => '16', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Article', + ), + 7 => + array ( + 'contentclass_id' => '17', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Blog', + ), + 8 => + array ( + 'contentclass_id' => '18', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Blog post', + ), + 9 => + array ( + 'contentclass_id' => '19', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Product', + ), + 10 => + array ( + 'contentclass_id' => '20', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Feedback form', + ), + 11 => + array ( + 'contentclass_id' => '21', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Landing Page', + ), + 12 => + array ( + 'contentclass_id' => '22', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Wiki Page', + ), + 13 => + array ( + 'contentclass_id' => '23', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Poll', + ), + 14 => + array ( + 'contentclass_id' => '24', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'File', + ), + 15 => + array ( + 'contentclass_id' => '25', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Image', + ), + 16 => + array ( + 'contentclass_id' => '26', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Link', + ), + 17 => + array ( + 'contentclass_id' => '27', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Gallery', + ), + 18 => + array ( + 'contentclass_id' => '28', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forum', + ), + 19 => + array ( + 'contentclass_id' => '29', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forum topic', + ), + 20 => + array ( + 'contentclass_id' => '30', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forum reply', + ), + 21 => + array ( + 'contentclass_id' => '31', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Event', + ), + 22 => + array ( + 'contentclass_id' => '32', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Event calendar', + ), + 23 => + array ( + 'contentclass_id' => '33', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Banner', + ), + 24 => + array ( + 'contentclass_id' => '34', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forums', + ), + 25 => + array ( + 'contentclass_id' => '35', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Video', + ), +), +'ezcontentclassgroup' => +array ( + 0 => + array ( + 'created' => '1031216928', + 'creator_id' => '14', + 'id' => '1', + 'modified' => '1033922106', + 'modifier_id' => '14', + 'name' => 'Content', + ), + 1 => + array ( + 'created' => '1031216941', + 'creator_id' => '14', + 'id' => '2', + 'modified' => '1033922113', + 'modifier_id' => '14', + 'name' => 'Users', + ), + 2 => + array ( + 'created' => '1032009743', + 'creator_id' => '14', + 'id' => '3', + 'modified' => '1033922120', + 'modifier_id' => '14', + 'name' => 'Media', + ), + 3 => + array ( + 'created' => '1081858024', + 'creator_id' => '14', + 'id' => '4', + 'modified' => '1081858024', + 'modifier_id' => '14', + 'name' => 'Setup', + ), +), +'ezcontentobject' => +array ( + 0 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033917596', + 'name' => 'Users', + 'owner_id' => '14', + 'published' => '1033917596', + 'remote_id' => 'f5c88a2209584891056f987fd965b0ba', + 'section_id' => '2', + 'status' => '1', + ), + 1 => + array ( + 'contentclass_id' => '4', + 'current_version' => '2', + 'id' => '10', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'name' => 'Anonymous User', + 'owner_id' => '14', + 'published' => '1033920665', + 'remote_id' => 'faaeb9be3bd98ed09f606fc16d144eca', + 'section_id' => '2', + 'status' => '1', + ), + 2 => + array ( + 'contentclass_id' => '3', + 'current_version' => '2', + 'id' => '11', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343140542', + 'name' => 'Members', + 'owner_id' => '14', + 'published' => '1033920746', + 'remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'section_id' => '2', + 'status' => '1', + ), + 3 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '12', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'name' => 'Administrator users', + 'owner_id' => '14', + 'published' => '1033920775', + 'remote_id' => '9b47a45624b023b1a76c73b74d704acf', + 'section_id' => '2', + 'status' => '1', + ), + 4 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '13', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'name' => 'Editors', + 'owner_id' => '14', + 'published' => '1033920794', + 'remote_id' => '3c160cca19fb135f83bd02d911f04db2', + 'section_id' => '2', + 'status' => '1', + ), + 5 => + array ( + 'contentclass_id' => '4', + 'current_version' => '4', + 'id' => '14', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343140540', + 'name' => 'Administrator User', + 'owner_id' => '14', + 'published' => '1033920830', + 'remote_id' => '1bb4fe25487f05527efa8bfd394cecc7', + 'section_id' => '2', + 'status' => '1', + ), + 6 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '41', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'name' => 'Media', + 'owner_id' => '14', + 'published' => '1060695457', + 'remote_id' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + 'section_id' => '3', + 'status' => '1', + ), + 7 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '42', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'name' => 'Anonymous Users', + 'owner_id' => '14', + 'published' => '1072180330', + 'remote_id' => '15b256dbea2ae72418ff5facc999e8f9', + 'section_id' => '2', + 'status' => '1', + ), + 8 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '45', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'name' => 'Setup', + 'owner_id' => '14', + 'published' => '1079684190', + 'remote_id' => '241d538ce310074e602f29f49e44e938', + 'section_id' => '4', + 'status' => '1', + ), + 9 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '49', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'name' => 'Images', + 'owner_id' => '14', + 'published' => '1080220197', + 'remote_id' => 'e7ff633c6b8e0fd3531e74c6e712bead', + 'section_id' => '3', + 'status' => '1', + ), + 10 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '50', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'name' => 'Files', + 'owner_id' => '14', + 'published' => '1080220220', + 'remote_id' => '732a5acd01b51a6fe6eab448ad4138a9', + 'section_id' => '3', + 'status' => '1', + ), + 11 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '51', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'name' => 'Multimedia', + 'owner_id' => '14', + 'published' => '1080220233', + 'remote_id' => '09082deb98662a104f325aaa8c4933d3', + 'section_id' => '3', + 'status' => '1', + ), + 12 => + array ( + 'contentclass_id' => '14', + 'current_version' => '1', + 'id' => '52', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'name' => 'Common INI settings', + 'owner_id' => '14', + 'published' => '1082016591', + 'remote_id' => '27437f3547db19cf81a33c92578b2c89', + 'section_id' => '4', + 'status' => '1', + ), + 13 => + array ( + 'contentclass_id' => '15', + 'current_version' => '2', + 'id' => '54', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062376', + 'name' => 'eZ Publish Demo Design (without demo content)', + 'owner_id' => '14', + 'published' => '1082016652', + 'remote_id' => '8b8b22fe3c6061ed500fbd2b377b885f', + 'section_id' => '5', + 'status' => '1', + ), + 14 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '56', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023132', + 'name' => 'Design', + 'owner_id' => '14', + 'published' => '1103023132', + 'remote_id' => '08799e609893f7aba22f10cb466d9cc8', + 'section_id' => '5', + 'status' => '1', + ), + 15 => + array ( + 'contentclass_id' => '21', + 'current_version' => '1', + 'id' => '57', + 'initial_language_id' => '8', + 'language_mask' => '9', + 'modified' => '1196268696', + 'name' => 'Home', + 'owner_id' => '14', + 'published' => '1195480486', + 'remote_id' => '8a9c9c761004866fb458d89910f52bee', + 'section_id' => '1', + 'status' => '1', + ), + 16 => + array ( + 'contentclass_id' => '20', + 'current_version' => '1', + 'id' => '58', + 'initial_language_id' => '8', + 'language_mask' => '8', + 'modified' => '1332927282', + 'name' => 'Contact Us', + 'owner_id' => '14', + 'published' => '1332927205', + 'remote_id' => 'f8cc7a4cf8a964a1a0ea6666f5da7d0d', + 'section_id' => '1', + 'status' => '1', + ), + 17 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '59', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343140541', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1343140541', + 'remote_id' => '14e4411b264a6194a33847843919451a', + 'section_id' => '2', + 'status' => '1', + ), +), +'ezcontentobject_attribute' => +array ( + 0 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Main group', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Users', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 2 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous', + 'data_type_string' => 'ezstring', + 'id' => '19', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous', + 'version' => '2', + ), + 3 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '20', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '2', + ), + 4 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '21', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 5 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Guest accounts', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 6 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Members', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'members', + 'version' => '2', + ), + 7 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 8 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 9 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator users', + 'data_type_string' => 'ezstring', + 'id' => '24', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 10 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '25', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 11 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Editors', + 'data_type_string' => 'ezstring', + 'id' => '26', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 12 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '27', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 13 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '3', + ), + 14 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '4', + ), + 15 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '3', + ), + 16 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '4', + ), + 17 => + array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 18 => + array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 19 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Media', + 'data_type_string' => 'ezstring', + 'id' => '98', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 20 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '99', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 21 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous Users', + 'data_type_string' => 'ezstring', + 'id' => '100', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous users', + 'version' => '1', + ), + 22 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User group for the anonymous user', + 'data_type_string' => 'ezstring', + 'id' => '101', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user group for the anonymous user', + 'version' => '1', + ), + 23 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '103', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 24 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '105', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 25 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '109', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 26 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Setup', + 'data_type_string' => 'ezstring', + 'id' => '123', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'setup', + 'version' => '1', + ), + 27 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '124', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 28 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '125', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 29 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '126', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 30 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '128', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 31 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Images', + 'data_type_string' => 'ezstring', + 'id' => '142', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'images', + 'version' => '1', + ), + 32 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '143', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 33 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '144', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 34 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '145', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 35 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '146', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 36 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Files', + 'data_type_string' => 'ezstring', + 'id' => '147', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'files', + 'version' => '1', + ), + 37 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '148', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 38 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '149', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 39 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '150', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 40 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '151', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 41 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Multimedia', + 'data_type_string' => 'ezstring', + 'id' => '152', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'multimedia', + 'version' => '1', + ), + 42 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '153', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 43 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '154', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 44 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '155', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 45 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '156', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 46 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '159', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Common INI settings', + 'data_type_string' => 'ezstring', + 'id' => '157', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'common ini settings', + 'version' => '1', + ), + 47 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '160', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2/', + 'data_type_string' => 'ezinisetting', + 'id' => '158', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 48 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '161', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2', + 'data_type_string' => 'ezinisetting', + 'id' => '159', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 49 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '162', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 50 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '163', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 51 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '164', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 52 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '165', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 53 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '166', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 54 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '167', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 55 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '168', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 56 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '169', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=100;100', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 57 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '170', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=200;200', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 58 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '171', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=300;300', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 59 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '172', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'eZ Publish Demo Design (without demo content)', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 60 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '173', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'author=eZ Systems +copyright=eZ Systems +description=Content Management System +keywords=cms, publish, e-commerce, content management, development framework', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 61 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '174', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="eZ-Publish-Demo-Design-without-demo-content1.png" suffix="png" basename="eZ-Publish-Demo-Design-without-demo-content1" dirpath="var/ezdemo_site/storage/images/design/plain-site/172-2-eng-US" url="var/ezdemo_site/storage/images/design/plain-site/172-2-eng-US/eZ-Publish-Demo-Design-without-demo-content1.png" original_filename="logo.png" mime_type="image/png" width="138" height="46" alternative_text="" alias_key="1293033771" timestamp="1343140541"><original attribute_id="172" attribute_version="2" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '172', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 62 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '175', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '0', + 'data_type_string' => 'ezpackage', + 'id' => '173', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '0', + 'version' => '2', + ), + 63 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '177', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'spam@ez.no', + 'data_type_string' => 'ezinisetting', + 'id' => '175', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 64 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '178', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'ws2/dump_47_demo/index.php', + 'data_type_string' => 'ezinisetting', + 'id' => '176', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 65 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '177', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 66 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 67 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 68 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezimage', + 'id' => '179', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 69 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 70 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 71 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Design', + 'data_type_string' => 'ezstring', + 'id' => '181', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'design', + 'version' => '1', + ), + 72 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '182', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 73 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '183', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 74 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '184', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 75 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '185', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 76 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '219', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Home', + 'data_type_string' => 'ezstring', + 'id' => '186', + 'language_code' => 'eng-GB', + 'language_id' => '9', + 'sort_key_int' => '0', + 'sort_key_string' => 'home', + 'version' => '1', + ), + 77 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '220', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '187', + 'language_code' => 'eng-GB', + 'language_id' => '9', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 78 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '212', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Contact Us', + 'data_type_string' => 'ezstring', + 'id' => '188', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => 'contact us', + 'version' => '1', + ), + 79 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '213', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Please fill in the form below to contact us.</paragraph><paragraph>You can also reach us at:</paragraph><paragraph><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/"><strong>Company Name</strong></line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Address</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">City</line><line xmlns:tmp="http://ez.no/namespaces/ezpublish3/temporary/">Country�</line></paragraph></section>', + 'data_type_string' => 'ezxmltext', + 'id' => '189', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 80 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '214', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '190', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 81 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '215', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '191', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 82 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '216', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '192', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 83 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '217', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezemail', + 'id' => '193', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 84 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '218', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezemail', + 'id' => '194', + 'language_code' => 'eng-GB', + 'language_id' => '8', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 85 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '279', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '23', + 'data_text' => 'Site map', + 'data_type_string' => 'ezurl', + 'id' => '195', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 86 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '280', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '24', + 'data_text' => 'Tag cloud', + 'data_type_string' => 'ezurl', + 'id' => '196', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 87 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '281', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Login', + 'data_type_string' => 'ezstring', + 'id' => '197', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'login', + 'version' => '2', + ), + 88 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '282', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Logout', + 'data_type_string' => 'ezstring', + 'id' => '198', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'logout', + 'version' => '2', + ), + 89 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '283', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'My profile', + 'data_type_string' => 'ezstring', + 'id' => '199', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'my profile', + 'version' => '2', + ), + 90 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '284', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Register', + 'data_type_string' => 'ezstring', + 'id' => '200', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'register', + 'version' => '2', + ), + 91 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '285', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '/rss/feed/my_feed', + 'data_type_string' => 'ezstring', + 'id' => '201', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '/rss/feed/my_feed', + 'version' => '2', + ), + 92 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '286', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Shopping basket', + 'data_type_string' => 'ezstring', + 'id' => '202', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'shopping basket', + 'version' => '2', + ), + 93 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '287', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Site settings', + 'data_type_string' => 'ezstring', + 'id' => '203', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'site settings', + 'version' => '2', + ), + 94 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '288', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Copyright © 2012 <a href="http://ez.no" title="eZ Systems">eZ Systems AS</a> (except where otherwise noted). All rights reserved.', + 'data_type_string' => 'eztext', + 'id' => '204', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 95 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '289', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '205', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 96 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '290', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '206', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 97 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '207', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 98 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '59', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '208', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 99 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '291', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '209', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 100 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '291', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '210', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 101 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '291', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '211', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 102 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '291', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '212', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 103 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '291', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '213', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 104 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '291', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page/> +', + 'data_type_string' => 'ezpage', + 'id' => '214', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 105 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '292', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '215', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 106 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '292', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '216', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 107 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '292', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '217', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 108 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '292', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '218', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 109 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '292', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '219', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 110 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '292', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '220', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), +), +'ezcontentobject_link' => +array ( +), +'ezcontentobject_name' => +array ( + 0 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '4', + 'language_id' => '3', + 'name' => 'Users', + 'real_translation' => 'eng-US', + ), + 1 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '10', + 'language_id' => '3', + 'name' => 'Anonymous User', + 'real_translation' => 'eng-US', + ), + 2 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '11', + 'language_id' => '3', + 'name' => 'Guest accounts', + 'real_translation' => 'eng-US', + ), + 3 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '11', + 'language_id' => '3', + 'name' => 'Members', + 'real_translation' => 'eng-US', + ), + 4 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '12', + 'language_id' => '3', + 'name' => 'Administrator users', + 'real_translation' => 'eng-US', + ), + 5 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '13', + 'language_id' => '3', + 'name' => 'Editors', + 'real_translation' => 'eng-US', + ), + 6 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '3', + 'contentobject_id' => '14', + 'language_id' => '3', + 'name' => 'Administrator User', + 'real_translation' => 'eng-US', + ), + 7 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '4', + 'contentobject_id' => '14', + 'language_id' => '3', + 'name' => 'Administrator User', + 'real_translation' => 'eng-US', + ), + 8 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '41', + 'language_id' => '3', + 'name' => 'Media', + 'real_translation' => 'eng-US', + ), + 9 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '42', + 'language_id' => '3', + 'name' => 'Anonymous Users', + 'real_translation' => 'eng-US', + ), + 10 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '45', + 'language_id' => '3', + 'name' => 'Setup', + 'real_translation' => 'eng-US', + ), + 11 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '49', + 'language_id' => '3', + 'name' => 'Images', + 'real_translation' => 'eng-US', + ), + 12 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '50', + 'language_id' => '3', + 'name' => 'Files', + 'real_translation' => 'eng-US', + ), + 13 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '51', + 'language_id' => '3', + 'name' => 'Multimedia', + 'real_translation' => 'eng-US', + ), + 14 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '52', + 'language_id' => '2', + 'name' => 'Common INI settings', + 'real_translation' => 'eng-US', + ), + 15 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '54', + 'language_id' => '2', + 'name' => 'eZ Publish Demo Design (without demo content)', + 'real_translation' => 'eng-US', + ), + 16 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '56', + 'language_id' => '3', + 'name' => 'Design', + 'real_translation' => 'eng-US', + ), + 17 => + array ( + 'content_translation' => 'eng-GB', + 'content_version' => '1', + 'contentobject_id' => '57', + 'language_id' => '9', + 'name' => 'Home', + 'real_translation' => 'eng-GB', + ), + 18 => + array ( + 'content_translation' => 'eng-GB', + 'content_version' => '1', + 'contentobject_id' => '58', + 'language_id' => '8', + 'name' => 'Contact Us', + 'real_translation' => 'eng-GB', + ), + 19 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '59', + 'language_id' => '3', + 'name' => 'Partners', + 'real_translation' => 'eng-US', + ), +), +'ezcontentobject_trash' => +array ( +), +'ezcontentobject_tree' => +array ( + 0 => + array ( + 'contentobject_id' => '0', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '0', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '1', + 'modified_subnode' => '1343140542', + 'node_id' => '1', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/', + 'priority' => '0', + 'remote_id' => '629709ba256fe317c3ddcee35453a96a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => + array ( + 'contentobject_id' => '57', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '2', + 'modified_subnode' => '1343140541', + 'node_id' => '2', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/2/', + 'priority' => '0', + 'remote_id' => 'f3e90596361e31d496d4026eb624c983', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 2 => + array ( + 'contentobject_id' => '4', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '5', + 'modified_subnode' => '1343140542', + 'node_id' => '5', + 'parent_node_id' => '1', + 'path_identification_string' => 'users', + 'path_string' => '/1/5/', + 'priority' => '0', + 'remote_id' => '3f6d92f8044aed134f32153517850f5a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 3 => + array ( + 'contentobject_id' => '11', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '12', + 'modified_subnode' => '1343140542', + 'node_id' => '12', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/members', + 'path_string' => '/1/5/12/', + 'priority' => '0', + 'remote_id' => '602dcf84765e56b7f999eaafd3821dd3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => + array ( + 'contentobject_id' => '12', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '13', + 'modified_subnode' => '1343140540', + 'node_id' => '13', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/administrator_users', + 'path_string' => '/1/5/13/', + 'priority' => '0', + 'remote_id' => '769380b7aa94541679167eab817ca893', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => + array ( + 'contentobject_id' => '13', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '14', + 'modified_subnode' => '1081860719', + 'node_id' => '14', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/editors', + 'path_string' => '/1/5/14/', + 'priority' => '0', + 'remote_id' => 'f7dda2854fc68f7c8455d9cb14bd04a9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => + array ( + 'contentobject_id' => '14', + 'contentobject_is_published' => '1', + 'contentobject_version' => '4', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '15', + 'modified_subnode' => '1343140540', + 'node_id' => '15', + 'parent_node_id' => '13', + 'path_identification_string' => 'users/administrator_users/administrator_user', + 'path_string' => '/1/5/13/15/', + 'priority' => '0', + 'remote_id' => 'e5161a99f733200b9ed4e80f9c16187b', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => + array ( + 'contentobject_id' => '41', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '43', + 'modified_subnode' => '1081860720', + 'node_id' => '43', + 'parent_node_id' => '1', + 'path_identification_string' => 'media', + 'path_string' => '/1/43/', + 'priority' => '0', + 'remote_id' => '75c715a51699d2d309a924eca6a95145', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 8 => + array ( + 'contentobject_id' => '42', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '44', + 'modified_subnode' => '1081860719', + 'node_id' => '44', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/anonymous_users', + 'path_string' => '/1/5/44/', + 'priority' => '0', + 'remote_id' => '4fdf0072da953bb276c0c7e0141c5c9b', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => + array ( + 'contentobject_id' => '10', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '45', + 'modified_subnode' => '1081860719', + 'node_id' => '45', + 'parent_node_id' => '44', + 'path_identification_string' => 'users/anonymous_users/anonymous_user', + 'path_string' => '/1/5/44/45/', + 'priority' => '0', + 'remote_id' => '2cf8343bee7b482bab82b269d8fecd76', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => + array ( + 'contentobject_id' => '45', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '48', + 'modified_subnode' => '1184592117', + 'node_id' => '48', + 'parent_node_id' => '1', + 'path_identification_string' => 'setup2', + 'path_string' => '/1/48/', + 'priority' => '0', + 'remote_id' => '182ce1b5af0c09fa378557c462ba2617', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => + array ( + 'contentobject_id' => '49', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '51', + 'modified_subnode' => '1081860720', + 'node_id' => '51', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/images', + 'path_string' => '/1/43/51/', + 'priority' => '0', + 'remote_id' => '1b26c0454b09bb49dfb1b9190ffd67cb', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => + array ( + 'contentobject_id' => '50', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '52', + 'modified_subnode' => '1081860720', + 'node_id' => '52', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/files', + 'path_string' => '/1/43/52/', + 'priority' => '0', + 'remote_id' => '0b113a208f7890f9ad3c24444ff5988c', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 13 => + array ( + 'contentobject_id' => '51', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '53', + 'modified_subnode' => '1081860720', + 'node_id' => '53', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/multimedia', + 'path_string' => '/1/43/53/', + 'priority' => '0', + 'remote_id' => '4f18b82c75f10aad476cae5adf98c11f', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 14 => + array ( + 'contentobject_id' => '52', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '54', + 'modified_subnode' => '1184592117', + 'node_id' => '54', + 'parent_node_id' => '48', + 'path_identification_string' => 'setup2/common_ini_settings', + 'path_string' => '/1/48/54/', + 'priority' => '0', + 'remote_id' => 'fa9f3cff9cf90ecfae335718dcbddfe2', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => + array ( + 'contentobject_id' => '54', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '56', + 'modified_subnode' => '1343140541', + 'node_id' => '56', + 'parent_node_id' => '58', + 'path_identification_string' => 'design/plain_site', + 'path_string' => '/1/58/56/', + 'priority' => '0', + 'remote_id' => '772da20ecf88b3035d73cbdfcea0f119', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => + array ( + 'contentobject_id' => '56', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '58', + 'modified_subnode' => '1343140541', + 'node_id' => '58', + 'parent_node_id' => '1', + 'path_identification_string' => 'design', + 'path_string' => '/1/58/', + 'priority' => '0', + 'remote_id' => '79f2d67372ab56f59b5d65bb9e0ca3b9', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 17 => + array ( + 'contentobject_id' => '58', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '60', + 'modified_subnode' => '1343140539', + 'node_id' => '60', + 'parent_node_id' => '2', + 'path_identification_string' => 'contact_us', + 'path_string' => '/1/2/60/', + 'priority' => '-2', + 'remote_id' => '86bf306624668ee9b8b979b0d56f7e0d', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 18 => + array ( + 'contentobject_id' => '59', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '61', + 'modified_subnode' => '1343140541', + 'node_id' => '61', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/partners', + 'path_string' => '/1/5/61/', + 'priority' => '0', + 'remote_id' => '66994c2fce0fd2a1c7ecce7115158971', + 'sort_field' => '1', + 'sort_order' => '1', + ), +), +'ezcontentobject_version' => +array ( + 0 => + array ( + 'contentobject_id' => '4', + 'created' => '0', + 'creator_id' => '14', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '0', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '1', + ), + 1 => + array ( + 'contentobject_id' => '11', + 'created' => '1033920737', + 'creator_id' => '14', + 'id' => '439', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920746', + 'status' => '3', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 2 => + array ( + 'contentobject_id' => '12', + 'created' => '1033920760', + 'creator_id' => '14', + 'id' => '440', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 3 => + array ( + 'contentobject_id' => '13', + 'created' => '1033920786', + 'creator_id' => '14', + 'id' => '441', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 4 => + array ( + 'contentobject_id' => '41', + 'created' => '1060695450', + 'creator_id' => '14', + 'id' => '472', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 5 => + array ( + 'contentobject_id' => '42', + 'created' => '1072180278', + 'creator_id' => '14', + 'id' => '473', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 6 => + array ( + 'contentobject_id' => '10', + 'created' => '1072180337', + 'creator_id' => '14', + 'id' => '474', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 7 => + array ( + 'contentobject_id' => '45', + 'created' => '1079684084', + 'creator_id' => '14', + 'id' => '477', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 8 => + array ( + 'contentobject_id' => '49', + 'created' => '1080220181', + 'creator_id' => '14', + 'id' => '488', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 9 => + array ( + 'contentobject_id' => '50', + 'created' => '1080220211', + 'creator_id' => '14', + 'id' => '489', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 10 => + array ( + 'contentobject_id' => '51', + 'created' => '1080220225', + 'creator_id' => '14', + 'id' => '490', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 11 => + array ( + 'contentobject_id' => '52', + 'created' => '1082016497', + 'creator_id' => '14', + 'id' => '491', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 12 => + array ( + 'contentobject_id' => '56', + 'created' => '1103023120', + 'creator_id' => '14', + 'id' => '495', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023120', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 13 => + array ( + 'contentobject_id' => '14', + 'created' => '1301061783', + 'creator_id' => '14', + 'id' => '499', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1301062024', + 'status' => '3', + 'user_id' => '0', + 'version' => '3', + 'workflow_event_pos' => '0', + ), + 14 => + array ( + 'contentobject_id' => '54', + 'created' => '1301062300', + 'creator_id' => '14', + 'id' => '500', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062375', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 15 => + array ( + 'contentobject_id' => '57', + 'created' => '1196268655', + 'creator_id' => '14', + 'id' => '504', + 'initial_language_id' => '8', + 'language_mask' => '9', + 'modified' => '1196268696', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 16 => + array ( + 'contentobject_id' => '58', + 'created' => '1332927277', + 'creator_id' => '14', + 'id' => '505', + 'initial_language_id' => '8', + 'language_mask' => '9', + 'modified' => '1332927282', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 17 => + array ( + 'contentobject_id' => '14', + 'created' => '1343140540', + 'creator_id' => '14', + 'id' => '506', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343140540', + 'status' => '1', + 'user_id' => '0', + 'version' => '4', + 'workflow_event_pos' => '0', + ), + 18 => + array ( + 'contentobject_id' => '59', + 'created' => '1343140541', + 'creator_id' => '14', + 'id' => '507', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343140541', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 19 => + array ( + 'contentobject_id' => '11', + 'created' => '1343140541', + 'creator_id' => '14', + 'id' => '508', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343140541', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), +), +/* 'ezcurrencydata' => +array ( +), +'ezdiscountrule' => +array ( +), +'ezdiscountsubrule' => +array ( +), +'ezdiscountsubrule_value' => +array ( +), +'ezenumobjectvalue' => +array ( +), +'ezenumvalue' => +array ( +), +'ezforgot_password' => +array ( +), +'ezgeneral_digest_user_settings' => +array ( +), +'ezgmaplocation' => +array ( +),*/ +'ezimagefile' => +array ( + 0 => + array ( + 'contentobject_attribute_id' => '172', + 'filepath' => 'var/storage/images/setup/ez_publish/172-1-eng-GB/ez_publish.', + 'id' => '1', + ), + 1 => + array ( + 'contentobject_attribute_id' => '172', + 'filepath' => 'var/ezdemo_site/storage/images/design/plain-site/172-2-eng-US/eZ-Publish-Demo-Design-without-demo-content1.png', + 'id' => '2', + ), +), +/* 'ezinfocollection' => +array ( +), +'ezinfocollection_attribute' => +array ( +), +'ezisbn_group' => +array ( + 0 => + array ( + 'description' => 'English language', + 'group_number' => '0', + 'id' => '1', + ), + 1 => + array ( + 'description' => 'English language', + 'group_number' => '1', + 'id' => '2', + ), + 2 => + array ( + 'description' => 'French language', + 'group_number' => '2', + 'id' => '3', + ), + 3 => + array ( + 'description' => 'German language', + 'group_number' => '3', + 'id' => '4', + ), + 4 => + array ( + 'description' => 'Japan', + 'group_number' => '4', + 'id' => '5', + ), + 5 => + array ( + 'description' => 'Russian Federation and former USSR', + 'group_number' => '5', + 'id' => '6', + ), + 6 => + array ( + 'description' => 'Iran', + 'group_number' => '600', + 'id' => '7', + ), + 7 => + array ( + 'description' => 'Kazakhstan', + 'group_number' => '601', + 'id' => '8', + ), + 8 => + array ( + 'description' => 'Indonesia', + 'group_number' => '602', + 'id' => '9', + ), + 9 => + array ( + 'description' => 'Saudi Arabia', + 'group_number' => '603', + 'id' => '10', + ), + 10 => + array ( + 'description' => 'Vietnam', + 'group_number' => '604', + 'id' => '11', + ), + 11 => + array ( + 'description' => 'Turkey', + 'group_number' => '605', + 'id' => '12', + ), + 12 => + array ( + 'description' => 'Romania', + 'group_number' => '606', + 'id' => '13', + ), + 13 => + array ( + 'description' => 'Mexico', + 'group_number' => '607', + 'id' => '14', + ), + 14 => + array ( + 'description' => 'Macedonia', + 'group_number' => '608', + 'id' => '15', + ), + 15 => + array ( + 'description' => 'Lithuania', + 'group_number' => '609', + 'id' => '16', + ), + 16 => + array ( + 'description' => 'Thailand', + 'group_number' => '611', + 'id' => '17', + ), + 17 => + array ( + 'description' => 'Peru', + 'group_number' => '612', + 'id' => '18', + ), + 18 => + array ( + 'description' => 'Mauritius', + 'group_number' => '613', + 'id' => '19', + ), + 19 => + array ( + 'description' => 'Lebanon', + 'group_number' => '614', + 'id' => '20', + ), + 20 => + array ( + 'description' => 'Hungary', + 'group_number' => '615', + 'id' => '21', + ), + 21 => + array ( + 'description' => 'Thailand', + 'group_number' => '616', + 'id' => '22', + ), + 22 => + array ( + 'description' => 'Ukraine', + 'group_number' => '617', + 'id' => '23', + ), + 23 => + array ( + 'description' => 'China, People\'s Republic', + 'group_number' => '7', + 'id' => '24', + ), + 24 => + array ( + 'description' => 'Czech Republic and Slovakia', + 'group_number' => '80', + 'id' => '25', + ), + 25 => + array ( + 'description' => 'India', + 'group_number' => '81', + 'id' => '26', + ), + 26 => + array ( + 'description' => 'Norway', + 'group_number' => '82', + 'id' => '27', + ), + 27 => + array ( + 'description' => 'Poland', + 'group_number' => '83', + 'id' => '28', + ), + 28 => + array ( + 'description' => 'Spain', + 'group_number' => '84', + 'id' => '29', + ), + 29 => + array ( + 'description' => 'Brazil', + 'group_number' => '85', + 'id' => '30', + ), + 30 => + array ( + 'description' => 'Serbia and Montenegro', + 'group_number' => '86', + 'id' => '31', + ), + 31 => + array ( + 'description' => 'Denmark', + 'group_number' => '87', + 'id' => '32', + ), + 32 => + array ( + 'description' => 'Italy', + 'group_number' => '88', + 'id' => '33', + ), + 33 => + array ( + 'description' => 'Korea, Republic', + 'group_number' => '89', + 'id' => '34', + ), + 34 => + array ( + 'description' => 'Netherlands', + 'group_number' => '90', + 'id' => '35', + ), + 35 => + array ( + 'description' => 'Sweden', + 'group_number' => '91', + 'id' => '36', + ), + 36 => + array ( + 'description' => 'International NGO Publishers and EC Organizations', + 'group_number' => '92', + 'id' => '37', + ), + 37 => + array ( + 'description' => 'India', + 'group_number' => '93', + 'id' => '38', + ), + 38 => + array ( + 'description' => 'Netherlands', + 'group_number' => '94', + 'id' => '39', + ), + 39 => + array ( + 'description' => 'Argentina', + 'group_number' => '950', + 'id' => '40', + ), + 40 => + array ( + 'description' => 'Finland', + 'group_number' => '951', + 'id' => '41', + ), + 41 => + array ( + 'description' => 'Finland', + 'group_number' => '952', + 'id' => '42', + ), + 42 => + array ( + 'description' => 'Croatia', + 'group_number' => '953', + 'id' => '43', + ), + 43 => + array ( + 'description' => 'Bulgaria', + 'group_number' => '954', + 'id' => '44', + ), + 44 => + array ( + 'description' => 'Sri Lanka', + 'group_number' => '955', + 'id' => '45', + ), + 45 => + array ( + 'description' => 'Chile', + 'group_number' => '956', + 'id' => '46', + ), + 46 => + array ( + 'description' => 'Taiwan', + 'group_number' => '957', + 'id' => '47', + ), + 47 => + array ( + 'description' => 'Colombia', + 'group_number' => '958', + 'id' => '48', + ), + 48 => + array ( + 'description' => 'Cuba', + 'group_number' => '959', + 'id' => '49', + ), + 49 => + array ( + 'description' => 'Greece', + 'group_number' => '960', + 'id' => '50', + ), + 50 => + array ( + 'description' => 'Slovenia', + 'group_number' => '961', + 'id' => '51', + ), + 51 => + array ( + 'description' => 'Hong Kong, China', + 'group_number' => '962', + 'id' => '52', + ), + 52 => + array ( + 'description' => 'Hungary', + 'group_number' => '963', + 'id' => '53', + ), + 53 => + array ( + 'description' => 'Iran', + 'group_number' => '964', + 'id' => '54', + ), + 54 => + array ( + 'description' => 'Israel', + 'group_number' => '965', + 'id' => '55', + ), + 55 => + array ( + 'description' => 'Ukraine', + 'group_number' => '966', + 'id' => '56', + ), + 56 => + array ( + 'description' => 'Malaysia', + 'group_number' => '967', + 'id' => '57', + ), + 57 => + array ( + 'description' => 'Mexico', + 'group_number' => '968', + 'id' => '58', + ), + 58 => + array ( + 'description' => 'Pakistan', + 'group_number' => '969', + 'id' => '59', + ), + 59 => + array ( + 'description' => 'Mexico', + 'group_number' => '970', + 'id' => '60', + ), + 60 => + array ( + 'description' => 'Philippines', + 'group_number' => '971', + 'id' => '61', + ), + 61 => + array ( + 'description' => 'Portugal', + 'group_number' => '972', + 'id' => '62', + ), + 62 => + array ( + 'description' => 'Romania', + 'group_number' => '973', + 'id' => '63', + ), + 63 => + array ( + 'description' => 'Thailand', + 'group_number' => '974', + 'id' => '64', + ), + 64 => + array ( + 'description' => 'Turkey', + 'group_number' => '975', + 'id' => '65', + ), + 65 => + array ( + 'description' => 'Caribbean Community', + 'group_number' => '976', + 'id' => '66', + ), + 66 => + array ( + 'description' => 'Egypt', + 'group_number' => '977', + 'id' => '67', + ), + 67 => + array ( + 'description' => 'Nigeria', + 'group_number' => '978', + 'id' => '68', + ), + 68 => + array ( + 'description' => 'Indonesia', + 'group_number' => '979', + 'id' => '69', + ), + 69 => + array ( + 'description' => 'Venezuela', + 'group_number' => '980', + 'id' => '70', + ), + 70 => + array ( + 'description' => 'Singapore', + 'group_number' => '981', + 'id' => '71', + ), + 71 => + array ( + 'description' => 'South Pacific', + 'group_number' => '982', + 'id' => '72', + ), + 72 => + array ( + 'description' => 'Malaysia', + 'group_number' => '983', + 'id' => '73', + ), + 73 => + array ( + 'description' => 'Bangladesh', + 'group_number' => '984', + 'id' => '74', + ), + 74 => + array ( + 'description' => 'Belarus', + 'group_number' => '985', + 'id' => '75', + ), + 75 => + array ( + 'description' => 'Taiwan', + 'group_number' => '986', + 'id' => '76', + ), + 76 => + array ( + 'description' => 'Argentina', + 'group_number' => '987', + 'id' => '77', + ), + 77 => + array ( + 'description' => 'Hong Kong, China', + 'group_number' => '988', + 'id' => '78', + ), + 78 => + array ( + 'description' => 'Portugal', + 'group_number' => '989', + 'id' => '79', + ), + 79 => + array ( + 'description' => 'Qatar', + 'group_number' => '9927', + 'id' => '80', + ), + 80 => + array ( + 'description' => 'Albania', + 'group_number' => '9928', + 'id' => '81', + ), + 81 => + array ( + 'description' => 'Guatemala', + 'group_number' => '9929', + 'id' => '82', + ), + 82 => + array ( + 'description' => 'Costa Rica', + 'group_number' => '9930', + 'id' => '83', + ), + 83 => + array ( + 'description' => 'Algeria', + 'group_number' => '9931', + 'id' => '84', + ), + 84 => + array ( + 'description' => 'Lao People\'s Democratic Republic', + 'group_number' => '9932', + 'id' => '85', + ), + 85 => + array ( + 'description' => 'Syria', + 'group_number' => '9933', + 'id' => '86', + ), + 86 => + array ( + 'description' => 'Latvia', + 'group_number' => '9934', + 'id' => '87', + ), + 87 => + array ( + 'description' => 'Iceland', + 'group_number' => '9935', + 'id' => '88', + ), + 88 => + array ( + 'description' => 'Afghanistan', + 'group_number' => '9936', + 'id' => '89', + ), + 89 => + array ( + 'description' => 'Nepal', + 'group_number' => '9937', + 'id' => '90', + ), + 90 => + array ( + 'description' => 'Tunisia', + 'group_number' => '9938', + 'id' => '91', + ), + 91 => + array ( + 'description' => 'Armenia', + 'group_number' => '9939', + 'id' => '92', + ), + 92 => + array ( + 'description' => 'Montenegro', + 'group_number' => '9940', + 'id' => '93', + ), + 93 => + array ( + 'description' => 'Georgia', + 'group_number' => '9941', + 'id' => '94', + ), + 94 => + array ( + 'description' => 'Ecuador', + 'group_number' => '9942', + 'id' => '95', + ), + 95 => + array ( + 'description' => 'Uzbekistan', + 'group_number' => '9943', + 'id' => '96', + ), + 96 => + array ( + 'description' => 'Turkey', + 'group_number' => '9944', + 'id' => '97', + ), + 97 => + array ( + 'description' => 'Dominican Republic', + 'group_number' => '9945', + 'id' => '98', + ), + 98 => + array ( + 'description' => 'Korea, P.D.R.', + 'group_number' => '9946', + 'id' => '99', + ), + 99 => + array ( + 'description' => 'Algeria', + 'group_number' => '9947', + 'id' => '100', + ), + 100 => + array ( + 'description' => 'United Arab Emirates', + 'group_number' => '9948', + 'id' => '101', + ), + 101 => + array ( + 'description' => 'Estonia', + 'group_number' => '9949', + 'id' => '102', + ), + 102 => + array ( + 'description' => 'Palestine', + 'group_number' => '9950', + 'id' => '103', + ), + 103 => + array ( + 'description' => 'Kosova', + 'group_number' => '9951', + 'id' => '104', + ), + 104 => + array ( + 'description' => 'Azerbaijan', + 'group_number' => '9952', + 'id' => '105', + ), + 105 => + array ( + 'description' => 'Lebanon', + 'group_number' => '9953', + 'id' => '106', + ), + 106 => + array ( + 'description' => 'Morocco', + 'group_number' => '9954', + 'id' => '107', + ), + 107 => + array ( + 'description' => 'Lithuania', + 'group_number' => '9955', + 'id' => '108', + ), + 108 => + array ( + 'description' => 'Cameroon', + 'group_number' => '9956', + 'id' => '109', + ), + 109 => + array ( + 'description' => 'Jordan', + 'group_number' => '9957', + 'id' => '110', + ), + 110 => + array ( + 'description' => 'Bosnia and Herzegovina', + 'group_number' => '9958', + 'id' => '111', + ), + 111 => + array ( + 'description' => 'Libya', + 'group_number' => '9959', + 'id' => '112', + ), + 112 => + array ( + 'description' => 'Saudi Arabia', + 'group_number' => '9960', + 'id' => '113', + ), + 113 => + array ( + 'description' => 'Algeria', + 'group_number' => '9961', + 'id' => '114', + ), + 114 => + array ( + 'description' => 'Panama', + 'group_number' => '9962', + 'id' => '115', + ), + 115 => + array ( + 'description' => 'Cyprus', + 'group_number' => '9963', + 'id' => '116', + ), + 116 => + array ( + 'description' => 'Ghana', + 'group_number' => '9964', + 'id' => '117', + ), + 117 => + array ( + 'description' => 'Kazakhstan', + 'group_number' => '9965', + 'id' => '118', + ), + 118 => + array ( + 'description' => 'Kenya', + 'group_number' => '9966', + 'id' => '119', + ), + 119 => + array ( + 'description' => 'Kyrgyz Republic', + 'group_number' => '9967', + 'id' => '120', + ), + 120 => + array ( + 'description' => 'Costa Rica', + 'group_number' => '9968', + 'id' => '121', + ), + 121 => + array ( + 'description' => 'Uganda', + 'group_number' => '9970', + 'id' => '122', + ), + 122 => + array ( + 'description' => 'Singapore', + 'group_number' => '9971', + 'id' => '123', + ), + 123 => + array ( + 'description' => 'Peru', + 'group_number' => '9972', + 'id' => '124', + ), + 124 => + array ( + 'description' => 'Tunisia', + 'group_number' => '9973', + 'id' => '125', + ), + 125 => + array ( + 'description' => 'Uruguay', + 'group_number' => '9974', + 'id' => '126', + ), + 126 => + array ( + 'description' => 'Moldova', + 'group_number' => '9975', + 'id' => '127', + ), + 127 => + array ( + 'description' => 'Tanzania', + 'group_number' => '9976', + 'id' => '128', + ), + 128 => + array ( + 'description' => 'Costa Rica', + 'group_number' => '9977', + 'id' => '129', + ), + 129 => + array ( + 'description' => 'Ecuador', + 'group_number' => '9978', + 'id' => '130', + ), + 130 => + array ( + 'description' => 'Iceland', + 'group_number' => '9979', + 'id' => '131', + ), + 131 => + array ( + 'description' => 'Papua New Guinea', + 'group_number' => '9980', + 'id' => '132', + ), + 132 => + array ( + 'description' => 'Morocco', + 'group_number' => '9981', + 'id' => '133', + ), + 133 => + array ( + 'description' => 'Zambia', + 'group_number' => '9982', + 'id' => '134', + ), + 134 => + array ( + 'description' => 'Gambia', + 'group_number' => '9983', + 'id' => '135', + ), + 135 => + array ( + 'description' => 'Latvia', + 'group_number' => '9984', + 'id' => '136', + ), + 136 => + array ( + 'description' => 'Estonia', + 'group_number' => '9985', + 'id' => '137', + ), + 137 => + array ( + 'description' => 'Lithuania', + 'group_number' => '9986', + 'id' => '138', + ), + 138 => + array ( + 'description' => 'Tanzania', + 'group_number' => '9987', + 'id' => '139', + ), + 139 => + array ( + 'description' => 'Ghana', + 'group_number' => '9988', + 'id' => '140', + ), + 140 => + array ( + 'description' => 'Macedonia', + 'group_number' => '9989', + 'id' => '141', + ), + 141 => + array ( + 'description' => 'Bahrain', + 'group_number' => '99901', + 'id' => '142', + ), + 142 => + array ( + 'description' => 'Gabon', + 'group_number' => '99902', + 'id' => '143', + ), + 143 => + array ( + 'description' => 'Mauritius', + 'group_number' => '99903', + 'id' => '144', + ), + 144 => + array ( + 'description' => 'Netherlands Antilles and Aruba', + 'group_number' => '99904', + 'id' => '145', + ), + 145 => + array ( + 'description' => 'Bolivia', + 'group_number' => '99905', + 'id' => '146', + ), + 146 => + array ( + 'description' => 'Kuwait', + 'group_number' => '99906', + 'id' => '147', + ), + 147 => + array ( + 'description' => 'Malawi', + 'group_number' => '99908', + 'id' => '148', + ), + 148 => + array ( + 'description' => 'Malta', + 'group_number' => '99909', + 'id' => '149', + ), + 149 => + array ( + 'description' => 'Sierra Leone', + 'group_number' => '99910', + 'id' => '150', + ), + 150 => + array ( + 'description' => 'Lesotho', + 'group_number' => '99911', + 'id' => '151', + ), + 151 => + array ( + 'description' => 'Botswana', + 'group_number' => '99912', + 'id' => '152', + ), + 152 => + array ( + 'description' => 'Andorra', + 'group_number' => '99913', + 'id' => '153', + ), + 153 => + array ( + 'description' => 'Suriname', + 'group_number' => '99914', + 'id' => '154', + ), + 154 => + array ( + 'description' => 'Maldives', + 'group_number' => '99915', + 'id' => '155', + ), + 155 => + array ( + 'description' => 'Namibia', + 'group_number' => '99916', + 'id' => '156', + ), + 156 => + array ( + 'description' => 'Brunei Darussalam', + 'group_number' => '99917', + 'id' => '157', + ), + 157 => + array ( + 'description' => 'Faroe Islands', + 'group_number' => '99918', + 'id' => '158', + ), + 158 => + array ( + 'description' => 'Benin', + 'group_number' => '99919', + 'id' => '159', + ), + 159 => + array ( + 'description' => 'Andorra', + 'group_number' => '99920', + 'id' => '160', + ), + 160 => + array ( + 'description' => 'Qatar', + 'group_number' => '99921', + 'id' => '161', + ), + 161 => + array ( + 'description' => 'Guatemala', + 'group_number' => '99922', + 'id' => '162', + ), + 162 => + array ( + 'description' => 'El Salvador', + 'group_number' => '99923', + 'id' => '163', + ), + 163 => + array ( + 'description' => 'Nicaragua', + 'group_number' => '99924', + 'id' => '164', + ), + 164 => + array ( + 'description' => 'Paraguay', + 'group_number' => '99925', + 'id' => '165', + ), + 165 => + array ( + 'description' => 'Honduras', + 'group_number' => '99926', + 'id' => '166', + ), + 166 => + array ( + 'description' => 'Albania', + 'group_number' => '99927', + 'id' => '167', + ), + 167 => + array ( + 'description' => 'Georgia', + 'group_number' => '99928', + 'id' => '168', + ), + 168 => + array ( + 'description' => 'Mongolia', + 'group_number' => '99929', + 'id' => '169', + ), + 169 => + array ( + 'description' => 'Armenia', + 'group_number' => '99930', + 'id' => '170', + ), + 170 => + array ( + 'description' => 'Seychelles', + 'group_number' => '99931', + 'id' => '171', + ), + 171 => + array ( + 'description' => 'Malta', + 'group_number' => '99932', + 'id' => '172', + ), + 172 => + array ( + 'description' => 'Nepal', + 'group_number' => '99933', + 'id' => '173', + ), + 173 => + array ( + 'description' => 'Dominican Republic', + 'group_number' => '99934', + 'id' => '174', + ), + 174 => + array ( + 'description' => 'Haiti', + 'group_number' => '99935', + 'id' => '175', + ), + 175 => + array ( + 'description' => 'Bhutan', + 'group_number' => '99936', + 'id' => '176', + ), + 176 => + array ( + 'description' => 'Macau', + 'group_number' => '99937', + 'id' => '177', + ), + 177 => + array ( + 'description' => 'Srpska, Republic of', + 'group_number' => '99938', + 'id' => '178', + ), + 178 => + array ( + 'description' => 'Guatemala', + 'group_number' => '99939', + 'id' => '179', + ), + 179 => + array ( + 'description' => 'Georgia', + 'group_number' => '99940', + 'id' => '180', + ), + 180 => + array ( + 'description' => 'Armenia', + 'group_number' => '99941', + 'id' => '181', + ), + 181 => + array ( + 'description' => 'Sudan', + 'group_number' => '99942', + 'id' => '182', + ), + 182 => + array ( + 'description' => 'Albania', + 'group_number' => '99943', + 'id' => '183', + ), + 183 => + array ( + 'description' => 'Ethiopia', + 'group_number' => '99944', + 'id' => '184', + ), + 184 => + array ( + 'description' => 'Namibia', + 'group_number' => '99945', + 'id' => '185', + ), + 185 => + array ( + 'description' => 'Nepal', + 'group_number' => '99946', + 'id' => '186', + ), + 186 => + array ( + 'description' => 'Tajikistan', + 'group_number' => '99947', + 'id' => '187', + ), + 187 => + array ( + 'description' => 'Eritrea', + 'group_number' => '99948', + 'id' => '188', + ), + 188 => + array ( + 'description' => 'Mauritius', + 'group_number' => '99949', + 'id' => '189', + ), + 189 => + array ( + 'description' => 'Cambodia', + 'group_number' => '99950', + 'id' => '190', + ), + 190 => + array ( + 'description' => 'Congo', + 'group_number' => '99951', + 'id' => '191', + ), + 191 => + array ( + 'description' => 'Mali', + 'group_number' => '99952', + 'id' => '192', + ), + 192 => + array ( + 'description' => 'Paraguay', + 'group_number' => '99953', + 'id' => '193', + ), + 193 => + array ( + 'description' => 'Bolivia', + 'group_number' => '99954', + 'id' => '194', + ), + 194 => + array ( + 'description' => 'Srpska, Republic of', + 'group_number' => '99955', + 'id' => '195', + ), + 195 => + array ( + 'description' => 'Albania', + 'group_number' => '99956', + 'id' => '196', + ), + 196 => + array ( + 'description' => 'Malta', + 'group_number' => '99957', + 'id' => '197', + ), + 197 => + array ( + 'description' => 'Bahrain', + 'group_number' => '99958', + 'id' => '198', + ), + 198 => + array ( + 'description' => 'Luxembourg', + 'group_number' => '99959', + 'id' => '199', + ), + 199 => + array ( + 'description' => 'Malawi', + 'group_number' => '99960', + 'id' => '200', + ), + 200 => + array ( + 'description' => 'El Salvador', + 'group_number' => '99961', + 'id' => '201', + ), + 201 => + array ( + 'description' => 'Mongolia', + 'group_number' => '99962', + 'id' => '202', + ), + 202 => + array ( + 'description' => 'Cambodia', + 'group_number' => '99963', + 'id' => '203', + ), + 203 => + array ( + 'description' => 'Nicaragua', + 'group_number' => '99964', + 'id' => '204', + ), + 204 => + array ( + 'description' => 'Macau', + 'group_number' => '99965', + 'id' => '205', + ), + 205 => + array ( + 'description' => 'Kuwait', + 'group_number' => '99966', + 'id' => '206', + ), + 206 => + array ( + 'description' => 'Paraguay', + 'group_number' => '99967', + 'id' => '207', + ), + 207 => + array ( + 'description' => 'Botswana', + 'group_number' => '99968', + 'id' => '208', + ), + 208 => + array ( + 'description' => 'France', + 'group_number' => '10', + 'id' => '209', + ), +), +'ezisbn_group_range' => +array ( + 0 => + array ( + 'from_number' => '0', + 'group_from' => '0', + 'group_length' => '1', + 'group_to' => '5', + 'id' => '1', + 'to_number' => '59999', + ), + 1 => + array ( + 'from_number' => '60000', + 'group_from' => '600', + 'group_length' => '3', + 'group_to' => '649', + 'id' => '2', + 'to_number' => '64999', + ), + 2 => + array ( + 'from_number' => '70000', + 'group_from' => '7', + 'group_length' => '1', + 'group_to' => '7', + 'id' => '3', + 'to_number' => '79999', + ), + 3 => + array ( + 'from_number' => '80000', + 'group_from' => '80', + 'group_length' => '2', + 'group_to' => '94', + 'id' => '4', + 'to_number' => '94999', + ), + 4 => + array ( + 'from_number' => '95000', + 'group_from' => '950', + 'group_length' => '3', + 'group_to' => '989', + 'id' => '5', + 'to_number' => '98999', + ), + 5 => + array ( + 'from_number' => '99000', + 'group_from' => '9900', + 'group_length' => '4', + 'group_to' => '9989', + 'id' => '6', + 'to_number' => '99899', + ), + 6 => + array ( + 'from_number' => '99900', + 'group_from' => '99900', + 'group_length' => '5', + 'group_to' => '99999', + 'id' => '7', + 'to_number' => '99999', + ), + 7 => + array ( + 'from_number' => '10000', + 'group_from' => '10', + 'group_length' => '2', + 'group_to' => '10', + 'id' => '8', + 'to_number' => '10999', + ), +), +'ezisbn_registrant_range' => +array ( + 0 => + array ( + 'from_number' => '0', + 'id' => '1', + 'isbn_group_id' => '1', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 1 => + array ( + 'from_number' => '20000', + 'id' => '2', + 'isbn_group_id' => '1', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 2 => + array ( + 'from_number' => '70000', + 'id' => '3', + 'isbn_group_id' => '1', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 3 => + array ( + 'from_number' => '85000', + 'id' => '4', + 'isbn_group_id' => '1', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 4 => + array ( + 'from_number' => '90000', + 'id' => '5', + 'isbn_group_id' => '1', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 5 => + array ( + 'from_number' => '95000', + 'id' => '6', + 'isbn_group_id' => '1', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 6 => + array ( + 'from_number' => '0', + 'id' => '7', + 'isbn_group_id' => '2', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 7 => + array ( + 'from_number' => '10000', + 'id' => '8', + 'isbn_group_id' => '2', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 8 => + array ( + 'from_number' => '40000', + 'id' => '9', + 'isbn_group_id' => '2', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '5499', + 'to_number' => '54999', + ), + 9 => + array ( + 'from_number' => '55000', + 'id' => '10', + 'isbn_group_id' => '2', + 'registrant_from' => '55000', + 'registrant_length' => '5', + 'registrant_to' => '86979', + 'to_number' => '86979', + ), + 10 => + array ( + 'from_number' => '86980', + 'id' => '11', + 'isbn_group_id' => '2', + 'registrant_from' => '869800', + 'registrant_length' => '6', + 'registrant_to' => '998999', + 'to_number' => '99899', + ), + 11 => + array ( + 'from_number' => '99900', + 'id' => '12', + 'isbn_group_id' => '2', + 'registrant_from' => '9990000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 12 => + array ( + 'from_number' => '0', + 'id' => '13', + 'isbn_group_id' => '3', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 13 => + array ( + 'from_number' => '20000', + 'id' => '14', + 'isbn_group_id' => '3', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '349', + 'to_number' => '34999', + ), + 14 => + array ( + 'from_number' => '35000', + 'id' => '15', + 'isbn_group_id' => '3', + 'registrant_from' => '35000', + 'registrant_length' => '5', + 'registrant_to' => '39999', + 'to_number' => '39999', + ), + 15 => + array ( + 'from_number' => '40000', + 'id' => '16', + 'isbn_group_id' => '3', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 16 => + array ( + 'from_number' => '70000', + 'id' => '17', + 'isbn_group_id' => '3', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8399', + 'to_number' => '83999', + ), + 17 => + array ( + 'from_number' => '84000', + 'id' => '18', + 'isbn_group_id' => '3', + 'registrant_from' => '84000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 18 => + array ( + 'from_number' => '90000', + 'id' => '19', + 'isbn_group_id' => '3', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 19 => + array ( + 'from_number' => '95000', + 'id' => '20', + 'isbn_group_id' => '3', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 20 => + array ( + 'from_number' => '0', + 'id' => '21', + 'isbn_group_id' => '4', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '02', + 'to_number' => '2999', + ), + 21 => + array ( + 'from_number' => '3000', + 'id' => '22', + 'isbn_group_id' => '4', + 'registrant_from' => '030', + 'registrant_length' => '3', + 'registrant_to' => '033', + 'to_number' => '3399', + ), + 22 => + array ( + 'from_number' => '3400', + 'id' => '23', + 'isbn_group_id' => '4', + 'registrant_from' => '0340', + 'registrant_length' => '4', + 'registrant_to' => '0369', + 'to_number' => '3699', + ), + 23 => + array ( + 'from_number' => '3700', + 'id' => '24', + 'isbn_group_id' => '4', + 'registrant_from' => '03700', + 'registrant_length' => '5', + 'registrant_to' => '03999', + 'to_number' => '3999', + ), + 24 => + array ( + 'from_number' => '4000', + 'id' => '25', + 'isbn_group_id' => '4', + 'registrant_from' => '04', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 25 => + array ( + 'from_number' => '20000', + 'id' => '26', + 'isbn_group_id' => '4', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 26 => + array ( + 'from_number' => '70000', + 'id' => '27', + 'isbn_group_id' => '4', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 27 => + array ( + 'from_number' => '85000', + 'id' => '28', + 'isbn_group_id' => '4', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 28 => + array ( + 'from_number' => '90000', + 'id' => '29', + 'isbn_group_id' => '4', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 29 => + array ( + 'from_number' => '95000', + 'id' => '30', + 'isbn_group_id' => '4', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9539999', + 'to_number' => '95399', + ), + 30 => + array ( + 'from_number' => '95400', + 'id' => '31', + 'isbn_group_id' => '4', + 'registrant_from' => '95400', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 31 => + array ( + 'from_number' => '97000', + 'id' => '32', + 'isbn_group_id' => '4', + 'registrant_from' => '9700000', + 'registrant_length' => '7', + 'registrant_to' => '9899999', + 'to_number' => '98999', + ), + 32 => + array ( + 'from_number' => '99000', + 'id' => '33', + 'isbn_group_id' => '4', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99499', + 'to_number' => '99499', + ), + 33 => + array ( + 'from_number' => '99500', + 'id' => '34', + 'isbn_group_id' => '4', + 'registrant_from' => '99500', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 34 => + array ( + 'from_number' => '0', + 'id' => '35', + 'isbn_group_id' => '5', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 35 => + array ( + 'from_number' => '20000', + 'id' => '36', + 'isbn_group_id' => '5', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 36 => + array ( + 'from_number' => '70000', + 'id' => '37', + 'isbn_group_id' => '5', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 37 => + array ( + 'from_number' => '85000', + 'id' => '38', + 'isbn_group_id' => '5', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 38 => + array ( + 'from_number' => '90000', + 'id' => '39', + 'isbn_group_id' => '5', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 39 => + array ( + 'from_number' => '95000', + 'id' => '40', + 'isbn_group_id' => '5', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 40 => + array ( + 'from_number' => '0', + 'id' => '41', + 'isbn_group_id' => '6', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 41 => + array ( + 'from_number' => '20000', + 'id' => '42', + 'isbn_group_id' => '6', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '420', + 'to_number' => '42099', + ), + 42 => + array ( + 'from_number' => '42100', + 'id' => '43', + 'isbn_group_id' => '6', + 'registrant_from' => '4210', + 'registrant_length' => '4', + 'registrant_to' => '4299', + 'to_number' => '42999', + ), + 43 => + array ( + 'from_number' => '43000', + 'id' => '44', + 'isbn_group_id' => '6', + 'registrant_from' => '430', + 'registrant_length' => '3', + 'registrant_to' => '430', + 'to_number' => '43099', + ), + 44 => + array ( + 'from_number' => '43100', + 'id' => '45', + 'isbn_group_id' => '6', + 'registrant_from' => '4310', + 'registrant_length' => '4', + 'registrant_to' => '4399', + 'to_number' => '43999', + ), + 45 => + array ( + 'from_number' => '44000', + 'id' => '46', + 'isbn_group_id' => '6', + 'registrant_from' => '440', + 'registrant_length' => '3', + 'registrant_to' => '440', + 'to_number' => '44099', + ), + 46 => + array ( + 'from_number' => '44100', + 'id' => '47', + 'isbn_group_id' => '6', + 'registrant_from' => '4410', + 'registrant_length' => '4', + 'registrant_to' => '4499', + 'to_number' => '44999', + ), + 47 => + array ( + 'from_number' => '45000', + 'id' => '48', + 'isbn_group_id' => '6', + 'registrant_from' => '450', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 48 => + array ( + 'from_number' => '70000', + 'id' => '49', + 'isbn_group_id' => '6', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 49 => + array ( + 'from_number' => '85000', + 'id' => '50', + 'isbn_group_id' => '6', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 50 => + array ( + 'from_number' => '90000', + 'id' => '51', + 'isbn_group_id' => '6', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '909999', + 'to_number' => '90999', + ), + 51 => + array ( + 'from_number' => '91000', + 'id' => '52', + 'isbn_group_id' => '6', + 'registrant_from' => '91000', + 'registrant_length' => '5', + 'registrant_to' => '91999', + 'to_number' => '91999', + ), + 52 => + array ( + 'from_number' => '92000', + 'id' => '53', + 'isbn_group_id' => '6', + 'registrant_from' => '9200', + 'registrant_length' => '4', + 'registrant_to' => '9299', + 'to_number' => '92999', + ), + 53 => + array ( + 'from_number' => '93000', + 'id' => '54', + 'isbn_group_id' => '6', + 'registrant_from' => '93000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 54 => + array ( + 'from_number' => '95000', + 'id' => '55', + 'isbn_group_id' => '6', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9500999', + 'to_number' => '95009', + ), + 55 => + array ( + 'from_number' => '95010', + 'id' => '56', + 'isbn_group_id' => '6', + 'registrant_from' => '9501', + 'registrant_length' => '4', + 'registrant_to' => '9799', + 'to_number' => '97999', + ), + 56 => + array ( + 'from_number' => '98000', + 'id' => '57', + 'isbn_group_id' => '6', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 57 => + array ( + 'from_number' => '99000', + 'id' => '58', + 'isbn_group_id' => '6', + 'registrant_from' => '9900000', + 'registrant_length' => '7', + 'registrant_to' => '9909999', + 'to_number' => '99099', + ), + 58 => + array ( + 'from_number' => '99100', + 'id' => '59', + 'isbn_group_id' => '6', + 'registrant_from' => '9910', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 59 => + array ( + 'from_number' => '0', + 'id' => '60', + 'isbn_group_id' => '7', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 60 => + array ( + 'from_number' => '10000', + 'id' => '61', + 'isbn_group_id' => '7', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 61 => + array ( + 'from_number' => '50000', + 'id' => '62', + 'isbn_group_id' => '7', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 62 => + array ( + 'from_number' => '90000', + 'id' => '63', + 'isbn_group_id' => '7', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 63 => + array ( + 'from_number' => '0', + 'id' => '64', + 'isbn_group_id' => '8', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 64 => + array ( + 'from_number' => '20000', + 'id' => '65', + 'isbn_group_id' => '8', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 65 => + array ( + 'from_number' => '70000', + 'id' => '66', + 'isbn_group_id' => '8', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 66 => + array ( + 'from_number' => '80000', + 'id' => '67', + 'isbn_group_id' => '8', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '84999', + 'to_number' => '84999', + ), + 67 => + array ( + 'from_number' => '85000', + 'id' => '68', + 'isbn_group_id' => '8', + 'registrant_from' => '85', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 68 => + array ( + 'from_number' => '0', + 'id' => '69', + 'isbn_group_id' => '9', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 69 => + array ( + 'from_number' => '20000', + 'id' => '70', + 'isbn_group_id' => '9', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 70 => + array ( + 'from_number' => '80000', + 'id' => '71', + 'isbn_group_id' => '9', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 71 => + array ( + 'from_number' => '95000', + 'id' => '72', + 'isbn_group_id' => '9', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 72 => + array ( + 'from_number' => '0', + 'id' => '73', + 'isbn_group_id' => '10', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '04', + 'to_number' => '4999', + ), + 73 => + array ( + 'from_number' => '5000', + 'id' => '74', + 'isbn_group_id' => '10', + 'registrant_from' => '05', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 74 => + array ( + 'from_number' => '50000', + 'id' => '75', + 'isbn_group_id' => '10', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 75 => + array ( + 'from_number' => '80000', + 'id' => '76', + 'isbn_group_id' => '10', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 76 => + array ( + 'from_number' => '90000', + 'id' => '77', + 'isbn_group_id' => '10', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 77 => + array ( + 'from_number' => '0', + 'id' => '78', + 'isbn_group_id' => '11', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 78 => + array ( + 'from_number' => '50000', + 'id' => '79', + 'isbn_group_id' => '11', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 79 => + array ( + 'from_number' => '90000', + 'id' => '80', + 'isbn_group_id' => '11', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '979', + 'to_number' => '97999', + ), + 80 => + array ( + 'from_number' => '98000', + 'id' => '81', + 'isbn_group_id' => '11', + 'registrant_from' => '9800', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 81 => + array ( + 'from_number' => '1000', + 'id' => '82', + 'isbn_group_id' => '12', + 'registrant_from' => '01', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 82 => + array ( + 'from_number' => '10000', + 'id' => '83', + 'isbn_group_id' => '12', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 83 => + array ( + 'from_number' => '40000', + 'id' => '84', + 'isbn_group_id' => '12', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 84 => + array ( + 'from_number' => '60000', + 'id' => '85', + 'isbn_group_id' => '12', + 'registrant_from' => '60000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 85 => + array ( + 'from_number' => '90000', + 'id' => '86', + 'isbn_group_id' => '12', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 86 => + array ( + 'from_number' => '0', + 'id' => '87', + 'isbn_group_id' => '13', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 87 => + array ( + 'from_number' => '10000', + 'id' => '88', + 'isbn_group_id' => '13', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 88 => + array ( + 'from_number' => '50000', + 'id' => '89', + 'isbn_group_id' => '13', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 89 => + array ( + 'from_number' => '80000', + 'id' => '90', + 'isbn_group_id' => '13', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9199', + 'to_number' => '91999', + ), + 90 => + array ( + 'from_number' => '92000', + 'id' => '91', + 'isbn_group_id' => '13', + 'registrant_from' => '92000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 91 => + array ( + 'from_number' => '0', + 'id' => '92', + 'isbn_group_id' => '14', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 92 => + array ( + 'from_number' => '40000', + 'id' => '93', + 'isbn_group_id' => '14', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '749', + 'to_number' => '74999', + ), + 93 => + array ( + 'from_number' => '75000', + 'id' => '94', + 'isbn_group_id' => '14', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 94 => + array ( + 'from_number' => '95000', + 'id' => '95', + 'isbn_group_id' => '14', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 95 => + array ( + 'from_number' => '0', + 'id' => '96', + 'isbn_group_id' => '15', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 96 => + array ( + 'from_number' => '10000', + 'id' => '97', + 'isbn_group_id' => '15', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 97 => + array ( + 'from_number' => '20000', + 'id' => '98', + 'isbn_group_id' => '15', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '449', + 'to_number' => '44999', + ), + 98 => + array ( + 'from_number' => '45000', + 'id' => '99', + 'isbn_group_id' => '15', + 'registrant_from' => '4500', + 'registrant_length' => '4', + 'registrant_to' => '6499', + 'to_number' => '64999', + ), + 99 => + array ( + 'from_number' => '65000', + 'id' => '100', + 'isbn_group_id' => '15', + 'registrant_from' => '65000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 100 => + array ( + 'from_number' => '70000', + 'id' => '101', + 'isbn_group_id' => '15', + 'registrant_from' => '7', + 'registrant_length' => '1', + 'registrant_to' => '9', + 'to_number' => '99999', + ), + 101 => + array ( + 'from_number' => '0', + 'id' => '102', + 'isbn_group_id' => '16', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 102 => + array ( + 'from_number' => '40000', + 'id' => '103', + 'isbn_group_id' => '16', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 103 => + array ( + 'from_number' => '80000', + 'id' => '104', + 'isbn_group_id' => '16', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 104 => + array ( + 'from_number' => '95000', + 'id' => '105', + 'isbn_group_id' => '16', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 105 => + array ( + 'from_number' => '0', + 'id' => '106', + 'isbn_group_id' => '18', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 106 => + array ( + 'from_number' => '30000', + 'id' => '107', + 'isbn_group_id' => '18', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 107 => + array ( + 'from_number' => '40000', + 'id' => '108', + 'isbn_group_id' => '18', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4499', + 'to_number' => '44999', + ), + 108 => + array ( + 'from_number' => '45000', + 'id' => '109', + 'isbn_group_id' => '18', + 'registrant_from' => '45000', + 'registrant_length' => '5', + 'registrant_to' => '49999', + 'to_number' => '49999', + ), + 109 => + array ( + 'from_number' => '50000', + 'id' => '110', + 'isbn_group_id' => '18', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 110 => + array ( + 'from_number' => '0', + 'id' => '111', + 'isbn_group_id' => '19', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '9', + 'to_number' => '99999', + ), + 111 => + array ( + 'from_number' => '0', + 'id' => '112', + 'isbn_group_id' => '20', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 112 => + array ( + 'from_number' => '40000', + 'id' => '113', + 'isbn_group_id' => '20', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 113 => + array ( + 'from_number' => '80000', + 'id' => '114', + 'isbn_group_id' => '20', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 114 => + array ( + 'from_number' => '95000', + 'id' => '115', + 'isbn_group_id' => '20', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 115 => + array ( + 'from_number' => '0', + 'id' => '116', + 'isbn_group_id' => '21', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 116 => + array ( + 'from_number' => '10000', + 'id' => '117', + 'isbn_group_id' => '21', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 117 => + array ( + 'from_number' => '50000', + 'id' => '118', + 'isbn_group_id' => '21', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 118 => + array ( + 'from_number' => '80000', + 'id' => '119', + 'isbn_group_id' => '21', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 119 => + array ( + 'from_number' => '0', + 'id' => '120', + 'isbn_group_id' => '22', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 120 => + array ( + 'from_number' => '20000', + 'id' => '121', + 'isbn_group_id' => '22', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 121 => + array ( + 'from_number' => '70000', + 'id' => '122', + 'isbn_group_id' => '22', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 122 => + array ( + 'from_number' => '90000', + 'id' => '123', + 'isbn_group_id' => '22', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 123 => + array ( + 'from_number' => '0', + 'id' => '124', + 'isbn_group_id' => '23', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 124 => + array ( + 'from_number' => '50000', + 'id' => '125', + 'isbn_group_id' => '23', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 125 => + array ( + 'from_number' => '70000', + 'id' => '126', + 'isbn_group_id' => '23', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 126 => + array ( + 'from_number' => '90000', + 'id' => '127', + 'isbn_group_id' => '23', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 127 => + array ( + 'from_number' => '0', + 'id' => '128', + 'isbn_group_id' => '24', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 128 => + array ( + 'from_number' => '10000', + 'id' => '129', + 'isbn_group_id' => '24', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 129 => + array ( + 'from_number' => '50000', + 'id' => '130', + 'isbn_group_id' => '24', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 130 => + array ( + 'from_number' => '80000', + 'id' => '131', + 'isbn_group_id' => '24', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 131 => + array ( + 'from_number' => '90000', + 'id' => '132', + 'isbn_group_id' => '24', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 132 => + array ( + 'from_number' => '0', + 'id' => '133', + 'isbn_group_id' => '25', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 133 => + array ( + 'from_number' => '20000', + 'id' => '134', + 'isbn_group_id' => '25', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 134 => + array ( + 'from_number' => '70000', + 'id' => '135', + 'isbn_group_id' => '25', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 135 => + array ( + 'from_number' => '85000', + 'id' => '136', + 'isbn_group_id' => '25', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 136 => + array ( + 'from_number' => '90000', + 'id' => '137', + 'isbn_group_id' => '25', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 137 => + array ( + 'from_number' => '0', + 'id' => '138', + 'isbn_group_id' => '26', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 138 => + array ( + 'from_number' => '20000', + 'id' => '139', + 'isbn_group_id' => '26', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 139 => + array ( + 'from_number' => '70000', + 'id' => '140', + 'isbn_group_id' => '26', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 140 => + array ( + 'from_number' => '85000', + 'id' => '141', + 'isbn_group_id' => '26', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 141 => + array ( + 'from_number' => '90000', + 'id' => '142', + 'isbn_group_id' => '26', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 142 => + array ( + 'from_number' => '0', + 'id' => '143', + 'isbn_group_id' => '27', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 143 => + array ( + 'from_number' => '20000', + 'id' => '144', + 'isbn_group_id' => '27', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 144 => + array ( + 'from_number' => '70000', + 'id' => '145', + 'isbn_group_id' => '27', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 145 => + array ( + 'from_number' => '90000', + 'id' => '146', + 'isbn_group_id' => '27', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 146 => + array ( + 'from_number' => '99000', + 'id' => '147', + 'isbn_group_id' => '27', + 'registrant_from' => '990000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 147 => + array ( + 'from_number' => '0', + 'id' => '148', + 'isbn_group_id' => '28', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 148 => + array ( + 'from_number' => '20000', + 'id' => '149', + 'isbn_group_id' => '28', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 149 => + array ( + 'from_number' => '60000', + 'id' => '150', + 'isbn_group_id' => '28', + 'registrant_from' => '60000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 150 => + array ( + 'from_number' => '70000', + 'id' => '151', + 'isbn_group_id' => '28', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 151 => + array ( + 'from_number' => '85000', + 'id' => '152', + 'isbn_group_id' => '28', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 152 => + array ( + 'from_number' => '90000', + 'id' => '153', + 'isbn_group_id' => '28', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 153 => + array ( + 'from_number' => '0', + 'id' => '154', + 'isbn_group_id' => '29', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 154 => + array ( + 'from_number' => '15000', + 'id' => '155', + 'isbn_group_id' => '29', + 'registrant_from' => '15000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 155 => + array ( + 'from_number' => '20000', + 'id' => '156', + 'isbn_group_id' => '29', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 156 => + array ( + 'from_number' => '70000', + 'id' => '157', + 'isbn_group_id' => '29', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 157 => + array ( + 'from_number' => '85000', + 'id' => '158', + 'isbn_group_id' => '29', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 158 => + array ( + 'from_number' => '90000', + 'id' => '159', + 'isbn_group_id' => '29', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9199', + 'to_number' => '91999', + ), + 159 => + array ( + 'from_number' => '92000', + 'id' => '160', + 'isbn_group_id' => '29', + 'registrant_from' => '920000', + 'registrant_length' => '6', + 'registrant_to' => '923999', + 'to_number' => '92399', + ), + 160 => + array ( + 'from_number' => '92400', + 'id' => '161', + 'isbn_group_id' => '29', + 'registrant_from' => '92400', + 'registrant_length' => '5', + 'registrant_to' => '92999', + 'to_number' => '92999', + ), + 161 => + array ( + 'from_number' => '93000', + 'id' => '162', + 'isbn_group_id' => '29', + 'registrant_from' => '930000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 162 => + array ( + 'from_number' => '95000', + 'id' => '163', + 'isbn_group_id' => '29', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 163 => + array ( + 'from_number' => '97000', + 'id' => '164', + 'isbn_group_id' => '29', + 'registrant_from' => '9700', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 164 => + array ( + 'from_number' => '0', + 'id' => '165', + 'isbn_group_id' => '30', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 165 => + array ( + 'from_number' => '20000', + 'id' => '166', + 'isbn_group_id' => '30', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 166 => + array ( + 'from_number' => '60000', + 'id' => '167', + 'isbn_group_id' => '30', + 'registrant_from' => '60000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 167 => + array ( + 'from_number' => '70000', + 'id' => '168', + 'isbn_group_id' => '30', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 168 => + array ( + 'from_number' => '85000', + 'id' => '169', + 'isbn_group_id' => '30', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 169 => + array ( + 'from_number' => '90000', + 'id' => '170', + 'isbn_group_id' => '30', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '979999', + 'to_number' => '97999', + ), + 170 => + array ( + 'from_number' => '98000', + 'id' => '171', + 'isbn_group_id' => '30', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 171 => + array ( + 'from_number' => '0', + 'id' => '172', + 'isbn_group_id' => '31', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 172 => + array ( + 'from_number' => '30000', + 'id' => '173', + 'isbn_group_id' => '31', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 173 => + array ( + 'from_number' => '60000', + 'id' => '174', + 'isbn_group_id' => '31', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 174 => + array ( + 'from_number' => '80000', + 'id' => '175', + 'isbn_group_id' => '31', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 175 => + array ( + 'from_number' => '90000', + 'id' => '176', + 'isbn_group_id' => '31', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 176 => + array ( + 'from_number' => '0', + 'id' => '177', + 'isbn_group_id' => '32', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 177 => + array ( + 'from_number' => '40000', + 'id' => '178', + 'isbn_group_id' => '32', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '649', + 'to_number' => '64999', + ), + 178 => + array ( + 'from_number' => '70000', + 'id' => '179', + 'isbn_group_id' => '32', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 179 => + array ( + 'from_number' => '85000', + 'id' => '180', + 'isbn_group_id' => '32', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 180 => + array ( + 'from_number' => '97000', + 'id' => '181', + 'isbn_group_id' => '32', + 'registrant_from' => '970000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 181 => + array ( + 'from_number' => '0', + 'id' => '182', + 'isbn_group_id' => '33', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 182 => + array ( + 'from_number' => '20000', + 'id' => '183', + 'isbn_group_id' => '33', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 183 => + array ( + 'from_number' => '60000', + 'id' => '184', + 'isbn_group_id' => '33', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 184 => + array ( + 'from_number' => '85000', + 'id' => '185', + 'isbn_group_id' => '33', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 185 => + array ( + 'from_number' => '90000', + 'id' => '186', + 'isbn_group_id' => '33', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 186 => + array ( + 'from_number' => '95000', + 'id' => '187', + 'isbn_group_id' => '33', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 187 => + array ( + 'from_number' => '0', + 'id' => '188', + 'isbn_group_id' => '34', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '24', + 'to_number' => '24999', + ), + 188 => + array ( + 'from_number' => '25000', + 'id' => '189', + 'isbn_group_id' => '34', + 'registrant_from' => '250', + 'registrant_length' => '3', + 'registrant_to' => '549', + 'to_number' => '54999', + ), + 189 => + array ( + 'from_number' => '55000', + 'id' => '190', + 'isbn_group_id' => '34', + 'registrant_from' => '5500', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 190 => + array ( + 'from_number' => '85000', + 'id' => '191', + 'isbn_group_id' => '34', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 191 => + array ( + 'from_number' => '95000', + 'id' => '192', + 'isbn_group_id' => '34', + 'registrant_from' => '950000', + 'registrant_length' => '6', + 'registrant_to' => '969999', + 'to_number' => '96999', + ), + 192 => + array ( + 'from_number' => '97000', + 'id' => '193', + 'isbn_group_id' => '34', + 'registrant_from' => '97000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 193 => + array ( + 'from_number' => '99000', + 'id' => '194', + 'isbn_group_id' => '34', + 'registrant_from' => '990', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 194 => + array ( + 'from_number' => '0', + 'id' => '195', + 'isbn_group_id' => '35', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 195 => + array ( + 'from_number' => '20000', + 'id' => '196', + 'isbn_group_id' => '35', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 196 => + array ( + 'from_number' => '50000', + 'id' => '197', + 'isbn_group_id' => '35', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '6999', + 'to_number' => '69999', + ), + 197 => + array ( + 'from_number' => '70000', + 'id' => '198', + 'isbn_group_id' => '35', + 'registrant_from' => '70000', + 'registrant_length' => '5', + 'registrant_to' => '79999', + 'to_number' => '79999', + ), + 198 => + array ( + 'from_number' => '80000', + 'id' => '199', + 'isbn_group_id' => '35', + 'registrant_from' => '800000', + 'registrant_length' => '6', + 'registrant_to' => '849999', + 'to_number' => '84999', + ), + 199 => + array ( + 'from_number' => '85000', + 'id' => '200', + 'isbn_group_id' => '35', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 200 => + array ( + 'from_number' => '90000', + 'id' => '201', + 'isbn_group_id' => '35', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '90', + 'to_number' => '90999', + ), + 201 => + array ( + 'from_number' => '91000', + 'id' => '202', + 'isbn_group_id' => '35', + 'registrant_from' => '910000', + 'registrant_length' => '6', + 'registrant_to' => '939999', + 'to_number' => '93999', + ), + 202 => + array ( + 'from_number' => '94000', + 'id' => '203', + 'isbn_group_id' => '35', + 'registrant_from' => '94', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 203 => + array ( + 'from_number' => '95000', + 'id' => '204', + 'isbn_group_id' => '35', + 'registrant_from' => '950000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 204 => + array ( + 'from_number' => '0', + 'id' => '205', + 'isbn_group_id' => '36', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 205 => + array ( + 'from_number' => '20000', + 'id' => '206', + 'isbn_group_id' => '36', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 206 => + array ( + 'from_number' => '50000', + 'id' => '207', + 'isbn_group_id' => '36', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '649', + 'to_number' => '64999', + ), + 207 => + array ( + 'from_number' => '70000', + 'id' => '208', + 'isbn_group_id' => '36', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 208 => + array ( + 'from_number' => '85000', + 'id' => '209', + 'isbn_group_id' => '36', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 209 => + array ( + 'from_number' => '97000', + 'id' => '210', + 'isbn_group_id' => '36', + 'registrant_from' => '970000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 210 => + array ( + 'from_number' => '0', + 'id' => '211', + 'isbn_group_id' => '37', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 211 => + array ( + 'from_number' => '60000', + 'id' => '212', + 'isbn_group_id' => '37', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 212 => + array ( + 'from_number' => '80000', + 'id' => '213', + 'isbn_group_id' => '37', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 213 => + array ( + 'from_number' => '90000', + 'id' => '214', + 'isbn_group_id' => '37', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 214 => + array ( + 'from_number' => '95000', + 'id' => '215', + 'isbn_group_id' => '37', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 215 => + array ( + 'from_number' => '99000', + 'id' => '216', + 'isbn_group_id' => '37', + 'registrant_from' => '990000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 216 => + array ( + 'from_number' => '0', + 'id' => '217', + 'isbn_group_id' => '38', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 217 => + array ( + 'from_number' => '10000', + 'id' => '218', + 'isbn_group_id' => '38', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 218 => + array ( + 'from_number' => '50000', + 'id' => '219', + 'isbn_group_id' => '38', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 219 => + array ( + 'from_number' => '80000', + 'id' => '220', + 'isbn_group_id' => '38', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 220 => + array ( + 'from_number' => '95000', + 'id' => '221', + 'isbn_group_id' => '38', + 'registrant_from' => '950000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 221 => + array ( + 'from_number' => '0', + 'id' => '222', + 'isbn_group_id' => '39', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 222 => + array ( + 'from_number' => '60000', + 'id' => '223', + 'isbn_group_id' => '39', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 223 => + array ( + 'from_number' => '90000', + 'id' => '224', + 'isbn_group_id' => '39', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 224 => + array ( + 'from_number' => '0', + 'id' => '225', + 'isbn_group_id' => '40', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 225 => + array ( + 'from_number' => '50000', + 'id' => '226', + 'isbn_group_id' => '40', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 226 => + array ( + 'from_number' => '90000', + 'id' => '227', + 'isbn_group_id' => '40', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9899', + 'to_number' => '98999', + ), + 227 => + array ( + 'from_number' => '99000', + 'id' => '228', + 'isbn_group_id' => '40', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 228 => + array ( + 'from_number' => '0', + 'id' => '229', + 'isbn_group_id' => '41', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 229 => + array ( + 'from_number' => '20000', + 'id' => '230', + 'isbn_group_id' => '41', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 230 => + array ( + 'from_number' => '55000', + 'id' => '231', + 'isbn_group_id' => '41', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '889', + 'to_number' => '88999', + ), + 231 => + array ( + 'from_number' => '89000', + 'id' => '232', + 'isbn_group_id' => '41', + 'registrant_from' => '8900', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 232 => + array ( + 'from_number' => '95000', + 'id' => '233', + 'isbn_group_id' => '41', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 233 => + array ( + 'from_number' => '0', + 'id' => '234', + 'isbn_group_id' => '42', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 234 => + array ( + 'from_number' => '20000', + 'id' => '235', + 'isbn_group_id' => '42', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 235 => + array ( + 'from_number' => '50000', + 'id' => '236', + 'isbn_group_id' => '42', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 236 => + array ( + 'from_number' => '60000', + 'id' => '237', + 'isbn_group_id' => '42', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '65', + 'to_number' => '65999', + ), + 237 => + array ( + 'from_number' => '66000', + 'id' => '238', + 'isbn_group_id' => '42', + 'registrant_from' => '6600', + 'registrant_length' => '4', + 'registrant_to' => '6699', + 'to_number' => '66999', + ), + 238 => + array ( + 'from_number' => '67000', + 'id' => '239', + 'isbn_group_id' => '42', + 'registrant_from' => '67000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 239 => + array ( + 'from_number' => '70000', + 'id' => '240', + 'isbn_group_id' => '42', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 240 => + array ( + 'from_number' => '80000', + 'id' => '241', + 'isbn_group_id' => '42', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 241 => + array ( + 'from_number' => '95000', + 'id' => '242', + 'isbn_group_id' => '42', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9899', + 'to_number' => '98999', + ), + 242 => + array ( + 'from_number' => '99000', + 'id' => '243', + 'isbn_group_id' => '42', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 243 => + array ( + 'from_number' => '0', + 'id' => '244', + 'isbn_group_id' => '43', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 244 => + array ( + 'from_number' => '10000', + 'id' => '245', + 'isbn_group_id' => '43', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 245 => + array ( + 'from_number' => '15000', + 'id' => '246', + 'isbn_group_id' => '43', + 'registrant_from' => '150', + 'registrant_length' => '3', + 'registrant_to' => '549', + 'to_number' => '54999', + ), + 246 => + array ( + 'from_number' => '55000', + 'id' => '247', + 'isbn_group_id' => '43', + 'registrant_from' => '55000', + 'registrant_length' => '5', + 'registrant_to' => '59999', + 'to_number' => '59999', + ), + 247 => + array ( + 'from_number' => '60000', + 'id' => '248', + 'isbn_group_id' => '43', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 248 => + array ( + 'from_number' => '95000', + 'id' => '249', + 'isbn_group_id' => '43', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 249 => + array ( + 'from_number' => '0', + 'id' => '250', + 'isbn_group_id' => '44', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '28', + 'to_number' => '28999', + ), + 250 => + array ( + 'from_number' => '29000', + 'id' => '251', + 'isbn_group_id' => '44', + 'registrant_from' => '2900', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 251 => + array ( + 'from_number' => '30000', + 'id' => '252', + 'isbn_group_id' => '44', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 252 => + array ( + 'from_number' => '80000', + 'id' => '253', + 'isbn_group_id' => '44', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 253 => + array ( + 'from_number' => '90000', + 'id' => '254', + 'isbn_group_id' => '44', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '92999', + 'to_number' => '92999', + ), + 254 => + array ( + 'from_number' => '93000', + 'id' => '255', + 'isbn_group_id' => '44', + 'registrant_from' => '9300', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 255 => + array ( + 'from_number' => '0', + 'id' => '256', + 'isbn_group_id' => '45', + 'registrant_from' => '0000', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 256 => + array ( + 'from_number' => '20000', + 'id' => '257', + 'isbn_group_id' => '45', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 257 => + array ( + 'from_number' => '50000', + 'id' => '258', + 'isbn_group_id' => '45', + 'registrant_from' => '50000', + 'registrant_length' => '5', + 'registrant_to' => '54999', + 'to_number' => '54999', + ), + 258 => + array ( + 'from_number' => '55000', + 'id' => '259', + 'isbn_group_id' => '45', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 259 => + array ( + 'from_number' => '80000', + 'id' => '260', + 'isbn_group_id' => '45', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 260 => + array ( + 'from_number' => '95000', + 'id' => '261', + 'isbn_group_id' => '45', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 261 => + array ( + 'from_number' => '0', + 'id' => '262', + 'isbn_group_id' => '46', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 262 => + array ( + 'from_number' => '20000', + 'id' => '263', + 'isbn_group_id' => '46', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 263 => + array ( + 'from_number' => '70000', + 'id' => '264', + 'isbn_group_id' => '46', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 264 => + array ( + 'from_number' => '0', + 'id' => '265', + 'isbn_group_id' => '47', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '02', + 'to_number' => '2999', + ), + 265 => + array ( + 'from_number' => '3000', + 'id' => '266', + 'isbn_group_id' => '47', + 'registrant_from' => '0300', + 'registrant_length' => '4', + 'registrant_to' => '0499', + 'to_number' => '4999', + ), + 266 => + array ( + 'from_number' => '5000', + 'id' => '267', + 'isbn_group_id' => '47', + 'registrant_from' => '05', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 267 => + array ( + 'from_number' => '20000', + 'id' => '268', + 'isbn_group_id' => '47', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2099', + 'to_number' => '20999', + ), + 268 => + array ( + 'from_number' => '21000', + 'id' => '269', + 'isbn_group_id' => '47', + 'registrant_from' => '21', + 'registrant_length' => '2', + 'registrant_to' => '27', + 'to_number' => '27999', + ), + 269 => + array ( + 'from_number' => '28000', + 'id' => '270', + 'isbn_group_id' => '47', + 'registrant_from' => '28000', + 'registrant_length' => '5', + 'registrant_to' => '30999', + 'to_number' => '30999', + ), + 270 => + array ( + 'from_number' => '31000', + 'id' => '271', + 'isbn_group_id' => '47', + 'registrant_from' => '31', + 'registrant_length' => '2', + 'registrant_to' => '43', + 'to_number' => '43999', + ), + 271 => + array ( + 'from_number' => '44000', + 'id' => '272', + 'isbn_group_id' => '47', + 'registrant_from' => '440', + 'registrant_length' => '3', + 'registrant_to' => '819', + 'to_number' => '81999', + ), + 272 => + array ( + 'from_number' => '82000', + 'id' => '273', + 'isbn_group_id' => '47', + 'registrant_from' => '8200', + 'registrant_length' => '4', + 'registrant_to' => '9699', + 'to_number' => '96999', + ), + 273 => + array ( + 'from_number' => '97000', + 'id' => '274', + 'isbn_group_id' => '47', + 'registrant_from' => '97000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 274 => + array ( + 'from_number' => '0', + 'id' => '275', + 'isbn_group_id' => '48', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '56', + 'to_number' => '56999', + ), + 275 => + array ( + 'from_number' => '57000', + 'id' => '276', + 'isbn_group_id' => '48', + 'registrant_from' => '57000', + 'registrant_length' => '5', + 'registrant_to' => '59999', + 'to_number' => '59999', + ), + 276 => + array ( + 'from_number' => '60000', + 'id' => '277', + 'isbn_group_id' => '48', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 277 => + array ( + 'from_number' => '80000', + 'id' => '278', + 'isbn_group_id' => '48', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 278 => + array ( + 'from_number' => '95000', + 'id' => '279', + 'isbn_group_id' => '48', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 279 => + array ( + 'from_number' => '0', + 'id' => '280', + 'isbn_group_id' => '49', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 280 => + array ( + 'from_number' => '20000', + 'id' => '281', + 'isbn_group_id' => '49', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 281 => + array ( + 'from_number' => '70000', + 'id' => '282', + 'isbn_group_id' => '49', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 282 => + array ( + 'from_number' => '85000', + 'id' => '283', + 'isbn_group_id' => '49', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 283 => + array ( + 'from_number' => '0', + 'id' => '284', + 'isbn_group_id' => '50', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 284 => + array ( + 'from_number' => '20000', + 'id' => '285', + 'isbn_group_id' => '50', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '659', + 'to_number' => '65999', + ), + 285 => + array ( + 'from_number' => '66000', + 'id' => '286', + 'isbn_group_id' => '50', + 'registrant_from' => '6600', + 'registrant_length' => '4', + 'registrant_to' => '6899', + 'to_number' => '68999', + ), + 286 => + array ( + 'from_number' => '69000', + 'id' => '287', + 'isbn_group_id' => '50', + 'registrant_from' => '690', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 287 => + array ( + 'from_number' => '70000', + 'id' => '288', + 'isbn_group_id' => '50', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 288 => + array ( + 'from_number' => '85000', + 'id' => '289', + 'isbn_group_id' => '50', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '92999', + 'to_number' => '92999', + ), + 289 => + array ( + 'from_number' => '93000', + 'id' => '290', + 'isbn_group_id' => '50', + 'registrant_from' => '93', + 'registrant_length' => '2', + 'registrant_to' => '93', + 'to_number' => '93999', + ), + 290 => + array ( + 'from_number' => '94000', + 'id' => '291', + 'isbn_group_id' => '50', + 'registrant_from' => '9400', + 'registrant_length' => '4', + 'registrant_to' => '9799', + 'to_number' => '97999', + ), + 291 => + array ( + 'from_number' => '98000', + 'id' => '292', + 'isbn_group_id' => '50', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 292 => + array ( + 'from_number' => '0', + 'id' => '293', + 'isbn_group_id' => '51', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 293 => + array ( + 'from_number' => '20000', + 'id' => '294', + 'isbn_group_id' => '51', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 294 => + array ( + 'from_number' => '60000', + 'id' => '295', + 'isbn_group_id' => '51', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 295 => + array ( + 'from_number' => '90000', + 'id' => '296', + 'isbn_group_id' => '51', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 296 => + array ( + 'from_number' => '0', + 'id' => '297', + 'isbn_group_id' => '52', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 297 => + array ( + 'from_number' => '20000', + 'id' => '298', + 'isbn_group_id' => '52', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 298 => + array ( + 'from_number' => '70000', + 'id' => '299', + 'isbn_group_id' => '52', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 299 => + array ( + 'from_number' => '85000', + 'id' => '300', + 'isbn_group_id' => '52', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '86999', + 'to_number' => '86999', + ), + 300 => + array ( + 'from_number' => '87000', + 'id' => '301', + 'isbn_group_id' => '52', + 'registrant_from' => '8700', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 301 => + array ( + 'from_number' => '90000', + 'id' => '302', + 'isbn_group_id' => '52', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 302 => + array ( + 'from_number' => '0', + 'id' => '303', + 'isbn_group_id' => '53', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 303 => + array ( + 'from_number' => '20000', + 'id' => '304', + 'isbn_group_id' => '53', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 304 => + array ( + 'from_number' => '70000', + 'id' => '305', + 'isbn_group_id' => '53', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 305 => + array ( + 'from_number' => '85000', + 'id' => '306', + 'isbn_group_id' => '53', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 306 => + array ( + 'from_number' => '90000', + 'id' => '307', + 'isbn_group_id' => '53', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 307 => + array ( + 'from_number' => '0', + 'id' => '308', + 'isbn_group_id' => '54', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 308 => + array ( + 'from_number' => '15000', + 'id' => '309', + 'isbn_group_id' => '54', + 'registrant_from' => '150', + 'registrant_length' => '3', + 'registrant_to' => '249', + 'to_number' => '24999', + ), + 309 => + array ( + 'from_number' => '25000', + 'id' => '310', + 'isbn_group_id' => '54', + 'registrant_from' => '2500', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 310 => + array ( + 'from_number' => '30000', + 'id' => '311', + 'isbn_group_id' => '54', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '549', + 'to_number' => '54999', + ), + 311 => + array ( + 'from_number' => '55000', + 'id' => '312', + 'isbn_group_id' => '54', + 'registrant_from' => '5500', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 312 => + array ( + 'from_number' => '90000', + 'id' => '313', + 'isbn_group_id' => '54', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 313 => + array ( + 'from_number' => '97000', + 'id' => '314', + 'isbn_group_id' => '54', + 'registrant_from' => '970', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 314 => + array ( + 'from_number' => '99000', + 'id' => '315', + 'isbn_group_id' => '54', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 315 => + array ( + 'from_number' => '0', + 'id' => '316', + 'isbn_group_id' => '55', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 316 => + array ( + 'from_number' => '20000', + 'id' => '317', + 'isbn_group_id' => '55', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 317 => + array ( + 'from_number' => '70000', + 'id' => '318', + 'isbn_group_id' => '55', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 318 => + array ( + 'from_number' => '90000', + 'id' => '319', + 'isbn_group_id' => '55', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 319 => + array ( + 'from_number' => '0', + 'id' => '320', + 'isbn_group_id' => '56', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 320 => + array ( + 'from_number' => '15000', + 'id' => '321', + 'isbn_group_id' => '56', + 'registrant_from' => '1500', + 'registrant_length' => '4', + 'registrant_to' => '1699', + 'to_number' => '16999', + ), + 321 => + array ( + 'from_number' => '17000', + 'id' => '322', + 'isbn_group_id' => '56', + 'registrant_from' => '170', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 322 => + array ( + 'from_number' => '20000', + 'id' => '323', + 'isbn_group_id' => '56', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 323 => + array ( + 'from_number' => '30000', + 'id' => '324', + 'isbn_group_id' => '56', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 324 => + array ( + 'from_number' => '70000', + 'id' => '325', + 'isbn_group_id' => '56', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 325 => + array ( + 'from_number' => '90000', + 'id' => '326', + 'isbn_group_id' => '56', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 326 => + array ( + 'from_number' => '0', + 'id' => '327', + 'isbn_group_id' => '57', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '00', + 'to_number' => '999', + ), + 327 => + array ( + 'from_number' => '1000', + 'id' => '328', + 'isbn_group_id' => '57', + 'registrant_from' => '0100', + 'registrant_length' => '4', + 'registrant_to' => '0999', + 'to_number' => '9999', + ), + 328 => + array ( + 'from_number' => '10000', + 'id' => '329', + 'isbn_group_id' => '57', + 'registrant_from' => '10000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 329 => + array ( + 'from_number' => '30000', + 'id' => '330', + 'isbn_group_id' => '57', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 330 => + array ( + 'from_number' => '50000', + 'id' => '331', + 'isbn_group_id' => '57', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 331 => + array ( + 'from_number' => '60000', + 'id' => '332', + 'isbn_group_id' => '57', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 332 => + array ( + 'from_number' => '90000', + 'id' => '333', + 'isbn_group_id' => '57', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 333 => + array ( + 'from_number' => '99000', + 'id' => '334', + 'isbn_group_id' => '57', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9989', + 'to_number' => '99899', + ), + 334 => + array ( + 'from_number' => '99900', + 'id' => '335', + 'isbn_group_id' => '57', + 'registrant_from' => '99900', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 335 => + array ( + 'from_number' => '1000', + 'id' => '336', + 'isbn_group_id' => '58', + 'registrant_from' => '01', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 336 => + array ( + 'from_number' => '40000', + 'id' => '337', + 'isbn_group_id' => '58', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 337 => + array ( + 'from_number' => '50000', + 'id' => '338', + 'isbn_group_id' => '58', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 338 => + array ( + 'from_number' => '80000', + 'id' => '339', + 'isbn_group_id' => '58', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 339 => + array ( + 'from_number' => '90000', + 'id' => '340', + 'isbn_group_id' => '58', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 340 => + array ( + 'from_number' => '0', + 'id' => '341', + 'isbn_group_id' => '59', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 341 => + array ( + 'from_number' => '20000', + 'id' => '342', + 'isbn_group_id' => '59', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 342 => + array ( + 'from_number' => '40000', + 'id' => '343', + 'isbn_group_id' => '59', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 343 => + array ( + 'from_number' => '80000', + 'id' => '344', + 'isbn_group_id' => '59', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 344 => + array ( + 'from_number' => '1000', + 'id' => '345', + 'isbn_group_id' => '60', + 'registrant_from' => '01', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 345 => + array ( + 'from_number' => '60000', + 'id' => '346', + 'isbn_group_id' => '60', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 346 => + array ( + 'from_number' => '90000', + 'id' => '347', + 'isbn_group_id' => '60', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9099', + 'to_number' => '90999', + ), + 347 => + array ( + 'from_number' => '91000', + 'id' => '348', + 'isbn_group_id' => '60', + 'registrant_from' => '91000', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 348 => + array ( + 'from_number' => '97000', + 'id' => '349', + 'isbn_group_id' => '60', + 'registrant_from' => '9700', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 349 => + array ( + 'from_number' => '0', + 'id' => '350', + 'isbn_group_id' => '61', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '015', + 'to_number' => '1599', + ), + 350 => + array ( + 'from_number' => '1600', + 'id' => '351', + 'isbn_group_id' => '61', + 'registrant_from' => '0160', + 'registrant_length' => '4', + 'registrant_to' => '0199', + 'to_number' => '1999', + ), + 351 => + array ( + 'from_number' => '2000', + 'id' => '352', + 'isbn_group_id' => '61', + 'registrant_from' => '02', + 'registrant_length' => '2', + 'registrant_to' => '02', + 'to_number' => '2999', + ), + 352 => + array ( + 'from_number' => '3000', + 'id' => '353', + 'isbn_group_id' => '61', + 'registrant_from' => '0300', + 'registrant_length' => '4', + 'registrant_to' => '0599', + 'to_number' => '5999', + ), + 353 => + array ( + 'from_number' => '6000', + 'id' => '354', + 'isbn_group_id' => '61', + 'registrant_from' => '06', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 354 => + array ( + 'from_number' => '10000', + 'id' => '355', + 'isbn_group_id' => '61', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 355 => + array ( + 'from_number' => '50000', + 'id' => '356', + 'isbn_group_id' => '61', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 356 => + array ( + 'from_number' => '85000', + 'id' => '357', + 'isbn_group_id' => '61', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9099', + 'to_number' => '90999', + ), + 357 => + array ( + 'from_number' => '91000', + 'id' => '358', + 'isbn_group_id' => '61', + 'registrant_from' => '91000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 358 => + array ( + 'from_number' => '99000', + 'id' => '359', + 'isbn_group_id' => '61', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 359 => + array ( + 'from_number' => '0', + 'id' => '360', + 'isbn_group_id' => '62', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 360 => + array ( + 'from_number' => '20000', + 'id' => '361', + 'isbn_group_id' => '62', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 361 => + array ( + 'from_number' => '55000', + 'id' => '362', + 'isbn_group_id' => '62', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 362 => + array ( + 'from_number' => '80000', + 'id' => '363', + 'isbn_group_id' => '62', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 363 => + array ( + 'from_number' => '95000', + 'id' => '364', + 'isbn_group_id' => '62', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 364 => + array ( + 'from_number' => '0', + 'id' => '365', + 'isbn_group_id' => '63', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 365 => + array ( + 'from_number' => '10000', + 'id' => '366', + 'isbn_group_id' => '63', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '169', + 'to_number' => '16999', + ), + 366 => + array ( + 'from_number' => '17000', + 'id' => '367', + 'isbn_group_id' => '63', + 'registrant_from' => '1700', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 367 => + array ( + 'from_number' => '20000', + 'id' => '368', + 'isbn_group_id' => '63', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 368 => + array ( + 'from_number' => '55000', + 'id' => '369', + 'isbn_group_id' => '63', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '759', + 'to_number' => '75999', + ), + 369 => + array ( + 'from_number' => '76000', + 'id' => '370', + 'isbn_group_id' => '63', + 'registrant_from' => '7600', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 370 => + array ( + 'from_number' => '85000', + 'id' => '371', + 'isbn_group_id' => '63', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '88999', + 'to_number' => '88999', + ), + 371 => + array ( + 'from_number' => '89000', + 'id' => '372', + 'isbn_group_id' => '63', + 'registrant_from' => '8900', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 372 => + array ( + 'from_number' => '95000', + 'id' => '373', + 'isbn_group_id' => '63', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 373 => + array ( + 'from_number' => '0', + 'id' => '374', + 'isbn_group_id' => '64', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 374 => + array ( + 'from_number' => '20000', + 'id' => '375', + 'isbn_group_id' => '64', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 375 => + array ( + 'from_number' => '70000', + 'id' => '376', + 'isbn_group_id' => '64', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 376 => + array ( + 'from_number' => '85000', + 'id' => '377', + 'isbn_group_id' => '64', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 377 => + array ( + 'from_number' => '90000', + 'id' => '378', + 'isbn_group_id' => '64', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 378 => + array ( + 'from_number' => '95000', + 'id' => '379', + 'isbn_group_id' => '64', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 379 => + array ( + 'from_number' => '0', + 'id' => '380', + 'isbn_group_id' => '65', + 'registrant_from' => '00000', + 'registrant_length' => '5', + 'registrant_to' => '01999', + 'to_number' => '1999', + ), + 380 => + array ( + 'from_number' => '2000', + 'id' => '381', + 'isbn_group_id' => '65', + 'registrant_from' => '02', + 'registrant_length' => '2', + 'registrant_to' => '24', + 'to_number' => '24999', + ), + 381 => + array ( + 'from_number' => '25000', + 'id' => '382', + 'isbn_group_id' => '65', + 'registrant_from' => '250', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 382 => + array ( + 'from_number' => '60000', + 'id' => '383', + 'isbn_group_id' => '65', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '9199', + 'to_number' => '91999', + ), + 383 => + array ( + 'from_number' => '92000', + 'id' => '384', + 'isbn_group_id' => '65', + 'registrant_from' => '92000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 384 => + array ( + 'from_number' => '99000', + 'id' => '385', + 'isbn_group_id' => '65', + 'registrant_from' => '990', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 385 => + array ( + 'from_number' => '0', + 'id' => '386', + 'isbn_group_id' => '66', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 386 => + array ( + 'from_number' => '40000', + 'id' => '387', + 'isbn_group_id' => '66', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 387 => + array ( + 'from_number' => '60000', + 'id' => '388', + 'isbn_group_id' => '66', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 388 => + array ( + 'from_number' => '80000', + 'id' => '389', + 'isbn_group_id' => '66', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 389 => + array ( + 'from_number' => '95000', + 'id' => '390', + 'isbn_group_id' => '66', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 390 => + array ( + 'from_number' => '0', + 'id' => '391', + 'isbn_group_id' => '67', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 391 => + array ( + 'from_number' => '20000', + 'id' => '392', + 'isbn_group_id' => '67', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 392 => + array ( + 'from_number' => '50000', + 'id' => '393', + 'isbn_group_id' => '67', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '6999', + 'to_number' => '69999', + ), + 393 => + array ( + 'from_number' => '70000', + 'id' => '394', + 'isbn_group_id' => '67', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 394 => + array ( + 'from_number' => '0', + 'id' => '395', + 'isbn_group_id' => '68', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 395 => + array ( + 'from_number' => '20000', + 'id' => '396', + 'isbn_group_id' => '68', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 396 => + array ( + 'from_number' => '30000', + 'id' => '397', + 'isbn_group_id' => '68', + 'registrant_from' => '30000', + 'registrant_length' => '5', + 'registrant_to' => '79999', + 'to_number' => '79999', + ), + 397 => + array ( + 'from_number' => '80000', + 'id' => '398', + 'isbn_group_id' => '68', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 398 => + array ( + 'from_number' => '90000', + 'id' => '399', + 'isbn_group_id' => '68', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 399 => + array ( + 'from_number' => '0', + 'id' => '400', + 'isbn_group_id' => '69', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '099', + 'to_number' => '9999', + ), + 400 => + array ( + 'from_number' => '10000', + 'id' => '401', + 'isbn_group_id' => '69', + 'registrant_from' => '1000', + 'registrant_length' => '4', + 'registrant_to' => '1499', + 'to_number' => '14999', + ), + 401 => + array ( + 'from_number' => '15000', + 'id' => '402', + 'isbn_group_id' => '69', + 'registrant_from' => '15000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 402 => + array ( + 'from_number' => '20000', + 'id' => '403', + 'isbn_group_id' => '69', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 403 => + array ( + 'from_number' => '30000', + 'id' => '404', + 'isbn_group_id' => '69', + 'registrant_from' => '3000', + 'registrant_length' => '4', + 'registrant_to' => '3999', + 'to_number' => '39999', + ), + 404 => + array ( + 'from_number' => '40000', + 'id' => '405', + 'isbn_group_id' => '69', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 405 => + array ( + 'from_number' => '80000', + 'id' => '406', + 'isbn_group_id' => '69', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 406 => + array ( + 'from_number' => '95000', + 'id' => '407', + 'isbn_group_id' => '69', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 407 => + array ( + 'from_number' => '0', + 'id' => '408', + 'isbn_group_id' => '70', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 408 => + array ( + 'from_number' => '20000', + 'id' => '409', + 'isbn_group_id' => '70', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 409 => + array ( + 'from_number' => '60000', + 'id' => '410', + 'isbn_group_id' => '70', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 410 => + array ( + 'from_number' => '0', + 'id' => '411', + 'isbn_group_id' => '71', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '11', + 'to_number' => '11999', + ), + 411 => + array ( + 'from_number' => '12000', + 'id' => '412', + 'isbn_group_id' => '71', + 'registrant_from' => '1200', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 412 => + array ( + 'from_number' => '20000', + 'id' => '413', + 'isbn_group_id' => '71', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '289', + 'to_number' => '28999', + ), + 413 => + array ( + 'from_number' => '29000', + 'id' => '414', + 'isbn_group_id' => '71', + 'registrant_from' => '2900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 414 => + array ( + 'from_number' => '0', + 'id' => '415', + 'isbn_group_id' => '72', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 415 => + array ( + 'from_number' => '10000', + 'id' => '416', + 'isbn_group_id' => '72', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 416 => + array ( + 'from_number' => '70000', + 'id' => '417', + 'isbn_group_id' => '72', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 417 => + array ( + 'from_number' => '90000', + 'id' => '418', + 'isbn_group_id' => '72', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9799', + 'to_number' => '97999', + ), + 418 => + array ( + 'from_number' => '98000', + 'id' => '419', + 'isbn_group_id' => '72', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 419 => + array ( + 'from_number' => '0', + 'id' => '420', + 'isbn_group_id' => '73', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '01', + 'to_number' => '1999', + ), + 420 => + array ( + 'from_number' => '2000', + 'id' => '421', + 'isbn_group_id' => '73', + 'registrant_from' => '020', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 421 => + array ( + 'from_number' => '20000', + 'id' => '422', + 'isbn_group_id' => '73', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '3999', + 'to_number' => '39999', + ), + 422 => + array ( + 'from_number' => '40000', + 'id' => '423', + 'isbn_group_id' => '73', + 'registrant_from' => '40000', + 'registrant_length' => '5', + 'registrant_to' => '44999', + 'to_number' => '44999', + ), + 423 => + array ( + 'from_number' => '45000', + 'id' => '424', + 'isbn_group_id' => '73', + 'registrant_from' => '45', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 424 => + array ( + 'from_number' => '50000', + 'id' => '425', + 'isbn_group_id' => '73', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 425 => + array ( + 'from_number' => '80000', + 'id' => '426', + 'isbn_group_id' => '73', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 426 => + array ( + 'from_number' => '90000', + 'id' => '427', + 'isbn_group_id' => '73', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9899', + 'to_number' => '98999', + ), + 427 => + array ( + 'from_number' => '99000', + 'id' => '428', + 'isbn_group_id' => '73', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 428 => + array ( + 'from_number' => '0', + 'id' => '429', + 'isbn_group_id' => '74', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 429 => + array ( + 'from_number' => '40000', + 'id' => '430', + 'isbn_group_id' => '74', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 430 => + array ( + 'from_number' => '80000', + 'id' => '431', + 'isbn_group_id' => '74', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 431 => + array ( + 'from_number' => '90000', + 'id' => '432', + 'isbn_group_id' => '74', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 432 => + array ( + 'from_number' => '0', + 'id' => '433', + 'isbn_group_id' => '75', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 433 => + array ( + 'from_number' => '40000', + 'id' => '434', + 'isbn_group_id' => '75', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 434 => + array ( + 'from_number' => '60000', + 'id' => '435', + 'isbn_group_id' => '75', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 435 => + array ( + 'from_number' => '90000', + 'id' => '436', + 'isbn_group_id' => '75', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 436 => + array ( + 'from_number' => '0', + 'id' => '437', + 'isbn_group_id' => '76', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '11', + 'to_number' => '11999', + ), + 437 => + array ( + 'from_number' => '12000', + 'id' => '438', + 'isbn_group_id' => '76', + 'registrant_from' => '120', + 'registrant_length' => '3', + 'registrant_to' => '559', + 'to_number' => '55999', + ), + 438 => + array ( + 'from_number' => '56000', + 'id' => '439', + 'isbn_group_id' => '76', + 'registrant_from' => '5600', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 439 => + array ( + 'from_number' => '80000', + 'id' => '440', + 'isbn_group_id' => '76', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 440 => + array ( + 'from_number' => '0', + 'id' => '441', + 'isbn_group_id' => '77', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 441 => + array ( + 'from_number' => '10000', + 'id' => '442', + 'isbn_group_id' => '77', + 'registrant_from' => '1000', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 442 => + array ( + 'from_number' => '20000', + 'id' => '443', + 'isbn_group_id' => '77', + 'registrant_from' => '20000', + 'registrant_length' => '5', + 'registrant_to' => '29999', + 'to_number' => '29999', + ), + 443 => + array ( + 'from_number' => '30000', + 'id' => '444', + 'isbn_group_id' => '77', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 444 => + array ( + 'from_number' => '50000', + 'id' => '445', + 'isbn_group_id' => '77', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 445 => + array ( + 'from_number' => '90000', + 'id' => '446', + 'isbn_group_id' => '77', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 446 => + array ( + 'from_number' => '95000', + 'id' => '447', + 'isbn_group_id' => '77', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 447 => + array ( + 'from_number' => '0', + 'id' => '448', + 'isbn_group_id' => '78', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 448 => + array ( + 'from_number' => '15000', + 'id' => '449', + 'isbn_group_id' => '78', + 'registrant_from' => '15000', + 'registrant_length' => '5', + 'registrant_to' => '16999', + 'to_number' => '16999', + ), + 449 => + array ( + 'from_number' => '17000', + 'id' => '450', + 'isbn_group_id' => '78', + 'registrant_from' => '17000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 450 => + array ( + 'from_number' => '20000', + 'id' => '451', + 'isbn_group_id' => '78', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 451 => + array ( + 'from_number' => '80000', + 'id' => '452', + 'isbn_group_id' => '78', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9699', + 'to_number' => '96999', + ), + 452 => + array ( + 'from_number' => '97000', + 'id' => '453', + 'isbn_group_id' => '78', + 'registrant_from' => '97000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 453 => + array ( + 'from_number' => '0', + 'id' => '454', + 'isbn_group_id' => '79', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 454 => + array ( + 'from_number' => '20000', + 'id' => '455', + 'isbn_group_id' => '79', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 455 => + array ( + 'from_number' => '55000', + 'id' => '456', + 'isbn_group_id' => '79', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 456 => + array ( + 'from_number' => '80000', + 'id' => '457', + 'isbn_group_id' => '79', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 457 => + array ( + 'from_number' => '95000', + 'id' => '458', + 'isbn_group_id' => '79', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 458 => + array ( + 'from_number' => '0', + 'id' => '459', + 'isbn_group_id' => '80', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 459 => + array ( + 'from_number' => '10000', + 'id' => '460', + 'isbn_group_id' => '80', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 460 => + array ( + 'from_number' => '40000', + 'id' => '461', + 'isbn_group_id' => '80', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4999', + 'to_number' => '49999', + ), + 461 => + array ( + 'from_number' => '0', + 'id' => '462', + 'isbn_group_id' => '81', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 462 => + array ( + 'from_number' => '10000', + 'id' => '463', + 'isbn_group_id' => '81', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 463 => + array ( + 'from_number' => '40000', + 'id' => '464', + 'isbn_group_id' => '81', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4999', + 'to_number' => '49999', + ), + 464 => + array ( + 'from_number' => '0', + 'id' => '465', + 'isbn_group_id' => '82', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 465 => + array ( + 'from_number' => '40000', + 'id' => '466', + 'isbn_group_id' => '82', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 466 => + array ( + 'from_number' => '55000', + 'id' => '467', + 'isbn_group_id' => '82', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 467 => + array ( + 'from_number' => '80000', + 'id' => '468', + 'isbn_group_id' => '82', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 468 => + array ( + 'from_number' => '0', + 'id' => '469', + 'isbn_group_id' => '83', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 469 => + array ( + 'from_number' => '50000', + 'id' => '470', + 'isbn_group_id' => '83', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '939', + 'to_number' => '93999', + ), + 470 => + array ( + 'from_number' => '94000', + 'id' => '471', + 'isbn_group_id' => '83', + 'registrant_from' => '9400', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 471 => + array ( + 'from_number' => '0', + 'id' => '472', + 'isbn_group_id' => '84', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 472 => + array ( + 'from_number' => '30000', + 'id' => '473', + 'isbn_group_id' => '84', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 473 => + array ( + 'from_number' => '90000', + 'id' => '474', + 'isbn_group_id' => '84', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 474 => + array ( + 'from_number' => '0', + 'id' => '475', + 'isbn_group_id' => '85', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 475 => + array ( + 'from_number' => '40000', + 'id' => '476', + 'isbn_group_id' => '85', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 476 => + array ( + 'from_number' => '85000', + 'id' => '477', + 'isbn_group_id' => '85', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 477 => + array ( + 'from_number' => '0', + 'id' => '478', + 'isbn_group_id' => '86', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 478 => + array ( + 'from_number' => '10000', + 'id' => '479', + 'isbn_group_id' => '86', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 479 => + array ( + 'from_number' => '40000', + 'id' => '480', + 'isbn_group_id' => '86', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 480 => + array ( + 'from_number' => '90000', + 'id' => '481', + 'isbn_group_id' => '86', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 481 => + array ( + 'from_number' => '0', + 'id' => '482', + 'isbn_group_id' => '87', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 482 => + array ( + 'from_number' => '10000', + 'id' => '483', + 'isbn_group_id' => '87', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 483 => + array ( + 'from_number' => '50000', + 'id' => '484', + 'isbn_group_id' => '87', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 484 => + array ( + 'from_number' => '80000', + 'id' => '485', + 'isbn_group_id' => '87', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 485 => + array ( + 'from_number' => '0', + 'id' => '486', + 'isbn_group_id' => '88', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 486 => + array ( + 'from_number' => '10000', + 'id' => '487', + 'isbn_group_id' => '88', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 487 => + array ( + 'from_number' => '40000', + 'id' => '488', + 'isbn_group_id' => '88', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 488 => + array ( + 'from_number' => '90000', + 'id' => '489', + 'isbn_group_id' => '88', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 489 => + array ( + 'from_number' => '0', + 'id' => '490', + 'isbn_group_id' => '89', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 490 => + array ( + 'from_number' => '20000', + 'id' => '491', + 'isbn_group_id' => '89', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 491 => + array ( + 'from_number' => '40000', + 'id' => '492', + 'isbn_group_id' => '89', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 492 => + array ( + 'from_number' => '80000', + 'id' => '493', + 'isbn_group_id' => '89', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 493 => + array ( + 'from_number' => '0', + 'id' => '494', + 'isbn_group_id' => '90', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 494 => + array ( + 'from_number' => '30000', + 'id' => '495', + 'isbn_group_id' => '90', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 495 => + array ( + 'from_number' => '50000', + 'id' => '496', + 'isbn_group_id' => '90', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 496 => + array ( + 'from_number' => '80000', + 'id' => '497', + 'isbn_group_id' => '90', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 497 => + array ( + 'from_number' => '0', + 'id' => '498', + 'isbn_group_id' => '91', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 498 => + array ( + 'from_number' => '80000', + 'id' => '499', + 'isbn_group_id' => '91', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 499 => + array ( + 'from_number' => '95000', + 'id' => '500', + 'isbn_group_id' => '91', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 500 => + array ( + 'from_number' => '0', + 'id' => '501', + 'isbn_group_id' => '92', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 501 => + array ( + 'from_number' => '50000', + 'id' => '502', + 'isbn_group_id' => '92', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 502 => + array ( + 'from_number' => '80000', + 'id' => '503', + 'isbn_group_id' => '92', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 503 => + array ( + 'from_number' => '90000', + 'id' => '504', + 'isbn_group_id' => '92', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 504 => + array ( + 'from_number' => '0', + 'id' => '505', + 'isbn_group_id' => '93', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 505 => + array ( + 'from_number' => '20000', + 'id' => '506', + 'isbn_group_id' => '93', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 506 => + array ( + 'from_number' => '50000', + 'id' => '507', + 'isbn_group_id' => '93', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 507 => + array ( + 'from_number' => '90000', + 'id' => '508', + 'isbn_group_id' => '93', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 508 => + array ( + 'from_number' => '0', + 'id' => '509', + 'isbn_group_id' => '94', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 509 => + array ( + 'from_number' => '10000', + 'id' => '510', + 'isbn_group_id' => '94', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 510 => + array ( + 'from_number' => '40000', + 'id' => '511', + 'isbn_group_id' => '94', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 511 => + array ( + 'from_number' => '90000', + 'id' => '512', + 'isbn_group_id' => '94', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 512 => + array ( + 'from_number' => '0', + 'id' => '513', + 'isbn_group_id' => '95', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 513 => + array ( + 'from_number' => '90000', + 'id' => '514', + 'isbn_group_id' => '95', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '984', + 'to_number' => '98499', + ), + 514 => + array ( + 'from_number' => '98500', + 'id' => '515', + 'isbn_group_id' => '95', + 'registrant_from' => '9850', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 515 => + array ( + 'from_number' => '0', + 'id' => '516', + 'isbn_group_id' => '96', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 516 => + array ( + 'from_number' => '30000', + 'id' => '517', + 'isbn_group_id' => '96', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 517 => + array ( + 'from_number' => '40000', + 'id' => '518', + 'isbn_group_id' => '96', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 518 => + array ( + 'from_number' => '0', + 'id' => '519', + 'isbn_group_id' => '97', + 'registrant_from' => '0000', + 'registrant_length' => '4', + 'registrant_to' => '0999', + 'to_number' => '9999', + ), + 519 => + array ( + 'from_number' => '10000', + 'id' => '520', + 'isbn_group_id' => '97', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 520 => + array ( + 'from_number' => '50000', + 'id' => '521', + 'isbn_group_id' => '97', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 521 => + array ( + 'from_number' => '60000', + 'id' => '522', + 'isbn_group_id' => '97', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 522 => + array ( + 'from_number' => '70000', + 'id' => '523', + 'isbn_group_id' => '97', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 523 => + array ( + 'from_number' => '80000', + 'id' => '524', + 'isbn_group_id' => '97', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 524 => + array ( + 'from_number' => '90000', + 'id' => '525', + 'isbn_group_id' => '97', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 525 => + array ( + 'from_number' => '0', + 'id' => '526', + 'isbn_group_id' => '98', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '00', + 'to_number' => '999', + ), + 526 => + array ( + 'from_number' => '1000', + 'id' => '527', + 'isbn_group_id' => '98', + 'registrant_from' => '010', + 'registrant_length' => '3', + 'registrant_to' => '079', + 'to_number' => '7999', + ), + 527 => + array ( + 'from_number' => '8000', + 'id' => '528', + 'isbn_group_id' => '98', + 'registrant_from' => '08', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 528 => + array ( + 'from_number' => '40000', + 'id' => '529', + 'isbn_group_id' => '98', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '569', + 'to_number' => '56999', + ), + 529 => + array ( + 'from_number' => '57000', + 'id' => '530', + 'isbn_group_id' => '98', + 'registrant_from' => '57', + 'registrant_length' => '2', + 'registrant_to' => '57', + 'to_number' => '57999', + ), + 530 => + array ( + 'from_number' => '58000', + 'id' => '531', + 'isbn_group_id' => '98', + 'registrant_from' => '580', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 531 => + array ( + 'from_number' => '85000', + 'id' => '532', + 'isbn_group_id' => '98', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 532 => + array ( + 'from_number' => '0', + 'id' => '533', + 'isbn_group_id' => '99', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 533 => + array ( + 'from_number' => '20000', + 'id' => '534', + 'isbn_group_id' => '99', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 534 => + array ( + 'from_number' => '40000', + 'id' => '535', + 'isbn_group_id' => '99', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 535 => + array ( + 'from_number' => '90000', + 'id' => '536', + 'isbn_group_id' => '99', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 536 => + array ( + 'from_number' => '0', + 'id' => '537', + 'isbn_group_id' => '100', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 537 => + array ( + 'from_number' => '20000', + 'id' => '538', + 'isbn_group_id' => '100', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 538 => + array ( + 'from_number' => '80000', + 'id' => '539', + 'isbn_group_id' => '100', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 539 => + array ( + 'from_number' => '0', + 'id' => '540', + 'isbn_group_id' => '101', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 540 => + array ( + 'from_number' => '40000', + 'id' => '541', + 'isbn_group_id' => '101', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 541 => + array ( + 'from_number' => '85000', + 'id' => '542', + 'isbn_group_id' => '101', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 542 => + array ( + 'from_number' => '0', + 'id' => '543', + 'isbn_group_id' => '102', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 543 => + array ( + 'from_number' => '10000', + 'id' => '544', + 'isbn_group_id' => '102', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 544 => + array ( + 'from_number' => '40000', + 'id' => '545', + 'isbn_group_id' => '102', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 545 => + array ( + 'from_number' => '90000', + 'id' => '546', + 'isbn_group_id' => '102', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 546 => + array ( + 'from_number' => '0', + 'id' => '547', + 'isbn_group_id' => '103', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 547 => + array ( + 'from_number' => '30000', + 'id' => '548', + 'isbn_group_id' => '103', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 548 => + array ( + 'from_number' => '85000', + 'id' => '549', + 'isbn_group_id' => '103', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 549 => + array ( + 'from_number' => '0', + 'id' => '550', + 'isbn_group_id' => '104', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 550 => + array ( + 'from_number' => '40000', + 'id' => '551', + 'isbn_group_id' => '104', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 551 => + array ( + 'from_number' => '85000', + 'id' => '552', + 'isbn_group_id' => '104', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 552 => + array ( + 'from_number' => '0', + 'id' => '553', + 'isbn_group_id' => '105', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 553 => + array ( + 'from_number' => '20000', + 'id' => '554', + 'isbn_group_id' => '105', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 554 => + array ( + 'from_number' => '40000', + 'id' => '555', + 'isbn_group_id' => '105', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 555 => + array ( + 'from_number' => '80000', + 'id' => '556', + 'isbn_group_id' => '105', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 556 => + array ( + 'from_number' => '0', + 'id' => '557', + 'isbn_group_id' => '106', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 557 => + array ( + 'from_number' => '10000', + 'id' => '558', + 'isbn_group_id' => '106', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 558 => + array ( + 'from_number' => '40000', + 'id' => '559', + 'isbn_group_id' => '106', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 559 => + array ( + 'from_number' => '60000', + 'id' => '560', + 'isbn_group_id' => '106', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 560 => + array ( + 'from_number' => '90000', + 'id' => '561', + 'isbn_group_id' => '106', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 561 => + array ( + 'from_number' => '0', + 'id' => '562', + 'isbn_group_id' => '107', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 562 => + array ( + 'from_number' => '20000', + 'id' => '563', + 'isbn_group_id' => '107', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 563 => + array ( + 'from_number' => '40000', + 'id' => '564', + 'isbn_group_id' => '107', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 564 => + array ( + 'from_number' => '80000', + 'id' => '565', + 'isbn_group_id' => '107', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 565 => + array ( + 'from_number' => '0', + 'id' => '566', + 'isbn_group_id' => '108', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 566 => + array ( + 'from_number' => '40000', + 'id' => '567', + 'isbn_group_id' => '108', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '929', + 'to_number' => '92999', + ), + 567 => + array ( + 'from_number' => '93000', + 'id' => '568', + 'isbn_group_id' => '108', + 'registrant_from' => '9300', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 568 => + array ( + 'from_number' => '0', + 'id' => '569', + 'isbn_group_id' => '109', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 569 => + array ( + 'from_number' => '10000', + 'id' => '570', + 'isbn_group_id' => '109', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 570 => + array ( + 'from_number' => '40000', + 'id' => '571', + 'isbn_group_id' => '109', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 571 => + array ( + 'from_number' => '90000', + 'id' => '572', + 'isbn_group_id' => '109', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 572 => + array ( + 'from_number' => '0', + 'id' => '573', + 'isbn_group_id' => '110', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 573 => + array ( + 'from_number' => '40000', + 'id' => '574', + 'isbn_group_id' => '110', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 574 => + array ( + 'from_number' => '70000', + 'id' => '575', + 'isbn_group_id' => '110', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '84', + 'to_number' => '84999', + ), + 575 => + array ( + 'from_number' => '85000', + 'id' => '576', + 'isbn_group_id' => '110', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '8799', + 'to_number' => '87999', + ), + 576 => + array ( + 'from_number' => '88000', + 'id' => '577', + 'isbn_group_id' => '110', + 'registrant_from' => '88', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 577 => + array ( + 'from_number' => '0', + 'id' => '578', + 'isbn_group_id' => '111', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 578 => + array ( + 'from_number' => '10000', + 'id' => '579', + 'isbn_group_id' => '111', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '18', + 'to_number' => '18999', + ), + 579 => + array ( + 'from_number' => '19000', + 'id' => '580', + 'isbn_group_id' => '111', + 'registrant_from' => '1900', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 580 => + array ( + 'from_number' => '20000', + 'id' => '581', + 'isbn_group_id' => '111', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 581 => + array ( + 'from_number' => '50000', + 'id' => '582', + 'isbn_group_id' => '111', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 582 => + array ( + 'from_number' => '90000', + 'id' => '583', + 'isbn_group_id' => '111', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 583 => + array ( + 'from_number' => '0', + 'id' => '584', + 'isbn_group_id' => '112', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 584 => + array ( + 'from_number' => '20000', + 'id' => '585', + 'isbn_group_id' => '112', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 585 => + array ( + 'from_number' => '80000', + 'id' => '586', + 'isbn_group_id' => '112', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 586 => + array ( + 'from_number' => '95000', + 'id' => '587', + 'isbn_group_id' => '112', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 587 => + array ( + 'from_number' => '0', + 'id' => '588', + 'isbn_group_id' => '113', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 588 => + array ( + 'from_number' => '60000', + 'id' => '589', + 'isbn_group_id' => '113', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 589 => + array ( + 'from_number' => '90000', + 'id' => '590', + 'isbn_group_id' => '113', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 590 => + array ( + 'from_number' => '0', + 'id' => '591', + 'isbn_group_id' => '114', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 591 => + array ( + 'from_number' => '30000', + 'id' => '592', + 'isbn_group_id' => '114', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 592 => + array ( + 'from_number' => '70000', + 'id' => '593', + 'isbn_group_id' => '114', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 593 => + array ( + 'from_number' => '95000', + 'id' => '594', + 'isbn_group_id' => '114', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 594 => + array ( + 'from_number' => '0', + 'id' => '595', + 'isbn_group_id' => '115', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 595 => + array ( + 'from_number' => '55000', + 'id' => '596', + 'isbn_group_id' => '115', + 'registrant_from' => '5500', + 'registrant_length' => '4', + 'registrant_to' => '5599', + 'to_number' => '55999', + ), + 596 => + array ( + 'from_number' => '56000', + 'id' => '597', + 'isbn_group_id' => '115', + 'registrant_from' => '56', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 597 => + array ( + 'from_number' => '60000', + 'id' => '598', + 'isbn_group_id' => '115', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 598 => + array ( + 'from_number' => '85000', + 'id' => '599', + 'isbn_group_id' => '115', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 599 => + array ( + 'from_number' => '0', + 'id' => '600', + 'isbn_group_id' => '116', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 600 => + array ( + 'from_number' => '30000', + 'id' => '601', + 'isbn_group_id' => '116', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 601 => + array ( + 'from_number' => '55000', + 'id' => '602', + 'isbn_group_id' => '116', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '734', + 'to_number' => '73499', + ), + 602 => + array ( + 'from_number' => '73500', + 'id' => '603', + 'isbn_group_id' => '116', + 'registrant_from' => '7350', + 'registrant_length' => '4', + 'registrant_to' => '7499', + 'to_number' => '74999', + ), + 603 => + array ( + 'from_number' => '75000', + 'id' => '604', + 'isbn_group_id' => '116', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 604 => + array ( + 'from_number' => '0', + 'id' => '605', + 'isbn_group_id' => '117', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '6', + 'to_number' => '69999', + ), + 605 => + array ( + 'from_number' => '70000', + 'id' => '606', + 'isbn_group_id' => '117', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 606 => + array ( + 'from_number' => '95000', + 'id' => '607', + 'isbn_group_id' => '117', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 607 => + array ( + 'from_number' => '0', + 'id' => '608', + 'isbn_group_id' => '118', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 608 => + array ( + 'from_number' => '40000', + 'id' => '609', + 'isbn_group_id' => '118', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 609 => + array ( + 'from_number' => '90000', + 'id' => '610', + 'isbn_group_id' => '118', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 610 => + array ( + 'from_number' => '0', + 'id' => '611', + 'isbn_group_id' => '119', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '149', + 'to_number' => '14999', + ), + 611 => + array ( + 'from_number' => '15000', + 'id' => '612', + 'isbn_group_id' => '119', + 'registrant_from' => '1500', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 612 => + array ( + 'from_number' => '20000', + 'id' => '613', + 'isbn_group_id' => '119', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 613 => + array ( + 'from_number' => '70000', + 'id' => '614', + 'isbn_group_id' => '119', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7499', + 'to_number' => '74999', + ), + 614 => + array ( + 'from_number' => '75000', + 'id' => '615', + 'isbn_group_id' => '119', + 'registrant_from' => '750', + 'registrant_length' => '3', + 'registrant_to' => '959', + 'to_number' => '95999', + ), + 615 => + array ( + 'from_number' => '96000', + 'id' => '616', + 'isbn_group_id' => '119', + 'registrant_from' => '9600', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 616 => + array ( + 'from_number' => '0', + 'id' => '617', + 'isbn_group_id' => '120', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 617 => + array ( + 'from_number' => '40000', + 'id' => '618', + 'isbn_group_id' => '120', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 618 => + array ( + 'from_number' => '90000', + 'id' => '619', + 'isbn_group_id' => '120', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 619 => + array ( + 'from_number' => '0', + 'id' => '620', + 'isbn_group_id' => '121', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 620 => + array ( + 'from_number' => '50000', + 'id' => '621', + 'isbn_group_id' => '121', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '939', + 'to_number' => '93999', + ), + 621 => + array ( + 'from_number' => '94000', + 'id' => '622', + 'isbn_group_id' => '121', + 'registrant_from' => '9400', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 622 => + array ( + 'from_number' => '0', + 'id' => '623', + 'isbn_group_id' => '122', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 623 => + array ( + 'from_number' => '40000', + 'id' => '624', + 'isbn_group_id' => '122', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 624 => + array ( + 'from_number' => '90000', + 'id' => '625', + 'isbn_group_id' => '122', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 625 => + array ( + 'from_number' => '0', + 'id' => '626', + 'isbn_group_id' => '123', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 626 => + array ( + 'from_number' => '60000', + 'id' => '627', + 'isbn_group_id' => '123', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 627 => + array ( + 'from_number' => '90000', + 'id' => '628', + 'isbn_group_id' => '123', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 628 => + array ( + 'from_number' => '99000', + 'id' => '629', + 'isbn_group_id' => '123', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 629 => + array ( + 'from_number' => '0', + 'id' => '630', + 'isbn_group_id' => '124', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 630 => + array ( + 'from_number' => '10000', + 'id' => '631', + 'isbn_group_id' => '124', + 'registrant_from' => '1', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 631 => + array ( + 'from_number' => '20000', + 'id' => '632', + 'isbn_group_id' => '124', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '249', + 'to_number' => '24999', + ), + 632 => + array ( + 'from_number' => '25000', + 'id' => '633', + 'isbn_group_id' => '124', + 'registrant_from' => '2500', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 633 => + array ( + 'from_number' => '30000', + 'id' => '634', + 'isbn_group_id' => '124', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 634 => + array ( + 'from_number' => '60000', + 'id' => '635', + 'isbn_group_id' => '124', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 635 => + array ( + 'from_number' => '90000', + 'id' => '636', + 'isbn_group_id' => '124', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 636 => + array ( + 'from_number' => '0', + 'id' => '637', + 'isbn_group_id' => '125', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '05', + 'to_number' => '5999', + ), + 637 => + array ( + 'from_number' => '6000', + 'id' => '638', + 'isbn_group_id' => '125', + 'registrant_from' => '060', + 'registrant_length' => '3', + 'registrant_to' => '089', + 'to_number' => '8999', + ), + 638 => + array ( + 'from_number' => '9000', + 'id' => '639', + 'isbn_group_id' => '125', + 'registrant_from' => '0900', + 'registrant_length' => '4', + 'registrant_to' => '0999', + 'to_number' => '9999', + ), + 639 => + array ( + 'from_number' => '10000', + 'id' => '640', + 'isbn_group_id' => '125', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 640 => + array ( + 'from_number' => '70000', + 'id' => '641', + 'isbn_group_id' => '125', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '969', + 'to_number' => '96999', + ), + 641 => + array ( + 'from_number' => '97000', + 'id' => '642', + 'isbn_group_id' => '125', + 'registrant_from' => '9700', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 642 => + array ( + 'from_number' => '0', + 'id' => '643', + 'isbn_group_id' => '126', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 643 => + array ( + 'from_number' => '30000', + 'id' => '644', + 'isbn_group_id' => '126', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 644 => + array ( + 'from_number' => '55000', + 'id' => '645', + 'isbn_group_id' => '126', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '749', + 'to_number' => '74999', + ), + 645 => + array ( + 'from_number' => '75000', + 'id' => '646', + 'isbn_group_id' => '126', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 646 => + array ( + 'from_number' => '95000', + 'id' => '647', + 'isbn_group_id' => '126', + 'registrant_from' => '95', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 647 => + array ( + 'from_number' => '0', + 'id' => '648', + 'isbn_group_id' => '127', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 648 => + array ( + 'from_number' => '10000', + 'id' => '649', + 'isbn_group_id' => '127', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 649 => + array ( + 'from_number' => '40000', + 'id' => '650', + 'isbn_group_id' => '127', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4499', + 'to_number' => '44999', + ), + 650 => + array ( + 'from_number' => '45000', + 'id' => '651', + 'isbn_group_id' => '127', + 'registrant_from' => '45', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 651 => + array ( + 'from_number' => '90000', + 'id' => '652', + 'isbn_group_id' => '127', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 652 => + array ( + 'from_number' => '95000', + 'id' => '653', + 'isbn_group_id' => '127', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 653 => + array ( + 'from_number' => '0', + 'id' => '654', + 'isbn_group_id' => '128', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 654 => + array ( + 'from_number' => '60000', + 'id' => '655', + 'isbn_group_id' => '128', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 655 => + array ( + 'from_number' => '90000', + 'id' => '656', + 'isbn_group_id' => '128', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 656 => + array ( + 'from_number' => '99000', + 'id' => '657', + 'isbn_group_id' => '128', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 657 => + array ( + 'from_number' => '0', + 'id' => '658', + 'isbn_group_id' => '129', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 658 => + array ( + 'from_number' => '90000', + 'id' => '659', + 'isbn_group_id' => '129', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 659 => + array ( + 'from_number' => '99000', + 'id' => '660', + 'isbn_group_id' => '129', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 660 => + array ( + 'from_number' => '0', + 'id' => '661', + 'isbn_group_id' => '130', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 661 => + array ( + 'from_number' => '30000', + 'id' => '662', + 'isbn_group_id' => '130', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 662 => + array ( + 'from_number' => '40000', + 'id' => '663', + 'isbn_group_id' => '130', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 663 => + array ( + 'from_number' => '95000', + 'id' => '664', + 'isbn_group_id' => '130', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 664 => + array ( + 'from_number' => '99000', + 'id' => '665', + 'isbn_group_id' => '130', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 665 => + array ( + 'from_number' => '0', + 'id' => '666', + 'isbn_group_id' => '131', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 666 => + array ( + 'from_number' => '50000', + 'id' => '667', + 'isbn_group_id' => '131', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '64', + 'to_number' => '64999', + ), + 667 => + array ( + 'from_number' => '65000', + 'id' => '668', + 'isbn_group_id' => '131', + 'registrant_from' => '650', + 'registrant_length' => '3', + 'registrant_to' => '659', + 'to_number' => '65999', + ), + 668 => + array ( + 'from_number' => '66000', + 'id' => '669', + 'isbn_group_id' => '131', + 'registrant_from' => '66', + 'registrant_length' => '2', + 'registrant_to' => '75', + 'to_number' => '75999', + ), + 669 => + array ( + 'from_number' => '76000', + 'id' => '670', + 'isbn_group_id' => '131', + 'registrant_from' => '760', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 670 => + array ( + 'from_number' => '90000', + 'id' => '671', + 'isbn_group_id' => '131', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 671 => + array ( + 'from_number' => '0', + 'id' => '672', + 'isbn_group_id' => '132', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 672 => + array ( + 'from_number' => '40000', + 'id' => '673', + 'isbn_group_id' => '132', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 673 => + array ( + 'from_number' => '90000', + 'id' => '674', + 'isbn_group_id' => '132', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 674 => + array ( + 'from_number' => '99000', + 'id' => '675', + 'isbn_group_id' => '132', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 675 => + array ( + 'from_number' => '0', + 'id' => '676', + 'isbn_group_id' => '133', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 676 => + array ( + 'from_number' => '10000', + 'id' => '677', + 'isbn_group_id' => '133', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '159', + 'to_number' => '15999', + ), + 677 => + array ( + 'from_number' => '16000', + 'id' => '678', + 'isbn_group_id' => '133', + 'registrant_from' => '1600', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 678 => + array ( + 'from_number' => '20000', + 'id' => '679', + 'isbn_group_id' => '133', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 679 => + array ( + 'from_number' => '80000', + 'id' => '680', + 'isbn_group_id' => '133', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 680 => + array ( + 'from_number' => '95000', + 'id' => '681', + 'isbn_group_id' => '133', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 681 => + array ( + 'from_number' => '0', + 'id' => '682', + 'isbn_group_id' => '134', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 682 => + array ( + 'from_number' => '80000', + 'id' => '683', + 'isbn_group_id' => '134', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 683 => + array ( + 'from_number' => '99000', + 'id' => '684', + 'isbn_group_id' => '134', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 684 => + array ( + 'from_number' => '80000', + 'id' => '685', + 'isbn_group_id' => '135', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 685 => + array ( + 'from_number' => '95000', + 'id' => '686', + 'isbn_group_id' => '135', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 686 => + array ( + 'from_number' => '99000', + 'id' => '687', + 'isbn_group_id' => '135', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 687 => + array ( + 'from_number' => '0', + 'id' => '688', + 'isbn_group_id' => '136', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 688 => + array ( + 'from_number' => '50000', + 'id' => '689', + 'isbn_group_id' => '136', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 689 => + array ( + 'from_number' => '90000', + 'id' => '690', + 'isbn_group_id' => '136', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 690 => + array ( + 'from_number' => '0', + 'id' => '691', + 'isbn_group_id' => '137', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 691 => + array ( + 'from_number' => '50000', + 'id' => '692', + 'isbn_group_id' => '137', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 692 => + array ( + 'from_number' => '80000', + 'id' => '693', + 'isbn_group_id' => '137', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 693 => + array ( + 'from_number' => '90000', + 'id' => '694', + 'isbn_group_id' => '137', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 694 => + array ( + 'from_number' => '0', + 'id' => '695', + 'isbn_group_id' => '138', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 695 => + array ( + 'from_number' => '40000', + 'id' => '696', + 'isbn_group_id' => '138', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 696 => + array ( + 'from_number' => '90000', + 'id' => '697', + 'isbn_group_id' => '138', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9399', + 'to_number' => '93999', + ), + 697 => + array ( + 'from_number' => '94000', + 'id' => '698', + 'isbn_group_id' => '138', + 'registrant_from' => '940', + 'registrant_length' => '3', + 'registrant_to' => '969', + 'to_number' => '96999', + ), + 698 => + array ( + 'from_number' => '97000', + 'id' => '699', + 'isbn_group_id' => '138', + 'registrant_from' => '97', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 699 => + array ( + 'from_number' => '0', + 'id' => '700', + 'isbn_group_id' => '139', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 700 => + array ( + 'from_number' => '40000', + 'id' => '701', + 'isbn_group_id' => '139', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '879', + 'to_number' => '87999', + ), + 701 => + array ( + 'from_number' => '88000', + 'id' => '702', + 'isbn_group_id' => '139', + 'registrant_from' => '8800', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 702 => + array ( + 'from_number' => '0', + 'id' => '703', + 'isbn_group_id' => '140', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 703 => + array ( + 'from_number' => '30000', + 'id' => '704', + 'isbn_group_id' => '140', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 704 => + array ( + 'from_number' => '55000', + 'id' => '705', + 'isbn_group_id' => '140', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '749', + 'to_number' => '74999', + ), + 705 => + array ( + 'from_number' => '75000', + 'id' => '706', + 'isbn_group_id' => '140', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 706 => + array ( + 'from_number' => '0', + 'id' => '707', + 'isbn_group_id' => '141', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 707 => + array ( + 'from_number' => '10000', + 'id' => '708', + 'isbn_group_id' => '141', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 708 => + array ( + 'from_number' => '20000', + 'id' => '709', + 'isbn_group_id' => '141', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 709 => + array ( + 'from_number' => '30000', + 'id' => '710', + 'isbn_group_id' => '141', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 710 => + array ( + 'from_number' => '60000', + 'id' => '711', + 'isbn_group_id' => '141', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 711 => + array ( + 'from_number' => '95000', + 'id' => '712', + 'isbn_group_id' => '141', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 712 => + array ( + 'from_number' => '0', + 'id' => '713', + 'isbn_group_id' => '142', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 713 => + array ( + 'from_number' => '50000', + 'id' => '714', + 'isbn_group_id' => '142', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 714 => + array ( + 'from_number' => '80000', + 'id' => '715', + 'isbn_group_id' => '142', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 715 => + array ( + 'from_number' => '0', + 'id' => '716', + 'isbn_group_id' => '144', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 716 => + array ( + 'from_number' => '20000', + 'id' => '717', + 'isbn_group_id' => '144', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 717 => + array ( + 'from_number' => '90000', + 'id' => '718', + 'isbn_group_id' => '144', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 718 => + array ( + 'from_number' => '0', + 'id' => '719', + 'isbn_group_id' => '145', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 719 => + array ( + 'from_number' => '60000', + 'id' => '720', + 'isbn_group_id' => '145', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 720 => + array ( + 'from_number' => '90000', + 'id' => '721', + 'isbn_group_id' => '145', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 721 => + array ( + 'from_number' => '0', + 'id' => '722', + 'isbn_group_id' => '146', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 722 => + array ( + 'from_number' => '40000', + 'id' => '723', + 'isbn_group_id' => '146', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 723 => + array ( + 'from_number' => '80000', + 'id' => '724', + 'isbn_group_id' => '146', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 724 => + array ( + 'from_number' => '0', + 'id' => '725', + 'isbn_group_id' => '147', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 725 => + array ( + 'from_number' => '30000', + 'id' => '726', + 'isbn_group_id' => '147', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 726 => + array ( + 'from_number' => '60000', + 'id' => '727', + 'isbn_group_id' => '147', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 727 => + array ( + 'from_number' => '70000', + 'id' => '728', + 'isbn_group_id' => '147', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 728 => + array ( + 'from_number' => '90000', + 'id' => '729', + 'isbn_group_id' => '147', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 729 => + array ( + 'from_number' => '95000', + 'id' => '730', + 'isbn_group_id' => '147', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 730 => + array ( + 'from_number' => '0', + 'id' => '731', + 'isbn_group_id' => '148', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 731 => + array ( + 'from_number' => '10000', + 'id' => '732', + 'isbn_group_id' => '148', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 732 => + array ( + 'from_number' => '90000', + 'id' => '733', + 'isbn_group_id' => '148', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 733 => + array ( + 'from_number' => '0', + 'id' => '734', + 'isbn_group_id' => '149', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 734 => + array ( + 'from_number' => '40000', + 'id' => '735', + 'isbn_group_id' => '149', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 735 => + array ( + 'from_number' => '95000', + 'id' => '736', + 'isbn_group_id' => '149', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 736 => + array ( + 'from_number' => '0', + 'id' => '737', + 'isbn_group_id' => '150', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 737 => + array ( + 'from_number' => '30000', + 'id' => '738', + 'isbn_group_id' => '150', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 738 => + array ( + 'from_number' => '90000', + 'id' => '739', + 'isbn_group_id' => '150', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 739 => + array ( + 'from_number' => '0', + 'id' => '740', + 'isbn_group_id' => '151', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 740 => + array ( + 'from_number' => '60000', + 'id' => '741', + 'isbn_group_id' => '151', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 741 => + array ( + 'from_number' => '0', + 'id' => '742', + 'isbn_group_id' => '152', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 742 => + array ( + 'from_number' => '40000', + 'id' => '743', + 'isbn_group_id' => '152', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 743 => + array ( + 'from_number' => '60000', + 'id' => '744', + 'isbn_group_id' => '152', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 744 => + array ( + 'from_number' => '90000', + 'id' => '745', + 'isbn_group_id' => '152', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 745 => + array ( + 'from_number' => '0', + 'id' => '746', + 'isbn_group_id' => '153', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 746 => + array ( + 'from_number' => '30000', + 'id' => '747', + 'isbn_group_id' => '153', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '35', + 'to_number' => '35999', + ), + 747 => + array ( + 'from_number' => '60000', + 'id' => '748', + 'isbn_group_id' => '153', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '604', + 'to_number' => '60499', + ), + 748 => + array ( + 'from_number' => '0', + 'id' => '749', + 'isbn_group_id' => '154', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 749 => + array ( + 'from_number' => '50000', + 'id' => '750', + 'isbn_group_id' => '154', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 750 => + array ( + 'from_number' => '90000', + 'id' => '751', + 'isbn_group_id' => '154', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 751 => + array ( + 'from_number' => '0', + 'id' => '752', + 'isbn_group_id' => '155', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 752 => + array ( + 'from_number' => '50000', + 'id' => '753', + 'isbn_group_id' => '155', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 753 => + array ( + 'from_number' => '80000', + 'id' => '754', + 'isbn_group_id' => '155', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 754 => + array ( + 'from_number' => '0', + 'id' => '755', + 'isbn_group_id' => '156', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 755 => + array ( + 'from_number' => '30000', + 'id' => '756', + 'isbn_group_id' => '156', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 756 => + array ( + 'from_number' => '70000', + 'id' => '757', + 'isbn_group_id' => '156', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 757 => + array ( + 'from_number' => '0', + 'id' => '758', + 'isbn_group_id' => '157', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 758 => + array ( + 'from_number' => '30000', + 'id' => '759', + 'isbn_group_id' => '157', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 759 => + array ( + 'from_number' => '90000', + 'id' => '760', + 'isbn_group_id' => '157', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 760 => + array ( + 'from_number' => '0', + 'id' => '761', + 'isbn_group_id' => '158', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 761 => + array ( + 'from_number' => '40000', + 'id' => '762', + 'isbn_group_id' => '158', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 762 => + array ( + 'from_number' => '80000', + 'id' => '763', + 'isbn_group_id' => '158', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 763 => + array ( + 'from_number' => '0', + 'id' => '764', + 'isbn_group_id' => '159', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 764 => + array ( + 'from_number' => '30000', + 'id' => '765', + 'isbn_group_id' => '159', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 765 => + array ( + 'from_number' => '40000', + 'id' => '766', + 'isbn_group_id' => '159', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 766 => + array ( + 'from_number' => '90000', + 'id' => '767', + 'isbn_group_id' => '159', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 767 => + array ( + 'from_number' => '0', + 'id' => '768', + 'isbn_group_id' => '160', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 768 => + array ( + 'from_number' => '50000', + 'id' => '769', + 'isbn_group_id' => '160', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 769 => + array ( + 'from_number' => '90000', + 'id' => '770', + 'isbn_group_id' => '160', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 770 => + array ( + 'from_number' => '0', + 'id' => '771', + 'isbn_group_id' => '161', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 771 => + array ( + 'from_number' => '20000', + 'id' => '772', + 'isbn_group_id' => '161', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 772 => + array ( + 'from_number' => '70000', + 'id' => '773', + 'isbn_group_id' => '161', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 773 => + array ( + 'from_number' => '80000', + 'id' => '774', + 'isbn_group_id' => '161', + 'registrant_from' => '8', + 'registrant_length' => '1', + 'registrant_to' => '8', + 'to_number' => '89999', + ), + 774 => + array ( + 'from_number' => '90000', + 'id' => '775', + 'isbn_group_id' => '161', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 775 => + array ( + 'from_number' => '0', + 'id' => '776', + 'isbn_group_id' => '162', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 776 => + array ( + 'from_number' => '40000', + 'id' => '777', + 'isbn_group_id' => '162', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 777 => + array ( + 'from_number' => '70000', + 'id' => '778', + 'isbn_group_id' => '162', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 778 => + array ( + 'from_number' => '0', + 'id' => '779', + 'isbn_group_id' => '163', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 779 => + array ( + 'from_number' => '20000', + 'id' => '780', + 'isbn_group_id' => '163', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 780 => + array ( + 'from_number' => '80000', + 'id' => '781', + 'isbn_group_id' => '163', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 781 => + array ( + 'from_number' => '0', + 'id' => '782', + 'isbn_group_id' => '164', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 782 => + array ( + 'from_number' => '20000', + 'id' => '783', + 'isbn_group_id' => '164', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 783 => + array ( + 'from_number' => '80000', + 'id' => '784', + 'isbn_group_id' => '164', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 784 => + array ( + 'from_number' => '0', + 'id' => '785', + 'isbn_group_id' => '165', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 785 => + array ( + 'from_number' => '40000', + 'id' => '786', + 'isbn_group_id' => '165', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 786 => + array ( + 'from_number' => '80000', + 'id' => '787', + 'isbn_group_id' => '165', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 787 => + array ( + 'from_number' => '0', + 'id' => '788', + 'isbn_group_id' => '166', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 788 => + array ( + 'from_number' => '10000', + 'id' => '789', + 'isbn_group_id' => '166', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 789 => + array ( + 'from_number' => '60000', + 'id' => '790', + 'isbn_group_id' => '166', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 790 => + array ( + 'from_number' => '0', + 'id' => '791', + 'isbn_group_id' => '167', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 791 => + array ( + 'from_number' => '30000', + 'id' => '792', + 'isbn_group_id' => '167', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 792 => + array ( + 'from_number' => '60000', + 'id' => '793', + 'isbn_group_id' => '167', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 793 => + array ( + 'from_number' => '0', + 'id' => '794', + 'isbn_group_id' => '168', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 794 => + array ( + 'from_number' => '10000', + 'id' => '795', + 'isbn_group_id' => '168', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 795 => + array ( + 'from_number' => '80000', + 'id' => '796', + 'isbn_group_id' => '168', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 796 => + array ( + 'from_number' => '0', + 'id' => '797', + 'isbn_group_id' => '169', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 797 => + array ( + 'from_number' => '50000', + 'id' => '798', + 'isbn_group_id' => '169', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 798 => + array ( + 'from_number' => '80000', + 'id' => '799', + 'isbn_group_id' => '169', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 799 => + array ( + 'from_number' => '0', + 'id' => '800', + 'isbn_group_id' => '170', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 800 => + array ( + 'from_number' => '50000', + 'id' => '801', + 'isbn_group_id' => '170', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 801 => + array ( + 'from_number' => '80000', + 'id' => '802', + 'isbn_group_id' => '170', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 802 => + array ( + 'from_number' => '0', + 'id' => '803', + 'isbn_group_id' => '171', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 803 => + array ( + 'from_number' => '50000', + 'id' => '804', + 'isbn_group_id' => '171', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 804 => + array ( + 'from_number' => '80000', + 'id' => '805', + 'isbn_group_id' => '171', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 805 => + array ( + 'from_number' => '0', + 'id' => '806', + 'isbn_group_id' => '172', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 806 => + array ( + 'from_number' => '10000', + 'id' => '807', + 'isbn_group_id' => '172', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 807 => + array ( + 'from_number' => '60000', + 'id' => '808', + 'isbn_group_id' => '172', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 808 => + array ( + 'from_number' => '70000', + 'id' => '809', + 'isbn_group_id' => '172', + 'registrant_from' => '7', + 'registrant_length' => '1', + 'registrant_to' => '7', + 'to_number' => '79999', + ), + 809 => + array ( + 'from_number' => '80000', + 'id' => '810', + 'isbn_group_id' => '172', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 810 => + array ( + 'from_number' => '0', + 'id' => '811', + 'isbn_group_id' => '173', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 811 => + array ( + 'from_number' => '30000', + 'id' => '812', + 'isbn_group_id' => '173', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 812 => + array ( + 'from_number' => '60000', + 'id' => '813', + 'isbn_group_id' => '173', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 813 => + array ( + 'from_number' => '0', + 'id' => '814', + 'isbn_group_id' => '174', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 814 => + array ( + 'from_number' => '20000', + 'id' => '815', + 'isbn_group_id' => '174', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 815 => + array ( + 'from_number' => '80000', + 'id' => '816', + 'isbn_group_id' => '174', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 816 => + array ( + 'from_number' => '0', + 'id' => '817', + 'isbn_group_id' => '175', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 817 => + array ( + 'from_number' => '30000', + 'id' => '818', + 'isbn_group_id' => '175', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 818 => + array ( + 'from_number' => '60000', + 'id' => '819', + 'isbn_group_id' => '175', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 819 => + array ( + 'from_number' => '70000', + 'id' => '820', + 'isbn_group_id' => '175', + 'registrant_from' => '7', + 'registrant_length' => '1', + 'registrant_to' => '8', + 'to_number' => '89999', + ), + 820 => + array ( + 'from_number' => '90000', + 'id' => '821', + 'isbn_group_id' => '175', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 821 => + array ( + 'from_number' => '0', + 'id' => '822', + 'isbn_group_id' => '176', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 822 => + array ( + 'from_number' => '10000', + 'id' => '823', + 'isbn_group_id' => '176', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 823 => + array ( + 'from_number' => '60000', + 'id' => '824', + 'isbn_group_id' => '176', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 824 => + array ( + 'from_number' => '0', + 'id' => '825', + 'isbn_group_id' => '177', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 825 => + array ( + 'from_number' => '20000', + 'id' => '826', + 'isbn_group_id' => '177', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 826 => + array ( + 'from_number' => '60000', + 'id' => '827', + 'isbn_group_id' => '177', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 827 => + array ( + 'from_number' => '0', + 'id' => '828', + 'isbn_group_id' => '178', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 828 => + array ( + 'from_number' => '20000', + 'id' => '829', + 'isbn_group_id' => '178', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 829 => + array ( + 'from_number' => '60000', + 'id' => '830', + 'isbn_group_id' => '178', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 830 => + array ( + 'from_number' => '90000', + 'id' => '831', + 'isbn_group_id' => '178', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 831 => + array ( + 'from_number' => '0', + 'id' => '832', + 'isbn_group_id' => '179', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 832 => + array ( + 'from_number' => '60000', + 'id' => '833', + 'isbn_group_id' => '179', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 833 => + array ( + 'from_number' => '90000', + 'id' => '834', + 'isbn_group_id' => '179', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 834 => + array ( + 'from_number' => '0', + 'id' => '835', + 'isbn_group_id' => '180', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 835 => + array ( + 'from_number' => '10000', + 'id' => '836', + 'isbn_group_id' => '180', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 836 => + array ( + 'from_number' => '70000', + 'id' => '837', + 'isbn_group_id' => '180', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 837 => + array ( + 'from_number' => '0', + 'id' => '838', + 'isbn_group_id' => '181', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 838 => + array ( + 'from_number' => '30000', + 'id' => '839', + 'isbn_group_id' => '181', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 839 => + array ( + 'from_number' => '80000', + 'id' => '840', + 'isbn_group_id' => '181', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 840 => + array ( + 'from_number' => '0', + 'id' => '841', + 'isbn_group_id' => '182', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 841 => + array ( + 'from_number' => '50000', + 'id' => '842', + 'isbn_group_id' => '182', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 842 => + array ( + 'from_number' => '80000', + 'id' => '843', + 'isbn_group_id' => '182', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 843 => + array ( + 'from_number' => '0', + 'id' => '844', + 'isbn_group_id' => '183', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 844 => + array ( + 'from_number' => '30000', + 'id' => '845', + 'isbn_group_id' => '183', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 845 => + array ( + 'from_number' => '60000', + 'id' => '846', + 'isbn_group_id' => '183', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 846 => + array ( + 'from_number' => '0', + 'id' => '847', + 'isbn_group_id' => '184', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 847 => + array ( + 'from_number' => '50000', + 'id' => '848', + 'isbn_group_id' => '184', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 848 => + array ( + 'from_number' => '80000', + 'id' => '849', + 'isbn_group_id' => '184', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 849 => + array ( + 'from_number' => '0', + 'id' => '850', + 'isbn_group_id' => '185', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 850 => + array ( + 'from_number' => '60000', + 'id' => '851', + 'isbn_group_id' => '185', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 851 => + array ( + 'from_number' => '90000', + 'id' => '852', + 'isbn_group_id' => '185', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 852 => + array ( + 'from_number' => '0', + 'id' => '853', + 'isbn_group_id' => '186', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 853 => + array ( + 'from_number' => '30000', + 'id' => '854', + 'isbn_group_id' => '186', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 854 => + array ( + 'from_number' => '60000', + 'id' => '855', + 'isbn_group_id' => '186', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 855 => + array ( + 'from_number' => '0', + 'id' => '856', + 'isbn_group_id' => '187', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 856 => + array ( + 'from_number' => '30000', + 'id' => '857', + 'isbn_group_id' => '187', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 857 => + array ( + 'from_number' => '70000', + 'id' => '858', + 'isbn_group_id' => '187', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 858 => + array ( + 'from_number' => '0', + 'id' => '859', + 'isbn_group_id' => '188', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 859 => + array ( + 'from_number' => '50000', + 'id' => '860', + 'isbn_group_id' => '188', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 860 => + array ( + 'from_number' => '80000', + 'id' => '861', + 'isbn_group_id' => '188', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 861 => + array ( + 'from_number' => '0', + 'id' => '862', + 'isbn_group_id' => '189', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 862 => + array ( + 'from_number' => '20000', + 'id' => '863', + 'isbn_group_id' => '189', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 863 => + array ( + 'from_number' => '90000', + 'id' => '864', + 'isbn_group_id' => '189', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 864 => + array ( + 'from_number' => '0', + 'id' => '865', + 'isbn_group_id' => '190', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 865 => + array ( + 'from_number' => '50000', + 'id' => '866', + 'isbn_group_id' => '190', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 866 => + array ( + 'from_number' => '80000', + 'id' => '867', + 'isbn_group_id' => '190', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 867 => + array ( + 'from_number' => '0', + 'id' => '868', + 'isbn_group_id' => '192', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 868 => + array ( + 'from_number' => '50000', + 'id' => '869', + 'isbn_group_id' => '192', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 869 => + array ( + 'from_number' => '80000', + 'id' => '870', + 'isbn_group_id' => '192', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 870 => + array ( + 'from_number' => '0', + 'id' => '871', + 'isbn_group_id' => '193', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 871 => + array ( + 'from_number' => '30000', + 'id' => '872', + 'isbn_group_id' => '193', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 872 => + array ( + 'from_number' => '80000', + 'id' => '873', + 'isbn_group_id' => '193', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '939', + 'to_number' => '93999', + ), + 873 => + array ( + 'from_number' => '94000', + 'id' => '874', + 'isbn_group_id' => '193', + 'registrant_from' => '94', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 874 => + array ( + 'from_number' => '0', + 'id' => '875', + 'isbn_group_id' => '194', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 875 => + array ( + 'from_number' => '30000', + 'id' => '876', + 'isbn_group_id' => '194', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 876 => + array ( + 'from_number' => '70000', + 'id' => '877', + 'isbn_group_id' => '194', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 877 => + array ( + 'from_number' => '0', + 'id' => '878', + 'isbn_group_id' => '195', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 878 => + array ( + 'from_number' => '20000', + 'id' => '879', + 'isbn_group_id' => '195', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 879 => + array ( + 'from_number' => '60000', + 'id' => '880', + 'isbn_group_id' => '195', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 880 => + array ( + 'from_number' => '80000', + 'id' => '881', + 'isbn_group_id' => '195', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 881 => + array ( + 'from_number' => '90000', + 'id' => '882', + 'isbn_group_id' => '195', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 882 => + array ( + 'from_number' => '0', + 'id' => '883', + 'isbn_group_id' => '196', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 883 => + array ( + 'from_number' => '60000', + 'id' => '884', + 'isbn_group_id' => '196', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '859', + 'to_number' => '85999', + ), + 884 => + array ( + 'from_number' => '86000', + 'id' => '885', + 'isbn_group_id' => '196', + 'registrant_from' => '86', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 885 => + array ( + 'from_number' => '0', + 'id' => '886', + 'isbn_group_id' => '197', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 886 => + array ( + 'from_number' => '20000', + 'id' => '887', + 'isbn_group_id' => '197', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 887 => + array ( + 'from_number' => '80000', + 'id' => '888', + 'isbn_group_id' => '197', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 888 => + array ( + 'from_number' => '0', + 'id' => '889', + 'isbn_group_id' => '198', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 889 => + array ( + 'from_number' => '50000', + 'id' => '890', + 'isbn_group_id' => '198', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 890 => + array ( + 'from_number' => '95000', + 'id' => '891', + 'isbn_group_id' => '198', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 891 => + array ( + 'from_number' => '0', + 'id' => '892', + 'isbn_group_id' => '199', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 892 => + array ( + 'from_number' => '30000', + 'id' => '893', + 'isbn_group_id' => '199', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 893 => + array ( + 'from_number' => '60000', + 'id' => '894', + 'isbn_group_id' => '199', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 894 => + array ( + 'from_number' => '0', + 'id' => '895', + 'isbn_group_id' => '200', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 895 => + array ( + 'from_number' => '10000', + 'id' => '896', + 'isbn_group_id' => '200', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 896 => + array ( + 'from_number' => '95000', + 'id' => '897', + 'isbn_group_id' => '200', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 897 => + array ( + 'from_number' => '0', + 'id' => '898', + 'isbn_group_id' => '201', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 898 => + array ( + 'from_number' => '40000', + 'id' => '899', + 'isbn_group_id' => '201', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 899 => + array ( + 'from_number' => '90000', + 'id' => '900', + 'isbn_group_id' => '201', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 900 => + array ( + 'from_number' => '0', + 'id' => '901', + 'isbn_group_id' => '202', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 901 => + array ( + 'from_number' => '50000', + 'id' => '902', + 'isbn_group_id' => '202', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 902 => + array ( + 'from_number' => '80000', + 'id' => '903', + 'isbn_group_id' => '202', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 903 => + array ( + 'from_number' => '0', + 'id' => '904', + 'isbn_group_id' => '203', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 904 => + array ( + 'from_number' => '50000', + 'id' => '905', + 'isbn_group_id' => '203', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 905 => + array ( + 'from_number' => '0', + 'id' => '906', + 'isbn_group_id' => '204', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 906 => + array ( + 'from_number' => '20000', + 'id' => '907', + 'isbn_group_id' => '204', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 907 => + array ( + 'from_number' => '80000', + 'id' => '908', + 'isbn_group_id' => '204', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 908 => + array ( + 'from_number' => '0', + 'id' => '909', + 'isbn_group_id' => '205', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 909 => + array ( + 'from_number' => '40000', + 'id' => '910', + 'isbn_group_id' => '205', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 910 => + array ( + 'from_number' => '80000', + 'id' => '911', + 'isbn_group_id' => '205', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 911 => + array ( + 'from_number' => '0', + 'id' => '912', + 'isbn_group_id' => '206', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 912 => + array ( + 'from_number' => '30000', + 'id' => '913', + 'isbn_group_id' => '206', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 913 => + array ( + 'from_number' => '70000', + 'id' => '914', + 'isbn_group_id' => '206', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 914 => + array ( + 'from_number' => '0', + 'id' => '915', + 'isbn_group_id' => '207', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 915 => + array ( + 'from_number' => '20000', + 'id' => '916', + 'isbn_group_id' => '207', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 916 => + array ( + 'from_number' => '60000', + 'id' => '917', + 'isbn_group_id' => '207', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 917 => + array ( + 'from_number' => '0', + 'id' => '918', + 'isbn_group_id' => '208', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 918 => + array ( + 'from_number' => '40000', + 'id' => '919', + 'isbn_group_id' => '208', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 919 => + array ( + 'from_number' => '60000', + 'id' => '920', + 'isbn_group_id' => '208', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 920 => + array ( + 'from_number' => '90000', + 'id' => '921', + 'isbn_group_id' => '208', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 921 => + array ( + 'from_number' => '0', + 'id' => '922', + 'isbn_group_id' => '209', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 922 => + array ( + 'from_number' => '20000', + 'id' => '923', + 'isbn_group_id' => '209', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 923 => + array ( + 'from_number' => '70000', + 'id' => '924', + 'isbn_group_id' => '209', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 924 => + array ( + 'from_number' => '90000', + 'id' => '925', + 'isbn_group_id' => '209', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '97599', + 'to_number' => '97599', + ), + 925 => + array ( + 'from_number' => '97600', + 'id' => '926', + 'isbn_group_id' => '209', + 'registrant_from' => '976000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), +), +'ezkeyword' => +array ( +), +'ezkeyword_attribute_link' => +array ( +), +'ezm_block' => +array ( +), +'ezm_pool' => +array ( +), +'ezmedia' => +array ( +), +'ezmessage' => +array ( +), +'ezmodule_run' => +array ( +), +'ezmultipricedata' => +array ( +), +'eznode_assignment' => +array ( + 0 => + array ( + 'contentobject_id' => '8', + 'contentobject_version' => '2', + 'from_node_id' => '0', + 'id' => '4', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => + array ( + 'contentobject_id' => '42', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '5', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 2 => + array ( + 'contentobject_id' => '10', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '6', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '44', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 3 => + array ( + 'contentobject_id' => '4', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '7', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => + array ( + 'contentobject_id' => '12', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '8', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => + array ( + 'contentobject_id' => '13', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '9', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => + array ( + 'contentobject_id' => '41', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '11', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => + array ( + 'contentobject_id' => '11', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '12', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 8 => + array ( + 'contentobject_id' => '45', + 'contentobject_version' => '1', + 'from_node_id' => '-1', + 'id' => '16', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => + array ( + 'contentobject_id' => '49', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '27', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => + array ( + 'contentobject_id' => '50', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '28', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => + array ( + 'contentobject_id' => '51', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '29', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => + array ( + 'contentobject_id' => '52', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '30', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '48', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 13 => + array ( + 'contentobject_id' => '56', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '34', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 14 => + array ( + 'contentobject_id' => '14', + 'contentobject_version' => '3', + 'from_node_id' => '-1', + 'id' => '38', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '13', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => + array ( + 'contentobject_id' => '54', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '39', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '58', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => + array ( + 'contentobject_id' => '57', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '43', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '07cdfd23373b17c6b337251c22b7ea57', + 'remote_id' => '0', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 17 => + array ( + 'contentobject_id' => '58', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '44', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '86bf306624668ee9b8b979b0d56f7e0d', + 'remote_id' => '0', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 18 => + array ( + 'contentobject_id' => '14', + 'contentobject_version' => '4', + 'from_node_id' => '-1', + 'id' => '45', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '13', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 19 => + array ( + 'contentobject_id' => '59', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '46', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 20 => + array ( + 'contentobject_id' => '11', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '47', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), +), +'eznotificationcollection' => +array ( +), +'eznotificationcollection_item' => +array ( +), +'eznotificationevent' => +array ( + 0 => + array ( + 'data_int1' => '57', + 'data_int2' => '1', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '1', + 'status' => '0', + ), + 1 => + array ( + 'data_int1' => '58', + 'data_int2' => '1', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '2', + 'status' => '0', + ), + 2 => + array ( + 'data_int1' => '14', + 'data_int2' => '4', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '3', + 'status' => '0', + ), + 3 => + array ( + 'data_int1' => '59', + 'data_int2' => '1', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '4', + 'status' => '0', + ), + 4 => + array ( + 'data_int1' => '11', + 'data_int2' => '2', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '5', + 'status' => '0', + ), +), +'ezoperation_memento' => +array ( +), +'ezorder' => +array ( +), +'ezorder_item' => +array ( +), +'ezorder_nr_incr' => +array ( +), +'ezorder_status' => +array ( + 0 => + array ( + 'id' => '1', + 'is_active' => '1', + 'name' => 'Pending', + 'status_id' => '1', + ), + 1 => + array ( + 'id' => '2', + 'is_active' => '1', + 'name' => 'Processing', + 'status_id' => '2', + ), + 2 => + array ( + 'id' => '3', + 'is_active' => '1', + 'name' => 'Delivered', + 'status_id' => '3', + ), +), +'ezorder_status_history' => +array ( +), +'ezpackage' => +array ( + 0 => + array ( + 'id' => '1', + 'install_date' => '1301057838', + 'name' => 'plain_site_data', + 'version' => '1.0-1', + ), + 1 => + array ( + 'id' => '2', + 'install_date' => '1343140526', + 'name' => 'ezwt_extension', + 'version' => '1.6-0', + ), + 2 => + array ( + 'id' => '3', + 'install_date' => '1343140527', + 'name' => 'ezstarrating_extension', + 'version' => '1.5-0', + ), + 3 => + array ( + 'id' => '4', + 'install_date' => '1343140527', + 'name' => 'ezgmaplocation_extension', + 'version' => '1.5-0', + ), + 4 => + array ( + 'id' => '5', + 'install_date' => '1343140529', + 'name' => 'ezdemo_extension', + 'version' => '1.0-0', + ), + 5 => + array ( + 'id' => '6', + 'install_date' => '1343140532', + 'name' => 'ezflow_extension', + 'version' => '2.5-0', + ), + 6 => + array ( + 'id' => '7', + 'install_date' => '1343140534', + 'name' => 'ezcomments_extension', + 'version' => '1.4-0', + ), + 7 => + array ( + 'id' => '8', + 'install_date' => '1343140537', + 'name' => 'ezdemo_classes', + 'version' => '1.0-0', + ), + 8 => + array ( + 'id' => '9', + 'install_date' => '1343140539', + 'name' => 'ezdemo_democontent_clean', + 'version' => '1.0-0', + ), +), +'ezpaymentobject' => +array ( +), +'ezpdf_export' => +array ( +), +'ezpending_actions' => +array ( +), */ +'ezpolicy' => +array ( + 0 => + array ( + 'function_name' => '*', + 'id' => '308', + 'module_name' => '*', + 'original_id' => '0', + 'role_id' => '2', + ), + 1 => + array ( + 'function_name' => 'login', + 'id' => '319', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '3', + ), + 2 => + array ( + 'function_name' => 'read', + 'id' => '328', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 3 => + array ( + 'function_name' => 'pdf', + 'id' => '329', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 4 => + array ( + 'function_name' => '*', + 'id' => '330', + 'module_name' => 'ezoe', + 'original_id' => '0', + 'role_id' => '3', + ), + 5 => + array ( + 'function_name' => '*', + 'id' => '332', + 'module_name' => 'ezoe', + 'original_id' => '0', + 'role_id' => '3', + ), + 6 => + array ( + 'function_name' => 'feed', + 'id' => '333', + 'module_name' => 'rss', + 'original_id' => '0', + 'role_id' => '1', + ), + 7 => + array ( + 'function_name' => 'login', + 'id' => '334', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 8 => + array ( + 'function_name' => 'login', + 'id' => '335', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 9 => + array ( + 'function_name' => 'login', + 'id' => '336', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 10 => + array ( + 'function_name' => 'login', + 'id' => '337', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 11 => + array ( + 'function_name' => 'read', + 'id' => '338', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 12 => + array ( + 'function_name' => 'create', + 'id' => '339', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 13 => + array ( + 'function_name' => 'create', + 'id' => '340', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 14 => + array ( + 'function_name' => 'create', + 'id' => '341', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 15 => + array ( + 'function_name' => 'create', + 'id' => '342', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 16 => + array ( + 'function_name' => 'create', + 'id' => '343', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 17 => + array ( + 'function_name' => 'create', + 'id' => '344', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 18 => + array ( + 'function_name' => 'use', + 'id' => '345', + 'module_name' => 'websitetoolbar', + 'original_id' => '0', + 'role_id' => '3', + ), + 19 => + array ( + 'function_name' => 'edit', + 'id' => '346', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 20 => + array ( + 'function_name' => 'read', + 'id' => '347', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 21 => + array ( + 'function_name' => 'use', + 'id' => '348', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '3', + ), + 22 => + array ( + 'function_name' => 'manage_locations', + 'id' => '349', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 23 => + array ( + 'function_name' => '*', + 'id' => '350', + 'module_name' => 'ezodf', + 'original_id' => '0', + 'role_id' => '3', + ), + 24 => + array ( + 'function_name' => '*', + 'id' => '351', + 'module_name' => 'ezflow', + 'original_id' => '0', + 'role_id' => '3', + ), + 25 => + array ( + 'function_name' => '*', + 'id' => '352', + 'module_name' => 'ezajax', + 'original_id' => '0', + 'role_id' => '3', + ), + 26 => + array ( + 'function_name' => 'diff', + 'id' => '353', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 27 => + array ( + 'function_name' => 'versionread', + 'id' => '354', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 28 => + array ( + 'function_name' => 'versionremove', + 'id' => '355', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 29 => + array ( + 'function_name' => 'remove', + 'id' => '356', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 30 => + array ( + 'function_name' => 'translate', + 'id' => '357', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 31 => + array ( + 'function_name' => 'feed', + 'id' => '358', + 'module_name' => 'rss', + 'original_id' => '0', + 'role_id' => '3', + ), + 32 => + array ( + 'function_name' => 'bookmark', + 'id' => '359', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 33 => + array ( + 'function_name' => 'pendinglist', + 'id' => '360', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 34 => + array ( + 'function_name' => 'dashboard', + 'id' => '361', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 35 => + array ( + 'function_name' => 'view_embed', + 'id' => '362', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 36 => + array ( + 'function_name' => 'read', + 'id' => '363', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 37 => + array ( + 'function_name' => 'create', + 'id' => '364', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 38 => + array ( + 'function_name' => 'create', + 'id' => '365', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 39 => + array ( + 'function_name' => 'create', + 'id' => '366', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 40 => + array ( + 'function_name' => 'edit', + 'id' => '367', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 41 => + array ( + 'function_name' => 'selfedit', + 'id' => '368', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '4', + ), + 42 => + array ( + 'function_name' => 'use', + 'id' => '369', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '4', + ), + 43 => + array ( + 'function_name' => 'create', + 'id' => '370', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 44 => + array ( + 'function_name' => 'create', + 'id' => '371', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 45 => + array ( + 'function_name' => 'create', + 'id' => '372', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 46 => + array ( + 'function_name' => 'edit', + 'id' => '373', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 47 => + array ( + 'function_name' => 'selfedit', + 'id' => '374', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '5', + ), + 48 => + array ( + 'function_name' => 'use', + 'id' => '375', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '5', + ), + 49 => + array ( + 'function_name' => 'password', + 'id' => '376', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '5', + ), + 50 => + array ( + 'function_name' => 'call', + 'id' => '377', + 'module_name' => 'ezjscore', + 'original_id' => '0', + 'role_id' => '5', + ), +), +'ezpolicy_limitation' => +array ( + 0 => + array ( + 'id' => '251', + 'identifier' => 'Section', + 'policy_id' => '328', + ), + 1 => + array ( + 'id' => '252', + 'identifier' => 'Section', + 'policy_id' => '329', + ), + 2 => + array ( + 'id' => '254', + 'identifier' => 'SiteAccess', + 'policy_id' => '334', + ), + 3 => + array ( + 'id' => '255', + 'identifier' => 'SiteAccess', + 'policy_id' => '335', + ), + 4 => + array ( + 'id' => '256', + 'identifier' => 'SiteAccess', + 'policy_id' => '336', + ), + 5 => + array ( + 'id' => '257', + 'identifier' => 'SiteAccess', + 'policy_id' => '337', + ), + 6 => + array ( + 'id' => '258', + 'identifier' => 'Class', + 'policy_id' => '338', + ), + 7 => + array ( + 'id' => '259', + 'identifier' => 'Section', + 'policy_id' => '338', + ), + 8 => + array ( + 'id' => '260', + 'identifier' => 'Class', + 'policy_id' => '339', + ), + 9 => + array ( + 'id' => '261', + 'identifier' => 'ParentClass', + 'policy_id' => '339', + ), + 10 => + array ( + 'id' => '262', + 'identifier' => 'Class', + 'policy_id' => '340', + ), + 11 => + array ( + 'id' => '263', + 'identifier' => 'ParentClass', + 'policy_id' => '340', + ), + 12 => + array ( + 'id' => '264', + 'identifier' => 'Class', + 'policy_id' => '341', + ), + 13 => + array ( + 'id' => '265', + 'identifier' => 'ParentClass', + 'policy_id' => '341', + ), + 14 => + array ( + 'id' => '266', + 'identifier' => 'Class', + 'policy_id' => '342', + ), + 15 => + array ( + 'id' => '267', + 'identifier' => 'ParentClass', + 'policy_id' => '342', + ), + 16 => + array ( + 'id' => '268', + 'identifier' => 'Class', + 'policy_id' => '343', + ), + 17 => + array ( + 'id' => '269', + 'identifier' => 'ParentClass', + 'policy_id' => '343', + ), + 18 => + array ( + 'id' => '270', + 'identifier' => 'Class', + 'policy_id' => '344', + ), + 19 => + array ( + 'id' => '271', + 'identifier' => 'ParentClass', + 'policy_id' => '344', + ), + 20 => + array ( + 'id' => '272', + 'identifier' => 'Class', + 'policy_id' => '345', + ), + 21 => + array ( + 'id' => '273', + 'identifier' => 'Section', + 'policy_id' => '347', + ), + 22 => + array ( + 'id' => '274', + 'identifier' => 'Section', + 'policy_id' => '363', + ), + 23 => + array ( + 'id' => '275', + 'identifier' => 'Class', + 'policy_id' => '364', + ), + 24 => + array ( + 'id' => '276', + 'identifier' => 'Section', + 'policy_id' => '364', + ), + 25 => + array ( + 'id' => '277', + 'identifier' => 'ParentClass', + 'policy_id' => '364', + ), + 26 => + array ( + 'id' => '278', + 'identifier' => 'Class', + 'policy_id' => '365', + ), + 27 => + array ( + 'id' => '279', + 'identifier' => 'Section', + 'policy_id' => '365', + ), + 28 => + array ( + 'id' => '280', + 'identifier' => 'ParentClass', + 'policy_id' => '365', + ), + 29 => + array ( + 'id' => '281', + 'identifier' => 'Class', + 'policy_id' => '366', + ), + 30 => + array ( + 'id' => '282', + 'identifier' => 'Section', + 'policy_id' => '366', + ), + 31 => + array ( + 'id' => '283', + 'identifier' => 'ParentClass', + 'policy_id' => '366', + ), + 32 => + array ( + 'id' => '284', + 'identifier' => 'Class', + 'policy_id' => '367', + ), + 33 => + array ( + 'id' => '285', + 'identifier' => 'Section', + 'policy_id' => '367', + ), + 34 => + array ( + 'id' => '286', + 'identifier' => 'Owner', + 'policy_id' => '367', + ), + 35 => + array ( + 'id' => '287', + 'identifier' => 'Class', + 'policy_id' => '370', + ), + 36 => + array ( + 'id' => '288', + 'identifier' => 'Section', + 'policy_id' => '370', + ), + 37 => + array ( + 'id' => '289', + 'identifier' => 'ParentClass', + 'policy_id' => '370', + ), + 38 => + array ( + 'id' => '290', + 'identifier' => 'Class', + 'policy_id' => '371', + ), + 39 => + array ( + 'id' => '291', + 'identifier' => 'Section', + 'policy_id' => '371', + ), + 40 => + array ( + 'id' => '292', + 'identifier' => 'ParentClass', + 'policy_id' => '371', + ), + 41 => + array ( + 'id' => '293', + 'identifier' => 'Class', + 'policy_id' => '372', + ), + 42 => + array ( + 'id' => '294', + 'identifier' => 'Section', + 'policy_id' => '372', + ), + 43 => + array ( + 'id' => '295', + 'identifier' => 'ParentClass', + 'policy_id' => '372', + ), + 44 => + array ( + 'id' => '296', + 'identifier' => 'Class', + 'policy_id' => '373', + ), + 45 => + array ( + 'id' => '297', + 'identifier' => 'Section', + 'policy_id' => '373', + ), + 46 => + array ( + 'id' => '298', + 'identifier' => 'Owner', + 'policy_id' => '373', + ), +), +'ezpolicy_limitation_value' => +array ( + 0 => + array ( + 'id' => '477', + 'limitation_id' => '251', + 'value' => '1', + ), + 1 => + array ( + 'id' => '478', + 'limitation_id' => '252', + 'value' => '1', + ), + 2 => + array ( + 'id' => '480', + 'limitation_id' => '254', + 'value' => '2339567439', + ), + 3 => + array ( + 'id' => '481', + 'limitation_id' => '255', + 'value' => '2582995467', + ), + 4 => + array ( + 'id' => '482', + 'limitation_id' => '256', + 'value' => '341347141', + ), + 5 => + array ( + 'id' => '483', + 'limitation_id' => '257', + 'value' => '2582995467', + ), + 6 => + array ( + 'id' => '484', + 'limitation_id' => '258', + 'value' => '25', + ), + 7 => + array ( + 'id' => '485', + 'limitation_id' => '258', + 'value' => '33', + ), + 8 => + array ( + 'id' => '486', + 'limitation_id' => '259', + 'value' => '3', + ), + 9 => + array ( + 'id' => '487', + 'limitation_id' => '260', + 'value' => '1', + ), + 10 => + array ( + 'id' => '488', + 'limitation_id' => '260', + 'value' => '26', + ), + 11 => + array ( + 'id' => '489', + 'limitation_id' => '260', + 'value' => '24', + ), + 12 => + array ( + 'id' => '490', + 'limitation_id' => '260', + 'value' => '19', + ), + 13 => + array ( + 'id' => '491', + 'limitation_id' => '260', + 'value' => '20', + ), + 14 => + array ( + 'id' => '492', + 'limitation_id' => '260', + 'value' => '21', + ), + 15 => + array ( + 'id' => '493', + 'limitation_id' => '260', + 'value' => '16', + ), + 16 => + array ( + 'id' => '494', + 'limitation_id' => '260', + 'value' => '17', + ), + 17 => + array ( + 'id' => '495', + 'limitation_id' => '260', + 'value' => '23', + ), + 18 => + array ( + 'id' => '496', + 'limitation_id' => '260', + 'value' => '22', + ), + 19 => + array ( + 'id' => '497', + 'limitation_id' => '260', + 'value' => '27', + ), + 20 => + array ( + 'id' => '498', + 'limitation_id' => '260', + 'value' => '28', + ), + 21 => + array ( + 'id' => '499', + 'limitation_id' => '260', + 'value' => '34', + ), + 22 => + array ( + 'id' => '500', + 'limitation_id' => '260', + 'value' => '32', + ), + 23 => + array ( + 'id' => '501', + 'limitation_id' => '260', + 'value' => '33', + ), + 24 => + array ( + 'id' => '502', + 'limitation_id' => '260', + 'value' => '25', + ), + 25 => + array ( + 'id' => '503', + 'limitation_id' => '261', + 'value' => '1', + ), + 26 => + array ( + 'id' => '504', + 'limitation_id' => '262', + 'value' => '18', + ), + 27 => + array ( + 'id' => '505', + 'limitation_id' => '263', + 'value' => '17', + ), + 28 => + array ( + 'id' => '506', + 'limitation_id' => '264', + 'value' => '29', + ), + 29 => + array ( + 'id' => '507', + 'limitation_id' => '265', + 'value' => '28', + ), + 30 => + array ( + 'id' => '508', + 'limitation_id' => '266', + 'value' => '31', + ), + 31 => + array ( + 'id' => '509', + 'limitation_id' => '267', + 'value' => '32', + ), + 32 => + array ( + 'id' => '510', + 'limitation_id' => '268', + 'value' => '25', + ), + 33 => + array ( + 'id' => '511', + 'limitation_id' => '269', + 'value' => '27', + ), + 34 => + array ( + 'id' => '512', + 'limitation_id' => '270', + 'value' => '1', + ), + 35 => + array ( + 'id' => '513', + 'limitation_id' => '270', + 'value' => '26', + ), + 36 => + array ( + 'id' => '514', + 'limitation_id' => '270', + 'value' => '20', + ), + 37 => + array ( + 'id' => '515', + 'limitation_id' => '270', + 'value' => '21', + ), + 38 => + array ( + 'id' => '516', + 'limitation_id' => '270', + 'value' => '22', + ), + 39 => + array ( + 'id' => '517', + 'limitation_id' => '270', + 'value' => '27', + ), + 40 => + array ( + 'id' => '518', + 'limitation_id' => '270', + 'value' => '32', + ), + 41 => + array ( + 'id' => '519', + 'limitation_id' => '270', + 'value' => '34', + ), + 42 => + array ( + 'id' => '520', + 'limitation_id' => '271', + 'value' => '21', + ), + 43 => + array ( + 'id' => '521', + 'limitation_id' => '272', + 'value' => '1', + ), + 44 => + array ( + 'id' => '522', + 'limitation_id' => '272', + 'value' => '26', + ), + 45 => + array ( + 'id' => '523', + 'limitation_id' => '272', + 'value' => '16', + ), + 46 => + array ( + 'id' => '524', + 'limitation_id' => '272', + 'value' => '17', + ), + 47 => + array ( + 'id' => '525', + 'limitation_id' => '272', + 'value' => '18', + ), + 48 => + array ( + 'id' => '526', + 'limitation_id' => '272', + 'value' => '19', + ), + 49 => + array ( + 'id' => '527', + 'limitation_id' => '272', + 'value' => '20', + ), + 50 => + array ( + 'id' => '528', + 'limitation_id' => '272', + 'value' => '21', + ), + 51 => + array ( + 'id' => '529', + 'limitation_id' => '272', + 'value' => '22', + ), + 52 => + array ( + 'id' => '530', + 'limitation_id' => '272', + 'value' => '23', + ), + 53 => + array ( + 'id' => '531', + 'limitation_id' => '272', + 'value' => '24', + ), + 54 => + array ( + 'id' => '532', + 'limitation_id' => '272', + 'value' => '25', + ), + 55 => + array ( + 'id' => '533', + 'limitation_id' => '272', + 'value' => '27', + ), + 56 => + array ( + 'id' => '534', + 'limitation_id' => '272', + 'value' => '28', + ), + 57 => + array ( + 'id' => '535', + 'limitation_id' => '272', + 'value' => '31', + ), + 58 => + array ( + 'id' => '536', + 'limitation_id' => '272', + 'value' => '32', + ), + 59 => + array ( + 'id' => '537', + 'limitation_id' => '272', + 'value' => '34', + ), + 60 => + array ( + 'id' => '538', + 'limitation_id' => '273', + 'value' => '1', + ), + 61 => + array ( + 'id' => '539', + 'limitation_id' => '273', + 'value' => '6', + ), + 62 => + array ( + 'id' => '540', + 'limitation_id' => '273', + 'value' => '3', + ), + 63 => + array ( + 'id' => '541', + 'limitation_id' => '274', + 'value' => '6', + ), + 64 => + array ( + 'id' => '542', + 'limitation_id' => '275', + 'value' => '29', + ), + 65 => + array ( + 'id' => '543', + 'limitation_id' => '276', + 'value' => '6', + ), + 66 => + array ( + 'id' => '544', + 'limitation_id' => '277', + 'value' => '28', + ), + 67 => + array ( + 'id' => '545', + 'limitation_id' => '278', + 'value' => '30', + ), + 68 => + array ( + 'id' => '546', + 'limitation_id' => '279', + 'value' => '6', + ), + 69 => + array ( + 'id' => '547', + 'limitation_id' => '280', + 'value' => '29', + ), + 70 => + array ( + 'id' => '548', + 'limitation_id' => '281', + 'value' => '13', + ), + 71 => + array ( + 'id' => '549', + 'limitation_id' => '282', + 'value' => '6', + ), + 72 => + array ( + 'id' => '550', + 'limitation_id' => '283', + 'value' => '16', + ), + 73 => + array ( + 'id' => '551', + 'limitation_id' => '284', + 'value' => '13', + ), + 74 => + array ( + 'id' => '552', + 'limitation_id' => '284', + 'value' => '29', + ), + 75 => + array ( + 'id' => '553', + 'limitation_id' => '284', + 'value' => '30', + ), + 76 => + array ( + 'id' => '554', + 'limitation_id' => '285', + 'value' => '6', + ), + 77 => + array ( + 'id' => '555', + 'limitation_id' => '286', + 'value' => '1', + ), + 78 => + array ( + 'id' => '556', + 'limitation_id' => '287', + 'value' => '29', + ), + 79 => + array ( + 'id' => '557', + 'limitation_id' => '288', + 'value' => '1', + ), + 80 => + array ( + 'id' => '558', + 'limitation_id' => '289', + 'value' => '28', + ), + 81 => + array ( + 'id' => '559', + 'limitation_id' => '290', + 'value' => '30', + ), + 82 => + array ( + 'id' => '560', + 'limitation_id' => '291', + 'value' => '1', + ), + 83 => + array ( + 'id' => '561', + 'limitation_id' => '292', + 'value' => '29', + ), + 84 => + array ( + 'id' => '562', + 'limitation_id' => '293', + 'value' => '13', + ), + 85 => + array ( + 'id' => '563', + 'limitation_id' => '294', + 'value' => '1', + ), + 86 => + array ( + 'id' => '564', + 'limitation_id' => '295', + 'value' => '16', + ), + 87 => + array ( + 'id' => '565', + 'limitation_id' => '295', + 'value' => '18', + ), + 88 => + array ( + 'id' => '566', + 'limitation_id' => '296', + 'value' => '13', + ), + 89 => + array ( + 'id' => '567', + 'limitation_id' => '296', + 'value' => '29', + ), + 90 => + array ( + 'id' => '568', + 'limitation_id' => '296', + 'value' => '30', + ), + 91 => + array ( + 'id' => '569', + 'limitation_id' => '297', + 'value' => '1', + ), + 92 => + array ( + 'id' => '570', + 'limitation_id' => '298', + 'value' => '1', + ), +), +/* 'ezpreferences' => +array ( + 0 => + array ( + 'id' => '1', + 'name' => 'admin_navigation_content', + 'user_id' => '14', + 'value' => '1', + ), + 1 => + array ( + 'id' => '2', + 'name' => 'admin_navigation_roles', + 'user_id' => '14', + 'value' => '1', + ), + 2 => + array ( + 'id' => '3', + 'name' => 'admin_navigation_policies', + 'user_id' => '14', + 'value' => '1', + ), + 3 => + array ( + 'id' => '4', + 'name' => 'admin_list_limit', + 'user_id' => '14', + 'value' => '2', + ), + 4 => + array ( + 'id' => '5', + 'name' => 'admin_treemenu', + 'user_id' => '14', + 'value' => '1', + ), + 5 => + array ( + 'id' => '6', + 'name' => 'admin_bookmark_menu', + 'user_id' => '14', + 'value' => '1', + ), +), +'ezprest_authcode' => +array ( +), +'ezprest_authorized_clients' => +array ( +), +'ezprest_clients' => +array ( +), +'ezprest_token' => +array ( +), +'ezproductcategory' => +array ( +), +'ezproductcollection' => +array ( +), +'ezproductcollection_item' => +array ( +), +'ezproductcollection_item_opt' => +array ( +), +'ezpublishingqueueprocesses' => +array ( +), */ +'ezrole' => +array ( + 0 => + array ( + 'id' => '1', + 'is_new' => '0', + 'name' => 'Anonymous', + 'value' => ' ', + 'version' => '0', + ), + 1 => + array ( + 'id' => '2', + 'is_new' => '0', + 'name' => 'Administrator', + 'value' => '*', + 'version' => '0', + ), + 2 => + array ( + 'id' => '3', + 'is_new' => '0', + 'name' => 'Editor', + 'value' => ' ', + 'version' => '0', + ), + 3 => + array ( + 'id' => '4', + 'is_new' => '0', + 'name' => 'Partner', + 'value' => NULL, + 'version' => '0', + ), + 4 => + array ( + 'id' => '5', + 'is_new' => '0', + 'name' => 'Member', + 'value' => NULL, + 'version' => '0', + ), +), +/* 'ezrss_export' => +array ( + 0 => + array ( + 'access_url' => 'my_feed', + 'active' => '1', + 'created' => '1343140542', + 'creator_id' => '14', + 'description' => '', + 'id' => '1', + 'image_id' => '0', + 'main_node_only' => '1', + 'modified' => '1343140542', + 'modifier_id' => '14', + 'node_id' => '0', + 'number_of_objects' => '10', + 'rss_version' => '2.0', + 'site_access' => '', + 'status' => '1', + 'title' => 'My RSS Feed', + 'url' => 'http://example.com', + ), +), +'ezrss_export_item' => +array ( + 0 => + array ( + 'category' => '', + 'class_id' => '16', + 'description' => 'intro', + 'enclosure' => '', + 'id' => '1', + 'rssexport_id' => '1', + 'source_node_id' => '139', + 'status' => '1', + 'subnodes' => '0', + 'title' => 'title', + ), +), +'ezrss_import' => +array ( +), +'ezscheduled_script' => +array ( +), */ +'ezsearch_object_word_link' => +array ( + 0 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4663', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '951', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '930', + ), + 1 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4664', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '1', + 'prev_word_id' => '930', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '951', + ), + 2 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4665', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '951', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '952', + ), + 3 => + array ( + 'contentclass_attribute_id' => '8', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4666', + 'identifier' => 'first_name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '953', + ), + 4 => + array ( + 'contentclass_attribute_id' => '9', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4667', + 'identifier' => 'last_name', + 'integer_value' => '0', + 'next_word_id' => '953', + 'placement' => '1', + 'prev_word_id' => '953', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '954', + ), + 5 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4668', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '955', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '953', + ), + 6 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4669', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '3', + 'prev_word_id' => '953', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '955', + ), + 7 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4670', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '955', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '927', + ), + 8 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '12', + 'frequency' => '0', + 'id' => '4673', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920775', + 'section_id' => '2', + 'word_id' => '958', + ), + 9 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '12', + 'frequency' => '0', + 'id' => '4674', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '958', + 'published' => '1033920775', + 'section_id' => '2', + 'word_id' => '930', + ), + 10 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '13', + 'frequency' => '0', + 'id' => '4675', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920794', + 'section_id' => '2', + 'word_id' => '959', + ), + 11 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '41', + 'frequency' => '0', + 'id' => '4681', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1060695457', + 'section_id' => '3', + 'word_id' => '961', + ), + 12 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4682', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '953', + ), + 13 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4683', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '1', + 'prev_word_id' => '953', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '930', + ), + 14 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4684', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '2', + 'prev_word_id' => '930', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '954', + ), + 15 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4685', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '3', + 'prev_word_id' => '954', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '952', + ), + 16 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4686', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '4', + 'prev_word_id' => '952', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '816', + ), + 17 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4687', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '953', + 'placement' => '5', + 'prev_word_id' => '816', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '814', + ), + 18 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4688', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '6', + 'prev_word_id' => '814', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '953', + ), + 19 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4689', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '7', + 'prev_word_id' => '953', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '954', + ), + 20 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '45', + 'frequency' => '0', + 'id' => '4690', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1079684190', + 'section_id' => '4', + 'word_id' => '812', + ), + 21 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '49', + 'frequency' => '0', + 'id' => '4691', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220197', + 'section_id' => '3', + 'word_id' => '962', + ), + 22 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '50', + 'frequency' => '0', + 'id' => '4692', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220220', + 'section_id' => '3', + 'word_id' => '963', + ), + 23 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '51', + 'frequency' => '0', + 'id' => '4693', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220233', + 'section_id' => '3', + 'word_id' => '964', + ), + 24 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4694', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '965', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '877', + ), + 25 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4695', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '966', + 'placement' => '1', + 'prev_word_id' => '877', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '965', + ), + 26 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4696', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '965', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '966', + ), + 27 => + array ( + 'contentclass_attribute_id' => '176', + 'contentclass_id' => '15', + 'contentobject_id' => '54', + 'frequency' => '0', + 'id' => '4697', + 'identifier' => 'id', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1082016652', + 'section_id' => '5', + 'word_id' => '967', + ), + 28 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '56', + 'frequency' => '0', + 'id' => '4698', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1103023132', + 'section_id' => '5', + 'word_id' => '968', + ), + 29 => + array ( + 'contentclass_attribute_id' => '219', + 'contentclass_id' => '21', + 'contentobject_id' => '57', + 'frequency' => '0', + 'id' => '4699', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1343140537', + 'section_id' => '1', + 'word_id' => '969', + ), + 30 => + array ( + 'contentclass_attribute_id' => '212', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4700', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '970', + ), + 31 => + array ( + 'contentclass_attribute_id' => '212', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4701', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '819', + 'placement' => '1', + 'prev_word_id' => '970', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '971', + ), + 32 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4702', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '972', + 'placement' => '2', + 'prev_word_id' => '971', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '819', + ), + 33 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4703', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '863', + 'placement' => '3', + 'prev_word_id' => '819', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '972', + ), + 34 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4704', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '4', + 'prev_word_id' => '972', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '863', + ), + 35 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4705', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '973', + 'placement' => '5', + 'prev_word_id' => '863', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '814', + ), + 36 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4706', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '974', + 'placement' => '6', + 'prev_word_id' => '814', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '973', + ), + 37 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4707', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '801', + 'placement' => '7', + 'prev_word_id' => '973', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '974', + ), + 38 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4708', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '970', + 'placement' => '8', + 'prev_word_id' => '974', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '801', + ), + 39 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4709', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '9', + 'prev_word_id' => '801', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '970', + ), + 40 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4710', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '894', + 'placement' => '10', + 'prev_word_id' => '970', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '971', + ), + 41 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4711', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '843', + 'placement' => '11', + 'prev_word_id' => '971', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '894', + ), + 42 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4712', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '882', + 'placement' => '12', + 'prev_word_id' => '894', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '843', + ), + 43 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4713', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '975', + 'placement' => '13', + 'prev_word_id' => '843', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '882', + ), + 44 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4714', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '14', + 'prev_word_id' => '882', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '975', + ), + 45 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4715', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '825', + 'placement' => '15', + 'prev_word_id' => '975', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '971', + ), + 46 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4716', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '976', + 'placement' => '16', + 'prev_word_id' => '971', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '825', + ), + 47 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4717', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '977', + 'placement' => '17', + 'prev_word_id' => '825', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '976', + ), + 48 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4718', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '978', + 'placement' => '18', + 'prev_word_id' => '976', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '977', + ), + 49 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4719', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '979', + 'placement' => '19', + 'prev_word_id' => '977', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '978', + ), + 50 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4720', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '980', + 'placement' => '20', + 'prev_word_id' => '978', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '979', + ), + 51 => + array ( + 'contentclass_attribute_id' => '213', + 'contentclass_id' => '20', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4721', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '21', + 'prev_word_id' => '979', + 'published' => '1343140539', + 'section_id' => '1', + 'word_id' => '980', + ), + 52 => + array ( + 'contentclass_attribute_id' => '8', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4722', + 'identifier' => 'first_name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '958', + ), + 53 => + array ( + 'contentclass_attribute_id' => '9', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4723', + 'identifier' => 'last_name', + 'integer_value' => '0', + 'next_word_id' => '981', + 'placement' => '1', + 'prev_word_id' => '958', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '954', + ), + 54 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4724', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '982', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '981', + ), + 55 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4725', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '3', + 'prev_word_id' => '981', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '982', + ), + 56 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4726', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '982', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '927', + ), + 57 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '59', + 'frequency' => '0', + 'id' => '4727', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1343140541', + 'section_id' => '2', + 'word_id' => '983', + ), + 58 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '11', + 'frequency' => '0', + 'id' => '4728', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920746', + 'section_id' => '2', + 'word_id' => '984', + ), +), +/* 'ezsearch_return_count' => +array ( +), +'ezsearch_search_phrase' => +array ( +), */ +'ezsearch_word' => +array ( + 0 => + array ( + 'id' => '801', + 'object_count' => '1', + 'word' => 'to', + ), + 1 => + array ( + 'id' => '812', + 'object_count' => '1', + 'word' => 'setup', + ), + 2 => + array ( + 'id' => '814', + 'object_count' => '2', + 'word' => 'the', + ), + 3 => + array ( + 'id' => '816', + 'object_count' => '1', + 'word' => 'for', + ), + 4 => + array ( + 'id' => '819', + 'object_count' => '1', + 'word' => 'please', + ), + 5 => + array ( + 'id' => '825', + 'object_count' => '1', + 'word' => 'at', + ), + 6 => + array ( + 'id' => '843', + 'object_count' => '1', + 'word' => 'can', + ), + 7 => + array ( + 'id' => '863', + 'object_count' => '1', + 'word' => 'in', + ), + 8 => + array ( + 'id' => '877', + 'object_count' => '1', + 'word' => 'common', + ), + 9 => + array ( + 'id' => '882', + 'object_count' => '1', + 'word' => 'also', + ), + 10 => + array ( + 'id' => '894', + 'object_count' => '1', + 'word' => 'you', + ), + 11 => + array ( + 'id' => '927', + 'object_count' => '2', + 'word' => 'ez.no', + ), + 12 => + array ( + 'id' => '930', + 'object_count' => '3', + 'word' => 'users', + ), + 13 => + array ( + 'id' => '951', + 'object_count' => '1', + 'word' => 'main', + ), + 14 => + array ( + 'id' => '952', + 'object_count' => '2', + 'word' => 'group', + ), + 15 => + array ( + 'id' => '953', + 'object_count' => '2', + 'word' => 'anonymous', + ), + 16 => + array ( + 'id' => '954', + 'object_count' => '3', + 'word' => 'user', + ), + 17 => + array ( + 'id' => '955', + 'object_count' => '1', + 'word' => 'nospam', + ), + 18 => + array ( + 'id' => '958', + 'object_count' => '2', + 'word' => 'administrator', + ), + 19 => + array ( + 'id' => '959', + 'object_count' => '1', + 'word' => 'editors', + ), + 20 => + array ( + 'id' => '961', + 'object_count' => '1', + 'word' => 'media', + ), + 21 => + array ( + 'id' => '962', + 'object_count' => '1', + 'word' => 'images', + ), + 22 => + array ( + 'id' => '963', + 'object_count' => '1', + 'word' => 'files', + ), + 23 => + array ( + 'id' => '964', + 'object_count' => '1', + 'word' => 'multimedia', + ), + 24 => + array ( + 'id' => '965', + 'object_count' => '1', + 'word' => 'ini', + ), + 25 => + array ( + 'id' => '966', + 'object_count' => '1', + 'word' => 'settings', + ), + 26 => + array ( + 'id' => '967', + 'object_count' => '1', + 'word' => 'sitestyle_identifier', + ), + 27 => + array ( + 'id' => '968', + 'object_count' => '1', + 'word' => 'design', + ), + 28 => + array ( + 'id' => '969', + 'object_count' => '1', + 'word' => 'home', + ), + 29 => + array ( + 'id' => '970', + 'object_count' => '1', + 'word' => 'contact', + ), + 30 => + array ( + 'id' => '971', + 'object_count' => '1', + 'word' => 'us', + ), + 31 => + array ( + 'id' => '972', + 'object_count' => '1', + 'word' => 'fill', + ), + 32 => + array ( + 'id' => '973', + 'object_count' => '1', + 'word' => 'form', + ), + 33 => + array ( + 'id' => '974', + 'object_count' => '1', + 'word' => 'below', + ), + 34 => + array ( + 'id' => '975', + 'object_count' => '1', + 'word' => 'reach', + ), + 35 => + array ( + 'id' => '976', + 'object_count' => '1', + 'word' => 'company', + ), + 36 => + array ( + 'id' => '977', + 'object_count' => '1', + 'word' => 'name', + ), + 37 => + array ( + 'id' => '978', + 'object_count' => '1', + 'word' => 'address', + ), + 38 => + array ( + 'id' => '979', + 'object_count' => '1', + 'word' => 'city', + ), + 39 => + array ( + 'id' => '980', + 'object_count' => '1', + 'word' => 'country', + ), + 40 => + array ( + 'id' => '981', + 'object_count' => '1', + 'word' => 'admin', + ), + 41 => + array ( + 'id' => '982', + 'object_count' => '1', + 'word' => 'spam', + ), + 42 => + array ( + 'id' => '983', + 'object_count' => '1', + 'word' => 'partners', + ), + 43 => + array ( + 'id' => '984', + 'object_count' => '1', + 'word' => 'members', + ), +), +'ezsection' => +array ( + 0 => + array ( + 'id' => '1', + 'identifier' => 'standard', + 'locale' => '', + 'name' => 'Standard', + 'navigation_part_identifier' => 'ezcontentnavigationpart', + ), + 1 => + array ( + 'id' => '2', + 'identifier' => 'users', + 'locale' => '', + 'name' => 'Users', + 'navigation_part_identifier' => 'ezusernavigationpart', + ), + 2 => + array ( + 'id' => '3', + 'identifier' => 'media', + 'locale' => '', + 'name' => 'Media', + 'navigation_part_identifier' => 'ezmedianavigationpart', + ), + 3 => + array ( + 'id' => '4', + 'identifier' => 'setup', + 'locale' => '', + 'name' => 'Setup', + 'navigation_part_identifier' => 'ezsetupnavigationpart', + ), + 4 => + array ( + 'id' => '5', + 'identifier' => 'design', + 'locale' => '', + 'name' => 'Design', + 'navigation_part_identifier' => 'ezvisualnavigationpart', + ), + 5 => + array ( + 'id' => '6', + 'identifier' => '', + 'locale' => '', + 'name' => 'Restricted', + 'navigation_part_identifier' => 'ezcontentnavigationpart', + ), +), +/* 'ezsession' => +array ( +), +'ezsite_data' => +array ( + 0 => + array ( + 'name' => 'ezdemo', + 'value' => '2.0', + ), + 1 => + array ( + 'name' => 'ezpublish-release', + 'value' => '1', + ), + 2 => + array ( + 'name' => 'ezpublish-version', + 'value' => '4.7.0', + ), +), +'ezstarrating' => +array ( +), +'ezstarrating_data' => +array ( +), +'ezsubtree_notification_rule' => +array ( +), +'eztipafriend_counter' => +array ( +), +'eztipafriend_request' => +array ( +), +'eztrigger' => +array ( +), */ +'ezurl' => +array ( + 0 => + array ( + 'created' => '1343140541', + 'id' => '23', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1343140541', + 'original_url_md5' => '9b492048041e95b32de08bafc86d759b', + 'url' => '/content/view/sitemap/2', + ), + 1 => + array ( + 'created' => '1343140541', + 'id' => '24', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1343140541', + 'original_url_md5' => 'c86bcb109d8e70f9db65c803baafd550', + 'url' => '/content/view/tagcloud/2', + ), +), +'ezurl_object_link' => +array ( + 0 => + array ( + 'contentobject_attribute_id' => '195', + 'contentobject_attribute_version' => '2', + 'url_id' => '23', + ), + 1 => + array ( + 'contentobject_attribute_id' => '196', + 'contentobject_attribute_version' => '2', + 'url_id' => '24', + ), +), +'ezurlalias' => +array ( + 0 => + array ( + 'destination_url' => 'content/view/full/2', + 'forward_to_id' => '0', + 'id' => '12', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + 'source_url' => '', + ), + 1 => + array ( + 'destination_url' => 'content/view/full/5', + 'forward_to_id' => '0', + 'id' => '13', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '9bc65c2abec141778ffaa729489f3e87', + 'source_url' => 'users', + ), + 2 => + array ( + 'destination_url' => 'content/view/full/12', + 'forward_to_id' => '0', + 'id' => '15', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '02d4e844e3a660857a3f81585995ffe1', + 'source_url' => 'users/guest_accounts', + ), + 3 => + array ( + 'destination_url' => 'content/view/full/13', + 'forward_to_id' => '0', + 'id' => '16', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '1b1d79c16700fd6003ea7be233e754ba', + 'source_url' => 'users/administrator_users', + ), + 4 => + array ( + 'destination_url' => 'content/view/full/14', + 'forward_to_id' => '0', + 'id' => '17', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '0bb9dd665c96bbc1cf36b79180786dea', + 'source_url' => 'users/editors', + ), + 5 => + array ( + 'destination_url' => 'content/view/full/15', + 'forward_to_id' => '0', + 'id' => '18', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'f1305ac5f327a19b451d82719e0c3f5d', + 'source_url' => 'users/administrator_users/administrator_user', + ), + 6 => + array ( + 'destination_url' => 'content/view/full/43', + 'forward_to_id' => '0', + 'id' => '20', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '62933a2951ef01f4eafd9bdf4d3cd2f0', + 'source_url' => 'media', + ), + 7 => + array ( + 'destination_url' => 'content/view/full/44', + 'forward_to_id' => '0', + 'id' => '21', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '3ae1aac958e1c82013689d917d34967a', + 'source_url' => 'users/anonymous_users', + ), + 8 => + array ( + 'destination_url' => 'content/view/full/45', + 'forward_to_id' => '0', + 'id' => '22', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'aad93975f09371695ba08292fd9698db', + 'source_url' => 'users/anonymous_users/anonymous_user', + ), + 9 => + array ( + 'destination_url' => 'content/view/full/48', + 'forward_to_id' => '0', + 'id' => '25', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'a0f848942ce863cf53c0fa6cc684007d', + 'source_url' => 'setup', + ), + 10 => + array ( + 'destination_url' => 'content/view/full/50', + 'forward_to_id' => '0', + 'id' => '27', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'c60212835de76414f9bfd21eecb8f221', + 'source_url' => 'foo_bar_folder/images/vbanner', + ), + 11 => + array ( + 'destination_url' => 'content/view/full/51', + 'forward_to_id' => '0', + 'id' => '28', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '38985339d4a5aadfc41ab292b4527046', + 'source_url' => 'media/images', + ), + 12 => + array ( + 'destination_url' => 'content/view/full/52', + 'forward_to_id' => '0', + 'id' => '29', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'ad5a8c6f6aac3b1b9df267fe22e7aef6', + 'source_url' => 'media/files', + ), + 13 => + array ( + 'destination_url' => 'content/view/full/53', + 'forward_to_id' => '0', + 'id' => '30', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '562a0ac498571c6c3529173184a2657c', + 'source_url' => 'media/multimedia', + ), + 14 => + array ( + 'destination_url' => 'content/view/full/54', + 'forward_to_id' => '0', + 'id' => '31', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'e501fe6c81ed14a5af2b322d248102d8', + 'source_url' => 'setup/common_ini_settings', + ), + 15 => + array ( + 'destination_url' => 'content/view/full/56', + 'forward_to_id' => '0', + 'id' => '32', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '2dd3db5dc7122ea5f3ee539bb18fe97d', + 'source_url' => 'design/ez_publish', + ), + 16 => + array ( + 'destination_url' => 'content/view/full/58', + 'forward_to_id' => '0', + 'id' => '33', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '31c13f47ad87dd7baa2d558a91e0fbb9', + 'source_url' => 'design', + ), +), +'ezurlalias_ml' => +array ( + 0 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '14', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '14', + 'parent' => '0', + 'text' => 'foo_bar_folder', + 'text_md5' => '0288b6883046492fa92e4a84eb67acc9', + ), + 1 => + array ( + 'action' => 'eznode:60', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '39', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '8', + 'link' => '39', + 'parent' => '0', + 'text' => 'Contact-Us', + 'text_md5' => '03f2197d47a602c679c5f667e3482855', + ), + 2 => + array ( + 'action' => 'eznode:59', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '38', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '9', + 'link' => '38', + 'parent' => '0', + 'text' => 'Home', + 'text_md5' => '106a6c241b8797f52e1e77317b96a201', + ), + 3 => + array ( + 'action' => 'eznode:59', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '38', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '38', + 'parent' => '0', + 'text' => 'eZ-Publish', + 'text_md5' => '10e4c3cb527fb9963258469986c16240', + ), + 4 => + array ( + 'action' => 'eznode:58', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '25', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '25', + 'parent' => '0', + 'text' => 'Design', + 'text_md5' => '31c13f47ad87dd7baa2d558a91e0fbb9', + ), + 5 => + array ( + 'action' => 'eznode:48', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '13', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '13', + 'parent' => '0', + 'text' => 'Setup2', + 'text_md5' => '475e97c0146bfb1c490339546d9e72ee', + ), + 6 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '17', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '17', + 'parent' => '0', + 'text' => 'media2', + 'text_md5' => '50e2736330de124f6edea9b008556fe6', + ), + 7 => + array ( + 'action' => 'eznode:43', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '9', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '9', + 'parent' => '0', + 'text' => 'Media', + 'text_md5' => '62933a2951ef01f4eafd9bdf4d3cd2f0', + ), + 8 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '21', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '21', + 'parent' => '0', + 'text' => 'setup3', + 'text_md5' => '732cefcf28bf4547540609fb1a786a30', + ), + 9 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '3', + 'parent' => '0', + 'text' => 'users2', + 'text_md5' => '86425c35a33507d479f71ade53a669aa', + ), + 10 => + array ( + 'action' => 'eznode:5', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'Users', + 'text_md5' => '9bc65c2abec141778ffaa729489f3e87', + ), + 11 => + array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '11', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 12 => + array ( + 'action' => 'eznode:61', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '40', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '40', + 'parent' => '2', + 'text' => 'Partners', + 'text_md5' => '7896f8fa69398c56d86a65357615c41f', + ), + 13 => + array ( + 'action' => 'eznode:14', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '6', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '6', + 'parent' => '2', + 'text' => 'Editors', + 'text_md5' => 'a147e136bfa717592f2bd70bd4b53b17', + ), + 14 => + array ( + 'action' => 'eznode:44', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '10', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '10', + 'parent' => '2', + 'text' => 'Anonymous-Users', + 'text_md5' => 'c2803c3fa1b0b5423237b4e018cae755', + ), + 15 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '2', + 'text' => 'Members', + 'text_md5' => 'd2e3083420929d8bfae81f58fa4594cb', + ), + 16 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '41', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '2', + 'text' => 'Guest-accounts', + 'text_md5' => 'e57843d836e3af8ab611fde9e2139b3a', + ), + 17 => + array ( + 'action' => 'eznode:13', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '5', + 'parent' => '2', + 'text' => 'Administrator-users', + 'text_md5' => 'f89fad7f8a3abc8c09e1deb46a420007', + ), + 18 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '11', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '11', + 'parent' => '3', + 'text' => 'anonymous_users2', + 'text_md5' => '505e93077a6dde9034ad97a14ab022b1', + ), + 19 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '26', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '0', + 'link' => '4', + 'parent' => '3', + 'text' => 'guest_accounts', + 'text_md5' => '70bb992820e73638731aa8de79b3329e', + ), + 20 => + array ( + 'action' => 'eznode:14', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '29', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '6', + 'parent' => '3', + 'text' => 'editors', + 'text_md5' => 'a147e136bfa717592f2bd70bd4b53b17', + ), + 21 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '7', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '7', + 'parent' => '3', + 'text' => 'administrator_users2', + 'text_md5' => 'a7da338c20bf65f9f789c87296379c2a', + ), + 22 => + array ( + 'action' => 'eznode:13', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '27', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '5', + 'parent' => '3', + 'text' => 'administrator_users', + 'text_md5' => 'aeb8609aa933b0899aa012c71139c58c', + ), + 23 => + array ( + 'action' => 'eznode:44', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '30', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '10', + 'parent' => '3', + 'text' => 'anonymous_users', + 'text_md5' => 'e9e5ad0c05ee1a43715572e5cc545926', + ), + 24 => + array ( + 'action' => 'eznode:15', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '8', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '8', + 'parent' => '5', + 'text' => 'Administrator-User', + 'text_md5' => '5a9d7b0ec93173ef4fedee023209cb61', + ), + 25 => + array ( + 'action' => 'eznode:15', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '28', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '0', + 'link' => '8', + 'parent' => '7', + 'text' => 'administrator_user', + 'text_md5' => 'a3cca2de936df1e2f805710399989971', + ), + 26 => + array ( + 'action' => 'eznode:53', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '20', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '20', + 'parent' => '9', + 'text' => 'Multimedia', + 'text_md5' => '2e5bc8831f7ae6a29530e7f1bbf2de9c', + ), + 27 => + array ( + 'action' => 'eznode:52', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '19', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '19', + 'parent' => '9', + 'text' => 'Files', + 'text_md5' => '45b963397aa40d4a0063e0d85e4fe7a1', + ), + 28 => + array ( + 'action' => 'eznode:51', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '18', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '18', + 'parent' => '9', + 'text' => 'Images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 29 => + array ( + 'action' => 'eznode:45', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '12', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '12', + 'parent' => '10', + 'text' => 'Anonymous-User', + 'text_md5' => 'ccb62ebca03a31272430bc414bd5cd5b', + ), + 30 => + array ( + 'action' => 'eznode:45', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '31', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '12', + 'parent' => '11', + 'text' => 'anonymous_user', + 'text_md5' => 'c593ec85293ecb0e02d50d4c5c6c20eb', + ), + 31 => + array ( + 'action' => 'eznode:54', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '22', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '22', + 'parent' => '13', + 'text' => 'Common-INI-settings', + 'text_md5' => '4434993ac013ae4d54bb1f51034d6401', + ), + 32 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '15', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '15', + 'parent' => '14', + 'text' => 'images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 33 => + array ( + 'action' => 'eznode:50', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '16', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '16', + 'parent' => '15', + 'text' => 'vbanner', + 'text_md5' => 'c54e2d1b93642e280bdc5d99eab2827d', + ), + 34 => + array ( + 'action' => 'eznode:53', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '34', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '20', + 'parent' => '17', + 'text' => 'multimedia', + 'text_md5' => '2e5bc8831f7ae6a29530e7f1bbf2de9c', + ), + 35 => + array ( + 'action' => 'eznode:52', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '33', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '19', + 'parent' => '17', + 'text' => 'files', + 'text_md5' => '45b963397aa40d4a0063e0d85e4fe7a1', + ), + 36 => + array ( + 'action' => 'eznode:51', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '32', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '18', + 'parent' => '17', + 'text' => 'images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 37 => + array ( + 'action' => 'eznode:54', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '35', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '22', + 'parent' => '21', + 'text' => 'common_ini_settings', + 'text_md5' => 'e59d6834e86cee752ed841f9cd8d5baf', + ), + 38 => + array ( + 'action' => 'eznode:56', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '37', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '24', + 'parent' => '25', + 'text' => 'eZ-publish', + 'text_md5' => '10e4c3cb527fb9963258469986c16240', + ), + 39 => + array ( + 'action' => 'eznode:56', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '24', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '24', + 'parent' => '25', + 'text' => 'Plain-site', + 'text_md5' => '49a39d99a955d95aa5d636275656a07a', + ), +), +'ezurlalias_ml_incr' => +array ( + 0 => + array ( + 'id' => '1', + ), + 1 => + array ( + 'id' => '2', + ), + 2 => + array ( + 'id' => '3', + ), + 3 => + array ( + 'id' => '4', + ), + 4 => + array ( + 'id' => '5', + ), + 5 => + array ( + 'id' => '6', + ), + 6 => + array ( + 'id' => '7', + ), + 7 => + array ( + 'id' => '8', + ), + 8 => + array ( + 'id' => '9', + ), + 9 => + array ( + 'id' => '10', + ), + 10 => + array ( + 'id' => '11', + ), + 11 => + array ( + 'id' => '12', + ), + 12 => + array ( + 'id' => '13', + ), + 13 => + array ( + 'id' => '14', + ), + 14 => + array ( + 'id' => '15', + ), + 15 => + array ( + 'id' => '16', + ), + 16 => + array ( + 'id' => '17', + ), + 17 => + array ( + 'id' => '18', + ), + 18 => + array ( + 'id' => '19', + ), + 19 => + array ( + 'id' => '20', + ), + 20 => + array ( + 'id' => '21', + ), + 21 => + array ( + 'id' => '22', + ), + 22 => + array ( + 'id' => '24', + ), + 23 => + array ( + 'id' => '25', + ), + 24 => + array ( + 'id' => '26', + ), + 25 => + array ( + 'id' => '27', + ), + 26 => + array ( + 'id' => '28', + ), + 27 => + array ( + 'id' => '29', + ), + 28 => + array ( + 'id' => '30', + ), + 29 => + array ( + 'id' => '31', + ), + 30 => + array ( + 'id' => '32', + ), + 31 => + array ( + 'id' => '33', + ), + 32 => + array ( + 'id' => '34', + ), + 33 => + array ( + 'id' => '35', + ), + 34 => + array ( + 'id' => '36', + ), + 35 => + array ( + 'id' => '37', + ), + 36 => + array ( + 'id' => '38', + ), + 37 => + array ( + 'id' => '39', + ), + 38 => + array ( + 'id' => '40', + ), + 39 => + array ( + 'id' => '41', + ), +), +'ezurlwildcard' => +array ( +), +'ezuser' => +array ( + 0 => + array ( + 'contentobject_id' => '10', + 'email' => 'nospam@ez.no', + 'login' => 'anonymous', + 'password_hash' => '4e6f6184135228ccd45f8233d72a0363', + 'password_hash_type' => '2', + ), + 1 => + array ( + 'contentobject_id' => '14', + 'email' => 'spam@ez.no', + 'login' => 'admin', + 'password_hash' => 'c78e3b0f3d9244ed8c6d1c29464bdff9', + 'password_hash_type' => '2', + ), +), +'ezuser_accountkey' => +array ( +), +/* 'ezuser_discountrule' => +array ( +), */ +'ezuser_role' => +array ( + 0 => + array ( + 'contentobject_id' => '12', + 'id' => '25', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '2', + ), + 1 => + array ( + 'contentobject_id' => '11', + 'id' => '28', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 2 => + array ( + 'contentobject_id' => '42', + 'id' => '31', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 3 => + array ( + 'contentobject_id' => '13', + 'id' => '32', + 'limit_identifier' => 'Subtree', + 'limit_value' => '/1/2/', + 'role_id' => '3', + ), + 4 => + array ( + 'contentobject_id' => '13', + 'id' => '33', + 'limit_identifier' => 'Subtree', + 'limit_value' => '/1/43/', + 'role_id' => '3', + ), + 5 => + array ( + 'contentobject_id' => '11', + 'id' => '34', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + 6 => + array ( + 'contentobject_id' => '59', + 'id' => '35', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '4', + ), + 7 => + array ( + 'contentobject_id' => '59', + 'id' => '36', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + 8 => + array ( + 'contentobject_id' => '59', + 'id' => '37', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 9 => + array ( + 'contentobject_id' => '13', + 'id' => '38', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), +), +'ezuser_setting' => +array ( + 0 => + array ( + 'is_enabled' => '1', + 'max_login' => '1000', + 'user_id' => '10', + ), + 1 => + array ( + 'is_enabled' => '1', + 'max_login' => '10', + 'user_id' => '14', + ), +), +'ezuservisit' => +array ( + 0 => + array ( + 'current_visit_timestamp' => '1343140525', + 'failed_login_attempts' => '0', + 'last_visit_timestamp' => '1301057720', + 'login_count' => '0', + 'user_id' => '14', + ), +), +/* 'ezvatrule' => +array ( +), +'ezvatrule_product_category' => +array ( +), +'ezvattype' => +array ( + 0 => + array ( + 'id' => '1', + 'name' => 'Std', + 'percentage' => '0', + ), +), +'ezview_counter' => +array ( +), +'ezwaituntildatevalue' => +array ( +), +'ezwishlist' => +array ( +), +'ezworkflow' => +array ( +), +'ezworkflow_assign' => +array ( +), +'ezworkflow_event' => +array ( +), +'ezworkflow_group' => +array ( + 0 => + array ( + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '1', + 'modified' => '1024392098', + 'modifier_id' => '14', + 'name' => 'Standard', + ), +), +'ezworkflow_group_link' => +array ( +), +'ezworkflow_process' => +array ( +), */ +); + diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezflow_dump.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezflow_dump.php new file mode 100644 index 0000000..e24f2ad --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezflow_dump.php @@ -0,0 +1,25112 @@ +<?php +/** + * This is dump of ezflow w/o demo content on eZ Publish 4.7 + */ + +return array ( +'ezapprove_items' => +array ( +), +'ezbasket' => +array ( +), +'ezbinaryfile' => +array ( +), +'ezcobj_state' => +array ( + 0 => + array ( + 'default_language_id' => '2', + 'group_id' => '2', + 'id' => '1', + 'identifier' => 'not_locked', + 'language_mask' => '3', + 'priority' => '0', + ), + 1 => + array ( + 'default_language_id' => '2', + 'group_id' => '2', + 'id' => '2', + 'identifier' => 'locked', + 'language_mask' => '3', + 'priority' => '1', + ), +), +'ezcobj_state_group' => +array ( + 0 => + array ( + 'default_language_id' => '2', + 'id' => '2', + 'identifier' => 'ez_lock', + 'language_mask' => '3', + ), +), +'ezcobj_state_group_language' => +array ( + 0 => + array ( + 'contentobject_state_group_id' => '2', + 'description' => '', + 'language_id' => '3', + 'name' => 'Lock', + 'real_language_id' => '2', + ), +), +'ezcobj_state_language' => +array ( + 0 => + array ( + 'contentobject_state_id' => '1', + 'description' => '', + 'language_id' => '3', + 'name' => 'Not locked', + ), + 1 => + array ( + 'contentobject_state_id' => '2', + 'description' => '', + 'language_id' => '3', + 'name' => 'Locked', + ), +), +'ezcobj_state_link' => +array ( + 0 => + array ( + 'contentobject_id' => '4', + 'contentobject_state_id' => '1', + ), + 1 => + array ( + 'contentobject_id' => '10', + 'contentobject_state_id' => '1', + ), + 2 => + array ( + 'contentobject_id' => '11', + 'contentobject_state_id' => '1', + ), + 3 => + array ( + 'contentobject_id' => '12', + 'contentobject_state_id' => '1', + ), + 4 => + array ( + 'contentobject_id' => '13', + 'contentobject_state_id' => '1', + ), + 5 => + array ( + 'contentobject_id' => '14', + 'contentobject_state_id' => '1', + ), + 6 => + array ( + 'contentobject_id' => '41', + 'contentobject_state_id' => '1', + ), + 7 => + array ( + 'contentobject_id' => '42', + 'contentobject_state_id' => '1', + ), + 8 => + array ( + 'contentobject_id' => '45', + 'contentobject_state_id' => '1', + ), + 9 => + array ( + 'contentobject_id' => '49', + 'contentobject_state_id' => '1', + ), + 10 => + array ( + 'contentobject_id' => '50', + 'contentobject_state_id' => '1', + ), + 11 => + array ( + 'contentobject_id' => '51', + 'contentobject_state_id' => '1', + ), + 12 => + array ( + 'contentobject_id' => '52', + 'contentobject_state_id' => '1', + ), + 13 => + array ( + 'contentobject_id' => '54', + 'contentobject_state_id' => '1', + ), + 14 => + array ( + 'contentobject_id' => '56', + 'contentobject_state_id' => '1', + ), + 15 => + array ( + 'contentobject_id' => '57', + 'contentobject_state_id' => '1', + ), + 16 => + array ( + 'contentobject_id' => '58', + 'contentobject_state_id' => '1', + ), +), +'ezcollab_group' => +array ( +), +'ezcollab_item' => +array ( +), +'ezcollab_item_group_link' => +array ( +), +'ezcollab_item_message_link' => +array ( +), +'ezcollab_item_participant_link' => +array ( +), +'ezcollab_item_status' => +array ( +), +'ezcollab_notification_rule' => +array ( +), +'ezcollab_profile' => +array ( +), +'ezcollab_simple_message' => +array ( +), +'ezcontent_language' => +array ( + 0 => + array ( + 'disabled' => '0', + 'id' => '2', + 'locale' => 'eng-US', + 'name' => 'English (American)', + ), + 1 => + array ( + 'disabled' => '0', + 'id' => '4', + 'locale' => 'ger-DE', + 'name' => 'German', + ), + 2 => + array ( + 'disabled' => '0', + 'id' => '8', + 'locale' => 'eng-GB', + 'name' => 'English (United Kingdom)', + ), +), +'ezcontentbrowsebookmark' => +array ( +), +'ezcontentbrowserecent' => +array ( +/* 0 => + array ( + 'created' => '1343141328', + 'id' => '1', + 'name' => 'eZ Publish', + 'node_id' => '2', + 'user_id' => '14', + ), + 1 => + array ( + 'created' => '1343141332', + 'id' => '2', + 'name' => 'Users', + 'node_id' => '5', + 'user_id' => '14', + ),*/ +), +'ezcontentclass' => +array ( + 0 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<short_name|name>', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '1', + 'identifier' => 'folder', + 'initial_language_id' => '2', + 'is_container' => '1', + 'language_mask' => '3', + 'modified' => '1082454875', + 'modifier_id' => '14', + 'remote_id' => 'a3d405b81be900468eb153d774f4f0d2', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Folder";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 1 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<name>', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '3', + 'identifier' => 'user_group', + 'initial_language_id' => '2', + 'is_container' => '1', + 'language_mask' => '3', + 'modified' => '1048494743', + 'modifier_id' => '14', + 'remote_id' => '25b4268cdcd01921b808a0d854b877ef', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"User group";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 2 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<first_name> <last_name>', + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '4', + 'identifier' => 'user', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1082018364', + 'modifier_id' => '14', + 'remote_id' => '40faa822edc579b02c25f6bb7beec3ad', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"User";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 3 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1052385685', + 'creator_id' => '14', + 'id' => '13', + 'identifier' => 'comment', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1082455144', + 'modifier_id' => '14', + 'remote_id' => '000c14f4f475e9f2955dedab72799941', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Comment";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 4 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<name>', + 'created' => '1081858024', + 'creator_id' => '14', + 'id' => '14', + 'identifier' => 'common_ini_settings', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1081858024', + 'modifier_id' => '14', + 'remote_id' => 'ffedf2e73b1ea0c3e630e42e2db9c900', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:19:"Common ini settings";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 5 => + array ( + 'always_available' => '1', + 'contentobject_name' => '<title>', + 'created' => '1081858045', + 'creator_id' => '14', + 'id' => '15', + 'identifier' => 'template_look', + 'initial_language_id' => '2', + 'is_container' => '0', + 'language_mask' => '3', + 'modified' => '1081858045', + 'modifier_id' => '14', + 'remote_id' => '59b43cd9feaaf0e45ac974fb4bbd3f92', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Template look";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 6 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343141325', + 'creator_id' => '14', + 'id' => '16', + 'identifier' => 'article', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141325', + 'modifier_id' => '14', + 'remote_id' => 'c15b600eb9198b1924063b5a68758232', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Article";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 7 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343141325', + 'creator_id' => '14', + 'id' => '17', + 'identifier' => 'article_mainpage', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141325', + 'modifier_id' => '14', + 'remote_id' => 'feaf24c0edae665e7ddaae1bc2b3fe5b', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:19:"Article (main-page)";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 8 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title|index_title>', + 'created' => '1343141325', + 'creator_id' => '14', + 'id' => '18', + 'identifier' => 'article_subpage', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141325', + 'modifier_id' => '14', + 'remote_id' => '68f305a18c76d9d03df36b810f290732', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Article (sub-page)";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 9 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141325', + 'creator_id' => '14', + 'id' => '19', + 'identifier' => 'blog', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141325', + 'modifier_id' => '14', + 'remote_id' => '3a6f9c1f075b3bf49d7345576b196fe8', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Blog";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 10 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343141325', + 'creator_id' => '14', + 'id' => '20', + 'identifier' => 'blog_post', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141325', + 'modifier_id' => '14', + 'remote_id' => '7ecb961056b7cbb30f22a91357e0a007', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Blog post";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 11 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141325', + 'creator_id' => '14', + 'id' => '21', + 'identifier' => 'product', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141325', + 'modifier_id' => '14', + 'remote_id' => '77f3ede996a3a39c7159cc69189c5307', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Product";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 12 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '22', + 'identifier' => 'feedback_form', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'df0257b8fc55f6b8ab179d6fb915455e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Feedback form";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 13 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '23', + 'identifier' => 'frontpage', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'e36c458e3e4a81298a0945f53a2c81f4', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Frontpage";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 14 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '24', + 'identifier' => 'documentation_page', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'd4a05eed0402e4d70fedfda2023f1aa2', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Documentation page";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 15 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<header>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '25', + 'identifier' => 'infobox', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '0b4e8accad5bec5ba2d430acb25c1ff6', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Infobox";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 16 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '26', + 'identifier' => 'multicalendar', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '99aec4e5682414517ed929ecd969439f', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Multicalendar";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 17 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '27', + 'identifier' => 'poll', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '232937a3a2eacbbf24e2601aebe16522', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Poll";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 18 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '28', + 'identifier' => 'file', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '637d58bfddf164627bdfd265733280a0', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 19 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '29', + 'identifier' => 'flash', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '6cd17b98a41ee9355371a376e8868ee0', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Flash";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 20 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '30', + 'identifier' => 'flash_recorder', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'e349c947fd306299418be35b07b9a940', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Flash recorder";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 21 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '31', + 'identifier' => 'flash_player', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '20b2ed0982343e6e0a550f7f0c137e06', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Video/Flash Player";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 22 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '32', + 'identifier' => 'global_layout', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'f0271811b913befa8f062527e909f15e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Global layout";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 23 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '33', + 'identifier' => 'image', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'f6df12aa74e36230eb675f364fccd25a', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 24 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '34', + 'identifier' => 'link', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '74ec6507063150bc813549b22534ad48', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Link";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 25 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '35', + 'identifier' => 'quicktime', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '16d7b371979d6ba37894cc8dc306f38f', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Quicktime";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 26 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '36', + 'identifier' => 'windows_media', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => '223dd2551e85b63b55a72d02363faab6', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Windows media";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 27 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141326', + 'creator_id' => '14', + 'id' => '37', + 'identifier' => 'real_video', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141326', + 'modifier_id' => '14', + 'remote_id' => 'dba67bc20a4301aa04cc74e411310dfc', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Real video";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 28 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '38', + 'identifier' => 'gallery', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '6a320cdc3e274841b82fcd63a86f80d1', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Gallery";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 29 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '39', + 'identifier' => 'geo_article', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => 'a98ae5ac95365b958b01fb88dfab3330', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Geo Article";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 30 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '40', + 'identifier' => 'forum', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => 'b241f924b96b267153f5f55904e0675a', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Forum";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 31 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '41', + 'identifier' => 'forum_topic', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '71f99c516743a33562c3893ef98c9b60', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Forum topic";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 32 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<subject>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '42', + 'identifier' => 'forum_reply', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '80ee42a66b2b8b6ee15f5c5f4b361562', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Forum reply";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 33 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '43', + 'identifier' => 'event', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '563cb5edc2adfd2b240efa456c81525f', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Event";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 34 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<short_title|title>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '44', + 'identifier' => 'event_calendar', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '020cbeb6382c8c89dcec2cd406fb47a8', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Event calendar";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 35 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '45', + 'identifier' => 'banner', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '9cb558e25fd946246bbb32950c00228e', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Banner";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 36 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<title>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '46', + 'identifier' => 'forums', + 'initial_language_id' => '8', + 'is_container' => '1', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '60a921e54c1efbb9456bd2283d9e66cb', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Forums";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), + 37 => + array ( + 'always_available' => '0', + 'contentobject_name' => '<name>', + 'created' => '1343141327', + 'creator_id' => '14', + 'id' => '47', + 'identifier' => 'silverlight', + 'initial_language_id' => '8', + 'is_container' => '0', + 'language_mask' => '9', + 'modified' => '1343141327', + 'modifier_id' => '14', + 'remote_id' => '8ab17aae77dd4f24b5a8e835784e96e7', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Silverlight";s:16:"always-available";s:6:"eng-GB";}', + 'sort_field' => '1', + 'sort_order' => '1', + 'url_alias_name' => '', + 'version' => '0', + ), +), +'ezcontentclass_attribute' => +array ( + 0 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'Folder', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '4', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 1 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '3', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '6', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 2 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '3', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => '0', + ), + 3 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'identifier' => 'first_name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"First name";}', + 'version' => '0', + ), + 4 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '9', + 'identifier' => 'last_name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Last name";}', + 'version' => '0', + ), + 5 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezuser', + 'id' => '12', + 'identifier' => 'user_account', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"User account";}', + 'version' => '0', + ), + 6 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '119', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Summary";}', + 'version' => '0', + ), + 7 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '100', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '149', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Subject";}', + 'version' => '0', + ), + 8 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '150', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:6:"Author";}', + 'version' => '0', + ), + 9 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '13', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '151', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:7:"Message";}', + 'version' => '0', + ), + 10 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '100', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '155', + 'identifier' => 'short_name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Short name";}', + 'version' => '0', + ), + 11 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '156', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Description";}', + 'version' => '0', + ), + 12 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '1', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '158', + 'identifier' => 'show_children', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Display sub items";}', + 'version' => '0', + ), + 13 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '159', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Name";}', + 'version' => '0', + ), + 14 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'IndexPage', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'identifier' => 'indexpage', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:10:"Index Page";}', + 'version' => '0', + ), + 15 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'DefaultPage', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'identifier' => 'defaultpage', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Default Page";}', + 'version' => '0', + ), + 16 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugOutput', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'identifier' => 'debugoutput', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Debug Output";}', + 'version' => '0', + ), + 17 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugByIP', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'identifier' => 'debugbyip', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:11:"Debug By IP";}', + 'version' => '0', + ), + 18 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugIPList', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'identifier' => 'debugiplist', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:13:"Debug IP List";}', + 'version' => '0', + ), + 19 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'DebugSettings', + 'data_text3' => 'DebugRedirection', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'identifier' => 'debugredirection', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Debug Redirection";}', + 'version' => '0', + ), + 20 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'ContentSettings', + 'data_text3' => 'ViewCaching', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'identifier' => 'viewcaching', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '8', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"View Caching";}', + 'version' => '0', + ), + 21 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'TemplateSettings', + 'data_text3' => 'TemplateCache', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'identifier' => 'templatecache', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:14:"Template Cache";}', + 'version' => '0', + ), + 22 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'TemplateSettings', + 'data_text3' => 'TemplateCompile', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'identifier' => 'templatecompile', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '10', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Template Compile";}', + 'version' => '0', + ), + 23 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'small', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'identifier' => 'imagesmall', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '11', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Image Small Size";}', + 'version' => '0', + ), + 24 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'medium', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'identifier' => 'imagemedium', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:17:"Image Medium Size";}', + 'version' => '0', + ), + 25 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '14', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'image.ini', + 'data_text2' => 'large', + 'data_text3' => 'Filters', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'identifier' => 'imagelarge', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '13', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:16:"Image Large Size";}', + 'version' => '0', + ), + 26 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'SiteName', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '172', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Title";}', + 'version' => '0', + ), + 27 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '6', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'MetaDataArray', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '173', + 'identifier' => 'meta_data', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Meta data";}', + 'version' => '0', + ), + 28 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '174', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Image";}', + 'version' => '0', + ), + 29 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'sitestyle', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpackage', + 'id' => '175', + 'identifier' => 'sitestyle', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Sitestyle";}', + 'version' => '0', + ), + 30 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'MailSettings', + 'data_text3' => 'AdminEmail', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '177', + 'identifier' => 'email', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Email";}', + 'version' => '0', + ), + 31 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'site.ini', + 'data_text2' => 'SiteSettings', + 'data_text3' => 'SiteURL', + 'data_text4' => '', + 'data_text5' => 'override;user;admin;demo', + 'data_type_string' => 'ezinisetting', + 'id' => '178', + 'identifier' => 'siteurl', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:8:"Site URL";}', + 'version' => '0', + ), + 32 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '179', + 'identifier' => 'signature', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:9:"Signature";}', + 'version' => '0', + ), + 33 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '4', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_description_list' => 'a:2:{i:0;s:0:"";s:16:"always-available";b:0;}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:5:"Image";}', + 'version' => '0', + ), + 34 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '181', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:4:"Tags";}', + 'version' => '0', + ), + 35 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '1', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '182', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-GB";s:0:"";s:16:"always-available";s:6:"eng-GB";}', + 'serialized_name_list' => 'a:2:{s:16:"always-available";s:6:"eng-US";s:6:"eng-US";s:12:"Publish date";}', + 'version' => '0', + ), + 36 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New article', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '183', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 37 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '184', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 38 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '185', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 39 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '186', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 40 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '187', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 41 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '188', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 42 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '189', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 43 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '190', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 44 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '191', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 45 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '192', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 46 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '193', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 47 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '16', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsrrating', + 'id' => '194', + 'identifier' => 'star_rating', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Star Rating";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 48 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '195', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 49 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '196', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 50 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '197', + 'identifier' => 'index_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Index title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 51 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '198', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 52 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '199', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 53 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '15', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '200', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 54 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '201', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 55 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '202', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 56 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '203', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 57 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '204', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 58 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '205', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 59 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '17', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '206', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 60 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '207', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 61 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '208', + 'identifier' => 'index_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Index title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 62 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '15', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '209', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 63 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '18', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '210', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 64 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '211', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 65 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '212', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 66 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '19', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '213', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 67 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '214', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 68 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '25', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '215', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 69 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '216', + 'identifier' => 'publication_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:16:"Publication date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 70 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '217', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 71 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '218', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 72 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '20', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '219', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 73 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '220', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 74 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '221', + 'identifier' => 'product_number', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Product number";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 75 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '222', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Short description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 76 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '223', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 77 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '1', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezprice', + 'id' => '224', + 'identifier' => 'price', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Price";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 78 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '225', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 79 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '226', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 80 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmultioption', + 'id' => '227', + 'identifier' => 'additional_options', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Additional options";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 81 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '21', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '228', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 82 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '229', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 83 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '230', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 84 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '231', + 'identifier' => 'sender_name', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Sender name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 85 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '232', + 'identifier' => 'subject', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 86 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '233', + 'identifier' => 'message', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 87 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezemail', + 'id' => '234', + 'identifier' => 'email', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Email";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 88 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '22', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezemail', + 'id' => '235', + 'identifier' => 'recipient', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Recipient";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 89 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '236', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 90 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpage', + 'id' => '237', + 'identifier' => 'page', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Layout";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 91 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '23', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '238', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 92 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '239', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 93 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '240', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 94 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '241', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 95 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '24', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '242', + 'identifier' => 'show_children', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Display sub items";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 96 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '243', + 'identifier' => 'header', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Header";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 97 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '244', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 98 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '245', + 'identifier' => 'image_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"URL (image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 99 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '246', + 'identifier' => 'content', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Content";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 100 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '25', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '247', + 'identifier' => 'url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:3:"URL";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 101 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '248', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 102 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '249', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 103 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '26', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '<?xml version="1.0" encoding="utf-8"?> +<related-objects><constraints><allowed-class contentclass-identifier="event_calendar"/></constraints><type value="2"/><selection_type value="0"/><object_class value=""/><contentobject-placement/></related-objects> +', + 'data_type_string' => 'ezobjectrelationlist', + 'id' => '250', + 'identifier' => 'calendars', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Calendars";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 104 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '251', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 105 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '252', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 106 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '27', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezoption', + 'id' => '253', + 'identifier' => 'question', + 'is_information_collector' => '1', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Question";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 107 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New file', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '254', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 108 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '255', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 109 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezbinaryfile', + 'id' => '256', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 110 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '28', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '257', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 111 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '258', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 112 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '259', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 113 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'flash', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '260', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 114 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '29', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '261', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 115 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '262', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 116 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '263', + 'identifier' => 'stream_server', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:13:"Stream server";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 117 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '264', + 'identifier' => 'file_server', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"File server";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 118 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '30', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'ThisIsTheDefaultKeyChangeMe', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '265', + 'identifier' => 'key', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:3:"Key";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 119 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '266', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 120 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '267', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 121 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'flash', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '268', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 122 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '31', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '269', + 'identifier' => 'thumbnail', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Thumbnail";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 123 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '270', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 124 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '32', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezpage', + 'id' => '271', + 'identifier' => 'page', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Layout";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 125 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '150', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '272', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 126 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '273', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Caption";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 127 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '2', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '274', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 128 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '33', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '275', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 129 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '276', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 130 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '277', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 131 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '278', + 'identifier' => 'location', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Location";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 132 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '34', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '1', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '279', + 'identifier' => 'open_in_new_window', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:18:"Open in new window";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 133 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '280', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 134 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '281', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 135 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'quick_time', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '282', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 136 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '35', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '283', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 137 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '284', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 138 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '285', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 139 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'windows_media_player', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '286', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 140 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '36', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '287', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 141 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '37', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '288', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 142 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '37', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '289', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 143 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '37', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'real_player', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '290', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 144 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '37', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '291', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 145 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '292', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 146 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '293', + 'identifier' => 'short_description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:17:"Short description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 147 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '294', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 148 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '38', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezobjectrelation', + 'id' => '295', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 149 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'New article', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '296', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 150 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '255', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '297', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 151 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezauthor', + 'id' => '298', + 'identifier' => 'author', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Author";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 152 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '299', + 'identifier' => 'intro', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Summary";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 153 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '20', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '300', + 'identifier' => 'body', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Body";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 154 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '301', + 'identifier' => 'enable_comments', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Enable comments";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 155 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '302', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '7', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 156 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '303', + 'identifier' => 'caption', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '8', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:15:"Caption (Image)";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 157 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '304', + 'identifier' => 'publish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '9', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:12:"Publish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 158 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '305', + 'identifier' => 'unpublish_date', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '10', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:14:"Unpublish date";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 159 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '306', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '11', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 160 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '39', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezgmaplocation', + 'id' => '307', + 'identifier' => 'location', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '12', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Location";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 161 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '308', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 162 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '40', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '309', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 163 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '310', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 164 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '311', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 165 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '312', + 'identifier' => 'sticky', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:6:"Sticky";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 166 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '41', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezsubtreesubscription', + 'id' => '313', + 'identifier' => 'notify_me', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:23:"Notify me about updates";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 167 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '314', + 'identifier' => 'subject', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Subject";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 168 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '42', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '315', + 'identifier' => 'message', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"Message";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 169 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '55', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '316', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Full title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 170 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '19', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '317', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 171 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '318', + 'identifier' => 'text', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Text";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 172 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '319', + 'identifier' => 'category', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:8:"Category";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 173 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '1', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '320', + 'identifier' => 'from_time', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"From Time";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 174 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '43', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '321', + 'identifier' => 'to_time', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '6', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:7:"To Time";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 175 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '44', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '65', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '322', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:10:"Full Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 176 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '44', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '25', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '323', + 'identifier' => 'short_title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Short Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 177 => + array ( + 'can_translate' => '0', + 'category' => '', + 'contentclass_id' => '44', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '<?xml version="1.0" encoding="utf-8"?> +<ezselection><options><option id="0" name="Calendar"/><option id="1" name="Program"/></options></ezselection> +', + 'data_type_string' => 'ezselection', + 'id' => '324', + 'identifier' => 'view', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"View";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 178 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '45', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '325', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 179 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '45', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '326', + 'identifier' => 'url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:3:"URL";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 180 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '45', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezimage', + 'id' => '327', + 'identifier' => 'image', + 'is_information_collector' => '0', + 'is_required' => '1', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Image";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 181 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '45', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '328', + 'identifier' => 'image_map', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '4', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:9:"Image map";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 182 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '45', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '329', + 'identifier' => 'tags', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '5', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Tags";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 183 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '46', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '330', + 'identifier' => 'title', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:5:"Title";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 184 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '46', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '331', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 185 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '47', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '332', + 'identifier' => 'name', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '1', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"Name";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 186 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '47', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '5', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '333', + 'identifier' => 'description', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '1', + 'placement' => '2', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:11:"Description";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 187 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '47', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => 'silverlight', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezmedia', + 'id' => '334', + 'identifier' => 'file', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '3', + 'serialized_data_text' => 'a:0:{}', + 'serialized_description_list' => 'a:0:{}', + 'serialized_name_list' => 'a:2:{s:6:"eng-GB";s:4:"File";s:16:"always-available";s:6:"eng-GB";}', + 'version' => '0', + ), + 188 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '335', + 'identifier' => 'site_map_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '8', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:12:"Site map URL";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 189 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezurl', + 'id' => '336', + 'identifier' => 'tag_cloud_url', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '9', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:13:"Tag Cloud URL";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 190 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '337', + 'identifier' => 'login_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '10', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:13:"Login (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 191 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '338', + 'identifier' => 'logout_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '11', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:14:"Logout (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 192 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '339', + 'identifier' => 'my_profile_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '12', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:18:"My profile (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 193 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '340', + 'identifier' => 'register_user_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '13', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:25:"Register new user (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 194 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '341', + 'identifier' => 'rss_feed', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '14', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:8:"RSS feed";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 195 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '342', + 'identifier' => 'shopping_basket_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '15', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:23:"Shopping basket (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 196 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezstring', + 'id' => '343', + 'identifier' => 'site_settings_label', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '16', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:21:"Site settings (label)";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 197 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '344', + 'identifier' => 'footer_text', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '17', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:11:"Footer text";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 198 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '0', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'ezboolean', + 'id' => '345', + 'identifier' => 'hide_powered_by', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '18', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:17:"Hide "Powered by"";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), + 199 => + array ( + 'can_translate' => '1', + 'category' => '', + 'contentclass_id' => '15', + 'data_float1' => '0', + 'data_float2' => '0', + 'data_float3' => '0', + 'data_float4' => '0', + 'data_int1' => '10', + 'data_int2' => '0', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'data_text5' => '', + 'data_type_string' => 'eztext', + 'id' => '346', + 'identifier' => 'footer_script', + 'is_information_collector' => '0', + 'is_required' => '0', + 'is_searchable' => '0', + 'placement' => '19', + 'serialized_data_text' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_description_list' => 'a:2:{s:6:"eng-US";s:0:"";s:16:"always-available";s:6:"eng-US";}', + 'serialized_name_list' => 'a:2:{s:6:"eng-US";s:17:"Footer Javascript";s:16:"always-available";s:6:"eng-US";}', + 'version' => '0', + ), +), +'ezcontentclass_classgroup' => +array ( + 0 => + array ( + 'contentclass_id' => '1', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 1 => + array ( + 'contentclass_id' => '3', + 'contentclass_version' => '0', + 'group_id' => '2', + 'group_name' => 'Users', + ), + 2 => + array ( + 'contentclass_id' => '4', + 'contentclass_version' => '0', + 'group_id' => '2', + 'group_name' => 'Users', + ), + 3 => + array ( + 'contentclass_id' => '13', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 4 => + array ( + 'contentclass_id' => '14', + 'contentclass_version' => '0', + 'group_id' => '4', + 'group_name' => 'Setup', + ), + 5 => + array ( + 'contentclass_id' => '15', + 'contentclass_version' => '0', + 'group_id' => '4', + 'group_name' => 'Setup', + ), + 6 => + array ( + 'contentclass_id' => '16', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 7 => + array ( + 'contentclass_id' => '17', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 8 => + array ( + 'contentclass_id' => '18', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 9 => + array ( + 'contentclass_id' => '19', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 10 => + array ( + 'contentclass_id' => '20', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 11 => + array ( + 'contentclass_id' => '21', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 12 => + array ( + 'contentclass_id' => '22', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 13 => + array ( + 'contentclass_id' => '23', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 14 => + array ( + 'contentclass_id' => '24', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 15 => + array ( + 'contentclass_id' => '25', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 16 => + array ( + 'contentclass_id' => '26', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 17 => + array ( + 'contentclass_id' => '27', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 18 => + array ( + 'contentclass_id' => '28', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 19 => + array ( + 'contentclass_id' => '29', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 20 => + array ( + 'contentclass_id' => '30', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 21 => + array ( + 'contentclass_id' => '31', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 22 => + array ( + 'contentclass_id' => '32', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 23 => + array ( + 'contentclass_id' => '33', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 24 => + array ( + 'contentclass_id' => '34', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 25 => + array ( + 'contentclass_id' => '35', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 26 => + array ( + 'contentclass_id' => '36', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 27 => + array ( + 'contentclass_id' => '37', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), + 28 => + array ( + 'contentclass_id' => '38', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 29 => + array ( + 'contentclass_id' => '39', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 30 => + array ( + 'contentclass_id' => '40', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 31 => + array ( + 'contentclass_id' => '41', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 32 => + array ( + 'contentclass_id' => '42', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 33 => + array ( + 'contentclass_id' => '43', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 34 => + array ( + 'contentclass_id' => '44', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 35 => + array ( + 'contentclass_id' => '45', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 36 => + array ( + 'contentclass_id' => '46', + 'contentclass_version' => '0', + 'group_id' => '1', + 'group_name' => 'Content', + ), + 37 => + array ( + 'contentclass_id' => '47', + 'contentclass_version' => '0', + 'group_id' => '3', + 'group_name' => 'Media', + ), +), +'ezcontentclass_name' => +array ( + 0 => + array ( + 'contentclass_id' => '1', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Folder', + ), + 1 => + array ( + 'contentclass_id' => '3', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'User group', + ), + 2 => + array ( + 'contentclass_id' => '4', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'User', + ), + 3 => + array ( + 'contentclass_id' => '13', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Comment', + ), + 4 => + array ( + 'contentclass_id' => '14', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Common ini settings', + ), + 5 => + array ( + 'contentclass_id' => '15', + 'contentclass_version' => '0', + 'language_id' => '3', + 'language_locale' => 'eng-US', + 'name' => 'Template look', + ), + 6 => + array ( + 'contentclass_id' => '16', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Article', + ), + 7 => + array ( + 'contentclass_id' => '17', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Article (main-page)', + ), + 8 => + array ( + 'contentclass_id' => '18', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Article (sub-page)', + ), + 9 => + array ( + 'contentclass_id' => '19', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Blog', + ), + 10 => + array ( + 'contentclass_id' => '20', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Blog post', + ), + 11 => + array ( + 'contentclass_id' => '21', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Product', + ), + 12 => + array ( + 'contentclass_id' => '22', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Feedback form', + ), + 13 => + array ( + 'contentclass_id' => '23', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Frontpage', + ), + 14 => + array ( + 'contentclass_id' => '24', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Documentation page', + ), + 15 => + array ( + 'contentclass_id' => '25', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Infobox', + ), + 16 => + array ( + 'contentclass_id' => '26', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Multicalendar', + ), + 17 => + array ( + 'contentclass_id' => '27', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Poll', + ), + 18 => + array ( + 'contentclass_id' => '28', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'File', + ), + 19 => + array ( + 'contentclass_id' => '29', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Flash', + ), + 20 => + array ( + 'contentclass_id' => '30', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Flash recorder', + ), + 21 => + array ( + 'contentclass_id' => '31', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Video/Flash Player', + ), + 22 => + array ( + 'contentclass_id' => '32', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Global layout', + ), + 23 => + array ( + 'contentclass_id' => '33', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Image', + ), + 24 => + array ( + 'contentclass_id' => '34', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Link', + ), + 25 => + array ( + 'contentclass_id' => '35', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Quicktime', + ), + 26 => + array ( + 'contentclass_id' => '36', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Windows media', + ), + 27 => + array ( + 'contentclass_id' => '37', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Real video', + ), + 28 => + array ( + 'contentclass_id' => '38', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Gallery', + ), + 29 => + array ( + 'contentclass_id' => '39', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Geo Article', + ), + 30 => + array ( + 'contentclass_id' => '40', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forum', + ), + 31 => + array ( + 'contentclass_id' => '41', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forum topic', + ), + 32 => + array ( + 'contentclass_id' => '42', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forum reply', + ), + 33 => + array ( + 'contentclass_id' => '43', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Event', + ), + 34 => + array ( + 'contentclass_id' => '44', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Event calendar', + ), + 35 => + array ( + 'contentclass_id' => '45', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Banner', + ), + 36 => + array ( + 'contentclass_id' => '46', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Forums', + ), + 37 => + array ( + 'contentclass_id' => '47', + 'contentclass_version' => '0', + 'language_id' => '9', + 'language_locale' => 'eng-GB', + 'name' => 'Silverlight', + ), +), +'ezcontentclassgroup' => +array ( + 0 => + array ( + 'created' => '1031216928', + 'creator_id' => '14', + 'id' => '1', + 'modified' => '1033922106', + 'modifier_id' => '14', + 'name' => 'Content', + ), + 1 => + array ( + 'created' => '1031216941', + 'creator_id' => '14', + 'id' => '2', + 'modified' => '1033922113', + 'modifier_id' => '14', + 'name' => 'Users', + ), + 2 => + array ( + 'created' => '1032009743', + 'creator_id' => '14', + 'id' => '3', + 'modified' => '1033922120', + 'modifier_id' => '14', + 'name' => 'Media', + ), + 3 => + array ( + 'created' => '1081858024', + 'creator_id' => '14', + 'id' => '4', + 'modified' => '1081858024', + 'modifier_id' => '14', + 'name' => 'Setup', + ), +), +'ezcontentobject' => +array ( + 0 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033917596', + 'name' => 'Users', + 'owner_id' => '14', + 'published' => '1033917596', + 'remote_id' => 'f5c88a2209584891056f987fd965b0ba', + 'section_id' => '2', + 'status' => '1', + ), + 1 => + array ( + 'contentclass_id' => '4', + 'current_version' => '2', + 'id' => '10', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'name' => 'Anonymous User', + 'owner_id' => '14', + 'published' => '1033920665', + 'remote_id' => 'faaeb9be3bd98ed09f606fc16d144eca', + 'section_id' => '2', + 'status' => '1', + ), + 2 => + array ( + 'contentclass_id' => '3', + 'current_version' => '2', + 'id' => '11', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343141332', + 'name' => 'Members', + 'owner_id' => '14', + 'published' => '1033920746', + 'remote_id' => '5f7f0bdb3381d6a461d8c29ff53d908f', + 'section_id' => '2', + 'status' => '1', + ), + 3 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '12', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'name' => 'Administrator users', + 'owner_id' => '14', + 'published' => '1033920775', + 'remote_id' => '9b47a45624b023b1a76c73b74d704acf', + 'section_id' => '2', + 'status' => '1', + ), + 4 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '13', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'name' => 'Editors', + 'owner_id' => '14', + 'published' => '1033920794', + 'remote_id' => '3c160cca19fb135f83bd02d911f04db2', + 'section_id' => '2', + 'status' => '1', + ), + 5 => + array ( + 'contentclass_id' => '4', + 'current_version' => '4', + 'id' => '14', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343141330', + 'name' => 'Administrator User', + 'owner_id' => '14', + 'published' => '1033920830', + 'remote_id' => '1bb4fe25487f05527efa8bfd394cecc7', + 'section_id' => '2', + 'status' => '1', + ), + 6 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '41', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'name' => 'Media', + 'owner_id' => '14', + 'published' => '1060695457', + 'remote_id' => 'a6e35cbcb7cd6ae4b691f3eee30cd262', + 'section_id' => '3', + 'status' => '1', + ), + 7 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '42', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'name' => 'Anonymous Users', + 'owner_id' => '14', + 'published' => '1072180330', + 'remote_id' => '15b256dbea2ae72418ff5facc999e8f9', + 'section_id' => '2', + 'status' => '1', + ), + 8 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '45', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'name' => 'Setup', + 'owner_id' => '14', + 'published' => '1079684190', + 'remote_id' => '241d538ce310074e602f29f49e44e938', + 'section_id' => '4', + 'status' => '1', + ), + 9 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '49', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'name' => 'Images', + 'owner_id' => '14', + 'published' => '1080220197', + 'remote_id' => 'e7ff633c6b8e0fd3531e74c6e712bead', + 'section_id' => '3', + 'status' => '1', + ), + 10 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '50', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'name' => 'Files', + 'owner_id' => '14', + 'published' => '1080220220', + 'remote_id' => '732a5acd01b51a6fe6eab448ad4138a9', + 'section_id' => '3', + 'status' => '1', + ), + 11 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '51', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'name' => 'Multimedia', + 'owner_id' => '14', + 'published' => '1080220233', + 'remote_id' => '09082deb98662a104f325aaa8c4933d3', + 'section_id' => '3', + 'status' => '1', + ), + 12 => + array ( + 'contentclass_id' => '14', + 'current_version' => '1', + 'id' => '52', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'name' => 'Common INI settings', + 'owner_id' => '14', + 'published' => '1082016591', + 'remote_id' => '27437f3547db19cf81a33c92578b2c89', + 'section_id' => '4', + 'status' => '1', + ), + 13 => + array ( + 'contentclass_id' => '15', + 'current_version' => '2', + 'id' => '54', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062376', + 'name' => 'eZ Flow (without demo content)', + 'owner_id' => '14', + 'published' => '1082016652', + 'remote_id' => '8b8b22fe3c6061ed500fbd2b377b885f', + 'section_id' => '5', + 'status' => '1', + ), + 14 => + array ( + 'contentclass_id' => '1', + 'current_version' => '1', + 'id' => '56', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023132', + 'name' => 'Design', + 'owner_id' => '14', + 'published' => '1103023132', + 'remote_id' => '08799e609893f7aba22f10cb466d9cc8', + 'section_id' => '5', + 'status' => '1', + ), + 15 => + array ( + 'contentclass_id' => '23', + 'current_version' => '1', + 'id' => '57', + 'initial_language_id' => '8', + 'language_mask' => '9', + 'modified' => '1196268696', + 'name' => 'Home', + 'owner_id' => '14', + 'published' => '1195480486', + 'remote_id' => '8a9c9c761004866fb458d89910f52bee', + 'section_id' => '1', + 'status' => '1', + ), + 16 => + array ( + 'contentclass_id' => '3', + 'current_version' => '1', + 'id' => '58', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343141332', + 'name' => 'Partners', + 'owner_id' => '14', + 'published' => '1343141332', + 'remote_id' => 'a08190ee0ef21c46d238dcbf7c08801f', + 'section_id' => '2', + 'status' => '1', + ), +), +'ezcontentobject_attribute' => +array ( + 0 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Main group', + 'data_type_string' => 'ezstring', + 'id' => '7', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 1 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '4', + 'data_float' => NULL, + 'data_int' => NULL, + 'data_text' => 'Users', + 'data_type_string' => 'ezstring', + 'id' => '8', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 2 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous', + 'data_type_string' => 'ezstring', + 'id' => '19', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous', + 'version' => '2', + ), + 3 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '20', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '2', + ), + 4 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '21', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 5 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Guest accounts', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 6 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Members', + 'data_type_string' => 'ezstring', + 'id' => '22', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'members', + 'version' => '2', + ), + 7 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 8 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '11', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '23', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 9 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator users', + 'data_type_string' => 'ezstring', + 'id' => '24', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 10 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '12', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '25', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 11 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Editors', + 'data_type_string' => 'ezstring', + 'id' => '26', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 12 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '13', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '27', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 13 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '3', + ), + 14 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '8', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Administrator', + 'data_type_string' => 'ezstring', + 'id' => '28', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'administrator', + 'version' => '4', + ), + 15 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '3', + ), + 16 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '9', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User', + 'data_type_string' => 'ezstring', + 'id' => '29', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user', + 'version' => '4', + ), + 17 => + array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 18 => + array ( + 'attribute_original_id' => '30', + 'contentclassattribute_id' => '12', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezuser', + 'id' => '30', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 19 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Media', + 'data_type_string' => 'ezstring', + 'id' => '98', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 20 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '99', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 21 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Anonymous Users', + 'data_type_string' => 'ezstring', + 'id' => '100', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'anonymous users', + 'version' => '1', + ), + 22 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '42', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'User group for the anonymous user', + 'data_type_string' => 'ezstring', + 'id' => '101', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'user group for the anonymous user', + 'version' => '1', + ), + 23 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '103', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 24 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '', + 'data_type_string' => 'ezxmltext', + 'id' => '105', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 25 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '109', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 26 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Setup', + 'data_type_string' => 'ezstring', + 'id' => '123', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'setup', + 'version' => '1', + ), + 27 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '124', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 28 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '125', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 29 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '126', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 30 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '128', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 31 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Images', + 'data_type_string' => 'ezstring', + 'id' => '142', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'images', + 'version' => '1', + ), + 32 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '143', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 33 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '144', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 34 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '145', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 35 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '146', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 36 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Files', + 'data_type_string' => 'ezstring', + 'id' => '147', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'files', + 'version' => '1', + ), + 37 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '148', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 38 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '149', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 39 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '150', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 40 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '151', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 41 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Multimedia', + 'data_type_string' => 'ezstring', + 'id' => '152', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'multimedia', + 'version' => '1', + ), + 42 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '153', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 43 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '154', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 44 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '155', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 45 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '156', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 46 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '159', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'Common INI settings', + 'data_type_string' => 'ezstring', + 'id' => '157', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'common ini settings', + 'version' => '1', + ), + 47 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '160', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2/', + 'data_type_string' => 'ezinisetting', + 'id' => '158', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 48 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '161', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '/content/view/full/2', + 'data_type_string' => 'ezinisetting', + 'id' => '159', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 49 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '162', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '160', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 50 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '163', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '161', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 51 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '164', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezinisetting', + 'id' => '162', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 52 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '165', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '163', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 53 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '166', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'disabled', + 'data_type_string' => 'ezinisetting', + 'id' => '164', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 54 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '167', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '165', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 55 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '168', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'enabled', + 'data_type_string' => 'ezinisetting', + 'id' => '166', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 56 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '169', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=100;100', + 'data_type_string' => 'ezinisetting', + 'id' => '167', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 57 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '170', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=200;200', + 'data_type_string' => 'ezinisetting', + 'id' => '168', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 58 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '171', + 'contentobject_id' => '52', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '=geometry/scale=300;300', + 'data_type_string' => 'ezinisetting', + 'id' => '169', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 59 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '172', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'eZ Flow (without demo content)', + 'data_type_string' => 'ezinisetting', + 'id' => '170', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 60 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '173', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'author=eZ Systems +copyright=eZ Systems +description=Content Management System +keywords=cms, publish, e-commerce, content management, development framework', + 'data_type_string' => 'ezinisetting', + 'id' => '171', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 61 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '174', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="1" filename="eZ-Flow-without-demo-content1.png" suffix="png" basename="eZ-Flow-without-demo-content1" dirpath="var/ezflow_site/storage/images/design/plain-site/172-2-eng-US" url="var/ezflow_site/storage/images/design/plain-site/172-2-eng-US/eZ-Flow-without-demo-content1.png" original_filename="logo.png" mime_type="image/png" width="150" height="39" alternative_text="" alias_key="1293033771" timestamp="1343141332"><original attribute_id="172" attribute_version="2" attribute_language="eng-US"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '172', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 62 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '175', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '0', + 'data_type_string' => 'ezpackage', + 'id' => '173', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '0', + 'version' => '2', + ), + 63 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '177', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'spam@ez.no', + 'data_type_string' => 'ezinisetting', + 'id' => '175', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 64 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '178', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => 'ws2/dump_47_flow/index.php', + 'data_type_string' => 'ezinisetting', + 'id' => '176', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 65 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '177', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 66 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 67 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '179', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '178', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 68 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '10', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezimage', + 'id' => '179', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 69 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '3', + ), + 70 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '180', + 'contentobject_id' => '14', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<ezimage serial_number="1" is_valid="" filename="" suffix="" basename="" dirpath="" url="" original_filename="" mime_type="" width="" height="" alternative_text="" alias_key="1293033771" timestamp="1301057722"><original attribute_id="180" attribute_version="3" attribute_language="eng-GB"/></ezimage> +', + 'data_type_string' => 'ezimage', + 'id' => '180', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '4', + ), + 71 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '4', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Design', + 'data_type_string' => 'ezstring', + 'id' => '181', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'design', + 'version' => '1', + ), + 72 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '155', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '182', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 73 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '119', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '183', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 74 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '156', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1045487555', + 'data_text' => '<?xml version="1.0" encoding="utf-8"?> +<section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" + xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" + xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/" />', + 'data_type_string' => 'ezxmltext', + 'id' => '184', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 75 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '158', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '1', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '185', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '1', + 'sort_key_string' => '', + 'version' => '1', + ), + 76 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '187', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 77 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '188', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 78 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '189', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 79 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '190', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 80 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '191', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 81 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '181', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '192', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 82 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '41', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '194', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 83 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '45', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '195', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 84 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '49', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '196', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 85 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '50', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '197', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 86 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '51', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '198', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 87 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '182', + 'contentobject_id' => '56', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezdatetime', + 'id' => '199', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 88 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '236', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Home', + 'data_type_string' => 'ezstring', + 'id' => '200', + 'language_code' => 'eng-GB', + 'language_id' => '9', + 'sort_key_int' => '0', + 'sort_key_string' => 'home', + 'version' => '1', + ), + 89 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '237', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '<?xml version="1.0"?> +<page> +<zone_layout>2ZonesLayout1</zone_layout> +<zone id="id_4f6d946ab48d95799d31179c3acde8cb"> + <zone_identifier>left</zone_identifier> + <block id="id_ab9e386be359563619c639ea52acd75d"> + <name></name> + <zone_id>4f6d946ab48d95799d31179c3acde8cb</zone_id> + <type>DemoBlock</type> + <view>demoblock</view> + </block> +</zone> +<zone id="id_a1117aa7fd4548568490cc7ab1271a4b"> + <zone_identifier>right</zone_identifier> +</zone> +</page> +', + 'data_type_string' => 'ezpage', + 'id' => '201', + 'language_code' => 'eng-GB', + 'language_id' => '9', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 90 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '238', + 'contentobject_id' => '57', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezkeyword', + 'id' => '202', + 'language_code' => 'eng-GB', + 'language_id' => '9', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), + 91 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '335', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '23', + 'data_text' => 'Site map', + 'data_type_string' => 'ezurl', + 'id' => '203', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 92 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '336', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '24', + 'data_text' => 'Tag cloud', + 'data_type_string' => 'ezurl', + 'id' => '204', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 93 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '337', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Login', + 'data_type_string' => 'ezstring', + 'id' => '205', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'login', + 'version' => '2', + ), + 94 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '338', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Logout', + 'data_type_string' => 'ezstring', + 'id' => '206', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'logout', + 'version' => '2', + ), + 95 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '339', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'My profile', + 'data_type_string' => 'ezstring', + 'id' => '207', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'my profile', + 'version' => '2', + ), + 96 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '340', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Register', + 'data_type_string' => 'ezstring', + 'id' => '208', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'register', + 'version' => '2', + ), + 97 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '341', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '/rss/feed/my_feed', + 'data_type_string' => 'ezstring', + 'id' => '209', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '/rss/feed/my_feed', + 'version' => '2', + ), + 98 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '342', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Shopping basket', + 'data_type_string' => 'ezstring', + 'id' => '210', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'shopping basket', + 'version' => '2', + ), + 99 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '343', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Site settings', + 'data_type_string' => 'ezstring', + 'id' => '211', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => 'site settings', + 'version' => '2', + ), + 100 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '344', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Copyright © 2012 <a href="http://ez.no" title="eZ Systems">eZ Systems AS</a> (except where otherwise noted). All rights reserved.', + 'data_type_string' => 'eztext', + 'id' => '212', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 101 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '345', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => '0', + 'data_text' => '', + 'data_type_string' => 'ezboolean', + 'id' => '213', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 102 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '346', + 'contentobject_id' => '54', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'eztext', + 'id' => '214', + 'language_code' => 'eng-US', + 'language_id' => '2', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '2', + ), + 103 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '6', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => 'Partners', + 'data_type_string' => 'ezstring', + 'id' => '215', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => 'partners', + 'version' => '1', + ), + 104 => + array ( + 'attribute_original_id' => '0', + 'contentclassattribute_id' => '7', + 'contentobject_id' => '58', + 'data_float' => '0', + 'data_int' => NULL, + 'data_text' => '', + 'data_type_string' => 'ezstring', + 'id' => '216', + 'language_code' => 'eng-US', + 'language_id' => '3', + 'sort_key_int' => '0', + 'sort_key_string' => '', + 'version' => '1', + ), +), +'ezcontentobject_link' => +array ( +), +'ezcontentobject_name' => +array ( + 0 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '4', + 'language_id' => '3', + 'name' => 'Users', + 'real_translation' => 'eng-US', + ), + 1 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '10', + 'language_id' => '3', + 'name' => 'Anonymous User', + 'real_translation' => 'eng-US', + ), + 2 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '11', + 'language_id' => '3', + 'name' => 'Guest accounts', + 'real_translation' => 'eng-US', + ), + 3 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '11', + 'language_id' => '3', + 'name' => 'Members', + 'real_translation' => 'eng-US', + ), + 4 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '12', + 'language_id' => '3', + 'name' => 'Administrator users', + 'real_translation' => 'eng-US', + ), + 5 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '13', + 'language_id' => '3', + 'name' => 'Editors', + 'real_translation' => 'eng-US', + ), + 6 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '3', + 'contentobject_id' => '14', + 'language_id' => '3', + 'name' => 'Administrator User', + 'real_translation' => 'eng-US', + ), + 7 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '4', + 'contentobject_id' => '14', + 'language_id' => '3', + 'name' => 'Administrator User', + 'real_translation' => 'eng-US', + ), + 8 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '41', + 'language_id' => '3', + 'name' => 'Media', + 'real_translation' => 'eng-US', + ), + 9 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '42', + 'language_id' => '3', + 'name' => 'Anonymous Users', + 'real_translation' => 'eng-US', + ), + 10 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '45', + 'language_id' => '3', + 'name' => 'Setup', + 'real_translation' => 'eng-US', + ), + 11 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '49', + 'language_id' => '3', + 'name' => 'Images', + 'real_translation' => 'eng-US', + ), + 12 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '50', + 'language_id' => '3', + 'name' => 'Files', + 'real_translation' => 'eng-US', + ), + 13 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '51', + 'language_id' => '3', + 'name' => 'Multimedia', + 'real_translation' => 'eng-US', + ), + 14 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '52', + 'language_id' => '2', + 'name' => 'Common INI settings', + 'real_translation' => 'eng-US', + ), + 15 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '2', + 'contentobject_id' => '54', + 'language_id' => '2', + 'name' => 'eZ Flow (without demo content)', + 'real_translation' => 'eng-US', + ), + 16 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '56', + 'language_id' => '3', + 'name' => 'Design', + 'real_translation' => 'eng-US', + ), + 17 => + array ( + 'content_translation' => 'eng-GB', + 'content_version' => '1', + 'contentobject_id' => '57', + 'language_id' => '9', + 'name' => 'Home', + 'real_translation' => 'eng-GB', + ), + 18 => + array ( + 'content_translation' => 'eng-US', + 'content_version' => '1', + 'contentobject_id' => '58', + 'language_id' => '3', + 'name' => 'Partners', + 'real_translation' => 'eng-US', + ), +), +'ezcontentobject_trash' => +array ( +), +'ezcontentobject_tree' => +array ( + 0 => + array ( + 'contentobject_id' => '0', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '0', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '1', + 'modified_subnode' => '1343141332', + 'node_id' => '1', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/', + 'priority' => '0', + 'remote_id' => '629709ba256fe317c3ddcee35453a96a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => + array ( + 'contentobject_id' => '57', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '2', + 'modified_subnode' => '1343141331', + 'node_id' => '2', + 'parent_node_id' => '1', + 'path_identification_string' => '', + 'path_string' => '/1/2/', + 'priority' => '0', + 'remote_id' => 'f3e90596361e31d496d4026eb624c983', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 2 => + array ( + 'contentobject_id' => '4', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '5', + 'modified_subnode' => '1343141332', + 'node_id' => '5', + 'parent_node_id' => '1', + 'path_identification_string' => 'users', + 'path_string' => '/1/5/', + 'priority' => '0', + 'remote_id' => '3f6d92f8044aed134f32153517850f5a', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 3 => + array ( + 'contentobject_id' => '11', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '12', + 'modified_subnode' => '1343141332', + 'node_id' => '12', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/members', + 'path_string' => '/1/5/12/', + 'priority' => '0', + 'remote_id' => '602dcf84765e56b7f999eaafd3821dd3', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => + array ( + 'contentobject_id' => '12', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '13', + 'modified_subnode' => '1343141330', + 'node_id' => '13', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/administrator_users', + 'path_string' => '/1/5/13/', + 'priority' => '0', + 'remote_id' => '769380b7aa94541679167eab817ca893', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => + array ( + 'contentobject_id' => '13', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '14', + 'modified_subnode' => '1081860719', + 'node_id' => '14', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/editors', + 'path_string' => '/1/5/14/', + 'priority' => '0', + 'remote_id' => 'f7dda2854fc68f7c8455d9cb14bd04a9', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => + array ( + 'contentobject_id' => '14', + 'contentobject_is_published' => '1', + 'contentobject_version' => '4', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '15', + 'modified_subnode' => '1343141330', + 'node_id' => '15', + 'parent_node_id' => '13', + 'path_identification_string' => 'users/administrator_users/administrator_user', + 'path_string' => '/1/5/13/15/', + 'priority' => '0', + 'remote_id' => 'e5161a99f733200b9ed4e80f9c16187b', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => + array ( + 'contentobject_id' => '41', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '43', + 'modified_subnode' => '1081860720', + 'node_id' => '43', + 'parent_node_id' => '1', + 'path_identification_string' => 'media', + 'path_string' => '/1/43/', + 'priority' => '0', + 'remote_id' => '75c715a51699d2d309a924eca6a95145', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 8 => + array ( + 'contentobject_id' => '42', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '44', + 'modified_subnode' => '1081860719', + 'node_id' => '44', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/anonymous_users', + 'path_string' => '/1/5/44/', + 'priority' => '0', + 'remote_id' => '4fdf0072da953bb276c0c7e0141c5c9b', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => + array ( + 'contentobject_id' => '10', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '3', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '45', + 'modified_subnode' => '1081860719', + 'node_id' => '45', + 'parent_node_id' => '44', + 'path_identification_string' => 'users/anonymous_users/anonymous_user', + 'path_string' => '/1/5/44/45/', + 'priority' => '0', + 'remote_id' => '2cf8343bee7b482bab82b269d8fecd76', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => + array ( + 'contentobject_id' => '45', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '48', + 'modified_subnode' => '1184592117', + 'node_id' => '48', + 'parent_node_id' => '1', + 'path_identification_string' => 'setup2', + 'path_string' => '/1/48/', + 'priority' => '0', + 'remote_id' => '182ce1b5af0c09fa378557c462ba2617', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => + array ( + 'contentobject_id' => '49', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '51', + 'modified_subnode' => '1081860720', + 'node_id' => '51', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/images', + 'path_string' => '/1/43/51/', + 'priority' => '0', + 'remote_id' => '1b26c0454b09bb49dfb1b9190ffd67cb', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => + array ( + 'contentobject_id' => '50', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '52', + 'modified_subnode' => '1081860720', + 'node_id' => '52', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/files', + 'path_string' => '/1/43/52/', + 'priority' => '0', + 'remote_id' => '0b113a208f7890f9ad3c24444ff5988c', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 13 => + array ( + 'contentobject_id' => '51', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '53', + 'modified_subnode' => '1081860720', + 'node_id' => '53', + 'parent_node_id' => '43', + 'path_identification_string' => 'media/multimedia', + 'path_string' => '/1/43/53/', + 'priority' => '0', + 'remote_id' => '4f18b82c75f10aad476cae5adf98c11f', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 14 => + array ( + 'contentobject_id' => '52', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '54', + 'modified_subnode' => '1184592117', + 'node_id' => '54', + 'parent_node_id' => '48', + 'path_identification_string' => 'setup2/common_ini_settings', + 'path_string' => '/1/48/54/', + 'priority' => '0', + 'remote_id' => 'fa9f3cff9cf90ecfae335718dcbddfe2', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => + array ( + 'contentobject_id' => '54', + 'contentobject_is_published' => '1', + 'contentobject_version' => '2', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '56', + 'modified_subnode' => '1343141331', + 'node_id' => '56', + 'parent_node_id' => '58', + 'path_identification_string' => 'design/plain_site', + 'path_string' => '/1/58/56/', + 'priority' => '0', + 'remote_id' => '772da20ecf88b3035d73cbdfcea0f119', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => + array ( + 'contentobject_id' => '56', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '1', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '58', + 'modified_subnode' => '1343141331', + 'node_id' => '58', + 'parent_node_id' => '1', + 'path_identification_string' => 'design', + 'path_string' => '/1/58/', + 'priority' => '0', + 'remote_id' => '79f2d67372ab56f59b5d65bb9e0ca3b9', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 17 => + array ( + 'contentobject_id' => '58', + 'contentobject_is_published' => '1', + 'contentobject_version' => '1', + 'depth' => '2', + 'is_hidden' => '0', + 'is_invisible' => '0', + 'main_node_id' => '60', + 'modified_subnode' => '1343141332', + 'node_id' => '60', + 'parent_node_id' => '5', + 'path_identification_string' => 'users/partners', + 'path_string' => '/1/5/60/', + 'priority' => '0', + 'remote_id' => '1fe2ca55fa0f370b828b837a2d9aa2a3', + 'sort_field' => '1', + 'sort_order' => '1', + ), +), +'ezcontentobject_version' => +array ( + 0 => + array ( + 'contentobject_id' => '4', + 'created' => '0', + 'creator_id' => '14', + 'id' => '4', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '0', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '1', + ), + 1 => + array ( + 'contentobject_id' => '11', + 'created' => '1033920737', + 'creator_id' => '14', + 'id' => '439', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920746', + 'status' => '3', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 2 => + array ( + 'contentobject_id' => '12', + 'created' => '1033920760', + 'creator_id' => '14', + 'id' => '440', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920775', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 3 => + array ( + 'contentobject_id' => '13', + 'created' => '1033920786', + 'creator_id' => '14', + 'id' => '441', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1033920794', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 4 => + array ( + 'contentobject_id' => '41', + 'created' => '1060695450', + 'creator_id' => '14', + 'id' => '472', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1060695457', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 5 => + array ( + 'contentobject_id' => '42', + 'created' => '1072180278', + 'creator_id' => '14', + 'id' => '473', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180330', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 6 => + array ( + 'contentobject_id' => '10', + 'created' => '1072180337', + 'creator_id' => '14', + 'id' => '474', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1072180405', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 7 => + array ( + 'contentobject_id' => '45', + 'created' => '1079684084', + 'creator_id' => '14', + 'id' => '477', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1079684190', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 8 => + array ( + 'contentobject_id' => '49', + 'created' => '1080220181', + 'creator_id' => '14', + 'id' => '488', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220197', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 9 => + array ( + 'contentobject_id' => '50', + 'created' => '1080220211', + 'creator_id' => '14', + 'id' => '489', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220220', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 10 => + array ( + 'contentobject_id' => '51', + 'created' => '1080220225', + 'creator_id' => '14', + 'id' => '490', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1080220233', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 11 => + array ( + 'contentobject_id' => '52', + 'created' => '1082016497', + 'creator_id' => '14', + 'id' => '491', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1082016591', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 12 => + array ( + 'contentobject_id' => '56', + 'created' => '1103023120', + 'creator_id' => '14', + 'id' => '495', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1103023120', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 13 => + array ( + 'contentobject_id' => '14', + 'created' => '1301061783', + 'creator_id' => '14', + 'id' => '499', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1301062024', + 'status' => '3', + 'user_id' => '0', + 'version' => '3', + 'workflow_event_pos' => '0', + ), + 14 => + array ( + 'contentobject_id' => '54', + 'created' => '1301062300', + 'creator_id' => '14', + 'id' => '500', + 'initial_language_id' => '2', + 'language_mask' => '2', + 'modified' => '1301062375', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), + 15 => + array ( + 'contentobject_id' => '57', + 'created' => '1196268655', + 'creator_id' => '14', + 'id' => '504', + 'initial_language_id' => '8', + 'language_mask' => '9', + 'modified' => '1196268696', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 16 => + array ( + 'contentobject_id' => '14', + 'created' => '1343141330', + 'creator_id' => '14', + 'id' => '505', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343141330', + 'status' => '1', + 'user_id' => '0', + 'version' => '4', + 'workflow_event_pos' => '0', + ), + 17 => + array ( + 'contentobject_id' => '58', + 'created' => '1343141332', + 'creator_id' => '14', + 'id' => '506', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343141332', + 'status' => '1', + 'user_id' => '0', + 'version' => '1', + 'workflow_event_pos' => '0', + ), + 18 => + array ( + 'contentobject_id' => '11', + 'created' => '1343141332', + 'creator_id' => '14', + 'id' => '507', + 'initial_language_id' => '2', + 'language_mask' => '3', + 'modified' => '1343141332', + 'status' => '1', + 'user_id' => '0', + 'version' => '2', + 'workflow_event_pos' => '0', + ), +), +'ezcurrencydata' => +array ( +), +'ezdiscountrule' => +array ( +), +'ezdiscountsubrule' => +array ( +), +'ezdiscountsubrule_value' => +array ( +), +'ezenumobjectvalue' => +array ( +), +'ezenumvalue' => +array ( +), +'ezforgot_password' => +array ( +), +'ezgeneral_digest_user_settings' => +array ( +), +'ezgmaplocation' => +array ( +), +'ezimagefile' => +array ( + 0 => + array ( + 'contentobject_attribute_id' => '172', + 'filepath' => 'var/storage/images/setup/ez_publish/172-1-eng-GB/ez_publish.', + 'id' => '1', + ), + 1 => + array ( + 'contentobject_attribute_id' => '172', + 'filepath' => 'var/ezflow_site/storage/images/design/plain-site/172-2-eng-US/eZ-Flow-without-demo-content1.png', + 'id' => '2', + ), +), +'ezinfocollection' => +array ( +), +'ezinfocollection_attribute' => +array ( +), +'ezisbn_group' => +array ( +/* 0 => + array ( + 'description' => 'English language', + 'group_number' => '0', + 'id' => '1', + ), + 1 => + array ( + 'description' => 'English language', + 'group_number' => '1', + 'id' => '2', + ), + 2 => + array ( + 'description' => 'French language', + 'group_number' => '2', + 'id' => '3', + ), + 3 => + array ( + 'description' => 'German language', + 'group_number' => '3', + 'id' => '4', + ), + 4 => + array ( + 'description' => 'Japan', + 'group_number' => '4', + 'id' => '5', + ), + 5 => + array ( + 'description' => 'Russian Federation and former USSR', + 'group_number' => '5', + 'id' => '6', + ), + 6 => + array ( + 'description' => 'Iran', + 'group_number' => '600', + 'id' => '7', + ), + 7 => + array ( + 'description' => 'Kazakhstan', + 'group_number' => '601', + 'id' => '8', + ), + 8 => + array ( + 'description' => 'Indonesia', + 'group_number' => '602', + 'id' => '9', + ), + 9 => + array ( + 'description' => 'Saudi Arabia', + 'group_number' => '603', + 'id' => '10', + ), + 10 => + array ( + 'description' => 'Vietnam', + 'group_number' => '604', + 'id' => '11', + ), + 11 => + array ( + 'description' => 'Turkey', + 'group_number' => '605', + 'id' => '12', + ), + 12 => + array ( + 'description' => 'Romania', + 'group_number' => '606', + 'id' => '13', + ), + 13 => + array ( + 'description' => 'Mexico', + 'group_number' => '607', + 'id' => '14', + ), + 14 => + array ( + 'description' => 'Macedonia', + 'group_number' => '608', + 'id' => '15', + ), + 15 => + array ( + 'description' => 'Lithuania', + 'group_number' => '609', + 'id' => '16', + ), + 16 => + array ( + 'description' => 'Thailand', + 'group_number' => '611', + 'id' => '17', + ), + 17 => + array ( + 'description' => 'Peru', + 'group_number' => '612', + 'id' => '18', + ), + 18 => + array ( + 'description' => 'Mauritius', + 'group_number' => '613', + 'id' => '19', + ), + 19 => + array ( + 'description' => 'Lebanon', + 'group_number' => '614', + 'id' => '20', + ), + 20 => + array ( + 'description' => 'Hungary', + 'group_number' => '615', + 'id' => '21', + ), + 21 => + array ( + 'description' => 'Thailand', + 'group_number' => '616', + 'id' => '22', + ), + 22 => + array ( + 'description' => 'Ukraine', + 'group_number' => '617', + 'id' => '23', + ), + 23 => + array ( + 'description' => 'China, People\'s Republic', + 'group_number' => '7', + 'id' => '24', + ), + 24 => + array ( + 'description' => 'Czech Republic and Slovakia', + 'group_number' => '80', + 'id' => '25', + ), + 25 => + array ( + 'description' => 'India', + 'group_number' => '81', + 'id' => '26', + ), + 26 => + array ( + 'description' => 'Norway', + 'group_number' => '82', + 'id' => '27', + ), + 27 => + array ( + 'description' => 'Poland', + 'group_number' => '83', + 'id' => '28', + ), + 28 => + array ( + 'description' => 'Spain', + 'group_number' => '84', + 'id' => '29', + ), + 29 => + array ( + 'description' => 'Brazil', + 'group_number' => '85', + 'id' => '30', + ), + 30 => + array ( + 'description' => 'Serbia and Montenegro', + 'group_number' => '86', + 'id' => '31', + ), + 31 => + array ( + 'description' => 'Denmark', + 'group_number' => '87', + 'id' => '32', + ), + 32 => + array ( + 'description' => 'Italy', + 'group_number' => '88', + 'id' => '33', + ), + 33 => + array ( + 'description' => 'Korea, Republic', + 'group_number' => '89', + 'id' => '34', + ), + 34 => + array ( + 'description' => 'Netherlands', + 'group_number' => '90', + 'id' => '35', + ), + 35 => + array ( + 'description' => 'Sweden', + 'group_number' => '91', + 'id' => '36', + ), + 36 => + array ( + 'description' => 'International NGO Publishers and EC Organizations', + 'group_number' => '92', + 'id' => '37', + ), + 37 => + array ( + 'description' => 'India', + 'group_number' => '93', + 'id' => '38', + ), + 38 => + array ( + 'description' => 'Netherlands', + 'group_number' => '94', + 'id' => '39', + ), + 39 => + array ( + 'description' => 'Argentina', + 'group_number' => '950', + 'id' => '40', + ), + 40 => + array ( + 'description' => 'Finland', + 'group_number' => '951', + 'id' => '41', + ), + 41 => + array ( + 'description' => 'Finland', + 'group_number' => '952', + 'id' => '42', + ), + 42 => + array ( + 'description' => 'Croatia', + 'group_number' => '953', + 'id' => '43', + ), + 43 => + array ( + 'description' => 'Bulgaria', + 'group_number' => '954', + 'id' => '44', + ), + 44 => + array ( + 'description' => 'Sri Lanka', + 'group_number' => '955', + 'id' => '45', + ), + 45 => + array ( + 'description' => 'Chile', + 'group_number' => '956', + 'id' => '46', + ), + 46 => + array ( + 'description' => 'Taiwan', + 'group_number' => '957', + 'id' => '47', + ), + 47 => + array ( + 'description' => 'Colombia', + 'group_number' => '958', + 'id' => '48', + ), + 48 => + array ( + 'description' => 'Cuba', + 'group_number' => '959', + 'id' => '49', + ), + 49 => + array ( + 'description' => 'Greece', + 'group_number' => '960', + 'id' => '50', + ), + 50 => + array ( + 'description' => 'Slovenia', + 'group_number' => '961', + 'id' => '51', + ), + 51 => + array ( + 'description' => 'Hong Kong, China', + 'group_number' => '962', + 'id' => '52', + ), + 52 => + array ( + 'description' => 'Hungary', + 'group_number' => '963', + 'id' => '53', + ), + 53 => + array ( + 'description' => 'Iran', + 'group_number' => '964', + 'id' => '54', + ), + 54 => + array ( + 'description' => 'Israel', + 'group_number' => '965', + 'id' => '55', + ), + 55 => + array ( + 'description' => 'Ukraine', + 'group_number' => '966', + 'id' => '56', + ), + 56 => + array ( + 'description' => 'Malaysia', + 'group_number' => '967', + 'id' => '57', + ), + 57 => + array ( + 'description' => 'Mexico', + 'group_number' => '968', + 'id' => '58', + ), + 58 => + array ( + 'description' => 'Pakistan', + 'group_number' => '969', + 'id' => '59', + ), + 59 => + array ( + 'description' => 'Mexico', + 'group_number' => '970', + 'id' => '60', + ), + 60 => + array ( + 'description' => 'Philippines', + 'group_number' => '971', + 'id' => '61', + ), + 61 => + array ( + 'description' => 'Portugal', + 'group_number' => '972', + 'id' => '62', + ), + 62 => + array ( + 'description' => 'Romania', + 'group_number' => '973', + 'id' => '63', + ), + 63 => + array ( + 'description' => 'Thailand', + 'group_number' => '974', + 'id' => '64', + ), + 64 => + array ( + 'description' => 'Turkey', + 'group_number' => '975', + 'id' => '65', + ), + 65 => + array ( + 'description' => 'Caribbean Community', + 'group_number' => '976', + 'id' => '66', + ), + 66 => + array ( + 'description' => 'Egypt', + 'group_number' => '977', + 'id' => '67', + ), + 67 => + array ( + 'description' => 'Nigeria', + 'group_number' => '978', + 'id' => '68', + ), + 68 => + array ( + 'description' => 'Indonesia', + 'group_number' => '979', + 'id' => '69', + ), + 69 => + array ( + 'description' => 'Venezuela', + 'group_number' => '980', + 'id' => '70', + ), + 70 => + array ( + 'description' => 'Singapore', + 'group_number' => '981', + 'id' => '71', + ), + 71 => + array ( + 'description' => 'South Pacific', + 'group_number' => '982', + 'id' => '72', + ), + 72 => + array ( + 'description' => 'Malaysia', + 'group_number' => '983', + 'id' => '73', + ), + 73 => + array ( + 'description' => 'Bangladesh', + 'group_number' => '984', + 'id' => '74', + ), + 74 => + array ( + 'description' => 'Belarus', + 'group_number' => '985', + 'id' => '75', + ), + 75 => + array ( + 'description' => 'Taiwan', + 'group_number' => '986', + 'id' => '76', + ), + 76 => + array ( + 'description' => 'Argentina', + 'group_number' => '987', + 'id' => '77', + ), + 77 => + array ( + 'description' => 'Hong Kong, China', + 'group_number' => '988', + 'id' => '78', + ), + 78 => + array ( + 'description' => 'Portugal', + 'group_number' => '989', + 'id' => '79', + ), + 79 => + array ( + 'description' => 'Qatar', + 'group_number' => '9927', + 'id' => '80', + ), + 80 => + array ( + 'description' => 'Albania', + 'group_number' => '9928', + 'id' => '81', + ), + 81 => + array ( + 'description' => 'Guatemala', + 'group_number' => '9929', + 'id' => '82', + ), + 82 => + array ( + 'description' => 'Costa Rica', + 'group_number' => '9930', + 'id' => '83', + ), + 83 => + array ( + 'description' => 'Algeria', + 'group_number' => '9931', + 'id' => '84', + ), + 84 => + array ( + 'description' => 'Lao People\'s Democratic Republic', + 'group_number' => '9932', + 'id' => '85', + ), + 85 => + array ( + 'description' => 'Syria', + 'group_number' => '9933', + 'id' => '86', + ), + 86 => + array ( + 'description' => 'Latvia', + 'group_number' => '9934', + 'id' => '87', + ), + 87 => + array ( + 'description' => 'Iceland', + 'group_number' => '9935', + 'id' => '88', + ), + 88 => + array ( + 'description' => 'Afghanistan', + 'group_number' => '9936', + 'id' => '89', + ), + 89 => + array ( + 'description' => 'Nepal', + 'group_number' => '9937', + 'id' => '90', + ), + 90 => + array ( + 'description' => 'Tunisia', + 'group_number' => '9938', + 'id' => '91', + ), + 91 => + array ( + 'description' => 'Armenia', + 'group_number' => '9939', + 'id' => '92', + ), + 92 => + array ( + 'description' => 'Montenegro', + 'group_number' => '9940', + 'id' => '93', + ), + 93 => + array ( + 'description' => 'Georgia', + 'group_number' => '9941', + 'id' => '94', + ), + 94 => + array ( + 'description' => 'Ecuador', + 'group_number' => '9942', + 'id' => '95', + ), + 95 => + array ( + 'description' => 'Uzbekistan', + 'group_number' => '9943', + 'id' => '96', + ), + 96 => + array ( + 'description' => 'Turkey', + 'group_number' => '9944', + 'id' => '97', + ), + 97 => + array ( + 'description' => 'Dominican Republic', + 'group_number' => '9945', + 'id' => '98', + ), + 98 => + array ( + 'description' => 'Korea, P.D.R.', + 'group_number' => '9946', + 'id' => '99', + ), + 99 => + array ( + 'description' => 'Algeria', + 'group_number' => '9947', + 'id' => '100', + ), + 100 => + array ( + 'description' => 'United Arab Emirates', + 'group_number' => '9948', + 'id' => '101', + ), + 101 => + array ( + 'description' => 'Estonia', + 'group_number' => '9949', + 'id' => '102', + ), + 102 => + array ( + 'description' => 'Palestine', + 'group_number' => '9950', + 'id' => '103', + ), + 103 => + array ( + 'description' => 'Kosova', + 'group_number' => '9951', + 'id' => '104', + ), + 104 => + array ( + 'description' => 'Azerbaijan', + 'group_number' => '9952', + 'id' => '105', + ), + 105 => + array ( + 'description' => 'Lebanon', + 'group_number' => '9953', + 'id' => '106', + ), + 106 => + array ( + 'description' => 'Morocco', + 'group_number' => '9954', + 'id' => '107', + ), + 107 => + array ( + 'description' => 'Lithuania', + 'group_number' => '9955', + 'id' => '108', + ), + 108 => + array ( + 'description' => 'Cameroon', + 'group_number' => '9956', + 'id' => '109', + ), + 109 => + array ( + 'description' => 'Jordan', + 'group_number' => '9957', + 'id' => '110', + ), + 110 => + array ( + 'description' => 'Bosnia and Herzegovina', + 'group_number' => '9958', + 'id' => '111', + ), + 111 => + array ( + 'description' => 'Libya', + 'group_number' => '9959', + 'id' => '112', + ), + 112 => + array ( + 'description' => 'Saudi Arabia', + 'group_number' => '9960', + 'id' => '113', + ), + 113 => + array ( + 'description' => 'Algeria', + 'group_number' => '9961', + 'id' => '114', + ), + 114 => + array ( + 'description' => 'Panama', + 'group_number' => '9962', + 'id' => '115', + ), + 115 => + array ( + 'description' => 'Cyprus', + 'group_number' => '9963', + 'id' => '116', + ), + 116 => + array ( + 'description' => 'Ghana', + 'group_number' => '9964', + 'id' => '117', + ), + 117 => + array ( + 'description' => 'Kazakhstan', + 'group_number' => '9965', + 'id' => '118', + ), + 118 => + array ( + 'description' => 'Kenya', + 'group_number' => '9966', + 'id' => '119', + ), + 119 => + array ( + 'description' => 'Kyrgyz Republic', + 'group_number' => '9967', + 'id' => '120', + ), + 120 => + array ( + 'description' => 'Costa Rica', + 'group_number' => '9968', + 'id' => '121', + ), + 121 => + array ( + 'description' => 'Uganda', + 'group_number' => '9970', + 'id' => '122', + ), + 122 => + array ( + 'description' => 'Singapore', + 'group_number' => '9971', + 'id' => '123', + ), + 123 => + array ( + 'description' => 'Peru', + 'group_number' => '9972', + 'id' => '124', + ), + 124 => + array ( + 'description' => 'Tunisia', + 'group_number' => '9973', + 'id' => '125', + ), + 125 => + array ( + 'description' => 'Uruguay', + 'group_number' => '9974', + 'id' => '126', + ), + 126 => + array ( + 'description' => 'Moldova', + 'group_number' => '9975', + 'id' => '127', + ), + 127 => + array ( + 'description' => 'Tanzania', + 'group_number' => '9976', + 'id' => '128', + ), + 128 => + array ( + 'description' => 'Costa Rica', + 'group_number' => '9977', + 'id' => '129', + ), + 129 => + array ( + 'description' => 'Ecuador', + 'group_number' => '9978', + 'id' => '130', + ), + 130 => + array ( + 'description' => 'Iceland', + 'group_number' => '9979', + 'id' => '131', + ), + 131 => + array ( + 'description' => 'Papua New Guinea', + 'group_number' => '9980', + 'id' => '132', + ), + 132 => + array ( + 'description' => 'Morocco', + 'group_number' => '9981', + 'id' => '133', + ), + 133 => + array ( + 'description' => 'Zambia', + 'group_number' => '9982', + 'id' => '134', + ), + 134 => + array ( + 'description' => 'Gambia', + 'group_number' => '9983', + 'id' => '135', + ), + 135 => + array ( + 'description' => 'Latvia', + 'group_number' => '9984', + 'id' => '136', + ), + 136 => + array ( + 'description' => 'Estonia', + 'group_number' => '9985', + 'id' => '137', + ), + 137 => + array ( + 'description' => 'Lithuania', + 'group_number' => '9986', + 'id' => '138', + ), + 138 => + array ( + 'description' => 'Tanzania', + 'group_number' => '9987', + 'id' => '139', + ), + 139 => + array ( + 'description' => 'Ghana', + 'group_number' => '9988', + 'id' => '140', + ), + 140 => + array ( + 'description' => 'Macedonia', + 'group_number' => '9989', + 'id' => '141', + ), + 141 => + array ( + 'description' => 'Bahrain', + 'group_number' => '99901', + 'id' => '142', + ), + 142 => + array ( + 'description' => 'Gabon', + 'group_number' => '99902', + 'id' => '143', + ), + 143 => + array ( + 'description' => 'Mauritius', + 'group_number' => '99903', + 'id' => '144', + ), + 144 => + array ( + 'description' => 'Netherlands Antilles and Aruba', + 'group_number' => '99904', + 'id' => '145', + ), + 145 => + array ( + 'description' => 'Bolivia', + 'group_number' => '99905', + 'id' => '146', + ), + 146 => + array ( + 'description' => 'Kuwait', + 'group_number' => '99906', + 'id' => '147', + ), + 147 => + array ( + 'description' => 'Malawi', + 'group_number' => '99908', + 'id' => '148', + ), + 148 => + array ( + 'description' => 'Malta', + 'group_number' => '99909', + 'id' => '149', + ), + 149 => + array ( + 'description' => 'Sierra Leone', + 'group_number' => '99910', + 'id' => '150', + ), + 150 => + array ( + 'description' => 'Lesotho', + 'group_number' => '99911', + 'id' => '151', + ), + 151 => + array ( + 'description' => 'Botswana', + 'group_number' => '99912', + 'id' => '152', + ), + 152 => + array ( + 'description' => 'Andorra', + 'group_number' => '99913', + 'id' => '153', + ), + 153 => + array ( + 'description' => 'Suriname', + 'group_number' => '99914', + 'id' => '154', + ), + 154 => + array ( + 'description' => 'Maldives', + 'group_number' => '99915', + 'id' => '155', + ), + 155 => + array ( + 'description' => 'Namibia', + 'group_number' => '99916', + 'id' => '156', + ), + 156 => + array ( + 'description' => 'Brunei Darussalam', + 'group_number' => '99917', + 'id' => '157', + ), + 157 => + array ( + 'description' => 'Faroe Islands', + 'group_number' => '99918', + 'id' => '158', + ), + 158 => + array ( + 'description' => 'Benin', + 'group_number' => '99919', + 'id' => '159', + ), + 159 => + array ( + 'description' => 'Andorra', + 'group_number' => '99920', + 'id' => '160', + ), + 160 => + array ( + 'description' => 'Qatar', + 'group_number' => '99921', + 'id' => '161', + ), + 161 => + array ( + 'description' => 'Guatemala', + 'group_number' => '99922', + 'id' => '162', + ), + 162 => + array ( + 'description' => 'El Salvador', + 'group_number' => '99923', + 'id' => '163', + ), + 163 => + array ( + 'description' => 'Nicaragua', + 'group_number' => '99924', + 'id' => '164', + ), + 164 => + array ( + 'description' => 'Paraguay', + 'group_number' => '99925', + 'id' => '165', + ), + 165 => + array ( + 'description' => 'Honduras', + 'group_number' => '99926', + 'id' => '166', + ), + 166 => + array ( + 'description' => 'Albania', + 'group_number' => '99927', + 'id' => '167', + ), + 167 => + array ( + 'description' => 'Georgia', + 'group_number' => '99928', + 'id' => '168', + ), + 168 => + array ( + 'description' => 'Mongolia', + 'group_number' => '99929', + 'id' => '169', + ), + 169 => + array ( + 'description' => 'Armenia', + 'group_number' => '99930', + 'id' => '170', + ), + 170 => + array ( + 'description' => 'Seychelles', + 'group_number' => '99931', + 'id' => '171', + ), + 171 => + array ( + 'description' => 'Malta', + 'group_number' => '99932', + 'id' => '172', + ), + 172 => + array ( + 'description' => 'Nepal', + 'group_number' => '99933', + 'id' => '173', + ), + 173 => + array ( + 'description' => 'Dominican Republic', + 'group_number' => '99934', + 'id' => '174', + ), + 174 => + array ( + 'description' => 'Haiti', + 'group_number' => '99935', + 'id' => '175', + ), + 175 => + array ( + 'description' => 'Bhutan', + 'group_number' => '99936', + 'id' => '176', + ), + 176 => + array ( + 'description' => 'Macau', + 'group_number' => '99937', + 'id' => '177', + ), + 177 => + array ( + 'description' => 'Srpska, Republic of', + 'group_number' => '99938', + 'id' => '178', + ), + 178 => + array ( + 'description' => 'Guatemala', + 'group_number' => '99939', + 'id' => '179', + ), + 179 => + array ( + 'description' => 'Georgia', + 'group_number' => '99940', + 'id' => '180', + ), + 180 => + array ( + 'description' => 'Armenia', + 'group_number' => '99941', + 'id' => '181', + ), + 181 => + array ( + 'description' => 'Sudan', + 'group_number' => '99942', + 'id' => '182', + ), + 182 => + array ( + 'description' => 'Albania', + 'group_number' => '99943', + 'id' => '183', + ), + 183 => + array ( + 'description' => 'Ethiopia', + 'group_number' => '99944', + 'id' => '184', + ), + 184 => + array ( + 'description' => 'Namibia', + 'group_number' => '99945', + 'id' => '185', + ), + 185 => + array ( + 'description' => 'Nepal', + 'group_number' => '99946', + 'id' => '186', + ), + 186 => + array ( + 'description' => 'Tajikistan', + 'group_number' => '99947', + 'id' => '187', + ), + 187 => + array ( + 'description' => 'Eritrea', + 'group_number' => '99948', + 'id' => '188', + ), + 188 => + array ( + 'description' => 'Mauritius', + 'group_number' => '99949', + 'id' => '189', + ), + 189 => + array ( + 'description' => 'Cambodia', + 'group_number' => '99950', + 'id' => '190', + ), + 190 => + array ( + 'description' => 'Congo', + 'group_number' => '99951', + 'id' => '191', + ), + 191 => + array ( + 'description' => 'Mali', + 'group_number' => '99952', + 'id' => '192', + ), + 192 => + array ( + 'description' => 'Paraguay', + 'group_number' => '99953', + 'id' => '193', + ), + 193 => + array ( + 'description' => 'Bolivia', + 'group_number' => '99954', + 'id' => '194', + ), + 194 => + array ( + 'description' => 'Srpska, Republic of', + 'group_number' => '99955', + 'id' => '195', + ), + 195 => + array ( + 'description' => 'Albania', + 'group_number' => '99956', + 'id' => '196', + ), + 196 => + array ( + 'description' => 'Malta', + 'group_number' => '99957', + 'id' => '197', + ), + 197 => + array ( + 'description' => 'Bahrain', + 'group_number' => '99958', + 'id' => '198', + ), + 198 => + array ( + 'description' => 'Luxembourg', + 'group_number' => '99959', + 'id' => '199', + ), + 199 => + array ( + 'description' => 'Malawi', + 'group_number' => '99960', + 'id' => '200', + ), + 200 => + array ( + 'description' => 'El Salvador', + 'group_number' => '99961', + 'id' => '201', + ), + 201 => + array ( + 'description' => 'Mongolia', + 'group_number' => '99962', + 'id' => '202', + ), + 202 => + array ( + 'description' => 'Cambodia', + 'group_number' => '99963', + 'id' => '203', + ), + 203 => + array ( + 'description' => 'Nicaragua', + 'group_number' => '99964', + 'id' => '204', + ), + 204 => + array ( + 'description' => 'Macau', + 'group_number' => '99965', + 'id' => '205', + ), + 205 => + array ( + 'description' => 'Kuwait', + 'group_number' => '99966', + 'id' => '206', + ), + 206 => + array ( + 'description' => 'Paraguay', + 'group_number' => '99967', + 'id' => '207', + ), + 207 => + array ( + 'description' => 'Botswana', + 'group_number' => '99968', + 'id' => '208', + ), + 208 => + array ( + 'description' => 'France', + 'group_number' => '10', + 'id' => '209', + ),*/ +), +'ezisbn_group_range' => +array ( +/* 0 => + array ( + 'from_number' => '0', + 'group_from' => '0', + 'group_length' => '1', + 'group_to' => '5', + 'id' => '1', + 'to_number' => '59999', + ), + 1 => + array ( + 'from_number' => '60000', + 'group_from' => '600', + 'group_length' => '3', + 'group_to' => '649', + 'id' => '2', + 'to_number' => '64999', + ), + 2 => + array ( + 'from_number' => '70000', + 'group_from' => '7', + 'group_length' => '1', + 'group_to' => '7', + 'id' => '3', + 'to_number' => '79999', + ), + 3 => + array ( + 'from_number' => '80000', + 'group_from' => '80', + 'group_length' => '2', + 'group_to' => '94', + 'id' => '4', + 'to_number' => '94999', + ), + 4 => + array ( + 'from_number' => '95000', + 'group_from' => '950', + 'group_length' => '3', + 'group_to' => '989', + 'id' => '5', + 'to_number' => '98999', + ), + 5 => + array ( + 'from_number' => '99000', + 'group_from' => '9900', + 'group_length' => '4', + 'group_to' => '9989', + 'id' => '6', + 'to_number' => '99899', + ), + 6 => + array ( + 'from_number' => '99900', + 'group_from' => '99900', + 'group_length' => '5', + 'group_to' => '99999', + 'id' => '7', + 'to_number' => '99999', + ), + 7 => + array ( + 'from_number' => '10000', + 'group_from' => '10', + 'group_length' => '2', + 'group_to' => '10', + 'id' => '8', + 'to_number' => '10999', + ),*/ +), +'ezisbn_registrant_range' => +array ( +/* 0 => + array ( + 'from_number' => '0', + 'id' => '1', + 'isbn_group_id' => '1', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 1 => + array ( + 'from_number' => '20000', + 'id' => '2', + 'isbn_group_id' => '1', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 2 => + array ( + 'from_number' => '70000', + 'id' => '3', + 'isbn_group_id' => '1', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 3 => + array ( + 'from_number' => '85000', + 'id' => '4', + 'isbn_group_id' => '1', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 4 => + array ( + 'from_number' => '90000', + 'id' => '5', + 'isbn_group_id' => '1', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 5 => + array ( + 'from_number' => '95000', + 'id' => '6', + 'isbn_group_id' => '1', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 6 => + array ( + 'from_number' => '0', + 'id' => '7', + 'isbn_group_id' => '2', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 7 => + array ( + 'from_number' => '10000', + 'id' => '8', + 'isbn_group_id' => '2', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 8 => + array ( + 'from_number' => '40000', + 'id' => '9', + 'isbn_group_id' => '2', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '5499', + 'to_number' => '54999', + ), + 9 => + array ( + 'from_number' => '55000', + 'id' => '10', + 'isbn_group_id' => '2', + 'registrant_from' => '55000', + 'registrant_length' => '5', + 'registrant_to' => '86979', + 'to_number' => '86979', + ), + 10 => + array ( + 'from_number' => '86980', + 'id' => '11', + 'isbn_group_id' => '2', + 'registrant_from' => '869800', + 'registrant_length' => '6', + 'registrant_to' => '998999', + 'to_number' => '99899', + ), + 11 => + array ( + 'from_number' => '99900', + 'id' => '12', + 'isbn_group_id' => '2', + 'registrant_from' => '9990000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 12 => + array ( + 'from_number' => '0', + 'id' => '13', + 'isbn_group_id' => '3', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 13 => + array ( + 'from_number' => '20000', + 'id' => '14', + 'isbn_group_id' => '3', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '349', + 'to_number' => '34999', + ), + 14 => + array ( + 'from_number' => '35000', + 'id' => '15', + 'isbn_group_id' => '3', + 'registrant_from' => '35000', + 'registrant_length' => '5', + 'registrant_to' => '39999', + 'to_number' => '39999', + ), + 15 => + array ( + 'from_number' => '40000', + 'id' => '16', + 'isbn_group_id' => '3', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 16 => + array ( + 'from_number' => '70000', + 'id' => '17', + 'isbn_group_id' => '3', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8399', + 'to_number' => '83999', + ), + 17 => + array ( + 'from_number' => '84000', + 'id' => '18', + 'isbn_group_id' => '3', + 'registrant_from' => '84000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 18 => + array ( + 'from_number' => '90000', + 'id' => '19', + 'isbn_group_id' => '3', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 19 => + array ( + 'from_number' => '95000', + 'id' => '20', + 'isbn_group_id' => '3', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 20 => + array ( + 'from_number' => '0', + 'id' => '21', + 'isbn_group_id' => '4', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '02', + 'to_number' => '2999', + ), + 21 => + array ( + 'from_number' => '3000', + 'id' => '22', + 'isbn_group_id' => '4', + 'registrant_from' => '030', + 'registrant_length' => '3', + 'registrant_to' => '033', + 'to_number' => '3399', + ), + 22 => + array ( + 'from_number' => '3400', + 'id' => '23', + 'isbn_group_id' => '4', + 'registrant_from' => '0340', + 'registrant_length' => '4', + 'registrant_to' => '0369', + 'to_number' => '3699', + ), + 23 => + array ( + 'from_number' => '3700', + 'id' => '24', + 'isbn_group_id' => '4', + 'registrant_from' => '03700', + 'registrant_length' => '5', + 'registrant_to' => '03999', + 'to_number' => '3999', + ), + 24 => + array ( + 'from_number' => '4000', + 'id' => '25', + 'isbn_group_id' => '4', + 'registrant_from' => '04', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 25 => + array ( + 'from_number' => '20000', + 'id' => '26', + 'isbn_group_id' => '4', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 26 => + array ( + 'from_number' => '70000', + 'id' => '27', + 'isbn_group_id' => '4', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 27 => + array ( + 'from_number' => '85000', + 'id' => '28', + 'isbn_group_id' => '4', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 28 => + array ( + 'from_number' => '90000', + 'id' => '29', + 'isbn_group_id' => '4', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 29 => + array ( + 'from_number' => '95000', + 'id' => '30', + 'isbn_group_id' => '4', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9539999', + 'to_number' => '95399', + ), + 30 => + array ( + 'from_number' => '95400', + 'id' => '31', + 'isbn_group_id' => '4', + 'registrant_from' => '95400', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 31 => + array ( + 'from_number' => '97000', + 'id' => '32', + 'isbn_group_id' => '4', + 'registrant_from' => '9700000', + 'registrant_length' => '7', + 'registrant_to' => '9899999', + 'to_number' => '98999', + ), + 32 => + array ( + 'from_number' => '99000', + 'id' => '33', + 'isbn_group_id' => '4', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99499', + 'to_number' => '99499', + ), + 33 => + array ( + 'from_number' => '99500', + 'id' => '34', + 'isbn_group_id' => '4', + 'registrant_from' => '99500', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 34 => + array ( + 'from_number' => '0', + 'id' => '35', + 'isbn_group_id' => '5', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 35 => + array ( + 'from_number' => '20000', + 'id' => '36', + 'isbn_group_id' => '5', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 36 => + array ( + 'from_number' => '70000', + 'id' => '37', + 'isbn_group_id' => '5', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 37 => + array ( + 'from_number' => '85000', + 'id' => '38', + 'isbn_group_id' => '5', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 38 => + array ( + 'from_number' => '90000', + 'id' => '39', + 'isbn_group_id' => '5', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 39 => + array ( + 'from_number' => '95000', + 'id' => '40', + 'isbn_group_id' => '5', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9999999', + 'to_number' => '99999', + ), + 40 => + array ( + 'from_number' => '0', + 'id' => '41', + 'isbn_group_id' => '6', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 41 => + array ( + 'from_number' => '20000', + 'id' => '42', + 'isbn_group_id' => '6', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '420', + 'to_number' => '42099', + ), + 42 => + array ( + 'from_number' => '42100', + 'id' => '43', + 'isbn_group_id' => '6', + 'registrant_from' => '4210', + 'registrant_length' => '4', + 'registrant_to' => '4299', + 'to_number' => '42999', + ), + 43 => + array ( + 'from_number' => '43000', + 'id' => '44', + 'isbn_group_id' => '6', + 'registrant_from' => '430', + 'registrant_length' => '3', + 'registrant_to' => '430', + 'to_number' => '43099', + ), + 44 => + array ( + 'from_number' => '43100', + 'id' => '45', + 'isbn_group_id' => '6', + 'registrant_from' => '4310', + 'registrant_length' => '4', + 'registrant_to' => '4399', + 'to_number' => '43999', + ), + 45 => + array ( + 'from_number' => '44000', + 'id' => '46', + 'isbn_group_id' => '6', + 'registrant_from' => '440', + 'registrant_length' => '3', + 'registrant_to' => '440', + 'to_number' => '44099', + ), + 46 => + array ( + 'from_number' => '44100', + 'id' => '47', + 'isbn_group_id' => '6', + 'registrant_from' => '4410', + 'registrant_length' => '4', + 'registrant_to' => '4499', + 'to_number' => '44999', + ), + 47 => + array ( + 'from_number' => '45000', + 'id' => '48', + 'isbn_group_id' => '6', + 'registrant_from' => '450', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 48 => + array ( + 'from_number' => '70000', + 'id' => '49', + 'isbn_group_id' => '6', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 49 => + array ( + 'from_number' => '85000', + 'id' => '50', + 'isbn_group_id' => '6', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 50 => + array ( + 'from_number' => '90000', + 'id' => '51', + 'isbn_group_id' => '6', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '909999', + 'to_number' => '90999', + ), + 51 => + array ( + 'from_number' => '91000', + 'id' => '52', + 'isbn_group_id' => '6', + 'registrant_from' => '91000', + 'registrant_length' => '5', + 'registrant_to' => '91999', + 'to_number' => '91999', + ), + 52 => + array ( + 'from_number' => '92000', + 'id' => '53', + 'isbn_group_id' => '6', + 'registrant_from' => '9200', + 'registrant_length' => '4', + 'registrant_to' => '9299', + 'to_number' => '92999', + ), + 53 => + array ( + 'from_number' => '93000', + 'id' => '54', + 'isbn_group_id' => '6', + 'registrant_from' => '93000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 54 => + array ( + 'from_number' => '95000', + 'id' => '55', + 'isbn_group_id' => '6', + 'registrant_from' => '9500000', + 'registrant_length' => '7', + 'registrant_to' => '9500999', + 'to_number' => '95009', + ), + 55 => + array ( + 'from_number' => '95010', + 'id' => '56', + 'isbn_group_id' => '6', + 'registrant_from' => '9501', + 'registrant_length' => '4', + 'registrant_to' => '9799', + 'to_number' => '97999', + ), + 56 => + array ( + 'from_number' => '98000', + 'id' => '57', + 'isbn_group_id' => '6', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 57 => + array ( + 'from_number' => '99000', + 'id' => '58', + 'isbn_group_id' => '6', + 'registrant_from' => '9900000', + 'registrant_length' => '7', + 'registrant_to' => '9909999', + 'to_number' => '99099', + ), + 58 => + array ( + 'from_number' => '99100', + 'id' => '59', + 'isbn_group_id' => '6', + 'registrant_from' => '9910', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 59 => + array ( + 'from_number' => '0', + 'id' => '60', + 'isbn_group_id' => '7', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 60 => + array ( + 'from_number' => '10000', + 'id' => '61', + 'isbn_group_id' => '7', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 61 => + array ( + 'from_number' => '50000', + 'id' => '62', + 'isbn_group_id' => '7', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 62 => + array ( + 'from_number' => '90000', + 'id' => '63', + 'isbn_group_id' => '7', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 63 => + array ( + 'from_number' => '0', + 'id' => '64', + 'isbn_group_id' => '8', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 64 => + array ( + 'from_number' => '20000', + 'id' => '65', + 'isbn_group_id' => '8', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 65 => + array ( + 'from_number' => '70000', + 'id' => '66', + 'isbn_group_id' => '8', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 66 => + array ( + 'from_number' => '80000', + 'id' => '67', + 'isbn_group_id' => '8', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '84999', + 'to_number' => '84999', + ), + 67 => + array ( + 'from_number' => '85000', + 'id' => '68', + 'isbn_group_id' => '8', + 'registrant_from' => '85', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 68 => + array ( + 'from_number' => '0', + 'id' => '69', + 'isbn_group_id' => '9', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 69 => + array ( + 'from_number' => '20000', + 'id' => '70', + 'isbn_group_id' => '9', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 70 => + array ( + 'from_number' => '80000', + 'id' => '71', + 'isbn_group_id' => '9', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 71 => + array ( + 'from_number' => '95000', + 'id' => '72', + 'isbn_group_id' => '9', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 72 => + array ( + 'from_number' => '0', + 'id' => '73', + 'isbn_group_id' => '10', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '04', + 'to_number' => '4999', + ), + 73 => + array ( + 'from_number' => '5000', + 'id' => '74', + 'isbn_group_id' => '10', + 'registrant_from' => '05', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 74 => + array ( + 'from_number' => '50000', + 'id' => '75', + 'isbn_group_id' => '10', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 75 => + array ( + 'from_number' => '80000', + 'id' => '76', + 'isbn_group_id' => '10', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 76 => + array ( + 'from_number' => '90000', + 'id' => '77', + 'isbn_group_id' => '10', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 77 => + array ( + 'from_number' => '0', + 'id' => '78', + 'isbn_group_id' => '11', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 78 => + array ( + 'from_number' => '50000', + 'id' => '79', + 'isbn_group_id' => '11', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 79 => + array ( + 'from_number' => '90000', + 'id' => '80', + 'isbn_group_id' => '11', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '979', + 'to_number' => '97999', + ), + 80 => + array ( + 'from_number' => '98000', + 'id' => '81', + 'isbn_group_id' => '11', + 'registrant_from' => '9800', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 81 => + array ( + 'from_number' => '1000', + 'id' => '82', + 'isbn_group_id' => '12', + 'registrant_from' => '01', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 82 => + array ( + 'from_number' => '10000', + 'id' => '83', + 'isbn_group_id' => '12', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 83 => + array ( + 'from_number' => '40000', + 'id' => '84', + 'isbn_group_id' => '12', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 84 => + array ( + 'from_number' => '60000', + 'id' => '85', + 'isbn_group_id' => '12', + 'registrant_from' => '60000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 85 => + array ( + 'from_number' => '90000', + 'id' => '86', + 'isbn_group_id' => '12', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 86 => + array ( + 'from_number' => '0', + 'id' => '87', + 'isbn_group_id' => '13', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 87 => + array ( + 'from_number' => '10000', + 'id' => '88', + 'isbn_group_id' => '13', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 88 => + array ( + 'from_number' => '50000', + 'id' => '89', + 'isbn_group_id' => '13', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 89 => + array ( + 'from_number' => '80000', + 'id' => '90', + 'isbn_group_id' => '13', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9199', + 'to_number' => '91999', + ), + 90 => + array ( + 'from_number' => '92000', + 'id' => '91', + 'isbn_group_id' => '13', + 'registrant_from' => '92000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 91 => + array ( + 'from_number' => '0', + 'id' => '92', + 'isbn_group_id' => '14', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 92 => + array ( + 'from_number' => '40000', + 'id' => '93', + 'isbn_group_id' => '14', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '749', + 'to_number' => '74999', + ), + 93 => + array ( + 'from_number' => '75000', + 'id' => '94', + 'isbn_group_id' => '14', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 94 => + array ( + 'from_number' => '95000', + 'id' => '95', + 'isbn_group_id' => '14', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 95 => + array ( + 'from_number' => '0', + 'id' => '96', + 'isbn_group_id' => '15', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 96 => + array ( + 'from_number' => '10000', + 'id' => '97', + 'isbn_group_id' => '15', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 97 => + array ( + 'from_number' => '20000', + 'id' => '98', + 'isbn_group_id' => '15', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '449', + 'to_number' => '44999', + ), + 98 => + array ( + 'from_number' => '45000', + 'id' => '99', + 'isbn_group_id' => '15', + 'registrant_from' => '4500', + 'registrant_length' => '4', + 'registrant_to' => '6499', + 'to_number' => '64999', + ), + 99 => + array ( + 'from_number' => '65000', + 'id' => '100', + 'isbn_group_id' => '15', + 'registrant_from' => '65000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 100 => + array ( + 'from_number' => '70000', + 'id' => '101', + 'isbn_group_id' => '15', + 'registrant_from' => '7', + 'registrant_length' => '1', + 'registrant_to' => '9', + 'to_number' => '99999', + ), + 101 => + array ( + 'from_number' => '0', + 'id' => '102', + 'isbn_group_id' => '16', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 102 => + array ( + 'from_number' => '40000', + 'id' => '103', + 'isbn_group_id' => '16', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 103 => + array ( + 'from_number' => '80000', + 'id' => '104', + 'isbn_group_id' => '16', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 104 => + array ( + 'from_number' => '95000', + 'id' => '105', + 'isbn_group_id' => '16', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 105 => + array ( + 'from_number' => '0', + 'id' => '106', + 'isbn_group_id' => '18', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 106 => + array ( + 'from_number' => '30000', + 'id' => '107', + 'isbn_group_id' => '18', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 107 => + array ( + 'from_number' => '40000', + 'id' => '108', + 'isbn_group_id' => '18', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4499', + 'to_number' => '44999', + ), + 108 => + array ( + 'from_number' => '45000', + 'id' => '109', + 'isbn_group_id' => '18', + 'registrant_from' => '45000', + 'registrant_length' => '5', + 'registrant_to' => '49999', + 'to_number' => '49999', + ), + 109 => + array ( + 'from_number' => '50000', + 'id' => '110', + 'isbn_group_id' => '18', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 110 => + array ( + 'from_number' => '0', + 'id' => '111', + 'isbn_group_id' => '19', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '9', + 'to_number' => '99999', + ), + 111 => + array ( + 'from_number' => '0', + 'id' => '112', + 'isbn_group_id' => '20', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 112 => + array ( + 'from_number' => '40000', + 'id' => '113', + 'isbn_group_id' => '20', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 113 => + array ( + 'from_number' => '80000', + 'id' => '114', + 'isbn_group_id' => '20', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 114 => + array ( + 'from_number' => '95000', + 'id' => '115', + 'isbn_group_id' => '20', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 115 => + array ( + 'from_number' => '0', + 'id' => '116', + 'isbn_group_id' => '21', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 116 => + array ( + 'from_number' => '10000', + 'id' => '117', + 'isbn_group_id' => '21', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 117 => + array ( + 'from_number' => '50000', + 'id' => '118', + 'isbn_group_id' => '21', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 118 => + array ( + 'from_number' => '80000', + 'id' => '119', + 'isbn_group_id' => '21', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 119 => + array ( + 'from_number' => '0', + 'id' => '120', + 'isbn_group_id' => '22', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 120 => + array ( + 'from_number' => '20000', + 'id' => '121', + 'isbn_group_id' => '22', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 121 => + array ( + 'from_number' => '70000', + 'id' => '122', + 'isbn_group_id' => '22', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 122 => + array ( + 'from_number' => '90000', + 'id' => '123', + 'isbn_group_id' => '22', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 123 => + array ( + 'from_number' => '0', + 'id' => '124', + 'isbn_group_id' => '23', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 124 => + array ( + 'from_number' => '50000', + 'id' => '125', + 'isbn_group_id' => '23', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 125 => + array ( + 'from_number' => '70000', + 'id' => '126', + 'isbn_group_id' => '23', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 126 => + array ( + 'from_number' => '90000', + 'id' => '127', + 'isbn_group_id' => '23', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 127 => + array ( + 'from_number' => '0', + 'id' => '128', + 'isbn_group_id' => '24', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 128 => + array ( + 'from_number' => '10000', + 'id' => '129', + 'isbn_group_id' => '24', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 129 => + array ( + 'from_number' => '50000', + 'id' => '130', + 'isbn_group_id' => '24', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 130 => + array ( + 'from_number' => '80000', + 'id' => '131', + 'isbn_group_id' => '24', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 131 => + array ( + 'from_number' => '90000', + 'id' => '132', + 'isbn_group_id' => '24', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 132 => + array ( + 'from_number' => '0', + 'id' => '133', + 'isbn_group_id' => '25', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 133 => + array ( + 'from_number' => '20000', + 'id' => '134', + 'isbn_group_id' => '25', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 134 => + array ( + 'from_number' => '70000', + 'id' => '135', + 'isbn_group_id' => '25', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 135 => + array ( + 'from_number' => '85000', + 'id' => '136', + 'isbn_group_id' => '25', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 136 => + array ( + 'from_number' => '90000', + 'id' => '137', + 'isbn_group_id' => '25', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 137 => + array ( + 'from_number' => '0', + 'id' => '138', + 'isbn_group_id' => '26', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 138 => + array ( + 'from_number' => '20000', + 'id' => '139', + 'isbn_group_id' => '26', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 139 => + array ( + 'from_number' => '70000', + 'id' => '140', + 'isbn_group_id' => '26', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 140 => + array ( + 'from_number' => '85000', + 'id' => '141', + 'isbn_group_id' => '26', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 141 => + array ( + 'from_number' => '90000', + 'id' => '142', + 'isbn_group_id' => '26', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 142 => + array ( + 'from_number' => '0', + 'id' => '143', + 'isbn_group_id' => '27', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 143 => + array ( + 'from_number' => '20000', + 'id' => '144', + 'isbn_group_id' => '27', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 144 => + array ( + 'from_number' => '70000', + 'id' => '145', + 'isbn_group_id' => '27', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 145 => + array ( + 'from_number' => '90000', + 'id' => '146', + 'isbn_group_id' => '27', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 146 => + array ( + 'from_number' => '99000', + 'id' => '147', + 'isbn_group_id' => '27', + 'registrant_from' => '990000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 147 => + array ( + 'from_number' => '0', + 'id' => '148', + 'isbn_group_id' => '28', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 148 => + array ( + 'from_number' => '20000', + 'id' => '149', + 'isbn_group_id' => '28', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 149 => + array ( + 'from_number' => '60000', + 'id' => '150', + 'isbn_group_id' => '28', + 'registrant_from' => '60000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 150 => + array ( + 'from_number' => '70000', + 'id' => '151', + 'isbn_group_id' => '28', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 151 => + array ( + 'from_number' => '85000', + 'id' => '152', + 'isbn_group_id' => '28', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 152 => + array ( + 'from_number' => '90000', + 'id' => '153', + 'isbn_group_id' => '28', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 153 => + array ( + 'from_number' => '0', + 'id' => '154', + 'isbn_group_id' => '29', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 154 => + array ( + 'from_number' => '15000', + 'id' => '155', + 'isbn_group_id' => '29', + 'registrant_from' => '15000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 155 => + array ( + 'from_number' => '20000', + 'id' => '156', + 'isbn_group_id' => '29', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 156 => + array ( + 'from_number' => '70000', + 'id' => '157', + 'isbn_group_id' => '29', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 157 => + array ( + 'from_number' => '85000', + 'id' => '158', + 'isbn_group_id' => '29', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 158 => + array ( + 'from_number' => '90000', + 'id' => '159', + 'isbn_group_id' => '29', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9199', + 'to_number' => '91999', + ), + 159 => + array ( + 'from_number' => '92000', + 'id' => '160', + 'isbn_group_id' => '29', + 'registrant_from' => '920000', + 'registrant_length' => '6', + 'registrant_to' => '923999', + 'to_number' => '92399', + ), + 160 => + array ( + 'from_number' => '92400', + 'id' => '161', + 'isbn_group_id' => '29', + 'registrant_from' => '92400', + 'registrant_length' => '5', + 'registrant_to' => '92999', + 'to_number' => '92999', + ), + 161 => + array ( + 'from_number' => '93000', + 'id' => '162', + 'isbn_group_id' => '29', + 'registrant_from' => '930000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 162 => + array ( + 'from_number' => '95000', + 'id' => '163', + 'isbn_group_id' => '29', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 163 => + array ( + 'from_number' => '97000', + 'id' => '164', + 'isbn_group_id' => '29', + 'registrant_from' => '9700', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 164 => + array ( + 'from_number' => '0', + 'id' => '165', + 'isbn_group_id' => '30', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 165 => + array ( + 'from_number' => '20000', + 'id' => '166', + 'isbn_group_id' => '30', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 166 => + array ( + 'from_number' => '60000', + 'id' => '167', + 'isbn_group_id' => '30', + 'registrant_from' => '60000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 167 => + array ( + 'from_number' => '70000', + 'id' => '168', + 'isbn_group_id' => '30', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 168 => + array ( + 'from_number' => '85000', + 'id' => '169', + 'isbn_group_id' => '30', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 169 => + array ( + 'from_number' => '90000', + 'id' => '170', + 'isbn_group_id' => '30', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '979999', + 'to_number' => '97999', + ), + 170 => + array ( + 'from_number' => '98000', + 'id' => '171', + 'isbn_group_id' => '30', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 171 => + array ( + 'from_number' => '0', + 'id' => '172', + 'isbn_group_id' => '31', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 172 => + array ( + 'from_number' => '30000', + 'id' => '173', + 'isbn_group_id' => '31', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 173 => + array ( + 'from_number' => '60000', + 'id' => '174', + 'isbn_group_id' => '31', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 174 => + array ( + 'from_number' => '80000', + 'id' => '175', + 'isbn_group_id' => '31', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 175 => + array ( + 'from_number' => '90000', + 'id' => '176', + 'isbn_group_id' => '31', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 176 => + array ( + 'from_number' => '0', + 'id' => '177', + 'isbn_group_id' => '32', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 177 => + array ( + 'from_number' => '40000', + 'id' => '178', + 'isbn_group_id' => '32', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '649', + 'to_number' => '64999', + ), + 178 => + array ( + 'from_number' => '70000', + 'id' => '179', + 'isbn_group_id' => '32', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 179 => + array ( + 'from_number' => '85000', + 'id' => '180', + 'isbn_group_id' => '32', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 180 => + array ( + 'from_number' => '97000', + 'id' => '181', + 'isbn_group_id' => '32', + 'registrant_from' => '970000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 181 => + array ( + 'from_number' => '0', + 'id' => '182', + 'isbn_group_id' => '33', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 182 => + array ( + 'from_number' => '20000', + 'id' => '183', + 'isbn_group_id' => '33', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 183 => + array ( + 'from_number' => '60000', + 'id' => '184', + 'isbn_group_id' => '33', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 184 => + array ( + 'from_number' => '85000', + 'id' => '185', + 'isbn_group_id' => '33', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 185 => + array ( + 'from_number' => '90000', + 'id' => '186', + 'isbn_group_id' => '33', + 'registrant_from' => '900000', + 'registrant_length' => '6', + 'registrant_to' => '949999', + 'to_number' => '94999', + ), + 186 => + array ( + 'from_number' => '95000', + 'id' => '187', + 'isbn_group_id' => '33', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 187 => + array ( + 'from_number' => '0', + 'id' => '188', + 'isbn_group_id' => '34', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '24', + 'to_number' => '24999', + ), + 188 => + array ( + 'from_number' => '25000', + 'id' => '189', + 'isbn_group_id' => '34', + 'registrant_from' => '250', + 'registrant_length' => '3', + 'registrant_to' => '549', + 'to_number' => '54999', + ), + 189 => + array ( + 'from_number' => '55000', + 'id' => '190', + 'isbn_group_id' => '34', + 'registrant_from' => '5500', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 190 => + array ( + 'from_number' => '85000', + 'id' => '191', + 'isbn_group_id' => '34', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 191 => + array ( + 'from_number' => '95000', + 'id' => '192', + 'isbn_group_id' => '34', + 'registrant_from' => '950000', + 'registrant_length' => '6', + 'registrant_to' => '969999', + 'to_number' => '96999', + ), + 192 => + array ( + 'from_number' => '97000', + 'id' => '193', + 'isbn_group_id' => '34', + 'registrant_from' => '97000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 193 => + array ( + 'from_number' => '99000', + 'id' => '194', + 'isbn_group_id' => '34', + 'registrant_from' => '990', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 194 => + array ( + 'from_number' => '0', + 'id' => '195', + 'isbn_group_id' => '35', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 195 => + array ( + 'from_number' => '20000', + 'id' => '196', + 'isbn_group_id' => '35', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 196 => + array ( + 'from_number' => '50000', + 'id' => '197', + 'isbn_group_id' => '35', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '6999', + 'to_number' => '69999', + ), + 197 => + array ( + 'from_number' => '70000', + 'id' => '198', + 'isbn_group_id' => '35', + 'registrant_from' => '70000', + 'registrant_length' => '5', + 'registrant_to' => '79999', + 'to_number' => '79999', + ), + 198 => + array ( + 'from_number' => '80000', + 'id' => '199', + 'isbn_group_id' => '35', + 'registrant_from' => '800000', + 'registrant_length' => '6', + 'registrant_to' => '849999', + 'to_number' => '84999', + ), + 199 => + array ( + 'from_number' => '85000', + 'id' => '200', + 'isbn_group_id' => '35', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 200 => + array ( + 'from_number' => '90000', + 'id' => '201', + 'isbn_group_id' => '35', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '90', + 'to_number' => '90999', + ), + 201 => + array ( + 'from_number' => '91000', + 'id' => '202', + 'isbn_group_id' => '35', + 'registrant_from' => '910000', + 'registrant_length' => '6', + 'registrant_to' => '939999', + 'to_number' => '93999', + ), + 202 => + array ( + 'from_number' => '94000', + 'id' => '203', + 'isbn_group_id' => '35', + 'registrant_from' => '94', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 203 => + array ( + 'from_number' => '95000', + 'id' => '204', + 'isbn_group_id' => '35', + 'registrant_from' => '950000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 204 => + array ( + 'from_number' => '0', + 'id' => '205', + 'isbn_group_id' => '36', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 205 => + array ( + 'from_number' => '20000', + 'id' => '206', + 'isbn_group_id' => '36', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 206 => + array ( + 'from_number' => '50000', + 'id' => '207', + 'isbn_group_id' => '36', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '649', + 'to_number' => '64999', + ), + 207 => + array ( + 'from_number' => '70000', + 'id' => '208', + 'isbn_group_id' => '36', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 208 => + array ( + 'from_number' => '85000', + 'id' => '209', + 'isbn_group_id' => '36', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 209 => + array ( + 'from_number' => '97000', + 'id' => '210', + 'isbn_group_id' => '36', + 'registrant_from' => '970000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 210 => + array ( + 'from_number' => '0', + 'id' => '211', + 'isbn_group_id' => '37', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 211 => + array ( + 'from_number' => '60000', + 'id' => '212', + 'isbn_group_id' => '37', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 212 => + array ( + 'from_number' => '80000', + 'id' => '213', + 'isbn_group_id' => '37', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 213 => + array ( + 'from_number' => '90000', + 'id' => '214', + 'isbn_group_id' => '37', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 214 => + array ( + 'from_number' => '95000', + 'id' => '215', + 'isbn_group_id' => '37', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 215 => + array ( + 'from_number' => '99000', + 'id' => '216', + 'isbn_group_id' => '37', + 'registrant_from' => '990000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 216 => + array ( + 'from_number' => '0', + 'id' => '217', + 'isbn_group_id' => '38', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 217 => + array ( + 'from_number' => '10000', + 'id' => '218', + 'isbn_group_id' => '38', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 218 => + array ( + 'from_number' => '50000', + 'id' => '219', + 'isbn_group_id' => '38', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 219 => + array ( + 'from_number' => '80000', + 'id' => '220', + 'isbn_group_id' => '38', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 220 => + array ( + 'from_number' => '95000', + 'id' => '221', + 'isbn_group_id' => '38', + 'registrant_from' => '950000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ), + 221 => + array ( + 'from_number' => '0', + 'id' => '222', + 'isbn_group_id' => '39', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 222 => + array ( + 'from_number' => '60000', + 'id' => '223', + 'isbn_group_id' => '39', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 223 => + array ( + 'from_number' => '90000', + 'id' => '224', + 'isbn_group_id' => '39', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 224 => + array ( + 'from_number' => '0', + 'id' => '225', + 'isbn_group_id' => '40', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 225 => + array ( + 'from_number' => '50000', + 'id' => '226', + 'isbn_group_id' => '40', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 226 => + array ( + 'from_number' => '90000', + 'id' => '227', + 'isbn_group_id' => '40', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9899', + 'to_number' => '98999', + ), + 227 => + array ( + 'from_number' => '99000', + 'id' => '228', + 'isbn_group_id' => '40', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 228 => + array ( + 'from_number' => '0', + 'id' => '229', + 'isbn_group_id' => '41', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 229 => + array ( + 'from_number' => '20000', + 'id' => '230', + 'isbn_group_id' => '41', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 230 => + array ( + 'from_number' => '55000', + 'id' => '231', + 'isbn_group_id' => '41', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '889', + 'to_number' => '88999', + ), + 231 => + array ( + 'from_number' => '89000', + 'id' => '232', + 'isbn_group_id' => '41', + 'registrant_from' => '8900', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 232 => + array ( + 'from_number' => '95000', + 'id' => '233', + 'isbn_group_id' => '41', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 233 => + array ( + 'from_number' => '0', + 'id' => '234', + 'isbn_group_id' => '42', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 234 => + array ( + 'from_number' => '20000', + 'id' => '235', + 'isbn_group_id' => '42', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 235 => + array ( + 'from_number' => '50000', + 'id' => '236', + 'isbn_group_id' => '42', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 236 => + array ( + 'from_number' => '60000', + 'id' => '237', + 'isbn_group_id' => '42', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '65', + 'to_number' => '65999', + ), + 237 => + array ( + 'from_number' => '66000', + 'id' => '238', + 'isbn_group_id' => '42', + 'registrant_from' => '6600', + 'registrant_length' => '4', + 'registrant_to' => '6699', + 'to_number' => '66999', + ), + 238 => + array ( + 'from_number' => '67000', + 'id' => '239', + 'isbn_group_id' => '42', + 'registrant_from' => '67000', + 'registrant_length' => '5', + 'registrant_to' => '69999', + 'to_number' => '69999', + ), + 239 => + array ( + 'from_number' => '70000', + 'id' => '240', + 'isbn_group_id' => '42', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 240 => + array ( + 'from_number' => '80000', + 'id' => '241', + 'isbn_group_id' => '42', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 241 => + array ( + 'from_number' => '95000', + 'id' => '242', + 'isbn_group_id' => '42', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9899', + 'to_number' => '98999', + ), + 242 => + array ( + 'from_number' => '99000', + 'id' => '243', + 'isbn_group_id' => '42', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 243 => + array ( + 'from_number' => '0', + 'id' => '244', + 'isbn_group_id' => '43', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 244 => + array ( + 'from_number' => '10000', + 'id' => '245', + 'isbn_group_id' => '43', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 245 => + array ( + 'from_number' => '15000', + 'id' => '246', + 'isbn_group_id' => '43', + 'registrant_from' => '150', + 'registrant_length' => '3', + 'registrant_to' => '549', + 'to_number' => '54999', + ), + 246 => + array ( + 'from_number' => '55000', + 'id' => '247', + 'isbn_group_id' => '43', + 'registrant_from' => '55000', + 'registrant_length' => '5', + 'registrant_to' => '59999', + 'to_number' => '59999', + ), + 247 => + array ( + 'from_number' => '60000', + 'id' => '248', + 'isbn_group_id' => '43', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 248 => + array ( + 'from_number' => '95000', + 'id' => '249', + 'isbn_group_id' => '43', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 249 => + array ( + 'from_number' => '0', + 'id' => '250', + 'isbn_group_id' => '44', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '28', + 'to_number' => '28999', + ), + 250 => + array ( + 'from_number' => '29000', + 'id' => '251', + 'isbn_group_id' => '44', + 'registrant_from' => '2900', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 251 => + array ( + 'from_number' => '30000', + 'id' => '252', + 'isbn_group_id' => '44', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 252 => + array ( + 'from_number' => '80000', + 'id' => '253', + 'isbn_group_id' => '44', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 253 => + array ( + 'from_number' => '90000', + 'id' => '254', + 'isbn_group_id' => '44', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '92999', + 'to_number' => '92999', + ), + 254 => + array ( + 'from_number' => '93000', + 'id' => '255', + 'isbn_group_id' => '44', + 'registrant_from' => '9300', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 255 => + array ( + 'from_number' => '0', + 'id' => '256', + 'isbn_group_id' => '45', + 'registrant_from' => '0000', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 256 => + array ( + 'from_number' => '20000', + 'id' => '257', + 'isbn_group_id' => '45', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 257 => + array ( + 'from_number' => '50000', + 'id' => '258', + 'isbn_group_id' => '45', + 'registrant_from' => '50000', + 'registrant_length' => '5', + 'registrant_to' => '54999', + 'to_number' => '54999', + ), + 258 => + array ( + 'from_number' => '55000', + 'id' => '259', + 'isbn_group_id' => '45', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 259 => + array ( + 'from_number' => '80000', + 'id' => '260', + 'isbn_group_id' => '45', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 260 => + array ( + 'from_number' => '95000', + 'id' => '261', + 'isbn_group_id' => '45', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 261 => + array ( + 'from_number' => '0', + 'id' => '262', + 'isbn_group_id' => '46', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 262 => + array ( + 'from_number' => '20000', + 'id' => '263', + 'isbn_group_id' => '46', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 263 => + array ( + 'from_number' => '70000', + 'id' => '264', + 'isbn_group_id' => '46', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 264 => + array ( + 'from_number' => '0', + 'id' => '265', + 'isbn_group_id' => '47', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '02', + 'to_number' => '2999', + ), + 265 => + array ( + 'from_number' => '3000', + 'id' => '266', + 'isbn_group_id' => '47', + 'registrant_from' => '0300', + 'registrant_length' => '4', + 'registrant_to' => '0499', + 'to_number' => '4999', + ), + 266 => + array ( + 'from_number' => '5000', + 'id' => '267', + 'isbn_group_id' => '47', + 'registrant_from' => '05', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 267 => + array ( + 'from_number' => '20000', + 'id' => '268', + 'isbn_group_id' => '47', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2099', + 'to_number' => '20999', + ), + 268 => + array ( + 'from_number' => '21000', + 'id' => '269', + 'isbn_group_id' => '47', + 'registrant_from' => '21', + 'registrant_length' => '2', + 'registrant_to' => '27', + 'to_number' => '27999', + ), + 269 => + array ( + 'from_number' => '28000', + 'id' => '270', + 'isbn_group_id' => '47', + 'registrant_from' => '28000', + 'registrant_length' => '5', + 'registrant_to' => '30999', + 'to_number' => '30999', + ), + 270 => + array ( + 'from_number' => '31000', + 'id' => '271', + 'isbn_group_id' => '47', + 'registrant_from' => '31', + 'registrant_length' => '2', + 'registrant_to' => '43', + 'to_number' => '43999', + ), + 271 => + array ( + 'from_number' => '44000', + 'id' => '272', + 'isbn_group_id' => '47', + 'registrant_from' => '440', + 'registrant_length' => '3', + 'registrant_to' => '819', + 'to_number' => '81999', + ), + 272 => + array ( + 'from_number' => '82000', + 'id' => '273', + 'isbn_group_id' => '47', + 'registrant_from' => '8200', + 'registrant_length' => '4', + 'registrant_to' => '9699', + 'to_number' => '96999', + ), + 273 => + array ( + 'from_number' => '97000', + 'id' => '274', + 'isbn_group_id' => '47', + 'registrant_from' => '97000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 274 => + array ( + 'from_number' => '0', + 'id' => '275', + 'isbn_group_id' => '48', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '56', + 'to_number' => '56999', + ), + 275 => + array ( + 'from_number' => '57000', + 'id' => '276', + 'isbn_group_id' => '48', + 'registrant_from' => '57000', + 'registrant_length' => '5', + 'registrant_to' => '59999', + 'to_number' => '59999', + ), + 276 => + array ( + 'from_number' => '60000', + 'id' => '277', + 'isbn_group_id' => '48', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 277 => + array ( + 'from_number' => '80000', + 'id' => '278', + 'isbn_group_id' => '48', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 278 => + array ( + 'from_number' => '95000', + 'id' => '279', + 'isbn_group_id' => '48', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 279 => + array ( + 'from_number' => '0', + 'id' => '280', + 'isbn_group_id' => '49', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 280 => + array ( + 'from_number' => '20000', + 'id' => '281', + 'isbn_group_id' => '49', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 281 => + array ( + 'from_number' => '70000', + 'id' => '282', + 'isbn_group_id' => '49', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 282 => + array ( + 'from_number' => '85000', + 'id' => '283', + 'isbn_group_id' => '49', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 283 => + array ( + 'from_number' => '0', + 'id' => '284', + 'isbn_group_id' => '50', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 284 => + array ( + 'from_number' => '20000', + 'id' => '285', + 'isbn_group_id' => '50', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '659', + 'to_number' => '65999', + ), + 285 => + array ( + 'from_number' => '66000', + 'id' => '286', + 'isbn_group_id' => '50', + 'registrant_from' => '6600', + 'registrant_length' => '4', + 'registrant_to' => '6899', + 'to_number' => '68999', + ), + 286 => + array ( + 'from_number' => '69000', + 'id' => '287', + 'isbn_group_id' => '50', + 'registrant_from' => '690', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 287 => + array ( + 'from_number' => '70000', + 'id' => '288', + 'isbn_group_id' => '50', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 288 => + array ( + 'from_number' => '85000', + 'id' => '289', + 'isbn_group_id' => '50', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '92999', + 'to_number' => '92999', + ), + 289 => + array ( + 'from_number' => '93000', + 'id' => '290', + 'isbn_group_id' => '50', + 'registrant_from' => '93', + 'registrant_length' => '2', + 'registrant_to' => '93', + 'to_number' => '93999', + ), + 290 => + array ( + 'from_number' => '94000', + 'id' => '291', + 'isbn_group_id' => '50', + 'registrant_from' => '9400', + 'registrant_length' => '4', + 'registrant_to' => '9799', + 'to_number' => '97999', + ), + 291 => + array ( + 'from_number' => '98000', + 'id' => '292', + 'isbn_group_id' => '50', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 292 => + array ( + 'from_number' => '0', + 'id' => '293', + 'isbn_group_id' => '51', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 293 => + array ( + 'from_number' => '20000', + 'id' => '294', + 'isbn_group_id' => '51', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 294 => + array ( + 'from_number' => '60000', + 'id' => '295', + 'isbn_group_id' => '51', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 295 => + array ( + 'from_number' => '90000', + 'id' => '296', + 'isbn_group_id' => '51', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 296 => + array ( + 'from_number' => '0', + 'id' => '297', + 'isbn_group_id' => '52', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 297 => + array ( + 'from_number' => '20000', + 'id' => '298', + 'isbn_group_id' => '52', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 298 => + array ( + 'from_number' => '70000', + 'id' => '299', + 'isbn_group_id' => '52', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 299 => + array ( + 'from_number' => '85000', + 'id' => '300', + 'isbn_group_id' => '52', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '86999', + 'to_number' => '86999', + ), + 300 => + array ( + 'from_number' => '87000', + 'id' => '301', + 'isbn_group_id' => '52', + 'registrant_from' => '8700', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 301 => + array ( + 'from_number' => '90000', + 'id' => '302', + 'isbn_group_id' => '52', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 302 => + array ( + 'from_number' => '0', + 'id' => '303', + 'isbn_group_id' => '53', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 303 => + array ( + 'from_number' => '20000', + 'id' => '304', + 'isbn_group_id' => '53', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 304 => + array ( + 'from_number' => '70000', + 'id' => '305', + 'isbn_group_id' => '53', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 305 => + array ( + 'from_number' => '85000', + 'id' => '306', + 'isbn_group_id' => '53', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 306 => + array ( + 'from_number' => '90000', + 'id' => '307', + 'isbn_group_id' => '53', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 307 => + array ( + 'from_number' => '0', + 'id' => '308', + 'isbn_group_id' => '54', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 308 => + array ( + 'from_number' => '15000', + 'id' => '309', + 'isbn_group_id' => '54', + 'registrant_from' => '150', + 'registrant_length' => '3', + 'registrant_to' => '249', + 'to_number' => '24999', + ), + 309 => + array ( + 'from_number' => '25000', + 'id' => '310', + 'isbn_group_id' => '54', + 'registrant_from' => '2500', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 310 => + array ( + 'from_number' => '30000', + 'id' => '311', + 'isbn_group_id' => '54', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '549', + 'to_number' => '54999', + ), + 311 => + array ( + 'from_number' => '55000', + 'id' => '312', + 'isbn_group_id' => '54', + 'registrant_from' => '5500', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 312 => + array ( + 'from_number' => '90000', + 'id' => '313', + 'isbn_group_id' => '54', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 313 => + array ( + 'from_number' => '97000', + 'id' => '314', + 'isbn_group_id' => '54', + 'registrant_from' => '970', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 314 => + array ( + 'from_number' => '99000', + 'id' => '315', + 'isbn_group_id' => '54', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 315 => + array ( + 'from_number' => '0', + 'id' => '316', + 'isbn_group_id' => '55', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 316 => + array ( + 'from_number' => '20000', + 'id' => '317', + 'isbn_group_id' => '55', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 317 => + array ( + 'from_number' => '70000', + 'id' => '318', + 'isbn_group_id' => '55', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 318 => + array ( + 'from_number' => '90000', + 'id' => '319', + 'isbn_group_id' => '55', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 319 => + array ( + 'from_number' => '0', + 'id' => '320', + 'isbn_group_id' => '56', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 320 => + array ( + 'from_number' => '15000', + 'id' => '321', + 'isbn_group_id' => '56', + 'registrant_from' => '1500', + 'registrant_length' => '4', + 'registrant_to' => '1699', + 'to_number' => '16999', + ), + 321 => + array ( + 'from_number' => '17000', + 'id' => '322', + 'isbn_group_id' => '56', + 'registrant_from' => '170', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 322 => + array ( + 'from_number' => '20000', + 'id' => '323', + 'isbn_group_id' => '56', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 323 => + array ( + 'from_number' => '30000', + 'id' => '324', + 'isbn_group_id' => '56', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 324 => + array ( + 'from_number' => '70000', + 'id' => '325', + 'isbn_group_id' => '56', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 325 => + array ( + 'from_number' => '90000', + 'id' => '326', + 'isbn_group_id' => '56', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 326 => + array ( + 'from_number' => '0', + 'id' => '327', + 'isbn_group_id' => '57', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '00', + 'to_number' => '999', + ), + 327 => + array ( + 'from_number' => '1000', + 'id' => '328', + 'isbn_group_id' => '57', + 'registrant_from' => '0100', + 'registrant_length' => '4', + 'registrant_to' => '0999', + 'to_number' => '9999', + ), + 328 => + array ( + 'from_number' => '10000', + 'id' => '329', + 'isbn_group_id' => '57', + 'registrant_from' => '10000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 329 => + array ( + 'from_number' => '30000', + 'id' => '330', + 'isbn_group_id' => '57', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 330 => + array ( + 'from_number' => '50000', + 'id' => '331', + 'isbn_group_id' => '57', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 331 => + array ( + 'from_number' => '60000', + 'id' => '332', + 'isbn_group_id' => '57', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 332 => + array ( + 'from_number' => '90000', + 'id' => '333', + 'isbn_group_id' => '57', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 333 => + array ( + 'from_number' => '99000', + 'id' => '334', + 'isbn_group_id' => '57', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9989', + 'to_number' => '99899', + ), + 334 => + array ( + 'from_number' => '99900', + 'id' => '335', + 'isbn_group_id' => '57', + 'registrant_from' => '99900', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 335 => + array ( + 'from_number' => '1000', + 'id' => '336', + 'isbn_group_id' => '58', + 'registrant_from' => '01', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 336 => + array ( + 'from_number' => '40000', + 'id' => '337', + 'isbn_group_id' => '58', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 337 => + array ( + 'from_number' => '50000', + 'id' => '338', + 'isbn_group_id' => '58', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 338 => + array ( + 'from_number' => '80000', + 'id' => '339', + 'isbn_group_id' => '58', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 339 => + array ( + 'from_number' => '90000', + 'id' => '340', + 'isbn_group_id' => '58', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 340 => + array ( + 'from_number' => '0', + 'id' => '341', + 'isbn_group_id' => '59', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 341 => + array ( + 'from_number' => '20000', + 'id' => '342', + 'isbn_group_id' => '59', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 342 => + array ( + 'from_number' => '40000', + 'id' => '343', + 'isbn_group_id' => '59', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 343 => + array ( + 'from_number' => '80000', + 'id' => '344', + 'isbn_group_id' => '59', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 344 => + array ( + 'from_number' => '1000', + 'id' => '345', + 'isbn_group_id' => '60', + 'registrant_from' => '01', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 345 => + array ( + 'from_number' => '60000', + 'id' => '346', + 'isbn_group_id' => '60', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 346 => + array ( + 'from_number' => '90000', + 'id' => '347', + 'isbn_group_id' => '60', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9099', + 'to_number' => '90999', + ), + 347 => + array ( + 'from_number' => '91000', + 'id' => '348', + 'isbn_group_id' => '60', + 'registrant_from' => '91000', + 'registrant_length' => '5', + 'registrant_to' => '96999', + 'to_number' => '96999', + ), + 348 => + array ( + 'from_number' => '97000', + 'id' => '349', + 'isbn_group_id' => '60', + 'registrant_from' => '9700', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 349 => + array ( + 'from_number' => '0', + 'id' => '350', + 'isbn_group_id' => '61', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '015', + 'to_number' => '1599', + ), + 350 => + array ( + 'from_number' => '1600', + 'id' => '351', + 'isbn_group_id' => '61', + 'registrant_from' => '0160', + 'registrant_length' => '4', + 'registrant_to' => '0199', + 'to_number' => '1999', + ), + 351 => + array ( + 'from_number' => '2000', + 'id' => '352', + 'isbn_group_id' => '61', + 'registrant_from' => '02', + 'registrant_length' => '2', + 'registrant_to' => '02', + 'to_number' => '2999', + ), + 352 => + array ( + 'from_number' => '3000', + 'id' => '353', + 'isbn_group_id' => '61', + 'registrant_from' => '0300', + 'registrant_length' => '4', + 'registrant_to' => '0599', + 'to_number' => '5999', + ), + 353 => + array ( + 'from_number' => '6000', + 'id' => '354', + 'isbn_group_id' => '61', + 'registrant_from' => '06', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 354 => + array ( + 'from_number' => '10000', + 'id' => '355', + 'isbn_group_id' => '61', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 355 => + array ( + 'from_number' => '50000', + 'id' => '356', + 'isbn_group_id' => '61', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 356 => + array ( + 'from_number' => '85000', + 'id' => '357', + 'isbn_group_id' => '61', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9099', + 'to_number' => '90999', + ), + 357 => + array ( + 'from_number' => '91000', + 'id' => '358', + 'isbn_group_id' => '61', + 'registrant_from' => '91000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 358 => + array ( + 'from_number' => '99000', + 'id' => '359', + 'isbn_group_id' => '61', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 359 => + array ( + 'from_number' => '0', + 'id' => '360', + 'isbn_group_id' => '62', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 360 => + array ( + 'from_number' => '20000', + 'id' => '361', + 'isbn_group_id' => '62', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 361 => + array ( + 'from_number' => '55000', + 'id' => '362', + 'isbn_group_id' => '62', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 362 => + array ( + 'from_number' => '80000', + 'id' => '363', + 'isbn_group_id' => '62', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 363 => + array ( + 'from_number' => '95000', + 'id' => '364', + 'isbn_group_id' => '62', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 364 => + array ( + 'from_number' => '0', + 'id' => '365', + 'isbn_group_id' => '63', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 365 => + array ( + 'from_number' => '10000', + 'id' => '366', + 'isbn_group_id' => '63', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '169', + 'to_number' => '16999', + ), + 366 => + array ( + 'from_number' => '17000', + 'id' => '367', + 'isbn_group_id' => '63', + 'registrant_from' => '1700', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 367 => + array ( + 'from_number' => '20000', + 'id' => '368', + 'isbn_group_id' => '63', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 368 => + array ( + 'from_number' => '55000', + 'id' => '369', + 'isbn_group_id' => '63', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '759', + 'to_number' => '75999', + ), + 369 => + array ( + 'from_number' => '76000', + 'id' => '370', + 'isbn_group_id' => '63', + 'registrant_from' => '7600', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 370 => + array ( + 'from_number' => '85000', + 'id' => '371', + 'isbn_group_id' => '63', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '88999', + 'to_number' => '88999', + ), + 371 => + array ( + 'from_number' => '89000', + 'id' => '372', + 'isbn_group_id' => '63', + 'registrant_from' => '8900', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 372 => + array ( + 'from_number' => '95000', + 'id' => '373', + 'isbn_group_id' => '63', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 373 => + array ( + 'from_number' => '0', + 'id' => '374', + 'isbn_group_id' => '64', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 374 => + array ( + 'from_number' => '20000', + 'id' => '375', + 'isbn_group_id' => '64', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 375 => + array ( + 'from_number' => '70000', + 'id' => '376', + 'isbn_group_id' => '64', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8499', + 'to_number' => '84999', + ), + 376 => + array ( + 'from_number' => '85000', + 'id' => '377', + 'isbn_group_id' => '64', + 'registrant_from' => '85000', + 'registrant_length' => '5', + 'registrant_to' => '89999', + 'to_number' => '89999', + ), + 377 => + array ( + 'from_number' => '90000', + 'id' => '378', + 'isbn_group_id' => '64', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '94999', + 'to_number' => '94999', + ), + 378 => + array ( + 'from_number' => '95000', + 'id' => '379', + 'isbn_group_id' => '64', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 379 => + array ( + 'from_number' => '0', + 'id' => '380', + 'isbn_group_id' => '65', + 'registrant_from' => '00000', + 'registrant_length' => '5', + 'registrant_to' => '01999', + 'to_number' => '1999', + ), + 380 => + array ( + 'from_number' => '2000', + 'id' => '381', + 'isbn_group_id' => '65', + 'registrant_from' => '02', + 'registrant_length' => '2', + 'registrant_to' => '24', + 'to_number' => '24999', + ), + 381 => + array ( + 'from_number' => '25000', + 'id' => '382', + 'isbn_group_id' => '65', + 'registrant_from' => '250', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 382 => + array ( + 'from_number' => '60000', + 'id' => '383', + 'isbn_group_id' => '65', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '9199', + 'to_number' => '91999', + ), + 383 => + array ( + 'from_number' => '92000', + 'id' => '384', + 'isbn_group_id' => '65', + 'registrant_from' => '92000', + 'registrant_length' => '5', + 'registrant_to' => '98999', + 'to_number' => '98999', + ), + 384 => + array ( + 'from_number' => '99000', + 'id' => '385', + 'isbn_group_id' => '65', + 'registrant_from' => '990', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 385 => + array ( + 'from_number' => '0', + 'id' => '386', + 'isbn_group_id' => '66', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 386 => + array ( + 'from_number' => '40000', + 'id' => '387', + 'isbn_group_id' => '66', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 387 => + array ( + 'from_number' => '60000', + 'id' => '388', + 'isbn_group_id' => '66', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 388 => + array ( + 'from_number' => '80000', + 'id' => '389', + 'isbn_group_id' => '66', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 389 => + array ( + 'from_number' => '95000', + 'id' => '390', + 'isbn_group_id' => '66', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 390 => + array ( + 'from_number' => '0', + 'id' => '391', + 'isbn_group_id' => '67', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 391 => + array ( + 'from_number' => '20000', + 'id' => '392', + 'isbn_group_id' => '67', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 392 => + array ( + 'from_number' => '50000', + 'id' => '393', + 'isbn_group_id' => '67', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '6999', + 'to_number' => '69999', + ), + 393 => + array ( + 'from_number' => '70000', + 'id' => '394', + 'isbn_group_id' => '67', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 394 => + array ( + 'from_number' => '0', + 'id' => '395', + 'isbn_group_id' => '68', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 395 => + array ( + 'from_number' => '20000', + 'id' => '396', + 'isbn_group_id' => '68', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 396 => + array ( + 'from_number' => '30000', + 'id' => '397', + 'isbn_group_id' => '68', + 'registrant_from' => '30000', + 'registrant_length' => '5', + 'registrant_to' => '79999', + 'to_number' => '79999', + ), + 397 => + array ( + 'from_number' => '80000', + 'id' => '398', + 'isbn_group_id' => '68', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 398 => + array ( + 'from_number' => '90000', + 'id' => '399', + 'isbn_group_id' => '68', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 399 => + array ( + 'from_number' => '0', + 'id' => '400', + 'isbn_group_id' => '69', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '099', + 'to_number' => '9999', + ), + 400 => + array ( + 'from_number' => '10000', + 'id' => '401', + 'isbn_group_id' => '69', + 'registrant_from' => '1000', + 'registrant_length' => '4', + 'registrant_to' => '1499', + 'to_number' => '14999', + ), + 401 => + array ( + 'from_number' => '15000', + 'id' => '402', + 'isbn_group_id' => '69', + 'registrant_from' => '15000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 402 => + array ( + 'from_number' => '20000', + 'id' => '403', + 'isbn_group_id' => '69', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 403 => + array ( + 'from_number' => '30000', + 'id' => '404', + 'isbn_group_id' => '69', + 'registrant_from' => '3000', + 'registrant_length' => '4', + 'registrant_to' => '3999', + 'to_number' => '39999', + ), + 404 => + array ( + 'from_number' => '40000', + 'id' => '405', + 'isbn_group_id' => '69', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 405 => + array ( + 'from_number' => '80000', + 'id' => '406', + 'isbn_group_id' => '69', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 406 => + array ( + 'from_number' => '95000', + 'id' => '407', + 'isbn_group_id' => '69', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 407 => + array ( + 'from_number' => '0', + 'id' => '408', + 'isbn_group_id' => '70', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 408 => + array ( + 'from_number' => '20000', + 'id' => '409', + 'isbn_group_id' => '70', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 409 => + array ( + 'from_number' => '60000', + 'id' => '410', + 'isbn_group_id' => '70', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 410 => + array ( + 'from_number' => '0', + 'id' => '411', + 'isbn_group_id' => '71', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '11', + 'to_number' => '11999', + ), + 411 => + array ( + 'from_number' => '12000', + 'id' => '412', + 'isbn_group_id' => '71', + 'registrant_from' => '1200', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 412 => + array ( + 'from_number' => '20000', + 'id' => '413', + 'isbn_group_id' => '71', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '289', + 'to_number' => '28999', + ), + 413 => + array ( + 'from_number' => '29000', + 'id' => '414', + 'isbn_group_id' => '71', + 'registrant_from' => '2900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 414 => + array ( + 'from_number' => '0', + 'id' => '415', + 'isbn_group_id' => '72', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 415 => + array ( + 'from_number' => '10000', + 'id' => '416', + 'isbn_group_id' => '72', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 416 => + array ( + 'from_number' => '70000', + 'id' => '417', + 'isbn_group_id' => '72', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 417 => + array ( + 'from_number' => '90000', + 'id' => '418', + 'isbn_group_id' => '72', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9799', + 'to_number' => '97999', + ), + 418 => + array ( + 'from_number' => '98000', + 'id' => '419', + 'isbn_group_id' => '72', + 'registrant_from' => '98000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 419 => + array ( + 'from_number' => '0', + 'id' => '420', + 'isbn_group_id' => '73', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '01', + 'to_number' => '1999', + ), + 420 => + array ( + 'from_number' => '2000', + 'id' => '421', + 'isbn_group_id' => '73', + 'registrant_from' => '020', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 421 => + array ( + 'from_number' => '20000', + 'id' => '422', + 'isbn_group_id' => '73', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '3999', + 'to_number' => '39999', + ), + 422 => + array ( + 'from_number' => '40000', + 'id' => '423', + 'isbn_group_id' => '73', + 'registrant_from' => '40000', + 'registrant_length' => '5', + 'registrant_to' => '44999', + 'to_number' => '44999', + ), + 423 => + array ( + 'from_number' => '45000', + 'id' => '424', + 'isbn_group_id' => '73', + 'registrant_from' => '45', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 424 => + array ( + 'from_number' => '50000', + 'id' => '425', + 'isbn_group_id' => '73', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 425 => + array ( + 'from_number' => '80000', + 'id' => '426', + 'isbn_group_id' => '73', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 426 => + array ( + 'from_number' => '90000', + 'id' => '427', + 'isbn_group_id' => '73', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9899', + 'to_number' => '98999', + ), + 427 => + array ( + 'from_number' => '99000', + 'id' => '428', + 'isbn_group_id' => '73', + 'registrant_from' => '99000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 428 => + array ( + 'from_number' => '0', + 'id' => '429', + 'isbn_group_id' => '74', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 429 => + array ( + 'from_number' => '40000', + 'id' => '430', + 'isbn_group_id' => '74', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 430 => + array ( + 'from_number' => '80000', + 'id' => '431', + 'isbn_group_id' => '74', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 431 => + array ( + 'from_number' => '90000', + 'id' => '432', + 'isbn_group_id' => '74', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 432 => + array ( + 'from_number' => '0', + 'id' => '433', + 'isbn_group_id' => '75', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 433 => + array ( + 'from_number' => '40000', + 'id' => '434', + 'isbn_group_id' => '75', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 434 => + array ( + 'from_number' => '60000', + 'id' => '435', + 'isbn_group_id' => '75', + 'registrant_from' => '6000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 435 => + array ( + 'from_number' => '90000', + 'id' => '436', + 'isbn_group_id' => '75', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 436 => + array ( + 'from_number' => '0', + 'id' => '437', + 'isbn_group_id' => '76', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '11', + 'to_number' => '11999', + ), + 437 => + array ( + 'from_number' => '12000', + 'id' => '438', + 'isbn_group_id' => '76', + 'registrant_from' => '120', + 'registrant_length' => '3', + 'registrant_to' => '559', + 'to_number' => '55999', + ), + 438 => + array ( + 'from_number' => '56000', + 'id' => '439', + 'isbn_group_id' => '76', + 'registrant_from' => '5600', + 'registrant_length' => '4', + 'registrant_to' => '7999', + 'to_number' => '79999', + ), + 439 => + array ( + 'from_number' => '80000', + 'id' => '440', + 'isbn_group_id' => '76', + 'registrant_from' => '80000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 440 => + array ( + 'from_number' => '0', + 'id' => '441', + 'isbn_group_id' => '77', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 441 => + array ( + 'from_number' => '10000', + 'id' => '442', + 'isbn_group_id' => '77', + 'registrant_from' => '1000', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 442 => + array ( + 'from_number' => '20000', + 'id' => '443', + 'isbn_group_id' => '77', + 'registrant_from' => '20000', + 'registrant_length' => '5', + 'registrant_to' => '29999', + 'to_number' => '29999', + ), + 443 => + array ( + 'from_number' => '30000', + 'id' => '444', + 'isbn_group_id' => '77', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 444 => + array ( + 'from_number' => '50000', + 'id' => '445', + 'isbn_group_id' => '77', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 445 => + array ( + 'from_number' => '90000', + 'id' => '446', + 'isbn_group_id' => '77', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 446 => + array ( + 'from_number' => '95000', + 'id' => '447', + 'isbn_group_id' => '77', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 447 => + array ( + 'from_number' => '0', + 'id' => '448', + 'isbn_group_id' => '78', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '14', + 'to_number' => '14999', + ), + 448 => + array ( + 'from_number' => '15000', + 'id' => '449', + 'isbn_group_id' => '78', + 'registrant_from' => '15000', + 'registrant_length' => '5', + 'registrant_to' => '16999', + 'to_number' => '16999', + ), + 449 => + array ( + 'from_number' => '17000', + 'id' => '450', + 'isbn_group_id' => '78', + 'registrant_from' => '17000', + 'registrant_length' => '5', + 'registrant_to' => '19999', + 'to_number' => '19999', + ), + 450 => + array ( + 'from_number' => '20000', + 'id' => '451', + 'isbn_group_id' => '78', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 451 => + array ( + 'from_number' => '80000', + 'id' => '452', + 'isbn_group_id' => '78', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9699', + 'to_number' => '96999', + ), + 452 => + array ( + 'from_number' => '97000', + 'id' => '453', + 'isbn_group_id' => '78', + 'registrant_from' => '97000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 453 => + array ( + 'from_number' => '0', + 'id' => '454', + 'isbn_group_id' => '79', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 454 => + array ( + 'from_number' => '20000', + 'id' => '455', + 'isbn_group_id' => '79', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 455 => + array ( + 'from_number' => '55000', + 'id' => '456', + 'isbn_group_id' => '79', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 456 => + array ( + 'from_number' => '80000', + 'id' => '457', + 'isbn_group_id' => '79', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 457 => + array ( + 'from_number' => '95000', + 'id' => '458', + 'isbn_group_id' => '79', + 'registrant_from' => '95000', + 'registrant_length' => '5', + 'registrant_to' => '99999', + 'to_number' => '99999', + ), + 458 => + array ( + 'from_number' => '0', + 'id' => '459', + 'isbn_group_id' => '80', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 459 => + array ( + 'from_number' => '10000', + 'id' => '460', + 'isbn_group_id' => '80', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 460 => + array ( + 'from_number' => '40000', + 'id' => '461', + 'isbn_group_id' => '80', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4999', + 'to_number' => '49999', + ), + 461 => + array ( + 'from_number' => '0', + 'id' => '462', + 'isbn_group_id' => '81', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 462 => + array ( + 'from_number' => '10000', + 'id' => '463', + 'isbn_group_id' => '81', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 463 => + array ( + 'from_number' => '40000', + 'id' => '464', + 'isbn_group_id' => '81', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4999', + 'to_number' => '49999', + ), + 464 => + array ( + 'from_number' => '0', + 'id' => '465', + 'isbn_group_id' => '82', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 465 => + array ( + 'from_number' => '40000', + 'id' => '466', + 'isbn_group_id' => '82', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 466 => + array ( + 'from_number' => '55000', + 'id' => '467', + 'isbn_group_id' => '82', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 467 => + array ( + 'from_number' => '80000', + 'id' => '468', + 'isbn_group_id' => '82', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 468 => + array ( + 'from_number' => '0', + 'id' => '469', + 'isbn_group_id' => '83', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 469 => + array ( + 'from_number' => '50000', + 'id' => '470', + 'isbn_group_id' => '83', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '939', + 'to_number' => '93999', + ), + 470 => + array ( + 'from_number' => '94000', + 'id' => '471', + 'isbn_group_id' => '83', + 'registrant_from' => '9400', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 471 => + array ( + 'from_number' => '0', + 'id' => '472', + 'isbn_group_id' => '84', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 472 => + array ( + 'from_number' => '30000', + 'id' => '473', + 'isbn_group_id' => '84', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 473 => + array ( + 'from_number' => '90000', + 'id' => '474', + 'isbn_group_id' => '84', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 474 => + array ( + 'from_number' => '0', + 'id' => '475', + 'isbn_group_id' => '85', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 475 => + array ( + 'from_number' => '40000', + 'id' => '476', + 'isbn_group_id' => '85', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 476 => + array ( + 'from_number' => '85000', + 'id' => '477', + 'isbn_group_id' => '85', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 477 => + array ( + 'from_number' => '0', + 'id' => '478', + 'isbn_group_id' => '86', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 478 => + array ( + 'from_number' => '10000', + 'id' => '479', + 'isbn_group_id' => '86', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 479 => + array ( + 'from_number' => '40000', + 'id' => '480', + 'isbn_group_id' => '86', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 480 => + array ( + 'from_number' => '90000', + 'id' => '481', + 'isbn_group_id' => '86', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 481 => + array ( + 'from_number' => '0', + 'id' => '482', + 'isbn_group_id' => '87', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 482 => + array ( + 'from_number' => '10000', + 'id' => '483', + 'isbn_group_id' => '87', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 483 => + array ( + 'from_number' => '50000', + 'id' => '484', + 'isbn_group_id' => '87', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 484 => + array ( + 'from_number' => '80000', + 'id' => '485', + 'isbn_group_id' => '87', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 485 => + array ( + 'from_number' => '0', + 'id' => '486', + 'isbn_group_id' => '88', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 486 => + array ( + 'from_number' => '10000', + 'id' => '487', + 'isbn_group_id' => '88', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 487 => + array ( + 'from_number' => '40000', + 'id' => '488', + 'isbn_group_id' => '88', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 488 => + array ( + 'from_number' => '90000', + 'id' => '489', + 'isbn_group_id' => '88', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 489 => + array ( + 'from_number' => '0', + 'id' => '490', + 'isbn_group_id' => '89', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 490 => + array ( + 'from_number' => '20000', + 'id' => '491', + 'isbn_group_id' => '89', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 491 => + array ( + 'from_number' => '40000', + 'id' => '492', + 'isbn_group_id' => '89', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 492 => + array ( + 'from_number' => '80000', + 'id' => '493', + 'isbn_group_id' => '89', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 493 => + array ( + 'from_number' => '0', + 'id' => '494', + 'isbn_group_id' => '90', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 494 => + array ( + 'from_number' => '30000', + 'id' => '495', + 'isbn_group_id' => '90', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 495 => + array ( + 'from_number' => '50000', + 'id' => '496', + 'isbn_group_id' => '90', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 496 => + array ( + 'from_number' => '80000', + 'id' => '497', + 'isbn_group_id' => '90', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 497 => + array ( + 'from_number' => '0', + 'id' => '498', + 'isbn_group_id' => '91', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 498 => + array ( + 'from_number' => '80000', + 'id' => '499', + 'isbn_group_id' => '91', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 499 => + array ( + 'from_number' => '95000', + 'id' => '500', + 'isbn_group_id' => '91', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 500 => + array ( + 'from_number' => '0', + 'id' => '501', + 'isbn_group_id' => '92', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 501 => + array ( + 'from_number' => '50000', + 'id' => '502', + 'isbn_group_id' => '92', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 502 => + array ( + 'from_number' => '80000', + 'id' => '503', + 'isbn_group_id' => '92', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 503 => + array ( + 'from_number' => '90000', + 'id' => '504', + 'isbn_group_id' => '92', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 504 => + array ( + 'from_number' => '0', + 'id' => '505', + 'isbn_group_id' => '93', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 505 => + array ( + 'from_number' => '20000', + 'id' => '506', + 'isbn_group_id' => '93', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 506 => + array ( + 'from_number' => '50000', + 'id' => '507', + 'isbn_group_id' => '93', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 507 => + array ( + 'from_number' => '90000', + 'id' => '508', + 'isbn_group_id' => '93', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 508 => + array ( + 'from_number' => '0', + 'id' => '509', + 'isbn_group_id' => '94', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 509 => + array ( + 'from_number' => '10000', + 'id' => '510', + 'isbn_group_id' => '94', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 510 => + array ( + 'from_number' => '40000', + 'id' => '511', + 'isbn_group_id' => '94', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 511 => + array ( + 'from_number' => '90000', + 'id' => '512', + 'isbn_group_id' => '94', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 512 => + array ( + 'from_number' => '0', + 'id' => '513', + 'isbn_group_id' => '95', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 513 => + array ( + 'from_number' => '90000', + 'id' => '514', + 'isbn_group_id' => '95', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '984', + 'to_number' => '98499', + ), + 514 => + array ( + 'from_number' => '98500', + 'id' => '515', + 'isbn_group_id' => '95', + 'registrant_from' => '9850', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 515 => + array ( + 'from_number' => '0', + 'id' => '516', + 'isbn_group_id' => '96', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 516 => + array ( + 'from_number' => '30000', + 'id' => '517', + 'isbn_group_id' => '96', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 517 => + array ( + 'from_number' => '40000', + 'id' => '518', + 'isbn_group_id' => '96', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 518 => + array ( + 'from_number' => '0', + 'id' => '519', + 'isbn_group_id' => '97', + 'registrant_from' => '0000', + 'registrant_length' => '4', + 'registrant_to' => '0999', + 'to_number' => '9999', + ), + 519 => + array ( + 'from_number' => '10000', + 'id' => '520', + 'isbn_group_id' => '97', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '499', + 'to_number' => '49999', + ), + 520 => + array ( + 'from_number' => '50000', + 'id' => '521', + 'isbn_group_id' => '97', + 'registrant_from' => '5000', + 'registrant_length' => '4', + 'registrant_to' => '5999', + 'to_number' => '59999', + ), + 521 => + array ( + 'from_number' => '60000', + 'id' => '522', + 'isbn_group_id' => '97', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 522 => + array ( + 'from_number' => '70000', + 'id' => '523', + 'isbn_group_id' => '97', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 523 => + array ( + 'from_number' => '80000', + 'id' => '524', + 'isbn_group_id' => '97', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 524 => + array ( + 'from_number' => '90000', + 'id' => '525', + 'isbn_group_id' => '97', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 525 => + array ( + 'from_number' => '0', + 'id' => '526', + 'isbn_group_id' => '98', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '00', + 'to_number' => '999', + ), + 526 => + array ( + 'from_number' => '1000', + 'id' => '527', + 'isbn_group_id' => '98', + 'registrant_from' => '010', + 'registrant_length' => '3', + 'registrant_to' => '079', + 'to_number' => '7999', + ), + 527 => + array ( + 'from_number' => '8000', + 'id' => '528', + 'isbn_group_id' => '98', + 'registrant_from' => '08', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 528 => + array ( + 'from_number' => '40000', + 'id' => '529', + 'isbn_group_id' => '98', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '569', + 'to_number' => '56999', + ), + 529 => + array ( + 'from_number' => '57000', + 'id' => '530', + 'isbn_group_id' => '98', + 'registrant_from' => '57', + 'registrant_length' => '2', + 'registrant_to' => '57', + 'to_number' => '57999', + ), + 530 => + array ( + 'from_number' => '58000', + 'id' => '531', + 'isbn_group_id' => '98', + 'registrant_from' => '580', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 531 => + array ( + 'from_number' => '85000', + 'id' => '532', + 'isbn_group_id' => '98', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 532 => + array ( + 'from_number' => '0', + 'id' => '533', + 'isbn_group_id' => '99', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 533 => + array ( + 'from_number' => '20000', + 'id' => '534', + 'isbn_group_id' => '99', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 534 => + array ( + 'from_number' => '40000', + 'id' => '535', + 'isbn_group_id' => '99', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 535 => + array ( + 'from_number' => '90000', + 'id' => '536', + 'isbn_group_id' => '99', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 536 => + array ( + 'from_number' => '0', + 'id' => '537', + 'isbn_group_id' => '100', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 537 => + array ( + 'from_number' => '20000', + 'id' => '538', + 'isbn_group_id' => '100', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 538 => + array ( + 'from_number' => '80000', + 'id' => '539', + 'isbn_group_id' => '100', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 539 => + array ( + 'from_number' => '0', + 'id' => '540', + 'isbn_group_id' => '101', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 540 => + array ( + 'from_number' => '40000', + 'id' => '541', + 'isbn_group_id' => '101', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 541 => + array ( + 'from_number' => '85000', + 'id' => '542', + 'isbn_group_id' => '101', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 542 => + array ( + 'from_number' => '0', + 'id' => '543', + 'isbn_group_id' => '102', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 543 => + array ( + 'from_number' => '10000', + 'id' => '544', + 'isbn_group_id' => '102', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 544 => + array ( + 'from_number' => '40000', + 'id' => '545', + 'isbn_group_id' => '102', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 545 => + array ( + 'from_number' => '90000', + 'id' => '546', + 'isbn_group_id' => '102', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 546 => + array ( + 'from_number' => '0', + 'id' => '547', + 'isbn_group_id' => '103', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 547 => + array ( + 'from_number' => '30000', + 'id' => '548', + 'isbn_group_id' => '103', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 548 => + array ( + 'from_number' => '85000', + 'id' => '549', + 'isbn_group_id' => '103', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 549 => + array ( + 'from_number' => '0', + 'id' => '550', + 'isbn_group_id' => '104', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 550 => + array ( + 'from_number' => '40000', + 'id' => '551', + 'isbn_group_id' => '104', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 551 => + array ( + 'from_number' => '85000', + 'id' => '552', + 'isbn_group_id' => '104', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 552 => + array ( + 'from_number' => '0', + 'id' => '553', + 'isbn_group_id' => '105', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 553 => + array ( + 'from_number' => '20000', + 'id' => '554', + 'isbn_group_id' => '105', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 554 => + array ( + 'from_number' => '40000', + 'id' => '555', + 'isbn_group_id' => '105', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 555 => + array ( + 'from_number' => '80000', + 'id' => '556', + 'isbn_group_id' => '105', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 556 => + array ( + 'from_number' => '0', + 'id' => '557', + 'isbn_group_id' => '106', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 557 => + array ( + 'from_number' => '10000', + 'id' => '558', + 'isbn_group_id' => '106', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 558 => + array ( + 'from_number' => '40000', + 'id' => '559', + 'isbn_group_id' => '106', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 559 => + array ( + 'from_number' => '60000', + 'id' => '560', + 'isbn_group_id' => '106', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 560 => + array ( + 'from_number' => '90000', + 'id' => '561', + 'isbn_group_id' => '106', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 561 => + array ( + 'from_number' => '0', + 'id' => '562', + 'isbn_group_id' => '107', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 562 => + array ( + 'from_number' => '20000', + 'id' => '563', + 'isbn_group_id' => '107', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 563 => + array ( + 'from_number' => '40000', + 'id' => '564', + 'isbn_group_id' => '107', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 564 => + array ( + 'from_number' => '80000', + 'id' => '565', + 'isbn_group_id' => '107', + 'registrant_from' => '8000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 565 => + array ( + 'from_number' => '0', + 'id' => '566', + 'isbn_group_id' => '108', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 566 => + array ( + 'from_number' => '40000', + 'id' => '567', + 'isbn_group_id' => '108', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '929', + 'to_number' => '92999', + ), + 567 => + array ( + 'from_number' => '93000', + 'id' => '568', + 'isbn_group_id' => '108', + 'registrant_from' => '9300', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 568 => + array ( + 'from_number' => '0', + 'id' => '569', + 'isbn_group_id' => '109', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 569 => + array ( + 'from_number' => '10000', + 'id' => '570', + 'isbn_group_id' => '109', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 570 => + array ( + 'from_number' => '40000', + 'id' => '571', + 'isbn_group_id' => '109', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 571 => + array ( + 'from_number' => '90000', + 'id' => '572', + 'isbn_group_id' => '109', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 572 => + array ( + 'from_number' => '0', + 'id' => '573', + 'isbn_group_id' => '110', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 573 => + array ( + 'from_number' => '40000', + 'id' => '574', + 'isbn_group_id' => '110', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 574 => + array ( + 'from_number' => '70000', + 'id' => '575', + 'isbn_group_id' => '110', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '84', + 'to_number' => '84999', + ), + 575 => + array ( + 'from_number' => '85000', + 'id' => '576', + 'isbn_group_id' => '110', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '8799', + 'to_number' => '87999', + ), + 576 => + array ( + 'from_number' => '88000', + 'id' => '577', + 'isbn_group_id' => '110', + 'registrant_from' => '88', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 577 => + array ( + 'from_number' => '0', + 'id' => '578', + 'isbn_group_id' => '111', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 578 => + array ( + 'from_number' => '10000', + 'id' => '579', + 'isbn_group_id' => '111', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '18', + 'to_number' => '18999', + ), + 579 => + array ( + 'from_number' => '19000', + 'id' => '580', + 'isbn_group_id' => '111', + 'registrant_from' => '1900', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 580 => + array ( + 'from_number' => '20000', + 'id' => '581', + 'isbn_group_id' => '111', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 581 => + array ( + 'from_number' => '50000', + 'id' => '582', + 'isbn_group_id' => '111', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 582 => + array ( + 'from_number' => '90000', + 'id' => '583', + 'isbn_group_id' => '111', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 583 => + array ( + 'from_number' => '0', + 'id' => '584', + 'isbn_group_id' => '112', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 584 => + array ( + 'from_number' => '20000', + 'id' => '585', + 'isbn_group_id' => '112', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 585 => + array ( + 'from_number' => '80000', + 'id' => '586', + 'isbn_group_id' => '112', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 586 => + array ( + 'from_number' => '95000', + 'id' => '587', + 'isbn_group_id' => '112', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 587 => + array ( + 'from_number' => '0', + 'id' => '588', + 'isbn_group_id' => '113', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 588 => + array ( + 'from_number' => '60000', + 'id' => '589', + 'isbn_group_id' => '113', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 589 => + array ( + 'from_number' => '90000', + 'id' => '590', + 'isbn_group_id' => '113', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 590 => + array ( + 'from_number' => '0', + 'id' => '591', + 'isbn_group_id' => '114', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 591 => + array ( + 'from_number' => '30000', + 'id' => '592', + 'isbn_group_id' => '114', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 592 => + array ( + 'from_number' => '70000', + 'id' => '593', + 'isbn_group_id' => '114', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 593 => + array ( + 'from_number' => '95000', + 'id' => '594', + 'isbn_group_id' => '114', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 594 => + array ( + 'from_number' => '0', + 'id' => '595', + 'isbn_group_id' => '115', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 595 => + array ( + 'from_number' => '55000', + 'id' => '596', + 'isbn_group_id' => '115', + 'registrant_from' => '5500', + 'registrant_length' => '4', + 'registrant_to' => '5599', + 'to_number' => '55999', + ), + 596 => + array ( + 'from_number' => '56000', + 'id' => '597', + 'isbn_group_id' => '115', + 'registrant_from' => '56', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 597 => + array ( + 'from_number' => '60000', + 'id' => '598', + 'isbn_group_id' => '115', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '849', + 'to_number' => '84999', + ), + 598 => + array ( + 'from_number' => '85000', + 'id' => '599', + 'isbn_group_id' => '115', + 'registrant_from' => '8500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 599 => + array ( + 'from_number' => '0', + 'id' => '600', + 'isbn_group_id' => '116', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 600 => + array ( + 'from_number' => '30000', + 'id' => '601', + 'isbn_group_id' => '116', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 601 => + array ( + 'from_number' => '55000', + 'id' => '602', + 'isbn_group_id' => '116', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '734', + 'to_number' => '73499', + ), + 602 => + array ( + 'from_number' => '73500', + 'id' => '603', + 'isbn_group_id' => '116', + 'registrant_from' => '7350', + 'registrant_length' => '4', + 'registrant_to' => '7499', + 'to_number' => '74999', + ), + 603 => + array ( + 'from_number' => '75000', + 'id' => '604', + 'isbn_group_id' => '116', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 604 => + array ( + 'from_number' => '0', + 'id' => '605', + 'isbn_group_id' => '117', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '6', + 'to_number' => '69999', + ), + 605 => + array ( + 'from_number' => '70000', + 'id' => '606', + 'isbn_group_id' => '117', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 606 => + array ( + 'from_number' => '95000', + 'id' => '607', + 'isbn_group_id' => '117', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 607 => + array ( + 'from_number' => '0', + 'id' => '608', + 'isbn_group_id' => '118', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 608 => + array ( + 'from_number' => '40000', + 'id' => '609', + 'isbn_group_id' => '118', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 609 => + array ( + 'from_number' => '90000', + 'id' => '610', + 'isbn_group_id' => '118', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 610 => + array ( + 'from_number' => '0', + 'id' => '611', + 'isbn_group_id' => '119', + 'registrant_from' => '000', + 'registrant_length' => '3', + 'registrant_to' => '149', + 'to_number' => '14999', + ), + 611 => + array ( + 'from_number' => '15000', + 'id' => '612', + 'isbn_group_id' => '119', + 'registrant_from' => '1500', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 612 => + array ( + 'from_number' => '20000', + 'id' => '613', + 'isbn_group_id' => '119', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 613 => + array ( + 'from_number' => '70000', + 'id' => '614', + 'isbn_group_id' => '119', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '7499', + 'to_number' => '74999', + ), + 614 => + array ( + 'from_number' => '75000', + 'id' => '615', + 'isbn_group_id' => '119', + 'registrant_from' => '750', + 'registrant_length' => '3', + 'registrant_to' => '959', + 'to_number' => '95999', + ), + 615 => + array ( + 'from_number' => '96000', + 'id' => '616', + 'isbn_group_id' => '119', + 'registrant_from' => '9600', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 616 => + array ( + 'from_number' => '0', + 'id' => '617', + 'isbn_group_id' => '120', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 617 => + array ( + 'from_number' => '40000', + 'id' => '618', + 'isbn_group_id' => '120', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 618 => + array ( + 'from_number' => '90000', + 'id' => '619', + 'isbn_group_id' => '120', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 619 => + array ( + 'from_number' => '0', + 'id' => '620', + 'isbn_group_id' => '121', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 620 => + array ( + 'from_number' => '50000', + 'id' => '621', + 'isbn_group_id' => '121', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '939', + 'to_number' => '93999', + ), + 621 => + array ( + 'from_number' => '94000', + 'id' => '622', + 'isbn_group_id' => '121', + 'registrant_from' => '9400', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 622 => + array ( + 'from_number' => '0', + 'id' => '623', + 'isbn_group_id' => '122', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 623 => + array ( + 'from_number' => '40000', + 'id' => '624', + 'isbn_group_id' => '122', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 624 => + array ( + 'from_number' => '90000', + 'id' => '625', + 'isbn_group_id' => '122', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 625 => + array ( + 'from_number' => '0', + 'id' => '626', + 'isbn_group_id' => '123', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 626 => + array ( + 'from_number' => '60000', + 'id' => '627', + 'isbn_group_id' => '123', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 627 => + array ( + 'from_number' => '90000', + 'id' => '628', + 'isbn_group_id' => '123', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 628 => + array ( + 'from_number' => '99000', + 'id' => '629', + 'isbn_group_id' => '123', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 629 => + array ( + 'from_number' => '0', + 'id' => '630', + 'isbn_group_id' => '124', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 630 => + array ( + 'from_number' => '10000', + 'id' => '631', + 'isbn_group_id' => '124', + 'registrant_from' => '1', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 631 => + array ( + 'from_number' => '20000', + 'id' => '632', + 'isbn_group_id' => '124', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '249', + 'to_number' => '24999', + ), + 632 => + array ( + 'from_number' => '25000', + 'id' => '633', + 'isbn_group_id' => '124', + 'registrant_from' => '2500', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 633 => + array ( + 'from_number' => '30000', + 'id' => '634', + 'isbn_group_id' => '124', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 634 => + array ( + 'from_number' => '60000', + 'id' => '635', + 'isbn_group_id' => '124', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 635 => + array ( + 'from_number' => '90000', + 'id' => '636', + 'isbn_group_id' => '124', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 636 => + array ( + 'from_number' => '0', + 'id' => '637', + 'isbn_group_id' => '125', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '05', + 'to_number' => '5999', + ), + 637 => + array ( + 'from_number' => '6000', + 'id' => '638', + 'isbn_group_id' => '125', + 'registrant_from' => '060', + 'registrant_length' => '3', + 'registrant_to' => '089', + 'to_number' => '8999', + ), + 638 => + array ( + 'from_number' => '9000', + 'id' => '639', + 'isbn_group_id' => '125', + 'registrant_from' => '0900', + 'registrant_length' => '4', + 'registrant_to' => '0999', + 'to_number' => '9999', + ), + 639 => + array ( + 'from_number' => '10000', + 'id' => '640', + 'isbn_group_id' => '125', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 640 => + array ( + 'from_number' => '70000', + 'id' => '641', + 'isbn_group_id' => '125', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '969', + 'to_number' => '96999', + ), + 641 => + array ( + 'from_number' => '97000', + 'id' => '642', + 'isbn_group_id' => '125', + 'registrant_from' => '9700', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 642 => + array ( + 'from_number' => '0', + 'id' => '643', + 'isbn_group_id' => '126', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 643 => + array ( + 'from_number' => '30000', + 'id' => '644', + 'isbn_group_id' => '126', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 644 => + array ( + 'from_number' => '55000', + 'id' => '645', + 'isbn_group_id' => '126', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '749', + 'to_number' => '74999', + ), + 645 => + array ( + 'from_number' => '75000', + 'id' => '646', + 'isbn_group_id' => '126', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9499', + 'to_number' => '94999', + ), + 646 => + array ( + 'from_number' => '95000', + 'id' => '647', + 'isbn_group_id' => '126', + 'registrant_from' => '95', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 647 => + array ( + 'from_number' => '0', + 'id' => '648', + 'isbn_group_id' => '127', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 648 => + array ( + 'from_number' => '10000', + 'id' => '649', + 'isbn_group_id' => '127', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 649 => + array ( + 'from_number' => '40000', + 'id' => '650', + 'isbn_group_id' => '127', + 'registrant_from' => '4000', + 'registrant_length' => '4', + 'registrant_to' => '4499', + 'to_number' => '44999', + ), + 650 => + array ( + 'from_number' => '45000', + 'id' => '651', + 'isbn_group_id' => '127', + 'registrant_from' => '45', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 651 => + array ( + 'from_number' => '90000', + 'id' => '652', + 'isbn_group_id' => '127', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 652 => + array ( + 'from_number' => '95000', + 'id' => '653', + 'isbn_group_id' => '127', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 653 => + array ( + 'from_number' => '0', + 'id' => '654', + 'isbn_group_id' => '128', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 654 => + array ( + 'from_number' => '60000', + 'id' => '655', + 'isbn_group_id' => '128', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 655 => + array ( + 'from_number' => '90000', + 'id' => '656', + 'isbn_group_id' => '128', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 656 => + array ( + 'from_number' => '99000', + 'id' => '657', + 'isbn_group_id' => '128', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 657 => + array ( + 'from_number' => '0', + 'id' => '658', + 'isbn_group_id' => '129', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 658 => + array ( + 'from_number' => '90000', + 'id' => '659', + 'isbn_group_id' => '129', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 659 => + array ( + 'from_number' => '99000', + 'id' => '660', + 'isbn_group_id' => '129', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 660 => + array ( + 'from_number' => '0', + 'id' => '661', + 'isbn_group_id' => '130', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '29', + 'to_number' => '29999', + ), + 661 => + array ( + 'from_number' => '30000', + 'id' => '662', + 'isbn_group_id' => '130', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 662 => + array ( + 'from_number' => '40000', + 'id' => '663', + 'isbn_group_id' => '130', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 663 => + array ( + 'from_number' => '95000', + 'id' => '664', + 'isbn_group_id' => '130', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 664 => + array ( + 'from_number' => '99000', + 'id' => '665', + 'isbn_group_id' => '130', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 665 => + array ( + 'from_number' => '0', + 'id' => '666', + 'isbn_group_id' => '131', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 666 => + array ( + 'from_number' => '50000', + 'id' => '667', + 'isbn_group_id' => '131', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '64', + 'to_number' => '64999', + ), + 667 => + array ( + 'from_number' => '65000', + 'id' => '668', + 'isbn_group_id' => '131', + 'registrant_from' => '650', + 'registrant_length' => '3', + 'registrant_to' => '659', + 'to_number' => '65999', + ), + 668 => + array ( + 'from_number' => '66000', + 'id' => '669', + 'isbn_group_id' => '131', + 'registrant_from' => '66', + 'registrant_length' => '2', + 'registrant_to' => '75', + 'to_number' => '75999', + ), + 669 => + array ( + 'from_number' => '76000', + 'id' => '670', + 'isbn_group_id' => '131', + 'registrant_from' => '760', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 670 => + array ( + 'from_number' => '90000', + 'id' => '671', + 'isbn_group_id' => '131', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 671 => + array ( + 'from_number' => '0', + 'id' => '672', + 'isbn_group_id' => '132', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 672 => + array ( + 'from_number' => '40000', + 'id' => '673', + 'isbn_group_id' => '132', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 673 => + array ( + 'from_number' => '90000', + 'id' => '674', + 'isbn_group_id' => '132', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 674 => + array ( + 'from_number' => '99000', + 'id' => '675', + 'isbn_group_id' => '132', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 675 => + array ( + 'from_number' => '0', + 'id' => '676', + 'isbn_group_id' => '133', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '09', + 'to_number' => '9999', + ), + 676 => + array ( + 'from_number' => '10000', + 'id' => '677', + 'isbn_group_id' => '133', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '159', + 'to_number' => '15999', + ), + 677 => + array ( + 'from_number' => '16000', + 'id' => '678', + 'isbn_group_id' => '133', + 'registrant_from' => '1600', + 'registrant_length' => '4', + 'registrant_to' => '1999', + 'to_number' => '19999', + ), + 678 => + array ( + 'from_number' => '20000', + 'id' => '679', + 'isbn_group_id' => '133', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 679 => + array ( + 'from_number' => '80000', + 'id' => '680', + 'isbn_group_id' => '133', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 680 => + array ( + 'from_number' => '95000', + 'id' => '681', + 'isbn_group_id' => '133', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 681 => + array ( + 'from_number' => '0', + 'id' => '682', + 'isbn_group_id' => '134', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 682 => + array ( + 'from_number' => '80000', + 'id' => '683', + 'isbn_group_id' => '134', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 683 => + array ( + 'from_number' => '99000', + 'id' => '684', + 'isbn_group_id' => '134', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 684 => + array ( + 'from_number' => '80000', + 'id' => '685', + 'isbn_group_id' => '135', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 685 => + array ( + 'from_number' => '95000', + 'id' => '686', + 'isbn_group_id' => '135', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '989', + 'to_number' => '98999', + ), + 686 => + array ( + 'from_number' => '99000', + 'id' => '687', + 'isbn_group_id' => '135', + 'registrant_from' => '9900', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 687 => + array ( + 'from_number' => '0', + 'id' => '688', + 'isbn_group_id' => '136', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 688 => + array ( + 'from_number' => '50000', + 'id' => '689', + 'isbn_group_id' => '136', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 689 => + array ( + 'from_number' => '90000', + 'id' => '690', + 'isbn_group_id' => '136', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 690 => + array ( + 'from_number' => '0', + 'id' => '691', + 'isbn_group_id' => '137', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 691 => + array ( + 'from_number' => '50000', + 'id' => '692', + 'isbn_group_id' => '137', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 692 => + array ( + 'from_number' => '80000', + 'id' => '693', + 'isbn_group_id' => '137', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 693 => + array ( + 'from_number' => '90000', + 'id' => '694', + 'isbn_group_id' => '137', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 694 => + array ( + 'from_number' => '0', + 'id' => '695', + 'isbn_group_id' => '138', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 695 => + array ( + 'from_number' => '40000', + 'id' => '696', + 'isbn_group_id' => '138', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 696 => + array ( + 'from_number' => '90000', + 'id' => '697', + 'isbn_group_id' => '138', + 'registrant_from' => '9000', + 'registrant_length' => '4', + 'registrant_to' => '9399', + 'to_number' => '93999', + ), + 697 => + array ( + 'from_number' => '94000', + 'id' => '698', + 'isbn_group_id' => '138', + 'registrant_from' => '940', + 'registrant_length' => '3', + 'registrant_to' => '969', + 'to_number' => '96999', + ), + 698 => + array ( + 'from_number' => '97000', + 'id' => '699', + 'isbn_group_id' => '138', + 'registrant_from' => '97', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 699 => + array ( + 'from_number' => '0', + 'id' => '700', + 'isbn_group_id' => '139', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '39', + 'to_number' => '39999', + ), + 700 => + array ( + 'from_number' => '40000', + 'id' => '701', + 'isbn_group_id' => '139', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '879', + 'to_number' => '87999', + ), + 701 => + array ( + 'from_number' => '88000', + 'id' => '702', + 'isbn_group_id' => '139', + 'registrant_from' => '8800', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 702 => + array ( + 'from_number' => '0', + 'id' => '703', + 'isbn_group_id' => '140', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 703 => + array ( + 'from_number' => '30000', + 'id' => '704', + 'isbn_group_id' => '140', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '54', + 'to_number' => '54999', + ), + 704 => + array ( + 'from_number' => '55000', + 'id' => '705', + 'isbn_group_id' => '140', + 'registrant_from' => '550', + 'registrant_length' => '3', + 'registrant_to' => '749', + 'to_number' => '74999', + ), + 705 => + array ( + 'from_number' => '75000', + 'id' => '706', + 'isbn_group_id' => '140', + 'registrant_from' => '7500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 706 => + array ( + 'from_number' => '0', + 'id' => '707', + 'isbn_group_id' => '141', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 707 => + array ( + 'from_number' => '10000', + 'id' => '708', + 'isbn_group_id' => '141', + 'registrant_from' => '100', + 'registrant_length' => '3', + 'registrant_to' => '199', + 'to_number' => '19999', + ), + 708 => + array ( + 'from_number' => '20000', + 'id' => '709', + 'isbn_group_id' => '141', + 'registrant_from' => '2000', + 'registrant_length' => '4', + 'registrant_to' => '2999', + 'to_number' => '29999', + ), + 709 => + array ( + 'from_number' => '30000', + 'id' => '710', + 'isbn_group_id' => '141', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 710 => + array ( + 'from_number' => '60000', + 'id' => '711', + 'isbn_group_id' => '141', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '949', + 'to_number' => '94999', + ), + 711 => + array ( + 'from_number' => '95000', + 'id' => '712', + 'isbn_group_id' => '141', + 'registrant_from' => '9500', + 'registrant_length' => '4', + 'registrant_to' => '9999', + 'to_number' => '99999', + ), + 712 => + array ( + 'from_number' => '0', + 'id' => '713', + 'isbn_group_id' => '142', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 713 => + array ( + 'from_number' => '50000', + 'id' => '714', + 'isbn_group_id' => '142', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 714 => + array ( + 'from_number' => '80000', + 'id' => '715', + 'isbn_group_id' => '142', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 715 => + array ( + 'from_number' => '0', + 'id' => '716', + 'isbn_group_id' => '144', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 716 => + array ( + 'from_number' => '20000', + 'id' => '717', + 'isbn_group_id' => '144', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 717 => + array ( + 'from_number' => '90000', + 'id' => '718', + 'isbn_group_id' => '144', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 718 => + array ( + 'from_number' => '0', + 'id' => '719', + 'isbn_group_id' => '145', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 719 => + array ( + 'from_number' => '60000', + 'id' => '720', + 'isbn_group_id' => '145', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 720 => + array ( + 'from_number' => '90000', + 'id' => '721', + 'isbn_group_id' => '145', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 721 => + array ( + 'from_number' => '0', + 'id' => '722', + 'isbn_group_id' => '146', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 722 => + array ( + 'from_number' => '40000', + 'id' => '723', + 'isbn_group_id' => '146', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 723 => + array ( + 'from_number' => '80000', + 'id' => '724', + 'isbn_group_id' => '146', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 724 => + array ( + 'from_number' => '0', + 'id' => '725', + 'isbn_group_id' => '147', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 725 => + array ( + 'from_number' => '30000', + 'id' => '726', + 'isbn_group_id' => '147', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 726 => + array ( + 'from_number' => '60000', + 'id' => '727', + 'isbn_group_id' => '147', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 727 => + array ( + 'from_number' => '70000', + 'id' => '728', + 'isbn_group_id' => '147', + 'registrant_from' => '70', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 728 => + array ( + 'from_number' => '90000', + 'id' => '729', + 'isbn_group_id' => '147', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 729 => + array ( + 'from_number' => '95000', + 'id' => '730', + 'isbn_group_id' => '147', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 730 => + array ( + 'from_number' => '0', + 'id' => '731', + 'isbn_group_id' => '148', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 731 => + array ( + 'from_number' => '10000', + 'id' => '732', + 'isbn_group_id' => '148', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 732 => + array ( + 'from_number' => '90000', + 'id' => '733', + 'isbn_group_id' => '148', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 733 => + array ( + 'from_number' => '0', + 'id' => '734', + 'isbn_group_id' => '149', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 734 => + array ( + 'from_number' => '40000', + 'id' => '735', + 'isbn_group_id' => '149', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 735 => + array ( + 'from_number' => '95000', + 'id' => '736', + 'isbn_group_id' => '149', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 736 => + array ( + 'from_number' => '0', + 'id' => '737', + 'isbn_group_id' => '150', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 737 => + array ( + 'from_number' => '30000', + 'id' => '738', + 'isbn_group_id' => '150', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 738 => + array ( + 'from_number' => '90000', + 'id' => '739', + 'isbn_group_id' => '150', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 739 => + array ( + 'from_number' => '0', + 'id' => '740', + 'isbn_group_id' => '151', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 740 => + array ( + 'from_number' => '60000', + 'id' => '741', + 'isbn_group_id' => '151', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 741 => + array ( + 'from_number' => '0', + 'id' => '742', + 'isbn_group_id' => '152', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 742 => + array ( + 'from_number' => '40000', + 'id' => '743', + 'isbn_group_id' => '152', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 743 => + array ( + 'from_number' => '60000', + 'id' => '744', + 'isbn_group_id' => '152', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 744 => + array ( + 'from_number' => '90000', + 'id' => '745', + 'isbn_group_id' => '152', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 745 => + array ( + 'from_number' => '0', + 'id' => '746', + 'isbn_group_id' => '153', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 746 => + array ( + 'from_number' => '30000', + 'id' => '747', + 'isbn_group_id' => '153', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '35', + 'to_number' => '35999', + ), + 747 => + array ( + 'from_number' => '60000', + 'id' => '748', + 'isbn_group_id' => '153', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '604', + 'to_number' => '60499', + ), + 748 => + array ( + 'from_number' => '0', + 'id' => '749', + 'isbn_group_id' => '154', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 749 => + array ( + 'from_number' => '50000', + 'id' => '750', + 'isbn_group_id' => '154', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 750 => + array ( + 'from_number' => '90000', + 'id' => '751', + 'isbn_group_id' => '154', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 751 => + array ( + 'from_number' => '0', + 'id' => '752', + 'isbn_group_id' => '155', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 752 => + array ( + 'from_number' => '50000', + 'id' => '753', + 'isbn_group_id' => '155', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 753 => + array ( + 'from_number' => '80000', + 'id' => '754', + 'isbn_group_id' => '155', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 754 => + array ( + 'from_number' => '0', + 'id' => '755', + 'isbn_group_id' => '156', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 755 => + array ( + 'from_number' => '30000', + 'id' => '756', + 'isbn_group_id' => '156', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 756 => + array ( + 'from_number' => '70000', + 'id' => '757', + 'isbn_group_id' => '156', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 757 => + array ( + 'from_number' => '0', + 'id' => '758', + 'isbn_group_id' => '157', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 758 => + array ( + 'from_number' => '30000', + 'id' => '759', + 'isbn_group_id' => '157', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 759 => + array ( + 'from_number' => '90000', + 'id' => '760', + 'isbn_group_id' => '157', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 760 => + array ( + 'from_number' => '0', + 'id' => '761', + 'isbn_group_id' => '158', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 761 => + array ( + 'from_number' => '40000', + 'id' => '762', + 'isbn_group_id' => '158', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 762 => + array ( + 'from_number' => '80000', + 'id' => '763', + 'isbn_group_id' => '158', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 763 => + array ( + 'from_number' => '0', + 'id' => '764', + 'isbn_group_id' => '159', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 764 => + array ( + 'from_number' => '30000', + 'id' => '765', + 'isbn_group_id' => '159', + 'registrant_from' => '300', + 'registrant_length' => '3', + 'registrant_to' => '399', + 'to_number' => '39999', + ), + 765 => + array ( + 'from_number' => '40000', + 'id' => '766', + 'isbn_group_id' => '159', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 766 => + array ( + 'from_number' => '90000', + 'id' => '767', + 'isbn_group_id' => '159', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 767 => + array ( + 'from_number' => '0', + 'id' => '768', + 'isbn_group_id' => '160', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 768 => + array ( + 'from_number' => '50000', + 'id' => '769', + 'isbn_group_id' => '160', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 769 => + array ( + 'from_number' => '90000', + 'id' => '770', + 'isbn_group_id' => '160', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 770 => + array ( + 'from_number' => '0', + 'id' => '771', + 'isbn_group_id' => '161', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 771 => + array ( + 'from_number' => '20000', + 'id' => '772', + 'isbn_group_id' => '161', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 772 => + array ( + 'from_number' => '70000', + 'id' => '773', + 'isbn_group_id' => '161', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 773 => + array ( + 'from_number' => '80000', + 'id' => '774', + 'isbn_group_id' => '161', + 'registrant_from' => '8', + 'registrant_length' => '1', + 'registrant_to' => '8', + 'to_number' => '89999', + ), + 774 => + array ( + 'from_number' => '90000', + 'id' => '775', + 'isbn_group_id' => '161', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 775 => + array ( + 'from_number' => '0', + 'id' => '776', + 'isbn_group_id' => '162', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 776 => + array ( + 'from_number' => '40000', + 'id' => '777', + 'isbn_group_id' => '162', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 777 => + array ( + 'from_number' => '70000', + 'id' => '778', + 'isbn_group_id' => '162', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 778 => + array ( + 'from_number' => '0', + 'id' => '779', + 'isbn_group_id' => '163', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 779 => + array ( + 'from_number' => '20000', + 'id' => '780', + 'isbn_group_id' => '163', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 780 => + array ( + 'from_number' => '80000', + 'id' => '781', + 'isbn_group_id' => '163', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 781 => + array ( + 'from_number' => '0', + 'id' => '782', + 'isbn_group_id' => '164', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 782 => + array ( + 'from_number' => '20000', + 'id' => '783', + 'isbn_group_id' => '164', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 783 => + array ( + 'from_number' => '80000', + 'id' => '784', + 'isbn_group_id' => '164', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 784 => + array ( + 'from_number' => '0', + 'id' => '785', + 'isbn_group_id' => '165', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 785 => + array ( + 'from_number' => '40000', + 'id' => '786', + 'isbn_group_id' => '165', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 786 => + array ( + 'from_number' => '80000', + 'id' => '787', + 'isbn_group_id' => '165', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 787 => + array ( + 'from_number' => '0', + 'id' => '788', + 'isbn_group_id' => '166', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 788 => + array ( + 'from_number' => '10000', + 'id' => '789', + 'isbn_group_id' => '166', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 789 => + array ( + 'from_number' => '60000', + 'id' => '790', + 'isbn_group_id' => '166', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 790 => + array ( + 'from_number' => '0', + 'id' => '791', + 'isbn_group_id' => '167', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 791 => + array ( + 'from_number' => '30000', + 'id' => '792', + 'isbn_group_id' => '167', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 792 => + array ( + 'from_number' => '60000', + 'id' => '793', + 'isbn_group_id' => '167', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 793 => + array ( + 'from_number' => '0', + 'id' => '794', + 'isbn_group_id' => '168', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 794 => + array ( + 'from_number' => '10000', + 'id' => '795', + 'isbn_group_id' => '168', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 795 => + array ( + 'from_number' => '80000', + 'id' => '796', + 'isbn_group_id' => '168', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 796 => + array ( + 'from_number' => '0', + 'id' => '797', + 'isbn_group_id' => '169', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 797 => + array ( + 'from_number' => '50000', + 'id' => '798', + 'isbn_group_id' => '169', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 798 => + array ( + 'from_number' => '80000', + 'id' => '799', + 'isbn_group_id' => '169', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 799 => + array ( + 'from_number' => '0', + 'id' => '800', + 'isbn_group_id' => '170', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 800 => + array ( + 'from_number' => '50000', + 'id' => '801', + 'isbn_group_id' => '170', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 801 => + array ( + 'from_number' => '80000', + 'id' => '802', + 'isbn_group_id' => '170', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 802 => + array ( + 'from_number' => '0', + 'id' => '803', + 'isbn_group_id' => '171', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 803 => + array ( + 'from_number' => '50000', + 'id' => '804', + 'isbn_group_id' => '171', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 804 => + array ( + 'from_number' => '80000', + 'id' => '805', + 'isbn_group_id' => '171', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 805 => + array ( + 'from_number' => '0', + 'id' => '806', + 'isbn_group_id' => '172', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 806 => + array ( + 'from_number' => '10000', + 'id' => '807', + 'isbn_group_id' => '172', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 807 => + array ( + 'from_number' => '60000', + 'id' => '808', + 'isbn_group_id' => '172', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 808 => + array ( + 'from_number' => '70000', + 'id' => '809', + 'isbn_group_id' => '172', + 'registrant_from' => '7', + 'registrant_length' => '1', + 'registrant_to' => '7', + 'to_number' => '79999', + ), + 809 => + array ( + 'from_number' => '80000', + 'id' => '810', + 'isbn_group_id' => '172', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 810 => + array ( + 'from_number' => '0', + 'id' => '811', + 'isbn_group_id' => '173', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 811 => + array ( + 'from_number' => '30000', + 'id' => '812', + 'isbn_group_id' => '173', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 812 => + array ( + 'from_number' => '60000', + 'id' => '813', + 'isbn_group_id' => '173', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 813 => + array ( + 'from_number' => '0', + 'id' => '814', + 'isbn_group_id' => '174', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 814 => + array ( + 'from_number' => '20000', + 'id' => '815', + 'isbn_group_id' => '174', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 815 => + array ( + 'from_number' => '80000', + 'id' => '816', + 'isbn_group_id' => '174', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 816 => + array ( + 'from_number' => '0', + 'id' => '817', + 'isbn_group_id' => '175', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 817 => + array ( + 'from_number' => '30000', + 'id' => '818', + 'isbn_group_id' => '175', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 818 => + array ( + 'from_number' => '60000', + 'id' => '819', + 'isbn_group_id' => '175', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 819 => + array ( + 'from_number' => '70000', + 'id' => '820', + 'isbn_group_id' => '175', + 'registrant_from' => '7', + 'registrant_length' => '1', + 'registrant_to' => '8', + 'to_number' => '89999', + ), + 820 => + array ( + 'from_number' => '90000', + 'id' => '821', + 'isbn_group_id' => '175', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 821 => + array ( + 'from_number' => '0', + 'id' => '822', + 'isbn_group_id' => '176', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 822 => + array ( + 'from_number' => '10000', + 'id' => '823', + 'isbn_group_id' => '176', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 823 => + array ( + 'from_number' => '60000', + 'id' => '824', + 'isbn_group_id' => '176', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 824 => + array ( + 'from_number' => '0', + 'id' => '825', + 'isbn_group_id' => '177', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 825 => + array ( + 'from_number' => '20000', + 'id' => '826', + 'isbn_group_id' => '177', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 826 => + array ( + 'from_number' => '60000', + 'id' => '827', + 'isbn_group_id' => '177', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 827 => + array ( + 'from_number' => '0', + 'id' => '828', + 'isbn_group_id' => '178', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 828 => + array ( + 'from_number' => '20000', + 'id' => '829', + 'isbn_group_id' => '178', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 829 => + array ( + 'from_number' => '60000', + 'id' => '830', + 'isbn_group_id' => '178', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 830 => + array ( + 'from_number' => '90000', + 'id' => '831', + 'isbn_group_id' => '178', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 831 => + array ( + 'from_number' => '0', + 'id' => '832', + 'isbn_group_id' => '179', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 832 => + array ( + 'from_number' => '60000', + 'id' => '833', + 'isbn_group_id' => '179', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 833 => + array ( + 'from_number' => '90000', + 'id' => '834', + 'isbn_group_id' => '179', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 834 => + array ( + 'from_number' => '0', + 'id' => '835', + 'isbn_group_id' => '180', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 835 => + array ( + 'from_number' => '10000', + 'id' => '836', + 'isbn_group_id' => '180', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 836 => + array ( + 'from_number' => '70000', + 'id' => '837', + 'isbn_group_id' => '180', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 837 => + array ( + 'from_number' => '0', + 'id' => '838', + 'isbn_group_id' => '181', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 838 => + array ( + 'from_number' => '30000', + 'id' => '839', + 'isbn_group_id' => '181', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 839 => + array ( + 'from_number' => '80000', + 'id' => '840', + 'isbn_group_id' => '181', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 840 => + array ( + 'from_number' => '0', + 'id' => '841', + 'isbn_group_id' => '182', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 841 => + array ( + 'from_number' => '50000', + 'id' => '842', + 'isbn_group_id' => '182', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 842 => + array ( + 'from_number' => '80000', + 'id' => '843', + 'isbn_group_id' => '182', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 843 => + array ( + 'from_number' => '0', + 'id' => '844', + 'isbn_group_id' => '183', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 844 => + array ( + 'from_number' => '30000', + 'id' => '845', + 'isbn_group_id' => '183', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 845 => + array ( + 'from_number' => '60000', + 'id' => '846', + 'isbn_group_id' => '183', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 846 => + array ( + 'from_number' => '0', + 'id' => '847', + 'isbn_group_id' => '184', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 847 => + array ( + 'from_number' => '50000', + 'id' => '848', + 'isbn_group_id' => '184', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 848 => + array ( + 'from_number' => '80000', + 'id' => '849', + 'isbn_group_id' => '184', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 849 => + array ( + 'from_number' => '0', + 'id' => '850', + 'isbn_group_id' => '185', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '5', + 'to_number' => '59999', + ), + 850 => + array ( + 'from_number' => '60000', + 'id' => '851', + 'isbn_group_id' => '185', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 851 => + array ( + 'from_number' => '90000', + 'id' => '852', + 'isbn_group_id' => '185', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 852 => + array ( + 'from_number' => '0', + 'id' => '853', + 'isbn_group_id' => '186', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 853 => + array ( + 'from_number' => '30000', + 'id' => '854', + 'isbn_group_id' => '186', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 854 => + array ( + 'from_number' => '60000', + 'id' => '855', + 'isbn_group_id' => '186', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 855 => + array ( + 'from_number' => '0', + 'id' => '856', + 'isbn_group_id' => '187', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 856 => + array ( + 'from_number' => '30000', + 'id' => '857', + 'isbn_group_id' => '187', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 857 => + array ( + 'from_number' => '70000', + 'id' => '858', + 'isbn_group_id' => '187', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 858 => + array ( + 'from_number' => '0', + 'id' => '859', + 'isbn_group_id' => '188', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 859 => + array ( + 'from_number' => '50000', + 'id' => '860', + 'isbn_group_id' => '188', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 860 => + array ( + 'from_number' => '80000', + 'id' => '861', + 'isbn_group_id' => '188', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 861 => + array ( + 'from_number' => '0', + 'id' => '862', + 'isbn_group_id' => '189', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 862 => + array ( + 'from_number' => '20000', + 'id' => '863', + 'isbn_group_id' => '189', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 863 => + array ( + 'from_number' => '90000', + 'id' => '864', + 'isbn_group_id' => '189', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 864 => + array ( + 'from_number' => '0', + 'id' => '865', + 'isbn_group_id' => '190', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 865 => + array ( + 'from_number' => '50000', + 'id' => '866', + 'isbn_group_id' => '190', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 866 => + array ( + 'from_number' => '80000', + 'id' => '867', + 'isbn_group_id' => '190', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 867 => + array ( + 'from_number' => '0', + 'id' => '868', + 'isbn_group_id' => '192', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 868 => + array ( + 'from_number' => '50000', + 'id' => '869', + 'isbn_group_id' => '192', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 869 => + array ( + 'from_number' => '80000', + 'id' => '870', + 'isbn_group_id' => '192', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 870 => + array ( + 'from_number' => '0', + 'id' => '871', + 'isbn_group_id' => '193', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 871 => + array ( + 'from_number' => '30000', + 'id' => '872', + 'isbn_group_id' => '193', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 872 => + array ( + 'from_number' => '80000', + 'id' => '873', + 'isbn_group_id' => '193', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '939', + 'to_number' => '93999', + ), + 873 => + array ( + 'from_number' => '94000', + 'id' => '874', + 'isbn_group_id' => '193', + 'registrant_from' => '94', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 874 => + array ( + 'from_number' => '0', + 'id' => '875', + 'isbn_group_id' => '194', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 875 => + array ( + 'from_number' => '30000', + 'id' => '876', + 'isbn_group_id' => '194', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 876 => + array ( + 'from_number' => '70000', + 'id' => '877', + 'isbn_group_id' => '194', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 877 => + array ( + 'from_number' => '0', + 'id' => '878', + 'isbn_group_id' => '195', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 878 => + array ( + 'from_number' => '20000', + 'id' => '879', + 'isbn_group_id' => '195', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 879 => + array ( + 'from_number' => '60000', + 'id' => '880', + 'isbn_group_id' => '195', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 880 => + array ( + 'from_number' => '80000', + 'id' => '881', + 'isbn_group_id' => '195', + 'registrant_from' => '80', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 881 => + array ( + 'from_number' => '90000', + 'id' => '882', + 'isbn_group_id' => '195', + 'registrant_from' => '90', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 882 => + array ( + 'from_number' => '0', + 'id' => '883', + 'isbn_group_id' => '196', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 883 => + array ( + 'from_number' => '60000', + 'id' => '884', + 'isbn_group_id' => '196', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '859', + 'to_number' => '85999', + ), + 884 => + array ( + 'from_number' => '86000', + 'id' => '885', + 'isbn_group_id' => '196', + 'registrant_from' => '86', + 'registrant_length' => '2', + 'registrant_to' => '99', + 'to_number' => '99999', + ), + 885 => + array ( + 'from_number' => '0', + 'id' => '886', + 'isbn_group_id' => '197', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 886 => + array ( + 'from_number' => '20000', + 'id' => '887', + 'isbn_group_id' => '197', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 887 => + array ( + 'from_number' => '80000', + 'id' => '888', + 'isbn_group_id' => '197', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 888 => + array ( + 'from_number' => '0', + 'id' => '889', + 'isbn_group_id' => '198', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 889 => + array ( + 'from_number' => '50000', + 'id' => '890', + 'isbn_group_id' => '198', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 890 => + array ( + 'from_number' => '95000', + 'id' => '891', + 'isbn_group_id' => '198', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 891 => + array ( + 'from_number' => '0', + 'id' => '892', + 'isbn_group_id' => '199', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 892 => + array ( + 'from_number' => '30000', + 'id' => '893', + 'isbn_group_id' => '199', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 893 => + array ( + 'from_number' => '60000', + 'id' => '894', + 'isbn_group_id' => '199', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 894 => + array ( + 'from_number' => '0', + 'id' => '895', + 'isbn_group_id' => '200', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '0', + 'to_number' => '9999', + ), + 895 => + array ( + 'from_number' => '10000', + 'id' => '896', + 'isbn_group_id' => '200', + 'registrant_from' => '10', + 'registrant_length' => '2', + 'registrant_to' => '94', + 'to_number' => '94999', + ), + 896 => + array ( + 'from_number' => '95000', + 'id' => '897', + 'isbn_group_id' => '200', + 'registrant_from' => '950', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 897 => + array ( + 'from_number' => '0', + 'id' => '898', + 'isbn_group_id' => '201', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 898 => + array ( + 'from_number' => '40000', + 'id' => '899', + 'isbn_group_id' => '201', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 899 => + array ( + 'from_number' => '90000', + 'id' => '900', + 'isbn_group_id' => '201', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 900 => + array ( + 'from_number' => '0', + 'id' => '901', + 'isbn_group_id' => '202', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '4', + 'to_number' => '49999', + ), + 901 => + array ( + 'from_number' => '50000', + 'id' => '902', + 'isbn_group_id' => '202', + 'registrant_from' => '50', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 902 => + array ( + 'from_number' => '80000', + 'id' => '903', + 'isbn_group_id' => '202', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 903 => + array ( + 'from_number' => '0', + 'id' => '904', + 'isbn_group_id' => '203', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '49', + 'to_number' => '49999', + ), + 904 => + array ( + 'from_number' => '50000', + 'id' => '905', + 'isbn_group_id' => '203', + 'registrant_from' => '500', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 905 => + array ( + 'from_number' => '0', + 'id' => '906', + 'isbn_group_id' => '204', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 906 => + array ( + 'from_number' => '20000', + 'id' => '907', + 'isbn_group_id' => '204', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 907 => + array ( + 'from_number' => '80000', + 'id' => '908', + 'isbn_group_id' => '204', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 908 => + array ( + 'from_number' => '0', + 'id' => '909', + 'isbn_group_id' => '205', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 909 => + array ( + 'from_number' => '40000', + 'id' => '910', + 'isbn_group_id' => '205', + 'registrant_from' => '40', + 'registrant_length' => '2', + 'registrant_to' => '79', + 'to_number' => '79999', + ), + 910 => + array ( + 'from_number' => '80000', + 'id' => '911', + 'isbn_group_id' => '205', + 'registrant_from' => '800', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 911 => + array ( + 'from_number' => '0', + 'id' => '912', + 'isbn_group_id' => '206', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '2', + 'to_number' => '29999', + ), + 912 => + array ( + 'from_number' => '30000', + 'id' => '913', + 'isbn_group_id' => '206', + 'registrant_from' => '30', + 'registrant_length' => '2', + 'registrant_to' => '69', + 'to_number' => '69999', + ), + 913 => + array ( + 'from_number' => '70000', + 'id' => '914', + 'isbn_group_id' => '206', + 'registrant_from' => '700', + 'registrant_length' => '3', + 'registrant_to' => '799', + 'to_number' => '79999', + ), + 914 => + array ( + 'from_number' => '0', + 'id' => '915', + 'isbn_group_id' => '207', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '1', + 'to_number' => '19999', + ), + 915 => + array ( + 'from_number' => '20000', + 'id' => '916', + 'isbn_group_id' => '207', + 'registrant_from' => '20', + 'registrant_length' => '2', + 'registrant_to' => '59', + 'to_number' => '59999', + ), + 916 => + array ( + 'from_number' => '60000', + 'id' => '917', + 'isbn_group_id' => '207', + 'registrant_from' => '600', + 'registrant_length' => '3', + 'registrant_to' => '899', + 'to_number' => '89999', + ), + 917 => + array ( + 'from_number' => '0', + 'id' => '918', + 'isbn_group_id' => '208', + 'registrant_from' => '0', + 'registrant_length' => '1', + 'registrant_to' => '3', + 'to_number' => '39999', + ), + 918 => + array ( + 'from_number' => '40000', + 'id' => '919', + 'isbn_group_id' => '208', + 'registrant_from' => '400', + 'registrant_length' => '3', + 'registrant_to' => '599', + 'to_number' => '59999', + ), + 919 => + array ( + 'from_number' => '60000', + 'id' => '920', + 'isbn_group_id' => '208', + 'registrant_from' => '60', + 'registrant_length' => '2', + 'registrant_to' => '89', + 'to_number' => '89999', + ), + 920 => + array ( + 'from_number' => '90000', + 'id' => '921', + 'isbn_group_id' => '208', + 'registrant_from' => '900', + 'registrant_length' => '3', + 'registrant_to' => '999', + 'to_number' => '99999', + ), + 921 => + array ( + 'from_number' => '0', + 'id' => '922', + 'isbn_group_id' => '209', + 'registrant_from' => '00', + 'registrant_length' => '2', + 'registrant_to' => '19', + 'to_number' => '19999', + ), + 922 => + array ( + 'from_number' => '20000', + 'id' => '923', + 'isbn_group_id' => '209', + 'registrant_from' => '200', + 'registrant_length' => '3', + 'registrant_to' => '699', + 'to_number' => '69999', + ), + 923 => + array ( + 'from_number' => '70000', + 'id' => '924', + 'isbn_group_id' => '209', + 'registrant_from' => '7000', + 'registrant_length' => '4', + 'registrant_to' => '8999', + 'to_number' => '89999', + ), + 924 => + array ( + 'from_number' => '90000', + 'id' => '925', + 'isbn_group_id' => '209', + 'registrant_from' => '90000', + 'registrant_length' => '5', + 'registrant_to' => '97599', + 'to_number' => '97599', + ), + 925 => + array ( + 'from_number' => '97600', + 'id' => '926', + 'isbn_group_id' => '209', + 'registrant_from' => '976000', + 'registrant_length' => '6', + 'registrant_to' => '999999', + 'to_number' => '99999', + ),*/ +), +'ezkeyword' => +array ( +), +'ezkeyword_attribute_link' => +array ( +), +'ezm_block' => +array ( +), +'ezm_pool' => +array ( +), +'ezmedia' => +array ( +), +'ezmessage' => +array ( +), +'ezmodule_run' => +array ( +), +'ezmultipricedata' => +array ( +), +'eznode_assignment' => +array ( + 0 => + array ( + 'contentobject_id' => '8', + 'contentobject_version' => '2', + 'from_node_id' => '0', + 'id' => '4', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 1 => + array ( + 'contentobject_id' => '42', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '5', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 2 => + array ( + 'contentobject_id' => '10', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '6', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '44', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 3 => + array ( + 'contentobject_id' => '4', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '7', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 4 => + array ( + 'contentobject_id' => '12', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '8', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 5 => + array ( + 'contentobject_id' => '13', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '9', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 6 => + array ( + 'contentobject_id' => '41', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '11', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 7 => + array ( + 'contentobject_id' => '11', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '12', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 8 => + array ( + 'contentobject_id' => '45', + 'contentobject_version' => '1', + 'from_node_id' => '-1', + 'id' => '16', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 9 => + array ( + 'contentobject_id' => '49', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '27', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 10 => + array ( + 'contentobject_id' => '50', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '28', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 11 => + array ( + 'contentobject_id' => '51', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '29', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '43', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '9', + 'sort_order' => '1', + ), + 12 => + array ( + 'contentobject_id' => '52', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '30', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '48', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 13 => + array ( + 'contentobject_id' => '56', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '34', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '1', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '2', + 'sort_order' => '0', + ), + 14 => + array ( + 'contentobject_id' => '14', + 'contentobject_version' => '3', + 'from_node_id' => '-1', + 'id' => '38', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '13', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 15 => + array ( + 'contentobject_id' => '54', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '39', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '58', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 16 => + array ( + 'contentobject_id' => '57', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '43', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '2', + 'parent_remote_id' => '07cdfd23373b17c6b337251c22b7ea57', + 'remote_id' => '0', + 'sort_field' => '8', + 'sort_order' => '1', + ), + 17 => + array ( + 'contentobject_id' => '14', + 'contentobject_version' => '4', + 'from_node_id' => '-1', + 'id' => '44', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '13', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 18 => + array ( + 'contentobject_id' => '58', + 'contentobject_version' => '1', + 'from_node_id' => '0', + 'id' => '45', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), + 19 => + array ( + 'contentobject_id' => '11', + 'contentobject_version' => '2', + 'from_node_id' => '-1', + 'id' => '46', + 'is_main' => '1', + 'op_code' => '2', + 'parent_node' => '5', + 'parent_remote_id' => '', + 'remote_id' => '0', + 'sort_field' => '1', + 'sort_order' => '1', + ), +), +'eznotificationcollection' => +array ( +), +'eznotificationcollection_item' => +array ( +), +'eznotificationevent' => +array ( +/* 0 => + array ( + 'data_int1' => '57', + 'data_int2' => '1', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '1', + 'status' => '0', + ), + 1 => + array ( + 'data_int1' => '14', + 'data_int2' => '4', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '2', + 'status' => '0', + ), + 2 => + array ( + 'data_int1' => '58', + 'data_int2' => '1', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '3', + 'status' => '0', + ), + 3 => + array ( + 'data_int1' => '11', + 'data_int2' => '2', + 'data_int3' => '0', + 'data_int4' => '0', + 'data_text1' => '', + 'data_text2' => '', + 'data_text3' => '', + 'data_text4' => '', + 'event_type_string' => 'ezpublish', + 'id' => '4', + 'status' => '0', + ),*/ +), +'ezoperation_memento' => +array ( +), +'ezorder' => +array ( +), +'ezorder_item' => +array ( +), +'ezorder_nr_incr' => +array ( +), +'ezorder_status' => +array ( +/* 0 => + array ( + 'id' => '1', + 'is_active' => '1', + 'name' => 'Pending', + 'status_id' => '1', + ), + 1 => + array ( + 'id' => '2', + 'is_active' => '1', + 'name' => 'Processing', + 'status_id' => '2', + ), + 2 => + array ( + 'id' => '3', + 'is_active' => '1', + 'name' => 'Delivered', + 'status_id' => '3', + ),*/ +), +'ezorder_status_history' => +array ( +), +'ezpackage' => +array ( +/* 0 => + array ( + 'id' => '1', + 'install_date' => '1301057838', + 'name' => 'plain_site_data', + 'version' => '1.0-1', + ), + 1 => + array ( + 'id' => '2', + 'install_date' => '1343141308', + 'name' => 'ezwt_extension', + 'version' => '1.6-0', + ), + 2 => + array ( + 'id' => '3', + 'install_date' => '1343141311', + 'name' => 'ezstarrating_extension', + 'version' => '1.5-0', + ), + 3 => + array ( + 'id' => '4', + 'install_date' => '1343141315', + 'name' => 'ezgmaplocation_extension', + 'version' => '1.5-0', + ), + 4 => + array ( + 'id' => '5', + 'install_date' => '1343141320', + 'name' => 'ezwebin_extension', + 'version' => '1.10-0', + ), + 5 => + array ( + 'id' => '6', + 'install_date' => '1343141325', + 'name' => 'ezflow_extension', + 'version' => '2.5-0', + ), + 6 => + array ( + 'id' => '7', + 'install_date' => '1343141327', + 'name' => 'ezflow_classes', + 'version' => '2.5-0', + ), + 7 => + array ( + 'id' => '8', + 'install_date' => '1343141329', + 'name' => 'ezflow_democontent_clean', + 'version' => '2.5-0', + ),*/ +), +'ezpaymentobject' => +array ( +), +'ezpdf_export' => +array ( +), +'ezpending_actions' => +array ( +), +'ezpolicy' => +array ( + 0 => + array ( + 'function_name' => '*', + 'id' => '308', + 'module_name' => '*', + 'original_id' => '0', + 'role_id' => '2', + ), + 1 => + array ( + 'function_name' => 'login', + 'id' => '319', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '3', + ), + 2 => + array ( + 'function_name' => 'read', + 'id' => '328', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 3 => + array ( + 'function_name' => 'pdf', + 'id' => '329', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 4 => + array ( + 'function_name' => '*', + 'id' => '330', + 'module_name' => 'ezoe', + 'original_id' => '0', + 'role_id' => '3', + ), + 5 => + array ( + 'function_name' => '*', + 'id' => '332', + 'module_name' => 'ezoe', + 'original_id' => '0', + 'role_id' => '3', + ), + 6 => + array ( + 'function_name' => 'feed', + 'id' => '333', + 'module_name' => 'rss', + 'original_id' => '0', + 'role_id' => '1', + ), + 7 => + array ( + 'function_name' => 'login', + 'id' => '334', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 8 => + array ( + 'function_name' => 'login', + 'id' => '335', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 9 => + array ( + 'function_name' => 'login', + 'id' => '336', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 10 => + array ( + 'function_name' => 'login', + 'id' => '337', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 11 => + array ( + 'function_name' => 'login', + 'id' => '338', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '1', + ), + 12 => + array ( + 'function_name' => 'read', + 'id' => '339', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '1', + ), + 13 => + array ( + 'function_name' => 'create', + 'id' => '340', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 14 => + array ( + 'function_name' => 'create', + 'id' => '341', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 15 => + array ( + 'function_name' => 'create', + 'id' => '342', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 16 => + array ( + 'function_name' => 'create', + 'id' => '343', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 17 => + array ( + 'function_name' => 'create', + 'id' => '344', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 18 => + array ( + 'function_name' => 'create', + 'id' => '345', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 19 => + array ( + 'function_name' => 'use', + 'id' => '346', + 'module_name' => 'websitetoolbar', + 'original_id' => '0', + 'role_id' => '3', + ), + 20 => + array ( + 'function_name' => 'edit', + 'id' => '347', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 21 => + array ( + 'function_name' => 'read', + 'id' => '348', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 22 => + array ( + 'function_name' => 'use', + 'id' => '349', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '3', + ), + 23 => + array ( + 'function_name' => 'manage_locations', + 'id' => '350', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 24 => + array ( + 'function_name' => '*', + 'id' => '351', + 'module_name' => 'ezodf', + 'original_id' => '0', + 'role_id' => '3', + ), + 25 => + array ( + 'function_name' => '*', + 'id' => '352', + 'module_name' => 'ezflow', + 'original_id' => '0', + 'role_id' => '3', + ), + 26 => + array ( + 'function_name' => '*', + 'id' => '353', + 'module_name' => 'ezajax', + 'original_id' => '0', + 'role_id' => '3', + ), + 27 => + array ( + 'function_name' => 'diff', + 'id' => '354', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 28 => + array ( + 'function_name' => 'versionread', + 'id' => '355', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 29 => + array ( + 'function_name' => 'versionremove', + 'id' => '356', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 30 => + array ( + 'function_name' => 'remove', + 'id' => '357', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 31 => + array ( + 'function_name' => 'translate', + 'id' => '358', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 32 => + array ( + 'function_name' => 'feed', + 'id' => '359', + 'module_name' => 'rss', + 'original_id' => '0', + 'role_id' => '3', + ), + 33 => + array ( + 'function_name' => 'bookmark', + 'id' => '360', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 34 => + array ( + 'function_name' => 'pendinglist', + 'id' => '361', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 35 => + array ( + 'function_name' => 'dashboard', + 'id' => '362', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 36 => + array ( + 'function_name' => 'view_embed', + 'id' => '363', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '3', + ), + 37 => + array ( + 'function_name' => 'read', + 'id' => '364', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 38 => + array ( + 'function_name' => 'create', + 'id' => '365', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 39 => + array ( + 'function_name' => 'create', + 'id' => '366', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 40 => + array ( + 'function_name' => 'create', + 'id' => '367', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 41 => + array ( + 'function_name' => 'edit', + 'id' => '368', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '4', + ), + 42 => + array ( + 'function_name' => 'selfedit', + 'id' => '369', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '4', + ), + 43 => + array ( + 'function_name' => 'use', + 'id' => '370', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '4', + ), + 44 => + array ( + 'function_name' => 'create', + 'id' => '371', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 45 => + array ( + 'function_name' => 'create', + 'id' => '372', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 46 => + array ( + 'function_name' => 'create', + 'id' => '373', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 47 => + array ( + 'function_name' => 'edit', + 'id' => '374', + 'module_name' => 'content', + 'original_id' => '0', + 'role_id' => '5', + ), + 48 => + array ( + 'function_name' => 'selfedit', + 'id' => '375', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '5', + ), + 49 => + array ( + 'function_name' => 'use', + 'id' => '376', + 'module_name' => 'notification', + 'original_id' => '0', + 'role_id' => '5', + ), + 50 => + array ( + 'function_name' => 'password', + 'id' => '377', + 'module_name' => 'user', + 'original_id' => '0', + 'role_id' => '5', + ), + 51 => + array ( + 'function_name' => 'call', + 'id' => '378', + 'module_name' => 'ezjscore', + 'original_id' => '0', + 'role_id' => '5', + ), +), +'ezpolicy_limitation' => +array ( + 0 => + array ( + 'id' => '251', + 'identifier' => 'Section', + 'policy_id' => '328', + ), + 1 => + array ( + 'id' => '252', + 'identifier' => 'Section', + 'policy_id' => '329', + ), + 2 => + array ( + 'id' => '254', + 'identifier' => 'SiteAccess', + 'policy_id' => '334', + ), + 3 => + array ( + 'id' => '255', + 'identifier' => 'SiteAccess', + 'policy_id' => '335', + ), + 4 => + array ( + 'id' => '256', + 'identifier' => 'SiteAccess', + 'policy_id' => '336', + ), + 5 => + array ( + 'id' => '257', + 'identifier' => 'SiteAccess', + 'policy_id' => '337', + ), + 6 => + array ( + 'id' => '258', + 'identifier' => 'SiteAccess', + 'policy_id' => '338', + ), + 7 => + array ( + 'id' => '259', + 'identifier' => 'Class', + 'policy_id' => '339', + ), + 8 => + array ( + 'id' => '260', + 'identifier' => 'Section', + 'policy_id' => '339', + ), + 9 => + array ( + 'id' => '261', + 'identifier' => 'Class', + 'policy_id' => '340', + ), + 10 => + array ( + 'id' => '262', + 'identifier' => 'ParentClass', + 'policy_id' => '340', + ), + 11 => + array ( + 'id' => '263', + 'identifier' => 'Class', + 'policy_id' => '341', + ), + 12 => + array ( + 'id' => '264', + 'identifier' => 'ParentClass', + 'policy_id' => '341', + ), + 13 => + array ( + 'id' => '265', + 'identifier' => 'Class', + 'policy_id' => '342', + ), + 14 => + array ( + 'id' => '266', + 'identifier' => 'ParentClass', + 'policy_id' => '342', + ), + 15 => + array ( + 'id' => '267', + 'identifier' => 'Class', + 'policy_id' => '343', + ), + 16 => + array ( + 'id' => '268', + 'identifier' => 'ParentClass', + 'policy_id' => '343', + ), + 17 => + array ( + 'id' => '269', + 'identifier' => 'Class', + 'policy_id' => '344', + ), + 18 => + array ( + 'id' => '270', + 'identifier' => 'ParentClass', + 'policy_id' => '344', + ), + 19 => + array ( + 'id' => '271', + 'identifier' => 'Class', + 'policy_id' => '345', + ), + 20 => + array ( + 'id' => '272', + 'identifier' => 'ParentClass', + 'policy_id' => '345', + ), + 21 => + array ( + 'id' => '273', + 'identifier' => 'Class', + 'policy_id' => '346', + ), + 22 => + array ( + 'id' => '274', + 'identifier' => 'Section', + 'policy_id' => '348', + ), + 23 => + array ( + 'id' => '275', + 'identifier' => 'Section', + 'policy_id' => '364', + ), + 24 => + array ( + 'id' => '276', + 'identifier' => 'Class', + 'policy_id' => '365', + ), + 25 => + array ( + 'id' => '277', + 'identifier' => 'Section', + 'policy_id' => '365', + ), + 26 => + array ( + 'id' => '278', + 'identifier' => 'ParentClass', + 'policy_id' => '365', + ), + 27 => + array ( + 'id' => '279', + 'identifier' => 'Class', + 'policy_id' => '366', + ), + 28 => + array ( + 'id' => '280', + 'identifier' => 'Section', + 'policy_id' => '366', + ), + 29 => + array ( + 'id' => '281', + 'identifier' => 'ParentClass', + 'policy_id' => '366', + ), + 30 => + array ( + 'id' => '282', + 'identifier' => 'Class', + 'policy_id' => '367', + ), + 31 => + array ( + 'id' => '283', + 'identifier' => 'Section', + 'policy_id' => '367', + ), + 32 => + array ( + 'id' => '284', + 'identifier' => 'ParentClass', + 'policy_id' => '367', + ), + 33 => + array ( + 'id' => '285', + 'identifier' => 'Class', + 'policy_id' => '368', + ), + 34 => + array ( + 'id' => '286', + 'identifier' => 'Section', + 'policy_id' => '368', + ), + 35 => + array ( + 'id' => '287', + 'identifier' => 'Owner', + 'policy_id' => '368', + ), + 36 => + array ( + 'id' => '288', + 'identifier' => 'Class', + 'policy_id' => '371', + ), + 37 => + array ( + 'id' => '289', + 'identifier' => 'Section', + 'policy_id' => '371', + ), + 38 => + array ( + 'id' => '290', + 'identifier' => 'ParentClass', + 'policy_id' => '371', + ), + 39 => + array ( + 'id' => '291', + 'identifier' => 'Class', + 'policy_id' => '372', + ), + 40 => + array ( + 'id' => '292', + 'identifier' => 'Section', + 'policy_id' => '372', + ), + 41 => + array ( + 'id' => '293', + 'identifier' => 'ParentClass', + 'policy_id' => '372', + ), + 42 => + array ( + 'id' => '294', + 'identifier' => 'Class', + 'policy_id' => '373', + ), + 43 => + array ( + 'id' => '295', + 'identifier' => 'Section', + 'policy_id' => '373', + ), + 44 => + array ( + 'id' => '296', + 'identifier' => 'ParentClass', + 'policy_id' => '373', + ), + 45 => + array ( + 'id' => '297', + 'identifier' => 'Class', + 'policy_id' => '374', + ), + 46 => + array ( + 'id' => '298', + 'identifier' => 'Section', + 'policy_id' => '374', + ), + 47 => + array ( + 'id' => '299', + 'identifier' => 'Owner', + 'policy_id' => '374', + ), +), +'ezpolicy_limitation_value' => +array ( + 0 => + array ( + 'id' => '477', + 'limitation_id' => '251', + 'value' => '1', + ), + 1 => + array ( + 'id' => '478', + 'limitation_id' => '252', + 'value' => '1', + ), + 2 => + array ( + 'id' => '480', + 'limitation_id' => '254', + 'value' => '3890911191', + ), + 3 => + array ( + 'id' => '481', + 'limitation_id' => '255', + 'value' => '2582995467', + ), + 4 => + array ( + 'id' => '482', + 'limitation_id' => '256', + 'value' => '341347141', + ), + 5 => + array ( + 'id' => '483', + 'limitation_id' => '257', + 'value' => '2582995467', + ), + 6 => + array ( + 'id' => '484', + 'limitation_id' => '258', + 'value' => '475308017', + ), + 7 => + array ( + 'id' => '485', + 'limitation_id' => '259', + 'value' => '33', + ), + 8 => + array ( + 'id' => '486', + 'limitation_id' => '259', + 'value' => '45', + ), + 9 => + array ( + 'id' => '487', + 'limitation_id' => '259', + 'value' => '29', + ), + 10 => + array ( + 'id' => '488', + 'limitation_id' => '259', + 'value' => '37', + ), + 11 => + array ( + 'id' => '489', + 'limitation_id' => '259', + 'value' => '36', + ), + 12 => + array ( + 'id' => '490', + 'limitation_id' => '259', + 'value' => '35', + ), + 13 => + array ( + 'id' => '491', + 'limitation_id' => '260', + 'value' => '3', + ), + 14 => + array ( + 'id' => '492', + 'limitation_id' => '261', + 'value' => '1', + ), + 15 => + array ( + 'id' => '493', + 'limitation_id' => '261', + 'value' => '34', + ), + 16 => + array ( + 'id' => '494', + 'limitation_id' => '261', + 'value' => '28', + ), + 17 => + array ( + 'id' => '495', + 'limitation_id' => '261', + 'value' => '21', + ), + 18 => + array ( + 'id' => '496', + 'limitation_id' => '261', + 'value' => '22', + ), + 19 => + array ( + 'id' => '497', + 'limitation_id' => '261', + 'value' => '23', + ), + 20 => + array ( + 'id' => '498', + 'limitation_id' => '261', + 'value' => '16', + ), + 21 => + array ( + 'id' => '499', + 'limitation_id' => '261', + 'value' => '17', + ), + 22 => + array ( + 'id' => '500', + 'limitation_id' => '261', + 'value' => '18', + ), + 23 => + array ( + 'id' => '501', + 'limitation_id' => '261', + 'value' => '19', + ), + 24 => + array ( + 'id' => '502', + 'limitation_id' => '261', + 'value' => '27', + ), + 25 => + array ( + 'id' => '503', + 'limitation_id' => '261', + 'value' => '26', + ), + 26 => + array ( + 'id' => '504', + 'limitation_id' => '261', + 'value' => '24', + ), + 27 => + array ( + 'id' => '505', + 'limitation_id' => '261', + 'value' => '25', + ), + 28 => + array ( + 'id' => '506', + 'limitation_id' => '261', + 'value' => '29', + ), + 29 => + array ( + 'id' => '507', + 'limitation_id' => '261', + 'value' => '35', + ), + 30 => + array ( + 'id' => '508', + 'limitation_id' => '261', + 'value' => '36', + ), + 31 => + array ( + 'id' => '509', + 'limitation_id' => '261', + 'value' => '37', + ), + 32 => + array ( + 'id' => '510', + 'limitation_id' => '261', + 'value' => '38', + ), + 33 => + array ( + 'id' => '511', + 'limitation_id' => '261', + 'value' => '40', + ), + 34 => + array ( + 'id' => '512', + 'limitation_id' => '261', + 'value' => '46', + ), + 35 => + array ( + 'id' => '513', + 'limitation_id' => '261', + 'value' => '44', + ), + 36 => + array ( + 'id' => '514', + 'limitation_id' => '261', + 'value' => '45', + ), + 37 => + array ( + 'id' => '515', + 'limitation_id' => '261', + 'value' => '33', + ), + 38 => + array ( + 'id' => '516', + 'limitation_id' => '262', + 'value' => '1', + ), + 39 => + array ( + 'id' => '517', + 'limitation_id' => '263', + 'value' => '20', + ), + 40 => + array ( + 'id' => '518', + 'limitation_id' => '264', + 'value' => '19', + ), + 41 => + array ( + 'id' => '519', + 'limitation_id' => '265', + 'value' => '41', + ), + 42 => + array ( + 'id' => '520', + 'limitation_id' => '266', + 'value' => '40', + ), + 43 => + array ( + 'id' => '521', + 'limitation_id' => '267', + 'value' => '43', + ), + 44 => + array ( + 'id' => '522', + 'limitation_id' => '268', + 'value' => '44', + ), + 45 => + array ( + 'id' => '523', + 'limitation_id' => '269', + 'value' => '33', + ), + 46 => + array ( + 'id' => '524', + 'limitation_id' => '270', + 'value' => '38', + ), + 47 => + array ( + 'id' => '525', + 'limitation_id' => '271', + 'value' => '1', + ), + 48 => + array ( + 'id' => '526', + 'limitation_id' => '271', + 'value' => '34', + ), + 49 => + array ( + 'id' => '527', + 'limitation_id' => '271', + 'value' => '22', + ), + 50 => + array ( + 'id' => '528', + 'limitation_id' => '271', + 'value' => '23', + ), + 51 => + array ( + 'id' => '529', + 'limitation_id' => '271', + 'value' => '24', + ), + 52 => + array ( + 'id' => '530', + 'limitation_id' => '271', + 'value' => '38', + ), + 53 => + array ( + 'id' => '531', + 'limitation_id' => '271', + 'value' => '44', + ), + 54 => + array ( + 'id' => '532', + 'limitation_id' => '271', + 'value' => '26', + ), + 55 => + array ( + 'id' => '533', + 'limitation_id' => '271', + 'value' => '46', + ), + 56 => + array ( + 'id' => '534', + 'limitation_id' => '272', + 'value' => '23', + ), + 57 => + array ( + 'id' => '535', + 'limitation_id' => '273', + 'value' => '1', + ), + 58 => + array ( + 'id' => '536', + 'limitation_id' => '273', + 'value' => '34', + ), + 59 => + array ( + 'id' => '537', + 'limitation_id' => '273', + 'value' => '16', + ), + 60 => + array ( + 'id' => '538', + 'limitation_id' => '273', + 'value' => '17', + ), + 61 => + array ( + 'id' => '539', + 'limitation_id' => '273', + 'value' => '18', + ), + 62 => + array ( + 'id' => '540', + 'limitation_id' => '273', + 'value' => '19', + ), + 63 => + array ( + 'id' => '541', + 'limitation_id' => '273', + 'value' => '20', + ), + 64 => + array ( + 'id' => '542', + 'limitation_id' => '273', + 'value' => '21', + ), + 65 => + array ( + 'id' => '543', + 'limitation_id' => '273', + 'value' => '22', + ), + 66 => + array ( + 'id' => '544', + 'limitation_id' => '273', + 'value' => '23', + ), + 67 => + array ( + 'id' => '545', + 'limitation_id' => '273', + 'value' => '24', + ), + 68 => + array ( + 'id' => '546', + 'limitation_id' => '273', + 'value' => '26', + ), + 69 => + array ( + 'id' => '547', + 'limitation_id' => '273', + 'value' => '27', + ), + 70 => + array ( + 'id' => '548', + 'limitation_id' => '273', + 'value' => '28', + ), + 71 => + array ( + 'id' => '549', + 'limitation_id' => '273', + 'value' => '29', + ), + 72 => + array ( + 'id' => '550', + 'limitation_id' => '273', + 'value' => '33', + ), + 73 => + array ( + 'id' => '551', + 'limitation_id' => '273', + 'value' => '35', + ), + 74 => + array ( + 'id' => '552', + 'limitation_id' => '273', + 'value' => '36', + ), + 75 => + array ( + 'id' => '553', + 'limitation_id' => '273', + 'value' => '37', + ), + 76 => + array ( + 'id' => '554', + 'limitation_id' => '273', + 'value' => '38', + ), + 77 => + array ( + 'id' => '555', + 'limitation_id' => '273', + 'value' => '40', + ), + 78 => + array ( + 'id' => '556', + 'limitation_id' => '273', + 'value' => '43', + ), + 79 => + array ( + 'id' => '557', + 'limitation_id' => '273', + 'value' => '44', + ), + 80 => + array ( + 'id' => '558', + 'limitation_id' => '273', + 'value' => '46', + ), + 81 => + array ( + 'id' => '559', + 'limitation_id' => '274', + 'value' => '1', + ), + 82 => + array ( + 'id' => '560', + 'limitation_id' => '274', + 'value' => '6', + ), + 83 => + array ( + 'id' => '561', + 'limitation_id' => '274', + 'value' => '3', + ), + 84 => + array ( + 'id' => '562', + 'limitation_id' => '275', + 'value' => '6', + ), + 85 => + array ( + 'id' => '563', + 'limitation_id' => '276', + 'value' => '41', + ), + 86 => + array ( + 'id' => '564', + 'limitation_id' => '277', + 'value' => '6', + ), + 87 => + array ( + 'id' => '565', + 'limitation_id' => '278', + 'value' => '40', + ), + 88 => + array ( + 'id' => '566', + 'limitation_id' => '279', + 'value' => '42', + ), + 89 => + array ( + 'id' => '567', + 'limitation_id' => '280', + 'value' => '6', + ), + 90 => + array ( + 'id' => '568', + 'limitation_id' => '281', + 'value' => '41', + ), + 91 => + array ( + 'id' => '569', + 'limitation_id' => '282', + 'value' => '13', + ), + 92 => + array ( + 'id' => '570', + 'limitation_id' => '283', + 'value' => '6', + ), + 93 => + array ( + 'id' => '571', + 'limitation_id' => '284', + 'value' => '16', + ), + 94 => + array ( + 'id' => '572', + 'limitation_id' => '285', + 'value' => '13', + ), + 95 => + array ( + 'id' => '573', + 'limitation_id' => '285', + 'value' => '41', + ), + 96 => + array ( + 'id' => '574', + 'limitation_id' => '285', + 'value' => '42', + ), + 97 => + array ( + 'id' => '575', + 'limitation_id' => '286', + 'value' => '6', + ), + 98 => + array ( + 'id' => '576', + 'limitation_id' => '287', + 'value' => '1', + ), + 99 => + array ( + 'id' => '577', + 'limitation_id' => '288', + 'value' => '41', + ), + 100 => + array ( + 'id' => '578', + 'limitation_id' => '289', + 'value' => '1', + ), + 101 => + array ( + 'id' => '579', + 'limitation_id' => '290', + 'value' => '40', + ), + 102 => + array ( + 'id' => '580', + 'limitation_id' => '291', + 'value' => '42', + ), + 103 => + array ( + 'id' => '581', + 'limitation_id' => '292', + 'value' => '1', + ), + 104 => + array ( + 'id' => '582', + 'limitation_id' => '293', + 'value' => '41', + ), + 105 => + array ( + 'id' => '583', + 'limitation_id' => '294', + 'value' => '13', + ), + 106 => + array ( + 'id' => '584', + 'limitation_id' => '295', + 'value' => '1', + ), + 107 => + array ( + 'id' => '585', + 'limitation_id' => '296', + 'value' => '16', + ), + 108 => + array ( + 'id' => '586', + 'limitation_id' => '296', + 'value' => '20', + ), + 109 => + array ( + 'id' => '587', + 'limitation_id' => '296', + 'value' => '17', + ), + 110 => + array ( + 'id' => '588', + 'limitation_id' => '297', + 'value' => '13', + ), + 111 => + array ( + 'id' => '589', + 'limitation_id' => '297', + 'value' => '41', + ), + 112 => + array ( + 'id' => '590', + 'limitation_id' => '297', + 'value' => '42', + ), + 113 => + array ( + 'id' => '591', + 'limitation_id' => '298', + 'value' => '1', + ), + 114 => + array ( + 'id' => '592', + 'limitation_id' => '299', + 'value' => '1', + ), +), +'ezpreferences' => +array ( +/* 0 => + array ( + 'id' => '1', + 'name' => 'admin_navigation_content', + 'user_id' => '14', + 'value' => '1', + ), + 1 => + array ( + 'id' => '2', + 'name' => 'admin_navigation_roles', + 'user_id' => '14', + 'value' => '1', + ), + 2 => + array ( + 'id' => '3', + 'name' => 'admin_navigation_policies', + 'user_id' => '14', + 'value' => '1', + ), + 3 => + array ( + 'id' => '4', + 'name' => 'admin_list_limit', + 'user_id' => '14', + 'value' => '2', + ), + 4 => + array ( + 'id' => '5', + 'name' => 'admin_treemenu', + 'user_id' => '14', + 'value' => '1', + ), + 5 => + array ( + 'id' => '6', + 'name' => 'admin_bookmark_menu', + 'user_id' => '14', + 'value' => '1', + ),*/ +), +'ezprest_authcode' => +array ( +), +'ezprest_authorized_clients' => +array ( +), +'ezprest_clients' => +array ( +), +'ezprest_token' => +array ( +), +'ezproductcategory' => +array ( +), +'ezproductcollection' => +array ( +), +'ezproductcollection_item' => +array ( +), +'ezproductcollection_item_opt' => +array ( +), +'ezpublishingqueueprocesses' => +array ( +), +'ezrole' => +array ( + 0 => + array ( + 'id' => '1', + 'is_new' => '0', + 'name' => 'Anonymous', + 'value' => ' ', + 'version' => '0', + ), + 1 => + array ( + 'id' => '2', + 'is_new' => '0', + 'name' => 'Administrator', + 'value' => '*', + 'version' => '0', + ), + 2 => + array ( + 'id' => '3', + 'is_new' => '0', + 'name' => 'Editor', + 'value' => ' ', + 'version' => '0', + ), + 3 => + array ( + 'id' => '4', + 'is_new' => '0', + 'name' => 'Partner', + 'value' => NULL, + 'version' => '0', + ), + 4 => + array ( + 'id' => '5', + 'is_new' => '0', + 'name' => 'Member', + 'value' => NULL, + 'version' => '0', + ), +), +'ezrss_export' => +array ( +/* 0 => + array ( + 'access_url' => 'my_feed', + 'active' => '1', + 'created' => '1343141332', + 'creator_id' => '14', + 'description' => '', + 'id' => '1', + 'image_id' => '0', + 'main_node_only' => '1', + 'modified' => '1343141332', + 'modifier_id' => '14', + 'node_id' => '0', + 'number_of_objects' => '10', + 'rss_version' => '2.0', + 'site_access' => '', + 'status' => '1', + 'title' => 'My RSS Feed', + 'url' => 'http://example.com', + ),*/ +), +'ezrss_export_item' => +array ( +/* 0 => + array ( + 'category' => '', + 'class_id' => '16', + 'description' => 'intro', + 'enclosure' => '', + 'id' => '1', + 'rssexport_id' => '1', + 'source_node_id' => '139', + 'status' => '1', + 'subnodes' => '0', + 'title' => 'title', + ),*/ +), +'ezrss_import' => +array ( +), +'ezscheduled_script' => +array ( +), +'ezsearch_object_word_link' => +array ( + 0 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4663', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '951', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '930', + ), + 1 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4664', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '1', + 'prev_word_id' => '930', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '951', + ), + 2 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '4', + 'frequency' => '0', + 'id' => '4665', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '951', + 'published' => '1033917596', + 'section_id' => '2', + 'word_id' => '952', + ), + 3 => + array ( + 'contentclass_attribute_id' => '8', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4666', + 'identifier' => 'first_name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '953', + ), + 4 => + array ( + 'contentclass_attribute_id' => '9', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4667', + 'identifier' => 'last_name', + 'integer_value' => '0', + 'next_word_id' => '953', + 'placement' => '1', + 'prev_word_id' => '953', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '954', + ), + 5 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4668', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '955', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '953', + ), + 6 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4669', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '3', + 'prev_word_id' => '953', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '955', + ), + 7 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '10', + 'frequency' => '0', + 'id' => '4670', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '955', + 'published' => '1033920665', + 'section_id' => '2', + 'word_id' => '927', + ), + 8 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '12', + 'frequency' => '0', + 'id' => '4673', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920775', + 'section_id' => '2', + 'word_id' => '958', + ), + 9 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '12', + 'frequency' => '0', + 'id' => '4674', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '1', + 'prev_word_id' => '958', + 'published' => '1033920775', + 'section_id' => '2', + 'word_id' => '930', + ), + 10 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '13', + 'frequency' => '0', + 'id' => '4675', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920794', + 'section_id' => '2', + 'word_id' => '959', + ), + 11 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '41', + 'frequency' => '0', + 'id' => '4681', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1060695457', + 'section_id' => '3', + 'word_id' => '961', + ), + 12 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4682', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '930', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '953', + ), + 13 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4683', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '1', + 'prev_word_id' => '953', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '930', + ), + 14 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4684', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '952', + 'placement' => '2', + 'prev_word_id' => '930', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '954', + ), + 15 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4685', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '816', + 'placement' => '3', + 'prev_word_id' => '954', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '952', + ), + 16 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4686', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '814', + 'placement' => '4', + 'prev_word_id' => '952', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '816', + ), + 17 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4687', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '953', + 'placement' => '5', + 'prev_word_id' => '816', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '814', + ), + 18 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4688', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '6', + 'prev_word_id' => '814', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '953', + ), + 19 => + array ( + 'contentclass_attribute_id' => '7', + 'contentclass_id' => '3', + 'contentobject_id' => '42', + 'frequency' => '0', + 'id' => '4689', + 'identifier' => 'description', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '7', + 'prev_word_id' => '953', + 'published' => '1072180330', + 'section_id' => '2', + 'word_id' => '954', + ), + 20 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '45', + 'frequency' => '0', + 'id' => '4690', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1079684190', + 'section_id' => '4', + 'word_id' => '812', + ), + 21 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '49', + 'frequency' => '0', + 'id' => '4691', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220197', + 'section_id' => '3', + 'word_id' => '962', + ), + 22 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '50', + 'frequency' => '0', + 'id' => '4692', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220220', + 'section_id' => '3', + 'word_id' => '963', + ), + 23 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '51', + 'frequency' => '0', + 'id' => '4693', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1080220233', + 'section_id' => '3', + 'word_id' => '964', + ), + 24 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4694', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '965', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '877', + ), + 25 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4695', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '966', + 'placement' => '1', + 'prev_word_id' => '877', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '965', + ), + 26 => + array ( + 'contentclass_attribute_id' => '159', + 'contentclass_id' => '14', + 'contentobject_id' => '52', + 'frequency' => '0', + 'id' => '4696', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '2', + 'prev_word_id' => '965', + 'published' => '1082016591', + 'section_id' => '4', + 'word_id' => '966', + ), + 27 => + array ( + 'contentclass_attribute_id' => '176', + 'contentclass_id' => '15', + 'contentobject_id' => '54', + 'frequency' => '0', + 'id' => '4697', + 'identifier' => 'id', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1082016652', + 'section_id' => '5', + 'word_id' => '967', + ), + 28 => + array ( + 'contentclass_attribute_id' => '4', + 'contentclass_id' => '1', + 'contentobject_id' => '56', + 'frequency' => '0', + 'id' => '4698', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1103023132', + 'section_id' => '5', + 'word_id' => '968', + ), + 29 => + array ( + 'contentclass_attribute_id' => '236', + 'contentclass_id' => '23', + 'contentobject_id' => '57', + 'frequency' => '0', + 'id' => '4699', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1343141328', + 'section_id' => '1', + 'word_id' => '969', + ), + 30 => + array ( + 'contentclass_attribute_id' => '8', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4700', + 'identifier' => 'first_name', + 'integer_value' => '0', + 'next_word_id' => '954', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '958', + ), + 31 => + array ( + 'contentclass_attribute_id' => '9', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4701', + 'identifier' => 'last_name', + 'integer_value' => '0', + 'next_word_id' => '970', + 'placement' => '1', + 'prev_word_id' => '958', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '954', + ), + 32 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4702', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '971', + 'placement' => '2', + 'prev_word_id' => '954', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '970', + ), + 33 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4703', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '927', + 'placement' => '3', + 'prev_word_id' => '970', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '971', + ), + 34 => + array ( + 'contentclass_attribute_id' => '12', + 'contentclass_id' => '4', + 'contentobject_id' => '14', + 'frequency' => '0', + 'id' => '4704', + 'identifier' => 'user_account', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '4', + 'prev_word_id' => '971', + 'published' => '1033920830', + 'section_id' => '2', + 'word_id' => '927', + ), + 35 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '58', + 'frequency' => '0', + 'id' => '4705', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1343141332', + 'section_id' => '2', + 'word_id' => '972', + ), + 36 => + array ( + 'contentclass_attribute_id' => '6', + 'contentclass_id' => '3', + 'contentobject_id' => '11', + 'frequency' => '0', + 'id' => '4706', + 'identifier' => 'name', + 'integer_value' => '0', + 'next_word_id' => '0', + 'placement' => '0', + 'prev_word_id' => '0', + 'published' => '1033920746', + 'section_id' => '2', + 'word_id' => '973', + ), +), +'ezsearch_return_count' => +array ( +), +'ezsearch_search_phrase' => +array ( +), +'ezsearch_word' => +array ( + 0 => + array ( + 'id' => '812', + 'object_count' => '1', + 'word' => 'setup', + ), + 1 => + array ( + 'id' => '814', + 'object_count' => '1', + 'word' => 'the', + ), + 2 => + array ( + 'id' => '816', + 'object_count' => '1', + 'word' => 'for', + ), + 3 => + array ( + 'id' => '877', + 'object_count' => '1', + 'word' => 'common', + ), + 4 => + array ( + 'id' => '927', + 'object_count' => '2', + 'word' => 'ez.no', + ), + 5 => + array ( + 'id' => '930', + 'object_count' => '3', + 'word' => 'users', + ), + 6 => + array ( + 'id' => '951', + 'object_count' => '1', + 'word' => 'main', + ), + 7 => + array ( + 'id' => '952', + 'object_count' => '2', + 'word' => 'group', + ), + 8 => + array ( + 'id' => '953', + 'object_count' => '2', + 'word' => 'anonymous', + ), + 9 => + array ( + 'id' => '954', + 'object_count' => '3', + 'word' => 'user', + ), + 10 => + array ( + 'id' => '955', + 'object_count' => '1', + 'word' => 'nospam', + ), + 11 => + array ( + 'id' => '958', + 'object_count' => '2', + 'word' => 'administrator', + ), + 12 => + array ( + 'id' => '959', + 'object_count' => '1', + 'word' => 'editors', + ), + 13 => + array ( + 'id' => '961', + 'object_count' => '1', + 'word' => 'media', + ), + 14 => + array ( + 'id' => '962', + 'object_count' => '1', + 'word' => 'images', + ), + 15 => + array ( + 'id' => '963', + 'object_count' => '1', + 'word' => 'files', + ), + 16 => + array ( + 'id' => '964', + 'object_count' => '1', + 'word' => 'multimedia', + ), + 17 => + array ( + 'id' => '965', + 'object_count' => '1', + 'word' => 'ini', + ), + 18 => + array ( + 'id' => '966', + 'object_count' => '1', + 'word' => 'settings', + ), + 19 => + array ( + 'id' => '967', + 'object_count' => '1', + 'word' => 'sitestyle_identifier', + ), + 20 => + array ( + 'id' => '968', + 'object_count' => '1', + 'word' => 'design', + ), + 21 => + array ( + 'id' => '969', + 'object_count' => '1', + 'word' => 'home', + ), + 22 => + array ( + 'id' => '970', + 'object_count' => '1', + 'word' => 'admin', + ), + 23 => + array ( + 'id' => '971', + 'object_count' => '1', + 'word' => 'spam', + ), + 24 => + array ( + 'id' => '972', + 'object_count' => '1', + 'word' => 'partners', + ), + 25 => + array ( + 'id' => '973', + 'object_count' => '1', + 'word' => 'members', + ), +), +'ezsection' => +array ( + 0 => + array ( + 'id' => '1', + 'identifier' => 'standard', + 'locale' => '', + 'name' => 'Standard', + 'navigation_part_identifier' => 'ezcontentnavigationpart', + ), + 1 => + array ( + 'id' => '2', + 'identifier' => 'users', + 'locale' => '', + 'name' => 'Users', + 'navigation_part_identifier' => 'ezusernavigationpart', + ), + 2 => + array ( + 'id' => '3', + 'identifier' => 'media', + 'locale' => '', + 'name' => 'Media', + 'navigation_part_identifier' => 'ezmedianavigationpart', + ), + 3 => + array ( + 'id' => '4', + 'identifier' => 'setup', + 'locale' => '', + 'name' => 'Setup', + 'navigation_part_identifier' => 'ezsetupnavigationpart', + ), + 4 => + array ( + 'id' => '5', + 'identifier' => 'design', + 'locale' => '', + 'name' => 'Design', + 'navigation_part_identifier' => 'ezvisualnavigationpart', + ), + 5 => + array ( + 'id' => '6', + 'identifier' => '', + 'locale' => '', + 'name' => 'Restricted', + 'navigation_part_identifier' => 'ezcontentnavigationpart', + ), +), +'ezsession' => +array ( +), +'ezsite_data' => +array ( +/* 0 => + array ( + 'name' => 'ezflow', + 'value' => '2.0', + ), + 1 => + array ( + 'name' => 'ezpublish-release', + 'value' => '1', + ), + 2 => + array ( + 'name' => 'ezpublish-version', + 'value' => '4.7.0', + ),*/ +), +'ezstarrating' => +array ( +), +'ezstarrating_data' => +array ( +), +'ezsubtree_notification_rule' => +array ( +), +'eztipafriend_counter' => +array ( +), +'eztipafriend_request' => +array ( +), +'eztrigger' => +array ( +), +'ezurl' => +array ( + 0 => + array ( + 'created' => '1343141331', + 'id' => '23', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1343141331', + 'original_url_md5' => '9b492048041e95b32de08bafc86d759b', + 'url' => '/content/view/sitemap/2', + ), + 1 => + array ( + 'created' => '1343141331', + 'id' => '24', + 'is_valid' => '1', + 'last_checked' => '0', + 'modified' => '1343141331', + 'original_url_md5' => 'c86bcb109d8e70f9db65c803baafd550', + 'url' => '/content/view/tagcloud/2', + ), +), +'ezurl_object_link' => +array ( + 0 => + array ( + 'contentobject_attribute_id' => '203', + 'contentobject_attribute_version' => '2', + 'url_id' => '23', + ), + 1 => + array ( + 'contentobject_attribute_id' => '204', + 'contentobject_attribute_version' => '2', + 'url_id' => '24', + ), +), +'ezurlalias' => +array ( + 0 => + array ( + 'destination_url' => 'content/view/full/2', + 'forward_to_id' => '0', + 'id' => '12', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + 'source_url' => '', + ), + 1 => + array ( + 'destination_url' => 'content/view/full/5', + 'forward_to_id' => '0', + 'id' => '13', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '9bc65c2abec141778ffaa729489f3e87', + 'source_url' => 'users', + ), + 2 => + array ( + 'destination_url' => 'content/view/full/12', + 'forward_to_id' => '0', + 'id' => '15', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '02d4e844e3a660857a3f81585995ffe1', + 'source_url' => 'users/guest_accounts', + ), + 3 => + array ( + 'destination_url' => 'content/view/full/13', + 'forward_to_id' => '0', + 'id' => '16', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '1b1d79c16700fd6003ea7be233e754ba', + 'source_url' => 'users/administrator_users', + ), + 4 => + array ( + 'destination_url' => 'content/view/full/14', + 'forward_to_id' => '0', + 'id' => '17', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '0bb9dd665c96bbc1cf36b79180786dea', + 'source_url' => 'users/editors', + ), + 5 => + array ( + 'destination_url' => 'content/view/full/15', + 'forward_to_id' => '0', + 'id' => '18', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'f1305ac5f327a19b451d82719e0c3f5d', + 'source_url' => 'users/administrator_users/administrator_user', + ), + 6 => + array ( + 'destination_url' => 'content/view/full/43', + 'forward_to_id' => '0', + 'id' => '20', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '62933a2951ef01f4eafd9bdf4d3cd2f0', + 'source_url' => 'media', + ), + 7 => + array ( + 'destination_url' => 'content/view/full/44', + 'forward_to_id' => '0', + 'id' => '21', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '3ae1aac958e1c82013689d917d34967a', + 'source_url' => 'users/anonymous_users', + ), + 8 => + array ( + 'destination_url' => 'content/view/full/45', + 'forward_to_id' => '0', + 'id' => '22', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'aad93975f09371695ba08292fd9698db', + 'source_url' => 'users/anonymous_users/anonymous_user', + ), + 9 => + array ( + 'destination_url' => 'content/view/full/48', + 'forward_to_id' => '0', + 'id' => '25', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'a0f848942ce863cf53c0fa6cc684007d', + 'source_url' => 'setup', + ), + 10 => + array ( + 'destination_url' => 'content/view/full/50', + 'forward_to_id' => '0', + 'id' => '27', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'c60212835de76414f9bfd21eecb8f221', + 'source_url' => 'foo_bar_folder/images/vbanner', + ), + 11 => + array ( + 'destination_url' => 'content/view/full/51', + 'forward_to_id' => '0', + 'id' => '28', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '38985339d4a5aadfc41ab292b4527046', + 'source_url' => 'media/images', + ), + 12 => + array ( + 'destination_url' => 'content/view/full/52', + 'forward_to_id' => '0', + 'id' => '29', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'ad5a8c6f6aac3b1b9df267fe22e7aef6', + 'source_url' => 'media/files', + ), + 13 => + array ( + 'destination_url' => 'content/view/full/53', + 'forward_to_id' => '0', + 'id' => '30', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '562a0ac498571c6c3529173184a2657c', + 'source_url' => 'media/multimedia', + ), + 14 => + array ( + 'destination_url' => 'content/view/full/54', + 'forward_to_id' => '0', + 'id' => '31', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => 'e501fe6c81ed14a5af2b322d248102d8', + 'source_url' => 'setup/common_ini_settings', + ), + 15 => + array ( + 'destination_url' => 'content/view/full/56', + 'forward_to_id' => '0', + 'id' => '32', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '2dd3db5dc7122ea5f3ee539bb18fe97d', + 'source_url' => 'design/ez_publish', + ), + 16 => + array ( + 'destination_url' => 'content/view/full/58', + 'forward_to_id' => '0', + 'id' => '33', + 'is_imported' => '1', + 'is_internal' => '1', + 'is_wildcard' => '0', + 'source_md5' => '31c13f47ad87dd7baa2d558a91e0fbb9', + 'source_url' => 'design', + ), +), +'ezurlalias_ml' => +array ( + 0 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '14', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '14', + 'parent' => '0', + 'text' => 'foo_bar_folder', + 'text_md5' => '0288b6883046492fa92e4a84eb67acc9', + ), + 1 => + array ( + 'action' => 'eznode:59', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '38', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '9', + 'link' => '38', + 'parent' => '0', + 'text' => 'Home', + 'text_md5' => '106a6c241b8797f52e1e77317b96a201', + ), + 2 => + array ( + 'action' => 'eznode:59', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '38', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '38', + 'parent' => '0', + 'text' => 'eZ-Publish', + 'text_md5' => '10e4c3cb527fb9963258469986c16240', + ), + 3 => + array ( + 'action' => 'eznode:58', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '25', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '25', + 'parent' => '0', + 'text' => 'Design', + 'text_md5' => '31c13f47ad87dd7baa2d558a91e0fbb9', + ), + 4 => + array ( + 'action' => 'eznode:48', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '13', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '13', + 'parent' => '0', + 'text' => 'Setup2', + 'text_md5' => '475e97c0146bfb1c490339546d9e72ee', + ), + 5 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '17', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '17', + 'parent' => '0', + 'text' => 'media2', + 'text_md5' => '50e2736330de124f6edea9b008556fe6', + ), + 6 => + array ( + 'action' => 'eznode:43', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '9', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '9', + 'parent' => '0', + 'text' => 'Media', + 'text_md5' => '62933a2951ef01f4eafd9bdf4d3cd2f0', + ), + 7 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '21', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '21', + 'parent' => '0', + 'text' => 'setup3', + 'text_md5' => '732cefcf28bf4547540609fb1a786a30', + ), + 8 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '3', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '3', + 'parent' => '0', + 'text' => 'users2', + 'text_md5' => '86425c35a33507d479f71ade53a669aa', + ), + 9 => + array ( + 'action' => 'eznode:5', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '2', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '2', + 'parent' => '0', + 'text' => 'Users', + 'text_md5' => '9bc65c2abec141778ffaa729489f3e87', + ), + 10 => + array ( + 'action' => 'eznode:2', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '1', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '11', + 'link' => '1', + 'parent' => '0', + 'text' => '', + 'text_md5' => 'd41d8cd98f00b204e9800998ecf8427e', + ), + 11 => + array ( + 'action' => 'eznode:60', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '39', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '39', + 'parent' => '2', + 'text' => 'Partners', + 'text_md5' => '7896f8fa69398c56d86a65357615c41f', + ), + 12 => + array ( + 'action' => 'eznode:14', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '6', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '6', + 'parent' => '2', + 'text' => 'Editors', + 'text_md5' => 'a147e136bfa717592f2bd70bd4b53b17', + ), + 13 => + array ( + 'action' => 'eznode:44', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '10', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '10', + 'parent' => '2', + 'text' => 'Anonymous-Users', + 'text_md5' => 'c2803c3fa1b0b5423237b4e018cae755', + ), + 14 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '4', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '2', + 'text' => 'Members', + 'text_md5' => 'd2e3083420929d8bfae81f58fa4594cb', + ), + 15 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '40', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '3', + 'link' => '4', + 'parent' => '2', + 'text' => 'Guest-accounts', + 'text_md5' => 'e57843d836e3af8ab611fde9e2139b3a', + ), + 16 => + array ( + 'action' => 'eznode:13', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '5', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '5', + 'parent' => '2', + 'text' => 'Administrator-users', + 'text_md5' => 'f89fad7f8a3abc8c09e1deb46a420007', + ), + 17 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '11', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '11', + 'parent' => '3', + 'text' => 'anonymous_users2', + 'text_md5' => '505e93077a6dde9034ad97a14ab022b1', + ), + 18 => + array ( + 'action' => 'eznode:12', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '26', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '0', + 'link' => '4', + 'parent' => '3', + 'text' => 'guest_accounts', + 'text_md5' => '70bb992820e73638731aa8de79b3329e', + ), + 19 => + array ( + 'action' => 'eznode:14', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '29', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '6', + 'parent' => '3', + 'text' => 'editors', + 'text_md5' => 'a147e136bfa717592f2bd70bd4b53b17', + ), + 20 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '7', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '7', + 'parent' => '3', + 'text' => 'administrator_users2', + 'text_md5' => 'a7da338c20bf65f9f789c87296379c2a', + ), + 21 => + array ( + 'action' => 'eznode:13', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '27', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '5', + 'parent' => '3', + 'text' => 'administrator_users', + 'text_md5' => 'aeb8609aa933b0899aa012c71139c58c', + ), + 22 => + array ( + 'action' => 'eznode:44', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '30', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '10', + 'parent' => '3', + 'text' => 'anonymous_users', + 'text_md5' => 'e9e5ad0c05ee1a43715572e5cc545926', + ), + 23 => + array ( + 'action' => 'eznode:15', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '8', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '8', + 'parent' => '5', + 'text' => 'Administrator-User', + 'text_md5' => '5a9d7b0ec93173ef4fedee023209cb61', + ), + 24 => + array ( + 'action' => 'eznode:15', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '28', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '0', + 'link' => '8', + 'parent' => '7', + 'text' => 'administrator_user', + 'text_md5' => 'a3cca2de936df1e2f805710399989971', + ), + 25 => + array ( + 'action' => 'eznode:53', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '20', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '20', + 'parent' => '9', + 'text' => 'Multimedia', + 'text_md5' => '2e5bc8831f7ae6a29530e7f1bbf2de9c', + ), + 26 => + array ( + 'action' => 'eznode:52', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '19', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '19', + 'parent' => '9', + 'text' => 'Files', + 'text_md5' => '45b963397aa40d4a0063e0d85e4fe7a1', + ), + 27 => + array ( + 'action' => 'eznode:51', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '18', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '18', + 'parent' => '9', + 'text' => 'Images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 28 => + array ( + 'action' => 'eznode:45', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '12', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '3', + 'link' => '12', + 'parent' => '10', + 'text' => 'Anonymous-User', + 'text_md5' => 'ccb62ebca03a31272430bc414bd5cd5b', + ), + 29 => + array ( + 'action' => 'eznode:45', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '31', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '12', + 'parent' => '11', + 'text' => 'anonymous_user', + 'text_md5' => 'c593ec85293ecb0e02d50d4c5c6c20eb', + ), + 30 => + array ( + 'action' => 'eznode:54', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '22', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '22', + 'parent' => '13', + 'text' => 'Common-INI-settings', + 'text_md5' => '4434993ac013ae4d54bb1f51034d6401', + ), + 31 => + array ( + 'action' => 'nop:', + 'action_type' => 'nop', + 'alias_redirects' => '1', + 'id' => '15', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '15', + 'parent' => '14', + 'text' => 'images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 32 => + array ( + 'action' => 'eznode:50', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '16', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '16', + 'parent' => '15', + 'text' => 'vbanner', + 'text_md5' => 'c54e2d1b93642e280bdc5d99eab2827d', + ), + 33 => + array ( + 'action' => 'eznode:53', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '34', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '20', + 'parent' => '17', + 'text' => 'multimedia', + 'text_md5' => '2e5bc8831f7ae6a29530e7f1bbf2de9c', + ), + 34 => + array ( + 'action' => 'eznode:52', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '33', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '19', + 'parent' => '17', + 'text' => 'files', + 'text_md5' => '45b963397aa40d4a0063e0d85e4fe7a1', + ), + 35 => + array ( + 'action' => 'eznode:51', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '32', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '18', + 'parent' => '17', + 'text' => 'images', + 'text_md5' => '59b514174bffe4ae402b3d63aad79fe0', + ), + 36 => + array ( + 'action' => 'eznode:54', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '35', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '1', + 'link' => '22', + 'parent' => '21', + 'text' => 'common_ini_settings', + 'text_md5' => 'e59d6834e86cee752ed841f9cd8d5baf', + ), + 37 => + array ( + 'action' => 'eznode:56', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '37', + 'is_alias' => '0', + 'is_original' => '0', + 'lang_mask' => '2', + 'link' => '24', + 'parent' => '25', + 'text' => 'eZ-publish', + 'text_md5' => '10e4c3cb527fb9963258469986c16240', + ), + 38 => + array ( + 'action' => 'eznode:56', + 'action_type' => 'eznode', + 'alias_redirects' => '1', + 'id' => '24', + 'is_alias' => '0', + 'is_original' => '1', + 'lang_mask' => '2', + 'link' => '24', + 'parent' => '25', + 'text' => 'Plain-site', + 'text_md5' => '49a39d99a955d95aa5d636275656a07a', + ), +), +'ezurlalias_ml_incr' => +array ( + 0 => + array ( + 'id' => '1', + ), + 1 => + array ( + 'id' => '2', + ), + 2 => + array ( + 'id' => '3', + ), + 3 => + array ( + 'id' => '4', + ), + 4 => + array ( + 'id' => '5', + ), + 5 => + array ( + 'id' => '6', + ), + 6 => + array ( + 'id' => '7', + ), + 7 => + array ( + 'id' => '8', + ), + 8 => + array ( + 'id' => '9', + ), + 9 => + array ( + 'id' => '10', + ), + 10 => + array ( + 'id' => '11', + ), + 11 => + array ( + 'id' => '12', + ), + 12 => + array ( + 'id' => '13', + ), + 13 => + array ( + 'id' => '14', + ), + 14 => + array ( + 'id' => '15', + ), + 15 => + array ( + 'id' => '16', + ), + 16 => + array ( + 'id' => '17', + ), + 17 => + array ( + 'id' => '18', + ), + 18 => + array ( + 'id' => '19', + ), + 19 => + array ( + 'id' => '20', + ), + 20 => + array ( + 'id' => '21', + ), + 21 => + array ( + 'id' => '22', + ), + 22 => + array ( + 'id' => '24', + ), + 23 => + array ( + 'id' => '25', + ), + 24 => + array ( + 'id' => '26', + ), + 25 => + array ( + 'id' => '27', + ), + 26 => + array ( + 'id' => '28', + ), + 27 => + array ( + 'id' => '29', + ), + 28 => + array ( + 'id' => '30', + ), + 29 => + array ( + 'id' => '31', + ), + 30 => + array ( + 'id' => '32', + ), + 31 => + array ( + 'id' => '33', + ), + 32 => + array ( + 'id' => '34', + ), + 33 => + array ( + 'id' => '35', + ), + 34 => + array ( + 'id' => '36', + ), + 35 => + array ( + 'id' => '37', + ), + 36 => + array ( + 'id' => '38', + ), + 37 => + array ( + 'id' => '39', + ), + 38 => + array ( + 'id' => '40', + ), +), +'ezurlwildcard' => +array ( +), +'ezuser' => +array ( + 0 => + array ( + 'contentobject_id' => '10', + 'email' => 'nospam@ez.no', + 'login' => 'anonymous', + 'password_hash' => '4e6f6184135228ccd45f8233d72a0363', + 'password_hash_type' => '2', + ), + 1 => + array ( + 'contentobject_id' => '14', + 'email' => 'spam@ez.no', + 'login' => 'admin', + 'password_hash' => 'c78e3b0f3d9244ed8c6d1c29464bdff9', + 'password_hash_type' => '2', + ), +), +'ezuser_accountkey' => +array ( +), +'ezuser_discountrule' => +array ( +), +'ezuser_role' => +array ( + 0 => + array ( + 'contentobject_id' => '12', + 'id' => '25', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '2', + ), + 1 => + array ( + 'contentobject_id' => '11', + 'id' => '28', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 2 => + array ( + 'contentobject_id' => '42', + 'id' => '31', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 3 => + array ( + 'contentobject_id' => '13', + 'id' => '32', + 'limit_identifier' => 'Subtree', + 'limit_value' => '/1/2/', + 'role_id' => '3', + ), + 4 => + array ( + 'contentobject_id' => '13', + 'id' => '33', + 'limit_identifier' => 'Subtree', + 'limit_value' => '/1/43/', + 'role_id' => '3', + ), + 5 => + array ( + 'contentobject_id' => '11', + 'id' => '34', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + 6 => + array ( + 'contentobject_id' => '58', + 'id' => '35', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '4', + ), + 7 => + array ( + 'contentobject_id' => '58', + 'id' => '36', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), + 8 => + array ( + 'contentobject_id' => '58', + 'id' => '37', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '1', + ), + 9 => + array ( + 'contentobject_id' => '13', + 'id' => '38', + 'limit_identifier' => '', + 'limit_value' => '', + 'role_id' => '5', + ), +), +'ezuser_setting' => +array ( + 0 => + array ( + 'is_enabled' => '1', + 'max_login' => '1000', + 'user_id' => '10', + ), + 1 => + array ( + 'is_enabled' => '1', + 'max_login' => '10', + 'user_id' => '14', + ), +), +'ezuservisit' => +array ( + 0 => + array ( + 'current_visit_timestamp' => '1343141305', + 'failed_login_attempts' => '0', + 'last_visit_timestamp' => '1301057720', + 'login_count' => '0', + 'user_id' => '14', + ), +), +'ezvatrule' => +array ( +), +'ezvatrule_product_category' => +array ( +), +'ezvattype' => +array ( +/* 0 => + array ( + 'id' => '1', + 'name' => 'Std', + 'percentage' => '0', + ),*/ +), +'ezview_counter' => +array ( +), +'ezwaituntildatevalue' => +array ( +), +'ezwishlist' => +array ( +), +'ezworkflow' => +array ( +), +'ezworkflow_assign' => +array ( +), +'ezworkflow_event' => +array ( +), +'ezworkflow_group' => +array ( +/* 0 => + array ( + 'created' => '1024392098', + 'creator_id' => '14', + 'id' => '1', + 'modified' => '1024392098', + 'modifier_id' => '14', + 'name' => 'Standard', + ),*/ +), +'ezworkflow_group_link' => +array ( +), +'ezworkflow_process' => +array ( +), +); + diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/upload.phpt b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/upload.phpt new file mode 100644 index 0000000..590b180 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/Legacy/upload.phpt @@ -0,0 +1,39 @@ +--TEST-- +Test file upload for IOService with Legacy persistence handler +--POST_RAW-- +Content-Type: multipart/form-data; boundary=---------------------------2921238217421 + +-----------------------------2921238217421 +Content-Disposition: form-data; name="file"; filename="stairway_to_heaven.txt" +Content-Type: text/plain + +There's a lady who's sure +All that glitters is gold +And she's buying a stairway to heaven. + +When she gets there she knows +If the stores are all closed +With a word she can get what she came for. + +-----------------------------2921238217421 +Content-Disposition: form-data; name="submit" + +Upload +-----------------------------2921238217421-- +--FILE-- +<?php + +chdir( __DIR__ . '/../../../../../../../' ); + +require_once 'bootstrap.php'; +require_once 'PHPUnit/Autoload.php'; + +$repository = \eZ\Publish\Core\Repository\Tests\Service\Integration\Legacy\IOUploadPHPT::getRepository( array() ); + +$binaryCreateStruct = $repository->getIOService()->newBinaryCreateStructFromUploadedFile( $_FILES['file'] ); + +var_dump( $binaryCreateStruct instanceof \eZ\Publish\API\Repository\Values\IO\BinaryFileCreateStruct ); + +?> +--EXPECT-- +bool(true) diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/LocationBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/LocationBase.php new file mode 100644 index 0000000..cdf2f97 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/LocationBase.php @@ -0,0 +1,700 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\LocationBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; + +/** + * Test case for Location Service + */ +abstract class LocationBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\Content\Location::__construct + */ + public function testNewClass() + { + $location = new Location(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'priority' => null, + 'hidden' => null, + 'invisible' => null, + 'remoteId' => null, + 'parentLocationId' => null, + 'pathString' => null, + 'path' => array(), + 'depth' => null, + 'sortField' => null, + 'sortOrder' => null, + ), + $location + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\Content\Location::__get + */ + public function testMissingProperty() + { + try + { + $location = new Location(); + $value = $location->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\Content\Location::__set + */ + public function testReadOnlyProperty() + { + try + { + $location = new Location(); + $location->id = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\Content\Location::__isset + */ + public function testIsPropertySet() + { + $location = new Location(); + $value = isset( $location->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $location->id ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\Content\Location::__unset + */ + public function testUnsetProperty() + { + $location = new Location( array( "id" => 2 ) ); + try + { + unset( $location->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * @param int $parentLocationId + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createTestContentLocation( $parentLocationId ) + { + $contentService = $this->repository->getContentService(); + $contentTypeService = $this->repository->getContentTypeService(); + // User Group content type + $contentType = $contentTypeService->loadContentType( 3 ); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-GB' ); + $contentCreate->setField( "name", "dummy value" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = md5( uniqid( get_class( $this ), true ) ); + $contentCreate->alwaysAvailable = true; + + $locationCreates = array( + new LocationCreateStruct( + array( + //priority = 0 + //hidden = false + "remoteId" => md5( uniqid( get_class( $this ), true ) ), + //sortField = Location::SORT_FIELD_NAME + //sortOrder = Location::SORT_ORDER_ASC + "parentLocationId" => $parentLocationId + ) + ) + ); + + return $contentService->publishVersion( + $contentService->createContent( + $contentCreate, + $locationCreates + )->versionInfo + ); + } + + /** + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param int $parentLocationId + * + * @return mixed + */ + protected function addNewMainLocation( $contentInfo, $parentLocationId ) + { + $locationService = $this->repository->getLocationService(); + $contentService = $this->repository->getContentService(); + + $newLocation = $locationService->createLocation( + $contentInfo, + new LocationCreateStruct( + array( + "remoteId" => md5( uniqid( get_class( $this ), true ) ), + "parentLocationId" => $parentLocationId + ) + ) + ); + $contentService->updateContentMetadata( + $contentInfo, + new ContentMetadataUpdateStruct( array( "mainLocationId" => $newLocation->id ) ) + ); + + return $newLocation->id; + } + + /** + * Test copying a subtree + * + * @group current + * @covers \eZ\Publish\API\Repository\LocationService::copySubtree + */ + public function testCopySubtree() + { + // Prepare test tree + $outsideLocationId = $this->createTestContentLocation( 5 )->contentInfo->mainLocationId; + $targetLocationId = $this->createTestContentLocation( 5 )->contentInfo->mainLocationId; + $locationToCopyContent = $this->createTestContentLocation( 5 ); + + $locationToCopyId = $locationToCopyContent->contentInfo->mainLocationId; + + $this->createTestContentLocation( $locationToCopyId ); + $subLocationContent20 = $this->createTestContentLocation( $locationToCopyId ); + $subLocationId20 = $subLocationContent20->contentInfo->mainLocationId; + $subLocationContent21 = $this->createTestContentLocation( $subLocationId20 ); + + // Add main locations outside subtree + $this->addNewMainLocation( $locationToCopyContent->contentInfo, $outsideLocationId ); + $this->addNewMainLocation( $subLocationContent20->contentInfo, $outsideLocationId ); + + // Add main locations inside subtree + $lastLocationId = $this->addNewMainLocation( $subLocationContent21->contentInfo, $locationToCopyId ); + + /* BEGIN: Use Case */ + $locationService = $this->repository->getLocationService(); + $locationToCopy = $locationService->loadLocation( $locationToCopyId ); + $targetLocation = $locationService->loadLocation( $targetLocationId ); + + $copiedSubtreeRootLocation = $locationService->copySubtree( $locationToCopy, $targetLocation ); + /* END: Use Case */ + + self::assertEquals( $lastLocationId + 1, $copiedSubtreeRootLocation->id ); + + // Check structure + $subtreeRootChildren = $locationService->loadLocationChildren( $copiedSubtreeRootLocation ); + self::assertEquals( 3, $subtreeRootChildren->totalCount ); + self::assertEquals( 0, $locationService->getLocationChildCount( $subtreeRootChildren->locations[0] ) ); + $subLocationChildren = $locationService->loadLocationChildren( $subtreeRootChildren->locations[1] ); + self::assertEquals( 1, $subLocationChildren->totalCount ); + self::assertEquals( 0, $locationService->getLocationChildCount( $subtreeRootChildren->locations[2] ) ); + self::assertEquals( 0, $locationService->getLocationChildCount( $subLocationChildren->locations[0] ) ); + + // Check main locations + self::assertEquals( $copiedSubtreeRootLocation->contentInfo->mainLocationId, $copiedSubtreeRootLocation->id ); + self::assertEquals( $subtreeRootChildren->locations[0]->contentInfo->mainLocationId, $subtreeRootChildren->locations[0]->id ); + self::assertEquals( $subtreeRootChildren->locations[1]->contentInfo->mainLocationId, $subtreeRootChildren->locations[1]->id ); + self::assertEquals( $subtreeRootChildren->locations[2]->contentInfo->mainLocationId, $subtreeRootChildren->locations[2]->id ); + self::assertEquals( $subLocationChildren->locations[0]->contentInfo->mainLocationId, $subtreeRootChildren->locations[2]->id ); + + self::assertInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Location", $copiedSubtreeRootLocation ); + self::assertEquals( $targetLocation->id, $copiedSubtreeRootLocation->parentLocationId ); + } + + /** + * Test copying a subtree throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LocationService::copySubtree + */ + public function testCopySubtreeThrowsInvalidArgumentException() + { + $locationService = $this->repository->getLocationService(); + $locationToCopy = $locationService->loadLocation( 5 ); + $targetLocation = $locationService->loadLocation( 44 ); + + $locationService->copySubtree( $locationToCopy, $targetLocation ); + } + + /** + * Test loading a location + * @covers \eZ\Publish\API\Repository\LocationService::loadLocation + */ + public function testLoadLocation() + { + $locationService = $this->repository->getLocationService(); + $loadedLocation = $locationService->loadLocation( 5 ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $loadedLocation ); + self::assertEquals( 5, $loadedLocation->id ); + } + + /** + * Test loading a location throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\LocationService::loadLocation + */ + public function testLoadLocationThrowsNotFoundException() + { + $locationService = $this->repository->getLocationService(); + $locationService->loadLocation( PHP_INT_MAX ); + } + + /** + * Test loading location by remote ID + * @covers \eZ\Publish\API\Repository\LocationService::loadLocationByRemoteId + */ + public function testLoadLocationByRemoteId() + { + $location = $this->repository->getLocationService()->loadLocationByRemoteId( '769380b7aa94541679167eab817ca893' ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + self::assertGreaterThan( 0, $location->id ); + self::assertEquals( '769380b7aa94541679167eab817ca893', $location->remoteId ); + } + + /** + * Test loading location by remote ID + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\LocationService::loadLocationByRemoteId + */ + public function testLoadLocationByRemoteIdThrowsNotFoundException() + { + $this->repository->getLocationService()->loadLocationByRemoteId( "not-existing" ); + } + + protected function createContentDraft() + { + $contentTypeService = $this->repository->getContentTypeService(); + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + + $contentCreateStruct = $contentService->newContentCreateStruct( + $contentTypeService->loadContentType( 3 ), + 'eng-GB' + ); + $contentCreateStruct->sectionId = 1; + $contentCreateStruct->ownerId = 14; + + $contentCreateStruct->setField( 'name', 'New group' ); + $contentCreateStruct->setField( 'description', 'New group description' ); + + $locationCreateStruct = $locationService->newLocationCreateStruct( 5 ); + + return $contentService->createContent( $contentCreateStruct, array( $locationCreateStruct ) ); + } + + /** + * Test loading locations for content + * + * @covers \eZ\Publish\API\Repository\LocationService::newLocationCreateStruct + * @covers \eZ\Publish\API\Repository\LocationService::createLocation + * @covers \eZ\Publish\API\Repository\LocationService::loadLocations + */ + public function testLoadLocations() + { + $contentInfo = $this->repository->getContentService()->loadContentInfo( 12 ); + + $locationService = $this->repository->getLocationService(); + $locations = $locationService->loadLocations( $contentInfo ); + + self::assertInternalType( "array", $locations ); + self::assertNotEmpty( $locations ); + + foreach ( $locations as $location ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + self::assertEquals( $contentInfo->id, $location->getContentInfo()->id ); + } + + $locationsCount = count( $locations ); + + $locationCreateStruct = $locationService->newLocationCreateStruct( 44 ); + $locationService->createLocation( $contentInfo, $locationCreateStruct ); + + $locations = $locationService->loadLocations( $contentInfo ); + + self::assertInternalType( "array", $locations ); + self::assertNotEmpty( $locations ); + + foreach ( $locations as $location ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + self::assertEquals( $contentInfo->id, $location->getContentInfo()->id ); + } + + $newLocationsCount = count( $locations ); + + self::assertEquals( $locationsCount + 1, $newLocationsCount ); + } + + /** + * Test loading locations for content with root location specified + * @covers \eZ\Publish\API\Repository\LocationService::loadLocations + */ + public function testLoadLocationsWithRootLocation() + { + $contentInfo = $this->repository->getContentService()->loadContentInfo( 12 ); + + $locationService = $this->repository->getLocationService(); + $parentLocation = $locationService->loadLocation( 5 ); + + $locations = $locationService->loadLocations( $contentInfo, $parentLocation ); + + self::assertInternalType( "array", $locations ); + self::assertNotEmpty( $locations ); + + foreach ( $locations as $location ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + } + + foreach ( $locations as $location ) + { + if ( stripos( $location->pathString, $parentLocation->pathString ) === false ) + self::fail( "fetched locations outside root node" ); + } + } + + /** + * Test loading locations for content throwing BadStateException + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @covers \eZ\Publish\API\Repository\LocationService::loadLocations + */ + public function testLoadLocationsThrowsBadStateException() + { + $contentDraft = $this->createContentDraft(); + + $this->repository->getLocationService()->loadLocations( + $contentDraft->getVersionInfo()->getContentInfo() + ); + } + + /** + * Test loading location children + * @covers \eZ\Publish\API\Repository\LocationService::loadLocationChildren + */ + public function testLoadLocationChildren() + { + $locationService = $this->repository->getLocationService(); + + $rootLocation = $locationService->loadLocation( 5 ); + $childrenLocations = $locationService->loadLocationChildren( $rootLocation ); + + self::assertInstanceOf( "\\eZ\\Publish\\API\\Repository\\Values\\Content\\LocationList", $childrenLocations ); + self::assertInternalType( "array", $childrenLocations->locations ); + self::assertInternalType( "int", $childrenLocations->totalCount ); + self::assertNotEmpty( $childrenLocations->locations ); + + foreach ( $childrenLocations->locations as $childLocation ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $childLocation ); + self::assertEquals( $rootLocation->id, $childLocation->parentLocationId ); + } + } + + /** + * Test creating a location + * @covers \eZ\Publish\API\Repository\LocationService::createLocation + */ + public function testCreateLocation() + { + $locationService = $this->repository->getLocationService(); + $contentService = $this->repository->getContentService(); + + $parentLocation = $locationService->loadLocation( 44 ); + + $locationCreateStruct = $locationService->newLocationCreateStruct( $parentLocation->id ); + $locationCreateStruct->priority = 42; + $locationCreateStruct->remoteId = 'new-remote-id'; + $locationCreateStruct->hidden = true; + $locationCreateStruct->sortField = Location::SORT_FIELD_DEPTH; + $locationCreateStruct->sortOrder = Location::SORT_ORDER_DESC; + + $contentInfo = $contentService->loadContentInfo( 12 ); + + $createdLocation = $locationService->createLocation( + $contentInfo, + $locationCreateStruct + ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $createdLocation ); + self::assertGreaterThan( 0, $createdLocation->id ); + $createdPath = $parentLocation->path; + $createdPath[] = $createdLocation->id; + + $this->assertPropertiesCorrect( + array( + 'priority' => $locationCreateStruct->priority, + 'hidden' => $locationCreateStruct->hidden, + 'invisible' => $locationCreateStruct->hidden, + 'remoteId' => $locationCreateStruct->remoteId, + 'parentLocationId' => $locationCreateStruct->parentLocationId, + 'pathString' => $parentLocation->pathString . $createdLocation->id . '/', + 'path' => $createdPath, + 'depth' => $parentLocation->depth + 1, + 'sortField' => $locationCreateStruct->sortField, + 'sortOrder' => $locationCreateStruct->sortOrder, + ), + $createdLocation + ); + + self::assertEquals( $contentInfo->id, $createdLocation->getContentInfo()->id ); + } + + /** + * Test creating a location throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LocationService::createLocation + */ + public function testCreateLocationThrowsInvalidArgumentExceptionLocationExistsBelowParent() + { + $locationService = $this->repository->getLocationService(); + $contentService = $this->repository->getContentService(); + + $locationCreateStruct = $locationService->newLocationCreateStruct( 5 ); + $contentInfo = $contentService->loadContentInfo( 12 ); + $locationService->createLocation( $contentInfo, $locationCreateStruct ); + } + + /** + * Test creating a location throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LocationService::createLocation + */ + public function testCreateLocationThrowsInvalidArgumentExceptionExistingRemoteID() + { + $locationService = $this->repository->getLocationService(); + $contentService = $this->repository->getContentService(); + + $locationCreateStruct = $locationService->newLocationCreateStruct( 2 ); + $locationCreateStruct->remoteId = '769380b7aa94541679167eab817ca893'; + $contentInfo = $contentService->loadContentInfo( 4 ); + $locationService->createLocation( $contentInfo, $locationCreateStruct ); + } + + /** + * Test creating a location throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LocationService::createLocation + */ + public function testCreateLocationThrowsInvalidArgumentExceptionParentIsASubLocation() + { + $locationService = $this->repository->getLocationService(); + $contentService = $this->repository->getContentService(); + + $locationCreateStruct = $locationService->newLocationCreateStruct( 44 ); + $contentInfo = $contentService->loadContentInfo( 4 ); + $locationService->createLocation( $contentInfo, $locationCreateStruct ); + } + + /** + * Test updating location + * @covers \eZ\Publish\API\Repository\LocationService::updateLocation + */ + public function testUpdateLocation() + { + $locationService = $this->repository->getLocationService(); + + $location = $locationService->loadLocation( 5 ); + $locationUpdateStruct = $locationService->newLocationUpdateStruct(); + $locationUpdateStruct->priority = 42; + $locationUpdateStruct->sortField = Location::SORT_FIELD_DEPTH; + $locationUpdateStruct->sortOrder = Location::SORT_ORDER_DESC; + $locationUpdateStruct->remoteId = "NEW_REMOTE_ID"; + + $location = $locationService->updateLocation( $location, $locationUpdateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + + $this->assertPropertiesCorrect( + array( + 'priority' => $locationUpdateStruct->priority, + 'sortField' => $locationUpdateStruct->sortField, + 'sortOrder' => $locationUpdateStruct->sortOrder, + 'remoteId' => $locationUpdateStruct->remoteId + ), + $location + ); + } + + /** + * Test updating location throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\LocationService::updateLocation + */ + public function testUpdateLocationThrowsInvalidArgumentException() + { + $locationService = $this->repository->getLocationService(); + + $location = $locationService->loadLocation( 5 ); + $locationUpdateStruct = $locationService->newLocationUpdateStruct(); + $locationUpdateStruct->remoteId = '769380b7aa94541679167eab817ca893'; + + $locationService->updateLocation( $location, $locationUpdateStruct ); + } + + /** + * Test swapping location + * @covers \eZ\Publish\API\Repository\LocationService::swapLocation + */ + public function testSwapLocation() + { + $locationService = $this->repository->getLocationService(); + + $location1 = $locationService->loadLocation( 2 ); + $location2 = $locationService->loadLocation( 44 ); + + $contentId1 = $location1->getContentInfo()->id; + $contentId2 = $location2->getContentInfo()->id; + + $locationService->swapLocation( $location1, $location2 ); + + $location1 = $locationService->loadLocation( 2 ); + $location2 = $locationService->loadLocation( 44 ); + + self::assertEquals( $contentId1, $location2->getContentInfo()->id ); + self::assertEquals( $contentId2, $location1->getContentInfo()->id ); + } + + /** + * Test hiding & unhiding a location + * @covers \eZ\Publish\API\Repository\LocationService::hideLocation + * @covers \eZ\Publish\API\Repository\LocationService::unhideLocation + */ + public function testHideUnhideLocation() + { + $locationService = $this->repository->getLocationService(); + + $location = $locationService->loadLocation( 5 ); + $location = $locationService->hideLocation( $location ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + self::assertEquals( true, $location->hidden ); + self::assertEquals( true, $location->invisible ); + + $location = $locationService->unhideLocation( $location ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $location ); + self::assertEquals( false, $location->hidden ); + self::assertEquals( false, $location->invisible ); + } + + /** + * Test moving a subtree + * @covers \eZ\Publish\API\Repository\LocationService::moveSubtree + */ + public function testMoveSubtree() + { + $locationService = $this->repository->getLocationService(); + + $locationToMove = $locationService->loadLocation( 13 ); + $newParent = $locationService->loadLocation( 44 ); + $locationService->moveSubtree( $locationToMove, $newParent ); + + $loadedLocation = $locationService->loadLocation( $locationToMove->id ); + self::assertEquals( $newParent->id, $loadedLocation->parentLocationId ); + } + + /** + * Test deleting a location + * @covers \eZ\Publish\API\Repository\LocationService::deleteLocation + */ + public function testDeleteLocation() + { + $locationService = $this->repository->getLocationService(); + + $location = $locationService->loadLocation( 44 ); + $locationService->deleteLocation( $location ); + + try + { + $locationService->loadLocation( $location->id ); + self::fail( "failed deleting a location" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test creating new LocationCreateStruct + * @covers \eZ\Publish\API\Repository\LocationService::newLocationCreateStruct + */ + public function testNewLocationCreateStruct() + { + $locationService = $this->repository->getLocationService(); + + $locationCreateStruct = $locationService->newLocationCreateStruct( 2 ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\LocationCreateStruct', $locationCreateStruct ); + + $this->assertPropertiesCorrect( + array( + 'priority' => 0, + 'hidden' => false, + 'remoteId' => null, + 'sortField' => Location::SORT_FIELD_NAME, + 'sortOrder' => Location::SORT_ORDER_ASC, + 'parentLocationId' => 2 + ), + $locationCreateStruct + ); + } + + /** + * Test creating new LocationUpdateStruct + * @covers \eZ\Publish\API\Repository\LocationService::newLocationUpdateStruct + */ + public function testNewLocationUpdateStruct() + { + $locationService = $this->repository->getLocationService(); + + $locationUpdateStruct = $locationService->newLocationUpdateStruct(); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct', $locationUpdateStruct ); + + $this->assertPropertiesCorrect( + array( + 'priority' => null, + 'remoteId' => null, + 'sortField' => null, + 'sortOrder' => null + ), + $locationUpdateStruct + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/NameSchemaBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/NameSchemaBase.php new file mode 100644 index 0000000..2b73953 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/NameSchemaBase.php @@ -0,0 +1,312 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\NameSchemaBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\NameSchemaService; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\API\Repository\Values\Content\Field; +use eZ\Publish\Core\FieldType\TextLine\Value as TextLineValue; + +/** + * Test case for NameSchema service + */ +abstract class NameSchemaBase extends BaseServiceTest +{ + /** + * Test eZ\Publish\Core\Repository\NameSchemaService method + * @covers \eZ\Publish\Core\Repository\NameSchemaService::resolve + * @dataProvider providerForTestResolve + */ + public function testResolve( $nameSchema, $expectedName ) + { + /** @var $service \eZ\Publish\Core\Repository\NameSchemaService */ + $service = $this->repository->getNameSchemaService(); + + $content = $this->buildTestContent(); + + $name = $service->resolve( + $nameSchema, + $content->contentType, + $content->fields, + $content->versionInfo->languageCodes + ); + + self::assertEquals( $expectedName, $name ); + } + + /** + * Test eZ\Publish\Core\Repository\NameSchemaService method + * @covers \eZ\Publish\Core\Repository\NameSchemaService::resolve + */ + public function testResolveWithSettings() + { + /** @var $service \eZ\Publish\Core\Repository\NameSchemaService */ + $service = $this->repository->getNameSchemaService(); + + $this->setConfiguration( + $service, + array( + "limit" => 38, + "sequence" => "..." + ) + ); + + $content = $this->buildTestContent(); + + $name = $service->resolve( + "Hello, <text1> and <text2> and then goodbye and hello again", + $content->contentType, + $content->fields, + $content->versionInfo->languageCodes + ); + + self::assertEquals( + array( + "eng-GB" => "Hello, one and two and then goodbye...", + "cro-HR" => "Hello, jedan and dva and then goodb..." + ), + $name + ); + } + + /** + */ + public function providerForTestResolve() + { + return array( + array( + "<text1>", + array( + "eng-GB" => "one", + "cro-HR" => "jedan", + ) + ), + array( + "<text1> <text2>", + array( + "eng-GB" => "one two", + "cro-HR" => "jedan dva", + ) + ), + array( + "Hello <text1>", + array( + "eng-GB" => "Hello one", + "cro-HR" => "Hello jedan", + ) + ), + array( + "Hello, <text1> and <text2> and then goodbye", + array( + "eng-GB" => "Hello, one and two and then goodbye", + "cro-HR" => "Hello, jedan and dva and then goodbye", + ) + ), + array( + "<text1|text2>", + array( + "eng-GB" => "one", + "cro-HR" => "jedan", + ) + ), + array( + "<text2|text1>", + array( + "eng-GB" => "two", + "cro-HR" => "dva", + ) + ), + array( + "<text3|text1>", + array( + "eng-GB" => "one", + "cro-HR" => "jedan", + ) + ), + array( + "<(<text1> <text2>)>", + array( + "eng-GB" => "one two", + "cro-HR" => "jedan dva", + ) + ), + array( + "<(<text3|text2>)>", + array( + "eng-GB" => "two", + "cro-HR" => "dva", + ) + ), + array( + "<text3|(<text3|text2>)>", + array( + "eng-GB" => "two", + "cro-HR" => "dva", + ) + ), + array( + "<text3|(Hello <text2> and <text1>!)>", + array( + "eng-GB" => "Hello two and one!", + "cro-HR" => "Hello dva and jedan!", + ) + ), + array( + "<text3|(Hello <text3> and <text1>)|text2>!", + array( + "eng-GB" => "Hello and one!", + "cro-HR" => "Hello and jedan!", + ) + ), + array( + "<text3|(Hello <text3|text2> and <text1>)|text2>!", + array( + "eng-GB" => "Hello two and one!", + "cro-HR" => "Hello dva and jedan!", + ) + ), + ); + } + + /** + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected function getFields() + { + return array( + new Field( + array( + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "text1", + "value" => new TextLineValue( "one" ) + ) + ), + new Field( + array( + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "text2", + "value" => new TextLineValue( "two" ) + ) + ), + new Field( + array( + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "text3", + "value" => new TextLineValue( "" ) + ) + ), + new Field( + array( + "languageCode" => "cro-HR", + "fieldDefIdentifier" => "text1", + "value" => new TextLineValue( "jedan" ) + ) + ), + new Field( + array( + "languageCode" => "cro-HR", + "fieldDefIdentifier" => "text2", + "value" => new TextLineValue( "dva" ) + ) + ), + new Field( + array( + "languageCode" => "cro-HR", + "fieldDefIdentifier" => "text3", + "value" => new TextLineValue( "" ) + ) + ), + ); + } + + /** + * @return \eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition[] + */ + protected function getFieldDefinitions() + { + return array( + new FieldDefinition( + array( + "id" => "1", + "identifier" => "text1", + "fieldTypeIdentifier" => "ezstring" + ) + ), + new FieldDefinition( + array( + "id" => "2", + "identifier" => "text2", + "fieldTypeIdentifier" => "ezstring" + ) + ), + new FieldDefinition( + array( + "id" => "3", + "identifier" => "text3", + "fieldTypeIdentifier" => "ezstring" + ) + ), + ); + } + + /** + * Builds stubbed content for testing purpose. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function buildTestContent( $nameSchema = "<name_schema>", $urlAliasSchema = "<urlalias_schema>" ) + { + $contentType = new ContentType( + array( + "nameSchema" => $nameSchema, + "urlAliasSchema" => $urlAliasSchema, + "fieldDefinitions" => $this->getFieldDefinitions() + ) + ); + $contentInfo = new ContentInfo( + array( + "contentType" => $contentType + ) + ); + $versionInfo = new VersionInfo( + array( + "contentInfo" => $contentInfo, + "languageCodes" => array( "eng-GB", "cro-HR" ) + ) + ); + + return new Content( + array( + "internalFields" => $this->getFields(), + "versionInfo" => $versionInfo + ) + ); + } + + /** + * @param object $service + * @param array $configuration + */ + protected function setConfiguration( $service, array $configuration ) + { + $refObject = new \ReflectionObject( $service ); + $refProperty = $refObject->getProperty( 'settings' ); + $refProperty->setAccessible( true ); + $refProperty->setValue( + $service, + $configuration + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/ObjectStateBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/ObjectStateBase.php new file mode 100644 index 0000000..2b9c477 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/ObjectStateBase.php @@ -0,0 +1,966 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\ObjectStateBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectState; +use eZ\Publish\Core\Repository\Values\ObjectState\ObjectStateGroup; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for object state Service + */ +abstract class ObjectStateBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectState::__construct + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup::__construct + */ + public function testNewClass() + { + $objectState = new ObjectState(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'identifier' => null, + 'priority' => null, + 'defaultLanguageCode' => null, + 'languageCodes' => null, + 'names' => array(), + 'descriptions' => array() + ), + $objectState + ); + + $objectStateGroup = new ObjectStateGroup(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'identifier' => null, + 'defaultLanguageCode' => null, + 'languageCodes' => null, + 'names' => array(), + 'descriptions' => array() + ), + $objectStateGroup + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectState::__get + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup::__get + */ + public function testMissingProperty() + { + try + { + $objectState = new ObjectState(); + $value = $objectState->notDefined; + $this->fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + + try + { + $objectStateGroup = new ObjectStateGroup(); + $value = $objectStateGroup->notDefined; + $this->fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectState::__set + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup::__set + */ + public function testReadOnlyProperty() + { + try + { + $objectState = new ObjectState(); + $objectState->id = 42; + $this->fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + + try + { + $objectStateGroup = new ObjectStateGroup(); + $objectStateGroup->id = 42; + $this->fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectState::__isset + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup::__isset + */ + public function testIsPropertySet() + { + $objectState = new ObjectState(); + $value = isset( $objectState->notDefined ); + $this->assertEquals( false, $value ); + + $value = isset( $objectState->id ); + $this->assertEquals( true, $value ); + + $objectStateGroup = new ObjectStateGroup(); + $value = isset( $objectStateGroup->notDefined ); + $this->assertEquals( false, $value ); + + $value = isset( $objectStateGroup->id ); + $this->assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectState::__unset + * @covers \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup::__unset + */ + public function testUnsetProperty() + { + $objectState = new ObjectState( array( "id" => 2 ) ); + try + { + unset( $objectState->id ); + $this->fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + + $objectStateGroup = new ObjectStateGroup( array( "id" => 2 ) ); + try + { + unset( $objectStateGroup->id ); + $this->fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test service method for creating object state group + * @covers \eZ\Publish\API\Repository\ObjectStateService::createObjectStateGroup + */ + public function testCreateGroup() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupCreateStruct = $objectStateService->newObjectStateGroupCreateStruct( 'test' ); + $groupCreateStruct->defaultLanguageCode = 'eng-GB'; + $groupCreateStruct->names = array( 'eng-GB' => 'Test' ); + $groupCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdGroup = $objectStateService->createObjectStateGroup( $groupCreateStruct ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $createdGroup + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 3, + 'identifier' => 'test', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB' ), + 'names' => array( 'eng-GB' => 'Test' ), + 'descriptions' => array( 'eng-GB' => 'Test description' ) + ), + $createdGroup + ); + } + + /** + * Test service method for creating object state group throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\ObjectStateService::createObjectStateGroup + */ + public function testCreateGroupThrowsInvalidArgumentException() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupCreateStruct = $objectStateService->newObjectStateGroupCreateStruct( 'ez_lock' ); + $groupCreateStruct->defaultLanguageCode = 'eng-GB'; + $groupCreateStruct->names = array( 'eng-GB' => 'Test' ); + $groupCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $objectStateService->createObjectStateGroup( $groupCreateStruct ); + } + + /** + * Test service method for loading object state group + * @covers \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroup + */ + public function testLoadObjectStateGroup() + { + $group = $this->repository->getObjectStateService()->loadObjectStateGroup( 2 ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $group + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 2, + 'identifier' => 'ez_lock', + 'defaultLanguageCode' => 'eng-US', + 'languageCodes' => array( 'eng-US' ), + 'names' => array( 'eng-US' => 'Lock' ), + 'descriptions' => array( 'eng-US' => '' ) + ), + $group + ); + } + + /** + * Test service method for loading object state group throwing NotFoundException + * @covers \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadObjectStateGroupThrowsNotFoundException() + { + $this->repository->getObjectStateService()->loadObjectStateGroup( PHP_INT_MAX ); + } + + /** + * Test service method for loading object state groups + * @covers \eZ\Publish\API\Repository\ObjectStateService::loadObjectStateGroups + */ + public function testLoadObjectStateGroups() + { + $groups = $this->repository->getObjectStateService()->loadObjectStateGroups(); + + $this->assertInternalType( 'array', $groups ); + $this->assertCount( 1, $groups ); + + foreach ( $groups as $group ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $group + ); + } + } + + /** + * Test service method for loading object states within a group + * @covers \eZ\Publish\API\Repository\ObjectStateService::loadObjectStates + */ + public function testLoadObjectStates() + { + $objectStateService = $this->repository->getObjectStateService(); + $group = $objectStateService->loadObjectStateGroup( 2 ); + $states = $this->repository->getObjectStateService()->loadObjectStates( $group ); + + $this->assertInternalType( 'array', $states ); + $this->assertCount( 2, $states ); + + $priority = 0; + foreach ( $states as $state ) + { + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $state + ); + + $this->assertEquals( $group->id, $state->getObjectStateGroup()->id ); + $this->assertEquals( $priority, $state->priority ); + $priority++; + } + } + + /** + * Test service method for updating object state group + * @covers \eZ\Publish\API\Repository\ObjectStateService::updateObjectStateGroup + */ + public function testUpdateObjectStateGroup() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupUpdateStruct = $objectStateService->newObjectStateGroupUpdateStruct(); + $groupUpdateStruct->identifier = 'test'; + $groupUpdateStruct->defaultLanguageCode = 'eng-GB'; + $groupUpdateStruct->names = array( 'eng-GB' => 'Test' ); + $groupUpdateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $group = $objectStateService->loadObjectStateGroup( 2 ); + + $updatedGroup = $objectStateService->updateObjectStateGroup( $group, $groupUpdateStruct ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $updatedGroup + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 2, + 'identifier' => 'test', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB' ), + 'names' => array( 'eng-GB' => 'Test' ), + 'descriptions' => array( 'eng-GB' => 'Test description' ) + ), + $updatedGroup + ); + } + + /** + * Test service method for partially updating object state group + * @covers \eZ\Publish\API\Repository\ObjectStateService::updateObjectStateGroup + */ + public function testPartiallyUpdateObjectStateGroup() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupUpdateStruct = $objectStateService->newObjectStateGroupUpdateStruct(); + $groupUpdateStruct->defaultLanguageCode = 'eng-GB'; + $groupUpdateStruct->names = array( 'eng-GB' => 'Test' ); + + $group = $objectStateService->loadObjectStateGroup( 2 ); + + $updatedGroup = $objectStateService->updateObjectStateGroup( $group, $groupUpdateStruct ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $updatedGroup + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 2, + 'identifier' => 'ez_lock', + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB' ), + 'names' => array( 'eng-GB' => 'Test' ), + // descriptions array should have an empty value for eng-GB + // without the original descriptions + // since the descriptions were not in the update struct and we're changing default language + 'descriptions' => array( 'eng-GB' => '' ) + ), + $updatedGroup + ); + } + + /** + * Test service method for updating object state group throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\ObjectStateService::updateObjectStateGroup + */ + public function testUpdateObjectStateGroupThrowsInvalidArgumentException() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupCreateStruct = $objectStateService->newObjectStateGroupCreateStruct( 'test' ); + $groupCreateStruct->defaultLanguageCode = 'eng-GB'; + $groupCreateStruct->names = array( 'eng-GB' => 'Test' ); + $groupCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdGroup = $objectStateService->createObjectStateGroup( $groupCreateStruct ); + + $groupUpdateStruct = $objectStateService->newObjectStateGroupUpdateStruct(); + $groupUpdateStruct->identifier = 'ez_lock'; + + $objectStateService->updateObjectStateGroup( $createdGroup, $groupUpdateStruct ); + } + + /** + * Test service method for deleting object state group + * @covers \eZ\Publish\API\Repository\ObjectStateService::deleteObjectStateGroup + */ + public function testDeleteObjectStateGroup() + { + $objectStateService = $this->repository->getObjectStateService(); + + $group = $objectStateService->loadObjectStateGroup( 2 ); + + $objectStateService->deleteObjectStateGroup( $group ); + + try + { + $objectStateService->loadObjectStateGroup( 2 ); + $this->fail( "Successfully loaded object state group after deleting it" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + try + { + $objectStateService->loadObjectState( 1 ); + $this->fail( "Successfully loaded object state from deleted group" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + try + { + $objectStateService->loadObjectState( 2 ); + $this->fail( "Successfully loaded object state from deleted group" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test service method for creating object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::createObjectState + */ + public function testCreateObjectState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $group = $objectStateService->loadObjectStateGroup( 2 ); + + $stateCreateStruct = $objectStateService->newObjectStateCreateStruct( 'test' ); + $stateCreateStruct->priority = 2; + $stateCreateStruct->defaultLanguageCode = 'eng-GB'; + $stateCreateStruct->names = array( 'eng-GB' => 'Test' ); + $stateCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdState = $objectStateService->createObjectState( + $group, + $stateCreateStruct + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $createdState + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 3, + 'identifier' => 'test', + 'priority' => 2, + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB' ), + 'names' => array( 'eng-GB' => 'Test' ), + 'descriptions' => array( 'eng-GB' => 'Test description' ) + ), + $createdState + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $createdState->getObjectStateGroup() + ); + + $this->assertEquals( $group->id, $createdState->getObjectStateGroup()->id ); + } + + /** + * Test service method for creating object state in empty group + * @covers \eZ\Publish\API\Repository\ObjectStateService::createObjectState + */ + public function testCreateObjectStateInEmptyGroup() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupCreateStruct = $objectStateService->newObjectStateGroupCreateStruct( 'test' ); + $groupCreateStruct->defaultLanguageCode = 'eng-GB'; + $groupCreateStruct->names = array( 'eng-GB' => 'Test' ); + $groupCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdGroup = $objectStateService->createObjectStateGroup( $groupCreateStruct ); + + $stateCreateStruct = $objectStateService->newObjectStateCreateStruct( 'test' ); + $stateCreateStruct->priority = 2; + $stateCreateStruct->defaultLanguageCode = 'eng-GB'; + $stateCreateStruct->names = array( 'eng-GB' => 'Test' ); + $stateCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdState = $objectStateService->createObjectState( + $createdGroup, + $stateCreateStruct + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $createdState + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 3, + 'identifier' => 'test', + 'priority' => 0, + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB' ), + 'names' => array( 'eng-GB' => 'Test' ), + 'descriptions' => array( 'eng-GB' => 'Test description' ) + ), + $createdState + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $createdState->getObjectStateGroup() + ); + + $this->assertEquals( $createdGroup->id, $createdState->getObjectStateGroup()->id ); + $this->assertGreaterThan( 0, $objectStateService->getContentCount( $createdState ) ); + } + + /** + * Test service method for creating object state throwing InvalidArgumentException + * @covers \eZ\Publish\API\Repository\ObjectStateService::createObjectState + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateObjectStateThrowsInvalidArgumentException() + { + $objectStateService = $this->repository->getObjectStateService(); + + $group = $objectStateService->loadObjectStateGroup( 2 ); + + $stateCreateStruct = $objectStateService->newObjectStateCreateStruct( 'not_locked' ); + $stateCreateStruct->priority = 2; + $stateCreateStruct->defaultLanguageCode = 'eng-GB'; + $stateCreateStruct->names = array( 'eng-GB' => 'Test' ); + $stateCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $objectStateService->createObjectState( + $group, + $stateCreateStruct + ); + } + + /** + * Test service method for loading object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::loadObjectState + */ + public function testLoadObjectState() + { + $state = $this->repository->getObjectStateService()->loadObjectState( 1 ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $state + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'identifier' => 'not_locked', + 'priority' => 0, + 'defaultLanguageCode' => 'eng-US', + 'languageCodes' => array( 'eng-US' ), + 'names' => array( 'eng-US' => 'Not locked' ), + 'descriptions' => array( 'eng-US' => '' ) + ), + $state + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $state->getObjectStateGroup() + ); + + $this->assertEquals( 2, $state->getObjectStateGroup()->id ); + } + + /** + * Test service method for loading object state throwing NotFoundException + * @covers \eZ\Publish\API\Repository\ObjectStateService::loadObjectState + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadObjectStateThrowsNotFoundException() + { + $this->repository->getObjectStateService()->loadObjectState( PHP_INT_MAX ); + } + + /** + * Test service method for updating object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::updateObjectState + */ + public function testUpdateObjectState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $stateUpdateStruct = $objectStateService->newObjectStateUpdateStruct(); + $stateUpdateStruct->identifier = 'test'; + $stateUpdateStruct->defaultLanguageCode = 'eng-GB'; + $stateUpdateStruct->names = array( 'eng-GB' => 'Test' ); + $stateUpdateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $state = $objectStateService->loadObjectState( 1 ); + + $updatedState = $objectStateService->updateObjectState( $state, $stateUpdateStruct ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $updatedState + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'identifier' => 'test', + 'priority' => 0, + 'defaultLanguageCode' => 'eng-GB', + 'languageCodes' => array( 'eng-GB' ), + 'names' => array( 'eng-GB' => 'Test' ), + 'descriptions' => array( 'eng-GB' => 'Test description' ) + ), + $updatedState + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $updatedState->getObjectStateGroup() + ); + + $this->assertEquals( $state->getObjectStateGroup()->id, $updatedState->getObjectStateGroup()->id ); + } + + /** + * Test service method for partially updating object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::updateObjectState + */ + public function testPartiallyUpdateObjectState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $stateUpdateStruct = $objectStateService->newObjectStateUpdateStruct(); + $stateUpdateStruct->identifier = 'test'; + $stateUpdateStruct->names = array( 'eng-US' => 'Test' ); + + $state = $objectStateService->loadObjectState( 1 ); + + $updatedState = $objectStateService->updateObjectState( $state, $stateUpdateStruct ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $updatedState + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'identifier' => 'test', + 'priority' => 0, + 'defaultLanguageCode' => 'eng-US', + 'languageCodes' => array( 'eng-US' ), + 'names' => array( 'eng-US' => 'Test' ), + // Original value of empty description for eng-US should be kept + 'descriptions' => array( 'eng-US' => '' ) + ), + $updatedState + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $updatedState->getObjectStateGroup() + ); + + $this->assertEquals( $state->getObjectStateGroup()->id, $updatedState->getObjectStateGroup()->id ); + } + + /** + * Test service method for updating object state throwing InvalidArgumentException + * @covers \eZ\Publish\API\Repository\ObjectStateService::updateObjectState + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testUpdateObjectStateThrowsInvalidArgumentException() + { + $objectStateService = $this->repository->getObjectStateService(); + + $stateUpdateStruct = $objectStateService->newObjectStateUpdateStruct(); + $stateUpdateStruct->identifier = 'locked'; + + $state = $objectStateService->loadObjectState( 1 ); + + $objectStateService->updateObjectState( $state, $stateUpdateStruct ); + } + + /** + * Test service method for setting the priority of object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::setPriorityOfObjectState + */ + public function testSetPriorityOfObjectState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $state = $objectStateService->loadObjectState( 2 ); + $objectStateService->setPriorityOfObjectState( $state, 0 ); + + $firstState = $objectStateService->loadObjectState( 1 ); + $this->assertEquals( 1, $firstState->priority ); + + $secondState = $objectStateService->loadObjectState( 2 ); + $this->assertEquals( 0, $secondState->priority ); + } + + /** + * Test service method for deleting object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::deleteObjectState + */ + public function testDeleteObjectState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $state = $objectStateService->loadObjectState( 1 ); + $objectStateService->deleteObjectState( $state ); + + try + { + $objectStateService->loadObjectState( 1 ); + $this->fail( "Successfully loaded object state after deleting it" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + $this->assertEquals( 0, $objectStateService->getContentCount( $state ) ); + $this->assertGreaterThan( + 0, + $objectStateService->getContentCount( + $objectStateService->loadObjectState( 2 ) + ) + ); + } + + /** + * Test service method for setting the object state to content + * @covers \eZ\Publish\API\Repository\ObjectStateService::setContentState + */ + public function testSetContentState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $state = $objectStateService->loadObjectState( 2 ); + $group = $state->getObjectStateGroup(); + $contentInfo = $this->repository->getContentService()->loadContentInfo( 4 ); + $objectStateService->setContentState( + $contentInfo, + $group, + $state + ); + + $newObjectState = $objectStateService->getContentState( $contentInfo, $group ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $newObjectState + ); + + $this->assertEquals( 2, $newObjectState->id ); + } + + /** + * Test service method for setting the object state to content throwing InvalidArgumentException + * @covers \eZ\Publish\API\Repository\ObjectStateService::setContentState + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testSetContentStateThrowsInvalidArgumentException() + { + $objectStateService = $this->repository->getObjectStateService(); + + $groupCreateStruct = $objectStateService->newObjectStateGroupCreateStruct( 'test' ); + $groupCreateStruct->defaultLanguageCode = 'eng-GB'; + $groupCreateStruct->names = array( 'eng-GB' => 'Test' ); + $groupCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdGroup = $objectStateService->createObjectStateGroup( $groupCreateStruct ); + + $stateCreateStruct = $objectStateService->newObjectStateCreateStruct( 'test' ); + $stateCreateStruct->priority = 2; + $stateCreateStruct->defaultLanguageCode = 'eng-GB'; + $stateCreateStruct->names = array( 'eng-GB' => 'Test' ); + $stateCreateStruct->descriptions = array( 'eng-GB' => 'Test description' ); + + $createdState = $objectStateService->createObjectState( + $createdGroup, + $stateCreateStruct + ); + + $objectStateService->setContentState( + $this->repository->getContentService()->loadContentInfo( 4 ), + $objectStateService->loadObjectStateGroup( 2 ), + $createdState + ); + } + + /** + * Test service method for getting the object state of content + * @covers \eZ\Publish\API\Repository\ObjectStateService::getContentState + */ + public function testGetContentState() + { + $objectStateService = $this->repository->getObjectStateService(); + + $objectState = $objectStateService->getContentState( + $this->repository->getContentService()->loadContentInfo( 4 ), + $objectStateService->loadObjectStateGroup( 2 ) + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectState', + $objectState + ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'identifier' => 'not_locked', + 'priority' => 0, + 'defaultLanguageCode' => 'eng-US', + 'languageCodes' => array( 'eng-US' ), + 'names' => array( 'eng-US' => 'Not locked' ), + 'descriptions' => array( 'eng-US' => '' ) + ), + $objectState + ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroup', + $objectState->getObjectStateGroup() + ); + + $this->assertEquals( 2, $objectState->getObjectStateGroup()->id ); + } + + /** + * Test service method for getting the count of content assigned to object state + * @covers \eZ\Publish\API\Repository\ObjectStateService::getContentCount + */ + public function testGetContentCount() + { + $objectStateService = $this->repository->getObjectStateService(); + $state = $objectStateService->loadObjectState( 1 ); + $count = $objectStateService->getContentCount( $state ); + + $this->assertGreaterThan( 0, $count ); + } + + /** + * Test service method for creating a new object state create struct object + * @covers \eZ\Publish\API\Repository\ObjectStateService::newObjectStateCreateStruct + */ + public function testNewObjectStateCreateStruct() + { + $objectStateCreateStruct = $this->repository->getObjectStateService()->newObjectStateCreateStruct( 'test' ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateCreateStruct', + $objectStateCreateStruct + ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => 'test', + 'priority' => false, + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null + ), + $objectStateCreateStruct + ); + } + + /** + * Test service method for creating a new object state update struct object + * @covers \eZ\Publish\API\Repository\ObjectStateService::newObjectStateUpdateStruct + */ + public function testNewObjectStateUpdateStruct() + { + $objectStateUpdateStruct = $this->repository->getObjectStateService()->newObjectStateUpdateStruct(); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateUpdateStruct', + $objectStateUpdateStruct + ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null + ), + $objectStateUpdateStruct + ); + } + + /** + * Test service method for creating a new object state group create struct object + * @covers \eZ\Publish\API\Repository\ObjectStateService::newObjectStateGroupCreateStruct + */ + public function testNewObjectStateGroupCreateStruct() + { + $objectStateGroupCreateStruct = $this->repository->getObjectStateService()->newObjectStateGroupCreateStruct( 'test' ); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupCreateStruct', + $objectStateGroupCreateStruct + ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => 'test', + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null + ), + $objectStateGroupCreateStruct + ); + } + + /** + * Test service method for creating a new object state group update struct object + * @covers \eZ\Publish\API\Repository\ObjectStateService::newObjectStateGroupUpdateStruct + */ + public function testNewObjectStateGroupUpdateStruct() + { + $objectStateGroupUpdateStruct = $this->repository->getObjectStateService()->newObjectStateGroupUpdateStruct(); + + $this->assertInstanceOf( + '\\eZ\\Publish\\API\\Repository\\Values\\ObjectState\\ObjectStateGroupUpdateStruct', + $objectStateGroupUpdateStruct + ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + 'defaultLanguageCode' => null, + 'names' => null, + 'descriptions' => null + ), + $objectStateGroupUpdateStruct + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/RepositoryTest.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/RepositoryTest.php new file mode 100644 index 0000000..f48ee57 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/RepositoryTest.php @@ -0,0 +1,193 @@ +<?php +/** + * File containing the RepositoryTest class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; + +/** + * @group repository + */ +abstract class RepositoryTest extends BaseServiceTest +{ + /** + * Test repository instance + * @covers \eZ\Publish\API\Repository\Repository + */ + public function testRepositoryInstance() + { + self::assertInstanceOf( 'eZ\Publish\API\Repository\Repository', $this->repository ); + } + + /** + * Test repository method + * @covers \eZ\Publish\API\Repository\Repository::canUser + */ + public function testCanUser() + { + self::markTestIncomplete( "Not implemented: " . __METHOD__ ); + } + + /** + * Test repository method + * @covers \eZ\Publish\API\Repository\Repository::hasAccess + */ + public function testHasAccess() + { + self::markTestIncomplete( "Not implemented: " . __METHOD__ ); + } + + /** + * Test repository method + * @covers \eZ\Publish\API\Repository\Repository::setCurrentUser + */ + public function testSetCurrentUser() + { + self::markTestIncomplete( "Not implemented: " . __METHOD__ ); + } + + /** + * Test repository method + * @covers \eZ\Publish\API\Repository\Repository::getCurrentUser + */ + public function testGetCurrentUser() + { + self::markTestIncomplete( "Not implemented: " . __METHOD__ ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getContentService + */ + public function testGetContentService() + { + $service = $this->repository->getContentService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\ContentService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getContentTypeService + */ + public function testGetContentTypeService() + { + $service = $this->repository->getContentTypeService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\ContentTypeService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getFieldTypeService + */ + public function testGetFieldTypeService() + { + $service = $this->repository->getFieldTypeService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\FieldTypeService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getContentLanguageService + */ + public function testGetContentLanguageService() + { + $service = $this->repository->getContentLanguageService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\LanguageService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getLocationService + */ + public function testGetLocationService() + { + $service = $this->repository->getLocationService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\LocationService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getObjectStateService + */ + public function testGetObjectStateService() + { + $service = $this->repository->getObjectStateService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\ObjectStateService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getRoleService + */ + public function testGetRoleService() + { + $service = $this->repository->getRoleService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\RoleService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getSearchService + */ + public function testGetSearchService() + { + $service = $this->repository->getSearchService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\SearchService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getSectionService + */ + public function testGetSectionService() + { + $service = $this->repository->getSectionService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\SectionService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getTrashService + */ + public function testGetTrashService() + { + $service = $this->repository->getTrashService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\TrashService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getURLAliasService + */ + public function testGetURLAliasService() + { + $service = $this->repository->getURLAliasService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\URLAliasService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getURLWildcardService + */ + public function testGetURLWildcardService() + { + $service = $this->repository->getURLWildcardService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\URLWildcardService', $service ); + } + + /** + * Test service method + * @covers \eZ\Publish\API\Repository\Repository::getUserService + */ + public function testGetUserService() + { + $service = $this->repository->getUserService(); + self::assertInstanceOf( 'eZ\Publish\API\Repository\UserService', $service ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/RoleBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/RoleBase.php new file mode 100644 index 0000000..030d3f1 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/RoleBase.php @@ -0,0 +1,924 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\RoleBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\Values\User\Role; +use eZ\Publish\Core\Repository\Values\User\Policy; +use eZ\Publish\API\Repository\Values\User\Limitation; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for Role Service + */ +abstract class RoleBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\User\Role::__construct + * @covers \eZ\Publish\API\Repository\Values\User\Policy::__construct + */ + public function testNewClass() + { + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'identifier' => null, + // @todo uncomment when support for multilingual names and descriptions is added + // 'mainLanguageCode' => null, + 'policies' => array() + ), + new Role() + ); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'roleId' => null, + 'module' => null, + 'function' => null, + 'limitations' => array() + ), + new Policy() + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\User\Role::__get + * @covers \eZ\Publish\API\Repository\Values\User\Policy::__get + */ + public function testMissingProperty() + { + try + { + $role = new Role(); + $value = $role->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + + try + { + $policy = new Policy(); + $value = $policy->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\User\Role::__set + * @covers \eZ\Publish\API\Repository\Values\User\Policy::__set + */ + public function testReadOnlyProperty() + { + try + { + $role = new Role(); + $role->id = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + + try + { + $policy = new Policy(); + $policy->id = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\User\Role::__isset + * @covers \eZ\Publish\API\Repository\Values\User\Policy::__isset + */ + public function testIsPropertySet() + { + $role = new Role(); + $value = isset( $role->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $role->id ); + self::assertEquals( true, $value ); + + $policy = new Policy(); + $value = isset( $policy->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $policy->id ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\User\Role::__unset + * @covers \eZ\Publish\API\Repository\Values\User\Policy::__unset + */ + public function testUnsetProperty() + { + $role = new Role( array( "id" => 1 ) ); + try + { + unset( $role->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + + $policy = new Policy( array( "id" => 1 ) ); + try + { + unset( $policy->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test creating a role + * @covers \eZ\Publish\API\Repository\RoleService::createRole + */ + public function testCreateRole() + { + $roleService = $this->repository->getRoleService(); + $roleCreateStruct = $roleService->newRoleCreateStruct( 'ultimate_permissions' ); + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreateStruct->mainLanguageCode = 'eng-GB'; + // $roleCreateStruct->names = array( 'eng-GB' => 'Ultimate permissions' ); + // $roleCreateStruct->descriptions = array( 'eng-GB' => 'This is a role with ultimate permissions' ); + + $createdRole = $roleService->createRole( $roleCreateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $createdRole ); + self::assertGreaterThan( 0, $createdRole->id ); + + /* @todo uncomment when support for multilingual names and descriptions is added + self::assertEquals( + array( + 'eng-GB' => $roleCreateStruct->names['eng-GB'] + ), + $createdRole->getNames() + ); + + self::assertEquals( + array( + 'eng-GB' => $roleCreateStruct->descriptions['eng-GB'] + ), + $createdRole->getDescriptions() + ); + */ + + $this->assertPropertiesCorrect( + array( + 'identifier' => $roleCreateStruct->identifier, + 'policies' => array() + ), + $createdRole + ); + } + + /** + * Test creating a role throwing InvalidArgumentException + * @expectedException \eZ\Publish\Core\Base\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\RoleService::createRole + */ + public function testCreateRoleThrowsInvalidArgumentException() + { + $roleService = $this->repository->getRoleService(); + $roleCreateStruct = $roleService->newRoleCreateStruct( 'Anonymous' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreateStruct->mainLanguageCode = 'eng-GB'; + // $roleCreateStruct->names = array( 'eng-GB' => 'Anonymous' ); + // $roleCreateStruct->descriptions = array( 'eng-GB' => 'Anonymous role' ); + + $roleService->createRole( $roleCreateStruct ); + } + + /** + * Test creating a role with policies + * @covers \eZ\Publish\API\Repository\RoleService::createRole + */ + public function testCreateRoleWithPolicies() + { + $roleService = $this->repository->getRoleService(); + + $limitation1 = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $limitation1->limitationValues = array( '12', '13', '14' ); + + $limitation2 = new \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation(); + $limitation2->limitationValues = array( '5', '6' ); + + $limitation3 = new \eZ\Publish\API\Repository\Values\User\Limitation\OwnerLimitation(); + $limitation3->limitationValues = array( '1' ); + + $limitation4 = new \eZ\Publish\API\Repository\Values\User\Limitation\UserGroupLimitation(); + $limitation4->limitationValues = array( '1', '2' ); + + $policyCreateStruct1 = $roleService->newPolicyCreateStruct( 'content', 'read' ); + $policyCreateStruct1->addLimitation( $limitation1 ); + $policyCreateStruct1->addLimitation( $limitation2 ); + + $policyCreateStruct2 = $roleService->newPolicyCreateStruct( 'content', 'edit' ); + $policyCreateStruct2->addLimitation( $limitation3 ); + $policyCreateStruct2->addLimitation( $limitation4 ); + + $roleCreateStruct = $roleService->newRoleCreateStruct( 'ultimate_permissions' ); + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleCreateStruct->mainLanguageCode = 'eng-GB'; + // $roleCreateStruct->names = array( 'eng-GB' => 'Ultimate permissions' ); + // $roleCreateStruct->descriptions = array( 'eng-GB' => 'This is a role with ultimate permissions' ); + + $roleCreateStruct->addPolicy( $policyCreateStruct1 ); + $roleCreateStruct->addPolicy( $policyCreateStruct2 ); + + $createdRole = $roleService->createRole( $roleCreateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $createdRole ); + self::assertGreaterThan( 0, $createdRole->id ); + + /* @todo uncomment when support for multilingual names and descriptions is added + self::assertEquals( + array( + 'eng-GB' => $roleCreateStruct->names['eng-GB'] + ), + $createdRole->getNames() + ); + + self::assertEquals( + array( + 'eng-GB' => $roleCreateStruct->descriptions['eng-GB'] + ), + $createdRole->getDescriptions() + ); + */ + + $this->assertPropertiesCorrect( + array( + 'identifier' => $roleCreateStruct->identifier + ), + $createdRole + ); + + self::assertCount( 2, $createdRole->getPolicies() ); + + foreach ( $createdRole->getPolicies() as $policy ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Policy', $policy ); + self::assertGreaterThan( 0, $policy->id ); + self::assertEquals( $createdRole->id, $policy->roleId ); + + self::assertCount( 2, $policy->getLimitations() ); + + foreach ( $policy->getLimitations() as $limitation ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Limitation', $limitation ); + + if ( $policy->module == 'content' && $policy->function == 'read' ) + { + switch ( $limitation->getIdentifier() ) + { + case Limitation::CONTENTTYPE: + self::assertEquals( $limitation1->limitationValues, $limitation->limitationValues ); + break; + + case Limitation::SECTION: + self::assertEquals( $limitation2->limitationValues, $limitation->limitationValues ); + break; + + default: + self::fail( 'Created role contains limitations not defined with create struct' ); + } + } + else if ( $policy->module == 'content' && $policy->function == 'edit' ) + { + switch ( $limitation->getIdentifier() ) + { + case Limitation::OWNER: + self::assertEquals( $limitation3->limitationValues, $limitation->limitationValues ); + break; + + case Limitation::USERGROUP: + self::assertEquals( $limitation4->limitationValues, $limitation->limitationValues ); + break; + + default: + self::fail( 'Created role contains limitations not defined with create struct' ); + } + } + else + { + self::fail( 'Created role contains policy not defined with create struct' ); + } + } + } + } + + /** + * Test updating role + * @covers \eZ\Publish\API\Repository\RoleService::updateRole + */ + public function testUpdateRole() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Anonymous' ); + + $roleUpdateStruct = $roleService->newRoleUpdateStruct(); + $roleUpdateStruct->identifier = "Anonymous 2"; + + // @todo uncomment when support for multilingual names and descriptions is added + // $roleUpdateStruct->mainLanguageCode = 'eng-US'; + // $roleUpdateStruct->names['eng-US'] = 'Anonymous 2'; + // $roleUpdateStruct->descriptions['eng-US'] = 'Anonymous 2 role'; + + $updatedRole = $roleService->updateRole( $role, $roleUpdateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $updatedRole ); + + // @todo: enable +/* + self::assertEquals( + array( + 'eng-US' => $roleUpdateStruct->names['eng-US'] + ), + $updatedRole->getNames() + ); + + self::assertEquals( + array( + 'eng-US' => $roleUpdateStruct->descriptions['eng-US'] + ), + $updatedRole->getDescriptions() + ); +*/ + $this->assertPropertiesCorrect( + array( + 'id' => $role->id, + 'identifier' => $roleUpdateStruct->identifier, + 'policies' => $role->getPolicies() + ), + $updatedRole + ); + } + + /** + * Test updating role throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\RoleService::updateRole + */ + public function testUpdateRoleThrowsInvalidArgumentException() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Anonymous' ); + + $roleUpdateStruct = $roleService->newRoleUpdateStruct(); + $roleUpdateStruct->identifier = 'Administrator'; + + $roleService->updateRole( $role, $roleUpdateStruct ); + } + + /** + * Test adding policy to role + * @covers \eZ\Publish\API\Repository\RoleService::addPolicy + */ + public function testAddPolicy() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + $policyCount = count( $role->getPolicies() ); + + $limitation1 = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $limitation1->limitationValues = array( '12', '13', '14' ); + + $limitation2 = new \eZ\Publish\API\Repository\Values\User\Limitation\SectionLimitation(); + $limitation2->limitationValues = array( '5', '6' ); + + $policyCreateStruct = $roleService->newPolicyCreateStruct( 'content', 'read' ); + $policyCreateStruct->addLimitation( $limitation1 ); + $policyCreateStruct->addLimitation( $limitation2 ); + + $updatedRole = $roleService->addPolicy( $role, $policyCreateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $updatedRole ); + self::assertCount( $policyCount + 1, $updatedRole->getPolicies() ); + + foreach ( $updatedRole->getPolicies() as $policy ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Policy', $policy ); + self::assertGreaterThan( 0, $policy->id ); + self::assertEquals( $role->id, $policy->roleId ); + } + } + + /** + * Test removing policy from the role + * @covers \eZ\Publish\API\Repository\RoleService::removePolicy + */ + public function testRemovePolicy() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + $policies = $role->getPolicies(); + $policyCount = count( $policies ); + + self::assertGreaterThan( 0, $policyCount ); + + $updatedRole = $roleService->removePolicy( $role, $policies[0] ); + self::assertCount( $policyCount - 1, $updatedRole->getPolicies() ); + } + + /** + * Test updating policies of a role, depends on proper eZ Publish clean data + * which has a number of policies and limitations applied to Anonymous role + * @covers \eZ\Publish\API\Repository\RoleService::updatePolicy + */ + public function testUpdatePolicy() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + $policies = $role->getPolicies(); + $policy = $policies[2]; + + $limitation = new \eZ\Publish\API\Repository\Values\User\Limitation\ContentTypeLimitation(); + $limitation->limitationValues = array( '12', '13', '14' ); + + $policyUpdateStruct = $roleService->newPolicyUpdateStruct(); + $policyUpdateStruct->addLimitation( $limitation ); + + $updatedPolicy = $roleService->updatePolicy( $policy, $policyUpdateStruct ); + + $this->assertPropertiesCorrect( + array( + 'id' => $policy->id, + 'roleId' => $policy->roleId, + 'module' => $policy->module, + 'function' => $policy->function + ), + $updatedPolicy + ); + + $limitations = $updatedPolicy->getLimitations(); + + self::assertCount( 1, $limitations ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Limitation', $limitations[0] ); + self::assertEquals( Limitation::CONTENTTYPE, $limitations[0]->getIdentifier() ); + self::assertEquals( $limitation->limitationValues, $limitations[0]->limitationValues ); + } + + /** + * Test loading role by id + * @covers \eZ\Publish\API\Repository\RoleService::loadRole + */ + public function testLoadRole() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $role ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'identifier' => 'Anonymous' + ), + $role + ); + } + + /** + * Test loading role by id throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\RoleService::loadRole + */ + public function testLoadRoleThrowsNotFoundException() + { + $roleService = $this->repository->getRoleService(); + + $roleService->loadRole( PHP_INT_MAX ); + } + + /** + * Test loading role by identifier + * @covers \eZ\Publish\API\Repository\RoleService::loadRoleByIdentifier + */ + public function testLoadRoleByIdentifier() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRoleByIdentifier( 'Anonymous' ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $role ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'identifier' => 'Anonymous' + ), + $role + ); + } + + /** + * Test loading role by identifier throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\RoleService::loadRoleByIdentifier + */ + public function testLoadRoleByIdentifierThrowsNotFoundException() + { + $roleService = $this->repository->getRoleService(); + + $roleService->loadRoleByIdentifier( 'non-existing' ); + } + + /** + * Test loading all roles + * @covers \eZ\Publish\API\Repository\RoleService::loadRoles + */ + public function testLoadRoles() + { + $roleService = $this->repository->getRoleService(); + + $roles = $roleService->loadRoles(); + self::assertInternalType( 'array', $roles ); + self::assertGreaterThan( 0, count( $roles ) ); + + foreach ( $roles as $role ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $role ); + self::assertGreaterThan( 0, $role->id ); + } + } + + /** + * Test deleting a role + * @covers \eZ\Publish\API\Repository\RoleService::deleteRole + */ + public function testDeleteRole() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Role', $role ); + + $roleService->deleteRole( $role ); + + try + { + $roleService->loadRole( 1 ); + self::fail( 'Succeeded loading role after deleting it' ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test loading policies by user ID + * @covers \eZ\Publish\API\Repository\RoleService::loadPoliciesByUserId + */ + public function testLoadPoliciesByUserId() + { + $roleService = $this->repository->getRoleService(); + + $policies = $roleService->loadPoliciesByUserId( 10 ); + self::assertInternalType( 'array', $policies ); + self::assertNotEmpty( $policies ); + + foreach ( $policies as $policy ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\Policy', $policy ); + self::assertGreaterThan( 0, $policy->id ); + self::assertGreaterThan( 0, $policy->roleId ); + } + } + + /** + * Test loading policies by non existing user ID + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\RoleService::loadPoliciesByUserId + */ + public function testLoadPoliciesByNonExistingUserId() + { + $roleService = $this->repository->getRoleService(); + + $roleService->loadPoliciesByUserId( PHP_INT_MAX ); + } + + /** + * Test assigning role to user group + * @covers \eZ\Publish\API\Repository\RoleService::assignRoleToUserGroup + */ + public function testAssignRoleToUserGroup() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + $userGroup = $this->repository->getUserService()->loadUserGroup( 12 ); + + $originalAssignmentCount = count( $roleService->getRoleAssignmentsForUserGroup( $userGroup ) ); + + $roleService->assignRoleToUserGroup( $role, $userGroup ); + $newAssignmentCount = count( $roleService->getRoleAssignmentsForUserGroup( $userGroup ) ); + self::assertEquals( $originalAssignmentCount + 1, $newAssignmentCount ); + } + + /** + * Test unassigning role from user group + * @covers \eZ\Publish\API\Repository\RoleService::unassignRoleFromUserGroup + */ + public function testUnassignRoleFromUserGroup() + { + $roleService = $this->repository->getRoleService(); + + $anonymousRole = $roleService->loadRole( 1 ); + $anonymousUserGroup = $this->repository->getUserService()->loadUserGroup( 42 ); + + $originalAssignmentCount = count( $roleService->getRoleAssignmentsForUserGroup( $anonymousUserGroup ) ); + + $roleService->unassignRoleFromUserGroup( $anonymousRole, $anonymousUserGroup ); + $newAssignmentCount = count( $roleService->getRoleAssignmentsForUserGroup( $anonymousUserGroup ) ); + self::assertEquals( $originalAssignmentCount - 1, $newAssignmentCount ); + } + + /** + * Test unassigning role from user group + * + * But on current admin user so he lacks access to read roles. + * + * @covers \eZ\Publish\API\Repository\RoleService::unassignRoleFromUserGroup + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testUnassignRoleFromUserGroupUnauthorizedException() + { + $roleService = $this->repository->getRoleService(); + + try + { + $adminRole = $roleService->loadRole( 2 ); + $adminUserGroup = $this->repository->getUserService()->loadUserGroup( 12 ); + $roleService->getRoleAssignmentsForUserGroup( $adminUserGroup ); + $roleService->unassignRoleFromUserGroup( $adminRole, $adminUserGroup ); + } + catch ( \Exception $e ) + { + self::fail( "Unexpected exception: " . $e->getMessage() . " \n[" . $e->getFile() . ' (' . $e->getLine() . ')]' ); + } + + $roleService->getRoleAssignmentsForUserGroup( $adminUserGroup ); + } + + /** + * Test unassigning role from user group which is not already assigned to the group + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\RoleService::unassignRoleFromUserGroup + */ + public function testUnassignRoleFromUserGroupThrowsInvalidArgumentException() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 1 ); + $userGroup = $this->repository->getUserService()->loadUserGroup( 12 ); + + $roleService->unassignRoleFromUserGroup( $role, $userGroup ); + } + + /** + * Test assigning role to user + * @covers \eZ\Publish\API\Repository\RoleService::assignRoleToUser + */ + public function testAssignRoleToUser() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 2 ); + $user = $this->repository->getUserService()->loadUser( 14 ); + + $originalAssignmentCount = count( $roleService->getRoleAssignmentsForUser( $user ) ); + + $roleService->assignRoleToUser( $role, $user ); + $newAssignmentCount = count( $roleService->getRoleAssignmentsForUser( $user ) ); + self::assertEquals( $originalAssignmentCount + 1, $newAssignmentCount ); + } + + /** + * Test unassigning role from user + * @covers \eZ\Publish\API\Repository\RoleService::unassignRoleFromUser + */ + public function testUnassignRoleFromUser() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 2 ); + $user = $this->repository->getUserService()->loadUser( 14 ); + + $originalAssignmentCount = count( $roleService->getRoleAssignmentsForUser( $user ) ); + + $roleService->assignRoleToUser( $role, $user ); + $newAssignmentCount = count( $roleService->getRoleAssignmentsForUser( $user ) ); + self::assertEquals( $originalAssignmentCount + 1, $newAssignmentCount ); + + $roleService->unassignRoleFromUser( $role, $user ); + $finalAssignmentCount = count( $roleService->getRoleAssignmentsForUser( $user ) ); + self::assertEquals( $newAssignmentCount - 1, $finalAssignmentCount ); + } + + /** + * Test unassigning role from user which is not already assigned to the user + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\RoleService::unassignRoleFromUser + */ + public function testUnassignRoleFromUserThrowsInvalidArgumentException() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 2 ); + $user = $this->repository->getUserService()->loadUser( 14 ); + + $roleService->unassignRoleFromUser( $role, $user ); + } + + /** + * Test fetching all role assignments for specified role + * @covers \eZ\Publish\API\Repository\RoleService::getRoleAssignments + */ + public function testGetRoleAssignments() + { + $roleService = $this->repository->getRoleService(); + + $role = $roleService->loadRole( 2 ); + + $roleAssignments = $roleService->getRoleAssignments( $role ); + + self::assertInternalType( "array", $roleAssignments ); + self::assertNotEmpty( $roleAssignments ); + + foreach ( $roleAssignments as $assignment ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\RoleAssignment', $assignment ); + } + } + + /** + * Test fetching role assignments for specified user + * @covers \eZ\Publish\API\Repository\RoleService::getRoleAssignmentsForUser + */ + public function testGetRoleAssignmentsForUser() + { + $roleService = $this->repository->getRoleService(); + + $user = $this->repository->getUserService()->loadUser( 14 ); + $role = $roleService->loadRole( 2 ); + $roleService->assignRoleToUser( $role, $user ); + + $userAssignments = $roleService->getRoleAssignmentsForUser( $user ); + + self::assertInternalType( "array", $userAssignments ); + self::assertNotEmpty( $userAssignments ); + + foreach ( $userAssignments as $assignment ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserRoleAssignment', $assignment ); + } + } + + /** + * Test fetching role assignments for specified user group + * @covers \eZ\Publish\API\Repository\RoleService::getRoleAssignmentsForUserGroup + */ + public function testGetRoleAssignmentsForUserGroup() + { + $userGroup = $this->repository->getUserService()->loadUserGroup( 12 ); + + $userGroupAssignments = $this->repository->getRoleService()->getRoleAssignmentsForUserGroup( $userGroup ); + + self::assertInternalType( "array", $userGroupAssignments ); + self::assertNotEmpty( $userGroupAssignments ); + + foreach ( $userGroupAssignments as $assignment ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment', $assignment ); + } + } + + /** + * Test creating new RoleCreateStruct + * @covers \eZ\Publish\API\Repository\RoleService::newRoleCreateStruct + */ + public function testNewRoleCreateStruct() + { + $roleService = $this->repository->getRoleService(); + + $roleCreateStruct = $roleService->newRoleCreateStruct( "Ultimate permissions" ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\RoleCreateStruct', $roleCreateStruct ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => "Ultimate permissions", + // @todo uncomment when support for multilingual names and descriptions is added + // 'mainLanguageCode' => null, + // 'names' => null, + // 'descriptions' => null + ), + $roleCreateStruct + ); + + self::assertEquals( "Ultimate permissions", $roleCreateStruct->identifier ); + self::assertInternalType( "array", $roleCreateStruct->getPolicies() ); + self::assertEmpty( $roleCreateStruct->getPolicies() ); + } + + /** + * Test creating new PolicyCreateStruct + * @covers \eZ\Publish\API\Repository\RoleService::newPolicyCreateStruct + */ + public function testNewPolicyCreateStruct() + { + $roleService = $this->repository->getRoleService(); + + $policyCreateStruct = $roleService->newPolicyCreateStruct( "content", "read" ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\PolicyCreateStruct', $policyCreateStruct ); + + $this->assertPropertiesCorrect( + array( + 'module' => 'content', + 'function' => 'read' + ), + $policyCreateStruct + ); + + self::assertInternalType( "array", $policyCreateStruct->getLimitations() ); + self::assertEmpty( $policyCreateStruct->getLimitations() ); + } + + /** + * Test creating new RoleUpdateStruct + * @covers \eZ\Publish\API\Repository\RoleService::newRoleUpdateStruct + */ + public function testNewRoleUpdateStruct() + { + $roleService = $this->repository->getRoleService(); + + $roleUpdateStruct = $roleService->newRoleUpdateStruct(); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\RoleUpdateStruct', $roleUpdateStruct ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + // @todo uncomment when support for multilingual names and descriptions is added + // 'mainLanguageCode' => null, + // 'names' => null, + // 'descriptions' => null + ), + $roleUpdateStruct + ); + } + + /** + * Test creating new PolicyUpdateStruct + * @covers \eZ\Publish\API\Repository\RoleService::newPolicyUpdateStruct + */ + public function testNewPolicyUpdateStruct() + { + $roleService = $this->repository->getRoleService(); + + $policyUpdateStruct = $roleService->newPolicyUpdateStruct(); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct', $policyUpdateStruct ); + + self::assertInternalType( "array", $policyUpdateStruct->getLimitations() ); + self::assertEmpty( $policyUpdateStruct->getLimitations() ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/SearchBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/SearchBase.php new file mode 100644 index 0000000..d0088a6 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/SearchBase.php @@ -0,0 +1,136 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\SearchBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Search\SearchResult; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\SPI\Persistence\Content as SPIContent; +use eZ\Publish\SPI\Persistence\Content\VersionInfo as SPIVersionInfo; +use eZ\Publish\SPI\Persistence\Content\ContentInfo as SPIContentInfo; + +/** + * Test case for Content service + */ +abstract class SearchBase extends BaseServiceTest +{ + /** + * Test for the findContent() method. + * + * @covers \eZ\Publish\Core\Repository\SearchService::findContent + */ + public function testFindContent() + { + /* BEGIN: Use Case */ + $searchService = $this->repository->getSearchService(); + $query = new Query( + array( + "criterion" => new Criterion\ContentId( array( 4 ) ), + "offset" => 0 + ) + ); + + $searchResult = $searchService->findContent( + $query, + array(), + false + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\Search\\SearchResult", + $searchResult + ); + + $this->assertEquals( 1, $searchResult->totalCount ); + $this->assertCount( $searchResult->totalCount, $searchResult->searchHits ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\Search\\SearchHit", + reset( $searchResult->searchHits ) + ); + } + + /** + * Test for the findContent() method. + * + * @covers \eZ\Publish\Core\Repository\SearchService::findContent + */ + public function testFindContentWithLanguageFilter() + { + /* BEGIN: Use Case */ + $searchService = $this->repository->getSearchService(); + $query = new Query( + array( + "criterion" => new Criterion\ContentId( array( 4 ) ), + "offset" => 0 + ) + ); + + $searchResult = $searchService->findContent( + $query, + array( "languages" => array( "eng-US" ) ), + false + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\Search\\SearchResult", + $searchResult + ); + + $this->assertEquals( 1, $searchResult->totalCount ); + $this->assertCount( $searchResult->totalCount, $searchResult->searchHits ); + $this->assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\Search\\SearchHit", + reset( $searchResult->searchHits ) + ); + } + + /** + * Test for the findSingle() method. + * + * @covers \eZ\Publish\Core\Repository\SearchService::findSingle + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testFindSingleThrowsNotFoundException() + { + /* BEGIN: Use Case */ + $searchService = $this->repository->getSearchService(); + + // Throws an exception because content with given id does not exist + $searchResult = $searchService->findSingle( + new Criterion\ContentId( array( PHP_INT_MAX ) ), + array( "languages" => array( "eng-GB" ) ), + false + ); + /* END: Use Case */ + } + + /** + * Test for the findSingle() method. + * + * @covers \eZ\Publish\Core\Repository\SearchService::findSingle + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testFindSingleThrowsInvalidArgumentException() + { + /* BEGIN: Use Case */ + $searchService = $this->repository->getSearchService(); + + // Throws an exception because more than one result was returned for the given query + $searchResult = $searchService->findSingle( + new Criterion\ContentId( array( 4, 10 ) ), + array( "languages" => array( "eng-GB" ) ) + ); + /* END: Use Case */ + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/SectionBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/SectionBase.php new file mode 100644 index 0000000..a3aa8e5 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/SectionBase.php @@ -0,0 +1,407 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\SectionTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\Content\Section; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; + +/** + * Test case for Section Service using InMemory storage class + */ +abstract class SectionBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\Content\Section::__construct + */ + public function testNewClass() + { + $section = new Section(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'identifier' => null, + 'name' => null + ), + $section + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\Content\Section::__get + */ + public function testMissingProperty() + { + try + { + $section = new Section(); + $value = $section->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\Content\Section::__set + */ + public function testReadOnlyProperty() + { + try + { + $section = new Section(); + $section->id = 22; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\Content\Section::__isset + */ + public function testIsPropertySet() + { + $section = new Section(); + $value = isset( $section->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $section->id ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\Content\Section::__unset + */ + public function testUnsetProperty() + { + $section = new Section( array( 'id' => 1 ) ); + try + { + unset( $section->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test service function for creating sections + * @covers \eZ\Publish\Core\Repository\SectionService::createSection + */ + public function testCreateSection() + { + $sectionService = $this->repository->getSectionService(); + + $sectionCreateStruct = $sectionService->newSectionCreateStruct(); + $sectionCreateStruct->identifier = 'test'; + $sectionCreateStruct->name = 'Test'; + + $createdSection = $sectionService->createSection( $sectionCreateStruct ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Section', $createdSection ); + self::assertGreaterThan( 0, $createdSection->id ); + + $this->assertStructPropertiesCorrect( + $sectionCreateStruct, + $createdSection + ); + } + + /** + * Test service function for creating sections throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\SectionService::createSection + */ + public function testCreateSectionThrowsInvalidArgumentException() + { + $sectionService = $this->repository->getSectionService(); + + $sectionCreateStruct = $sectionService->newSectionCreateStruct(); + $sectionCreateStruct->identifier = 'standard'; + $sectionCreateStruct->name = 'Standard'; + + $sectionService->createSection( $sectionCreateStruct ); + } + + /** + * Test service function for updating sections + * @covers \eZ\Publish\Core\Repository\SectionService::updateSection + */ + public function testUpdateSection() + { + $sectionService = $this->repository->getSectionService(); + + $loadedSection = $sectionService->loadSection( 1 ); + + $sectionUpdateStruct = $sectionService->newSectionUpdateStruct(); + $sectionUpdateStruct->identifier = 'test'; + $sectionUpdateStruct->name = 'Test'; + + $updatedSection = $sectionService->updateSection( $loadedSection, $sectionUpdateStruct ); + + self::assertEquals( $loadedSection->id, $updatedSection->id ); + + $this->assertStructPropertiesCorrect( + $sectionUpdateStruct, + $updatedSection + ); + } + + /** + * Test service function for updating sections + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\Core\Repository\SectionService::updateSection + */ + public function testUpdateSectionThrowsInvalidArgumentException() + { + $sectionService = $this->repository->getSectionService(); + + $loadedSection = $sectionService->loadSectionByIdentifier( 'standard' ); + + $sectionUpdateStruct = $sectionService->newSectionUpdateStruct(); + $sectionUpdateStruct->identifier = 'media'; + $sectionUpdateStruct->name = 'Media'; + + $sectionService->updateSection( $loadedSection, $sectionUpdateStruct ); + } + + /** + * Test service function for loading sections + * @covers \eZ\Publish\Core\Repository\SectionService::loadSection + */ + public function testLoadSection() + { + $sectionService = $this->repository->getSectionService(); + + $section = $sectionService->loadSection( 1 ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'name' => 'Standard', + 'identifier' => 'standard' + ), + $section + ); + } + + /** + * Test service function for loading sections throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\SectionService::loadSection + */ + public function testLoadSectionThrowsNotFoundException() + { + $sectionService = $this->repository->getSectionService(); + + $sectionService->loadSection( PHP_INT_MAX ); + } + + /** + * Test service function for loading all sections + * @covers \eZ\Publish\Core\Repository\SectionService::loadSections + */ + public function testLoadSections() + { + $sections = $this->repository->getSectionService()->loadSections(); + + self::assertInternalType( 'array', $sections ); + self::assertGreaterThan( 0, count( $sections ) ); + + foreach ( $sections as $section ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Section', $section ); + } + } + + /** + * Test service function for loading section by identifier + * @covers \eZ\Publish\Core\Repository\SectionService::loadSectionByIdentifier + */ + public function testLoadSectionByIdentifier() + { + $sectionService = $this->repository->getSectionService(); + + $section = $sectionService->loadSectionByIdentifier( 'standard' ); + + $this->assertPropertiesCorrect( + array( + 'id' => 1, + 'name' => 'Standard', + 'identifier' => 'standard' + ), + $section + ); + } + + /** + * Test service function for loading section by identifier throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\SectionService::loadSectionByIdentifier + */ + public function testLoadSectionByIdentifierThrowsNotFoundException() + { + $sectionService = $this->repository->getSectionService(); + + $sectionService->loadSectionByIdentifier( 'non-existing' ); + } + + /** + * Test service function for counting content assigned to section + * @covers \eZ\Publish\Core\Repository\SectionService::countAssignedContents + */ + public function testCountAssignedContents() + { + $sectionService = $this->repository->getSectionService(); + + $section = $sectionService->loadSection( 1 ); + $contentCount = $sectionService->countAssignedContents( $section ); + + self::assertGreaterThan( 0, $contentCount ); + + $sectionCreateStruct = $sectionService->newSectionCreateStruct(); + $sectionCreateStruct->identifier = 'test'; + $sectionCreateStruct->name = 'Test'; + + $newSection = $sectionService->createSection( $sectionCreateStruct ); + $contentCount = $sectionService->countAssignedContents( $newSection ); + + self::assertEquals( 0, $contentCount ); + } + + /** + * Test service function for assigning section to content + * @covers \eZ\Publish\Core\Repository\SectionService::assignSection + */ + public function testAssignSection() + { + $sectionService = $this->repository->getSectionService(); + $contentService = $this->repository->getContentService(); + + $section = $sectionService->loadSection( 1 ); + $contentInfo = $contentService->loadContentInfo( 4 ); + + self::assertEquals( 2, $contentInfo->sectionId ); + + $sectionService->assignSection( $contentInfo, $section ); + + $contentInfo = $contentService->loadContentInfo( 4 ); + + self::assertEquals( $section->id, $contentInfo->sectionId ); + } + + /** + * Test service function for deleting sections + * @covers \eZ\Publish\Core\Repository\SectionService::deleteSection + */ + public function testDeleteSection() + { + $sectionService = $this->repository->getSectionService(); + + $sectionCreateStruct = $sectionService->newSectionCreateStruct(); + $sectionCreateStruct->identifier = 'test'; + $sectionCreateStruct->name = 'Test'; + + $newSection = $sectionService->createSection( $sectionCreateStruct ); + $sectionService->deleteSection( $newSection ); + + try + { + $sectionService->loadSection( $newSection->id ); + self::fail( 'Section is still returned after being deleted' ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test service function for deleting sections throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\Core\Repository\SectionService::deleteSection + */ + public function testDeleteSectionThrowsNotFoundException() + { + $sectionService = $this->repository->getSectionService(); + + $section = new Section( array( 'id' => PHP_INT_MAX ) ); + + $sectionService->deleteSection( $section ); + } + + /** + * Test service function for deleting sections throwing BadStateException + * @expectedException \eZ\Publish\API\Repository\Exceptions\BadStateException + * @covers \eZ\Publish\Core\Repository\SectionService::deleteSection + */ + public function testDeleteSectionThrowsBadStateException() + { + $sectionService = $this->repository->getSectionService(); + + $section = $sectionService->loadSection( 1 ); + + $sectionService->deleteSection( $section ); + } + + /** + * Test service function for creating new SectionCreateStruct + * @covers \eZ\Publish\Core\Repository\SectionService::newSectionCreateStruct + */ + public function testNewSectionCreateStruct() + { + $sectionService = $this->repository->getSectionService(); + + $sectionCreateStruct = $sectionService->newSectionCreateStruct(); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\SectionCreateStruct', $sectionCreateStruct ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + 'name' => null + ), + $sectionCreateStruct + ); + } + + /** + * Test service function for creating new SectionUpdateStruct + * @covers \eZ\Publish\Core\Repository\SectionService::newSectionUpdateStruct + */ + public function testNewSectionUpdateStruct() + { + $sectionService = $this->repository->getSectionService(); + + $sectionUpdateStruct = $sectionService->newSectionUpdateStruct(); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct', $sectionUpdateStruct ); + + $this->assertPropertiesCorrect( + array( + 'identifier' => null, + 'name' => null + ), + $sectionUpdateStruct + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/TrashBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/TrashBase.php new file mode 100644 index 0000000..0e70f0a --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/TrashBase.php @@ -0,0 +1,470 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\TrashBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\Values\Content\TrashItem; +use eZ\Publish\Core\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for Trash Service + */ +abstract class TrashBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\Content\TrashItem::__construct + */ + public function testNewClass() + { + $trashItem = new TrashItem(); + + $this->assertPropertiesCorrect( + array( + 'id' => null, + 'priority' => null, + 'hidden' => null, + 'invisible' => null, + 'remoteId' => null, + 'parentLocationId' => null, + 'pathString' => null, + 'depth' => null, + 'sortField' => null, + 'sortOrder' => null, + ), + $trashItem + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\Content\TrashItem::__get + */ + public function testMissingProperty() + { + try + { + $trashItem = new TrashItem(); + $value = $trashItem->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\Content\TrashItem::__set + */ + public function testReadOnlyProperty() + { + try + { + $trashItem = new TrashItem(); + $trashItem->id = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\Content\TrashItem::__isset + */ + public function testIsPropertySet() + { + $trashItem = new TrashItem(); + $value = isset( $trashItem->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $trashItem->id ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\Content\TrashItem::__unset + */ + public function testUnsetProperty() + { + $trashItem = new TrashItem( array( "id" => 2 ) ); + try + { + unset( $trashItem->id ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test loading a trash item + * @covers \eZ\Publish\API\Repository\TrashService::loadTrashItem + */ + public function testLoadTrashItem() + { + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $trashItem = $location = $trashService->trash( $locationService->loadLocation( 44 ) ); + $loadedTrashItem = $trashService->loadTrashItem( $location->id ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\TrashItem', $trashItem ); + + self::assertSameClassPropertiesCorrect( + array( + 'id', + 'priority', + 'hidden', + 'invisible', + 'remoteId', + 'parentLocationId', + 'pathString', + 'depth', + 'sortField', + 'sortOrder', + ), + $trashItem, + $loadedTrashItem + ); + } + + /** + * Test loading a trash item throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\TrashService::loadTrashItem + */ + public function testLoadTrashItemThrowsNotFoundException() + { + $trashService = $this->repository->getTrashService(); + $trashService->loadTrashItem( 44 ); + } + + /** + * Test sending a location to trash + * @covers \eZ\Publish\API\Repository\TrashService::trash + */ + public function testTrash() + { + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $location = $locationService->loadLocation( 44 ); + $trashItem = $trashService->trash( $location ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\TrashItem', $trashItem ); + + self::assertSameClassPropertiesCorrect( + array( + 'id', + 'priority', + 'hidden', + 'invisible', + 'remoteId', + 'parentLocationId', + 'pathString', + 'depth', + 'sortField', + 'sortOrder' + ), + $location, + $trashItem + ); + } + + /** + * Test sending a location to trash + * @covers \eZ\Publish\API\Repository\TrashService::trash + */ + public function testTrashUpdatesMainLocation() + { + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $contentInfo = $contentService->loadContentInfo( 42 ); + + // Create additional location that will become new main location + $location = $locationService->createLocation( + $contentInfo, + new LocationCreateStruct( array( "parentLocationId" => 2 ) ) + ); + + $trashService->trash( + $locationService->loadLocation( $contentInfo->mainLocationId ) + ); + + self::assertEquals( + $location->id, + $contentService->loadContentInfo( 42 )->mainLocationId + ); + } + + /** + * Test sending a location to trash + * @covers \eZ\Publish\API\Repository\TrashService::trash + */ + public function testTrashReturnsNull() + { + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + // Create additional location to trash + $location = $locationService->createLocation( + $contentService->loadContentInfo( 42 ), + new LocationCreateStruct( array( "parentLocationId" => 2 ) ) + ); + + $trashItem = $trashService->trash( $location ); + + self::assertNull( $trashItem ); + } + + /** + * Test recovering a location from trash to original location + * @covers \eZ\Publish\API\Repository\TrashService::recover + */ + public function testRecover() + { + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $location = $locationService->loadLocation( 44 ); + $trashItem = $trashService->trash( $location ); + + $recoveredLocation = $trashService->recover( $trashItem ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\Content\Location', $recoveredLocation ); + + self::assertSameClassPropertiesCorrect( + array( + 'priority', + 'hidden', + 'invisible', + 'remoteId', + 'parentLocationId', + 'depth', + 'sortField', + 'sortOrder' + ), + $location, + $recoveredLocation + ); + + $parentLocation = $locationService->loadLocation( $location->parentLocationId ); + $newPathString = $parentLocation->pathString . $recoveredLocation->id . '/'; + + self::assertEquals( $newPathString, $recoveredLocation->pathString ); + self::assertGreaterThan( 0, $recoveredLocation->id ); + self::assertEquals( $recoveredLocation->id, $recoveredLocation->contentInfo->mainLocationId ); + } + + /** + * Test recovering a non existing trash item + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\TrashService::recover + */ + public function testRecoverNonExistingTrashItem() + { + $trashService = $this->repository->getTrashService(); + + $trashItem = new TrashItem( array( "id" => PHP_INT_MAX, "parentLocationId" => PHP_INT_MAX ) ); + $trashService->recover( $trashItem ); + } + + /** + * Test recovering a location from trash to different location + * @covers \eZ\Publish\API\Repository\TrashService::recover + */ + public function testRecoverToDifferentLocation() + { + // @todo: remove creating test locations when field types are fully functional + // Create test locations + $deleteLocationId = $this->createTestContentLocation( 5 )->contentInfo->mainLocationId; + $recoverLocationId = $this->createTestContentLocation( 5 )->contentInfo->mainLocationId; + + /* BEGIN: Use Case */ + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $location = $locationService->loadLocation( $deleteLocationId ); + $trashItem = $trashService->trash( $location ); + + $newParentLocation = $locationService->loadLocation( $recoverLocationId ); + + $recoveredLocation = $trashService->recover( $trashItem, $newParentLocation ); + /* END: Use Case */ + + self::assertInstanceOf( "\\eZ\\Publish\\API\\Repository\\Values\\Content\\Location", $recoveredLocation ); + + self::assertSameClassPropertiesCorrect( + array( + "priority", + "hidden", + "invisible", + "remoteId", + "depth", + "sortField", + "sortOrder" + ), + $location, + $recoveredLocation, + array( "depth" ) + ); + + $parentLocation = $locationService->loadLocation( $recoveredLocation->parentLocationId ); + $newPathString = $parentLocation->pathString . $recoveredLocation->id . "/"; + + self::assertEquals( $parentLocation->depth + 1, $recoveredLocation->depth ); + self::assertEquals( $newPathString, $recoveredLocation->pathString ); + self::assertGreaterThan( 0, $recoveredLocation->id ); + self::assertEquals( $newParentLocation->id, $recoveredLocation->parentLocationId ); + } + + /** + * Test recovering a location from trash to non existing location + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\TrashService::recover + */ + public function testRecoverToNonExistingLocation() + { + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $location = $locationService->loadLocation( 44 ); + $trashItem = $trashService->trash( $location ); + + $newParentLocation = new Location( + array( + "id" => PHP_INT_MAX, + "parentLocationId" => PHP_INT_MAX + ) + ); + $trashService->recover( $trashItem, $newParentLocation ); + } + + /** + * Test deleting a trash item + * @covers \eZ\Publish\API\Repository\TrashService::deleteTrashItem + */ + public function testDeleteTrashItem() + { + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $location = $locationService->loadLocation( 44 ); + $trashItem = $trashService->trash( $location ); + + $trashService->deleteTrashItem( $trashItem ); + + try + { + $trashService->loadTrashItem( $trashItem->id ); + self::fail( "Succeeded loading deleted trash item" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test deleting a non existing trash item + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\TrashService::deleteTrashItem + */ + public function testDeleteNonExistingTrashItem() + { + $trashService = $this->repository->getTrashService(); + + $trashItem = new TrashItem( array( "id" => PHP_INT_MAX ) ); + $trashService->deleteTrashItem( $trashItem ); + } + + /** + * Test searching for trash items + * @covers \eZ\Publish\API\Repository\TrashService::findTrashItems + * @covers \eZ\Publish\API\Repository\TrashService::emptyTrash + */ + public function testFindTrashItemsAndEmptyTrash() + { + // @todo: remove creating test location when field types are fully functional + $newLocationId = $this->createTestContentLocation( 5 )->contentInfo->mainLocationId; + + $locationService = $this->repository->getLocationService(); + $trashService = $this->repository->getTrashService(); + + $searchResult = $trashService->findTrashItems( new Query() ); + $countBeforeTrashing = $searchResult->count; + + $location = $locationService->loadLocation( $newLocationId ); + $trashService->trash( $location ); + + $searchResult = $trashService->findTrashItems( new Query() ); + $countAfterTrashing = $searchResult->count; + + self::assertGreaterThan( $countBeforeTrashing, $countAfterTrashing ); + + $trashService->emptyTrash(); + $searchResult = $trashService->findTrashItems( new Query() ); + + self::assertEquals( 0, $searchResult->count ); + } + + /** + * @param int $parentLocationId + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function createTestContentLocation( $parentLocationId ) + { + $contentService = $this->repository->getContentService(); + $contentTypeService = $this->repository->getContentTypeService(); + // User Group content type + $contentType = $contentTypeService->loadContentType( 3 ); + + $contentCreate = $contentService->newContentCreateStruct( $contentType, 'eng-GB' ); + $contentCreate->setField( "name", "dummy value" ); + $contentCreate->sectionId = 1; + $contentCreate->ownerId = 14; + $contentCreate->remoteId = md5( uniqid( get_class( $this ), true ) ); + $contentCreate->alwaysAvailable = true; + + $locationCreates = array( + new LocationCreateStruct( + array( + //priority = 0 + //hidden = false + "remoteId" => md5( uniqid( get_class( $this ), true ) ), + //sortField = Location::SORT_FIELD_NAME + //sortOrder = Location::SORT_ORDER_ASC + "parentLocationId" => $parentLocationId + ) + ) + ); + + return $contentService->publishVersion( + $contentService->createContent( + $contentCreate, + $locationCreates + )->versionInfo + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/UrlAliasBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/UrlAliasBase.php new file mode 100644 index 0000000..8ecf601 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/UrlAliasBase.php @@ -0,0 +1,625 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\UrlAliasBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\Content\UrlAlias; +use eZ\Publish\SPI\Persistence\Content\UrlAlias as SPIUrlAlias; +use eZ\Publish\Core\Repository\Values\Content\Location; + +/** + * Test case for UrlAlias Service + */ +abstract class UrlAliasBase extends BaseServiceTest +{ + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupRootLocation() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->lookup( "" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "0-d41d8cd98f00b204e9800998ecf8427e", + "type" => UrlAlias::LOCATION, + "destination" => 2, + "path" => "/", + "languageCodes" => array( "eng-US", "eng-GB" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupAlwaysAvailable() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->lookup( "Users" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "0-9bc65c2abec141778ffaa729489f3e87", + "type" => UrlAlias::LOCATION, + "destination" => 5, + "path" => "/Users", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupAlwaysAvailableAlwaysFound() + { + $urlAliasService = $this->repository->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => array( "ger-DE" ), + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + + $urlAlias = $urlAliasService->lookup( "Users" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "0-9bc65c2abec141778ffaa729489f3e87", + "type" => UrlAlias::LOCATION, + "destination" => 5, + "path" => "/Users", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLookupThrowsNotFoundExceptionUrl() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAliasService->lookup( "jabberwocky" ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookup() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->lookup( "Media/Multimedia" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "9-2e5bc8831f7ae6a29530e7f1bbf2de9c", + "type" => UrlAlias::LOCATION, + "destination" => 53, + "path" => "/Media/Multimedia", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupCaseInsensitive() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->lookup( "MEDIA/MULTIMEDIA" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "9-2e5bc8831f7ae6a29530e7f1bbf2de9c", + "type" => UrlAlias::LOCATION, + "destination" => 53, + "path" => "/Media/Multimedia", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupWithLanguageCode() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->lookup( "Media/Multimedia", "eng-US" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "9-2e5bc8831f7ae6a29530e7f1bbf2de9c", + "type" => UrlAlias::LOCATION, + "destination" => 53, + "path" => "/Media/Multimedia", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLookupThrowsNotFoundExceptionTranslation() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAliasService->lookup( "Design/Plain-site", "eng-GB" ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupWithShowAllTranslations() + { + $urlAliasService = $this->repository->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => array( "ger-DE" ), + "showAllTranslations" => true, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + + $urlAlias = $urlAliasService->lookup( "Media/Multimedia" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "9-2e5bc8831f7ae6a29530e7f1bbf2de9c", + "type" => UrlAlias::LOCATION, + "destination" => 53, + "path" => "/Media/Multimedia", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the lookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::lookup + */ + public function testLookupHistory() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->lookup( "Users/Guest-accounts" ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "2-e57843d836e3af8ab611fde9e2139b3a", + "type" => UrlAlias::LOCATION, + "destination" => 12, + "path" => "/Users/Guest-accounts", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => true, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the reverseLookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::reverseLookup + */ + public function testReverseLookup() + { + $urlAliasService = $this->repository->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => array( + "eng-US" + ), + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + + $location = $this->getLocationStub( 53 ); + $urlAlias = $urlAliasService->reverseLookup( $location ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "9-2e5bc8831f7ae6a29530e7f1bbf2de9c", + "type" => UrlAlias::LOCATION, + "destination" => 53, + "path" => "/Media/Multimedia", + "languageCodes" => array( "eng-US" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => false, + "forward" => false, + ) + ), + $urlAlias + ); + } + + /** + * Test for the reverseLookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::reverseLookup + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testReverseLookupThrowsNotFoundException() + { + $urlAliasService = $this->repository->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => array( + "ger-DE" + ), + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + + $location = $this->getLocationStub( 56 ); + $urlAliasService->reverseLookup( $location ); + } + + public function providerForTestCreateUrlAlias() + { + return array( + array( "my/custom/alias", true, true ), + array( "/my/custom/alias ", false, false ), + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createUrlAlias + * @dataProvider providerForTestCreateUrlAlias + */ + public function testCreateUrlAlias( $path, $forwarding, $alwaysAvailable ) + { + $urlAliasService = $this->repository->getURLAliasService(); + + $location = $this->getLocationStub( 53 ); + $urlAlias = $urlAliasService->createUrlAlias( $location, $path, "eng-GB", $forwarding, $alwaysAvailable ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "42-724874d1be77f450a09b305fc1534afb", + "type" => UrlAlias::LOCATION, + "destination" => 53, + "path" => "/my/custom/alias", + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forwarding, + ) + ), + $urlAlias + ); + + self::assertEquals( + $urlAlias, + $urlAliasService->lookup( "my/custom/alias" ) + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createUrlAlias + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateUrlAliasThrowsInvalidArgumentException() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $location = $this->getLocationStub( 53 ); + $urlAliasService->createUrlAlias( $location, "some/path", "eng-GB", true, true ); + $urlAliasService->createUrlAlias( $location, "some/path", "eng-GB", true, true ); + } + + public function providerForTestCreateGlobalUrlAlias() + { + return array( + array( "my/global/alias", true, true ), + array( "/my/global/alias ", false, false ), + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createGlobalUrlAlias + * @dataProvider providerForTestCreateGlobalUrlAlias + */ + public function testCreateGlobalUrlAlias( $path, $forwarding, $alwaysAvailable ) + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAlias = $urlAliasService->createGlobalUrlAlias( "module:content/search", $path, "eng-GB", $forwarding, $alwaysAvailable ); + + self::assertEquals( + new UrlAlias( + array( + "id" => "42-724874d1be77f450a09b305fc1534afb", + "type" => UrlAlias::RESOURCE, + "destination" => "content/search", + "path" => "/my/global/alias", + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => $alwaysAvailable, + "isHistory" => false, + "isCustom" => true, + "forward" => $forwarding, + ) + ), + $urlAlias + ); + + self::assertEquals( + $urlAlias, + $urlAliasService->lookup( "my/global/alias" ) + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createGlobalUrlAlias + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateGlobalUrlAliasThrowsInvalidArgumentExceptionPath() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAliasService->createGlobalUrlAlias( "module:content/search", "some/path", "eng-GB", true, true ); + $urlAliasService->createGlobalUrlAlias( "module:content/search", "some/path", "eng-GB", true, true ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createGlobalUrlAlias + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateGlobalUrlAliasThrowsInvalidArgumentExceptionResource() + { + $urlAliasService = $this->repository->getURLAliasService(); + + $urlAliasService->createGlobalUrlAlias( "invalid/resource", "some/path", "eng-GB", true, true ); + } + + /** + * Test for the listGlobalAliases(() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listGlobalAliases + */ + public function testListGlobalAliases() + { + $urlAliasService = $this->repository->getURLAliasService(); + $count = 4; + + for ( $i = 0; $i < $count; $i++ ) + { + $urlAliasService->createGlobalUrlAlias( "module:content/search", "my/global/alias{$i}", "eng-GB", true, true ); + } + + $urlAliases = $urlAliasService->listGlobalAliases(); + + self::assertCount( $count, $urlAliases ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + new UrlAlias( + array( + "id" => "42-" . md5( "alias{$index}" ), + "type" => UrlAlias::RESOURCE, + "destination" => "content/search", + "path" => "/my/global/alias" . $index, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => true, + ) + ), + $urlAlias + ); + } + } + + /** + * Test for the listGlobalAliases(() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listGlobalAliases + */ + public function testListGlobalAliasesWithLanguageCode() + { + $urlAliasService = $this->repository->getURLAliasService(); + $count = 4; + $countFirst = 2; + + for ( $i = 0; $i < $count; $i++ ) + { + $languageCode = $countFirst > $i ? "eng-GB" : "eng-US"; + $urlAliasService->createGlobalUrlAlias( "module:content/search", "my/global/alias{$i}", $languageCode, true, true ); + } + + $urlAliases = $urlAliasService->listGlobalAliases( "eng-GB" ); + + self::assertCount( $countFirst, $urlAliases ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + new UrlAlias( + array( + "id" => "42-" . md5( "alias{$index}" ), + "type" => UrlAlias::RESOURCE, + "destination" => "content/search", + "path" => "/my/global/alias" . $index, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => true, + ) + ), + $urlAlias + ); + } + } + + /** + * Test for the listGlobalAliases(() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listGlobalAliases + */ + public function testListGlobalAliasesWithOffsetAndLimit() + { + $urlAliasService = $this->repository->getURLAliasService(); + $count = 6; + $offset = 2; + $limit = 3; + + for ( $i = 0; $i < $count; $i++ ) + { + $urlAliasService->createGlobalUrlAlias( "module:content/search", "my/global/alias{$i}", "eng-GB", true, true ); + } + + $urlAliases = $urlAliasService->listGlobalAliases( null, $offset, $limit ); + + self::assertCount( $limit, $urlAliases ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + new UrlAlias( + array( + "id" => "42-" . md5( "alias" . ( $index + $offset ) ), + "type" => UrlAlias::RESOURCE, + "destination" => "content/search", + "path" => "/my/global/alias" . ( $index + $offset ), + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => true, + "isHistory" => false, + "isCustom" => true, + "forward" => true, + ) + ), + $urlAlias + ); + } + } + + /** + * @param int $id + * + * @return \eZ\Publish\Core\Repository\Values\Content\Location + */ + protected function getLocationStub( $id = 42 ) + { + return new Location( array( "id" => $id ) ); + } + + /** + * @param object $urlAliasService + * @param array $configuration + */ + protected function setConfiguration( $urlAliasService, array $configuration ) + { + $refObject = new \ReflectionObject( $urlAliasService ); + $refProperty = $refObject->getProperty( 'settings' ); + $refProperty->setAccessible( true ); + $refProperty->setValue( + $urlAliasService, + $configuration + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/UrlWildcardBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/UrlWildcardBase.php new file mode 100644 index 0000000..5ad5932 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/UrlWildcardBase.php @@ -0,0 +1,416 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\UrlWildcardBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\API\Repository\Values\Content\URLWildcard; +use eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult; + +/** + * Test case for UrlWildcard Service + */ +abstract class UrlWildcardBase extends BaseServiceTest +{ + /** + * Test for the load() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::load + */ + public function testLoad() + { + $service = $this->repository->getURLWildcardService(); + $service->create( "/fruit/*", "/food/{1}", true ); + + $urlWildcard = $service->load( 1 ); + self::assertEquals( + new URLWildcard( + array( + "id" => 1, + "sourceUrl" => "/fruit/*", + "destinationUrl" => "/food/{1}", + "forward" => true + ) + ), + $urlWildcard + ); + } + + /** + * Test for the load() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::load + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testLoadThrowsNotFoundException() + { + $service = $this->repository->getURLWildcardService(); + + $service->load( 100 ); + } + + /** + * @return array + */ + public function providerForTestCreate() + { + return array( + array( "fruit", "food", true ), + array( " /fruit/ ", " /food/ ", true ), + array( "/fruit/*", "/food", false ), + array( "/fruit/*", "/food/{1}", true ), + array( "/fruit/*/*", "/food/{1}", true ), + array( "/fruit/*/*", "/food/{2}", true ), + array( "/fruit/*/*", "/food/{1}/{2}", true ), + ); + } + + /** + * Test for the create() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::create + * @dataProvider providerForTestCreate + */ + public function testCreate( $sourceUrl, $destinationUrl, $forward ) + { + $service = $this->repository->getURLWildcardService(); + $urlWildcard = $service->create( $sourceUrl, $destinationUrl, $forward ); + + self::assertEquals( + new URLWildcard( + array( + "id" => 1, + "sourceUrl" => "/" . trim( $sourceUrl, "/ " ), + "destinationUrl" => "/" . trim( $destinationUrl, "/ " ), + "forward" => $forward + ) + ), + $urlWildcard + ); + + return $urlWildcard; + } + + /** + * Test for the create() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::create + * @dataProvider providerForTestCreate + */ + public function testCreatedUrlWildcardIsLoadable( $sourceUrl, $destinationUrl, $forward ) + { + $service = $this->repository->getURLWildcardService(); + $urlWildcard = $service->create( $sourceUrl, $destinationUrl, $forward ); + + self::assertEquals( + $urlWildcard, + $service->load( $urlWildcard->id ) + ); + } + + /** + * Test for the create() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::create + * @depends testCreate + * @depends testLoad + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testCreateWithRollback() + { + $service = $this->repository->getURLWildcardService(); + + $this->repository->beginTransaction(); + $service->create( "fruit/*", "food/{1}", true ); + $this->repository->rollback(); + + $service->load( 1 ); + } + + /** + * Test for the create() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::create + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + */ + public function testCreateThrowsInvalidArgumentException() + { + $service = $this->repository->getURLWildcardService(); + + $service->create( "fruit/*", "food/{1}", true ); + $service->create( "/fruit/*", "food/{1}", true ); + } + + /** + * @return array + */ + public function providerForTestCreateThrowsContentValidationException() + { + return array( + array( "fruit", "food/{1}", true ), + array( "fruit/*", "food/{2}", false ), + array( "fruit/*/*", "food/{3}", true ), + ); + } + + /** + * Test for the create() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::create + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @dataProvider providerForTestCreateThrowsContentValidationException + */ + public function testCreateThrowsContentValidationException( $sourceUrl, $destinationUrl, $forward ) + { + $service = $this->repository->getURLWildcardService(); + + $service->create( $sourceUrl, $destinationUrl, $forward ); + } + + /** + * Test for the remove() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::remove + * @depends testCreate + * @depends testLoad + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testRemove() + { + $service = $this->repository->getURLWildcardService(); + + $service->create( "fruit/*", "food/{1}", true ); + $urlWildcard = $service->load( 1 ); + $service->remove( $urlWildcard ); + + $service->load( 1 ); + } + + /** + * Test for the remove() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::remove + * @depends testRemove + */ + public function testRemoveWithRollback() + { + $service = $this->repository->getURLWildcardService(); + + $service->create( "fruit/*", "food/{1}", true ); + $urlWildcard = $service->load( 1 ); + + $this->repository->beginTransaction(); + $service->remove( $urlWildcard ); + $this->repository->rollback(); + + self::assertEquals( + $urlWildcard, + $service->load( 1 ) + ); + } + + /** + * Test for the loadAll() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::loadAll + * @depends testCreate + */ + public function testLoadAll() + { + $service = $this->repository->getURLWildcardService(); + $service->create( "fruit/*", "food/{1}", true ); + $service->create( "vegetable/*", "food/{1}", true ); + + $urlWildcard = $service->loadAll(); + self::assertEquals( + array( + new URLWildcard( + array( + "id" => 1, + "sourceUrl" => "/fruit/*", + "destinationUrl" => "/food/{1}", + "forward" => true + ) + ), + new URLWildcard( + array( + "id" => 2, + "sourceUrl" => "/vegetable/*", + "destinationUrl" => "/food/{1}", + "forward" => true + ) + ), + ), + $urlWildcard + ); + } + + /** + * Test for the loadAll() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::loadAll + * @depends testCreate + */ + public function testLoadAllWithOffset() + { + $service = $this->repository->getURLWildcardService(); + $service->create( "fruit/*", "food/{1}", true ); + $service->create( "vegetable/*", "food/{1}", true ); + $service->create( "seed/*", "food/{1}", true ); + + $urlWildcard = $service->loadAll( 1 ); + self::assertEquals( + array( + new URLWildcard( + array( + "id" => 2, + "sourceUrl" => "/vegetable/*", + "destinationUrl" => "/food/{1}", + "forward" => true + ) + ), + new URLWildcard( + array( + "id" => 3, + "sourceUrl" => "/seed/*", + "destinationUrl" => "/food/{1}", + "forward" => true + ) + ), + ), + $urlWildcard + ); + } + + /** + * Test for the loadAll() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::loadAll + * @depends testCreate + */ + public function testLoadAllWithOffsetAndLimit() + { + $service = $this->repository->getURLWildcardService(); + $service->create( "fruit/*", "food/{1}", true ); + $service->create( "vegetable/*", "food/{1}", true ); + $service->create( "seed/*", "food/{1}", true ); + + $urlWildcard = $service->loadAll( 1, 1 ); + self::assertEquals( + array( + new URLWildcard( + array( + "id" => 2, + "sourceUrl" => "/vegetable/*", + "destinationUrl" => "/food/{1}", + "forward" => true + ) + ), + ), + $urlWildcard + ); + } + + /** + * @return array + */ + public function providerForTestTranslate() + { + return array( + array( + array( "/fruit/apricot", "/food/apricot", true ), + "/fruit/apricot", + "/food/apricot" + ), + array( + array( "/fruit/*", "/food/{1}", true ), + "/fruit/citrus", + "/food/citrus" + ), + array( + array( "/fruit/*", "/food/{1}", true ), + "/fruit/citrus/orange", + "/food/citrus/orange" + ), + array( + array( "/fruit/*/*", "/food/{2}", true ), + "/fruit/citrus/orange", + "/food/orange" + ), + array( + array( "/fruit/*/*", "/food/{1}/{2}", true ), + "/fruit/citrus/orange", + "/food/citrus/orange" + ), + ); + } + + /** + * Test for the translate() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::translate + * @dataProvider providerForTestTranslate + * @depends testCreate + */ + public function testTranslate( $createArray, $url, $uri ) + { + $service = $this->repository->getURLWildcardService(); + list( $createSourceUrl, $createDestinationUrl, $createForward ) = $createArray; + $service->create( $createSourceUrl, $createDestinationUrl, $createForward ); + + $translationResult = $service->translate( $url ); + + self::assertEquals( + new URLWildcardTranslationResult( + array( + "uri" => $uri, + "forward" => $createForward + ) + ), + $translationResult + ); + } + + /** + * Test for the translate() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::translate + */ + public function testTranslateUsesLongestMatchingWildcard() + { + $service = $this->repository->getURLWildcardService(); + $service->create( "/something/*", "/short", true ); + $service->create( "/something/something/*", "/long", false ); + + $translationResult = $service->translate( "/something/something/thing" ); + + self::assertEquals( + new URLWildcardTranslationResult( + array( + "uri" => "/long", + "forward" => false + ) + ), + $translationResult + ); + } + + /** + * Test for the translate() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::translate + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testTranslateThrowsNotFoundException() + { + $service = $this->repository->getURLWildcardService(); + + $service->translate( "cant/get/there/from/here" ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/UserBase.php b/eZ/Publish/Core/Repository/Tests/Service/Integration/UserBase.php new file mode 100644 index 0000000..5422b1a --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Integration/UserBase.php @@ -0,0 +1,929 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Integration\UserBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Integration\Base as BaseServiceTest; +use eZ\Publish\Core\Repository\Values\User\User; +use eZ\Publish\Core\Repository\Values\User\UserGroup; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Exceptions\PropertyNotFoundException as PropertyNotFound; +use eZ\Publish\API\Repository\Exceptions\PropertyReadOnlyException; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; + +/** + * Test case for User Service + */ +abstract class UserBase extends BaseServiceTest +{ + /** + * Test a new class and default values on properties + * @covers \eZ\Publish\API\Repository\Values\User\User::__construct + * @covers \eZ\Publish\API\Repository\Values\User\UserGroup::__construct + */ + public function testNewClass() + { + $user = new User(); + + $this->assertPropertiesCorrect( + array( + 'login' => null, + 'email' => null, + 'passwordHash' => null, + 'hashAlgorithm' => null, + 'maxLogin' => null, + 'enabled' => null + ), + $user + ); + + $group = new UserGroup(); + self::assertEquals( null, $group->parentId ); + self::assertEquals( null, $group->subGroupCount ); + + $this->assertPropertiesCorrect( + array( + 'parentId' => null, + 'subGroupCount' => null + ), + $group + ); + } + + /** + * Test retrieving missing property + * @covers \eZ\Publish\API\Repository\Values\User\User::__get + * @covers \eZ\Publish\API\Repository\Values\User\UserGroup::__get + */ + public function testMissingProperty() + { + try + { + $user = new User(); + $value = $user->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + + try + { + $userGroup = new UserGroup(); + $value = $userGroup->notDefined; + self::fail( "Succeeded getting non existing property" ); + } + catch ( PropertyNotFound $e ) + { + } + } + + /** + * Test setting read only property + * @covers \eZ\Publish\API\Repository\Values\User\User::__set + * @covers \eZ\Publish\API\Repository\Values\User\UserGroup::__set + */ + public function testReadOnlyProperty() + { + try + { + $user = new User(); + $user->login = 'user'; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + + try + { + $userGroup = new UserGroup(); + $userGroup->parentId = 42; + self::fail( "Succeeded setting read only property" ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test if property exists + * @covers \eZ\Publish\API\Repository\Values\User\User::__isset + * @covers \eZ\Publish\API\Repository\Values\User\UserGroup::__isset + */ + public function testIsPropertySet() + { + $user = new User(); + $value = isset( $user->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $user->login ); + self::assertEquals( true, $value ); + + $userGroup = new UserGroup(); + $value = isset( $userGroup->notDefined ); + self::assertEquals( false, $value ); + + $value = isset( $userGroup->parentId ); + self::assertEquals( true, $value ); + } + + /** + * Test unsetting a property + * @covers \eZ\Publish\API\Repository\Values\User\User::__unset + * @covers \eZ\Publish\API\Repository\Values\User\UserGroup::__unset + */ + public function testUnsetProperty() + { + $user = new User( array( "login" => 'admin' ) ); + try + { + unset( $user->login ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + + $userGroup = new UserGroup( array( "parentId" => 1 ) ); + try + { + unset( $userGroup->parentId ); + self::fail( 'Unsetting read-only property succeeded' ); + } + catch ( PropertyReadOnlyException $e ) + { + } + } + + /** + * Test creating new user group + * @covers \eZ\Publish\API\Repository\UserService::createUserGroup + */ + public function testCreateUserGroup() + { + $userService = $this->repository->getUserService(); + + $parentGroup = $userService->loadUserGroup( 4 ); + $userGroupCreateStruct = $userService->newUserGroupCreateStruct( "eng-GB" ); + $userGroupCreateStruct->ownerId = 14; + $userGroupCreateStruct->sectionId = 1; + $userGroupCreateStruct->setField( "name", "New group" ); + $userGroupCreateStruct->setField( "description", "This is a new group" ); + + $newGroup = $userService->createUserGroup( $userGroupCreateStruct, $parentGroup ); + + self::assertInstanceOf( "\\eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup", $newGroup ); + } + + /** + * Test creating new user group throwing ContentFieldValidationException + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @covers \eZ\Publish\API\Repository\UserService::createUserGroup + */ + public function testCreateUserGroupThrowsContentValidationException() + { + $userService = $this->repository->getUserService(); + + $parentGroup = $userService->loadUserGroup( 4 ); + $userGroupCreateStruct = $userService->newUserGroupCreateStruct( "eng-GB" ); + $userGroupCreateStruct->ownerId = 14; + $userGroupCreateStruct->sectionId = 1; + $userGroupCreateStruct->setField( "name", "" ); + + $userService->createUserGroup( $userGroupCreateStruct, $parentGroup ); + } + + /** + * Test creating new user group throwing ContentValidationException + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @covers \eZ\Publish\API\Repository\UserService::createUserGroup + */ + public function testCreateUserGroupThrowsContentValidationExceptionVariation() + { + $userService = $this->repository->getUserService(); + + $parentGroup = $userService->loadUserGroup( 4 ); + $userGroupCreateStruct = $userService->newUserGroupCreateStruct( "eng-GB" ); + + $userService->createUserGroup( $userGroupCreateStruct, $parentGroup ); + } + + /** + * Test loading a group + * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup + */ + public function testLoadUserGroup() + { + $userService = $this->repository->getUserService(); + $userGroup = $userService->loadUserGroup( 4 ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserGroup', $userGroup ); + } + + /** + * Test loading a group throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::loadUserGroup + */ + public function testLoadUserGroupThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + $userService->loadUserGroup( PHP_INT_MAX ); + } + + /** + * Test loading sub groups + * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups + */ + public function testLoadSubUserGroups() + { + $userService = $this->repository->getUserService(); + + $parentGroup = $userService->loadUserGroup( 4 ); + $userGroupCreateStruct = $userService->newUserGroupCreateStruct( "eng-GB" ); + $userGroupCreateStruct->ownerId = 14; + $userGroupCreateStruct->sectionId = 1; + $userGroupCreateStruct->setField( "name", "New group" ); + $userGroupCreateStruct->setField( "description", "This is a new group" ); + + $userService->createUserGroup( $userGroupCreateStruct, $parentGroup ); + + $subGroups = $userService->loadSubUserGroups( $parentGroup ); + + self::assertInternalType( 'array', $subGroups ); + self::assertNotEmpty( $subGroups ); + } + + /** + * Test loading sub groups throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::loadSubUserGroups + */ + public function testLoadSubUserGroupsThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + + $parentGroup = new UserGroup( + array( + 'content' => new Content( + array( + "versionInfo" => new VersionInfo( + array( "contentInfo" => new ContentInfo( array( "id" => PHP_INT_MAX ) ) ) + ), + "internalFields" => array() + ) + ) + ) + ); + $userService->loadSubUserGroups( $parentGroup ); + } + + /** + * Test deleting user group + * @covers \eZ\Publish\API\Repository\UserService::deleteUserGroup + */ + public function testDeleteUserGroup() + { + $userService = $this->repository->getUserService(); + + $userGroup = $userService->loadUserGroup( 12 ); + $userService->deleteUserGroup( $userGroup ); + + try + { + $userService->loadUserGroup( $userGroup->id ); + self::fail( "Succeeded loading deleted user group" ); + } + catch ( NotFoundException $e ) + { + } + } + + /** + * Test deleting user group throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::deleteUserGroup + */ + public function testDeleteUserGroupThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + + $userGroup = new UserGroup( + array( + 'content' => new Content( + array( + "versionInfo" => new VersionInfo( + array( "contentInfo" => new ContentInfo( array( "id" => PHP_INT_MAX ) ) ) + ), + "internalFields" => array() + ) + ) + ) + ); + $userService->deleteUserGroup( $userGroup ); + } + + /** + * Test moving a user group below another group + * @covers \eZ\Publish\API\Repository\UserService::moveUserGroup + */ + public function testMoveUserGroup() + { + $userService = $this->repository->getUserService(); + $locationService = $this->repository->getLocationService(); + + $userGroupToMove = $userService->loadUserGroup( 42 ); + $parentUserGroup = $userService->loadUserGroup( 12 ); + $userService->moveUserGroup( $userGroupToMove, $parentUserGroup ); + + $movedUserGroup = $userService->loadUserGroup( $userGroupToMove->id ); + + $newMainLocation = $locationService->loadLocation( $movedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId ); + self::assertEquals( + $parentUserGroup->getVersionInfo()->getContentInfo()->mainLocationId, + $newMainLocation->parentLocationId + ); + } + + /** + * Test moving a user group below another group throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::moveUserGroup + */ + public function testMoveUserGroupThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + + $userGroupToMove = new UserGroup( + array( + 'content' => new Content( + array( + "versionInfo" => new VersionInfo( + array( "contentInfo" => new ContentInfo( array( "id" => PHP_INT_MAX ) ) ) + ), + "internalFields" => array() + ) + ) + ) + ); + $parentUserGroup = new UserGroup( + array( + 'content' => new Content( + array( + "versionInfo" => new VersionInfo( + array( "contentInfo" => new ContentInfo( array( "id" => PHP_INT_MAX ) ) ) + ), + "internalFields" => array() + ) + ) + ) + ); + $userService->moveUserGroup( $userGroupToMove, $parentUserGroup ); + } + + /** + * Test updating a user group + * @covers \eZ\Publish\API\Repository\UserService::updateUserGroup + */ + public function testUpdateUserGroup() + { + $userService = $this->repository->getUserService(); + $contentService = $this->repository->getContentService(); + + $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct(); + $userGroupUpdateStruct->contentUpdateStruct = $contentService->newContentUpdateStruct(); + $userGroupUpdateStruct->contentUpdateStruct->setField( "name", "New anonymous group", "eng-US" ); + + $userGroup = $userService->loadUserGroup( 42 ); + + $updatedUserGroup = $userService->updateUserGroup( $userGroup, $userGroupUpdateStruct ); + self::assertInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\User\\UserGroup", $updatedUserGroup ); + self::assertEquals( + $userGroupUpdateStruct->contentUpdateStruct->fields[0]->value, + $updatedUserGroup->getFieldValue( "name" ) + ); + } + + /** + * Test updating a user group throwing ContentFieldValidationException + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @covers \eZ\Publish\API\Repository\UserService::updateUserGroup + */ + public function testUpdateUserGroupThrowsContentValidationException() + { + $userService = $this->repository->getUserService(); + $contentService = $this->repository->getContentService(); + + $userGroup = $userService->loadUserGroup( 42 ); + $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct(); + $userGroupUpdateStruct->contentUpdateStruct = $contentService->newContentUpdateStruct(); + $userGroupUpdateStruct->contentUpdateStruct->setField( "name", "", "eng-US" ); + + $userService->updateUserGroup( $userGroup, $userGroupUpdateStruct ); + } + + /** + * Test creating a user + * @covers \eZ\Publish\API\Repository\UserService::createUser + */ + public function testCreateUser() + { + self::markTestSkipped( "Breaks with InMemory storage, due to incorrect fixtures" ); + $userService = $this->repository->getUserService(); + + $userCreateStruct = $userService->newUserCreateStruct( "new_user", "new_user@ez.no", "password", "eng-GB" ); + $userCreateStruct->setField( "first_name", "New", "eng-GB" ); + $userCreateStruct->setField( "last_name", "User", "eng-GB" ); + + $parentGroup = $userService->loadUserGroup( 42 ); + $createdUser = $userService->createUser( $userCreateStruct, array( $parentGroup ) ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\User', $createdUser ); + self::assertEquals( "New", $createdUser->getFieldValue( "first_name" ) ); + self::assertEquals( "User", $createdUser->getFieldValue( "last_name" ) ); + self::assertEquals( $userCreateStruct->login, $createdUser->login ); + self::assertEquals( $userCreateStruct->email, $createdUser->email ); + } + + /** + * Test creating a user throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::createUser + */ + public function testCreateUserThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + + $userCreateStruct = $userService->newUserCreateStruct( "new_user", "new_user@ez.no", "password", "eng-GB" ); + $userCreateStruct->setField( "first_name", "New" ); + $userCreateStruct->setField( "last_name", "User" ); + + $parentGroup = new UserGroup( + array( + 'content' => new Content( + array( + "versionInfo" => new VersionInfo( + array( + "contentInfo" => new ContentInfo( array( 'id' => PHP_INT_MAX ) ) + ) + ), + "internalFields" => array() + ) + ) + ) + ); + $userService->createUser( $userCreateStruct, array( $parentGroup ) ); + } + + /** + * Test creating a user throwing ContentValidationException + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @covers \eZ\Publish\API\Repository\UserService::createUser + */ + public function testCreateUserThrowsContentValidationException() + { + $userService = $this->repository->getUserService(); + + $userCreateStruct = $userService->newUserCreateStruct( "new_user", "new_user@ez.no", "password", "eng-GB" ); + $userCreateStruct->setField( "first_name", "", "eng-GB" ); + $userCreateStruct->setField( "last_name", "", "eng-GB" ); + + $parentGroup = $userService->loadUserGroup( 12 ); + $userService->createUser( $userCreateStruct, array( $parentGroup ) ); + } + + /** + * Test creating a user throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\UserService::createUser + */ + public function testCreateUserThrowsInvalidArgumentException() + { + $userService = $this->repository->getUserService(); + + $userCreateStruct = $userService->newUserCreateStruct( "admin", "new_user@ez.no", "password", "eng-GB" ); + $userCreateStruct->setField( "first_name", "", "eng-GB" ); + $userCreateStruct->setField( "last_name", "", "eng-GB" ); + + $parentGroup = $userService->loadUserGroup( 12 ); + $userService->createUser( $userCreateStruct, array( $parentGroup ) ); + } + + /** + * Test loading a user + * @covers \eZ\Publish\API\Repository\UserService::loadUser + */ + public function testLoadUser() + { + $userService = $this->repository->getUserService(); + + $loadedUser = $userService->loadUser( 14 ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\User', $loadedUser ); + self::assertEquals( 14, $loadedUser->id ); + } + + /** + * Test loading a user throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::loadUser + */ + public function testLoadUserThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + + $userService->loadUser( PHP_INT_MAX ); + } + + /** + * Test loading anonymous user + * @covers \eZ\Publish\API\Repository\UserService::loadAnonymousUser + */ + public function testLoadAnonymousUser() + { + $userService = $this->repository->getUserService(); + + $loadedUser = $userService->loadAnonymousUser(); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\User', $loadedUser ); + self::assertEquals( 10, $loadedUser->id ); + } + + /** + * Test loading a user by credentials + * @covers \eZ\Publish\API\Repository\UserService::loadUserByCredentials + */ + public function testLoadUserByCredentials() + { + $userService = $this->repository->getUserService(); + + $loadedUser = $userService->loadUserByCredentials( 'admin', 'publish' ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\User', $loadedUser ); + + $this->assertPropertiesCorrect( + array( + 'id' => 14, + 'login' => 'admin', + 'email' => 'spam@ez.no', + 'passwordHash' => 'c78e3b0f3d9244ed8c6d1c29464bdff9', + 'hashAlgorithm' => User::PASSWORD_HASH_MD5_USER, + 'enabled' => true, + 'maxLogin' => 10 + ), + $loadedUser + ); + } + + /** + * Test loading a user by credentials throwing NotFoundException + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::loadUser + */ + public function testLoadUserByCredentialsThrowsNotFoundException() + { + $userService = $this->repository->getUserService(); + + $userService->loadUserByCredentials( 'non_existing_user', 'invalid_password' ); + } + + /** + * Test loading a user by credentials throwing NotFoundException because of bad password + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + * @covers \eZ\Publish\API\Repository\UserService::loadUser + */ + public function testLoadUserByCredentialsThrowsNotFoundExceptionBadPassword() + { + $userService = $this->repository->getUserService(); + + $userService->loadUserByCredentials( 'admin', 'some_password' ); + } + + /** + * Test deleting a user + * @covers \eZ\Publish\API\Repository\UserService::deleteUser + */ + public function testDeleteUser() + { + $userService = $this->repository->getUserService(); + + $user = $userService->loadUser( 14 ); + $userService->deleteUser( $user ); + + try + { + $userService->loadUser( 14 ); + self::fail( "failed deleting a user" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + } + + /** + * Test updating a user + * @covers \eZ\Publish\API\Repository\UserService::updateUser + */ + public function testUpdateUser() + { + self::markTestSkipped( "Breaks with InMemory storage, due to incorrect fixtures" ); + $userService = $this->repository->getUserService(); + + $userUpdateStruct = $userService->newUserUpdateStruct(); + $userUpdateStruct->contentUpdateStruct = $this->repository->getContentService()->newContentUpdateStruct(); + $userUpdateStruct->contentUpdateStruct->setField( "first_name", "New first name", "eng-US" ); + $userUpdateStruct->contentUpdateStruct->setField( "last_name", "New last name", "eng-US" ); + + $user = $userService->loadUser( 14 ); + + $userService->updateUser( $user, $userUpdateStruct ); + $updatedUser = $userService->loadUser( $user->id ); + + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\User', $updatedUser ); + self::assertEquals( + "New first name", + $updatedUser->getFieldValue( "first_name" ) + ); + + self::assertEquals( + "New last name", + $updatedUser->getFieldValue( "last_name" ) + ); + } + + /** + * Test updating a user throwing ContentValidationException + * @expectedException \eZ\Publish\API\Repository\Exceptions\ContentValidationException + * @covers \eZ\Publish\API\Repository\UserService::updateUser + */ + public function testUpdateUserThrowsContentValidationException() + { + $userService = $this->repository->getUserService(); + $contentService = $this->repository->getContentService(); + + $user = $userService->loadUser( 14 ); + $userUpdateStruct = $userService->newUserUpdateStruct(); + $userUpdateStruct->contentUpdateStruct = $contentService->newContentUpdateStruct(); + $userUpdateStruct->contentUpdateStruct->setField( "name", "", "eng-US" ); + + $userService->updateUser( $user, $userUpdateStruct ); + } + + /** + * Test assigning a user group to user + * @covers \eZ\Publish\API\Repository\UserService::assignUserToUserGroup + */ + public function testAssignUserToUserGroup() + { + $userService = $this->repository->getUserService(); + $locationService = $this->repository->getLocationService(); + + $user = $userService->loadUser( 14 ); + $userGroup = $userService->loadUserGroup( 42 ); + + $userService->assignUserToUserGroup( $user, $userGroup ); + + $userLocations = $locationService->loadLocations( $user->getVersionInfo()->getContentInfo() ); + + if ( !is_array( $userLocations ) || empty( $userLocations ) ) + self::fail( "Failed assigning user to user group" ); + + $hasAddedLocation = false; + foreach ( $userLocations as $location ) + { + if ( $location->parentLocationId == $userGroup->getVersionInfo()->getContentInfo()->mainLocationId ) + { + $hasAddedLocation = true; + break; + } + } + + if ( !$hasAddedLocation ) + self::fail( "Failed assigning user to user group" ); + } + + /** + * Test assigning a user group to user throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\UserService::assignUserToUserGroup + */ + public function testAssignUserToUserGroupThrowsInvalidArgumentException() + { + $userService = $this->repository->getUserService(); + + $user = $userService->loadUser( 14 ); + $userGroup = $userService->loadUserGroup( 12 ); + $userService->assignUserToUserGroup( $user, $userGroup ); + } + + /** + * Test removing a user from user group + * @covers \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup + */ + public function testUnAssignUserFromUserGroup() + { + $userService = $this->repository->getUserService(); + $locationService = $this->repository->getLocationService(); + + $user = $userService->loadUser( 14 ); + $userGroup = $userService->loadUserGroup( 12 ); + + $userService->unAssignUserFromUserGroup( $user, $userGroup ); + + try + { + $user = $userService->loadUser( 14 ); + } + catch ( NotFoundException $e ) + { + // user was deleted because the group we assigned him from was his last location + return; + } + + $userLocations = $locationService->loadLocations( $user->getVersionInfo()->getContentInfo() ); + + if ( is_array( $userLocations ) && !empty( $userLocations ) ) + { + $hasRemovedLocation = false; + foreach ( $userLocations as $location ) + { + if ( $location->parentLocationId == $userGroup->getVersionInfo()->getContentInfo()->mainLocationId ) + { + $hasRemovedLocation = true; + break; + } + } + + if ( $hasRemovedLocation ) + self::fail( "Failed removing a user from user group" ); + } + } + + /** + * Test removing a user from user group throwing InvalidArgumentException + * @expectedException \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * @covers \eZ\Publish\API\Repository\UserService::unAssignUserFromUserGroup + */ + public function testUnAssignUserFromUserGroupThrowsInvalidArgumentException() + { + $userService = $this->repository->getUserService(); + + $user = $userService->loadUser( 14 ); + $userGroup = $userService->loadUserGroup( 42 ); + $userService->unAssignUserFromUserGroup( $user, $userGroup ); + } + + /** + * Test loading user groups the user belongs to + * @covers \eZ\Publish\API\Repository\UserService::loadUserGroupsOfUser + */ + public function testLoadUserGroupsOfUser() + { + $userService = $this->repository->getUserService(); + $locationService = $this->repository->getLocationService(); + + $user = $userService->loadUser( 14 ); + $userLocations = $locationService->loadLocations( + $user->getVersionInfo()->getContentInfo() + ); + + $groupLocationIds = array(); + foreach ( $userLocations as $userLocation ) + { + if ( $userLocation->parentLocationId !== null ) + $groupLocationIds[] = $userLocation->parentLocationId; + } + + $userGroups = $userService->loadUserGroupsOfUser( $user ); + + foreach ( $userGroups as $userGroup ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserGroup', $userGroup ); + self::assertContains( + $userGroup->getVersionInfo()->getContentInfo()->mainLocationId, + $groupLocationIds + ); + } + } + + /** + * Test loading user groups the user belongs to + * @covers \eZ\Publish\API\Repository\UserService::loadUsersOfUserGroup + */ + public function testLoadUsersOfUserGroup() + { + $userService = $this->repository->getUserService(); + $locationService = $this->repository->getLocationService(); + + $userGroup = $userService->loadUserGroup( 12 ); + $users = $userService->loadUsersOfUserGroup( $userGroup ); + + self::assertInternalType( "array", $users ); + self::assertNotEmpty( $users ); + + foreach ( $users as $user ) + { + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\User', $user ); + + $userLocation = $locationService->loadLocation( $user->getVersionInfo()->getContentInfo()->mainLocationId ); + + self::assertEquals( + $userGroup->getVersionInfo()->getContentInfo()->mainLocationId, + $userLocation->parentLocationId + ); + } + } + + /** + * Test creating new UserCreateStruct + * @covers \eZ\Publish\API\Repository\UserService::newUserCreateStruct + */ + public function testNewUserCreateStruct() + { + $userService = $this->repository->getUserService(); + + $userCreateStruct = $userService->newUserCreateStruct( "admin", "admin@ez.no", "password", "eng-GB" ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserCreateStruct', $userCreateStruct ); + + $this->assertPropertiesCorrect( + array( + 'mainLanguageCode' => 'eng-GB', + 'login' => 'admin', + 'email' => 'admin@ez.no', + 'password' => 'password', + 'enabled' => true, + 'fields' => array() + ), + $userCreateStruct + ); + } + + /** + * Test creating new UserGroupCreateStruct + * @covers \eZ\Publish\API\Repository\UserService::newUserGroupCreateStruct + */ + public function testNewUserGroupCreateStruct() + { + $userService = $this->repository->getUserService(); + + $userGroupCreateStruct = $userService->newUserGroupCreateStruct( "eng-GB" ); + self::assertInstanceOf( '\eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct', $userGroupCreateStruct ); + self::assertEquals( "eng-GB", $userGroupCreateStruct->mainLanguageCode ); + } + + /** + * Test creating new UserUpdateStruct + * @covers \eZ\Publish\API\Repository\UserService::newUserUpdateStruct + */ + public function testNewUserUpdateStruct() + { + $userService = $this->repository->getUserService(); + + $userUpdateStruct = $userService->newUserUpdateStruct(); + + self::assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserUpdateStruct', + $userUpdateStruct + ); + + self::assertNull( $userUpdateStruct->contentUpdateStruct ); + self::assertNull( $userUpdateStruct->contentMetadataUpdateStruct ); + + $this->assertPropertiesCorrect( + array( + 'email' => null, + 'password' => null, + 'enabled' => null, + 'maxLogin' => null + ), + $userUpdateStruct + ); + } + + /** + * Test creating new UserGroupUpdateStruct + * @covers \eZ\Publish\API\Repository\UserService::newUserGroupUpdateStruct + */ + public function testNewUserGroupUpdateStruct() + { + $userService = $this->repository->getUserService(); + + $userGroupUpdateStruct = $userService->newUserGroupUpdateStruct(); + + self::assertInstanceOf( + '\eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct', + $userGroupUpdateStruct + ); + + self::assertNull( $userGroupUpdateStruct->contentUpdateStruct ); + self::assertNull( $userGroupUpdateStruct->contentMetadataUpdateStruct ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Integration/ezplogo.png b/eZ/Publish/Core/Repository/Tests/Service/Integration/ezplogo.png new file mode 100644 index 0000000..74487fb Binary files /dev/null and b/eZ/Publish/Core/Repository/Tests/Service/Integration/ezplogo.png differ diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/Base.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/Base.php new file mode 100644 index 0000000..d61a76c --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/Base.php @@ -0,0 +1,223 @@ +<?php +/** + * File contains: Abstract Base service test class for Mock testing + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Mock; + +use PHPUnit_Framework_TestCase; +use eZ\Publish\Core\Repository\Repository; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\User\User; + +/** + * Base test case for tests on services using Mock testing + */ +abstract class Base extends PHPUnit_Framework_TestCase +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + private $repository; + + /** + * @var \eZ\Publish\API\Repository\Repository|\PHPUnit_Framework_MockObject_MockObject + */ + private $repositoryMock; + + /** + * @var \eZ\Publish\SPI\Persistence\Handler|\PHPUnit_Framework_MockObject_MockObject + */ + private $persistenceMock; + + /** + * The Content / Location / ... handlers for the persistence handler mocks + * @var \PHPUnit_Framework_MockObject_MockObject[] Key is relative to "\eZ\Publish\SPI\Persistence\" + * @see getPersistenceMockHandler() + */ + private $persistenceMockHandlers = array(); + + /** + * @var \eZ\Publish\SPI\IO\Handler|\PHPUnit_Framework_MockObject_MockObject + */ + private $IOMock; + + /** + * Get Real repository with mocked dependencies + * + * @param array $serviceSettings If set then non shared instance of Repository is returned + * + * @return \eZ\Publish\API\Repository\Repository + */ + protected function getRepository( array $serviceSettings = array() ) + { + if ( $this->repository === null || !empty( $serviceSettings ) ) + { + $repository = new Repository( + $this->getPersistenceMock(), + $this->getIOMock(), + $serviceSettings, + $this->getStubbedUser( 14 ) + ); + + if ( !empty( $serviceSettings ) ) + return $repository; + + $this->repository = $repository; + } + return $this->repository; + } + + /** + * @return \eZ\Publish\API\Repository\Repository|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getRepositoryMock() + { + if ( !isset( $this->repositoryMock ) ) + { + $this->repositoryMock = self::getMock( "eZ\\Publish\\API\\Repository\\Repository" ); + } + + return $this->repositoryMock; + } + + /** + * Returns a persistence Handler mock + * + * @return \eZ\Publish\SPI\Persistence\Handler|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPersistenceMock() + { + if ( !isset( $this->persistenceMock ) ) + { + $this->persistenceMock = $this->getMock( + "eZ\\Publish\\SPI\\Persistence\\Handler", + array(), + array(), + '', + false + ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'contentHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'searchHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Search\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'contentTypeHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Type\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'contentLanguageHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Language\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'locationHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Location\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'objectStateHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\ObjectState\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'trashHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Location\\Trash\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'userHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'User\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'sectionHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\Section\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'urlAliasHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ) ) ); + + $this->persistenceMock->expects( $this->any() ) + ->method( 'urlWildcardHandler' ) + ->will( $this->returnValue( $this->getPersistenceMockHandler( 'Content\\UrlWildcard\\Handler' ) ) ); + } + + return $this->persistenceMock; + } + + /** + * Returns a persistence Handler mock + * + * @param string $handler For instance "Content\\Type\\Handler", must be relative to "eZ\Publish\SPI\Persistence" + * + * @return \PHPUnit_Framework_MockObject_MockObject + */ + protected function getPersistenceMockHandler( $handler ) + { + if ( !isset( $this->persistenceMockHandlers[$handler] ) ) + { + $this->persistenceMockHandlers[$handler] = $this->getMock( + "eZ\\Publish\\SPI\\Persistence\\{$handler}", + array(), + array(), + '', + false + ); + } + + return $this->persistenceMockHandlers[$handler]; + } + + /** + * Returns a persistence Handler mock + * + * @return \eZ\Publish\SPI\IO\Handler|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getIOMock() + { + if ( !isset( $this->IOMock ) ) + { + $this->IOMock = $this->getMock( + "eZ\\Publish\\SPI\\IO\\Handler", + array(), + array(), + '', + false + ); + } + + return $this->IOMock; + } + + /** + * Returns User stub with $id as User/Content id + * + * @param int $id + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + protected function getStubbedUser( $id ) + { + return new User( + array( + 'content' => new Content( + array( + 'versionInfo' => new VersionInfo( + array( + 'contentInfo' => new ContentInfo( array( 'id' => $id ) ) + ) + ), + 'internalFields' => array() + ) + ) + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/ContentTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/ContentTest.php new file mode 100644 index 0000000..183728e --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/ContentTest.php @@ -0,0 +1,124 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Mock; + +use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; + +/** + * Mock test case for Content service + */ +class ContentTest extends BaseServiceMockTest +{ + /** + * Test for the loadVersionInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadVersionInfo + */ + public function testLoadVersionInfo() + { + $contentServiceMock = $this->getPartlyMockedContentService( + array( "loadVersionInfoById" ) + ); + $contentServiceMock->expects( + $this->once() + )->method( + "loadVersionInfoById" + )->with( + $this->equalTo( 42 ), + $this->equalTo( 7 ) + ); + + $contentServiceMock->loadVersionInfo( + new ContentInfo( array( "id" => 42 ) ), + 7 + ); + } + + /** + * Test for the loadContentByContentInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentByContentInfo + */ + public function testLoadContentByContentInfo() + { + $contentServiceMock = $this->getPartlyMockedContentService( + array( "loadContent" ) + ); + $contentServiceMock->expects( + $this->once() + )->method( + "loadContent" + )->with( + $this->equalTo( 42 ), + $this->equalTo( array( "cro-HR" ) ), + $this->equalTo( 7 ) + ); + + $contentServiceMock->loadContentByContentInfo( + new ContentInfo( array( "id" => 42 ) ), + array( "cro-HR" ), + 7 + ); + } + + /** + * Test for the loadContentByVersionInfo() method. + * + * @covers \eZ\Publish\Core\Repository\ContentService::loadContentByVersionInfo + */ + public function testLoadContentByVersionInfo() + { + $contentServiceMock = $this->getPartlyMockedContentService( + array( "loadContent" ) + ); + $contentServiceMock->expects( + $this->once() + )->method( + "loadContent" + )->with( + $this->equalTo( 42 ), + $this->equalTo( array( "cro-HR" ) ), + $this->equalTo( 7 ) + ); + + $contentServiceMock->loadContentByVersionInfo( + new VersionInfo( + array( + "contentInfo" => new ContentInfo( array( "id" => 42 ) ), + "versionNo" => 7 + ) + ), + array( "cro-HR" ) + ); + } + + /** + * Returns the content service to test with $methods mocked + * + * Injected Repository comes from {@see getRepositoryMock()} and persistence handler from {@see getPersistenceMock()} + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Repository\ContentService|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartlyMockedContentService( array $methods = null ) + { + return $this->getMock( + "eZ\\Publish\\Core\\Repository\\ContentService", + $methods, + array( + $this->getRepositoryMock(), + $this->getPersistenceMock() + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/NameSchemaTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/NameSchemaTest.php new file mode 100644 index 0000000..fa7d067 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/NameSchemaTest.php @@ -0,0 +1,285 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\NameSchemaTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Mock; + +use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; +use eZ\Publish\Core\Repository\NameSchemaService; +use eZ\Publish\Core\Repository\Values\Content\Content; +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\Repository\Values\Content\VersionInfo; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\API\Repository\Values\Content\Field; +use eZ\Publish\Core\FieldType\TextLine\Value as TextLineValue; + +/** + * Mock Test case for NameSchema service + */ +class NameSchemaTest extends BaseServiceMockTest +{ + /** + * Test eZ\Publish\Core\Repository\NameSchemaService method + * @covers \eZ\Publish\Core\Repository\NameSchemaService::resolveUrlAliasSchema + */ + public function testResolveUrlAliasSchema() + { + $serviceMock = $this->getPartlyMockedNameSchemaService( array( "resolve" ) ); + + $content = $this->buildTestContent(); + + $serviceMock->expects( + $this->once() + )->method( + "resolve" + )->with( + "<urlalias_schema>", + $this->equalTo( $content->contentType ), + $this->equalTo( $content->fields ), + $this->equalTo( $content->versionInfo->languageCodes ) + )->will( + $this->returnValue( 42 ) + ); + + $result = $serviceMock->resolveUrlAliasSchema( $content ); + + self::assertEquals( 42, $result ); + } + + /** + * Test eZ\Publish\Core\Repository\NameSchemaService method + * @covers \eZ\Publish\Core\Repository\NameSchemaService::resolveUrlAliasSchema + */ + public function testResolveUrlAliasSchemaFallbackToNameSchema() + { + $serviceMock = $this->getPartlyMockedNameSchemaService( array( "resolve" ) ); + + $content = $this->buildTestContent( "<name_schema>", "" ); + + $serviceMock->expects( + $this->once() + )->method( + "resolve" + )->with( + "<name_schema>", + $this->equalTo( $content->contentType ), + $this->equalTo( $content->fields ), + $this->equalTo( $content->versionInfo->languageCodes ) + )->will( + $this->returnValue( 42 ) + ); + + $result = $serviceMock->resolveUrlAliasSchema( $content ); + + self::assertEquals( 42, $result ); + } + + /** + * Test eZ\Publish\Core\Repository\NameSchemaService method + * @covers \eZ\Publish\Core\Repository\NameSchemaService::resolveNameSchema + */ + public function testResolveNameSchema() + { + $serviceMock = $this->getPartlyMockedNameSchemaService( array( "resolve" ) ); + + $content = $this->buildTestContent(); + + $serviceMock->expects( + $this->once() + )->method( + "resolve" + )->with( + "<name_schema>", + $this->equalTo( $content->contentType ), + $this->equalTo( $content->fields ), + $this->equalTo( $content->versionInfo->languageCodes ) + )->will( + $this->returnValue( 42 ) + ); + + $result = $serviceMock->resolveNameSchema( $content ); + + self::assertEquals( 42, $result ); + } + + /** + * Test eZ\Publish\Core\Repository\NameSchemaService method + * @covers \eZ\Publish\Core\Repository\NameSchemaService::resolveNameSchema + */ + public function testResolveNameSchemaWithFields() + { + $serviceMock = $this->getPartlyMockedNameSchemaService( array( "resolve" ) ); + + $content = $this->buildTestContent(); + $fields = array(); + $fields["text3"]["cro-HR"] = new TextLineValue( "tri" ); + $fields["text1"]["ger-DE"] = new TextLineValue( "ein" ); + $fields["text2"]["ger-DE"] = new TextLineValue( "zwei" ); + $fields["text3"]["ger-DE"] = new TextLineValue( "drei" ); + $mergedFields = $fields; + $mergedFields["text1"]["cro-HR"] = new TextLineValue( "jedan" ); + $mergedFields["text2"]["cro-HR"] = new TextLineValue( "dva" ); + $mergedFields["text1"]["eng-GB"] = new TextLineValue( "one" ); + $mergedFields["text2"]["eng-GB"] = new TextLineValue( "two" ); + $mergedFields["text3"]["eng-GB"] = new TextLineValue( "" ); + $languages = array( "eng-GB", "cro-HR", "ger-DE" ); + + $serviceMock->expects( + $this->once() + )->method( + "resolve" + )->with( + "<name_schema>", + $this->equalTo( $content->contentType ), + $this->equalTo( $mergedFields ), + $this->equalTo( $languages ) + )->will( + $this->returnValue( 42 ) + ); + + $result = $serviceMock->resolveNameSchema( $content, $fields, $languages ); + + self::assertEquals( 42, $result ); + } + + /** + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + protected function getFields() + { + return array( + new Field( + array( + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "text1", + "value" => new TextLineValue( "one" ) + ) + ), + new Field( + array( + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "text2", + "value" => new TextLineValue( "two" ) + ) + ), + new Field( + array( + "languageCode" => "eng-GB", + "fieldDefIdentifier" => "text3", + "value" => new TextLineValue( "" ) + ) + ), + new Field( + array( + "languageCode" => "cro-HR", + "fieldDefIdentifier" => "text1", + "value" => new TextLineValue( "jedan" ) + ) + ), + new Field( + array( + "languageCode" => "cro-HR", + "fieldDefIdentifier" => "text2", + "value" => new TextLineValue( "dva" ) + ) + ), + new Field( + array( + "languageCode" => "cro-HR", + "fieldDefIdentifier" => "text3", + "value" => new TextLineValue( "" ) + ) + ), + ); + } + + /** + * @return \eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition[] + */ + protected function getFieldDefinitions() + { + return array( + new FieldDefinition( + array( + "id" => "1", + "identifier" => "text1", + "fieldTypeIdentifier" => "ezstring" + ) + ), + new FieldDefinition( + array( + "id" => "2", + "identifier" => "text2", + "fieldTypeIdentifier" => "ezstring" + ) + ), + new FieldDefinition( + array( + "id" => "3", + "identifier" => "text3", + "fieldTypeIdentifier" => "ezstring" + ) + ), + ); + } + + /** + * Builds stubbed content for testing purpose. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + protected function buildTestContent( $nameSchema = "<name_schema>", $urlAliasSchema = "<urlalias_schema>" ) + { + $contentType = new ContentType( + array( + "nameSchema" => $nameSchema, + "urlAliasSchema" => $urlAliasSchema, + "fieldDefinitions" => $this->getFieldDefinitions() + ) + ); + $contentInfo = new ContentInfo( + array( + "contentType" => $contentType + ) + ); + $versionInfo = new VersionInfo( + array( + "contentInfo" => $contentInfo, + "languageCodes" => array( "eng-GB", "cro-HR" ) + ) + ); + + return new Content( + array( + "internalFields" => $this->getFields(), + "versionInfo" => $versionInfo + ) + ); + } + + /** + * Returns the content service to test with $methods mocked + * + * Injected Repository comes from {@see getRepositoryMock()} + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Repository\NameSchemaService|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartlyMockedNameSchemaService( array $methods = null ) + { + return $this->getMock( + "eZ\\Publish\\Core\\Repository\\NameSchemaService", + $methods, + array( + $this->getRepositoryMock() + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/RepositoryTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/RepositoryTest.php new file mode 100644 index 0000000..b6259f2 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/RepositoryTest.php @@ -0,0 +1,835 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\RepositoryTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Mock; + +use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; +use eZ\Publish\SPI\Persistence\User\RoleAssignment; +use eZ\Publish\SPI\Persistence\User\Role; +use eZ\Publish\SPI\Persistence\User\Policy; + +/** + * Mock test case for Repository + */ +class RepositoryTest extends BaseServiceMockTest +{ + public function providerForTestHasAccessReturnsTrue() + { + return array( + array( + array( + $this->createRoleAssignment( + null, + array( + array( "dummy-module", "dummy-function", "dummy-limitation" ), + array( "dummy-module2", "dummy-function2", "dummy-limitation2" ) + ) + ), + $this->createRoleAssignment( + null, + array( + array( "*", "dummy-function", "dummy-limitation" ) + ) + ) + ) + ), + array( + array( + $this->createRoleAssignment( + null, + array( + array( "test-module", "*", "dummy-limitation" ) + ) + ) + ) + ), + array( + array( + $this->createRoleAssignment( + null, + array( + array( "test-module", "test-function", "*" ) + ) + ) + ) + ), + ); + } + + /** + * Test for the hasAccess() method. + * + * @covers \eZ\Publish\API\Repository\Repository::hasAccess + * @dataProvider providerForTestHasAccessReturnsTrue + */ + public function testHasAccessReturnsTrue( array $roleAssignments ) + { + /** @var $userHandlerMock \PHPUnit_Framework_MockObject_MockObject */ + $userHandlerMock = $this->getPersistenceMock()->userHandler(); + $mockedRepository = $this->getRepository(); + + $userHandlerMock + ->expects( $this->once() ) + ->method( "loadRoleAssignmentsByGroupId" ) + ->with( $this->isType( "integer" ), $this->equalTo( true ) ) + ->will( $this->returnValue( $roleAssignments ) ); + + $result = $mockedRepository->hasAccess( "test-module", "test-function" ); + + self::assertEquals( true, $result ); + } + + public function providerForTestHasAccessReturnsFalse() + { + return array( + array( array() ), + array( + array( + $this->createRoleAssignment( + null, + array( + array( "dummy-module", "dummy-function", "dummy-limitation" ) + ) + ), + ) + ), + array( + array( + $this->createRoleAssignment( + null, + array( + array( "test-module", "dummy-function", "dummy-limitation" ) + ) + ), + ) + ), + ); + } + + /** + * Test for the hasAccess() method. + * + * @covers \eZ\Publish\API\Repository\Repository::hasAccess + * @dataProvider providerForTestHasAccessReturnsFalse + */ + public function testHasAccessReturnsFalse( array $roleAssignments ) + { + /** @var $userHandlerMock \PHPUnit_Framework_MockObject_MockObject */ + $userHandlerMock = $this->getPersistenceMock()->userHandler(); + $mockedRepository = $this->getRepository(); + + $userHandlerMock + ->expects( $this->once() ) + ->method( "loadRoleAssignmentsByGroupId" ) + ->with( $this->isType( "integer" ), $this->equalTo( true ) ) + ->will( $this->returnValue( $roleAssignments ) ); + + $result = $mockedRepository->hasAccess( "test-module", "test-function" ); + + self::assertEquals( false, $result ); + } + + public function providerForTestHasAccessReturnsPermissionSets() + { + return array( + array( + array( + $this->createRoleAssignment( + null, + array( + array( "test-module", "test-function", "test-limitation" ) + ) + ), + ) + ) + ); + } + + /** + * Test for the hasAccess() method. + * + * @covers \eZ\Publish\API\Repository\Repository::hasAccess + * @dataProvider providerForTestHasAccessReturnsPermissionSets + */ + public function testHasAccessReturnsPermissionSets( array $roleAssignments ) + { + /** @var $userHandlerMock \PHPUnit_Framework_MockObject_MockObject */ + $userHandlerMock = $this->getPersistenceMock()->userHandler(); + $roleServiceMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\RoleService", + array(), + array(), + '', + false + ); + $repositoryMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\Repository", + array( "getRoleService", "getCurrentUser" ), + array( + $this->getPersistenceMock(), + $this->getIOMock(), + ) + ); + + $repositoryMock + ->expects( $this->once() ) + ->method( "getRoleService" ) + ->will( $this->returnValue( $roleServiceMock ) ); + $repositoryMock + ->expects( $this->once() ) + ->method( "getCurrentUser" ) + ->will( $this->returnValue( $this->getStubbedUser( 14 ) ) ); + + $userHandlerMock + ->expects( $this->once() ) + ->method( "loadRoleAssignmentsByGroupId" ) + ->with( $this->isType( "integer" ), $this->equalTo( true ) ) + ->will( $this->returnValue( $roleAssignments ) ); + + $permissionSets = array(); + /** @var $roleAssignments \eZ\Publish\SPI\Persistence\User\RoleAssignment[] */ + foreach ( $roleAssignments as $i => $roleAssignment ) + { + $permissionSet = array( "limitation" => null ); + foreach ( $roleAssignment->role->policies as $k => $policy ) + { + $policyName = "policy-" . $i . "-" . $k; + $roleServiceMock + ->expects( $this->at( $k ) ) + ->method( "buildDomainPolicyObject" ) + ->with( $policy ) + ->will( $this->returnValue( $policyName ) ); + $permissionSet["policies"][] = $policyName; + } + $permissionSets[] = $permissionSet; + } + + /** @var $repositoryMock \eZ\Publish\Core\Repository\Repository */ + self::assertEquals( + $permissionSets, + $repositoryMock->hasAccess( "test-module", "test-function" ) + ); + } + + public function providerForTestHasAccessReturnsPermissionSetsWithRoleLimitation() + { + return array( + array( + array( + $this->createRoleAssignment( + "test-role-limitation", + array( + array( "test-module", "test-function", "test-limitation" ) + ), + array( "test-role-limitation-value" ) + ), + ), + ), + array( + array( + $this->createRoleAssignment( + "test-role-limitation", + array( array( "*", "*", "*" ) ), + array( "test-role-limitation-value" ) + ), + ), + ) + ); + } + + /** + * Test for the hasAccess() method. + * + * @covers \eZ\Publish\API\Repository\Repository::hasAccess + * @dataProvider providerForTestHasAccessReturnsPermissionSetsWithRoleLimitation + */ + public function testHasAccessReturnsPermissionSetsWithRoleLimitation( array $roleAssignments ) + { + /** @var $userHandlerMock \PHPUnit_Framework_MockObject_MockObject */ + $userHandlerMock = $this->getPersistenceMock()->userHandler(); + $limitationTypeMock = $this->getMock( "eZ\\Publish\\SPI\\Limitation\\Type" ); + $repositoryMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\Repository", + array( "getRoleService", "getCurrentUser" ), + array( + $this->getPersistenceMock(), + $this->getIOMock(), + ) + ); + $roleServiceMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\RoleService", + array( "buildDomainPolicyObject", "getLimitationType" ), + array(), + '', + false + ); + + $repositoryMock + ->expects( $this->once() ) + ->method( "getRoleService" ) + ->will( $this->returnValue( $roleServiceMock ) ); + $repositoryMock + ->expects( $this->once() ) + ->method( "getCurrentUser" ) + ->will( $this->returnValue( $this->getStubbedUser( 14 ) ) ); + + $userHandlerMock + ->expects( $this->once() ) + ->method( "loadRoleAssignmentsByGroupId" ) + ->with( $this->isType( "integer" ), $this->equalTo( true ) ) + ->will( $this->returnValue( $roleAssignments ) ); + + $permissionSets = array(); + /** @var $roleAssignments \eZ\Publish\SPI\Persistence\User\RoleAssignment[] */ + foreach ( $roleAssignments as $i => $roleAssignment ) + { + $permissionSet = array(); + foreach ( $roleAssignment->role->policies as $k => $policy ) + { + $policyName = "policy-{$i}-{$k}"; + $permissionSet["policies"][] = $policyName; + $roleServiceMock + ->expects( $this->at( $k ) ) + ->method( "buildDomainPolicyObject" ) + ->with( $policy ) + ->will( $this->returnValue( $policyName ) ); + } + + $permissionSet["limitation"] = "limitation-{$i}"; + $limitationTypeMock + ->expects( $this->at( $i ) ) + ->method( "buildValue" ) + ->with( $roleAssignment->values ) + ->will( $this->returnValue( $permissionSet["limitation"] ) ); + $roleServiceMock + ->expects( $this->any() ) + ->method( "getLimitationType" ) + ->with( $roleAssignment->limitationIdentifier ) + ->will( $this->returnValue( $limitationTypeMock ) ); + + $permissionSets[] = $permissionSet; + } + + /** @var $repositoryMock \eZ\Publish\Core\Repository\Repository */ + self::assertEquals( + $permissionSets, + $repositoryMock->hasAccess( "test-module", "test-function" ) + ); + } + + /** + * Returns RoleAssignment stub. + * + * @param $limitationIdentifier + * @param array $policiesData + * @param array $limitationValues + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment + */ + private function createRoleAssignment( $limitationIdentifier, array $policiesData, array $limitationValues = array() ) + { + $policies = array(); + foreach ( $policiesData as $policyData ) + { + $policies[] = new Policy( + array( + "module" => $policyData[0], + "function" => $policyData[1], + "limitations" => $policyData[2], + ) + ); + } + + return new RoleAssignment( + array( + "limitationIdentifier" => $limitationIdentifier, + "values" => $limitationValues, + "role" => new Role( array( "policies" => $policies ) ) + ) + ); + } + + public function providerForTestCanUserSimple() + { + return array( + array( true, true ), + array( false, false ), + array( array(), false ), + ); + } + + /** + * Test for the canUser() method. + * + * Tests execution paths with permission sets equaling to boolean value or empty array. + * + * @covers \eZ\Publish\API\Repository\Repository::canUser + * @dataProvider providerForTestCanUserSimple + */ + public function testCanUserSimple( $permissionSets, $result ) + { + $repositoryMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\Repository", + array( "hasAccess", "getCurrentUser" ), + array( + $this->getPersistenceMock(), + $this->getIOMock(), + ) + ); + + $repositoryMock + ->expects( $this->once() ) + ->method( "hasAccess" ) + ->with( $this->equalTo( "test-module" ), $this->equalTo( "test-function" ) ) + ->will( $this->returnValue( $permissionSets ) ); + + /** @var $valueObject \eZ\Publish\API\Repository\Values\ValueObject */ + $valueObject = $this->getMockForAbstractClass( "eZ\\Publish\\API\\Repository\\Values\\ValueObject" ); + + /** @var $repositoryMock \eZ\Publish\Core\Repository\Repository */ + self::assertEquals( + $result, + $repositoryMock->canUser( "test-module", "test-function", $valueObject, $valueObject ) + ); + } + + /** + * Test for the canUser() method. + * + * Tests execution path with permission set defining no limitations. + * + * @covers \eZ\Publish\API\Repository\Repository::canUser + */ + public function testCanUserWithoutLimitations() + { + $repositoryMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\Repository", + array( "hasAccess", "getCurrentUser" ), + array( + $this->getPersistenceMock(), + $this->getIOMock(), + ) + ); + + $policyMock = $this->getMock( + "eZ\\Publish\\SPI\\Persistence\\User\\Policy", + array( "getLimitations" ), + array(), + '', + false + ); + $policyMock + ->expects( $this->once() ) + ->method( "getLimitations" ) + ->will( $this->returnValue( "*" ) ); + $permissionSets = array( + array( + "limitation" => null, + "policies" => array( $policyMock ) + ) + ); + $repositoryMock + ->expects( $this->once() ) + ->method( "hasAccess" ) + ->with( $this->equalTo( "test-module" ), $this->equalTo( "test-function" ) ) + ->will( $this->returnValue( $permissionSets ) ); + + $userMock = $this->getStubbedUser( 14 ); + $repositoryMock + ->expects( $this->once() ) + ->method( "getCurrentUser" ) + ->will( $this->returnValue( $userMock ) ); + + /** @var $valueObject \eZ\Publish\API\Repository\Values\ValueObject */ + $valueObject = $this->getMockForAbstractClass( "eZ\\Publish\\API\\Repository\\Values\\ValueObject" ); + + /** @var $repositoryMock \eZ\Publish\Core\Repository\Repository */ + self::assertTrue( $repositoryMock->canUser( "test-module", "test-function", $valueObject, $valueObject ) ); + } + + /** + * @return array + */ + private function getPermissionSetsMock() + { + $roleLimitationMock = $this->getMock( "eZ\\Publish\\API\\Repository\\Values\\User\\Limitation" ); + $roleLimitationMock + ->expects( $this->any() ) + ->method( "getIdentifier" ) + ->will( $this->returnValue( "test-role-limitation-identifier" ) ); + + $policyLimitationMock = $this->getMock( "eZ\\Publish\\API\\Repository\\Values\\User\\Limitation" ); + $policyLimitationMock + ->expects( $this->any() ) + ->method( "getIdentifier" ) + ->will( $this->returnValue( "test-policy-limitation-identifier" ) ); + + $policyMock = $this->getMock( + "eZ\\Publish\\SPI\\Persistence\\User\\Policy", + array( "getLimitations" ), + array(), + '', + false + ); + $policyMock + ->expects( $this->any() ) + ->method( "getLimitations" ) + ->will( $this->returnValue( array( $policyLimitationMock, $policyLimitationMock ) ) ); + + $permissionSet = array( + "limitation" => clone $roleLimitationMock, + "policies" => array( $policyMock, $policyMock ) + ); + $permissionSets = array( $permissionSet, $permissionSet ); + + return $permissionSets; + } + + /** + * Provides evaluation results for two permission sets, each with a role limitation and two policies, + * with two limitations per policy. + * + * @return array + */ + public function providerForTestCanUserComplex() + { + return array( + array( + array( true, true ), + array( + array( + array( true, true ), + array( true, true ), + ), + array( + array( true, true ), + array( true, true ), + ), + ), + true + ), + array( + array( false, false ), + array( + array( + array( true, true ), + array( true, true ), + ), + array( + array( true, true ), + array( true, true ), + ), + ), + false + ), + array( + array( false, true ), + array( + array( + array( true, true ), + array( true, true ), + ), + array( + array( true, true ), + array( true, true ), + ), + ), + true + ), + array( + array( false, true ), + array( + array( + array( true, true ), + array( true, true ), + ), + array( + array( true, false ), + array( true, true ), + ), + ), + true + ), + array( + array( true, false ), + array( + array( + array( true, false ), + array( false, true ), + ), + array( + array( true, true ), + array( true, true ), + ), + ), + false + ), + ); + } + + /** + * Test for the canUser() method. + * + * Tests execution paths with permission sets containing limitations. + * + * @covers \eZ\Publish\API\Repository\Repository::canUser + * @dataProvider providerForTestCanUserComplex + */ + public function testCanUserComplex( array $roleLimitationEvaluations, array $policyLimitationEvaluations, $userCan ) + { + /** @var $valueObject \eZ\Publish\API\Repository\Values\ValueObject */ + $valueObject = $this->getMock( "eZ\\Publish\\API\\Repository\\Values\\ValueObject" ); + $repositoryMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\Repository", + array( "getCurrentUser", "getRoleService", "hasAccess" ), + array(), + "", + false + ); + $roleServiceMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\RoleService", + array( "getLimitationType" ), + array(), + "", + false + ); + $repositoryMock + ->expects( $this->once() ) + ->method( "getRoleService" ) + ->will( $this->returnValue( $roleServiceMock ) ); + + $permissionSets = $this->getPermissionSetsMock(); + $repositoryMock + ->expects( $this->once() ) + ->method( "hasAccess" ) + ->with( $this->equalTo( "test-module" ), $this->equalTo( "test-function" ) ) + ->will( $this->returnValue( $permissionSets ) ); + + $userMock = $this->getStubbedUser( 14 ); + $repositoryMock + ->expects( $this->once() ) + ->method( "getCurrentUser" ) + ->will( $this->returnValue( $userMock ) ); + + $invocation = 0; + for ( $i = 0; $i < count( $permissionSets ); $i++ ) + { + $limitation = $this->getMock( "eZ\\Publish\\SPI\\Limitation\\Type" ); + $limitation + ->expects( $this->once() ) + ->method( "evaluate" ) + ->with( $permissionSets[$i]["limitation"], $userMock, $valueObject, $valueObject ) + ->will( $this->returnValue( $roleLimitationEvaluations[$i] ) ); + $roleServiceMock + ->expects( $this->at( $invocation++ ) ) + ->method( "getLimitationType" ) + ->with( "test-role-limitation-identifier" ) + ->will( $this->returnValue( $limitation ) ); + + if ( !$roleLimitationEvaluations[$i] ) + { + continue; + } + + for ( $j = 0; $j < count( $permissionSets[$i]["policies"] ); $j++ ) + { + /** @var $policy \eZ\Publish\API\Repository\Values\User\Policy */ + $policy = $permissionSets[$i]["policies"][$j]; + $limitations = $policy->getLimitations(); + for ( $k = 0; $k < count( $limitations ); $k++ ) + { + $limitationsPass = true; + $limitation = $this->getMock( "eZ\\Publish\\SPI\\Limitation\\Type" ); + $limitation + ->expects( $this->once() ) + ->method( "evaluate" ) + ->with( $limitations[$k], $userMock, $valueObject, $valueObject ) + ->will( $this->returnValue( $policyLimitationEvaluations[$i][$j][$k] ) ); + $roleServiceMock + ->expects( $this->at( $invocation++ ) ) + ->method( "getLimitationType" ) + ->with( "test-policy-limitation-identifier" ) + ->will( $this->returnValue( $limitation ) ); + + if ( !$policyLimitationEvaluations[$i][$j][$k] ) + { + $limitationsPass = false; + break; + } + } + + /** @var $limitationsPass */ + if ( $limitationsPass ) + { + break 2; + } + } + } + + /** @var $repositoryMock \eZ\Publish\Core\Repository\Repository */ + self::assertEquals( + $userCan, + $repositoryMock->canUser( "test-module", "test-function", $valueObject, $valueObject ) + ); + } + + /** + * Test for the setCurrentUser() and getCurrentUser() methods. + * + * @covers \eZ\Publish\API\Repository\Repository::setCurrentUser + * @covers \eZ\Publish\API\Repository\Repository::getCurrentUser + */ + public function testSetAndGetCurrentUser() + { + $mockedRepository = $this->getRepository(); + $user = $this->getStubbedUser( 42 ); + + $mockedRepository->setCurrentUser( $user ); + + self::assertSame( + $user, + $mockedRepository->getCurrentUser() + ); + } + + /** + * Test for the getCurrentUser() method. + * + * @covers \eZ\Publish\API\Repository\Repository::getCurrentUser + */ + public function testGetCurrentUserReturnsAnonymousUser() + { + $userServiceMock = $this->getMock( "eZ\\Publish\\API\\Repository\\UserService" ); + $repositoryMock = $this->getMock( + "eZ\\Publish\\Core\\Repository\\Repository", + array( "getUserService" ), + array( + $this->getPersistenceMock(), + $this->getIOMock(), + ) + ); + + $userServiceMock + ->expects( $this->once() ) + ->method( "loadAnonymousUser" ) + ->will( $this->returnValue( "Anonymous User" ) ); + + $repositoryMock + ->expects( $this->once() ) + ->method( "getUserService" ) + ->will( $this->returnValue( $userServiceMock ) ); + + /** @var $repositoryMock \eZ\Publish\API\Repository\Repository */ + self::assertEquals( + "Anonymous User", + $repositoryMock->getCurrentUser() + ); + } + + /** + * Test for the beginTransaction() method. + * + * @covers \eZ\Publish\API\Repository\Repository::beginTransaction + */ + public function testBeginTransaction() + { + $mockedRepository = $this->getRepository(); + $persistenceHandlerMock = $this->getPersistenceMock(); + + $persistenceHandlerMock->expects( + $this->once() + )->method( + "beginTransaction" + ); + + $mockedRepository->beginTransaction(); + } + + /** + * Test for the commit() method. + * + * @covers \eZ\Publish\API\Repository\Repository::commit + */ + public function testCommit() + { + $mockedRepository = $this->getRepository(); + $persistenceHandlerMock = $this->getPersistenceMock(); + + $persistenceHandlerMock->expects( + $this->once() + )->method( + "commit" + ); + + $mockedRepository->commit(); + } + + /** + * Test for the commit() method. + * + * @covers \eZ\Publish\API\Repository\Repository::commit + * @expectedException \RuntimeException + */ + public function testCommitThrowsRuntimeException() + { + $mockedRepository = $this->getRepository(); + $persistenceHandlerMock = $this->getPersistenceMock(); + + $persistenceHandlerMock->expects( + $this->once() + )->method( + "commit" + )->will( + $this->throwException( new \Exception() ) + ); + + $mockedRepository->commit(); + } + + /** + * Test for the rollback() method. + * + * @covers \eZ\Publish\API\Repository\Repository::rollback + */ + public function testRollback() + { + $mockedRepository = $this->getRepository(); + $persistenceHandlerMock = $this->getPersistenceMock(); + + $persistenceHandlerMock->expects( + $this->once() + )->method( + "rollback" + ); + + $mockedRepository->rollback(); + } + + /** + * Test for the rollback() method. + * + * @covers \eZ\Publish\API\Repository\Repository::rollback + * @expectedException \RuntimeException + */ + public function testRollbackThrowsRuntimeException() + { + $mockedRepository = $this->getRepository(); + $persistenceHandlerMock = $this->getPersistenceMock(); + + $persistenceHandlerMock->expects( + $this->once() + )->method( + "rollback" + )->will( + $this->throwException( new \Exception() ) + ); + + $mockedRepository->rollback(); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/SearchTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/SearchTest.php new file mode 100644 index 0000000..de18546 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/SearchTest.php @@ -0,0 +1,157 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\SearchBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Mock; + +use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Search\SearchResult; +use eZ\Publish\API\Repository\Exceptions\NotFoundException; +use eZ\Publish\SPI\Persistence\Content as SPIContent; +use eZ\Publish\SPI\Persistence\Content\VersionInfo as SPIVersionInfo; +use eZ\Publish\SPI\Persistence\Content\ContentInfo as SPIContentInfo; +use eZ\Publish\SPI\Persistence\Content\Type as SPIContentType; + +/** + * Mock test case for Content service + */ +class SearchTest extends BaseServiceMockTest +{ + /** + * Test for the findContent() method. + * + * @covers \eZ\Publish\Core\Repository\SearchService::findContent + */ + public function testFindContentBehaviour() + { + $searchService = $this->getRepository()->getSearchService(); + + $searchHandlerMock = $this->getPersistenceMockHandler( 'Content\\Search\\Handler' ); + $searchHandlerMock->expects( + $this->once() + )->method( + "findContent" + )->with( + $this->isInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Query" ), + $this->isType( "array" ) + )->will( + $this->returnValue( new SearchResult( array( 'totalCount' => 0 ) ) ) + ); + + $searchService->findContent( + new Query( + array( + "criterion" => new Criterion\ContentId( 4 ), + "offset" => 0, + "limit" => 10, + "sortClauses" => array() + ) + ), + array( "languages" => array( "eng-GB" ) ), + false + ); + } + + /** + * Test for the findSingle() method. + * + * @covers \eZ\Publish\Core\Repository\SearchService::findSingle + */ + public function testFindSingle() + { + // Re-enable when contentType has been removed from ContentInfo + $this->markTestIncomplete( "Test not implemented:" . __METHOD__ ); + $searchService = $this->getRepository()->getSearchService(); + + $searchHandlerMock = $this->getPersistenceMockHandler( 'Content\\Search\\Handler' ); + $searchHandlerMock->expects( + $this->once() + )->method( + "findSingle" + )->with( + $this->isInstanceOf( "eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion" ), + $this->isType( "array" ) + )->will( + $this->returnValue( + new SPIContent( + array( + 'versionInfo' => new SPIVersionInfo( + array( + 'contentInfo' => new SPIContentInfo( array( 'contentTypeId' => 1 ) ) + ) + ), + 'fields' => array(), + 'relations' => array() + ) + ) + ) + ); + + /*$typeHandlerMock = $this->getPersistenceMockHandler( 'Content\\Type\\Handler' ); + $typeHandlerMock->expects( + $this->once() + )->method( + "load" + )->with( + $this->equalTo( 1 ), + $this->equalTo( 0 ) + )->will( + $this->returnValue( new SPIContentType( array( + 'id' => 1 + ) ) ) + );*/ + + /* BEGIN: Use Case */ + $content = $searchService->findSingle( + new Criterion\ContentId( array( 42 ) ), + array( "languages" => array( "eng-GB" ) ), + false + ); + /* END: Use Case */ + + $this->assertInstanceOf( + "eZ\\Publish\\Core\\Repository\\Values\\Content\\Content", + $content + ); + } + + /** + * Test for the findSingle() method. + * + * @depends testFindSingle + * @covers \eZ\Publish\Core\Repository\SearchService::findSingle + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testFindSingleThrowsNotFoundExceptionDueToPermissions() + { + $this->markTestIncomplete( "Test not implemented:" . __METHOD__ ); + } + + /** + * Returns the content service to test with $methods mocked + * + * Injected Repository comes from {@see getRepositoryMock()} and persistence handler from {@see getPersistenceMock()} + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Repository\SearchService|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartlyMockedSearchService( array $methods = null ) + { + return $this->getMock( + "eZ\\Publish\\Core\\Repository\\SearchService", + $methods, + array( + $this->getRepositoryMock(), + $this->getPersistenceMock()->searchHandler() + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/UrlAliasTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/UrlAliasTest.php new file mode 100644 index 0000000..108d09c --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/UrlAliasTest.php @@ -0,0 +1,1991 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\UrlAliasBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Mock; + +use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; +use eZ\Publish\SPI\Persistence\Content\UrlAlias as SPIUrlAlias; +use eZ\Publish\Core\Repository\Values\Content\Location; + +/** + * Mock test case for UrlAlias Service + */ +class UrlAliasTest extends BaseServiceMockTest +{ + + public function providerForTestListAutogeneratedLocationAliasesPath() + { + $pathElement1 = array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan", + ) + ); + $pathElement2 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ); + $pathElement3 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ); + $pathData1 = array( $pathElement1 ); + $pathData2 = array( $pathElement1, $pathElement2 ); + $pathData3 = array( $pathElement1, $pathElement2, $pathElement3 ); + $spiUrlAliases1 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData1, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => true, + ) + ) + ); + $spiUrlAliases2 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ) + ); + $spiUrlAliases3 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => false, + ) + ) + ); + + return array( + array( + $spiUrlAliases1, + array( "cro-HR" ), + array( + "cro-HR" => "/jedan", + ), + "cro-HR", + ), + array( + $spiUrlAliases1, + array( "eng-GB" ), + array( + "cro-HR" => "/jedan", + ), + "cro-HR", + ), + array( + $spiUrlAliases1, + array( "ger-DE" ), + array( + "cro-HR" => "/jedan", + ), + "cro-HR", + ), + array( + $spiUrlAliases1, + array( "cro-HR", "eng-GB", "ger-DE" ), + array( + "cro-HR" => "/jedan", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "cro-HR" ), + array( + "cro-HR" => "/jedan/dva", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "eng-GB" ), + array( + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases2, + array( "cro-HR", "eng-GB" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "cro-HR", "ger-DE" ), + array( + "cro-HR" => "/jedan/dva", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "eng-GB", "cro-HR" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases2, + array( "eng-GB", "ger-DE" ), + array( + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases2, + array( "ger-DE", "cro-HR" ), + array( + "cro-HR" => "/jedan/dva", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "ger-DE", "eng-GB" ), + array( + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases2, + array( "cro-HR", "eng-GB", "ger-DE" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "cro-HR", "ger-DE", "eng-GB" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "eng-GB", "cro-HR", "ger-DE" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases2, + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases2, + array( "ger-DE", "cro-HR", "eng-GB" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "cro-HR", + ), + array( + $spiUrlAliases2, + array( "ger-DE", "eng-GB", "cro-HR" ), + array( + "cro-HR" => "/jedan/dva", + "eng-GB" => "/jedan/two", + ), + "eng-GB", + ), + array( + $spiUrlAliases3, + array( "cro-HR" ), + array( + "cro-HR" => "/jedan/dva/tri", + ), + "cro-HR", + ), + array( + $spiUrlAliases3, + array( "eng-GB" ), + array( + "eng-GB" => "/jedan/two/three", + ), + "eng-GB", + ), + array( + $spiUrlAliases3, + array( "cro-HR", "eng-GB" ), + array( + "cro-HR" => "/jedan/dva/tri", + "eng-GB" => "/jedan/dva/three", + ), + "cro-HR", + ), + array( + $spiUrlAliases3, + array( "cro-HR", "ger-DE" ), + array( + "cro-HR" => "/jedan/dva/tri", + "ger-DE" => "/jedan/dva/drei", + ), + "cro-HR", + ), + array( + $spiUrlAliases3, + array( "eng-GB", "cro-HR" ), + array( + "cro-HR" => "/jedan/two/tri", + "eng-GB" => "/jedan/two/three", + ), + "eng-GB", + ), + array( + $spiUrlAliases3, + array( "eng-GB", "ger-DE" ), + array( + "eng-GB" => "/jedan/two/three", + "ger-DE" => "/jedan/two/drei", + ), + "eng-GB", + ), + array( + $spiUrlAliases3, + array( "ger-DE", "eng-GB" ), + array( + "eng-GB" => "/jedan/two/three", + "ger-DE" => "/jedan/two/drei", + ), + "ger-DE", + ), + array( + $spiUrlAliases3, + array( "ger-DE", "cro-HR" ), + array( + "cro-HR" => "/jedan/dva/tri", + "ger-DE" => "/jedan/dva/drei", + ), + "ger-DE", + ), + array( + $spiUrlAliases3, + array( "cro-HR", "eng-GB", "ger-DE" ), + array( + "cro-HR" => "/jedan/dva/tri", + "eng-GB" => "/jedan/dva/three", + "ger-DE" => "/jedan/dva/drei", + ), + "cro-HR", + ), + array( + $spiUrlAliases3, + array( "cro-HR", "ger-DE", "eng-GB" ), + array( + "cro-HR" => "/jedan/dva/tri", + "eng-GB" => "/jedan/dva/three", + "ger-DE" => "/jedan/dva/drei", + ), + "cro-HR", + ), + array( + $spiUrlAliases3, + array( "eng-GB", "cro-HR", "ger-DE" ), + array( + "cro-HR" => "/jedan/two/tri", + "eng-GB" => "/jedan/two/three", + "ger-DE" => "/jedan/two/drei", + ), + "eng-GB", + ), + array( + $spiUrlAliases3, + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "cro-HR" => "/jedan/two/tri", + "eng-GB" => "/jedan/two/three", + "ger-DE" => "/jedan/two/drei", + ), + "eng-GB", + ), + array( + $spiUrlAliases3, + array( "ger-DE", "cro-HR", "eng-GB" ), + array( + "cro-HR" => "/jedan/dva/tri", + "eng-GB" => "/jedan/dva/three", + "ger-DE" => "/jedan/dva/drei", + ), + "ger-DE", + ), + array( + $spiUrlAliases3, + array( "ger-DE", "eng-GB", "cro-HR" ), + array( + "cro-HR" => "/jedan/two/tri", + "eng-GB" => "/jedan/two/three", + "ger-DE" => "/jedan/two/drei", + ), + "ger-DE", + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesPath + */ + public function testListAutogeneratedLocationAliasesPath( $spiUrlAliases, $prioritizedLanguageCodes, $paths ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, null ); + + self::assertEquals( + count( $paths ), + count( $urlAliases ) + ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + $pathKeys = array_keys( $paths ); + self::assertEquals( + $paths[$pathKeys[$index]], + $urlAlias->path + ); + self::assertEquals( + array( $pathKeys[$index] ), + $urlAlias->languageCodes + ); + } + } + + public function providerForTestListAutogeneratedLocationAliasesEmpty() + { + $pathElement1 = array( + "always-available" => true, + "translations" => array( + "cro-HR" => "/jedan", + ) + ); + $pathElement2 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ); + $pathElement3 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ); + $pathData2 = array( $pathElement1, $pathElement2 ); + $pathData3 = array( $pathElement1, $pathElement2, $pathElement3 ); + $spiUrlAliases2 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ) + ); + $spiUrlAliases3 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => false, + ) + ) + ); + + return array( + array( + $spiUrlAliases2, + array( "ger-DE" ), + ), + array( + $spiUrlAliases3, + array( "ger-DE" ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesEmpty + */ + public function testListAutogeneratedLocationAliasesEmpty( $spiUrlAliases, $prioritizedLanguageCodes ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, null ); + + self::assertEmpty( $urlAliases ); + } + + public function providerForTestListAutogeneratedLocationAliasesWithLanguageCodePath() + { + $pathElement1 = array( + "always-available" => true, + "translations" => array( + "cro-HR" => "jedan", + ) + ); + $pathElement2 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ); + $pathElement3 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ); + $pathData1 = array( $pathElement1 ); + $pathData2 = array( $pathElement1, $pathElement2 ); + $pathData3 = array( $pathElement1, $pathElement2, $pathElement3 ); + $spiUrlAliases1 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData1, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => true, + ) + ) + ); + $spiUrlAliases2 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ) + ); + $spiUrlAliases3 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => false, + ) + ) + ); + + return array( + array( + $spiUrlAliases1, + "cro-HR", + array( "cro-HR" ), + array( + "/jedan", + ), + ), + array( + $spiUrlAliases1, + "cro-HR", + array( "eng-GB" ), + array( + "/jedan", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "eng-GB", + array( "eng-GB" ), + array( + "/jedan/two", + ), + ), + array( + $spiUrlAliases2, + "eng-GB", + array( "cro-HR", "eng-GB" ), + array( + "/jedan/two", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "cro-HR", "ger-DE" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "eng-GB", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "eng-GB", + array( "eng-GB", "ger-DE" ), + array( + "/jedan/two", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "ger-DE", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "eng-GB", + array( "ger-DE", "eng-GB" ), + array( + "/jedan/two", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "cro-HR", "eng-GB", "ger-DE" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "eng-GB", + array( "cro-HR", "ger-DE", "eng-GB" ), + array( + "/jedan/two", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "eng-GB", "cro-HR", "ger-DE" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "ger-DE", "cro-HR", "eng-GB" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases2, + "cro-HR", + array( "ger-DE", "eng-GB", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases3, + "cro-HR", + array( "cro-HR" ), + array( + "/jedan/dva/tri", + ), + ), + array( + $spiUrlAliases3, + "eng-GB", + array( "eng-GB" ), + array( + "/jedan/two/three", + ), + ), + array( + $spiUrlAliases3, + "eng-GB", + array( "cro-HR", "eng-GB" ), + array( + "/jedan/dva/three", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "cro-HR", "ger-DE" ), + array( + "/jedan/dva/drei", + ), + ), + array( + $spiUrlAliases3, + "cro-HR", + array( "eng-GB", "cro-HR" ), + array( + "/jedan/two/tri", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "eng-GB", "ger-DE" ), + array( + "/jedan/two/drei", + ), + ), + array( + $spiUrlAliases3, + "eng-GB", + array( "ger-DE", "eng-GB" ), + array( + "/jedan/two/three", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "ger-DE", "cro-HR" ), + array( + "/jedan/dva/drei", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "cro-HR", "eng-GB", "ger-DE" ), + array( + "/jedan/dva/drei", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "cro-HR", "ger-DE", "eng-GB" ), + array( + "/jedan/dva/drei", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "eng-GB", "cro-HR", "ger-DE" ), + array( + "/jedan/two/drei", + ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "/jedan/two/drei", + ), + ), + array( + $spiUrlAliases3, + "eng-GB", + array( "ger-DE", "cro-HR", "eng-GB" ), + array( + "/jedan/dva/three", + ), + ), + array( + $spiUrlAliases3, + "cro-HR", + array( "ger-DE", "eng-GB", "cro-HR" ), + array( + "/jedan/two/tri", + ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesWithLanguageCodePath + */ + public function testListAutogeneratedLocationAliasesWithLanguageCodePath( + $spiUrlAliases, + $languageCode, + $prioritizedLanguageCodes, + $paths + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, $languageCode ); + + self::assertEquals( + count( $paths ), + count( $urlAliases ) + ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + $paths[$index], + $urlAlias->path + ); + } + } + + public function providerForTestListAutogeneratedLocationAliasesWithLanguageCodeEmpty() + { + $pathElement1 = array( + "always-available" => true, + "translations" => array( + "cro-HR" => "/jedan", + ) + ); + $pathElement2 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "dva", + "eng-GB" => "two", + ) + ); + $pathElement3 = array( + "always-available" => false, + "translations" => array( + "cro-HR" => "tri", + "eng-GB" => "three", + "ger-DE" => "drei", + ) + ); + $pathData1 = array( $pathElement1 ); + $pathData2 = array( $pathElement1, $pathElement2 ); + $pathData3 = array( $pathElement1, $pathElement2, $pathElement3 ); + $spiUrlAliases1 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData1, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => true, + ) + ) + ); + $spiUrlAliases2 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData2, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ) + ); + $spiUrlAliases3 = array( + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "cro-HR" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "eng-GB" ), + "alwaysAvailable" => false, + ) + ), + new SPIUrlAlias( + array( + "pathData" => $pathData3, + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => false, + ) + ) + ); + + return array( + array( + $spiUrlAliases1, + "eng-GB", + array( "ger-DE" ), + ), + array( + $spiUrlAliases1, + "ger-DE", + array( "cro-HR", "eng-GB", "ger-DE" ), + ), + array( + $spiUrlAliases2, + "eng-GB", + array( "cro-HR" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "cro-HR", "eng-GB" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "cro-HR", "ger-DE" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "eng-GB", "ger-DE" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "ger-DE", "cro-HR" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "ger-DE", "eng-GB" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "cro-HR", "eng-GB", "ger-DE" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "cro-HR", "ger-DE", "eng-GB" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "eng-GB", "cro-HR", "ger-DE" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "eng-GB", "ger-DE", "cro-HR" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "ger-DE", "cro-HR", "eng-GB" ), + ), + array( + $spiUrlAliases2, + "ger-DE", + array( "ger-DE", "eng-GB", "cro-HR" ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "cro-HR" ), + ), + array( + $spiUrlAliases3, + "cro-HR", + array( "eng-GB" ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "cro-HR", "eng-GB" ), + ), + array( + $spiUrlAliases3, + "eng-GB", + array( "cro-HR", "ger-DE" ), + ), + array( + $spiUrlAliases3, + "ger-DE", + array( "eng-GB", "cro-HR" ), + ), + array( + $spiUrlAliases3, + "cro-HR", + array( "eng-GB", "ger-DE" ), + ), + array( + $spiUrlAliases3, + "cro-HR", + array( "ger-DE", "eng-GB" ), + ), + array( + $spiUrlAliases3, + "eng-GB", + array( "ger-DE", "cro-HR" ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesWithLanguageCodeEmpty + */ + public function testListAutogeneratedLocationAliasesWithLanguageCodeEmpty( + $spiUrlAliases, + $languageCode, + $prioritizedLanguageCodes + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, $languageCode ); + + self::assertEmpty( $urlAliases ); + } + + public function providerForTestListAutogeneratedLocationAliasesMultipleLanguagesPath() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "jedan", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "dva", + "ger-DE" => "dva", + ) + ) + ), + "languageCodes" => array( "eng-GB", "ger-DE" ), + "alwaysAvailable" => false, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + array( "cro-HR", "ger-DE" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases, + array( "ger-DE", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases, + array( "eng-GB" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases, + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesMultipleLanguagesPath + */ + public function testListAutogeneratedLocationAliasesMultipleLanguagesPath( $spiUrlAliases, $prioritizedLanguageCodes, $paths ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, null ); + + self::assertEquals( + count( $paths ), + count( $urlAliases ) + ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + $paths[$index], + $urlAlias->path + ); + } + } + + public function providerForTestListAutogeneratedLocationAliasesMultipleLanguagesEmpty() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "/jedan", + "eng-GB" => "/jedan", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "dva", + "ger-DE" => "dva", + ) + ) + ), + "languageCodes" => array( "eng-GB", "ger-DE" ), + "alwaysAvailable" => false, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + array( "cro-HR" ), + ), + array( + $spiUrlAliases, + array( "ger-DE" ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesMultipleLanguagesEmpty + */ + public function testListAutogeneratedLocationAliasesMultipleLanguagesEmpty( $spiUrlAliases, $prioritizedLanguageCodes ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, null ); + + self::assertEmpty( $urlAliases ); + } + + public function providerForTestListAutogeneratedLocationAliasesWithLanguageCodeMultipleLanguagesPath() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "jedan", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "dva", + "ger-DE" => "dva", + ) + ) + ), + "languageCodes" => array( "eng-GB", "ger-DE" ), + "alwaysAvailable" => false, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + "ger-DE", + array( "cro-HR", "ger-DE" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases, + "ger-DE", + array( "ger-DE", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases, + "eng-GB", + array( "eng-GB" ), + array( + "/jedan/dva", + ), + ), + array( + $spiUrlAliases, + "eng-GB", + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "/jedan/dva", + ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesWithLanguageCodeMultipleLanguagesPath + */ + public function testListAutogeneratedLocationAliasesWithLanguageCodeMultipleLanguagesPath( + $spiUrlAliases, + $languageCode, + $prioritizedLanguageCodes, + $paths + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, $languageCode ); + + self::assertEquals( + count( $paths ), + count( $urlAliases ) + ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + $paths[$index], + $urlAlias->path + ); + } + } + + public function providerForTestListAutogeneratedLocationAliasesWithLanguageCodeMultipleLanguagesEmpty() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "/jedan", + "eng-GB" => "/jedan", + ) + ), + array( + "always-available" => false, + "translations" => array( + "eng-GB" => "dva", + "ger-DE" => "dva", + ) + ) + ), + "languageCodes" => array( "eng-GB", "ger-DE" ), + "alwaysAvailable" => false, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + "cro-HR", + array( "cro-HR" ), + ), + array( + $spiUrlAliases, + "cro-HR", + array( "cro-HR", "eng-GB" ), + ), + array( + $spiUrlAliases, + "cro-HR", + array( "ger-DE" ), + ), + array( + $spiUrlAliases, + "cro-HR", + array( "cro-HR", "eng-GB", "ger-DE" ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesWithLanguageCodeMultipleLanguagesEmpty + */ + public function testListAutogeneratedLocationAliasesWithLanguageCodeMultipleLanguagesEmpty( + $spiUrlAliases, + $languageCode, + $prioritizedLanguageCodes + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, $languageCode ); + + self::assertEmpty( $urlAliases ); + } + + public function providerForTestListAutogeneratedLocationAliasesAlwaysAvailablePath() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "one", + ) + ), + array( + "always-available" => true, + "translations" => array( + "ger-DE" => "zwei", + ) + ) + ), + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => true, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + array( "cro-HR", "ger-DE" ), + array( + "/jedan/zwei", + ), + ), + array( + $spiUrlAliases, + array( "ger-DE", "cro-HR" ), + array( + "/jedan/zwei", + ), + ), + array( + $spiUrlAliases, + array( "eng-GB" ), + array( + "/one/zwei", + ), + ), + array( + $spiUrlAliases, + array( "cro-HR", "eng-GB", "ger-DE" ), + array( + "/jedan/zwei", + ), + ), + array( + $spiUrlAliases, + array( "eng-GB", "ger-DE", "cro-HR" ), + array( + "/one/zwei", + ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesAlwaysAvailablePath + */ + public function testListAutogeneratedLocationAliasesAlwaysAvailablePath( + $spiUrlAliases, + $prioritizedLanguageCodes, + $paths + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, null ); + + self::assertEquals( + count( $paths ), + count( $urlAliases ) + ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + $paths[$index], + $urlAlias->path + ); + } + } + + public function providerForTestListAutogeneratedLocationAliasesWithLanguageCodeAlwaysAvailablePath() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "one", + ) + ), + array( + "always-available" => true, + "translations" => array( + "ger-DE" => "zwei", + ) + ) + ), + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => true, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + "ger-DE", + array( "cro-HR", "ger-DE" ), + array( + "/jedan/zwei", + ), + ), + array( + $spiUrlAliases, + "ger-DE", + array( "ger-DE", "cro-HR" ), + array( + "/jedan/zwei", + ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesWithLanguageCodeAlwaysAvailablePath + */ + public function testListAutogeneratedLocationAliasesWithLanguageCodeAlwaysAvailablePath( + $spiUrlAliases, + $languageCode, + $prioritizedLanguageCodes, + $paths + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, $languageCode ); + + self::assertEquals( + count( $paths ), + count( $urlAliases ) + ); + + foreach ( $urlAliases as $index => $urlAlias ) + { + self::assertEquals( + $paths[$index], + $urlAlias->path + ); + } + } + + public function providerForTestListAutogeneratedLocationAliasesWithLanguageCodeAlwaysAvailableEmpty() + { + $spiUrlAliases = array( + new SPIUrlAlias( + array( + "pathData" => array( + array( + "always-available" => false, + "translations" => array( + "cro-HR" => "jedan", + "eng-GB" => "one", + ) + ), + array( + "always-available" => true, + "translations" => array( + "ger-DE" => "zwei", + ) + ) + ), + "languageCodes" => array( "ger-DE" ), + "alwaysAvailable" => true, + ) + ), + ); + + return array( + array( + $spiUrlAliases, + "eng-GB", + array( "eng-GB" ), + ), + array( + $spiUrlAliases, + "eng-GB", + array( "cro-HR", "eng-GB", "ger-DE" ), + ), + array( + $spiUrlAliases, + "eng-GB", + array( "eng-GB", "ger-DE", "cro-HR" ), + ), + ); + } + + /** + * Test for the listLocationAliases() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::listLocationAliases + * @dataProvider providerForTestListAutogeneratedLocationAliasesWithLanguageCodeAlwaysAvailableEmpty + */ + public function testListAutogeneratedLocationAliasesWithLanguageCodeAlwaysAvailableEmpty( + $spiUrlAliases, + $languageCode, + $prioritizedLanguageCodes + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAliases = $urlAliasService->listLocationAliases( $location, false, $languageCode ); + + self::assertEmpty( $urlAliases ); + } + + public function providerForTestReverseLookup() + { + return $this->providerForTestListAutogeneratedLocationAliasesPath(); + } + + /** + * Test for the reverseLookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::reverseLookup + * @dataProvider providerForTestReverseLookup + */ + public function testReverseLookupPath( $spiUrlAliases, $prioritizedLanguageCodes, $paths, $reverseLookupLanguageCode ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAlias = $urlAliasService->reverseLookup( $location, null ); + + if ( $urlAlias->languageCodes === array( $reverseLookupLanguageCode ) ) + { + self::assertEquals( + $paths[$reverseLookupLanguageCode], + $urlAlias->path + ); + } + else + { + self::fail(); + } + } + + public function providerForTestReverseLookupAlwaysAvailablePath() + { + return $this->providerForTestListAutogeneratedLocationAliasesAlwaysAvailablePath(); + } + + /** + * Test for the reverseLookup() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::reverseLookup + * @dataProvider providerForTestReverseLookupAlwaysAvailablePath + */ + public function testReverseLookupAlwaysAvailablePath( + $spiUrlAliases, + $prioritizedLanguageCodes, + $paths + ) + { + $urlAliasService = $this->getRepository()->getURLAliasService(); + $configuration = array( + "prioritizedLanguageList" => $prioritizedLanguageCodes, + "showAllTranslations" => false, + ); + $this->setConfiguration( $urlAliasService, $configuration ); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "listURLAliasesForLocation" + )->with( + $this->equalTo( 42 ), + $this->equalTo( false ) + )->will( + $this->returnValue( $spiUrlAliases ) + ); + + $location = $this->getLocationStub(); + $urlAlias = $urlAliasService->reverseLookup( $location, null ); + + self::assertEquals( + reset( $paths ), + $urlAlias->path + ); + } + + /** + * Test for the createUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createUrlAlias + */ + public function testCreateUrlAliasBehaviour() + { + $location = $this->getLocationStub(); + $urlAliasService = $this->getRepository()->getURLAliasService(); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "createCustomUrlAlias" + )->with( + $this->equalTo( $location->id ), + $this->equalTo( "path" ), + $this->equalTo( "forwarding" ), + $this->equalTo( "languageCode" ), + $this->equalTo( "alwaysAvailable" ) + )->will( + $this->returnValue( new SPIUrlAlias ) + ); + + $urlAlias = $urlAliasService->createUrlAlias( $location, "path", "languageCode", "forwarding", "alwaysAvailable" ); + + self::assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias", + $urlAlias + ); + } + + /** + * Test for the createGlobalUrlAlias() method. + * + * @covers \eZ\Publish\Core\Repository\URLAliasService::createGlobalUrlAlias + */ + public function testCreateGlobalUrlAliasBehaviour() + { + $resource = "module:content/search"; + $urlAliasService = $this->getRepository()->getURLAliasService(); + $urlAliasHandler = $this->getPersistenceMockHandler( 'Content\\UrlAlias\\Handler' ); + $urlAliasHandler->expects( + $this->once() + )->method( + "createGlobalUrlAlias" + )->with( + $this->equalTo( $resource ), + $this->equalTo( "path" ), + $this->equalTo( "forwarding" ), + $this->equalTo( "languageCode" ), + $this->equalTo( "alwaysAvailable" ) + )->will( + $this->returnValue( new SPIUrlAlias ) + ); + + $urlAlias = $urlAliasService->createGlobalUrlAlias( $resource, "path", "languageCode", "forwarding", "alwaysAvailable" ); + + self::assertInstanceOf( + "eZ\\Publish\\API\\Repository\\Values\\Content\\URLAlias", + $urlAlias + ); + } + + /** + * @param int $id + * + * @return \eZ\Publish\Core\Repository\Values\Content\Location + */ + protected function getLocationStub( $id = 42 ) + { + return new Location( array( "id" => $id ) ); + } + + /** + * @param object $urlAliasService + * @param array $configuration + */ + protected function setConfiguration( $urlAliasService, array $configuration ) + { + $refObject = new \ReflectionObject( $urlAliasService ); + $refProperty = $refObject->getProperty( 'settings' ); + $refProperty->setAccessible( true ); + $refProperty->setValue( + $urlAliasService, + $configuration + ); + } + + /** + * Returns the content service to test with $methods mocked + * + * Injected Repository comes from {@see getRepositoryMock()} and persistence handler from {@see getPersistenceMock()} + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Repository\URLAliasService|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartlyMockedURLAliasServiceService( array $methods = null ) + { + return $this->getMock( + "eZ\\Publish\\Core\\Repository\\URLAliasService", + $methods, + array( + $this->getRepositoryMock(), + $this->getPersistenceMock()->urlAliasHandler() + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Service/Mock/UrlWildcardTest.php b/eZ/Publish/Core/Repository/Tests/Service/Mock/UrlWildcardTest.php new file mode 100644 index 0000000..ab786d8 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Service/Mock/UrlWildcardTest.php @@ -0,0 +1,105 @@ +<?php +/** + * File contains: eZ\Publish\Core\Repository\Tests\Service\Mock\UrlWildcardBase class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Service\Integration; + +use eZ\Publish\Core\Repository\Tests\Service\Mock\Base as BaseServiceMockTest; +use eZ\Publish\API\Repository\Values\Content\URLWildcard; +use eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult; + +/** + * Mock Test case for UrlWildcard Service + */ +class UrlWildcardTest extends BaseServiceMockTest +{ + /** + * Test for the __construct() method. + * + * @covers \eZ\Publish\Core\Repository\URLWildcardService::__construct + */ + public function testConstructor() + { + $service = $this->getPartlyMockedURLWildcardService(); + + self::assertAttributeSame( $this->getRepositoryMock(), "repository", $service ); + self::assertAttributeSame( $this->getPersistenceMockHandler( 'Content\\UrlWildcard\\Handler' ), "urlWildcardHandler", $service ); + self::assertAttributeSame( array(), "settings", $service ); + } + + /** + * Test for the create() method. + * + * @depends testConstructor + * @covers \eZ\Publish\Core\Repository\URLWildcardService::create + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testCreateThrowsUnauthorizedException() + { + $mockedService = $this->getPartlyMockedURLWildcardService(); + $repositoryMock = $this->getRepositoryMock(); + $repositoryMock->expects( + $this->once() + )->method( + "hasAccess" + )->with( + $this->equalTo( "content" ), + $this->equalTo( "urltranslator" ) + )->will( + $this->returnValue( false ) + ); + + $mockedService->create( "lorem/ipsum", "opossum", true ); + } + + /** + * Test for the remove() method. + * + * @depends testConstructor + * @covers \eZ\Publish\Core\Repository\URLWildcardService::remove + * @expectedException \eZ\Publish\API\Repository\Exceptions\UnauthorizedException + */ + public function testRemoveThrowsUnauthorizedException() + { + $mockedService = $this->getPartlyMockedURLWildcardService(); + $repositoryMock = $this->getRepositoryMock(); + $repositoryMock->expects( + $this->once() + )->method( + "hasAccess" + )->with( + $this->equalTo( "content" ), + $this->equalTo( "urltranslator" ) + )->will( + $this->returnValue( false ) + ); + + $mockedService->remove( new URLWildcard() ); + } + + /** + * Returns the content service to test with $methods mocked + * + * Injected Repository comes from {@see getRepositoryMock()} and persistence handler from {@see getPersistenceMock()} + * + * @param string[] $methods + * + * @return \eZ\Publish\Core\Repository\URLWildcardService|\PHPUnit_Framework_MockObject_MockObject + */ + protected function getPartlyMockedURLWildcardService( array $methods = null ) + { + return $this->getMock( + "eZ\\Publish\\Core\\Repository\\URLWildcardService", + $methods, + array( + $this->getRepositoryMock(), + $this->getPersistenceMock()->urlWildcardHandler() + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/Content/ContentInfoTest.php b/eZ/Publish/Core/Repository/Tests/Values/Content/ContentInfoTest.php new file mode 100644 index 0000000..4c9cea8 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/Content/ContentInfoTest.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the ContentInfoTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\Content; + +use eZ\Publish\Core\Repository\Values\Content\ContentInfo; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class ContentInfoTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\Content\ContentInfo::getProperties + */ + public function testObjectProperties() + { + $object = new ContentInfo; + $properties = $object->attributes(); + //self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'contentType', $properties, 'Property not found' ); + self::assertContains( 'id', $properties, 'Property not found' ); + self::assertContains( 'name', $properties, 'Property not found' ); + self::assertContains( 'sectionId', $properties, 'Property not found' ); + self::assertContains( 'currentVersionNo', $properties, 'Property not found' ); + self::assertContains( 'published', $properties, 'Property not found' ); + self::assertContains( 'ownerId', $properties, 'Property not found' ); + self::assertContains( 'modificationDate', $properties, 'Property not found' ); + self::assertContains( 'publishedDate', $properties, 'Property not found' ); + self::assertContains( 'alwaysAvailable', $properties, 'Property not found' ); + self::assertContains( 'remoteId', $properties, 'Property not found' ); + self::assertContains( 'mainLanguageCode', $properties, 'Property not found' ); + self::assertContains( 'mainLocationId', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/Content/ContentTest.php b/eZ/Publish/Core/Repository/Tests/Values/Content/ContentTest.php new file mode 100644 index 0000000..61ce820 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/Content/ContentTest.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the ContentTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\Content; + +use eZ\Publish\Core\Repository\Values\Content\Content; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class ContentTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\Content\Content::getProperties + */ + public function testObjectProperties() + { + $object = new Content( array( 'internalFields' => array() ) ); + $properties = $object->attributes(); + self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'id', $properties, 'Property not found ' ); + self::assertContains( 'fields', $properties, 'Property not found ' ); + self::assertContains( 'versionInfo', $properties, 'Property not found ' ); + self::assertContains( 'contentInfo', $properties, 'Property not found ' ); + self::assertContains( 'contentType', $properties, 'Property not found ' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/Content/LocationTest.php b/eZ/Publish/Core/Repository/Tests/Values/Content/LocationTest.php new file mode 100644 index 0000000..c016c80 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/Content/LocationTest.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the LocationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\Content; + +use eZ\Publish\Core\Repository\Values\Content\Location; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class LocationTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\Content\Location::getProperties + */ + public function testObjectProperties() + { + $object = new Location; + $properties = $object->attributes(); + //self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'contentInfo', $properties, 'Property not found' ); + self::assertContains( 'contentId', $properties, 'Property not found' ); + self::assertContains( 'id', $properties, 'Property not found' ); + self::assertContains( 'priority', $properties, 'Property not found' ); + self::assertContains( 'hidden', $properties, 'Property not found' ); + self::assertContains( 'invisible', $properties, 'Property not found' ); + self::assertContains( 'remoteId', $properties, 'Property not found' ); + self::assertContains( 'parentLocationId', $properties, 'Property not found' ); + self::assertContains( 'pathString', $properties, 'Property not found' ); + self::assertContains( 'path', $properties, 'Property not found' ); + self::assertContains( 'depth', $properties, 'Property not found' ); + self::assertContains( 'sortField', $properties, 'Property not found' ); + self::assertContains( 'sortOrder', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/Content/TrashItemTest.php b/eZ/Publish/Core/Repository/Tests/Values/Content/TrashItemTest.php new file mode 100644 index 0000000..baafeaf --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/Content/TrashItemTest.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the TrashItemTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\Content; + +use eZ\Publish\Core\Repository\Values\Content\TrashItem; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class TrashItemTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\Content\TrashItem::getProperties + */ + public function testObjectProperties() + { + $object = new TrashItem; + $properties = $object->attributes(); + //self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'contentInfo', $properties, 'Property not found' ); + self::assertContains( 'contentId', $properties, 'Property not found' ); + self::assertContains( 'id', $properties, 'Property not found' ); + self::assertContains( 'priority', $properties, 'Property not found' ); + self::assertContains( 'hidden', $properties, 'Property not found' ); + self::assertContains( 'invisible', $properties, 'Property not found' ); + self::assertContains( 'remoteId', $properties, 'Property not found' ); + self::assertContains( 'parentLocationId', $properties, 'Property not found' ); + self::assertContains( 'pathString', $properties, 'Property not found' ); + self::assertContains( 'path', $properties, 'Property not found' ); + self::assertContains( 'depth', $properties, 'Property not found' ); + self::assertContains( 'sortField', $properties, 'Property not found' ); + self::assertContains( 'sortOrder', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/ContentType/ContentTypeDraftTest.php b/eZ/Publish/Core/Repository/Tests/Values/ContentType/ContentTypeDraftTest.php new file mode 100644 index 0000000..1651265 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/ContentType/ContentTypeDraftTest.php @@ -0,0 +1,66 @@ +<?php +/** + * File containing the ContentTypeDraftTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\ContentType; + +use eZ\Publish\Core\Repository\Values\ContentType\ContentTypeDraft; +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class ContentTypeDraftTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\ContentType\ContentTypeDraft::getProperties + */ + public function testObjectProperties() + { + $object = new ContentTypeDraft( + array( + 'innerContentType' => new ContentType( array( 'fieldDefinitions' => array() ) ) + ) + ); + $properties = $object->attributes(); + self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'contentTypeGroups', $properties, 'Property not found' ); + self::assertContains( 'fieldDefinitions', $properties, 'Property not found' ); + self::assertContains( 'id', $properties, 'Property not found' ); + self::assertContains( 'status', $properties, 'Property not found' ); + self::assertContains( 'identifier', $properties, 'Property not found' ); + self::assertContains( 'creationDate', $properties, 'Property not found' ); + self::assertContains( 'modificationDate', $properties, 'Property not found' ); + self::assertContains( 'creatorId', $properties, 'Property not found' ); + self::assertContains( 'modifierId', $properties, 'Property not found' ); + self::assertContains( 'remoteId', $properties, 'Property not found' ); + self::assertContains( 'urlAliasSchema', $properties, 'Property not found' ); + self::assertContains( 'nameSchema', $properties, 'Property not found' ); + self::assertContains( 'isContainer', $properties, 'Property not found' ); + self::assertContains( 'mainLanguageCode', $properties, 'Property not found' ); + self::assertContains( 'defaultAlwaysAvailable', $properties, 'Property not found' ); + self::assertContains( 'defaultSortField', $properties, 'Property not found' ); + self::assertContains( 'defaultSortOrder', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/ContentType/ContentTypeTest.php b/eZ/Publish/Core/Repository/Tests/Values/ContentType/ContentTypeTest.php new file mode 100644 index 0000000..4fd8eda --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/ContentType/ContentTypeTest.php @@ -0,0 +1,61 @@ +<?php +/** + * File containing the ContentTypeTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\ContentType; + +use eZ\Publish\Core\Repository\Values\ContentType\ContentType; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class ContentTypeTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\ContentType\ContentType::getProperties + */ + public function testObjectProperties() + { + $object = new ContentType( array( 'fieldDefinitions' => array() ) ); + $properties = $object->attributes(); + self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'contentTypeGroups', $properties, 'Property not found' ); + self::assertContains( 'fieldDefinitions', $properties, 'Property not found' ); + self::assertContains( 'id', $properties, 'Property not found' ); + self::assertContains( 'status', $properties, 'Property not found' ); + self::assertContains( 'identifier', $properties, 'Property not found' ); + self::assertContains( 'creationDate', $properties, 'Property not found' ); + self::assertContains( 'modificationDate', $properties, 'Property not found' ); + self::assertContains( 'creatorId', $properties, 'Property not found' ); + self::assertContains( 'modifierId', $properties, 'Property not found' ); + self::assertContains( 'remoteId', $properties, 'Property not found' ); + self::assertContains( 'urlAliasSchema', $properties, 'Property not found' ); + self::assertContains( 'nameSchema', $properties, 'Property not found' ); + self::assertContains( 'isContainer', $properties, 'Property not found' ); + self::assertContains( 'mainLanguageCode', $properties, 'Property not found' ); + self::assertContains( 'defaultAlwaysAvailable', $properties, 'Property not found' ); + self::assertContains( 'defaultSortField', $properties, 'Property not found' ); + self::assertContains( 'defaultSortOrder', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/User/UserGroupTest.php b/eZ/Publish/Core/Repository/Tests/Values/User/UserGroupTest.php new file mode 100644 index 0000000..629a568 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/User/UserGroupTest.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the UserGroupTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\User; + +use eZ\Publish\Core\Repository\Values\User\UserGroup; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class UserGroupTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\User\User::getProperties + */ + public function testObjectProperties() + { + $object = new UserGroup; + $properties = $object->attributes(); + self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'parentId', $properties, 'Property not found' ); + self::assertContains( 'subGroupCount', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/Tests/Values/User/UserTest.php b/eZ/Publish/Core/Repository/Tests/Values/User/UserTest.php new file mode 100644 index 0000000..4882cc8 --- /dev/null +++ b/eZ/Publish/Core/Repository/Tests/Values/User/UserTest.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the UserTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Tests\Values\User; + +use eZ\Publish\Core\Repository\Values\User\User; +use PHPUnit_Framework_TestCase; + +/** + * + */ +class UserTest extends PHPUnit_Framework_TestCase +{ + /** + * @covers \eZ\Publish\Core\Repository\Values\User\User::getProperties + */ + public function testObjectProperties() + { + $object = new User; + $properties = $object->attributes(); + self::assertNotContains( 'internalFields', $properties, 'Internal property found ' ); + self::assertContains( 'login', $properties, 'Property not found' ); + self::assertContains( 'email', $properties, 'Property not found' ); + self::assertContains( 'passwordHash', $properties, 'Property not found' ); + self::assertContains( 'hashAlgorithm', $properties, 'Property not found' ); + self::assertContains( 'enabled', $properties, 'Property not found' ); + self::assertContains( 'maxLogin', $properties, 'Property not found' ); + + // check for duplicates and double check existence of property + $propertiesHash = array(); + foreach ( $properties as $property ) + { + if ( isset( $propertiesHash[$property] ) ) + { + self::fail( "Property '{$property}' exists several times in properties list" ); + } + else if ( !isset( $object->$property ) ) + { + self::fail( "Property '{$property}' does not exist on object, even though it was hinted to be there" ); + } + $propertiesHash[$property] = 1; + } + } +} diff --git a/eZ/Publish/Core/Repository/TrashService.php b/eZ/Publish/Core/Repository/TrashService.php new file mode 100644 index 0000000..38cd712 --- /dev/null +++ b/eZ/Publish/Core/Repository/TrashService.php @@ -0,0 +1,340 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\TrashService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\TrashService as TrashServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Handler; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\Repository\Values\Content\TrashItem; +use eZ\Publish\API\Repository\Values\Content\TrashItem as APITrashItem; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\SPI\Persistence\Content\Location\Trashed; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use eZ\Publish\API\Repository\Values\Content\SearchResult; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query\SortClause; +use DateTime; + +/** + * Trash service, used for managing trashed content + * + * @package eZ\Publish\Core\Repository + */ +class TrashService implements TrashServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Handler + */ + protected $persistenceHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Handler $handler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $handler, array $settings = array() ) + { + $this->repository = $repository; + $this->persistenceHandler = $handler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Loads a trashed location object from its $id. + * + * Note that $id is identical to original location, which has been previously trashed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the trashed location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the location with the given id does not exist + * + * @param int $trashItemId + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function loadTrashItem( $trashItemId ) + { + if ( !is_numeric( $trashItemId ) ) + throw new InvalidArgumentValue( "trashItemId", $trashItemId ); + + if ( $this->repository->hasAccess( 'content', 'restore' ) !== true ) + throw new UnauthorizedException( 'content', 'restore' ); + + $spiTrashItem = $this->persistenceHandler->trashHandler()->loadTrashItem( $trashItemId ); + $trash = $this->buildDomainTrashItemObject( $spiTrashItem ); + if ( !$this->repository->canUser( 'content', 'read', $trash->getContentInfo() ) ) + throw new UnauthorizedException( 'content', 'read' ); + + return $trash; + } + + /** + * Sends $location and all its children to trash and returns the corresponding trash item. + * + * Content is left untouched. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to trash the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return null|\eZ\Publish\API\Repository\Values\Content\TrashItem null if location was deleted, otherwise TrashItem + */ + public function trash( Location $location ) + { + if ( !is_numeric( $location->id ) ) + throw new InvalidArgumentValue( "id", $location->id, "Location" ); + + if ( $this->repository->canUser( 'content', 'manage_locations', $location->getContentInfo(), $location ) !== true ) + throw new UnauthorizedException( 'content', 'manage_locations' ); + + $this->repository->beginTransaction(); + try + { + $spiTrashItem = $this->persistenceHandler->trashHandler()->trashSubtree( $location->id ); + $this->persistenceHandler->urlAliasHandler()->locationDeleted( $location->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return isset( $spiTrashItem ) + ? $this->buildDomainTrashItemObject( $spiTrashItem ) + : null; + } + + /** + * Recovers the $trashedLocation at its original place if possible. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to recover the trash item at the parent location location + * + * If $newParentLocation is provided, $trashedLocation will be restored under it. + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created or recovered location + */ + public function recover( APITrashItem $trashItem, Location $newParentLocation = null ) + { + if ( !is_numeric( $trashItem->id ) ) + throw new InvalidArgumentValue( "id", $trashItem->id, "TrashItem" ); + + if ( $newParentLocation === null && !is_numeric( $trashItem->parentLocationId ) ) + throw new InvalidArgumentValue( "parentLocationId", $trashItem->parentLocationId, "TrashItem" ); + + if ( $newParentLocation !== null && !is_numeric( $newParentLocation->id ) ) + throw new InvalidArgumentValue( "parentLocationId", $newParentLocation->id, "Location" ); + + if ( $this->repository->hasAccess( 'content', 'restore' ) !== true ) + throw new UnauthorizedException( 'content', 'restore' ); + + $this->repository->beginTransaction(); + try + { + $newParentLocationId = $newParentLocation ? $newParentLocation->id : $trashItem->parentLocationId; + $newLocationId = $this->persistenceHandler->trashHandler()->recover( + $trashItem->id, + $newParentLocationId + ); + + $content = $this->repository->getContentService()->loadContent( $trashItem->contentId ); + $urlAliasNames = $this->repository->getNameSchemaService()->resolveUrlAliasSchema( $content ); + + // Publish URL aliases for recovered location + foreach ( $urlAliasNames as $languageCode => $name ) + { + $this->persistenceHandler->urlAliasHandler()->publishUrlAliasForLocation( + $newLocationId, + $newParentLocationId, + $name, + $languageCode, + $content->contentInfo->alwaysAvailable + ); + } + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->repository->getLocationService()->loadLocation( $newLocationId ); + } + + /** + * Empties trash. + * + * All locations contained in the trash will be removed. Content objects will be removed + * if all locations of the content are gone. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to empty the trash + */ + public function emptyTrash() + { + if ( $this->repository->hasAccess( 'content', 'cleantrash' ) !== true ) + throw new UnauthorizedException( 'content', 'cleantrash' ); + + $this->repository->beginTransaction(); + try + { + // Persistence layer takes care of deleting content objects + $this->persistenceHandler->trashHandler()->emptyTrash(); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Deletes a trash item. + * + * The corresponding content object will be removed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete this trash item + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + */ + public function deleteTrashItem( APITrashItem $trashItem ) + { + if ( $this->repository->hasAccess( 'content', 'cleantrash' ) !== true ) + throw new UnauthorizedException( 'content', 'cleantrash' ); + + if ( !is_numeric( $trashItem->id ) ) + throw new InvalidArgumentValue( "id", $trashItem->id, "TrashItem" ); + + $this->repository->beginTransaction(); + try + { + $this->persistenceHandler->trashHandler()->deleteTrashItem( $trashItem->id ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Returns a collection of Trashed locations contained in the trash. + * + * $query allows to filter/sort the elements to be contained in the collection. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * + * @return \eZ\Publish\API\Repository\Values\Content\SearchResult + */ + public function findTrashItems( Query $query ) + { + if ( $query->criterion !== null && !$query->criterion instanceof Criterion ) + throw new InvalidArgumentValue( "query->criterion", $query->criterion, "Query" ); + + if ( $query->sortClauses !== null ) + { + if ( !is_array( $query->sortClauses ) ) + throw new InvalidArgumentValue( "query->sortClauses", $query->sortClauses, "Query" ); + + foreach ( $query->sortClauses as $sortClause ) + { + if ( !$sortClause instanceof SortClause ) + throw new InvalidArgumentValue( "query->sortClauses", "only instances of SortClause class are allowed" ); + } + } + + if ( $query->offset !== null && !is_numeric( $query->offset ) ) + throw new InvalidArgumentValue( "query->offset", $query->offset, "Query" ); + + if ( $query->limit !== null && !is_numeric( $query->limit ) ) + throw new InvalidArgumentValue( "query->limit", $query->limit, "Query" ); + + $spiTrashItems = $this->persistenceHandler->trashHandler()->findTrashItems( + $query->criterion !== null ? $query->criterion : null, + $query->offset !== null && $query->offset > 0 ? (int)$query->offset : 0, + $query->limit !== null && $query->limit >= 1 ? (int)$query->limit : null, + $query->sortClauses !== null ? $query->sortClauses : null + ); + + $trashItems = array(); + foreach ( $spiTrashItems as $spiTrashItem ) + { + $trashItems[] = $this->buildDomainTrashItemObject( $spiTrashItem ); + } + + $searchResult = new SearchResult(); + $searchResult->count = count( $trashItems ); + $searchResult->items = $trashItems; + $searchResult->query = $query; + + return $searchResult; + } + + /** + * Builds the domain TrashItem object from provided persistence trash item + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\Trashed $spiTrashItem + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + protected function buildDomainTrashItemObject( Trashed $spiTrashItem ) + { + return new TrashItem( + array( + 'contentInfo' => $this->repository->getContentService()->loadContentInfo( $spiTrashItem->contentId ), + 'id' => (int)$spiTrashItem->id, + 'priority' => (int)$spiTrashItem->priority, + 'hidden' => (bool)$spiTrashItem->hidden, + 'invisible' => (bool)$spiTrashItem->invisible, + 'remoteId' => $spiTrashItem->remoteId, + 'parentLocationId' => (int)$spiTrashItem->parentId, + 'pathString' => $spiTrashItem->pathString, + 'depth' => (int)$spiTrashItem->depth, + 'sortField' => (int)$spiTrashItem->sortField, + 'sortOrder' => (int)$spiTrashItem->sortOrder, + ) + ); + } + + /** + * @param int $timestamp + * + * @return \DateTime + */ + protected function getDateTime( $timestamp ) + { + $dateTime = new DateTime(); + $dateTime->setTimestamp( $timestamp ); + return $dateTime; + } +} diff --git a/eZ/Publish/Core/Repository/URLAliasService.php b/eZ/Publish/Core/Repository/URLAliasService.php new file mode 100644 index 0000000..c072f3f --- /dev/null +++ b/eZ/Publish/Core/Repository/URLAliasService.php @@ -0,0 +1,672 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\URLAliasService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\URLAliasService as URLAliasServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\URLAlias; +use eZ\Publish\SPI\Persistence\Content\URLAlias as SPIURLAlias; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\API\Repository\Exceptions\ForbiddenException; +use Exception; + +/** + * URLAlias service + * + * @example Examples/urlalias.php + * + * @package eZ\Publish\Core\Repository + */ +class URLAliasService implements URLAliasServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler + */ + protected $urlAliasHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler $urlAliasHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $urlAliasHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->urlAliasHandler = $urlAliasHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + "showAllTranslations" => false + ); + // Get prioritized languages from language service to not have to call it several times + $this->settings['prioritizedLanguageList'] = $repository->getContentLanguageService()->getPrioritizedLanguageCodeList(); + } + + /** + * Create a user chosen $alias pointing to $location in $languageCode. + * + * This method runs URL filters and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * $alwaysAvailable makes the alias available in all languages. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $path + * @param boolean $forwarding if true a redirect is performed + * @param string $languageCode the languageCode for which this alias is valid + * @param boolean $alwaysAvailable + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createUrlAlias( Location $location, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + $path = $this->cleanUrl( $path ); + + $this->repository->beginTransaction(); + try + { + $spiUrlAlias = $this->urlAliasHandler->createCustomUrlAlias( + $location->id, + $path, + $forwarding, + $languageCode, + $alwaysAvailable + ); + $this->repository->commit(); + } + catch ( ForbiddenException $e ) + { + $this->repository->rollback(); + throw new InvalidArgumentException( + "\$path", + $e->getMessage(), + $e + ); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildUrlAliasDomainObject( $spiUrlAlias, $path ); + } + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * This method runs URL filters and and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * + * $alwaysAvailable makes the alias available in all languages. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given + * language or if resource is not valid + * + * @param string $resource + * @param string $path + * @param string $languageCode + * @param boolean $forwarding + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createGlobalUrlAlias( $resource, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + if ( !preg_match( "#^([a-zA-Z0-9_]+):(.+)$#", $resource, $matches ) ) + { + throw new InvalidArgumentException( "\$resource", "argument is not valid" ); + } + + $path = $this->cleanUrl( $path ); + + if ( $matches[1] === "eznode" || 0 === strpos( $matches[2], "module:content/view/full/" ) ) + { + if ( $matches[1] === "eznode" ) + { + $locationId = $matches[2]; + } + else + { + $resourcePath = explode( "/", $matches[2] ); + $locationId = end( $resourcePath ); + } + + return $this->createUrlAlias( + $locationId, + $path, + $languageCode, + $forwarding, + $alwaysAvailable + ); + } + + $this->repository->beginTransaction(); + try + { + $spiUrlAlias = $this->urlAliasHandler->createGlobalUrlAlias( + $matches[1] . ":" . $this->cleanUrl( $matches[2] ), + $path, + $forwarding, + $languageCode, + $alwaysAvailable + ); + $this->repository->commit(); + } + catch ( ForbiddenException $e ) + { + $this->repository->rollback(); + throw new InvalidArgumentException( "\$path", $e->getMessage(), $e ); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildUrlAliasDomainObject( $spiUrlAlias, $path ); + } + + /** + * List of url aliases pointing to $location. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * @param string $languageCode filters those which are valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listLocationAliases( Location $location, $custom = true, $languageCode = null ) + { + $urlAliasList = array(); + $spiUrlAliasList = $this->urlAliasHandler->listURLAliasesForLocation( + $location->id, + $custom + ); + + foreach ( $spiUrlAliasList as $spiUrlAlias ) + { + if ( !$this->isUrlAliasLoadable( $spiUrlAlias, $languageCode ) ) + { + continue; + } + + $path = $this->extractPath( $spiUrlAlias, $languageCode ); + if ( $path === false ) + { + continue; + } + + $urlAliasList[] = $this->buildUrlAliasDomainObject( $spiUrlAlias, $path ); + } + + return $urlAliasList; + } + + /** + * Determines alias language code. + * + * Method will return false if language code can't be matched against alias language codes or language settings. + * + * @param \eZ\Publish\SPI\Persistence\Content\URLAlias $spiUrlAlias + * @param string|null $languageCode + * + * @return string|boolean + */ + protected function selectAliasLanguageCode( SPIURLAlias $spiUrlAlias, $languageCode ) + { + if ( isset( $languageCode ) && !in_array( $languageCode, $spiUrlAlias->languageCodes ) ) + { + return false; + } + + foreach ( $this->settings["prioritizedLanguageList"] as $languageCode ) + { + if ( in_array( $languageCode, $spiUrlAlias->languageCodes ) ) + { + return $languageCode; + } + } + + if ( $spiUrlAlias->alwaysAvailable || $this->settings["showAllTranslations"] ) + { + $lastLevelData = end( $spiUrlAlias->pathData ); + return key( $lastLevelData["translations"] ); + } + + return false; + } + + /** + * Returns path extracted from normalized path data returned from persistence, using language settings. + * + * Will return false if path could not be determined. + * + * @param \eZ\Publish\SPI\Persistence\Content\URLAlias $spiUrlAlias + * @param string $languageCode + * + * @return string|boolean + */ + protected function extractPath( SPIURLAlias $spiUrlAlias, $languageCode ) + { + $pathData = array(); + $pathLevels = count( $spiUrlAlias->pathData ); + + foreach ( $spiUrlAlias->pathData as $level => $levelEntries ) + { + if ( $level === $pathLevels - 1 ) + { + $prioritizedLanguageCode = $this->selectAliasLanguageCode( $spiUrlAlias, $languageCode ); + } + else + { + $prioritizedLanguageCode = $this->choosePrioritizedLanguageCode( $levelEntries ); + } + + if ( $prioritizedLanguageCode === false ) + { + return false; + } + + $pathData[$level] = $levelEntries["translations"][$prioritizedLanguageCode]; + } + + return implode( "/", $pathData ); + } + + /** + * Returns language code with highest priority. + * + * Will return false if language code could nto be matched with language settings in place. + * + * @param array $entries + * + * @return string|boolean + */ + protected function choosePrioritizedLanguageCode( array $entries ) + { + foreach ( $this->settings["prioritizedLanguageList"] as $prioritizedLanguageCode ) + { + if ( isset( $entries["translations"][$prioritizedLanguageCode] ) ) + { + return $prioritizedLanguageCode; + } + } + + if ( $entries["always-available"] || $this->settings["showAllTranslations"] ) + { + return key( $entries["translations"] ); + } + + return false; + } + + /** + * Matches path string with normalized path data returned from persistence. + * + * Returns matched path string (possibly case corrected) and array of corresponding language codes or false + * if path could not be matched. + * + * @param \eZ\Publish\SPI\Persistence\Content\URLAlias $spiUrlAlias + * @param string $path + * @param string $languageCode + * + * @return array + */ + protected function matchPath( SPIURLAlias $spiUrlAlias, $path, $languageCode ) + { + $matchedPathElements = array(); + $matchedPathLanguageCodes = array(); + $pathElements = explode( "/", $path ); + $pathLevels = count( $spiUrlAlias->pathData ); + + foreach ( $pathElements as $level => $pathElement ) + { + if ( $level === $pathLevels - 1 ) + { + $matchedLanguageCode = $this->selectAliasLanguageCode( $spiUrlAlias, $languageCode ); + } + else + { + $matchedLanguageCode = $this->matchLanguageCode( $spiUrlAlias->pathData[$level], $pathElement ); + } + + if ( $matchedLanguageCode === false ) + { + return array( false, false ); + } + + $matchedPathLanguageCodes[] = $matchedLanguageCode; + $matchedPathElements[] = $spiUrlAlias->pathData[$level]["translations"][$matchedLanguageCode]; + } + + return array( implode( "/", $matchedPathElements ), $matchedPathLanguageCodes ); + } + + /** + * @param array $pathElementData + * @param string $pathElement + * + * @return string|boolean + */ + protected function matchLanguageCode( array $pathElementData, $pathElement ) + { + foreach ( $pathElementData["translations"] as $languageCode => $translation ) + { + if ( strtolower( $pathElement ) === strtolower( $translation ) ) + { + return $languageCode; + } + } + + return false; + } + + /** + * Returns true or false depending if URL alias is loadable or not for language settings in place. + * + * @param \eZ\Publish\SPI\Persistence\Content\URLAlias $spiUrlAlias + * @param string|null $languageCode + * + * @return boolean + */ + protected function isUrlAliasLoadable( SPIURLAlias $spiUrlAlias, $languageCode ) + { + if ( isset( $languageCode ) && !in_array( $languageCode, $spiUrlAlias->languageCodes ) ) + { + return false; + } + + if ( $this->settings["showAllTranslations"] ) + { + return true; + } + + foreach ( $spiUrlAlias->pathData as $levelPathData ) + { + if ( $levelPathData["always-available"] ) + { + continue; + } + + foreach ( $levelPathData["translations"] as $translationLanguageCode => $translation ) + { + if ( in_array( $translationLanguageCode, $this->settings["prioritizedLanguageList"] ) ) + { + continue 2; + } + } + + return false; + } + + return true; + } + + /** + * Returns true or false depending if URL alias is loadable or not for language settings in place. + * + * @param array $pathData + * @param array $languageCodes + * + * @return boolean + */ + protected function isPathLoadable( array $pathData, array $languageCodes ) + { + if ( $this->settings["showAllTranslations"] ) + { + return true; + } + + foreach ( $pathData as $level => $levelPathData ) + { + if ( $levelPathData["always-available"] ) + { + continue; + } + + if ( in_array( $languageCodes[$level], $this->settings["prioritizedLanguageList"] ) ) + { + continue; + } + + return false; + } + + return true; + } + + /** + * List global aliases + * + * @param string $languageCode filters those which are valid for the given language + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listGlobalAliases( $languageCode = null, $offset = 0, $limit = -1 ) + { + $urlAliasList = array(); + $spiUrlAliasList = $this->urlAliasHandler->listGlobalURLAliases( + $languageCode, + $offset, + $limit + ); + + foreach ( $spiUrlAliasList as $spiUrlAlias ) + { + $path = $this->extractPath( $spiUrlAlias, $languageCode ); + if ( $path === false ) + { + continue; + } + + $urlAliasList[] = $this->buildUrlAliasDomainObject( $spiUrlAlias, $path ); + } + + return $urlAliasList; + } + + /** + * Removes urls aliases. + * + * This method does not remove autogenerated aliases for locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if alias list contains + * autogenerated alias + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias[] $aliasList + * + * @return void + */ + public function removeAliases( array $aliasList ) + { + $spiUrlAliasList = array(); + foreach ( $aliasList as $alias ) + { + if ( !$alias->isCustom ) + { + throw new InvalidArgumentException( + "\$aliasList", + "Alias list contains autogenerated alias" + ); + } + $spiUrlAliasList[] = $this->buildSPIUrlAlias( $alias ); + } + + $this->repository->beginTransaction(); + try + { + $this->urlAliasHandler->removeURLAliases( $spiUrlAliasList ); + $this->repository->commit(); + } + catch ( Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Builds persistence domain object. + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias $urlAlias + * + * @return \eZ\Publish\SPI\Persistence\Content\URLAlias + */ + protected function buildSPIUrlAlias( URLAlias $urlAlias ) + { + return new SPIURLAlias( + array( + "id" => $urlAlias->id, + "isCustom" => $urlAlias->isCustom + ) + ); + } + + /** + * looks up the URLAlias for the given url. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the path does not exist or is not valid for the given language + * + * @param string $url + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function lookup( $url, $languageCode = null ) + { + $url = $this->cleanUrl( $url ); + + $spiUrlAlias = $this->urlAliasHandler->lookup( $url ); + + list( $path, $languageCodes ) = $this->matchPath( $spiUrlAlias, $url, $languageCode ); + if ( $path === false || !$this->isPathLoadable( $spiUrlAlias->pathData, $languageCodes ) ) + { + throw new NotFoundException( "URLAlias", $url ); + } + + return $this->buildUrlAliasDomainObject( $spiUrlAlias, $path ); + } + + /** + * Returns the URL alias for the given location in the given language. + * + * If $languageCode is null the method returns the url alias in the most prioritized language. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if no url alias exist for the given language + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function reverseLookup( Location $location, $languageCode = null ) + { + $urlAliases = $this->listLocationAliases( $location, false, $languageCode ); + + foreach ( $this->settings["prioritizedLanguageList"] as $prioritizedLanguageCode ) + { + foreach ( $urlAliases as $urlAlias ) + { + if ( in_array( $prioritizedLanguageCode, $urlAlias->languageCodes ) ) + { + return $urlAlias; + } + } + } + + foreach ( $urlAliases as $urlAlias ) + { + if ( $urlAlias->alwaysAvailable ) + { + return $urlAlias; + } + } + + throw new NotFoundException( "URLAlias", $location->id ); + } + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function load( $id ) + { + $spiUrlAlias = $this->urlAliasHandler->loadUrlAlias( $id ); + $path = $this->extractPath( $spiUrlAlias, null ); + + if ( $path === false ) + { + throw new NotFoundException( "URLAlias", $id ); + } + + return $this->buildUrlAliasDomainObject( $spiUrlAlias, $path ); + } + + /** + * @param string $url + * + * @return string + */ + protected function cleanUrl( $url ) + { + return trim( $url, "/ " ); + } + + /** + * Builds API UrlAlias object from given SPI UrlAlias object + * + * @param \eZ\Publish\SPI\Persistence\Content\URLAlias $spiUrlAlias + * @param string|null $path + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + protected function buildUrlAliasDomainObject( SPIURLAlias $spiUrlAlias, $path ) + { + return new URLAlias( + array( + "id" => $spiUrlAlias->id, + "type" => $spiUrlAlias->type, + "destination" => $spiUrlAlias->destination, + "languageCodes" => $spiUrlAlias->languageCodes, + "alwaysAvailable" => $spiUrlAlias->alwaysAvailable, + "path" => "/" . $path, + "isHistory" => $spiUrlAlias->isHistory, + "isCustom" => $spiUrlAlias->isCustom, + "forward" => $spiUrlAlias->forward + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/URLWildcardService.php b/eZ/Publish/Core/Repository/URLWildcardService.php new file mode 100644 index 0000000..290924b --- /dev/null +++ b/eZ/Publish/Core/Repository/URLWildcardService.php @@ -0,0 +1,343 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\URLWildcardService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\API\Repository\URLWildcardService as URLWildcardServiceInterface; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler; +use eZ\Publish\API\Repository\Values\Content\URLWildcard; +use eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult; +use eZ\Publish\SPI\Persistence\Content\UrlWildcard as SPIUrlWildcard; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\ContentValidationException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; + +/** + * URLAlias service + * + * @example Examples/urlalias.php + * + * @package eZ\Publish\Core\Repository + */ +class URLWildcardService implements URLWildcardServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler + */ + protected $urlWildcardHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler $urlWildcardHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $urlWildcardHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->urlWildcardHandler = $urlWildcardHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + //'defaultSetting' => array(), + ); + } + + /** + * Creates a new url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the $sourceUrl pattern already exists + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create url wildcards + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if the number of "*" patterns in $sourceUrl and + * the numbers in {\d} placeholders in $destinationUrl does not match. + * + * @param string $sourceUrl + * @param string $destinationUrl + * @param boolean $forward + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard + */ + public function create( $sourceUrl, $destinationUrl, $forward = false ) + { + if ( $this->repository->hasAccess( 'content', 'urltranslator' ) !== true ) + { + throw new UnauthorizedException( 'content', 'urltranslator' ); + } + + $sourceUrl = $this->cleanUrl( $sourceUrl ); + $destinationUrl = $this->cleanUrl( $destinationUrl ); + + $spiUrlWildcards = $this->urlWildcardHandler->loadAll(); + foreach ( $spiUrlWildcards as $wildcard ) + { + if ( $wildcard->sourceUrl === $sourceUrl ) + { + throw new InvalidArgumentException( + "\$sourceUrl", + "Pattern already exists" + ); + } + } + + preg_match_all( '(\\*)', $sourceUrl, $patterns ); + preg_match_all( '(\{(\d+)\})', $destinationUrl, $placeholders ); + + $patterns = array_map( 'intval', $patterns[0] ); + $placeholders = array_map( 'intval', $placeholders[1] ); + + if ( !empty( $placeholders ) && max( $placeholders ) > count( $patterns ) ) + { + throw new ContentValidationException( "Placeholders are not matching with wildcards." ); + } + + $this->repository->beginTransaction(); + try + { + $spiUrlWildcard = $this->urlWildcardHandler->create( + $sourceUrl, + $destinationUrl, + $forward + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildUrlWildcardDomainObject( $spiUrlWildcard ); + } + + /** + * Removes leading and trailing slashes and spaces. + * + * @param string $url + * + * @return string + */ + protected function cleanUrl( $url ) + { + return "/" . trim( $url, "/ " ); + } + + /** + * removes an url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove url wildcards + * + * @param \eZ\Publish\API\Repository\Values\Content\UrlWildcard $urlWildcard the url wildcard to remove + */ + public function remove( URLWildcard $urlWildcard ) + { + if ( $this->repository->hasAccess( 'content', 'urltranslator' ) !== true ) + { + throw new UnauthorizedException( 'content', 'urltranslator' ); + } + + $this->repository->beginTransaction(); + try + { + $this->urlWildcardHandler->remove( + $urlWildcard->id + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Loads a url wild card + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard + */ + public function load( $id ) + { + return $this->buildUrlWildcardDomainObject( + $this->urlWildcardHandler->load( $id ) + ); + } + + /** + * Loads all url wild card (paged) + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard[] + */ + public function loadAll( $offset = 0, $limit = -1 ) + { + $spiUrlWildcards = $this->urlWildcardHandler->loadAll( + $offset, + $limit + ); + + $urlWildcards = array(); + foreach ( $spiUrlWildcards as $spiUrlWildcard ) + { + $urlWildcards[] = $this->buildUrlWildcardDomainObject( $spiUrlWildcard ); + } + + return $urlWildcards; + } + + /** + * Translates an url to an existing uri resource based on the + * source/destination patterns of the url wildcard. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url could not be translated + * + * @param mixed $url + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult + */ + public function translate( $url ) + { + $spiUrlWildcards = $this->urlWildcardHandler->loadAll(); + + // sorts wildcards by length of source URL string + // @todo sort by specificity of the pattern? + uasort( + $spiUrlWildcards, + function( SPIUrlWildcard $w1, SPIUrlWildcard $w2 ) + { + return strlen( $w2->sourceUrl ) - strlen( $w1->sourceUrl ); + } + ); + + foreach ( $spiUrlWildcards as $wildcard ) + { + if ( $uri = $this->match( $url, $wildcard ) ) + { + return new URLWildcardTranslationResult( + array( + 'uri' => $uri, + 'forward' => $wildcard->forward + ) + ); + } + } + + throw new NotFoundException( "URLWildcard", $url ); + } + + /** + * Map by specificity + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlWildcard[] $spiUrlWildcards + * + * @todo use or remove + * + * @return array + */ + private function buildSpecificityScoreMap( array $spiUrlWildcards ) + { + $map = array(); + + foreach ( $spiUrlWildcards as $spiUrlWildcard ) + { + $map[$spiUrlWildcard->id] = preg_replace( "/[\\D]/", "", strtr( $spiUrlWildcard->sourceUrl, "/*", "10" ) ); + } + + return $map; + } + + /** + * Tests if the given url matches against the given url wildcard. + * + * if the wildcard matches on the given url this method will return a ready + * to use destination url, otherwise this method will return <b>NULL</b>. + * + * @param string $url + * @param \eZ\Publish\SPI\Persistence\Content\UrlWildcard $wildcard + * + * @return null|string + */ + private function match( $url, SPIUrlWildcard $wildcard ) + { + if ( preg_match( $this->compile( $wildcard->sourceUrl ), $url, $match ) ) + { + return $this->substitute( $wildcard->destinationUrl, $match ); + } + return null; + } + + /** + * Compiles the given url pattern into a regular expression. + * + * @param string $sourceUrl + * + * @return string + */ + private function compile( $sourceUrl ) + { + return '(^' . str_replace( '\\*', '(.*)', preg_quote( $sourceUrl ) ) . '$)U'; + } + + /** + * Substitutes all placeholders ({\d}) in the given <b>$destinationUrl</b> with + * the values from the given <b>$values</b> array. + * + * @param string $destinationUrl + * @param array $values + * + * @return string + */ + private function substitute( $destinationUrl, array $values ) + { + preg_match_all( '(\{(\d+)\})', $destinationUrl, $matches ); + + foreach ( $matches[1] as $match ) + { + $destinationUrl = str_replace( "{{$match}}", $values[$match], $destinationUrl ); + } + return $destinationUrl; + } + + /** + * Builds API UrlWildcard object from given SPI UrlWildcard object + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlWildcard $wildcard + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcard + */ + private function buildUrlWildcardDomainObject( SPIUrlWildcard $wildcard ) + { + return new URLWildcard( + array( + "id" => $wildcard->id, + "destinationUrl" => $wildcard->destinationUrl, + "sourceUrl" => $wildcard->sourceUrl, + "forward" => $wildcard->forward + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/UserService.php b/eZ/Publish/Core/Repository/UserService.php new file mode 100644 index 0000000..d388a23 --- /dev/null +++ b/eZ/Publish/Core/Repository/UserService.php @@ -0,0 +1,1223 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\UserService class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\Core\Repository + */ + +namespace eZ\Publish\Core\Repository; + +use eZ\Publish\Core\Repository\Values\User\UserCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserCreateStruct as APIUserCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserUpdateStruct; +use eZ\Publish\Core\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\User as APIUser; +use eZ\Publish\Core\Repository\Values\User\UserGroup; +use eZ\Publish\API\Repository\Values\User\UserGroup as APIUserGroup; +use eZ\Publish\Core\Repository\Values\User\UserGroupCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct as APIUserGroupCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\Content as APIContent; +use eZ\Publish\SPI\Persistence\User\Handler; +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\API\Repository\UserService as UserServiceInterface; +use eZ\Publish\SPI\Persistence\User as SPIUser; +use eZ\Publish\Core\FieldType\User\Value as UserValue; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LogicalAnd as CriterionLogicalAnd; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ContentTypeId as CriterionContentTypeId; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\LocationId as CriterionLocationId; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\ParentLocationId as CriterionParentLocationId; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion\Status as CriterionStatus; +use eZ\Publish\Core\Base\Exceptions\ContentValidationException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentValue; +use eZ\Publish\Core\Base\Exceptions\BadStateException; +use eZ\Publish\Core\Base\Exceptions\InvalidArgumentException; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; +use eZ\Publish\Core\Base\Exceptions\UnauthorizedException; +use ezcMailTools; + +/** + * This service provides methods for managing users and user groups + * + * @example Examples/user.php + * + * @package eZ\Publish\Core\Repository + */ +class UserService implements UserServiceInterface +{ + /** + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * @var \eZ\Publish\SPI\Persistence\User\Handler + */ + protected $userHandler; + + /** + * @var array + */ + protected $settings; + + /** + * Setups service with reference to repository object that created it & corresponding handler + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\SPI\Persistence\User\Handler $userHandler + * @param array $settings + */ + public function __construct( RepositoryInterface $repository, Handler $userHandler, array $settings = array() ) + { + $this->repository = $repository; + $this->userHandler = $userHandler; + // Union makes sure default settings are ignored if provided in argument + $this->settings = $settings + array( + 'anonymousUserID' => 10, + 'defaultUserPlacement' => 12, + 'userClassID' => 4,// @todo Rename this settings to swap out "Class" for "Type" + 'userGroupClassID' => 3, + 'hashType' => User::PASSWORD_HASH_MD5_USER, + 'siteName' => 'ez.no' + ); + } + + /** + * Creates a new user group using the data provided in the ContentCreateStruct parameter + * + * In 4.x in the content type parameter in the profile is ignored + * - the content type is determined via configuration and can be set to null. + * The returned version is published. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $userGroupCreateStruct a structure for setting all necessary data to create this user group + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $parentGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the input structure has invalid data + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or set to an empty value + */ + public function createUserGroup( APIUserGroupCreateStruct $userGroupCreateStruct, APIUserGroup $parentGroup ) + { + if ( !is_numeric( $parentGroup->id ) ) + throw new InvalidArgumentValue( "id", $parentGroup->id, "UserGroup" ); + + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + $contentTypeService = $this->repository->getContentTypeService(); + + if ( $userGroupCreateStruct->contentType === null ) + { + $userGroupContentType = $contentTypeService->loadContentType( $this->settings['userGroupClassID'] ); + $userGroupCreateStruct->contentType = $userGroupContentType; + } + + $loadedParentGroup = $this->loadUserGroup( $parentGroup->id ); + + if ( $loadedParentGroup->getVersionInfo()->getContentInfo()->mainLocationId === null ) + throw new InvalidArgumentException( "parentGroup", "parent user group has no main location" ); + + $locationCreateStruct = $locationService->newLocationCreateStruct( + $loadedParentGroup->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $this->repository->beginTransaction(); + try + { + $contentDraft = $contentService->createContent( $userGroupCreateStruct, array( $locationCreateStruct ) ); + $publishedContent = $contentService->publishVersion( $contentDraft->getVersionInfo() ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainUserGroupObject( $publishedContent ); + } + + /** + * Loads a user group for the given id + * + * @param int $id + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the user group with the given id was not found + */ + public function loadUserGroup( $id ) + { + if ( !is_numeric( $id ) ) + throw new InvalidArgumentValue( "id", $id ); + + $content = $this->repository->getContentService()->loadContent( $id ); + + return $this->buildDomainUserGroupObject( $content ); + } + + /** + * Loads the sub groups of a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the user group + */ + public function loadSubUserGroups( APIUserGroup $userGroup ) + { + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + $locationService = $this->repository->getLocationService(); + + $loadedUserGroup = $this->loadUserGroup( $userGroup->id ); + if ( !$this->repository->canUser( 'content', 'read', $loadedUserGroup ) ) + throw new UnauthorizedException( 'content', 'read' ); + + if ( $loadedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId === null ) + return array(); + + $mainGroupLocation = $locationService->loadLocation( + $loadedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $searchResult = $this->searchSubGroups( + $mainGroupLocation->id, + $mainGroupLocation->sortField, + $mainGroupLocation->sortOrder + ); + if ( $searchResult->totalCount == 0 ) + return array(); + + $subUserGroups = array(); + foreach ( $searchResult->searchHits as $searchHit ) + { + $subUserGroups[] = $this->buildDomainUserGroupObject( $searchHit->valueObject ); + } + + return $subUserGroups; + } + + /** + * Returns (searches) subgroups of a user group described by its main location + * + * @param int $locationId + * @param int|null $sortField + * @param int $sortOrder + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + protected function searchSubGroups( $locationId, $sortField = null, $sortOrder = Location::SORT_ORDER_ASC, $offset = 0, $limit = -1 ) + { + $searchQuery = new Query(); + + $searchQuery->offset = $offset >= 0 ? (int)$offset : 0; + $searchQuery->limit = $limit >= 0 ? (int)$limit : null; + + $searchQuery->criterion = new CriterionLogicalAnd( + array( + new CriterionContentTypeId( $this->settings['userGroupClassID'] ), + new CriterionParentLocationId( $locationId ), + new CriterionStatus( CriterionStatus::STATUS_PUBLISHED ) + ) + ); + + $sortClause = null; + if ( $sortField !== null ) + $sortClause = array( $this->getSortClauseBySortField( $sortField, $sortOrder ) ); + + $searchQuery->sortClauses = $sortClause; + + return $this->repository->getSearchService()->findContent( $searchQuery, array(), false ); + } + + /** + * Removes a user group + * + * the users which are not assigned to other groups will be deleted. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + */ + public function deleteUserGroup( APIUserGroup $userGroup ) + { + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + $loadedUserGroup = $this->loadUserGroup( $userGroup->id ); + + $this->repository->beginTransaction(); + try + { + //@todo: what happens to sub user groups and users below sub user groups + $this->repository->getContentService()->deleteContent( $loadedUserGroup->getVersionInfo()->getContentInfo() ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Moves the user group to another parent + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $newParent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + */ + public function moveUserGroup( APIUserGroup $userGroup, APIUserGroup $newParent ) + { + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + if ( !is_numeric( $newParent->id ) ) + throw new InvalidArgumentValue( "id", $newParent->id, "UserGroup" ); + + $loadedUserGroup = $this->loadUserGroup( $userGroup->id ); + $loadedNewParent = $this->loadUserGroup( $newParent->id ); + + $locationService = $this->repository->getLocationService(); + + if ( $loadedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId === null ) + throw new BadStateException( "userGroup", 'existing user group is not stored and/or does not have any location yet' ); + + if ( $loadedNewParent->getVersionInfo()->getContentInfo()->mainLocationId === null ) + throw new BadStateException( "newParent", 'new user group is not stored and/or does not have any location yet' ); + + $userGroupMainLocation = $locationService->loadLocation( + $loadedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId + ); + $newParentMainLocation = $locationService->loadLocation( + $loadedNewParent->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $this->repository->beginTransaction(); + try + { + $locationService->moveSubtree( $userGroupMainLocation, $newParentMainLocation ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Updates the group profile with fields and meta data + * + * 4.x: If the versionUpdateStruct is set in $userGroupUpdateStruct, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explicitly required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct $userGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update the user group + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + */ + public function updateUserGroup( APIUserGroup $userGroup, UserGroupUpdateStruct $userGroupUpdateStruct ) + { + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + if ( $userGroupUpdateStruct->contentUpdateStruct === null && + $userGroupUpdateStruct->contentMetadataUpdateStruct === null ) + { + // both update structs are empty, nothing to do + return $userGroup; + } + + $contentService = $this->repository->getContentService(); + + $loadedUserGroup = $this->loadUserGroup( $userGroup->id ); + + $this->repository->beginTransaction(); + try + { + $publishedContent = $loadedUserGroup; + if ( $userGroupUpdateStruct->contentUpdateStruct !== null ) + { + $contentDraft = $contentService->createContentDraft( $loadedUserGroup->getVersionInfo()->getContentInfo() ); + + $contentDraft = $contentService->updateContent( + $contentDraft->getVersionInfo(), + $userGroupUpdateStruct->contentUpdateStruct + ); + + $publishedContent = $contentService->publishVersion( $contentDraft->getVersionInfo() ); + } + + if ( $userGroupUpdateStruct->contentMetadataUpdateStruct !== null ) + { + $publishedContent = $contentService->updateContentMetadata( + $publishedContent->getVersionInfo()->getContentInfo(), + $userGroupUpdateStruct->contentMetadataUpdateStruct + ); + } + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainUserGroupObject( $publishedContent ); + } + + /** + * Create a new user. The created user is published by this method + * + * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup[] $parentGroups the groups which are assigned to the user after creation + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a user with provided login already exists + */ + public function createUser( APIUserCreateStruct $userCreateStruct, array $parentGroups ) + { + if ( empty( $parentGroups ) ) + throw new InvalidArgumentValue( "parentGroups", $parentGroups ); + + if ( !is_string( $userCreateStruct->login ) || empty( $userCreateStruct->login ) ) + throw new InvalidArgumentValue( "login", $userCreateStruct->login, "UserCreateStruct" ); + + if ( !is_string( $userCreateStruct->email ) || empty( $userCreateStruct->email ) ) + throw new InvalidArgumentValue( "email", $userCreateStruct->email, "UserCreateStruct" ); + + if ( !ezcMailTools::validateEmailAddress( $userCreateStruct->email ) ) + throw new InvalidArgumentValue( "email", $userCreateStruct->email, "UserCreateStruct" ); + + if ( !is_string( $userCreateStruct->password ) || empty( $userCreateStruct->password ) ) + throw new InvalidArgumentValue( "password", $userCreateStruct->password, "UserCreateStruct" ); + + if ( !is_bool( $userCreateStruct->enabled ) ) + throw new InvalidArgumentValue( "enabled", $userCreateStruct->enabled, "UserCreateStruct" ); + + try + { + $this->userHandler->loadByLogin( $userCreateStruct->login ); + throw new InvalidArgumentException( "userCreateStruct", "User with provided login already exists" ); + } + catch ( NotFoundException $e ) + { + // Do nothing + } + + $contentService = $this->repository->getContentService(); + $locationService = $this->repository->getLocationService(); + $contentTypeService = $this->repository->getContentTypeService(); + + if ( $userCreateStruct->contentType === null ) + { + $userContentType = $contentTypeService->loadContentType( $this->settings['userClassID'] ); + $userCreateStruct->contentType = $userContentType; + } + + $locationCreateStructs = array(); + foreach ( $parentGroups as $parentGroup ) + { + $parentGroup = $this->loadUserGroup( $parentGroup->id ); + if ( $parentGroup->getVersionInfo()->getContentInfo()->mainLocationId !== null ) + { + $locationCreateStructs[] = $locationService->newLocationCreateStruct( + $parentGroup->getVersionInfo()->getContentInfo()->mainLocationId + ); + } + } + + // Search for the first ezuser field type in content type + $userFieldDefinition = null; + foreach ( $userCreateStruct->contentType->getFieldDefinitions() as $fieldDefinition ) + { + if ( $fieldDefinition->fieldTypeIdentifier == 'ezuser' ) + { + $userFieldDefinition = $fieldDefinition; + break; + } + } + + if ( $userFieldDefinition === null ) + { + throw new ContentValidationException( "Provided content type does not contain ezuser field type" ); + } + + $fixUserFieldType = true; + foreach ( $userCreateStruct->fields as $index => $field ) + { + if ( $field->fieldDefIdentifier == $userFieldDefinition->identifier ) + { + if ( $field->value instanceof UserValue ) + { + $userCreateStruct->fields[$index]->value->login = $userCreateStruct->login; + } + else + { + $userCreateStruct->fields[$index]->value = new UserValue( + array( + 'login' => $userCreateStruct->login + ) + ); + } + + $fixUserFieldType = false; + } + } + + if ( $fixUserFieldType ) + { + $userCreateStruct->setField( + $userFieldDefinition->identifier, + new UserValue( + array( + 'login' => $userCreateStruct->login + ) + ) + ); + } + + $this->repository->beginTransaction(); + try + { + $contentDraft = $contentService->createContent( $userCreateStruct, $locationCreateStructs ); + $publishedContent = $contentService->publishVersion( $contentDraft->getVersionInfo() ); + + $spiUser = $this->userHandler->create( + new SPIUser( + array( + 'id' => $publishedContent->id, + 'login' => $userCreateStruct->login, + 'email' => $userCreateStruct->email, + 'passwordHash' => $this->createPasswordHash( + $userCreateStruct->login, + $userCreateStruct->password, + $this->settings['siteName'], + $this->settings['hashType'] + ), + 'hashAlgorithm' => $this->settings['hashType'], + 'isEnabled' => $userCreateStruct->enabled, + 'maxLogin' => 0 + ) + ) + ); + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->buildDomainUserObject( + $spiUser, + $contentService->loadContent( $publishedContent->id )// Reload to get with updated user field value + ); + } + + /** + * Loads a user + * + * @param int $userId + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + */ + public function loadUser( $userId ) + { + if ( !is_numeric( $userId ) ) + throw new InvalidArgumentValue( "userId", $userId ); + + /** @var \eZ\Publish\API\Repository\Values\Content\Content $content */ + $content = $this->repository->getContentService()->internalLoadContent( $userId ); + // Get spiUser value from Field Value + foreach ( $content->getFields() as $field ) + { + if ( !$field->value instanceof UserValue ) + continue; + + /** @var \eZ\Publish\Core\FieldType\User\Value $value */ + $value = $field->value; + $spiUser = new SPIUser(); + $spiUser->id = $value->contentId; + $spiUser->login = $value->login; + $spiUser->email = $value->email; + $spiUser->hashAlgorithm = $value->passwordHashType; + $spiUser->passwordHash = $value->passwordHash; + $spiUser->isEnabled = $value->enabled; + $spiUser->maxLogin = $value->maxLogin; + break; + } + + // If for some reason not found, load it + if ( !isset( $spiUser ) ) + { + $spiUser = $this->userHandler->load( $userId ); + } + + return $this->buildDomainUserObject( $spiUser, $content ); + } + + /** + * Loads anonymous user + * + * @uses loadUser() + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function loadAnonymousUser() + { + return $this->loadUser( $this->settings['anonymousUserID'] ); + } + + /** + * Loads a user for the given login and password + * + * @param string $login + * @param string $password the plain password + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given credentials was not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if multiple users with same login were found + */ + public function loadUserByCredentials( $login, $password ) + { + if ( !is_string( $login ) || empty( $login ) ) + throw new InvalidArgumentValue( "login", $login ); + + if ( !is_string( $password ) || empty( $password ) ) + throw new InvalidArgumentValue( "password", $password ); + + // Randomize login time to protect against timing attacks + usleep( mt_rand( 0, 30000 ) ); + + $spiUsers = $this->userHandler->loadByLogin( $login ); + + if ( empty( $spiUsers ) ) + throw new NotFoundException( "user", $login ); + + if ( count( $spiUsers ) > 1 ) + { + // something went wrong, we should not have more than one + // user with the same login + throw new BadStateException( "login", 'found several users with same login' ); + } + + $passwordHash = $this->createPasswordHash( + $login, + $password, + $this->settings['siteName'], + $spiUsers[0]->hashAlgorithm + ); + + if ( $spiUsers[0]->passwordHash !== $passwordHash ) + throw new NotFoundException( "user", $login ); + + return $this->buildDomainUserObject( $spiUsers[0] ); + } + + /** + * This method deletes a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete the user + */ + public function deleteUser( APIUser $user ) + { + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + $loadedUser = $this->loadUser( $user->id ); + + $this->repository->beginTransaction(); + try + { + $this->repository->getContentService()->deleteContent( $loadedUser->getVersionInfo()->getContentInfo() ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Updates a user + * + * 4.x: If the versionUpdateStruct is set in the user update structure, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explicitly required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserUpdateStruct $userUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update the user + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function updateUser( APIUser $user, UserUpdateStruct $userUpdateStruct ) + { + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + // We need to determine if we have anything to update. + // UserUpdateStruct is specific as some of the new content is in + // content update struct and some of it is in additional fields like + // email, password and so on + $doUpdate = false; + foreach ( $userUpdateStruct as $propertyValue ) + { + if ( $propertyValue !== null ) + { + $doUpdate = true; + break; + } + } + + if ( !$doUpdate ) + { + // Nothing to update, so we just quit + return $user; + } + + if ( $userUpdateStruct->email !== null ) + { + if ( !is_string( $userUpdateStruct->email ) || empty( $userUpdateStruct->email ) ) + throw new InvalidArgumentValue( "email", $userUpdateStruct->email, "UserUpdateStruct" ); + + if ( !ezcMailTools::validateEmailAddress( $userUpdateStruct->email ) ) + throw new InvalidArgumentValue( "email", $userUpdateStruct->email, "UserUpdateStruct" ); + } + + if ( $userUpdateStruct->password !== null && ( !is_string( $userUpdateStruct->password ) || empty( $userUpdateStruct->password ) ) ) + throw new InvalidArgumentValue( "password", $userUpdateStruct->password, "UserUpdateStruct" ); + + if ( $userUpdateStruct->enabled !== null && !is_bool( $userUpdateStruct->enabled ) ) + throw new InvalidArgumentValue( "enabled", $userUpdateStruct->enabled, "UserUpdateStruct" ); + + if ( $userUpdateStruct->maxLogin !== null && !is_numeric( $userUpdateStruct->maxLogin ) ) + throw new InvalidArgumentValue( "maxLogin", $userUpdateStruct->maxLogin, "UserUpdateStruct" ); + + $contentService = $this->repository->getContentService(); + $loadedUser = $this->loadUser( $user->id ); + + if ( !$this->repository->canUser( 'content', 'edit', $loadedUser ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $this->repository->beginTransaction(); + try + { + $publishedContent = $loadedUser; + if ( $userUpdateStruct->contentUpdateStruct !== null ) + { + $contentDraft = $contentService->createContentDraft( $loadedUser->getVersionInfo()->getContentInfo() ); + $contentDraft = $contentService->updateContent( + $contentDraft->getVersionInfo(), + $userUpdateStruct->contentUpdateStruct + ); + $publishedContent = $contentService->publishVersion( $contentDraft->getVersionInfo() ); + } + + if ( $userUpdateStruct->contentMetadataUpdateStruct !== null ) + { + $contentService->updateContentMetadata( + $publishedContent->getVersionInfo()->getContentInfo(), + $userUpdateStruct->contentMetadataUpdateStruct + ); + } + + $this->userHandler->update( + new SPIUser( + array( + 'id' => $loadedUser->id, + 'login' => $loadedUser->login, + 'email' => $userUpdateStruct->email ?: $loadedUser->email, + 'passwordHash' => $userUpdateStruct->password ? + $this->createPasswordHash( + $loadedUser->login, + $userUpdateStruct->password, + $this->settings['siteName'], + $this->settings['hashType'] + ) : + $loadedUser->passwordHash, + 'hashAlgorithm' => $this->settings['hashType'], + 'isEnabled' => $userUpdateStruct->enabled !== null ? $userUpdateStruct->enabled : $loadedUser->enabled, + 'maxLogin' => $userUpdateStruct->maxLogin !== null ? (int)$userUpdateStruct->maxLogin : $loadedUser->maxLogin + ) + ) + ); + + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + + return $this->loadUser( $loadedUser->id ); + } + + /** + * Assigns a new user group to the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign the user group to the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is already in the given user group + */ + public function assignUserToUserGroup( APIUser $user, APIUserGroup $userGroup ) + { + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + $loadedUser = $this->loadUser( $user->id ); + $loadedGroup = $this->loadUserGroup( $userGroup->id ); + $locationService = $this->repository->getLocationService(); + + $existingGroupIds = array(); + $userLocations = $locationService->loadLocations( $loadedUser->getVersionInfo()->getContentInfo() ); + foreach ( $userLocations as $userLocation ) + { + $existingGroupIds[] = $userLocation->parentLocationId; + } + + if ( $loadedGroup->getVersionInfo()->getContentInfo()->mainLocationId === null ) + { + throw new BadStateException( "userGroup", "user group has no main location or no locations" ); + } + + if ( in_array( $loadedGroup->getVersionInfo()->getContentInfo()->mainLocationId, $existingGroupIds ) ) + { + // user is already assigned to the user group + throw new InvalidArgumentException( "user", "user is already in the given user group" ); + } + + $locationCreateStruct = $locationService->newLocationCreateStruct( + $loadedGroup->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $this->repository->beginTransaction(); + try + { + $locationService->createLocation( + $loadedUser->getVersionInfo()->getContentInfo(), + $locationCreateStruct + ); + $this->repository->commit(); + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + + /** + * Removes a user group from the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove the user group from the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is not in the given user group + */ + public function unAssignUserFromUserGroup( APIUser $user, APIUserGroup $userGroup ) + { + if ( !is_numeric( $user->id ) ) + throw new InvalidArgumentValue( "id", $user->id, "User" ); + + if ( !is_numeric( $userGroup->id ) ) + throw new InvalidArgumentValue( "id", $userGroup->id, "UserGroup" ); + + $loadedUser = $this->loadUser( $user->id ); + $loadedGroup = $this->loadUserGroup( $userGroup->id ); + $locationService = $this->repository->getLocationService(); + + $userLocations = $locationService->loadLocations( $loadedUser->getVersionInfo()->getContentInfo() ); + if ( empty( $userLocations ) ) + throw new BadStateException( "user", "user has no locations, cannot unassign from group" ); + + if ( $loadedGroup->getVersionInfo()->getContentInfo()->mainLocationId === null ) + throw new BadStateException( "userGroup", "user group has no main location or no locations, cannot unassign" ); + + foreach ( $userLocations as $userLocation ) + { + if ( $userLocation->parentLocationId == $loadedGroup->getVersionInfo()->getContentInfo()->mainLocationId ) + { + $this->repository->beginTransaction(); + try + { + $locationService->deleteLocation( $userLocation ); + $this->repository->commit(); + return; + } + catch ( \Exception $e ) + { + $this->repository->rollback(); + throw $e; + } + } + } + + throw new InvalidArgumentException( "userGroup", "user is not in the given user group" ); + } + + /** + * Loads the user groups the user belongs to + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed read the user or user group + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + */ + public function loadUserGroupsOfUser( APIUser $user ) + { + $locationService = $this->repository->getLocationService(); + + if ( !$this->repository->canUser( 'content', 'edit', $user ) ) + throw new UnauthorizedException( 'content', 'edit' ); + + $userLocations = $locationService->loadLocations( + $user->getVersionInfo()->getContentInfo() + ); + + $parentLocationIds = array(); + foreach ( $userLocations as $userLocation ) + { + if ( $userLocation->parentLocationId !== null ) + $parentLocationIds[] = $userLocation->parentLocationId; + } + + $searchQuery = new Query(); + + $searchQuery->offset = 0; + $searchQuery->limit = null; + + $searchQuery->criterion = new CriterionLogicalAnd( + array( + new CriterionContentTypeId( $this->settings['userGroupClassID'] ), + new CriterionLocationId( $parentLocationIds ), + new CriterionStatus( CriterionStatus::STATUS_PUBLISHED ) + ) + ); + + $searchResult = $this->repository->getSearchService()->findContent( $searchQuery, array() ); + + $userGroups = array(); + foreach ( $searchResult->searchHits as $resultItem ) + { + $userGroups[] = $this->buildDomainUserGroupObject( $resultItem->valueObject ); + } + + return $userGroups; + } + + /** + * Loads the users of a user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the users or user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\User\User[] + */ + public function loadUsersOfUserGroup( APIUserGroup $userGroup, $offset = 0, $limit = -1 ) + { + $loadedUserGroup = $this->loadUserGroup( $userGroup->id ); + + if ( $loadedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId === null ) + return array(); + + $mainGroupLocation = $this->repository->getLocationService()->loadLocation( + $loadedUserGroup->getVersionInfo()->getContentInfo()->mainLocationId + ); + + $searchQuery = new Query(); + + $searchQuery->criterion = new CriterionLogicalAnd( + array( + new CriterionContentTypeId( $this->settings['userClassID'] ), + new CriterionParentLocationId( $mainGroupLocation->id ), + new CriterionStatus( CriterionStatus::STATUS_PUBLISHED ) + ) + ); + + $searchQuery->offset = $offset > 0 ? (int)$offset : 0; + $searchQuery->limit = $limit >= 1 ? (int)$limit : null; + + $searchQuery->sortClauses = array( + $this->getSortClauseBySortField( $mainGroupLocation->sortField, $mainGroupLocation->sortOrder ) + ); + + $searchResult = $this->repository->getSearchService()->findContent( $searchQuery, array() ); + + $users = array(); + foreach ( $searchResult->searchHits as $resultItem ) + { + $spiUser = $this->userHandler->load( $resultItem->valueObject->id ); + + $users[] = $this->buildDomainUserObject( $spiUser, $resultItem->valueObject ); + } + + return $users; + } + + /** + * Instantiate a user create class + * + * @param string $login the login of the new user + * @param string $email the email of the new user + * @param string $password the plain password of the new user + * @param string $mainLanguageCode the main language for the underlying content object + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserCreateStruct + */ + public function newUserCreateStruct( $login, $email, $password, $mainLanguageCode, $contentType = null ) + { + if ( $contentType === null ) + { + $contentType = $this->repository->getContentTypeService()->loadContentType( + $this->settings['userClassID'] + ); + } + + return new UserCreateStruct( + array( + 'contentType' => $contentType, + 'mainLanguageCode' => $mainLanguageCode, + 'login' => $login, + 'email' => $email, + 'password' => $password, + 'enabled' => true, + 'fields' => array(), + ) + ); + } + + /** + * Instantiate a user group create class + * + * @param string $mainLanguageCode The main language for the underlying content object + * @param null|\eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + */ + public function newUserGroupCreateStruct( $mainLanguageCode, $contentType = null ) + { + if ( $contentType === null ) + { + $contentType = $this->repository->getContentTypeService()->loadContentType( + $this->settings['userGroupClassID'] + ); + } + + return new UserGroupCreateStruct( + array( + 'contentType' => $contentType, + 'mainLanguageCode' => $mainLanguageCode, + 'fields' => array(), + ) + ); + } + + /** + * Instantiate a new user update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserUpdateStruct + */ + public function newUserUpdateStruct() + { + return new UserUpdateStruct(); + } + + /** + * Instantiate a new user group update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct + */ + public function newUserGroupUpdateStruct() + { + return new UserGroupUpdateStruct(); + } + + /** + * Builds the domain UserGroup object from provided Content object + * + * @param \eZ\Publish\API\Repository\Values\Content\Content $content + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + protected function buildDomainUserGroupObject( APIContent $content ) + { + $locationService = $this->repository->getLocationService(); + + $subGroupCount = 0; + if ( $content->getVersionInfo()->getContentInfo()->mainLocationId !== null ) + { + $mainLocation = $locationService->loadLocation( + $content->getVersionInfo()->getContentInfo()->mainLocationId + ); + $parentLocation = $locationService->loadLocation( $mainLocation->parentLocationId ); + $subGroups = $this->searchSubGroups( $mainLocation->id, null, Location::SORT_ORDER_ASC, 0, 0 ); + $subGroupCount = $subGroups->totalCount; + } + + return new UserGroup( + array( + 'content' => $content, + 'parentId' => isset( $parentLocation ) ? $parentLocation->contentId : null, + 'subGroupCount' => $subGroupCount + ) + ); + } + + /** + * Builds the domain user object from provided persistence user object + * + * @param \eZ\Publish\SPI\Persistence\User $spiUser + * @param \eZ\Publish\API\Repository\Values\Content\Content|null $content + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + protected function buildDomainUserObject( SPIUser $spiUser, APIContent $content = null ) + { + if ( $content === null ) + $content = $this->repository->getContentService()->internalLoadContent( $spiUser->id ); + + return new User( + array( + 'content' => $content, + 'login' => $spiUser->login, + 'email' => $spiUser->email, + 'passwordHash' => $spiUser->passwordHash, + 'hashAlgorithm' => (int)$spiUser->hashAlgorithm, + 'enabled' => $spiUser->isEnabled, + 'maxLogin' => (int)$spiUser->maxLogin, + ) + ); + } + + /** + * Returns password hash based on user data and site settings + * + * @param string $login User login + * @param string $password User password + * @param string $site The name of the site + * @param int $type Type of password to generate + * + * @return string Generated password hash + */ + protected function createPasswordHash( $login, $password, $site, $type ) + { + switch ( $type ) + { + case User::PASSWORD_HASH_MD5_PASSWORD: + return md5( $password ); + + case User::PASSWORD_HASH_MD5_USER: + return md5( "$login\n$password" ); + + case User::PASSWORD_HASH_MD5_SITE: + return md5( "$login\n$password\n$site" ); + + case User::PASSWORD_HASH_PLAINTEXT: + return $password; + + default: + return md5( $password ); + } + } + + /** + * Instantiates a correct sort clause object based on provided location sort field and sort order + * + * @param int $sortField + * @param int $sortOrder + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\SortClause + */ + protected function getSortClauseBySortField( $sortField, $sortOrder = Location::SORT_ORDER_ASC ) + { + $sortOrder = $sortOrder == Location::SORT_ORDER_DESC ? Query::SORT_DESC : Query::SORT_ASC; + switch ( $sortField ) + { + case Location::SORT_FIELD_PATH: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationPathString( $sortOrder ); + + case Location::SORT_FIELD_PUBLISHED: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\DatePublished( $sortOrder ); + + case Location::SORT_FIELD_MODIFIED: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\DateModified( $sortOrder ); + + case Location::SORT_FIELD_SECTION: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\SectionIdentifier( $sortOrder ); + + case Location::SORT_FIELD_DEPTH: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationDepth( $sortOrder ); + + //@todo: enable + // case APILocation::SORT_FIELD_CLASS_IDENTIFIER: + + //@todo: enable + // case APILocation::SORT_FIELD_CLASS_NAME: + + case Location::SORT_FIELD_PRIORITY: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationPriority( $sortOrder ); + + case Location::SORT_FIELD_NAME: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\ContentName( $sortOrder ); + + //@todo: enable + // case APILocation::SORT_FIELD_MODIFIED_SUBNODE: + + //@todo: enable + // case APILocation::SORT_FIELD_NODE_ID: + + //@todo: enable + // case APILocation::SORT_FIELD_CONTENTOBJECT_ID: + + default: + return new \eZ\Publish\API\Repository\Values\Content\Query\SortClause\LocationPathString( $sortOrder ); + } + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/Content.php b/eZ/Publish/Core/Repository/Values/Content/Content.php new file mode 100644 index 0000000..c166e50 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/Content.php @@ -0,0 +1,215 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\Content class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\Content as APIContent; + +/** + * + * this class represents a content object in a specific version + * + * @property-read \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo convenience getter for $versionInfo->contentInfo + * @property-read \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType convenience getter for $versionInfo->contentInfo->contentType + * @property-read mixed $id convenience getter for retrieving the contentId: $versionInfo->content->id + * @property-read \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo calls getVersionInfo() + * @property-read \eZ\Publish\API\Repository\Values\Content\Field[] $fields Access fields, calls getFields() + */ +class Content extends APIContent +{ + /** + * @var mixed[][] An array of array of field values like $fields[$fieldDefIdentifier][$languageCode] + */ + protected $fields; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + protected $versionInfo; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} + */ + private $internalFields; + + function __construct( array $data = array() ) + { + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + foreach ( $this->internalFields as $field ) + { + $this->fields[$field->fieldDefIdentifier][$field->languageCode] = $field->value; + } + } + + /** + * Returns the VersionInfo for this version + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function getVersionInfo() + { + return $this->versionInfo; + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + if ( null === $languageCode ) + { + $languageCode = $this->versionInfo->contentInfo->mainLanguageCode; + } + + if ( isset( $this->fields[$fieldDefIdentifier][$languageCode] ) ) + { + return $this->fields[$fieldDefIdentifier][$languageCode]; + } + + return null; + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} + */ + public function getFields() + { + return $this->internalFields; + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If not set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] An array of {@link Field} with field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + $fields = array(); + + if ( null === $languageCode ) + { + $languageCode = $this->versionInfo->contentInfo->mainLanguageCode; + } + + foreach ( $this->getFields() as $field ) + { + if ( $field->languageCode !== $languageCode ) continue; + $fields[$field->fieldDefIdentifier] = $field; + } + + return $fields; + } + + /** + * This method returns the field for a given field definition identifier and language + * + * If not set the initialLanguage of the content version is used. + * + * @param string $fieldDefIdentifier + * @param null $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field|null A {@link Field} or null if nothing is found + */ + public function getField( $fieldDefIdentifier, $languageCode = null ) + { + if ( null === $languageCode ) + { + $languageCode = $this->versionInfo->contentInfo->mainLanguageCode; + } + + foreach ( $this->getFields() as $field ) + { + if ( $field->fieldDefIdentifier === $fieldDefIdentifier + && $field->languageCode === $languageCode ) + { + return $field; + } + } + + return null; + } + + /** + * Function where list of properties are returned + * + * Override to add dynamic properties + * @uses parent::getProperties() + * + * @param array $dynamicProperties + * + * @return array + */ + protected function getProperties( $dynamicProperties = array( 'id', 'contentInfo', 'contentType' ) ) + { + return parent::getProperties( $dynamicProperties ); + } + + /** + * Magic getter for retrieving convenience properties + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + switch ( $property ) + { + case 'id': + return $this->versionInfo->contentInfo->id; + + case 'contentType': + return $this->versionInfo->contentInfo->contentType; + + case 'contentInfo': + return $this->versionInfo->contentInfo; + } + + return parent::__get( $property ); + } + + /** + * Magic isset for singaling existence of convenience properties + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + if ( $property === 'id' ) + return true; + + if ( $property === 'contentType' ) + return true; + + if ( $property === 'contentInfo' ) + return true; + + return parent::__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/ContentCreateStruct.php b/eZ/Publish/Core/Repository/Values/Content/ContentCreateStruct.php new file mode 100644 index 0000000..142ccb2 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/ContentCreateStruct.php @@ -0,0 +1,55 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\ContentCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\ContentCreateStruct as APIContentCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * This class is used for creating a new content object + * @property-write \eZ\Publish\API\Repository\Values\Content\Field[] $fields + */ +class ContentCreateStruct extends APIContentCreateStruct +{ + /** + * Field collection + * + * @var \eZ\Publish\API\Repository\Values\Content\Field[] $fields + */ + public $fields = array(); + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( !isset( $language ) ) + $language = $this->mainLanguageCode; + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/ContentInfo.php b/eZ/Publish/Core/Repository/Values/Content/ContentInfo.php new file mode 100644 index 0000000..28bfabf --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/ContentInfo.php @@ -0,0 +1,84 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\ContentInfo class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\ContentInfo as APIContentInfo; + +/** + * This class provides all version independent information of the content object. + * + * @property-read \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType ( @deprecated Use $contentTypeId ) + * @property-read mixed $id The unique id of the content object + * @property-read mixed $contentTypeId The unique id of the content type object this content is an instance of + * @property-read string $name the computed name (via name schema) in the main language of the content object + * @property-read mixed $sectionId the section to which the content is assigned + * @property-read int $currentVersionNo Current Version number is the version number of the published version or the version number of a newly created draft (which is 1). + * @property-read boolean $published true if there exists a published version false otherwise + * @property-read mixed $ownerId the user id of the owner of the content + * @property-read \DateTime $modificationDate Content modification date + * @property-read \DateTime $publishedDate date of the last publish operation + * @property-read boolean $alwaysAvailable Indicates if the content object is shown in the mainlanguage if its not present in an other requested language + * @property-read string $remoteId a global unique id of the content object + * @property-read string $mainLanguageCode The main language code of the content. If the available flag is set to true the content is shown in this language if the requested language does not exist. + * @property-read mixed $mainLocationId Identifier of the main location. + */ +class ContentInfo extends APIContentInfo +{ + /** + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + protected $contentType; + + /** + * The content type of this content object + * + * @deprecated Use $contentTypeId and ContentTypeService + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function getContentType() + { + return $this->contentType; + } + + /** + * Magic getter for retrieving convenience properties + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + switch ( $property ) + { + case 'contentType': + return $this->contentType; + case 'contentTypeId': + return $this->contentType->id; + } + return parent::__get( $property ); + } + + /** + * Magic isset for signaling existence of convenience properties + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + if ( $property === 'contentType' || $property === 'contentTypeId' ) + return true; + + return parent::__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/ContentUpdateStruct.php b/eZ/Publish/Core/Repository/Values/Content/ContentUpdateStruct.php new file mode 100644 index 0000000..1cb6242 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/ContentUpdateStruct.php @@ -0,0 +1,54 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\ContentUpdateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct as APIContentUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * This class is used for updating the fields of a content object draft + * + * @property-write array $fields + */ +class ContentUpdateStruct extends APIContentUpdateStruct +{ + /** + * Field collection. + * + * @var array + */ + public $fields = array(); + + /** + * Adds a field to the field collection. + * This method could also be implemented by ArrayAccess so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * @param mixed $value Either a plain value which is understandable by the field type or an instance of a Value class provided by the field type + * @param string|null $language If not given on a translatable field the initial language is used, + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( !isset( $language ) ) + { + $language = $this->initialLanguageCode; + } + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/Location.php b/eZ/Publish/Core/Repository/Values/Content/Location.php new file mode 100644 index 0000000..287c6ef --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/Location.php @@ -0,0 +1,99 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\Location class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\Location as APILocation; + +/** + * This class represents a location in the repository + */ +class Location extends APILocation +{ + /** + * Content info of the content object of this location + * + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $contentInfo; + + /** + * @var array + */ + protected $path; + + /** + * Returns the content info of the content object of this location + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getContentInfo() + { + return $this->contentInfo; + } + + /** + * Function where list of properties are returned + * + * Override to add dynamic properties + * @uses parent::getProperties() + * + * @param array $dynamicProperties + * + * @return array + */ + protected function getProperties( $dynamicProperties = array( 'contentId' ) ) + { + return parent::getProperties( $dynamicProperties ); + } + + /** + * Magic getter for retrieving convenience properties + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + switch ( $property ) + { + case 'contentId': + return $this->contentInfo->id; + case 'path': + if ( $this->path !== null ) + { + return $this->path; + } + if ( isset( $this->pathString[1] ) && $this->pathString[0] === '/' ) + { + return $this->path = explode( '/', trim( $this->pathString, '/' ) ); + } + + return $this->path = array(); + } + + return parent::__get( $property ); + } + + /** + * Magic isset for signaling existence of convenience properties + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + if ( $property === 'contentId' || $property === 'path' ) + return true; + + return parent::__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/Relation.php b/eZ/Publish/Core/Repository/Values/Content/Relation.php new file mode 100644 index 0000000..3e41fba --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/Relation.php @@ -0,0 +1,58 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\Relation class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\Relation as APIRelation; + +/** + * Class representing a relation between content. + * + * @property-read mixed $id the internal id of the relation + * @property-read string $sourceFieldDefinitionIdentifier the field definition identifier of the field where this relation is anchored if the relation is of type EMBED, LINK, or ATTRIBUTE + * @property-read \eZ\Publish\API\Repository\Values\Content\ContentInfo $sourceContentInfo - calls {@link getSourceContentInfo()} + * @property-read \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContentInfo - calls {@link getDestinationContentInfo()} + * @property-read int $type The relation type bitmask containing one or more of Relation::COMMON, Relation::EMBED, Relation::LINK, Relation::FIELD + */ +class Relation extends APIRelation +{ + /** + * the content of the source content of the relation + * + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $sourceContentInfo; + + /** + * the content of the destination content of the relation + * + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $destinationContentInfo; + + /** + * the content of the source content of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getSourceContentInfo() + { + return $this->sourceContentInfo; + } + + /** + * the content of the destination content of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getDestinationContentInfo() + { + return $this->destinationContentInfo; + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/TranslationValues.php b/eZ/Publish/Core/Repository/Values/Content/TranslationValues.php new file mode 100644 index 0000000..fdcb70c --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/TranslationValues.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\TranslationValues class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\TranslationValues as APITranslationValues; + +/** + * This value object is used for adding a translation to a version + * + * @property-write FieldCollection $fields + */ +class TranslationValues extends APITranslationValues +{ + /** + * @var FieldCollection + */ + public $fields; + + /** + * Adds a translated field to the field collection in the given language + * This method is also be implemented by ArrayAccess so that + * $fields[$fieldDefIdentifier] = $value is an equivalent call + * + * @param string $fieldDefIdentifier the identifier of the field definition + * @param mixed $value Either a plain value which is understandable by the field type or an instance of a Value class provided by the field type + */ + public function setField( $fieldDefIdentifier, $value ) + { + // @todo: implement + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/TrashItem.php b/eZ/Publish/Core/Repository/Values/Content/TrashItem.php new file mode 100644 index 0000000..72337a4 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/TrashItem.php @@ -0,0 +1,94 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\TrashItem class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\TrashItem as APITrashItem; + +/** + * this class represents a trash item, which is actually a trashed location + */ +class TrashItem extends APITrashItem +{ + /** + * Content info of the content object of this trash item + * + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $contentInfo; + + /** + * Returns the content info of the content object of this trash item + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getContentInfo() + { + return $this->contentInfo; + } + + /** + * Function where list of properties are returned + * + * Override to add dynamic properties + * @uses parent::getProperties() + * + * @param array $dynamicProperties + * + * @return array + */ + protected function getProperties( $dynamicProperties = array( 'contentId', 'path' ) ) + { + return parent::getProperties( $dynamicProperties ); + } + + /** + * Magic getter for retrieving convenience properties + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + switch ( $property ) + { + case 'contentId': + return $this->contentInfo->id; + case 'path': + if ( $this->path !== null ) + { + return $this->path; + } + if ( isset( $this->pathString[1] ) && $this->pathString[0] === '/' ) + { + return $this->path = explode( '/', trim( $this->pathString, '/' ) ); + } + + return $this->path = array(); + } + + return parent::__get( $property ); + } + + /** + * Magic isset for signaling existence of convenience properties + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + if ( $property === 'contentId' || $property === 'path' ) + return true; + + return parent::__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/Content/VersionInfo.php b/eZ/Publish/Core/Repository/Values/Content/VersionInfo.php new file mode 100644 index 0000000..ef7a0d7 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/Content/VersionInfo.php @@ -0,0 +1,83 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\Content\VersionInfo class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\Content; + +use eZ\Publish\API\Repository\Values\Content\VersionInfo as APIVersionInfo; + +/** + * This class holds version information data. It also contains the corresponding {@link Content} to + * which the version belongs to. + * + * @property-read array $names returns an array with language code keys and name values + * @property-read \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo calls getContentInfo() + * @property-read int $id the internal id of the version + * @property-read int $versionNo the version number of this version (which only increments in scope of a single Content object) + * @property-read \DateTime $modifiedDate the last modified date of this version + * @property-read \DateTime $createdDate the creation date of this version + * @property-read int $creatorId the user id of the user which created this version + * @property-read int $status the status of this version. One of VersionInfo::STATUS_DRAFT, VersionInfo::STATUS_PUBLISHED, VersionInfo::STATUS_ARCHIVED + * @property-read string $initialLanguageCode the language code of the version. This value is used to flag a version as a translation to specific language + * @property-read array $languageCodes a collection of all languages which exist in this version. + */ +class VersionInfo extends APIVersionInfo +{ + /** + * @var array + */ + protected $names; + + /** + * @var \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + protected $contentInfo; + + /** + * Content of the content this version belongs to. + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function getContentInfo() + { + return $this->contentInfo; + } + + /** + * Returns the names computed from the name schema in the available languages. + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * Returns the name computed from the name schema in the given language. + * If no language is given the name in initial language of the version if present, otherwise null. + * + * @param string $languageCode + * + * @return string + */ + public function getName( $languageCode = null ) + { + if ( !isset( $languageCode ) ) + { + $languageCode = $this->initialLanguageCode; + } + + if ( isset( $this->names[$languageCode] ) ) + { + return $this->names[$languageCode]; + } + + return null; + } +} diff --git a/eZ/Publish/Core/Repository/Values/ContentType/ContentType.php b/eZ/Publish/Core/Repository/Values/ContentType/ContentType.php new file mode 100644 index 0000000..75c99a7 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ContentType/ContentType.php @@ -0,0 +1,210 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\ContentType\ContentType class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ContentType; + +use eZ\Publish\API\Repository\Values\ContentType\ContentType as APIContentType; + +/** + * this class represents a content type value + * + * @property-read \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $contentTypeGroups calls getContentTypeGroups + * @property-read \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] $fieldDefinitions calls getFieldDefinitions() or on access getFieldDefinition($fieldDefIdentifier) + * @property-read mixed $id the id of the content type + * @property-read int $status the status of the content type. One of ContentType::STATUS_DEFINED|ContentType::STATUS_DRAFT|ContentType::STATUS_MODIFIED + * @property-read string $identifier the identifier of the content type + * @property-read \DateTime $creationDate the date of the creation of this content type + * @property-read \DateTime $modificationDate the date of the last modification of this content type + * @property-read mixed $creatorId the user id of the creator of this content type + * @property-read mixed $modifierId the user id of the user which has last modified this content type + * @property-read string $remoteId a global unique id of the content object + * @property-read string $urlAliasSchema URL alias schema. If nothing is provided, $nameSchema will be used instead. + * @property-read string $nameSchema The name schema. + * @property-read boolean $isContainer Determines if the type is allowed to have children + * @property-read string $mainLanguageCode the main language of the content type names and description used for fallback. + * @property-read boolean $defaultAlwaysAvailable if an instance of a content type is created the always available flag is set by default this this value. + * @property-read int $defaultSortField Specifies which property the child locations should be sorted on by default when created. Valid values are found at {@link Location::SORT_FIELD_*} + * @property-read int $defaultSortOrder Specifies whether the sort order should be ascending or descending by default when created. Valid values are {@link Location::SORT_ORDER_*} + */ +class ContentType extends APIContentType +{ + /** + * Holds the collection of names with languageCode keys + * + * @var string[] + */ + protected $names; + + /** + * Holds the collection of descriptions with languageCode keys + * + * @var string[] + */ + protected $descriptions; + + /** + * Holds the collection of contenttypegroups the contenttype is assigned to + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + protected $contentTypeGroups; + + /** + * Contains the content type field definitions from this type + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + protected $fieldDefinitions; + + /** + * Field definitions indexed by identifier + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + protected $fieldDefinitionsByIdentifier; + + /** + * Field definitions indexed by id + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + protected $fieldDefinitionsById; + + function __construct( array $data = array() ) + { + foreach ( $data as $propertyName => $propertyValue ) + { + $this->$propertyName = $propertyValue; + } + foreach ( $this->fieldDefinitions as $fieldDefinition ) + { + $this->fieldDefinitionsByIdentifier[$fieldDefinition->identifier] = $fieldDefinition; + $this->fieldDefinitionsById[$fieldDefinition->id] = $fieldDefinition; + } + } + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + if ( isset( $this->names[$languageCode] ) ) + { + return $this->names[$languageCode]; + } + + return null; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + if ( isset( $languageCode, $this->descriptions ) ) + { + return $this->descriptions[$languageCode]; + } + + return null; + } + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function getContentTypeGroups() + { + return $this->contentTypeGroups; + } + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public function getFieldDefinitions() + { + return $this->fieldDefinitions; + } + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinition( $fieldDefinitionIdentifier ) + { + if ( isset( $this->fieldDefinitionsByIdentifier[$fieldDefinitionIdentifier] ) ) + { + return $this->fieldDefinitionsByIdentifier[$fieldDefinitionIdentifier]; + } + + return null; + } + + /** + * This method returns the field definition for the given id + * + * @param mixed $fieldDefinitionId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinitionById( $fieldDefinitionId ) + { + if ( isset( $this->fieldDefinitionsById[$fieldDefinitionId] ) ) + { + return $this->fieldDefinitionsById[$fieldDefinitionId]; + } + + return null; + } +} diff --git a/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeCreateStruct.php b/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeCreateStruct.php new file mode 100644 index 0000000..349fd81 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeCreateStruct.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\ContentType\ContentTypeCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ContentType; + +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct as APIContentTypeCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; + +/** + * this class is used for creating content types + * + * @property \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct[] $fieldDefinitions the collection of field definitions + */ +class ContentTypeCreateStruct extends APIContentTypeCreateStruct +{ + /** + * Holds the collection of field definitions + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct[] + */ + public $fieldDefinitions = array(); + + /** + * Adds a new field definition + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDef + */ + public function addFieldDefinition( FieldDefinitionCreateStruct $fieldDef ) + { + $this->fieldDefinitions[] = $fieldDef; + } +} diff --git a/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeDraft.php b/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeDraft.php new file mode 100644 index 0000000..7ac5269 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeDraft.php @@ -0,0 +1,176 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\ContentType\ContentTypeDraft class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ContentType; + +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft as APIContentTypeDraft; + +/** + * + * This class represents a draft of a content type + */ +class ContentTypeDraft extends APIContentTypeDraft +{ + /** + * Function where list of properties are returned + * + * Override to add dynamic properties + * @uses parent::getProperties() + * + * @param array $dynamicProperties + * + * @return array + */ + protected function getProperties( $dynamicProperties = array( 'contentTypeGroups', 'fieldDefinitions' ) ) + { + return parent::getProperties( $dynamicProperties ); + } + + /** + * Magic getter for routing get calls to innerContentType + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + return $this->innerContentType->$property; + } + + /** + * Magic set for routing set calls to innerContentType + * + * @param string $property + * @param mixed $propertyValue + */ + public function __set( $property, $propertyValue ) + { + $this->innerContentType->$property = $propertyValue; + } + + /** + * Magic isset for routing isset calls to innerContentType + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + return $this->innerContentType->__isset( $property ); + } + + /** + * Holds internal content type object + * + * @var \eZ\Publish\API\Repository\Values\ContentType\ContentType + * @todo document + */ + protected $innerContentType; + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->innerContentType->getNames(); + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + return $this->innerContentType->getName( $languageCode ); + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->innerContentType->getDescriptions(); + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + return $this->innerContentType->getDescription( $languageCode ); + } + + /** + * This method returns the content type groups this content type is assigned to + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function getContentTypeGroups() + { + return $this->innerContentType->contentTypeGroups; + } + + /** + * This method returns the content type field definitions from this type + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition[] + */ + public function getFieldDefinitions() + { + return $this->innerContentType->getFieldDefinitions(); + } + + /** + * This method returns the field definition for the given identifier + * + * @param string $fieldDefinitionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinition( $fieldDefinitionIdentifier ) + { + return $this->innerContentType->getFieldDefinition( $fieldDefinitionIdentifier ); + } + + /** + * This method returns the field definition for the given id + * + * @param mixed $fieldDefinitionId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public function getFieldDefinitionById( $fieldDefinitionId ) + { + return $this->innerContentType->getFieldDefinition( $fieldDefinitionId ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeGroup.php b/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeGroup.php new file mode 100644 index 0000000..952f081 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ContentType/ContentTypeGroup.php @@ -0,0 +1,111 @@ +<?php +/** + * File containing the ContentTypeGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ContentType; + +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup as APIContentTypeGroup; + +/** + * This class represents a content type group value + * + * @property-read string[] $names calls getNames() or on access getName($language) + * @property-read string[] $descriptions calls getDescriptions() or on access getDescription($language) + * @property-read mixed $id the id of the content type group + * @property-read string $identifier the identifier of the content type group + * @property-read \DateTime $creationDate the date of the creation of this content type group + * @property-read \DateTime $modificationDate the date of the last modification of this content type group + * @property-read mixed $creatorId the user id of the creator of this content type group + * @property-read mixed $modifierId the user id of the user which has last modified this content type group + * @property-read string $mainLanguageCode 5.0, the main language of the content type group names and description used for fallback. + */ +class ContentTypeGroup extends APIContentTypeGroup +{ + /** + * @var string[] + */ + protected $names; + + /** + * @var string[] + */ + protected $descriptions; + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @since 5.0 + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @since 5.0 + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + if ( array_key_exists( $languageCode, $this->names ) ) + { + return $this->names[$languageCode]; + } + + return null; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @since 5.0 + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @since 5.0 + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + if ( array_key_exists( $languageCode, $this->descriptions ) ) + { + return $this->descriptions[$languageCode]; + } + + return null; + } +} diff --git a/eZ/Publish/Core/Repository/Values/ContentType/FieldDefinition.php b/eZ/Publish/Core/Repository/Values/ContentType/FieldDefinition.php new file mode 100644 index 0000000..f6b3472 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ContentType/FieldDefinition.php @@ -0,0 +1,146 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\ContentType\FieldDefinition class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ContentType; + +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition as APIFieldDefinition; + +/** + * This class represents a field definition + * + * @property-read string[] $names calls getNames() or on access getName($language) + * @property-read string[] $descriptions calls getDescriptions() or on access getDescription($language) + * @property-read mixed $fieldSettings calls getFieldSettings() + * @property-read mixed $validatorConfiguration calls getValidatorConfiguration() + * @property-read mixed $id the id of the field definition + * @property-read string $identifier the identifier of the field definition + * @property-read string $fieldGroup the field group name + * @property-read int $position the position of the field definition in the content type + * @property-read string $fieldType String identifier of the field type + * @property-read boolean $isTranslatable indicates if fields of this definition are translatable + * @property-read boolean $isRequired indicates if this field is required in the content object + * @property-read boolean $isSearchable indicates if the field is searchable + * @property-read boolean $isInfoCollector indicates if this field is used for information collection + * @property-read mixed $defaultValue the default value of the field + */ +class FieldDefinition extends APIFieldDefinition +{ + /** + * Holds the collection of names with languageCode keys + * + * @var string[] + */ + protected $names; + + /** + * Holds the collection of descriptions with languageCode keys + * + * @var string[] + */ + protected $descriptions; + + /** + * Holds collection of settings for the field definition supported by the field type + * + * @var array + */ + protected $fieldSettings; + + /** + * Holds validator configuration of this field definition supported by the field type + * + * @var mixed + */ + protected $validatorConfiguration; + + /** + * This method returns the human readable name of this field in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + if ( array_key_exists( $languageCode, $this->names ) ) + { + return $this->names[$languageCode]; + } + + return null; + } + + /** + * This method returns the human readable description of the field + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the field in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + if ( array_key_exists( $languageCode, $this->descriptions ) ) + { + return $this->descriptions[$languageCode]; + } + + return null; + } + + /** + * This method returns the validator configuration of this field definition supported by the field type + * + * @return mixed + */ + public function getValidatorConfiguration() + { + return $this->validatorConfiguration; + } + + /** + * This method returns settings for the field definition supported by the field type + * + * @return array + */ + public function getFieldSettings() + { + return $this->fieldSettings; + } +} diff --git a/eZ/Publish/Core/Repository/Values/ContentType/FieldType.php b/eZ/Publish/Core/Repository/Values/ContentType/FieldType.php new file mode 100644 index 0000000..e587636 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ContentType/FieldType.php @@ -0,0 +1,217 @@ +<?php +/** + * File containing the eZ\Publish\API\Repository\FieldType class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package eZ\Publish\API\Repository + */ + +namespace eZ\Publish\Core\Repository\Values\ContentType; + +use eZ\Publish\API\Repository\FieldType as FieldTypeInterface; +use eZ\Publish\SPI\FieldType\FieldType as SPIFieldTypeInterface; + +/** + * This class represents a FieldType available to Public API users + * + * @package eZ\Publish\Core\Repository + * @see eZ\Publish\API\Repository\FieldType + */ +class FieldType implements FieldTypeInterface +{ + /** + * Holds internal FieldType object + * + * @var \eZ\Publish\Core\FieldType\FieldType + */ + protected $internalFieldType; + + /** + * @param \eZ\Publish\SPI\FieldType\FieldType $fieldType + */ + public function __construct( SPIFieldTypeInterface $fieldType ) + { + $this->internalFieldType = $fieldType; + } + + /** + * Returns the field type identifier for this field type + * + * @return string + */ + public function getFieldTypeIdentifier() + { + return $this->internalFieldType->getFieldTypeIdentifier(); + } + + public function getName( $value ) + { + return $this->internalFieldType->getName( $value ); + } + + /** + * Returns a schema for the settings expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the settings of + * the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementer to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * @return mixed + */ + public function getSettingsSchema() + { + return $this->internalFieldType->getSettingsSchema(); + } + + /** + * Returns a schema for the validator configuration expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the validator + * configuration of the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementer to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * Best practice: + * + * It is considered best practice to return a hash map, which contains + * rudimentary settings structures, like e.g. for the "ezstring" FieldType + * + * <code> + * array( + * 'stringLength' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * </code> + * + * @return mixed + */ + public function getValidatorConfigurationSchema() + { + return $this->internalFieldType->getValidatorConfigurationSchema(); + } + + /** + * Indicates if the field type supports indexing and sort keys for searching + * + * @return boolean + */ + public function isSearchable() + { + return $this->internalFieldType->isSearchable(); + } + + /** + * Returns the fallback default value of field type when no such default + * value is provided in the field definition in content types. + * + * @return mixed + */ + public function getEmptyValue() + { + return $this->internalFieldType->getEmptyValue(); + } + + /** + * Converts an $hash to the Value defined by the field type + * + * @param mixed $hash + * + * @return mixed + */ + public function fromHash( $hash ) + { + return $this->internalFieldType->fromHash( $hash ); + } + + /** + * Converts a Value to a hash + * + * @param mixed $value + * + * @return mixed + */ + public function toHash( $value ) + { + return $this->internalFieldType->toHash( $value ); + } + + /** + * Converts the given $fieldSettings to a simple hash format + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ) + { + return $this->internalFieldType->fieldSettingsToHash( $fieldSettings ); + } + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ) + { + return $this->internalFieldType->fieldSettingsFromHash( $fieldSettingsHash ); + } + + /** + * Converts the given $validatorConfiguration to a simple hash format + * + * @param mixed $validatorConfiguration + * + * @return array|hash|scalar|null + */ + public function validatorConfigurationToHash( $validatorConfiguration ) + { + return $this->internalFieldType->validatorConfigurationToHash( $validatorConfiguration ); + } + + /** + * Converts the given $validatorConfigurationHash to a validator + * configuration of the type + * + * @param array|hash|scalar|null $validatorConfigurationHash + * + * @return mixed + */ + public function validatorConfigurationFromHash( $validatorConfigurationHash ) + { + return $this->internalFieldType->validatorConfigurationFromHash( $validatorConfigurationHash ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/ObjectState/ObjectState.php b/eZ/Publish/Core/Repository/Values/ObjectState/ObjectState.php new file mode 100644 index 0000000..230f494 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ObjectState/ObjectState.php @@ -0,0 +1,114 @@ +<?php +/** + * File containing the ObjectState class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ObjectState; + +use eZ\Publish\API\Repository\Values\ObjectState\ObjectState as APIObjectState; + +/** + * This class represents a object state value + * + * @property-read mixed $id the id of the content type group + * @property-read string $identifier the identifier of the content type group + * @property-read int $priority the priority in the group ordering + * @property-read string $defaultLanguageCode the default language of the object state group names and description used for fallback. + * @property-read string[] $languageCodes the available languages + */ +class ObjectState extends APIObjectState +{ + /** + * Human readable names of object state + * + * @var string[] + */ + protected $names = array(); + + /** + * Human readable descriptions of object state + * + * @var string[] + */ + protected $descriptions = array(); + + /** + * @var \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + protected $objectStateGroup; + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + if ( !isset( $this->names[$languageCode] ) ) + return null; + + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + if ( !isset( $this->descriptions[$languageCode] ) ) + return null; + + return $this->descriptions[$languageCode]; + } + + /** + * The object state group this object state belongs to + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function getObjectStateGroup() + { + return $this->objectStateGroup; + } +} diff --git a/eZ/Publish/Core/Repository/Values/ObjectState/ObjectStateGroup.php b/eZ/Publish/Core/Repository/Values/ObjectState/ObjectStateGroup.php new file mode 100644 index 0000000..33e47a8 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/ObjectState/ObjectStateGroup.php @@ -0,0 +1,98 @@ +<?php +/** + * File containing the ObjectStateGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\ObjectState; + +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup as APIObjectStateGroup; + +/** + * This class represents an object state group value + * + * @property-read mixed $id the id of the content type group + * @property-read string $identifier the identifier of the content type group + * @property-read string $defaultLanguageCode, the default language code of the object state group names and description used for fallback. + * @property-read string[] $languageCodes the available languages + */ +class ObjectStateGroup extends APIObjectStateGroup +{ + /** + * Human readable names of object state group + * + * @var string[] + */ + protected $names = array(); + + /** + * Human readable descriptions of object state group + * + * @var string[] + */ + protected $descriptions = array(); + + /** + * This method returns the human readable name in all provided languages + * of the content type + * + * The structure of the return value is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @return string[] + */ + public function getNames() + { + return $this->names; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the name for the given language or null if none exists. + */ + public function getName( $languageCode ) + { + if ( !isset( $this->names[$languageCode] ) ) + return null; + + return $this->names[$languageCode]; + } + + /** + * This method returns the human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @return string[] + */ + public function getDescriptions() + { + return $this->descriptions; + } + + /** + * This method returns the name of the content type in the given language + * + * @param string $languageCode + * + * @return string the description for the given language or null if none exists. + */ + public function getDescription( $languageCode ) + { + if ( !isset( $this->descriptions[$languageCode] ) ) + return null; + + return $this->descriptions[$languageCode]; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/Policy.php b/eZ/Publish/Core/Repository/Values/User/Policy.php new file mode 100644 index 0000000..2debd56 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/Policy.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\Policy class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\Policy as APIPolicy; + +/** + * This class represents a policy value + */ +class Policy extends APIPolicy +{ + /** + * Limitations assigned to this policy + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + protected $limitations = array(); + + /** + * Returns the list of limitations for this policy + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/PolicyCreateStruct.php b/eZ/Publish/Core/Repository/Values/User/PolicyCreateStruct.php new file mode 100644 index 0000000..b41f53e --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/PolicyCreateStruct.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\PolicyCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\PolicyCreateStruct as APIPolicyCreateStruct; +use eZ\Publish\API\Repository\Values\User\Limitation; + +/** + * This class is used to create a policy + */ +class PolicyCreateStruct extends APIPolicyCreateStruct +{ + /** + * List of limitations added to policy + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + protected $limitations = array(); + + /** + * Returns list of limitations added to policy + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } + + /** + * Adds a limitation with the given identifier and list of values + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + */ + public function addLimitation( Limitation $limitation ) + { + $limitationIdentifier = $limitation->getIdentifier(); + $this->limitations[$limitationIdentifier] = $limitation; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/PolicyUpdateStruct.php b/eZ/Publish/Core/Repository/Values/User/PolicyUpdateStruct.php new file mode 100644 index 0000000..044ccce --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/PolicyUpdateStruct.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\PolicyUpdateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct as APIPolicyUpdateStruct; +use eZ\Publish\API\Repository\Values\User\Limitation; + +/** + * This class is used for updating a policy. The limitations of the policy are replaced + * with those which are added in instances of this class + */ +class PolicyUpdateStruct extends APIPolicyUpdateStruct +{ + /** + * List of limitations added to policy + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + protected $limitations = array(); + + /** + * Returns list of limitations added to policy + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation[] + */ + public function getLimitations() + { + return $this->limitations; + } + + /** + * Adds a limitation to the policy - if a Limitation exists with the same identifier + * the existing limitation is replaced + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitation + */ + public function addLimitation( Limitation $limitation ) + { + $limitationIdentifier = $limitation->getIdentifier(); + $this->limitations[$limitationIdentifier] = $limitation; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/Role.php b/eZ/Publish/Core/Repository/Values/User/Role.php new file mode 100644 index 0000000..b33e2ac --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/Role.php @@ -0,0 +1,36 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\Role class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\Role as APIRole; + +/** + * This class represents a role + * + * @property-read \eZ\Publish\API\Repository\Values\User\Policy[] $policies Policies assigned to this role + */ +class Role extends APIRole +{ + /** + * Policies assigned to this role + * + * @var \eZ\Publish\API\Repository\Values\User\Policy[] + */ + protected $policies = array(); + + /** + * Returns the list of policies of this role + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function getPolicies() + { + return $this->policies; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/RoleCreateStruct.php b/eZ/Publish/Core/Repository/Values/User/RoleCreateStruct.php new file mode 100644 index 0000000..33d5ab9 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/RoleCreateStruct.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\RoleCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\RoleCreateStruct as APIRoleCreateStruct; +use eZ\Publish\API\Repository\Values\User\PolicyCreateStruct as APIPolicyCreateStruct; + +/** + * This class is used to create a new role + */ +class RoleCreateStruct extends APIRoleCreateStruct +{ + /** + * Policies associated with the role + * + * @var \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct[] + */ + protected $policies = array(); + + /** + * Returns policies associated with the role + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct[] + */ + public function getPolicies() + { + return $this->policies; + } + + /** + * Adds a policy to this role + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreate + */ + public function addPolicy( APIPolicyCreateStruct $policyCreate ) + { + $this->policies[] = $policyCreate; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/User.php b/eZ/Publish/Core/Repository/Values/User/User.php new file mode 100644 index 0000000..abf2853 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/User.php @@ -0,0 +1,173 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\User class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\User as APIUser; + +/** + * This class represents a user value + */ +class User extends APIUser +{ + /** + * @var int MD5 of password, not recommended + */ + const PASSWORD_HASH_MD5_PASSWORD = 1; + + /** + * @var int MD5 of user and password + */ + const PASSWORD_HASH_MD5_USER = 2; + + /** + * @var int MD5 of site, user and password + */ + const PASSWORD_HASH_MD5_SITE = 3; + + /** + * @var int Passwords in plaintext, should not be used for real sites + */ + const PASSWORD_HASH_PLAINTEXT = 5; + + /** + * Internal content representation + * + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + protected $content; + + /** + * Returns the VersionInfo for this version + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function getVersionInfo() + { + return $this->content->getVersionInfo(); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + return $this->content->getFieldValue( $fieldDefIdentifier, $languageCode ); + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public function getFields() + { + return $this->content->getFields(); + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] with field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + return $this->content->getFieldsByLanguage( $languageCode ); + } + + /** + * Function where list of properties are returned + * + * Override to add dynamic properties + * @uses parent::getProperties() + * + * @param array $dynamicProperties + * + * @return array + */ + protected function getProperties( $dynamicProperties = array( 'id', 'contentInfo', 'contentType' ) ) + { + return parent::getProperties( $dynamicProperties ); + } + + /** + * Magic getter for retrieving convenience properties + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->getVersionInfo()->getContentInfo(); + + case 'contentType': + return $this->getVersionInfo()->getContentInfo()->getContentType(); + + case 'id': + $versionInfo = $this->getVersionInfo(); + if ( empty( $versionInfo ) ) + { + return null; + } + return $versionInfo->getContentInfo()->id; + + case 'versionInfo': + return $this->getVersionInfo(); + + case 'fields': + return $this->getFields(); + } + + return parent::__get( $property ); + } + + /** + * Magic isset for signaling existence of convenience properties + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + if ( $property === 'contentType' ) + return true; + + if ( $property === 'contentInfo' ) + return true; + + if ( $property === 'id' ) + return true; + + if ( $property === 'versionInfo' ) + return true; + + if ( $property === 'fields' ) + return true; + + return parent::__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/UserCreateStruct.php b/eZ/Publish/Core/Repository/Values/User/UserCreateStruct.php new file mode 100644 index 0000000..cd1c3b4 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/UserCreateStruct.php @@ -0,0 +1,54 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\UserCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\UserCreateStruct as APIUserCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * This class is used to create a new user in the repository + */ +class UserCreateStruct extends APIUserCreateStruct +{ + /** + * The list of fields added to the user + * + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public $fields = array(); + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( !isset( $language ) ) + $language = $this->mainLanguageCode; + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/UserGroup.php b/eZ/Publish/Core/Repository/Values/User/UserGroup.php new file mode 100644 index 0000000..b678670 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/UserGroup.php @@ -0,0 +1,153 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\UserGroup class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\UserGroup as APIUserGroup; + +/** + * This class represents a user group + */ +class UserGroup extends APIUserGroup +{ + /** + * Internal content representation + * + * @var \eZ\Publish\API\Repository\Values\Content\Content + */ + protected $content; + + /** + * Returns the VersionInfo for this version + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function getVersionInfo() + { + return $this->content->getVersionInfo(); + } + + /** + * Returns a field value for the given value + * $version->fields[$fieldDefId][$languageCode] is an equivalent call + * if no language is given on a translatable field this method returns + * the value of the initial language of the version if present, otherwise null. + * On non translatable fields this method ignores the languageCode parameter. + * + * @param string $fieldDefIdentifier + * @param string $languageCode + * + * @return mixed a primitive type or a field type Value object depending on the field type. + */ + public function getFieldValue( $fieldDefIdentifier, $languageCode = null ) + { + return $this->content->getFieldValue( $fieldDefIdentifier, $languageCode ); + } + + /** + * This method returns the complete fields collection + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public function getFields() + { + return $this->content->getFields(); + } + + /** + * This method returns the fields for a given language and non translatable fields + * + * If note set the initialLanguage of the content version is used. + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Field[] with field identifier as keys + */ + public function getFieldsByLanguage( $languageCode = null ) + { + return $this->content->getFieldsByLanguage( $languageCode ); + } + + /** + * Function where list of properties are returned + * + * Override to add dynamic properties + * @uses parent::getProperties() + * + * @param array $dynamicProperties + * + * @return array + */ + protected function getProperties( $dynamicProperties = array( 'id', 'contentInfo', 'contentType' ) ) + { + return parent::getProperties( $dynamicProperties ); + } + + /** + * Magic getter for retrieving convenience properties + * + * @param string $property The name of the property to retrieve + * + * @return mixed + */ + public function __get( $property ) + { + switch ( $property ) + { + case 'contentInfo': + return $this->getVersionInfo()->getContentInfo(); + + case 'contentType': + return $this->getVersionInfo()->getContentInfo()->getContentType(); + + case 'id': + $versionInfo = $this->getVersionInfo(); + if ( empty( $versionInfo ) ) + { + return null; + } + return $versionInfo->getContentInfo()->id; + + case 'versionInfo': + return $this->getVersionInfo(); + + case 'fields': + return $this->getFields(); + } + + return parent::__get( $property ); + } + + /** + * Magic isset for signaling existence of convenience properties + * + * @param string $property + * + * @return boolean + */ + public function __isset( $property ) + { + if ( $property === 'contentType' ) + return true; + + if ( $property === 'contentInfo' ) + return true; + + if ( $property === 'id' ) + return true; + + if ( $property === 'versionInfo' ) + return true; + + if ( $property === 'fields' ) + return true; + + return parent::__isset( $property ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/UserGroupCreateStruct.php b/eZ/Publish/Core/Repository/Values/User/UserGroupCreateStruct.php new file mode 100644 index 0000000..1085fc8 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/UserGroupCreateStruct.php @@ -0,0 +1,54 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\UserGroupCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct as APIUserGroupCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Field; + +/** + * This class is used to create a new user group in the repository + */ +class UserGroupCreateStruct extends APIUserGroupCreateStruct +{ + /** + * The list of fields added to the user group + * + * @var \eZ\Publish\API\Repository\Values\Content\Field[] + */ + public $fields = array(); + + /** + * Adds a field to the field collection. + * + * This method could also be implemented by a magic setter so that + * $fields[$fieldDefIdentifier][$language] = $value or without language $fields[$fieldDefIdentifier] = $value + * is an equivalent call. + * + * @param string $fieldDefIdentifier the identifier of the field definition + * + * @param mixed $value Either a plain value which is understandable by the corresponding + * field type or an instance of a Value class provided by the field type + * + * @param string|null $language If not given on a translatable field the initial language is used + */ + public function setField( $fieldDefIdentifier, $value, $language = null ) + { + if ( !isset( $language ) ) + $language = $this->mainLanguageCode; + + $this->fields[] = new Field( + array( + 'fieldDefIdentifier' => $fieldDefIdentifier, + 'value' => $value, + 'languageCode' => $language + ) + ); + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/UserGroupRoleAssignment.php b/eZ/Publish/Core/Repository/Values/User/UserGroupRoleAssignment.php new file mode 100644 index 0000000..b95f932 --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/UserGroupRoleAssignment.php @@ -0,0 +1,69 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\UserGroupRoleAssignment class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment as APIUserGroupRoleAssignment; + +/** + * This class represents a user group to role assignment + */ +class UserGroupRoleAssignment extends APIUserGroupRoleAssignment +{ + /** + * the limitation of this role assignment + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation|null + */ + protected $limitation; + + /** + * the role which is assigned to the user group + * + * @var \eZ\Publish\API\Repository\Values\User\Role + */ + protected $role; + + /** + * user group to which the role is assigned to + * + * @var \eZ\Publish\API\Repository\Values\User\UserGroup + */ + protected $userGroup; + + /** + * Returns the limitation of the role assignment + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation|null + */ + public function getRoleLimitation() + { + return $this->limitation; + } + + /** + * Returns the role to which the user group is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Returns the user group to which the role is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + */ + public function getUserGroup() + { + return $this->userGroup; + } +} diff --git a/eZ/Publish/Core/Repository/Values/User/UserRoleAssignment.php b/eZ/Publish/Core/Repository/Values/User/UserRoleAssignment.php new file mode 100644 index 0000000..e64b9ff --- /dev/null +++ b/eZ/Publish/Core/Repository/Values/User/UserRoleAssignment.php @@ -0,0 +1,69 @@ +<?php +/** + * File containing the eZ\Publish\Core\Repository\Values\User\UserRoleAssignment class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\Repository\Values\User; + +use eZ\Publish\API\Repository\Values\User\UserRoleAssignment as APIUserRoleAssignment; + +/** + * This class represents a user to role assignment + */ +class UserRoleAssignment extends APIUserRoleAssignment +{ + /** + * the limitation of this role assignment + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation|null + */ + protected $limitation; + + /** + * the role which is assigned to the user + * + * @var \eZ\Publish\API\Repository\Values\User\Role + */ + protected $role; + + /** + * user to which the role is assigned to + * + * @var \eZ\Publish\API\Repository\Values\User\User + */ + protected $user; + + /** + * Returns the limitation of the user role assignment + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation|null + */ + public function getRoleLimitation() + { + return $this->limitation; + } + + /** + * Returns the role to which the user is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function getRole() + { + return $this->role; + } + + /** + * Returns the user to which the role is assigned to + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getUser() + { + return $this->user; + } +} diff --git a/eZ/Publish/Core/SignalSlot/ContentService.php b/eZ/Publish/Core/SignalSlot/ContentService.php new file mode 100644 index 0000000..2a0e101 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/ContentService.php @@ -0,0 +1,665 @@ +<?php +/** + * ContentService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\ContentService as ContentServiceInterface; +use eZ\Publish\API\Repository\Values\Content\ContentCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\VersionInfo; +use eZ\Publish\API\Repository\Values\Content\TranslationInfo; +use eZ\Publish\API\Repository\Values\Content\TranslationValues; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\CreateContentSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\UpdateContentMetadataSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteContentSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\CreateContentDraftSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\TranslateVersionSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\UpdateContentSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\PublishVersionSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteVersionSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\CopyContentSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\AddRelationSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteRelationSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentService\AddTranslationInfoSignal; + +/** + * ContentService class + * @package eZ\Publish\Core\SignalSlot + */ +class ContentService implements ContentServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\ContentService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( ContentServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Loads a content info object. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given id does not exist + * + * @param int $contentId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfo( $contentId ) + { + return $this->service->loadContentInfo( $contentId ); + } + + /** + * Loads a content info object for the given remoteId. + * + * To load fields use loadContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content with the given remote id does not exist + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentInfo + */ + public function loadContentInfoByRemoteId( $remoteId ) + { + return $this->service->loadContentInfoByRemoteId( $remoteId ); + } + + /** + * Loads a version info of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfo( ContentInfo $contentInfo, $versionNo = null ) + { + return $this->service->loadVersionInfo( $contentInfo, $versionNo ); + } + + /** + * Loads a version info of the given content object id. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo + */ + public function loadVersionInfoById( $contentId, $versionNo = null ) + { + return $this->service->loadVersionInfoById( $contentId, $versionNo ); + } + + /** + * Loads content in a version for the given content info object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if version with the given number does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByContentInfo( ContentInfo $contentInfo, array $languages = null, $versionNo = null ) + { + return $this->service->loadContentByContentInfo( $contentInfo, $languages, $versionNo ); + } + + /** + * Loads content in the version given by version info. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param array $languages A language filter for fields. If not given all languages are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByVersionInfo( VersionInfo $versionInfo, array $languages = null ) + { + return $this->service->loadContentByVersionInfo( $versionInfo, $languages ); + } + + /** + * Loads content in a version of the given content object. + * + * If no version number is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the content or version with the given id and languages does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param int $contentId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContent( $contentId, array $languages = null, $versionNo = null ) + { + return $this->service->loadContent( $contentId, $languages, $versionNo ); + } + + /** + * Loads content in a version for the content object reference by the given remote id. + * + * If no version is given, the method returns the current version + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the content or version with the given remote id does not exist + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load this version + * + * @param string $remoteId + * @param array $languages A language filter for fields. If not given all languages are returned + * @param int $versionNo the version number. If not given the current version is returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function loadContentByRemoteId( $remoteId, array $languages = null, $versionNo = null ) + { + return $this->service->loadContentByRemoteId( $remoteId, $languages, $versionNo ); + } + + /** + * Creates a new content draft assigned to the authenticated user. + * + * If a different userId is given in $contentCreateStruct it is assigned to the given user + * but this required special rights for the authenticated user + * (this is useful for content staging where the transfer process does not + * have to authenticate with the user which created the content object in the source server). + * The user has to publish the draft if it should be visible. + * In 4.x at least one location has to be provided in the location creation array. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the content in the given location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is a provided remoteId which exists in the system + * or there is no location provided (4.x) or multiple locations + * are under the same parent or if the a field value is not accepted by the field type + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or is set to an empty value + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct $contentCreateStruct + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct[] $locationCreateStructs For each location parent under which a location should be created for the content + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContent( ContentCreateStruct $contentCreateStruct, array $locationCreateStructs = array() ) + { + $returnValue = $this->service->createContent( $contentCreateStruct, $locationCreateStructs ); + $this->signalDispatcher->emit( + new CreateContentSignal( + array( + 'contentId' => $returnValue->getVersionInfo()->getContentInfo()->id, + 'versionNo' => $returnValue->getVersionInfo()->versionNo, + ) + ) + ); + return $returnValue; + } + + /** + * Updates the metadata. + * + * (see {@link ContentMetadataUpdateStruct}) of a content object - to update fields use updateContent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update the content meta data + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the remoteId in $contentMetadataUpdateStruct is set but already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct $contentMetadataUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content with the updated attributes + */ + public function updateContentMetadata( ContentInfo $contentInfo, ContentMetadataUpdateStruct $contentMetadataUpdateStruct ) + { + $returnValue = $this->service->updateContentMetadata( $contentInfo, $contentMetadataUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateContentMetadataSignal( + array( + 'contentId' => $contentInfo->id, + ) + ) + ); + return $returnValue; + } + + /** + * Deletes a content object including all its versions and locations including their subtrees. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete the content (in one of the locations of the given content object) + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + */ + public function deleteContent( ContentInfo $contentInfo ) + { + $returnValue = $this->service->deleteContent( $contentInfo ); + $this->signalDispatcher->emit( + new DeleteContentSignal( + array( + 'contentId' => $contentInfo->id, + ) + ) + ); + return $returnValue; + } + + /** + * Creates a draft from a published or archived version. + * + * If no version is given, the current published version is used. + * 4.x: The draft is created with the initialLanguage code of the source version or if not present with the main language. + * It can be changed on updating the version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create the draft + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\User\User $user if set given user is used to create the draft - otherwise the current user is used + * + * @return \eZ\Publish\API\Repository\Values\Content\Content - the newly created content draft + */ + public function createContentDraft( ContentInfo $contentInfo, VersionInfo $versionInfo = null, User $user = null ) + { + $returnValue = $this->service->createContentDraft( $contentInfo, $versionInfo, $user ); + $this->signalDispatcher->emit( + new CreateContentDraftSignal( + array( + 'contentId' => $contentInfo->id, + 'versionNo' => ( $versionInfo !== null ? $versionInfo->versionNo : null ), + 'userId' => ( $user !== null ? $user->id : null ), + ) + ) + ); + return $returnValue; + } + + /** + * Loads drafts for a user. + * + * If no user is given the drafts for the authenticated user a returned + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to load the draft list + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] the drafts ({@link VersionInfo}) owned by the given user + */ + public function loadContentDrafts( User $user = null ) + { + return $this->service->loadContentDrafts( $user ); + } + + /** + * Translate a version + * + * updates the destination version given in $translationInfo with the provided translated fields in $translationValues + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the given destination version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $translationValues is not valid + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * @param \eZ\Publish\API\Repository\Values\Content\TranslationValues $translationValues + * @param \eZ\Publish\API\Repository\Values\User\User $user If set, this user is taken as modifier of the version + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the translated fields + * + * @since 5.0 + */ + public function translateVersion( TranslationInfo $translationInfo, TranslationValues $translationValues, User $user = null ) + { + $returnValue = $this->service->translateVersion( $translationInfo, $translationValues, $user ); + $this->signalDispatcher->emit( + new TranslateVersionSignal( + array( + 'contentId' => $translationInfo->srcVersionInfo->contentInfo->id, + 'versionNo' => $translationInfo->srcVersionInfo->versionNo, + 'userId' => ( $user !== null ? $user->id : null ), + ) + ) + ); + return $returnValue; + } + + /** + * Updates the fields of a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $contentUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a field value is not accepted by the field type + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct $contentUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Content the content draft with the updated fields + */ + public function updateContent( VersionInfo $versionInfo, ContentUpdateStruct $contentUpdateStruct ) + { + $returnValue = $this->service->updateContent( $versionInfo, $contentUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateContentSignal( + array( + 'contentId' => $versionInfo->getContentInfo()->id, + 'versionNo' => $versionInfo->versionNo, + ) + ) + ); + return $returnValue; + } + + /** + * Publishes a content version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function publishVersion( VersionInfo $versionInfo ) + { + $returnValue = $this->service->publishVersion( $versionInfo ); + $this->signalDispatcher->emit( + new PublishVersionSignal( + array( + 'contentId' => $versionInfo->getContentInfo()->id, + 'versionNo' => $versionInfo->versionNo, + ) + ) + ); + return $returnValue; + } + + /** + * removes the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is in state published + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + */ + public function deleteVersion( VersionInfo $versionInfo ) + { + $returnValue = $this->service->deleteVersion( $versionInfo ); + $this->signalDispatcher->emit( + new DeleteVersionSignal( + array( + 'contentId' => $versionInfo->contentInfo->id, + 'versionNo' => $versionInfo->versionNo, + ) + ) + ); + return $returnValue; + } + + /** + * Loads all versions for the given content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to list versions + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\VersionInfo[] Sorted by creation date + */ + public function loadVersions( ContentInfo $contentInfo ) + { + return $this->service->loadVersions( $contentInfo ); + } + + /** + * Copies the content to a new location. If no version is given, + * all versions are copied, otherwise only the given version. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy the content to the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $destinationLocationCreateStruct the target location where the content is copied to + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function copyContent( ContentInfo $contentInfo, LocationCreateStruct $destinationLocationCreateStruct, VersionInfo $versionInfo = null ) + { + $returnValue = $this->service->copyContent( $contentInfo, $destinationLocationCreateStruct, $versionInfo ); + $this->signalDispatcher->emit( + new CopyContentSignal( + array( + 'srcContentId' => $contentInfo->id, + 'srcVersionNo' => ( $versionInfo !== null ? $versionInfo->versionNo : null ), + 'dstContentId' => $returnValue->getVersionInfo()->getContentInfo()->id, + 'dstVersionNo' => $returnValue->getVersionInfo()->versionNo, + 'dstParentLocationId' => $destinationLocationCreateStruct->parentLocationId, + ) + ) + ); + return $returnValue; + } + + /** + * Loads all outgoing relations for the given version + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadRelations( VersionInfo $versionInfo ) + { + return $this->service->loadRelations( $versionInfo ); + } + + /** + * Loads all incoming relations for a content object. + * + * The relations come only from published versions of the source content objects + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read this version + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation[] + */ + public function loadReverseRelations( ContentInfo $contentInfo ) + { + return $this->service->loadReverseRelations( $contentInfo ); + } + + /** + * Adds a relation of type common. + * + * The source of the relation is the content and version + * referenced by $versionInfo. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent the destination of the relation + * + * @return \eZ\Publish\API\Repository\Values\Content\Relation the newly created relation + */ + public function addRelation( VersionInfo $sourceVersion, ContentInfo $destinationContent ) + { + $returnValue = $this->service->addRelation( $sourceVersion, $destinationContent ); + $this->signalDispatcher->emit( + new AddRelationSignal( + array( + 'srcContentId' => $sourceVersion->contentInfo->id, + 'srcVersionNo' => $sourceVersion->versionNo, + 'dstContentId' => $destinationContent->id, + ) + ) + ); + return $returnValue; + } + + /** + * Removes a relation of type COMMON from a draft. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed edit this version + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if the version is not a draft + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is no relation of type COMMON for the given destination + * + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $sourceVersion + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $destinationContent + */ + public function deleteRelation( VersionInfo $sourceVersion, ContentInfo $destinationContent ) + { + $returnValue = $this->service->deleteRelation( $sourceVersion, $destinationContent ); + $this->signalDispatcher->emit( + new DeleteRelationSignal( + array( + 'srcContentId' => $sourceVersion->contentInfo->id, + 'srcVersionNo' => $sourceVersion->versionNo, + 'dstContentId' => $destinationContent->id, + ) + ) + ); + return $returnValue; + } + + /** + * Adds translation information to the content object + * + * @example Examples/translation_5x.php + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed add a translation info + * + * @param \eZ\Publish\API\Repository\Values\Content\TranslationInfo $translationInfo + * + * @since 5.0 + */ + public function addTranslationInfo( TranslationInfo $translationInfo ) + { + $returnValue = $this->service->addTranslationInfo( $translationInfo ); + $this->signalDispatcher->emit( + new AddTranslationInfoSignal( array() ) + ); + return $returnValue; + } + + /** + * lists the translations done on this content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed read translation infos + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param array $filter + * + * @todo TBD - filter by source version, destination version and languages + * + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo[] + * + * @since 5.0 + */ + public function loadTranslationInfos( ContentInfo $contentInfo, array $filter = array() ) + { + return $this->service->loadTranslationInfos( $contentInfo, $filter ); + } + + /** + * Instantiates a new content create struct object + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param string $mainLanguageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentCreateStruct + */ + public function newContentCreateStruct( ContentType $contentType, $mainLanguageCode ) + { + return $this->service->newContentCreateStruct( $contentType, $mainLanguageCode ); + } + + /** + * Instantiates a new content meta data update struct + * + * @return \eZ\Publish\API\Repository\Values\Content\ContentMetadataUpdateStruct + */ + public function newContentMetadataUpdateStruct() + { + return $this->service->newContentMetadataUpdateStruct(); + } + + /** + * Instantiates a new content update struct + * @return \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct + */ + public function newContentUpdateStruct() + { + return $this->service->newContentUpdateStruct(); + } + + /** + * Instantiates a new TranslationInfo object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationInfo + */ + public function newTranslationInfo() + { + return $this->service->newTranslationInfo(); + } + + /** + * Instantiates a Translation object + * @return \eZ\Publish\API\Repository\Values\Content\TranslationValues + */ + public function newTranslationValues() + { + return $this->service->newTranslationValues(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/ContentTypeService.php b/eZ/Publish/Core/SignalSlot/ContentTypeService.php new file mode 100644 index 0000000..3874c6c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/ContentTypeService.php @@ -0,0 +1,587 @@ +<?php +/** + * ContentTypeService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\ContentTypeService as ContentTypeServiceInterface; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct; +use eZ\Publish\API\Repository\Values\ContentType\ContentType; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup; +use eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft; +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\CreateContentTypeGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\UpdateContentTypeGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\DeleteContentTypeGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\CreateContentTypeSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\CreateContentTypeDraftSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\UpdateContentTypeDraftSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\DeleteContentTypeSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\CopyContentTypeSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\AssignContentTypeGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\UnassignContentTypeGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\AddFieldDefinitionSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\RemoveFieldDefinitionSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\UpdateFieldDefinitionSignal; +use eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\PublishContentTypeDraftSignal; + +/** + * ContentTypeService class + * @package eZ\Publish\Core\SignalSlot + */ +class ContentTypeService implements ContentTypeServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\ContentTypeService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( ContentTypeServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Create a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a group with the same identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function createContentTypeGroup( ContentTypeGroupCreateStruct $contentTypeGroupCreateStruct ) + { + $returnValue = $this->service->createContentTypeGroup( $contentTypeGroupCreateStruct ); + $this->signalDispatcher->emit( + new CreateContentTypeGroupSignal( + array( + 'groupId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Get a Content Type Group object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param int $contentTypeGroupId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroup( $contentTypeGroupId ) + { + return $this->service->loadContentTypeGroup( $contentTypeGroupId ); + } + + /** + * Get a Content Type Group object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group can not be found + * + * @param string $contentTypeGroupIdentifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup + */ + public function loadContentTypeGroupByIdentifier( $contentTypeGroupIdentifier ) + { + return $this->service->loadContentTypeGroupByIdentifier( $contentTypeGroupIdentifier ); + } + + /** + * Get all Content Type Groups + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] + */ + public function loadContentTypeGroups() + { + return $this->service->loadContentTypeGroups(); + } + + /** + * Update a Content Type Group object + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier (if set) already exists + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup the content type group to be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct + */ + public function updateContentTypeGroup( ContentTypeGroup $contentTypeGroup, ContentTypeGroupUpdateStruct $contentTypeGroupUpdateStruct ) + { + $returnValue = $this->service->updateContentTypeGroup( $contentTypeGroup, $contentTypeGroupUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateContentTypeGroupSignal( + array( + 'contentTypeGroupId' => $contentTypeGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Delete a Content Type Group. + * + * This method only deletes an content type group which has content types without any content instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If a to be deleted content type has instances + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function deleteContentTypeGroup( ContentTypeGroup $contentTypeGroup ) + { + $returnValue = $this->service->deleteContentTypeGroup( $contentTypeGroup ); + $this->signalDispatcher->emit( + new DeleteContentTypeGroupSignal( + array( + 'contentTypeGroupId' => $contentTypeGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Create a Content Type object. + * + * The content type is created in the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException In case when + * - array of content type groups does not contain at least one content type group + * - identifier or remoteId in the content type create struct already exists + * - there is a duplicate field identifier in the content type create struct + * - content type create struct does not contain at least one field definition create struct + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct $contentTypeCreateStruct + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup[] $contentTypeGroups Required array of + * {@link ContentTypeGroup} to link type with (must contain one) + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentType( ContentTypeCreateStruct $contentTypeCreateStruct, array $contentTypeGroups ) + { + $returnValue = $this->service->createContentType( $contentTypeCreateStruct, $contentTypeGroups ); + $this->signalDispatcher->emit( + new CreateContentTypeSignal( + array( + 'contentTypeId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If a content type with the given id and status DEFINED can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentType( $contentTypeId ) + { + return $this->service->loadContentType( $contentTypeId ); + } + + /** + * Get a Content Type object by identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given identifier and status DEFINED can not be found + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByIdentifier( $identifier ) + { + return $this->service->loadContentTypeByIdentifier( $identifier ); + } + + /** + * Get a Content Type object by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content type with the given remote id and status DEFINED can not be found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function loadContentTypeByRemoteId( $remoteId ) + { + return $this->service->loadContentTypeByRemoteId( $remoteId ); + } + + /** + * Get a Content Type object draft by id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the content type draft owned by the current user can not be found + * + * @param int $contentTypeId + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function loadContentTypeDraft( $contentTypeId ) + { + return $this->service->loadContentTypeDraft( $contentTypeId ); + } + + /** + * Get Content Type objects which belong to the given content type group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType[] Which have status DEFINED + */ + public function loadContentTypes( ContentTypeGroup $contentTypeGroup ) + { + return $this->service->loadContentTypes( $contentTypeGroup ); + } + + /** + * Creates a draft from an existing content type. + * + * This is a complete copy of the content + * type which has the state STATUS_DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there is already a draft assigned to another user + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft + */ + public function createContentTypeDraft( ContentType $contentType ) + { + $returnValue = $this->service->createContentTypeDraft( $contentType ); + $this->signalDispatcher->emit( + new CreateContentTypeDraftSignal( + array( + 'contentTypeId' => $contentType->id, + ) + ) + ); + return $returnValue; + } + + /** + * Update a Content Type object + * + * Does not update fields (fieldDefinitions), use {@link updateFieldDefinition()} to update them. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given identifier or remoteId already exists. + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct $contentTypeUpdateStruct + */ + public function updateContentTypeDraft( ContentTypeDraft $contentTypeDraft, ContentTypeUpdateStruct $contentTypeUpdateStruct ) + { + $returnValue = $this->service->updateContentTypeDraft( $contentTypeDraft, $contentTypeUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateContentTypeDraftSignal( + array( + 'contentTypeDraftId' => $contentTypeDraft->id, + ) + ) + ); + return $returnValue; + } + + /** + * Delete a Content Type object. + * + * Deletes a content type if it has no instances + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If there exist content objects of this type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + */ + public function deleteContentType( ContentType $contentType ) + { + $returnValue = $this->service->deleteContentType( $contentType ); + $this->signalDispatcher->emit( + new DeleteContentTypeSignal( + array( + 'contentTypeId' => $contentType->id, + ) + ) + ); + return $returnValue; + } + + /** + * Copy Type incl fields and groupIds to a new Type object + * + * New Type will have $userId as creator / modifier, created / modified should be updated with current time, + * updated remoteId and identifier should be appended with '_' + unique string. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to copy a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\User\User $user if null the current user is used + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentType + */ + public function copyContentType( ContentType $contentType, User $user = null ) + { + $returnValue = $this->service->copyContentType( $contentType, $user ); + $this->signalDispatcher->emit( + new CopyContentTypeSignal( + array( + 'contentTypeId' => $contentType->id, + 'userId' => ( $user !== null ? $user->id : null ), + ) + ) + ); + return $returnValue; + } + + /** + * Assigns a content type to a content type group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to unlink a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is already assigned the given group + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function assignContentTypeGroup( ContentType $contentType, ContentTypeGroup $contentTypeGroup ) + { + $returnValue = $this->service->assignContentTypeGroup( $contentType, $contentTypeGroup ); + $this->signalDispatcher->emit( + new AssignContentTypeGroupSignal( + array( + 'contentTypeId' => $contentType->id, + 'contentTypeGroupId' => $contentTypeGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Unassign a content type from a group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to link a content type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type is not assigned this the given group. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $contentTypeGroup is the last group assigned to the content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroup $contentTypeGroup + */ + public function unassignContentTypeGroup( ContentType $contentType, ContentTypeGroup $contentTypeGroup ) + { + $returnValue = $this->service->unassignContentTypeGroup( $contentType, $contentTypeGroup ); + $this->signalDispatcher->emit( + new UnassignContentTypeGroupSignal( + array( + 'contentTypeId' => $contentType->id, + 'contentTypeGroupId' => $contentTypeGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Adds a new field definition to an existing content type. + * + * The content type must be in state DRAFT. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the identifier in already exists in the content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct $fieldDefinitionCreateStruct + */ + public function addFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinitionCreateStruct $fieldDefinitionCreateStruct ) + { + $returnValue = $this->service->addFieldDefinition( $contentTypeDraft, $fieldDefinitionCreateStruct ); + $this->signalDispatcher->emit( + new AddFieldDefinitionSignal( + array( + 'contentTypeDraftId' => $contentTypeDraft->id, + ) + ) + ); + return $returnValue; + } + + /** + * Remove a field definition from an existing Type. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the given field definition does not belong to the given type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition + */ + public function removeFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition ) + { + $returnValue = $this->service->removeFieldDefinition( $contentTypeDraft, $fieldDefinition ); + $this->signalDispatcher->emit( + new RemoveFieldDefinitionSignal( + array( + 'contentTypeDraftId' => $contentTypeDraft->id, + 'fieldDefinitionId' => $fieldDefinition->id, + ) + ) + ); + return $returnValue; + } + + /** + * Update a field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the field id in the update struct is not found or does not belong to the content type of + * If the given identifier is used in an existing field of the given content type + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to edit a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft the content type draft + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDefinition the field definition which should be updated + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct + */ + public function updateFieldDefinition( ContentTypeDraft $contentTypeDraft, FieldDefinition $fieldDefinition, FieldDefinitionUpdateStruct $fieldDefinitionUpdateStruct ) + { + $returnValue = $this->service->updateFieldDefinition( $contentTypeDraft, $fieldDefinition, $fieldDefinitionUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateFieldDefinitionSignal( + array( + 'contentTypeDraftId' => $contentTypeDraft->id, + 'fieldDefinitionId' => $fieldDefinition->id, + ) + ) + ); + return $returnValue; + } + + /** + * Publish the content type and update content objects. + * + * This method updates content objects, depending on the changed field definitions. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If the content type has no draft + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the content type has no field definitions + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to publish a content type + * + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentTypeDraft $contentTypeDraft + */ + public function publishContentTypeDraft( ContentTypeDraft $contentTypeDraft ) + { + $returnValue = $this->service->publishContentTypeDraft( $contentTypeDraft ); + $this->signalDispatcher->emit( + new PublishContentTypeDraftSignal( + array( + 'contentTypeDraftId' => $contentTypeDraft->id, + ) + ) + ); + return $returnValue; + } + + /** + * Instantiates a new content type group create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupCreateStruct + */ + public function newContentTypeGroupCreateStruct( $identifier ) + { + return $this->service->newContentTypeGroupCreateStruct( $identifier ); + } + + /** + * Instantiates a new content type create class + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeCreateStruct + */ + public function newContentTypeCreateStruct( $identifier ) + { + return $this->service->newContentTypeCreateStruct( $identifier ); + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeUpdateStruct + */ + public function newContentTypeUpdateStruct() + { + return $this->service->newContentTypeUpdateStruct(); + } + + /** + * Instantiates a new content type update struct + * + * @return \eZ\Publish\API\Repository\Values\ContentType\ContentTypeGroupUpdateStruct + */ + public function newContentTypeGroupUpdateStruct() + { + return $this->service->newContentTypeGroupUpdateStruct(); + } + + /** + * Instantiates a field definition create struct + * + * @param string $fieldTypeIdentifier the required field type identifier + * @param string $identifier the required identifier for the field definition + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCreateStruct + */ + public function newFieldDefinitionCreateStruct( $identifier, $fieldTypeIdentifier ) + { + return $this->service->newFieldDefinitionCreateStruct( $identifier, $fieldTypeIdentifier ); + } + + /** + * Instantiates a field definition update class + * + * @return \eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionUpdateStruct + */ + public function newFieldDefinitionUpdateStruct() + { + return $this->service->newFieldDefinitionUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/FieldTypeService.php b/eZ/Publish/Core/SignalSlot/FieldTypeService.php new file mode 100644 index 0000000..0e16c9c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/FieldTypeService.php @@ -0,0 +1,84 @@ +<?php +/** + * FieldTypeService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\FieldTypeService as FieldTypeServiceInterface; + +/** + * FieldTypeService class + * @package eZ\Publish\Core\SignalSlot + */ +class FieldTypeService implements FieldTypeServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\FieldTypeService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\FieldTypeService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( FieldTypeServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Returns a list of all field types. + * + * @return \eZ\Publish\API\Repository\FieldType[] + */ + public function getFieldTypes() + { + return $this->service->getFieldTypes(); + } + + /** + * Returns the FieldType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\FieldType + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * if there is no FieldType registered with $identifier + */ + public function getFieldType( $identifier ) + { + return $this->service->getFieldType( $identifier ); + } + + /** + * Returns if there is a FieldType registered under $identifier + * + * @param string $identifier + * + * @return boolean + */ + public function hasFieldType( $identifier ) + { + return $this->service->hasFieldType( $identifier ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/LanguageService.php b/eZ/Publish/Core/SignalSlot/LanguageService.php new file mode 100644 index 0000000..872cc3a --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/LanguageService.php @@ -0,0 +1,227 @@ +<?php +/** + * LanguageService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\LanguageService as LanguageServiceInterface; +use eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct; +use eZ\Publish\API\Repository\Values\Content\Language; +use eZ\Publish\Core\SignalSlot\Signal\LanguageService\CreateLanguageSignal; +use eZ\Publish\Core\SignalSlot\Signal\LanguageService\UpdateLanguageNameSignal; +use eZ\Publish\Core\SignalSlot\Signal\LanguageService\EnableLanguageSignal; +use eZ\Publish\Core\SignalSlot\Signal\LanguageService\DisableLanguageSignal; +use eZ\Publish\Core\SignalSlot\Signal\LanguageService\DeleteLanguageSignal; + +/** + * LanguageService class + * @package eZ\Publish\Core\SignalSlot + */ +class LanguageService implements LanguageServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\LanguageService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\LanguageService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( LanguageServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Creates the a new Language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the languageCode already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct $languageCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function createLanguage( LanguageCreateStruct $languageCreateStruct ) + { + $returnValue = $this->service->createLanguage( $languageCreateStruct ); + $this->signalDispatcher->emit( + new CreateLanguageSignal( + array( + 'languageId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Changes the name of the language in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * @param string $newName + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function updateLanguageName( Language $language, $newName ) + { + $returnValue = $this->service->updateLanguageName( $language, $newName ); + $this->signalDispatcher->emit( + new UpdateLanguageNameSignal( + array( + 'languageId' => $language->id, + 'newName' => $newName, + ) + ) + ); + return $returnValue; + } + + /** + * Enables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function enableLanguage( Language $language ) + { + $returnValue = $this->service->enableLanguage( $language ); + $this->signalDispatcher->emit( + new EnableLanguageSignal( + array( + 'languageId' => $language->id, + ) + ) + ); + return $returnValue; + } + + /** + * Disables a language + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to content translations + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function disableLanguage( Language $language ) + { + $returnValue = $this->service->disableLanguage( $language ); + $this->signalDispatcher->emit( + new DisableLanguageSignal( + array( + 'languageId' => $language->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a Language from its language code ($languageCode) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguage( $languageCode ) + { + return $this->service->loadLanguage( $languageCode ); + } + + /** + * Loads all Languages + * + * @return \eZ\Publish\API\Repository\Values\Content\Language[] + */ + public function loadLanguages() + { + return $this->service->loadLanguages(); + } + + /** + * Loads a Language by its id ($languageId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if language could not be found + * + * @param int $languageId + * + * @return \eZ\Publish\API\Repository\Values\Content\Language + */ + public function loadLanguageById( $languageId ) + { + return $this->service->loadLanguageById( $languageId ); + } + + /** + * Deletes a language from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * if language can not be deleted + * because it is still assigned to some content / type / (...). + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user is not allowed to delete a language + * + * @param \eZ\Publish\API\Repository\Values\Content\Language $language + */ + public function deleteLanguage( Language $language ) + { + $returnValue = $this->service->deleteLanguage( $language ); + $this->signalDispatcher->emit( + new DeleteLanguageSignal( + array( + 'languageId' => $language->id, + ) + ) + ); + return $returnValue; + } + + /** + * Returns a configured default language code + * + * @return string + */ + public function getDefaultLanguageCode() + { + return $this->service->getDefaultLanguageCode(); + } + + /** + * Instantiates an object to be used for creating languages + * + * @return \eZ\Publish\API\Repository\Values\Content\LanguageCreateStruct + */ + public function newLanguageCreateStruct() + { + return $this->service->newLanguageCreateStruct(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/LocationService.php b/eZ/Publish/Core/SignalSlot/LocationService.php new file mode 100644 index 0000000..547f0a4 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/LocationService.php @@ -0,0 +1,354 @@ +<?php +/** + * LocationService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\LocationService as LocationServiceInterface; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\API\Repository\Values\Content\LocationCreateStruct; +use eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\CopySubtreeSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\CreateLocationSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\UpdateLocationSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\SwapLocationSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\HideLocationSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\UnhideLocationSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\MoveSubtreeSignal; +use eZ\Publish\Core\SignalSlot\Signal\LocationService\DeleteLocationSignal; + +/** + * LocationService class + * @package eZ\Publish\Core\SignalSlot + */ +class LocationService implements LocationServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\LocationService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( LocationServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Copies the subtree starting from $subtree as a new subtree of $targetLocation + * + * Only the items on which the user has read access are copied. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed copy the subtree to the given parent location + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user does not have read access to the whole source subtree + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the target location is a sub location of the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $subtree - the subtree denoted by the location to copy + * @param \eZ\Publish\API\Repository\Values\Content\Location $targetParentLocation - the target parent location for the copy operation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location The newly created location of the copied subtree + */ + public function copySubtree( Location $subtree, Location $targetParentLocation ) + { + $returnValue = $this->service->copySubtree( $subtree, $targetParentLocation ); + $this->signalDispatcher->emit( + new CopySubtreeSignal( + array( + 'subtreeId' => $subtree->id, + 'targetParentLocationId' => $targetParentLocation->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a location object from its $locationId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param int $locationId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocation( $locationId ) + { + return $this->service->loadLocation( $locationId ); + } + + /** + * Loads a location object from its $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read this location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified location is not found + * + * @param string $remoteId + * + * @return \eZ\Publish\API\Repository\Values\Content\Location + */ + public function loadLocationByRemoteId( $remoteId ) + { + return $this->service->loadLocationByRemoteId( $remoteId ); + } + + /** + * Loads the locations for the given content object. + * + * If a $rootLocation is given, only locations that belong to this location are returned. + * The location list is also filtered by permissions on reading locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if there is no published version yet + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Location $rootLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location[] An array of {@link Location} + */ + public function loadLocations( ContentInfo $contentInfo, Location $rootLocation = null ) + { + return $this->service->loadLocations( $contentInfo, $rootLocation ); + } + + /** + * Loads children which are readable by the current user of a location object sorted by sortField and sortOrder + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param int $offset the start offset for paging + * @param int $limit the number of locations returned. If $limit = -1 all children starting at $offset are returned + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationList + */ + public function loadLocationChildren( Location $location, $offset = 0, $limit = -1 ) + { + return $this->service->loadLocationChildren( $location, $offset, $limit ); + } + + /** + * Returns the number of children which are readable by the current user of a location object + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return int + */ + public function getLocationChildCount( Location $location ) + { + return $this->service->getLocationChildCount( $location ); + } + + /** + * Creates the new $location in the content repository for the given content + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the content is already below the specified parent + * or the parent is a sub location of the location of the content + * or if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * + * @param \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct $locationCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created Location + * + */ + public function createLocation( ContentInfo $contentInfo, LocationCreateStruct $locationCreateStruct ) + { + $returnValue = $this->service->createLocation( $contentInfo, $locationCreateStruct ); + $this->signalDispatcher->emit( + new CreateLocationSignal( + array( + 'contentId' => $contentInfo->id, + 'locationId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Updates $location in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to update this location + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if if set the remoteId exists already + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct $locationUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the updated Location + */ + public function updateLocation( Location $location, LocationUpdateStruct $locationUpdateStruct ) + { + $returnValue = $this->service->updateLocation( $location, $locationUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateLocationSignal( + array( + 'contentId' => $location->contentId, + 'locationId' => $location->id, + ) + ) + ); + return $returnValue; + } + + /** + * Swaps the contents held by $location1 and $location2 + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to swap content + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location1 + * @param \eZ\Publish\API\Repository\Values\Content\Location $location2 + */ + public function swapLocation( Location $location1, Location $location2 ) + { + $returnValue = $this->service->swapLocation( $location1, $location2 ); + $this->signalDispatcher->emit( + new SwapLocationSignal( + array( + 'location1Id' => $location1->id, + 'content1Id' => $location1->contentId, + 'location2Id' => $location2->id, + 'content2Id' => $location2->contentId, + ) + ) + ); + return $returnValue; + } + + /** + * Hides the $location and marks invisible all descendants of $location. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to hide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function hideLocation( Location $location ) + { + $returnValue = $this->service->hideLocation( $location ); + $this->signalDispatcher->emit( + new HideLocationSignal( + array( + 'locationId' => $location->id, + ) + ) + ); + return $returnValue; + } + + /** + * Unhides the $location. + * + * This method and marks visible all descendants of $locations + * until a hidden location is found. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to unhide this location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\Location $location, with updated hidden value + */ + public function unhideLocation( Location $location ) + { + $returnValue = $this->service->unhideLocation( $location ); + $this->signalDispatcher->emit( + new UnhideLocationSignal( + array( + 'locationId' => $location->id, + ) + ) + ); + return $returnValue; + } + + /** + * Moves the subtree to $newParentLocation + * + * If a user has the permission to move the location to a target location + * he can do it regardless of an existing descendant on which the user has no permission. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to move this location to the target + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + */ + public function moveSubtree( Location $location, Location $newParentLocation ) + { + $returnValue = $this->service->moveSubtree( $location, $newParentLocation ); + $this->signalDispatcher->emit( + new MoveSubtreeSignal( + array( + 'locationId' => $location->id, + 'newParentLocationId' => $newParentLocation->id, + ) + ) + ); + return $returnValue; + } + + /** + * Deletes $location and all its descendants. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user is not allowed to delete this location or a descendant + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + */ + public function deleteLocation( Location $location ) + { + $returnValue = $this->service->deleteLocation( $location ); + $this->signalDispatcher->emit( + new DeleteLocationSignal( + array( + 'contentId' => $location->contentId, + 'locationId' => $location->id, + ) + ) + ); + return $returnValue; + } + + /** + * Instantiates a new location create class + * + * @param mixed $parentLocationId the parent under which the new location should be created + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationCreateStruct + */ + public function newLocationCreateStruct( $parentLocationId ) + { + return $this->service->newLocationCreateStruct( $parentLocationId ); + } + + /** + * Instantiates a new location update class + * + * @return \eZ\Publish\API\Repository\Values\Content\LocationUpdateStruct + */ + public function newLocationUpdateStruct() + { + return $this->service->newLocationUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/ObjectStateService.php b/eZ/Publish/Core/SignalSlot/ObjectStateService.php new file mode 100644 index 0000000..dc0dd65 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/ObjectStateService.php @@ -0,0 +1,374 @@ +<?php +/** + * ObjectStateService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\ObjectStateService as ObjectStateServiceInterface; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectState; +use eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\CreateObjectStateGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\UpdateObjectStateGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\DeleteObjectStateGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\CreateObjectStateSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\UpdateObjectStateSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\SetPriorityOfObjectStateSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\DeleteObjectStateSignal; +use eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\SetContentStateSignal; + +/** + * ObjectStateService class + * @package eZ\Publish\Core\SignalSlot + */ +class ObjectStateService implements ObjectStateServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\ObjectStateService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( ObjectStateServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Creates a new object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct $objectStateGroupCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function createObjectStateGroup( ObjectStateGroupCreateStruct $objectStateGroupCreateStruct ) + { + $returnValue = $this->service->createObjectStateGroup( $objectStateGroupCreateStruct ); + $this->signalDispatcher->emit( + new CreateObjectStateGroupSignal( + array( + 'objectStateGroupId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a object state group + * + * @param mixed $objectStateGroupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function loadObjectStateGroup( $objectStateGroupId ) + { + return $this->service->loadObjectStateGroup( $objectStateGroupId ); + } + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup[] + */ + public function loadObjectStateGroups( $offset = 0, $limit = -1 ) + { + return $this->service->loadObjectStateGroups( $offset, $limit ); + } + + /** + * This method returns the ordered list of object states of a group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState[] + */ + public function loadObjectStates( ObjectStateGroup $objectStateGroup ) + { + return $this->service->loadObjectStates( $objectStateGroup ); + } + + /** + * Updates an object state group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state group with provided identifier already exists + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup + */ + public function updateObjectStateGroup( ObjectStateGroup $objectStateGroup, ObjectStateGroupUpdateStruct $objectStateGroupUpdateStruct ) + { + $returnValue = $this->service->updateObjectStateGroup( $objectStateGroup, $objectStateGroupUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateObjectStateGroupSignal( + array( + 'objectStateGroupId' => $objectStateGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Deletes a object state group including all states and links to content + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + */ + public function deleteObjectStateGroup( ObjectStateGroup $objectStateGroup ) + { + $returnValue = $this->service->deleteObjectStateGroup( $objectStateGroup ); + $this->signalDispatcher->emit( + new DeleteObjectStateGroupSignal( + array( + 'objectStateGroupId' => $objectStateGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Creates a new object state in the given group. + * + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct $objectStateCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function createObjectState( ObjectStateGroup $objectStateGroup, ObjectStateCreateStruct $objectStateCreateStruct ) + { + $returnValue = $this->service->createObjectState( $objectStateGroup, $objectStateCreateStruct ); + $this->signalDispatcher->emit( + new CreateObjectStateSignal( + array( + 'objectStateGroupId' => $objectStateGroup->id, + 'objectStateId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function loadObjectState( $stateId ) + { + return $this->service->loadObjectState( $stateId ); + } + + /** + * Updates an object state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to update an object state + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state with provided identifier already exists in the same group + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct $objectStateUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function updateObjectState( ObjectState $objectState, ObjectStateUpdateStruct $objectStateUpdateStruct ) + { + $returnValue = $this->service->updateObjectState( $objectState, $objectStateUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateObjectStateSignal( + array( + 'objectStateId' => $objectState->id, + ) + ) + ); + return $returnValue; + } + + /** + * Changes the priority of the state + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change priority on an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * @param int $priority + */ + public function setPriorityOfObjectState( ObjectState $objectState, $priority ) + { + $returnValue = $this->service->setPriorityOfObjectState( $objectState, $priority ); + $this->signalDispatcher->emit( + new SetPriorityOfObjectStateSignal( + array( + 'objectStateId' => $objectState->id, + 'priority' => $priority, + ) + ) + ); + return $returnValue; + } + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete an object state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function deleteObjectState( ObjectState $objectState ) + { + $returnValue = $this->service->deleteObjectState( $objectState ); + $this->signalDispatcher->emit( + new DeleteObjectStateSignal( + array( + 'objectStateId' => $objectState->id, + ) + ) + ); + return $returnValue; + } + + /** + * Sets the object-state of a state group to $state for the given content. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the object state does not belong to the given group + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to change the object state + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + */ + public function setContentState( ContentInfo $contentInfo, ObjectStateGroup $objectStateGroup, ObjectState $objectState ) + { + $returnValue = $this->service->setContentState( $contentInfo, $objectStateGroup, $objectState ); + $this->signalDispatcher->emit( + new SetContentStateSignal( + array( + 'contentId' => $contentInfo->id, + 'objectStateGroupId' => $objectStateGroup->id, + 'objectStateId' => $objectState->id, + ) + ) + ); + return $returnValue; + } + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroup $objectStateGroup + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectState + */ + public function getContentState( ContentInfo $contentInfo, ObjectStateGroup $objectStateGroup ) + { + return $this->service->getContentState( $contentInfo, $objectStateGroup ); + } + + /** + * Returns the number of objects which are in this state + * + * @param \eZ\Publish\API\Repository\Values\ObjectState\ObjectState $objectState + * + * @return int + */ + public function getContentCount( ObjectState $objectState ) + { + return $this->service->getContentCount( $objectState ); + } + + /** + * Instantiates a new Object State Group Create Struct and sets $identified in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupCreateStruct + */ + public function newObjectStateGroupCreateStruct( $identifier ) + { + return $this->service->newObjectStateGroupCreateStruct( $identifier ); + } + + /** + * Instantiates a new Object State Group Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateGroupUpdateStruct + */ + public function newObjectStateGroupUpdateStruct() + { + return $this->service->newObjectStateGroupUpdateStruct(); + } + + /** + * Instantiates a new Object State Create Struct and sets $identifier in it. + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateCreateStruct + */ + public function newObjectStateCreateStruct( $identifier ) + { + return $this->service->newObjectStateCreateStruct( $identifier ); + } + + /** + * Instantiates a new Object State Update Struct. + * + * @return \eZ\Publish\API\Repository\Values\ObjectState\ObjectStateUpdateStruct + */ + public function newObjectStateUpdateStruct() + { + return $this->service->newObjectStateUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Repository.php b/eZ/Publish/Core/SignalSlot/Repository.php new file mode 100644 index 0000000..68cea5e --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Repository.php @@ -0,0 +1,489 @@ +<?php +/** + * Repository class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\Repository as RepositoryInterface; +use eZ\Publish\API\Repository\Values\ValueObject; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\Limitation; + +/** + * Repository class + * @package eZ\Publish\Core\Repository + */ +class Repository implements RepositoryInterface +{ + /** + * Repository Handler object + * + * @var \eZ\Publish\API\Repository\Repository + */ + protected $repository; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Instance of content service + * + * @var \eZ\Publish\API\Repository\ContentService + */ + protected $contentService; + + /** + * Instance of section service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $sectionService; + + /** + * Instance of role service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $roleService; + + /** + * Instance of search service + * + * @var \eZ\Publish\API\Repository\SearchService + */ + protected $searchService; + + /** + * Instance of user service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $userService; + + /** + * Instance of language service + * + * @var \eZ\Publish\API\Repository\LanguageService + */ + protected $languageService; + + /** + * Instance of location service + * + * @var \eZ\Publish\API\Repository\LocationService + */ + protected $locationService; + + /** + * Instance of Trash service + * + * @var \eZ\Publish\API\Repository\TrashService + */ + protected $trashService; + + /** + * Instance of content type service + * + * @var \eZ\Publish\API\Repository\ContentTypeService + */ + protected $contentTypeService; + + /** + * Instance of IO service + * + * @var \eZ\Publish\API\Repository\IOService + */ + protected $ioService; + + /** + * Instance of object state service + * + * @var \eZ\Publish\API\Repository\ObjectStateService + */ + protected $objectStateService; + + /** + * Instance of field type service + * + * @var \eZ\Publish\API\Repository\FieldTypeService + */ + protected $fieldTypeService; + + /** + * Instance of name schema resolver service + * + * @var \eZ\Publish\Core\Repository\NameSchemaService + */ + protected $nameSchemaService; + + /** + * Instance of URL alias service + * + * @var \eZ\Publish\Core\Repository\UrlAliasService + */ + protected $urlAliasService; + + /** + * Instance of URL wildcard service + * + * @var \eZ\Publish\Core\Repository\URLWildcardService + */ + protected $urlWildcardService; + + /** + * Constructor + * + * Construct repository object from aggregated repository and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\Repository $repository + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( RepositoryInterface $repository, SignalDispatcher $signalDispatcher ) + { + $this->repository = $repository; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Get current user + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function getCurrentUser() + { + return $this->repository->getCurrentUser(); + } + + /** + * Sets the current user to the given $user. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return void + */ + public function setCurrentUser( User $user ) + { + return $this->repository->setCurrentUser( $user ); + } + + /** + * Check if user has access to a given module / function + * + * Low level function, use canUser instead if you have objects to check against. + * + * @param string $module + * @param string $function + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return boolean|array Bool if user has full or no access, array if limitations if not + */ + public function hasAccess( $module, $function, User $user = null ) + { + return $this->repository->hasAccess( $module, $function, $user ); + } + + /** + * Check if user has access to a given action on a given value object + * + * Indicates if the current user is allowed to perform an action given by the function on the given + * objects. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * + * @param string $module The module, aka controller identifier to check permissions on + * @param string $function The function, aka the controller action to check permissions on + * @param \eZ\Publish\API\Repository\Values\ValueObject $object The object to check if the user has access to + * @param \eZ\Publish\API\Repository\Values\ValueObject $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function canUser( $module, $function, ValueObject $object, ValueObject $target = null ) + { + return $this->repository->canUser( $module, $function, $object, $target ); + } + + /** + * Get Content Service + * + * Get service object to perform operations on Content objects and it's aggregate members. + * + * @return \eZ\Publish\API\Repository\ContentService + */ + public function getContentService() + { + if ( $this->contentService !== null ) + return $this->contentService; + + $this->contentService = new ContentService( $this->repository->getContentService(), $this->signalDispatcher ); + return $this->contentService; + } + + /** + * Get Content Language Service + * + * Get service object to perform operations on Content language objects + * + * @return \eZ\Publish\API\Repository\LanguageService + */ + public function getContentLanguageService() + { + if ( $this->languageService !== null ) + return $this->languageService; + + $this->languageService = new LanguageService( $this->repository->getContentLanguageService(), $this->signalDispatcher ); + return $this->languageService; + } + + /** + * Get Content Type Service + * + * Get service object to perform operations on Content Type objects and it's aggregate members. + * ( Group, Field & FieldCategory ) + * + * @return \eZ\Publish\API\Repository\ContentTypeService + */ + public function getContentTypeService() + { + if ( $this->contentTypeService !== null ) + return $this->contentTypeService; + + $this->contentTypeService = new ContentTypeService( $this->repository->getContentTypeService(), $this->signalDispatcher ); + return $this->contentTypeService; + } + + /** + * Get Content Location Service + * + * Get service object to perform operations on Location objects and subtrees + * + * @return \eZ\Publish\API\Repository\LocationService + */ + public function getLocationService() + { + if ( $this->locationService !== null ) + return $this->locationService; + + $this->locationService = new LocationService( $this->repository->getLocationService(), $this->signalDispatcher ); + return $this->locationService; + } + + /** + * Get Content Trash service + * + * Trash service allows to perform operations related to location trash + * (trash/untrash, load/list from trash...) + * + * @return \eZ\Publish\API\Repository\TrashService + */ + public function getTrashService() + { + if ( $this->trashService !== null ) + return $this->trashService; + + $this->trashService = new TrashService( $this->repository->getTrashService(), $this->signalDispatcher ); + return $this->trashService; + } + + /** + * Get Content Section Service + * + * Get Section service that lets you manipulate section objects + * + * @return \eZ\Publish\API\Repository\SectionService + */ + public function getSectionService() + { + if ( $this->sectionService !== null ) + return $this->sectionService; + + $this->sectionService = new SectionService( $this->repository->getSectionService(), $this->signalDispatcher ); + return $this->sectionService; + } + + /** + * Get User Service + * + * Get service object to perform operations on Users and UserGroup + * + * @return \eZ\Publish\API\Repository\UserService + */ + public function getUserService() + { + if ( $this->userService !== null ) + return $this->userService; + + $this->userService = new UserService( $this->repository->getUserService(), $this->signalDispatcher ); + return $this->userService; + } + + /** + * Get URLAliasService + * + * @return \eZ\Publish\API\Repository\URLAliasService + */ + public function getURLAliasService() + { + if ( $this->urlAliasService !== null ) + return $this->urlAliasService; + + $this->urlAliasService = new URLAliasService( $this->repository->getURLAliasService(), $this->signalDispatcher ); + return $this->urlAliasService; + } + + /** + * Get URLWildcardService + * + * @return \eZ\Publish\API\Repository\URLWildcardService + */ + public function getURLWildcardService() + { + if ( $this->urlWildcardService !== null ) + return $this->urlWildcardService; + + $this->urlWildcardService = new URLWildcardService( $this->repository->getURLWildcardService(), $this->signalDispatcher ); + return $this->urlWildcardService; + } + + /** + * Get ObjectStateService + * + * @return \eZ\Publish\API\Repository\ObjectStateService + */ + public function getObjectStateService() + { + if ( $this->objectStateService !== null ) + return $this->objectStateService; + + $this->objectStateService = new ObjectStateService( $this->repository->getObjectStateService(), $this->signalDispatcher ); + return $this->objectStateService; + } + + /** + * Get IO Service + * + * Get service object to perform operations on binary files + * + * @return \eZ\Publish\API\Repository\IOService + */ + public function getIOService() + { + // @todo FIXME: IOService is to be deprecated + return $this->repository->getIOService(); + } + + /** + * Get RoleService + * + * @return \eZ\Publish\API\Repository\RoleService + */ + public function getRoleService() + { + if ( $this->roleService !== null ) + return $this->roleService; + + $this->roleService = new RoleService( $this->repository->getRoleService(), $this->signalDispatcher ); + return $this->roleService; + } + + /** + * Get SearchService + * + * @return \eZ\Publish\API\Repository\SearchService + */ + public function getSearchService() + { + if ( $this->searchService !== null ) + return $this->searchService; + + $this->searchService = new SearchService( $this->repository->getSearchService(), $this->signalDispatcher ); + return $this->searchService; + } + + /** + * Get FieldTypeService + * + * @return \eZ\Publish\API\Repository\FieldTypeService + */ + public function getFieldTypeService() + { + if ( $this->fieldTypeService !== null ) + return $this->fieldTypeService; + + $this->fieldTypeService = new FieldTypeService( $this->repository->getFieldTypeService(), $this->signalDispatcher ); + return $this->fieldTypeService; + } + + /** + * Get NameSchemaResolverService + * + * @access private Internal service for the Core Services + * + * @todo Move out from this & other repo instances when services becomes proper services in DIC terms using factory. + * + * @return \eZ\Publish\Core\Repository\NameSchemaService + */ + public function getNameSchemaService() + { + return $this->repository->getNameSchemaService(); + } + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction() + { + return $this->repository->beginTransaction(); + } + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit() + { + return $this->repository->commit(); + } + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback() + { + return $this->repository->rollback(); + } + + /** + * Only for internal use. + * + * Creates a \DateTime object for $timestamp in the current time zone + * + * @param int $timestamp + * + * @return \DateTime + */ + public function createDateTime( $timestamp = null ) + { + return $this->repository->createDateTime( $timestamp ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/RoleService.php b/eZ/Publish/Core/SignalSlot/RoleService.php new file mode 100644 index 0000000..e0b7d7c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/RoleService.php @@ -0,0 +1,477 @@ +<?php +/** + * RoleService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\RoleService as RoleServiceInterface; +use eZ\Publish\API\Repository\Values\User\RoleCreateStruct; +use eZ\Publish\API\Repository\Values\User\RoleUpdateStruct; +use eZ\Publish\API\Repository\Values\User\PolicyCreateStruct; +use eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct; +use eZ\Publish\API\Repository\Values\User\Role; +use eZ\Publish\API\Repository\Values\User\Policy; +use eZ\Publish\API\Repository\Values\User\User; +use eZ\Publish\API\Repository\Values\User\UserGroup; +use eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\CreateRoleSignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\UpdateRoleSignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\AddPolicySignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\RemovePolicySignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\UpdatePolicySignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\DeleteRoleSignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\AssignRoleToUserGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\UnassignRoleFromUserGroupSignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\AssignRoleToUserSignal; +use eZ\Publish\Core\SignalSlot\Signal\RoleService\UnassignRoleFromUserSignal; + +/** + * RoleService class + * @package eZ\Publish\Core\SignalSlot + */ +class RoleService implements RoleServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\RoleService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\RoleService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( RoleServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Creates a new Role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\RoleCreateStruct $roleCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function createRole( RoleCreateStruct $roleCreateStruct ) + { + $returnValue = $this->service->createRole( $roleCreateStruct ); + $this->signalDispatcher->emit( + new CreateRoleSignal( + array( + 'roleId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Updates the name of the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the name of the role already exists + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct $roleUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function updateRole( Role $role, RoleUpdateStruct $roleUpdateStruct ) + { + $returnValue = $this->service->updateRole( $role, $roleUpdateStruct ); + $this->signalDispatcher->emit( + new UpdateRoleSignal( + array( + 'roleId' => $role->id, + ) + ) + ); + return $returnValue; + } + + /** + * Adds a new policy to the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to add a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct $policyCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function addPolicy( Role $role, PolicyCreateStruct $policyCreateStruct ) + { + $returnValue = $this->service->addPolicy( $role, $policyCreateStruct ); + $this->signalDispatcher->emit( + new AddPolicySignal( + array( + 'roleId' => $role->id, + 'policyId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * removes a policy from the role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a policy + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy the policy to remove from the role + * + * @return \eZ\Publish\API\Repository\Values\User\Role the updated role + */ + public function removePolicy( Role $role, Policy $policy ) + { + $returnValue = $this->service->removePolicy( $role, $policy ); + $this->signalDispatcher->emit( + new RemovePolicySignal( + array( + 'roleId' => $role->id, + 'policyId' => $policy->id, + ) + ) + ); + return $returnValue; + } + + /** + * Updates the limitations of a policy. The module and function cannot be changed and + * the limitations are replaced by the ones in $roleUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to u�date a policy + * + * @param \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct $policyUpdateStruct + * @param \eZ\Publish\API\Repository\Values\User\Policy $policy + * + * @return \eZ\Publish\API\Repository\Values\User\Policy + */ + public function updatePolicy( Policy $policy, PolicyUpdateStruct $policyUpdateStruct ) + { + $returnValue = $this->service->updatePolicy( $policy, $policyUpdateStruct ); + $this->signalDispatcher->emit( + new UpdatePolicySignal( + array( + 'policyId' => $policy->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a role for the given id + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRole( $id ) + { + return $this->service->loadRole( $id ); + } + + /** + * Loads a role for the given identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read this role + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a role with the given name was not found + * + * @param string $identifier + * + * @return \eZ\Publish\API\Repository\Values\User\Role + */ + public function loadRoleByIdentifier( $identifier ) + { + return $this->service->loadRoleByIdentifier( $identifier ); + } + + /** + * Loads all roles + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the roles + * + * @return \eZ\Publish\API\Repository\Values\User\Role[] + */ + public function loadRoles() + { + return $this->service->loadRoles(); + } + + /** + * Deletes the given role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete this role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + */ + public function deleteRole( Role $role ) + { + $returnValue = $this->service->deleteRole( $role ); + $this->signalDispatcher->emit( + new DeleteRoleSignal( + array( + 'roleId' => $role->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads all policies from roles which are assigned to a user or to user groups to which the user belongs + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + * + * @param int $userId + * + * @return \eZ\Publish\API\Repository\Values\User\Policy[] + */ + public function loadPoliciesByUserId( $userId ) + { + return $this->service->loadPoliciesByUserId( $userId ); + } + + /** + * Assigns a role to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUserGroup( Role $role, UserGroup $userGroup, RoleLimitation $roleLimitation = null ) + { + $returnValue = $this->service->assignRoleToUserGroup( $role, $userGroup, $roleLimitation ); + $this->signalDispatcher->emit( + new AssignRoleToUserGroupSignal( + array( + 'roleId' => $role->id, + 'userGroupId' => $userGroup->id, + 'roleLimitation' => $roleLimitation, + ) + ) + ); + return $returnValue; + } + + /** + * removes a role from the given user group. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the given user group + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + */ + public function unassignRoleFromUserGroup( Role $role, UserGroup $userGroup ) + { + $returnValue = $this->service->unassignRoleFromUserGroup( $role, $userGroup ); + $this->signalDispatcher->emit( + new UnassignRoleFromUserGroupSignal( + array( + 'roleId' => $role->id, + 'userGroupId' => $userGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Assigns a role to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation $roleLimitation an optional role limitation (which is either a subtree limitation or section limitation) + */ + public function assignRoleToUser( Role $role, User $user, RoleLimitation $roleLimitation = null ) + { + $returnValue = $this->service->assignRoleToUser( $role, $user, $roleLimitation ); + $this->signalDispatcher->emit( + new AssignRoleToUserSignal( + array( + 'roleId' => $role->id, + 'userId' => $user->id, + 'roleLimitation' => $roleLimitation, + ) + ) + ); + return $returnValue; + } + + /** + * removes a role from the given user. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove a role + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the role is not assigned to the user + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * @param \eZ\Publish\API\Repository\Values\User\User $user + */ + public function unassignRoleFromUser( Role $role, User $user ) + { + $returnValue = $this->service->unassignRoleFromUser( $role, $user ); + $this->signalDispatcher->emit( + new UnassignRoleFromUserSignal( + array( + 'roleId' => $role->id, + 'userId' => $user->id, + ) + ) + ); + return $returnValue; + } + + /** + * Returns the assigned user and user groups to this role + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a role + * + * @param \eZ\Publish\API\Repository\Values\User\Role $role + * + * @return \eZ\Publish\API\Repository\Values\User\RoleAssignment[] + */ + public function getRoleAssignments( Role $role ) + { + return $this->service->getRoleAssignments( $role ); + } + + /** + * Returns the roles assigned to the given user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\User\UserRoleAssignment[] + */ + public function getRoleAssignmentsForUser( User $user ) + { + return $this->service->getRoleAssignmentsForUser( $user ); + } + + /** + * Returns the roles assigned to the given user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupRoleAssignment[] + */ + public function getRoleAssignmentsForUserGroup( UserGroup $userGroup ) + { + return $this->service->getRoleAssignmentsForUserGroup( $userGroup ); + } + + /** + * Instantiates a role create class + * + * @param string $name + * + * @return \eZ\Publish\API\Repository\Values\User\RoleCreateStruct + */ + public function newRoleCreateStruct( $name ) + { + return $this->service->newRoleCreateStruct( $name ); + } + + /** + * Instantiates a policy create class + * + * @param string $module + * @param string $function + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyCreateStruct + */ + public function newPolicyCreateStruct( $module, $function ) + { + return $this->service->newPolicyCreateStruct( $module, $function ); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\PolicyUpdateStruct + */ + public function newPolicyUpdateStruct() + { + return $this->service->newPolicyUpdateStruct(); + } + + /** + * Instantiates a policy update class + * + * @return \eZ\Publish\API\Repository\Values\User\RoleUpdateStruct + */ + public function newRoleUpdateStruct() + { + return $this->service->newRoleUpdateStruct(); + } + + /** + * Returns the LimitationType registered with the given identifier + * + * @param string $identifier + * + * @return \eZ\Publish\SPI\Limitation\Type + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if there is no LimitationType with $identifier + */ + public function getLimitationType( $identifier ) + { + return $this->service->getLimitationType( $identifier ); + } + + /** + * Returns the LimitationType's assigned to a given module/function + * + * Typically used for: + * - Internal validation limitation value use on Policies + * - Role admin gui for editing policy limitations incl list limitation options via valueSchema() + * + * @param string $module Legacy name of "controller", it's a unique identifier like "content" + * @param string $function Legacy name of a controller "action", it's a unique within the controller like "read" + * + * @return \eZ\Publish\SPI\Limitation\Type[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If module/function to limitation type mapping + * refers to a non existing identifier. + */ + public function getLimitationTypesByModuleFunction( $module, $function ) + { + return $this->service->getLimitationTypesByModuleFunction( $module, $function ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/SearchService.php b/eZ/Publish/Core/SignalSlot/SearchService.php new file mode 100644 index 0000000..63a365e --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SearchService.php @@ -0,0 +1,99 @@ +<?php +/** + * SearchService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\SearchService as SearchServiceInterface; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; + +/** + * SearchService class + * @package eZ\Publish\Core\SignalSlot + */ +class SearchService implements SearchServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\SearchService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\SearchService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( SearchServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + public function findContent( Query $query, array $fieldFilters = array(), $filterOnUserPermissions = true ) + { + return $this->service->findContent( $query, $fieldFilters, $filterOnUserPermissions ); + } + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * @param boolean $filterOnUserPermissions if true only the objects which is the user allowed to read are returned. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + public function findSingle( Criterion $criterion, array $fieldFilters = array(), $filterOnUserPermissions = true ) + { + return $this->service->findSingle( $criterion, $fieldFilters, $filterOnUserPermissions ); + } + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldPaths + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ) + { + return $this->service->suggest( $prefix, $fieldPaths, $limit, $filter ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/SectionService.php b/eZ/Publish/Core/SignalSlot/SectionService.php new file mode 100644 index 0000000..835ebb5 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SectionService.php @@ -0,0 +1,219 @@ +<?php +/** + * SectionService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\SectionService as SectionServiceInterface; +use eZ\Publish\API\Repository\Values\Content\SectionCreateStruct; +use eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct; +use eZ\Publish\API\Repository\Values\Content\Section; +use eZ\Publish\API\Repository\Values\Content\ContentInfo; + +/** + * SectionService class + * @package eZ\Publish\Core\SignalSlot + */ +class SectionService implements SectionServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\SectionService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\SectionService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( SectionServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Creates the a new Section in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier in $sectionCreateStruct already exists + * + * @param \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct $sectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section The newly create section + */ + public function createSection( SectionCreateStruct $sectionCreateStruct ) + { + $returnValue = $this->service->createSection( $sectionCreateStruct ); + $this->signalDispatcher->emit( + new Signal\SectionService\CreateSectionSignal( + array( + 'sectionId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Updates the given in the content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to create a section + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the new identifier already exists (if set in the update struct) + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * @param \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct $sectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function updateSection( Section $section, SectionUpdateStruct $sectionUpdateStruct ) + { + $returnValue = $this->service->updateSection( $section, $sectionUpdateStruct ); + $this->signalDispatcher->emit( + new Signal\SectionService\UpdateSectionSignal( + array( + 'sectionId' => $section->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a Section from its id ($sectionId) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param mixed $sectionId + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSection( $sectionId ) + { + return $this->service->loadSection( $sectionId ); + } + + /** + * Loads all sections + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @return array of {@link \eZ\Publish\API\Repository\Values\Content\Section} + */ + public function loadSections() + { + return $this->service->loadSections(); + } + + /** + * Loads a Section from its identifier ($sectionIdentifier) + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if section could not be found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to read a section + * + * @param string $sectionIdentifier + * + * @return \eZ\Publish\API\Repository\Values\Content\Section + */ + public function loadSectionByIdentifier( $sectionIdentifier ) + { + return $this->service->loadSectionByIdentifier( $sectionIdentifier ); + } + + /** + * Counts the contents which $section is assigned to + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + * + * @return int + */ + public function countAssignedContents( Section $section ) + { + return $this->service->countAssignedContents( $section ); + } + + /** + * Assigns the content to the given section + * this method overrides the current assigned section + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If user does not have access to view provided object + * + * @param \eZ\Publish\API\Repository\Values\Content\ContentInfo $contentInfo + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function assignSection( ContentInfo $contentInfo, Section $section ) + { + $returnValue = $this->service->assignSection( $contentInfo, $section ); + $this->signalDispatcher->emit( + new Signal\SectionService\AssignSectionSignal( + array( + 'contentId' => $contentInfo->id, + 'sectionId' => $section->id, + ) + ) + ); + return $returnValue; + } + + /** + * Deletes $section from content repository + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the specified section is not found + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException If the current user user is not allowed to delete a section + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException if section can not be deleted + * because it is still assigned to some contents. + * + * @param \eZ\Publish\API\Repository\Values\Content\Section $section + */ + public function deleteSection( Section $section ) + { + $returnValue = $this->service->deleteSection( $section ); + $this->signalDispatcher->emit( + new Signal\SectionService\DeleteSectionSignal( + array( + 'sectionId' => $section->id, + ) + ) + ); + return $returnValue; + } + + /** + * Instantiates a new SectionCreateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionCreateStruct + */ + public function newSectionCreateStruct() + { + return $this->service->newSectionCreateStruct(); + } + + /** + * Instantiates a new SectionUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\Content\SectionUpdateStruct + */ + public function newSectionUpdateStruct() + { + return $this->service->newSectionUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Signal.php b/eZ/Publish/Core/SignalSlot/Signal.php new file mode 100644 index 0000000..fe18fe7 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal.php @@ -0,0 +1,24 @@ +<?php +/** + * File containing the SignalDispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Base class for Signals. All Signals must derive this class. + * + * A Signal must always be fully export and re-creatable. It must therefore not + * depend on external object references, resources or similar. + * + * @internal + */ +abstract class Signal extends ValueObject +{ +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/AddRelationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/AddRelationSignal.php new file mode 100644 index 0000000..617cbfc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/AddRelationSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * AddRelationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AddRelationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class AddRelationSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $srcContentId; + + /** + * Version Number + * + * @var int + */ + public $srcVersionNo; + + /** + * Content ID + * + * @var mixed + */ + public $dstContentId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/AddTranslationInfoSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/AddTranslationInfoSignal.php new file mode 100644 index 0000000..2f2f6a8 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/AddTranslationInfoSignal.php @@ -0,0 +1,20 @@ +<?php +/** + * AddTranslationInfoSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AddTranslationInfoSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class AddTranslationInfoSignal extends Signal +{ +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/CopyContentSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/CopyContentSignal.php new file mode 100644 index 0000000..7717235 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/CopyContentSignal.php @@ -0,0 +1,54 @@ +<?php +/** + * CopyContentSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CopyContentSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class CopyContentSignal extends Signal +{ + /** + * Source Content ID + * + * @var mixed + */ + public $srcContentId; + + /** + * Source Version Number + * + * @var int|null + */ + public $srcVersionNo; + + /** + * Destination Content ID + * + * @var mixed + */ + public $dstContentId; + + /** + * Destination Version Number + * + * @var int + */ + public $dstVersionNo; + + /** + * Destination Parent Location ID + * + * @var mixed + */ + public $dstParentLocationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/CreateContentDraftSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/CreateContentDraftSignal.php new file mode 100644 index 0000000..12645d2 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/CreateContentDraftSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * CreateContentDraftSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateContentDraftSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class CreateContentDraftSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; + + /** + * Version Number + * + * @var int + */ + public $versionNo; + + /** + * UserId + * + * @var mixed + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/CreateContentSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/CreateContentSignal.php new file mode 100644 index 0000000..1993341 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/CreateContentSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * CreateContentSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateContentSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class CreateContentSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $contentId; + + /** + * Version Number + * + * @var int + */ + public $versionNo; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteContentSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteContentSignal.php new file mode 100644 index 0000000..43c97a8 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteContentSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteContentSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteContentSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class DeleteContentSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteRelationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteRelationSignal.php new file mode 100644 index 0000000..d627657 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteRelationSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * DeleteRelationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteRelationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class DeleteRelationSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $srcContentId; + + /** + * Version Number + * + * @var int + */ + public $srcVersionNo; + + /** + * Content ID + * + * @var mixed + */ + public $dstContentId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteVersionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteVersionSignal.php new file mode 100644 index 0000000..a744888 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/DeleteVersionSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * DeleteVersionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteVersionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class DeleteVersionSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $contentId; + + /** + * Version Number + * + * @var int + */ + public $versionNo; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/PublishVersionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/PublishVersionSignal.php new file mode 100644 index 0000000..df57d8a --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/PublishVersionSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * PublishVersionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * PublishVersionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class PublishVersionSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $contentId; + + /** + * Version Number + * + * @var int + */ + public $versionNo; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/TranslateVersionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/TranslateVersionSignal.php new file mode 100644 index 0000000..bf753cf --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/TranslateVersionSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * TranslateVersionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * TranslateVersionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class TranslateVersionSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $contentId; + + /** + * Version Number + * + * @var int + */ + public $versionNo; + + /** + * UserId + * + * @var mixed|null + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/UpdateContentMetadataSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/UpdateContentMetadataSignal.php new file mode 100644 index 0000000..cd1507f --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/UpdateContentMetadataSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateContentMetadataSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateContentMetadataSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class UpdateContentMetadataSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentService/UpdateContentSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentService/UpdateContentSignal.php new file mode 100644 index 0000000..3fc9626 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentService/UpdateContentSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UpdateContentSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateContentSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentService + */ +class UpdateContentSignal extends Signal +{ + /** + * Content ID + * + * @var mixed + */ + public $contentId; + + /** + * Version Number + * + * @var int + */ + public $versionNo; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/AddFieldDefinitionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/AddFieldDefinitionSignal.php new file mode 100644 index 0000000..2491209 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/AddFieldDefinitionSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * AddFieldDefinitionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AddFieldDefinitionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class AddFieldDefinitionSignal extends Signal +{ + /** + * ContentTypeDraftId + * + * @var mixed + */ + public $contentTypeDraftId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/AssignContentTypeGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/AssignContentTypeGroupSignal.php new file mode 100644 index 0000000..194a566 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/AssignContentTypeGroupSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * AssignContentTypeGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AssignContentTypeGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class AssignContentTypeGroupSignal extends Signal +{ + /** + * ContentTypeId + * + * @var mixed + */ + public $contentTypeId; + + /** + * ContentTypeGroupId + * + * @var mixed + */ + public $contentTypeGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CopyContentTypeSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CopyContentTypeSignal.php new file mode 100644 index 0000000..6e9e762 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CopyContentTypeSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * CopyContentTypeSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CopyContentTypeSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class CopyContentTypeSignal extends Signal +{ + /** + * ContentTypeId + * + * @var mixed + */ + public $contentTypeId; + + /** + * UserId + * + * @var mixed + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeDraftSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeDraftSignal.php new file mode 100644 index 0000000..473f2bc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeDraftSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateContentTypeDraftSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateContentTypeDraftSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class CreateContentTypeDraftSignal extends Signal +{ + /** + * ContentTypeId + * + * @var mixed + */ + public $contentTypeId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeGroupSignal.php new file mode 100644 index 0000000..8cc74e5 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateContentTypeGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateContentTypeGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class CreateContentTypeGroupSignal extends Signal +{ + /** + * Group ID + * + * @var mixed + */ + public $groupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeSignal.php new file mode 100644 index 0000000..6dd6d70 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/CreateContentTypeSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateContentTypeSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateContentTypeSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class CreateContentTypeSignal extends Signal +{ + /** + * Content Type ID + * + * @var mixed + */ + public $contentTypeId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/DeleteContentTypeGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/DeleteContentTypeGroupSignal.php new file mode 100644 index 0000000..59eefa7 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/DeleteContentTypeGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteContentTypeGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteContentTypeGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class DeleteContentTypeGroupSignal extends Signal +{ + /** + * ContentTypeGroupId + * + * @var mixed + */ + public $contentTypeGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/DeleteContentTypeSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/DeleteContentTypeSignal.php new file mode 100644 index 0000000..fb6673c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/DeleteContentTypeSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteContentTypeSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteContentTypeSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class DeleteContentTypeSignal extends Signal +{ + /** + * ContentTypeId + * + * @var mixed + */ + public $contentTypeId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/PublishContentTypeDraftSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/PublishContentTypeDraftSignal.php new file mode 100644 index 0000000..b2a5d81 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/PublishContentTypeDraftSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * PublishContentTypeDraftSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * PublishContentTypeDraftSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class PublishContentTypeDraftSignal extends Signal +{ + /** + * ContentTypeDraftId + * + * @var mixed + */ + public $contentTypeDraftId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/RemoveFieldDefinitionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/RemoveFieldDefinitionSignal.php new file mode 100644 index 0000000..5e3e819 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/RemoveFieldDefinitionSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * RemoveFieldDefinitionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * RemoveFieldDefinitionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class RemoveFieldDefinitionSignal extends Signal +{ + /** + * ContentTypeDraftId + * + * @var mixed + */ + public $contentTypeDraftId; + + /** + * FieldDefinitionId + * + * @var mixed + */ + public $fieldDefinitionId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UnassignContentTypeGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UnassignContentTypeGroupSignal.php new file mode 100644 index 0000000..28d5c43 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UnassignContentTypeGroupSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UnassignContentTypeGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UnassignContentTypeGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class UnassignContentTypeGroupSignal extends Signal +{ + /** + * ContentTypeId + * + * @var mixed + */ + public $contentTypeId; + + /** + * ContentTypeGroupId + * + * @var mixed + */ + public $contentTypeGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateContentTypeDraftSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateContentTypeDraftSignal.php new file mode 100644 index 0000000..9cfe299 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateContentTypeDraftSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateContentTypeDraftSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateContentTypeDraftSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class UpdateContentTypeDraftSignal extends Signal +{ + /** + * ContentTypeDraftId + * + * @var mixed + */ + public $contentTypeDraftId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateContentTypeGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateContentTypeGroupSignal.php new file mode 100644 index 0000000..9f22abf --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateContentTypeGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateContentTypeGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateContentTypeGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class UpdateContentTypeGroupSignal extends Signal +{ + /** + * ContentTypeGroupId + * + * @var mixed + */ + public $contentTypeGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateFieldDefinitionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateFieldDefinitionSignal.php new file mode 100644 index 0000000..7421318 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ContentTypeService/UpdateFieldDefinitionSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UpdateFieldDefinitionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ContentTypeService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateFieldDefinitionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ContentTypeService + */ +class UpdateFieldDefinitionSignal extends Signal +{ + /** + * ContentTypeDraftId + * + * @var mixed + */ + public $contentTypeDraftId; + + /** + * FieldDefinitionId + * + * @var mixed + */ + public $fieldDefinitionId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LanguageService/CreateLanguageSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/CreateLanguageSignal.php new file mode 100644 index 0000000..0f1db21 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/CreateLanguageSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateLanguageSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LanguageService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateLanguageSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LanguageService + */ +class CreateLanguageSignal extends Signal +{ + /** + * Language ID + * + * @var mixed + */ + public $languageId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LanguageService/DeleteLanguageSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/DeleteLanguageSignal.php new file mode 100644 index 0000000..e89044a --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/DeleteLanguageSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteLanguageSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LanguageService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteLanguageSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LanguageService + */ +class DeleteLanguageSignal extends Signal +{ + /** + * LanguageId + * + * @var mixed + */ + public $languageId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LanguageService/DisableLanguageSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/DisableLanguageSignal.php new file mode 100644 index 0000000..d7b9370 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/DisableLanguageSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DisableLanguageSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LanguageService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DisableLanguageSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LanguageService + */ +class DisableLanguageSignal extends Signal +{ + /** + * LanguageId + * + * @var mixed + */ + public $languageId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LanguageService/EnableLanguageSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/EnableLanguageSignal.php new file mode 100644 index 0000000..96aa081 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/EnableLanguageSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * EnableLanguageSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LanguageService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * EnableLanguageSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LanguageService + */ +class EnableLanguageSignal extends Signal +{ + /** + * LanguageId + * + * @var mixed + */ + public $languageId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LanguageService/UpdateLanguageNameSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/UpdateLanguageNameSignal.php new file mode 100644 index 0000000..2a57a88 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LanguageService/UpdateLanguageNameSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UpdateLanguageNameSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LanguageService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateLanguageNameSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LanguageService + */ +class UpdateLanguageNameSignal extends Signal +{ + /** + * LanguageId + * + * @var mixed + */ + public $languageId; + + /** + * NewName + * + * @var mixed + */ + public $newName; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/CopySubtreeSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/CopySubtreeSignal.php new file mode 100644 index 0000000..c1c4fba --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/CopySubtreeSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * CopySubtreeSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CopySubtreeSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class CopySubtreeSignal extends Signal +{ + /** + * SubtreeId + * + * @var mixed + */ + public $subtreeId; + + /** + * TargetParentLocationId + * + * @var mixed + */ + public $targetParentLocationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/CreateLocationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/CreateLocationSignal.php new file mode 100644 index 0000000..40bf0ad --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/CreateLocationSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * CreateLocationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateLocationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class CreateLocationSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; + + /** + * Location ID + * + * @var mixed + */ + public $locationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/DeleteLocationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/DeleteLocationSignal.php new file mode 100644 index 0000000..82f31c0 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/DeleteLocationSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * DeleteLocationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteLocationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class DeleteLocationSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; + + /** + * Location ID + * + * @var mixed + */ + public $locationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/HideLocationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/HideLocationSignal.php new file mode 100644 index 0000000..7f6640b --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/HideLocationSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * HideLocationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * HideLocationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class HideLocationSignal extends Signal +{ + /** + * Location ID + * + * @var mixed + */ + public $locationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/MoveSubtreeSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/MoveSubtreeSignal.php new file mode 100644 index 0000000..27893aa --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/MoveSubtreeSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * MoveSubtreeSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * MoveSubtreeSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class MoveSubtreeSignal extends Signal +{ + /** + * LocationId + * + * @var mixed + */ + public $locationId; + + /** + * NewParentLocationId + * + * @var mixed + */ + public $newParentLocationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/SwapLocationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/SwapLocationSignal.php new file mode 100644 index 0000000..7d0e118 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/SwapLocationSignal.php @@ -0,0 +1,47 @@ +<?php +/** + * SwapLocationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * SwapLocationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class SwapLocationSignal extends Signal +{ + /** + * Content1 Id + * + * @var mixed + */ + public $content1Id; + + /** + * Location1 Id + * + * @var mixed + */ + public $location1Id; + + /** + * Content2 Id + * + * @var mixed + */ + public $content2Id; + + /** + * Location2 Id + * + * @var mixed + */ + public $location2Id; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/UnhideLocationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/UnhideLocationSignal.php new file mode 100644 index 0000000..30b9948 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/UnhideLocationSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UnhideLocationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UnhideLocationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class UnhideLocationSignal extends Signal +{ + /** + * Location ID + * + * @var mixed + */ + public $locationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/LocationService/UpdateLocationSignal.php b/eZ/Publish/Core/SignalSlot/Signal/LocationService/UpdateLocationSignal.php new file mode 100644 index 0000000..f6a1891 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/LocationService/UpdateLocationSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UpdateLocationSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\LocationService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateLocationSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\LocationService + */ +class UpdateLocationSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; + + /** + * Location ID + * + * @var mixed + */ + public $locationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/CreateObjectStateGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/CreateObjectStateGroupSignal.php new file mode 100644 index 0000000..be9a953 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/CreateObjectStateGroupSignal.php @@ -0,0 +1,27 @@ +<?php +/** + * CreateObjectStateGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateObjectStateGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class CreateObjectStateGroupSignal extends Signal +{ + /** + * ObjectStateGroupId + * + * @var mixed + */ + public $objectStateGroupId; +} + diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/CreateObjectStateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/CreateObjectStateSignal.php new file mode 100644 index 0000000..5bb2eb2 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/CreateObjectStateSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * CreateObjectStateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateObjectStateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class CreateObjectStateSignal extends Signal +{ + /** + * ObjectStateGroupId + * + * @var mixed + */ + public $objectStateGroupId; + + /** + * ObjectStateId + * + * @var mixed + */ + public $objectStateId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/DeleteObjectStateGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/DeleteObjectStateGroupSignal.php new file mode 100644 index 0000000..13f8218 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/DeleteObjectStateGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteObjectStateGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteObjectStateGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class DeleteObjectStateGroupSignal extends Signal +{ + /** + * ObjectStateGroupId + * + * @var mixed + */ + public $objectStateGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/DeleteObjectStateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/DeleteObjectStateSignal.php new file mode 100644 index 0000000..b04541b --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/DeleteObjectStateSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteObjectStateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteObjectStateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class DeleteObjectStateSignal extends Signal +{ + /** + * ObjectStateId + * + * @var mixed + */ + public $objectStateId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/SetContentStateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/SetContentStateSignal.php new file mode 100644 index 0000000..f348438 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/SetContentStateSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * SetContentStateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * SetContentStateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class SetContentStateSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; + + /** + * ObjectStateGroupId + * + * @var mixed + */ + public $objectStateGroupId; + + /** + * ObjectStateId + * + * @var mixed + */ + public $objectStateId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/SetPriorityOfObjectStateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/SetPriorityOfObjectStateSignal.php new file mode 100644 index 0000000..b212bf9 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/SetPriorityOfObjectStateSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * SetPriorityOfObjectStateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * SetPriorityOfObjectStateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class SetPriorityOfObjectStateSignal extends Signal +{ + /** + * ObjectStateId + * + * @var mixed + */ + public $objectStateId; + + /** + * Priority + * + * @var mixed + */ + public $priority; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/UpdateObjectStateGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/UpdateObjectStateGroupSignal.php new file mode 100644 index 0000000..650a00f --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/UpdateObjectStateGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateObjectStateGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateObjectStateGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class UpdateObjectStateGroupSignal extends Signal +{ + /** + * ObjectStateGroupId + * + * @var mixed + */ + public $objectStateGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/UpdateObjectStateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/UpdateObjectStateSignal.php new file mode 100644 index 0000000..ad4c59c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/ObjectStateService/UpdateObjectStateSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateObjectStateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\ObjectStateService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateObjectStateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\ObjectStateService + */ +class UpdateObjectStateSignal extends Signal +{ + /** + * ObjectStateId + * + * @var mixed + */ + public $objectStateId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/AddPolicySignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/AddPolicySignal.php new file mode 100644 index 0000000..4d72936 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/AddPolicySignal.php @@ -0,0 +1,33 @@ +<?php +/** + * AddPolicySignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AddPolicySignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class AddPolicySignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; + + /** + * PolicyId + * + * @var mixed + */ + public $policyId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/AssignRoleToUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/AssignRoleToUserGroupSignal.php new file mode 100644 index 0000000..ad40c25 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/AssignRoleToUserGroupSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * AssignRoleToUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AssignRoleToUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class AssignRoleToUserGroupSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; + + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; + + /** + * RoleLimitation + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + public $roleLimitation; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/AssignRoleToUserSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/AssignRoleToUserSignal.php new file mode 100644 index 0000000..f81fd0c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/AssignRoleToUserSignal.php @@ -0,0 +1,40 @@ +<?php +/** + * AssignRoleToUserSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AssignRoleToUserSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class AssignRoleToUserSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; + + /** + * UserId + * + * @var mixed + */ + public $userId; + + /** + * RoleLimitation + * + * @var \eZ\Publish\API\Repository\Values\User\Limitation\RoleLimitation + */ + public $roleLimitation; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/CreateRoleSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/CreateRoleSignal.php new file mode 100644 index 0000000..76d0fbc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/CreateRoleSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateRoleSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateRoleSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class CreateRoleSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/DeleteRoleSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/DeleteRoleSignal.php new file mode 100644 index 0000000..168b6ea --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/DeleteRoleSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteRoleSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteRoleSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class DeleteRoleSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/RemovePolicySignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/RemovePolicySignal.php new file mode 100644 index 0000000..eb02535 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/RemovePolicySignal.php @@ -0,0 +1,33 @@ +<?php +/** + * RemovePolicySignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * RemovePolicySignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class RemovePolicySignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; + + /** + * PolicyId + * + * @var mixed + */ + public $policyId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/UnassignRoleFromUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UnassignRoleFromUserGroupSignal.php new file mode 100644 index 0000000..f39573b --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UnassignRoleFromUserGroupSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UnassignRoleFromUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UnassignRoleFromUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class UnassignRoleFromUserGroupSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; + + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/UnassignRoleFromUserSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UnassignRoleFromUserSignal.php new file mode 100644 index 0000000..c745f26 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UnassignRoleFromUserSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UnassignRoleFromUserSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UnassignRoleFromUserSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class UnassignRoleFromUserSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; + + /** + * UserId + * + * @var mixed + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/UpdatePolicySignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UpdatePolicySignal.php new file mode 100644 index 0000000..e908904 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UpdatePolicySignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdatePolicySignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdatePolicySignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class UpdatePolicySignal extends Signal +{ + /** + * PolicyId + * + * @var mixed + */ + public $policyId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/RoleService/UpdateRoleSignal.php b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UpdateRoleSignal.php new file mode 100644 index 0000000..9c02852 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/RoleService/UpdateRoleSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateRoleSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\RoleService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateRoleSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\RoleService + */ +class UpdateRoleSignal extends Signal +{ + /** + * RoleId + * + * @var mixed + */ + public $roleId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/SectionService/AssignSectionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/SectionService/AssignSectionSignal.php new file mode 100644 index 0000000..8d763c8 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/SectionService/AssignSectionSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * AssignSectionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\SectionService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AssignSectionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\SectionService + */ +class AssignSectionSignal extends Signal +{ + /** + * ContentId + * + * @var mixed + */ + public $contentId; + + /** + * SectionId + * + * @var mixed + */ + public $sectionId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/SectionService/CreateSectionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/SectionService/CreateSectionSignal.php new file mode 100644 index 0000000..63f08c1 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/SectionService/CreateSectionSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateSectionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\SectionService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateSectionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\SectionService + */ +class CreateSectionSignal extends Signal +{ + /** + * SectionId + * + * @var mixed + */ + public $sectionId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/SectionService/DeleteSectionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/SectionService/DeleteSectionSignal.php new file mode 100644 index 0000000..77fb11a --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/SectionService/DeleteSectionSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteSectionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\SectionService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteSectionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\SectionService + */ +class DeleteSectionSignal extends Signal +{ + /** + * SectionId + * + * @var mixed + */ + public $sectionId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/SectionService/UpdateSectionSignal.php b/eZ/Publish/Core/SignalSlot/Signal/SectionService/UpdateSectionSignal.php new file mode 100644 index 0000000..20926ef --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/SectionService/UpdateSectionSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateSectionSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\SectionService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateSectionSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\SectionService + */ +class UpdateSectionSignal extends Signal +{ + /** + * SectionId + * + * @var mixed + */ + public $sectionId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/TrashService/DeleteTrashItemSignal.php b/eZ/Publish/Core/SignalSlot/Signal/TrashService/DeleteTrashItemSignal.php new file mode 100644 index 0000000..e677561 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/TrashService/DeleteTrashItemSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteTrashItemSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\TrashService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteTrashItemSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\TrashService + */ +class DeleteTrashItemSignal extends Signal +{ + /** + * TrashItemId + * + * @var mixed + */ + public $trashItemId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/TrashService/EmptyTrashSignal.php b/eZ/Publish/Core/SignalSlot/Signal/TrashService/EmptyTrashSignal.php new file mode 100644 index 0000000..cffeb30 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/TrashService/EmptyTrashSignal.php @@ -0,0 +1,20 @@ +<?php +/** + * EmptyTrashSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\TrashService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * EmptyTrashSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\TrashService + */ +class EmptyTrashSignal extends Signal +{ +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/TrashService/RecoverSignal.php b/eZ/Publish/Core/SignalSlot/Signal/TrashService/RecoverSignal.php new file mode 100644 index 0000000..5646d27 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/TrashService/RecoverSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * RecoverSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\TrashService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * RecoverSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\TrashService + */ +class RecoverSignal extends Signal +{ + /** + * TrashItemId + * + * @var mixed + */ + public $trashItemId; + + /** + * NewParentLocationId + * + * @var mixed + */ + public $newParentLocationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/TrashService/TrashSignal.php b/eZ/Publish/Core/SignalSlot/Signal/TrashService/TrashSignal.php new file mode 100644 index 0000000..170e9c7 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/TrashService/TrashSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * TrashSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\TrashService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * TrashSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\TrashService + */ +class TrashSignal extends Signal +{ + /** + * LocationId + * + * @var mixed + */ + public $locationId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/CreateGlobalUrlAliasSignal.php b/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/CreateGlobalUrlAliasSignal.php new file mode 100644 index 0000000..4e22625 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/CreateGlobalUrlAliasSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateGlobalUrlAliasSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\URLAliasService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateGlobalUrlAliasSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\URLAliasService + */ +class CreateGlobalUrlAliasSignal extends Signal +{ + /** + * URL Alias ID + * + * @var mixed + */ + public $urlAliasId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/CreateUrlAliasSignal.php b/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/CreateUrlAliasSignal.php new file mode 100644 index 0000000..539527a --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/CreateUrlAliasSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateUrlAliasSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\URLAliasService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateUrlAliasSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\URLAliasService + */ +class CreateUrlAliasSignal extends Signal +{ + /** + * URL Alias ID + * + * @var mixed + */ + public $urlAliasId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/RemoveAliasesSignal.php b/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/RemoveAliasesSignal.php new file mode 100644 index 0000000..c69e5d9 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/URLAliasService/RemoveAliasesSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * RemoveAliasesSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\URLAliasService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * RemoveAliasesSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\URLAliasService + */ +class RemoveAliasesSignal extends Signal +{ + /** + * AliasList + * + * @var mixed + */ + public $aliasList; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/CreateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/CreateSignal.php new file mode 100644 index 0000000..1f1bc4b --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/CreateSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\URLWildcardService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\URLWildcardService + */ +class CreateSignal extends Signal +{ + /** + * UrlWildcardId + * + * @var mixed + */ + public $urlWildcardId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/RemoveSignal.php b/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/RemoveSignal.php new file mode 100644 index 0000000..2414d22 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/RemoveSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * RemoveSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\URLWildcardService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * RemoveSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\URLWildcardService + */ +class RemoveSignal extends Signal +{ + /** + * UrlWildcardId + * + * @var mixed + */ + public $urlWildcardId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/TranslateSignal.php b/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/TranslateSignal.php new file mode 100644 index 0000000..1d5d6e8 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/URLWildcardService/TranslateSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * TranslateSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\URLWildcardService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * TranslateSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\URLWildcardService + */ +class TranslateSignal extends Signal +{ + /** + * Url + * + * @var mixed + */ + public $url; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/AssignUserToUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/AssignUserToUserGroupSignal.php new file mode 100644 index 0000000..bc598db --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/AssignUserToUserGroupSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * AssignUserToUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * AssignUserToUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class AssignUserToUserGroupSignal extends Signal +{ + /** + * UserId + * + * @var mixed + */ + public $userId; + + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/CreateUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/CreateUserGroupSignal.php new file mode 100644 index 0000000..e51eee7 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/CreateUserGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class CreateUserGroupSignal extends Signal +{ + /** + * User Group ID + * + * @var mixed + */ + public $userGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/CreateUserSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/CreateUserSignal.php new file mode 100644 index 0000000..9da6869 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/CreateUserSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * CreateUserSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * CreateUserSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class CreateUserSignal extends Signal +{ + /** + * User ID + * + * @var mixed + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/DeleteUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/DeleteUserGroupSignal.php new file mode 100644 index 0000000..fcb4e9d --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/DeleteUserGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class DeleteUserGroupSignal extends Signal +{ + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/DeleteUserSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/DeleteUserSignal.php new file mode 100644 index 0000000..69e4f31 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/DeleteUserSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * DeleteUserSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * DeleteUserSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class DeleteUserSignal extends Signal +{ + /** + * UserId + * + * @var mixed + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/MoveUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/MoveUserGroupSignal.php new file mode 100644 index 0000000..bf7d3dc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/MoveUserGroupSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * MoveUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * MoveUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class MoveUserGroupSignal extends Signal +{ + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; + + /** + * NewParentId + * + * @var mixed + */ + public $newParentId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/UnAssignUserFromUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/UnAssignUserFromUserGroupSignal.php new file mode 100644 index 0000000..ee9edfb --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/UnAssignUserFromUserGroupSignal.php @@ -0,0 +1,33 @@ +<?php +/** + * UnAssignUserFromUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UnAssignUserFromUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class UnAssignUserFromUserGroupSignal extends Signal +{ + /** + * UserId + * + * @var mixed + */ + public $userId; + + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/UpdateUserGroupSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/UpdateUserGroupSignal.php new file mode 100644 index 0000000..17d7f66 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/UpdateUserGroupSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateUserGroupSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateUserGroupSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class UpdateUserGroupSignal extends Signal +{ + /** + * UserGroupId + * + * @var mixed + */ + public $userGroupId; +} diff --git a/eZ/Publish/Core/SignalSlot/Signal/UserService/UpdateUserSignal.php b/eZ/Publish/Core/SignalSlot/Signal/UserService/UpdateUserSignal.php new file mode 100644 index 0000000..af8e42d --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Signal/UserService/UpdateUserSignal.php @@ -0,0 +1,26 @@ +<?php +/** + * UpdateUserSignal class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Signal\UserService; + +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * UpdateUserSignal class + * @package eZ\Publish\Core\SignalSlot\Signal\UserService + */ +class UpdateUserSignal extends Signal +{ + /** + * UserId + * + * @var mixed + */ + public $userId; +} diff --git a/eZ/Publish/Core/SignalSlot/SignalDispatcher.php b/eZ/Publish/Core/SignalSlot/SignalDispatcher.php new file mode 100644 index 0000000..43b52dc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SignalDispatcher.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the SignalDispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +/** + * Dispatches Signals to their assigned Slots + * + * An instance of this class is required by each object that needs to send + * Signals. It is recommended, that a SignalDispatcher works together with a + * {@link SlotFactory} to get hold of the actual Slots that listen for a given + * Signal, which it originally only knows by their identifier. + * + * @internal + */ +abstract class SignalDispatcher +{ + /** + * Emits the given $signal + * + * All assigned slots will eventually receive the $signal + * + * @param Signal $signal + * + * @return void + */ + abstract public function emit( Signal $signal ); + + /** + * Attaches the Slot with $slotIdentifier to the signal with + * $signalIdentifier + * + * @param string $signalIdentifier + * @param string $slotIdentifier + * + * @return void + * + * @todo Are we sure we want to expose this method? Might lead to dynamic + * attachments at runtime, which can lead to hard debugging. Better only + * accept attachments during construction (config). + */ + abstract public function attach( $signalIdentifier, $slotIdentifier ); +} diff --git a/eZ/Publish/Core/SignalSlot/SignalDispatcher/DefaultSignalDispatcher.php b/eZ/Publish/Core/SignalSlot/SignalDispatcher/DefaultSignalDispatcher.php new file mode 100644 index 0000000..f199ad0 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SignalDispatcher/DefaultSignalDispatcher.php @@ -0,0 +1,91 @@ +<?php +/** + * File containing the SignalDispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\SignalDispatcher; + +use eZ\Publish\Core\SignalSlot\SignalDispatcher; +use eZ\Publish\Core\SignalSlot\SlotFactory; +use eZ\Publish\Core\SignalSlot\Signal; + +/** + * Dispatches Signals to their assigned Slots + * + * An instance of this class is required by each object that needs to send + * Signals. It is recommended, that a SignalDispatcher works together with a + * {@link SlotFactory} to get hold of the actual Slots that listen for a given + * Signal, which it originally only knows by their identifier. + * + * @internal + */ +class DefaultSignalDispatcher extends SignalDispatcher +{ + /** + * Slot factory + * + * @var \eZ\Publish\Core\SignalSlot\SlotFactory + */ + protected $factory; + + /** + * Signal slot mapping + * + * @var array + */ + protected $mapping = array(); + + /** + * Construct from factory + * + * @param \eZ\Publish\Core\SignalSlot\SlotFactory $factory + * @param array $mapping + */ + public function __construct( SlotFactory $factory, array $mapping = array() ) + { + $this->factory = $factory; + $this->mapping = $mapping; + } + + /** + * Emits the given $signal + * + * All assigned slots will eventually receive the $signal + * + * @param Signal $signal + * + * @return void + */ + public function emit( Signal $signal ) + { + $signalName = get_class( $signal ); + if ( !isset( $this->mapping[$signalName] ) ) + { + return; + } + + foreach ( $this->mapping[$signalName] as $slotIdentifier ) + { + $slot = $this->factory->getSlot( $slotIdentifier ); + $slot->receive( $signal ); + } + } + + /** + * Attaches the Slot with $slotIdentifier to the signal with + * $signalIdentifier + * + * @access private For unit test use. + * + * @param string $signalIdentifier + * @param string $slotIdentifier + */ + public function attach( $signalIdentifier, $slotIdentifier ) + { + $this->mapping[$signalIdentifier][] = $slotIdentifier; + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot.php b/eZ/Publish/Core/SignalSlot/Slot.php new file mode 100644 index 0000000..156f910 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot.php @@ -0,0 +1,27 @@ +<?php +/** + * File containing the SignalDispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +/** + * A Slot can be assigned to receive a certain Signal. + * + * @internal + */ +abstract class Slot +{ + /** + * Receive the given $signal and react on it + * + * @param Signal $signal + * + * @return void + */ + abstract public function receive( Signal $signal ); +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/AbstractLegacySlot.php b/eZ/Publish/Core/SignalSlot/Slot/AbstractLegacySlot.php new file mode 100644 index 0000000..5dcdb92 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/AbstractLegacySlot.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the AbstractLegacySlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Slot; +use Closure; +use ezpKernelHandler; + +/** + * A abstract legacy slot covering common functions needed for legacy slots. + */ +abstract class AbstractLegacySlot extends Slot +{ + /** + * @var \Closure|\ezpKernelHandler + */ + private $legacyKernel; + + /** + * @param \Closure|\ezpKernelHandler $legacyKernel + */ + public function __construct( $legacyKernel ) + { + if ( $legacyKernel instanceof Closure || $legacyKernel instanceof ezpKernelHandler ) + $this->legacyKernel = $legacyKernel; + else + throw new \RuntimeException( "Legacy slot only accepts \$legacyKernel instance of Closure or ezpKernelHandler" ); + } + + /** + * Returns the legacy kernel object. + * + * @return \ezpKernelHandler + */ + protected function getLegacyKernel() + { + if ( $this->legacyKernel instanceof ezpKernelHandler ) + return $this->legacyKernel; + + $legacyKernelClosure = $this->legacyKernel; + return $legacyKernelClosure(); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyAssignSectionSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyAssignSectionSlot.php new file mode 100644 index 0000000..df172cc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyAssignSectionSlot.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the Legacy\AssignSectionSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling AssignSectionSignal. + */ +class LegacyAssignSectionSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\SectionService\AssignSectionSignal ) + return;// @todo Error Logging? No exception seem to be defined for this case + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + \eZSearch::updateObjectsSection( array( $signal->contentId ), $signal->sectionId ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyCopyContentSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyCopyContentSlot.php new file mode 100644 index 0000000..958f789 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyCopyContentSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\CopyContentSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling CopyContentSignal. + */ +class LegacyCopyContentSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\ContentService\CopyContentSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->dstContentId ); + $object = \eZContentObject::fetch( $signal->dstContentId ); + \eZSearch::addObject( $object, false ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyCreateLocationSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyCreateLocationSlot.php new file mode 100644 index 0000000..b140971 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyCreateLocationSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\CreateLocationSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling CreateLocationSignal. + */ +class LegacyCreateLocationSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\CreateLocationSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + $object = \eZContentObject::fetch( $signal->contentId ); + \eZSearch::addNodeAssignment( $object->mainNodeID(), $signal->contentId, $signal->locationId ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteContentSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteContentSlot.php new file mode 100644 index 0000000..58bad08 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteContentSlot.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the Legacy\DeleteContentSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling DeleteContentSignal. + */ +class LegacyDeleteContentSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\ContentService\DeleteContentSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + \eZSearch::removeObjectById( $signal->contentId, false ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteLocationSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteLocationSlot.php new file mode 100644 index 0000000..9f31865 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteLocationSlot.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the Legacy\DeleteLocationSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling DeleteLocationSignal. + */ +class LegacyDeleteLocationSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\DeleteLocationSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + \eZSearch::removeNodes( array( $signal->locationId ) ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteVersionSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteVersionSlot.php new file mode 100644 index 0000000..3b2132d --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyDeleteVersionSlot.php @@ -0,0 +1,44 @@ +<?php +/** + * File containing the Legacy\DeleteVersionSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling DeleteVersionSignal. + */ +class LegacyDeleteVersionSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\ContentService\DeleteVersionSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + \eZSearch::removeObjectById( $signal->contentId, false ); + $object = \eZContentObject::fetch( $signal->contentId ); + \eZSearch::addObject( $object, false ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyHideLocationSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyHideLocationSlot.php new file mode 100644 index 0000000..6a9fcce --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyHideLocationSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\HideLocationSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling HideLocationSignal. + */ +class LegacyHideLocationSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\HideLocationSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + $node = \eZContentObjectTreeNode::fetch( $signal->locationId ); + \eZContentObjectTreeNode::clearViewCacheForSubtree( $node ); + \eZSearch::updateNodeVisibility( $signal->locationId, 'hide' ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyMoveSubtreeSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyMoveSubtreeSlot.php new file mode 100644 index 0000000..6280fe7 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyMoveSubtreeSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\MoveSubtreeSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling MoveSubtreeSignal. + */ +class LegacyMoveSubtreeSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\MoveSubtreeSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + $node = \eZContentObjectTreeNode::fetch( $signal->locationId ); + \eZContentObjectTreeNode::clearViewCacheForSubtree( $node ); + // @todo What about eZSearch in this case? + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyPublishContentTypeDraftSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyPublishContentTypeDraftSlot.php new file mode 100644 index 0000000..283a6cb --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyPublishContentTypeDraftSlot.php @@ -0,0 +1,48 @@ +<?php +/** + * File containing the Legacy\PublishContentTypeDraft class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; +use eZExpiryHandler; + +/** + * A legacy slot handling PublishContentTypeDraftSignal. + */ +class LegacyPublishContentTypeDraftSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\ContentTypeService\PublishContentTypeDraftSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function () use( $signal ) + { + eZExpiryHandler::registerShutdownFunction(); + $handler = eZExpiryHandler::instance(); + $time = time(); + $handler->setTimestamp( 'user-class-cache', $time ); + $handler->setTimestamp( 'class-identifier-cache', $time ); + $handler->setTimestamp( 'sort-key-cache', $time ); + $handler->store(); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyPublishVersionSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyPublishVersionSlot.php new file mode 100644 index 0000000..5e496a1 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyPublishVersionSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\PublishVersionSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling PublishVersionSignal. + */ +class LegacyPublishVersionSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\ContentService\PublishVersionSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + $object = \eZContentObject::fetch( $signal->contentId ); + \eZSearch::addObject( $object, false ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacySetContentStateSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacySetContentStateSlot.php new file mode 100644 index 0000000..b5c9516 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacySetContentStateSlot.php @@ -0,0 +1,42 @@ +<?php +/** + * File containing the Legacy\SetContentStateSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling SetContentStateSignal. + */ +class LegacySetContentStateSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\ObjectStateService\SetContentStateSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + \eZSearch::updateObjectState( $signal->contentId, array( $signal->objectStateId ) ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacySwapLocationSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacySwapLocationSlot.php new file mode 100644 index 0000000..ee19efe --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacySwapLocationSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\SwapLocationSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling SwapLocationSignal. + */ +class LegacySwapLocationSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\SwapLocationSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->content1Id ); + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->content2Id ); + \eZSearch::swapNode( $signal->location1Id, $signal->location2Id ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyUnhideLocationSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyUnhideLocationSlot.php new file mode 100644 index 0000000..026c4dc --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyUnhideLocationSlot.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the Legacy\UnhideLocationSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling UnhideLocationSignal. + */ +class LegacyUnhideLocationSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\UnhideLocationSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + $node = \eZContentObjectTreeNode::fetch( $signal->locationId ); + \eZContentObjectTreeNode::clearViewCacheForSubtree( $node ); + \eZSearch::updateNodeVisibility( $signal->locationId, 'show' ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Slot/LegacyUpdateLocationSlot.php b/eZ/Publish/Core/SignalSlot/Slot/LegacyUpdateLocationSlot.php new file mode 100644 index 0000000..b1e85f4 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Slot/LegacyUpdateLocationSlot.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the Legacy\UpdateLocationSlot class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Slot; + +use eZ\Publish\Core\SignalSlot\Signal; +use eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot; + +/** + * A legacy slot handling UpdateLocationSignal. + */ +class LegacyUpdateLocationSlot extends AbstractLegacySlot +{ + /** + * Receive the given $signal and react on it + * + * @param \eZ\Publish\Core\SignalSlot\Signal $signal + * + * @return void + */ + public function receive( Signal $signal ) + { + if ( !$signal instanceof Signal\LocationService\UpdateLocationSignal ) + return; + + $kernel = $this->getLegacyKernel(); + $kernel->runCallback( + function() use( $signal ) + { + \eZContentCacheManager::clearContentCacheIfNeeded( $signal->contentId ); + }, + false + ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/SlotFactory.php b/eZ/Publish/Core/SignalSlot/SlotFactory.php new file mode 100644 index 0000000..f4622f9 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SlotFactory.php @@ -0,0 +1,29 @@ +<?php +/** + * File containing the SignalDispatcher class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +/** + * Fetches (creates) Slots by their identifier + * + * @internal + */ +abstract class SlotFactory +{ + /** + * Returns a Slot with the given $slotIdentifier + * + * @param string $slotIdentifier + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException When no slot is found + * + * @return \eZ\Publish\Core\SignalSlot\Slot + */ + abstract public function getSlot( $slotIdentifier ); +} diff --git a/eZ/Publish/Core/SignalSlot/SlotFactory/ContainerSlotFactory.php b/eZ/Publish/Core/SignalSlot/SlotFactory/ContainerSlotFactory.php new file mode 100644 index 0000000..8cc80f8 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SlotFactory/ContainerSlotFactory.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the ContainerSlotFactory class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\SlotFactory; + +use eZ\Publish\Core\SignalSlot\SlotFactory; +use Symfony\Component\DependencyInjection\ContainerInterface; + +/** + * Slot factory that is able to lookup slots based on identifier. + */ +class ContainerSlotFactory extends SlotFactory +{ + /** + * @var \Symfony\Component\DependencyInjection\ContainerInterface + */ + protected $container; + + /** + * @param \Symfony\Component\DependencyInjection\ContainerInterface $container + */ + public function __construct( ContainerInterface $container ) + { + $this->container = $container; + } + + /** + * Returns a Slot with the given $slotIdentifier + * + * @param string $slotIdentifier + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException When no slot is found + * + * @return \eZ\Publish\Core\SignalSlot\Slot + */ + public function getSlot( $slotIdentifier ) + { + if ( !$this->container->has( $slotIdentifier ) ) + throw new \eZ\Publish\Core\Base\Exceptions\NotFoundException( 'slot', $slotIdentifier ); + + return $this->container->get( $slotIdentifier ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/SlotFactory/GeneralSlotFactory.php b/eZ/Publish/Core/SignalSlot/SlotFactory/GeneralSlotFactory.php new file mode 100644 index 0000000..c195a68 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SlotFactory/GeneralSlotFactory.php @@ -0,0 +1,50 @@ +<?php +/** + * File containing the GeneralSlotFactory class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\SlotFactory; + +use eZ\Publish\Core\SignalSlot\SlotFactory; + +/** + * Slot factory that is able to lookup slots based on identifier. + * + * @deprecated To be removed when unit test runs on Sf stack, and ContainerSlotFactory is used everywhere. + */ +class GeneralSlotFactory extends SlotFactory +{ + /** + * @var \eZ\Publish\Core\SignalSlot\Slot[] + */ + protected $slots = array(); + + /** + * @param \eZ\Publish\Core\SignalSlot\Slot[] $slots + */ + public function __construct( array $slots = array() ) + { + $this->slots = $slots; + } + + /** + * Returns a Slot with the given $slotIdentifier + * + * @param string $slotIdentifier + * + * @throws \eZ\Publish\Core\Base\Exceptions\NotFoundException When no slot is found + * + * @return \eZ\Publish\Core\SignalSlot\Slot + */ + public function getSlot( $slotIdentifier ) + { + if ( !isset( $this->slots[$slotIdentifier] ) ) + throw new \eZ\Publish\Core\Base\Exceptions\NotFoundException( 'slot', $slotIdentifier ); + + return $this->slots[$slotIdentifier]; + } +} diff --git a/eZ/Publish/Core/SignalSlot/SlotFactory/NullSlotFactory.php b/eZ/Publish/Core/SignalSlot/SlotFactory/NullSlotFactory.php new file mode 100644 index 0000000..331c143 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/SlotFactory/NullSlotFactory.php @@ -0,0 +1,27 @@ +<?php +/** + * File containing the NullSlotFactory class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\SlotFactory; + +use eZ\Publish\Core\SignalSlot\SlotFactory; + +class NullSlotFactory extends SlotFactory +{ + /** + * Returns a Slot with the given $slotIdentifier + * + * @param string $slotIdentifier + * + * @return \eZ\Publish\Core\SignalSlot\Slot + */ + public function getSlot( $slotIdentifier ) + { + throw new \RuntimeException( "Slot creation not supported." ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Tests/SignalDispatcher/DefaultSignalDispatcherTest.php b/eZ/Publish/Core/SignalSlot/Tests/SignalDispatcher/DefaultSignalDispatcherTest.php new file mode 100644 index 0000000..d80ff7c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Tests/SignalDispatcher/DefaultSignalDispatcherTest.php @@ -0,0 +1,117 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Tests\SignalDispatcher; + +use eZ\Publish\Core\SignalSlot; + +/** + * @group signalSlot + * @covers \eZ\Publish\Core\SignalSlot\SignalDispatcher\DefaultSignalDispatcher + */ +class DefaultSignalDispatcherTest extends \PHPUnit_Framework_TestCase +{ + public function testEmitSignalNoSlot() + { + $factory = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\SlotFactory' ); + $factory + ->expects( $this->never() ) + ->method( 'getSlot' ); + + $signal = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Signal' ); + + $dispatcher = new SignalSlot\SignalDispatcher\DefaultSignalDispatcher( $factory ); + $dispatcher->emit( $signal ); + } + + public function testGetSlotSingleSlot() + { + $signal = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Signal' ); + + $slot = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ); + + $factory = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\SlotFactory' ); + $factory + ->expects( $this->once() ) + ->method( 'getSlot' ) + ->with( 'my_slot' ) + ->will( $this->returnValue( $slot ) ); + + $dispatcher = new SignalSlot\SignalDispatcher\DefaultSignalDispatcher( $factory ); + $dispatcher->attach( get_class( $signal ), 'my_slot' ); + $dispatcher->emit( $signal ); + } + + public function testGetSlotMultipleSlots() + { + $signal = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Signal' ); + + $slot = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ); + + $factory = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\SlotFactory' ); + $factory + ->expects( $this->at( 0 ) ) + ->method( 'getSlot' ) + ->with( 'my_slot' ) + ->will( $this->returnValue( $slot ) ); + $factory + ->expects( $this->at( 1 ) ) + ->method( 'getSlot' ) + ->with( 'my_second_slot' ) + ->will( $this->returnValue( $slot ) ); + + $dispatcher = new SignalSlot\SignalDispatcher\DefaultSignalDispatcher( $factory ); + $dispatcher->attach( get_class( $signal ), 'my_slot' ); + $dispatcher->attach( get_class( $signal ), 'my_second_slot' ); + $dispatcher->emit( $signal ); + } + + public function testEmitSignalSingleSlot() + { + $signal = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Signal' ); + + $slot = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ); + $slot + ->expects( $this->once() ) + ->method( 'receive' ) + ->with( $signal ); + + $factory = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\SlotFactory' ); + $factory + ->expects( $this->any() ) + ->method( 'getSlot' ) + ->will( $this->returnValue( $slot ) ); + + $dispatcher = new SignalSlot\SignalDispatcher\DefaultSignalDispatcher( $factory ); + $dispatcher->attach( get_class( $signal ), 'my_slot' ); + $dispatcher->emit( $signal ); + } + + public function testEmitSignalMultipleSlots() + { + $signal = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Signal' ); + + $slot = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ); + $slot + ->expects( $this->exactly( 2 ) ) + ->method( 'receive' ) + ->with( $signal ); + + $factory = $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\SlotFactory' ); + $factory + ->expects( $this->any() ) + ->method( 'getSlot' ) + ->will( $this->returnValue( $slot ) ); + + $dispatcher = new SignalSlot\SignalDispatcher\DefaultSignalDispatcher( $factory ); + $dispatcher->attach( get_class( $signal ), 'my_slot' ); + $dispatcher->attach( get_class( $signal ), 'my_second_slot' ); + $dispatcher->emit( $signal ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Tests/Slot/LegacySlotsTest.php b/eZ/Publish/Core/SignalSlot/Tests/Slot/LegacySlotsTest.php new file mode 100644 index 0000000..fe4450b --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Tests/Slot/LegacySlotsTest.php @@ -0,0 +1,139 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Tests\SignalDispatcher; + +use eZ\Publish\Core\SignalSlot; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; + +/** + * @group signalSlot + */ +class LegacySlotsTest extends \PHPUnit_Framework_TestCase +{ + const SIGNAL_SLOT_NS = '\\eZ\\Publish\\Core\\SignalSlot'; + + /** + * @var \PHPUnit_Framework_MockObject_MockObject + */ + protected $ezpKernelHandlerMock; + + public function setUp() + { + $this->ezpKernelHandlerMock = $this->getMock( '\\ezpKernelHandler' ); + parent::setUp(); + } + + /** + * @covers \eZ\Publish\Core\SignalSlot\Slot\AbstractLegacySlot::getLegacyKernel + */ + public function testAbstractLegacySlot() + { + $ezpKernelHandlerMock = $this->ezpKernelHandlerMock; + $legacySlot = $this->getMock( + '\\eZ\\Publish\\Core\\SignalSlot\\Slot\\AbstractLegacySlot', + // methods + array(), + // ctor arguments + array( + function() use( $ezpKernelHandlerMock ) + { + return $ezpKernelHandlerMock; + } + ) + ); + + $reflectionLegacySlot = new \ReflectionObject( $legacySlot ); + $reflectionLegacySlotMethod = $reflectionLegacySlot->getMethod( 'getLegacyKernel' ); + $reflectionLegacySlotMethod->setAccessible( true ); + + $this->assertSame( $ezpKernelHandlerMock, $reflectionLegacySlotMethod->invoke( $legacySlot ) ); + } + + public function providerForTestLegacySlots() + { + return array( + array( 'LegacyAssignSectionSlot', 'SectionService\\AssignSectionSignal', array() ), + array( 'LegacyCopyContentSlot', 'ContentService\\CopyContentSignal', array() ), + array( 'LegacyCreateLocationSlot', 'LocationService\\CreateLocationSignal', array() ), + array( 'LegacyDeleteContentSlot', 'ContentService\\DeleteContentSignal', array() ), + array( 'LegacyDeleteLocationSlot', 'LocationService\\DeleteLocationSignal', array() ), + array( 'LegacyDeleteVersionSlot', 'ContentService\\DeleteVersionSignal', array() ), + array( 'LegacyHideLocationSlot', 'LocationService\\HideLocationSignal', array() ), + array( 'LegacyMoveSubtreeSlot', 'LocationService\\MoveSubtreeSignal', array() ), + array( 'LegacyPublishVersionSlot', 'ContentService\\PublishVersionSignal', array() ), + array( 'LegacySetContentStateSlot', 'ObjectStateService\\SetContentStateSignal', array() ), + array( 'LegacySwapLocationSlot', 'LocationService\\SwapLocationSignal', array() ), + array( 'LegacyUnhideLocationSlot', 'LocationService\\UnhideLocationSignal', array() ), + array( 'LegacyUpdateLocationSlot', 'LocationService\\UpdateLocationSignal', array() ), + array( 'LegacyPublishContentTypeDraftSlot', 'ContentTypeService\\PublishContentTypeDraftSignal', array() ), + ); + } + + /** + * @dataProvider providerForTestLegacySlots + */ + public function testLegacySlotsValidSignal( $slotName, $signalName, array $signalProperties = array() ) + { + $ezpKernelHandlerMock = $this->ezpKernelHandlerMock; + $signalClassName = self::SIGNAL_SLOT_NS . '\\Signal\\' . $signalName; + $slotClassName = self::SIGNAL_SLOT_NS . '\\Slot\\' . $slotName; + + /** + * @var \eZ\Publish\Core\SignalSlot\Slot $slot + */ + $slot = new $slotClassName( + function() use( $ezpKernelHandlerMock ) + { + return $ezpKernelHandlerMock; + } + ); + + $ezpKernelHandlerMock + ->expects( $this->once() ) + ->method( 'runCallback' ) + ->will( $this->returnValue( null ) ); + + /** + * @var \eZ\Publish\Core\SignalSlot\Signal $signal + */ + $signal = new $signalClassName( $signalProperties ); + $slot->receive( $signal ); + } + + /** + * @dataProvider providerForTestLegacySlots + */ + public function testLegacySlotsInValidSignal( $slotName ) + { + $ezpKernelHandlerMock = $this->ezpKernelHandlerMock; + $slotClassName = self::SIGNAL_SLOT_NS . '\\Slot\\' . $slotName; + + /** + * @var \eZ\Publish\Core\SignalSlot\Slot $slot + */ + $slot = new $slotClassName( + function() use( $ezpKernelHandlerMock ) + { + return $ezpKernelHandlerMock; + } + ); + + $ezpKernelHandlerMock + ->expects( $this->never() ) + ->method( 'runCallback' ) + ->will( $this->returnValue( null ) ); + + /** + * @var \eZ\Publish\Core\SignalSlot\Signal $signal + */ + $signal = $this->getMock( self::SIGNAL_SLOT_NS . '\\Signal' ); + $slot->receive( $signal ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/Tests/SlotFactory/ContainerSlotFactoryTest.php b/eZ/Publish/Core/SignalSlot/Tests/SlotFactory/ContainerSlotFactoryTest.php new file mode 100644 index 0000000..ac8ed55 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Tests/SlotFactory/ContainerSlotFactoryTest.php @@ -0,0 +1,92 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Tests\SignalDispatcher; + +use eZ\Publish\Core\SignalSlot; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; + +/** + * @group signalSlot + * @covers \eZ\Publish\Core\SignalSlot\SlotFactory\ContainerSlotFactory + */ +class ContainerSlotFactoryTest extends \PHPUnit_Framework_TestCase +{ + public function providerForFactoryTests() + { + return array( + array( array( "slot1" => true, "slot2" => true ) ), + array( + array( + 'slot1' => $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ), + 'slot2' => $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ) + ) + ), + ); + } + + /** + * @dataProvider providerForFactoryTests + */ + public function testValidSlot( $slots ) + { + $factory = $this->setUpFactory( $slots ); + foreach ( $slots as $slotIdentifier => $slotValue ) + $this->assertEquals( $slotValue, $factory->getSlot( $slotIdentifier ) ); + } + + /** + * @dataProvider providerForFactoryTests + */ + public function testInValidSlot( $slots ) + { + $factory = $this->setUpFactory( $slots, false ); + foreach ( array_keys( $slots ) as $slotIdentifier ) + { + try + { + $factory->getSlot( $slotIdentifier ); + $this->fail( 'expected NotFoundException ' ); + } + catch ( NotFoundException $e ) + { + } + } + } + + private function setUpFactory( $slots, $hasReturnValue = true ) + { + $container = $this->getMock( '\\Symfony\\Component\\DependencyInjection\\ContainerInterface' ); + $factory = new SignalSlot\SlotFactory\ContainerSlotFactory( $container ); + + $i = 0; + foreach ( $slots as $slotIdentifier => $slotValue ) + { + $container + ->expects( $this->at( $i ) ) + ->method( 'has' ) + ->with( $slotIdentifier ) + ->will( $this->returnValue( $hasReturnValue ) ); + + $i++; + // No calls to 'get' are done if 'has' returns false + if ( $hasReturnValue === false ) + continue; + + $container + ->expects( $this->at( $i ) ) + ->method( 'get' ) + ->with( $slotIdentifier ) + ->will( $this->returnValue( $slotValue ) ); + ++$i; + } + return $factory; + } +} + diff --git a/eZ/Publish/Core/SignalSlot/Tests/SlotFactory/GeneralSlotFactoryTest.php b/eZ/Publish/Core/SignalSlot/Tests/SlotFactory/GeneralSlotFactoryTest.php new file mode 100644 index 0000000..8a3f68c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/Tests/SlotFactory/GeneralSlotFactoryTest.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing a test class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot\Tests\SignalDispatcher; + +use eZ\Publish\Core\SignalSlot; +use eZ\Publish\Core\Base\Exceptions\NotFoundException; + +/** + * @group signalSlot + * @covers \eZ\Publish\Core\SignalSlot\SlotFactory\GeneralSlotFactory + */ +class GeneralSlotFactoryTest extends \PHPUnit_Framework_TestCase +{ + public function providerForFactoryTests() + { + return array( + array( array( "slot1" => true, "slot2" => true ) ), + array( + array( + 'slot1' => $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ), + 'slot2' => $this->getMock( '\\eZ\\Publish\\Core\\SignalSlot\\Slot' ) + ) + ), + ); + } + + /** + * @dataProvider providerForFactoryTests + */ + public function testValidSlot( $slots ) + { + $factory = $this->setUpFactory( $slots ); + foreach ( $slots as $slotIdentifier => $slotValue ) + $this->assertEquals( $slotValue, $factory->getSlot( $slotIdentifier ) ); + } + + /** + * @dataProvider providerForFactoryTests + */ + public function testInValidSlot( $slots ) + { + $factory = $this->setUpFactory( $slots ); + foreach ( array_keys( $slots ) as $slotIdentifier ) + { + try + { + $factory->getSlot( $slotIdentifier . '42' ); + $this->fail( 'expected NotFoundException ' ); + } + catch ( NotFoundException $e ) + { + } + } + } + + private function setUpFactory( $slots ) + { + return new SignalSlot\SlotFactory\GeneralSlotFactory( $slots ); + } +} + diff --git a/eZ/Publish/Core/SignalSlot/TrashService.php b/eZ/Publish/Core/SignalSlot/TrashService.php new file mode 100644 index 0000000..54b625f --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/TrashService.php @@ -0,0 +1,173 @@ +<?php +/** + * TrashService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\TrashService as TrashServiceInterface; +use eZ\Publish\API\Repository\Values\Content\TrashItem; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\API\Repository\Values\Content\Query; +use eZ\Publish\Core\SignalSlot\Signal\TrashService\TrashSignal; +use eZ\Publish\Core\SignalSlot\Signal\TrashService\RecoverSignal; +use eZ\Publish\Core\SignalSlot\Signal\TrashService\EmptyTrashSignal; +use eZ\Publish\Core\SignalSlot\Signal\TrashService\DeleteTrashItemSignal; + +/** + * TrashService class + * @package eZ\Publish\Core\SignalSlot + */ +class TrashService implements TrashServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\TrashService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\TrashService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( TrashServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Loads a trashed location object from its $id. + * + * Note that $id is identical to original location, which has been previously trashed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to read the trashed location + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException - if the location with the given id does not exist + * + * @param int $trashItemId + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function loadTrashItem( $trashItemId ) + { + return $this->service->loadTrashItem( $trashItemId ); + } + + /** + * Sends $location and all its children to trash and returns the corresponding trash item. + * + * Content is left untouched. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to trash the given location + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * + * @return \eZ\Publish\API\Repository\Values\Content\TrashItem + */ + public function trash( Location $location ) + { + $returnValue = $this->service->trash( $location ); + $this->signalDispatcher->emit( + new TrashSignal( + array( + 'locationId' => $location->id, + ) + ) + ); + return $returnValue; + } + + /** + * Recovers the $trashedLocation at its original place if possible. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to recover the trash item at the parent location location + * + * If $newParentLocation is provided, $trashedLocation will be restored under it. + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + * @param \eZ\Publish\API\Repository\Values\Content\Location $newParentLocation + * + * @return \eZ\Publish\API\Repository\Values\Content\Location the newly created or recovered location + */ + public function recover( TrashItem $trashItem, Location $newParentLocation = null ) + { + $returnValue = $this->service->recover( $trashItem, $newParentLocation ); + $this->signalDispatcher->emit( + new RecoverSignal( + array( + 'trashItemId' => $trashItem->id, + 'newParentLocationId' => $newParentLocation !== null ? $newParentLocation->id : null, + ) + ) + ); + return $returnValue; + } + + /** + * Empties trash. + * + * All locations contained in the trash will be removed. Content objects will be removed + * if all locations of the content are gone. + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to empty the trash + */ + public function emptyTrash() + { + $returnValue = $this->service->emptyTrash(); + $this->signalDispatcher->emit( new EmptyTrashSignal( array() ) ); + return $returnValue; + } + + /** + * Deletes a trash item. + * + * The corresponding content object will be removed + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to delete this trash item + * + * @param \eZ\Publish\API\Repository\Values\Content\TrashItem $trashItem + */ + public function deleteTrashItem( TrashItem $trashItem ) + { + $returnValue = $this->service->deleteTrashItem( $trashItem ); + $this->signalDispatcher->emit( + new DeleteTrashItemSignal( + array( + 'trashItemId' => $trashItem->id, + ) + ) + ); + return $returnValue; + } + + /** + * Returns a collection of Trashed locations contained in the trash. + * + * $query allows to filter/sort the elements to be contained in the collection. + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * + * @return \eZ\Publish\API\Repository\Values\Content\SearchResult + */ + public function findTrashItems( Query $query ) + { + return $this->service->findTrashItems( $query ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/URLAliasService.php b/eZ/Publish/Core/SignalSlot/URLAliasService.php new file mode 100644 index 0000000..5339e20 --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/URLAliasService.php @@ -0,0 +1,215 @@ +<?php +/** + * URLAliasService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\URLAliasService as URLAliasServiceInterface; +use eZ\Publish\API\Repository\Values\Content\Location; +use eZ\Publish\Core\SignalSlot\Signal\URLAliasService\CreateUrlAliasSignal; +use eZ\Publish\Core\SignalSlot\Signal\URLAliasService\CreateGlobalUrlAliasSignal; +use eZ\Publish\Core\SignalSlot\Signal\URLAliasService\RemoveAliasesSignal; + +/** + * URLAliasService class + * @package eZ\Publish\Core\SignalSlot + */ +class URLAliasService implements URLAliasServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\URLAliasService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\URLAliasService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( URLAliasServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Create a user chosen $alias pointing to $location in $languageCode. + * + * This method runs URL filters and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * $alwaysAvailable makes the alias available in all languages. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $path + * @param string $languageCode the languageCode for which this alias is valid + * @param boolean $forwarding if true a redirect is performed + * @param boolean $alwaysAvailable + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createUrlAlias( Location $location, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + $returnValue = $this->service->createUrlAlias( $location, $path, $languageCode, $forwarding, $alwaysAvailable ); + $this->signalDispatcher->emit( + new CreateUrlAliasSignal( + array( + 'urlAliasId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * This method runs URL filters and and transformers before storing them. + * Hence the path returned in the URLAlias Value may differ from the given. + * + * $alwaysAvailable makes the alias available in all languages. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the path already exists for the given + * language or if resource is not valid + * + * @param string $resource + * @param string $path + * @param string $languageCode + * @param boolean $forwarding + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function createGlobalUrlAlias( $resource, $path, $languageCode, $forwarding = false, $alwaysAvailable = false ) + { + $returnValue = $this->service->createGlobalUrlAlias( $resource, $path, $languageCode, $forwarding, $alwaysAvailable ); + $this->signalDispatcher->emit( + new CreateGlobalUrlAliasSignal( + array( + 'urlAliasId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * List of url aliases pointing to $location. + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * @param string $languageCode filters those which are valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listLocationAliases( Location $location, $custom = true, $languageCode = null ) + { + return $this->service->listLocationAliases( $location, $custom, $languageCode ); + } + + /** + * List global aliases + * + * @param string $languageCode filters those which are valid for the given language + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias[] + */ + public function listGlobalAliases( $languageCode = null, $offset = 0, $limit = -1 ) + { + return $this->service->listGlobalAliases( $languageCode, $offset, $limit ); + } + + /** + * Removes urls aliases. + * + * This method does not remove autogenerated aliases for locations. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if alias list contains + * autogenerated alias + * + * @param \eZ\Publish\API\Repository\Values\Content\URLAlias[] $aliasList + * + * @return void + */ + public function removeAliases( array $aliasList ) + { + $returnValue = $this->service->removeAliases( $aliasList ); + $this->signalDispatcher->emit( + new RemoveAliasesSignal( + array( + 'aliasList' => $aliasList, + ) + ) + ); + return $returnValue; + } + + /** + * looks up the URLAlias for the given url. + * + * @param string $url + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the path does not exist or is not valid for the given language + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function lookup( $url, $languageCode = null ) + { + return $this->service->lookup( $url, $languageCode ); + } + + /** + * Returns the URL alias for the given location in the given language. + * + * If $languageCode is null the method returns the url alias in the most prioritized language. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if no url alias exist for the given language + * + * @param \eZ\Publish\API\Repository\Values\Content\Location $location + * @param string $languageCode + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function reverseLookup( Location $location, $languageCode = null ) + { + return $this->service->reverseLookup( $location, $languageCode ); + } + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\API\Repository\Values\Content\URLAlias + */ + public function load( $id ) + { + return $this->service->load( $id ); + } +} diff --git a/eZ/Publish/Core/SignalSlot/URLWildcardService.php b/eZ/Publish/Core/SignalSlot/URLWildcardService.php new file mode 100644 index 0000000..4c168ef --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/URLWildcardService.php @@ -0,0 +1,153 @@ +<?php +/** + * URLWildcardService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\URLWildcardService as URLWildcardServiceInterface; +use eZ\Publish\API\Repository\Values\Content\URLWildcard; +use eZ\Publish\Core\SignalSlot\Signal\URLWildcardService\CreateSignal; +use eZ\Publish\Core\SignalSlot\Signal\URLWildcardService\RemoveSignal; +use eZ\Publish\Core\SignalSlot\Signal\URLWildcardService\TranslateSignal; + +/** + * URLWildcardService class + * @package eZ\Publish\Core\SignalSlot + */ +class URLWildcardService implements URLWildcardServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\URLWildcardService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\URLWildcardService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( URLWildcardServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Creates a new url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the $sourceUrl pattern already exists + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to create url wildcards + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if the number of "*" patterns in $sourceUrl and + * the number of {\d} placeholders in $destinationUrl doesn't match or + * if the placeholders aren't a valid number sequence({1}/{2}/{3}), starting with 1. + * + * @param string $sourceUrl + * @param string $destinationUrl + * @param boolean $forward + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard + */ + public function create( $sourceUrl, $destinationUrl, $forward = false ) + { + $returnValue = $this->service->create( $sourceUrl, $destinationUrl, $forward ); + $this->signalDispatcher->emit( + new CreateSignal( + array( + 'urlWildcardId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * removes an url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the user is not allowed to remove url wildcards + * + * @param \eZ\Publish\API\Repository\Values\Content\URLWildcard $urlWildcard the url wildcard to remove + */ + public function remove( URLWildcard $urlWildcard ) + { + $returnValue = $this->service->remove( $urlWildcard ); + $this->signalDispatcher->emit( + new RemoveSignal( + array( + 'urlWildcardId' => $urlWildcard->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a url wild card + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard + */ + public function load( $id ) + { + return $this->service->load( $id ); + } + + /** + * Loads all url wild card (paged) + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\Content\UrlWildcard[] + */ + public function loadAll( $offset = 0, $limit = -1 ) + { + return $this->service->loadAll( $offset, $limit ); + } + + /** + * translates an url to an existing uri resource based on the + * source/destination patterns of the url wildcard. If the resulting + * url is an alias it will be translated to the system uri. + * + * This method runs also configured url translations and filter + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url could not be translated + * + * @param mixed $url + * + * @return \eZ\Publish\API\Repository\Values\Content\URLWildcardTranslationResult + */ + public function translate( $url ) + { + $returnValue = $this->service->translate( $url ); + $this->signalDispatcher->emit( + new TranslateSignal( + array( + 'url' => $url, + ) + ) + ); + return $returnValue; + } +} diff --git a/eZ/Publish/Core/SignalSlot/UserService.php b/eZ/Publish/Core/SignalSlot/UserService.php new file mode 100644 index 0000000..7cec57c --- /dev/null +++ b/eZ/Publish/Core/SignalSlot/UserService.php @@ -0,0 +1,426 @@ +<?php +/** + * UserService class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\Core\SignalSlot; + +use eZ\Publish\API\Repository\UserService as UserServiceInterface; +use eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct; +use eZ\Publish\API\Repository\Values\User\UserCreateStruct; +use eZ\Publish\API\Repository\Values\User\UserGroup; + +/** + * UserService class + * @package eZ\Publish\Core\SignalSlot + */ +class UserService implements UserServiceInterface +{ + /** + * Aggregated service + * + * @var \eZ\Publish\API\Repository\UserService + */ + protected $service; + + /** + * SignalDispatcher + * + * @var \eZ\Publish\Core\SignalSlot\SignalDispatcher + */ + protected $signalDispatcher; + + /** + * Constructor + * + * Construct service object from aggregated service and signal + * dispatcher + * + * @param \eZ\Publish\API\Repository\UserService $service + * @param \eZ\Publish\Core\SignalSlot\SignalDispatcher $signalDispatcher + */ + public function __construct( UserServiceInterface $service, SignalDispatcher $signalDispatcher ) + { + $this->service = $service; + $this->signalDispatcher = $signalDispatcher; + } + + /** + * Creates a new user group using the data provided in the ContentCreateStruct parameter + * + * In 4.x in the content type parameter in the profile is ignored + * - the content type is determined via configuration and can be set to null. + * The returned version is published. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct $userGroupCreateStruct a structure for setting all necessary data to create this user group + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $parentGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the input structure has invalid data + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or set to an empty value + */ + public function createUserGroup( UserGroupCreateStruct $userGroupCreateStruct, UserGroup $parentGroup ) + { + $returnValue = $this->service->createUserGroup( $userGroupCreateStruct, $parentGroup ); + $this->signalDispatcher->emit( + new Signal\UserService\CreateUserGroupSignal( + array( + 'userGroupId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a user group for the given id + * + * @param int $id + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the user group with the given id was not found + */ + public function loadUserGroup( $id ) + { + return $this->service->loadUserGroup( $id ); + } + + /** + * Loads the sub groups of a user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the user group + */ + public function loadSubUserGroups( UserGroup $userGroup ) + { + return $this->service->loadSubUserGroups( $userGroup ); + } + + /** + * Removes a user group + * + * the users which are not assigned to other groups will be deleted. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to create a user group + */ + public function deleteUserGroup( UserGroup $userGroup ) + { + $returnValue = $this->service->deleteUserGroup( $userGroup ); + $this->signalDispatcher->emit( + new Signal\UserService\DeleteUserGroupSignal( + array( + 'userGroupId' => $userGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Moves the user group to another parent + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $newParent + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + */ + public function moveUserGroup( UserGroup $userGroup, UserGroup $newParent ) + { + $returnValue = $this->service->moveUserGroup( $userGroup, $newParent ); + $this->signalDispatcher->emit( + new Signal\UserService\MoveUserGroupSignal( + array( + 'userGroupId' => $userGroup->id, + 'newParentId' => $newParent->id, + ) + ) + ); + return $returnValue; + } + + /** + * Updates the group profile with fields and meta data + * + * 4.x: If the versionUpdateStruct is set in $userGroupUpdateStruct, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explicitly required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct $userGroupUpdateStruct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userGroupUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a field value is not accepted by the field type + */ + public function updateUserGroup( UserGroup $userGroup, UserGroupUpdateStruct $userGroupUpdateStruct ) + { + $returnValue = $this->service->updateUserGroup( $userGroup, $userGroupUpdateStruct ); + $this->signalDispatcher->emit( + new Signal\UserService\UpdateUserGroupSignal( + array( + 'userGroupId' => $userGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Create a new user. The created user is published by this method + * + * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user + * @param array $parentGroups the groups of type {@link \eZ\Publish\API\Repository\Values\User\UserGroup} which are assigned to the user after creation + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or set to an empty value + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a field value is not accepted by the field type + * if a user with provided login already exists + */ + public function createUser( UserCreateStruct $userCreateStruct, array $parentGroups ) + { + $returnValue = $this->service->createUser( $userCreateStruct, $parentGroups ); + $this->signalDispatcher->emit( + new Signal\UserService\CreateUserSignal( + array( + 'userId' => $returnValue->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads a user + * + * @param int $userId + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given id was not found + */ + public function loadUser( $userId ) + { + return $this->service->loadUser( $userId ); + } + + /** + * Loads anonymous user + * + * @uses loadUser() + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function loadAnonymousUser() + { + return $this->service->loadAnonymousUser(); + } + + /** + * Loads a user for the given login and password + * + * @param string $login + * @param string $password the plain password + * + * @return \eZ\Publish\API\Repository\Values\User\User + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user with the given credentials was not found + */ + public function loadUserByCredentials( $login, $password ) + { + return $this->service->loadUserByCredentials( $login, $password ); + } + + /** + * This method deletes a user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to delete the user + */ + public function deleteUser( \eZ\Publish\API\Repository\Values\User\User $user ) + { + $returnValue = $this->service->deleteUser( $user ); + $this->signalDispatcher->emit( + new Signal\UserService\DeleteUserSignal( + array( + 'userId' => $user->id, + ) + ) + ); + return $returnValue; + } + + /** + * Updates a user + * + * 4.x: If the versionUpdateStruct is set in the user update structure, this method internally creates a content draft, updates ts with the provided data + * and publishes the draft. If a draft is explicitly required, the user group can be updated via the content service methods. + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserUpdateStruct $userUpdateStruct + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to update the user + * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userUpdateStruct is not valid + * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is set empty + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a field value is not accepted by the field type + * + * @return \eZ\Publish\API\Repository\Values\User\User + */ + public function updateUser( \eZ\Publish\API\Repository\Values\User\User $user, \eZ\Publish\API\Repository\Values\User\UserUpdateStruct $userUpdateStruct ) + { + $returnValue = $this->service->updateUser( $user, $userUpdateStruct ); + $this->signalDispatcher->emit( + new Signal\UserService\UpdateUserSignal( + array( + 'userId' => $user->id, + ) + ) + ); + return $returnValue; + } + + /** + * Assigns a new user group to the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to assign the user group to the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is already in the given user group + */ + public function assignUserToUserGroup( \eZ\Publish\API\Repository\Values\User\User $user, UserGroup $userGroup ) + { + $returnValue = $this->service->assignUserToUserGroup( $user, $userGroup ); + $this->signalDispatcher->emit( + new Signal\UserService\AssignUserToUserGroupSignal( + array( + 'userId' => $user->id, + 'userGroupId' => $userGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Removes a user group from the user + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to remove the user group from the user + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the user is not in the given user group + */ + public function unAssignUserFromUserGroup( \eZ\Publish\API\Repository\Values\User\User $user, UserGroup $userGroup ) + { + $returnValue = $this->service->unAssignUserFromUserGroup( $user, $userGroup ); + $this->signalDispatcher->emit( + new Signal\UserService\UnAssignUserFromUserGroupSignal( + array( + 'userId' => $user->id, + 'userGroupId' => $userGroup->id, + ) + ) + ); + return $returnValue; + } + + /** + * Loads the user groups the user belongs to + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed read the user or user group + * + * @param \eZ\Publish\API\Repository\Values\User\User $user + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroup[] + */ + public function loadUserGroupsOfUser( \eZ\Publish\API\Repository\Values\User\User $user ) + { + return $this->service->loadUserGroupsOfUser( $user ); + } + + /** + * Loads the users of a user group + * + * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to read the users or user group + * + * @param \eZ\Publish\API\Repository\Values\User\UserGroup $userGroup + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\API\Repository\Values\User\User[] + */ + public function loadUsersOfUserGroup( UserGroup $userGroup, $offset = 0, $limit = -1 ) + { + return $this->service->loadUsersOfUserGroup( $userGroup, $offset, $limit ); + } + + /** + * Instantiate a user create class + * + * @param string $login the login of the new user + * @param string $email the email of the new user + * @param string $password the plain password of the new user + * @param string $mainLanguageCode the main language for the underlying content object + * @param \eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserCreateStruct + */ + public function newUserCreateStruct( $login, $email, $password, $mainLanguageCode, $contentType = null ) + { + return $this->service->newUserCreateStruct( $login, $email, $password, $mainLanguageCode, $contentType ); + } + + /** + * Instantiate a user group create class + * + * @param string $mainLanguageCode The main language for the underlying content object + * @param null|\eZ\Publish\API\Repository\Values\ContentType\ContentType $contentType 5.x the content type for the underlying content object. In 4.x it is ignored and taken from the configuration + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupCreateStruct + */ + public function newUserGroupCreateStruct( $mainLanguageCode, $contentType = null ) + { + return $this->service->newUserGroupCreateStruct( $mainLanguageCode, $contentType ); + } + + /** + * Instantiate a new user update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserUpdateStruct + */ + public function newUserUpdateStruct() + { + return $this->service->newUserUpdateStruct(); + } + + /** + * Instantiate a new user group update struct + * + * @return \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct + */ + public function newUserGroupUpdateStruct() + { + return $this->service->newUserGroupUpdateStruct(); + } +} diff --git a/eZ/Publish/Core/settings/service.ini b/eZ/Publish/Core/settings/service.ini new file mode 100644 index 0000000..0b1d9ca --- /dev/null +++ b/eZ/Publish/Core/settings/service.ini @@ -0,0 +1,1497 @@ +### Service(s) settings + + + +## Parameters, settings that services can reuse by referencing them using $ +# Eg: +# [parameters] +# storage_path=var/ezwebin_site/storage/ +# +# [ezimage:field_type] +# class=eZ\Publish\Core\FieldType\Image\Type +# arguments[repository]=@repository +# arguments[storage_path]=$storage_path +# +[parameters] +#legacy_dsn=<driver>://<username>:<password>@<host>:<port>/<database> +legacy_dsn=sqlite://:memory: +# Storoage directory for image field type +image_storage_dir= +image_identifier_prefix=var/my_site/storage/images +# Storage directory for binary and media files +binaryfile_storage_dir=var/files +binaryfile_identifier_prefix= + +## Service settings + +#### Core\Repository Services #### + +[repository] +alias=signalslot_repository + +[signalslot_repository] +class=eZ\Publish\Core\SignalSlot\Repository +arguments[repository]=@inner_repository +arguments[signalDispatcher]=@signal_dispatcher + +[inner_repository] +class=eZ\Publish\Core\Repository\Repository +arguments[persistence_handler]=@persistence_handler +arguments[io_handler]=@io_handler +arguments[service_settings][fieldType]=%:field_type +arguments[service_settings][role][limitationTypes]=@:limitation_type + +#### Signal-Slot #### + +[signal_dispatcher] +class=eZ\Publish\Core\SignalSlot\SignalDispatcher\DefaultSignalDispatcher +arguments[factory]=@slot_factory +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\SectionService\AssignSectionSignal][]=assign_section:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\ContentService\CopyContentSignal][]=copy_content:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\CreateLocationSignal][]=create_location:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteContentSignal][]=delete_content:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\DeleteLocationSignal][]=delete_location:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\ContentService\DeleteVersionSignal][]=delete_version:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\HideLocationSignal][]=hide_location:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\MoveSubtreeSignal][]=move_subtree:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\ContentService\PublishVersionSignal][]=publish_version:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\ObjectStateService\SetContentStateSignal][]=set_content_state:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\SwapLocationSignal][]=swap_location:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\UnhideLocationSignal][]=unhide_location:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\LocationService\UpdateLocationSignal][]=update_location:legacy +arguments[mapping][eZ\Publish\Core\SignalSlot\Signal\ContentTypeService\PublishContentTypeDraftSignal][]=publish_content_type_draft:legacy + + +[slot_factory] +class=eZ\Publish\Core\SignalSlot\SlotFactory\GeneralSlotFactory +arguments[slots]=@:slot + + +[slot] +#arguments[] + +[legacy:slot] +arguments[legacyKernel]=@legacyKernel + +[assign_section:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyAssignSectionSlot + +[copy_content:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyCopyContentSlot + +[create_location:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyCreateLocationSlot + +[delete_content:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyDeleteContentSlot + +[delete_location:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyDeleteLocationSlot + +[delete_version:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyDeleteVersionSlot + +[hide_location:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyHideLocationSlot + +[move_subtree:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyMoveSubtreeSlot + +[publish_version:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyPublishVersionSlot + +[set_content_state:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacySetContentStateSlot + +[swap_location:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacySwapLocationSlot + +[unhide_location:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyUnhideLocationSlot + +[update_location:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyUpdateLocationSlot + +[publish_content_type_draft:legacy:slot] +class=eZ\Publish\Core\SignalSlot\Slot\LegacyPublishContentTypeDraftSlot + +#### Core\Io Services #### + +[io_handler] +alias=io_handler_inmemory + +# InMemory IO handler, used for unit testing +[io_handler_inmemory] +# Interface: eZ\Publish\SPI\IO\Handler +class=eZ\Publish\Core\IO\InMemoryHandler + +## Example for setting up Dispatcher Io Handler (Binary Storage Engine): +## 'Dispatcher' makes it possible to use different handlers based on matching rules +#[io_handler_dispatcher] +#class=eZ\Publish\Core\IO\DispatcherHandler +#arguments[default]=@io_handler_legacy +#arguments[config][amazonS3][handler]=@io_handler_amazonS3 +#arguments[config][amazonS3][suffix]=.gif,.jpg +#arguments[config][amazonS3][prefix]=var/original/ +#arguments[config][amazonS3][contains]=image-versioned + +# Legacy IO handler, uses eZ Publish 4.x clustering +[io_handler_legacy] +# Interface: eZ\Publish\SPI\IO\Handler +class=eZ\Publish\Core\IO\LegacyHandler +arguments[legacyKernel]=@legacyKernel + +#[io_handler_amazonS3] +#class=<s3-class-implementing:eZ\Publish\SPI\IO\Handler> +#arguments[config][user]=<user> +#arguments[config][password]=<password> +#arguments[config][host]=<host> + + +#### Core\Persistence Services #### + +[persistence_handler] +alias=persistence_handler_inmemory + +# InMemory persistence handler, used for unit tests +[persistence_handler_inmemory] +# Interface: eZ\Publish\SPI\Persistence\Handler +class=eZ\Publish\Core\Persistence\InMemory\Handler + +# Legacy persistence handler, used for real eZ Publish 4.x databases +[persistence_handler_legacy] +# Interface: eZ\Publish\SPI\Persistence\Handler +class=eZ\Publish\Core\Persistence\Legacy\Handler +arguments[db_handler]=@legacy_db_handler +arguments[converter_registry]=@legacy_converter_registry +arguments[storage_registry]=@legacy_storage_registry +arguments[transformation_processor]=@legacy_transformation_processor +arguments[config][defer_type_update]=false + +[legacy_db_handler] +class=eZ\Publish\Core\Persistence\Legacy\EzcDbHandler +factory=create +arguments[dsn]=$legacy_dsn + +[legacy_converter_registry] +class=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry +arguments[map][ezauthor]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Author::create +arguments[map][ezbinaryfile]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\BinaryFile::create +arguments[map][ezboolean]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Checkbox::create +arguments[map][ezcountry]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Country::create +arguments[map][ezdatetime]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\DateAndTime::create +arguments[map][ezemail]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\EmailAddress::create +arguments[map][ezfloat]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Float::create +arguments[map][ezimage]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Image::create +arguments[map][ezinteger]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create +arguments[map][ezkeyword]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Keyword::create +arguments[map][ezmedia]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Media::create +arguments[map][ezobjectrelation]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Relation::create +arguments[map][ezobjectrelationlist]=@ezobjectrelationlist_legacy_converter +arguments[map][ezpage]=@ezpage_legacy_converter +arguments[map][ezsrrating]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Rating::create +arguments[map][ezselection]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Selection::create +arguments[map][eztext]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextBlock::create +arguments[map][ezstring]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\TextLine::create +arguments[map][ezurl]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Url::create +arguments[map][ezuser]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Null::create +arguments[map][ezxmltext]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\XmlText::create +arguments[map][ezgmaplocation]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\MapLocation::create + +# Temporarily required to get search tests running +arguments[map][ezinisetting]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create +arguments[map][ezpackage]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create +arguments[map][ezprice]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create +arguments[map][ezmultioption]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create +arguments[map][ezsubtreesubscription]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create +arguments[map][ezoption]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Integer::create + +# New data fixture +arguments[map][ezcomcomments]=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Null::create + + +[ezobjectrelationlist_legacy_converter] +class=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\RelationList +arguments[db]=@legacy_db_handler + +[ezpage_legacy_converter] +class=eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\Page +arguments[pageService]=@page_service + +[legacy_storage_registry] +class=eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry +arguments[map]=%:field_storage + + +[field_storage] +arguments[gateways][] + +# START: ezbinaryfile +[ezbinaryfile:field_storage] +class=eZ\Publish\Core\FieldType\BinaryFile\BinaryFileStorage +arguments[gateways][LegacyStorage]=@ezbinaryfile:field_storage_legacy_gateway +arguments[fileService]=@ezbinaryfile:file_service +arguments[pathGenerator]=@ezbinaryfile:path_generator + +[ezbinaryfile:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\BinaryFile\BinaryFileStorage\Gateway\LegacyStorage + +[ezbinaryfile:file_service] +class=eZ\Publish\Core\FieldType\FileService\LocalFileService +arguments[installDir]=$install_dir +arguments[storageDir]=$binaryfile_storage_dir +arguments[identifierPrefix]=$binaryfile_identifier_prefix + +[ezbinaryfile:path_generator] +class=eZ\Publish\Core\FieldType\BinaryBase\PathGenerator\LegacyPathGenerator +# END ezbinaryfile + +# START: ezmedia + +# Media partly re-uses stuff from binary! +[ezmedia:field_storage] +class=eZ\Publish\Core\FieldType\Media\MediaStorage +arguments[gateways][LegacyStorage]=@ezmedia:field_storage_legacy_gateway +arguments[fileService]=@ezbinaryfile:file_service +arguments[pathGenerator]=@ezbinaryfile:path_generator + +[ezmedia:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\Media\MediaStorage\Gateway\LegacyStorage + +# END: ezmedia + +[ezkeyword:field_storage] +class=eZ\Publish\Core\FieldType\Keyword\KeywordStorage +arguments[gateways][LegacyStorage]=@ezkeyword:field_storage_legacy_gateway + +[ezkeyword:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\Keyword\KeywordStorage\Gateway\LegacyStorage + +[ezgmaplocation:field_storage] +class=eZ\Publish\Core\FieldType\MapLocation\MapLocationStorage +arguments[gateways][LegacyStorage]=@ezgmaplocation:field_storage_legacy_gateway + +[ezgmaplocation:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\MapLocation\MapLocationStorage\Gateway\LegacyStorage + +[ezurl:field_storage] +class=eZ\Publish\Core\FieldType\Url\UrlStorage +arguments[gateways][LegacyStorage]=@ezurl:field_storage_legacy_gateway + +[ezurl:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\Url\UrlStorage\Gateway\LegacyStorage + +[ezobjectrelation:field_storage] +class=eZ\Publish\Core\FieldType\Relation\RelationStorage +arguments[gateways][LegacyStorage]=@ezobjectrelation:field_storage_legacy_gateway + +[ezobjectrelation:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\Relation\RelationStorage\Gateway\LegacyStorage + +[ezobjectrelationlist:field_storage] +# Reuses RelationStorage class, difference is LegacyStorage gateway +class=eZ\Publish\Core\FieldType\Relation\RelationStorage +arguments[gateways][LegacyStorage]=@ezobjectrelationlist:field_storage_legacy_gateway + +[ezobjectrelationlist:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\RelationList\RelationListStorage\Gateway\LegacyStorage + +[ezuser:field_storage] +class=eZ\Publish\Core\FieldType\User\UserStorage +arguments[gateways][LegacyStorage]=@ezuser:field_storage_legacy_gateway + +[ezuser:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\User\UserStorage\Gateway\LegacyStorage + +[ezimage:field_storage] +class=eZ\Publish\Core\FieldType\Image\ImageStorage +arguments[gateways][LegacyStorage]=@ezimage:field_storage_legacy_gateway +arguments[fileService]=@ezimage:file_service +arguments[pathGenerator]=@ezimage:path_generator + +[ezimage:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\Image\ImageStorage\Gateway\LegacyStorage + +[ezimage:file_service] +class=eZ\Publish\Core\FieldType\FileService\LocalFileService +arguments[installDir]=$install_dir +arguments[storageDir]=$image_storage_dir +arguments[identifierPrefix]=$image_identifier_prefix + +[ezimage:path_generator] +class=eZ\Publish\Core\FieldType\Image\PathGenerator\LegacyPathGenerator + +[ezxmltext:field_storage] +class=eZ\Publish\Core\FieldType\XmlText\XmlTextStorage +arguments[gateways][LegacyStorage]=@ezxmltext:field_storage_legacy_gateway + +[ezxmltext:field_storage_legacy_gateway] +class=eZ\Publish\Core\FieldType\XmlText\XmlTextStorage\Gateway\LegacyStorage + +[legacy_transformation_processor] +class=eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\DefinitionBased +arguments[parser]=@legacy_transformation_parser +arguments[compiler]=@legacy_transformation_pcre_compiler +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/ascii.tr +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/basic.tr +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/cyrillic.tr +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/greek.tr +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/hebrew.tr +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/latin.tr +arguments[rules][]=eZ/Publish/Core/Persistence/Legacy/Tests/Content/SearchHandler/_fixtures/transformations/search.tr + +[legacy_transformation_parser] +class=eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\DefinitionBased\Parser +arguments[installDir]=$install_dir + +[legacy_transformation_pcre_compiler] +class=eZ\Publish\Core\Persistence\Legacy\Content\Search\TransformationProcessor\PcreCompiler +arguments[converter]=@legacy_transformation_converter + +[legacy_transformation_converter] +class=eZ\Publish\Core\Persistence\Legacy\Content\Search\Utf8Converter + + +#### Core\Limitation classes #### + +[limitation_type] +arguments[] + +[Class:limitation_type] +class=eZ\Publish\Core\Limitation\ContentTypeLimitationType + +[Language:limitation_type] +class=eZ\Publish\Core\Limitation\LanguageLimitationType + +[Node:limitation_type] +class=eZ\Publish\Core\Limitation\LocationLimitationType +arguments[persistence_handler]=@persistence_handler + +[Owner:limitation_type] +class=eZ\Publish\Core\Limitation\OwnerLimitationType + +[ParentClass:limitation_type] +class=eZ\Publish\Core\Limitation\ParentContentTypeLimitationType +arguments[persistence_handler]=@persistence_handler + +[ParentDepth:limitation_type] +class=eZ\Publish\Core\Limitation\ParentDepthLimitationType +arguments[persistence_handler]=@persistence_handler + +[ParentOwner:limitation_type] +class=eZ\Publish\Core\Limitation\ParentOwnerLimitationType +arguments[persistence_handler]=@persistence_handler + +[ParentGroup:limitation_type] +class=eZ\Publish\Core\Limitation\ParentUserGroupLimitationType +arguments[persistence_handler]=@persistence_handler + +[Section:limitation_type] +class=eZ\Publish\Core\Limitation\SectionLimitationType + +[NewSection:limitation_type] +class=eZ\Publish\Core\Limitation\NewSectionLimitationType + +[SiteAccess:limitation_type] +class=eZ\Publish\Core\Limitation\SiteAccessLimitationType + +[State:limitation_type] +class=eZ\Publish\Core\Limitation\ObjectStateLimitationType +arguments[persistence_handler]=@persistence_handler + +[Subtree:limitation_type] +class=eZ\Publish\Core\Limitation\SubtreeLimitationType +arguments[persistence_handler]=@persistence_handler + +[Group:limitation_type] +class=eZ\Publish\Core\Limitation\UserGroupLimitationType +arguments[persistence_handler]=@persistence_handler + + + +#### Core\FieldType classes #### + +[field_type] +shared=false + +# START dummy types for data fixture +# Needs correct implementation +[ezcomcomments:field_type] +class=eZ\Publish\Core\FieldType\Null\Type +arguments[fieldTypeIdentifier]=ezcomcomments + +[ezpackage:field_type] +class=eZ\Publish\Core\FieldType\Null\Type +arguments[fieldTypeIdentifier]=ezpackage + +[ezinisetting:field_type] +class=eZ\Publish\Core\FieldType\Null\Type +arguments[fieldTypeIdentifier]=ezinisetting + + +# END dummy types for data fixture + + +[ezauthor:field_type] +class=eZ\Publish\Core\FieldType\Author\Type + +[ezbinaryfile:field_type] +class=eZ\Publish\Core\FieldType\BinaryFile\Type +arguments[fileService]=@ezbinaryfile:file_service +arguments[mimeTypeDetector]=@ezbinaryfile:mime_type_detector + +[ezbinaryfile:mime_type_detector] +class=eZ\Publish\Core\FieldType\BinaryBase\MimeTypeDetector\FileInfoDetector + +[ezboolean:field_type] +class=eZ\Publish\Core\FieldType\Checkbox\Type + +[ezdatetime:field_type] +class=eZ\Publish\Core\FieldType\DateAndTime\Type + +[ezemail:field_type] +class=eZ\Publish\Core\FieldType\EmailAddress\Type + +[ezfloat:field_type] +class=eZ\Publish\Core\FieldType\Float\Type + +[ezimage:field_type] +class=eZ\Publish\Core\FieldType\Image\Type +arguments[fileService]=@ezimage:file_service + +[ezpage:field_type] +class=eZ\Publish\Core\FieldType\Page\Type +arguments[pageService]=@page_service + +[page_service] +class=eZ\Publish\Core\FieldType\Page\Service + + +[ezgmaplocation:field_type] +class=eZ\Publish\Core\FieldType\MapLocation\Type + +[ezinteger:field_type] +class=eZ\Publish\Core\FieldType\Integer\Type + +[ezkeyword:field_type] +class=eZ\Publish\Core\FieldType\Keyword\Type + +# Re-using ezbinaryfile objects +[ezmedia:field_type] +class=eZ\Publish\Core\FieldType\Media\Type +arguments[fileService]=@ezbinaryfile:file_service +arguments[mimeTypeDetector]=@ezbinaryfile:mime_type_detector + +[ezobjectrelation:field_type] +class=eZ\Publish\Core\FieldType\Relation\Type + +[ezobjectrelationlist:field_type] +class=eZ\Publish\Core\FieldType\RelationList\Type + +[ezsrrating:field_type] +class=eZ\Publish\Core\FieldType\Rating\Type + +[ezselection:field_type] +class=eZ\Publish\Core\FieldType\Selection\Type + +[eztext:field_type] +class=eZ\Publish\Core\FieldType\TextBlock\Type + +[ezstring:field_type] +class=eZ\Publish\Core\FieldType\TextLine\Type + +[ezurl:field_type] +class=eZ\Publish\Core\FieldType\Url\Type + +[ezuser:field_type] +class=eZ\Publish\Core\FieldType\User\Type + +[ezxmltext:field_type] +class=eZ\Publish\Core\FieldType\XmlText\Type + +[ezcountry:field_type] +class=eZ\Publish\Core\FieldType\Country\Type +arguments[countries_data][AF][Name]=Afghanistan +arguments[countries_data][AF][Alpha2]=AF +arguments[countries_data][AF][Alpha3]=AFG +arguments[countries_data][AF][IDC]=93 +arguments[countries_data][AX][Name]=Åland +arguments[countries_data][AX][Alpha2]=AX +arguments[countries_data][AX][Alpha3]=ALA +arguments[countries_data][AX][IDC]=358 +arguments[countries_data][AL][Name]=Albania +arguments[countries_data][AL][Alpha2]=AL +arguments[countries_data][AL][Alpha3]=ALB +arguments[countries_data][AL][IDC]=355 +arguments[countries_data][DZ][Name]=Algeria +arguments[countries_data][DZ][Alpha2]=DZ +arguments[countries_data][DZ][Alpha3]=DZA +arguments[countries_data][DZ][IDC]=213 +arguments[countries_data][AS][Name]=American Samoa +arguments[countries_data][AS][Alpha2]=AS +arguments[countries_data][AS][Alpha3]=ASM +arguments[countries_data][AS][IDC]=1684 +arguments[countries_data][AD][Name]=Andorra +arguments[countries_data][AD][Alpha2]=AD +arguments[countries_data][AD][Alpha3]=AND +arguments[countries_data][AD][IDC]=376 +arguments[countries_data][AO][Name]=Angola +arguments[countries_data][AO][Alpha2]=AO +arguments[countries_data][AO][Alpha3]=AGO +arguments[countries_data][AO][IDC]=244 +arguments[countries_data][AI][Name]=Anguilla +arguments[countries_data][AI][Alpha2]=AI +arguments[countries_data][AI][Alpha3]=AIA +arguments[countries_data][AI][IDC]=1264 +arguments[countries_data][AQ][Name]=Antarctica +arguments[countries_data][AQ][Alpha2]=AQ +arguments[countries_data][AQ][Alpha3]=ATA +arguments[countries_data][AQ][IDC]=672 +arguments[countries_data][AG][Name]=Antigua and Barbuda +arguments[countries_data][AG][Alpha2]=AG +arguments[countries_data][AG][Alpha3]=ATG +arguments[countries_data][AG][IDC]=1268 +arguments[countries_data][AR][Name]=Argentina +arguments[countries_data][AR][Alpha2]=AR +arguments[countries_data][AR][Alpha3]=ARG +arguments[countries_data][AR][IDC]=54 +arguments[countries_data][AM][Name]=Armenia +arguments[countries_data][AM][Alpha2]=AM +arguments[countries_data][AM][Alpha3]=ARM +arguments[countries_data][AM][IDC]=374 +arguments[countries_data][AW][Name]=Aruba +arguments[countries_data][AW][Alpha2]=AW +arguments[countries_data][AW][Alpha3]=ABW +arguments[countries_data][AW][IDC]=297 +arguments[countries_data][AU][Name]=Australia +arguments[countries_data][AU][Alpha2]=AU +arguments[countries_data][AU][Alpha3]=AUS +arguments[countries_data][AU][IDC]=61 +arguments[countries_data][AT][Name]=Austria +arguments[countries_data][AT][Alpha2]=AT +arguments[countries_data][AT][Alpha3]=AUT +arguments[countries_data][AT][IDC]=43 +arguments[countries_data][AZ][Name]=Azerbaijan +arguments[countries_data][AZ][Alpha2]=AZ +arguments[countries_data][AZ][Alpha3]=AZE +arguments[countries_data][AZ][IDC]=994 +arguments[countries_data][BS][Name]=Bahamas +arguments[countries_data][BS][Alpha2]=BS +arguments[countries_data][BS][Alpha3]=BHS +arguments[countries_data][BS][IDC]=1242 +arguments[countries_data][BH][Name]=Bahrain +arguments[countries_data][BH][Alpha2]=BH +arguments[countries_data][BH][Alpha3]=BHR +arguments[countries_data][BH][IDC]=973 +arguments[countries_data][BD][Name]=Bangladesh +arguments[countries_data][BD][Alpha2]=BD +arguments[countries_data][BD][Alpha3]=BGD +arguments[countries_data][BD][IDC]=880 +arguments[countries_data][BB][Name]=Barbados +arguments[countries_data][BB][Alpha2]=BB +arguments[countries_data][BB][Alpha3]=BRB +arguments[countries_data][BB][IDC]=1246 +arguments[countries_data][BY][Name]=Belarus +arguments[countries_data][BY][Alpha2]=BY +arguments[countries_data][BY][Alpha3]=BLR +arguments[countries_data][BY][IDC]=375 +arguments[countries_data][BE][Name]=Belgium +arguments[countries_data][BE][Alpha2]=BE +arguments[countries_data][BE][Alpha3]=BEL +arguments[countries_data][BE][IDC]=32 +arguments[countries_data][BZ][Name]=Belize +arguments[countries_data][BZ][Alpha2]=BZ +arguments[countries_data][BZ][Alpha3]=BLZ +arguments[countries_data][BZ][IDC]=501 +arguments[countries_data][BJ][Name]=Benin +arguments[countries_data][BJ][Alpha2]=BJ +arguments[countries_data][BJ][Alpha3]=BEN +arguments[countries_data][BJ][IDC]=229 +arguments[countries_data][BM][Name]=Bermuda +arguments[countries_data][BM][Alpha2]=BM +arguments[countries_data][BM][Alpha3]=BMU +arguments[countries_data][BM][IDC]=1441 +arguments[countries_data][BT][Name]=Bhutan +arguments[countries_data][BT][Alpha2]=BT +arguments[countries_data][BT][Alpha3]=BTN +arguments[countries_data][BT][IDC]=975 +arguments[countries_data][BO][Name]=Bolivia +arguments[countries_data][BO][Alpha2]=BO +arguments[countries_data][BO][Alpha3]=BOL +arguments[countries_data][BO][IDC]=591 +arguments[countries_data][BA][Name]=Bosnia and Herzegovina +arguments[countries_data][BA][Alpha2]=BA +arguments[countries_data][BA][Alpha3]=BIH +arguments[countries_data][BA][IDC]=387 +arguments[countries_data][BW][Name]=Botswana +arguments[countries_data][BW][Alpha2]=BW +arguments[countries_data][BW][Alpha3]=BWA +arguments[countries_data][BW][IDC]=267 +arguments[countries_data][BV][Name]=Bouvet Island +arguments[countries_data][BV][Alpha2]=BV +arguments[countries_data][BV][Alpha3]=BVT +arguments[countries_data][BV][IDC]=47 +arguments[countries_data][BR][Name]=Brazil +arguments[countries_data][BR][Alpha2]=BR +arguments[countries_data][BR][Alpha3]=BRA +arguments[countries_data][BR][IDC]=55 +arguments[countries_data][IO][Name]=British Indian Ocean Territory +arguments[countries_data][IO][Alpha2]=IO +arguments[countries_data][IO][Alpha3]=IOT +arguments[countries_data][IO][IDC]=246 +arguments[countries_data][BN][Name]=Brunei Darussalam +arguments[countries_data][BN][Alpha2]=BN +arguments[countries_data][BN][Alpha3]=BRN +arguments[countries_data][BN][IDC]=673 +arguments[countries_data][BG][Name]=Bulgaria +arguments[countries_data][BG][Alpha2]=BG +arguments[countries_data][BG][Alpha3]=BGR +arguments[countries_data][BG][IDC]=359 +arguments[countries_data][BF][Name]=Burkina Faso +arguments[countries_data][BF][Alpha2]=BF +arguments[countries_data][BF][Alpha3]=BFA +arguments[countries_data][BF][IDC]=226 +arguments[countries_data][BI][Name]=Burundi +arguments[countries_data][BI][Alpha2]=BI +arguments[countries_data][BI][Alpha3]=BDI +arguments[countries_data][BI][IDC]=257 +arguments[countries_data][KH][Name]=Cambodia +arguments[countries_data][KH][Alpha2]=KH +arguments[countries_data][KH][Alpha3]=KHM +arguments[countries_data][KH][IDC]=855 +arguments[countries_data][CM][Name]=Cameroon +arguments[countries_data][CM][Alpha2]=CM +arguments[countries_data][CM][Alpha3]=CMR +arguments[countries_data][CM][IDC]=237 +arguments[countries_data][CA][Name]=Canada +arguments[countries_data][CA][Alpha2]=CA +arguments[countries_data][CA][Alpha3]=CAN +arguments[countries_data][CA][IDC]=1 +arguments[countries_data][CV][Name]=Cape Verde +arguments[countries_data][CV][Alpha2]=CV +arguments[countries_data][CV][Alpha3]=CPV +arguments[countries_data][CV][IDC]=238 +arguments[countries_data][KY][Name]=Cayman Islands +arguments[countries_data][KY][Alpha2]=KY +arguments[countries_data][KY][Alpha3]=CYM +arguments[countries_data][KY][IDC]=1345 +arguments[countries_data][CF][Name]=Central African Republic +arguments[countries_data][CF][Alpha2]=CF +arguments[countries_data][CF][Alpha3]=CAF +arguments[countries_data][CF][IDC]=236 +arguments[countries_data][TD][Name]=Chad +arguments[countries_data][TD][Alpha2]=TD +arguments[countries_data][TD][Alpha3]=TCD +arguments[countries_data][TD][IDC]=235 +arguments[countries_data][CL][Name]=Chile +arguments[countries_data][CL][Alpha2]=CL +arguments[countries_data][CL][Alpha3]=CHL +arguments[countries_data][CL][IDC]=56 +arguments[countries_data][CN][Name]=China +arguments[countries_data][CN][Alpha2]=CN +arguments[countries_data][CN][Alpha3]=CHN +arguments[countries_data][CN][IDC]=86 +arguments[countries_data][CX][Name]=Christmas Island +arguments[countries_data][CX][Alpha2]=CX +arguments[countries_data][CX][Alpha3]=CXR +arguments[countries_data][CX][IDC]=61 +arguments[countries_data][CC][Name]="Cocos (Keeling) Islands" +arguments[countries_data][CC][Alpha2]=CC +arguments[countries_data][CC][Alpha3]=CCK +arguments[countries_data][CC][IDC]=61 +arguments[countries_data][CO][Name]=Colombia +arguments[countries_data][CO][Alpha2]=CO +arguments[countries_data][CO][Alpha3]=COL +arguments[countries_data][CO][IDC]=57 +arguments[countries_data][KM][Name]=Comoros +arguments[countries_data][KM][Alpha2]=KM +arguments[countries_data][KM][Alpha3]=COM +arguments[countries_data][KM][IDC]=269 +arguments[countries_data][CG][Name]=Congo +arguments[countries_data][CG][Alpha2]=CG +arguments[countries_data][CG][Alpha3]=COG +arguments[countries_data][CG][IDC]=242 +arguments[countries_data][CD][Name]=Congo, The Democratic Republic Of The +arguments[countries_data][CD][Alpha2]=CD +arguments[countries_data][CD][Alpha3]=COD +arguments[countries_data][CD][IDC]=243 +arguments[countries_data][CK][Name]=Cook Islands +arguments[countries_data][CK][Alpha2]=CK +arguments[countries_data][CK][Alpha3]=COK +arguments[countries_data][CK][IDC]=682 +arguments[countries_data][CR][Name]=Costa Rica +arguments[countries_data][CR][Alpha2]=CR +arguments[countries_data][CR][Alpha3]=CRI +arguments[countries_data][CR][IDC]=506 +arguments[countries_data][CI][Name]=Côte d'Ivoire +arguments[countries_data][CI][Alpha2]=CI +arguments[countries_data][CI][Alpha3]=CIV +arguments[countries_data][CI][IDC]=225 +arguments[countries_data][HR][Name]=Croatia +arguments[countries_data][HR][Alpha2]=HR +arguments[countries_data][HR][Alpha3]=HRV +arguments[countries_data][HR][IDC]=385 +arguments[countries_data][CU][Name]=Cuba +arguments[countries_data][CU][Alpha2]=CU +arguments[countries_data][CU][Alpha3]=CUB +arguments[countries_data][CU][IDC]=53 +arguments[countries_data][CY][Name]=Cyprus +arguments[countries_data][CY][Alpha2]=CY +arguments[countries_data][CY][Alpha3]=CYP +arguments[countries_data][CY][IDC]=357 +arguments[countries_data][CZ][Name]=Czech Republic +arguments[countries_data][CZ][Alpha2]=CZ +arguments[countries_data][CZ][Alpha3]=CZE +arguments[countries_data][CZ][IDC]=420 +arguments[countries_data][DK][Name]=Denmark +arguments[countries_data][DK][Alpha2]=DK +arguments[countries_data][DK][Alpha3]=DNK +arguments[countries_data][DK][IDC]=45 +arguments[countries_data][DJ][Name]=Djibouti +arguments[countries_data][DJ][Alpha2]=DJ +arguments[countries_data][DJ][Alpha3]=DJI +arguments[countries_data][DJ][IDC]=253 +arguments[countries_data][DM][Name]=Dominica +arguments[countries_data][DM][Alpha2]=DM +arguments[countries_data][DM][Alpha3]=DMA +arguments[countries_data][DM][IDC]=1767 +arguments[countries_data][DO][Name]=Dominican Republic +arguments[countries_data][DO][Alpha2]=DO +arguments[countries_data][DO][Alpha3]=DOM +arguments[countries_data][DO][IDC]=1809 +arguments[countries_data][EC][Name]=Ecuador +arguments[countries_data][EC][Alpha2]=EC +arguments[countries_data][EC][Alpha3]=ECU +arguments[countries_data][EC][IDC]=593 +arguments[countries_data][EG][Name]=Egypt +arguments[countries_data][EG][Alpha2]=EG +arguments[countries_data][EG][Alpha3]=EGY +arguments[countries_data][EG][IDC]=20 +arguments[countries_data][SV][Name]=El Salvador +arguments[countries_data][SV][Alpha2]=SV +arguments[countries_data][SV][Alpha3]=SLV +arguments[countries_data][SV][IDC]=503 +arguments[countries_data][GQ][Name]=Equatorial Guinea +arguments[countries_data][GQ][Alpha2]=GQ +arguments[countries_data][GQ][Alpha3]=GNQ +arguments[countries_data][GQ][IDC]=240 +arguments[countries_data][ER][Name]=Eritrea +arguments[countries_data][ER][Alpha2]=ER +arguments[countries_data][ER][Alpha3]=ERI +arguments[countries_data][ER][IDC]=291 +arguments[countries_data][EE][Name]=Estonia +arguments[countries_data][EE][Alpha2]=EE +arguments[countries_data][EE][Alpha3]=EST +arguments[countries_data][EE][IDC]=372 +arguments[countries_data][ET][Name]=Ethiopia +arguments[countries_data][ET][Alpha2]=ET +arguments[countries_data][ET][Alpha3]=ETH +arguments[countries_data][ET][IDC]=251 +arguments[countries_data][FK][Name]="Falkland Islands (Malvinas)" +arguments[countries_data][FK][Alpha2]=FK +arguments[countries_data][FK][Alpha3]=FLK +arguments[countries_data][FK][IDC]=500 +arguments[countries_data][FO][Name]=Faroe Islands +arguments[countries_data][FO][Alpha2]=FO +arguments[countries_data][FO][Alpha3]=FRO +arguments[countries_data][FO][IDC]=298 +arguments[countries_data][FJ][Name]=Fiji +arguments[countries_data][FJ][Alpha2]=FJ +arguments[countries_data][FJ][Alpha3]=FJI +arguments[countries_data][FJ][IDC]=679 +arguments[countries_data][FI][Name]=Finland +arguments[countries_data][FI][Alpha2]=FI +arguments[countries_data][FI][Alpha3]=FIN +arguments[countries_data][FI][IDC]=358 +arguments[countries_data][FR][Name]=France +arguments[countries_data][FR][Alpha2]=FR +arguments[countries_data][FR][Alpha3]=FRA +arguments[countries_data][FR][IDC]=33 +arguments[countries_data][GF][Name]=French Guiana +arguments[countries_data][GF][Alpha2]=GF +arguments[countries_data][GF][Alpha3]=GUF +arguments[countries_data][GF][IDC]=594 +arguments[countries_data][PF][Name]=French Polynesia +arguments[countries_data][PF][Alpha2]=PF +arguments[countries_data][PF][Alpha3]=PYF +arguments[countries_data][PF][IDC]=689 +arguments[countries_data][TF][Name]=French Southern Territories +arguments[countries_data][TF][Alpha2]=TF +arguments[countries_data][TF][Alpha3]=ATF +arguments[countries_data][TF][IDC]=0 +arguments[countries_data][GA][Name]=Gabon +arguments[countries_data][GA][Alpha2]=GA +arguments[countries_data][GA][Alpha3]=GAB +arguments[countries_data][GA][IDC]=241 +arguments[countries_data][GM][Name]=Gambia +arguments[countries_data][GM][Alpha2]=GM +arguments[countries_data][GM][Alpha3]=GMB +arguments[countries_data][GM][IDC]=220 +arguments[countries_data][GE][Name]=Georgia +arguments[countries_data][GE][Alpha2]=GE +arguments[countries_data][GE][Alpha3]=GEO +arguments[countries_data][GE][IDC]=995 +arguments[countries_data][DE][Name]=Germany +arguments[countries_data][DE][Alpha2]=DE +arguments[countries_data][DE][Alpha3]=DEU +arguments[countries_data][DE][IDC]=49 +arguments[countries_data][GH][Name]=Ghana +arguments[countries_data][GH][Alpha2]=GH +arguments[countries_data][GH][Alpha3]=GHA +arguments[countries_data][GH][IDC]=233 +arguments[countries_data][GI][Name]=Gibraltar +arguments[countries_data][GI][Alpha2]=GI +arguments[countries_data][GI][Alpha3]=GIB +arguments[countries_data][GI][IDC]=350 +arguments[countries_data][GR][Name]=Greece +arguments[countries_data][GR][Alpha2]=GR +arguments[countries_data][GR][Alpha3]=GRC +arguments[countries_data][GR][IDC]=30 +arguments[countries_data][GL][Name]=Greenland +arguments[countries_data][GL][Alpha2]=GL +arguments[countries_data][GL][Alpha3]=GRL +arguments[countries_data][GL][IDC]=299 +arguments[countries_data][GD][Name]=Grenada +arguments[countries_data][GD][Alpha2]=GD +arguments[countries_data][GD][Alpha3]=GRD +arguments[countries_data][GD][IDC]=1473 +arguments[countries_data][GP][Name]=Guadeloupe +arguments[countries_data][GP][Alpha2]=GP +arguments[countries_data][GP][Alpha3]=GLP +arguments[countries_data][GP][IDC]=590 +arguments[countries_data][GU][Name]=Guam +arguments[countries_data][GU][Alpha2]=GU +arguments[countries_data][GU][Alpha3]=GUM +arguments[countries_data][GU][IDC]=1671 +arguments[countries_data][GT][Name]=Guatemala +arguments[countries_data][GT][Alpha2]=GT +arguments[countries_data][GT][Alpha3]=GTM +arguments[countries_data][GT][IDC]=502 +arguments[countries_data][GG][Name]=Guernsey +arguments[countries_data][GG][Alpha2]=GG +arguments[countries_data][GG][Alpha3]=GGY +arguments[countries_data][GG][IDC]=44 +arguments[countries_data][GN][Name]=Guinea +arguments[countries_data][GN][Alpha2]=GN +arguments[countries_data][GN][Alpha3]=GIN +arguments[countries_data][GN][IDC]=224 +arguments[countries_data][GW][Name]=Guinea-Bissau +arguments[countries_data][GW][Alpha2]=GW +arguments[countries_data][GW][Alpha3]=GNB +arguments[countries_data][GW][IDC]=245 +arguments[countries_data][GY][Name]=Guyana +arguments[countries_data][GY][Alpha2]=GY +arguments[countries_data][GY][Alpha3]=GUY +arguments[countries_data][GY][IDC]=592 +arguments[countries_data][HT][Name]=Haiti +arguments[countries_data][HT][Alpha2]=HT +arguments[countries_data][HT][Alpha3]=HTI +arguments[countries_data][HT][IDC]=509 +arguments[countries_data][HM][Name]=Heard Island and McDonald Islands +arguments[countries_data][HM][Alpha2]=HM +arguments[countries_data][HM][Alpha3]=HMD +arguments[countries_data][HM][IDC]=672 +arguments[countries_data][HN][Name]=Honduras +arguments[countries_data][HN][Alpha2]=HN +arguments[countries_data][HN][Alpha3]=HND +arguments[countries_data][HN][IDC]=504 +arguments[countries_data][HK][Name]=Hong Kong +arguments[countries_data][HK][Alpha2]=HK +arguments[countries_data][HK][Alpha3]=HKG +arguments[countries_data][HK][IDC]=852 +arguments[countries_data][HU][Name]=Hungary +arguments[countries_data][HU][Alpha2]=HU +arguments[countries_data][HU][Alpha3]=HUN +arguments[countries_data][HU][IDC]=36 +arguments[countries_data][IS][Name]=Iceland +arguments[countries_data][IS][Alpha2]=IS +arguments[countries_data][IS][Alpha3]=ISL +arguments[countries_data][IS][IDC]=354 +arguments[countries_data][IN][Name]=India +arguments[countries_data][IN][Alpha2]=IN +arguments[countries_data][IN][Alpha3]=IND +arguments[countries_data][IN][IDC]=91 +arguments[countries_data][ID][Name]=Indonesia +arguments[countries_data][ID][Alpha2]=ID +arguments[countries_data][ID][Alpha3]=IDN +arguments[countries_data][ID][IDC]=62 +arguments[countries_data][IR][Name]=Iran, Islamic Republic of +arguments[countries_data][IR][Alpha2]=IR +arguments[countries_data][IR][Alpha3]=IRN +arguments[countries_data][IR][IDC]=98 +arguments[countries_data][IQ][Name]=Iraq +arguments[countries_data][IQ][Alpha2]=IQ +arguments[countries_data][IQ][Alpha3]=IRQ +arguments[countries_data][IQ][IDC]=964 +arguments[countries_data][IE][Name]=Ireland +arguments[countries_data][IE][Alpha2]=IE +arguments[countries_data][IE][Alpha3]=IRL +arguments[countries_data][IE][IDC]=353 +arguments[countries_data][IM][Name]=Isle of Man +arguments[countries_data][IM][Alpha2]=IM +arguments[countries_data][IM][Alpha3]=IMN +arguments[countries_data][IM][IDC]=44 +arguments[countries_data][IL][Name]=Israel +arguments[countries_data][IL][Alpha2]=IL +arguments[countries_data][IL][Alpha3]=ISR +arguments[countries_data][IL][IDC]=972 +arguments[countries_data][IT][Name]=Italy +arguments[countries_data][IT][Alpha2]=IT +arguments[countries_data][IT][Alpha3]=ITA +arguments[countries_data][IT][IDC]=39 +arguments[countries_data][JM][Name]=Jamaica +arguments[countries_data][JM][Alpha2]=JM +arguments[countries_data][JM][Alpha3]=JAM +arguments[countries_data][JM][IDC]=1876 +arguments[countries_data][JP][Name]=Japan +arguments[countries_data][JP][Alpha2]=JP +arguments[countries_data][JP][Alpha3]=JPN +arguments[countries_data][JP][IDC]=81 +arguments[countries_data][JE][Name]=Jersey +arguments[countries_data][JE][Alpha2]=JE +arguments[countries_data][JE][Alpha3]=JEY +arguments[countries_data][JE][IDC]=44 +arguments[countries_data][JO][Name]=Jordan +arguments[countries_data][JO][Alpha2]=JO +arguments[countries_data][JO][Alpha3]=JOR +arguments[countries_data][JO][IDC]=962 +arguments[countries_data][KZ][Name]=Kazakhstan +arguments[countries_data][KZ][Alpha2]=KZ +arguments[countries_data][KZ][Alpha3]=KAZ +arguments[countries_data][KZ][IDC]=7 +arguments[countries_data][KE][Name]=Kenya +arguments[countries_data][KE][Alpha2]=KE +arguments[countries_data][KE][Alpha3]=KEN +arguments[countries_data][KE][IDC]=254 +arguments[countries_data][KI][Name]=Kiribati +arguments[countries_data][KI][Alpha2]=KI +arguments[countries_data][KI][Alpha3]=KIR +arguments[countries_data][KI][IDC]=686 +arguments[countries_data][KP][Name]=Korea, Democratic People's Republic of +arguments[countries_data][KP][Alpha2]=KP +arguments[countries_data][KP][Alpha3]=PRK +arguments[countries_data][KP][IDC]=850 +arguments[countries_data][KR][Name]=Korea, Republic of +arguments[countries_data][KR][Alpha2]=KR +arguments[countries_data][KR][Alpha3]=KOR +arguments[countries_data][KR][IDC]=82 +arguments[countries_data][KW][Name]=Kuwait +arguments[countries_data][KW][Alpha2]=KW +arguments[countries_data][KW][Alpha3]=KWT +arguments[countries_data][KW][IDC]=965 +arguments[countries_data][KG][Name]=Kyrgyzstan +arguments[countries_data][KG][Alpha2]=KG +arguments[countries_data][KG][Alpha3]=KGZ +arguments[countries_data][KG][IDC]=996 +arguments[countries_data][LA][Name]=Lao People's Democratic Republic +arguments[countries_data][LA][Alpha2]=LA +arguments[countries_data][LA][Alpha3]=LAO +arguments[countries_data][LA][IDC]=856 +arguments[countries_data][LV][Name]=Latvia +arguments[countries_data][LV][Alpha2]=LV +arguments[countries_data][LV][Alpha3]=LVA +arguments[countries_data][LV][IDC]=371 +arguments[countries_data][LB][Name]=Lebanon +arguments[countries_data][LB][Alpha2]=LB +arguments[countries_data][LB][Alpha3]=LBN +arguments[countries_data][LB][IDC]=961 +arguments[countries_data][LS][Name]=Lesotho +arguments[countries_data][LS][Alpha2]=LS +arguments[countries_data][LS][Alpha3]=LSO +arguments[countries_data][LS][IDC]=266 +arguments[countries_data][LR][Name]=Liberia +arguments[countries_data][LR][Alpha2]=LR +arguments[countries_data][LR][Alpha3]=LBR +arguments[countries_data][LR][IDC]=231 +arguments[countries_data][LY][Name]=Libyan Arab Jamahiriya +arguments[countries_data][LY][Alpha2]=LY +arguments[countries_data][LY][Alpha3]=LBY +arguments[countries_data][LY][IDC]=218 +arguments[countries_data][LI][Name]=Liechtenstein +arguments[countries_data][LI][Alpha2]=LI +arguments[countries_data][LI][Alpha3]=LIE +arguments[countries_data][LI][IDC]=423 +arguments[countries_data][LT][Name]=Lithuania +arguments[countries_data][LT][Alpha2]=LT +arguments[countries_data][LT][Alpha3]=LTU +arguments[countries_data][LT][IDC]=370 +arguments[countries_data][LU][Name]=Luxembourg +arguments[countries_data][LU][Alpha2]=LU +arguments[countries_data][LU][Alpha3]=LUX +arguments[countries_data][LU][IDC]=352 +arguments[countries_data][MO][Name]=Macau +arguments[countries_data][MO][Alpha2]=MO +arguments[countries_data][MO][Alpha3]=MAC +arguments[countries_data][MO][IDC]=853 +arguments[countries_data][MK][Name]=Macedonia, The Former Yugoslav Republic of +arguments[countries_data][MK][Alpha2]=MK +arguments[countries_data][MK][Alpha3]=MKD +arguments[countries_data][MK][IDC]=389 +arguments[countries_data][MG][Name]=Madagascar +arguments[countries_data][MG][Alpha2]=MG +arguments[countries_data][MG][Alpha3]=MDG +arguments[countries_data][MG][IDC]=261 +arguments[countries_data][MW][Name]=Malawi +arguments[countries_data][MW][Alpha2]=MW +arguments[countries_data][MW][Alpha3]=MWI +arguments[countries_data][MW][IDC]=265 +arguments[countries_data][MY][Name]=Malaysia +arguments[countries_data][MY][Alpha2]=MY +arguments[countries_data][MY][Alpha3]=MYS +arguments[countries_data][MY][IDC]=60 +arguments[countries_data][MV][Name]=Maldives +arguments[countries_data][MV][Alpha2]=MV +arguments[countries_data][MV][Alpha3]=MDV +arguments[countries_data][MV][IDC]=960 +arguments[countries_data][ML][Name]=Mali +arguments[countries_data][ML][Alpha2]=ML +arguments[countries_data][ML][Alpha3]=MLI +arguments[countries_data][ML][IDC]=223 +arguments[countries_data][MT][Name]=Malta +arguments[countries_data][MT][Alpha2]=MT +arguments[countries_data][MT][Alpha3]=MLT +arguments[countries_data][MT][IDC]=356 +arguments[countries_data][MH][Name]=Marshall Islands +arguments[countries_data][MH][Alpha2]=MH +arguments[countries_data][MH][Alpha3]=MHL +arguments[countries_data][MH][IDC]=692 +arguments[countries_data][MQ][Name]=Martinique +arguments[countries_data][MQ][Alpha2]=MQ +arguments[countries_data][MQ][Alpha3]=MTQ +arguments[countries_data][MQ][IDC]=596 +arguments[countries_data][MR][Name]=Mauritania +arguments[countries_data][MR][Alpha2]=MR +arguments[countries_data][MR][Alpha3]=MRT +arguments[countries_data][MR][IDC]=222 +arguments[countries_data][MU][Name]=Mauritius +arguments[countries_data][MU][Alpha2]=MU +arguments[countries_data][MU][Alpha3]=MUS +arguments[countries_data][MU][IDC]=230 +arguments[countries_data][YT][Name]=Mayotte +arguments[countries_data][YT][Alpha2]=YT +arguments[countries_data][YT][Alpha3]=MYT +arguments[countries_data][YT][IDC]=262 +arguments[countries_data][MX][Name]=Mexico +arguments[countries_data][MX][Alpha2]=MX +arguments[countries_data][MX][Alpha3]=MEX +arguments[countries_data][MX][IDC]=52 +arguments[countries_data][FM][Name]=Micronesia, Federated States of +arguments[countries_data][FM][Alpha2]=FM +arguments[countries_data][FM][Alpha3]=FSM +arguments[countries_data][FM][IDC]=691 +arguments[countries_data][MD][Name]=Moldova, Republic of +arguments[countries_data][MD][Alpha2]=MD +arguments[countries_data][MD][Alpha3]=MDA +arguments[countries_data][MD][IDC]=373 +arguments[countries_data][MC][Name]=Monaco +arguments[countries_data][MC][Alpha2]=MC +arguments[countries_data][MC][Alpha3]=MCO +arguments[countries_data][MC][IDC]=377 +arguments[countries_data][MN][Name]=Mongolia +arguments[countries_data][MN][Alpha2]=MN +arguments[countries_data][MN][Alpha3]=MNG +arguments[countries_data][MN][IDC]=976 +arguments[countries_data][ME][Name]=Montenegro +arguments[countries_data][ME][Alpha2]=ME +arguments[countries_data][ME][Alpha3]=MNE +arguments[countries_data][ME][IDC]=382 +arguments[countries_data][MS][Name]=Montserrat +arguments[countries_data][MS][Alpha2]=MS +arguments[countries_data][MS][Alpha3]=MSR +arguments[countries_data][MS][IDC]=1664 +arguments[countries_data][MA][Name]=Morocco +arguments[countries_data][MA][Alpha2]=MA +arguments[countries_data][MA][Alpha3]=MAR +arguments[countries_data][MA][IDC]=212 +arguments[countries_data][MZ][Name]=Mozambique +arguments[countries_data][MZ][Alpha2]=MZ +arguments[countries_data][MZ][Alpha3]=MOZ +arguments[countries_data][MZ][IDC]=258 +arguments[countries_data][MM][Name]=Myanmar +arguments[countries_data][MM][Alpha2]=MM +arguments[countries_data][MM][Alpha3]=MMR +arguments[countries_data][MM][IDC]=95 +arguments[countries_data][NA][Name]=Namibia +arguments[countries_data][NA][Alpha2]=NA +arguments[countries_data][NA][Alpha3]=NAM +arguments[countries_data][NA][IDC]=264 +arguments[countries_data][NR][Name]=Nauru +arguments[countries_data][NR][Alpha2]=NR +arguments[countries_data][NR][Alpha3]=NRU +arguments[countries_data][NR][IDC]=674 +arguments[countries_data][NP][Name]=Nepal +arguments[countries_data][NP][Alpha2]=NP +arguments[countries_data][NP][Alpha3]=NPL +arguments[countries_data][NP][IDC]=977 +arguments[countries_data][NL][Name]=Netherlands +arguments[countries_data][NL][Alpha2]=NL +arguments[countries_data][NL][Alpha3]=NLD +arguments[countries_data][NL][IDC]=31 +arguments[countries_data][AN][Name]=Netherlands Antilles +arguments[countries_data][AN][Alpha2]=AN +arguments[countries_data][AN][Alpha3]=ANT +arguments[countries_data][AN][IDC]=599 +arguments[countries_data][NC][Name]=New Caledonia +arguments[countries_data][NC][Alpha2]=NC +arguments[countries_data][NC][Alpha3]=NCL +arguments[countries_data][NC][IDC]=687 +arguments[countries_data][NZ][Name]=New Zealand +arguments[countries_data][NZ][Alpha2]=NZ +arguments[countries_data][NZ][Alpha3]=NZL +arguments[countries_data][NZ][IDC]=64 +arguments[countries_data][NI][Name]=Nicaragua +arguments[countries_data][NI][Alpha2]=NI +arguments[countries_data][NI][Alpha3]=NIC +arguments[countries_data][NI][IDC]=505 +arguments[countries_data][NE][Name]=Niger +arguments[countries_data][NE][Alpha2]=NE +arguments[countries_data][NE][Alpha3]=NER +arguments[countries_data][NE][IDC]=227 +arguments[countries_data][NG][Name]=Nigeria +arguments[countries_data][NG][Alpha2]=NG +arguments[countries_data][NG][Alpha3]=NGA +arguments[countries_data][NG][IDC]=234 +arguments[countries_data][NU][Name]=Niue +arguments[countries_data][NU][Alpha2]=NU +arguments[countries_data][NU][Alpha3]=NIU +arguments[countries_data][NU][IDC]=683 +arguments[countries_data][NF][Name]=Norfolk Island +arguments[countries_data][NF][Alpha2]=NF +arguments[countries_data][NF][Alpha3]=NFK +arguments[countries_data][NF][IDC]=6723 +arguments[countries_data][MP][Name]=Northern Mariana Islands +arguments[countries_data][MP][Alpha2]=MP +arguments[countries_data][MP][Alpha3]=MNP +arguments[countries_data][MP][IDC]=1670 +arguments[countries_data][NO][Name]=Norway +arguments[countries_data][NO][Alpha2]=NO +arguments[countries_data][NO][Alpha3]=NOR +arguments[countries_data][NO][IDC]=47 +arguments[countries_data][OM][Name]=Oman +arguments[countries_data][OM][Alpha2]=OM +arguments[countries_data][OM][Alpha3]=OMN +arguments[countries_data][OM][IDC]=968 +arguments[countries_data][PK][Name]=Pakistan +arguments[countries_data][PK][Alpha2]=PK +arguments[countries_data][PK][Alpha3]=PAK +arguments[countries_data][PK][IDC]=92 +arguments[countries_data][PW][Name]=Palau +arguments[countries_data][PW][Alpha2]=PW +arguments[countries_data][PW][Alpha3]=PLW +arguments[countries_data][PW][IDC]=680 +arguments[countries_data][PS][Name]=Palestinian Territory, Occupied +arguments[countries_data][PS][Alpha2]=PS +arguments[countries_data][PS][Alpha3]=PSE +arguments[countries_data][PS][IDC]=970 +arguments[countries_data][PA][Name]=Panama +arguments[countries_data][PA][Alpha2]=PA +arguments[countries_data][PA][Alpha3]=PAN +arguments[countries_data][PA][IDC]=507 +arguments[countries_data][PG][Name]=Papua New Guinea +arguments[countries_data][PG][Alpha2]=PG +arguments[countries_data][PG][Alpha3]=PNG +arguments[countries_data][PG][IDC]=675 +arguments[countries_data][PY][Name]=Paraguay +arguments[countries_data][PY][Alpha2]=PY +arguments[countries_data][PY][Alpha3]=PRY +arguments[countries_data][PY][IDC]=595 +arguments[countries_data][PE][Name]=Peru +arguments[countries_data][PE][Alpha2]=PE +arguments[countries_data][PE][Alpha3]=PER +arguments[countries_data][PE][IDC]=51 +arguments[countries_data][PH][Name]=Philippines +arguments[countries_data][PH][Alpha2]=PH +arguments[countries_data][PH][Alpha3]=PHL +arguments[countries_data][PH][IDC]=63 +arguments[countries_data][PN][Name]=Pitcairn +arguments[countries_data][PN][Alpha2]=PN +arguments[countries_data][PN][Alpha3]=PCN +arguments[countries_data][PN][IDC]=64 +arguments[countries_data][PL][Name]=Poland +arguments[countries_data][PL][Alpha2]=PL +arguments[countries_data][PL][Alpha3]=POL +arguments[countries_data][PL][IDC]=48 +arguments[countries_data][PT][Name]=Portugal +arguments[countries_data][PT][Alpha2]=PT +arguments[countries_data][PT][Alpha3]=PRT +arguments[countries_data][PT][IDC]=351 +arguments[countries_data][PR][Name]=Puerto Rico +arguments[countries_data][PR][Alpha2]=PR +arguments[countries_data][PR][Alpha3]=PRI +arguments[countries_data][PR][IDC]=1787 +arguments[countries_data][QA][Name]=Qatar +arguments[countries_data][QA][Alpha2]=QA +arguments[countries_data][QA][Alpha3]=QAT +arguments[countries_data][QA][IDC]=974 +arguments[countries_data][RE][Name]=Reunion +arguments[countries_data][RE][Alpha2]=RE +arguments[countries_data][RE][Alpha3]=REU +arguments[countries_data][RE][IDC]=262 +arguments[countries_data][RO][Name]=Romania +arguments[countries_data][RO][Alpha2]=RO +arguments[countries_data][RO][Alpha3]=ROU +arguments[countries_data][RO][IDC]=40 +arguments[countries_data][RU][Name]=Russian Federation +arguments[countries_data][RU][Alpha2]=RU +arguments[countries_data][RU][Alpha3]=RUS +arguments[countries_data][RU][IDC]=7 +arguments[countries_data][RW][Name]=Rwanda +arguments[countries_data][RW][Alpha2]=RW +arguments[countries_data][RW][Alpha3]=RWA +arguments[countries_data][RW][IDC]=250 +arguments[countries_data][BL][Name]=Saint Barthélemy +arguments[countries_data][BL][Alpha2]=BL +arguments[countries_data][BL][Alpha3]=BLM +arguments[countries_data][BL][IDC]=590 +arguments[countries_data][SH][Name]=Saint Helena +arguments[countries_data][SH][Alpha2]=SH +arguments[countries_data][SH][Alpha3]=SHN +arguments[countries_data][SH][IDC]=290 +arguments[countries_data][KN][Name]=Saint Kitts and Nevis +arguments[countries_data][KN][Alpha2]=KN +arguments[countries_data][KN][Alpha3]=KNA +arguments[countries_data][KN][IDC]=1869 +arguments[countries_data][LC][Name]=Saint Lucia +arguments[countries_data][LC][Alpha2]=LC +arguments[countries_data][LC][Alpha3]=LCA +arguments[countries_data][LC][IDC]=1758 +arguments[countries_data][MF][Name]=Saint Martin +arguments[countries_data][MF][Alpha2]=MF +arguments[countries_data][MF][Alpha3]=MAF +arguments[countries_data][MF][IDC]=590 +arguments[countries_data][PM][Name]=Saint Pierre and Miquelon +arguments[countries_data][PM][Alpha2]=PM +arguments[countries_data][PM][Alpha3]=SPM +arguments[countries_data][PM][IDC]=508 +arguments[countries_data][VC][Name]=Saint Vincent and The Grenadines +arguments[countries_data][VC][Alpha2]=VC +arguments[countries_data][VC][Alpha3]=VCT +arguments[countries_data][VC][IDC]=1784 +arguments[countries_data][WS][Name]=Samoa +arguments[countries_data][WS][Alpha2]=WS +arguments[countries_data][WS][Alpha3]=WSM +arguments[countries_data][WS][IDC]=685 +arguments[countries_data][SM][Name]=San Marino +arguments[countries_data][SM][Alpha2]=SM +arguments[countries_data][SM][Alpha3]=SMR +arguments[countries_data][SM][IDC]=378 +arguments[countries_data][ST][Name]=Sao Tome and Principe +arguments[countries_data][ST][Alpha2]=ST +arguments[countries_data][ST][Alpha3]=STP +arguments[countries_data][ST][IDC]=239 +arguments[countries_data][SA][Name]=Saudi Arabia +arguments[countries_data][SA][Alpha2]=SA +arguments[countries_data][SA][Alpha3]=SAU +arguments[countries_data][SA][IDC]=966 +arguments[countries_data][SN][Name]=Senegal +arguments[countries_data][SN][Alpha2]=SN +arguments[countries_data][SN][Alpha3]=SEN +arguments[countries_data][SN][IDC]=221 +arguments[countries_data][RS][Name]=Serbia +arguments[countries_data][RS][Alpha2]=RS +arguments[countries_data][RS][Alpha3]=SRB +arguments[countries_data][RS][IDC]=381 +arguments[countries_data][SC][Name]=Seychelles +arguments[countries_data][SC][Alpha2]=SC +arguments[countries_data][SC][Alpha3]=SYC +arguments[countries_data][SC][IDC]=248 +arguments[countries_data][SL][Name]=Sierra Leone +arguments[countries_data][SL][Alpha2]=SL +arguments[countries_data][SL][Alpha3]=SLE +arguments[countries_data][SL][IDC]=232 +arguments[countries_data][SG][Name]=Singapore +arguments[countries_data][SG][Alpha2]=SG +arguments[countries_data][SG][Alpha3]=SGP +arguments[countries_data][SG][IDC]=65 +arguments[countries_data][SK][Name]=Slovakia +arguments[countries_data][SK][Alpha2]=SK +arguments[countries_data][SK][Alpha3]=SVK +arguments[countries_data][SK][IDC]=421 +arguments[countries_data][SI][Name]=Slovenia +arguments[countries_data][SI][Alpha2]=SI +arguments[countries_data][SI][Alpha3]=SVN +arguments[countries_data][SI][IDC]=386 +arguments[countries_data][SB][Name]=Solomon Islands +arguments[countries_data][SB][Alpha2]=SB +arguments[countries_data][SB][Alpha3]=SLB +arguments[countries_data][SB][IDC]=677 +arguments[countries_data][SO][Name]=Somalia +arguments[countries_data][SO][Alpha2]=SO +arguments[countries_data][SO][Alpha3]=SOM +arguments[countries_data][SO][IDC]=252 +arguments[countries_data][ZA][Name]=South Africa +arguments[countries_data][ZA][Alpha2]=ZA +arguments[countries_data][ZA][Alpha3]=ZAF +arguments[countries_data][ZA][IDC]=27 +arguments[countries_data][GS][Name]=South Georgia and The South Sandwich Islands +arguments[countries_data][GS][Alpha2]=GS +arguments[countries_data][GS][Alpha3]=SGS +arguments[countries_data][GS][IDC]=500 +arguments[countries_data][ES][Name]=Spain +arguments[countries_data][ES][Alpha2]=ES +arguments[countries_data][ES][Alpha3]=ESP +arguments[countries_data][ES][IDC]=34 +arguments[countries_data][LK][Name]=Sri Lanka +arguments[countries_data][LK][Alpha2]=LK +arguments[countries_data][LK][Alpha3]=LKA +arguments[countries_data][LK][IDC]=94 +arguments[countries_data][SD][Name]=Sudan +arguments[countries_data][SD][Alpha2]=SD +arguments[countries_data][SD][Alpha3]=SDN +arguments[countries_data][SD][IDC]=249 +arguments[countries_data][SR][Name]=Suriname +arguments[countries_data][SR][Alpha2]=SR +arguments[countries_data][SR][Alpha3]=SUR +arguments[countries_data][SR][IDC]=597 +arguments[countries_data][SJ][Name]=Svalbard and Jan Mayen +arguments[countries_data][SJ][Alpha2]=SJ +arguments[countries_data][SJ][Alpha3]=SJM +arguments[countries_data][SJ][IDC]=47 +arguments[countries_data][SZ][Name]=Swaziland +arguments[countries_data][SZ][Alpha2]=SZ +arguments[countries_data][SZ][Alpha3]=SWZ +arguments[countries_data][SZ][IDC]=268 +arguments[countries_data][SE][Name]=Sweden +arguments[countries_data][SE][Alpha2]=SE +arguments[countries_data][SE][Alpha3]=SWE +arguments[countries_data][SE][IDC]=46 +arguments[countries_data][CH][Name]=Switzerland +arguments[countries_data][CH][Alpha2]=CH +arguments[countries_data][CH][Alpha3]=CHE +arguments[countries_data][CH][IDC]=41 +arguments[countries_data][SY][Name]=Syrian Arab Republic +arguments[countries_data][SY][Alpha2]=SY +arguments[countries_data][SY][Alpha3]=SYR +arguments[countries_data][SY][IDC]=963 +arguments[countries_data][TW][Name]=Taiwan +arguments[countries_data][TW][Alpha2]=TW +arguments[countries_data][TW][Alpha3]=TWN +arguments[countries_data][TW][IDC]=886 +arguments[countries_data][TJ][Name]=Tajikistan +arguments[countries_data][TJ][Alpha2]=TJ +arguments[countries_data][TJ][Alpha3]=TJK +arguments[countries_data][TJ][IDC]=992 +arguments[countries_data][TZ][Name]=Tanzania, United Republic of +arguments[countries_data][TZ][Alpha2]=TZ +arguments[countries_data][TZ][Alpha3]=TZA +arguments[countries_data][TZ][IDC]=255 +arguments[countries_data][TH][Name]=Thailand +arguments[countries_data][TH][Alpha2]=TH +arguments[countries_data][TH][Alpha3]=THA +arguments[countries_data][TH][IDC]=66 +arguments[countries_data][TL][Name]=Timor-Leste +arguments[countries_data][TL][Alpha2]=TL +arguments[countries_data][TL][Alpha3]=TLS +arguments[countries_data][TL][IDC]=670 +arguments[countries_data][TG][Name]=Togo +arguments[countries_data][TG][Alpha2]=TG +arguments[countries_data][TG][Alpha3]=TGO +arguments[countries_data][TG][IDC]=228 +arguments[countries_data][TK][Name]=Tokelau +arguments[countries_data][TK][Alpha2]=TK +arguments[countries_data][TK][Alpha3]=TKL +arguments[countries_data][TK][IDC]=690 +arguments[countries_data][TO][Name]=Tonga +arguments[countries_data][TO][Alpha2]=TO +arguments[countries_data][TO][Alpha3]=TON +arguments[countries_data][TO][IDC]=676 +arguments[countries_data][TT][Name]=Trinidad and Tobago +arguments[countries_data][TT][Alpha2]=TT +arguments[countries_data][TT][Alpha3]=TTO +arguments[countries_data][TT][IDC]=1868 +arguments[countries_data][TN][Name]=Tunisia +arguments[countries_data][TN][Alpha2]=TN +arguments[countries_data][TN][Alpha3]=TUN +arguments[countries_data][TN][IDC]=216 +arguments[countries_data][TR][Name]=Turkey +arguments[countries_data][TR][Alpha2]=TR +arguments[countries_data][TR][Alpha3]=TUR +arguments[countries_data][TR][IDC]=90 +arguments[countries_data][TM][Name]=Turkmenistan +arguments[countries_data][TM][Alpha2]=TM +arguments[countries_data][TM][Alpha3]=TKM +arguments[countries_data][TM][IDC]=993 +arguments[countries_data][TC][Name]=Turks and Caicos Islands +arguments[countries_data][TC][Alpha2]=TC +arguments[countries_data][TC][Alpha3]=TCA +arguments[countries_data][TC][IDC]=1649 +arguments[countries_data][TV][Name]=Tuvalu +arguments[countries_data][TV][Alpha2]=TV +arguments[countries_data][TV][Alpha3]=TUV +arguments[countries_data][TV][IDC]=688 +arguments[countries_data][UG][Name]=Uganda +arguments[countries_data][UG][Alpha2]=UG +arguments[countries_data][UG][Alpha3]=UGA +arguments[countries_data][UG][IDC]=256 +arguments[countries_data][UA][Name]=Ukraine +arguments[countries_data][UA][Alpha2]=UA +arguments[countries_data][UA][Alpha3]=UKR +arguments[countries_data][UA][IDC]=380 +arguments[countries_data][AE][Name]=United Arab Emirates +arguments[countries_data][AE][Alpha2]=AE +arguments[countries_data][AE][Alpha3]=ARE +arguments[countries_data][AE][IDC]=971 +arguments[countries_data][GB][Name]=United Kingdom +arguments[countries_data][GB][Alpha2]=GB +arguments[countries_data][GB][Alpha3]=GBR +arguments[countries_data][GB][IDC]=44 +arguments[countries_data][UM][Name]=United States Minor Outlying Islands +arguments[countries_data][UM][Alpha2]=UM +arguments[countries_data][UM][Alpha3]=UMI +arguments[countries_data][UM][IDC]=1 +arguments[countries_data][US][Name]=United States of America +arguments[countries_data][US][Alpha2]=US +arguments[countries_data][US][Alpha3]=USA +arguments[countries_data][US][IDC]=1 +arguments[countries_data][UY][Name]=Uruguay +arguments[countries_data][UY][Alpha2]=UY +arguments[countries_data][UY][Alpha3]=URY +arguments[countries_data][UY][IDC]=598 +arguments[countries_data][UZ][Name]=Uzbekistan +arguments[countries_data][UZ][Alpha2]=UZ +arguments[countries_data][UZ][Alpha3]=UZB +arguments[countries_data][UZ][IDC]=998 +arguments[countries_data][VU][Name]=Vanuatu +arguments[countries_data][VU][Alpha2]=VU +arguments[countries_data][VU][Alpha3]=VUT +arguments[countries_data][VU][IDC]=678 +arguments[countries_data][VA][Name]="Holy See (Vatican City State)" +arguments[countries_data][VA][Alpha2]=VA +arguments[countries_data][VA][Alpha3]=VAT +arguments[countries_data][VA][IDC]=3906 +arguments[countries_data][VE][Name]=Venezuela +arguments[countries_data][VE][Alpha2]=VE +arguments[countries_data][VE][Alpha3]=VEN +arguments[countries_data][VE][IDC]=58 +arguments[countries_data][VN][Name]=Viet Nam +arguments[countries_data][VN][Alpha2]=VN +arguments[countries_data][VN][Alpha3]=VNM +arguments[countries_data][VN][IDC]=84 +arguments[countries_data][VG][Name]=Virgin Islands, British +arguments[countries_data][VG][Alpha2]=VG +arguments[countries_data][VG][Alpha3]=VGB +arguments[countries_data][VG][IDC]=1284 +arguments[countries_data][VI][Name]=Virgin Islands, U.S. +arguments[countries_data][VI][Alpha2]=VI +arguments[countries_data][VI][Alpha3]=VIR +arguments[countries_data][VI][IDC]=1340 +arguments[countries_data][WF][Name]=Wallis and Futuna +arguments[countries_data][WF][Alpha2]=WF +arguments[countries_data][WF][Alpha3]=WLF +arguments[countries_data][WF][IDC]=681 +arguments[countries_data][EH][Name]=Western Sahara +arguments[countries_data][EH][Alpha2]=EH +arguments[countries_data][EH][Alpha3]=ESH +arguments[countries_data][EH][IDC]=212 +arguments[countries_data][YE][Name]=Yemen +arguments[countries_data][YE][Alpha2]=YE +arguments[countries_data][YE][Alpha3]=YEM +arguments[countries_data][YE][IDC]=967 +arguments[countries_data][ZM][Name]=Zambia +arguments[countries_data][ZM][Alpha2]=ZM +arguments[countries_data][ZM][Alpha3]=ZMB +arguments[countries_data][ZM][IDC]=260 +arguments[countries_data][ZW][Name]=Zimbabwe +arguments[countries_data][ZW][Alpha2]=ZW +arguments[countries_data][ZW][Alpha3]=ZWE +arguments[countries_data][ZW][IDC]=263 diff --git a/eZ/Publish/SPI/FieldType/Event.php b/eZ/Publish/SPI/FieldType/Event.php new file mode 100644 index 0000000..c3a7684 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/Event.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the Event base class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType; + +/** + * Abstract base class for FieldType events + * + * An instance of a derived class is given to {@link + * eZ\Publish\SPI\FieldType\EventListener::handleEvent()}. The derived class name + * identified the occurred event. The properties of the class give the needed + * event context. + * + * @todo Add VersionInfo parameter + */ +abstract class Event +{ + /** + * Definition of $field + * + * @var \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition + */ + public $fieldDefinition; + + /** + * Field the event occurred on + * + * @var \eZ\Publish\API\Repository\Values\Content\Field + */ + public $field; + + /** + * VersionInfo of the Content the affected field belongs to + * + * Value is null in case of pre create events! + * + * @var \eZ\Publish\API\Repository\Values\Content\VersionInfo|null + */ + public $versionInfo; +} diff --git a/eZ/Publish/SPI/FieldType/EventListener.php b/eZ/Publish/SPI/FieldType/EventListener.php new file mode 100644 index 0000000..4b23f73 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/EventListener.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the EventListener interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType; + +use eZ\Publish\SPI\FieldType\Event; + +/** + * A field type interface which field types can optionally implement. + * + * Field types that implemented this interface will be notified about certain events, both before and after something + * has happened. This allows the field type to perform certain actions. + * + * Note: This is a low level synchronous events, for more generic asynchronous events like sending out notifications, + * please use the signal slot system instead (create and register a slot to listen to events). + */ +interface EventListener +{ + /** + * This method is called on occurring events. + * + * This method is called on occurring events in the Core to allow + * FieldTypes to react to such events. + * + * @param \eZ\Publish\SPI\FieldType\Event $event + */ + public function handleEvent( Event $event ); +} + diff --git a/eZ/Publish/SPI/FieldType/Events/PostCreateEvent.php b/eZ/Publish/SPI/FieldType/Events/PostCreateEvent.php new file mode 100644 index 0000000..77b9ed3 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/Events/PostCreateEvent.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the PostCreateEvent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType\Events; + +use eZ\Publish\SPI\FieldType\Event; + +/** + * Event triggered after a field of the FieldType has been created. + */ +class PostCreateEvent extends Event +{ +} diff --git a/eZ/Publish/SPI/FieldType/Events/PostPublishEvent.php b/eZ/Publish/SPI/FieldType/Events/PostPublishEvent.php new file mode 100644 index 0000000..9c2911e --- /dev/null +++ b/eZ/Publish/SPI/FieldType/Events/PostPublishEvent.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the PostPublishEvent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType\Events; + +use eZ\Publish\SPI\FieldType\Event; + +/** + * Event triggered after a field of the FieldType has been published. + */ +class PostPublishEvent extends Event +{ +} diff --git a/eZ/Publish/SPI/FieldType/Events/PreCreateEvent.php b/eZ/Publish/SPI/FieldType/Events/PreCreateEvent.php new file mode 100644 index 0000000..795051e --- /dev/null +++ b/eZ/Publish/SPI/FieldType/Events/PreCreateEvent.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the PreCreateEvent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType\Events; + +use eZ\Publish\SPI\FieldType\Event; + +/** + * Event triggered before a field of the FieldType is created. + */ +class PreCreateEvent extends Event +{ +} diff --git a/eZ/Publish/SPI/FieldType/Events/PrePublishEvent.php b/eZ/Publish/SPI/FieldType/Events/PrePublishEvent.php new file mode 100644 index 0000000..624e2eb --- /dev/null +++ b/eZ/Publish/SPI/FieldType/Events/PrePublishEvent.php @@ -0,0 +1,19 @@ +<?php +/** + * File containing the PrePublishEvent class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType\Events; + +use eZ\Publish\SPI\FieldType\Event; + +/** + * Event triggered before a field of the FieldType is published. + */ +class PrePublishEvent extends Event +{ +} diff --git a/eZ/Publish/SPI/FieldType/FieldStorage.php b/eZ/Publish/SPI/FieldType/FieldStorage.php new file mode 100644 index 0000000..1996124 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/FieldStorage.php @@ -0,0 +1,113 @@ +<?php +/** + * File containing the eZ\Publish\SPI\FieldType\FieldStorage class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + * @package FieldTypeProviderInterface + */ + +namespace eZ\Publish\SPI\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\VersionInfo; + +/** + * Interface for setting field type data. + * + * Methods in this interface are called by storage engine. + * + * $context array passed to most methods provides some context for the field handler about the + * currently used storage engine. + * The array should at least define 2 keys : + * - identifier (connection identifier) + * - connection (the connection handler) + * For example, using Legacy storage engine, $context will be: + * - identifier = 'LegacyStorage' + * - connection = {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} object handler (for DB connection), + * to be used accordingly to + * {@link http://incubator.apache.org/zetacomponents/documentation/trunk/Database/tutorial.html ezcDatabase} usage + * + * @package FieldTypeProviderInterface + */ +interface FieldStorage +{ + /** + * Allows custom field types to store data in an external source (e.g. another DB table). + * + * Stores value for $field in an external data source. + * The whole {@link eZ\Publish\SPI\Persistence\Content\Field} object is passed and its value + * is accessible through the {@link eZ\Publish\SPI\Persistence\Content\FieldValue} 'value' property. + * This value holds the data filled by the user as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * $field->id = unique ID from the attribute tables (needs to be generated by + * database back end on create, before the external data source may be + * called from storing). + * + * The context array provides some context for the field handler about the + * currently used storage engine. + * The array should at least define 2 keys : + * - identifier (connection identifier) + * - connection (the connection handler) + * For example, using Legacy storage engine, $context will be: + * - identifier = 'LegacyStorage' + * - connection = {@link \eZ\Publish\Core\Persistence\Legacy\EzcDbHandler} object handler (for DB connection), + * to be used accordingly to + * {@link http://incubator.apache.org/zetacomponents/documentation/trunk/Database/tutorial.html ezcDatabase} usage + * + * This method might return true if $field needs to be updated after storage done here (to store a PK for instance). + * In any other case, this method must not return anything (null). + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return null|true + */ + public function storeFieldData( VersionInfo $versionInfo, Field $field, array $context ); + + /** + * Populates $field value property based on the external data. + * $field->value is a {@link eZ\Publish\SPI\Persistence\Content\FieldValue} object. + * This value holds the data as a {@link eZ\Publish\Core\FieldType\Value} based object, + * according to the field type (e.g. for TextLine, it will be a {@link eZ\Publish\Core\FieldType\TextLine\Value} object). + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return void + */ + public function getFieldData( VersionInfo $versionInfo, Field $field, array $context ); + + /** + * Deletes field data for all $fieldIds in the version identified by + * $versionInfo. + * + * @param \eZ\Publish\SPI\Persistence\Content\VersionInfo $versionInfo + * @param array $fieldIds Array of field IDs + * @param array $context + * + * @return boolean + */ + public function deleteFieldData( VersionInfo $versionInfo, array $fieldIds, array $context ); + + /** + * Checks if field type has external data to deal with + * + * @return boolean + */ + public function hasFieldData(); + + /** + * Get index data for external data for search backend + * + * @param \eZ\Publish\SPI\Persistence\Content\Field $field + * @param array $context + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( VersionInfo $versionInfo, Field $field, array $context ); +} diff --git a/eZ/Publish/SPI/FieldType/FieldType.php b/eZ/Publish/SPI/FieldType/FieldType.php new file mode 100644 index 0000000..73b5e54 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/FieldType.php @@ -0,0 +1,326 @@ +<?php +/** + * File containing the FieldType interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType; + +use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; +use eZ\Publish\SPI\Persistence\Content\FieldValue; +use eZ\Publish\SPI\FieldType\Event; + +/** + * The field type interface which all field types have to implement. + * + * + * Hashes: + * + * The {@link toHash()} method in this class is meant to generate a simple + * representation of a value of this field type. Hash does here not refer to + * MD5 or similar hashing algorithms, but rather to hash-map (associative array) + * type representation. This representation must be + * usable, to transfer the value over plain text encoding formats, like e.g. + * XML. As a result, the returned "hash" must either be a scalar value, a hash + * array (associative array) a pure numeric array or a nested combination of + * these. It must by no means contain objects, resources or cyclic references. + * The corresponding {@link fromHash()} method must convert such a + * representation back into a value, which is understood by the FieldType. + */ +interface FieldType +{ + /** + * Returns the field type identifier for this field type + * + * This identifier should be globally unique and the implementer of a + * FieldType must take care for the uniqueness. It is therefore recommended + * to prefix the field-type identifier by a unique string that identifies + * the implementer. A good identifier could for example take your companies main + * domain name as a prefix in reverse order. + * + * @return string + */ + public function getFieldTypeIdentifier(); + + /** + * Returns a human readable string representation from the given $value + * + * It will be used to generate content name and url alias if current field + * is designated to be used in the content name/urlAlias pattern. + * + * The used $value can be assumed to be already accepted by {@link + * acceptValue()}. + * + * @param mixed $value + * + * @return string + */ + public function getName( $value ); + + /** + * Returns a schema for the settings expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the settings of + * the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementer to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * @return mixed + */ + public function getSettingsSchema(); + + /** + * Returns a schema for the validator configuration expected by the FieldType + * + * Returns an arbitrary value, representing a schema for the validator + * configuration of the FieldType. + * + * Explanation: There are no possible generic schemas for defining settings + * input, which is why no schema for the return value of this method is + * defined. It is up to the implementer to define and document a schema for + * the return value and document it. In addition, it is necessary that all + * consumers of this interface (e.g. Public API, REST API, GUIs, ...) + * provide plugin mechanisms to hook adapters for the specific FieldType + * into. These adapters then need to be either shipped with the FieldType + * or need to be implemented by a third party. If there is no adapter + * available for a specific FieldType, it will not be usable with the + * consumer. + * + * Best practice: + * + * It is considered best practice to return a hash map, which contains + * rudimentary settings structures, like e.g. for the "ezstring" FieldType + * + * <code> + * array( + * 'stringLength' => array( + * 'minStringLength' => array( + * 'type' => 'int', + * 'default' => 0, + * ), + * 'maxStringLength' => array( + * 'type' => 'int' + * 'default' => null, + * ) + * ), + * ); + * </code> + * + * @return mixed + */ + public function getValidatorConfigurationSchema(); + + /** + * Validates a field based on the validator configuration in the field definition + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException + * + * @param \eZ\Publish\API\Repository\Values\ContentType\FieldDefinition $fieldDef The field definition of the field + * @param \eZ\Publish\API\Repository\Values\Content\Field $field The field for which an action is performed + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validate( FieldDefinition $fieldDef, $field ); + + /** + * Validates the validatorConfiguration of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * This methods determines if the given $validatorConfiguration is + * structurally correct and complies to the validator configuration schema + * returned by {@link getValidatorConfigurationSchema()}. + * + * @param mixed $validatorConfiguration + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateValidatorConfiguration( $validatorConfiguration ); + + /** + * Validates the fieldSettings of a FieldDefinitionCreateStruct or FieldDefinitionUpdateStruct + * + * This methods determines if the given $fieldSettings are structurally + * correct and comply to the settings schema returned by {@link + * getSettingsSchema()}. + * + * @param mixed $fieldSettings + * + * @return \eZ\Publish\SPI\FieldType\ValidationError[] + */ + public function validateFieldSettings( $fieldSettings ); + + /** + * Indicates if the field type supports indexing and sort keys for searching + * + * @return boolean + */ + public function isSearchable(); + + /** + * Returns the empty value for this field type. + * + * This value will be used, if no value was provided for a field of this + * type and no default value was specified in the field definition. It is + * also used to determine that a user intentionally (or unintentionally) did not + * set a non-empty value. + * + * @return mixed + */ + public function getEmptyValue(); + + /** + * Returns if the given $value is considered empty by the field type + * + * Usually, only the value returned by {@link getEmptyValue()} is + * considered empty. The given $value can be safely assumed to have already + * been processed by {@link acceptValue()}. + * + * @param mixed $value + * + * @return boolean + */ + public function isEmptyValue( $value ); + + /** + * Potentially builds and checks the type and structure of the $inputValue. + * + * This method first inspects $inputValue and convert it into a dedicated + * value object. + * + * After that, the value is checked for structural validity. + * Note that this does not include validation after the rules + * from validators, but only plausibility checks for the general data + * format. + * + * Note that this method must also cope with the empty value for the field + * type as e.g. returned by {@link getEmptyValue()}. + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the parameter is not of the supported value sub type + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if the value does not match the expected structure + * + * @param mixed $inputValue + * + * @return \eZ\Publish\Core\FieldType\Value The potentially converted and structurally plausible value. + */ + public function acceptValue( $inputValue ); + + /** + * Converts an $hash to the Value defined by the field type + * + * This is the reverse operation to {@link toHash()}. At least the hash + * format generated by {@link toHash()} must be converted in reverse. + * Additional formats might be supported in the rare case that this is + * necessary. See the class description for more details on a hash format. + * + * @param mixed $hash + * + * @return mixed + */ + public function fromHash( $hash ); + + /** + * Converts the given $value into a plain hash format + * + * Converts the given $value into a plain hash format, which can be used to + * transfer the value through plain text formats, e.g. XML, which do not + * support complex structures like objects. See the class level doc block + * for additional information. See the class description for more details on a hash format. + * + * @param mixed $value + * + * @return mixed + */ + public function toHash( $value ); + + /** + * Converts the given $fieldSettings to a simple hash format + * + * See the class description for more details on a hash format. + * + * @param mixed $fieldSettings + * + * @return array|hash|scalar|null + */ + public function fieldSettingsToHash( $fieldSettings ); + + /** + * Converts the given $fieldSettingsHash to field settings of the type + * + * This is the reverse operation of {@link fieldSettingsToHash()}. + * See the class description for more details on a hash format. + * + * @param array|hash|scalar|null $fieldSettingsHash + * + * @return mixed + */ + public function fieldSettingsFromHash( $fieldSettingsHash ); + + /** + * Converts the given $validatorConfiguration to a simple hash format + * + * See the class description for more details on a hash format. + * + * @param mixed $validatorConfiguration + * + * @return array|hash|scalar|null + */ + public function validatorConfigurationToHash( $validatorConfiguration ); + + /** + * Converts the given $validatorConfigurationHash to a validator + * configuration of the type + * + * See the class description for more details on a hash format. + * + * @param array|hash|scalar|null $validatorConfigurationHash + * + * @return mixed + */ + public function validatorConfigurationFromHash( $validatorConfigurationHash ); + + /** + * Converts a $value to a persistence value. + * + * In this method the field type puts the data which is stored in the field of content in the repository + * into the property FieldValue::data. The format of $data is a primitive, an array (map) or an object, which + * is then canonically converted to e.g. json/xml structures by future storage engines without + * further conversions. For mapping the $data to the legacy database an appropriate Converter + * (implementing eZ\Publish\Core\Persistence\Legacy\FieldValue\Converter) has implemented for the field + * type. Note: $data should only hold data which is actually stored in the field. It must not + * hold data which is stored externally. + * + * The $externalData property in the FieldValue is used for storing data externally by the + * FieldStorage interface method storeFieldData. + * + * The FieldValuer::sortKey is build by the field type for using by sort operations. + * + * @see \eZ\Publish\SPI\Persistence\Content\FieldValue + * + * @param mixed $value The value of the field type + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue the value processed by the storage engine + */ + public function toPersistenceValue( $value ); + + /** + * Converts a persistence $fieldValue to a Value + * + * This method builds a field type value from the $data and $externalData properties. + * + * @param \eZ\Publish\SPI\Persistence\Content\FieldValue $fieldValue + * + * @return mixed + */ + public function fromPersistenceValue( FieldValue $fieldValue ); +} diff --git a/eZ/Publish/SPI/FieldType/Indexable.php b/eZ/Publish/SPI/FieldType/Indexable.php new file mode 100644 index 0000000..e30e490 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/Indexable.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the FieldType Indexable interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Field; + +/** + * The field type interface which all field types have to implement to be + * indexable by search backends. + * + * @package FieldTypeProviderInterface + */ +interface Indexable +{ + /** + * Get index data for field for search backend + * + * @param Field $field + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\Field[] + */ + public function getIndexData( Field $field ); + + /** + * Get index field types for search backend + * + * @return \eZ\Publish\SPI\Persistence\Content\Search\FieldType[] + */ + public function getIndexDefinition(); +} + diff --git a/eZ/Publish/SPI/FieldType/ValidationError.php b/eZ/Publish/SPI/FieldType/ValidationError.php new file mode 100644 index 0000000..1e0a723 --- /dev/null +++ b/eZ/Publish/SPI/FieldType/ValidationError.php @@ -0,0 +1,26 @@ +<?php +/** + * File containing the ValidationError interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\FieldType; + +use eZ\Publish\API\Repository\Translatable; + +/** + * Interface for validation errors. + * + * Enforces to return a translatable message, since it will be necessary to + * present validation errors to the user. Thus we need plural form handling and + * replacements of placeholders and so on. + * + * @package FieldTypeProviderInterface + */ +interface ValidationError extends Translatable +{ +} + diff --git a/eZ/Publish/SPI/IO/BinaryFile.php b/eZ/Publish/SPI/IO/BinaryFile.php new file mode 100644 index 0000000..084561d --- /dev/null +++ b/eZ/Publish/SPI/IO/BinaryFile.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing the \eZ\Publish\SPI\IO\BinaryFile class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\IO; + +/** + * This class provides an abstract access to binary files. + * + * It allows reading & writing of files in a unified way + */ + +class BinaryFile +{ + /** + * Relative path to the file + * + * @var string + */ + public $path; + + /** + * File size, in bytes + * + * @var int + */ + public $size; + + /** + * File modification time + * + * @var \DateTime + */ + public $mtime; + + /** + * File creation time + * + * @var \DateTime + */ + public $ctime; + + /** + * File mime type (aka contentType, like image/jpeg, audio/mp3, etc) + * + * @var string + */ + public $mimeType; + + /** + * HTTP URI to the binary file + * + * @var string + */ + public $uri; + + /** + * Original file name + * + * @var string + */ + public $originalFile; +} diff --git a/eZ/Publish/SPI/IO/BinaryFileCreateStruct.php b/eZ/Publish/SPI/IO/BinaryFileCreateStruct.php new file mode 100644 index 0000000..57a025a --- /dev/null +++ b/eZ/Publish/SPI/IO/BinaryFileCreateStruct.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the \eZ\Publish\SPI\IO\BinaryFileCreateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\IO; + +/** + * Create struct for BinaryFile objects + */ +class BinaryFileCreateStruct extends BinaryFile +{ + /** + * @var resource + */ + private $inputStream; + + /** + * Returns the file's input resource + * + * @return resource + */ + public function getInputStream() + { + return $this->inputStream; + } + + /** + * Sets the file's input resource + * + * @param resource $inputStream + */ + public function setInputStream( $inputStream ) + { + $this->inputStream = $inputStream; + } +} diff --git a/eZ/Publish/SPI/IO/BinaryFileUpdateStruct.php b/eZ/Publish/SPI/IO/BinaryFileUpdateStruct.php new file mode 100644 index 0000000..e2665be --- /dev/null +++ b/eZ/Publish/SPI/IO/BinaryFileUpdateStruct.php @@ -0,0 +1,41 @@ +<?php +/** + * File containing the \eZ\Publish\SPI\IO\BinaryFileUpdateStruct class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\IO; + +/** + * Update struct for BinaryFile objects + */ +class BinaryFileUpdateStruct extends BinaryFile +{ + /** + * @var resource + */ + private $inputStream; + + /** + * Returns the file's input resource + * + * @return resource + */ + public function getInputStream() + { + return $this->inputStream; + } + + /** + * Sets the file's input resource + * + * @param resource $inputStream + */ + public function setInputStream( $inputStream ) + { + $this->inputStream = $inputStream; + } +} diff --git a/eZ/Publish/SPI/IO/Handler.php b/eZ/Publish/SPI/IO/Handler.php new file mode 100644 index 0000000..71b5cba --- /dev/null +++ b/eZ/Publish/SPI/IO/Handler.php @@ -0,0 +1,92 @@ +<?php +/** + * File containing the \eZ\Publish\SPI\IO\Handler interface. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\IO; + +/** + * Backend interface for handling of binary files I/O + */ + +interface Handler +{ + /** + * Creates and stores a new BinaryFile based on the BinaryFileCreateStruct $file + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the target path already exists + * + * @param \eZ\Publish\SPI\IO\BinaryFileCreateStruct $createFilestruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The newly created BinaryFile object + */ + public function create( BinaryFileCreateStruct $createFilestruct ); + + /** + * Deletes the existing BinaryFile with path $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the file doesn't exist + * + * @param string $path + */ + public function delete( $path ); + + /** + * Updates the file identified by $path with data from $updateFile + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If the source path doesn't exist + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If the target path already exists + * + * @param string $path + * @param \eZ\Publish\SPI\IO\BinaryFileUpdateStruct $updateFileStruct + * + * @return \eZ\Publish\SPI\IO\BinaryFile The updated BinaryFile + */ + public function update( $path, BinaryFileUpdateStruct $updateFileStruct ); + + /** + * Checks if the BinaryFile with path $path exists + * + * @param string $path + * + * @return boolean + */ + public function exists( $path ); + + /** + * Loads the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return \eZ\Publish\SPI\IO\BinaryFile + */ + public function load( $path ); + + /** + * Returns a file resource to the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If no file identified by $path exists + * + * @param string $path + * + * @return resource + */ + public function getFileResource( $path ); + + /** + * Returns the contents of the BinaryFile identified by $path + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the file couldn't be found + * + * @param string $path + * + * @return string + */ + public function getFileContents( $path ); +} diff --git a/eZ/Publish/SPI/Limitation/Type.php b/eZ/Publish/SPI/Limitation/Type.php new file mode 100644 index 0000000..73601e4 --- /dev/null +++ b/eZ/Publish/SPI/Limitation/Type.php @@ -0,0 +1,89 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Limitation\Type class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Limitation; + +use eZ\Publish\API\Repository\Values\ValueObject as APIValueObject; +use eZ\Publish\API\Repository\Values\User\Limitation as APILimitationValue; +use eZ\Publish\API\Repository\Values\User\User as APIUser; + +/** + * This interface represent the Limitation Type + */ +interface Type +{ + /** + * Constants for valueSchema() return values + * + * Used in cases where a certain value is accepted but the options are to many to return as a hash of options. + * GUI should typically present option to browse content tree to select limitation value(s). + */ + const VALUE_SCHEMA_LOCATION_ID = 1; + const VALUE_SCHEMA_LOCATION_PATH = 2; + + /** + * Accepts a Limitation value + * + * Makes sure LimitationValue object is of correct type and that ->limitationValues + * is valid according to valueSchema(). + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $limitationValue + * + * @return boolean + */ + public function acceptValue( APILimitationValue $limitationValue ); + + /** + * Create the Limitation Value + * + * The is the method to create values as Limitation type needs value knowledge anyway in acceptValue, + * the reverse relation is provided by means of identifier lookup (Value has identifier, and so does RoleService). + * + * @param mixed[] $limitationValues + * + * @return \eZ\Publish\API\Repository\Values\User\Limitation + */ + public function buildValue( array $limitationValues ); + + /** + * Evaluate permission against content and placement + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If any of the arguments are invalid + * Example: If LimitationValue is instance of ContentTypeLimitationValue, and Type is SectionLimitationType. + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If value of the LimitationValue is unsupported + * Example if OwnerLimitationValue->limitationValues[0] is not one of: [ 1, 2 ] + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * @param \eZ\Publish\API\Repository\Values\ValueObject $object + * @param \eZ\Publish\API\Repository\Values\ValueObject|null $target The location, parent or "assignment" value object + * + * @return boolean + */ + public function evaluate( APILimitationValue $value, APIUser $currentUser, APIValueObject $object, APIValueObject $target = null ); + + /** + * Returns Criterion for use in find() query + * + * @param \eZ\Publish\API\Repository\Values\User\Limitation $value + * @param \eZ\Publish\API\Repository\Values\User\User $currentUser + * + * @return \eZ\Publish\API\Repository\Values\Content\Query\CriterionInterface + */ + public function getCriterion( APILimitationValue $value, APIUser $currentUser ); + + /** + * Returns info on valid $limitationValues + * + * @return mixed[]|int In case of array, a hash with key as valid limitations value and value as human readable name + * of that option, in case of int on of VALUE_SCHEMA_* constants. + * Note: The hash might be an instance of Traversable, and not a native php array. + */ + public function valueSchema(); +} diff --git a/eZ/Publish/SPI/Persistence/Content.php b/eZ/Publish/SPI/Persistence/Content.php new file mode 100644 index 0000000..1a6a0c0 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the Content class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence; + +/** + * Content value object, bound to a version. + * This object aggregates the following: + * - Version metadata + * - Content metadata + * - Fields + * - Locations + */ +class Content extends ValueObject +{ + /** + * VersionInfo object for this content's version. + * + * @var \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + public $versionInfo; + + /** + * Field objects for this content. + * + * @var \eZ\Publish\SPI\Persistence\Content\Field[] + */ + public $fields; +} diff --git a/eZ/Publish/SPI/Persistence/Content/ContentInfo.php b/eZ/Publish/SPI/Persistence/Content/ContentInfo.php new file mode 100644 index 0000000..91d429d --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/ContentInfo.php @@ -0,0 +1,119 @@ +<?php +/** + * File containing the ContentInfo class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * This class provides all version independent information of the content object. + * It is similar to {@link \eZ\Publish\Core\Repository\Values\Content\ContentInfo}, but for the persistence layer. + * Thus it only contains raw data. + */ +class ContentInfo extends ValueObject +{ + const STATUS_DRAFT = 0; + const STATUS_PUBLISHED = 1; + const STATUS_ARCHIVED = 2; + + /** + * Content's unique ID + * + * @var mixed + */ + public $id; + + /** + * Computed name (via name schema) in the main language + * + * @var string + */ + public $name; + + /** + * Content type Id + * + * @var int + */ + public $contentTypeId; + + /** + * Section id the content is assigned to + * + * @var int + */ + public $sectionId; + + /** + * Version number of the current published version. + * If the content is not published yet (newly created draft), will be 1 + * + * @var int + */ + public $currentVersionNo; + + /** + * Flag indicating if content is currently published + * + * @var boolean + */ + public $isPublished; + + /** + * Content owner's id + * + * @var int + */ + public $ownerId; + + /** + * Content modification date, as a UNIX timestamp + * + * @var int + */ + public $modificationDate; + + /** + * Content publication date, as a UNIX timestamp + * + * @var int + */ + public $publicationDate; + + /** + * Indicates if the content is shown in the main language if its not present in an other requested language + * + * @var boolean + */ + public $alwaysAvailable; + + /** + * Remote identifier used as a custom identifier for the object + * + * @var string + */ + public $remoteId; + + /** + * The main language code of the content. + * + * @var string + */ + public $mainLanguageCode; + + /** + * Identifier of the main location. + * + * If the content object has multiple locations, + * $mainLocationId will point to the main one. + * + * @var mixed + */ + public $mainLocationId; +} diff --git a/eZ/Publish/SPI/Persistence/Content/CreateStruct.php b/eZ/Publish/SPI/Persistence/Content/CreateStruct.php new file mode 100644 index 0000000..b6df7b1 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/CreateStruct.php @@ -0,0 +1,81 @@ +<?php +/** + * File containing the Content CreateStruct struct + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class CreateStruct extends ValueObject +{ + /** + * @var string[] Eg. array( 'eng-GB' => "New Article" ) + */ + public $name; + + /** + * @var int + */ + public $typeId; + + /** + * @var int + */ + public $sectionId; + + /** + * @var int + */ + public $ownerId; + + /** + * ContentId, contentVersion and mainLocationId are allowed to be left empty + * when used on with this struct as these values are created by the create method. + * + * @var \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct[] + */ + public $locations = array(); + + /** + * Contains *all* fields of the object to be created. + * + * This attribute should contain *all* fields (in all language) of the + * object to be created. If a field is not translatable, it may only occur + * once. The storage layer will automatically take care that such fields + * are assigned to each language version. + * + * @var Field[] + */ + public $fields = array(); + + /** + * @var boolean Always available flag + */ + public $alwaysAvailable = false; + + /** + * @var string Remote identifier used as a custom identifier for the object + */ + public $remoteId; + + /** + * Language id the content was initially created in + * + * @var mixed + */ + public $initialLanguageId; + + /** + * Modification date + * + * @var int + */ + public $modified; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Field.php b/eZ/Publish/SPI/Persistence/Content/Field.php new file mode 100644 index 0000000..f03933b --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Field.php @@ -0,0 +1,58 @@ +<?php +/** + * File containing the (content) Field class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class Field extends ValueObject +{ + /** + * Field ID + * + * @var mixed + */ + public $id; + + /** + * Corresponding field definition + * + * @var mixed + */ + public $fieldDefinitionId; + + /** + * Data type name. + * + * @var string + */ + public $type; + + /** + * Value of the field + * + * @var \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public $value; + + /** + * Language code of this Field + * + * @var string + */ + public $languageCode; + + /** + * @var int|null Null if not created yet + * @todo Normally we would use a create struct here + */ + public $versionNo; +} diff --git a/eZ/Publish/SPI/Persistence/Content/FieldTypeConstraints.php b/eZ/Publish/SPI/Persistence/Content/FieldTypeConstraints.php new file mode 100644 index 0000000..9f445ed --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/FieldTypeConstraints.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the FieldTypeConstraints class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +class FieldTypeConstraints extends ValueObject +{ + /** + * Validator settings compatible to the corresponding FieldType + * + * This property contains validator settings as defined by the fields type. + * Note that contents of this property must be serializable and exportable + * (i.e. no circular references, resources and friends). + * + * @see \eZ\Publish\SPI\FieldType\FieldType + * @var mixed + */ + public $validators; + + /** + * Field settings compatible to the corresponding FieldType + * + * This property contains field settings as defined by the fields type. + * Note that contents of this property must be serializable and exportable + * (i.e. no circular references, resources and friends). + * + * @see \eZ\Publish\SPI\FieldType\FieldType + * @var mixed + */ + public $fieldSettings; +} diff --git a/eZ/Publish/SPI/Persistence/Content/FieldValue.php b/eZ/Publish/SPI/Persistence/Content/FieldValue.php new file mode 100644 index 0000000..2f8d24b --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/FieldValue.php @@ -0,0 +1,48 @@ +<?php +/** + * File containing the (content) FieldValue class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class FieldValue extends ValueObject +{ + /** + * Mixed field data + * + * Either a primitive, an array (map) or an object + * + * @note: For the legacy storage engine we will need adaptors to map them to + * the existing database fields, like data_int, data_float, data_text. + * + * @var mixed + */ + public $data; + + /** + * Data which is not stored in the field but at an external place. + * This data is processed by the field type storage interface method + * storeFieldData + * + * @var mixed + */ + public $externalData; + + /** + * A value which can be used for sorting + * + * @note: For the "old" storage engine we will need adaptors to map them to + * the existing database fields, like sort_key_int, sort_key_string + * + * @var mixed + */ + public $sortKey; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Handler.php b/eZ/Publish/SPI/Persistence/Content/Handler.php new file mode 100644 index 0000000..a316d1c --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Handler.php @@ -0,0 +1,243 @@ +<?php +/** + * File containing the Content Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +// @todo We must verify whether we want to type cast on the "Criterion" interface or abstract class +use eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct as RelationCreateStruct; + +/** + * The Content Handler interface defines content operations on the storage engine. + * + * The basic operations which are performed on content objects are collected in + * this interface. Typically this interface would be used by a service managing + * business logic for content objects. + */ +interface Handler +{ + /** + * Creates a new Content entity in the storage engine. + * + * The values contained inside the $content will form the basis of stored + * entity. + * + * Will contain always a complete list of fields. + * + * @param \eZ\Publish\SPI\Persistence\Content\CreateStruct $content Content creation struct. + * + * @return \eZ\Publish\SPI\Persistence\Content Content value object + */ + public function create( CreateStruct $content ); + + /** + * Creates a new draft version from $contentId in $srcVersion number. + * + * Copies all fields from $contentId in $srcVersion and creates a new + * version of the referred Content from it. + * + * @param mixed $contentId + * @param mixed $srcVersion + * @param mixed $userId + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function createDraftFromVersion( $contentId, $srcVersion, $userId ); + + /** + * Returns the raw data of a content object identified by $id, in a struct. + * + * A version to load must be specified. If you want to load the current + * version of a content object use SearchHandler::findSingle() with the + * ContentId criterion. + * + * Optionally a translation filter may be specified. If specified only the + * translations with the listed language codes will be retrieved. If not, + * all translations will be retrieved. + * + * @param int|string $id + * @param int|string $version + * @param string[] $translations + * + * @return \eZ\Publish\SPI\Persistence\Content Content value object + */ + public function load( $id, $version, $translations = null ); + + /** + * Returns the metadata object for a content identified by $contentId. + * + * @param int|string $contentId + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public function loadContentInfo( $contentId ); + + /** + * Returns the version object for a content/version identified by $contentId and $versionNo + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If version is not found + * + * @param int|string $contentId + * @param int $versionNo Version number to load + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo + */ + public function loadVersionInfo( $contentId, $versionNo ); + + /** + * Returns all versions with draft status created by the given $userId + * + * @param int $userId + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo[] + */ + public function loadDraftsForUser( $userId ); + + /** + * Sets the status of object identified by $contentId and $version to $status. + * + * The $status can be one of VersionInfo::STATUS_DRAFT, VersionInfo::STATUS_PUBLISHED, VersionInfo::STATUS_ARCHIVED + * When status is set to VersionInfo::STATUS_PUBLISHED content status is updated to ContentInfo::STATUS_PUBLISHED + * + * @param int $contentId + * @param int $status + * @param int $version + * + * @return boolean + */ + public function setStatus( $contentId, $status, $version ); + + /** + * Updates a content object meta data, identified by $contentId + * + * @param int $contentId + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $content + * + * @return \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public function updateMetadata( $contentId, MetadataUpdateStruct $content ); + + /** + * Updates a content version, identified by $contentId and $versionNo + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\UpdateStruct $content + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function updateContent( $contentId, $versionNo, UpdateStruct $content ); + + /** + * Deletes all versions and fields, all locations (subtree), and all relations. + * + * Removes the relations, but not the related objects. All subtrees of the + * assigned nodes of this content objects are removed (recursively). + * + * @param int $contentId + * + * @return boolean + */ + public function deleteContent( $contentId ); + + /** + * Deletes given version, its fields, node assignment, relations and names. + * + * Removes the relations, but not the related objects. + * + * @param int $contentId + * @param int $versionNo + * + * @return boolean + */ + public function deleteVersion( $contentId, $versionNo ); + + /** + * Returns the versions for $contentId + * + * @param int $contentId + * + * @return \eZ\Publish\SPI\Persistence\Content\VersionInfo[] + */ + public function listVersions( $contentId ); + + /** + * Copy Content with Fields and Versions from $contentId in $version. + * + * Copies all fields from $contentId in $version (or all versions if false) + * to a new object which is returned. Version numbers are maintained. + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If content or version is not found + * + * @param mixed $contentId + * @param mixed|null $versionNo Copy all versions if left null + * + * @return \eZ\Publish\SPI\Persistence\Content + */ + public function copy( $contentId, $versionNo = null ); + + /** + * Creates a relation between $sourceContentId in $sourceContentVersionNo + * and $destinationContentId with a specific $type. + * + * @todo Should the existence verifications happen here or is this supposed to be handled at a higher level? + * + * @param \eZ\Publish\SPI\Persistence\Content\Relation\CreateStruct $createStruct + * + * @return \eZ\Publish\SPI\Persistence\Content\Relation + */ + public function addRelation( RelationCreateStruct $createStruct ); + + /** + * Removes a relation by relation Id. + * + * @todo Should the existence verifications happen here or is this supposed to be handled at a higher level? + * + * @param mixed $relationId + */ + public function removeRelation( $relationId ); + + /** + * Loads relations from $sourceContentId. Optionally, loads only those with $type and $sourceContentVersionNo. + * + * @param mixed $sourceContentId Source Content ID + * @param mixed|null $sourceContentVersionNo Source Content Version, null if not specified + * @param int|null $type {@see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD} + * @return \eZ\Publish\SPI\Persistence\Content\Relation[] + */ + public function loadRelations( $sourceContentId, $sourceContentVersionNo = null, $type = null ); + + /** + * Loads relations from $contentId. Optionally, loads only those with $type. + * + * Only loads relations against published versions. + * + * @param mixed $destinationContentId Destination Content ID + * @param int|null $type {@see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD} + * @return \eZ\Publish\SPI\Persistence\Content\Relation[] + */ + public function loadReverseRelations( $destinationContentId, $type = null ); + + /** + * Performs the publishing operations required to set the version identified by $updateStruct->versionNo and + * $updateStruct->id as the published one. + * + * @param int $contentId + * @param int $versionNo + * @param \eZ\Publish\SPI\Persistence\Content\MetadataUpdateStruct $metaDataUpdateStruct + * + * @return \eZ\Publish\SPI\Persistence\Content The published Content + */ + public function publish( $contentId, $versionNo, MetadataUpdateStruct $metaDataUpdateStruct ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Language.php b/eZ/Publish/SPI/Persistence/Content/Language.php new file mode 100644 index 0000000..4f89030 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Language.php @@ -0,0 +1,46 @@ +<?php +/** + * File containing the Language class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * Struct containing accessible properties on Language entities. + */ +class Language extends ValueObject +{ + /** + * Language ID. + * + * @var mixed + */ + public $id; + + /** + * Language Code (eg: eng-GB) + * + * @var string + */ + public $languageCode; + + /** + * Human readable language name + * + * @var string + */ + public $name; + + /** + * Indicates if language is enabled or not + * + * @var boolean + */ + public $isEnabled = true; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Language/CreateStruct.php b/eZ/Publish/SPI/Persistence/Content/Language/CreateStruct.php new file mode 100644 index 0000000..d366a22 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Language/CreateStruct.php @@ -0,0 +1,39 @@ +<?php +/** + * File containing the Language CreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Language; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * Struct containing accessible properties when creating Language entities. + */ +class CreateStruct extends ValueObject +{ + /** + * Language Code (eg: eng-GB) + * + * @var string + */ + public $languageCode; + + /** + * Human readable language name + * + * @var string + */ + public $name; + + /** + * Indicates if language is enabled or not + * + * @var boolean + */ + public $isEnabled = true; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Language/Handler.php b/eZ/Publish/SPI/Persistence/Content/Language/Handler.php new file mode 100644 index 0000000..d829e2e --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Language/Handler.php @@ -0,0 +1,75 @@ +<?php +/** + * File containing the Language Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Language; + +use eZ\Publish\SPI\Persistence\Content\Language; +use eZ\Publish\SPI\Persistence\Content\Language\CreateStruct; + +/** + * Language Handler interface + */ +interface Handler +{ + /** + * Create a new language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language\CreateStruct $struct + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function create( CreateStruct $struct ); + + /** + * Update language + * + * @param \eZ\Publish\SPI\Persistence\Content\Language $struct + */ + public function update( Language $struct ); + + /** + * Get language by id + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $id + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function load( $id ); + + /** + * Get language by Language Code (eg: eng-GB) + * + * @param string $languageCode + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If language could not be found by $languageCode + * + * @return \eZ\Publish\SPI\Persistence\Content\Language + */ + public function loadByLanguageCode( $languageCode ); + + /** + * Get all languages + * + * Return list of languages where key of hash is language code. + * + * @return \eZ\Publish\SPI\Persistence\Content\Language[] + */ + public function loadAll(); + + /** + * Delete a language + * + * @throws \LogicException If language could not be deleted + * + * @param mixed $id + */ + public function delete( $id ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Location.php b/eZ/Publish/SPI/Persistence/Content/Location.php new file mode 100644 index 0000000..cab11e9 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Location.php @@ -0,0 +1,142 @@ +<?php +/** + * File containing the Location class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * Struct containing accessible properties on Location entities. + */ +class Location extends ValueObject +{ + // Following constants borrowed from eZContentObjectTreeNode, for data compatibility. + // Actual names ought to be changed to better match current concepts. + const SORT_FIELD_PATH = 1; + const SORT_FIELD_PUBLISHED = 2; + const SORT_FIELD_MODIFIED = 3; + const SORT_FIELD_SECTION = 4; + const SORT_FIELD_DEPTH = 5; + const SORT_FIELD_CLASS_IDENTIFIER = 6; + const SORT_FIELD_CLASS_NAME = 7; + const SORT_FIELD_PRIORITY = 8; + const SORT_FIELD_NAME = 9; + const SORT_FIELD_MODIFIED_SUBNODE = 10; + const SORT_FIELD_NODE_ID = 11; + const SORT_FIELD_CONTENTOBJECT_ID = 12; + + const SORT_ORDER_DESC = 0; + const SORT_ORDER_ASC = 1; + + /** + * Location ID. + * + * @var mixed Location ID. + */ + public $id; + + /** + * Location priority + * + * Position of the Location among its siblings when sorted using priority + * sort order. + * + * @var int + */ + public $priority; + + /** + * Indicates that the Location entity has been explicitly marked as hidden. + * + * @var boolean + */ + public $hidden; + + /** + * Indicates that the Location is implicitly marked as hidden by a parent + * location. + * + * @var boolean + */ + public $invisible; + + /** + * Remote ID. + * + * A universally unique identifier. + * + * @var mixed + */ + public $remoteId; + + /** + * ID of the corresponding {@link \eZ\Publish\SPI\Persistence\Content}. + * + * @var mixed Content ID. + */ + public $contentId; + + /** + * Parent ID. + * + * @var mixed Location ID. + */ + public $parentId; + + /** + * Legacy format of the url alias. + * + * This field might be removed in a later version. + * + * @var string + */ + public $pathIdentificationString; + + /** + * The materialized path of the location entry, eg: /1/2/ + * + * @var string + */ + public $pathString; + + /** + * Identifier of the main location. + * + * If the content object in this location has multiple locations, + * $mainLocationId will point to the main one. + * + * @var mixed + */ + public $mainLocationId; + + /** + * Depth location has in the location tree. + * + * @var int + */ + public $depth; + + /** + * Specifies which property the child locations should be sorted on. + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField; + + /** + * Specifies whether the sort order should be ascending or descending. + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Location/CreateStruct.php b/eZ/Publish/SPI/Persistence/Content/Location/CreateStruct.php new file mode 100644 index 0000000..de1c31f --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Location/CreateStruct.php @@ -0,0 +1,109 @@ +<?php +/** + * File containing the Location CreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Location; + +use eZ\Publish\SPI\Persistence\ValueObject; + +class CreateStruct extends ValueObject +{ + /** + * Location priority + * + * Position of the Location among its siblings when sorted using priority + * sort order. + * + * @var int + */ + public $priority = 0; + + /** + * Indicates that the Location entity has been explicitly marked as hidden. + * + * @var boolean + */ + public $hidden = false; + + /** + * Indicates that the Location is implicitly marked as hidden by a parent + * location. + * + * @var boolean + */ + public $invisible = false; + + /** + * Remote ID. + * + * A universally unique identifier. + * + * @var mixed + */ + public $remoteId; + + /** + * ID of the corresponding {@link Content}. + * + * @var mixed Content ID. + */ + public $contentId; + + /** + * version of the corresponding {@link Content}. + * @todo Rename to $contentVersionNo? + * + * @var int Content version. + */ + public $contentVersion; + + /** + * Legacy format of the url alias. + * + * This field might be removed in a later version. + * + * @var string + */ + public $pathIdentificationString; + + /** + * Identifier of the main location. + * + * If the content object in this location has multiple locations, + * $mainLocationId will point to the main one. + * This is allowed to be set to true, this will mean this should become main location + * (@todo Find a better way to deal with being able to create the main location) + * + * @var mixed|true + */ + public $mainLocationId = true; + + /** + * Specifies which property the child locations should be sorted on. + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField; + + /** + * Specifies whether the sort order should be ascending or descending. + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder; + + /** + * Parent location's Id + * @var int + */ + public $parentId; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Location/Handler.php b/eZ/Publish/SPI/Persistence/Content/Location/Handler.php new file mode 100644 index 0000000..e9bb9a5 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Location/Handler.php @@ -0,0 +1,184 @@ +<?php +/** + * File containing the Location Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Location; + +use eZ\Publish\SPI\Persistence\Content\Location; +use eZ\Publish\SPI\Persistence\Content\Location\CreateStruct; +use eZ\Publish\SPI\Persistence\Content\Location\UpdateStruct; + +/** + * The Location Handler interface defines operations on Location elements in the storage engine. + */ +interface Handler +{ + /** + * Loads the data for the location identified by $locationId. + * + * @param int $locationId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function load( $locationId ); + + /** + * Loads the data for the location identified by $remoteId. + * + * @param string $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function loadByRemoteId( $remoteId ); + + /** + * Loads all locations for $contentId, optionally limited to a sub tree + * identified by $rootLocationId + * + * @param int $contentId + * @param int $rootLocationId + * + * @return \eZ\Publish\SPI\Persistence\Content\Location[] + */ + public function loadLocationsByContent( $contentId, $rootLocationId = null ); + + /** + * Copy location object identified by $sourceId, into destination identified by $destinationParentId. + * + * Performs a deep copy of the location identified by $sourceId and all of + * its child locations, copying the most recent published content object + * for each location to a new content object without any additional version + * information. Relations are not copied. URLs are not touched at all. + * + * @param mixed $sourceId + * @param mixed $destinationParentId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If $sourceId or $destinationParentId are invalid + * + * @return Location the newly created Location. + */ + public function copySubtree( $sourceId, $destinationParentId ); + + /** + * Moves location identified by $sourceId into new parent identified by $destinationParentId. + * + * Performs a full move of the location identified by $sourceId to a new + * destination, identified by $destinationParentId. Relations do not need + * to be updated, since they refer to Content. URLs are not touched. + * + * @param mixed $sourceId + * @param mixed $destinationParentId + * + * @return boolean + */ + public function move( $sourceId, $destinationParentId ); + + /** + * Marks the given nodes and all ancestors as modified + * + * Optionally a time stamp with the modification date may be specified, + * otherwise the current time is used. + * + * @param int|string $locationId + * @param int $timestamp + * + * @return void + */ + public function markSubtreeModified( $locationId, $timestamp = null ); + + /** + * Sets a location to be hidden, and it self + all children to invisible. + * + * @param mixed $id Location ID + */ + public function hide( $id ); + + /** + * Sets a location to be unhidden, and self + children to visible unless a parent is hiding the tree. + * If not make sure only children down to first hidden node is marked visible. + * + * @param mixed $id + */ + public function unHide( $id ); + + /** + * Swaps the content object being pointed to by a location object. + * + * Make the location identified by $locationId1 refer to the Content + * referred to by $locationId2 and vice versa. + * + * @param mixed $locationId1 + * @param mixed $locationId2 + * + * @return boolean + */ + public function swap( $locationId1, $locationId2 ); + + /** + * Updates an existing location. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\UpdateStruct $location + * @param int $locationId + * + * @return boolean + */ + public function update( UpdateStruct $location, $locationId ); + + /** + * Creates a new location rooted at $location->parentId. + * + * @param \eZ\Publish\SPI\Persistence\Content\Location\CreateStruct $location + * + * @return \eZ\Publish\SPI\Persistence\Content\Location + */ + public function create( CreateStruct $location ); + + /** + * Removes all Locations under and including $locationId. + * + * Performs a recursive delete on the location identified by $locationId, + * including all of its child locations. Content which is not referred to + * by any other location is automatically removed. Content which looses its + * main Location will get the first of its other Locations assigned as the + * new main Location. + * + * @param mixed $locationId + * + * @return boolean + */ + public function removeSubtree( $locationId ); + + /** + * Set section on all content objects in the subtree. + * Only main locations will be updated + * + * @todo This can be confusing (regarding permissions and main/multi location). + * So method is for the time being not in PublicAPI so people can instead + * write scripts using their own logic against the assignSectionToContent() api. + * + * @param mixed $locationId + * @param mixed $sectionId + * + * @return void + */ + public function setSectionForSubtree( $locationId, $sectionId ); + + /** + * Changes main location of content identified by given $contentId to location identified by given $locationId + * + * @param mixed $contentId + * @param mixed $locationId + * + * @return void + */ + public function changeMainLocation( $contentId, $locationId ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Location/Trash/Handler.php b/eZ/Publish/SPI/Persistence/Content/Location/Trash/Handler.php new file mode 100644 index 0000000..442cb49 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Location/Trash/Handler.php @@ -0,0 +1,93 @@ +<?php +/** + * File containing the Trash Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Location\Trash; + +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; + +/** + * The Trash Handler interface defines operations on Location elements in the storage engine. + */ +interface Handler +{ + /** + * Loads the data for the trashed location identified by $id. + * $id is the same as original location (which has been previously trashed) + * + * @param int $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trashed + */ + public function loadTrashItem( $id ); + + /** + * Sends a subtree starting to $locationId to the trash + * and returns a Trashed object corresponding to $locationId. + * + * Moves all locations in the subtree to the Trash. The associated content + * objects are left untouched. + * + * @param mixed $locationId + * + * @return null|\eZ\Publish\SPI\Persistence\Content\Location\Trashed null if location was deleted, otherwise Trashed object + */ + public function trashSubtree( $locationId ); + + /** + * Returns a trashed location to normal state. + * + * Recreates the originally trashed location in the new position. + * If this is not possible (because the old location does not exist any more), + * a ParentNotFound exception is thrown. + * + * Returns newly restored location Id. + * + * @param mixed $trashedId + * @param mixed $newParentId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If $newParentId is invalid + * + * @return int Newly restored location id + */ + public function recover( $trashedId, $newParentId ); + + /** + * Returns an array of all trashed locations satisfying the $criterion (if provided), + * sorted with SortClause objects contained in $sort (if any). + * If no criterion is provided (null), no filter is applied + * + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param int $offset Offset to start listing from, 0 by default + * @param int $limit Limit for the listing. Null by default (no limit) + * @param \eZ\Publish\API\Repository\Values\Content\Query\SortClause[] $sort + * + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trashed[] + */ + public function findTrashItems( Criterion $criterion = null, $offset = 0, $limit = null, array $sort = null ); + + /** + * Empties the trash + * Everything contained in the trash must be removed + * + * @return void + */ + public function emptyTrash(); + + /** + * Removes a trashed location identified by $trashedLocationId from trash + * Associated content has to be deleted + * + * @param int $trashedId + * + * @return void + */ + public function deleteTrashItem( $trashedId ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Location/Trashed.php b/eZ/Publish/SPI/Persistence/Content/Location/Trashed.php new file mode 100644 index 0000000..ac3185f --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Location/Trashed.php @@ -0,0 +1,20 @@ +<?php +/** + * File containing the TrashedLocation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Location; + +use eZ\Publish\SPI\Persistence\Content\Location; + +/** + * Struct containing accessible properties on TrashedLocation entities. + */ +class Trashed extends Location +{ +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Location/UpdateStruct.php b/eZ/Publish/SPI/Persistence/Content/Location/UpdateStruct.php new file mode 100644 index 0000000..a1fc09a --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Location/UpdateStruct.php @@ -0,0 +1,52 @@ +<?php +/** + * File containing the CreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Location; + +use eZ\Publish\SPI\Persistence\ValueObject; + +class UpdateStruct extends ValueObject +{ + /** + * Location priority + * + * Position of the Location among its siblings when sorted using priority + * sort order. + * + * @var int + */ + public $priority = 0; + + /** + * Remote ID. + * + * A universally unique identifier. + * + * @var mixed + */ + public $remoteId; + + /** + * Specifies which property the child locations should be sorted on. + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField; + + /** + * Specifies whether the sort order should be ascending or descending. + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder; +} diff --git a/eZ/Publish/SPI/Persistence/Content/MetadataUpdateStruct.php b/eZ/Publish/SPI/Persistence/Content/MetadataUpdateStruct.php new file mode 100644 index 0000000..66488da --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/MetadataUpdateStruct.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing the MetadataUpdateStruct struct + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class MetadataUpdateStruct extends ValueObject +{ + /** + * If set, this value changes the content's owner ID. + * + * @var int + */ + public $ownerId; + + /** + * If set, will change the content's "always-available" name + * + * @var string + */ + public $name; + + /** + * If set this value overrides the publication date of the content. + * Unix timestamp. + * + * @var int + */ + public $publicationDate; + + /** + * If set this value overrides the modification date. + * Unix timestamp. + * + * @var int + */ + public $modificationDate; + + /** + * If set, the content's main language will be changed. + * + * @var int + */ + public $mainLanguageId; + + /** + * If set, this value will change the always available flag. + * + * @var boolean + */ + public $alwaysAvailable; + + /** + * If set, this value will change the content's remote ID. + * + * @var string + */ + public $remoteId; +} diff --git a/eZ/Publish/SPI/Persistence/Content/ObjectState.php b/eZ/Publish/SPI/Persistence/Content/ObjectState.php new file mode 100644 index 0000000..5cf7349 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/ObjectState.php @@ -0,0 +1,86 @@ +<?php + +/** + * File containing the ObjectState class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * This class represents a persistent object state + */ +class ObjectState extends ValueObject +{ + /** + * The id of the object state + * + * @var mixed + */ + public $id; + + /** + * The identifier for the object state group + * + * @var string + */ + public $identifier; + + /** + * The id of the group this object state belongs to + * + * @var mixed + */ + public $groupId; + + /** + * The priority of the object state in the group + * + * @var int + */ + public $priority; + + /** + * The default language code for + * + * @var string + */ + public $defaultLanguage; + + /** + * The available language codes for names an descriptions + * + * @var string[] + */ + public $languageCodes; + + /** + * Human readable name of the object state + * + * The structure of this field is: + * <code> + * array( 'eng-US' => '<name_eng>', 'ger-DE' => '<name_de>' ); + * </code> + * + * @var string[] + */ + public $name; + + /** + * Human readable description of the object state + * + * The structure of this field is: + * <code> + * array( 'eng-US' => '<description_eng>', 'ger-DE' => '<description_de>' ); + * </code> + * + * @var string[] + */ + public $description; + +} diff --git a/eZ/Publish/SPI/Persistence/Content/ObjectState/Group.php b/eZ/Publish/SPI/Persistence/Content/ObjectState/Group.php new file mode 100644 index 0000000..73b3617 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/ObjectState/Group.php @@ -0,0 +1,72 @@ +<?php + +/** + * File containing the ObjectStateGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\ObjectState; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * This class represents a persistent object state group + */ +class Group extends ValueObject +{ + /** + * The id of the object state group + * + * @var mixed + */ + public $id; + + /** + * The identifier for the object state group + * + * @var string + */ + public $identifier; + + /** + * The default language code for + * + * @var string + */ + public $defaultLanguage; + + /** + * The available language codes for names an descriptions + * + * @var string[] + */ + public $languageCodes; + + /** + * Human readable name of the object state group + * + * The structure of this field is: + * <code> + * array( 'eng-US' => '<name_eng>', 'ger-DE' => '<name_de>' ); + * </code> + * + * @var string[] + */ + public $name; + + /** + * Human readable description of the object state group + * + * The structure of this field is: + * <code> + * array( 'eng-US' => '<description_eng>', 'ger-DE' => '<description_de>' ); + * </code> + * + * @var string[] + */ + public $description; + +} diff --git a/eZ/Publish/SPI/Persistence/Content/ObjectState/Handler.php b/eZ/Publish/SPI/Persistence/Content/ObjectState/Handler.php new file mode 100644 index 0000000..4f2bcda --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/ObjectState/Handler.php @@ -0,0 +1,178 @@ +<?php +/** + * File containing the Object State Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\ObjectState; + +/** + * The Object State Handler interface provides managing of object states and groups + */ +interface Handler +{ + /** + * Creates a new object state group + * + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function createGroup( InputStruct $input ); + + /** + * Loads a object state group + * + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function loadGroup( $groupId ); + + /** + * Loads a object state group by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the group was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function loadGroupByIdentifier( $identifier ); + + /** + * Loads all object state groups + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group[] + */ + public function loadAllGroups( $offset = 0, $limit = -1 ); + + /** + * This method returns the ordered list of object states of a group + * + * @param mixed $groupId + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState[] + */ + public function loadObjectStates( $groupId ); + + /** + * Updates an object state group + * + * @param mixed $groupId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Group + */ + public function updateGroup( $groupId, InputStruct $input ); + + /** + * Deletes a object state group including all states and links to content + * + * @param mixed $groupId + */ + public function deleteGroup( $groupId ); + + /** + * Creates a new object state in the given group. + * The new state gets the last priority. + * Note: in current kernel: If it is the first state all content objects will + * set to this state. + * + * @param mixed $groupId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function create( $groupId, InputStruct $input ); + + /** + * Loads an object state + * + * @param mixed $stateId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function load( $stateId ); + + /** + * Loads an object state by identifier and group it belongs to + * + * @param string $identifier + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the state was not found + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function loadByIdentifier( $identifier, $groupId ); + + /** + * Updates an object state + * + * @param mixed $stateId + * @param \eZ\Publish\SPI\Persistence\Content\ObjectState\InputStruct $input + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function update( $stateId, InputStruct $input ); + + /** + * Changes the priority of the state + * + * @param mixed $stateId + * @param int $priority + */ + public function setPriority( $stateId, $priority ); + + /** + * Deletes a object state. The state of the content objects is reset to the + * first object state in the group. + * + * @param mixed $stateId + */ + public function delete( $stateId ); + + /** + * Sets the object-state of a state group to $stateId for the given content. + * + * @param mixed $contentId + * @param mixed $groupId + * @param mixed $stateId + * + * @return boolean + */ + public function setContentState( $contentId, $groupId, $stateId ); + + /** + * Gets the object-state of object identified by $contentId. + * + * The $state is the id of the state within one group. + * + * @param mixed $contentId + * @param mixed $stateGroupId + * + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState + */ + public function getContentState( $contentId, $stateGroupId ); + + /** + * Returns the number of objects which are in this state + * + * @param mixed $stateId + * + * @return int + */ + public function getContentCount( $stateId ); + +} diff --git a/eZ/Publish/SPI/Persistence/Content/ObjectState/InputStruct.php b/eZ/Publish/SPI/Persistence/Content/ObjectState/InputStruct.php new file mode 100644 index 0000000..8c9f44b --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/ObjectState/InputStruct.php @@ -0,0 +1,58 @@ +<?php + +/** + * File containing the InputStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\ObjectState; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * This class represents a value for creating and updating object states and groups + */ +class InputStruct extends ValueObject +{ + /** + * The identifier for the object state group + * + * @var string + */ + public $identifier; + + /** + * The default language code for + * + * @var string + */ + public $defaultLanguage; + + /** + * Human readable name of the object state + * + * The structure of this field is: + * <code> + * array( 'eng-US' => '<name_eng>', 'ger-DE' => '<name_de>' ); + * </code> + * + * @var string[] + */ + public $name; + + /** + * Human readable description of the object state + * + * The structure of this field is: + * <code> + * array( 'eng-US' => '<description_eng>', 'ger-DE' => '<description_de>' ); + * </code> + * + * @var string[] + */ + public $description; + +} diff --git a/eZ/Publish/SPI/Persistence/Content/Relation.php b/eZ/Publish/SPI/Persistence/Content/Relation.php new file mode 100644 index 0000000..de51f1f --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Relation.php @@ -0,0 +1,64 @@ +<?php +/** + * File containing the Relation class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * Class representing a relation between content. + */ +class Relation extends ValueObject +{ + /** + * Id of the relation + * + * @var mixed + */ + public $id; + + /** + * Source Content ID + * + * @var mixed + */ + public $sourceContentId; + + /** + * Source Content Version + * + * @var int + */ + public $sourceContentVersionNo; + + /** + * Source Content Type Field Definition Id + * + * @var mixed + */ + public $sourceFieldDefinitionId; + + /** + * Destination Content ID + * + * @var mixed + */ + public $destinationContentId; + + /** + * Type bitmask + * + * @see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD + * @var int + */ + public $type; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Relation/CreateStruct.php b/eZ/Publish/SPI/Persistence/Content/Relation/CreateStruct.php new file mode 100644 index 0000000..e5da418 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Relation/CreateStruct.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the Relation CreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Relation; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * CreateStruct representing a relation between content. + */ +class CreateStruct extends ValueObject +{ + /** + * Source Content ID + * + * @var mixed + */ + public $sourceContentId; + + /** + * Source Content Version number + * + * @var int + */ + public $sourceContentVersionNo; + + /** + * Source Content Type Field Definition Id + * + * @var mixed + */ + public $sourceFieldDefinitionId; + + /** + * Destination Content ID + * + * @var mixed + */ + public $destinationContentId; + + /** + * Type bitmask + * + * @see \eZ\Publish\API\Repository\Values\Content\Relation::COMMON, + * \eZ\Publish\API\Repository\Values\Content\Relation::EMBED, + * \eZ\Publish\API\Repository\Values\Content\Relation::LINK, + * \eZ\Publish\API\Repository\Values\Content\Relation::FIELD + * @var int + */ + public $type; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Search/Field.php b/eZ/Publish/SPI/Persistence/Content/Search/Field.php new file mode 100644 index 0000000..19ba8d1 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/Field.php @@ -0,0 +1,57 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\Field class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * Base class for document fields + */ +class Field extends ValueObject +{ + /** + * Name of the document field. Will be used to query this field. + * + * @var string + */ + protected $name; + + /** + * Value of the document field. + * + * Might be about anything depending on the type of the document field. + * + * @var mixed + */ + protected $value; + + /** + * Type of the search field + * + * @var FieldType + */ + protected $type; + + /** + * Construct from name and value + * + * @param string $name + * @param mixed $value + * @param FieldType $type + * + * @return void + */ + public function __construct( $name, $value, FieldType $type ) + { + $this->name = $name; + $this->value = $value; + $this->type = $type; + } +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType.php new file mode 100644 index 0000000..740ddfe --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * Base class for document field definitions + */ +abstract class FieldType extends ValueObject +{ + /** + * Name of the document field. Will be used to query this field. + * + * @var string + */ + public $name; + + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type; + + /** + * Whether highlighting should be performed for this field on result documents + * + * @var boolean + */ + public $highlight = false; + + /** + * The importance of that field ( boost factor) ) + * + * @var int + */ + public $boost = 1; + + /** + * Whether the field supports multiple values + * + * @var boolean + */ + public $multiValue = false; + + /** + * Whether the field should be a part of the resulting document + * + * @var boolean + */ + public $inResult = true; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/BooleanField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/BooleanField.php new file mode 100644 index 0000000..d6dd08e --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/BooleanField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\BooleanField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Boolean document field + */ +class BooleanField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_boolean'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/CustomField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/CustomField.php new file mode 100644 index 0000000..425b444 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/CustomField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\CustomField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Custom document field + */ +class CustomField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + public $type; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/DateField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/DateField.php new file mode 100644 index 0000000..12832a2 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/DateField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\DateField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Date document field + */ +class DateField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_date'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/FloatField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/FloatField.php new file mode 100644 index 0000000..58516a9 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/FloatField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\FloatField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Float document field + */ +class FloatField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_float'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/IdentifierField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/IdentifierField.php new file mode 100644 index 0000000..30050ed --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/IdentifierField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\IdentifierField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Identifier document field + */ +class IdentifierField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_id'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/IntegerField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/IntegerField.php new file mode 100644 index 0000000..74169e8 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/IntegerField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\IntegerField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Integer document field + */ +class IntegerField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_integer'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/PriceField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/PriceField.php new file mode 100644 index 0000000..b464052 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/PriceField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\PriceField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Price document field + */ +class PriceField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_currency'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/StringField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/StringField.php new file mode 100644 index 0000000..9033fdd --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/StringField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\StringField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * String document field + */ +class StringField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_string'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/FieldType/TextField.php b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/TextField.php new file mode 100644 index 0000000..ff771da --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/FieldType/TextField.php @@ -0,0 +1,25 @@ +<?php +/** + * File containing the eZ\Publish\SPI\Persistence\Content\Search\FieldType\TextField class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ +namespace eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +use eZ\Publish\SPI\Persistence\Content\Search\FieldType; + +/** + * Text document field + */ +class TextField extends FieldType +{ + /** + * The type name of the facet. Has to be handled by the solr schema. + * + * @var string + */ + protected $type = 'ez_text'; +} + diff --git a/eZ/Publish/SPI/Persistence/Content/Search/Handler.php b/eZ/Publish/SPI/Persistence/Content/Search/Handler.php new file mode 100644 index 0000000..5ff9698 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/Handler.php @@ -0,0 +1,68 @@ +<?php +/** + * File containing the Content Search handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Search; + +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\API\Repository\Values\Content\Query\Criterion; +use eZ\Publish\API\Repository\Values\Content\Query; + +/** + * The Content Search handler retrieves sets of of Content objects, based on a + * set of criteria. + */ +abstract class Handler +{ + /** + * Finds content objects for the given query. + * + * @todo define structs for the field filters + * + * @param \eZ\Publish\API\Repository\Values\Content\Query $query + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * + * @return \eZ\Publish\API\Repository\Values\Content\Search\SearchResult + */ + abstract public function findContent( Query $query, array $fieldFilters = array() ); + + /** + * Performs a query for a single content object + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the object was not found by the query or due to permissions + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if there is more than than one result matching the criterions + * + * @todo define structs for the field filters + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $criterion + * @param array $fieldFilters - a map of filters for the returned fields. + * Currently supported: <code>array("languages" => array(<language1>,..))</code>. + * + * @return \eZ\Publish\API\Repository\Values\Content\Content + */ + abstract public function findSingle( Criterion $criterion, array $fieldFilters = array() ); + + /** + * Suggests a list of values for the given prefix + * + * @param string $prefix + * @param string[] $fieldpath + * @param int $limit + * @param \eZ\Publish\API\Repository\Values\Content\Query\Criterion $filter + */ + abstract public function suggest( $prefix, $fieldPaths = array(), $limit = 10, Criterion $filter = null ); + + /** + * Indexes a content object + * + * @param \eZ\Publish\SPI\Persistence\Content $content + * + * @return void + */ + abstract public function indexContent( Content $content ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Search/Result.php b/eZ/Publish/SPI/Persistence/Content/Search/Result.php new file mode 100644 index 0000000..890b5db --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Search/Result.php @@ -0,0 +1,31 @@ +<?php +/** + * File containing the (content) Search result class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Search; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class Result extends ValueObject +{ + /** + * Number of results found by the search + * + * @var int + */ + public $count; + + /** + * Content objects returned by the search + * + * @var \eZ\Publish\SPI\Persistence\Content[] + */ + public $content = array(); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Section.php b/eZ/Publish/SPI/Persistence/Content/Section.php new file mode 100644 index 0000000..c3cd7ba --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Section.php @@ -0,0 +1,38 @@ +<?php +/** + * File containing the Section class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class Section extends ValueObject +{ + /** + * Id of the section + * + * @var int + */ + public $id; + + /** + * Unique identifier of the section + * + * @var string + */ + public $identifier; + + /** + * Name of the section + * + * @var string + */ + public $name; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Section/Handler.php b/eZ/Publish/SPI/Persistence/Content/Section/Handler.php new file mode 100644 index 0000000..e7790ef --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Section/Handler.php @@ -0,0 +1,95 @@ +<?php +/** + * File containing the Section Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Section; + +/** + */ +interface Handler +{ + /** + * Create a new section + * + * @param string $name + * @param string $identifier + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + * @todo Should validate that $identifier is unique?? + * @todo What about translatable $name? + */ + public function create( $name, $identifier ); + + /** + * Update name and identifier of a section + * + * @param mixed $id + * @param string $name + * @param string $identifier + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function update( $id, $name, $identifier ); + + /** + * Get section data + * + * @param mixed $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If section is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function load( $id ); + + /** + * Get all section data + * + * @return \eZ\Publish\SPI\Persistence\Content\Section[] + */ + public function loadAll(); + + /** + * Get section data by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If section is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Section + */ + public function loadByIdentifier( $identifier ); + + /** + * Delete a section + * + * Might throw an exception if the section is still associated with some + * content objects. Make sure that no content objects are associated with + * the section any more *before* calling this method. + * + * @param mixed $id + */ + public function delete( $id ); + + /** + * Assigns section to single content object + * + * @param mixed $sectionId + * @param mixed $contentId + */ + public function assign( $sectionId, $contentId ); + + /** + * Number of content assignments a Section has + * + * @param mixed $sectionId + * + * @return int + */ + public function assignmentsCount( $sectionId ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type.php b/eZ/Publish/SPI/Persistence/Content/Type.php new file mode 100644 index 0000000..8e6fb37 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type.php @@ -0,0 +1,189 @@ +<?php +/** + * File containing the ContentType class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * @todo What about sort_field and sort_order? + */ +class Type extends ValueObject +{ + /** + * @var int Status constant for defined (aka "published") Type + */ + const STATUS_DEFINED = 0; + + /** + * @var int Status constant for draft (aka "temporary") Type + */ + const STATUS_DRAFT = 1; + + /** + * @var int Status constant for modified (aka "deferred for publishing") Type + */ + const STATUS_MODIFIED = 2; + + /** + * Primary key: Content type ID + * + * @var mixed + */ + public $id; + + /** + * Primary key: Status (legacy: "version") + * + * @var int One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + */ + public $status = self::STATUS_DRAFT; + + /** + * Human readable name of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @var string[] + */ + public $name; + + /** + * Human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @var string[] + */ + public $description = array(); + + /** + * String identifier of a type + * + * @var string + */ + public $identifier; + + /** + * Creation date (timestamp) + * + * @var int + */ + public $created; + + /** + * Modification date (timestamp) + * + * @var int + */ + public $modified; + + /** + * Creator user id + * + * @var mixed + */ + public $creatorId; + + /** + * Modifier user id + * + * @var mixed + * + */ + public $modifierId; + + /** + * Unique remote ID + * + * @var string + */ + public $remoteId; + + /** + * URL alias schema + * Same as {@link \eZ\Publish\SPI\Persistence\Content\Type::$nameSchema}. + * If nothing is provided, $nameSchema will be used instead. + * + * @var string + * @see \eZ\Publish\SPI\Persistence\Content\Type::$nameSchema + */ + public $urlAliasSchema; + + /** + * Name schema. + * Can be composed of FieldDefinition identifier place holders. + * These place holders must comply this pattern : <field_definition_identifier>. + * An OR condition can be used : + * <field_def|other_field_def> + * In this example, field_def will be used if available. If not, other_field_def will be used for content name generation + * + * @var string + */ + public $nameSchema; + + /** + * Determines if the type is a container + * + * @var boolean + */ + public $isContainer; + + /** + * Initial language + * + * @var mixed + */ + public $initialLanguageId; + + /** + * Specifies which property the child locations should be sorted on by default when created + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField = Location::SORT_FIELD_PUBLISHED; + + /** + * Specifies whether the sort order should be ascending or descending by default when created + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder = Location::SORT_ORDER_DESC; + + /** + * Contains an array of type group IDs + * + * @var mixed[] + */ + public $groupIds = array(); + + /** + * Content fields in this type + * + * @var \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition[] + */ + public $fieldDefinitions = array(); + + /** + * @todo: Document. + * + * @var boolean + */ + public $defaultAlwaysAvailable = false; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/CreateStruct.php b/eZ/Publish/SPI/Persistence/Content/Type/CreateStruct.php new file mode 100644 index 0000000..8ce89e7 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/CreateStruct.php @@ -0,0 +1,172 @@ +<?php +/** + * File containing the Content Type CreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type; + +use eZ\Publish\SPI\Persistence\ValueObject; +use eZ\Publish\SPI\Persistence\Content\Location; + +/** + */ +class CreateStruct extends ValueObject +{ + /** + * Human readable name of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @var string[] + */ + public $name; + + /** + * Version (state) to create. + * + * @var int + */ + public $status; + + /** + * Human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @var string[] + */ + public $description = array(); + + /** + * String identifier of a type + * + * @var string + */ + public $identifier; + + /** + * Creation date (timestamp) + * + * @var int + */ + public $created; + + /** + * Modification date (timestamp) + * + * @var int + */ + public $modified; + + /** + * Creator user id + * + * @var mixed + */ + public $creatorId; + + /** + * Modifier user id + * + * @var mixed + * + */ + public $modifierId; + + /** + * Unique remote ID + * + * @var string + */ + public $remoteId; + + /** + * URL alias schema + * + * @var string + */ + public $urlAliasSchema; + + /** + * Name schema + * + * @var string + */ + public $nameSchema; + + /** + * Determines if the type is a container + * + * @var boolean + */ + public $isContainer; + + /** + * Initial language + * + * @var mixed + */ + public $initialLanguageId; + + /** + * Specifies which property the child locations should be sorted on by default when created + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField = Location::SORT_FIELD_PUBLISHED; + + /** + * Specifies whether the sort order should be ascending or descending by default when created + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder = Location::SORT_ORDER_DESC; + + /** + * Contains an array of type group IDs + * + * @var mixed[] + */ + public $groupIds = array(); + + /** + * Content fields in this type + * + * @var \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition[] + */ + public $fieldDefinitions = array(); + + /** + * @todo: Document. + * + * @var boolean + */ + public $defaultAlwaysAvailable = false; + + /** + * Performs a deep cloning. + * + * @return void + */ + public function __clone() + { + foreach ( $this->fieldDefinitions as $id => $fieldDef ) + { + $this->fieldDefinitions[$id] = clone $fieldDef; + } + } +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/FieldDefinition.php b/eZ/Publish/SPI/Persistence/Content/Type/FieldDefinition.php new file mode 100644 index 0000000..e32799b --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/FieldDefinition.php @@ -0,0 +1,125 @@ +<?php +/** + * File containing the Field class for content type + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type; + +use eZ\Publish\SPI\Persistence\ValueObject; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; +use eZ\Publish\SPI\Persistence\Content\FieldValue; + +/** + * @todo Do we need a FieldDefinitionCreateStruct? + * @todo What about the "serialized_data_text" field in legacy storage? + */ +class FieldDefinition extends ValueObject +{ + /** + * Primary key + * + * @var mixed + */ + public $id; + + /** + * Name + * + * @var string[] + */ + public $name; + + /** + * Description + * + * @var string[] + */ + public $description = array(); + + /** + * Readable string identifier of a field definition + * + * @var string + */ + public $identifier; + + /** + * Field group name + * + * @var string + */ + public $fieldGroup; + + /** + * Position + * + * @var int + */ + public $position; + + /** + * String identifier of the field type + * + * @var string + */ + public $fieldType; + + /** + * If the field type is translatable + * + * @var boolean + */ + public $isTranslatable; + + /** + * Is the field required + * + * @var boolean + */ + public $isRequired; + + /** + * Just a flag + * + * @var boolean + */ + public $isInfoCollector; + + /** + * A map of field type constraints. + * 2 constraints are available (as keys): + * - validators + * - fieldSettings + * + * @var \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public $fieldTypeConstraints; + + /** + * Default value of the field + * + * @var \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public $defaultValue; + + /** + * @todo: Document + * + * @var boolean + */ + public $isSearchable; + + /** + * Constructor + */ + public function __construct( array $properties = array() ) + { + $this->fieldTypeConstraints = new FieldTypeConstraints; + $this->defaultValue = new FieldValue; + parent::__construct( $properties ); + } +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/Group.php b/eZ/Publish/SPI/Persistence/Content/Type/Group.php new file mode 100644 index 0000000..b00cf3b --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/Group.php @@ -0,0 +1,78 @@ +<?php +/** + * File containing the ContentTypeGroup class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class Group extends ValueObject +{ + /** + * Primary key + * + * @var mixed + */ + public $id; + + /** + * Name + * + * @since 5.0 + * @var string[] + */ + public $name = array(); + + /** + * Description + * + * @since 5.0 + * @var string[] + */ + public $description = array(); + + /** + * Readable string identifier of a group + * + * Legacy note: Maps to existing name property + * + * @var string + */ + public $identifier; + + /** + * Created date (timestamp) + * + * @var int + */ + public $created; + + /** + * Modified date (timestamp) + * + * @var int + */ + public $modified; + + /** + * Creator user id + * + * @var mixed + */ + public $creatorId; + + /** + * Modifier user id + * + * @var mixed + * + */ + public $modifierId; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/Group/CreateStruct.php b/eZ/Publish/SPI/Persistence/Content/Type/Group/CreateStruct.php new file mode 100644 index 0000000..26dee51 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/Group/CreateStruct.php @@ -0,0 +1,69 @@ +<?php +/** + * File containing the Content Type Group CreateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type\Group; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class CreateStruct extends ValueObject +{ + /** + * Name + * + * @since 5.0 + * @var string[] + */ + public $name = array(); + + /** + * Description + * + * @since 5.0 + * @var string[] + */ + public $description = array(); + + /** + * Readable string identifier of a group + * + * @var string + */ + public $identifier; + + /** + * Created date (timestamp) + * + * @var int + */ + public $created; + + /** + * Modified date (timestamp) + * + * @var int + */ + public $modified; + + /** + * Creator user id + * + * @var mixed + */ + public $creatorId; + + /** + * Modifier user id + * + * @var mixed + * + */ + public $modifierId; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/Group/UpdateStruct.php b/eZ/Publish/SPI/Persistence/Content/Type/Group/UpdateStruct.php new file mode 100644 index 0000000..7186b1c --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/Group/UpdateStruct.php @@ -0,0 +1,62 @@ +<?php +/** + * File containing the UpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type\Group; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class UpdateStruct extends ValueObject +{ + /** + * Primary key + * + * @var mixed + */ + public $id; + + /** + * Name + * + * @since 5.0 + * @var string[] + */ + public $name = array(); + + /** + * Description + * + * @since 5.0 + * @var string[] + */ + public $description = array(); + + /** + * Readable string identifier of a group + * + * @var string + */ + public $identifier; + + /** + * Modified date (timestamp) + * + * @var int + */ + public $modified; + + /** + * Modifier user id + * + * @var mixed + * + */ + public $modifierId; +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/Handler.php b/eZ/Publish/SPI/Persistence/Content/Type/Handler.php new file mode 100644 index 0000000..aa9dc6f --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/Handler.php @@ -0,0 +1,268 @@ +<?php +/** + * File containing the Content Type Handler class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type; + +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct as GroupCreateStruct; +use eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct as GroupUpdateStruct; + +/** + */ +interface Handler +{ + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\CreateStruct $group + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function createGroup( GroupCreateStruct $group ); + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\Group\UpdateStruct $group + */ + public function updateGroup( GroupUpdateStruct $group ); + + /** + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type group contains types + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + */ + public function deleteGroup( $groupId ); + + /** + * @param mixed $groupId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function loadGroup( $groupId ); + + /** + * Loads Type Group by identifier + * + * Legacy note: Uses name for identifier. + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type group with id is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group + */ + public function loadGroupByIdentifier( $identifier ); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Group[] + */ + public function loadAllGroups(); + + /** + * @param mixed $groupId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return \eZ\Publish\SPI\Persistence\Content\Type[] + */ + public function loadContentTypes( $groupId, $status = Type::STATUS_DEFINED ); + + /** + * Loads a content type by id and status + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with provided status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function load( $contentTypeId, $status = Type::STATUS_DEFINED ); + + /** + * Loads a (defined) content type by identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If defined type is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function loadByIdentifier( $identifier ); + + /** + * Loads a (defined) content type by remote id + * + * @param mixed $remoteId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If defined type is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function loadByRemoteId( $remoteId ); + + /** + * @param \eZ\Publish\SPI\Persistence\Content\Type\CreateStruct $contentType + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function create( CreateStruct $contentType ); + + /** + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\UpdateStruct $contentType + */ + public function update( $contentTypeId, $status, UpdateStruct $contentType ); + + /** + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type is defined and still has content + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type is not found + */ + public function delete( $contentTypeId, $status ); + + /** + * Creates a draft of existing defined content type + * + * Updates modified date, sets $modifierId and status to Type::STATUS_DRAFT on the new returned draft. + * + * @param mixed $modifierId + * @param mixed $contentTypeId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with defined status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function createDraft( $modifierId, $contentTypeId ); + + /** + * Copy a Type incl fields and group-relations from a given status to a new Type with status {@link Type::STATUS_DRAFT} + * + * New Content Type will have $userId as creator / modifier, created / modified should be updated, new remoteId created + * and identifier should be appended with '_' + the new remoteId or another unique number. + * + * @param mixed $userId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If user or type with provided status is not found + * + * @return \eZ\Publish\SPI\Persistence\Content\Type + */ + public function copy( $userId, $contentTypeId, $status ); + + /** + * Unlink a content type group from a content type + * + * @param mixed $groupId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or type with provided status is not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If $groupId is last group on $contentTypeId or + * not a group assigned to type + */ + public function unlink( $groupId, $contentTypeId, $status ); + + /** + * Link a content type group with a content type + * + * @param mixed $groupId + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If group or type with provided status is not found + * @throws \eZ\Publish\API\Repository\Exceptions\BadStateException If type is already part of group + */ + public function link( $groupId, $contentTypeId, $status ); + + /** + * Returns field definition for the given field definition id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field definition is not found + * + * @param mixed $id + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + */ + public function getFieldDefinition( $id, $status ); + + /** + * Adds a new field definition to an existing Type. + * + * This method creates a new version of the Type with the $fieldDefinition + * added. It does not update existing content objects depending on the + * field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * + * @return \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type is not found + * @todo Add FieldDefinition\CreateStruct? + */ + public function addFieldDefinition( $contentTypeId, $status, FieldDefinition $fieldDefinition ); + + /** + * Removes a field definition from an existing Type. + * + * This method creates a new version of the Type with the field definition + * referred to by $fieldDefinitionId removed. It does not update existing + * content objects depending on the field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param mixed $fieldDefinitionId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field is not found + * + * @return void + */ + public function removeFieldDefinition( $contentTypeId, $status, $fieldDefinitionId ); + + /** + * This method updates the given $fieldDefinition on a Type. + * + * This method creates a new version of the Type with the updated + * $fieldDefinition. It does not update existing content objects depending + * on the + * field (default) values. + * + * @param mixed $contentTypeId + * @param int $status One of Type::STATUS_DEFINED|Type::STATUS_DRAFT|Type::STATUS_MODIFIED + * @param \eZ\Publish\SPI\Persistence\Content\Type\FieldDefinition $fieldDefinition + * + * @return void + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If field is not found + * @todo Add FieldDefinition\UpdateStruct? + */ + public function updateFieldDefinition( $contentTypeId, $status, FieldDefinition $fieldDefinition ); + + /** + * Update content objects + * + * Updates content objects, depending on the changed field definitions. + * + * A content type has a state which tells if its content objects yet have + * been adapted. + * + * Flags the content type as updated. + * + * @param mixed $contentTypeId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If type with $contentTypeId and Type::STATUS_DRAFT is not found + * + * @return void + */ + public function publish( $contentTypeId ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/Type/UpdateStruct.php b/eZ/Publish/SPI/Persistence/Content/Type/UpdateStruct.php new file mode 100644 index 0000000..e7e6dd8 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/Type/UpdateStruct.php @@ -0,0 +1,123 @@ +<?php +/** + * File containing the ContentType class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\Type; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class UpdateStruct extends ValueObject +{ + /** + * Human readable name of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<name_eng>', 'de' => '<name_de>' ); + * </code> + * + * @var string[] + */ + public $name; + + /** + * Human readable description of the content type + * + * The structure of this field is: + * <code> + * array( 'eng' => '<description_eng>', 'de' => '<description_de>' ); + * </code> + * + * @var string[] + */ + public $description = array(); + + /** + * String identifier of a type + * + * @var string + */ + public $identifier; + + /** + * Modification date (timestamp) + * + * @var int + */ + public $modified; + + /** + * Modifier user id + * + * @var mixed + * + */ + public $modifierId; + + /** + * Unique remote ID + * + * @var string + */ + public $remoteId; + + /** + * URL alias schema + * + * @var string + */ + public $urlAliasSchema; + + /** + * Name schema + * + * @var string + */ + public $nameSchema; + + /** + * Determines if the type is a container + * + * @var boolean + */ + public $isContainer; + + /** + * Initial language + * + * @var mixed + */ + public $initialLanguageId; + + /** + * Specifies which property the child locations should be sorted on by default when created + * + * Valid values are found at {@link Location::SORT_FIELD_*} + * + * @var mixed + */ + public $sortField; + + /** + * Specifies whether the sort order should be ascending or descending by default when created + * + * Valid values are {@link Location::SORT_ORDER_*} + * + * @var mixed + */ + public $sortOrder; + + /** + * @todo: Document. + * + * @var boolean + */ + public $defaultAlwaysAvailable; +} diff --git a/eZ/Publish/SPI/Persistence/Content/UpdateStruct.php b/eZ/Publish/SPI/Persistence/Content/UpdateStruct.php new file mode 100644 index 0000000..6ffa000 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/UpdateStruct.php @@ -0,0 +1,51 @@ +<?php +/** + * File containing the UpdateStruct struct + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class UpdateStruct extends ValueObject +{ + /** + * @var string[] Eg. array( 'eng-GB' => "New Article" ) + */ + public $name = array(); + + /** + * Creator user ID for the version + * + * @var int + */ + public $creatorId; + + /** + * Contains fields to be updated. + * + * @var \eZ\Publish\SPI\Persistence\Content\Field[] + */ + public $fields = array(); + + /** + * Modification date for the version. + * Unix timestamp. + * + * @var int + */ + public $modificationDate; + + /** + * ID for initial (main) language for this version. + * + * @var mixed + */ + public $initialLanguageId = false; +} diff --git a/eZ/Publish/SPI/Persistence/Content/UrlAlias.php b/eZ/Publish/SPI/Persistence/Content/UrlAlias.php new file mode 100644 index 0000000..16f2fe0 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/UrlAlias.php @@ -0,0 +1,107 @@ +<?php +/** + * File containing the UrlAlias class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * UrlAlias models one url alias path element separated by '/' in urls. + * + * This class models the legacy structure used for url aliases. + */ +class UrlAlias extends ValueObject +{ + const LOCATION = 0; + const RESOURCE = 1; + const VIRTUAL = 2; + + /** + * A unique identifier for the alias + * (in legacy implementation this would be <parentid>-<md5text>) + * @var string + */ + public $id; + + /** + * The type of the URL Alias i.e. one of URLAlias::LOCATION, URLAlias::RESOURCE, URLAlias::VIRTUAL + * + * @var int + */ + public $type; + + /** + * If type = URLAlias::LOCATION the locationId + * otherwise a string (e.g. /content/search) + * + * @var mixed + */ + public $destination; + + /** + * Holds normalized path data + * + * Example: + * <code> + * array( + * array( + * "always-available" => true, + * "translations" => array( + * "cro-HR" => "jedan" + * ) + * ), + * array( + * "always-available" => false, + * "translations" => array( + * "cro-HR" => "dva", + * "eng-GB" => "two", + * ) + * ) + * ) + * </code> + * + * @var array + */ + public $pathData; + + /** + * Language code of url alias entry. + * + * @var string[] + */ + public $languageCodes; + + /** + * Fallback indicator for other languages + * + * @var boolean + */ + public $alwaysAvailable; + + /** + * Indicates that this alias was autogenerated for an in the meanwhile archived version of the content + * + * @var boolean + */ + public $isHistory; + + /** + * If false this alias was autogenerated otherwise manuel created + * + * @var boolean + */ + public $isCustom; + + /** + * Indicates if the url should be redirected + * + * @var boolean + */ + public $forward; +} diff --git a/eZ/Publish/SPI/Persistence/Content/UrlAlias/Handler.php b/eZ/Publish/SPI/Persistence/Content/UrlAlias/Handler.php new file mode 100644 index 0000000..e0c2755 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/UrlAlias/Handler.php @@ -0,0 +1,154 @@ +<?php +/** + * File containing the UrlAlias Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\UrlAlias; + +/** + * The UrlAlias Handler interface provides nice urls management. + * + * Its methods operate on a representation of the url alias data structure held + * inside a storage engine. + */ +interface Handler +{ + /** + * This method creates or updates an urlalias from a new or changed content name in a language + * (if published). It also can be used to create an alias for a new location of content. + * On update the old alias is linked to the new one (i.e. a history alias is generated). + * + * $alwaysAvailable controls whether the url alias is accessible in all + * languages. + * + * @param mixed $locationId + * @param mixed $parentLocationId + * @param string $name the new name computed by the name schema or url alias schema + * @param string $languageCode + * @param boolean $alwaysAvailable + * + * @return void + */ + public function publishUrlAliasForLocation( $locationId, $parentLocationId, $name, $languageCode, $alwaysAvailable = false ); + + /** + * Create a user chosen $alias pointing to $locationId in $languageCode. + * + * If $languageCode is null the $alias is created in the system's default + * language. $alwaysAvailable makes the alias available in all languages. + * + * @param mixed $locationId + * @param string $path + * @param boolean $forwarding + * @param string|null $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function createCustomUrlAlias( $locationId, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ); + + /** + * Create a user chosen $alias pointing to a resource in $languageCode. + * This method does not handle location resources - if a user enters a location target + * the createCustomUrlAlias method has to be used. + * + * If $languageCode is null the $alias is created in the system's default + * language. $alwaysAvailable makes the alias available in all languages. + * + * @param string $resource + * @param string $path + * @param boolean $forwarding + * @param string|null $languageCode + * @param boolean $alwaysAvailable + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function createGlobalUrlAlias( $resource, $path, $forwarding = false, $languageCode = null, $alwaysAvailable = false ); + + /** + * List global aliases. + * + * @param string|null $languageCode + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function listGlobalURLAliases( $languageCode = null, $offset = 0, $limit = -1 ); + + /** + * List of url entries of $urlType, pointing to $locationId. + * + * @param mixed $locationId + * @param boolean $custom if true the user generated aliases are listed otherwise the autogenerated + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias[] + */ + public function listURLAliasesForLocation( $locationId, $custom = false ); + + /** + * Removes url aliases. + * + * Autogenerated aliases are not removed by this method. + * + * @param \eZ\Publish\SPI\Persistence\Content\UrlAlias[] $urlAliases + * + * @return boolean + */ + public function removeURLAliases( array $urlAliases ); + + /** + * Looks up a url alias for the given url + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $url + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function lookup( $url ); + + /** + * Loads URL alias by given $id + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException + * + * @param string $id + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias + */ + public function loadUrlAlias( $id ); + + /** + * Notifies the underlying engine that a location has moved. + * + * This method triggers the change of the autogenerated aliases + * + * @param mixed $locationId + * @param mixed $oldParentId + * @param mixed $newParentId + */ + public function locationMoved( $locationId, $oldParentId, $newParentId ); + + /** + * Notifies the underlying engine that a location has moved. + * + * This method triggers the creation of the autogenerated aliases for the copied locations + * + * @param mixed $locationId + * @param mixed $oldParentId + * @param mixed $newParentId + */ + public function locationCopied( $locationId, $oldParentId, $newParentId ); + + /** + * Notifies the underlying engine that a location was deleted or moved to trash + * + * @param mixed $locationId + */ + public function locationDeleted( $locationId ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/UrlWildcard.php b/eZ/Publish/SPI/Persistence/Content/UrlWildcard.php new file mode 100644 index 0000000..d5cd0ca --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/UrlWildcard.php @@ -0,0 +1,47 @@ +<?php +/** + * File containing the UrlWildcard class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * UrlWildCard models one url alias path with wild cards + * + */ +class UrlWildcard extends ValueObject +{ + /** + * The unique id + * + * @var mixed + */ + public $id; + + /** + * The source url including "*" + * + * @var string + */ + public $sourceUrl; + + /** + * The destination url containing placeholders e.g. /destination/{1} + * + * @var string + */ + public $destinationUrl; + + /** + * Indicates if the url is redirected or not + * + * @var boolean + */ + public $forward; +} diff --git a/eZ/Publish/SPI/Persistence/Content/UrlWildcard/Handler.php b/eZ/Publish/SPI/Persistence/Content/UrlWildcard/Handler.php new file mode 100644 index 0000000..45fa2c5 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/UrlWildcard/Handler.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the UrlWildcard Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content\UrlWildcard; + +/** + * The UrlWildcard Handler interface provides nice urls with wildcards management. + * + * Its methods operate on a representation of the url alias data structure held + * inside a storage engine. + */ +interface Handler +{ + /** + * Creates a new url wildcard + * + * @param string $sourceUrl + * @param string $destinationUrl + * @param boolean $forward + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function create( $sourceUrl, $destinationUrl, $forward = false ); + + /** + * removes an url wildcard + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + */ + public function remove( $id ); + + /** + * Loads a url wild card + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if the url wild card was not found + * + * @param mixed $id + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard + */ + public function load( $id ); + + /** + * Loads all url wild card (paged) + * + * @param int $offset + * @param int $limit + * + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard[] + */ + public function loadAll( $offset = 0, $limit = -1 ); +} diff --git a/eZ/Publish/SPI/Persistence/Content/VersionInfo.php b/eZ/Publish/SPI/Persistence/Content/VersionInfo.php new file mode 100644 index 0000000..a079bf7 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Content/VersionInfo.php @@ -0,0 +1,105 @@ +<?php +/** + * File containing the VersionInfo class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\Content; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + * This class holds version information data + */ +class VersionInfo extends ValueObject +{ + /** + * Version status constants + * @var int + */ + const STATUS_DRAFT = 0; + const STATUS_PUBLISHED = 1; + const STATUS_PENDING = 2; + const STATUS_ARCHIVED = 3; + const STATUS_REJECTED = 4; + const STATUS_INTERNAL_DRAFT = 5; + const STATUS_REPEAT = 6; + const STATUS_QUEUED = 7; + + /** + * Version ID. + * + * @var mixed + */ + public $id; + + /** + * Version number. + * + * In contrast to {@link $id}, this is the version number, which only + * increments in scope of a single Content object. + * + * @var int + */ + public $versionNo; + + /** + * ContentInfo of the content this VersionInfo belongs to. + * + * @var \eZ\Publish\SPI\Persistence\Content\ContentInfo + */ + public $contentInfo; + + /** + * Returns the names computed from the name schema in the available languages. + * Eg. array( 'eng-GB' => "New Article" ) + * + * @return string[] + */ + public $names; + + /** + * Creation date of this version, as a UNIX timestamp + * @var int + */ + public $creationDate; + + /** + * Last modified date of this version, as a UNIX timestamp + * + * @var int + */ + public $modificationDate; + + /** + * Creator user ID. + * + * @var int + */ + public $creatorId; + + /** + * One of VersionInfo::STATUS_DRAFT, VersionInfo::STATUS_PUBLISHED, VersionInfo::STATUS_ARCHIVED + * + * @var int + */ + public $status; + + /** + * In 4.x this is the language code which is used for labeling a translation. + * + * @var int + */ + public $initialLanguageCode; + + /** + * List of languages in this version + * Reflects which languages fields exists in for this version. + * + * @var int[] + */ + public $languageIds = array(); +} diff --git a/eZ/Publish/SPI/Persistence/Handler.php b/eZ/Publish/SPI/Persistence/Handler.php new file mode 100644 index 0000000..906898d --- /dev/null +++ b/eZ/Publish/SPI/Persistence/Handler.php @@ -0,0 +1,97 @@ +<?php +/** + * File containing the Persistence Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence; + +/** + * The main handler for Storage Engine + */ +interface Handler +{ + /** + * @return \eZ\Publish\SPI\Persistence\Content\Handler + */ + public function contentHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Search\Handler + */ + public function searchHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Type\Handler + */ + public function contentTypeHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Language\Handler + */ + public function contentLanguageHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Handler + */ + public function locationHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\ObjectState\Handler + */ + public function objectStateHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Location\Trash\Handler + */ + public function trashHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\User\Handler + */ + public function userHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\Section\Handler + */ + public function sectionHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlAlias\Handler + */ + public function urlAliasHandler(); + + /** + * @return \eZ\Publish\SPI\Persistence\Content\UrlWildcard\Handler + */ + public function urlWildcardHandler(); + + /** + * Begin transaction + * + * Begins an transaction, make sure you'll call commit or rollback when done, + * otherwise work will be lost. + */ + public function beginTransaction(); + + /** + * Commit transaction + * + * Commit transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function commit(); + + /** + * Rollback transaction + * + * Rollback transaction, or throw exceptions if no transactions has been started. + * + * @throws \RuntimeException If no transaction has been started + */ + public function rollback(); +} diff --git a/eZ/Publish/SPI/Persistence/User.php b/eZ/Publish/SPI/Persistence/User.php new file mode 100644 index 0000000..adb6c4f --- /dev/null +++ b/eZ/Publish/SPI/Persistence/User.php @@ -0,0 +1,69 @@ +<?php +/** + * File containing the User class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence; + +/** + */ +class User extends ValueObject +{ + /** + * User ID + * + * @var mixed + */ + public $id; + + /** + * User login + * + * @var string + */ + public $login; + + /** + * User E-Mail address + * + * @var string + */ + public $email; + + /** + * User password hash + * + * @var string + */ + public $passwordHash; + + /** + * Hash algorithm used to has the password + * + * @var int + */ + public $hashAlgorithm; + + /** + * Flag to signal if user is enabled or not + * + * User can not login if false + * + * @var boolean + */ + public $isEnabled = false; + + /** + * Max number of time user is allowed to login + * + * @todo: Not used in kernel, should probably be a number of login allowed before changing password. + * But new users gets 0 before they activate, admin has 10, and anonymous has 1000 in clean data. + * + * @var int + */ + public $maxLogin = 0; +} diff --git a/eZ/Publish/SPI/Persistence/User/Handler.php b/eZ/Publish/SPI/Persistence/User/Handler.php new file mode 100644 index 0000000..c544112 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/User/Handler.php @@ -0,0 +1,235 @@ +<?php +/** + * File containing the User Handler interface + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\User; + +use eZ\Publish\SPI\Persistence\User; +use eZ\Publish\SPI\Persistence\User\Role; +use eZ\Publish\SPI\Persistence\User\RoleUpdateStruct; +use eZ\Publish\SPI\Persistence\User\Policy; + +/** + * Storage Engine handler for user module + */ +interface Handler +{ + + /** + * Create a user + * + * The User struct used to create the user will contain an ID which is used + * to reference the user. + * + * @param \eZ\Publish\SPI\Persistence\User $user + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function create( User $user ); + + /** + * Loads user with user ID. + * + * @param mixed $userId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If user is not found + * + * @return \eZ\Publish\SPI\Persistence\User + */ + public function load( $userId ); + + /** + * Loads user(s) with user login / email. + * + * Optimized for login use (hence the possibility to match email and return several users). + * + * @param string $login + * @param boolean $alsoMatchEmail Also match user email, caller must verify that $login is a valid email address. + * + * @return \eZ\Publish\SPI\Persistence\User[] + */ + public function loadByLogin( $login, $alsoMatchEmail = false ); + + /** + * Update the user information specified by the user struct + * + * @param \eZ\Publish\SPI\Persistence\User $user + */ + public function update( User $user ); + + /** + * Delete user with the given ID. + * + * @param mixed $userId + * + * @todo Throw on missing user? + */ + public function delete( $userId ); + + /** + * Create new role + * + * @param \eZ\Publish\SPI\Persistence\User\Role $role + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function createRole( Role $role ); + + /** + * Loads a specified role by $roleId + * + * @param mixed $roleId + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If role is not found + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function loadRole( $roleId ); + + /** + * Loads a specified role by $identifier + * + * @param string $identifier + * + * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException If role is not found + * + * @return \eZ\Publish\SPI\Persistence\User\Role + */ + public function loadRoleByIdentifier( $identifier ); + + /** + * Loads all roles + * + * @return \eZ\Publish\SPI\Persistence\User\Role[] + */ + public function loadRoles(); + + /** + * Loads roles assigned to a user/group (not including inherited roles) + * + * @param mixed $groupId + * In legacy storage engine this is the content object id a role is assigned to. + * By the nature of legacy storage engine, it is therefor possible to use $userId as well here. + * @return \eZ\Publish\SPI\Persistence\User\Role[] + */ + public function loadRolesByGroupId( $groupId ); + + /** + * Loads roles assignments Role + * + * Role Assignments with same roleId and limitationIdentifier will be merged together into one. + * + * @param mixed $roleId + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function loadRoleAssignmentsByRoleId( $roleId ); + + /** + * Loads roles assignments to a user/group + * + * Role Assignments with same roleId and limitationIdentifier will be merged together into one. + * + * @param mixed $groupId In legacy storage engine this is the content object id roles are assigned to in ezuser_role. + * By the nature of legacy this can currently also be used to get by $userId. + * @param boolean $inherit If true also return inherited role assignments from user groups. + * + * @return \eZ\Publish\SPI\Persistence\User\RoleAssignment[] + */ + public function loadRoleAssignmentsByGroupId( $groupId, $inherit = false ); + + /** + * Update role + * + * @param \eZ\Publish\SPI\Persistence\User\RoleUpdateStruct $role + */ + public function updateRole( RoleUpdateStruct $role ); + + /** + * Delete the specified role + * + * @param mixed $roleId + */ + public function deleteRole( $roleId ); + + /** + * Adds a policy to a role + * + * @param mixed $roleId + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * + * @return \eZ\Publish\SPI\Persistence\User\Policy + * @todo Throw on invalid Role Id? + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If $policy->limitation is empty (null, empty string/array..) + */ + public function addPolicy( $roleId, Policy $policy ); + + /** + * Update a policy + * + * Replaces limitations values with new values. + * + * @param \eZ\Publish\SPI\Persistence\User\Policy $policy + * + * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException If $policy->limitation is empty (null, empty string/array..) + */ + public function updatePolicy( Policy $policy ); + + /** + * Removes a policy from a role + * + * @param mixed $roleId + * @param mixed $policyId + * + * @todo Throw exception on missing role / policy? + * + * @return void + */ + public function removePolicy( $roleId, $policyId ); + + /** + * Returns the user policies associated with the user (including inherited policies from user groups) + * + * @param mixed $userId + * In legacy storage engine this is the content object id roles are assigned to in ezuser_role. + * @return \eZ\Publish\SPI\Persistence\User\Policy[] + */ + public function loadPoliciesByUserId( $userId ); + + /** + * Assigns role to a user or user group with given limitations + * + * The limitation array looks like: + * <code> + * array( + * 'Subtree' => array( + * '/1/2/', + * '/1/4/', + * ), + * 'Foo' => array( 'Bar' ), + * … + * ) + * </code> + * + * Where the keys are the limitation identifiers, and the respective values + * are an array of limitation values. The limitation parameter is optional. + * + * @param mixed $contentId The groupId or userId to assign the role to. + * @param mixed $roleId + * @param array $limitation + */ + public function assignRole( $contentId, $roleId, array $limitation = null ); + + /** + * Un-assign a role + * + * @param mixed $contentId The user or user group Id to un-assign the role from. + * @param mixed $roleId + */ + public function unAssignRole( $contentId, $roleId ); +} diff --git a/eZ/Publish/SPI/Persistence/User/Policy.php b/eZ/Publish/SPI/Persistence/User/Policy.php new file mode 100644 index 0000000..9d3be4f --- /dev/null +++ b/eZ/Publish/SPI/Persistence/User/Policy.php @@ -0,0 +1,72 @@ +<?php +/** + * File containing the Policy class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\User; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class Policy extends ValueObject +{ + /** + * ID of the policy + * + * @var mixed + */ + public $id; + + /** + * Foreign ID of the role + * + * @var mixed + */ + public $roleId; + + /** + * Name of module, associated with the Policy + * + * Eg: content + * + * @var string + */ + public $module; + + /** + * Name of the module function Or all functions with '*' + * + * Eg: read + * + * @var string + */ + public $function; + + /** + * Array of policy limitations, which is just a random hash map. + * + * The limitation array may look like: + * <code> + * array( + * 'Subtree' => array( + * '/1/2/', + * '/1/4/', + * ), + * 'Foo' => array( 'Bar' ), + * … + * ) + * </code> + * + * Where the keys are the limitation identifiers, and the respective values + * are an array of limitation values + * + * @var array|string If string, then only the value '*' is allowed, meaning all limitations. + * Can not be a empty array as '*' should be used in this case. + */ + public $limitations; +} diff --git a/eZ/Publish/SPI/Persistence/User/Role.php b/eZ/Publish/SPI/Persistence/User/Role.php new file mode 100644 index 0000000..69b5b74 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/User/Role.php @@ -0,0 +1,67 @@ +<?php +/** + * File containing the Role class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\User; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class Role extends ValueObject +{ + /** + * ID of the user rule + * + * @var mixed + */ + public $id; + + /** + * Identifier of the role + * + * Legacy note: Maps to name in 4.x. + * + * @var string + */ + public $identifier; + + /** + * Name of the role + * + * @since 5.0 + * @var string[] + */ + public $name; + + /** + * Name of the role + * + * @since 5.0 + * @var string[] + */ + public $description = array(); + + /** + * Policies associated with the role + * + * @var \eZ\Publish\SPI\Persistence\User\Policy[] + */ + public $policies = array(); + + /** + * Contains an array of group IDs that has this role assigned. + * + * In legacy storage engine, these are the contentobject_id's in ezuser_role. + * These id's can by the nature of legacy engine both point to a user group and a user, + * but the latter is deprecated. + * + * @var mixed[] In current implementation, id's are contentId's + */ + public $groupIds = array(); +} diff --git a/eZ/Publish/SPI/Persistence/User/RoleAssignment.php b/eZ/Publish/SPI/Persistence/User/RoleAssignment.php new file mode 100644 index 0000000..20d1221 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/User/RoleAssignment.php @@ -0,0 +1,45 @@ +<?php +/** + * File containing the RoleAssignment class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\User; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class RoleAssignment extends ValueObject +{ + /** + * The Role connected to this assignment + * + * @var \eZ\Publish\SPI\Persistence\User\Role + */ + public $role; + + /** + * The user or user group id + * + * @var mixed + */ + public $contentId; + + /** + * One of 'Subtree' or 'Section' + * + * @var string|null + */ + public $limitationIdentifier; + + /** + * The subtree paths or section ids. + * + * @var mixed[]|null + */ + public $values; +} diff --git a/eZ/Publish/SPI/Persistence/User/RoleUpdateStruct.php b/eZ/Publish/SPI/Persistence/User/RoleUpdateStruct.php new file mode 100644 index 0000000..5242913 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/User/RoleUpdateStruct.php @@ -0,0 +1,49 @@ +<?php +/** + * File containing the RoleUpdateStruct class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence\User; + +use eZ\Publish\SPI\Persistence\ValueObject; + +/** + */ +class RoleUpdateStruct extends ValueObject +{ + /** + * ID of the user rule + * + * @var mixed + */ + public $id; + + /** + * Identifier of the role + * + * Legacy note: Maps to name in 4.x. + * + * @var string + */ + public $identifier; + + /** + * Name of the role + * + * @since 5.0 + * @var string[] + */ + public $name; + + /** + * Name of the role + * + * @since 5.0 + * @var string[] + */ + public $description = array(); +} diff --git a/eZ/Publish/SPI/Persistence/ValueObject.php b/eZ/Publish/SPI/Persistence/ValueObject.php new file mode 100644 index 0000000..586af06 --- /dev/null +++ b/eZ/Publish/SPI/Persistence/ValueObject.php @@ -0,0 +1,18 @@ +<?php +/** + * File containing the ValueObject class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Persistence; + +use eZ\Publish\API\Repository\Values\ValueObject as APIValueObject; + +/** + */ +abstract class ValueObject extends APIValueObject +{ +} diff --git a/eZ/Publish/SPI/Tests/FieldType/AuthorIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/AuthorIntegrationTest.php new file mode 100644 index 0000000..2688c18 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/AuthorIntegrationTest.php @@ -0,0 +1,148 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\AuthorIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class AuthorIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezauthor'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezauthor', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezauthor', + new Legacy\Content\FieldValue\Converter\Author() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezauthor field type does not have any special field definition + // properties + array( 'fieldType', 'ezauthor' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints( array() ) ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( + array( + 'id' => 14, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com' + ), + ), + 'externalData' => null, + 'sortKey' => null, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( + array( + 'id' => 14, + 'name' => 'Hans Mueller', + 'email' => 'hans@example.com' + ), + array( + 'id' => 10, + 'name' => 'Lieschen Mueller', + 'email' => 'lieschen@example.com' + ), + ), + 'externalData' => null, + 'sortKey' => null, + ) + ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/BaseIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/BaseIntegrationTest.php new file mode 100644 index 0000000..fc40694 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/BaseIntegrationTest.php @@ -0,0 +1,550 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\BaseIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy\Tests\TestCase; +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\Type; +use eZ\Publish\SPI\Persistence\Content\UpdateStruct; +use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\ConverterRegistry; +use eZ\Publish\Core\Persistence\Legacy\Content\StorageRegistry; + +/** + * Integration test for the legacy storage + * + * @group integration + */ +abstract class BaseIntegrationTest extends TestCase +{ + /** + * Property indicating whether the DB already has been set up + * + * @var boolean + */ + protected static $setUp = false; + + /** + * Id of test content type + * + * @var string + */ + protected static $contentTypeId; + + /** + * Id of test content + * + * @var string + */ + protected static $contentId; + + /** + * Current version of test content + * + * @var string + */ + protected static $contentVersion; + + /** + * Returns the identifier of the FieldType under test + * + * @return string + */ + abstract public function getTypeName(); + + /** + * Returns the Handler with all necessary objects registered + * + * Returns an instance of the Persistence Handler where the + * FieldType\Storage has been registered. + * + * @return \eZ\Publish\SPI\Persistence\Handler + */ + abstract public function getCustomHandler(); + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + abstract public function getTypeConstraints(); + + /** + * Returns the field definition data expected after loading the newly + * created field definition with the FieldType under test + * + * This is a PHPUnit data provider + * + * @return array + */ + abstract public function getFieldDefinitionData(); + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + abstract public function getInitialValue(); + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $this->assertEquals( + $this->getInitialValue(), + $field->value + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + abstract public function getUpdatedValue(); + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $this->assertEquals( + $this->getUpdatedValue(), + $field->value + ); + } + + /** + * Method called after content creation + * + * Useful, if additional stuff should be executed (like creating the actual + * user). + * + * @param Legacy\Handler $handler + * @param Content $content + * + * @return void + */ + public function postCreationHook( Legacy\Handler $handler, Content $content ) + { + // Do nothing by default + } + + /** + * Can be overwritten to assert that additional data has been deleted + * + * @param Content $content + * + * @return void + */ + public function assertDeletedFieldDataCorrect( Content $content ) + { + // Do nothing by default + } + + /** + * Only set up once for these read only tests on a large fixture + * + * Skipping the reset-up, since setting up for these tests takes quite some + * time, which is not required to spent, since we are only reading from the + * database anyways. + * + * @return void + */ + public function setUp() + { + if ( !self::$setUp ) + { + parent::setUp(); + $this->insertDatabaseFixture( __DIR__ . '/../../../Core/Repository/Tests/Service/Integration/Legacy/_fixtures/clean_ezdemo_47_dump.php' ); + self::$setUp = $this->handler; + } + else + { + $this->handler = self::$setUp; + } + } + + public function testCreateContentType() + { + $contentType = $this->createContentType(); + + $this->assertNotNull( $contentType->id ); + self::$contentTypeId = $contentType->id; + + return $contentType; + } + + /** + * Performs the creation of the content type with a field of the field type + * under test + * + * @return ContentType + */ + protected function createContentType() + { + $createStruct = new Content\Type\CreateStruct( + array( + 'name' => array( 'eng-GB' => 'Test' ), + 'identifier' => 'test-' . $this->getTypeName(), + 'status' => 0, + 'creatorId' => 14, + 'created' => time(), + 'modifierId' => 14, + 'modified' => time(), + 'initialLanguageId' => 2, + 'remoteId' => 'abcdef', + ) + ); + + $createStruct->fieldDefinitions = array( + new Content\Type\FieldDefinition( + array( + 'name' => array( 'eng-GB' => 'Name' ), + 'identifier' => 'name', + 'fieldGroup' => 'main', + 'position' => 1, + 'fieldType' => 'ezstring', + 'isTranslatable' => false, + 'isRequired' => true, + ) + ), + new Content\Type\FieldDefinition( + array( + 'name' => array( 'eng-GB' => 'Data' ), + 'identifier' => 'data', + 'fieldGroup' => 'main', + 'position' => 2, + 'fieldType' => $this->getTypeName(), + 'isTranslatable' => false, + 'isRequired' => true, + 'fieldTypeConstraints' => $this->getTypeConstraints(), + ) + ), + ); + + $handler = $this->getCustomHandler(); + $contentTypeHandler = $handler->contentTypeHandler(); + + return $contentTypeHandler->create( $createStruct ); + } + + /** + * @depends testCreateContentType + */ + public function testContentTypeField( $contentType ) + { + $this->assertSame( + $this->getTypeName(), + $contentType->fieldDefinitions[1]->fieldType + ); + } + + /** + * @depends testCreateContentType + */ + public function testLoadContentTypeField() + { + $handler = $this->getCustomHandler(); + $contentTypeHandler = $handler->contentTypeHandler(); + + return $contentTypeHandler->load( self::$contentTypeId ); + } + + /** + * @depends testLoadContentTypeField + */ + public function testLoadContentTypeFieldType( $contentType ) + { + $this->assertSame( + $this->getTypeName(), + $contentType->fieldDefinitions[1]->fieldType + ); + + return $contentType->fieldDefinitions[1]; + } + + /** + * @depends testLoadContentTypeFieldType + * @dataProvider getFieldDefinitionData + */ + public function testLoadContentTypeFieldData( $name, $value, $field ) + { + $this->assertEquals( + $value, + $field->$name + ); + } + + /** + * @depends testLoadContentTypeField + */ + public function testCreateContent( $contentType ) + { + $handler = $this->getCustomHandler(); + + $content = $this->createContent( $contentType, $this->getInitialValue() ); + + self::$contentId = $content->versionInfo->contentInfo->id; + self::$contentVersion = $content->versionInfo->contentInfo->currentVersionNo; + + $this->postCreationHook( $handler, $content ); + + return $content; + } + + /** + * Creates content of the given $contentType with $fieldValue in + * $languageCode + * + * @param Type $contentType + * @param mixed $fieldValue + * @param string $languageCode + * + * @return Content + */ + protected function createContent( Type $contentType, $fieldValue, $languageCode = 'eng-GB' ) + { + $createStruct = new Content\CreateStruct( + array( + 'name' => array( $languageCode => 'Test object' ), + 'typeId' => $contentType->id, + 'sectionId' => 1, + 'ownerId' => 14, + 'locations' => array( + new Content\Location\CreateStruct( + array( + 'parentId' => 2, + 'remoteId' => 'sindelfingen', + ) + ) + ), + 'initialLanguageId' => 2, + 'remoteId' => microtime(), + 'modified' => time(), + 'fields' => array( + new Content\Field( + array( + 'type' => 'ezstring', + 'languageCode' => $languageCode, + 'fieldDefinitionId' => $contentType->fieldDefinitions[0]->id, + 'value' => new Content\FieldValue( + array( + 'data' => 'This is just a test object', + 'sortKey' => 'this is just a test object', + ) + ), + ) + ), + new Content\Field( + array( + 'type' => $this->getTypeName(), + 'languageCode' => $languageCode, + 'fieldDefinitionId' => $contentType->fieldDefinitions[1]->id, + 'value' => $fieldValue, + ) + ), + ), + ) + ); + + $handler = $this->getCustomHandler(); + $contentHandler = $handler->contentHandler(); + return $contentHandler->create( $createStruct ); + } + + /** + * @depends testCreateContent + */ + public function testCreatedFieldType( $content ) + { + $this->assertSame( + $this->getTypeName(), + $content->fields[1]->type + ); + + return $content->fields[1]; + } + + /** + * @depends testCreateContent + */ + public function testLoadField() + { + $handler = $this->getCustomHandler(); + + $contentHandler = $handler->contentHandler(); + return $contentHandler->load( self::$contentId, self::$contentVersion ); + } + + /** + * @depends testLoadField + */ + public function testLoadFieldType( $content ) + { + $this->assertSame( + $this->getTypeName(), + $content->fields[1]->type + ); + + return $content->fields[1]; + } + + /** + * @depends testLoadFieldType + */ + public function testLoadExternalData( $field ) + { + $this->assertLoadedFieldDataCorrect( $field ); + } + + /** + * @depends testLoadFieldType + */ + public function testUpdateField( $field ) + { + $field->value = $this->getUpdatedValue(); + + return $this->updateContent( self::$contentId, self::$contentVersion, $field ); + } + + /** + * Performs an update on $contentId in $contentVersion setting $field + * + * @param mixed $contentId + * @param mixed $contentVersion + * @param Field $field + * + * @return Content + */ + protected function updateContent( $contentId, $contentVersion, Field $field ) + { + $handler = $this->getCustomHandler(); + + $field->value = $this->getUpdatedValue(); + $updateStruct = new UpdateStruct( + array( + 'creatorId' => 14, + 'modificationDate' => time(), + 'initialLanguageId' => 2, + 'fields' => array( + $field, + ) + ) + ); + + $contentHandler = $handler->contentHandler(); + return $contentHandler->updateContent( $contentId, $contentVersion, $updateStruct ); + } + + /** + * @depends testUpdateField + */ + public function testUpdateFieldType( $content ) + { + $this->assertSame( + $this->getTypeName(), + $content->fields[1]->type + ); + + return $content->fields[1]; + } + + /** + * @depends testUpdateFieldType + */ + public function testUpdateExternalData( $field ) + { + $this->assertUpdatedFieldDataCorrect( $field ); + } + + /** + * @depends testUpdateField + * @expectedException \eZ\Publish\API\Repository\Exceptions\NotFoundException + */ + public function testDeleteField( $content ) + { + $handler = $this->getCustomHandler(); + $contentHandler = $handler->contentHandler(); + + $this->deleteContent( $content ); + + $this->assertDeletedFieldDataCorrect( $content ); + + $contentHandler->load( + $content->versionInfo->contentInfo->id, + $content->versionInfo->versionNo + ); + } + + /** + * Deletes the given $content + * + * @param Content $content + * + * @return void + */ + protected function deleteContent( Content $content ) + { + $handler = $this->getCustomHandler(); + $contentHandler = $handler->contentHandler(); + + $contentHandler->removeRawContent( + $content->versionInfo->contentInfo->id + ); + } + + /** + * Returns the Handler + * + * @return Handler + */ + protected function getHandler() + { + return new Legacy\Handler( + self::$setUp, + new ConverterRegistry( + array( + 'ezstring' => new Legacy\Content\FieldValue\Converter\TextLine(), + ) + ), + new StorageRegistry( + array() + ), + $this->getMock( + 'eZ\\Publish\\Core\\Persistence\\Legacy\\Content\\Search\\TransformationProcessor\\DefinitionBased', + array(), + array(), + '', + false + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/BinaryFileIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/BinaryFileIntegrationTest.php new file mode 100644 index 0000000..3577a39 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/BinaryFileIntegrationTest.php @@ -0,0 +1,335 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; +use RecursiveIteratorIterator; +use RecursiveDirectoryIterator; +use FileSystemIterator; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class BinaryFileIntegrationTest extends FileBaseIntegrationTest +{ + /** + * Returns the storage dir used by the file service + * + * @return string + */ + protected function getStorageDir() + { + return 'var/files'; + } + + /** + * Returns the storage identifier prefix used by the file service + * + * @return void + */ + protected function getStorageIdentifierPrefix() + { + return ''; + } + + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezbinaryfile'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezbinaryfile', + new FieldType\BinaryFile\BinaryFileStorage( + array( + 'LegacyStorage' => new FieldType\BinaryFile\BinaryFileStorage\Gateway\LegacyStorage(), + ), + $this->getFileService(), + new FieldType\BinaryBase\PathGenerator\LegacyPathGenerator() + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezbinaryfile', + new Legacy\Content\FieldValue\Converter\BinaryFile() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2, // 2 MB + ) + ) + ) + ); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezint field type does not have any special field definition + // properties + array( 'fieldType', 'ezbinaryfile' ), + array( + 'fieldTypeConstraints', + new FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2, // 2 MB + ) + ) + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.jpg' ), + 'fileName' => 'Ice-Flower-Binary.jpg', + 'fileSize' => filesize( $path ), + 'mimeType' => 'image/jpeg', + 'downloadCount' => 0, + ), + 'sortKey' => '', + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $this->assertNotNull( $field->value->externalData ); + + $this->assertTrue( + file_exists( ( $path = $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $field->value->externalData['path'] ) ) + ); + + $this->assertEquals( 'Ice-Flower-Binary.jpg', $field->value->externalData['fileName'] ); + $this->assertEquals( filesize( $path ), $field->value->externalData['fileSize'] ); + $this->assertEquals( 'image/jpeg', $field->value->externalData['mimeType'] ); + $this->assertEquals( 0, $field->value->externalData['downloadCount'] ); + + $this->assertNull( $field->value->data ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.png' ), + 'fileName' => 'Blueish-Blue-Binary.jpg', + 'fileSize' => filesize( $path ), + 'mimeType' => 'image/png', + 'downloadCount' => 23, + ), + 'sortKey' => '', + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $this->assertNotNull( $field->value->externalData ); + + $this->assertTrue( + file_exists( ( $filePath = $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $field->value->externalData['path'] ) ) + ); + + // Check old file removed before update + $this->assertEquals( + 1, + count( glob( dirname( $filePath ) . '/*' ) ) + ); + + $this->assertEquals( 'Blueish-Blue-Binary.jpg', $field->value->externalData['fileName'] ); + $this->assertEquals( filesize( $filePath ), $field->value->externalData['fileSize'] ); + $this->assertEquals( 'image/png', $field->value->externalData['mimeType'] ); + $this->assertEquals( 23, $field->value->externalData['downloadCount'] ); + + $this->assertNull( $field->value->data ); + } + + /** + * Can be overwritten to assert that additional data has been deleted + * + * @param Content $content + * + * @return void + */ + public function assertDeletedFieldDataCorrect( Content $content ) + { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + $this->getTempDir() . '/' . $this->getStorageDir(), + FileSystemIterator::KEY_AS_PATHNAME | FileSystemIterator::SKIP_DOTS | FileSystemIterator::CURRENT_AS_FILEINFO + ), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ( $iterator as $path => $fileInfo ) + { + if ( $fileInfo->isFile() ) + { + $this->fail( + sprintf( + 'Found undeleted file "%s"', + $path + ) + ); + } + } + + } + + /** + * @dep_ends \eZ\Publish\SPI\Tests\FieldType\BinaryFileIntegrationTest::testCreateContentType + */ + public function testBinaryFilesNotDeletedIfReferencesStillExist() + { + $contentType = $this->createContentType(); + + $firstContent = $this->createContent( $contentType, $this->getInitialValue() ); + + $firstField = null; + foreach ( $firstContent->fields as $field ) + { + if ( $field->type === $this->getTypeName() ) + { + $firstField = $field; + } + } + + $clonedValue = clone $firstField->value; + + // Create an image reference copy + $secondContent = $this->createContent( $contentType, $clonedValue ); + + $secondField = null; + foreach ( $secondContent->fields as $field ) + { + if ( $field->type === $this->getTypeName() ) + { + $secondField = $field; + } + } + + $this->assertNotEquals( + $firstField->id, + $secondField->id + ); + + $this->assertEquals( $firstField->value, $secondField->value ); + + $this->deleteContent( $firstContent ); + + $this->assertTrue( + file_exists( $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $secondField->value->externalData['path'] ) + ); + + $this->deleteContent( $secondContent ); + + $this->assertFalse( + file_exists( $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $secondField->value->externalData['path'] ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/CheckboxIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/CheckboxIntegrationTest.php new file mode 100644 index 0000000..94af8a8 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/CheckboxIntegrationTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\CheckboxIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class CheckboxIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezbool'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezbool', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezbool', + new Legacy\Content\FieldValue\Converter\Checkbox() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezbool field type does not have any special field definition + // properties + array( 'fieldType', 'ezbool' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints( array() ) ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => true, + 'externalData' => null, + 'sortKey' => 1, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => false, + 'externalData' => null, + 'sortKey' => 0, + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/CountryIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/CountryIntegrationTest.php new file mode 100644 index 0000000..8c88b10 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/CountryIntegrationTest.php @@ -0,0 +1,141 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class CountryIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezcountry'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezcountry', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezcountry', + new Legacy\Content\FieldValue\Converter\Country() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezcountry field type does not have any special field definition + // properties + array( 'fieldType', 'ezcountry' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'fieldSettings' => new FieldType\FieldSettings( + array( + 'isMultiple' => false + ) + ), + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( 'BE' ), + 'externalData' => null, + 'sortKey' => "Belgium", + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( 'FR' ), + 'externalData' => null, + 'sortKey' => "France", + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/DateAndTimeIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/DateAndTimeIntegrationTest.php new file mode 100644 index 0000000..ddac6b4 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/DateAndTimeIntegrationTest.php @@ -0,0 +1,149 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class DateAndTimeIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezdate'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezdate', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezdate', + new Legacy\Content\FieldValue\Converter\DateAndTime() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezdate field type does not have any special field definition + // properties + array( 'fieldType', 'ezdate' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'fieldSettings' => new FieldType\FieldSettings( + array( + 'defaultType' => 0, + 'useSeconds' => false, + 'dateInterval' => null, + ) + ), + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( + 'timestamp' => 123456, + 'rfc850' => null, + ), + 'externalData' => null, + 'sortKey' => 42, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( + 'timestamp' => 12345678, + 'rfc850' => null, + ), + 'externalData' => null, + 'sortKey' => 23, + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/EmailAddressIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/EmailAddressIntegrationTest.php new file mode 100644 index 0000000..c2684ad --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/EmailAddressIntegrationTest.php @@ -0,0 +1,140 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\MailIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class EmailAddressIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezemail'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezemail', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezemail', + new Legacy\Content\FieldValue\Converter\EmailAddress() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezstring field type does not have any special field definition + // properties + array( 'fieldType', 'ezemail' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'validators' => array( + 'EmailAddressValidator' => array(), + ), + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => 'nospam@ez.no', + 'externalData' => null, + 'sortKey' => 'nospam@ez.no', + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => 'no-spam@example.com', + 'externalData' => null, + 'sortKey' => 'no-spam@example.com', + ) + ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/FileBaseIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/FileBaseIntegrationTest.php new file mode 100644 index 0000000..1b0864f --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/FileBaseIntegrationTest.php @@ -0,0 +1,129 @@ +<?php + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\FieldType; +use RecursiveIteratorIterator; +use RecursiveDirectoryIterator; +use FileSystemIterator; + +abstract class FileBaseIntegrationTest extends BaseIntegrationTest +{ + /** + * If the temporary directory should be removed after the tests. + * + * @var boolean + */ + protected static $removeTmpDir = false; + + /** + * Temporary directory + * + * @var string + */ + protected static $tmpDir; + + /** + * Returns the storage dir used by the file service + * + * @return string + */ + abstract protected function getStorageDir(); + + /** + * Returns the storage identifier prefix used by the file service + * + * @return void + */ + abstract protected function getStorageIdentifierPrefix(); + + /** + * Returns a file service to be used. + * + * @return FileService + */ + protected function getFileService() + { + return new FieldType\FileService\LocalFileService( + $this->getTempDir(), + $this->getStorageDir(), + $this->getStorageIdentifierPrefix() + ); + } + + /** + * Returns the temporary directory to be used for file storage + * + * @return string + */ + protected function getTempDir() + { + return self::$tmpDir; + } + + /** + * Sets up a temporary directory and stores its path in self::$tmpDir + * + * @return void + */ + public static function setUpBeforeClass() + { + $calledClass = get_called_class(); + + $tmpFile = tempnam( + sys_get_temp_dir(), + 'eZ_' . substr( $calledClass, strrpos( $calledClass, '\\' ) + 1 ) + ); + + // Convert file into directory + unlink( $tmpFile ); + mkdir( $tmpFile ); + + self::$tmpDir = $tmpFile; + } + + /** + * Removes the temp dir, if self::$removeTmpDir is true + * + * @return void + */ + public static function tearDownAfterClass() + { + if ( self::$removeTmpDir ) + { + self::removeRecursive( self::$tmpDir ); + } + } + + /** + * Removes the given directory path recursively + * + * @param string $dir + * + * @return void + */ + protected static function removeRecursive( $dir ) + { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + $dir, + FileSystemIterator::KEY_AS_PATHNAME | FileSystemIterator::SKIP_DOTS | FileSystemIterator::CURRENT_AS_FILEINFO + ), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ( $iterator as $path => $fileInfo ) + { + if ( $fileInfo->isDir() ) + { + rmdir( $path ); + } + else + { + unlink( $path ); + } + } + + rmdir( $dir ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/FloatIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/FloatIntegrationTest.php new file mode 100644 index 0000000..ad79aa3 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/FloatIntegrationTest.php @@ -0,0 +1,142 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\FloatIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class FloatIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezfloat'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezfloat', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezfloat', + new Legacy\Content\FieldValue\Converter\Float() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezfloat field type does not have any special field definition + // properties + array( 'fieldType', 'ezfloat' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'validators' => array( + 'FloatValueValidator' => array( + 'minFloatValue' => false, + 'maxFloatValue' => false, + ), + ), + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => 42.42, + 'externalData' => null, + 'sortKey' => 42, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => 23.23, + 'externalData' => null, + 'sortKey' => 23, + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/ImageIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/ImageIntegrationTest.php new file mode 100644 index 0000000..a4a6d6f --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/ImageIntegrationTest.php @@ -0,0 +1,331 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\ImageIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use RecursiveIteratorIterator; +use RecursiveDirectoryIterator; +use FileSystemIterator; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class ImageIntegrationTest extends FileBaseIntegrationTest +{ + /** + * Returns the storage dir used by the file service + * + * @return string + */ + protected function getStorageDir() + { + return ''; + } + + /** + * Returns the storage identifier prefix used by the file service + * + * @return void + */ + protected function getStorageIdentifierPrefix() + { + return 'var/my_site/storage/images'; + } + + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezimage'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezimage', + new FieldType\Image\ImageStorage( + array( + 'LegacyStorage' => new FieldType\Image\ImageStorage\Gateway\LegacyStorage(), + ), + $this->getFileService(), + new FieldType\Image\PathGenerator\LegacyPathGenerator() + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezimage', + new Legacy\Content\FieldValue\Converter\Image() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ) + ) + ) + ); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezint field type does not have any special field definition + // properties + array( 'fieldType', 'ezimage' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ) + ) + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'path' => __DIR__ . '/_fixtures/image.jpg', + 'fileName' => 'Ice-Flower.jpg', + 'alternativeText' => 'An icy flower.', + ), + 'sortKey' => '', + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $this->assertNotNull( $field->value->data ); + + $this->assertTrue( + file_exists( $this->getTempDir() . '/' . $field->value->data['path'] ) + ); + + $this->assertEquals( 'Ice-Flower.jpg', $field->value->data['fileName'] ); + + $this->assertEquals( 'An icy flower.', $field->value->data['alternativeText'] ); + + $this->assertNull( $field->value->externalData ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'path' => __DIR__ . '/_fixtures/image.png', + 'fileName' => 'Blueish-Blue.jpg', + 'alternativeText' => 'This blue is so blueish.', + ), + 'sortKey' => '', + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $this->assertNotNull( $field->value->data ); + + $this->assertTrue( + file_exists( ( $filePath = $this->getTempDir() . '/' . $field->value->data['path'] ) ) + ); + + // Check old files not removed before update + // need to stay there for reference integrity + $this->assertEquals( + 2, + count( glob( dirname( $filePath ) . '/*' ) ) + ); + + $this->assertEquals( 'Blueish-Blue.jpg', $field->value->data['fileName'] ); + + $this->assertEquals( 'This blue is so blueish.', $field->value->data['alternativeText'] ); + + $this->assertNull( $field->value->externalData ); + } + + /** + * Can be overwritten to assert that additional data has been deleted + * + * @param Content $content + * + * @return void + */ + public function assertDeletedFieldDataCorrect( Content $content ) + { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + $this->getTempDir() . '/' . $this->getStorageDir(), + FileSystemIterator::KEY_AS_PATHNAME | FileSystemIterator::SKIP_DOTS | FileSystemIterator::CURRENT_AS_FILEINFO + ), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ( $iterator as $path => $fileInfo ) + { + if ( $fileInfo->isFile() ) + { + $this->fail( + sprintf( + 'Found undeleted file "%s"', + $path + ) + ); + } + } + } + + /** + * @dep_ends \eZ\Publish\SPI\Tests\FieldType\ImageIntegrationTest::testCreateContentType + */ + public function testImagesNotDeletedIfReferencesStillExist() + { + $contentType = $this->createContentType(); + + $firstContent = $this->createContent( $contentType, $this->getInitialValue() ); + + $firstField = null; + foreach ( $firstContent->fields as $field ) + { + if ( $field->type === $this->getTypeName() ) + { + $firstField = $field; + } + } + + $clonedValue = clone $firstField->value; + + // Create an image reference copy + $secondContent = $this->createContent( $contentType, $clonedValue ); + + $secondField = null; + foreach ( $secondContent->fields as $field ) + { + if ( $field->type === $this->getTypeName() ) + { + $secondField = $field; + } + } + + $this->assertNotEquals( + $firstField->value->data['fieldId'], + $secondField->value->data['fieldId'] + ); + unset( $firstField->value->data['fieldId'] ); + unset( $secondField->value->data['fieldId'] ); + + $this->assertEquals( $firstField->value, $secondField->value ); + + $this->deleteContent( $firstContent ); + + $this->assertTrue( + file_exists( $this->getTempDir() . '/' . $secondField->value->data['path'] ) + ); + + $this->deleteContent( $secondContent ); + + $this->assertFalse( + file_exists( $this->getTempDir() . '/' . $secondField->value->data['path'] ) + ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/IntegerIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/IntegerIntegrationTest.php new file mode 100644 index 0000000..80085ce --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/IntegerIntegrationTest.php @@ -0,0 +1,143 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\IntegerIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class IntegerIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezint'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezint', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezint', + new Legacy\Content\FieldValue\Converter\Integer() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezint field type does not have any special field definition + // properties + array( 'fieldType', 'ezint' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'validators' => array( + 'IntegerValueValidator' => array( + 'minIntegerValue' => false, + 'maxIntegerValue' => false, + ), + ), + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => 42, + 'externalData' => null, + 'sortKey' => 42, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => 23, + 'externalData' => null, + 'sortKey' => 23, + ) + ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/KeywordIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/KeywordIntegrationTest.php new file mode 100644 index 0000000..fc8607e --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/KeywordIntegrationTest.php @@ -0,0 +1,216 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\KeywordIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class KeywordIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezkeyword'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezkeyword', + new FieldType\Keyword\KeywordStorage( + array( + 'LegacyStorage' => new FieldType\Keyword\KeywordStorage\Gateway\LegacyStorage(), + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezkeyword', + new Legacy\Content\FieldValue\Converter\NullConverter() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezkeyword field type does not have any special field definition + // properties + array( 'fieldType', 'ezkeyword' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints() ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( 'foo', 'bar', 'sindelfingen' ), + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $this->assertKeywordSetsEqual( + $this->getInitialValue()->externalData, + $field->value->externalData + ); + + $this->assertNull( $field->value->data ); + $this->assertNull( $field->value->sortKey ); + } + + /** + * Asserts that 2 keyword sets equal + * + * @param array $expectedKeywords + * @param array $actualKeywords + * + * @return void + */ + protected function assertKeywordSetsEqual( $expectedKeywords, $actualKeywords ) + { + // Assert all expected keywords are loaded + foreach ( $expectedKeywords as $keyword ) + { + if ( ( $index = array_search( $keyword, $actualKeywords ) ) === false ) + { + $this->fail( + sprintf( + 'Keyword "%s" not loaded.', + $keyword + ) + ); + } + unset( $actualKeywords[$index] ); + } + + // Assert no additional keywords have been loaded + if ( !empty( $actualKeywords ) ) + { + $this->fail( + sprintf( + 'Loaded unexpected keywords: "%s"', + implode( '", "', $actualKeywords ) + ) + ); + } + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( 'sindelfingen', 'baz' ), + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $this->assertKeywordSetsEqual( + $this->getUpdatedValue()->externalData, + $field->value->externalData + ); + + $this->assertNull( $field->value->data ); + $this->assertNull( $field->value->sortKey ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/MapLocationIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/MapLocationIntegrationTest.php new file mode 100644 index 0000000..c9c09a4 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/MapLocationIntegrationTest.php @@ -0,0 +1,180 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\MapLocationIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class MapLocationIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezgmaplocation'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezgmaplocation', + new FieldType\MapLocation\MapLocationStorage( + array( + 'LegacyStorage' => new FieldType\MapLocation\MapLocationStorage\Gateway\LegacyStorage(), + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezgmaplocation', + new Legacy\Content\FieldValue\Converter\MapLocation() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezgmaplocation field type does not have any special field definition + // properties + array( 'fieldType', 'ezgmaplocation' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints() ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'latitude' => 51.564479, + 'longitude' => 6.692219, + 'address' => 'Sindelfingen' + ), + 'sortKey' => 'Sindelfingen', + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $this->assertEquals( + $this->getInitialValue()->externalData, + $field->value->externalData + ); + + $this->assertNull( $field->value->data ); + $this->assertNull( $field->value->sortKey ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + // Empty value + 'externalData' => null, + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $this->assertNull( $field->value->externalData ); + $this->assertNull( $field->value->data ); + $this->assertNull( $field->value->sortKey ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/MediaIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/MediaIntegrationTest.php new file mode 100644 index 0000000..8f87baf --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/MediaIntegrationTest.php @@ -0,0 +1,360 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; +use RecursiveIteratorIterator; +use RecursiveDirectoryIterator; +use FileSystemIterator; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class MediaIntegrationTest extends FileBaseIntegrationTest +{ + /** + * Returns the storage dir used by the file service + * + * @return string + */ + protected function getStorageDir() + { + return 'var/files'; + } + + /** + * Returns the storage identifier prefix used by the file service + * + * @return void + */ + protected function getStorageIdentifierPrefix() + { + return ''; + } + + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezmedia'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezmedia', + new FieldType\Media\MediaStorage( + array( + 'LegacyStorage' => new FieldType\Media\MediaStorage\Gateway\LegacyStorage(), + ), + $this->getFileService(), + new FieldType\BinaryBase\PathGenerator\LegacyPathGenerator() + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezmedia', + new Legacy\Content\FieldValue\Converter\Media() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ) + ), + 'fieldSettings' => new FieldType\FieldSettings( + array( + 'mediaType' => FieldType\Media\Type::TYPE_SILVERLIGHT, + ) + ) + ) + ); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + array( 'fieldType', 'ezmedia' ), + array( + 'fieldTypeConstraints', + new FieldTypeConstraints( + array( + 'validators' => array( + 'FileSizeValidator' => array( + 'maxFileSize' => 2 * 1024 * 1024, // 2 MB + ) + ), + 'fieldSettings' => new FieldType\FieldSettings( + array( + 'mediaType' => FieldType\Media\Type::TYPE_SILVERLIGHT, + ) + ) + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.jpg' ), + 'fileName' => 'Ice-Flower-Media.jpg', + 'fileSize' => filesize( $path ), + 'mimeType' => 'image/jpeg', + 'hasController' => true, + 'autoplay' => true, + 'loop' => true, + 'width' => 23, + 'height' => 42, + ), + 'sortKey' => '', + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $this->assertNotNull( $field->value->externalData ); + + $this->assertTrue( + file_exists( ( $path = $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $field->value->externalData['path'] ) ) + ); + + $this->assertEquals( 'Ice-Flower-Media.jpg', $field->value->externalData['fileName'] ); + $this->assertEquals( filesize( $path ), $field->value->externalData['fileSize'] ); + $this->assertEquals( 'image/jpeg', $field->value->externalData['mimeType'] ); + $this->assertEquals( true, $field->value->externalData['hasController'] ); + $this->assertEquals( true, $field->value->externalData['autoplay'] ); + $this->assertEquals( true, $field->value->externalData['loop'] ); + $this->assertEquals( 23, $field->value->externalData['width'] ); + $this->assertEquals( 42, $field->value->externalData['height'] ); + + $this->assertNull( $field->value->data ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'path' => ( $path = __DIR__ . '/_fixtures/image.png' ), + 'fileName' => 'Blueish-Blue-Media.jpg', + 'fileSize' => filesize( $path ), + 'mimeType' => 'image/png', + 'hasController' => false, + 'autoplay' => false, + 'loop' => false, + 'width' => 0, + 'height' => 0, + ), + 'sortKey' => '', + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $this->assertNotNull( $field->value->externalData ); + + $this->assertTrue( + file_exists( ( $filePath = $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $field->value->externalData['path'] ) ) + ); + + // Check old file removed before update + $this->assertEquals( + 1, + count( glob( dirname( $filePath ) . '/*' ) ) + ); + + $this->assertEquals( 'Blueish-Blue-Media.jpg', $field->value->externalData['fileName'] ); + $this->assertEquals( filesize( $filePath ), $field->value->externalData['fileSize'] ); + $this->assertEquals( 'image/png', $field->value->externalData['mimeType'] ); + $this->assertEquals( false, $field->value->externalData['hasController'] ); + $this->assertEquals( false, $field->value->externalData['autoplay'] ); + $this->assertEquals( false, $field->value->externalData['loop'] ); + $this->assertEquals( 0, $field->value->externalData['width'] ); + $this->assertEquals( 0, $field->value->externalData['height'] ); + + $this->assertNull( $field->value->data ); + } + + /** + * Can be overwritten to assert that additional data has been deleted + * + * @param Content $content + * + * @return void + */ + public function assertDeletedFieldDataCorrect( Content $content ) + { + $iterator = new RecursiveIteratorIterator( + new RecursiveDirectoryIterator( + $this->getTempDir() . '/' . $this->getStorageDir(), + FileSystemIterator::KEY_AS_PATHNAME | FileSystemIterator::SKIP_DOTS | FileSystemIterator::CURRENT_AS_FILEINFO + ), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ( $iterator as $path => $fileInfo ) + { + if ( $fileInfo->isFile() ) + { + $this->fail( + sprintf( + 'Found undeleted file "%s"', + $path + ) + ); + } + } + + } + + /** + * @dep_ends \eZ\Publish\SPI\Tests\FieldType\MediaIntegrationTest::testCreateContentType + */ + public function testMediasNotDeletedIfReferencesStillExist() + { + $contentType = $this->createContentType(); + + $firstContent = $this->createContent( $contentType, $this->getInitialValue() ); + + $firstField = null; + foreach ( $firstContent->fields as $field ) + { + if ( $field->type === $this->getTypeName() ) + { + $firstField = $field; + } + } + + $clonedValue = clone $firstField->value; + + // Create an image reference copy + $secondContent = $this->createContent( $contentType, $clonedValue ); + + $secondField = null; + foreach ( $secondContent->fields as $field ) + { + if ( $field->type === $this->getTypeName() ) + { + $secondField = $field; + } + } + + $this->assertNotEquals( + $firstField->id, + $secondField->id + ); + + $this->assertEquals( $firstField->value, $secondField->value ); + + $this->deleteContent( $firstContent ); + + $this->assertTrue( + file_exists( $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $secondField->value->externalData['path'] ) + ); + + $this->deleteContent( $secondContent ); + + $this->assertFalse( + file_exists( $this->getTempDir() . '/' . $this->getStorageDir() . '/' . $secondField->value->externalData['path'] ) + ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/RatingIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/RatingIntegrationTest.php new file mode 100644 index 0000000..a0ecba5 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/RatingIntegrationTest.php @@ -0,0 +1,130 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\RatingIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class RatingIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezsrrating'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezsrrating', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezsrrating', + new Legacy\Content\FieldValue\Converter\Rating() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezsrrating field type does not have any special field definition + // properties + array( 'fieldType', 'ezsrrating' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints( array() ) ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => 5, + 'externalData' => null, + 'sortKey' => null, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => 2, + 'externalData' => null, + 'sortKey' => null, + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/RelationIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/RelationIntegrationTest.php new file mode 100644 index 0000000..0ee29dc --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/RelationIntegrationTest.php @@ -0,0 +1,201 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class RelationIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezobjectrelation'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezobjectrelation', + new FieldType\Relation\RelationStorage( + array( + 'LegacyStorage' => new FieldType\Relation\RelationStorage\Gateway\LegacyStorage(), + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezobjectrelation', + new Legacy\Content\FieldValue\Converter\Relation() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints( + array( + 'fieldSettings' => array( + 'selectionMethod' => 0, + 'selectionRoot' => '' + ) + ) + ); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + $fieldSettings = array( + 'selectionMethod' => 0, + 'selectionRoot' => '' + ); + + return array( + array( 'fieldType', 'ezobjectrelation' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints( array( 'fieldSettings' => $fieldSettings ) ) ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( 'destinationContentId' => 1 ), + 'externalData' => array( 'destinationContentId' => 1 ), + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $expected = $this->getInitialValue(); + $this->assertEquals( + $expected->externalData, + $field->value->externalData + ); + + $this->assertNotNull( + $field->value->data['destinationContentId'] + ); + $this->assertEquals( + $expected->data['destinationContentId'], + $field->value->data['destinationContentId'] + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( 'destinationContentId' => 2 ), + 'externalData' => array( 'destinationContentId' => 2 ), + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $expected = $this->getUpdatedValue(); + $this->assertEquals( + $expected->externalData, + $field->value->externalData + ); + + $this->assertNotNull( + $field->value->data['destinationContentId'] + ); + $this->assertEquals( + $expected->data['destinationContentId'], + $field->value->data['destinationContentId'] + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/RelationListIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/RelationListIntegrationTest.php new file mode 100644 index 0000000..8454591 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/RelationListIntegrationTest.php @@ -0,0 +1,203 @@ +<?php +/** + * File contains: eZ\Publish\Core\Persistence\Legacy\Tests\HandlerTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class RelationListIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezobjectrelationlist'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezobjectrelationlist', + new FieldType\Relation\RelationStorage( + array( + 'LegacyStorage' => new FieldType\RelationList\RelationListStorage\Gateway\LegacyStorage(), + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezobjectrelationlist', + new Legacy\Content\FieldValue\Converter\RelationList( $this->handler ) + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints( + array( + 'fieldSettings' => array( + 'selectionMethod' => 0, + 'selectionDefaultLocation' => '', + 'selectionContentTypes' => array(), + ) + ) + ); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + $fieldSettings = array( + 'selectionMethod' => 0, + 'selectionDefaultLocation' => '', + 'selectionContentTypes' => array(), + ); + + return array( + array( 'fieldType', 'ezobjectrelationlist' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints( array( 'fieldSettings' => $fieldSettings ) ) ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( 'destinationContentIds' => array( 4 ) ), + 'externalData' => array( 'destinationContentIds' => array( 4 ) ), + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $expected = $this->getInitialValue(); + $this->assertEquals( + $expected->externalData, + $field->value->externalData + ); + + $this->assertNotNull( + $field->value->data['destinationContentIds'] + ); + $this->assertEquals( + $expected->data['destinationContentIds'], + $field->value->data['destinationContentIds'] + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( 'destinationContentIds' => array( 11 ) ), + 'externalData' => array( 'destinationContentIds' => array( 11 ) ), + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $expected = $this->getUpdatedValue(); + $this->assertEquals( + $expected->externalData, + $field->value->externalData + ); + + $this->assertNotNull( + $field->value->data['destinationContentIds'] + ); + $this->assertEquals( + $expected->data['destinationContentIds'], + $field->value->data['destinationContentIds'] + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/SelectionIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/SelectionIntegrationTest.php new file mode 100644 index 0000000..f97644f --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/SelectionIntegrationTest.php @@ -0,0 +1,145 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\SelectionIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType\FieldSettings; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * @group integration + */ +class SelectionIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezselection'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezselection', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezselection', + new Legacy\Content\FieldValue\Converter\Selection() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints( + array( + 'validators' => null, + 'fieldSettings' => new FieldSettings( + array( + 'isMultiple' => true, + 'options' => array( + 1 => 'First', + 2 => 'Second', + 3 => 'Sindelfingen', + ) + ) + ) + ) + ); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + array( 'fieldType', 'ezselection' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'validators' => null, + 'fieldSettings' => new FieldSettings( + array( + 'isMultiple' => true, + 'options' => array( + 1 => 'First', + 2 => 'Second', + 3 => 'Sindelfingen', + ) + ) + ) + ) + ) + ) + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( 1, 3 ), + 'externalData' => null, + 'sortKey' => '1-3', + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( 2 ), + 'externalData' => null, + 'sortKey' => '2', + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/TextBlockIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/TextBlockIntegrationTest.php new file mode 100644 index 0000000..ddd1882 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/TextBlockIntegrationTest.php @@ -0,0 +1,141 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\TextBlockIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class TextBlockIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'eztext'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'eztext', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'eztext', + new Legacy\Content\FieldValue\Converter\TextBlock() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The eztext field type does not have any special field definition + // properties + array( 'fieldType', 'eztext' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'fieldSettings' => new FieldType\FieldSettings( + array( + 'textRows' => 0, + ) + ) + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => 'Some longish text…', + 'externalData' => null, + 'sortKey' => 'some longish text', + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => 'A different longish text now…', + 'externalData' => null, + 'sortKey' => 'a different longish text now', + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/TextLineIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/TextLineIntegrationTest.php new file mode 100644 index 0000000..42dd580 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/TextLineIntegrationTest.php @@ -0,0 +1,142 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\TextLineIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class TextLineIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezstring'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezstring', + new FieldType\NullStorage() + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezstring', + new Legacy\Content\FieldValue\Converter\TextLine() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezstring field type does not have any special field definition + // properties + array( 'fieldType', 'ezstring' ), + array( + 'fieldTypeConstraints', + new Content\FieldTypeConstraints( + array( + 'validators' => array( + 'StringLengthValidator' => array( + 'minStringLength' => 0, + 'maxStringLength' => 0, + ), + ), + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => 'Some text…', + 'externalData' => null, + 'sortKey' => 'some text', + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => null, + 'sortKey' => '', + ) + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/UrlIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/UrlIntegrationTest.php new file mode 100644 index 0000000..aaaeb80 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/UrlIntegrationTest.php @@ -0,0 +1,196 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\UrlIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class UrlIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezurl'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezurl', + new FieldType\Url\UrlStorage( + array( + 'LegacyStorage' => new FieldType\Url\UrlStorage\Gateway\LegacyStorage(), + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezurl', + new Legacy\Content\FieldValue\Converter\Url() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new Content\FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezurl field type does not have any special field definition + // properties + array( 'fieldType', 'ezurl' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints() ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => array( + 'urlId' => null, + 'text' => 'Some awesome website', + ), + 'externalData' => 'http://example.com/sindelfingen', + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $expected = $this->getInitialValue(); + $this->assertEquals( + $expected->externalData, + $field->value->externalData + ); + + $this->assertNotNull( + $field->value->data['urlId'] + ); + $this->assertEquals( + $expected->data['text'], + $field->value->data['text'] + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => array( + 'urlId' => null, + 'text' => 'An even more awesome website', + ), + 'externalData' => 'http://example.com/hubba', + 'sortKey' => null, + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + $expected = $this->getUpdatedValue(); + $this->assertEquals( + $expected->externalData, + $field->value->externalData + ); + + $this->assertNotNull( + $field->value->data['urlId'] + ); + $this->assertEquals( + $expected->data['text'], + $field->value->data['text'] + ); + } +} diff --git a/eZ/Publish/SPI/Tests/FieldType/UserIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/UserIntegrationTest.php new file mode 100644 index 0000000..6584278 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/UserIntegrationTest.php @@ -0,0 +1,217 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\UserIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy; +use eZ\Publish\Core\FieldType; +use eZ\Publish\SPI\Persistence\Content; +use eZ\Publish\SPI\Persistence\Content\Field; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; +use eZ\Publish\SPI\Persistence\User; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class UserIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezuser'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezuser', + new FieldType\User\UserStorage( + array( + 'LegacyStorage' => new FieldType\User\UserStorage\Gateway\LegacyStorage(), + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezuser', + new Legacy\Content\FieldValue\Converter\NullConverter() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The user field type does not have any special field definition + // properties + array( 'fieldType', 'ezuser' ), + array( 'fieldTypeConstraints', new Content\FieldTypeConstraints() ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array(), + 'sortKey' => 'user', + ) + ); + } + + /** + * Asserts that the loaded field data is correct + * + * Performs assertions on the loaded field, mainly checking that the + * $field->value->externalData is loaded correctly. If the loading of + * external data manipulates other aspects of $field, their correctness + * also needs to be asserted. Make sure you implement this method agnostic + * to the used SPI\Persistence implementation! + */ + public function assertLoadedFieldDataCorrect( Field $field ) + { + $expectedValues = array( + 'hasStoredLogin' => true, + 'contentId' => self::$contentId, + 'login' => 'hans', + 'email' => 'hans@example.com', + 'passwordHash' => '*', + 'passwordHashType' => 0, + 'enabled' => true, + 'maxLogin' => 1000, + ); + + foreach ( $expectedValues as $key => $value ) + { + $this->assertEquals( $value, $field->value->externalData[$key] ); + } + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + return new Content\FieldValue( + array( + 'data' => null, + 'externalData' => array( + 'login' => 'change', // Change is intended to not get through + 'email' => 'change', // Change is intended to not get through + 'passwordHash' => 'change', // Change is intended to not get through + 'passwordHashType' => 'change', // Change is intended to not get through + 'enabled' => 'changed', // Change is intended to not get through + 'maxLogin' => 'changed', // Change is intended to not get through + ), + 'sortKey' => 'user', + ) + ); + } + + /** + * Asserts that the updated field data is loaded correct + * + * Performs assertions on the loaded field after it has been updated, + * mainly checking that the $field->value->externalData is loaded + * correctly. If the loading of external data manipulates other aspects of + * $field, their correctness also needs to be asserted. Make sure you + * implement this method agnostic to the used SPI\Persistence + * implementation! + * + * @return void + */ + public function assertUpdatedFieldDataCorrect( Field $field ) + { + // No update of user data possible through field type + $this->assertLoadedFieldDataCorrect( $field ); + } + + /** + * Method called after content creation + * + * Useful, if additional stuff should be executed (like creating the actual + * user). + * + * @param Legacy\Handler $handler + * @param Content $content + * + * @return void + */ + public function postCreationHook( Legacy\Handler $handler, Content $content ) + { + $user = new User(); + $user->id = $content->versionInfo->contentInfo->id; + $user->login = 'hans'; + $user->email = 'hans@example.com'; + $user->passwordHash = '*'; + $user->hashAlgorithm = 0; + $user->isEnabled = true; + $user->maxLogin = 1000; + + $userHandler = $handler->userHandler(); + $userHandler->create( $user ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/XmlTextIntegrationTest.php b/eZ/Publish/SPI/Tests/FieldType/XmlTextIntegrationTest.php new file mode 100644 index 0000000..be73b85 --- /dev/null +++ b/eZ/Publish/SPI/Tests/FieldType/XmlTextIntegrationTest.php @@ -0,0 +1,156 @@ +<?php +/** + * File contains: eZ\Publish\SPI\Tests\FieldType\XmlTextIntegrationTest class + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Tests\FieldType; + +use eZ\Publish\Core\Persistence\Legacy\Content\FieldValue\Converter\XmlText as XmlTextConverter; +use eZ\Publish\Core\FieldType\XmlText\XmlTextStorage; +use eZ\Publish\Core\FieldType\NullStorage; +use eZ\Publish\Core\FieldType\FieldSettings; +use eZ\Publish\SPI\Persistence\Content\FieldValue; +use eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints; +use DOMDocument; +use eZ\Publish\Core\FieldType\XmlText\XmlTextStorage\Gateway\LegacyStorage; + +/** + * Integration test for legacy storage field types + * + * This abstract base test case is supposed to be the base for field type + * integration tests. It basically calls all involved methods in the field type + * ``Converter`` and ``Storage`` implementations. Fo get it working implement + * the abstract methods in a sensible way. + * + * The following actions are performed by this test using the custom field + * type: + * + * - Create a new content type with the given field type + * - Load create content type + * - Create content object of new content type + * - Load created content + * - Copy created content + * - Remove copied content + * + * @group integration + */ +class XmlTextIntegrationTest extends BaseIntegrationTest +{ + /** + * Get name of tested field type + * + * @return string + */ + public function getTypeName() + { + return 'ezxmltext'; + } + + /** + * Get handler with required custom field types registered + * + * @return Handler + */ + public function getCustomHandler() + { + $handler = $this->getHandler(); + + $handler->getStorageRegistry()->register( + 'ezxmltext', + new XmlTextStorage( + array( + 'LegacyStorage' => new LegacyStorage() + ) + ) + ); + $handler->getFieldValueConverterRegistry()->register( + 'ezxmltext', + new XmlTextConverter() + ); + + return $handler; + } + + /** + * Returns the FieldTypeConstraints to be used to create a field definition + * of the FieldType under test. + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldTypeConstraints + */ + public function getTypeConstraints() + { + return new FieldTypeConstraints(); + } + + /** + * Get field definition data values + * + * This is a PHPUnit data provider + * + * @return array + */ + public function getFieldDefinitionData() + { + return array( + // The ezxmltext field type does not have any special field definition + // properties + array( 'fieldType', 'ezxmltext' ), + array( + 'fieldTypeConstraints', + new FieldTypeConstraints( + array( + 'fieldSettings' => new FieldSettings( + array( + 'numRows' => 0, + 'tagPreset' => null, + ) + ) + ) + ) + ), + ); + } + + /** + * Get initial field value + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getInitialValue() + { + $xml = new DOMDocument; + $xml->loadXML( '<?xml version="1.0" encoding="utf-8"?><section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Paragraph content…</paragraph></section>' ); + return new FieldValue( + array( + 'data' => $xml, + 'externalData' => null, + 'sortKey' => null, + ) + ); + } + + /** + * Get update field value. + * + * Use to update the field + * + * @return \eZ\Publish\SPI\Persistence\Content\FieldValue + */ + public function getUpdatedValue() + { + $xml = new DOMDocument; + $xml->loadXML( '<?xml version="1.0" encoding="utf-8"?><section xmlns:image="http://ez.no/namespaces/ezpublish3/image/" xmlns:xhtml="http://ez.no/namespaces/ezpublish3/xhtml/" xmlns:custom="http://ez.no/namespaces/ezpublish3/custom/"><paragraph>Some different content…</paragraph></section>' ); + return new FieldValue( + array( + 'data' => $xml, + 'externalData' => null, + 'sortKey' => null, + ) + ); + } +} + diff --git a/eZ/Publish/SPI/Tests/FieldType/_fixtures/image.jpg b/eZ/Publish/SPI/Tests/FieldType/_fixtures/image.jpg new file mode 100644 index 0000000..0ddd840 Binary files /dev/null and b/eZ/Publish/SPI/Tests/FieldType/_fixtures/image.jpg differ diff --git a/eZ/Publish/SPI/Tests/FieldType/_fixtures/image.png b/eZ/Publish/SPI/Tests/FieldType/_fixtures/image.png new file mode 100644 index 0000000..159ab77 Binary files /dev/null and b/eZ/Publish/SPI/Tests/FieldType/_fixtures/image.png differ diff --git a/eZ/Publish/SPI/Variation/Values/ImageVariation.php b/eZ/Publish/SPI/Variation/Values/ImageVariation.php new file mode 100644 index 0000000..bc0db16 --- /dev/null +++ b/eZ/Publish/SPI/Variation/Values/ImageVariation.php @@ -0,0 +1,43 @@ +<?php +/** + * File containing the ImageVariation class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Variation\Values; + +class ImageVariation extends Variation +{ + /** + * The width as number of pixels (for example "320"). + * + * @var int + */ + protected $width; + + /** + * The height as number of pixels (for example "256"). + * + * @var int + */ + protected $height; + + /** + * The name of the image alias (for example "original"). + * + * @var string + */ + protected $name; + + /** + * Contains extra information about the image, depending on the image type. + * It will typically contain EXIF information from digital cameras or information about animated GIFs. + * If there is no information, the info will be a boolean FALSE. + * + * @var mixed + */ + protected $info; +} diff --git a/eZ/Publish/SPI/Variation/Values/Variation.php b/eZ/Publish/SPI/Variation/Values/Variation.php new file mode 100644 index 0000000..a1320ff --- /dev/null +++ b/eZ/Publish/SPI/Variation/Values/Variation.php @@ -0,0 +1,60 @@ +<?php +/** + * File containing the file Variation class. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Variation\Values; + +use eZ\Publish\API\Repository\Values\ValueObject; + +/** + * Base class for file variations (i.e. image aliases) + */ +class Variation extends ValueObject +{ + /** + * Number of bytes for current variation + * + * @var int + */ + protected $fileSize; + + /** + * The MIME type (for example "image/png"). + * + * @var string + */ + protected $mimeType; + + /** + * The name of the file (for example "my_image.png"). + * + * @var string + */ + protected $fileName; + + /** + * The path to the file (for example "var/storage/images/test/199-2-eng-GB"). + * + * @var string + */ + protected $dirPath; + + /** + * Complete path + name of image file (for example "var/storage/images/test/199-2-eng-GB/apple.png"). + * + * @var string + */ + protected $uri; + + /** + * When the variation was last modified. + * + * @var \DateTime + */ + protected $lastModified; +} diff --git a/eZ/Publish/SPI/Variation/VariationHandler.php b/eZ/Publish/SPI/Variation/VariationHandler.php new file mode 100644 index 0000000..d95a878 --- /dev/null +++ b/eZ/Publish/SPI/Variation/VariationHandler.php @@ -0,0 +1,35 @@ +<?php +/** + * File containing the VariationHandler interface. + * + * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved. + * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2 + * @version //autogentag// + */ + +namespace eZ\Publish\SPI\Variation; + +use eZ\Publish\API\Repository\Values\Content\Field; +use eZ\Publish\API\Repository\Values\Content\VersionInfo; + +/** + * Interface for Variant services. + * A variant service allows to generate variation from a given content field/version info + * (i.e. image aliases, variations of a document - doc, pdf...) + */ +interface VariationHandler +{ + /** + * Returns a Variant object for $field's $variantName. + * This method is responsible to create the variant if needed. + * Variants might be applicable for images (aliases), documents... + * + * @param \eZ\Publish\API\Repository\Values\Content\Field $field + * @param \eZ\Publish\API\Repository\Values\Content\VersionInfo $versionInfo + * @param string $variantName + * @param array $parameters Hash of arbitrary parameters useful to generate the variation + * + * @return \eZ\Publish\SPI\Variation\Values\Variation + */ + public function getVariation( Field $field, VersionInfo $versionInfo, $variantName, array $parameters = array() ); +} diff --git a/phpunit-integration-legacy-solr.xml b/phpunit-integration-legacy-solr.xml new file mode 100644 index 0000000..7b38c36 --- /dev/null +++ b/phpunit-integration-legacy-solr.xml @@ -0,0 +1,38 @@ +<?xml version="1.0" encoding="utf-8"?> +<phpunit backupGlobals="false" + backupStaticAttributes="false" + bootstrap="bootstrap.php" + processIsolation="false" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true"> + <php> + <env name="setupFactory" value="eZ\Publish\API\Repository\Tests\SetupFactory\LegacySolr" /> + <env name="backendVersion" value="5" /> + <env name="fixtureDir" value="Solr" /> + <env name="solrServer" value="http://localhost:8983/" /> + </php> + <testsuites> + <testsuite name="eZ\Publish\API\Repository"> + <file>RepositoryTest.php</file> + <!-- Only the Solr Search tests differ from the other tests, so we + are skipping everything else + + @todo: Search service is used all over the place, so we must test + all services here. + --> + <file>eZ/Publish/API/Repository/Tests/SearchServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SearchServiceAuthorizationTest.php</file> + </testsuite> + </testsuites> + <filter> + <whitelist> + <directory suffix=".php">eZ/Publish/API/Repository</directory> + <directory>eZ/Publish/API/Repository/Tests/Stubs</directory> + <exclude> + <directory>eZ/Publish/API/Repository/Tests</directory> + <directory>eZ/Publish/API/Repository/Tutorials</directory> + </exclude> + </whitelist> + </filter> +</phpunit> diff --git a/phpunit-integration-legacy.xml b/phpunit-integration-legacy.xml new file mode 100644 index 0000000..5916c04 --- /dev/null +++ b/phpunit-integration-legacy.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<phpunit backupGlobals="false" + backupStaticAttributes="false" + bootstrap="bootstrap.php" + processIsolation="false" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true"> + <php> + <env name="setupFactory" value="eZ\Publish\API\Repository\Tests\SetupFactory\Legacy" /> + <env name="backendVersion" value="5" /> + <env name="fixtureDir" value="Legacy" /> + </php> + <testsuites> + <testsuite name="eZ\Publish\API\Repository"> + <file>eZ/Publish/API/Repository/Tests/RepositoryTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SearchServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SearchServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LimitationTest.php</file> + <directory>eZ/Publish/API/Repository/Tests/Values/User/Limitation</directory> + <directory>eZ/Publish/API/Repository/Tests/FieldType/</directory> + </testsuite> + </testsuites> + <filter> + <whitelist> + <directory suffix=".php">eZ/Publish/API/Repository/</directory> + <directory>eZ/Publish/API/Repository/Tests/Stubs</directory> + <exclude> + <directory>eZ/Publish/API/Repository/Tests</directory> + <directory>eZ/Publish/API/Repository/Tutorials</directory> + </exclude> + </whitelist> + </filter> +</phpunit> diff --git a/phpunit-integration-rest-json.xml b/phpunit-integration-rest-json.xml new file mode 100644 index 0000000..6e72657 --- /dev/null +++ b/phpunit-integration-rest-json.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<phpunit backupGlobals="false" + backupStaticAttributes="false" + bootstrap="bootstrap.php" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true"> + <php> + <env name="setupFactory" value="\eZ\Publish\Core\REST\Client\Tests\SetupFactory" /> + <env name="backendVersion" value="5" /> + <env name="backendEncoding" value="json" /> + </php> + <testsuites> + <testsuite name="eZ\Publish\API\Repository"> + <file>eZ/Publish/API/Repository/Tests/RepositoryTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LimitationTest.php</file> + <directory>eZ/Publish/API/Repository/Tests/Values/User/Limitation</directory> + <directory>eZ/Publish/API/Repository/Tests/FieldType/</directory> + </testsuite> + </testsuites> + <filter> + <whitelist> + <directory suffix=".php">eZ/Publish/API/Repository/</directory> + <directory>eZ/Publish/API/Repository/Tests/Stubs</directory> + <exclude> + <directory>eZ/Publish/API/Repository/Tests</directory> + <directory>eZ/Publish/API/Repository/Tutorials</directory> + </exclude> + </whitelist> + </filter> +</phpunit> diff --git a/phpunit-integration-rest-xml.xml b/phpunit-integration-rest-xml.xml new file mode 100644 index 0000000..ea2cbb6 --- /dev/null +++ b/phpunit-integration-rest-xml.xml @@ -0,0 +1,52 @@ +<?xml version="1.0" encoding="utf-8"?> +<phpunit backupGlobals="false" + backupStaticAttributes="false" + bootstrap="bootstrap.php" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true"> + <php> + <env name="setupFactory" value="\eZ\Publish\Core\REST\Client\Tests\SetupFactory" /> + <env name="backendVersion" value="5" /> + <env name="backendEncoding" value="xml" /> + </php> + <testsuites> + <testsuite name="eZ\Publish\API\Repository"> + <file>eZ/Publish/API/Repository/Tests/RepositoryTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LimitationTest.php</file> + <directory>eZ/Publish/API/Repository/Tests/Values/User/Limitation</directory> + <directory>eZ/Publish/API/Repository/Tests/FieldType/</directory> + </testsuite> + </testsuites> + <filter> + <whitelist> + <directory suffix=".php">eZ/Publish/API/Repository/</directory> + <directory>eZ/Publish/API/Repository/Tests/Stubs</directory> + <exclude> + <directory>eZ/Publish/API/Repository/Tests</directory> + <directory>eZ/Publish/API/Repository/Tutorials</directory> + </exclude> + </whitelist> + </filter> +</phpunit> diff --git a/phpunit-integration.xml b/phpunit-integration.xml new file mode 100644 index 0000000..1e9a170 --- /dev/null +++ b/phpunit-integration.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="utf-8"?> +<phpunit backupGlobals="false" + backupStaticAttributes="false" + bootstrap="bootstrap.php" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + colors="true" + > + <php> + <env name="setupFactory" value="eZ\Publish\API\Repository\Tests\SetupFactory\Memory" /> + <env name="backendVersion" value="5" /> + </php> + <testsuites> + <testsuite name="eZ\Publish\API\Repository"> + <file>eZ/Publish/API/Repository/Tests/RepositoryTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/IOServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/IOServiceTest/testNewBinaryCreateStructFromUploadedFile.phpt</file> + <file>eZ/Publish/API/Repository/Tests/URLAliasServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceTest.php</file> + <file>eZ/Publish/API/Repository/Tests/SectionServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LanguageServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentTypeServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ContentServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LocationServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/UserServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/RoleServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/TrashServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/URLWildcardServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/ObjectStateServiceAuthorizationTest.php</file> + <file>eZ/Publish/API/Repository/Tests/LimitationTest.php</file> + <directory>eZ/Publish/API/Repository/Tests/Values/User/Limitation</directory> + <directory>eZ/Publish/API/Repository/Tests/FieldType/</directory> + </testsuite> + </testsuites> + <filter> + <whitelist> + <directory suffix=".php">eZ/Publish/API/Repository/</directory> + <directory>eZ/Publish/API/Repository/Tests/Stubs</directory> + <exclude> + <directory>eZ/Publish/API/Repository/Tests</directory> + <directory>eZ/Publish/API/Repository/Tutorials</directory> + </exclude> + </whitelist> + </filter> +</phpunit> diff --git a/phpunit.xml b/phpunit.xml new file mode 100644 index 0000000..52d726e --- /dev/null +++ b/phpunit.xml @@ -0,0 +1,65 @@ +<phpunit + backupGlobals="false" + backupStaticAttributes="false" + bootstrap="bootstrap.php" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + colors="false" + > + <testsuites> + <testsuite name="eZ\Publish\Core\Base"> + <directory>eZ/Publish/Core/Base/Tests</directory> + </testsuite> + <testsuite name="eZ\Publish\Core\Repository"> + <directory>eZ/Publish/Core/Repository/Tests</directory> + </testsuite> + <testsuite name="eZ\Publish\Core\FieldType"> + <directory>eZ/Publish/Core/FieldType/Tests</directory> + </testsuite> + <testsuite name="eZ\Publish\Core\Persistence\InMemory"> + <directory>eZ/Publish/Core/Persistence/InMemory/Tests</directory> + </testsuite> + <testsuite name="eZ\Publish\Core\Persistence\Legacy"> + <directory>eZ/Publish/Core/Persistence/Legacy/Tests</directory> + </testsuite> + <testsuite name="eZ\Publish\Core\IO"> + <directory>eZ/Publish/Core/IO/Tests</directory> + </testsuite> + <testsuite name="eZ Publish HMVC test suite"> + <directory>eZ/Publish/Core/MVC/Symfony</directory> + <directory>eZ/Bundle</directory> + </testsuite> + <testsuite name="eZ Publish legacy test suite"> + <directory>eZ/Publish/Core/MVC/Legacy</directory> + </testsuite> + <testsuite name="eZ Publish REST test suite"> + <directory>eZ/Publish/Core/REST</directory> + </testsuite> + <testsuite name="eZ Publish SPI test suite"> + <directory>eZ/Publish/SPI</directory> + </testsuite> + <testsuite name="eZ Publish SignalSlot test suite"> + <directory>eZ/Publish/Core/SignalSlot</directory> + </testsuite> + </testsuites> + <filter> + <whitelist> + <directory suffix=".php">eZ</directory> + <exclude> + <directory>eZ/Publish/*/Tests</directory> + <directory>eZ/Publish/*/*/Tests</directory> + <directory>eZ/Publish/*/*/*/Tests</directory> + <directory>eZ/Publish/*/*/*/*/Tests</directory> + <directory>eZ/Bundle/*/Tests</directory> + <directory>eZ/Bundle/*/_fixtures</directory> + <directory>eZ/Publish/Core/Persistence/Legacy/docs</directory> + <directory>doc</directory> + <directory>design</directory> + <directory>vendor</directory> + <directory>eZ/Publish/API/Repository/Examples</directory> + <directory>eZ/Publish/API/Repository/Tutorials</directory> + </exclude> + </whitelist> + </filter> +</phpunit>